Upstream version 9.37.195.0 81/26681/1
authorEurogiciel-BOT <eurogiciel.tizen@gmail.com>
Wed, 27 Aug 2014 16:07:23 +0000 (16:07 +0000)
committerEurogiciel-BOT <eurogiciel.tizen@gmail.com>
Wed, 27 Aug 2014 16:07:23 +0000 (16:07 +0000)
Upstream commit-id 0ae5cb8deb6a7c81d93cd644224a6940daa5737d

Change-Id: I517bec804ac3c6a4695e2304ffdbc563a8119869
Signed-off-by: Eurogiciel-BOT <eurogiciel.tizen@gmail.com>
1935 files changed:
packaging/crosswalk.spec
src/.DEPS.git
src/DEPS
src/android_webview/browser/browser_view_renderer.cc
src/android_webview/browser/browser_view_renderer.h
src/android_webview/browser/hardware_renderer.cc
src/android_webview/browser/hardware_renderer.h
src/android_webview/browser/net/aw_url_request_context_getter.cc
src/android_webview/browser/net/aw_url_request_context_getter.h
src/android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.cc
src/android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.h
src/android_webview/browser/shared_renderer_state.cc
src/android_webview/browser/shared_renderer_state.h
src/android_webview/buildbot/aosp_manifest.xml
src/android_webview/common/aw_switches.cc
src/android_webview/java/src/org/chromium/android_webview/AwContents.java
src/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java
src/android_webview/java/src/org/chromium/android_webview/AwPicture.java
src/android_webview/java/src/org/chromium/android_webview/AwWebResourceResponse.java
src/android_webview/java/src/org/chromium/android_webview/InputStreamUtil.java [new file with mode: 0644]
src/android_webview/java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java
src/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnScaleChangedTest.java
src/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
src/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java
src/android_webview/lib/main/aw_main_delegate.cc
src/android_webview/native/aw_contents.cc
src/android_webview/native/aw_contents.h
src/android_webview/native/aw_contents_statics.cc
src/android_webview/native/aw_picture.cc
src/android_webview/native/aw_picture.h
src/android_webview/native/aw_settings.cc
src/android_webview/native/aw_settings.h
src/android_webview/native/input_stream_impl.cc
src/android_webview/native/input_stream_unittest.cc
src/android_webview/native/java_browser_view_renderer_helper.cc
src/android_webview/native/java_browser_view_renderer_helper.h
src/android_webview/native/webview_native.gyp
src/android_webview/public/browser/draw_gl.h
src/android_webview/public/browser/draw_sw.h
src/android_webview/unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java
src/apps/app_window.cc
src/apps/app_window.h
src/apps/shell/browser/shell_extensions_browser_client.cc
src/apps/shell/browser/shell_extensions_browser_client.h
src/apps/ui/native_app_window.h
src/apps/ui/views/native_app_window_views.cc
src/apps/ui/views/native_app_window_views.h
src/ash/ash_switches.cc
src/ash/ash_switches.h
src/ash/resources/default_100_percent/common/shelf/shelf_background.png
src/ash/resources/default_200_percent/common/shelf/shelf_background.png
src/ash/root_window_controller.cc
src/ash/strings/ash_strings_am.xtb
src/ash/strings/ash_strings_ar.xtb
src/ash/strings/ash_strings_bg.xtb
src/ash/strings/ash_strings_bn.xtb
src/ash/strings/ash_strings_ca.xtb
src/ash/strings/ash_strings_cs.xtb
src/ash/strings/ash_strings_da.xtb
src/ash/strings/ash_strings_de.xtb
src/ash/strings/ash_strings_el.xtb
src/ash/strings/ash_strings_en-GB.xtb
src/ash/strings/ash_strings_es-419.xtb
src/ash/strings/ash_strings_es.xtb
src/ash/strings/ash_strings_et.xtb
src/ash/strings/ash_strings_fa.xtb
src/ash/strings/ash_strings_fi.xtb
src/ash/strings/ash_strings_fil.xtb
src/ash/strings/ash_strings_fr.xtb
src/ash/strings/ash_strings_gu.xtb
src/ash/strings/ash_strings_hi.xtb
src/ash/strings/ash_strings_hr.xtb
src/ash/strings/ash_strings_hu.xtb
src/ash/strings/ash_strings_id.xtb
src/ash/strings/ash_strings_it.xtb
src/ash/strings/ash_strings_iw.xtb
src/ash/strings/ash_strings_ja.xtb
src/ash/strings/ash_strings_kn.xtb
src/ash/strings/ash_strings_ko.xtb
src/ash/strings/ash_strings_lt.xtb
src/ash/strings/ash_strings_lv.xtb
src/ash/strings/ash_strings_ml.xtb
src/ash/strings/ash_strings_mr.xtb
src/ash/strings/ash_strings_ms.xtb
src/ash/strings/ash_strings_nl.xtb
src/ash/strings/ash_strings_no.xtb
src/ash/strings/ash_strings_pl.xtb
src/ash/strings/ash_strings_pt-BR.xtb
src/ash/strings/ash_strings_pt-PT.xtb
src/ash/strings/ash_strings_ro.xtb
src/ash/strings/ash_strings_ru.xtb
src/ash/strings/ash_strings_sk.xtb
src/ash/strings/ash_strings_sl.xtb
src/ash/strings/ash_strings_sr.xtb
src/ash/strings/ash_strings_sv.xtb
src/ash/strings/ash_strings_sw.xtb
src/ash/strings/ash_strings_ta.xtb
src/ash/strings/ash_strings_te.xtb
src/ash/strings/ash_strings_th.xtb
src/ash/strings/ash_strings_tr.xtb
src/ash/strings/ash_strings_uk.xtb
src/ash/strings/ash_strings_vi.xtb
src/ash/strings/ash_strings_zh-CN.xtb
src/ash/strings/ash_strings_zh-TW.xtb
src/ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.cc
src/ash/system/tray/tray_background_view.cc
src/ash/system/user/user_view.cc
src/ash/wm/lock_state_controller.cc
src/ash/wm/maximize_mode/maximize_mode_controller.cc
src/ash/wm/maximize_mode/maximize_mode_controller.h
src/ash/wm/maximize_mode/maximize_mode_window_manager.cc
src/ash/wm/maximize_mode/maximize_mode_window_manager.h
src/ash/wm/overview/window_grid.cc
src/ash/wm/overview/window_grid.h
src/ash/wm/overview/window_selector.cc
src/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
src/base/android/java/src/org/chromium/base/library_loader/Linker.java
src/base/debug/dump_without_crashing.h
src/base/debug/tsan_suppressions.cc
src/base/memory/discardable_memory.h
src/base/memory/discardable_memory_android.cc
src/base/memory/discardable_memory_emulated.cc
src/base/memory/discardable_memory_emulated.h
src/base/memory/discardable_memory_linux.cc
src/base/memory/discardable_memory_mac.cc
src/base/memory/discardable_memory_manager.cc
src/base/memory/discardable_memory_manager.h
src/base/memory/discardable_memory_manager_unittest.cc
src/base/memory/discardable_memory_win.cc
src/base/sys_info_android.cc
src/build/android/gyp/generate_v14_compatible_resources.py
src/build/android/gyp/proguard.py
src/build/android/pylib/constants.py
src/build/android/pylib/instrumentation/test_jar.py
src/build/common.gypi
src/build/config/android/config.gni
src/build/java.gypi
src/build/java_apk.gypi
src/build/java_prebuilt.gypi
src/build/util/LASTCHANGE.blink
src/cc/layers/delegated_renderer_layer_impl.cc
src/cc/layers/delegated_renderer_layer_impl.h
src/cc/layers/delegated_renderer_layer_impl_unittest.cc
src/cc/layers/picture_image_layer.cc
src/cc/layers/picture_layer_impl.cc
src/cc/layers/picture_layer_impl_unittest.cc
src/cc/layers/quad_sink.h
src/cc/trees/layer_tree_host_impl.cc
src/chrome/VERSION
src/chrome/android/java/res/anim/menu_enter.xml [new file with mode: 0644]
src/chrome/android/java/res/anim/menu_exit.xml [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/btn_menu_disabled.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/btn_menu_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/btn_menu_pressed.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/dismiss.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/edge_menu_bg.9.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/infobar_autofill.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_autofill_cc.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/infobar_autologin.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_blocked_popups.png
src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_camera.png
src/chrome/android/java/res/drawable-hdpi/infobar_close_button.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/infobar_cookie.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_desktop_notifications.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_didyoumean.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_geolocation.png
src/chrome/android/java/res/drawable-hdpi/infobar_microphone.png
src/chrome/android/java/res/drawable-hdpi/infobar_midi.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/infobar_multiple_downloads.png
src/chrome/android/java/res/drawable-hdpi/infobar_plugin.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_plugin_crashed.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_protected_media_identifier.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/infobar_restore.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_savepassword.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_savepassword_autologin.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/infobar_theme.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_translate.png
src/chrome/android/java/res/drawable-hdpi/infobar_update_uma.png [deleted file]
src/chrome/android/java/res/drawable-hdpi/infobar_warning.png
src/chrome/android/java/res/drawable-hdpi/menu_bg.9.png
src/chrome/android/java/res/drawable-hdpi/tab_close_white.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/tab_close_white_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-hdpi/warning.png [deleted file]
src/chrome/android/java/res/drawable-ldrtl-hdpi/edge_menu_bg.9.png [moved from src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillGray.png with 62% similarity, mode: 0644]
src/chrome/android/java/res/drawable-ldrtl-mdpi/edge_menu_bg.9.png [moved from src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillBlue.png with 72% similarity, mode: 0644]
src/chrome/android/java/res/drawable-ldrtl-xhdpi/edge_menu_bg.9.png [moved from src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillGreen.png with 56% similarity, mode: 0644]
src/chrome/android/java/res/drawable-ldrtl-xxhdpi/edge_menu_bg.9.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/btn_menu_disabled.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/btn_menu_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/btn_menu_pressed.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/dismiss.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/edge_menu_bg.9.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/infobar_autofill.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_autofill_cc.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/infobar_autologin.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_blocked_popups.png
src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_camera.png
src/chrome/android/java/res/drawable-mdpi/infobar_close_button.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/infobar_cookie.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_desktop_notifications.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_didyoumean.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_geolocation.png
src/chrome/android/java/res/drawable-mdpi/infobar_microphone.png
src/chrome/android/java/res/drawable-mdpi/infobar_midi.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/infobar_multiple_downloads.png
src/chrome/android/java/res/drawable-mdpi/infobar_plugin.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_plugin_crashed.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_protected_media_identifier.png
src/chrome/android/java/res/drawable-mdpi/infobar_restore.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_savepassword.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_savepassword_autologin.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/infobar_theme.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_translate.png
src/chrome/android/java/res/drawable-mdpi/infobar_update_uma.png [deleted file]
src/chrome/android/java/res/drawable-mdpi/infobar_warning.png
src/chrome/android/java/res/drawable-mdpi/menu_bg.9.png
src/chrome/android/java/res/drawable-mdpi/tab_close_white.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/tab_close_white_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-mdpi/warning.png [deleted file]
src/chrome/android/java/res/drawable-tvdpi/back.png [deleted file]
src/chrome/android/java/res/drawable-tvdpi/back_disabled.png [deleted file]
src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-tvdpi/infobar_update_uma.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/btn_menu_disabled.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/btn_menu_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/btn_menu_pressed.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/dismiss.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/edge_menu_bg.9.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/infobar_autofill.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_autofill_cc.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/infobar_autologin.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_blocked_popups.png
src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_enabled.9.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_pressed.9.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_camera.png
src/chrome/android/java/res/drawable-xhdpi/infobar_close_button.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/infobar_cookie.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_desktop_notifications.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_didyoumean.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_geolocation.png
src/chrome/android/java/res/drawable-xhdpi/infobar_microphone.png
src/chrome/android/java/res/drawable-xhdpi/infobar_midi.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/infobar_multiple_downloads.png
src/chrome/android/java/res/drawable-xhdpi/infobar_plugin.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_plugin_crashed.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_protected_media_identifier.png
src/chrome/android/java/res/drawable-xhdpi/infobar_restore.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword_autologin.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/infobar_theme.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_translate.png
src/chrome/android/java/res/drawable-xhdpi/infobar_update_uma.png [deleted file]
src/chrome/android/java/res/drawable-xhdpi/infobar_warning.png
src/chrome/android/java/res/drawable-xhdpi/menu_bg.9.png
src/chrome/android/java/res/drawable-xhdpi/tab_close_white.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/tab_close_white_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xhdpi/warning.png [deleted file]
src/chrome/android/java/res/drawable-xxhdpi/btn_menu_disabled.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/btn_menu_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/btn_menu_pressed.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/edge_menu_bg.9.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_autofill_cc.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_blocked_popups.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_camera.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_close_button.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_geolocation.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_microphone.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_midi.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_multiple_downloads.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_protected_media_identifier.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_savepassword_autologin.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_translate.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/infobar_warning.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/menu_bg.9.png
src/chrome/android/java/res/drawable-xxhdpi/tab_close_white.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/tab_close_white_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal.png [new file with mode: 0644]
src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal_active.png [new file with mode: 0644]
src/chrome/android/java/res/drawable/btn_infobar_blue.xml [new file with mode: 0644]
src/chrome/android/java/res/drawable/btn_menu.xml [new file with mode: 0644]
src/chrome/android/java/res/drawable/btn_tab_close.xml [new file with mode: 0644]
src/chrome/android/java/res/drawable/btn_tabstrip_incognito_switch.xml [new file with mode: 0644]
src/chrome/android/java/res/drawable/btn_tabstrip_incognito_switch_incognito.xml [new file with mode: 0644]
src/chrome/android/java/res/drawable/close_tab_incognito.png [deleted file]
src/chrome/android/java/res/drawable/infobar_button_normal_floating.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_button_normal_full_left.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_button_normal_full_right.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_button_warning_floating.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_button_warning_full_left.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_button_warning_full_right.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_close_bg.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_close_button_focused.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_close_button_pressed.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_info_background.xml [deleted file]
src/chrome/android/java/res/drawable/infobar_midi.png [deleted file]
src/chrome/android/java/res/drawable/infobar_warning_background.xml [deleted file]
src/chrome/android/java/res/drawable/tabstrip_incognito_switch_incognito.png [deleted file]
src/chrome/android/java/res/drawable/tabstrip_incognito_switch_normal.png [deleted file]
src/chrome/android/java/res/interpolator/fade_out_curve_interpolator.xml [new file with mode: 0644]
src/chrome/android/java/res/interpolator/transform_curve_interpolator.xml [new file with mode: 0644]
src/chrome/android/java/res/layout/accessibility_tab_switcher.xml
src/chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml
src/chrome/android/java/res/layout/app_banner_view.xml
src/chrome/android/java/res/layout/four_button_menu_item.xml
src/chrome/android/java/res/layout/infobar_button.xml
src/chrome/android/java/res/layout/infobar_text.xml
src/chrome/android/java/res/layout/title_button_menu_item.xml
src/chrome/android/java/res/values-ldrtl/values.xml [new file with mode: 0644]
src/chrome/android/java/res/values-v17/styles.xml
src/chrome/android/java/res/values/colors.xml
src/chrome/android/java/res/values/dimens.xml
src/chrome/android/java/res/values/ids.xml [moved from src/chrome/android/java/res/values-sw600dp/dimens.xml with 51% similarity]
src/chrome/android/java/res/values/values.xml
src/chrome/android/java/src/org/chromium/chrome/browser/EmptyTabObserver.java
src/chrome/android/java/src/org/chromium/chrome/browser/NewTabPagePrefs.java
src/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
src/chrome/android/java/src/org/chromium/chrome/browser/Tab.java
src/chrome/android/java/src/org/chromium/chrome/browser/TabObserver.java
src/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
src/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/AnimationHelper.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBarDelegate.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/ContentWrapperView.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarView.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/MessageInfoBar.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateAlwaysPanel.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCheckBox.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateInfoBar.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateNeverPanel.java
src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TwoButtonInfoBar.java [deleted file]
src/chrome/android/java/strings/android_chrome_strings.grd
src/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
src/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
src/chrome/android/shell/java/src/org/chromium/chrome/shell/TabManager.java
src/chrome/android/shell/javatests/src/org/chromium/chrome/shell/ChromeShellUrlTest.java
src/chrome/android/shell/res/drawable/menu_dots.png [deleted file]
src/chrome/android/shell/res/layout/chrome_shell_activity.xml
src/chrome/app/chrome_exe_main_win.cc
src/chrome/app/chrome_main.cc
src/chrome/app/generated_resources.grd
src/chrome/app/resources/address_input_strings_fi.xtb
src/chrome/app/resources/address_input_strings_ro.xtb
src/chrome/app/resources/chromium_strings_hi.xtb
src/chrome/app/resources/chromium_strings_id.xtb
src/chrome/app/resources/chromium_strings_pt-BR.xtb
src/chrome/app/resources/chromium_strings_ro.xtb
src/chrome/app/resources/chromium_strings_sw.xtb
src/chrome/app/resources/chromium_strings_th.xtb
src/chrome/app/resources/chromium_strings_vi.xtb
src/chrome/app/resources/generated_resources_am.xtb
src/chrome/app/resources/generated_resources_ar.xtb
src/chrome/app/resources/generated_resources_bg.xtb
src/chrome/app/resources/generated_resources_bn.xtb
src/chrome/app/resources/generated_resources_ca.xtb
src/chrome/app/resources/generated_resources_cs.xtb
src/chrome/app/resources/generated_resources_da.xtb
src/chrome/app/resources/generated_resources_de.xtb
src/chrome/app/resources/generated_resources_el.xtb
src/chrome/app/resources/generated_resources_en-GB.xtb
src/chrome/app/resources/generated_resources_es-419.xtb
src/chrome/app/resources/generated_resources_es.xtb
src/chrome/app/resources/generated_resources_et.xtb
src/chrome/app/resources/generated_resources_fa.xtb
src/chrome/app/resources/generated_resources_fi.xtb
src/chrome/app/resources/generated_resources_fil.xtb
src/chrome/app/resources/generated_resources_fr.xtb
src/chrome/app/resources/generated_resources_gu.xtb
src/chrome/app/resources/generated_resources_hi.xtb
src/chrome/app/resources/generated_resources_hr.xtb
src/chrome/app/resources/generated_resources_hu.xtb
src/chrome/app/resources/generated_resources_id.xtb
src/chrome/app/resources/generated_resources_it.xtb
src/chrome/app/resources/generated_resources_iw.xtb
src/chrome/app/resources/generated_resources_ja.xtb
src/chrome/app/resources/generated_resources_kn.xtb
src/chrome/app/resources/generated_resources_ko.xtb
src/chrome/app/resources/generated_resources_lt.xtb
src/chrome/app/resources/generated_resources_lv.xtb
src/chrome/app/resources/generated_resources_ml.xtb
src/chrome/app/resources/generated_resources_mr.xtb
src/chrome/app/resources/generated_resources_ms.xtb
src/chrome/app/resources/generated_resources_nl.xtb
src/chrome/app/resources/generated_resources_no.xtb
src/chrome/app/resources/generated_resources_pl.xtb
src/chrome/app/resources/generated_resources_pt-BR.xtb
src/chrome/app/resources/generated_resources_pt-PT.xtb
src/chrome/app/resources/generated_resources_ro.xtb
src/chrome/app/resources/generated_resources_ru.xtb
src/chrome/app/resources/generated_resources_sk.xtb
src/chrome/app/resources/generated_resources_sl.xtb
src/chrome/app/resources/generated_resources_sr.xtb
src/chrome/app/resources/generated_resources_sv.xtb
src/chrome/app/resources/generated_resources_sw.xtb
src/chrome/app/resources/generated_resources_ta.xtb
src/chrome/app/resources/generated_resources_te.xtb
src/chrome/app/resources/generated_resources_th.xtb
src/chrome/app/resources/generated_resources_tr.xtb
src/chrome/app/resources/generated_resources_uk.xtb
src/chrome/app/resources/generated_resources_vi.xtb
src/chrome/app/resources/generated_resources_zh-CN.xtb
src/chrome/app/resources/generated_resources_zh-TW.xtb
src/chrome/app/resources/google_chrome_strings_de.xtb
src/chrome/app/resources/google_chrome_strings_es-419.xtb
src/chrome/app/resources/google_chrome_strings_hi.xtb
src/chrome/app/resources/google_chrome_strings_kn.xtb
src/chrome/app/resources/google_chrome_strings_no.xtb
src/chrome/app/resources/google_chrome_strings_pt-BR.xtb
src/chrome/app/resources/google_chrome_strings_pt-PT.xtb
src/chrome/app/resources/google_chrome_strings_ro.xtb
src/chrome/app/resources/google_chrome_strings_sk.xtb
src/chrome/app/resources/google_chrome_strings_sr.xtb
src/chrome/app/resources/google_chrome_strings_sw.xtb
src/chrome/app/resources/google_chrome_strings_th.xtb
src/chrome/app/resources/google_chrome_strings_vi.xtb
src/chrome/app/resources/google_chrome_strings_zh-CN.xtb
src/chrome/app/theme/default_100_percent/common/infobar_autofill_cc.png [moved from src/chrome/app/theme/default_100_percent/common/infobar_autofill.png with 100% similarity]
src/chrome/app/theme/default_200_percent/common/infobar_autofill_cc.png [moved from src/chrome/app/theme/default_200_percent/common/infobar_autofill.png with 100% similarity]
src/chrome/app/theme/theme_resources.grd
src/chrome/browser/android/new_tab_page_prefs.cc
src/chrome/browser/android/new_tab_page_prefs.h
src/chrome/browser/android/resource_id.h
src/chrome/browser/android/signin/signin_manager_android.cc
src/chrome/browser/apps/web_view_browsertest.cc
src/chrome/browser/autocomplete/autocomplete_input.cc
src/chrome/browser/autofill/autofill_cc_infobar_delegate.cc
src/chrome/browser/chrome_browser_main.cc
src/chrome/browser/chromeos/accessibility/touch_exploration_controller_browsertest.cc
src/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
src/chrome/browser/chromeos/device/input_service_proxy.cc
src/chrome/browser/chromeos/device/input_service_proxy.h
src/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
src/chrome/browser/chromeos/input_method/input_method_engine.cc
src/chrome/browser/chromeos/input_method/input_method_engine.h
src/chrome/browser/chromeos/input_method/input_method_engine_interface.h
src/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
src/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
src/chrome/browser/chromeos/input_method/input_method_manager_impl.h
src/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc
src/chrome/browser/chromeos/input_method/mock_input_method_engine.cc
src/chrome/browser/chromeos/input_method/mock_input_method_engine.h
src/chrome/browser/chromeos/input_method/mock_input_method_manager.cc
src/chrome/browser/chromeos/input_method/mock_input_method_manager.h
src/chrome/browser/chromeos/login/enrollment/enrollment_screen.cc
src/chrome/browser/chromeos/login/enrollment/enrollment_screen.h
src/chrome/browser/chromeos/login/enrollment/enrollment_screen_actor.h
src/chrome/browser/chromeos/login/startup_utils.cc
src/chrome/browser/chromeos/login/startup_utils.h
src/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
src/chrome/browser/chromeos/login/wizard_controller.cc
src/chrome/browser/chromeos/login/wizard_controller.h
src/chrome/browser/chromeos/net/network_portal_detector_strategy.cc
src/chrome/browser/chromeos/ownership/owner_settings_service.cc
src/chrome/browser/chromeos/ownership/owner_settings_service.h
src/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
src/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
src/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc
src/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h
src/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos_unittest.cc
src/chrome/browser/chromeos/settings/device_settings_service.cc
src/chrome/browser/component_updater/component_updater_service.cc
src/chrome/browser/component_updater/default_component_installer.cc
src/chrome/browser/component_updater/widevine_cdm_component_installer.cc
src/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
src/chrome/browser/devtools/chrome_devtools_manager_delegate.h
src/chrome/browser/devtools/devtools_target_impl.cc
src/chrome/browser/download/chrome_download_manager_delegate.cc
src/chrome/browser/download/chrome_download_manager_delegate.h
src/chrome/browser/download/download_prefs.cc
src/chrome/browser/download/download_prefs.h
src/chrome/browser/download/download_shelf_context_menu.cc
src/chrome/browser/download/download_shelf_context_menu.h
src/chrome/browser/download/download_target_determiner.cc
src/chrome/browser/download/download_target_determiner.h
src/chrome/browser/extensions/active_tab_permission_granter.cc
src/chrome/browser/extensions/api/cast_channel/cast_socket.cc
src/chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc
src/chrome/browser/extensions/api/debugger/debugger_api.cc
src/chrome/browser/extensions/api/debugger/debugger_api_constants.cc
src/chrome/browser/extensions/api/debugger/debugger_api_constants.h
src/chrome/browser/extensions/api/debugger/debugger_apitest.cc
src/chrome/browser/extensions/api/debugger/debugger_extension_apitest.cc
src/chrome/browser/extensions/api/identity/account_tracker_unittest.cc
src/chrome/browser/extensions/api/input/input.cc
src/chrome/browser/extensions/api/input_ime/input_ime_api.cc
src/chrome/browser/extensions/api/input_ime/input_ime_api.h
src/chrome/browser/extensions/chrome_extensions_browser_client.cc
src/chrome/browser/extensions/chrome_extensions_browser_client.h
src/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
src/chrome/browser/extensions/extension_install_prompt.cc
src/chrome/browser/extensions/extension_install_prompt.h
src/chrome/browser/extensions/extension_install_prompt_unittest.cc [new file with mode: 0644]
src/chrome/browser/extensions/external_provider_impl_unittest.cc
src/chrome/browser/external_protocol/external_protocol_handler.cc
src/chrome/browser/external_protocol/external_protocol_handler.h
src/chrome/browser/external_protocol/external_protocol_handler_unittest.cc
src/chrome/browser/external_protocol/external_protocol_observer.cc [new file with mode: 0644]
src/chrome/browser/external_protocol/external_protocol_observer.h [new file with mode: 0644]
src/chrome/browser/history/history_backend.cc
src/chrome/browser/history/history_backend.h
src/chrome/browser/history/history_service.cc
src/chrome/browser/local_discovery/service_discovery_shared_client.cc
src/chrome/browser/media/media_capture_devices_dispatcher.cc
src/chrome/browser/media/media_stream_devices_controller.cc
src/chrome/browser/media/media_stream_devices_controller.h
src/chrome/browser/metrics/chrome_metrics_service_client.cc
src/chrome/browser/plugins/plugin_info_message_filter.cc
src/chrome/browser/plugins/plugin_info_message_filter.h
src/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
src/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
src/chrome/browser/prefs/DEPS [new file with mode: 0644]
src/chrome/browser/prefs/chrome_pref_service_factory.cc
src/chrome/browser/prefs/pref_hash_filter.cc
src/chrome/browser/prefs/pref_hash_filter.h
src/chrome/browser/prefs/pref_hash_filter_unittest.cc
src/chrome/browser/prefs/profile_pref_store_manager.cc
src/chrome/browser/prefs/profile_pref_store_manager.h
src/chrome/browser/prefs/profile_pref_store_manager_unittest.cc
src/chrome/browser/prerender/prerender_browsertest.cc
src/chrome/browser/profiles/gaia_info_update_service_unittest.cc
src/chrome/browser/renderer_host/chrome_extension_message_filter.cc
src/chrome/browser/renderer_host/chrome_extension_message_filter.h
src/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
src/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h
src/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
src/chrome/browser/resources/chromeos/about_os_credits.html
src/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
src/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
src/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
src/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
src/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
src/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
src/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
src/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.css
src/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.css
src/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js
src/chrome/browser/resources/components.html
src/chrome/browser/resources/components.js
src/chrome/browser/resources/feedback/js/event_handler.js
src/chrome/browser/resources/omnibox/omnibox.js
src/chrome/browser/resources/options/chromeos/bluetooth.css
src/chrome/browser/resources/options/search_page.js
src/chrome/browser/resources/ssl/interstitial_v2.css
src/chrome/browser/safe_browsing/environment_data_collection_win.cc
src/chrome/browser/safe_browsing/environment_data_collection_win.h
src/chrome/browser/safe_browsing/environment_data_collection_win_unittest.cc [new file with mode: 0644]
src/chrome/browser/safe_browsing/last_download_finder.cc
src/chrome/browser/safe_browsing/path_sanitizer.cc [new file with mode: 0644]
src/chrome/browser/safe_browsing/path_sanitizer.h [new file with mode: 0644]
src/chrome/browser/safe_browsing/path_sanitizer_unittest.cc [new file with mode: 0644]
src/chrome/browser/services/gcm/fake_signin_manager.cc
src/chrome/browser/services/gcm/fake_signin_manager.h
src/chrome/browser/signin/account_reconcilor_unittest.cc
src/chrome/browser/signin/android_profile_oauth2_token_service.cc
src/chrome/browser/signin/fake_signin_manager.cc
src/chrome/browser/signin/fake_signin_manager.h
src/chrome/browser/signin/signin_manager_unittest.cc
src/chrome/browser/signin/signin_names_io_thread_unittest.cc
src/chrome/browser/speech/tts_message_filter.cc
src/chrome/browser/speech/tts_message_filter.h
src/chrome/browser/sync/backup_rollback_controller.cc
src/chrome/browser/sync/backup_rollback_controller.h
src/chrome/browser/sync/glue/search_engine_data_type_controller.cc
src/chrome/browser/sync/glue/search_engine_data_type_controller.h
src/chrome/browser/sync/glue/search_engine_data_type_controller_unittest.cc
src/chrome/browser/sync/profile_sync_service.cc
src/chrome/browser/sync/profile_sync_service.h
src/chrome/browser/sync/profile_sync_service_unittest.cc
src/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc
src/chrome/browser/ui/app_list/app_list_controller_browsertest.cc
src/chrome/browser/ui/app_list/app_list_service_interactive_uitest.cc
src/chrome/browser/ui/app_list/app_list_service_views_browsertest.cc
src/chrome/browser/ui/app_list/app_list_syncable_service.cc
src/chrome/browser/ui/app_list/app_list_syncable_service.h
src/chrome/browser/ui/app_list/app_list_view_delegate.cc
src/chrome/browser/ui/app_list/app_list_view_delegate.h
src/chrome/browser/ui/app_list/test/chrome_app_list_test_support.cc
src/chrome/browser/ui/app_list/test/chrome_app_list_test_support.h
src/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc
src/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
src/chrome/browser/ui/browser_tabrestore.cc
src/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
src/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
src/chrome/browser/ui/cocoa/extensions/extension_popup_controller.mm
src/chrome/browser/ui/content_settings/content_setting_image_model.cc
src/chrome/browser/ui/pdf/adobe_reader_info_win.h [new file with mode: 0644]
src/chrome/browser/ui/pdf/pdf_browsertest.cc
src/chrome/browser/ui/pdf/pdf_unsupported_feature.cc
src/chrome/browser/ui/startup/startup_browser_creator.cc
src/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
src/chrome/browser/ui/tab_helpers.cc
src/chrome/browser/ui/views/app_list/app_list_dialog_contents_view.cc
src/chrome/browser/ui/views/app_list/app_list_dialog_contents_view.h
src/chrome/browser/ui/views/apps/app_window_desktop_window_tree_host_win.cc
src/chrome/browser/ui/views/bookmarks/bookmark_context_menu.cc
src/chrome/browser/ui/views/bookmarks/bookmark_context_menu.h
src/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc
src/chrome/browser/ui/views/tabs/tab.cc
src/chrome/browser/ui/views/tabs/tab.h
src/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
src/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
src/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
src/chrome/browser/ui/webui/components_ui.cc
src/chrome/browser/ui/webui/sync_setup_handler.cc
src/chrome/browser/ui/webui/sync_setup_handler_unittest.cc
src/chrome/chrome_browser.gypi
src/chrome/chrome_browser_ui.gypi
src/chrome/chrome_tests_unit.gypi
src/chrome/common/extensions/api/_permission_features.json
src/chrome/common/extensions/api/app_current_window_internal.idl
src/chrome/common/extensions/api/app_window.idl
src/chrome/common/pref_names.cc
src/chrome/common/pref_names.h
src/chrome/common/render_messages.h
src/chrome/common/safe_browsing/csd.proto
src/chrome/common/url_constants.cc
src/chrome/installer/mac/app_resource_rules.plist.in
src/chrome/installer/mac/sign_app.sh.in
src/chrome/installer/mac/sign_versioned_dir.sh.in
src/chrome/renderer/media/chrome_key_systems.cc
src/chrome/renderer/resources/extensions/app_window_custom_bindings.js
src/chrome/renderer/resources/extensions/web_view.js
src/chrome/renderer/resources/extensions/web_view_events.js
src/chrome/test/base/chrome_unit_test_suite.cc
src/chrome/test/base/chrome_unit_test_suite.h
src/chrome/test/data/extensions/api_test/debugger/background.js
src/chrome/test/data/extensions/platform_apps/web_view/shim/main.js
src/chrome/tools/build/win/FILES.cfg
src/chrome/tools/test/reference_build/chrome_linux/D3DCompiler_42.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/First Run [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/PepperFlash/libpepflashplayer.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/PepperFlash/manifest.json [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/avcodec-52.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/avformat-52.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/avutil-50.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/chrome [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/chrome-wrapper [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/chrome.1 [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/chrome.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/chrome.exe [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/chrome_100_percent.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/chrome_dll.pdb [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/chrome_exe.pdb [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/chrome_sandbox [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/crash_service.exe [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/d3dx9_42.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/gears.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/icudtl.dat [moved from src/chrome/tools/test/reference_build/chrome_linux/icudt42.dll with 60% similarity, mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/apt.include [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/default-app-block.template [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/default-app.template [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/desktop.template [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/eu-strip [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/google-chrome.info [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/installer.include [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/postinst.include [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/prerm.include [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/repo.cron [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/rpm.include [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/rpmrepo.cron [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/symlinks.include [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/variables.include [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/common/wrapper [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/build.sh [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/changelog.template [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/control.template [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/debian.menu [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/expected_deps [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/postinst [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/postrm [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/debian/prerm [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/build.sh [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/chrome.spec.template [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/expected_deps_i386 [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/expected_deps_x86_64 [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/BRANDING [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_128.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_16.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_22.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_24.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_256.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_32.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_32.xpm [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_48.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_64.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/installer/version.txt [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/lib/libpeerconnection.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/libEGL.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/libGLESv2.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdm.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdmadapter.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/libffmpegsumo.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/libpdf.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/libppGoogleNaClPluginChrome.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdm.so [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdmadapter.so [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/locales/am.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ar.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ar.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/bg.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/bg.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/bn.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/bn.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ca.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ca.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/cs.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/cs.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/da.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/da.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/de.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/de.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/el.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/el.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/es.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/es.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/et.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/et.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/fa.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/fi.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/fi.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/fil.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/fil.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/fr.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/fr.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/gu.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/gu.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/he.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/he.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/hi.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/hi.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/hr.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/hr.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/hu.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/hu.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/id.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/id.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/it.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/it.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ja.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ja.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/kn.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/kn.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ko.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ko.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/lt.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/lt.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/lv.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/lv.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ml.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ml.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/mr.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/mr.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ms.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/nb.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/nb.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/nl.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/nl.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/pl.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/pl.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ro.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ro.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ru.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ru.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/sk.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/sk.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/sl.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/sl.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/sr.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/sr.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/sv.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/sv.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/sw.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/ta.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/ta.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/te.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/te.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/th.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/th.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/tr.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/tr.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/uk.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/uk.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/vi.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/vi.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.pak [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/mini_installer.pdb [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/nacl64.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/nacl64.exe [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/nacl_helper [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/nacl_helper_bootstrap [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/nacl_irt_x86_64.nexe [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/product_logo_48.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources.pak
src/chrome/tools/test/reference_build/chrome_linux/resources/extension/demo/library.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/AuditsPanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/CodeMirrorTextEditor.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ConsolePanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/DevTools.js [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ElementsPanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ExtensionServer.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/HeapSnapshotWorker.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/addIcon.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/applicationCache.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/auditsIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/back.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointBorder.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalBorder.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalCounterBorder.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional_2x.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointCounterBorder.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint_2x.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsActivateButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsDeactivateButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/checker.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/clearConsoleButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/closeButtons.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/cookie.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/database.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/databaseTable.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerContinue.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerPause.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepInto.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOut.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOver.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/deleteIcon.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDown.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownBlack.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownWhite.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRight.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightBlack.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDown.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightWhite.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/dockButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/domain.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/elementsIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableOutlineButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableSolidButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorMediumIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorRedDot.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/excludeButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/fileSystem.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/focusButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/forward.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/frame.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/gearButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeader.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderPressed.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelected.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelectedPressed.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/goArrow.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/graphLabelCalloutLeft.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/graphLabelCalloutRight.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDB.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBIndex.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBObjectStore.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/largerResourcesButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/localStorage.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls_2x.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/networkIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/nodeSearchButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneAddButtons.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrow.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrowActive.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneElementStateButtons.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneFilterButtons.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneGrowHandleLine.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneRefreshButtons.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneSettingsButtons.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/pauseOnExceptionButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/percentButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/popoverArrows.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/popoverBackground.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileGroupIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileSmallIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesSilhouette.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/programCounterBorder.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/radioDot.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordToggledButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/reloadButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceCSSIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceDocumentIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceDocumentIconSmall.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceJSIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcePlainIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcePlainIconSmall.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesSizeGraphIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesTimeGraphIcon.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsSilhouette.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchNext.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchPrev.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBlue.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBrightBlue.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallGray.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallWhite.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segment.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentEnd.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHover.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEnd.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEndChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelected.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEnd.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEndChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/sessionStorage.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove_2x.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/spinner.gif [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDimple.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDividerBackground.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackground.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackgroundChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackground.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackgroundChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs_2x.png [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtons.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonsChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButton.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelected.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelectedChromium.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarResizerHorizontal.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarResizerVertical.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/successGreenDot.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbActiveHoriz.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbActiveVert.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoriz.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoverHoriz.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoverVert.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbVert.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarBlue.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGray.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGreen.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarOrange.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarPurple.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarRed.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarYellow.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineCheckmarks.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineDots.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillOrange.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillPurple.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillRed.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillYellow.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillBlue.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGray.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGreen.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillOrange.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillPurple.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillRed.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillYellow.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/toolbarItemSelected.png [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/trackHoriz.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/trackVert.png
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleBlack.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleWhite.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleBlack.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleWhite.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleBlack.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleWhite.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/undockButtonGlyph.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputPreviousIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputResultIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningMediumIcon.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningOrangeDot.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningsErrors.png [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/LayersPanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Main.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/NetworkPanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ProfilesPanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ResourcesPanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ScriptFormatterWorker.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/SourcesPanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/TempStorageSharedWorker.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/TimelinePanel.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/accelerometer.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/auditsPanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/breadcrumbList.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/breakpointsList.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/buildSystemOnly.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/canvasProfiler.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/cmdevtools.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/codemirror.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/dataGrid.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/devtools.css [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/devtools.html [changed mode: 0755->0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/devtools_extension_api.js [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/elementsPanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/filter.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/filteredItemSelectionDialog.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/flameChart.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/heapProfiler.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/helpScreen.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/indexedDBViews.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/inspector.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/inspectorCommon.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/layersPanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/navigatorView.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/networkLogView.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/networkPanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/overrides.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/panelEnablerView.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/profilesPanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/resourceView.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/resourcesPanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/revisionHistory.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/screencastView.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sidebarPane.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sourcesPanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sourcesView.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/spectrum.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/splitView.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/textPrompt.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/timelinePanel.css [new file with mode: 0644]
src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.exe [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.pdb [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.dll [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.pdb [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/wow_helper.exe [deleted file]
src/chrome/tools/test/reference_build/chrome_linux/xdg-mime [new file with mode: 0755]
src/chrome/tools/test/reference_build/chrome_linux/xdg-settings [new file with mode: 0755]
src/chrome_elf/blacklist/blacklist.cc
src/chromeos/ime/input_method_manager.h
src/components/breakpad/app/breakpad_win.cc
src/components/os_crypt/os_crypt_mac.mm
src/components/policy/core/common/cloud/enterprise_metrics.cc
src/components/policy/core/common/cloud/enterprise_metrics.h
src/components/policy/resources/policy_templates_am.xtb
src/components/policy/resources/policy_templates_ca.xtb
src/components/policy/resources/policy_templates_cs.xtb
src/components/policy/resources/policy_templates_da.xtb
src/components/policy/resources/policy_templates_de.xtb
src/components/policy/resources/policy_templates_fi.xtb
src/components/policy/resources/policy_templates_hi.xtb
src/components/policy/resources/policy_templates_id.xtb
src/components/policy/resources/policy_templates_kn.xtb
src/components/policy/resources/policy_templates_no.xtb
src/components/policy/resources/policy_templates_pt-BR.xtb
src/components/policy/resources/policy_templates_ro.xtb
src/components/policy/resources/policy_templates_sk.xtb
src/components/policy/resources/policy_templates_th.xtb
src/components/policy/resources/policy_templates_vi.xtb
src/components/policy/resources/policy_templates_zh-CN.xtb
src/components/signin/core/browser/signin_manager.cc
src/components/signin/core/browser/signin_manager.h
src/components/signin/core/browser/signin_metrics.cc
src/components/signin/core/browser/signin_metrics.h
src/components/strings/components_strings_fi.xtb
src/components/strings/components_strings_no.xtb
src/components/strings/components_strings_pt-BR.xtb
src/components/strings/components_strings_ro.xtb
src/components/strings/components_strings_sk.xtb
src/components/strings/components_strings_zh-CN.xtb
src/components/sync_driver/non_ui_data_type_controller.cc
src/components/url_fixer/url_fixer_unittest.cc
src/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
src/content/browser/android/devtools_auth.cc
src/content/browser/android/in_process/synchronous_compositor_factory_impl.cc
src/content/browser/android/in_process/synchronous_compositor_factory_impl.h
src/content/browser/android/in_process/synchronous_compositor_impl.cc
src/content/browser/android/web_contents_observer_android.cc
src/content/browser/android/web_contents_observer_android.h
src/content/browser/child_process_launcher.cc
src/content/browser/devtools/devtools_browser_target.cc
src/content/browser/devtools/devtools_http_handler_impl.cc
src/content/browser/devtools/devtools_http_handler_impl.h
src/content/browser/devtools/devtools_manager_impl.cc
src/content/browser/devtools/devtools_protocol.cc
src/content/browser/devtools/devtools_protocol.h
src/content/browser/frame_host/debug_urls.cc
src/content/browser/frame_host/navigator_impl.cc
src/content/browser/gpu/browser_gpu_channel_host_factory.cc
src/content/browser/gpu/browser_gpu_channel_host_factory.h
src/content/browser/gpu/gpu_process_host.cc
src/content/browser/gpu/gpu_process_host.h
src/content/browser/loader/resource_dispatcher_host_impl.cc
src/content/browser/media/media_canplaytype_browsertest.cc
src/content/browser/renderer_host/compositing_iosurface_layer_mac.h
src/content/browser/renderer_host/compositing_iosurface_layer_mac.mm
src/content/browser/renderer_host/compositor_impl_android.cc
src/content/browser/renderer_host/compositor_impl_android.h
src/content/browser/renderer_host/gpu_message_filter.cc
src/content/browser/renderer_host/gpu_message_filter.h
src/content/browser/renderer_host/input/input_router.h
src/content/browser/renderer_host/input/input_router_impl.h
src/content/browser/renderer_host/input/touch_emulator.cc
src/content/browser/renderer_host/input/touch_emulator_client.h
src/content/browser/renderer_host/input/touch_emulator_unittest.cc
src/content/browser/renderer_host/legacy_render_widget_host_win.cc
src/content/browser/renderer_host/render_widget_host_impl.cc
src/content/browser/renderer_host/render_widget_host_impl.h
src/content/browser/renderer_host/render_widget_host_unittest.cc
src/content/browser/renderer_host/render_widget_host_view_mac.h
src/content/browser/renderer_host/render_widget_host_view_mac.mm
src/content/browser/speech/speech_recognition_dispatcher_host.cc
src/content/browser/speech/speech_recognition_dispatcher_host.h
src/content/browser/web_contents/touch_editable_impl_aura.cc
src/content/browser/web_contents/web_contents_impl.cc
src/content/browser/web_contents/web_contents_impl.h
src/content/browser/web_contents/web_contents_view_aura_browsertest.cc
src/content/child/child_thread.cc
src/content/child/webcrypto/platform_crypto_nss.cc
src/content/child/webcrypto/shared_crypto_unittest.cc
src/content/common/frame_messages.h
src/content/common/gpu/client/gpu_channel_host.cc
src/content/common/gpu/client/gpu_channel_host.h
src/content/common/gpu/gpu_channel.cc
src/content/common/gpu/gpu_channel.h
src/content/common/gpu/gpu_channel_manager.cc
src/content/common/gpu/gpu_messages.h
src/content/common/gpu/gpu_result_codes.h [new file with mode: 0644]
src/content/common/speech_recognition_messages.h
src/content/common/view_messages.h
src/content/content_common.gypi
src/content/content_renderer.gypi
src/content/content_shell.gypi
src/content/ppapi_plugin/ppapi_thread.cc
src/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
src/content/public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java
src/content/public/android/java/src/org/chromium/content/browser/input/ChromeDatePickerDialog.java
src/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java
src/content/public/android/java/strings/translations/android_content_strings_ro.xtb
src/content/public/browser/android/synchronous_compositor.h
src/content/public/browser/devtools_manager_delegate.h
src/content/public/browser/resource_dispatcher_host_delegate.cc
src/content/public/browser/resource_dispatcher_host_delegate.h
src/content/public/browser/web_contents_observer.h
src/content/public/common/url_constants.cc
src/content/public/common/url_constants.h
src/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/DOMUtils.java
src/content/renderer/accessibility/renderer_accessibility_complete.cc
src/content/renderer/browser_plugin/browser_plugin.cc
src/content/renderer/media/crypto/key_systems.cc
src/content/renderer/media/media_stream_video_source_unittest.cc
src/content/renderer/media/media_stream_video_track.cc
src/content/renderer/media/media_stream_video_track.h
src/content/renderer/media/media_stream_video_track_unittest.cc
src/content/renderer/media/mock_media_stream_video_sink.cc
src/content/renderer/media/mock_media_stream_video_sink.h
src/content/renderer/media/rtc_video_renderer.cc
src/content/renderer/media/rtc_video_renderer.h
src/content/renderer/media/video_frame_deliverer.cc [deleted file]
src/content/renderer/media/video_frame_deliverer.h [deleted file]
src/content/renderer/pepper/pepper_video_decoder_host.cc
src/content/renderer/pepper/video_decoder_shim.cc
src/content/renderer/render_frame_impl.cc
src/content/renderer/render_frame_impl.h
src/content/renderer/render_thread_impl.cc
src/content/renderer/render_thread_impl.h
src/content/renderer/render_view_browsertest.cc
src/content/renderer/render_view_impl.cc
src/content/renderer/render_view_impl.h
src/content/renderer/render_widget.cc
src/content/renderer/render_widget.h
src/content/renderer/speech_recognition_dispatcher.cc
src/content/renderer/speech_recognition_dispatcher.h
src/content/shell/android/java/src/org/chromium/content_shell/ShellManager.java
src/content/test/accessibility_browser_test_utils.cc
src/content/test/accessibility_browser_test_utils.h
src/content/test/data/accessibility/transition-expected-android.txt [new file with mode: 0644]
src/content/test/data/accessibility/transition-expected-mac.txt [new file with mode: 0644]
src/content/test/data/accessibility/transition-expected-win.txt [new file with mode: 0644]
src/content/test/data/accessibility/transition.html [new file with mode: 0644]
src/content/test/data/gpu/webgl_with_select_element.html [new file with mode: 0644]
src/content/test/data/overscroll_navigation.html
src/content/test/gpu/gpu_tests/context_lost.py
src/content/test/test_webkit_platform_support.cc
src/content/test/test_webkit_platform_support.h
src/extensions/browser/extension_function_dispatcher.cc
src/extensions/browser/extensions_browser_client.h
src/extensions/browser/test_extensions_browser_client.cc
src/extensions/browser/test_extensions_browser_client.h
src/extensions/common/permissions/permissions_data.cc
src/extensions/common/permissions/permissions_data.h
src/extensions/common/permissions/permissions_data_unittest.cc
src/extensions/common/url_pattern.cc
src/extensions/common/url_pattern.h
src/extensions/common/url_pattern_unittest.cc
src/extensions/strings/extensions_strings_da.xtb
src/extensions/strings/extensions_strings_ro.xtb
src/extensions/strings/extensions_strings_th.xtb
src/extensions/strings/extensions_strings_vi.xtb
src/google_apis/gcm/engine/connection_factory_impl.cc
src/google_apis/gcm/engine/connection_factory_impl_unittest.cc
src/gpu/command_buffer/service/in_process_command_buffer.cc
src/gpu/command_buffer/service/texture_definition.cc
src/gpu/config/gpu_driver_bug_list_json.cc
src/gpu/config/software_rendering_list_json.cc
src/media/audio/sounds/audio_stream_handler.cc
src/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
src/media/base/audio_splicer.cc
src/media/base/audio_splicer.h
src/media/base/audio_splicer_unittest.cc
src/media/cast/cast_defines.h
src/media/cdm/ppapi/cdm_adapter.cc
src/media/cdm/ppapi/cdm_helpers.cc
src/media/cdm/ppapi/cdm_helpers.h
src/media/filters/ffmpeg_demuxer.cc
src/media/filters/ffmpeg_demuxer.h
src/media/filters/opus_audio_decoder.cc
src/media/filters/vpx_video_decoder.cc
src/media/formats/mp4/box_definitions.cc
src/media/video/capture/video_capture_types.cc
src/native_client/build/build_nexe.py
src/native_client/build/untrusted.gypi
src/native_client/src/shared/platform/win/nacl_host_desc.c
src/native_client/src/untrusted/minidump_generator/minidump_generator.cc
src/net/android/java/src/org/chromium/net/ProxyChangeListener.java
src/net/base/mime_util.cc
src/net/base/registry_controlled_domains/OWNERS
src/net/base/registry_controlled_domains/effective_tld_names.dat
src/net/base/registry_controlled_domains/effective_tld_names.gperf
src/net/http/http_network_session.cc
src/net/http/http_stream_factory_impl_job.cc
src/net/quic/crypto/proof_verifier_chromium.cc
src/net/quic/crypto/proof_verifier_chromium.h
src/net/quic/quic_client_session.cc
src/net/quic/quic_client_session.h
src/net/quic/quic_stream_factory.cc
src/net/quic/quic_stream_factory.h
src/net/quic/quic_stream_factory_test.cc
src/net/quic/test_tools/crypto_test_utils_chromium.cc
src/net/socket/ssl_client_socket_pool_unittest.cc
src/net/spdy/spdy_session.cc
src/net/spdy/spdy_session_unittest.cc
src/ozone/AUTHORS
src/ozone/ui/desktop_aura/desktop_window_tree_host_wayland.cc
src/ozone/ui/desktop_aura/desktop_window_tree_host_wayland.h
src/pdf/draw_utils.cc
src/pdf/instance.cc
src/pdf/pdfium/pdfium_engine.cc
src/ppapi/api/ppb_video_decoder.idl
src/ppapi/c/ppb_video_decoder.h
src/ppapi/cpp/video_decoder.h
src/ppapi/examples/video_decode/video_decode.cc
src/ppapi/proxy/video_decoder_resource.cc
src/remoting/android/java/AndroidManifest.xml.jinja2
src/remoting/android/java/src/org/chromium/chromoting/Desktop.java
src/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java
src/remoting/client/jni/chromoting_jni_instance.cc
src/remoting/remoting_host.gypi
src/remoting/resources/remoting_strings_de.xtb
src/remoting/resources/remoting_strings_hi.xtb
src/remoting/resources/remoting_strings_id.xtb
src/remoting/resources/remoting_strings_ro.xtb
src/remoting/resources/remoting_strings_th.xtb
src/remoting/webapp/client_session.js
src/remoting/webapp/fullscreen_v2.js
src/remoting/webapp/media_source_renderer.js
src/remoting/webapp/window_frame.js
src/sandbox/win/src/handle_closer_agent.cc
src/sandbox/win/src/handle_closer_test.cc
src/sync/internal_api/sync_backup_manager.cc
src/sync/internal_api/sync_backup_manager.h
src/sync/internal_api/sync_backup_manager_unittest.cc
src/sync/internal_api/sync_rollback_manager.cc
src/sync/internal_api/sync_rollback_manager_base.cc
src/sync/internal_api/sync_rollback_manager_base.h
src/sync/internal_api/sync_rollback_manager_base_unittest.cc
src/sync/internal_api/sync_rollback_manager_unittest.cc
src/sync/syncable/directory.cc
src/sync/syncable/directory.h
src/third_party/WebKit/LayoutTests/TestExpectations
src/third_party/WebKit/LayoutTests/animations/display-inline-style-adjust-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/animations/display-inline-style-adjust.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/animations/interpolation/font-size-interpolation-expected.txt
src/third_party/WebKit/LayoutTests/animations/interpolation/font-size-interpolation.html
src/third_party/WebKit/LayoutTests/compositing/squashing/invalidate-when-leaving-squashed-layer-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/compositing/squashing/invalidate-when-leaving-squashed-layer.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/compositing/squashing/squashing-print.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-001-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-001.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-102-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-102.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/css3/calc/number-parsing.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/editing/surrounding-text/surrounding-text.html
src/third_party/WebKit/LayoutTests/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line.html [deleted file]
src/third_party/WebKit/LayoutTests/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line.html [deleted file]
src/third_party/WebKit/LayoutTests/fast/block/strip-anonymous-blocks-when-block-child-becomes-float-expected.txt [deleted file]
src/third_party/WebKit/LayoutTests/fast/block/strip-anonymous-blocks-when-block-child-becomes-float.html [deleted file]
src/third_party/WebKit/LayoutTests/fast/css/crash-layout-detached-document-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/css/crash-layout-detached-document.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/dom/Document/title-01-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/dom/Document/title-01.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/dom/Element/normalize-crash2-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/dom/Element/normalize-crash2.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/dom/shadow/querySelector-with-shadow-all-and-shadow-deep-expected.txt
src/third_party/WebKit/LayoutTests/fast/dom/shadow/querySelector-with-shadow-all-and-shadow-deep.html
src/third_party/WebKit/LayoutTests/fast/events/onunload-postmessage-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/events/onunload-postmessage.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/events/touch/touch-target-move-documents-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/events/touch/touch-target-move-documents.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/forms/form-radio-img-node-list-expected.txt
src/third_party/WebKit/LayoutTests/fast/forms/form-radio-img-node-list.html
src/third_party/WebKit/LayoutTests/fast/forms/submit-add-remove-element-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/forms/submit-add-remove-element.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/html/imports/import-insert-domcontentloaded-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/html/imports/import-insert-domcontentloaded.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-both-whitespace-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-both-whitespace.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-leading-whitespace-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-leading-whitespace.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-no-whitespace-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-no-whitespace.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-trailing-whitespace-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/float-trailing-whitespace.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/multiple-floats-with-whitespace-expected.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/inline-block/multiple-floats-with-whitespace.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/multicol/float-truncation.html
src/third_party/WebKit/LayoutTests/fast/multicol/vertical-lr/float-truncation.html
src/third_party/WebKit/LayoutTests/fast/multicol/vertical-rl/float-truncation.html
src/third_party/WebKit/LayoutTests/fast/repaint/focus-continuations.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/repaint/focus-enable-continuations.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/repaint/outline-change-continuations.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/repaint/outline-continuations.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/scrolling/scroll-max-value-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/scrolling/scroll-max-value.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/text/bidi-ignorable-unicode.html [deleted file]
src/third_party/WebKit/LayoutTests/fast/xsl/modify-xsl-while-loading-crash-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fast/xsl/modify-xsl-while-loading-crash.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/inspector/console-test.js
src/third_party/WebKit/LayoutTests/http/tests/loading/form-action-using-replaceChild-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/loading/form-action-using-replaceChild.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/loading/resources/form-post-success.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/loading/resources/frame-with-form-action-using-replace-child.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-invisible-DOM-with-insecure-form.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-javascript-formSubmission.html [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/inspector/console/console-viewport-selection-expected.txt
src/third_party/WebKit/LayoutTests/inspector/console/console-viewport-selection.html
src/third_party/WebKit/LayoutTests/inspector/elements/styles/resources/styles-update-links-2.css [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/inspector/elements/styles/resources/styles-update-links.css
src/third_party/WebKit/LayoutTests/inspector/elements/styles/styles-update-links-expected.txt
src/third_party/WebKit/LayoutTests/inspector/elements/styles/styles-update-links.html
src/third_party/WebKit/LayoutTests/media/media-controls.js
src/third_party/WebKit/LayoutTests/media/video-controls-show-on-focus-expected.txt
src/third_party/WebKit/LayoutTests/media/video-controls-show-on-focus.html
src/third_party/WebKit/LayoutTests/platform/linux/compositing/squashing/squashing-print-expected.png [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/platform/linux/compositing/squashing/squashing-print-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/platform/linux/editing/selection/move-left-right-expected.txt
src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line-expected.png [deleted file]
src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line-expected.txt [deleted file]
src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line-expected.png [deleted file]
src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line-expected.txt [deleted file]
src/third_party/WebKit/LayoutTests/platform/mac/editing/selection/move-left-right-expected.txt
src/third_party/WebKit/LayoutTests/platform/win-xp/editing/selection/move-left-right-expected.txt
src/third_party/WebKit/LayoutTests/platform/win/editing/selection/move-left-right-expected.txt
src/third_party/WebKit/LayoutTests/svg/custom/multiple-title-elements-expected.txt
src/third_party/WebKit/LayoutTests/svg/custom/multiple-title-elements.svg
src/third_party/WebKit/LayoutTests/svg/filters/big-viewbox-expected.svg [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/svg/filters/big-viewbox.svg [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/FIXME-handshake-fail-by-null-subprotocol-selection-whitelist-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/README.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/alert-in-event-handler-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-handshake-crash-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-control-chars-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-empty-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-non-ascii-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/binary-type-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/broken-utf8-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bufferedAmount-after-close-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bufferedAmount-after-close-in-busy-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/client-close-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-before-handshake-response-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-before-open-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-code-and-reason-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-event-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-navigate-new-location-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-and-force-gc-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-reference-in-parent-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-reason-too-long-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-unref-websocket-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/compressed-control-frame-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-closeonclose-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-closeonerror-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-noclose-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cookie-http-to-ws-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cookie-ws-to-ws-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cross-origin-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-comp-bit-onoff-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-invalid-parameter-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-parameter-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-set-bfinal-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/echo-with-no-extension-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/extensions-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-binary-frames-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-control-frame-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-frames-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/frame-lengths-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-challenge-randomness-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-error-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-extensions-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-maxlength-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-mismatch-protocol-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-more-accept-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-more-protocol-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-accept-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-connection-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-cr-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-upgrade-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-null-subprotocol-selection-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-prepended-null-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-wrong-accept-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/httponly-cookie-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/interleaved-fragments-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-continuation-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-encode-length-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-masked-frames-from-server-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-subprotocol-characters-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-subprotocols-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/long-control-frame-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/long-invalid-header-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/multiple-connections-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/multiple-subprotocols-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/no-crash-on-cookie-flood-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/no-subprotocol-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/nocache-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/null-character-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-comp-bit-onoff-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-invalid-parameter-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-parameter-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-set-bfinal-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-unsolicited-negotiation-response-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-window-bits-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/pong-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/receive-arraybuffer-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/receive-blob-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reload-crash-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reserved-bits-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reserved-opcodes-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-after-close-on-unload-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-arraybuffer-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-arraybufferview-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-blob-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-blob-onmessage-origin-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-empty-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-file-blob-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-file-blob-fail-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-onmessage-origin-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-throw-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/server-close-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/set-protocol-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/simple-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/simple-stress-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/sub-protocol-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/too-long-payload-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unicode-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unmasked-frames-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unpaired-surrogates-in-close-reason-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unpaired-surrogates-in-message-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-no-trailing-slash-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-parsing-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-credential-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-empty-query-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-query-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/useragent-in-openinghandshake-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/websocket-event-target-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/websocket-pending-activity-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-code-and-reason-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-onmessage-crash-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-shared-worker-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-worker-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-closeonclose-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-closeonerror-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-noclose-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/multiple-subprotocols-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/no-onmessage-in-sync-op-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/no-subprotocol-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/receive-arraybuffer-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/receive-blob-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-arraybuffer-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-arraybufferview-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-blob-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/shared-worker-simple-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-handshake-challenge-randomness-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-reload-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-simple-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/zero-length-text-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/web-animations-api/option-element-crash-expected.txt [new file with mode: 0644]
src/third_party/WebKit/LayoutTests/web-animations-api/option-element-crash.html [new file with mode: 0644]
src/third_party/WebKit/ManualTests/drag-should-draw-target.html [moved from src/third_party/WebKit/ManualTests/drag-inline-block.html with 57% similarity]
src/third_party/WebKit/Source/bindings/v8/DOMWrapperMap.h
src/third_party/WebKit/Source/bindings/v8/SerializedScriptValue.cpp
src/third_party/WebKit/Source/bindings/v8/V8PersistentValueMap.h
src/third_party/WebKit/Source/core/accessibility/AXMenuListPopup.cpp
src/third_party/WebKit/Source/core/animation/interpolation/DeferredLegacyStyleInterpolation.cpp
src/third_party/WebKit/Source/core/css/SelectorChecker.cpp
src/third_party/WebKit/Source/core/css/mediaControls.css
src/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
src/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
src/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
src/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
src/third_party/WebKit/Source/core/css/resolver/StyleResolver.h
src/third_party/WebKit/Source/core/dom/ContainerNode.cpp
src/third_party/WebKit/Source/core/dom/ContainerNode.h
src/third_party/WebKit/Source/core/dom/Document.cpp
src/third_party/WebKit/Source/core/dom/Document.h
src/third_party/WebKit/Source/core/dom/Element.cpp
src/third_party/WebKit/Source/core/dom/Element.h
src/third_party/WebKit/Source/core/dom/FullscreenElementStack.cpp
src/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
src/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
src/third_party/WebKit/Source/core/dom/Range.cpp
src/third_party/WebKit/Source/core/dom/SelectorQuery.cpp
src/third_party/WebKit/Source/core/editing/FrameSelection.cpp
src/third_party/WebKit/Source/core/editing/FrameSelection.h
src/third_party/WebKit/Source/core/editing/InputMethodController.cpp
src/third_party/WebKit/Source/core/editing/PlainTextRange.cpp
src/third_party/WebKit/Source/core/editing/PlainTextRange.h
src/third_party/WebKit/Source/core/editing/TextIterator.cpp
src/third_party/WebKit/Source/core/editing/TextIterator.h
src/third_party/WebKit/Source/core/editing/TextIteratorTest.cpp
src/third_party/WebKit/Source/core/frame/FrameView.cpp
src/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
src/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
src/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
src/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
src/third_party/WebKit/Source/core/html/HTMLFormElement.h
src/third_party/WebKit/Source/core/html/HTMLLIElement.cpp
src/third_party/WebKit/Source/core/html/HTMLMetaElement-in.cpp
src/third_party/WebKit/Source/core/html/HTMLOptionElement.cpp
src/third_party/WebKit/Source/core/html/HTMLOptionElement.h
src/third_party/WebKit/Source/core/html/HTMLTitleElement.cpp
src/third_party/WebKit/Source/core/html/RadioNodeList.cpp
src/third_party/WebKit/Source/core/html/RadioNodeList.h
src/third_party/WebKit/Source/core/html/imports/HTMLImportTreeRoot.cpp
src/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
src/third_party/WebKit/Source/core/html/imports/HTMLImportsController.h
src/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
src/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp
src/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.cpp
src/third_party/WebKit/Source/core/loader/EmptyClients.h
src/third_party/WebKit/Source/core/loader/FormSubmission.cpp
src/third_party/WebKit/Source/core/loader/FormSubmission.h
src/third_party/WebKit/Source/core/loader/FrameLoaderClient.h
src/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp
src/third_party/WebKit/Source/core/loader/MixedContentChecker.h
src/third_party/WebKit/Source/core/page/ChromeClient.h
src/third_party/WebKit/Source/core/page/ContextMenuController.cpp
src/third_party/WebKit/Source/core/page/ContextMenuController.h
src/third_party/WebKit/Source/core/page/EventHandler.cpp
src/third_party/WebKit/Source/core/page/MouseEventWithHitTestResults.h
src/third_party/WebKit/Source/core/page/Page.cpp
src/third_party/WebKit/Source/core/page/Page.h
src/third_party/WebKit/Source/core/rendering/HitTestResult.cpp
src/third_party/WebKit/Source/core/rendering/HitTestResult.h
src/third_party/WebKit/Source/core/rendering/InlineFlowBox.cpp
src/third_party/WebKit/Source/core/rendering/RenderBlock.cpp
src/third_party/WebKit/Source/core/rendering/RenderBlock.h
src/third_party/WebKit/Source/core/rendering/RenderBlockFlow.cpp
src/third_party/WebKit/Source/core/rendering/RenderBox.cpp
src/third_party/WebKit/Source/core/rendering/RenderBox.h
src/third_party/WebKit/Source/core/rendering/RenderFieldset.h
src/third_party/WebKit/Source/core/rendering/RenderFullScreen.cpp
src/third_party/WebKit/Source/core/rendering/RenderInline.cpp
src/third_party/WebKit/Source/core/rendering/RenderLayer.cpp
src/third_party/WebKit/Source/core/rendering/RenderLayer.h
src/third_party/WebKit/Source/core/rendering/RenderListItem.cpp
src/third_party/WebKit/Source/core/rendering/RenderListItem.h
src/third_party/WebKit/Source/core/rendering/RenderObject.cpp
src/third_party/WebKit/Source/core/rendering/RenderTable.h
src/third_party/WebKit/Source/core/rendering/compositing/RenderLayerCompositor.cpp
src/third_party/WebKit/Source/core/rendering/line/BreakingContextInlineHeaders.h
src/third_party/WebKit/Source/core/rendering/line/LineWidth.cpp
src/third_party/WebKit/Source/core/rendering/line/LineWidth.h
src/third_party/WebKit/Source/core/rendering/style/RenderStyle.h
src/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceFilter.cpp
src/third_party/WebKit/Source/core/svg/SVGTitleElement.cpp
src/third_party/WebKit/Source/devtools/front_end/console/ConsoleView.js
src/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
src/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js
src/third_party/WebKit/Source/devtools/front_end/inspector.css
src/third_party/WebKit/Source/devtools/front_end/main/AdvancedApp.js
src/third_party/WebKit/Source/devtools/front_end/sources/FilteredItemSelectionDialog.js
src/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
src/third_party/WebKit/Source/devtools/front_end/timelinePanel.css
src/third_party/WebKit/Source/devtools/front_end/ui/ViewportControl.js
src/third_party/WebKit/Source/modules/EventTargetModulesFactory.in
src/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp
src/third_party/WebKit/Source/modules/webaudio/AudioContext.cpp
src/third_party/WebKit/Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp
src/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
src/third_party/WebKit/Source/platform/blink_platform.gypi
src/third_party/WebKit/Source/platform/fonts/Character.cpp
src/third_party/WebKit/Source/platform/fonts/FontFallbackList.cpp
src/third_party/WebKit/Source/platform/fonts/linux/FontPlatformDataLinuxHarfBuzz.cpp
src/third_party/WebKit/Source/platform/fonts/skia/FontCacheSkia.cpp
src/third_party/WebKit/Source/platform/fonts/win/FontFallbackWin.cpp
src/third_party/WebKit/Source/platform/heap/Heap.cpp
src/third_party/WebKit/Source/platform/heap/ThreadState.cpp
src/third_party/WebKit/Source/platform/heap/ThreadState.h
src/third_party/WebKit/Source/platform/transforms/TransformationMatrix.cpp
src/third_party/WebKit/Source/platform/transforms/TransformationMatrixTest.cpp [new file with mode: 0644]
src/third_party/WebKit/Source/web/ChromeClientImpl.cpp
src/third_party/WebKit/Source/web/ChromeClientImpl.h
src/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
src/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
src/third_party/WebKit/Source/web/WebDocument.cpp
src/third_party/WebKit/Source/web/WebHitTestResult.cpp
src/third_party/WebKit/Source/web/WebNode.cpp
src/third_party/WebKit/Source/web/WebNodeTest.cpp [new file with mode: 0644]
src/third_party/WebKit/Source/web/WebViewImpl.cpp
src/third_party/WebKit/Source/web/WebViewImpl.h
src/third_party/WebKit/Source/web/mac/WebSubstringUtil.mm
src/third_party/WebKit/Source/web/tests/ViewportTest.cpp
src/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
src/third_party/WebKit/Source/web/tests/WebViewTest.cpp
src/third_party/WebKit/Source/web/tests/data/brand_color_test.html [deleted file]
src/third_party/WebKit/Source/web/tests/data/div_with_image.html [new file with mode: 0644]
src/third_party/WebKit/Source/web/tests/data/nodeimage.html
src/third_party/WebKit/Source/web/tests/data/theme_color_test.html [new file with mode: 0644]
src/third_party/WebKit/Source/web/tests/data/viewport/viewport-138.html [new file with mode: 0644]
src/third_party/WebKit/Source/web/web.gypi
src/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
src/third_party/WebKit/public/platform/WebLayerTreeView.h
src/third_party/WebKit/public/web/WebDocument.h
src/third_party/WebKit/public/web/WebFrameClient.h
src/third_party/WebKit/public/web/WebHitTestResult.h
src/third_party/android_platform/development/scripts/symbol.py
src/third_party/angle/src/libGLESv2/renderer/IndexDataManager.cpp
src/third_party/angle/src/libGLESv2/renderer/IndexDataManager.h
src/third_party/angle/src/libGLESv2/renderer/d3d11/Renderer11.cpp
src/third_party/icu/icu.gyp
src/third_party/opus/opus.gyp
src/third_party/pdfium/fpdfsdk/src/fpdfview.cpp
src/third_party/skia/bench/ImageCacheBench.cpp
src/third_party/skia/gyp/tests.gypi
src/third_party/skia/include/core/SkGraphics.h
src/third_party/skia/include/utils/SkCanvasStateUtils.h
src/third_party/skia/src/core/SkBitmapProcState.cpp
src/third_party/skia/src/core/SkConvolver.cpp
src/third_party/skia/src/core/SkScaledImageCache.cpp
src/third_party/skia/src/core/SkScaledImageCache.h
src/third_party/skia/src/effects/SkColorMatrixFilter.cpp
src/third_party/skia/src/ports/SkScalerContext_win_dw.cpp
src/third_party/skia/src/ports/SkTypeface_win_dw.h
src/third_party/skia/src/utils/SkCanvasStateUtils.cpp
src/third_party/skia/tests/ImageCacheTest.cpp
src/third_party/skia/tests/ScaledImageCache.cpp [new file with mode: 0644]
src/third_party/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h
src/third_party/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc
src/third_party/webrtc/modules/remote_bitrate_estimator/overuse_detector.h
src/third_party/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
src/third_party/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc
src/third_party/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h
src/third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
src/third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc
src/third_party/webrtc/modules/rtp_rtcp/source/rtp_sender.h
src/tools/metrics/histograms/histograms.xml
src/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java
src/ui/android/java/src/org/chromium/ui/interpolators/BakedBezierInterpolator.java [new file with mode: 0644]
src/ui/android/java/strings/translations/android_ui_strings_ro.xtb
src/ui/app_list/views/top_icon_animation_view.cc
src/ui/app_list/views/top_icon_animation_view.h
src/ui/aura/gestures/gesture_recognizer_unittest.cc
src/ui/aura/window_event_dispatcher.cc
src/ui/aura/window_event_dispatcher_unittest.cc
src/ui/display/chromeos/touchscreen_delegate_impl.cc
src/ui/display/chromeos/touchscreen_delegate_impl_unittest.cc
src/ui/display/chromeos/x11/touchscreen_device_manager_x11.cc
src/ui/display/types/chromeos/touchscreen_device.cc
src/ui/display/types/chromeos/touchscreen_device.h
src/ui/events/event.cc
src/ui/events/event.h
src/ui/events/event_unittest.cc
src/ui/events/gesture_detection/gesture_detector.cc
src/ui/events/gesture_detection/gesture_detector.h
src/ui/events/gesture_detection/gesture_event_data_packet.cc
src/ui/events/gesture_detection/gesture_event_data_packet.h
src/ui/events/gesture_detection/gesture_provider.cc
src/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
src/ui/events/gesture_detection/touch_disposition_gesture_filter.h
src/ui/strings/translations/ui_strings_da.xtb
src/ui/strings/translations/ui_strings_lv.xtb
src/ui/strings/translations/ui_strings_no.xtb
src/ui/strings/translations/ui_strings_ro.xtb
src/ui/strings/translations/ui_strings_th.xtb
src/ui/views/accessibility/native_view_accessibility_win.cc
src/ui/views/controls/button/label_button.cc
src/ui/views/controls/menu/menu_delegate.cc
src/ui/views/controls/menu/menu_delegate.h
src/ui/views/controls/menu/menu_item_view.cc
src/ui/views/controls/menu/menu_model_adapter.cc
src/ui/views/controls/menu/menu_model_adapter.h
src/ui/views/controls/textfield/textfield.cc
src/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
src/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
src/ui/views/widget/desktop_aura/desktop_window_tree_host.h
src/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
src/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
src/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
src/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
src/ui/views/widget/native_widget_aura.cc
src/ui/views/widget/native_widget_aura.h
src/ui/views/widget/native_widget_mac.h
src/ui/views/widget/native_widget_mac.mm
src/ui/views/widget/native_widget_private.h
src/ui/views/widget/widget.cc
src/ui/views/widget/widget.h
src/ui/views/widget/widget_unittest.cc
src/ui/views/win/hwnd_message_handler.cc
src/v8/include/v8.h
src/v8/src/api.cc
src/v8/src/arm/code-stubs-arm.cc
src/v8/src/arm64/code-stubs-arm64.cc
src/v8/src/counters.cc
src/v8/src/counters.h
src/v8/src/d8.cc
src/v8/src/d8.h
src/v8/src/heap.cc
src/v8/src/heap.h
src/v8/src/hydrogen-instructions.h
src/v8/src/hydrogen.cc
src/v8/src/ia32/code-stubs-ia32.cc
src/v8/src/ia32/macro-assembler-ia32.cc
src/v8/src/ia32/macro-assembler-ia32.h
src/v8/src/ic.cc
src/v8/src/mips/code-stubs-mips.cc
src/v8/src/runtime.cc
src/v8/src/spaces.cc
src/v8/src/spaces.h
src/v8/src/version.cc
src/v8/src/x64/code-stubs-x64.cc
src/v8/src/x64/macro-assembler-x64.cc
src/v8/src/x64/macro-assembler-x64.h
src/v8/src/x87/code-stubs-x87.cc
src/v8/test/cctest/cctest.status
src/v8/test/cctest/test-api.cc
src/v8/test/mjsunit/regress/regress-392114.js [new file with mode: 0644]
src/v8/test/mjsunit/regress/regress-grow-deopt.js [new file with mode: 0644]
src/webkit/glue/resources/webkit_strings_ca.xtb
src/webkit/glue/resources/webkit_strings_da.xtb
src/webkit/glue/resources/webkit_strings_ro.xtb
src/webkit/glue/resources/webkit_strings_sk.xtb
src/webkit/glue/resources/webkit_strings_sw.xtb
src/webkit/glue/resources/webkit_strings_th.xtb
src/webkit/glue/resources/webkit_strings_zh-CN.xtb
src/webkit/glue/resources/webkit_strings_zh-TW.xtb
src/xwalk/DEPS.xwalk
src/xwalk/VERSION
src/xwalk/app/tools/android/app_info.py
src/xwalk/app/tools/android/customize.py
src/xwalk/app/tools/android/make_apk.py
src/xwalk/app/tools/android/make_apk_test.py
src/xwalk/application/browser/application_tizen.cc
src/xwalk/application/browser/application_tizen.h
src/xwalk/application/browser/linux/running_application_object.cc
src/xwalk/application/browser/linux/running_application_object.h
src/xwalk/application/browser/linux/running_applications_manager.cc
src/xwalk/application/browser/linux/running_applications_manager.h
src/xwalk/application/common/installer/signature_data.cc
src/xwalk/application/common/installer/signature_data.h
src/xwalk/application/common/installer/tizen/configuration/signature_schema.xsd [new file with mode: 0644]
src/xwalk/application/common/installer/tizen/signature_validator.cc [new file with mode: 0644]
src/xwalk/application/common/installer/tizen/signature_validator.h [new file with mode: 0644]
src/xwalk/application/common/installer/wgt_package.cc
src/xwalk/application/common/xwalk_application_common.gypi
src/xwalk/application/tools/linux/xwalk_launcher_main.cc
src/xwalk/application/tools/linux/xwalk_launcher_tizen.cc
src/xwalk/application/tools/linux/xwalk_launcher_tizen.h
src/xwalk/application/tools/linux/xwalkctl_main.cc
src/xwalk/extensions/renderer/xwalk_extension_renderer_controller.cc
src/xwalk/packaging/crosswalk.spec
src/xwalk/runtime/android/core/src/org/xwalk/core/JavascriptInterface.java [moved from src/xwalk/runtime/android/core_internal/src/org/xwalk/core/JavascriptInterface.java with 89% similarity]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkExtension.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkJavascriptResult.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkJavascriptResultHandler.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationHistory.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationItem.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkPreferences.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkResourceClient.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkUIClient.java [deleted file]
src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkView.java [deleted file]
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/ReflectionHelper.java [new file with mode: 0644]
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkAPI.java [new file with mode: 0644]
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkContent.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkContentsClient.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkContentsClientBridge.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkExtensionInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkJavascriptResultHandlerInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkJavascriptResultInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkNavigationHistoryInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkNavigationItemInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkNotificationService.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkNotificationServiceImpl.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkPreferencesInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkResourceClientInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkUIClientInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkViewInternal.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/extension/api/device_capabilities/DeviceCapabilitiesDisplay.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/extension/api/device_capabilities/DeviceCapabilitiesStorage.java
src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/extension/api/device_capabilities/device_capabilities_api.js
src/xwalk/runtime/app/xwalk_main_delegate.cc
src/xwalk/runtime/app/xwalk_main_delegate.h
src/xwalk/runtime/browser/runtime_resource_dispatcher_host_delegate.cc
src/xwalk/runtime/browser/runtime_resource_dispatcher_host_delegate.h
src/xwalk/runtime/browser/xwalk_browser_main_parts.cc
src/xwalk/runtime/browser/xwalk_browser_main_parts.h
src/xwalk/runtime/browser/xwalk_runner.cc
src/xwalk/runtime/browser/xwalk_runner.h
src/xwalk/runtime/common/xwalk_common_messages.h
src/xwalk/runtime/common/xwalk_content_client.cc
src/xwalk/runtime/renderer/xwalk_content_renderer_client.cc
src/xwalk/runtime/renderer/xwalk_render_process_observer_generic.cc
src/xwalk/runtime/renderer/xwalk_render_process_observer_generic.h
src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/OnReceivedTitleTest.java [new file with mode: 0644]
src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/OnScaleChangedTest.java [new file with mode: 0644]
src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/TestHelperBridge.java
src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/XWalkViewTestBase.java
src/xwalk/test/android/data/device_capabilities.html
src/xwalk/test/android/data/scale_changed.html [new file with mode: 0644]
src/xwalk/tools/reflection_generator/bridge_generator.py [new file with mode: 0644]
src/xwalk/tools/reflection_generator/code_generator.py [new file with mode: 0644]
src/xwalk/tools/reflection_generator/interface_generator.py [new file with mode: 0644]
src/xwalk/tools/reflection_generator/java_class.py [new file with mode: 0644]
src/xwalk/tools/reflection_generator/java_class_component.py [new file with mode: 0644]
src/xwalk/tools/reflection_generator/java_method.py [new file with mode: 0644]
src/xwalk/tools/reflection_generator/reflection_generator.py [new file with mode: 0755]
src/xwalk/tools/reflection_generator/wrapper_generator.py [new file with mode: 0644]
src/xwalk/xwalk.gyp
src/xwalk/xwalk_android.gypi
src/xwalk/xwalk_android_tests.gypi
src/xwalk/xwalk_core_library_android.gypi

index 1df546f..d84106c 100644 (file)
@@ -16,7 +16,7 @@
 %endif
 
 Name:           crosswalk
-Version:        9.37.193.0
+Version:        9.37.195.0
 Release:        0
 Summary:        Crosswalk is an app runtime based on Chromium
 License:        (BSD-3-Clause and LGPL-2.1+)
@@ -241,6 +241,8 @@ install -m 06755 -p -D src/out/Release/xwalk-pkg-helper %{buildroot}%{_bindir}/x
 install -p -D src/out/Release/icudtl.dat %{buildroot}%{_libdir}/xwalk/icudtl.dat
 install -p -D src/out/Release/libffmpegsumo.so %{buildroot}%{_libdir}/xwalk/libffmpegsumo.so
 install -p -D src/out/Release/xwalk.pak %{buildroot}%{_libdir}/xwalk/xwalk.pak
+mkdir -p %{buildroot}%{_datadir}/xwalk
+install -p -D src/xwalk/application/common/installer/tizen/configuration/*.xsd %{buildroot}%{_datadir}/xwalk/
 
 # PNaCl
 %if ! %{_disable_nacl}
@@ -285,3 +287,4 @@ mkdir -p %{_manifestdir_ro}
 %{_desktop_icondir}/%{name}.png
 %{_dbusservicedir}/org.crosswalkproject.Runtime1.service
 %{_systemduserservicedir}/xwalk.service
+%{_datadir}/xwalk/*
index 9bcdb28..ce27c26 100644 (file)
@@ -9,9 +9,9 @@ vars = {
     'git_url':
          'https://chromium.googlesource.com',
     'webkit_rev':
-         '@f35b0cb58d8f1d16e8794f73805e9cfa1c9e6fa9',
+         '@052a22b0345eccf119172f8ee6bae904d04fe172',
     'angle_revision':
-         'c333af9c8e6b776363b722d9e9c4fed0b597f984'
+         '75551cf9a7c65bcdb9f9fe44ac78ca15da37942e'
 }
 
 deps = {
@@ -44,7 +44,7 @@ deps = {
     'src/media/cdm/ppapi/api':
         Var('git_url') + '/chromium/cdm.git@400ae69a79d6b8b531c6960d0558d13cde600879',
     'src/native_client':
-        Var('git_url') + '/native_client/src/native_client.git@9e307cb68ba4ad4d11b63ec1d3db261a576c6d77',
+        Var('git_url') + '/native_client/src/native_client.git@55a871697b66a2da6146b35e10b09123ae963ef3',
     'src/sdch/open-vcdiff':
         Var('git_url') + '/external/open-vcdiff.git@438f2a5be6d809bc21611a94cd37bfc8c28ceb33',
     'src/testing/gmock':
@@ -80,7 +80,7 @@ deps = {
     'src/third_party/hunspell_dictionaries':
         Var('git_url') + '/chromium/deps/hunspell_dictionaries.git@4560bdd463a3500e2334e85c8a0e9e5d5d6774e7',
     'src/third_party/icu':
-        Var('git_url') + '/chromium/deps/icu46.git@c25f7de14670091b1b7dfeb7af4d04050cbbb1d8',
+        Var('git_url') + '/chromium/deps/icu46.git@fffc215567216e09f56578b254a56668f1c89add',
     'src/third_party/jsoncpp/source/include':
         Var('git_url') + '/external/jsoncpp/jsoncpp/include.git@b0dd48e02b6e6248328db78a65b5c601f150c349',
     'src/third_party/jsoncpp/source/src/lib_json':
@@ -124,7 +124,7 @@ deps = {
     'src/third_party/ots':
         Var('git_url') + '/external/ots.git@52c48f7ae423c497de8f2268f7c41490b9882a6f',
     'src/third_party/pdfium':
-        'https://pdfium.googlesource.com/pdfium.git@9e16edd0ffb834e87da76fe6b0fe4aef39312685',
+        'https://pdfium.googlesource.com/pdfium.git@a2dfb95353c8e4851300f8d53d4659e1b764c31d',
     'src/third_party/pyftpdlib/src':
         Var('git_url') + '/external/pyftpdlib.git@2be6d65e31c7ee6320d059f581f05ae8d89d7e45',
     'src/third_party/pywebsocket/src':
@@ -136,7 +136,7 @@ deps = {
     'src/third_party/sfntly/cpp/src':
         Var('git_url') + '/external/sfntly/cpp/src.git@1bdaae8fc788a5ac8936d68bf24f37d977a13dac',
     'src/third_party/skia':
-        Var('git_url') + '/skia.git@282aa1e4ee2d9aa64d42cf5a7516399f028b582f',
+        Var('git_url') + '/skia.git@0d78ac294f814a45380eb44b0bb4c01aae2cab01',
     'src/third_party/smhasher/src':
         Var('git_url') + '/external/smhasher.git@e87738e57558e0ec472b2fc3a643b838e5b6e88f',
     'src/third_party/snappy/src':
@@ -156,7 +156,7 @@ deps = {
     'src/third_party/webpagereplay':
         Var('git_url') + '/external/web-page-replay.git@b62c02d3b64cf00a2f65a82cca0721aa42c3d6ad',
     'src/third_party/webrtc':
-        Var('git_url') + '/external/webrtc/trunk/webrtc.git@b5f5e9089dca995c3d4a6fe0c266d19b8a088b92',
+        Var('git_url') + '/external/webrtc/trunk/webrtc.git@14b8f01ca3c95e3f10a141f63c3250b38cf5433c',
     'src/third_party/yasm/source/patched-yasm':
         Var('git_url') + '/chromium/deps/yasm/patched-yasm.git@c960eb11ccda80b10ed50be39df4f0663b371d1d',
     'src/tools/deps2git':
@@ -170,16 +170,18 @@ deps = {
     'src/tools/swarming_client':
         Var('git_url') + '/external/swarming.client.git@c333224ef8cf5cc41ab91f6ee9cb1fdbe3689f19',
     'src/v8':
-        Var('git_url') + '/external/v8.git@0ce8f0b69763279bcd71f5766eeab4b1cf1eb72c',
+        Var('git_url') + '/external/v8.git@644e49bdbb46608c3292d19df9145c0793927e54',
 }
 
 deps_os = {
     'android':
     {
+        'src/breakpad/src':
+            Var('git_url') + '/external/google-breakpad/src.git@ff5798804edef130b64a43885d52730087aaa420',
         'src/pdf':
             None,
         'src/third_party/android_tools':
-            Var('git_url') + '/android_tools.git@7e1a9d2fadc6d5aba62b235ffa9a15f3b4be06cb',
+            Var('git_url') + '/android_tools.git@e91e44dc29517115794a72eea554616d067925ae',
         'src/third_party/aosp':
             Var('git_url') + '/chromium/deps/aosp.git@bbafe5155dff86bbba1e92b42a073ffcfcfbf28c',
         'src/third_party/apache-mime4j':
@@ -207,6 +209,8 @@ deps_os = {
     },
     'ios':
     {
+        'src/breakpad/src':
+            Var('git_url') + '/external/google-breakpad/src.git@ff5798804edef130b64a43885d52730087aaa420',
         'src/build/util/support':
             None,
         'src/chrome/test/data/extensions/api_test/permissions/nacl_enabled/bin':
@@ -311,7 +315,7 @@ deps_os = {
         'src/chrome/installer/mac/third_party/xz/xz':
             Var('git_url') + '/chromium/deps/xz.git@eecaf55632ca72e90eb2641376bce7cdbc7284f7',
         'src/chrome/tools/test/reference_build/chrome_mac':
-            Var('git_url') + '/chromium/reference_builds/chrome.git@1add884151176e42ddb946b68530e61c971ee3fa',
+            Var('git_url') + '/chromium/reference_builds/chrome_mac.git@43a9e3be5957581876a77de737bb82c568e37fd7',
         'src/third_party/google_toolbox_for_mac/src':
             Var('git_url') + '/external/google-toolbox-for-mac.git@704fb56df6a9a0884801045a158e021945d9d991',
         'src/third_party/lighttpd':
@@ -330,7 +334,7 @@ deps_os = {
         'build/third_party/xvfb':
             Var('git_url') + '/chromium/tools/third_party/xvfb.git@aebb1aadf1422e4d81e831e13746b8f7ae322e07',
         'src/chrome/tools/test/reference_build/chrome_linux':
-            Var('git_url') + '/chromium/reference_builds/chrome.git@1add884151176e42ddb946b68530e61c971ee3fa',
+            Var('git_url') + '/chromium/reference_builds/chrome_linux64.git@34e237c7cd03bac41e45a3148bc010d55cb79c95',
         'src/third_party/chromite':
             Var('git_url') + '/chromiumos/chromite.git@df22fd72b22d1905af6e69d23ec373b69c9c75f6',
         'src/third_party/cros_system_api':
@@ -355,7 +359,7 @@ deps_os = {
     'win':
     {
         'src/chrome/tools/test/reference_build/chrome_win':
-            Var('git_url') + '/chromium/reference_builds/chrome.git@1add884151176e42ddb946b68530e61c971ee3fa',
+            Var('git_url') + '/chromium/reference_builds/chrome_win.git@57da26d38da00176d3cebf52b5abc1c127880a31',
         'src/third_party/bison':
             Var('git_url') + '/chromium/deps/bison.git@083c9a45e4affdd5464ee2b224c2df649c6e26c3',
         'src/third_party/cygwin':
index 2762657..2252ce4 100644 (file)
--- a/src/DEPS
+++ b/src/DEPS
@@ -17,12 +17,14 @@ vars = {
     'http://v8-i18n.googlecode.com/svn',\r
   'selenium':\r
     'http://selenium.googlecode.com/svn',\r
+  'buildspec_platforms':\r
+    'all',\r
   'snappy':\r
     'http://snappy.googlecode.com/svn',\r
   'ppapi':\r
     'http://ppapi.googlecode.com/svn',\r
-  'webrtc':\r
-    'http://webrtc.googlecode.com/svn',\r
+  'pywebsocket':\r
+    'http://pywebsocket.googlecode.com/svn',\r
   'libaddressinput':\r
     'http://libaddressinput.googlecode.com/svn',\r
   'pyftpdlib':\r
@@ -47,8 +49,8 @@ vars = {
     'http://linux-syscall-support.googlecode.com/svn',\r
   'trace-viewer':\r
     'http://trace-viewer.googlecode.com/svn',\r
-  'pywebsocket':\r
-    'http://pywebsocket.googlecode.com/svn',\r
+  'webrtc':\r
+    'http://webrtc.googlecode.com/svn',\r
   'web-page-replay':\r
     'http://web-page-replay.googlecode.com/svn',\r
   'libjingle':\r
@@ -152,6 +154,8 @@ deps_os = {
     'src/third_party/sfntly/cpp/src': None,\r
     'src/third_party/libc++/trunk': None,\r
     'src/third_party/libc++abi/trunk': None,\r
+    'src/breakpad/src':\r
+      (Var("google-breakpad")) + '/branches/chrome_37/src@1357',\r
     'src/media/cdm/ppapi/api': None,\r
     'src/third_party/v8-i18n': None,\r
     'src/chrome/test/data/perf/frame_rate/content': None,\r
@@ -181,7 +185,7 @@ deps_os = {
     'src/third_party/WebKit/LayoutTests/w3c/web-platform-tests': None,\r
     'src/chrome/test/data/extensions/api_test/permissions/nacl_enabled/bin': None,\r
     'src/third_party/WebKit/public':\r
-      (Var("blink")) + '/branches/chromium/2062/public@178111',\r
+      (Var("blink")) + '/branches/chromium/2062/public@180122',\r
     'src/native_client': None,\r
     'src/tools/page_cycler/acid3': None,\r
     'src/testing/iossim/third_party/class-dump':\r
@@ -242,6 +246,8 @@ deps_os = {
         '/trunk/deps/third_party/apache-mime4j@170888',\r
       'src/third_party/elfutils/src':\r
         (Var("git.chromium.org")) + '/external/elfutils.git@43a97297be82feab4b3176a094ed701ad3ccb308',\r
+      'src/breakpad/src':\r
+        (Var("google-breakpad")) + '/branches/chrome_37/src@1357',\r
       'src/third_party/freetype':\r
         (Var("git.chromium.org")) + '/chromium/src/third_party/freetype.git@a2b9955b49034a51dfbc8bf9f4e9d312149cecac',\r
       'src/third_party/jarjar':\r
@@ -249,7 +255,7 @@ deps_os = {
       'src/third_party/aosp':\r
         '/trunk/deps/third_party/aosp@148330',\r
       'src/third_party/android_tools':\r
-        (Var("git.chromium.org")) + '/android_tools.git@7e1a9d2fadc6d5aba62b235ffa9a15f3b4be06cb',\r
+        (Var("git.chromium.org")) + '/android_tools.git@e91e44dc29517115794a72eea554616d067925ae',\r
       'src/third_party/httpcomponents-client':\r
         '/trunk/deps/third_party/httpcomponents-client@170888',\r
       'src/third_party/findbugs':\r
@@ -275,7 +281,7 @@ deps = {
   'src/third_party/libwebm/source':\r
     (Var("git.chromium.org")) + '/webm/libwebm.git@8be63972fdd7ae8c041778f8ba674ade903395c9',\r
   'src/third_party/WebKit':\r
-    (Var("blink")) + '/branches/chromium/2062@178111',\r
+    (Var("blink")) + '/branches/chromium/2062@180122',\r
   'src/third_party/openmax_dl':\r
     (Var("webrtc")) + '/deps/third_party/openmax@6483',\r
   'src/third_party/libc++abi/trunk':\r
@@ -289,7 +295,7 @@ deps = {
   'src/media/cdm/ppapi/api':\r
     '/trunk/deps/cdm@273356',\r
   'src/third_party/skia':\r
-    (Var("git.chromium.org")) + '/skia.git@282aa1e4ee2d9aa64d42cf5a7516399f028b582f',\r
+    (Var("git.chromium.org")) + '/skia.git@0d78ac294f814a45380eb44b0bb4c01aae2cab01',\r
   'src/tools/swarming_client':\r
     (Var("git.chromium.org")) + '/external/swarming.client.git@c333224ef8cf5cc41ab91f6ee9cb1fdbe3689f19',\r
   'src/chrome/test/data/perf/frame_rate/content':\r
@@ -313,13 +319,13 @@ deps = {
   'src/third_party/smhasher/src':\r
     (Var("smhasher")) + '/trunk@152',\r
   'src/third_party/webrtc':\r
-    (Var("webrtc")) + '/branches/3.55/webrtc@6541',\r
+    (Var("webrtc")) + '/branches/3.55/webrtc@6796',\r
   'build/scripts/tools/deps2git':\r
     '/trunk/tools/deps2git@276439',\r
   'src/third_party/hunspell_dictionaries':\r
     '/trunk/deps/third_party/hunspell_dictionaries@255132',\r
   'src/native_client':\r
-    (Var("native_client")) + '/branches/2062/src/native_client@13479',\r
+    (Var("native_client")) + '/branches/2062/src/native_client@13585',\r
   'src/third_party/brotli/src':\r
     (Var("git.chromium.org")) + '/external/font-compression-reference.git@6cef49677dc4c650ef6e3f56041e0a41803afa8c',\r
   'src/tools/page_cycler/acid3':\r
@@ -327,7 +333,7 @@ deps = {
   'src/third_party/cacheinvalidation/src':\r
     (Var("google-cache-invalidation-api")) + '/trunk/src@331',\r
   'src/chrome/test/data/extensions/api_test/permissions/nacl_enabled/bin':\r
-    (Var("native_client")) + '/branches/2062/src/native_client/tests/prebuilt@13479',\r
+    (Var("native_client")) + '/branches/2062/src/native_client/tests/prebuilt@13585',\r
   'src/third_party/leveldatabase/src':\r
     (Var("leveldb")) + '/trunk@80',\r
   'src/third_party/webpagereplay':\r
@@ -339,7 +345,7 @@ deps = {
   'src/sdch/open-vcdiff':\r
     (Var("open-vcdiff")) + '/trunk@42',\r
   'src/third_party/angle':\r
-    (Var("git.chromium.org")) + '/angle/angle.git@c333af9c8e6b776363b722d9e9c4fed0b597f984',\r
+    (Var("git.chromium.org")) + '/angle/angle.git@75551cf9a7c65bcdb9f9fe44ac78ca15da37942e',\r
   'build/third_party/lighttpd':\r
     '/trunk/deps/third_party/lighttpd@58968',\r
   'src/buildtools':\r
@@ -367,7 +373,7 @@ deps = {
   'src/third_party/libphonenumber/src/test':\r
     (Var("libphonenumber")) + '/trunk/cpp/test@621',\r
   'src/third_party/pdfium':\r
-    'https://pdfium.googlesource.com/pdfium.git@9e16edd0ffb834e87da76fe6b0fe4aef39312685',\r
+    'https://pdfium.googlesource.com/pdfium.git@a2dfb95353c8e4851300f8d53d4659e1b764c31d',\r
   'src/third_party/libphonenumber/src/phonenumbers':\r
     (Var("libphonenumber")) + '/trunk/cpp/src/phonenumbers@621',\r
   'src/third_party/openssl':\r
@@ -391,7 +397,7 @@ deps = {
   'src/third_party/libaddressinput/src/cpp':\r
     (Var("libaddressinput")) + '/trunk/cpp@293',\r
   'src/third_party/icu':\r
-    '/trunk/deps/third_party/icu46@262949',\r
+    '/trunk/deps/third_party/icu46@285202',\r
   'src/third_party/speex':\r
     '/trunk/deps/third_party/speex@272757',\r
   'src/third_party/opus/src':\r
@@ -413,7 +419,7 @@ deps = {
   'src/third_party/libsrtp':\r
     '/trunk/deps/third_party/libsrtp@261337',\r
   'src/v8':\r
-    (Var("v8")) + '/branches/3.27@22375',\r
+    (Var("v8")) + '/branches/3.27@22914',\r
   'src/third_party/pywebsocket/src':\r
     (Var("pywebsocket")) + '/trunk/src@790',\r
   'src/third_party/libvpx':\r
index f1ab1b9..2d78f01 100644 (file)
@@ -216,8 +216,7 @@ size_t BrowserViewRenderer::GetNumTiles() const {
 bool BrowserViewRenderer::OnDraw(jobject java_canvas,
                                  bool is_hardware_canvas,
                                  const gfx::Vector2d& scroll,
-                                 const gfx::Rect& global_visible_rect,
-                                 const gfx::Rect& clip) {
+                                 const gfx::Rect& global_visible_rect) {
   last_on_draw_scroll_offset_ = scroll;
   last_on_draw_global_visible_rect_ = global_visible_rect;
 
@@ -227,7 +226,7 @@ bool BrowserViewRenderer::OnDraw(jobject java_canvas,
   if (is_hardware_canvas && attached_to_window_)
     return OnDrawHardware(java_canvas);
   // Perform a software draw
-  return DrawSWInternal(java_canvas, clip);
+  return OnDrawSoftware(java_canvas);
 }
 
 bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
@@ -237,6 +236,7 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
   if (!hardware_enabled_) {
     hardware_enabled_ = compositor_->InitializeHwDraw();
     if (hardware_enabled_) {
+      tile_manager_key_ = GlobalTileManager::GetInstance()->PushBack(this);
       gpu::GLInProcessContext* share_context = compositor_->GetShareContext();
       DCHECK(share_context);
       shared_renderer_state_->SetSharedContext(share_context);
@@ -295,27 +295,26 @@ void BrowserViewRenderer::ReturnResourceFromParent() {
   }
 }
 
-bool BrowserViewRenderer::DrawSWInternal(jobject java_canvas,
-                                         const gfx::Rect& clip) {
-  if (clip.IsEmpty()) {
-    TRACE_EVENT_INSTANT0(
-        "android_webview", "EarlyOut_EmptyClip", TRACE_EVENT_SCOPE_THREAD);
-    return true;
-  }
-
+bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) {
   if (!compositor_) {
     TRACE_EVENT_INSTANT0(
         "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD);
     return false;
   }
 
+  // TODO(hush): right now webview size is passed in as the auxiliary bitmap
+  // size, which might hurt performace (only for software draws with auxiliary
+  // bitmap). For better performance, get global visible rect, transform it
+  // from screen space to view space, then intersect with the webview in
+  // viewspace.  Use the resulting rect as the auxiliary
+  // bitmap.
   return BrowserViewRendererJavaHelper::GetInstance()
       ->RenderViaAuxilaryBitmapIfNeeded(
-            java_canvas,
-            last_on_draw_scroll_offset_,
-            clip,
-            base::Bind(&BrowserViewRenderer::CompositeSW,
-                       base::Unretained(this)));
+          java_canvas,
+          last_on_draw_scroll_offset_,
+          gfx::Size(width_, height_),
+          base::Bind(&BrowserViewRenderer::CompositeSW,
+                     base::Unretained(this)));
 }
 
 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width,
@@ -406,27 +405,27 @@ void BrowserViewRenderer::OnAttachedToWindow(int width, int height) {
   attached_to_window_ = true;
   width_ = width;
   height_ = height;
-  tile_manager_key_ = GlobalTileManager::GetInstance()->PushBack(this);
 }
 
 void BrowserViewRenderer::OnDetachedFromWindow() {
   TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow");
   attached_to_window_ = false;
-  if (hardware_enabled_) {
-    ReturnUnusedResource(shared_renderer_state_->PassDrawGLInput());
-    ReturnResourceFromParent();
-    DCHECK(shared_renderer_state_->ReturnedResourcesEmpty());
-
-    compositor_->ReleaseHwDraw();
-    shared_renderer_state_->SetSharedContext(NULL);
-    hardware_enabled_ = false;
-  }
+  DCHECK(!hardware_enabled_);
+}
+
+void BrowserViewRenderer::ReleaseHardware() {
+  DCHECK(hardware_enabled_);
+  ReturnUnusedResource(shared_renderer_state_->PassDrawGLInput());
+  ReturnResourceFromParent();
+  DCHECK(shared_renderer_state_->ReturnedResourcesEmpty());
+
+  compositor_->ReleaseHwDraw();
+  shared_renderer_state_->SetSharedContext(NULL);
+  hardware_enabled_ = false;
+
   SynchronousCompositorMemoryPolicy zero_policy;
   RequestMemoryPolicy(zero_policy);
   GlobalTileManager::GetInstance()->Remove(tile_manager_key_);
-  // The hardware resources are released in the destructor of hardware renderer,
-  // so we don't need to do it here.
-  // See AwContents::ReleaseHardwareDrawOnRenderThread(JNIEnv*, jobject).
 }
 
 bool BrowserViewRenderer::IsVisible() const {
index 378eeb6..338b31d 100644 (file)
@@ -47,7 +47,7 @@ class BrowserViewRendererJavaHelper {
   virtual bool RenderViaAuxilaryBitmapIfNeeded(
       jobject java_canvas,
       const gfx::Vector2d& scroll_correction,
-      const gfx::Rect& clip,
+      const gfx::Size& auxiliary_bitmap_size,
       RenderMethod render_source) = 0;
 
  protected:
@@ -79,8 +79,7 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient,
   bool OnDraw(jobject java_canvas,
               bool is_hardware_canvas,
               const gfx::Vector2d& scroll,
-              const gfx::Rect& global_visible_rect,
-              const gfx::Rect& clip);
+              const gfx::Rect& global_visible_rect);
 
   // CapturePicture API methods.
   skia::RefPtr<SkPicture> CapturePicture(int width, int height);
@@ -107,6 +106,7 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient,
   gfx::Rect GetScreenRect() const;
   bool attached_to_window() const { return attached_to_window_; }
   bool hardware_enabled() const { return hardware_enabled_; }
+  void ReleaseHardware();
 
   // Set the memory policy in shared renderer state and request the tiles from
   // GlobalTileManager. The actually amount of memory allowed by
@@ -146,7 +146,7 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient,
   // invalidates appropriately. If |force_invalidate| is true, then send a view
   // invalidate regardless of compositor expectation.
   void EnsureContinuousInvalidation(bool force_invalidate);
-  bool DrawSWInternal(jobject java_canvas, const gfx::Rect& clip_bounds);
+  bool OnDrawSoftware(jobject java_canvas);
   bool CompositeSW(SkCanvas* canvas);
   void DidComposite();
   scoped_ptr<base::Value> RootLayerStateAsValue(
index 4ed2859..df7e361 100644 (file)
@@ -76,11 +76,13 @@ HardwareRenderer::HardwareRenderer(SharedRendererState* state)
       last_egl_context_(eglGetCurrentContext()),
       stencil_enabled_(false),
       viewport_clip_valid_for_dcheck_(false),
+      gl_surface_(new AwGLSurface),
       root_layer_(cc::Layer::Create()),
+      resource_collection_(new cc::DelegatedFrameResourceCollection),
       output_surface_(NULL) {
   DCHECK(last_egl_context_);
 
-  gl_surface_ = new AwGLSurface;
+  resource_collection_->SetClient(this);
 
   cc::LayerTreeSettings settings;
 
@@ -105,17 +107,15 @@ HardwareRenderer::~HardwareRenderer() {
   root_layer_ = NULL;
   delegated_layer_ = NULL;
   frame_provider_ = NULL;
-  if (resource_collection_.get()) {
 #if DCHECK_IS_ON
-    // Check collection is empty.
-    cc::ReturnedResourceArray returned_resources;
-    resource_collection_->TakeUnusedResourcesForChildCompositor(
-        &returned_resources);
-    DCHECK_EQ(0u, returned_resources.size());
+  // Check collection is empty.
+  cc::ReturnedResourceArray returned_resources;
+  resource_collection_->TakeUnusedResourcesForChildCompositor(
+      &returned_resources);
+  DCHECK_EQ(0u, returned_resources.size());
 #endif  // DCHECK_IS_ON
 
-    resource_collection_->SetClient(NULL);
-  }
+  resource_collection_->SetClient(NULL);
 }
 
 void HardwareRenderer::DidBeginMainFrame() {
@@ -127,6 +127,48 @@ void HardwareRenderer::DidBeginMainFrame() {
   output_surface_->SetDrawConstraints(viewport_, clip_);
 }
 
+void HardwareRenderer::CommitFrame() {
+  scoped_ptr<DrawGLInput> input = shared_renderer_state_->PassDrawGLInput();
+  if (!input.get()) {
+    DLOG(WARNING) << "No frame to commit";
+    return;
+  }
+
+  DCHECK(!input->frame.gl_frame_data);
+  DCHECK(!input->frame.software_frame_data);
+
+  // DelegatedRendererLayerImpl applies the inverse device_scale_factor of the
+  // renderer frame, assuming that the browser compositor will scale
+  // it back up to device scale.  But on Android we put our browser layers in
+  // physical pixels and set our browser CC device_scale_factor to 1, so this
+  // suppresses the transform.
+  input->frame.delegated_frame_data->device_scale_factor = 1.0f;
+
+  gfx::Size frame_size =
+      input->frame.delegated_frame_data->render_pass_list.back()
+          ->output_rect.size();
+  bool size_changed = frame_size != frame_size_;
+  frame_size_ = frame_size;
+  scroll_offset_ = input->scroll_offset;
+
+  if (!frame_provider_ || size_changed) {
+    if (delegated_layer_) {
+      delegated_layer_->RemoveFromParent();
+    }
+
+    frame_provider_ = new cc::DelegatedFrameProvider(
+        resource_collection_.get(), input->frame.delegated_frame_data.Pass());
+
+    delegated_layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
+    delegated_layer_->SetBounds(gfx::Size(input->width, input->height));
+    delegated_layer_->SetIsDrawable(true);
+
+    root_layer_->AddChild(delegated_layer_);
+  } else {
+    frame_provider_->SetFrameData(input->frame.delegated_frame_data.Pass());
+  }
+}
+
 void HardwareRenderer::DrawGL(bool stencil_enabled,
                               int framebuffer_binding_ext,
                               AwDrawGLInfo* draw_info) {
@@ -140,52 +182,15 @@ void HardwareRenderer::DrawGL(bool stencil_enabled,
     return;
   }
 
+  if (!delegated_layer_.get()) {
+    DLOG(ERROR) << "No frame committed";
+    return;
+  }
+
   // TODO(boliu): Handle context loss.
   if (last_egl_context_ != current_context)
     DLOG(WARNING) << "EGLContextChanged";
 
-  scoped_ptr<DrawGLInput> input = shared_renderer_state_->PassDrawGLInput();
-  if (!resource_collection_.get()) {
-    resource_collection_ = new cc::DelegatedFrameResourceCollection;
-    resource_collection_->SetClient(this);
-  }
-
-  if (input.get()) {
-    DCHECK(!input->frame.gl_frame_data);
-    DCHECK(!input->frame.software_frame_data);
-
-    // DelegatedRendererLayerImpl applies the inverse device_scale_factor of the
-    // renderer frame, assuming that the browser compositor will scale
-    // it back up to device scale.  But on Android we put our browser layers in
-    // physical pixels and set our browser CC device_scale_factor to 1, so this
-    // suppresses the transform.
-    input->frame.delegated_frame_data->device_scale_factor = 1.0f;
-
-    gfx::Size frame_size =
-        input->frame.delegated_frame_data->render_pass_list.back()
-            ->output_rect.size();
-    bool size_changed = frame_size != frame_size_;
-    frame_size_ = frame_size;
-    scroll_offset_ = input->scroll_offset;
-
-    if (!frame_provider_ || size_changed) {
-      if (delegated_layer_) {
-        delegated_layer_->RemoveFromParent();
-      }
-
-      frame_provider_ = new cc::DelegatedFrameProvider(
-          resource_collection_.get(), input->frame.delegated_frame_data.Pass());
-
-      delegated_layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
-      delegated_layer_->SetBounds(gfx::Size(input->width, input->height));
-      delegated_layer_->SetIsDrawable(true);
-
-      root_layer_->AddChild(delegated_layer_);
-    } else {
-      frame_provider_->SetFrameData(input->frame.delegated_frame_data.Pass());
-    }
-  }
-
   viewport_.SetSize(draw_info->width, draw_info->height);
   layer_tree_host_->SetViewportSize(viewport_);
   clip_.SetRect(draw_info->clip_left,
index 115ff0e..f69d587 100644 (file)
@@ -35,6 +35,7 @@ class HardwareRenderer : public cc::LayerTreeHostClient,
   void DrawGL(bool stencil_enabled,
               int framebuffer_binding_ext,
               AwDrawGLInfo* draw_info);
+  void CommitFrame();
 
   // cc::LayerTreeHostClient overrides.
   virtual void WillBeginMainFrame(int frame_id) OVERRIDE {}
index ceb361f..d0d7d5e 100644 (file)
@@ -16,6 +16,7 @@
 #include "base/command_line.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/sequenced_worker_pool.h"
+#include "base/threading/worker_pool.h"
 #include "components/data_reduction_proxy/browser/data_reduction_proxy_config_service.h"
 #include "components/data_reduction_proxy/browser/data_reduction_proxy_settings.h"
 #include "components/data_reduction_proxy/browser/http_auth_handler_data_reduction_proxy.h"
@@ -32,6 +33,7 @@
 #include "net/http/http_stream_factory.h"
 #include "net/proxy/proxy_service.h"
 #include "net/socket/next_proto.h"
+#include "net/ssl/default_server_bound_cert_store.h"
 #include "net/url_request/data_protocol_handler.h"
 #include "net/url_request/file_protocol_handler.h"
 #include "net/url_request/url_request_context_builder.h"
@@ -208,6 +210,12 @@ void AwURLRequestContextGetter::InitializeURLRequestContext() {
 #endif
 
   url_request_context_.reset(builder.Build());
+  server_bound_cert_service_.reset(
+      new net::ServerBoundCertService(
+          new net::DefaultServerBoundCertStore(NULL),
+          base::WorkerPool::GetTaskRunner(true)));
+  url_request_context_->set_server_bound_cert_service(
+      server_bound_cert_service_.get());
   // TODO(mnaganov): Fix URLRequestContextBuilder to use proper threads.
   net::HttpNetworkSession::Params network_session_params;
 
index 02eb745..8eedbc4 100644 (file)
@@ -11,6 +11,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "content/public/browser/content_browser_client.h"
 #include "net/http/http_network_session.h"
+#include "net/ssl/server_bound_cert_service.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_job_factory.h"
 
@@ -68,6 +69,7 @@ class AwURLRequestContextGetter : public net::URLRequestContextGetter {
   scoped_ptr<DataReductionProxyConfigService> proxy_config_service_;
   scoped_ptr<net::URLRequestJobFactory> job_factory_;
   scoped_ptr<net::HttpTransactionFactory> main_http_factory_;
+  scoped_ptr<net::ServerBoundCertService> server_bound_cert_service_;
 
   // ProtocolHandlers and interceptors are stored here between
   // SetHandlersAndInterceptors() and the first GetURLRequestContext() call.
index 8872dd7..46614f3 100644 (file)
@@ -298,11 +298,9 @@ content::ResourceDispatcherHostLoginDelegate*
   return new AwLoginDelegate(auth_info, request);
 }
 
-bool AwResourceDispatcherHostDelegate::HandleExternalProtocol(
-    const GURL& url,
-    int child_id,
-    int route_id,
-    bool initiated_by_user_gesture) {
+bool AwResourceDispatcherHostDelegate::HandleExternalProtocol(const GURL& url,
+                                                              int child_id,
+                                                              int route_id) {
   // The AwURLRequestJobFactory implementation should ensure this method never
   // gets called.
   NOTREACHED();
index 8702b09..e584c40 100644 (file)
@@ -51,8 +51,7 @@ class AwResourceDispatcherHostDelegate
       net::URLRequest* request) OVERRIDE;
   virtual bool HandleExternalProtocol(const GURL& url,
                                       int child_id,
-                                      int route_id,
-                                      bool initiated_by_user_gesture) OVERRIDE;
+                                      int route_id) OVERRIDE;
   virtual void OnResponseStarted(
       net::URLRequest* request,
       content::ResourceContext* resource_context,
index 8845b76..582908e 100644 (file)
@@ -23,7 +23,7 @@ SharedRendererState::SharedRendererState(
       client_on_ui_(client),
       weak_factory_on_ui_thread_(this),
       ui_thread_weak_ptr_(weak_factory_on_ui_thread_.GetWeakPtr()),
-      hardware_allowed_(false),
+      inside_hardware_release_(false),
       share_context_(NULL) {
   DCHECK(ui_loop_->BelongsToCurrentThread());
   DCHECK(client_on_ui_);
@@ -62,14 +62,14 @@ scoped_ptr<DrawGLInput> SharedRendererState::PassDrawGLInput() {
   return draw_gl_input_.Pass();
 }
 
-void SharedRendererState::SetHardwareAllowed(bool allowed) {
+void SharedRendererState::SetInsideHardwareRelease(bool inside) {
   base::AutoLock lock(lock_);
-  hardware_allowed_ = allowed;
+  inside_hardware_release_ = inside;
 }
 
-bool SharedRendererState::IsHardwareAllowed() const {
+bool SharedRendererState::IsInsideHardwareRelease() const {
   base::AutoLock lock(lock_);
-  return hardware_allowed_;
+  return inside_hardware_release_;
 }
 
 void SharedRendererState::SetSharedContext(gpu::GLInProcessContext* context) {
@@ -103,4 +103,15 @@ bool SharedRendererState::ReturnedResourcesEmpty() const {
   return returned_resources_.empty();
 }
 
+InsideHardwareReleaseReset::InsideHardwareReleaseReset(
+    SharedRendererState* shared_renderer_state)
+    : shared_renderer_state_(shared_renderer_state) {
+  DCHECK(!shared_renderer_state_->IsInsideHardwareRelease());
+  shared_renderer_state_->SetInsideHardwareRelease(true);
+}
+
+InsideHardwareReleaseReset::~InsideHardwareReleaseReset() {
+  shared_renderer_state_->SetInsideHardwareRelease(false);
+}
+
 }  // namespace android_webview
index 89554ac..01363f1 100644 (file)
@@ -24,6 +24,7 @@ class GLInProcessContext;
 namespace android_webview {
 
 class BrowserViewRendererClient;
+class InsideHardwareReleaseReset;
 
 // Set by BrowserViewRenderer and read by HardwareRenderer.
 struct DrawGLInput {
@@ -48,9 +49,7 @@ class SharedRendererState {
   void SetDrawGLInput(scoped_ptr<DrawGLInput> input);
   scoped_ptr<DrawGLInput> PassDrawGLInput();
 
-  // Set by UI and read by RT.
-  void SetHardwareAllowed(bool allowed);
-  bool IsHardwareAllowed() const;
+  bool IsInsideHardwareRelease() const;
 
   void SetSharedContext(gpu::GLInProcessContext* context);
   gpu::GLInProcessContext* GetSharedContext() const;
@@ -60,7 +59,10 @@ class SharedRendererState {
   bool ReturnedResourcesEmpty() const;
 
  private:
+  friend class InsideHardwareReleaseReset;
+
   void ClientRequestDrawGLOnUIThread();
+  void SetInsideHardwareRelease(bool inside);
 
   scoped_refptr<base::MessageLoopProxy> ui_loop_;
   BrowserViewRendererClient* client_on_ui_;
@@ -70,9 +72,23 @@ class SharedRendererState {
   // Accessed by both UI and RT thread.
   mutable base::Lock lock_;
   scoped_ptr<DrawGLInput> draw_gl_input_;
-  bool hardware_allowed_;
+  bool inside_hardware_release_;
   gpu::GLInProcessContext* share_context_;
   cc::ReturnedResourceArray returned_resources_;
+
+  DISALLOW_COPY_AND_ASSIGN(SharedRendererState);
+};
+
+class InsideHardwareReleaseReset {
+ public:
+  explicit InsideHardwareReleaseReset(
+      SharedRendererState* shared_renderer_state);
+  ~InsideHardwareReleaseReset();
+
+ private:
+  SharedRendererState* shared_renderer_state_;
+
+  DISALLOW_COPY_AND_ASSIGN(InsideHardwareReleaseReset);
 };
 
 }  // namespace android_webview
index aaae29c..19dc9cb 100644 (file)
   <project name="platform/frameworks/support" path="frameworks/support" revision="1e3d0c89282627f8b0d66d2bdae4efc2287ab043"/>
   <project name="platform/frameworks/testing" path="frameworks/testing" revision="5c8e0271db889518f5969b142a37faa01a4ee54d"/>
   <project name="platform/frameworks/volley" path="frameworks/volley" revision="a53cb80bea6fc83edfa73e7a850e83f4020fcf07"/>
-  <project name="platform/frameworks/webview" path="frameworks/webview" revision="2b4719f12bac2f9f71d99567f09f46916903edf8"/>
+  <project name="platform/frameworks/webview" path="frameworks/webview" revision="707d93ceba55f52771e749b223fbfc010c9a025e"/>
   <project name="platform/frameworks/wilhelm" path="frameworks/wilhelm" revision="a62c3572e60ae0446632de15418a65089cccf551"/>
   <project name="platform/hardware/akm" path="hardware/akm" revision="32838ef838d1341aa8b77022869b801fb0bbb26c"/>
   <project groups="pdk" name="platform/hardware/broadcom/libbt" path="hardware/broadcom/libbt" revision="55ddd0cce019e88829f92b2fe4e17d5869daa9b9"/>
index f309623..c3088a6 100644 (file)
@@ -6,7 +6,4 @@
 
 namespace switches {
 
-const char kDisableRecordDocumentWorkaround[] =
-    "disable-record-document-workaround";
-
 }  // namespace switches
index 3225fbd..79f919f 100644 (file)
@@ -1600,7 +1600,7 @@ public class AwContents {
         if (!canZoomIn()) {
             return false;
         }
-        return mContentViewCore.pinchByDelta(1.25f);
+        return zoomBy(1.25f);
     }
 
     /**
@@ -1612,7 +1612,19 @@ public class AwContents {
         if (!canZoomOut()) {
             return false;
         }
-        return mContentViewCore.pinchByDelta(0.8f);
+        return zoomBy(0.8f);
+    }
+
+    /**
+     * @see android.webkit.WebView#zoomBy()
+     */
+    // This method uses the term 'zoom' for legacy reasons, but relates
+    // to what chrome calls the 'page scale factor'.
+    public boolean zoomBy(float delta) {
+        if (delta < 0.01f || delta > 100.0f) {
+            throw new IllegalStateException("zoom delta value outside [0.01, 100] range.");
+        }
+        return mContentViewCore.pinchByDelta(delta);
     }
 
     /**
@@ -2076,9 +2088,6 @@ public class AwContents {
         if (mPageScaleFactor != pageScaleFactor) {
             float oldPageScaleFactor = mPageScaleFactor;
             mPageScaleFactor = pageScaleFactor;
-            // NOTE: if this ever needs to become synchronous then we need to make sure the scroll
-            // bounds are correctly updated before calling the method, otherwise embedder code that
-            // attempts to scroll on scale change might cause weird results.
             mContentsClient.getCallbackHelper().postOnScaleChangedScaled(
                     (float)(oldPageScaleFactor * mDIPScale),
                     (float)(mPageScaleFactor * mDIPScale));
@@ -2148,7 +2157,7 @@ public class AwContents {
         private int mLayerType = View.LAYER_TYPE_NONE;
         private ComponentCallbacks2 mComponentCallbacks;
 
-        // Only valid within onDraw().
+        // Only valid within software onDraw().
         private final Rect mClipBoundsTemporary = new Rect();
 
         @Override
@@ -2158,17 +2167,18 @@ public class AwContents {
                 return;
             }
 
-            mScrollOffsetManager.syncScrollOffsetFromOnDraw();
-            canvas.getClipBounds(mClipBoundsTemporary);
+            // For hardware draws, the clip at onDraw time could be different
+            // from the clip during DrawGL.
+            if (!canvas.isHardwareAccelerated() && !canvas.getClipBounds(mClipBoundsTemporary)) {
+                return;
+            }
 
+            mScrollOffsetManager.syncScrollOffsetFromOnDraw();
             Rect globalVisibleRect = getGlobalVisibleRect();
-
             if (!nativeOnDraw(mNativeAwContents, canvas, canvas.isHardwareAccelerated(),
                     mContainerView.getScrollX(), mContainerView.getScrollY(),
                     globalVisibleRect.left, globalVisibleRect.top,
-                    globalVisibleRect.right, globalVisibleRect.bottom,
-                    mClipBoundsTemporary.left, mClipBoundsTemporary.top,
-                    mClipBoundsTemporary.right, mClipBoundsTemporary.bottom)) {
+                    globalVisibleRect.right, globalVisibleRect.bottom)) {
                 // Can happen during initialization when compositor is not set
                 // up. Or when clearView
                 // is in effect. Just draw background color instead.
@@ -2377,8 +2387,10 @@ public class AwContents {
     // Return true if the GeolocationPermissionAPI should be used.
     @CalledByNative
     private boolean useLegacyGeolocationPermissionAPI() {
-        // TODO (michaelbai): Need to verify whether this is correct when release.
-        return mContext.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.KITKAT;
+        // Always return true since we are not ready to swap the geolocation yet.
+        // TODO: If we decide not to migrate the geolocation, there are some unreachable
+        // code need to remove. http://crbug.com/396184.
+        return true;
     }
 
     //--------------------------------------------------------------------------------------------
@@ -2407,8 +2419,7 @@ public class AwContents {
     private native void nativeAddVisitedLinks(long nativeAwContents, String[] visitedLinks);
     private native boolean nativeOnDraw(long nativeAwContents, Canvas canvas,
             boolean isHardwareAccelerated, int scrollX, int scrollY,
-            int visibleLeft, int visibleTop, int visibleRight, int visibleBottom,
-            int clipLeft, int clipTop, int clipRight, int clipBottom);
+            int visibleLeft, int visibleTop, int visibleRight, int visibleBottom);
     private native void nativeFindAllAsync(long nativeAwContents, String searchString);
     private native void nativeFindNext(long nativeAwContents, boolean forward);
     private native void nativeClearMatches(long nativeAwContents);
index 1d52ba8..aeec329 100644 (file)
@@ -70,6 +70,10 @@ public class AwContentsStatics {
         return sUnreachableWebDataUrl;
     }
 
+    public static void setRecordFullDocument(boolean recordFullDocument) {
+        nativeSetRecordFullDocument(recordFullDocument);
+    }
+
     //--------------------------------------------------------------------------------------------
     //  Native methods
     //--------------------------------------------------------------------------------------------
@@ -77,4 +81,5 @@ public class AwContentsStatics {
     private static native void nativeSetDataReductionProxyKey(String key);
     private static native void nativeSetDataReductionProxyEnabled(boolean enabled);
     private static native String nativeGetUnreachableWebDataUrl();
+    private static native void nativeSetRecordFullDocument(boolean recordFullDocument);
 }
index 6f245bc..17eaa07 100644 (file)
@@ -6,7 +6,6 @@ package org.chromium.android_webview;
 
 import android.graphics.Canvas;
 import android.graphics.Picture;
-import android.graphics.Rect;
 
 import org.chromium.base.JNINamespace;
 import org.chromium.content.common.CleanupReference;
@@ -65,15 +64,9 @@ class AwPicture extends Picture {
         return nativeGetHeight(mNativeAwPicture);
     }
 
-    // Effectively a local variable of draw(), but held as a member to avoid GC churn.
-    private Rect mClipBoundsTemporary = new Rect();
-
     @Override
     public void draw(Canvas canvas) {
-        canvas.getClipBounds(mClipBoundsTemporary);
-        nativeDraw(mNativeAwPicture, canvas,
-                mClipBoundsTemporary.left, mClipBoundsTemporary.top,
-                mClipBoundsTemporary.right, mClipBoundsTemporary.bottom);
+        nativeDraw(mNativeAwPicture, canvas);
     }
 
     @Override
@@ -89,7 +82,6 @@ class AwPicture extends Picture {
     private static native void nativeDestroy(long nativeAwPicture);
     private native int nativeGetWidth(long nativeAwPicture);
     private native int nativeGetHeight(long nativeAwPicture);
-    private native void nativeDraw(long nativeAwPicture, Canvas canvas,
-            int left, int top, int right, int bottom);
+    private native void nativeDraw(long nativeAwPicture, Canvas canvas);
 }
 
index 1b861c0..52baca1 100644 (file)
@@ -36,13 +36,15 @@ public class AwWebResourceResponse {
         mStatusCode = statusCode;
         mReasonPhrase = reasonPhrase;
 
-        mResponseHeaderNames = new String[responseHeaders.size()];
-        mResponseHeaderValues = new String[responseHeaders.size()];
-        int i = 0;
-        for (Map.Entry<String, String> entry : responseHeaders.entrySet()) {
-            mResponseHeaderNames[i] = entry.getKey();
-            mResponseHeaderValues[i] = entry.getValue();
-            i++;
+        if (responseHeaders != null) {
+            mResponseHeaderNames = new String[responseHeaders.size()];
+            mResponseHeaderValues = new String[responseHeaders.size()];
+            int i = 0;
+            for (Map.Entry<String, String> entry : responseHeaders.entrySet()) {
+                mResponseHeaderNames[i] = entry.getKey();
+                mResponseHeaderValues[i] = entry.getValue();
+                i++;
+            }
         }
     }
 
diff --git a/src/android_webview/java/src/org/chromium/android_webview/InputStreamUtil.java b/src/android_webview/java/src/org/chromium/android_webview/InputStreamUtil.java
new file mode 100644 (file)
index 0000000..d4fb749
--- /dev/null
@@ -0,0 +1,70 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview;
+
+import android.util.Log;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Utility methods for calling InputStream methods. These take care of exception handling.
+ */
+@JNINamespace("android_webview")
+class InputStreamUtil {
+    private static final String LOGTAG = "AwAssets";
+    // The InputStream APIs return -1 in some cases. In order to convey the extra information that
+    // the call had failed due to an exception being thrown we simply map all negative return values
+    // from the original calls to -1 and make -2 mean that an exception has been thrown.
+    private static final int CALL_FAILED_STATUS = -1;
+    private static final int EXCEPTION_THROWN_STATUS = -2;
+
+    private static String logMessage(String method) {
+        return "Got exception when calling " + method + "() on an InputStream returned from " +
+            "shouldInterceptRequest. This will cause the related request to fail.";
+    }
+
+    @CalledByNative
+    public static void close(InputStream stream) {
+        try {
+            stream.close();
+        } catch (IOException e) {
+            Log.e(LOGTAG, logMessage("close"), e);
+        }
+    }
+
+    @CalledByNative
+    public static int available(InputStream stream) {
+        try {
+            return Math.max(CALL_FAILED_STATUS, stream.available());
+        } catch (IOException e) {
+            Log.e(LOGTAG, logMessage("available"), e);
+            return EXCEPTION_THROWN_STATUS;
+        }
+    }
+
+    @CalledByNative
+    public static int read(InputStream stream, byte[] b, int off, int len) {
+        try {
+            return Math.max(CALL_FAILED_STATUS, stream.read(b, off, len));
+        } catch (IOException e) {
+            Log.e(LOGTAG, logMessage("read"), e);
+            return EXCEPTION_THROWN_STATUS;
+        }
+    }
+
+    @CalledByNative
+    public static long skip(InputStream stream, long n) {
+        try {
+            return Math.max(CALL_FAILED_STATUS, stream.skip(n));
+        } catch (IOException e) {
+            Log.e(LOGTAG, logMessage("skip"), e);
+            return EXCEPTION_THROWN_STATUS;
+        }
+    }
+}
index 4df7b4a..f9eaa76 100644 (file)
@@ -44,8 +44,12 @@ public class JavaBrowserViewRendererHelper {
      * Used for convenience from the native side and other static helper methods.
      */
     @CalledByNative
-    private static void drawBitmapIntoCanvas(Bitmap bitmap, Canvas canvas, int x, int y) {
-        canvas.drawBitmap(bitmap, x, y, null);
+    private static void drawBitmapIntoCanvas(Bitmap bitmap,
+                                             Canvas canvas,
+                                             int scroll_x,
+                                             int scroll_y) {
+        canvas.translate(scroll_x, scroll_y);
+        canvas.drawBitmap(bitmap, 0, 0, null);
     }
 
     // Should never be instantiated.
index b634fef..fc0a855 100644 (file)
@@ -4,9 +4,10 @@
 
 package org.chromium.android_webview.test;
 
+import android.test.suitebuilder.annotation.SmallTest;
+
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.test.util.CommonResources;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.content.browser.ContentViewCore;
 
 /**
@@ -30,11 +31,7 @@ public class AwContentsClientOnScaleChangedTest extends AwTestBase {
         super.tearDown();
     }
 
-    /*
     @SmallTest
-    This test is timing out on ICS bots including cq. See crbug.com/175854.
-    */
-    @DisabledTest
     public void testScaleUp() throws Throwable {
         getAwSettingsOnUiThread(mAwContents).setUseWideViewPort(true);
         loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
index e1bcb59..de8e625 100644 (file)
@@ -355,6 +355,49 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
         mContentsClient.getOnPageFinishedHelper().waitForCallback(onPageFinishedCallCount);
     }
 
+    private static class ThrowingInputStream extends EmptyInputStream {
+        @Override
+        public int available() {
+            return 100;
+        }
+
+        @Override
+        public int read() throws IOException {
+            throw new IOException("test exception");
+        }
+
+        @Override
+        public int read(byte b[]) throws IOException {
+            throw new IOException("test exception");
+        }
+
+        @Override
+        public int read(byte b[], int off, int len) throws IOException {
+            throw new IOException("test exception");
+        }
+
+        @Override
+        public long skip(long n) throws IOException {
+            return n;
+        }
+    }
+
+    @SmallTest
+    @Feature({"AndroidWebView"})
+    public void testDoesNotCrashOnThrowingStream() throws Throwable {
+        final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
+
+        mShouldInterceptRequestHelper.setReturnValue(
+                new AwWebResourceResponse("text/html", "UTF-8", new ThrowingInputStream()));
+        int shouldInterceptRequestCallCount = mShouldInterceptRequestHelper.getCallCount();
+        int onPageFinishedCallCount = mContentsClient.getOnPageFinishedHelper().getCallCount();
+
+        loadUrlAsync(mAwContents, aboutPageUrl);
+
+        mShouldInterceptRequestHelper.waitForCallback(shouldInterceptRequestCallCount);
+        mContentsClient.getOnPageFinishedHelper().waitForCallback(onPageFinishedCallCount);
+    }
+
     private static class SlowAwWebResourceResponse extends AwWebResourceResponse {
         private CallbackHelper mReadStartedCallbackHelper = new CallbackHelper();
         private CountDownLatch mLatch = new CountDownLatch(1);
@@ -465,6 +508,9 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
             "  return xhr.getResponseHeader('" + headerName + "');" +
             "})();";
         String header = executeJavaScriptAndWaitForResult(awContents, contentsClient, syncGetJs);
+
+        if (header.equals("null"))
+            return null;
         // JSON stringification applied by executeJavaScriptAndWaitForResult adds quotes
         // around returned strings.
         assertTrue(header.length() > 2);
@@ -516,6 +562,20 @@ public class AwContentsClientShouldInterceptRequestTest extends AwTestBase {
                 getHeaderValue(mAwContents, mContentsClient, syncGetUrl, clientResponseHeaderName));
     }
 
+    @SmallTest
+    @Feature({"AndroidWebView"})
+    public void testNullHttpResponseHeaders() throws Throwable {
+        final String syncGetUrl = mWebServer.getResponseUrl("/intercept_me");
+        enableJavaScriptOnUiThread(mAwContents);
+
+        final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
+        loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), aboutPageUrl);
+
+        mShouldInterceptRequestHelper.setReturnValue(
+                new AwWebResourceResponse("text/html", "UTF-8", null, 0, null, null));
+        assertEquals(null, getHeaderValue(mAwContents, mContentsClient, syncGetUrl, "Some-Header"));
+    }
+
     private String makePageWithTitle(String title) {
         return CommonResources.makeHtmlPageFrom("<title>" + title + "</title>",
                 "<div> The title is: " + title + " </div>");
index 40e88ba..b561a13 100644 (file)
@@ -24,6 +24,7 @@ import java.util.concurrent.Callable;
 public class AwZoomTest extends AwTestBase {
     private TestAwContentsClient mContentsClient;
     private AwContents mAwContents;
+    private float MAXIMUM_SCALE = 2.0f;
 
     @Override
     public void setUp() throws Exception {
@@ -37,11 +38,11 @@ public class AwZoomTest extends AwTestBase {
     private String getZoomableHtml(float scale) {
         final int divWidthPercent = (int)(100.0f / scale);
         return String.format(Locale.US, "<html><head><meta name=\"viewport\" content=\"" +
-                "width=device-width, minimum-scale=%f, maximum-scale=2.0, initial-scale=%f" +
+                "width=device-width, minimum-scale=%f, maximum-scale=%f, initial-scale=%f" +
                 "\"/></head><body style='margin:0'>" +
                 "<div style='width:%d%%;height:100px;border:1px solid black'>Zoomable</div>" +
                 "</body></html>",
-                scale, scale, divWidthPercent);
+                scale, MAXIMUM_SCALE, scale, divWidthPercent);
     }
 
     private String getNonZoomableHtml() {
@@ -114,6 +115,18 @@ public class AwZoomTest extends AwTestBase {
         waitForScaleChange(previousScale);
     }
 
+    private void zoomByOnUiThreadAndWait(final float delta) throws Throwable {
+        final float previousScale = getPixelScaleOnUiThread(mAwContents);
+        assertTrue(runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return mAwContents.zoomBy(delta);
+            }
+        }));
+        // The zoom level is updated asynchronously.
+        waitForScaleChange(previousScale);
+    }
+
     private void waitForScaleChange(final float previousScale) throws Throwable {
         poll(new Callable<Boolean>() {
             @Override
@@ -161,6 +174,15 @@ public class AwZoomTest extends AwTestBase {
             zoomOutOnUiThreadAndWait();
         }
         assertTrue("Should be able to zoom in", canZoomInOnUiThread(mAwContents));
+
+        zoomByOnUiThreadAndWait(4.0f);
+        waitForScaleToBecome(MAXIMUM_SCALE);
+
+        zoomByOnUiThreadAndWait(0.5f);
+        waitForScaleToBecome(MAXIMUM_SCALE * 0.5f);
+
+        zoomByOnUiThreadAndWait(0.01f);
+        waitForScaleToBecome(pageMinimumScale);
     }
 
     @SmallTest
index 224292f..1102806 100644 (file)
@@ -8,7 +8,6 @@
 #include "android_webview/browser/browser_view_renderer.h"
 #include "android_webview/browser/gpu_memory_buffer_factory_impl.h"
 #include "android_webview/browser/scoped_allow_wait_for_legacy_web_view_api.h"
-#include "android_webview/common/aw_switches.h"
 #include "android_webview/lib/aw_browser_dependency_factory_impl.h"
 #include "android_webview/native/aw_quota_manager_bridge_impl.h"
 #include "android_webview/native/aw_web_contents_view_delegate.h"
@@ -77,9 +76,6 @@ bool AwMainDelegate::BasicStartupComplete(int* exit_code) {
   // WebRTC hardware decoding is not supported, internal bug 15075307
   cl->AppendSwitch(switches::kDisableWebRtcHWDecoding);
 
-  if (cl->HasSwitch(switches::kDisableRecordDocumentWorkaround))
-    content::SynchronousCompositor::DisableRecordFullLayer();
-
   return false;
 }
 
index 2eaa4f1..cc5e6a3 100644 (file)
@@ -342,6 +342,12 @@ jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) {
 }
 
 void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
+  if (draw_info->mode == AwDrawGLInfo::kModeSync) {
+    if (hardware_renderer_)
+      hardware_renderer_->CommitFrame();
+    return;
+  }
+
   {
     GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
     base::AutoLock lock(render_thread_lock_);
@@ -356,7 +362,7 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
           : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
   ScopedAllowGL allow_gl;
 
-  if (!shared_renderer_state_.IsHardwareAllowed()) {
+  if (shared_renderer_state_.IsInsideHardwareRelease()) {
     hardware_renderer_.reset();
     return;
   }
@@ -366,6 +372,7 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
 
   if (!hardware_renderer_) {
     hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
+    hardware_renderer_->CommitFrame();
   }
 
   hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
@@ -843,7 +850,6 @@ void AwContents::SetIsPaused(JNIEnv* env, jobject obj, bool paused) {
 
 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  shared_renderer_state_.SetHardwareAllowed(true);
   browser_view_renderer_.OnAttachedToWindow(w, h);
 }
 
@@ -859,7 +865,12 @@ void AwContents::InitializeHardwareDrawIfNeeded() {
 
 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  shared_renderer_state_.SetHardwareAllowed(false);
+  ReleaseHardwareDrawIfNeeded();
+  browser_view_renderer_.OnDetachedFromWindow();
+}
+
+void AwContents::ReleaseHardwareDrawIfNeeded() {
+  InsideHardwareReleaseReset inside_reset(&shared_renderer_state_);
 
   bool hardware_initialized = browser_view_renderer_.hardware_enabled();
   if (hardware_initialized) {
@@ -871,10 +882,9 @@ void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
       info.mode = AwDrawGLInfo::kModeProcess;
       DrawGL(&info);
     }
+    browser_view_renderer_.ReleaseHardware();
   }
-
   DCHECK(!hardware_renderer_);
-  browser_view_renderer_.OnDetachedFromWindow();
 
   GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
 
@@ -933,11 +943,7 @@ bool AwContents::OnDraw(JNIEnv* env,
                         jint visible_left,
                         jint visible_top,
                         jint visible_right,
-                        jint visible_bottom,
-                        jint clip_left,
-                        jint clip_top,
-                        jint clip_right,
-                        jint clip_bottom) {
+                        jint visible_bottom) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   if (is_hardware_accelerated)
     InitializeHardwareDrawIfNeeded();
@@ -948,9 +954,7 @@ bool AwContents::OnDraw(JNIEnv* env,
       gfx::Rect(visible_left,
                 visible_top,
                 visible_right - visible_left,
-                visible_bottom - visible_top),
-      gfx::Rect(
-          clip_left, clip_top, clip_right - clip_left, clip_bottom - clip_top));
+                visible_bottom - visible_top));
 }
 
 void AwContents::SetPendingWebContentsForPopup(
@@ -1138,6 +1142,14 @@ void AwContents::TrimMemory(JNIEnv* env,
                             jint level,
                             jboolean visible) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  enum {
+    TRIM_MEMORY_MODERATE = 60,
+  };
+  if (level >= TRIM_MEMORY_MODERATE) {
+    ReleaseHardwareDrawIfNeeded();
+    return;
+  }
+
   browser_view_renderer_.TrimMemory(level, visible);
 }
 
index ae6701b..ddfeaf3 100644 (file)
@@ -120,11 +120,7 @@ class AwContents : public FindHelper::Listener,
               jint visible_left,
               jint visible_top,
               jint visible_right,
-              jint visible_bottom,
-              jint clip_left,
-              jint clip_top,
-              jint clip_right,
-              jint clip_bottom);
+              jint visible_bottom);
   jlong GetAwDrawGLViewContext(JNIEnv* env, jobject obj);
   jlong CapturePicture(JNIEnv* env, jobject obj, int width, int height);
   void EnableOnNewPicture(JNIEnv* env, jobject obj, jboolean enabled);
@@ -232,6 +228,7 @@ class AwContents : public FindHelper::Listener,
   void InitAutofillIfNecessary(bool enabled);
 
   void InitializeHardwareDrawIfNeeded();
+  void ReleaseHardwareDrawIfNeeded();
 
   // Geolocation API support
   void ShowGeolocationPrompt(const GURL& origin, base::Callback<void(bool)>);
index b1fdcbb..4fe0302 100644 (file)
@@ -9,6 +9,7 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/callback.h"
 #include "components/data_reduction_proxy/browser/data_reduction_proxy_settings.h"
+#include "content/public/browser/android/synchronous_compositor.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/url_constants.h"
 #include "jni/AwContentsStatics_jni.h"
@@ -70,6 +71,11 @@ jstring GetUnreachableWebDataUrl(JNIEnv* env, jclass) {
              env, content::kUnreachableWebDataURL).Release();
 }
 
+// static
+void SetRecordFullDocument(JNIEnv* env, jclass, jboolean record_full_document) {
+  content::SynchronousCompositor::SetRecordFullDocument(record_full_document);
+}
+
 bool RegisterAwContentsStatics(JNIEnv* env) {
   return RegisterNativesImpl(env);
 }
index 535908d..3a319e6 100644 (file)
@@ -37,15 +37,14 @@ bool RenderPictureToCanvas(SkPicture* picture, SkCanvas* canvas) {
 }
 }
 
-void AwPicture::Draw(JNIEnv* env, jobject obj, jobject canvas,
-                     jint left, jint top, jint right, jint bottom) {
+void AwPicture::Draw(JNIEnv* env, jobject obj, jobject canvas) {
   bool ok = JavaBrowserViewRendererHelper::GetInstance()
                 ->RenderViaAuxilaryBitmapIfNeeded(
-                      canvas,
-                      gfx::Vector2d(),
-                      gfx::Rect(left, top, right - left, bottom - top),
-                      base::Bind(&RenderPictureToCanvas,
-                                 base::Unretained(picture_.get())));
+                    canvas,
+                    gfx::Vector2d(),
+                    gfx::Size(picture_->width(), picture_->height()),
+                    base::Bind(&RenderPictureToCanvas,
+                               base::Unretained(picture_.get())));
   LOG_IF(ERROR, !ok) << "Couldn't draw picture";
 }
 
index b1e31ee..fc4d1ec 100644 (file)
@@ -26,8 +26,7 @@ class AwPicture {
   void Destroy(JNIEnv* env, jobject obj);
   jint GetWidth(JNIEnv* env, jobject obj);
   jint GetHeight(JNIEnv* env, jobject obj);
-  void Draw(JNIEnv* env, jobject obj, jobject canvas,
-            jint left, jint top, jint right, jint bottom);
+  void Draw(JNIEnv* env, jobject obj, jobject canvas);
 
  private:
   skia::RefPtr<SkPicture> picture_;
index 3779cd8..19c6251 100644 (file)
@@ -9,13 +9,11 @@
 #include "android_webview/native/aw_contents.h"
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
-#include "base/command_line.h"
 #include "base/supports_user_data.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/common/content_switches.h"
 #include "content/public/common/renderer_preferences.h"
 #include "jni/AwSettings_jni.h"
 #include "ui/gfx/font_render_params_linux.h"
@@ -113,9 +111,6 @@ class AwSettingsUserData : public base::SupportsUserData::Data {
 AwSettings::AwSettings(JNIEnv* env, jobject obj, jlong web_contents)
     : WebContentsObserver(
           reinterpret_cast<content::WebContents*>(web_contents)),
-      accelerated_2d_canvas_disabled_by_switch_(
-          CommandLine::ForCurrentProcess()->HasSwitch(
-              switches::kDisableAccelerated2dCanvas)),
       renderer_prefs_initialized_(false),
       aw_settings_(env, obj) {
   reinterpret_cast<content::WebContents*>(web_contents)->
@@ -413,16 +408,24 @@ void AwSettings::PopulateWebPreferencesLocked(
   web_prefs->spatial_navigation_enabled =
       Java_AwSettings_getSpatialNavigationLocked(env, obj);
 
+  bool enable_supported_hardware_accelerated_features =
+      Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(
+                env, obj);
+
+  bool accelerated_2d_canvas_enabled_by_switch =
+      web_prefs->accelerated_2d_canvas_enabled;
   web_prefs->accelerated_2d_canvas_enabled = true;
-  if (accelerated_2d_canvas_disabled_by_switch_ ||
-      !Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(
-          env, obj)) {
+  if (!accelerated_2d_canvas_enabled_by_switch ||
+      !enable_supported_hardware_accelerated_features) {
     // Any canvas smaller than this will fallback to software. Abusing this
     // slightly to turn canvas off without changing
     // accelerated_2d_canvas_enabled, which also affects compositing mode.
     // Using 100M instead of max int to avoid overflows.
     web_prefs->minimum_accelerated_2d_canvas_size = 100 * 1000 * 1000;
   }
+  web_prefs->experimental_webgl_enabled =
+      web_prefs->experimental_webgl_enabled &&
+      enable_supported_hardware_accelerated_features;
 
   web_prefs->allow_displaying_insecure_content =
       Java_AwSettings_getAllowDisplayingInsecureContentLocked(env, obj);
index 92bf658..5404167 100644 (file)
@@ -48,8 +48,6 @@ class AwSettings : public content::WebContentsObserver {
       content::RenderViewHost* render_view_host) OVERRIDE;
   virtual void WebContentsDestroyed() OVERRIDE;
 
-  bool accelerated_2d_canvas_disabled_by_switch_;
-
   bool renderer_prefs_initialized_;
 
   JavaObjectWeakGlobalRef aw_settings_;
index fca6a29..ef5c4f3 100644 (file)
 // even if they're unused.
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wunused-function"
-#include "jni/InputStream_jni.h"
+#include "jni/InputStreamUtil_jni.h"
 #pragma GCC diagnostic pop
 #include "net/base/io_buffer.h"
 
 using base::android::AttachCurrentThread;
 using base::android::ClearException;
 using base::android::JavaRef;
-using JNI_InputStream::Java_InputStream_available;
-using JNI_InputStream::Java_InputStream_close;
-using JNI_InputStream::Java_InputStream_skip;
-using JNI_InputStream::Java_InputStream_readI_AB_I_I;
 
 namespace android_webview {
 
+namespace {
+
+// This should be the same as InputStramUtil.EXCEPTION_THROWN_STATUS.
+const int kExceptionThrownStatusCode = -2;
+
+}
+
 bool RegisterInputStream(JNIEnv* env) {
-  return JNI_InputStream::RegisterNativesImpl(env);
+  return RegisterNativesImpl(env);
 }
 
 // Maximum number of bytes to be read in a single read.
@@ -50,13 +53,13 @@ InputStreamImpl::InputStreamImpl(const JavaRef<jobject>& stream)
 
 InputStreamImpl::~InputStreamImpl() {
   JNIEnv* env = AttachCurrentThread();
-  Java_InputStream_close(env, jobject_.obj());
+  Java_InputStreamUtil_close(env, jobject_.obj());
 }
 
 bool InputStreamImpl::BytesAvailable(int* bytes_available) const {
   JNIEnv* env = AttachCurrentThread();
-  int bytes = Java_InputStream_available(env, jobject_.obj());
-  if (ClearException(env))
+  int bytes = Java_InputStreamUtil_available(env, jobject_.obj());
+  if (bytes == kExceptionThrownStatusCode)
     return false;
   *bytes_available = bytes;
   return true;
@@ -64,8 +67,8 @@ bool InputStreamImpl::BytesAvailable(int* bytes_available) const {
 
 bool InputStreamImpl::Skip(int64_t n, int64_t* bytes_skipped) {
   JNIEnv* env = AttachCurrentThread();
-  int bytes = Java_InputStream_skip(env, jobject_.obj(), n);
-  if (ClearException(env))
+  int bytes = Java_InputStreamUtil_skip(env, jobject_.obj(), n);
+  if (bytes < 0)
     return false;
   if (bytes > n)
     return false;
@@ -91,9 +94,9 @@ bool InputStreamImpl::Read(net::IOBuffer* dest, int length, int* bytes_read) {
 
   while (remaining_length > 0) {
     const int max_transfer_length = std::min(remaining_length, kBufferSize);
-    const int transfer_length = Java_InputStream_readI_AB_I_I(
+    const int transfer_length = Java_InputStreamUtil_read(
         env, jobject_.obj(), buffer, 0, max_transfer_length);
-    if (ClearException(env))
+    if (transfer_length == kExceptionThrownStatusCode)
       return false;
 
     if (transfer_length < 0)  // EOF
index 76ca823..ec4faf6 100644 (file)
@@ -119,3 +119,27 @@ TEST_F(InputStreamTest, ReadLargeStreamCompletely) {
   DoReadCountedStreamTest(bytes_requested, bytes_requested, &bytes_read);
   EXPECT_EQ(bytes_requested, bytes_read);
 }
+
+TEST_F(InputStreamTest, DoesNotCrashWhenExceptionThrown) {
+  ScopedJavaLocalRef<jobject> throw_jstream =
+      Java_InputStreamUnittest_getThrowingStream(env_);
+  EXPECT_FALSE(throw_jstream.is_null());
+
+  scoped_ptr<InputStream> input_stream(new InputStreamImpl(throw_jstream));
+
+  int64_t bytes_skipped;
+  EXPECT_FALSE(input_stream->Skip(10, &bytes_skipped));
+
+  int bytes_available;
+  EXPECT_FALSE(input_stream->BytesAvailable(&bytes_available));
+
+
+  const int bytes_requested = 10;
+  int bytes_read = 0;
+  scoped_refptr<IOBuffer> buffer = new IOBuffer(bytes_requested);
+  EXPECT_FALSE(input_stream->Read(buffer.get(), bytes_requested, &bytes_read));
+  EXPECT_EQ(0, bytes_read);
+
+  // This closes the stream.
+  input_stream.reset(NULL);
+}
index df4f433..976fdf9 100644 (file)
@@ -70,7 +70,7 @@ JavaBrowserViewRendererHelper::~JavaBrowserViewRendererHelper() {}
 bool JavaBrowserViewRendererHelper::RenderViaAuxilaryBitmapIfNeeded(
     jobject java_canvas,
     const gfx::Vector2d& scroll_correction,
-    const gfx::Rect& clip,
+    const gfx::Size& auxiliary_bitmap_size,
     RenderMethod render_source) {
   TRACE_EVENT0("android_webview", "RenderViaAuxilaryBitmapIfNeeded");
 
@@ -93,39 +93,47 @@ bool JavaBrowserViewRendererHelper::RenderViaAuxilaryBitmapIfNeeded(
       return render_source.Run(canvas.get());
     }
   }
-  return RenderViaAuxilaryBitmap(
-      env, java_canvas, scroll_correction, clip, render_source);
+  return RenderViaAuxilaryBitmap(env,
+                                 java_canvas,
+                                 scroll_correction,
+                                 auxiliary_bitmap_size,
+                                 render_source);
 }
 
 bool JavaBrowserViewRendererHelper::RenderViaAuxilaryBitmap(
     JNIEnv* env,
     jobject java_canvas,
     const gfx::Vector2d& scroll_correction,
-    const gfx::Rect& clip,
+    const gfx::Size& auxiliary_bitmap_size,
     const RenderMethod& render_source) {
   // Render into an auxiliary bitmap if pixel info is not available.
   ScopedJavaLocalRef<jobject> jcanvas(env, java_canvas);
   TRACE_EVENT0("android_webview", "RenderToAuxBitmap");
 
-  if (clip.width() <= 0 || clip.height() <= 0)
+  if (auxiliary_bitmap_size.width() <= 0 || auxiliary_bitmap_size.height() <= 0)
     return false;
 
   ScopedJavaLocalRef<jobject> jbitmap(
       Java_JavaBrowserViewRendererHelper_createBitmap(
-          env, clip.width(), clip.height(), jcanvas.obj()));
+          env,
+          auxiliary_bitmap_size.width(),
+          auxiliary_bitmap_size.height(),
+          jcanvas.obj()));
   if (!jbitmap.obj())
     return false;
 
   if (!RasterizeIntoBitmap(env,
                            jbitmap,
-                           clip.x() - scroll_correction.x(),
-                           clip.y() - scroll_correction.y(),
                            render_source)) {
     return false;
   }
 
   Java_JavaBrowserViewRendererHelper_drawBitmapIntoCanvas(
-      env, jbitmap.obj(), jcanvas.obj(), clip.x(), clip.y());
+      env,
+      jbitmap.obj(),
+      jcanvas.obj(),
+      scroll_correction.x(),
+      scroll_correction.y());
   return true;
 }
 
@@ -136,8 +144,6 @@ bool RegisterJavaBrowserViewRendererHelper(JNIEnv* env) {
 bool JavaBrowserViewRendererHelper::RasterizeIntoBitmap(
     JNIEnv* env,
     const JavaRef<jobject>& jbitmap,
-    int scroll_x,
-    int scroll_y,
     const JavaBrowserViewRendererHelper::RenderMethod& renderer) {
   DCHECK(jbitmap.obj());
 
@@ -161,7 +167,6 @@ bool JavaBrowserViewRendererHelper::RasterizeIntoBitmap(
     bitmap.installPixels(info, pixels, bitmap_info.stride);
 
     SkCanvas canvas(bitmap);
-    canvas.translate(-scroll_x, -scroll_y);
     succeeded = renderer.Run(&canvas);
   }
 
index eb8ff3c..5ff938d 100644 (file)
@@ -26,20 +26,18 @@ class JavaBrowserViewRendererHelper : public BrowserViewRendererJavaHelper {
   virtual bool RenderViaAuxilaryBitmapIfNeeded(
       jobject java_canvas,
       const gfx::Vector2d& scroll_correction,
-      const gfx::Rect& clip,
+      const gfx::Size& auxiliary_bitmap_size,
       RenderMethod render_source) OVERRIDE;
 
  private:
   bool RenderViaAuxilaryBitmap(JNIEnv* env,
                                jobject java_canvas,
                                const gfx::Vector2d& scroll_correction,
-                               const gfx::Rect& clip,
+                               const gfx::Size& auxiliary_bitmap_size,
                                const RenderMethod& render_source);
   bool RasterizeIntoBitmap(
       JNIEnv* env,
       const base::android::JavaRef<jobject>& jbitmap,
-      int scroll_x,
-      int scroll_y,
       const JavaBrowserViewRendererHelper::RenderMethod& renderer);
 };
 
index efb8a15..f8c70d9 100644 (file)
       ],
     },
     {
-      'target_name': 'input_stream_android_jar_jni_headers',
-      'type': 'none',
-      'variables': {
-        'jni_gen_package': 'android_webview',
-        'input_java_class': 'java/io/InputStream.class',
-      },
-      'includes': [ '../../build/jar_file_jni_generator.gypi' ],
-    },
-    {
       'target_name': 'cancellation_signal_android_jar_jni_headers',
       'type': 'none',
       'variables': {
           '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java',
           '../java/src/org/chromium/android_webview/AwWebResourceResponse.java',
           '../java/src/org/chromium/android_webview/ExternalVideoSurfaceContainer.java',
+          '../java/src/org/chromium/android_webview/InputStreamUtil.java',
           '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java',
           '../java/src/org/chromium/android_webview/permission/AwPermissionRequest.java',
       ],
       },
       'includes': [ '../../build/jni_generator.gypi' ],
       'dependencies': [
-        'input_stream_android_jar_jni_headers',
         'cancellation_signal_android_jar_jni_headers',
       ],
     },
index 6409598..d62375f 100644 (file)
@@ -9,11 +9,15 @@
 extern "C" {
 #endif
 
+static const int kAwDrawGLInfoVersion = 1;
+
 // Holds the information required to trigger an OpenGL drawing operation.
 struct AwDrawGLInfo {
+  int version;  // The AwDrawGLInfo this struct was built with.
+
   // Input: tells the draw function what action to perform.
   enum Mode {
-    kModeDraw,
+    kModeDraw = 0,
     kModeProcess,
     kModeProcessNoContext,
     kModeSync,
@@ -82,8 +86,11 @@ typedef void* AwGetNativeBufferFunction(long buffer_id);
 // Called to get the stride of the buffer
 typedef unsigned int AwGetStrideFunction(long buffer_id);
 
+static const int kAwDrawGLFunctionTableVersion = 1;
+
 // Set of functions used in rendering in hardware mode
 struct AwDrawGLFunctionTable {
+  int version;
   AwCreateGraphicBufferFunction* create_graphic_buffer;
   AwReleaseGraphicBufferFunction* release_graphic_buffer;
   AwMapFunction* map;
index 97d6607..ae77195 100644 (file)
@@ -43,9 +43,12 @@ typedef void (SkiaVersionFunction)(int* major, int* minor, int* patch);
 // Called to verify if the Skia versions are compatible.
 typedef bool (AwIsSkiaVersionCompatibleFunction)(SkiaVersionFunction function);
 
+static const int kAwDrawSWFunctionTableVersion = 1;
+
 // "vtable" for the functions declared in this file. An instance must be set via
 // AwContents.setAwDrawSWFunctionTable
 struct AwDrawSWFunctionTable {
+  int version;
   AwAccessPixelsFunction* access_pixels;
   AwReleasePixelsFunction* release_pixels;
 };
index 7610942..f6bbaa1 100644 (file)
@@ -6,6 +6,7 @@ package org.chromium.android_webview.unittest;
 
 import org.chromium.base.CalledByNative;
 
+import java.io.IOException;
 import java.io.InputStream;
 
 class InputStreamUnittest {
@@ -23,6 +24,31 @@ class InputStreamUnittest {
     }
 
     @CalledByNative
+    static InputStream getThrowingStream() {
+        return new InputStream() {
+            @Override
+            public int available() throws IOException {
+                throw new IOException();
+            }
+
+            @Override
+            public void close() throws IOException {
+                throw new IOException();
+            }
+
+            @Override
+            public long skip(long n) throws IOException {
+                throw new IOException();
+            }
+
+            @Override
+            public int read() throws IOException {
+                throw new IOException();
+            }
+        };
+    }
+
+    @CalledByNative
     static InputStream getCountingStream(final int size) {
         return new InputStream() {
             private int count = 0;
index 814d2e0..427cdc6 100644 (file)
@@ -245,7 +245,8 @@ AppWindow::AppWindow(BrowserContext* context,
       has_been_shown_(false),
       can_send_events_(false),
       is_hidden_(false),
-      cached_always_on_top_(false) {
+      cached_always_on_top_(false),
+      requested_transparent_background_(false) {
   extensions::ExtensionsBrowserClient* client =
       extensions::ExtensionsBrowserClient::Get();
   CHECK(!client->IsGuestSession(context) || context->IsOffTheRecord())
@@ -284,6 +285,8 @@ void AppWindow::Init(const GURL& url,
   if (new_params.state == ui::SHOW_STATE_FULLSCREEN)
     new_params.always_on_top = false;
 
+  requested_transparent_background_ = new_params.transparent_background;
+
   native_app_window_.reset(delegate_->CreateNativeAppWindow(this, new_params));
 
   // Prevent the browser process from shutting down while this window exists.
@@ -751,6 +754,9 @@ void AppWindow::GetSerializedState(base::DictionaryValue* properties) const {
   properties->SetBoolean("maximized", native_app_window_->IsMaximized());
   properties->SetBoolean("alwaysOnTop", IsAlwaysOnTop());
   properties->SetBoolean("hasFrameColor", native_app_window_->HasFrameColor());
+  properties->SetBoolean("alphaEnabled",
+                         requested_transparent_background_ &&
+                             native_app_window_->CanHaveAlphaEnabled());
 
   // These properties are undocumented and are to enable testing. Alpha is
   // removed to
index f2e0e98..216ee3c 100644 (file)
@@ -362,6 +362,11 @@ class AppWindow : public content::NotificationObserver,
   // app.
   void WindowEventsReady();
 
+  // Whether the app window wants a transparent background.
+  bool requested_transparent_background() const {
+    return requested_transparent_background_;
+  }
+
  protected:
   virtual ~AppWindow();
 
@@ -558,6 +563,9 @@ class AppWindow : public content::NotificationObserver,
   // taskbar.
   bool cached_always_on_top_;
 
+  // Whether |transparent_background| was set in the CreateParams.
+  bool requested_transparent_background_;
+
   DISALLOW_COPY_AND_ASSIGN(AppWindow);
 };
 
index 76f4a83..aa4ef9a 100644 (file)
@@ -203,6 +203,9 @@ bool ShellExtensionsBrowserClient::DidVersionUpdate(BrowserContext* context) {
   return false;
 }
 
+void ShellExtensionsBrowserClient::PermitExternalProtocolHandler() {
+}
+
 scoped_ptr<AppSorting> ShellExtensionsBrowserClient::CreateAppSorting() {
   return scoped_ptr<AppSorting>(new apps::ShellAppSorting);
 }
index 2013c6d..276a33b 100644 (file)
@@ -66,6 +66,7 @@ class ShellExtensionsBrowserClient : public ExtensionsBrowserClient {
   virtual scoped_ptr<ExtensionHostDelegate> CreateExtensionHostDelegate()
       OVERRIDE;
   virtual bool DidVersionUpdate(content::BrowserContext* context) OVERRIDE;
+  virtual void PermitExternalProtocolHandler() OVERRIDE;
   virtual scoped_ptr<AppSorting> CreateAppSorting() OVERRIDE;
   virtual bool IsRunningInForcedAppMode() OVERRIDE;
   virtual ApiActivityMonitor* GetApiActivityMonitor(
index cde4c1d..fd0cc26 100644 (file)
@@ -87,6 +87,10 @@ class NativeAppWindow : public ui::BaseWindow,
   virtual void SetContentSizeConstraints(const gfx::Size& min_size,
                                          const gfx::Size& max_size) = 0;
 
+  // Returns false if the underlying native window ignores alpha transparency
+  // when compositing.
+  virtual bool CanHaveAlphaEnabled() const = 0;
+
   virtual ~NativeAppWindow() {}
 };
 
index 62b941d..da84d8a 100644 (file)
@@ -27,14 +27,12 @@ NativeAppWindowViews::NativeAppWindowViews()
       web_view_(NULL),
       widget_(NULL),
       frameless_(false),
-      transparent_background_(false),
       resizable_(false) {}
 
 void NativeAppWindowViews::Init(AppWindow* app_window,
                                 const AppWindow::CreateParams& create_params) {
   app_window_ = app_window;
   frameless_ = create_params.frame == AppWindow::FRAME_NONE;
-  transparent_background_ = create_params.transparent_background;
   resizable_ = create_params.resizable;
   size_constraints_.set_minimum_size(
       create_params.GetContentMinimumSize(gfx::Insets()));
@@ -53,6 +51,10 @@ NativeAppWindowViews::~NativeAppWindowViews() {
   web_view_->SetWebContents(NULL);
 }
 
+void NativeAppWindowViews::OnCanHaveAlphaEnabledChanged() {
+  app_window_->OnNativeWindowChanged();
+}
+
 void NativeAppWindowViews::InitializeWindow(
     AppWindow* app_window,
     const AppWindow::CreateParams& create_params) {
@@ -260,7 +262,8 @@ void NativeAppWindowViews::OnWidgetActivationChanged(views::Widget* widget,
 
 void NativeAppWindowViews::RenderViewCreated(
     content::RenderViewHost* render_view_host) {
-  if (transparent_background_) {
+  if (app_window_->requested_transparent_background() &&
+      CanHaveAlphaEnabled()) {
     content::RenderWidgetHostView* view = render_view_host->GetView();
     DCHECK(view);
     view->SetBackgroundOpaque(false);
@@ -398,4 +401,8 @@ void NativeAppWindowViews::SetContentSizeConstraints(
   size_constraints_.set_maximum_size(max_size);
 }
 
+bool NativeAppWindowViews::CanHaveAlphaEnabled() const {
+  return widget_->IsTranslucentWindowOpacitySupported();
+}
+
 }  // namespace apps
index bdebfde..917feca 100644 (file)
@@ -52,6 +52,9 @@ class NativeAppWindowViews : public NativeAppWindow,
   void Init(AppWindow* app_window,
             const AppWindow::CreateParams& create_params);
 
+  // Signal that CanHaveTransparentBackground has changed.
+  void OnCanHaveAlphaEnabledChanged();
+
   views::Widget* widget() { return widget_; }
 
   void set_window_for_testing(views::Widget* window) { widget_ = window; }
@@ -156,6 +159,7 @@ class NativeAppWindowViews : public NativeAppWindow,
   virtual gfx::Size GetContentMaximumSize() const OVERRIDE;
   virtual void SetContentSizeConstraints(const gfx::Size& min_size,
                                          const gfx::Size& max_size) OVERRIDE;
+  virtual bool CanHaveAlphaEnabled() const OVERRIDE;
 
   // web_modal::WebContentsModalDialogHost implementation.
   virtual gfx::NativeView GetHostView() const OVERRIDE;
@@ -177,7 +181,6 @@ class NativeAppWindowViews : public NativeAppWindow,
   scoped_ptr<SkRegion> draggable_region_;
 
   bool frameless_;
-  bool transparent_background_;
   bool resizable_;
   apps::SizeConstraints size_constraints_;
 
index 48b0e93..cc50163 100644 (file)
@@ -42,16 +42,15 @@ const char kAshDefaultWallpaperSmall[] = "ash-default-wallpaper-small";
 // WorkspaceLayoutManager.
 const char kAshDisableLockLayoutManager[] = "ash-disable-lock-layout-manager";
 
-// Disable the Touch Exploration Mode. Touch Exploration Mode will no longer be
-// turned on automatically when spoken feedback is enabled when this flag is
-// set.
-const char kAshDisableTouchExplorationMode[] =
-    "ash-disable-touch-exploration-mode";
-
 #if defined(OS_CHROMEOS)
 // Enables key bindings to scroll magnified screen.
 const char kAshEnableMagnifierKeyScroller[] =
     "ash-enable-magnifier-key-scroller";
+
+// Enable the Touch Exploration Mode, which will be turned on automatically
+// when spoken feedback is enabled.
+const char kAshEnableTouchExplorationMode[] =
+    "ash-enable-touch-exploration-mode";
 #endif
 
 // Enables software based mirroring.
index 0736a33..bae404b 100644 (file)
@@ -25,9 +25,9 @@ ASH_EXPORT extern const char kAshDefaultWallpaperIsOem[];
 ASH_EXPORT extern const char kAshDefaultWallpaperLarge[];
 ASH_EXPORT extern const char kAshDefaultWallpaperSmall[];
 ASH_EXPORT extern const char kAshDisableLockLayoutManager[];
-ASH_EXPORT extern const char kAshDisableTouchExplorationMode[];
 #if defined(OS_CHROMEOS)
 ASH_EXPORT extern const char kAshEnableMagnifierKeyScroller[];
+ASH_EXPORT extern const char kAshEnableTouchExplorationMode[];
 #endif
 ASH_EXPORT extern const char kAshEnableSoftwareMirroring[];
 ASH_EXPORT extern const char kAshEnableSystemSounds[];
index 45b06ed..212c0de 100644 (file)
Binary files a/src/ash/resources/default_100_percent/common/shelf/shelf_background.png and b/src/ash/resources/default_100_percent/common/shelf/shelf_background.png differ
index 5a62204..3a3e6a1 100644 (file)
Binary files a/src/ash/resources/default_200_percent/common/shelf/shelf_background.png and b/src/ash/resources/default_200_percent/common/shelf/shelf_background.png differ
index aafe0ba..51f8773 100644 (file)
@@ -806,8 +806,8 @@ void RootWindowController::Init(RootWindowType root_window_type,
   }
 
 #if defined(OS_CHROMEOS)
-  if (!CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kAshDisableTouchExplorationMode)) {
+  if (CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kAshEnableTouchExplorationMode)) {
     cros_accessibility_observer_.reset(new CrosAccessibilityObserver(this));
   }
 #endif
index 0fec3ac..bff21be 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">የማያ ገጽዎ ቁጥጥር በHangouts በኩል ለ<ph name="HELPER_NAME"/> በማጋራት ላይ።</translation>
 <translation id="7864539943188674973">ብሉቱዝን ያሰናክሉ</translation>
 <translation id="939252827960237676">ቅጽበታዊ ገጽ እይታን ማስቀመጥ አልተቻለም</translation>
+<translation id="9080206825613744995">ማይክሮፎን ስራ ላይ ነው።</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">ለማዘመን ዳግም ያስጀምሩ</translation>
 <translation id="2268813581635650749">ሁሉንም ዘግተህ ውጣ</translation>
 <translation id="1882897271359938046">ወደ <ph name="DISPLAY_NAME"/> በማንጸባረቅ ላይ</translation>
 <translation id="2727977024730340865">አነስተኛ ኃይል ወዳለው ባትሪ መሙያ ተሰክቷል። የባትሪ መሙላት አስተማማኝ ላይሆን ይችላል።</translation>
 <translation id="3784455785234192852">ቆልፍ</translation>
-<translation id="2805756323405976993">á\89µá\8c\8dá\89 á\88«á\8b\8eá\89½ </translation>
+<translation id="2805756323405976993">á\88\98á\89°á\8c\8dá\89 á\88ªá\8b«á\8b\8eá\89½</translation>
 <translation id="1512064327686280138">የማግበር አለመሳካት</translation>
 <translation id="5097002363526479830">ከአውታረ መረብ «<ph name="NAME"/>» ጋር መገናኘት አልተሳካም፦ <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi ጠፍቷል።</translation>
index ef22b17..1332f40 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">‏مشاركة التحكم في الشاشة مع <ph name="HELPER_NAME"/> عبر Hangouts.</translation>
 <translation id="7864539943188674973">تعطيل البلوتوث</translation>
 <translation id="939252827960237676">أخفق حفظ لقطة الشاشة</translation>
+<translation id="9080206825613744995">الميكروفون قيد الاستخدام</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">إعادة التشغيل للتحديث</translation>
 <translation id="2268813581635650749">خروج الجميع</translation>
index 4882f8d..f4d8f40 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Контролът върху екрана ви се споделя с/ъс <ph name="HELPER_NAME"/> чрез Hangouts.</translation>
 <translation id="7864539943188674973">Деактивиране на Bluetooth</translation>
 <translation id="939252827960237676">Запазването на екранната снимка не бе успешно</translation>
+<translation id="9080206825613744995">Микрофонът се използва.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Рестартирайте, за да актуализирате</translation>
 <translation id="2268813581635650749">Изход за всички</translation>
index fbe3ea4..ad1e044 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Hangouts এর মাধ্যমে <ph name="HELPER_NAME"/> এর সঙ্গে আপনার স্ক্রীন নিয়ন্ত্রণ ভাগ করা হচ্ছে৷</translation>
 <translation id="7864539943188674973">ব্লুটুথ অক্ষম করুন</translation>
 <translation id="939252827960237676">স্ক্রীনশট সংরক্ষণ করতে ব্যর্থ হয়েছে</translation>
+<translation id="9080206825613744995">মাইক্রোফোন ব্যবহার করা হচ্ছে।</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">আপডেট করার জন্য পুনরারম্ভ করুন</translation>
 <translation id="2268813581635650749">সবগুলি সাইন আউট করুন</translation>
index fd49f93..592a01e 100644 (file)
@@ -35,7 +35,7 @@
 <translation id="2248649616066688669">Podeu continuar utilitzant el dispositiu Chromebook mentre estigui connectat a una pantalla externa, encara que la tapa estigui tancada.</translation>
 <translation id="40400351611212369">Error d'activació de xarxa</translation>
 <translation id="4237016987259239829">Error de connexió a la xarxa</translation>
-<translation id="2946640296642327832">Activa el Bluetooth</translation>
+<translation id="2946640296642327832">Activa Bluetooth</translation>
 <translation id="6459472438155181876">S'està ampliant la pantalla a <ph name="DISPLAY_NAME"/></translation>
 <translation id="8206859287963243715">Cel·lular</translation>
 <translation id="6596816719288285829">Adreça IP</translation>
@@ -56,6 +56,7 @@ Premeu Maj+Alt per canviar-lo.</translation>
 <translation id="4628814525959230255">Comparteix el control de la pantalla amb <ph name="HELPER_NAME"/> mitjançant Hangouts.</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="9080206825613744995">S'està fent servir el micròfon.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Reinicia per actualitzar</translation>
 <translation id="2268813581635650749">Tanca la sessió de tots els usuaris</translation>
@@ -162,15 +163,15 @@ Premeu Maj+Alt per canviar-lo.</translation>
 <translation id="2966449113954629791">És possible que hàgiu esgotat la quantitat assignada de dades mòbils. Visiteu el portal d'activació <ph name="NAME"/> per comprar més dades.</translation>
 <translation id="742594950370306541">La càmera s'està utilitzant.</translation>
 <translation id="8132793192354020517">Connectat a <ph name="NAME"/></translation>
-<translation id="7052914147756339792">Defineix l'empaperat...</translation>
+<translation id="7052914147756339792">Estableix fons de pantalla...</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>
+<translation id="3473479545200714844">Lupa</translation>
 <translation id="7005812687360380971">Error</translation>
-<translation id="882279321799040148">Feu clic per visualitzar-la.</translation>
+<translation id="882279321799040148">Feu clic per visualitzar-la</translation>
 <translation id="1753067873202720523">Pot ser que el Chromebook no es carregui mentre estigui activat.</translation>
 <translation id="7561014039265304140"><ph name="DISPLAY_NAME"/> no admet <ph name="SPECIFIED_RESOLUTION"/>. S'ha canviat la resolució per <ph name="FALLBACK_RESOLUTION"/>.</translation>
 <translation id="5045550434625856497">Contrasenya incorrecta</translation>
@@ -194,7 +195,7 @@ 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="2429753432712299108">El dispositiu Bluetooth &quot;<ph name="DEVICE_NAME"/>&quot; sol·licita permís per emparellar-se. Abans d'acceptar, comproveu que aquesta contrasenya es mostri al dispositiu: <ph name="PASSKEY"/>.</translation>
+<translation id="2429753432712299108">El dispositiu Bluetooth &quot;<ph name="DEVICE_NAME"/>&quot; sol·licita permís per emparellar-se. Abans d'acceptar, comproveu que aquesta clau d'accés es mostri al dispositiu: <ph name="PASSKEY"/>.</translation>
 <translation id="9201131092683066720">La bateria està carregada fins al <ph name="PERCENTAGE"/>%.</translation>
 <translation id="2983818520079887040">Configuració...</translation>
 <translation id="3871838685472846647">Xarxa mòbil activada</translation>
@@ -249,7 +250,7 @@ Premeu Alt+Cerca o Maj per cancel·lar.</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="6911468394164995108">Uneix-te a una altra...</translation>
+<translation id="6911468394164995108">Connecta't a una altra xarxa...</translation>
 <translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
 <translation id="2563856802393254086">Enhorabona. El servei de dades &quot;<ph name="NAME"/>&quot; s'ha activat i ja es pot fer servir.</translation>
 <translation id="412065659894267608">Falten <ph name="HOUR"/> h <ph name="MINUTE"/> min fins que estigui carregada completament</translation>
index c4eacd0..6657c22 100644 (file)
@@ -55,6 +55,7 @@
 <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="7864539943188674973">Vypnout Bluetooth</translation>
 <translation id="939252827960237676">Uložení snímku obrazovky se nezdařilo</translation>
+<translation id="9080206825613744995">Mikrofon je používán.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Restartovat a aktualizovat</translation>
 <translation id="2268813581635650749">Odhlásit vše</translation>
index 2213a09..3aa37fc 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
-<translation id="3595596368722241419">Batteri fuldt</translation>
+<translation id="3595596368722241419">Batteri helt opladet</translation>
 <translation id="6895424601869865703">Føj en konto til <ph name="GIVEN_NAME"/></translation>
 <translation id="1057289296854808272">Rotation er slået til (tryk her for at ændre indstillingen)</translation>
 <translation id="7814236020522506259"><ph name="HOUR"/> og <ph name="MINUTE"/></translation>
@@ -56,6 +56,7 @@ Tryk på Shift+Alt for at ændre den.</translation>
 <translation id="4628814525959230255">Deler kontrollen over din skærm med <ph name="HELPER_NAME"/> via Hangouts.</translation>
 <translation id="7864539943188674973">Deaktiver Bluetooth</translation>
 <translation id="939252827960237676">Skærmbilledet kunne ikke gemmes</translation>
+<translation id="9080206825613744995">Mikrofonen er i brug.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Genstart for at opdatere</translation>
 <translation id="2268813581635650749">Log alle ud</translation>
@@ -82,7 +83,7 @@ Tryk på Shift+Alt for at ændre den.</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="3892641579809465218">Intern skærm</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="3606978283550408104">Der er tilsluttet en brailleskærm.</translation>
@@ -157,7 +158,7 @@ Tryk på Shift+Alt for at ændre den.</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>
-<translation id="2872961005593481000">Luk</translation>
+<translation id="2872961005593481000">Sluk</translation>
 <translation id="3433830597744061105">Administrer konti</translation>
 <translation id="2966449113954629791">Du har muligvis opbrugt den tilladte mobildatamængde. Gå til aktiveringsportalen for <ph name="NAME"/> for at købe mere data.</translation>
 <translation id="742594950370306541">Kameraet er i brug.</translation>
@@ -176,7 +177,7 @@ Tryk på Shift+Alt for at ændre den.</translation>
 <translation id="5045550434625856497">Ugyldig adgangskode</translation>
 <translation id="1602076796624386989">Aktivér mobildata</translation>
 <translation id="68610848741840742">ChromeVox (talefeedback)</translation>
-<translation id="6981982820502123353">Hjælpemidler</translation>
+<translation id="6981982820502123353">Hjælpefunktioner</translation>
 <translation id="6585808820553845416">Sessionen slutter om <ph name="SESSION_TIME_REMAINING"/>.</translation>
 <translation id="4274292172790327596">Fejlen genkendes ikke</translation>
 <translation id="5977415296283489383">Hovedtelefon</translation>
@@ -193,7 +194,7 @@ Servermeddelelse: <ph name="SERVER_MSG"/></translation>
 <translation id="9044646465488564462">Det var ikke muligt at oprette forbindelse til netværket: <ph name="DETAILS"/></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="4872237917498892622">Alt+Søg eller Shift</translation>
 <translation id="2429753432712299108">Bluetooth-enheden &quot;<ph name="DEVICE_NAME"/>&quot; vil gerne have parringstilladelse. Inden du accepterer, skal du bekræfte, at denne adgangsnøgle er vist på den pågældende enhed: <ph name="PASSKEY"/></translation>
 <translation id="9201131092683066720">Batteriet er <ph name="PERCENTAGE"/> % opladet.</translation>
 <translation id="2983818520079887040">Indstillinger...</translation>
@@ -217,10 +218,10 @@ Servermeddelelse: <ph name="SERVER_MSG"/></translation>
 <translation id="4895488851634969361">Batteriet er helt opladet.</translation>
 <translation id="615957422585914272">Vis skærmtastatur</translation>
 <translation id="5947494881799873997">Fortryd</translation>
-<translation id="7593891976182323525">Søg eller skift</translation>
+<translation id="7593891976182323525">Søg eller Shift</translation>
 <translation id="7649070708921625228">Hjælp</translation>
 <translation id="3050422059534974565">CAPS LOCK er slået til.
-Tryk på Søg eller Skift for at annullere.</translation>
+Tryk på Søg eller Shift for at annullere.</translation>
 <translation id="397105322502079400">Beregner...</translation>
 <translation id="158849752021629804">Hjemmenetværk mangler</translation>
 <translation id="1013923882670373915">Bluetooth-enheden &quot;<ph name="DEVICE_NAME"/>&quot; vil gerne have parringstilladelse. Indtast denne pinkode på den pågældende enhed: <ph name="PINCODE"/></translation>
@@ -241,7 +242,7 @@ Tryk på Søg eller Skift for at annullere.</translation>
 Tryk på Ctrl+Alt+Z for at deaktivere dette.</translation>
 <translation id="5045002648206642691">Google Drev-indstillinger...</translation>
 <translation id="7209101170223508707">CAPS LOCK er slået til.
-Tryk på Alt+Søg eller Skift for at annullere.</translation>
+Tryk på Alt+Søg eller Shift 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>
@@ -249,7 +250,7 @@ Tryk på Alt+Søg eller Skift for at annullere.</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="6911468394164995108">Find andre... </translation>
+<translation id="6911468394164995108">Vælg et andet...</translation>
 <translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
 <translation id="2563856802393254086">Datatjenesten &quot;<ph name="NAME"/>&quot; er blevet aktiveret og er klar til brug.</translation>
 <translation id="412065659894267608"><ph name="HOUR"/> t <ph name="MINUTE"/> m, indtil det er fuldt opladet</translation>
index c67e2d6..3c54824 100644 (file)
@@ -56,6 +56,7 @@ Drücken Sie zum Wechseln Shift+Alt.</translation>
 <translation id="4628814525959230255">Bildschirmfreigabe für <ph name="HELPER_NAME"/> über Hangouts</translation>
 <translation id="7864539943188674973">Bluetooth deaktivieren</translation>
 <translation id="939252827960237676">Screenshot konnte nicht gespeichert werden.</translation>
+<translation id="9080206825613744995">Mikrofon wird verwendet.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Zum Aktualisieren neu starten</translation>
 <translation id="2268813581635650749">Alle abmelden</translation>
@@ -153,7 +154,7 @@ Drücken Sie zum Wechseln Shift+Alt.</translation>
 <translation id="1882897271359938046">Wird auf <ph name="DISPLAY_NAME"/> gespiegelt...</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 definitiv möglich</translation>
+<translation id="2805756323405976993">Apps</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>
index 14d18a3..e6094de 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Μοιράζεστε τον έλεγχο της οθόνης σας με το χρήστη <ph name="HELPER_NAME"/> μέσω του Hangouts.</translation>
 <translation id="7864539943188674973">Απενεργοποίηση Bluetooth</translation>
 <translation id="939252827960237676">Αποτυχία αποθήκευσης στιγμιότυπου οθόνης</translation>
+<translation id="9080206825613744995">Το μικρόφωνο χρησιμοποιείται.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Επανεκκίνηση για ενημέρωση</translation>
 <translation id="2268813581635650749">Αποσύνδεση όλων</translation>
index c5cb534..406bcfc 100644 (file)
@@ -56,6 +56,7 @@ Press Shift + Alt to switch.</translation>
 <translation id="4628814525959230255">Sharing control of your screen with <ph name="HELPER_NAME"/> via Hangouts.</translation>
 <translation id="7864539943188674973">Disable Bluetooth</translation>
 <translation id="939252827960237676">Failed to save screenshot</translation>
+<translation id="9080206825613744995">Microphone is in use.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Restart to update</translation>
 <translation id="2268813581635650749">Sign out all</translation>
index a31c5df..d41b033 100644 (file)
@@ -56,6 +56,7 @@ Para cambiarlo, presiona Shift + Alt.</translation>
 <translation id="4628814525959230255">Compartir el control de la pantalla con <ph name="HELPER_NAME"/> a través de Hangouts</translation>
 <translation id="7864539943188674973">Desactivar Bluetooth</translation>
 <translation id="939252827960237676">No se pudo guardar la captura de pantalla.</translation>
+<translation id="9080206825613744995">El micrófono está en uso.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Reinicia para actualizar.</translation>
 <translation id="2268813581635650749">Salir de todo</translation>
@@ -153,7 +154,7 @@ Para cambiarlo, presiona Shift + Alt.</translation>
 <translation id="1882897271359938046">Copiando en <ph name="DISPLAY_NAME"/></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">Google Apps</translation>
+<translation id="2805756323405976993">Aplicaciones</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>
index 24d3668..852b3a4 100644 (file)
@@ -56,6 +56,7 @@ Para cambiarlo, pulsa Mayús + Alt.</translation>
 <translation id="4628814525959230255">Comparte el control de tu pantalla con <ph name="HELPER_NAME"/> a través de Hangouts.</translation>
 <translation id="7864539943188674973">Inhabilitar Bluetooth</translation>
 <translation id="939252827960237676">Error al guardar captura de pantalla</translation>
+<translation id="9080206825613744995">El micrófono se está utilizando.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Reinicia el sistema para actualizarlo.</translation>
 <translation id="2268813581635650749">Cerrar todas las sesiones</translation>
index 456f809..2299305 100644 (file)
@@ -56,6 +56,7 @@ Selle muutmiseks vajutage klahve Tõstuklahv + Alt.</translation>
 <translation id="4628814525959230255">Teie ekraani juhtimist jagatakse Hangoutsi kaudu kasutajaga <ph name="HELPER_NAME"/>.</translation>
 <translation id="7864539943188674973">Keela Bluetooth</translation>
 <translation id="939252827960237676">Ekraanipilti ei õnnestunud salvestada</translation>
+<translation id="9080206825613744995">Mikrofon on kasutusel.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Taaskäivitage värskendamiseks</translation>
 <translation id="2268813581635650749">Logi kõik kasutajad välja</translation>
index 0190293..f30e11e 100644 (file)
@@ -55,6 +55,7 @@
 <translation id="4628814525959230255">‏اشتراک‌گذاری کنترل صفحه نمایش‌تان با <ph name="HELPER_NAME"/> از طریق Hangouts.</translation>
 <translation id="7864539943188674973">غیرفعال کردن بلوتوث</translation>
 <translation id="939252827960237676">عکس از صفحه نمایش ذخیره نشد</translation>
+<translation id="9080206825613744995">میکروفون در حال استفاده است.</translation>
 <translation id="1969011864782743497">‏<ph name="DEVICE_NAME"/> (‏USB)</translation>
 <translation id="3126069444801937830">راه‌اندازی مجدد برای به‌روزرسانی</translation>
 <translation id="2268813581635650749">خروج همه از سیستم</translation>
index 56bba5d..9b17f83 100644 (file)
@@ -15,7 +15,7 @@
 <translation id="6713285437468012787">Bluetooth-laitteeseen <ph name="DEVICE_NAME"/> on nyt muodostettu laitepariyhteys, ja se on kaikkien käyttäjien saatavilla. Voit poistaa laiteparin Asetuksien kautta.</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="370649949373421643">Ota Wi-Fi käyttöön</translation>
 <translation id="3626281679859535460">Kirkkaus</translation>
 <translation id="3621202678540785336">Äänitulo:</translation>
 <translation id="7348093485538360975">Virtuaalinäppäimistö</translation>
@@ -56,6 +56,7 @@ Vaihda syöttötapaa painamalla Shift + Alt.</translation>
 <translation id="4628814525959230255">Näytönhallinnan jakaminen henkilön <ph name="HELPER_NAME"/> kanssa Hangout-keskustelujen kautta.</translation>
 <translation id="7864539943188674973">Poista Bluetooth käytöstä</translation>
 <translation id="939252827960237676">Kuvakaappauksen tallentaminen epäonnistui</translation>
+<translation id="9080206825613744995">Mikrofoni on käytössä.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Päivitä käynnistämällä uudelleen</translation>
 <translation id="2268813581635650749">Kirjaa kaikki ulos</translation>
index f41ab49..9a7dd44 100644 (file)
@@ -56,6 +56,7 @@ Pindutin ang Shift + Alt upang magpalit.</translation>
 <translation id="4628814525959230255">Ibinahagi ang kontrol sa iyong screen kay <ph name="HELPER_NAME"/> sa pamamagitan ng Hangouts.</translation>
 <translation id="7864539943188674973">Huwag Paganahin ang Bluetooth</translation>
 <translation id="939252827960237676">Nabigong i-save ang screenshot</translation>
+<translation id="9080206825613744995">Ginagamit ang mikropono.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">I-restart upang mag-update</translation>
 <translation id="2268813581635650749">I-sign out ang lahat</translation>
index 9a412b0..31c6a5b 100644 (file)
@@ -56,6 +56,7 @@ Appuyez sur Maj + Alt pour en utiliser un autre.</translation>
 <translation id="4628814525959230255">Partage du contrôle de votre écran avec <ph name="HELPER_NAME"/> via Hangouts</translation>
 <translation id="7864539943188674973">Désactiver le Bluetooth</translation>
 <translation id="939252827960237676">Échec d'enregistrement de la capture d'écran.</translation>
+<translation id="9080206825613744995">Le micro est en cours d'utilisation.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Redémarrez pour mettre à jour</translation>
 <translation id="2268813581635650749">Déconnecter tous les utilisateurs</translation>
index 5bf225e..400ac4a 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Hangouts દ્વારા <ph name="HELPER_NAME"/> સાથે તમારી સ્ક્રીનનું નિયંત્રણ શેર કરવું.</translation>
 <translation id="7864539943188674973">Bluetooth અક્ષમ કરો</translation>
 <translation id="939252827960237676">સ્ક્રીનશૉટ સાચવવામાં નિષ્ફળ રહ્યું</translation>
+<translation id="9080206825613744995">માઇકોફોન ઉપયોગમાં છે.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">અપડેટ કરવા માટે પુનઃપ્રારંભ કરો</translation>
 <translation id="2268813581635650749">બધામાંથી સાઇન આઉટ કરો</translation>
index 4974407..5e00881 100644 (file)
@@ -8,14 +8,14 @@
 <translation id="7880025619322806991">पोर्टल स्थिति</translation>
 <translation id="30155388420722288">ओवरफ़्लो बटन</translation>
 <translation id="8673028979667498656">270°</translation>
-<translation id="5571066253365925590">Bluetooth सक्षम किया गया</translation>
+<translation id="5571066253365925590">ब्लूटूथ सक्षम किया गया</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> को <ph name="ROTATION"/> पर घुमाया गया</translation>
-<translation id="9074739597929991885">Bluetooth</translation>
-<translation id="2268130516524549846">Bluetooth अक्षम किया गया</translation>
-<translation id="6713285437468012787">Bluetooth उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; यु्ग्मित हो गया है और अब वह सभी उपयोगकर्ताओं के लिए उपलब्ध है. आप सेटिंग का उपयोग करके इस युग्मन को निकाल सकते हैं.</translation>
+<translation id="9074739597929991885">ब्लूटूथ</translation>
+<translation id="2268130516524549846">ब्लूटूथ अक्षम किया गया</translation>
+<translation id="6713285437468012787">ब्लूटूथ उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; यु्ग्मित हो गया है और अब वह सभी उपयोगकर्ताओं के लिए उपलब्ध है. आप सेटिंग का उपयोग करके इस युग्मन को निकाल सकते हैं.</translation>
 <translation id="7165320105431587207">नेटवर्क कॉन्फ़िगर करने में विफल</translation>
 <translation id="3775358506042162758">एकाधिक साइन-इन में आप तीन तक खाते रख सकते हैं.</translation>
-<translation id="370649949373421643">Wi-Fi सक्षम करें</translation>
+<translation id="370649949373421643">वाई-फ़ाई  सक्षम करें</translation>
 <translation id="3626281679859535460">चमक</translation>
 <translation id="3621202678540785336">इनपुट</translation>
 <translation id="7348093485538360975">ऑन-स्‍क्रीन कीबोर्ड</translation>
@@ -35,7 +35,7 @@
 <translation id="2248649616066688669">आप अपने Chrome बुक का उपयोग बाहरी डिस्प्ले से कनेक्ट रहते हुए कर सकते हैं, भले ही लिड बंद हो.</translation>
 <translation id="40400351611212369">नेटवर्क सक्रियण त्रुटि</translation>
 <translation id="4237016987259239829">नेटवर्क कनेक्शन त्रुटि</translation>
-<translation id="2946640296642327832">Bluetooth सक्षम करें</translation>
+<translation id="2946640296642327832">ब्लूटूथ सक्षम करें</translation>
 <translation id="6459472438155181876"><ph name="DISPLAY_NAME"/> पर स्क्रीन विस्तृत कर रहा है</translation>
 <translation id="8206859287963243715">सेलुलर</translation>
 <translation id="6596816719288285829">IP पता</translation>
@@ -54,8 +54,9 @@
 <translation id="785750925697875037">मोबाइल खाते देखें</translation>
 <translation id="153454903766751181">सेल्युलर मॉडम प्रारंभ हो रहा है...</translation>
 <translation id="4628814525959230255">Hangout के माध्यम से अपनी स्क्रीन <ph name="HELPER_NAME"/> के साथ साझा करना.</translation>
-<translation id="7864539943188674973">Bluetooth अक्षम करें</translation>
+<translation id="7864539943188674973">ब्लूटूथ अक्षम करें</translation>
 <translation id="939252827960237676">स्क्रीनशॉट सहेजने में विफल</translation>
+<translation id="9080206825613744995">माइक्रोफ़ोन का उपयोग हो रहा है.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">अपडेट करने के लिए पुनरारंभ करें</translation>
 <translation id="2268813581635650749">सभी प्रस्थान करें</translation>
@@ -78,7 +79,7 @@
 <translation id="2688477613306174402">कॉन्फ़िगरेशन</translation>
 <translation id="1272079795634619415">रोकें</translation>
 <translation id="4957722034734105353">अधिक जानें...</translation>
-<translation id="2964193600955408481">Wi-Fi अक्षम करें</translation>
+<translation id="2964193600955408481">वाई-फ़ाई  अक्षम करें</translation>
 <translation id="4279490309300973883">मिरर करना</translation>
 <translation id="7973962044839454485">किसी गलत उपयोगकर्ता नाम या पासवर्ड के कारण PPP प्रमाणीकरण विफल रहा</translation>
 <translation id="2509468283778169019">CAPS LOCK चालू है</translation>
@@ -86,8 +87,8 @@
 <translation id="7823564328645135659">आपकी सेटिंग समन्वयित करने के बाद भाषा को &quot;<ph name="FROM_LOCALE"/>&quot; से &quot;<ph name="TO_LOCALE"/>&quot; में बदल दिया गया है.</translation>
 <translation id="3368922792935385530">कनेक्टेड</translation>
 <translation id="3606978283550408104">ब्रेल डिस्प्ले कनेक्ट हो गया.</translation>
-<translation id="8654520615680304441">Wi-Fi चालू करें...</translation>
-<translation id="6650933572246256093">Bluetooth उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है. कृपया उपकरण पर यह पासकुंजी डालें: <ph name="PASSKEY"/></translation>
+<translation id="8654520615680304441">वाई-फ़ाई  चालू करें...</translation>
+<translation id="6650933572246256093">ब्लूटूथ उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है. कृपया उपकरण पर यह पासकुंजी डालें: <ph name="PASSKEY"/></translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="5825747213122829519">आपकी इनपुट विधि <ph name="INPUT_METHOD_ID"/> में बदल गई है.
 स्विच करने के लिए Shift + Alt दबाएं.</translation>
 <translation id="3742055079367172538">स्क्रीनशॉट लिया गया</translation>
 <translation id="8878886163241303700">स्क्रीन का विस्तार करना</translation>
 <translation id="5271016907025319479">VPN कॉन्फ़िगर नहीं किया गया है.</translation>
-<translation id="3105990244222795498"><ph name="DEVICE_NAME"/> (Bluetooth)</translation>
+<translation id="3105990244222795498"><ph name="DEVICE_NAME"/> (ब्लूटूथ)</translation>
 <translation id="3967919079500697218">स्क्रीनशॉट लेने की क्षमता को आपके व्यवस्थापक द्वारा अक्षम कर दिया गया है.</translation>
 <translation id="372094107052732682">छोड़ने के लिए Ctrl+Shift+Q दो बार दबाएं.</translation>
 <translation id="923686485342484400">प्रस्थान करने के लिए दो बार Control Shift Q दबाएं.</translation>
 <translation id="5543001071567407895">SMS</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="2354174487190027830"><ph name="NAME"/> सक्रिय हो रहा है</translation>
-<translation id="4527045527269911712">Bluetooth उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है.</translation>
-<translation id="8814190375133053267">Wi-Fi</translation>
+<translation id="4527045527269911712">ब्लूटूथ उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है.</translation>
+<translation id="8814190375133053267">वाई-फ़ाई </translation>
 <translation id="1923539912171292317">स्वत: क्‍लिक</translation>
 <translation id="2692809339924654275"><ph name="BLUETOOTH"/>: कनेक्ट हो रहा है...</translation>
 <translation id="6062360702481658777">आप <ph name="LOGOUT_TIME_LEFT"/> में अपने आप प्रस्थान कर जाएंगे.</translation>
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/> पर मिरर कर रहा है</translation>
 <translation id="2727977024730340865">कम-शक्ति वाले चार्जर में प्लग इन करें. बैटरी चार्ज करना संभवत: विश्वसनीय नहीं होगा.</translation>
 <translation id="3784455785234192852">लॉक करें</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">ऐप्स</translation>
 <translation id="1512064327686280138">सक्रियण विफलता</translation>
 <translation id="5097002363526479830">नेटवर्क से कनेक्ट करने में विफल '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
-<translation id="1850504506766569011">Wi-Fi बंद है.</translation>
+<translation id="1850504506766569011">वाई-फ़ाई  बंद है.</translation>
 <translation id="2872961005593481000">शट डाउन करें</translation>
 <translation id="3433830597744061105">खाते प्रबंधित करें</translation>
 <translation id="2966449113954629791">हो सकता है कि आपने अपनी मोबाइल डेटा छूट का उपयोग कर लिया हो. और डेटा खरीदने के लिए <ph name="NAME"/> सक्रियण पोर्टल पर जाएं.</translation>
 <translation id="225680501294068881">उपकरण स्कैन किए जा रहे हैं...</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY"/>, <ph name="DATE"/></translation>
 <translation id="737451040872859086">माइक्रोफ़ोन (आंतरिक)</translation>
-<translation id="4448844063988177157">Wi-Fi नेटवर्क खोज रहा है...</translation>
+<translation id="4448844063988177157">वाई-फ़ाई  नेटवर्क खोज रहा है...</translation>
 <translation id="8401662262483418323">'<ph name="NAME"/>' से कनेक्ट करने में असफल: <ph name="DETAILS"/>
 सर्वर संदेश: <ph name="SERVER_MSG"/></translation>
 <translation id="2475982808118771221">कोई त्रुटि आई</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME"/>, <ph name="DOMAIN"/> के द्वारा प्रबंधित एक सार्वजनिक सत्र है</translation>
 <translation id="9044646465488564462">नेटवर्क से कनेक्ट करने में विफल रहा: <ph name="DETAILS"/></translation>
 <translation id="7029814467594812963">सत्र से बाहर निकलें</translation>
-<translation id="8454013096329229812">Wi-Fi चालू है.</translation>
+<translation id="8454013096329229812">वाई-फ़ाई  चालू है.</translation>
 <translation id="4872237917498892622">Alt+Search या Shift</translation>
-<translation id="2429753432712299108">Bluetooth उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है. स्वीकार करने से पहले, कृपया पुष्टि करें कि यह पासकुंजी उस उपकरण पर दिखाई जा रही है: <ph name="PASSKEY"/></translation>
+<translation id="2429753432712299108">ब्लूटूथ उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है. स्वीकार करने से पहले, कृपया पुष्टि करें कि यह पासकुंजी उस उपकरण पर दिखाई जा रही है: <ph name="PASSKEY"/></translation>
 <translation id="9201131092683066720">बैटरी <ph name="PERCENTAGE"/>% भरी हुई है.</translation>
 <translation id="2983818520079887040">सेटिंग...</translation>
 <translation id="3871838685472846647">सेलुलर सक्रिय किया गया</translation>
 <translation id="6452181791372256707">अस्‍वीकार करें</translation>
 <translation id="1195412055398077112">ओवरस्कैन</translation>
-<translation id="607652042414456612">आपका कंप्यूर आस-पास के Bluetooth उपकरणों के लिए खोजे जाने योग्य है और वह &quot;<ph name="NAME"/>&quot; के रूप में <ph name="ADDRESS"/> पते के साथ दिखाई देगा</translation>
+<translation id="607652042414456612">आपका कंप्यूर आस-पास के ब्लूटूथ उपकरणों के लिए खोजे जाने योग्य है और वह &quot;<ph name="NAME"/>&quot; के रूप में <ph name="ADDRESS"/> पते के साथ दिखाई देगा</translation>
 <translation id="112308213915226829">शेल्फ़ को स्वत: छिपाएं</translation>
 <translation id="6732801395666424405">प्रमाणपत्र लोड नहीं किए गए हैं</translation>
 <translation id="7573962313813535744">डॉक मोड</translation>
 रद्द करने के लिए Search या Shift दबाएं.</translation>
 <translation id="397105322502079400">गणना की जा रही है...</translation>
 <translation id="158849752021629804">होम नेटवर्क की आवश्यकता है</translation>
-<translation id="1013923882670373915">Bluetooth उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है. कृपया उस उपकरण पर यह पिन कोड डालें: <ph name="PINCODE"/></translation>
+<translation id="1013923882670373915">ब्लूटूथ उपकरण &quot;<ph name="DEVICE_NAME"/>&quot; युग्मित करने की अनुमति चाहता है. कृपया उस उपकरण पर यह पिन कोड डालें: <ph name="PINCODE"/></translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE"/> को सक्रिय करें</translation>
 <translation id="5864471791310927901">DHCP लुकअप विफल</translation>
 <translation id="2819276065543622893">अब आप प्रस्थान कर जाएंगे.</translation>
index 42f1910..6f87dc5 100644 (file)
@@ -56,6 +56,7 @@ Pritisnite Shift + Alt za promjenu.</translation>
 <translation id="4628814525959230255">Dijelite kontrolu nad zaslonom s korisnikom <ph name="HELPER_NAME"/> putem značajke Hangouts.</translation>
 <translation id="7864539943188674973">Onemogući Bluetooth</translation>
 <translation id="939252827960237676">Snimka zaslona nije spremljena</translation>
+<translation id="9080206825613744995">Upotrebljava se mikrofon.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Ponovo pokrenite za ažuriranje</translation>
 <translation id="2268813581635650749">Odjavi sve</translation>
index 428ca65..3bbac57 100644 (file)
@@ -56,6 +56,7 @@ A váltáshoz nyomja meg a Shift + Alt billentyűkódot.</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="7864539943188674973">Bluetooth letiltása</translation>
 <translation id="939252827960237676">Nem sikerült menteni a képernyőképet.</translation>
+<translation id="9080206825613744995">A mikrofon használatban van.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Indítsa újra a frissítéshez</translation>
 <translation id="2268813581635650749">Összes kijelentkeztetése</translation>
@@ -153,7 +154,7 @@ A váltáshoz nyomja meg a Shift + Alt billentyűkódot.</translation>
 <translation id="1882897271359938046">Tükrözés: <ph name="DISPLAY_NAME"/></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">Google Alkalmazások</translation>
+<translation id="2805756323405976993">Alkalmazások</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>
index 0975f0d..01709fc 100644 (file)
@@ -56,6 +56,7 @@ Tekan Shift + Alt untuk beralih.</translation>
 <translation id="4628814525959230255">Berbagi kontrol layar Anda dengan <ph name="HELPER_NAME"/> melalui Hangouts.</translation>
 <translation id="7864539943188674973">Nonaktifkan Bluetooth</translation>
 <translation id="939252827960237676">Gagal menyimpan tangkapan layar</translation>
+<translation id="9080206825613744995">Mikrofon sedang digunakan.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Mulai ulang untuk memperbarui</translation>
 <translation id="2268813581635650749">Keluarkan semua pengguna</translation>
index c6ffa33..15f2e04 100644 (file)
@@ -56,6 +56,7 @@ Premi Maiusc+Alt per cambiare metodo.</translation>
 <translation id="4628814525959230255">Condivisione del controllo dello schermo con <ph name="HELPER_NAME"/> tramite Hangouts.</translation>
 <translation id="7864539943188674973">Disattiva Bluetooth</translation>
 <translation id="939252827960237676">Salvataggio dello screenshot non riuscito</translation>
+<translation id="9080206825613744995">Il microfono è in uso.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Riavvia per aggiornare</translation>
 <translation id="2268813581635650749">Disconnetti tutti</translation>
index 4c866f7..7e8e6e5 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">‏משתף את השליטה במסך שלך עם <ph name="HELPER_NAME"/> באמצעות Hangouts.</translation>
 <translation id="7864539943188674973">‏השבת Bluetooth</translation>
 <translation id="939252827960237676">שמירת צילום המסך נכשלה</translation>
+<translation id="9080206825613744995">המיקרופון נמצא בשימוש.</translation>
 <translation id="1969011864782743497">‏<ph name="DEVICE_NAME"/>‏ (USB)</translation>
 <translation id="3126069444801937830">הפעל מחדש כדי לעדכן</translation>
 <translation id="2268813581635650749">הוצא את כולם</translation>
index 5318dc9..f6d5ae1 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">ハングアウトを介して画面の制御を <ph name="HELPER_NAME"/> さんと共有しています。</translation>
 <translation id="7864539943188674973">Bluetooth を無効にする</translation>
 <translation id="939252827960237676">スクリーンショットを保存できませんでした</translation>
+<translation id="9080206825613744995">マイクは使用中です。</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/>(USB)</translation>
 <translation id="3126069444801937830">再起動して更新</translation>
 <translation id="2268813581635650749">すべてログアウト</translation>
@@ -86,7 +87,7 @@
 <translation id="7823564328645135659">設定の同期後に言語が「<ph name="FROM_LOCALE"/>」から「<ph name="TO_LOCALE"/>」に変更されました。</translation>
 <translation id="3368922792935385530">接続済み</translation>
 <translation id="3606978283550408104">ブライユ点字ディスプレイが接続されています。</translation>
-<translation id="8654520615680304441">Wi-Fi ã\82\92ã\82ªã\83³ã\81«ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99...</translation>
+<translation id="8654520615680304441">Wi-Fi ã\82\92ã\82ªã\83³ã\81«ã\81\99ã\82\8b...</translation>
 <translation id="6650933572246256093">Bluetooth デバイス「<ph name="DEVICE_NAME"/>」がペア設定の権限をリクエストしています。このデバイスに次のパスキーを入力してください: <ph name="PASSKEY"/></translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="5825747213122829519">入力方法を <ph name="INPUT_METHOD_ID"/> に変更しました。
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/> へミラーリング</translation>
 <translation id="2727977024730340865">低電力の充電器に接続しています。バッテリーが充電されない可能性があります。</translation>
 <translation id="3784455785234192852">ロック</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">アプリ</translation>
 <translation id="1512064327686280138">起動失敗</translation>
 <translation id="5097002363526479830">ネットワーク「<ph name="NAME"/>」に接続できませんでした: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi が無効になりました。</translation>
index f2fffd8..5879955 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Hangouts ಮೂಲಕ <ph name="HELPER_NAME"/> ಅವರೊಂದಿಗೆ ನಿಮ್ಮ ಪರದೆಯ ನಿಯಂತ್ರಣವನ್ನು ಹಂಚಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="7864539943188674973">bluetooth ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="939252827960237676">ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಉಳಿಸುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ</translation>
+<translation id="9080206825613744995">ಮೈಕ್ರೊಫೋನ್ ಬಳಕೆಯಲ್ಲಿದೆ.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">ನವೀಕರಿಸಲು ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="2268813581635650749">ಎಲ್ಲವನ್ನೂ ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation>
 <translation id="8132793192354020517"><ph name="NAME"/> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ</translation>
 <translation id="7052914147756339792">ವಾಲ್‌ಪೇಪರ್ ಅನ್ನು ಹೊಂದಿಸಿ...</translation>
 <translation id="8678698760965522072">ಆನ್‌ಲೈನ್ ಸ್ಥಿತಿ</translation>
-<translation id="2532589005999780174">à²\89ನà³\8dನತ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</translation>
+<translation id="2532589005999780174">ಹà³\86à²\9aà³\8dà²\9aಿನ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</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="7561014039265304140"><ph name="SPECIFIED_RESOLUTION"/> ಅನ್ನು <ph name="DISPLAY_NAME"/> ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ರೆಸಲ್ಯೂಶನ್‌ ಅನ್ನು <ph name="FALLBACK_RESOLUTION"/> ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ</translation>
 <translation id="5045550434625856497">ತಪ್ಪಾದ ಪಾಸ್‌ವರ್ಡ್</translation>
 <translation id="1602076796624386989">ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
-<translation id="68610848741840742">ChromeVox (ಮಾತನಾಡà³\81ವ ಪ್ರತಿಕ್ರಿಯೆ)</translation>
-<translation id="6981982820502123353">ಪ್ರವೇಶಿಸುವಿಕೆ</translation>
+<translation id="68610848741840742">ChromeVox (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ)</translation>
+<translation id="6981982820502123353">ಪ್ರವೇಶ</translation>
 <translation id="6585808820553845416">ಸೆಷನ್ <ph name="SESSION_TIME_REMAINING"/> ರಲ್ಲಿ ಕೊನೆಗೊಳ್ಳಲಿದೆ.</translation>
 <translation id="4274292172790327596">ಗುರುತಿಸದೆ ಇರುವ ದೋಷ</translation>
 <translation id="5977415296283489383">ಹೆಡ್‌ಫೋನ್</translation>
 <translation id="8300849813060516376">OTASP ವಿಫಲವಾಗಿದೆ</translation>
 <translation id="2792498699870441125">Alt+ಹುಡುಕಾಟ</translation>
 <translation id="8660803626959853127"><ph name="COUNT"/> ಫೈಲ್‌(ಗಳ) ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
-<translation id="5958529069007801266">ಮà³\86à³\95ಲà³\8dವಿà²\9aಾರಣà³\86ಯ ಬಳಕೆದಾರರು</translation>
+<translation id="5958529069007801266">ಮà³\86à³\95ಲà³\8dವಿà²\9aಾರಣà³\86à²\97à³\8aಳಪà²\9fà³\8dà²\9f ಬಳಕೆದಾರರು</translation>
 <translation id="3709443003275901162">9+</translation>
 <translation id="639644700271529076">CAPS LOCK ಆಫ್ ಆಗಿದೆ</translation>
 <translation id="6248847161401822652">ತೊರೆಯಲು Control Shift Q ಅನ್ನು ಎರಡು ಬಾರಿ ಒತ್ತಿರಿ.</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; ಗೆ ಮರುಬದಲಾಯಿಸಿ (ಮರುಪ್ರಾರಂಭಿಸುವ ಅಗತ್ಯವಿದೆ)</translation>
 <translation id="8103386449138765447">SMS ಸಂದೇಶಗಳು: <ph name="MESSAGE_COUNT"/></translation>
-<translation id="7097613348211027502">ChromeVox (ಮಾತನಾಡà³\81ವ ಪ್ರತಿಕ್ರಿಯೆ) ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು Ctrl+Alt+Z ಒತ್ತಿರಿ.</translation>
+<translation id="7097613348211027502">ChromeVox (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ) ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು Ctrl+Alt+Z ಒತ್ತಿರಿ.</translation>
 <translation id="5045002648206642691">Google ಡ್ರೈವ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು...</translation>
 <translation id="7209101170223508707">CAPS LOCK ಆನ್ ಆಗಿದೆ.
 ರದ್ದುಗೊಳಿಸಲು Alt+ಹುಡುಕಾಟ ಅಥವಾ Shift ಕೀಲಿಯನ್ನು ಒತ್ತಿರಿ</translation>
index f0cbcb6..84f8ed4 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">행아웃을 통해 화면 제어를 <ph name="HELPER_NAME"/>님과 공유 중</translation>
 <translation id="7864539943188674973">블루투스 사용 안 함</translation>
 <translation id="939252827960237676">캡처화면을 저장하지 못했습니다.</translation>
+<translation id="9080206825613744995">마이크가 사용 중입니다.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/>(USB)</translation>
 <translation id="3126069444801937830">업데이트하려면 다시 시작</translation>
 <translation id="2268813581635650749">모두 로그아웃</translation>
index 5616255..06fe52c 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Jūsų ekrano valdymas bendrinamas su <ph name="HELPER_NAME"/> per „Hangout“.</translation>
 <translation id="7864539943188674973">Neleisti „Bluetooth“</translation>
 <translation id="939252827960237676">Išsaugant ekrano kopiją įvyko klaida</translation>
+<translation id="9080206825613744995">Mikrofonas naudojamas.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Paleisti iš naujo, kad būtų atnaujinta</translation>
 <translation id="2268813581635650749">Atjungti visus</translation>
index ee4ef8a..09c7ef8 100644 (file)
@@ -56,6 +56,7 @@ Lai to pārslēgtu, nospiediet taustiņu kombināciju Shift+Alt.</translation>
 <translation id="4628814525959230255">Ekrāna vadības kopīgošana ar lietotāju <ph name="HELPER_NAME"/>, izmantojot funkciju Hangouts.</translation>
 <translation id="7864539943188674973">Atspējot Bluetooth</translation>
 <translation id="939252827960237676">Neizdevās saglabāt ekrānuzņēmumu.</translation>
+<translation id="9080206825613744995">Tiek izmantots mikrofons.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Restartēt, lai atjauninātu</translation>
 <translation id="2268813581635650749">Izrakstīt visus</translation>
@@ -96,7 +97,7 @@ Lai to pārslēgtu, nospiediet taustiņu kombināciju Shift+Alt.</translation>
 <translation id="2982222131142145681"><ph name="DEVICE_NAME"/> (HDMI)</translation>
 <translation id="4379753398862151997">Diemžēl monitoru nevar izmantot (tas netiek atbalstīts).</translation>
 <translation id="6426039856985689743">Atspējot mobilo datu pārraidi</translation>
-<translation id="3087734570205094154">Apakša</translation>
+<translation id="3087734570205094154">Apakšā</translation>
 <translation id="3742055079367172538">Ekrānuzņēmums ir uzņemts</translation>
 <translation id="8878886163241303700">Notiek ekrāna izvēršana</translation>
 <translation id="5271016907025319479">VPN nav konfigurēts.</translation>
index 6b09239..8dd240c 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">നിങ്ങളുടെ സ്‌ക്രീനിന്റെ നിയന്ത്രണം Hangouts വഴി <ph name="HELPER_NAME"/> എന്നതുമായി പങ്കിടുന്നു.</translation>
 <translation id="7864539943188674973">Bluetooth അപ്രാപ്‌തമാക്കുക</translation>
 <translation id="939252827960237676">സ്‌ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു</translation>
+<translation id="9080206825613744995">മൈക്രോഫോൺ ഉപയോഗത്തിലാണ്.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">അപ്‌ഡേറ്റുചെയ്യുന്നതിന് പുനരാരംഭിക്കുക</translation>
 <translation id="2268813581635650749">എല്ലാം സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/> എന്നതിലേക്ക് മിറർചെയ്യുന്നു</translation>
 <translation id="2727977024730340865">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജ്ജറിലേക്ക് പ്ലഗ് ചെയ്‌തിരിക്കുന്നു. ബാറ്ററി ചാർജുചെയ്യൽ വിശ്വസനീയമാകണമെന്നില്ല.</translation>
 <translation id="3784455785234192852">ലോക്കുചെയ്യുക</translation>
-<translation id="2805756323405976993">à´\85à´ªàµ\8dലിà´\95àµ\8dà´\95àµ\87à´·à´¨àµ\8dâ\80\8dà´¸àµ\8d</translation>
+<translation id="2805756323405976993">à´\86à´ªàµ\8dà´¸àµ\8d</translation>
 <translation id="1512064327686280138">സജീവമാക്കല്‍ പരാജയപ്പെട്ടു</translation>
 <translation id="5097002363526479830">'<ph name="NAME"/>' നെറ്റ്‌വര്‍‌ക്കിലേക്ക് ബന്ധിപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi ഓഫുചെയ്‌തു.</translation>
index 4dc890c..9f4d68d 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Hangouts द्वारे <ph name="HELPER_NAME"/> सह आपल्या स्क्रीनचे सामायिकरण नियंत्रण.</translation>
 <translation id="7864539943188674973">Bluetooth अक्षम करा</translation>
 <translation id="939252827960237676">स्क्रीनशॉट जतन करण्यात अयशस्वी</translation>
+<translation id="9080206825613744995">मायक्रोफोन वापरात आहे.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">अद्यतनासाठी पुनर्प्रारंभ करा</translation>
 <translation id="2268813581635650749">सर्व साइन आउट करा</translation>
index 6a4b4f5..c0c45bc 100644 (file)
@@ -56,6 +56,7 @@ Tekan Shift + Alt untuk menukar.</translation>
 <translation id="4628814525959230255">Berkongsi kawalan skrin anda dengan <ph name="HELPER_NAME"/> melalui Hangouts.</translation>
 <translation id="7864539943188674973">Lumpuhkan Bluetooth</translation>
 <translation id="939252827960237676">Gagal menyimpan tangkapan skrin</translation>
+<translation id="9080206825613744995">Mikrofon sedang digunakan.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Mulakan semula untuk mengemas kini</translation>
 <translation id="2268813581635650749">Log keluar semua</translation>
index 43bfd8e..53e17da 100644 (file)
@@ -56,6 +56,7 @@ Druk op Shift + Alt om te schakelen.j</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="9080206825613744995">Microfoon wordt gebruikt.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Opnieuw starten om updates uit te voeren</translation>
 <translation id="2268813581635650749">Alle gebruikers uitloggen</translation>
index 0323663..027ab8f 100644 (file)
@@ -35,7 +35,7 @@
 <translation id="2248649616066688669">Du kan fortsette å bruke Chromebooken din mens den er tilkoblet en ekstern skjerm, selv når du lukker lokket.</translation>
 <translation id="40400351611212369">Nettverksaktiveringsfeil</translation>
 <translation id="4237016987259239829">Feil i nettverkstilkobling</translation>
-<translation id="2946640296642327832">Aktiver Bluetooth</translation>
+<translation id="2946640296642327832">Aktivér Bluetooth</translation>
 <translation id="6459472438155181876">Utvider skjermen til <ph name="DISPLAY_NAME"/></translation>
 <translation id="8206859287963243715">Mobil</translation>
 <translation id="6596816719288285829">IP-adresse</translation>
@@ -57,6 +57,7 @@ Trykk på Shift + Alt for å bytte.</translation>
 <translation id="4628814525959230255">Deling av skjermkontrollen din med <ph name="HELPER_NAME"/> via Hangouts.</translation>
 <translation id="7864539943188674973">Deaktiver Bluetooth</translation>
 <translation id="939252827960237676">Lagringen av skjermdumpen mislyktes</translation>
+<translation id="9080206825613744995">Mikrofonen er i bruk.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Start på nytt for å oppdatere</translation>
 <translation id="2268813581635650749">Logg alle av</translation>
@@ -78,7 +79,7 @@ Trykk på Shift + Alt for å bytte.</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="4957722034734105353">Les mer</translation>
 <translation id="2964193600955408481">Deaktiver Wi-Fi</translation>
 <translation id="4279490309300973883">Speiling</translation>
 <translation id="7973962044839454485">PPP-autentiseringen mislyktes på grunn av feil brukernavn eller passord</translation>
@@ -154,7 +155,7 @@ Trykk på Shift + Alt for å bytte.</translation>
 <translation id="1882897271359938046">Speiler <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">Tilkoblet laveffektslader. Batteriladingen kan være upålitelig.</translation>
 <translation id="3784455785234192852">Lås</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Apper</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>
@@ -163,7 +164,7 @@ Trykk på Shift + Alt for å bytte.</translation>
 <translation id="2966449113954629791">Du kan ha brukt opp mobildatakvoten din. Gå til aktiveringsportalen for <ph name="NAME"/> for å kjøpe mer data.</translation>
 <translation id="742594950370306541">Kameraet er i bruk.</translation>
 <translation id="8132793192354020517">Tilkoblet <ph name="NAME"/></translation>
-<translation id="7052914147756339792">Angi bakgrunnsbilde</translation>
+<translation id="7052914147756339792">Angi bakgrunn</translation>
 <translation id="8678698760965522072">Tilkoblet tilstand</translation>
 <translation id="2532589005999780174">Høykontrastmodus</translation>
 <translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
@@ -209,7 +210,7 @@ Tjenermelding: <ph name="SERVER_MSG"/></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="5958529069007801266">Administrert 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>
index 8bd5c78..e5fd76c 100644 (file)
@@ -56,6 +56,7 @@ Naciśnij Shift + Alt, by ją przełączyć.</translation>
 <translation id="4628814525959230255">Udostępniasz ekran w Hangouts – <ph name="HELPER_NAME"/> kontroluje Twój komputer.</translation>
 <translation id="7864539943188674973">Wyłącz Bluetooth</translation>
 <translation id="939252827960237676">Nie można zapisać zrzutu ekranu</translation>
+<translation id="9080206825613744995">Mikrofon jest używany.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Uruchom ponownie i zaktualizuj</translation>
 <translation id="2268813581635650749">Wyloguj wszystkich</translation>
index 5f8d52e..154c05b 100644 (file)
@@ -35,7 +35,7 @@
 <translation id="2248649616066688669">Você pode continuar usando o Chromebook enquanto estiver conectado a uma tela externa, mesmo com a tampa fechada.</translation>
 <translation id="40400351611212369">Erro de ativação de rede</translation>
 <translation id="4237016987259239829">Erro de conexão da rede</translation>
-<translation id="2946640296642327832">Ativar bluetooth</translation>
+<translation id="2946640296642327832">Ativar Bluetooth</translation>
 <translation id="6459472438155181876">Estendendo tela para <ph name="DISPLAY_NAME"/></translation>
 <translation id="8206859287963243715">Celular</translation>
 <translation id="6596816719288285829">Endereço IP</translation>
@@ -56,6 +56,7 @@ Pressione Shift + Alt para alternar.</translation>
 <translation id="4628814525959230255">Compartilhando o controle de sua tela com <ph name="HELPER_NAME"/> por meio do Hangouts.</translation>
 <translation id="7864539943188674973">Desativar bluetooth</translation>
 <translation id="939252827960237676">Falha ao salvar a captura de tela</translation>
+<translation id="9080206825613744995">O microfone está sendo usado.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Reiniciar para atualizar</translation>
 <translation id="2268813581635650749">Desconectar todos</translation>
index 485e839..b91bab8 100644 (file)
@@ -56,6 +56,7 @@ Prima Shift + Alt para mudar.</translation>
 <translation id="4628814525959230255">Partilhar o controlo do seu ecrã com <ph name="HELPER_NAME"/> através do Hangouts.</translation>
 <translation id="7864539943188674973">Desativar Bluetooth</translation>
 <translation id="939252827960237676">Não foi possível guardar a captura de ecrã</translation>
+<translation id="9080206825613744995">O microfone está a ser utilizado.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Reiniciar para atualizar</translation>
 <translation id="2268813581635650749">Terminar sessão de todos</translation>
@@ -82,7 +83,7 @@ Prima Shift + Alt para mudar.</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="3892641579809465218">Ecrã interno</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="3606978283550408104">Visualização em braille ligada.</translation>
@@ -121,7 +122,7 @@ Prima Shift + Alt para mudar.</translation>
 <translation id="583281660410589416">Desconhecido</translation>
 <translation id="1383876407941801731">Pesquisar</translation>
 <translation id="3901991538546252627">A ligar a <ph name="NAME"/></translation>
-<translation id="2204305834655267233">Informações da Rede</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="8308637677604853869">Menu anterior</translation>
@@ -183,7 +184,7 @@ Prima Shift + Alt para mudar.</translation>
 <translation id="225680501294068881">A procurar dispositivos...</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY"/>, <ph name="DATE"/></translation>
 <translation id="737451040872859086">Microfone (interno)</translation>
-<translation id="4448844063988177157">A pesquisar redes Wi-Fi...</translation>
+<translation id="4448844063988177157">A procurar redes Wi-Fi...</translation>
 <translation id="8401662262483418323">A ligação a &quot;<ph name="NAME"/>&quot; falhou: <ph name="DETAILS"/>
 Mensagem do servidor: <ph name="SERVER_MSG"/></translation>
 <translation id="2475982808118771221">Ocorreu um erro</translation>
@@ -201,7 +202,7 @@ Mensagem do servidor: <ph name="SERVER_MSG"/></translation>
 <translation id="6452181791372256707">Rejeitar</translation>
 <translation id="1195412055398077112">overscan</translation>
 <translation id="607652042414456612">O seu computador é detetável para os dispositivos Bluetooth nas proximidades e aparecerá como &quot;<ph name="NAME"/>&quot; com o endereço <ph name="ADDRESS"/></translation>
-<translation id="112308213915226829">Ocultar automaticamente a prateleira</translation>
+<translation id="112308213915226829">Ocultar prateleira automaticamente</translation>
 <translation id="6732801395666424405">Certificados não carregados</translation>
 <translation id="7573962313813535744">Modo ancorado</translation>
 <translation id="8927026611342028580">Ligação Solicitada</translation>
@@ -249,7 +250,7 @@ Prima Alt + Pesquisar ou Shift para cancelar.</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="6911468394164995108">Aderir a outra...</translation>
+<translation id="6911468394164995108">Ligar-se a outra...</translation>
 <translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
 <translation id="2563856802393254086">Parabéns! O serviço de dados &quot;<ph name="NAME"/>&quot; foi ativado e está pronto a funcionar.</translation>
 <translation id="412065659894267608"><ph name="HOUR"/>h <ph name="MINUTE"/>m até ficar completa</translation>
index 68799df..69fb9c2 100644 (file)
@@ -28,7 +28,7 @@
 <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="6943836128787782965">Metoda GET a protocolului HTTP nu a reușit</translation>
 <translation id="2297568595583585744">Bara de stare</translation>
 <translation id="1661867754829461514">Codul PIN lipsește</translation>
 <translation id="4508225577814909926"><ph name="NAME"/>: se conectează...</translation>
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">În prezent, <ph name="HELPER_NAME"/> vă poate controla ecranul prin intermediul Hangouts.</translation>
 <translation id="7864539943188674973">Dezactivați Bluetooth</translation>
 <translation id="939252827960237676">Captura de ecran nu a putut fi salvată.</translation>
+<translation id="9080206825613744995">Microfonul este în uz.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Reporniți pentru a actualiza</translation>
 <translation id="2268813581635650749">Deconectați toți utilizatorii</translation>
@@ -75,7 +76,7 @@
 <translation id="2963773877003373896">mod3</translation>
 <translation id="5222676887888702881">Deconectați-vă</translation>
 <translation id="2391579633712104609">180°</translation>
-<translation id="2688477613306174402">Configurare</translation>
+<translation id="2688477613306174402">Configurație</translation>
 <translation id="1272079795634619415">Opriți</translation>
 <translation id="4957722034734105353">Aflați mai multe...</translation>
 <translation id="2964193600955408481">Dezactivați Wi-Fi</translation>
@@ -84,7 +85,7 @@
 <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="3368922792935385530">Conectată</translation>
 <translation id="3606978283550408104">Afișajul Braille este conectat.</translation>
 <translation id="8654520615680304441">Activați Wi-Fi...</translation>
 <translation id="6650933572246256093">Dispozitivul Bluetooth „<ph name="DEVICE_NAME"/>” solicită permisiunea de a se conecta. Introduceți această parolă pe dispozitivul respectiv: <ph name="PASSKEY"/></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="4430019312045809116">Volum</translation>
-<translation id="4442424173763614572">Căutarea DNS a eșuat</translation>
+<translation id="4442424173763614572">Căutarea DNS nu a reușit</translation>
 <translation id="7874779702599364982">Se caută rețele mobile...</translation>
 <translation id="583281660410589416">Necunoscut</translation>
-<translation id="1383876407941801731">Căutare</translation>
+<translation id="1383876407941801731">Căutați</translation>
 <translation id="3901991538546252627">Se conectează la <ph name="NAME"/></translation>
 <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="1346748346194534595">Dreapta</translation>
 <translation id="1773212559869067373">Certificatul de autentificare a fost respins local</translation>
 <translation id="8528322925433439945">Rețele mobile...</translation>
-<translation id="7049357003967926684">Asociație</translation>
+<translation id="7049357003967926684">Asociere</translation>
 <translation id="8428213095426709021">Setări</translation>
 <translation id="2372145515558759244">Se sincronizează aplicațiile...</translation>
 <translation id="7256405249507348194">Eroare nerecunoscută: <ph name="DESC"/></translation>
 <translation id="1987317783729300807">Conturi</translation>
 <translation id="2894654529758326923">Informații</translation>
-<translation id="7925247922861151263">Verificarea AAA a eșuat</translation>
-<translation id="8456362689280298700">Se încarcă în: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
+<translation id="7925247922861151263">Verificarea AAA nu a reușit</translation>
+<translation id="8456362689280298700"><ph name="HOUR"/>:<ph name="MINUTE"/> până la baterie plină</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="6312403991423642364">Eroare de rețea necunoscută</translation>
 <translation id="1467432559032391204">Stânga</translation>
 <translation id="1882897271359938046">Se oglindește pe <ph name="DISPLAY_NAME"/></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="1512064327686280138">Activare nereușită</translation>
+<translation id="2805756323405976993">Aplicații</translation>
+<translation id="1512064327686280138">Eroare la activare</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>
 <translation id="2872961005593481000">Închideți</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>
-<translation id="7005812687360380971">Eşec</translation>
+<translation id="7005812687360380971">Eroare</translation>
 <translation id="882279321799040148">Dați clic pentru afișare</translation>
 <translation id="1753067873202720523">Chromebookul nu se poate încărca dacă este pornit.</translation>
 <translation id="7561014039265304140"><ph name="DISPLAY_NAME"/> nu acceptă <ph name="SPECIFIED_RESOLUTION"/>. Rezoluția a fost modificată la <ph name="FALLBACK_RESOLUTION"/></translation>
@@ -205,7 +206,7 @@ Mesaj server: <ph name="SERVER_MSG"/></translation>
 <translation id="6732801395666424405">Certificatele nu s-au încărcat</translation>
 <translation id="7573962313813535744">Modul andocat</translation>
 <translation id="8927026611342028580">Conectare solicitată</translation>
-<translation id="8300849813060516376">OTASP a eșuat</translation>
+<translation id="8300849813060516376">OTASP nu a reușit</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>
@@ -225,11 +226,11 @@ Apăsați Căutare sau Shift pentru a anula.</translation>
 <translation id="158849752021629804">Este necesară rețeaua de domiciliu</translation>
 <translation id="1013923882670373915">Dispozitivul Bluetooth „<ph name="DEVICE_NAME"/>” solicită permisiunea de a se conecta. Introduceți acest cod PIN pe dispozitivul respectiv: <ph name="PINCODE"/></translation>
 <translation id="6857811139397017780">Activați <ph name="NETWORKSERVICE"/></translation>
-<translation id="5864471791310927901">Căutarea DHCP a eșuat</translation>
+<translation id="5864471791310927901">Căutarea DHCP nu a reușit</translation>
 <translation id="2819276065543622893">Veți fi deconectat(ă) acum.</translation>
 <translation id="5507786745520522457">Configurați datele mobile</translation>
 <translation id="6165508094623778733">Aflați mai multe</translation>
-<translation id="9046895021617826162">Conectarea a eșuat</translation>
+<translation id="9046895021617826162">Conectare nereușită</translation>
 <translation id="7168224885072002358">Se revine la rezoluția anterioară în <ph name="TIMEOUT_SECONDS"/></translation>
 <translation id="743058460480092004">Camera foto și microfonul sunt în uz.</translation>
 <translation id="8372369524088641025">Cheie WEP greșită</translation>
index 9db6b90..21f80d7 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Доступ к экрану для <ph name="HELPER_NAME"/> в Hangouts.</translation>
 <translation id="7864539943188674973">Отключить Bluetooth</translation>
 <translation id="939252827960237676">Не удалось сохранить скриншот</translation>
+<translation id="9080206825613744995">Микрофон используется</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Перезагрузите, чтобы обновить</translation>
 <translation id="2268813581635650749">Выйти из всех аккаунтов</translation>
index 1105cc6..2b2fa8d 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Zdieľanie ovládania obrazovky s používateľom <ph name="HELPER_NAME"/> prostredníctvom služby Hangouts.</translation>
 <translation id="7864539943188674973">Zakázať rozhranie Bluetooth</translation>
 <translation id="939252827960237676">Uloženie snímky obrazovky zlyhalo.</translation>
+<translation id="9080206825613744995">Mikrofón sa používa.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Reštartovaním vykonáte aktualizáciu</translation>
 <translation id="2268813581635650749">Odhlásiť všetkých</translation>
index d724119..cb24ff7 100644 (file)
@@ -56,6 +56,7 @@ Pritisnite Shift + Alt, da ga preklopite.</translation>
 <translation id="4628814525959230255">Skupni nadzor zaslona z osebo <ph name="HELPER_NAME"/> prek klepetalnic Hangouts.</translation>
 <translation id="7864539943188674973">Onemogoči Bluetooth</translation>
 <translation id="939252827960237676">Posnetka zaslona ni bilo mogoče shraniti</translation>
+<translation id="9080206825613744995">Mikrofon je v uporabi.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Znova zaženite za posodobitev</translation>
 <translation id="2268813581635650749">Odjava vseh</translation>
index b3eb49c..0597112 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Контрола над екраном се дели са корисником <ph name="HELPER_NAME"/> преко Hangouts-а.</translation>
 <translation id="7864539943188674973">Онемогући Bluetooth</translation>
 <translation id="939252827960237676">Чување снимка екрана није успело</translation>
+<translation id="9080206825613744995">Микрофон се користи.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Покрените поново да бисте ажурирали</translation>
 <translation id="2268813581635650749">Одјави све</translation>
 <translation id="1882897271359938046">Пресликавање у <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">Уређај је укључен у пуњач мале снаге. Пуњење батерије можда неће бити поуздано.</translation>
 <translation id="3784455785234192852">Закључај</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Апликације</translation>
 <translation id="1512064327686280138">Активација није успела</translation>
 <translation id="5097002363526479830">Повезивање са мрежом „<ph name="NAME"/>“ није успело: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi је искључен.</translation>
index 87387cf..1d1c93a 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Delar kontrollen över din skärm med <ph name="HELPER_NAME"/> via Hangouts.</translation>
 <translation id="7864539943188674973">Inaktivera Bluetooth</translation>
 <translation id="939252827960237676">Det gick inte att spara skärmdumpen</translation>
+<translation id="9080206825613744995">Mikrofonen används.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Starta om för att uppdatera</translation>
 <translation id="2268813581635650749">Logga ut alla</translation>
 <translation id="1882897271359938046">Spegling av <ph name="DISPLAY_NAME"/></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">Apps</translation>
+<translation id="2805756323405976993">Appar</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>
index 9ad68a0..b9864b1 100644 (file)
@@ -56,6 +56,7 @@ Bonyeza Shift + Alt ili kubadilisha.</translation>
 <translation id="4628814525959230255">Inashiriki udhibiti wa skrini yako na <ph name="HELPER_NAME"/> kupitia Hangouts.</translation>
 <translation id="7864539943188674973">Lemaza Bluetooth</translation>
 <translation id="939252827960237676">Imeshindwa kuhifadhi picha ya skrini</translation>
+<translation id="9080206825613744995">Maikrofoni inatumika</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Anzisha upya ili kusasisha</translation>
 <translation id="2268813581635650749">Ondoa wote</translation>
index a0e262b..8d4a15e 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Hangouts வழியாக <ph name="HELPER_NAME"/> உடன் உங்கள் திரையின் கட்டுப்பாட்டைப் பகிர்கிறது.</translation>
 <translation id="7864539943188674973">புளூடூத்தை முடக்கு</translation>
 <translation id="939252827960237676">ஸ்கிரீன் ஷாட்டை சேமிப்பதில் தோல்வி</translation>
+<translation id="9080206825613744995">மைக்ரோஃபோன் பயன்பாட்டில் உள்ளது.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">புதுப்பிக்க மீண்டும் தொடங்குக</translation>
 <translation id="2268813581635650749">அனைவரையும் வெளியேற்று</translation>
index 9d973bf..638a55b 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">మీ స్క్రీన్ యొక్క నియంత్రణ Hangouts ద్వారా <ph name="HELPER_NAME"/>తో భాగస్వామ్యం చేయబడుతోంది.</translation>
 <translation id="7864539943188674973">Bluetoothని నిలిపివేయి</translation>
 <translation id="939252827960237676">స్క్రీన్‌షాట్‌ను సేవ్ చేయడంలో విఫలమైంది</translation>
+<translation id="9080206825613744995">మైక్రోఫోన్ ఉపయోగంలో ఉంది.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">నవీకరించడానికి పునఃప్రారంభించండి</translation>
 <translation id="2268813581635650749">అందరినీ సైన్ అవుట్ చేయి</translation>
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/>కు దర్పణం చేస్తోంది</translation>
 <translation id="2727977024730340865">తక్కువ-పవర్ గల ఛార్జర్‌కు ప్లగిన్ చేయబడింది. బ్యాటరీ ఛార్జింగ్ విశ్వసనీయంగా ఉండకపోవచ్చు.</translation>
 <translation id="3784455785234192852">లాక్ చేయి</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">యాప్స్</translation>
 <translation id="1512064327686280138">సక్రియా విఫలం</translation>
 <translation id="5097002363526479830">'<ph name="NAME"/>'కు నెట్‌వర్క్‌కు కనెక్ట్ చేయడానికి విఫలమైంది: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi నిలిపివేయబడింది.</translation>
index c9638a0..d640760 100644 (file)
@@ -12,7 +12,7 @@
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> หมุนเวียนเป็น <ph name="ROTATION"/></translation>
 <translation id="9074739597929991885">บลูทูธ</translation>
 <translation id="2268130516524549846">ปิดใช้งานบลูทูธแล้ว</translation>
-<translation id="6713285437468012787">อุà¸\9bà¸\81รà¸\93à¹\8cà¸\9aลูà¸\97ูà¸\98 &quot;<ph name="DEVICE_NAME"/>&quot; à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\9aà¸\84ูà¹\88à¹\81ละà¸\82à¸\93ะà¸\99ีà¹\89à¸\9eรà¹\89อมà¹\83หà¹\89à¸\9aริà¸\81ารà¹\81à¸\81à¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ุà¸\81à¸\84à¸\99à¹\81ลà¹\89ว à¸\84ุà¸\93สามารà¸\96à¸\99ำออà¸\81การจับคู่นี้โดยใช้การตั้งค่า</translation>
+<translation id="6713285437468012787">อุà¸\9bà¸\81รà¸\93à¹\8cà¸\9aลูà¸\97ูà¸\98 &quot;<ph name="DEVICE_NAME"/>&quot; à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\9aà¸\84ูà¹\88à¹\81ละà¸\82à¸\93ะà¸\99ีà¹\89à¸\9eรà¹\89อมà¹\83หà¹\89à¸\9aริà¸\81ารà¹\81à¸\81à¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ุà¸\81à¸\84à¸\99à¹\81ลà¹\89ว à¸\84ุà¸\93สามารà¸\96ลà¸\9aการจับคู่นี้โดยใช้การตั้งค่า</translation>
 <translation id="7165320105431587207">ล้มเหลวในการกำหนดค่าเครือข่าย</translation>
 <translation id="3775358506042162758">คุณสามารถมีได้มากสุดสามบัญชีเท่านั้นในการลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี</translation>
 <translation id="370649949373421643">เปิดใช้งาน Wi-Fi</translation>
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">กำลังแชร์การควบคุมหน้าจอของคุณด้วย <ph name="HELPER_NAME"/> ผ่านแฮงเอาท์</translation>
 <translation id="7864539943188674973">ปิดใช้งานบลูทูธ</translation>
 <translation id="939252827960237676">ไม่สามารถบันทึกภาพหน้าจอ</translation>
+<translation id="9080206825613744995">ใช้ไมโครโฟนอยู่</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">รีสตาร์ทเพื่ออัปเดต</translation>
 <translation id="2268813581635650749">ออกจากระบบทั้งหมด</translation>
 <translation id="1882897271359938046">กำลังแสดงผลไปที่ <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">เสียบอยู่กับที่ชาร์จพลังงานต่ำ การชาร์จแบตเตอรี่อาจไม่น่าเชื่อถือ</translation>
 <translation id="3784455785234192852">ล็อก</translation>
-<translation id="2805756323405976993">แอปพลิเคชัน</translation>
+<translation id="2805756323405976993">แอป</translation>
 <translation id="1512064327686280138">การเปิดใช้งานล้มเหลว</translation>
 <translation id="5097002363526479830">ไม่สามารถเชื่อมต่อเครือข่าย &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">WiFi ปิดอยู่</translation>
index a2915ff..e77dc14 100644 (file)
@@ -56,6 +56,7 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın.</translation>
 <translation id="4628814525959230255">Ekranınızın denetimi Hangouts üzerinden <ph name="HELPER_NAME"/> ile paylaşılıyor.</translation>
 <translation id="7864539943188674973">Bluetooth'u devre dışı bırak</translation>
 <translation id="939252827960237676">Ekran görüntüsü kaydedilemedi</translation>
+<translation id="9080206825613744995">Mikrofon kullanımda.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Güncellemek için yeniden başlat</translation>
 <translation id="2268813581635650749">Tüm kullanıcıların oturumunu kapat</translation>
index c76054b..a37f8d6 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">Спільний доступ до екрана для користувача <ph name="HELPER_NAME"/> через Hangouts.</translation>
 <translation id="7864539943188674973">Вимкнути Bluetooth</translation>
 <translation id="939252827960237676">Не вдалося зберегти знімок екрана</translation>
+<translation id="9080206825613744995">Мікрофон використовується.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Перезапустіть, щоб оновити</translation>
 <translation id="2268813581635650749">Вийти з усіх облікових записів</translation>
index 96f6125..5b4870a 100644 (file)
@@ -56,6 +56,7 @@ Nhấn Shift + Alt để chuyển đổi.</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="7864539943188674973">Tắt bluetooth</translation>
 <translation id="939252827960237676">Không lưu được ảnh chụp màn hình</translation>
+<translation id="9080206825613744995">Micrô đang được sử dụng.</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">Khởi động lại để cập nhật</translation>
 <translation id="2268813581635650749">Đăng xuất tất cả</translation>
index 73b6314..4247807 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">通过环聊与<ph name="HELPER_NAME"/>共享您屏幕的控制权。</translation>
 <translation id="7864539943188674973">停用蓝牙</translation>
 <translation id="939252827960237676">无法保存屏幕截图</translation>
+<translation id="9080206825613744995">麦克风目前处于使用状态。</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">重新启动以进行更新</translation>
 <translation id="2268813581635650749">全部退出</translation>
 <translation id="520760366042891468">通过环聊共享您屏幕的控制权。</translation>
 <translation id="8000066093800657092">未连接任何网络</translation>
 <translation id="4015692727874266537">登录其他帐户…</translation>
-<translation id="6911468394164995108">连接其他...</translation>
+<translation id="6911468394164995108">连接其他网络...</translation>
 <translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>:<ph name="ANNOTATION"/></translation>
 <translation id="2563856802393254086">恭喜!“<ph name="NAME"/>”数据服务已激活,您可以开始使用了。</translation>
 <translation id="412065659894267608">还需要 <ph name="HOUR"/> 小时 <ph name="MINUTE"/> 分钟才能充满电</translation>
index 048f34f..41cdffb 100644 (file)
@@ -56,6 +56,7 @@
 <translation id="4628814525959230255">透過 Hangouts 與 <ph name="HELPER_NAME"/> 分享螢幕控制權。</translation>
 <translation id="7864539943188674973">停用藍牙</translation>
 <translation id="939252827960237676">無法儲存螢幕擷取畫面</translation>
+<translation id="9080206825613744995">麥克風正在使用中。</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME"/> (USB)</translation>
 <translation id="3126069444801937830">重新啟用即可更新</translation>
 <translation id="2268813581635650749">登出所有使用者</translation>
index 63eadf1..a19a713 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.h"
 
+#include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/system/status_area_widget.h"
 #include "ui/views/controls/button/image_button.h"
 
 namespace ash {
-namespace {
-
-class VirtualKeyboardButton : public views::ImageButton {
- public:
-  VirtualKeyboardButton(views::ButtonListener* listener);
-  virtual ~VirtualKeyboardButton();
-
-  // Overridden from views::ImageButton:
-  virtual gfx::Size GetPreferredSize() const OVERRIDE;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardButton);
-};
-
-VirtualKeyboardButton::VirtualKeyboardButton(views::ButtonListener* listener)
-    : views::ImageButton(listener) {
-}
-
-VirtualKeyboardButton::~VirtualKeyboardButton() {
-}
-
-gfx::Size VirtualKeyboardButton::GetPreferredSize() const {
-  const int virtual_keyboard_button_height = kShelfSize;
-  gfx::Size size = ImageButton::GetPreferredSize();
-  int padding = virtual_keyboard_button_height - size.height();
-  size.set_height(virtual_keyboard_button_height);
-  size.set_width(size.width() + padding);
-  return size;
-}
-
-}  // namespace
 
 VirtualKeyboardTray::VirtualKeyboardTray(StatusAreaWidget* status_area_widget)
     : TrayBackgroundView(status_area_widget),
       button_(NULL) {
-  button_ = new VirtualKeyboardButton(this);
+  button_ = new views::ImageButton(this);
   button_->SetImage(views::CustomButton::STATE_NORMAL,
                     ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
                         IDR_AURA_UBER_TRAY_VIRTUAL_KEYBOARD));
@@ -82,6 +52,30 @@ VirtualKeyboardTray::~VirtualKeyboardTray() {
 void VirtualKeyboardTray::SetShelfAlignment(ShelfAlignment alignment) {
   TrayBackgroundView::SetShelfAlignment(alignment);
   tray_container()->SetBorder(views::Border::NullBorder());
+
+  // Pad button size to align with other controls in the system tray.
+  const gfx::ImageSkia image = button_->GetImage(
+      views::CustomButton::STATE_NORMAL);
+  int top_padding = (kTrayBarButtonWidth - image.height()) / 2;
+  int left_padding = (kTrayBarButtonWidth - image.width()) / 2;
+  int bottom_padding = kTrayBarButtonWidth - image.height() - top_padding;
+  int right_padding = kTrayBarButtonWidth - image.width() - left_padding;
+
+  // Square up the padding if horizontally aligned. Avoid extra padding when
+  // vertically aligned as the button would violate the width constraint on the
+  // shelf.
+  if (alignment == SHELF_ALIGNMENT_BOTTOM || alignment == SHELF_ALIGNMENT_TOP) {
+    gfx::Insets insets = button_->GetInsets();
+    int additional_padding = std::max(0, top_padding - left_padding);
+    left_padding += additional_padding;
+    right_padding += additional_padding;
+  }
+
+  button_->SetBorder(views::Border::CreateEmptyBorder(
+      top_padding,
+      left_padding,
+      bottom_padding,
+      right_padding));
 }
 
 base::string16 VirtualKeyboardTray::GetAccessibleNameForTray() {
index bcf04a2..f4b75bc 100644 (file)
@@ -548,9 +548,13 @@ gfx::Rect TrayBackgroundView::GetBubbleAnchorRect(
       } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_LEFT) {
         rect.Inset(0, 0, kBubblePaddingVerticalSide + 4,
                    kBubblePaddingVerticalBottom);
-      } else {
+      } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT) {
         rect.Inset(kBubblePaddingVerticalSide, 0, 0,
                    kBubblePaddingVerticalBottom);
+      } else {
+        // TODO(bruthig) May need to handle other ANCHOR_ALIGNMENT_ values.
+        // ie. ANCHOR_ALIGNMENT_TOP
+        DCHECK(false) << "Unhandled anchor alignment.";
       }
     } else if (anchor_type == TrayBubbleView::ANCHOR_TYPE_BUBBLE) {
       // Invert the offsets to align with the bubble below.
@@ -562,21 +566,48 @@ gfx::Rect TrayBackgroundView::GetBubbleAnchorRect(
         rect.Inset(vertical_alignment, 0, 0, horizontal_alignment);
       else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT)
         rect.Inset(0, 0, vertical_alignment, horizontal_alignment);
+    } else {
+      DCHECK(false) << "Unhandled anchor type.";
     }
-  }
-
-  // TODO(jennyz): May need to add left/right alignment in the following code.
-  if (rect.IsEmpty()) {
+  } else {
     aura::Window* target_root = anchor_widget ?
         anchor_widget->GetNativeView()->GetRootWindow() :
         Shell::GetPrimaryRootWindow();
     rect = target_root->bounds();
-    rect = gfx::Rect(
-        base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreenBottomAlignment :
-        rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment,
-        rect.height() - kPaddingFromBottomOfScreenBottomAlignment,
-        0, 0);
-    rect = ScreenUtil::ConvertRectToScreen(target_root, rect);
+    if (anchor_type == TrayBubbleView::ANCHOR_TYPE_TRAY) {
+      if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM) {
+        rect = gfx::Rect(
+            base::i18n::IsRTL() ?
+            kPaddingFromRightEdgeOfScreenBottomAlignment :
+            rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment,
+            rect.height() - kPaddingFromBottomOfScreenBottomAlignment,
+            0, 0);
+        rect = ScreenUtil::ConvertRectToScreen(target_root, rect);
+      } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_LEFT) {
+        rect = gfx::Rect(
+            kPaddingFromRightEdgeOfScreenBottomAlignment,
+            rect.height() - kPaddingFromBottomOfScreenBottomAlignment,
+            1, 1);
+        rect = ScreenUtil::ConvertRectToScreen(target_root, rect);
+      } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT) {
+        rect = gfx::Rect(
+            rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment,
+            rect.height() - kPaddingFromBottomOfScreenBottomAlignment,
+            1, 1);
+        rect = ScreenUtil::ConvertRectToScreen(target_root, rect);
+      } else {
+        // TODO(bruthig) May need to handle other ANCHOR_ALIGNMENT_ values.
+        // ie. ANCHOR_ALIGNMENT_TOP
+        DCHECK(false) << "Unhandled anchor alignment.";
+      }
+    } else {
+      rect = gfx::Rect(
+          base::i18n::IsRTL() ?
+          kPaddingFromRightEdgeOfScreenBottomAlignment :
+          rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment,
+          rect.height() - kPaddingFromBottomOfScreenBottomAlignment,
+          0, 0);
+    }
   }
   return rect;
 }
index ddfae38..40a3f48 100644 (file)
@@ -174,10 +174,7 @@ void AddUserView::AddContent() {
 
   add_user_ = new views::View;
   add_user_->SetBorder(views::Border::CreateEmptyBorder(
-      kTrayPopupUserCardVerticalPadding,
-      kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset,
-      kTrayPopupUserCardVerticalPadding,
-      kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset));
+      0, kTrayUserTileHoverBorderInset, 0, 0));
 
   add_user_->SetLayoutManager(new views::BoxLayout(
       views::BoxLayout::kHorizontal, 0, 0, kTrayPopupPaddingBetweenItems));
index 09a46af..ebb0698 100644 (file)
@@ -16,6 +16,7 @@
 #include "ash/wm/session_state_animator.h"
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
+#include "base/strings/string_util.h"
 #include "base/timer/timer.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/compositor/layer_animation_sequence.h"
@@ -584,8 +585,17 @@ void LockStateController::LockAnimationCancelled() {
 }
 
 void LockStateController::PreLockAnimationFinished(bool request_lock) {
-  can_cancel_lock_animation_ = false;
   VLOG(1) << "PreLockAnimationFinished";
+  can_cancel_lock_animation_ = false;
+
+  // Don't do anything (including starting the lock-fail timer) if the screen
+  // was already locked while the animation was going.
+  if (system_is_locked_) {
+    DCHECK(!request_lock) << "Got request to lock already-locked system "
+                          << "at completion of pre-lock animation";
+    return;
+  }
+
   if (request_lock) {
     Shell::GetInstance()->metrics()->RecordUserMetricsAction(
         shutdown_after_lock_ ?
@@ -594,24 +604,19 @@ void LockStateController::PreLockAnimationFinished(bool request_lock) {
     delegate_->RequestLockScreen();
   }
 
-  int lock_timeout = kLockFailTimeoutMs;
-
+  base::TimeDelta timeout =
+      base::TimeDelta::FromMilliseconds(kLockFailTimeoutMs);
 #if defined(OS_CHROMEOS)
-  std::string board = base::SysInfo::GetLsbReleaseBoard();
-
   // Increase lock timeout for slower hardware, see http://crbug.com/350628
+  const std::string board = base::SysInfo::GetLsbReleaseBoard();
   if (board == "x86-mario" ||
-      board.substr(0, 8) == "x86-alex" ||
-      board.substr(0, 7) == "x86-zgb") {
-    lock_timeout *= 2;
+      StartsWithASCII(board, "x86-alex", true /* case_sensitive */) ||
+      StartsWithASCII(board, "x86-zgb", true /* case_sensitive */)) {
+    timeout *= 2;
   }
 #endif
-
   lock_fail_timer_.Start(
-      FROM_HERE,
-      base::TimeDelta::FromMilliseconds(lock_timeout),
-      this,
-      &LockStateController::OnLockFailTimeout);
+      FROM_HERE, timeout, this, &LockStateController::OnLockFailTimeout);
 }
 
 void LockStateController::PostLockAnimationFinished() {
index a32812a..7d8485f 100644 (file)
@@ -192,6 +192,11 @@ bool MaximizeModeController::IsMaximizeModeWindowManagerEnabled() const {
   return maximize_mode_window_manager_.get() != NULL;
 }
 
+void MaximizeModeController::AddWindow(aura::Window* window) {
+  if (IsMaximizeModeWindowManagerEnabled())
+    maximize_mode_window_manager_->AddWindow(window);
+}
+
 void MaximizeModeController::Shutdown() {
   maximize_mode_window_manager_.reset();
   Shell::GetInstance()->OnMaximizeModeEnded();
index 8445bfa..8c0f719 100644 (file)
@@ -26,6 +26,9 @@ class MaximizeModeControllerTest;
 class MaximizeModeEventBlocker;
 class MaximizeModeWindowManager;
 class MaximizeModeWindowManagerTest;
+namespace test {
+class MultiUserWindowManagerChromeOSTest;
+}
 
 // MaximizeModeController listens to accelerometer events and automatically
 // enters and exits maximize mode when the lid is opened beyond the triggering
@@ -82,6 +85,12 @@ class ASH_EXPORT MaximizeModeController : public AccelerometerObserver,
   // Test if the MaximizeModeWindowManager is enabled or not.
   bool IsMaximizeModeWindowManagerEnabled() const;
 
+  // Add a special window to the MaximizeModeWindowManager for tracking. This is
+  // only required for special windows which are handled by other window
+  // managers like the |MultiUserWindowManager|.
+  // If the maximize mode is not enabled no action will be performed.
+  void AddWindow(aura::Window* window);
+
   // TODO(jonross): move this into the destructor. Currently separated as
   // ShellOberver notifies of maximize mode ending, and the observers end up
   // attempting to access MaximizeModeController via the Shell. If done in
@@ -108,6 +117,7 @@ class ASH_EXPORT MaximizeModeController : public AccelerometerObserver,
  private:
   friend class MaximizeModeControllerTest;
   friend class MaximizeModeWindowManagerTest;
+  friend class test::MultiUserWindowManagerChromeOSTest;
 
   // Detect hinge rotation from |base| and |lid| accelerometers and
   // automatically start / stop maximize mode.
index e434cba..2e9f042 100644 (file)
@@ -54,6 +54,18 @@ int MaximizeModeWindowManager::GetNumberOfManagedWindows() {
   return window_state_map_.size();
 }
 
+void MaximizeModeWindowManager::AddWindow(aura::Window* window) {
+  // Only add the window if it is a direct dependent of a container window
+  // and not yet tracked.
+  if (!ShouldHandleWindow(window) ||
+      window_state_map_.find(window) != window_state_map_.end() ||
+      !IsContainerWindow(window->parent())) {
+    return;
+  }
+
+  MaximizeAndTrackWindow(window);
+}
+
 void MaximizeModeWindowManager::WindowStateDestroyed(aura::Window* window) {
   // At this time ForgetWindow() should already have been called. If not,
   // someone else must have replaced the "window manager's state object".
index 78e4405..0814621 100644 (file)
@@ -42,6 +42,12 @@ class ASH_EXPORT MaximizeModeWindowManager : public aura::WindowObserver,
   // Returns the number of maximized & tracked windows by this manager.
   int GetNumberOfManagedWindows();
 
+  // Adds a window which needs to be maximized. This is used by other window
+  // managers for windows which needs to get tracked due to (upcoming) state
+  // changes.
+  // The call gets ignored if the window was already or should not be handled.
+  void AddWindow(aura::Window* window);
+
   // Called from a window state object when it gets destroyed.
   void WindowStateDestroyed(aura::Window* window);
 
index 99ea37c..8275c97 100644 (file)
@@ -136,7 +136,6 @@ WindowGrid::WindowGrid(aura::Window* root_window,
       continue;
     (*iter)->AddObserver(this);
     observed_windows_.insert(*iter);
-    WindowSelectorItem* item = NULL;
 
     if ((*iter)->type() == ui::wm::WINDOW_TYPE_PANEL &&
         wm::GetWindowState(*iter)->panel_attached()) {
@@ -147,20 +146,12 @@ WindowGrid::WindowGrid(aura::Window* root_window,
         window_list_.push_back(panels_item);
       }
       panels_item->AddWindow(*iter);
-      item = panels_item;
     } else {
-      item = new WindowSelectorWindow(*iter);
-      item->PrepareForOverview();
-      window_list_.push_back(item);
+      window_list_.push_back(new WindowSelectorWindow(*iter));
     }
   }
   if (window_list_.empty())
     return;
-
-  if (panels_item)
-    panels_item->PrepareForOverview();
-
-  PositionWindows(true);
 }
 
 WindowGrid::~WindowGrid() {
@@ -170,6 +161,13 @@ WindowGrid::~WindowGrid() {
   }
 }
 
+void WindowGrid::PrepareForOverview() {
+  for (ScopedVector<WindowSelectorItem>::iterator iter = window_list_.begin();
+       iter != window_list_.end(); ++iter) {
+    (*iter)->PrepareForOverview();
+  }
+}
+
 void WindowGrid::PositionWindows(bool animate) {
   CHECK(!window_list_.empty());
 
index fe4bf78..28af47c 100644 (file)
@@ -51,6 +51,10 @@ class ASH_EXPORT WindowGrid : public aura::WindowObserver {
              WindowSelector* window_selector);
   virtual ~WindowGrid();
 
+  // Prepares the windows in this grid for overview. This will restore all
+  // minimized windows and ensure they are visible.
+  void PrepareForOverview();
+
   // Positions all the windows in the grid.
   void PositionWindows(bool animate);
 
index 467aca6..4c3930c 100644 (file)
@@ -124,6 +124,15 @@ WindowSelector::WindowSelector(const WindowList& windows,
     grid_list_.push_back(grid.release());
   }
 
+  // Do not call PrepareForOverview until all items are added to window_list_ as
+  // we don't want to cause any window updates until all windows in overview
+  // are observed. See http://crbug.com/384495.
+  for (ScopedVector<WindowGrid>::iterator iter = grid_list_.begin();
+       iter != grid_list_.end(); ++iter) {
+    (*iter)->PrepareForOverview();
+    (*iter)->PositionWindows(true);
+  }
+
   DCHECK(!grid_list_.empty());
   UMA_HISTOGRAM_COUNTS_100("Ash.WindowSelector.Items", num_items_);
 
index 054e7f3..a122c06 100644 (file)
@@ -295,4 +295,10 @@ public class ApiCompatibilityUtils {
             return intent.getTargetPackage();
         }
     }
+
+    public static boolean datePickerRequiresAccept() {
+        // TODO(miguelg) use the final code for the L
+        // https://crbug.com/399198
+        return Build.VERSION.SDK_INT <  20; /* CUR_DEVELOPMENT */
+    }
 }
index 408906c..7dc0a23 100644 (file)
@@ -479,14 +479,15 @@ public class Linker {
         if (bundle != null) {
             bundle.setClassLoader(LibInfo.class.getClassLoader());
             clonedBundle = new Bundle(LibInfo.class.getClassLoader());
-            Parcel p = Parcel.obtain();
-            bundle.writeToParcel(p, 0);
-            clonedBundle.readFromParcel(p);
-            p.recycle();
+            Parcel parcel = Parcel.obtain();
+            bundle.writeToParcel(parcel, 0);
+            parcel.setDataPosition(0);
+            clonedBundle.readFromParcel(parcel);
+            parcel.recycle();
         }
         if (DEBUG) {
             Log.i(TAG, "useSharedRelros() called with " + bundle +
-                    ",cloned " + clonedBundle);
+                    ", cloned " + clonedBundle);
         }
         synchronized (Linker.class) {
             // Note that in certain cases, this can be called before
index c46f446..b8ed174 100644 (file)
@@ -14,6 +14,9 @@ namespace base {
 namespace debug {
 
 // Handler to silently dump the current process without crashing.
+// Before calling this function, call SetDumpWithoutCrashingFunction to pass a
+// function pointer, typically chrome!DumpProcessWithoutCrash.  See example code
+// in chrome_main.cc that does this for chrome.dll.
 BASE_EXPORT void DumpWithoutCrashing();
 
 // Sets a function that'll be invoked to dump the current process when
index 8cf79fc..70ce21e 100644 (file)
@@ -281,8 +281,6 @@ char kTSanDefaultSuppressions[] =
 
 // http://crbug.com/374135
 "race:media::AlsaWrapper::PcmWritei\n"
-"deadlock:media::AudioOutputDispatcherImpl::StopStream\n"
-"deadlock:media::AudioStreamHandler::AudioStreamContainer::OnMoreData\n"
 
 // False positive in libc's tzset_internal, http://crbug.com/379738.
 "race:tzset_internal\n"
index 9189b5e..d16ed3e 100644 (file)
@@ -97,6 +97,16 @@ class BASE_EXPORT DiscardableMemory {
   // Create a DiscardableMemory instance with preferred type and |size|.
   static scoped_ptr<DiscardableMemory> CreateLockedMemory(size_t size);
 
+  // Discardable memory implementations might allow an elevated usage level
+  // while in frequent use. Call this to have the usage reduced to the base
+  // level. Returns true if there's no need to call this again until
+  // memory instances have been used. This indicates that all discardable
+  // memory implementations have reduced usage to the base level or below.
+  // Note: calling this too often or while discardable memory is in frequent
+  // use can hurt performance, whereas calling it too infrequently can result
+  // in memory bloat.
+  static bool ReduceMemoryUsage();
+
   // Locks the memory so that it will not be purged by the system. Returns
   // DISCARDABLE_MEMORY_LOCK_STATUS_SUCCESS on success. If the return value is
   // DISCARDABLE_MEMORY_LOCK_STATUS_FAILED then this object should be
index c3de3a3..33d3808 100644 (file)
@@ -32,7 +32,10 @@ size_t GetOptimalAshmemRegionSizeForAllocator() {
 // Holds the shared state used for allocations.
 struct SharedState {
   SharedState()
-      : manager(kAshmemMemoryLimit, kAshmemMemoryLimit),
+      : manager(kAshmemMemoryLimit,
+                kAshmemMemoryLimit,
+                kAshmemMemoryLimit,
+                TimeDelta::Max()),
         allocator(kAshmemAllocatorName,
                   GetOptimalAshmemRegionSizeForAllocator()) {}
 
@@ -54,6 +57,11 @@ void DiscardableMemory::UnregisterMemoryPressureListeners() {
 }
 
 // static
+bool DiscardableMemory::ReduceMemoryUsage() {
+  return internal::DiscardableMemoryEmulated::ReduceMemoryUsage();
+}
+
+// static
 void DiscardableMemory::GetSupportedTypes(
     std::vector<DiscardableMemoryType>* types) {
   const DiscardableMemoryType supported_types[] = {
index 140fdb0..340a181 100644 (file)
 namespace base {
 namespace {
 
-// This is admittedly pretty magical. It's approximately enough memory for four
-// 2560x1600 images.
-const size_t kEmulatedMemoryLimit = 64 * 1024 * 1024;
-const size_t kEmulatedBytesToKeepUnderModeratePressure =
-    kEmulatedMemoryLimit / 4;
+// This is admittedly pretty magical.
+const size_t kEmulatedMemoryLimit = 512 * 1024 * 1024;
+const size_t kEmulatedSoftMemoryLimit = 32 * 1024 * 1024;
+const size_t kEmulatedBytesToKeepUnderModeratePressure = 4 * 1024 * 1024;
+const size_t kEmulatedHardMemoryLimitExpirationTimeMs = 1000;
 
 struct SharedState {
   SharedState()
       : manager(kEmulatedMemoryLimit,
-                kEmulatedBytesToKeepUnderModeratePressure) {}
+                kEmulatedSoftMemoryLimit,
+                kEmulatedBytesToKeepUnderModeratePressure,
+                TimeDelta::FromMilliseconds(
+                    kEmulatedHardMemoryLimitExpirationTimeMs)) {}
 
   internal::DiscardableMemoryManager manager;
 };
@@ -52,6 +55,11 @@ void DiscardableMemoryEmulated::UnregisterMemoryPressureListeners() {
 }
 
 // static
+bool DiscardableMemoryEmulated::ReduceMemoryUsage() {
+  return g_shared_state.Pointer()->manager.ReduceMemoryUsage();
+}
+
+// static
 void DiscardableMemoryEmulated::PurgeForTesting() {
   g_shared_state.Pointer()->manager.PurgeAll();
 }
index 3242245..64e9951 100644 (file)
@@ -21,6 +21,7 @@ class DiscardableMemoryEmulated
 
   static void RegisterMemoryPressureListeners();
   static void UnregisterMemoryPressureListeners();
+  static bool ReduceMemoryUsage();
 
   static void PurgeForTesting();
 
index fbd496d..b9342e9 100644 (file)
@@ -21,6 +21,11 @@ void DiscardableMemory::UnregisterMemoryPressureListeners() {
 }
 
 // static
+bool DiscardableMemory::ReduceMemoryUsage() {
+  return internal::DiscardableMemoryEmulated::ReduceMemoryUsage();
+}
+
+// static
 void DiscardableMemory::GetSupportedTypes(
     std::vector<DiscardableMemoryType>* types) {
   const DiscardableMemoryType supported_types[] = {
index b2982fc..b2184e7 100644 (file)
@@ -25,7 +25,11 @@ namespace {
 const size_t kMacMemoryLimit = 512 * 1024 * 1024;
 
 struct SharedState {
-  SharedState() : manager(kMacMemoryLimit, kMacMemoryLimit) {}
+  SharedState()
+      : manager(kMacMemoryLimit,
+                kMacMemoryLimit,
+                kMacMemoryLimit,
+                TimeDelta::Max()) {}
 
   internal::DiscardableMemoryManager manager;
 };
@@ -166,6 +170,11 @@ void DiscardableMemory::UnregisterMemoryPressureListeners() {
 }
 
 // static
+bool DiscardableMemory::ReduceMemoryUsage() {
+  return internal::DiscardableMemoryEmulated::ReduceMemoryUsage();
+}
+
+// static
 void DiscardableMemory::GetSupportedTypes(
     std::vector<DiscardableMemoryType>* types) {
   const DiscardableMemoryType supported_types[] = {
index 49ecc48..d976da2 100644 (file)
@@ -17,13 +17,17 @@ namespace internal {
 
 DiscardableMemoryManager::DiscardableMemoryManager(
     size_t memory_limit,
-    size_t bytes_to_keep_under_moderate_pressure)
+    size_t soft_memory_limit,
+    size_t bytes_to_keep_under_moderate_pressure,
+    TimeDelta hard_memory_limit_expiration_time)
     : allocations_(AllocationMap::NO_AUTO_EVICT),
-      bytes_allocated_(0),
+      bytes_allocated_(0u),
       memory_limit_(memory_limit),
+      soft_memory_limit_(soft_memory_limit),
       bytes_to_keep_under_moderate_pressure_(
-          bytes_to_keep_under_moderate_pressure) {
-  BytesAllocatedChanged();
+          bytes_to_keep_under_moderate_pressure),
+      hard_memory_limit_expiration_time_(hard_memory_limit_expiration_time) {
+  BytesAllocatedChanged(bytes_allocated_);
 }
 
 DiscardableMemoryManager::~DiscardableMemoryManager() {
@@ -48,7 +52,13 @@ void DiscardableMemoryManager::UnregisterMemoryPressureListener() {
 void DiscardableMemoryManager::SetMemoryLimit(size_t bytes) {
   AutoLock lock(lock_);
   memory_limit_ = bytes;
-  EnforcePolicyWithLockAcquired();
+  PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
+      Now(), memory_limit_);
+}
+
+void DiscardableMemoryManager::SetSoftMemoryLimit(size_t bytes) {
+  AutoLock lock(lock_);
+  soft_memory_limit_ = bytes;
 }
 
 void DiscardableMemoryManager::SetBytesToKeepUnderModeratePressure(
@@ -57,6 +67,16 @@ void DiscardableMemoryManager::SetBytesToKeepUnderModeratePressure(
   bytes_to_keep_under_moderate_pressure_ = bytes;
 }
 
+void DiscardableMemoryManager::SetHardMemoryLimitExpirationTime(
+    TimeDelta hard_memory_limit_expiration_time) {
+  AutoLock lock(lock_);
+  hard_memory_limit_expiration_time_ = hard_memory_limit_expiration_time;
+}
+
+bool DiscardableMemoryManager::ReduceMemoryUsage() {
+  return PurgeIfNotUsedSinceHardLimitCutoffUntilWithinSoftMemoryLimit();
+}
+
 void DiscardableMemoryManager::Register(Allocation* allocation, size_t bytes) {
   AutoLock lock(lock_);
   // A registered memory listener is currently required. This DCHECK can be
@@ -78,7 +98,7 @@ void DiscardableMemoryManager::Unregister(Allocation* allocation) {
     size_t bytes_purgable = info.bytes;
     DCHECK_LE(bytes_purgable, bytes_allocated_);
     bytes_allocated_ -= bytes_purgable;
-    BytesAllocatedChanged();
+    BytesAllocatedChanged(bytes_allocated_);
   }
   allocations_.Erase(it);
 }
@@ -95,6 +115,7 @@ bool DiscardableMemoryManager::AcquireLock(Allocation* allocation,
   if (!info->bytes)
     return false;
 
+  TimeTicks now = Now();
   size_t bytes_required = info->purgable ? 0u : info->bytes;
 
   if (memory_limit_) {
@@ -102,7 +123,8 @@ bool DiscardableMemoryManager::AcquireLock(Allocation* allocation,
     if (bytes_required < memory_limit_)
       limit = memory_limit_ - bytes_required;
 
-    PurgeLRUWithLockAcquiredUntilUsageIsWithin(limit);
+    PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(now,
+                                                                        limit);
   }
 
   // Check for overflow.
@@ -111,9 +133,10 @@ bool DiscardableMemoryManager::AcquireLock(Allocation* allocation,
 
   *purged = !allocation->AllocateAndAcquireLock();
   info->purgable = false;
+  info->last_usage = now;
   if (bytes_required) {
     bytes_allocated_ += bytes_required;
-    BytesAllocatedChanged();
+    BytesAllocatedChanged(bytes_allocated_);
   }
   return true;
 }
@@ -126,14 +149,18 @@ void DiscardableMemoryManager::ReleaseLock(Allocation* allocation) {
   DCHECK(it != allocations_.end());
   AllocationInfo* info = &it->second;
 
+  TimeTicks now = Now();
   allocation->ReleaseLock();
   info->purgable = true;
-  EnforcePolicyWithLockAcquired();
+  info->last_usage = now;
+
+  PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
+      now, memory_limit_);
 }
 
 void DiscardableMemoryManager::PurgeAll() {
   AutoLock lock(lock_);
-  PurgeLRUWithLockAcquiredUntilUsageIsWithin(0);
+  PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(Now(), 0);
 }
 
 bool DiscardableMemoryManager::IsRegisteredForTest(
@@ -159,7 +186,7 @@ void DiscardableMemoryManager::OnMemoryPressure(
     MemoryPressureListener::MemoryPressureLevel pressure_level) {
   switch (pressure_level) {
     case MemoryPressureListener::MEMORY_PRESSURE_MODERATE:
-      Purge();
+      PurgeUntilWithinBytesToKeepUnderModeratePressure();
       return;
     case MemoryPressureListener::MEMORY_PRESSURE_CRITICAL:
       PurgeAll();
@@ -169,21 +196,28 @@ void DiscardableMemoryManager::OnMemoryPressure(
   NOTREACHED();
 }
 
-void DiscardableMemoryManager::Purge() {
+void
+DiscardableMemoryManager::PurgeUntilWithinBytesToKeepUnderModeratePressure() {
   AutoLock lock(lock_);
 
-  PurgeLRUWithLockAcquiredUntilUsageIsWithin(
-      bytes_to_keep_under_moderate_pressure_);
+  PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
+      Now(), bytes_to_keep_under_moderate_pressure_);
 }
 
-void DiscardableMemoryManager::PurgeLRUWithLockAcquiredUntilUsageIsWithin(
-    size_t limit) {
-  TRACE_EVENT1(
-      "base",
-      "DiscardableMemoryManager::PurgeLRUWithLockAcquiredUntilUsageIsWithin",
-      "limit",
-      limit);
+bool DiscardableMemoryManager::
+    PurgeIfNotUsedSinceHardLimitCutoffUntilWithinSoftMemoryLimit() {
+  AutoLock lock(lock_);
+
+  PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
+      Now() - hard_memory_limit_expiration_time_, soft_memory_limit_);
 
+  return bytes_allocated_ <= soft_memory_limit_;
+}
+
+void DiscardableMemoryManager::
+    PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
+        TimeTicks timestamp,
+        size_t limit) {
   lock_.AssertAcquired();
 
   size_t bytes_allocated_before_purging = bytes_allocated_;
@@ -195,7 +229,9 @@ void DiscardableMemoryManager::PurgeLRUWithLockAcquiredUntilUsageIsWithin(
 
     if (bytes_allocated_ <= limit)
       break;
-    if (!info->purgable)
+
+    bool purgable = info->purgable && info->last_usage <= timestamp;
+    if (!purgable)
       continue;
 
     size_t bytes_purgable = info->bytes;
@@ -206,19 +242,21 @@ void DiscardableMemoryManager::PurgeLRUWithLockAcquiredUntilUsageIsWithin(
   }
 
   if (bytes_allocated_ != bytes_allocated_before_purging)
-    BytesAllocatedChanged();
+    BytesAllocatedChanged(bytes_allocated_);
 }
 
-void DiscardableMemoryManager::EnforcePolicyWithLockAcquired() {
-  PurgeLRUWithLockAcquiredUntilUsageIsWithin(memory_limit_);
-}
-
-void DiscardableMemoryManager::BytesAllocatedChanged() const {
-  TRACE_COUNTER_ID1("base", "DiscardableMemoryUsage", this, bytes_allocated_);
+void DiscardableMemoryManager::BytesAllocatedChanged(
+    size_t new_bytes_allocated) const {
+  TRACE_COUNTER_ID1(
+      "base", "DiscardableMemoryUsage", this, new_bytes_allocated);
 
   static const char kDiscardableMemoryUsageKey[] = "dm-usage";
   base::debug::SetCrashKeyValue(kDiscardableMemoryUsageKey,
-                                Uint64ToString(bytes_allocated_));
+                                Uint64ToString(new_bytes_allocated));
+}
+
+TimeTicks DiscardableMemoryManager::Now() const {
+  return TimeTicks::Now();
 }
 
 }  // namespace internal
index 8297b81..a61f141 100644 (file)
@@ -10,6 +10,7 @@
 #include "base/containers/mru_cache.h"
 #include "base/memory/memory_pressure_listener.h"
 #include "base/synchronization/lock.h"
+#include "base/time/time.h"
 
 namespace base {
 namespace internal {
@@ -68,8 +69,10 @@ class BASE_EXPORT_PRIVATE DiscardableMemoryManager {
   typedef DiscardableMemoryManagerAllocation Allocation;
 
   DiscardableMemoryManager(size_t memory_limit,
-                           size_t bytes_to_keep_under_moderate_pressure);
-  ~DiscardableMemoryManager();
+                           size_t soft_memory_limit,
+                           size_t bytes_to_keep_under_moderate_pressure,
+                           TimeDelta hard_memory_limit_expiration_time);
+  virtual ~DiscardableMemoryManager();
 
   // Call this to register memory pressure listener. Must be called on a thread
   // with a MessageLoop current.
@@ -79,13 +82,25 @@ class BASE_EXPORT_PRIVATE DiscardableMemoryManager {
   void UnregisterMemoryPressureListener();
 
   // The maximum number of bytes of memory that may be allocated before we force
-  // a purge. If this amount is zero, it is interpreted as having no limit at
-  // all.
+  // a purge.
   void SetMemoryLimit(size_t bytes);
 
+  // The number of bytes of memory that may be allocated but unused for the hard
+  // limit expiration time without getting purged.
+  void SetSoftMemoryLimit(size_t bytes);
+
   // Sets the amount of memory to keep when we're under moderate pressure.
   void SetBytesToKeepUnderModeratePressure(size_t bytes);
 
+  // Sets the memory usage cutoff time for hard memory limit.
+  void SetHardMemoryLimitExpirationTime(
+      TimeDelta hard_memory_limit_expiration_time);
+
+  // This will attempt to reduce memory footprint until within soft memory
+  // limit. Returns true if there's no need to call this again until allocations
+  // have been used.
+  bool ReduceMemoryUsage();
+
   // Adds the given allocation to the manager's collection.
   void Register(Allocation* allocation, size_t bytes);
 
@@ -122,6 +137,7 @@ class BASE_EXPORT_PRIVATE DiscardableMemoryManager {
 
     const size_t bytes;
     bool purgable;
+    TimeTicks last_usage;
   };
   typedef HashingMRUCache<Allocation*, AllocationInfo> AllocationMap;
 
@@ -129,20 +145,28 @@ class BASE_EXPORT_PRIVATE DiscardableMemoryManager {
   void OnMemoryPressure(
       MemoryPressureListener::MemoryPressureLevel pressure_level);
 
-  // Purges memory until usage is within
+  // Purges memory until usage is less or equal to
   // |bytes_to_keep_under_moderate_pressure_|.
-  void Purge();
+  void PurgeUntilWithinBytesToKeepUnderModeratePressure();
 
-  // Purges least recently used memory until usage is less or equal to |limit|.
-  // Caller must acquire |lock_| prior to calling this function.
-  void PurgeLRUWithLockAcquiredUntilUsageIsWithin(size_t limit);
+  // Purges memory not used since |hard_memory_limit_expiration_time_| before
+  // "right now" until usage is less or equal to |soft_memory_limit_|.
+  // Returns true if total amount of memory is less or equal to soft memory
+  // limit.
+  bool PurgeIfNotUsedSinceHardLimitCutoffUntilWithinSoftMemoryLimit();
 
-  // Ensures that we don't allocate beyond our memory limit. Caller must acquire
-  // |lock_| prior to calling this function.
-  void EnforcePolicyWithLockAcquired();
+  // Purges memory that has not been used since |timestamp| until usage is less
+  // or equal to |limit|.
+  // Caller must acquire |lock_| prior to calling this function.
+  void PurgeIfNotUsedSinceTimestampUntilUsageIsWithinLimitWithLockAcquired(
+      TimeTicks timestamp,
+      size_t limit);
 
   // Called when a change to |bytes_allocated_| has been made.
-  void BytesAllocatedChanged() const;
+  void BytesAllocatedChanged(size_t new_bytes_allocated) const;
+
+  // Virtual for tests.
+  virtual TimeTicks Now() const;
 
   // Needs to be held when accessing members.
   mutable Lock lock_;
@@ -156,6 +180,11 @@ class BASE_EXPORT_PRIVATE DiscardableMemoryManager {
   // The maximum number of bytes of memory that may be allocated.
   size_t memory_limit_;
 
+  // The number of bytes of memory that may be allocated but not used for
+  // |hard_memory_limit_expiration_time_| amount of time when receiving an idle
+  // notification.
+  size_t soft_memory_limit_;
+
   // Under moderate memory pressure, we will purge memory until usage is within
   // this limit.
   size_t bytes_to_keep_under_moderate_pressure_;
@@ -164,6 +193,10 @@ class BASE_EXPORT_PRIVATE DiscardableMemoryManager {
   // pressure.
   scoped_ptr<MemoryPressureListener> memory_pressure_listener_;
 
+  // Amount of time it takes for an allocation to become affected by
+  // |soft_memory_limit_|.
+  TimeDelta hard_memory_limit_expiration_time_;
+
   DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryManager);
 };
 
index 8b08cf6..ef5739a 100644 (file)
@@ -45,13 +45,30 @@ class TestAllocationImpl : public internal::DiscardableMemoryManagerAllocation {
 // Tests can assume that the default limit is at least 1024. Tests that rely on
 // something else needs to explicit set the limit.
 const size_t kDefaultMemoryLimit = 1024;
+const size_t kDefaultSoftMemoryLimit = kDefaultMemoryLimit;
 const size_t kDefaultBytesToKeepUnderModeratePressure = kDefaultMemoryLimit;
 
+class TestDiscardableMemoryManagerImpl
+    : public internal::DiscardableMemoryManager {
+ public:
+  TestDiscardableMemoryManagerImpl()
+      : DiscardableMemoryManager(kDefaultMemoryLimit,
+                                 kDefaultSoftMemoryLimit,
+                                 kDefaultBytesToKeepUnderModeratePressure,
+                                 TimeDelta::Max()) {}
+
+  void SetNow(TimeTicks now) { now_ = now; }
+
+ private:
+  // Overriden from internal::DiscardableMemoryManager:
+  virtual TimeTicks Now() const OVERRIDE { return now_; }
+
+  TimeTicks now_;
+};
+
 class DiscardableMemoryManagerTestBase {
  public:
-  DiscardableMemoryManagerTestBase()
-      : manager_(kDefaultMemoryLimit,
-                 kDefaultBytesToKeepUnderModeratePressure) {
+  DiscardableMemoryManagerTestBase() {
     manager_.RegisterMemoryPressureListener();
   }
 
@@ -66,10 +83,16 @@ class DiscardableMemoryManagerTestBase {
 
   void SetMemoryLimit(size_t bytes) { manager_.SetMemoryLimit(bytes); }
 
+  void SetSoftMemoryLimit(size_t bytes) { manager_.SetSoftMemoryLimit(bytes); }
+
   void SetBytesToKeepUnderModeratePressure(size_t bytes) {
     manager_.SetBytesToKeepUnderModeratePressure(bytes);
   }
 
+  void SetHardMemoryLimitExpirationTime(TimeDelta time) {
+    manager_.SetHardMemoryLimitExpirationTime(time);
+  }
+
   void Register(TestAllocationImpl* allocation, size_t bytes) {
     manager_.Register(allocation, bytes);
   }
@@ -102,9 +125,13 @@ class DiscardableMemoryManagerTestBase {
     return manager_.CanBePurgedForTest(allocation);
   }
 
+  void SetNow(TimeTicks now) { manager_.SetNow(now); }
+
+  bool ReduceMemoryUsage() { return manager_.ReduceMemoryUsage(); }
+
  private:
   MessageLoopForIO message_loop_;
-  internal::DiscardableMemoryManager manager_;
+  TestDiscardableMemoryManagerImpl manager_;
 };
 
 class DiscardableMemoryManagerTest : public DiscardableMemoryManagerTestBase,
@@ -392,6 +419,51 @@ TEST_F(DiscardableMemoryManagerTest, DestructionAfterPurged) {
   EXPECT_EQ(0u, BytesAllocated());
 }
 
+TEST_F(DiscardableMemoryManagerTest, ReduceMemoryUsage) {
+  SetMemoryLimit(3072);
+  SetSoftMemoryLimit(1024);
+  SetHardMemoryLimitExpirationTime(TimeDelta::FromInternalValue(1));
+
+  size_t size = 1024;
+  TestAllocationImpl allocation[3];
+  RegisterAndLock(&allocation[0], size);
+  RegisterAndLock(&allocation[1], size);
+  RegisterAndLock(&allocation[2], size);
+  EXPECT_EQ(3072u, BytesAllocated());
+
+  // Above soft limit but nothing that can be purged.
+  EXPECT_FALSE(ReduceMemoryUsage());
+
+  SetNow(TimeTicks::FromInternalValue(0));
+  Unlock(&allocation[0]);
+
+  // Above soft limit but still nothing that can be purged as all unlocked
+  // allocations are within the hard limit cutoff time.
+  EXPECT_FALSE(ReduceMemoryUsage());
+
+  SetNow(TimeTicks::FromInternalValue(1));
+  Unlock(&allocation[1]);
+
+  // One unlocked allocation is no longer within the hard limit cutoff time. It
+  // should be purged and ReduceMemoryUsage() should return false as we're not
+  // yet within the soft memory limit.
+  EXPECT_FALSE(ReduceMemoryUsage());
+  EXPECT_EQ(2048u, BytesAllocated());
+
+  // One more unlocked allocation is no longer within the hard limit cutoff
+  // time. It should be purged and ReduceMemoryUsage() should return true as
+  // we're now within the soft memory limit.
+  SetNow(TimeTicks::FromInternalValue(2));
+  EXPECT_TRUE(ReduceMemoryUsage());
+  EXPECT_EQ(1024u, BytesAllocated());
+
+  Unlock(&allocation[2]);
+
+  Unregister(&allocation[0]);
+  Unregister(&allocation[1]);
+  Unregister(&allocation[2]);
+}
+
 class ThreadedDiscardableMemoryManagerTest
     : public DiscardableMemoryManagerTest {
  public:
index fbd496d..b9342e9 100644 (file)
@@ -21,6 +21,11 @@ void DiscardableMemory::UnregisterMemoryPressureListeners() {
 }
 
 // static
+bool DiscardableMemory::ReduceMemoryUsage() {
+  return internal::DiscardableMemoryEmulated::ReduceMemoryUsage();
+}
+
+// static
 void DiscardableMemory::GetSupportedTypes(
     std::vector<DiscardableMemoryType>* types) {
   const DiscardableMemoryType supported_types[] = {
index def3870..8884e15 100644 (file)
@@ -4,12 +4,54 @@
 
 #include "base/sys_info.h"
 
+#include <dlfcn.h>
 #include <sys/system_properties.h>
 
+#include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
+#include "base/sys_info_internal.h"
+
+// TODO(rmcilroy): Update API level when 'L' gets an official API level.
+#if (__ANDROID_API__ >= 9999 /* 'L' */)
+
+namespace {
+
+typedef int (SystemPropertyGetFunction)(const char*, char*);
+
+SystemPropertyGetFunction* DynamicallyLoadRealSystemPropertyGet() {
+  // libc.so should already be open, get a handle to it.
+  void* handle = dlopen("libc.so", RTLD_NOLOAD);
+  if (!handle) {
+    LOG(FATAL) << "Cannot dlopen libc.so: " << dlerror();
+  }
+  SystemPropertyGetFunction* real_system_property_get =
+      reinterpret_cast<SystemPropertyGetFunction*>(
+          dlsym(handle, "__system_property_get"));
+  if (!real_system_property_get) {
+    LOG(FATAL) << "Cannot resolve __system_property_get(): " << dlerror();
+  }
+  return real_system_property_get;
+}
+
+static base::LazyInstance<base::internal::LazySysInfoValue<
+    SystemPropertyGetFunction*, DynamicallyLoadRealSystemPropertyGet> >::Leaky
+    g_lazy_real_system_property_get = LAZY_INSTANCE_INITIALIZER;
+
+}  // namespace
+
+// Android 'L' removes __system_property_get from the NDK, however it is still
+// a hidden symbol in libc. Until we remove all calls of __system_property_get
+// from Chrome we work around this by defining a weak stub here, which uses
+// dlsym to but ensures that Chrome uses the real system
+// implementatation when loaded.  http://crbug.com/392191.
+int __system_property_get(const char* name, char* value) {
+  return g_lazy_real_system_property_get.Get().value()(name, value);
+}
+
+#endif
 
 namespace {
 
index 03874f0..2f1d812 100755 (executable)
@@ -226,18 +226,18 @@ def VerifyV14ResourcesInDir(input_dir, resource_type):
   don't use attributes that cause crashes on certain devices. Print an error if
   they have."""
   for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
-    exception_message = ('error : ' + input_filename + ' has an RTL attribute, '
-                        'i.e., attribute that has "start" or "end" in its name.'
-                        ' Pre-v17 resources should not include it because it '
-                        'can cause crashes on certain devices. Please refer to '
-                        'http://crbug.com/243952 for the details.')
+    warning_message = ('warning : ' + input_filename + ' has an RTL attribute, '
+                       'i.e., attribute that has "start" or "end" in its name.'
+                       ' Pre-v17 resources should not include it because it '
+                       'can cause crashes on certain devices. Please refer to '
+                       'http://crbug.com/243952 for the details.')
     dom = minidom.parse(input_filename)
     if resource_type in ('layout', 'xml'):
       if GenerateV14LayoutResourceDom(dom, input_filename, False):
-        raise Exception(exception_message)
+        print warning_message
     elif resource_type == 'values':
       if GenerateV14StyleResourceDom(dom, input_filename, False):
-        raise Exception(exception_message)
+        print warning_message
 
 
 def AssertNoDeprecatedAttributesInDir(input_dir, resource_type):
@@ -281,9 +281,6 @@ def ParseArgs():
   return options
 
 def GenerateV14Resources(res_dir, res_v14_dir, verify_only):
-  build_utils.DeleteDirectory(res_v14_dir)
-  build_utils.MakeDirectory(res_v14_dir)
-
   for name in os.listdir(res_dir):
     if not os.path.isdir(os.path.join(res_dir, name)):
       continue
@@ -337,8 +334,12 @@ def GenerateV14Resources(res_dir, res_v14_dir, verify_only):
 def main():
   options = ParseArgs()
 
-  GenerateV14Resources(
-      options.res_dir, options.res_v14_compatibility_dir, options.verify_only)
+  res_v14_dir = options.res_v14_compatibility_dir
+
+  build_utils.DeleteDirectory(res_v14_dir)
+  build_utils.MakeDirectory(res_v14_dir)
+
+  GenerateV14Resources(options.res_dir, res_v14_dir, options.verify_only)
 
   if options.stamp:
     build_utils.Touch(options.stamp)
index 22000be..b27365b 100755 (executable)
@@ -20,7 +20,8 @@ def DoProguard(options):
   # the output.
   if os.path.exists(options.output_path):
     os.remove(options.output_path)
-  proguard_cmd = [options.proguard_path,
+  proguard_cmd = ['java', '-jar',
+                  options.proguard_path,
                   '-injars', injars,
                   '-outjars', outjars,
                   '-libraryjars', libraryjars,
index cb026da..a41438c 100644 (file)
@@ -133,8 +133,8 @@ DEVICE_PERF_OUTPUT_DIR = (
 
 SCREENSHOTS_DIR = os.path.join(DIR_SOURCE_ROOT, 'out_screenshots')
 
-ANDROID_SDK_VERSION = 19
-ANDROID_SDK_BUILD_TOOLS_VERSION = '19.0.0'
+ANDROID_SDK_VERSION = 20
+ANDROID_SDK_BUILD_TOOLS_VERSION = '20.0.0'
 ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
                                 'third_party/android_tools/sdk')
 ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT,
index ee781c5..183ea86 100644 (file)
@@ -42,10 +42,10 @@ class TestJar(object):
       raise Exception('%s not found, please build it' % jar_path)
 
     self._PROGUARD_PATH = os.path.join(constants.ANDROID_SDK_ROOT,
-                                       'tools/proguard/bin/proguard.sh')
+                                       'tools/proguard/lib/proguard.jar')
     if not os.path.exists(self._PROGUARD_PATH):
       self._PROGUARD_PATH = os.path.join(os.environ['ANDROID_BUILD_TOP'],
-                                         'external/proguard/bin/proguard.sh')
+                                         'external/proguard/lib/proguard.jar')
     self._jar_path = jar_path
     self._annotation_map = collections.defaultdict(list)
     self._pickled_proguard_name = self._jar_path + '-proguard.pickle'
@@ -71,7 +71,8 @@ class TestJar(object):
     return False
 
   def _GetProguardData(self):
-    proguard_output = cmd_helper.GetCmdOutput([self._PROGUARD_PATH,
+    proguard_output = cmd_helper.GetCmdOutput(['java', '-jar',
+                                               self._PROGUARD_PATH,
                                                '-injars', self._jar_path,
                                                '-dontshrink',
                                                '-dontoptimize',
index 2ff9ceb..5e14a3b 100644 (file)
             # they're passed to ant which uses a different relative path from
             # gyp.
             'android_ndk_root%': '<!(cd <(DEPTH) && pwd -P)/third_party/android_tools/ndk/',
-            'android_ndk_experimental_root%': '<!(cd <(DEPTH) && pwd -P)/third_party/android_tools/ndk_experimental/',
             'android_sdk_root%': '<!(cd <(DEPTH) && pwd -P)/third_party/android_tools/sdk/',
             'android_host_arch%': '<!(uname -m)',
             # Android API-level of the SDK used for compilation.
-            'android_sdk_version%': '19',
-            'android_sdk_build_tools_version%': '19.0.0',
+            'android_sdk_version%': '20',
+            'android_sdk_build_tools_version%': '20.0.0',
             'host_os%': "<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')",
           },
           # Copy conditionally-set variables out one scope.
             }],
             ['target_arch == "x64"', {
               'android_app_abi%': 'x86_64',
-              'android_gdbserver%': '<(android_ndk_experimental_root)/prebuilt/android-x86_64/gdbserver/gdbserver',
-              'android_ndk_sysroot%': '<(android_ndk_experimental_root)/platforms/android-L/arch-x86_64',
+              'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-x86_64/gdbserver/gdbserver',
+              'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-L/arch-x86_64',
               'android_ndk_lib_dir%': 'usr/lib64',
-              'android_toolchain%': '<(android_ndk_experimental_root)/toolchains/x86_64-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
-              'android_stlport_root': '<(android_ndk_experimental_root)/sources/cxx-stl/stlport',
+              'android_toolchain%': '<(android_ndk_root)/toolchains/x86_64-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
             }],
             ['target_arch=="arm"', {
               'conditions': [
             }],
             ['target_arch == "arm64"', {
               'android_app_abi%': 'arm64-v8a',
-              'android_gdbserver%': '<(android_ndk_experimental_root)/prebuilt/android-arm64/gdbserver/gdbserver',
-              'android_ndk_sysroot%': '<(android_ndk_experimental_root)/platforms/android-L/arch-arm64',
+              'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-arm64/gdbserver/gdbserver',
+              'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-L/arch-arm64',
               'android_ndk_lib_dir%': 'usr/lib',
-              'android_toolchain%': '<(android_ndk_experimental_root)/toolchains/aarch64-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
-              'android_stlport_root': '<(android_ndk_experimental_root)/sources/cxx-stl/stlport',
+              'android_toolchain%': '<(android_ndk_root)/toolchains/aarch64-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
             }],
             ['target_arch == "mipsel"', {
               'android_app_abi%': 'mips',
                   'debug_optimize%': 's',
                 },
                 'cflags': [
-                  '-fomit-frame-pointer',
                   '-fdata-sections',
                   '-ffunction-sections',
                 ],
                   '-Wl,--as-needed',
                 ],
               }],
+              ['OS=="android" and android_full_debug==0 and target_arch!="arm64"', {
+                # We don't omit frame pointers on arm64 since they are required
+                # to correctly unwind stackframes which contain system library
+                # function frames (crbug.com/391706).
+                'cflags': [
+                  '-fomit-frame-pointer',
+                ],
+              }],
               ['OS=="linux" and target_arch=="ia32"', {
                 'ldflags': [
                   '-Wl,--no-as-needed',
               'release_valgrind_build%': 0,
             },
             'cflags': [
-              '-O>(release_optimize)',
+              '-O<(release_optimize)',
               # Don't emit the GCC version ident directives, they just end up
               # in the .comment section taking up binary size.
               '-fno-ident',
                   '-Wl,--gc-sections',
                 ],
               }],
+              ['OS=="android" and target_arch!="arm64"', {
+                # We don't omit frame pointers on arm64 since they are required
+                # to correctly unwind stackframes which contain system library
+                # function frames (crbug.com/391706).
+                'cflags': [
+                  '-fomit-frame-pointer',
+                ]
+              }],
               ['OS=="android"', {
                 'variables': {
                   'release_optimize%': 's',
                 },
-                'cflags': [
-                  '-fomit-frame-pointer',
-                ],
                 'ldflags': [
                   # Warn in case of text relocations.
                   '-Wl,--warn-shared-textrel',
index 1e3601d..819fe4d 100644 (file)
@@ -9,6 +9,9 @@ if (is_android) {
     # Absolute directory containing the Android source code.
     android_src = ""
 
+    android_sdk_root = "//third_party/android_tools/sdk"
+    android_sdk_version = "20"
+
     # This is set when building the Android WebView inside the Android build
     # system, using the 'android' gyp backend. The WebView code is still built
     # when this is unset, but builds using the normal chromium build system.
@@ -46,12 +49,18 @@ if (is_android) {
   # than just the current one) since these are needed by the Android toolchain
   # file to define toolchains for all possible targets in one pass.
 
+  android_sdk = "${android_sdk_root}/platforms/android-${android_sdk_version}"
+
   # Path to the Android NDK and SDK.
   android_ndk_root = "//third_party/android_tools/ndk"
-  android_sdk_root = "//third_party/android_tools/sdk"
+
+  android_sdk = "${android_sdk_root}/platforms/android-${android_sdk_version}"
+
+  android_sdk_tools = "${android_sdk_root}/tools"
+  android_sdk_build_tools = "${android_sdk_root}/build-tools/20.0.0"
 
   # Path to the SDK's android.jar
-  android_sdk_jar = "$android_sdk_root/platforms/android-19/android.jar"
+  android_sdk_jar = "$android_sdk/android.jar"
 
   # Subdirectories inside android_ndk_root that contain the sysroot for the
   # associated platform.
@@ -76,7 +85,7 @@ if (is_android) {
   } else if (cpu_arch == "arm") {
     android_libgcc_file =
       "$arm_android_toolchain_root/lib/gcc/arm-linux-androideabi/${_android_toolchain_version}/libgcc.a"
-  } else if (cpu_arch == "mips") {
+  } else if (cpu_arch == "mipsel") {
     android_libgcc_file =
       "$mips_android_toolchain_root/lib/gcc/mipsel-linux-android/${_android_toolchain_version}/libgcc.a"
   } else {
index 641dc77..205f746 100644 (file)
           'action_name': 'proguard_<(_target_name)',
           'message': 'Proguard preprocessing <(_target_name) jar',
           'inputs': [
-            '<(android_sdk_root)/tools/proguard/bin/proguard.sh',
+            '<(android_sdk_root)/tools/proguard/lib/proguard.jar',
             '<(DEPTH)/build/android/gyp/util/build_utils.py',
             '<(DEPTH)/build/android/gyp/proguard.py',
             '<(javac_jar_path)',
           ],
           'action': [
             'python', '<(DEPTH)/build/android/gyp/proguard.py',
-            '--proguard-path=<(android_sdk_root)/tools/proguard/bin/proguard.sh',
+            '--proguard-path=<(android_sdk_root)/tools/proguard/lib/proguard.jar',
             '--input-path=<(javac_jar_path)',
             '--output-path=<(jar_path)',
             '--proguard-config=<(proguard_config)',
index 92c8cfa..bef0811 100644 (file)
 
         '--proguard-file', '<(generated_proguard_file)',
 
-        '--resource-dir', '<(resource_dir)',
+        '--resource-dirs', '<(resource_dir)',
         '--resource-zip-out', '<(resource_zip_path)',
 
         '--R-dir', '<(intermediate_dir)/gen',
index 5a86775..a3a8cc0 100644 (file)
@@ -56,7 +56,7 @@
           'action_name': 'proguard_<(_target_name)',
           'message': 'Proguard preprocessing <(_target_name) jar',
           'inputs': [
-            '<(android_sdk_root)/tools/proguard/bin/proguard.sh',
+            '<(android_sdk_root)/tools/proguard/lib/proguard.jar',
             '<(DEPTH)/build/android/gyp/util/build_utils.py',
             '<(DEPTH)/build/android/gyp/proguard.py',
             '<(jar_path)',
@@ -67,7 +67,7 @@
           ],
           'action': [
             'python', '<(DEPTH)/build/android/gyp/proguard.py',
-            '--proguard-path=<(android_sdk_root)/tools/proguard/bin/proguard.sh',
+            '--proguard-path=<(android_sdk_root)/tools/proguard/lib/proguard.jar',
             '--input-path=<(jar_path)',
             '--output-path=<(dex_input_jar_path)',
             '--proguard-config=<(proguard_config)',
index c1cdbbe..e94fd2a 100644 (file)
@@ -72,6 +72,7 @@ void DelegatedRendererLayerImpl::PushPropertiesTo(LayerImpl* layer) {
   // have already deleted its old child_id.
   DCHECK(delegated_layer->child_id_ == 0 ||
          delegated_layer->child_id_ == child_id_);
+  delegated_layer->inverse_device_scale_factor_ = inverse_device_scale_factor_;
   delegated_layer->child_id_ = child_id_;
   delegated_layer->own_child_id_ = true;
   own_child_id_ = false;
@@ -388,13 +389,14 @@ void DelegatedRendererLayerImpl::AppendRenderPassQuads(
   for (size_t i = 0; i < delegated_render_pass->quad_list.size(); ++i) {
     const DrawQuad* delegated_quad = delegated_render_pass->quad_list[i];
 
+    bool is_root_delegated_render_pass =
+        delegated_render_pass == render_passes_in_draw_order_.back();
+
     if (delegated_quad->shared_quad_state != delegated_shared_quad_state) {
       delegated_shared_quad_state = delegated_quad->shared_quad_state;
       output_shared_quad_state = quad_sink->CreateSharedQuadState();
       output_shared_quad_state->CopyFrom(delegated_shared_quad_state);
 
-      bool is_root_delegated_render_pass =
-          delegated_render_pass == render_passes_in_draw_order_.back();
       if (is_root_delegated_render_pass) {
         gfx::Transform delegated_frame_to_target_transform = draw_transform();
         delegated_frame_to_target_transform.Scale(inverse_device_scale_factor_,
@@ -427,9 +429,17 @@ void DelegatedRendererLayerImpl::AppendRenderPassQuads(
     }
     DCHECK(output_shared_quad_state);
 
+    gfx::Transform quad_content_to_delegated_target_space =
+        output_shared_quad_state->content_to_target_transform;
+    if (!is_root_delegated_render_pass) {
+      quad_content_to_delegated_target_space.ConcatTransform(
+          quad_sink->render_pass()->transform_to_root_target);
+      quad_content_to_delegated_target_space.ConcatTransform(draw_transform());
+    }
+
     gfx::Rect quad_visible_rect = quad_sink->UnoccludedContentRect(
-        delegated_quad->visible_rect,
-        output_shared_quad_state->content_to_target_transform);
+        delegated_quad->visible_rect, quad_content_to_delegated_target_space);
+
     if (quad_visible_rect.IsEmpty())
       continue;
 
index 9f7aaf8..34d1170 100644 (file)
@@ -48,6 +48,10 @@ class CC_EXPORT DelegatedRendererLayerImpl : public LayerImpl {
   void SetFrameData(const DelegatedFrameData* frame_data,
                     const gfx::RectF& damage_in_frame);
 
+  float inverse_device_scale_factor() const {
+    return inverse_device_scale_factor_;
+  }
+
  protected:
   DelegatedRendererLayerImpl(LayerTreeImpl* tree_impl, int id);
 
index 41c301a..9556190 100644 (file)
@@ -1522,6 +1522,61 @@ TEST_F(DelegatedRendererLayerImplTest, Occlusion) {
                 impl.quad_list()[0]->visible_rect.ToString());
     }
   }
+  {
+    gfx::Rect occluded(0, 0, 500, 1000);
+    // Move the occlusion to where it is in the contributing surface.
+    occluded -= quad_rect.OffsetFromOrigin() + gfx::Vector2d(11, 0);
+
+    SCOPED_TRACE("Contributing render pass with transformed root");
+
+    delegated_renderer_layer_impl->SetTransform(transform);
+    impl.CalcDrawProps(viewport_size);
+
+    impl.AppendQuadsForPassWithOcclusion(
+        delegated_renderer_layer_impl, pass2_id, occluded);
+    size_t partially_occluded_count = 0;
+    LayerTestCommon::VerifyQuadsCoverRectWithOcclusion(
+        impl.quad_list(),
+        gfx::Rect(quad_rect.size()),
+        occluded,
+        &partially_occluded_count);
+    // The layer outputs one quad, which is partially occluded.
+    EXPECT_EQ(1u, impl.quad_list().size());
+    EXPECT_EQ(1u, partially_occluded_count);
+    // The quad in the contributing surface is at (222,300) in the transformed
+    // root. The occlusion extends to 500 in the x-axis, pushing the left of the
+    // visible part of the quad to 500 - 222 = 300 - 22 inside the quad.
+    EXPECT_EQ(gfx::Rect(300 - 22, 0, 100 + 22, 500).ToString(),
+              impl.quad_list()[0]->visible_rect.ToString());
+  }
+}
+
+TEST_F(DelegatedRendererLayerImplTest, PushPropertiesTo) {
+  gfx::Size layer_size(1000, 1000);
+
+  scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer_impl =
+      FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 5);
+  delegated_renderer_layer_impl->SetBounds(layer_size);
+  delegated_renderer_layer_impl->SetContentBounds(layer_size);
+  delegated_renderer_layer_impl->SetDrawsContent(true);
+
+  RenderPassList delegated_render_passes;
+  // |pass1| covers the whole layer.
+  RenderPass::Id pass1_id = RenderPass::Id(5, 0);
+  AddRenderPass(&delegated_render_passes,
+                pass1_id,
+                gfx::Rect(layer_size),
+                gfx::Transform());
+  delegated_renderer_layer_impl->SetFrameDataForRenderPasses(
+      2.f, &delegated_render_passes);
+  EXPECT_EQ(0.5f, delegated_renderer_layer_impl->inverse_device_scale_factor());
+
+  scoped_ptr<DelegatedRendererLayerImpl> other_layer =
+      DelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 6);
+
+  delegated_renderer_layer_impl->PushPropertiesTo(other_layer.get());
+
+  EXPECT_EQ(0.5f, other_layer->inverse_device_scale_factor());
 }
 
 }  // namespace
index a65ac8c..7031ec0 100644 (file)
@@ -54,17 +54,14 @@ void PictureImageLayer::PaintContents(
       SkFloatToScalar(static_cast<float>(bounds().height()) / bitmap_.height());
   canvas->scale(content_to_layer_scale_x, content_to_layer_scale_y);
 
-  // Because PictureImageLayer always FillsBoundsCompletely it will not clear
-  // before painting on playback. As a result we must configure the paint to
-  // copy over the uncleared destination, rather than blending with it.
-  SkPaint paint;
-  paint.setXfermodeMode(SkXfermode::kSrc_Mode);
-  canvas->drawBitmap(bitmap_, 0, 0, &paint);
+  // Because Android WebView resourceless software draw mode rasters directly
+  // to the root canvas, this draw must use the kSrcOver_Mode so that
+  // transparent images blend correctly.
+  canvas->drawBitmap(bitmap_, 0, 0);
 }
 
 bool PictureImageLayer::FillsBoundsCompletely() const {
-  // PictureImageLayer will always paint to the entire layer bounds.
-  return true;
+  return false;
 }
 
 }  // namespace cc
index f90c6da..8f6cf29 100644 (file)
@@ -1106,9 +1106,18 @@ void PictureLayerImpl::RecalculateRasterScales() {
 
   // Since we're not re-rasterizing during animation, rasterize at the maximum
   // scale that will occur during the animation, if the maximum scale is
-  // known.
+  // known. However, to avoid excessive memory use, don't rasterize at a scale
+  // at which this layer would become larger than the viewport.
   if (draw_properties().screen_space_transform_is_animating) {
+    bool can_raster_at_maximum_scale = false;
     if (draw_properties().maximum_animation_contents_scale > 0.f) {
+      gfx::Size bounds_at_maximum_scale = gfx::ToCeiledSize(gfx::ScaleSize(
+          bounds(), draw_properties().maximum_animation_contents_scale));
+      if (bounds_at_maximum_scale.GetArea() <=
+          layer_tree_impl()->device_viewport_size().GetArea())
+        can_raster_at_maximum_scale = true;
+    }
+    if (can_raster_at_maximum_scale) {
       raster_contents_scale_ =
           std::max(raster_contents_scale_,
                    draw_properties().maximum_animation_contents_scale);
index bb61f4e..36fab90 100644 (file)
@@ -1764,8 +1764,10 @@ TEST_F(DeferredInitPictureLayerImplTest, PreventUpdateTilesDuringLostContext) {
 }
 
 TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
-  gfx::Size tile_size(host_impl_.settings().default_tile_size);
-  SetupDefaultTrees(tile_size);
+  gfx::Size layer_bounds(100, 100);
+  gfx::Size viewport_size(1000, 1000);
+  SetupDefaultTrees(layer_bounds);
+  host_impl_.SetViewportSize(viewport_size);
 
   float contents_scale = 1.f;
   float device_scale = 1.3f;
@@ -1849,6 +1851,58 @@ TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
                                maximum_animation_scale,
                                animating_transform);
   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
+
+  // When animating with a maxmium animation scale factor that is so large
+  // that the layer grows larger than the viewport at this scale, a new
+  // high-res tiling should get created at the animation's initial scale, not
+  // at its maximum scale.
+  animating_transform = true;
+  contents_scale = 2.f;
+  maximum_animation_scale = 11.f;
+
+  SetContentsScaleOnBothLayers(contents_scale,
+                               device_scale,
+                               page_scale,
+                               maximum_animation_scale,
+                               animating_transform);
+  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
+
+  // Once we stop animating, a new high-res tiling should be created.
+  animating_transform = false;
+  contents_scale = 11.f;
+
+  SetContentsScaleOnBothLayers(contents_scale,
+                               device_scale,
+                               page_scale,
+                               maximum_animation_scale,
+                               animating_transform);
+  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 11.f);
+
+  // When animating with a maxmium animation scale factor that is so large
+  // that the layer grows larger than the viewport at this scale, and where
+  // the intial source scale is < 1, a new high-res tiling should get created
+  // at source scale 1.
+  animating_transform = true;
+  contents_scale = 0.1f;
+  maximum_animation_scale = 11.f;
+
+  SetContentsScaleOnBothLayers(contents_scale,
+                               device_scale,
+                               page_scale,
+                               maximum_animation_scale,
+                               animating_transform);
+  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), device_scale * page_scale);
+
+  // Once we stop animating, a new high-res tiling should be created.
+  animating_transform = false;
+  contents_scale = 11.f;
+
+  SetContentsScaleOnBothLayers(contents_scale,
+                               device_scale,
+                               page_scale,
+                               maximum_animation_scale,
+                               animating_transform);
+  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 11.f);
 }
 
 TEST_F(PictureLayerImplTest, LayerRasterTileIterator) {
index c033bfb..bf82d04 100644 (file)
@@ -43,6 +43,8 @@ class CC_EXPORT QuadSink {
 
   virtual void Append(scoped_ptr<DrawQuad> draw_quad);
 
+  const RenderPass* render_pass() const { return render_pass_; }
+
  protected:
   RenderPass* render_pass_;
 
index bb7ceec..e35187e 100644 (file)
@@ -2086,6 +2086,7 @@ void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) {
   UpdateInnerViewportContainerSize();
   client_->OnCanDrawStateChanged(CanDraw());
   SetFullRootLayerDamage();
+  active_tree_->set_needs_update_draw_properties();
 }
 
 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) {
index 42c9640..240043c 100644 (file)
@@ -1,4 +1,4 @@
 MAJOR=37
 MINOR=0
 BUILD=2062
-PATCH=20
+PATCH=76
diff --git a/src/chrome/android/java/res/anim/menu_enter.xml b/src/chrome/android/java/res/anim/menu_enter.xml
new file mode 100644 (file)
index 0000000..63194a9
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
+    <scale android:interpolator="@interpolator/transform_curve_interpolator"
+        android:fromXScale="0"
+        android:toXScale="1"
+        android:fromYScale="0"
+        android:toYScale="1"
+        android:pivotX="@fraction/menu_animation_pivot_x"
+        android:pivotY="5%"
+        android:duration="200" />
+    <alpha android:interpolator="@android:anim/linear_interpolator"
+        android:fromAlpha="0" android:toAlpha="1"
+        android:duration="200" />
+</set>
\ No newline at end of file
diff --git a/src/chrome/android/java/res/anim/menu_exit.xml b/src/chrome/android/java/res/anim/menu_exit.xml
new file mode 100644 (file)
index 0000000..5a2a93d
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
+    <scale android:interpolator="@interpolator/fade_out_curve_interpolator"
+        android:fromXScale="1"
+        android:toXScale="0.5"
+        android:fromYScale="1"
+        android:toYScale="0.5"
+        android:pivotX="@fraction/menu_animation_pivot_x"
+        android:pivotY="5%"
+        android:duration="150" />
+    <alpha android:interpolator="@interpolator/fade_out_curve_interpolator"
+        android:fromAlpha="1"
+        android:toAlpha="0"
+        android:duration="150" />
+</set>
\ No newline at end of file
diff --git a/src/chrome/android/java/res/drawable-hdpi/btn_menu_disabled.png b/src/chrome/android/java/res/drawable-hdpi/btn_menu_disabled.png
new file mode 100644 (file)
index 0000000..0bc4698
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/btn_menu_disabled.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/btn_menu_normal.png b/src/chrome/android/java/res/drawable-hdpi/btn_menu_normal.png
new file mode 100644 (file)
index 0000000..439d3d4
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/btn_menu_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/btn_menu_pressed.png b/src/chrome/android/java/res/drawable-hdpi/btn_menu_pressed.png
new file mode 100644 (file)
index 0000000..df95e3c
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/btn_menu_pressed.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/dismiss.png b/src/chrome/android/java/res/drawable-hdpi/dismiss.png
deleted file mode 100644 (file)
index 8742b9a..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/dismiss.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/edge_menu_bg.9.png b/src/chrome/android/java/res/drawable-hdpi/edge_menu_bg.9.png
new file mode 100644 (file)
index 0000000..c3d3104
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/edge_menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_autofill.png b/src/chrome/android/java/res/drawable-hdpi/infobar_autofill.png
deleted file mode 100644 (file)
index 25c667e..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_autofill.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_autofill_cc.png b/src/chrome/android/java/res/drawable-hdpi/infobar_autofill_cc.png
new file mode 100644 (file)
index 0000000..9337356
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/infobar_autofill_cc.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_autologin.png b/src/chrome/android/java/res/drawable-hdpi/infobar_autologin.png
deleted file mode 100644 (file)
index ae77a5e..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_autologin.png and /dev/null differ
index 02c265b..09bf522 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_blocked_popups.png and b/src/chrome/android/java/res/drawable-hdpi/infobar_blocked_popups.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_enabled.9.png b/src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_enabled.9.png
deleted file mode 100644 (file)
index 3bbce22..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_pressed.9.png b/src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_pressed.9.png
deleted file mode 100644 (file)
index 67c3bbc..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_button_normal_floating_pressed.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_enabled.9.png b/src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_enabled.9.png
deleted file mode 100644 (file)
index 8fbc7f8..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_pressed.9.png b/src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_pressed.9.png
deleted file mode 100644 (file)
index 9e64e67..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_button_warning_floating_pressed.9.png and /dev/null differ
index 3f224b1..c0e332d 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_camera.png and b/src/chrome/android/java/res/drawable-hdpi/infobar_camera.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_close_button.png b/src/chrome/android/java/res/drawable-hdpi/infobar_close_button.png
new file mode 100644 (file)
index 0000000..fa76f86
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/infobar_close_button.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_cookie.png b/src/chrome/android/java/res/drawable-hdpi/infobar_cookie.png
deleted file mode 100644 (file)
index fa89316..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_cookie.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_desktop_notifications.png b/src/chrome/android/java/res/drawable-hdpi/infobar_desktop_notifications.png
deleted file mode 100644 (file)
index 3cc46eb..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_desktop_notifications.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_didyoumean.png b/src/chrome/android/java/res/drawable-hdpi/infobar_didyoumean.png
deleted file mode 100644 (file)
index da32721..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_didyoumean.png and /dev/null differ
index f687555..15ad919 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_geolocation.png and b/src/chrome/android/java/res/drawable-hdpi/infobar_geolocation.png differ
index f9f1df6..fd1c9e7 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_microphone.png and b/src/chrome/android/java/res/drawable-hdpi/infobar_microphone.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_midi.png b/src/chrome/android/java/res/drawable-hdpi/infobar_midi.png
new file mode 100644 (file)
index 0000000..dffd240
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/infobar_midi.png differ
index 34a68ec..03ea359 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_multiple_downloads.png and b/src/chrome/android/java/res/drawable-hdpi/infobar_multiple_downloads.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_plugin.png b/src/chrome/android/java/res/drawable-hdpi/infobar_plugin.png
deleted file mode 100644 (file)
index 3c5fe51..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_plugin.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_plugin_crashed.png b/src/chrome/android/java/res/drawable-hdpi/infobar_plugin_crashed.png
deleted file mode 100644 (file)
index 4f9455e..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_plugin_crashed.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_protected_media_identifier.png b/src/chrome/android/java/res/drawable-hdpi/infobar_protected_media_identifier.png
new file mode 100644 (file)
index 0000000..52d38f5
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/infobar_protected_media_identifier.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_restore.png b/src/chrome/android/java/res/drawable-hdpi/infobar_restore.png
deleted file mode 100644 (file)
index 7eaeac2..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_restore.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_savepassword.png b/src/chrome/android/java/res/drawable-hdpi/infobar_savepassword.png
deleted file mode 100644 (file)
index ae77a5e..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_savepassword.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_savepassword_autologin.png b/src/chrome/android/java/res/drawable-hdpi/infobar_savepassword_autologin.png
new file mode 100644 (file)
index 0000000..9c2c9a0
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/infobar_savepassword_autologin.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_theme.png b/src/chrome/android/java/res/drawable-hdpi/infobar_theme.png
deleted file mode 100644 (file)
index 05c5dbc..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_theme.png and /dev/null differ
index 9c6808c..e30f89b 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_translate.png and b/src/chrome/android/java/res/drawable-hdpi/infobar_translate.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/infobar_update_uma.png b/src/chrome/android/java/res/drawable-hdpi/infobar_update_uma.png
deleted file mode 100644 (file)
index ea4761a..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_update_uma.png and /dev/null differ
index af92bd9..911422b 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/infobar_warning.png and b/src/chrome/android/java/res/drawable-hdpi/infobar_warning.png differ
index 19d90ad..8857f01 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-hdpi/menu_bg.9.png and b/src/chrome/android/java/res/drawable-hdpi/menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/tab_close_white.png b/src/chrome/android/java/res/drawable-hdpi/tab_close_white.png
new file mode 100644 (file)
index 0000000..d96ff7f
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/tab_close_white.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/tab_close_white_active.png b/src/chrome/android/java/res/drawable-hdpi/tab_close_white_active.png
new file mode 100644 (file)
index 0000000..4ed228c
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/tab_close_white_active.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito.png b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito.png
new file mode 100644 (file)
index 0000000..0eaad43
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito_active.png b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito_active.png
new file mode 100644 (file)
index 0000000..f5c5719
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_incognito_active.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal.png b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal.png
new file mode 100644 (file)
index 0000000..7ec22a8
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal_active.png b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal_active.png
new file mode 100644 (file)
index 0000000..bc3cca8
Binary files /dev/null and b/src/chrome/android/java/res/drawable-hdpi/tabstrip_incognito_switch_normal_active.png differ
diff --git a/src/chrome/android/java/res/drawable-hdpi/warning.png b/src/chrome/android/java/res/drawable-hdpi/warning.png
deleted file mode 100644 (file)
index 47a8895..0000000
Binary files a/src/chrome/android/java/res/drawable-hdpi/warning.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
similarity index 62%
rename from src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillGray.png
rename to src/chrome/android/java/res/drawable-ldrtl-hdpi/edge_menu_bg.9.png
index 9ff37ef..9190d22
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillGray.png and b/src/chrome/android/java/res/drawable-ldrtl-hdpi/edge_menu_bg.9.png differ
old mode 100755 (executable)
new mode 100644 (file)
similarity index 72%
rename from src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillBlue.png
rename to src/chrome/android/java/res/drawable-ldrtl-mdpi/edge_menu_bg.9.png
index c7c273b..5754705
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillBlue.png and b/src/chrome/android/java/res/drawable-ldrtl-mdpi/edge_menu_bg.9.png differ
old mode 100755 (executable)
new mode 100644 (file)
similarity index 56%
rename from src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillGreen.png
rename to src/chrome/android/java/res/drawable-ldrtl-xhdpi/edge_menu_bg.9.png
index cc5a8f3..c859e95
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillGreen.png and b/src/chrome/android/java/res/drawable-ldrtl-xhdpi/edge_menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-ldrtl-xxhdpi/edge_menu_bg.9.png b/src/chrome/android/java/res/drawable-ldrtl-xxhdpi/edge_menu_bg.9.png
new file mode 100644 (file)
index 0000000..5526fa3
Binary files /dev/null and b/src/chrome/android/java/res/drawable-ldrtl-xxhdpi/edge_menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/btn_menu_disabled.png b/src/chrome/android/java/res/drawable-mdpi/btn_menu_disabled.png
new file mode 100644 (file)
index 0000000..271b8c4
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/btn_menu_disabled.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/btn_menu_normal.png b/src/chrome/android/java/res/drawable-mdpi/btn_menu_normal.png
new file mode 100644 (file)
index 0000000..2d88034
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/btn_menu_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/btn_menu_pressed.png b/src/chrome/android/java/res/drawable-mdpi/btn_menu_pressed.png
new file mode 100644 (file)
index 0000000..1ece2d5
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/btn_menu_pressed.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/dismiss.png b/src/chrome/android/java/res/drawable-mdpi/dismiss.png
deleted file mode 100644 (file)
index 9112451..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/dismiss.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/edge_menu_bg.9.png b/src/chrome/android/java/res/drawable-mdpi/edge_menu_bg.9.png
new file mode 100644 (file)
index 0000000..c13d8f3
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/edge_menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_autofill.png b/src/chrome/android/java/res/drawable-mdpi/infobar_autofill.png
deleted file mode 100644 (file)
index 29584d0..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_autofill.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_autofill_cc.png b/src/chrome/android/java/res/drawable-mdpi/infobar_autofill_cc.png
new file mode 100644 (file)
index 0000000..5244c65
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/infobar_autofill_cc.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_autologin.png b/src/chrome/android/java/res/drawable-mdpi/infobar_autologin.png
deleted file mode 100644 (file)
index e13101a..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_autologin.png and /dev/null differ
index a84d726..f6e45ef 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_blocked_popups.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_blocked_popups.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_enabled.9.png b/src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_enabled.9.png
deleted file mode 100644 (file)
index 7010897..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_pressed.9.png b/src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_pressed.9.png
deleted file mode 100644 (file)
index fdd092f..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_button_normal_floating_pressed.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_enabled.9.png b/src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_enabled.9.png
deleted file mode 100644 (file)
index a8a1bef..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_pressed.9.png b/src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_pressed.9.png
deleted file mode 100644 (file)
index f1b451e..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_button_warning_floating_pressed.9.png and /dev/null differ
index 3a38d8a..f6dbec5 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_camera.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_camera.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_close_button.png b/src/chrome/android/java/res/drawable-mdpi/infobar_close_button.png
new file mode 100644 (file)
index 0000000..b5a9dee
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/infobar_close_button.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_cookie.png b/src/chrome/android/java/res/drawable-mdpi/infobar_cookie.png
deleted file mode 100644 (file)
index 9c7adca..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_cookie.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_desktop_notifications.png b/src/chrome/android/java/res/drawable-mdpi/infobar_desktop_notifications.png
deleted file mode 100644 (file)
index 93ffe83..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_desktop_notifications.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_didyoumean.png b/src/chrome/android/java/res/drawable-mdpi/infobar_didyoumean.png
deleted file mode 100644 (file)
index a7dd276..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_didyoumean.png and /dev/null differ
index 2cb3419..7a21d16 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_geolocation.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_geolocation.png differ
index 1115fdf..ddaddc4 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_microphone.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_microphone.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_midi.png b/src/chrome/android/java/res/drawable-mdpi/infobar_midi.png
new file mode 100644 (file)
index 0000000..1969331
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/infobar_midi.png differ
index 7919e9f..3d1591f 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_multiple_downloads.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_multiple_downloads.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_plugin.png b/src/chrome/android/java/res/drawable-mdpi/infobar_plugin.png
deleted file mode 100644 (file)
index 890533d..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_plugin.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_plugin_crashed.png b/src/chrome/android/java/res/drawable-mdpi/infobar_plugin_crashed.png
deleted file mode 100644 (file)
index 8e11652..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_plugin_crashed.png and /dev/null differ
index c3d87d4..818b458 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_protected_media_identifier.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_protected_media_identifier.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_restore.png b/src/chrome/android/java/res/drawable-mdpi/infobar_restore.png
deleted file mode 100644 (file)
index 4280b95..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_restore.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_savepassword.png b/src/chrome/android/java/res/drawable-mdpi/infobar_savepassword.png
deleted file mode 100644 (file)
index e13101a..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_savepassword.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_savepassword_autologin.png b/src/chrome/android/java/res/drawable-mdpi/infobar_savepassword_autologin.png
new file mode 100644 (file)
index 0000000..b27576f
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/infobar_savepassword_autologin.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_theme.png b/src/chrome/android/java/res/drawable-mdpi/infobar_theme.png
deleted file mode 100644 (file)
index bd3469e..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_theme.png and /dev/null differ
index c10b0ec..ff92910 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_translate.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_translate.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/infobar_update_uma.png b/src/chrome/android/java/res/drawable-mdpi/infobar_update_uma.png
deleted file mode 100644 (file)
index 77c340d..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_update_uma.png and /dev/null differ
index 5973a94..16a4069 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/infobar_warning.png and b/src/chrome/android/java/res/drawable-mdpi/infobar_warning.png differ
index 1548007..9ccba75 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-mdpi/menu_bg.9.png and b/src/chrome/android/java/res/drawable-mdpi/menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/tab_close_white.png b/src/chrome/android/java/res/drawable-mdpi/tab_close_white.png
new file mode 100644 (file)
index 0000000..d84c6ea
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/tab_close_white.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/tab_close_white_active.png b/src/chrome/android/java/res/drawable-mdpi/tab_close_white_active.png
new file mode 100644 (file)
index 0000000..3c1c1b0
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/tab_close_white_active.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito.png b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito.png
new file mode 100644 (file)
index 0000000..1da75ea
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito_active.png b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito_active.png
new file mode 100644 (file)
index 0000000..be27f3d
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_incognito_active.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal.png b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal.png
new file mode 100644 (file)
index 0000000..c24da11
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal_active.png b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal_active.png
new file mode 100644 (file)
index 0000000..7d6d901
Binary files /dev/null and b/src/chrome/android/java/res/drawable-mdpi/tabstrip_incognito_switch_normal_active.png differ
diff --git a/src/chrome/android/java/res/drawable-mdpi/warning.png b/src/chrome/android/java/res/drawable-mdpi/warning.png
deleted file mode 100644 (file)
index 157c545..0000000
Binary files a/src/chrome/android/java/res/drawable-mdpi/warning.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-tvdpi/back.png b/src/chrome/android/java/res/drawable-tvdpi/back.png
deleted file mode 100644 (file)
index d808050..0000000
Binary files a/src/chrome/android/java/res/drawable-tvdpi/back.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-tvdpi/back_disabled.png b/src/chrome/android/java/res/drawable-tvdpi/back_disabled.png
deleted file mode 100644 (file)
index 4b6e7e1..0000000
Binary files a/src/chrome/android/java/res/drawable-tvdpi/back_disabled.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_enabled.9.png b/src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_enabled.9.png
deleted file mode 100644 (file)
index e0cebe0..0000000
Binary files a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_pressed.9.png b/src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_pressed.9.png
deleted file mode 100644 (file)
index 5d2b98d..0000000
Binary files a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_normal_floating_pressed.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_enabled.9.png b/src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_enabled.9.png
deleted file mode 100644 (file)
index 3b70d55..0000000
Binary files a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_pressed.9.png b/src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_pressed.9.png
deleted file mode 100644 (file)
index aa35e77..0000000
Binary files a/src/chrome/android/java/res/drawable-tvdpi/infobar_button_warning_floating_pressed.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-tvdpi/infobar_update_uma.png b/src/chrome/android/java/res/drawable-tvdpi/infobar_update_uma.png
deleted file mode 100644 (file)
index 6f3ad48..0000000
Binary files a/src/chrome/android/java/res/drawable-tvdpi/infobar_update_uma.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/btn_menu_disabled.png b/src/chrome/android/java/res/drawable-xhdpi/btn_menu_disabled.png
new file mode 100644 (file)
index 0000000..0f13440
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/btn_menu_disabled.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/btn_menu_normal.png b/src/chrome/android/java/res/drawable-xhdpi/btn_menu_normal.png
new file mode 100644 (file)
index 0000000..c6f20d9
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/btn_menu_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/btn_menu_pressed.png b/src/chrome/android/java/res/drawable-xhdpi/btn_menu_pressed.png
new file mode 100644 (file)
index 0000000..ee2f68c
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/btn_menu_pressed.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/dismiss.png b/src/chrome/android/java/res/drawable-xhdpi/dismiss.png
deleted file mode 100644 (file)
index 1ecc3c1..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/dismiss.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/edge_menu_bg.9.png b/src/chrome/android/java/res/drawable-xhdpi/edge_menu_bg.9.png
new file mode 100644 (file)
index 0000000..840eee0
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/edge_menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_autofill.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_autofill.png
deleted file mode 100644 (file)
index b6a6676..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_autofill.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_autofill_cc.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_autofill_cc.png
new file mode 100644 (file)
index 0000000..05ac67c
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/infobar_autofill_cc.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_autologin.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_autologin.png
deleted file mode 100644 (file)
index 2639c5f..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_autologin.png and /dev/null differ
index c890188..23410fd 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_blocked_popups.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_blocked_popups.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_enabled.9.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_enabled.9.png
deleted file mode 100644 (file)
index 0dfe375..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_pressed.9.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_pressed.9.png
deleted file mode 100644 (file)
index 6ca3036..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_normal_floating_pressed.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_enabled.9.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_enabled.9.png
deleted file mode 100644 (file)
index 53601fd..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_enabled.9.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_pressed.9.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_pressed.9.png
deleted file mode 100644 (file)
index b675478..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_button_warning_floating_pressed.9.png and /dev/null differ
index 252f1e2..4ec18b7 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_camera.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_camera.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_close_button.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_close_button.png
new file mode 100644 (file)
index 0000000..af781b8
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/infobar_close_button.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_cookie.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_cookie.png
deleted file mode 100644 (file)
index 85ec7ce..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_cookie.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_desktop_notifications.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_desktop_notifications.png
deleted file mode 100644 (file)
index 785455f..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_desktop_notifications.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_didyoumean.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_didyoumean.png
deleted file mode 100644 (file)
index d008037..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_didyoumean.png and /dev/null differ
index 653648e..8ae1acd 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_geolocation.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_geolocation.png differ
index 4a4f6b8..cc5fb2b 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_microphone.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_microphone.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_midi.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_midi.png
new file mode 100644 (file)
index 0000000..a684d59
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/infobar_midi.png differ
index 3f1cc02..68f9d74 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_multiple_downloads.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_multiple_downloads.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_plugin.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_plugin.png
deleted file mode 100644 (file)
index fd1d6c1..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_plugin.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_plugin_crashed.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_plugin_crashed.png
deleted file mode 100644 (file)
index a08517f..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_plugin_crashed.png and /dev/null differ
index 2751b3c..3cd3a9f 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_protected_media_identifier.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_protected_media_identifier.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_restore.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_restore.png
deleted file mode 100644 (file)
index d1331b0..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_restore.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword.png
deleted file mode 100644 (file)
index cb4ed7d..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword_autologin.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword_autologin.png
new file mode 100644 (file)
index 0000000..99809f8
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/infobar_savepassword_autologin.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_theme.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_theme.png
deleted file mode 100644 (file)
index 0a3c6c0..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_theme.png and /dev/null differ
index 03ae907..ba6a38b 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_translate.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_translate.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/infobar_update_uma.png b/src/chrome/android/java/res/drawable-xhdpi/infobar_update_uma.png
deleted file mode 100644 (file)
index 3c15c02..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_update_uma.png and /dev/null differ
index 4ab0f4e..26a72fb 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/infobar_warning.png and b/src/chrome/android/java/res/drawable-xhdpi/infobar_warning.png differ
index deac765..020c620 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xhdpi/menu_bg.9.png and b/src/chrome/android/java/res/drawable-xhdpi/menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/tab_close_white.png b/src/chrome/android/java/res/drawable-xhdpi/tab_close_white.png
new file mode 100644 (file)
index 0000000..5483b38
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/tab_close_white.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/tab_close_white_active.png b/src/chrome/android/java/res/drawable-xhdpi/tab_close_white_active.png
new file mode 100644 (file)
index 0000000..c3e2121
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/tab_close_white_active.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito.png b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito.png
new file mode 100644 (file)
index 0000000..6c24153
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito_active.png b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito_active.png
new file mode 100644 (file)
index 0000000..95ae811
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_incognito_active.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal.png b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal.png
new file mode 100644 (file)
index 0000000..545c2cb
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal_active.png b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal_active.png
new file mode 100644 (file)
index 0000000..cbe8f29
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xhdpi/tabstrip_incognito_switch_normal_active.png differ
diff --git a/src/chrome/android/java/res/drawable-xhdpi/warning.png b/src/chrome/android/java/res/drawable-xhdpi/warning.png
deleted file mode 100644 (file)
index 09e459f..0000000
Binary files a/src/chrome/android/java/res/drawable-xhdpi/warning.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_disabled.png b/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_disabled.png
new file mode 100644 (file)
index 0000000..94d9133
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_disabled.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_normal.png b/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_normal.png
new file mode 100644 (file)
index 0000000..d33e742
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_pressed.png b/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_pressed.png
new file mode 100644 (file)
index 0000000..8de619f
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/btn_menu_pressed.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/edge_menu_bg.9.png b/src/chrome/android/java/res/drawable-xxhdpi/edge_menu_bg.9.png
new file mode 100644 (file)
index 0000000..6058d00
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/edge_menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_autofill_cc.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_autofill_cc.png
new file mode 100644 (file)
index 0000000..5ef1852
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_autofill_cc.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_blocked_popups.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_blocked_popups.png
new file mode 100644 (file)
index 0000000..b8235d9
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_blocked_popups.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_camera.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_camera.png
new file mode 100644 (file)
index 0000000..8b8665f
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_camera.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_close_button.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_close_button.png
new file mode 100644 (file)
index 0000000..86bc0ea
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_close_button.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_geolocation.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_geolocation.png
new file mode 100644 (file)
index 0000000..8269f2d
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_geolocation.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_microphone.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_microphone.png
new file mode 100644 (file)
index 0000000..6909939
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_microphone.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_midi.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_midi.png
new file mode 100644 (file)
index 0000000..d9b1ab7
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_midi.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_multiple_downloads.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_multiple_downloads.png
new file mode 100644 (file)
index 0000000..aed2c39
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_multiple_downloads.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_protected_media_identifier.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_protected_media_identifier.png
new file mode 100644 (file)
index 0000000..cd5d402
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_protected_media_identifier.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_savepassword_autologin.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_savepassword_autologin.png
new file mode 100644 (file)
index 0000000..505db3a
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_savepassword_autologin.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_translate.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_translate.png
new file mode 100644 (file)
index 0000000..cbea4f5
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_translate.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/infobar_warning.png b/src/chrome/android/java/res/drawable-xxhdpi/infobar_warning.png
new file mode 100644 (file)
index 0000000..14d4b31
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/infobar_warning.png differ
index f392ed5..37c7646 100644 (file)
Binary files a/src/chrome/android/java/res/drawable-xxhdpi/menu_bg.9.png and b/src/chrome/android/java/res/drawable-xxhdpi/menu_bg.9.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/tab_close_white.png b/src/chrome/android/java/res/drawable-xxhdpi/tab_close_white.png
new file mode 100644 (file)
index 0000000..790822d
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/tab_close_white.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/tab_close_white_active.png b/src/chrome/android/java/res/drawable-xxhdpi/tab_close_white_active.png
new file mode 100644 (file)
index 0000000..179623d
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/tab_close_white_active.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito.png b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito.png
new file mode 100644 (file)
index 0000000..daffc19
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito_active.png b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito_active.png
new file mode 100644 (file)
index 0000000..156c285
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_incognito_active.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal.png b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal.png
new file mode 100644 (file)
index 0000000..6efc6a2
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal.png differ
diff --git a/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal_active.png b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal_active.png
new file mode 100644 (file)
index 0000000..92f84ca
Binary files /dev/null and b/src/chrome/android/java/res/drawable-xxhdpi/tabstrip_incognito_switch_normal_active.png differ
diff --git a/src/chrome/android/java/res/drawable/btn_infobar_blue.xml b/src/chrome/android/java/res/drawable/btn_infobar_blue.xml
new file mode 100644 (file)
index 0000000..dafefd5
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:state_pressed="false"
+        android:state_focused="false"
+        android:state_selected="false">
+        <shape>
+            <solid android:color="@color/infobar_accent_blue" />
+            <corners android:radius="2dp" />
+        </shape>
+    </item>
+    <item>
+        <shape>
+            <solid android:color="@color/infobar_accent_blue_pressed" />
+            <corners android:radius="2dp" />
+        </shape>
+    </item>
+</selector>
diff --git a/src/chrome/android/java/res/drawable/btn_menu.xml b/src/chrome/android/java/res/drawable/btn_menu.xml
new file mode 100644 (file)
index 0000000..8ee45ea
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false" android:drawable="@drawable/btn_menu_disabled" />
+    <item android:state_pressed="true" android:drawable="@drawable/btn_menu_pressed" />
+    <item android:state_selected="true" android:drawable="@drawable/btn_menu_pressed" />
+    <item android:state_focused="true" android:drawable="@drawable/btn_menu_pressed" />
+    <item android:drawable="@drawable/btn_menu_normal" />
+</selector>
\ No newline at end of file
diff --git a/src/chrome/android/java/res/drawable/btn_tab_close.xml b/src/chrome/android/java/res/drawable/btn_tab_close.xml
new file mode 100644 (file)
index 0000000..d2f1ed8
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false"
+          android:drawable="@drawable/tab_close_white" />
+    <item android:state_pressed="true"
+          android:drawable="@drawable/tab_close_white_active" />
+    <item android:state_selected="true"
+          android:drawable="@drawable/tab_close_white_active" />
+    <item android:state_focused="true"
+          android:drawable="@drawable/tab_close_white_active" />
+    <item android:drawable="@drawable/tab_close_white" />
+</selector>
\ No newline at end of file
diff --git a/src/chrome/android/java/res/drawable/btn_tabstrip_incognito_switch.xml b/src/chrome/android/java/res/drawable/btn_tabstrip_incognito_switch.xml
new file mode 100644 (file)
index 0000000..30b8797
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false"
+          android:drawable="@drawable/tabstrip_incognito_switch_normal" />
+    <item android:state_pressed="true"
+          android:drawable="@drawable/tabstrip_incognito_switch_normal_active" />
+    <item android:state_selected="true"
+          android:drawable="@drawable/tabstrip_incognito_switch_normal_active" />
+    <item android:state_focused="true"
+          android:drawable="@drawable/tabstrip_incognito_switch_normal_active" />
+    <item android:drawable="@drawable/tabstrip_incognito_switch_normal" />
+</selector>
\ No newline at end of file
diff --git a/src/chrome/android/java/res/drawable/btn_tabstrip_incognito_switch_incognito.xml b/src/chrome/android/java/res/drawable/btn_tabstrip_incognito_switch_incognito.xml
new file mode 100644 (file)
index 0000000..c267eb2
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false"
+          android:drawable="@drawable/tabstrip_incognito_switch_incognito" />
+    <item android:state_pressed="true"
+          android:drawable="@drawable/tabstrip_incognito_switch_incognito_active" />
+    <item android:state_selected="true"
+          android:drawable="@drawable/tabstrip_incognito_switch_incognito_active" />
+    <item android:state_focused="true"
+          android:drawable="@drawable/tabstrip_incognito_switch_incognito_active" />
+    <item android:drawable="@drawable/tabstrip_incognito_switch_incognito" />
+</selector>
\ No newline at end of file
diff --git a/src/chrome/android/java/res/drawable/close_tab_incognito.png b/src/chrome/android/java/res/drawable/close_tab_incognito.png
deleted file mode 100644 (file)
index 1771bd7..0000000
Binary files a/src/chrome/android/java/res/drawable/close_tab_incognito.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable/infobar_button_normal_floating.xml b/src/chrome/android/java/res/drawable/infobar_button_normal_floating.xml
deleted file mode 100644 (file)
index 4853014..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_pressed="false"
-        android:state_focused="false"
-        android:drawable="@drawable/infobar_button_normal_floating_enabled" />
-    <item
-        android:drawable="@drawable/infobar_button_normal_floating_pressed" />
-</selector>
diff --git a/src/chrome/android/java/res/drawable/infobar_button_normal_full_left.xml b/src/chrome/android/java/res/drawable/infobar_button_normal_full_left.xml
deleted file mode 100644 (file)
index 09f4b77..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_pressed="false"
-        android:state_focused="false"
-        android:drawable="@drawable/infobar_button_normal_full_left_enabled" />
-    <item
-        android:drawable="@drawable/infobar_button_normal_full_left_pressed" />
-</selector>
diff --git a/src/chrome/android/java/res/drawable/infobar_button_normal_full_right.xml b/src/chrome/android/java/res/drawable/infobar_button_normal_full_right.xml
deleted file mode 100644 (file)
index b938b9b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_pressed="false"
-        android:state_focused="false"
-        android:drawable="@drawable/infobar_button_normal_full_right_enabled" />
-    <item
-        android:drawable="@drawable/infobar_button_normal_full_right_pressed" />
-</selector>
diff --git a/src/chrome/android/java/res/drawable/infobar_button_warning_floating.xml b/src/chrome/android/java/res/drawable/infobar_button_warning_floating.xml
deleted file mode 100644 (file)
index bebd323..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_pressed="false"
-        android:state_focused="false"
-        android:drawable="@drawable/infobar_button_warning_floating_enabled" />
-    <item
-        android:drawable="@drawable/infobar_button_warning_floating_pressed" />
-</selector>
diff --git a/src/chrome/android/java/res/drawable/infobar_button_warning_full_left.xml b/src/chrome/android/java/res/drawable/infobar_button_warning_full_left.xml
deleted file mode 100644 (file)
index 31e265a..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_pressed="false"
-        android:state_focused="false"
-        android:drawable="@drawable/infobar_button_warning_full_left_enabled" />
-    <item
-        android:drawable="@drawable/infobar_button_warning_full_left_pressed" />
-</selector>
diff --git a/src/chrome/android/java/res/drawable/infobar_button_warning_full_right.xml b/src/chrome/android/java/res/drawable/infobar_button_warning_full_right.xml
deleted file mode 100644 (file)
index d8f04f7..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_pressed="false"
-        android:state_focused="false"
-        android:drawable="@drawable/infobar_button_warning_full_right_enabled" />
-    <item
-        android:drawable="@drawable/infobar_button_warning_full_right_pressed" />
-</selector>
diff --git a/src/chrome/android/java/res/drawable/infobar_close_bg.xml b/src/chrome/android/java/res/drawable/infobar_close_bg.xml
deleted file mode 100644 (file)
index 4847d20..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_pressed="false"
-        android:state_focused="false"
-        android:drawable="@android:color/transparent" />
-    <item
-        android:state_pressed="false"
-        android:state_focused="true"
-        android:drawable="@drawable/infobar_close_button_focused" />
-    <item
-        android:drawable="@drawable/infobar_close_button_pressed" />
-</selector>
diff --git a/src/chrome/android/java/res/drawable/infobar_close_button_focused.xml b/src/chrome/android/java/res/drawable/infobar_close_button_focused.xml
deleted file mode 100644 (file)
index 45f4f5a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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.
--->
-
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <corners android:radius="1dp" />
-    <solid android:color="@color/button_focused" />
-    <stroke
-        android:width="1px"
-        android:color="#80000000" />
-</shape>
diff --git a/src/chrome/android/java/res/drawable/infobar_close_button_pressed.xml b/src/chrome/android/java/res/drawable/infobar_close_button_pressed.xml
deleted file mode 100644 (file)
index b4adae6..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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.
--->
-
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <corners android:radius="1dp" />
-    <solid android:color="@color/button_pressed" />
-</shape>
diff --git a/src/chrome/android/java/res/drawable/infobar_info_background.xml b/src/chrome/android/java/res/drawable/infobar_info_background.xml
deleted file mode 100644 (file)
index c1e30b7..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <gradient
-        android:startColor="#fffbfbfb"
-        android:endColor="#fff2f2f2"
-        android:angle="270" />
-</shape>
diff --git a/src/chrome/android/java/res/drawable/infobar_midi.png b/src/chrome/android/java/res/drawable/infobar_midi.png
deleted file mode 100644 (file)
index a5c4cdc..0000000
Binary files a/src/chrome/android/java/res/drawable/infobar_midi.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable/infobar_warning_background.xml b/src/chrome/android/java/res/drawable/infobar_warning_background.xml
deleted file mode 100644 (file)
index 768166d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <gradient
-        android:startColor="#ffffe991"
-        android:endColor="#fffee289"
-        android:angle="270" />
-</shape>
diff --git a/src/chrome/android/java/res/drawable/tabstrip_incognito_switch_incognito.png b/src/chrome/android/java/res/drawable/tabstrip_incognito_switch_incognito.png
deleted file mode 100644 (file)
index 33769cd..0000000
Binary files a/src/chrome/android/java/res/drawable/tabstrip_incognito_switch_incognito.png and /dev/null differ
diff --git a/src/chrome/android/java/res/drawable/tabstrip_incognito_switch_normal.png b/src/chrome/android/java/res/drawable/tabstrip_incognito_switch_normal.png
deleted file mode 100644 (file)
index 75fdfd2..0000000
Binary files a/src/chrome/android/java/res/drawable/tabstrip_incognito_switch_normal.png and /dev/null differ
diff --git a/src/chrome/android/java/res/interpolator/fade_out_curve_interpolator.xml b/src/chrome/android/java/res/interpolator/fade_out_curve_interpolator.xml
new file mode 100644 (file)
index 0000000..36cda25
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />
diff --git a/src/chrome/android/java/res/interpolator/transform_curve_interpolator.xml b/src/chrome/android/java/res/interpolator/transform_curve_interpolator.xml
new file mode 100644 (file)
index 0000000..a0da2ea
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<accelerateDecelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />
index 8f84b84..323fa34 100644 (file)
@@ -36,7 +36,7 @@
             android:layout_height="wrap_content"
             android:layout_weight="1"
             android:background="@drawable/ntp_toolbar_button_background_selected"
-            android:src="@drawable/tabstrip_incognito_switch_normal"
+            android:src="@drawable/btn_tabstrip_incognito_switch"
             android:contentDescription="@string/accessibility_tab_switcher_standard_stack"
             style="?android:attr/borderlessButtonStyle" />
 
@@ -51,7 +51,7 @@
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:src="@drawable/tabstrip_incognito_switch_incognito"
+            android:src="@drawable/btn_tabstrip_incognito_switch_incognito"
             android:background="@drawable/ntp_toolbar_button_background"
             android:contentDescription="@string/accessibility_tab_switcher_incognito_stack"
             style="?android:attr/borderlessButtonStyle" />
index d114024..f5a60b3 100644 (file)
@@ -49,7 +49,7 @@
             android:padding="4dp"
             android:background="?android:attr/selectableItemBackground"
             android:contentDescription="@string/accessibility_tabstrip_btn_close_tab"
-            android:src="@drawable/close_tab_incognito"
+            android:src="@drawable/btn_tab_close"
             android:gravity="end|center_vertical" />
     </LinearLayout>
 
index cb5a4b9..3263699 100644 (file)
@@ -71,7 +71,7 @@
             android:id="@+id/close_button"
             android:contentDescription="@string/infobar_close"
             android:adjustViewBounds="true"
-            android:src="@drawable/dismiss"
+            android:src="@drawable/infobar_close_button"
             android:background="@drawable/app_banner_button_close"
             android:padding="@dimen/app_banner_close_button_padding"
             android:layout_width="wrap_content"
index d0296f6..f1b2fd6 100644 (file)
 
     <ImageButton
         android:id="@+id/button_one"
-        android:layout_width="56dp"
+        android:layout_width="59dp"
         android:layout_height="match_parent"
-        android:paddingEnd="8dp"
+        android:paddingEnd="11dp"
         android:background="?android:attr/listChoiceBackgroundIndicator"
         android:scaleType="center" />
 
     <ImageButton
         android:id="@+id/button_two"
-        android:layout_width="64dp"
+        android:layout_width="70dp"
         android:layout_height="match_parent"
-        android:paddingStart="8dp"
-        android:paddingEnd="8dp"
+        android:paddingStart="11dp"
+        android:paddingEnd="11dp"
         android:background="?android:attr/listChoiceBackgroundIndicator"
         android:scaleType="center" />
 
     <ImageButton
         android:id="@+id/button_three"
-        android:layout_width="64dp"
+        android:layout_width="70dp"
         android:layout_height="match_parent"
-        android:paddingStart="8dp"
-        android:paddingEnd="8dp"
+        android:paddingStart="11dp"
+        android:paddingEnd="11dp"
         android:background="?android:attr/listChoiceBackgroundIndicator"
         android:scaleType="center" />
 
     <ImageButton
         android:id="@+id/button_four"
-        android:layout_width="56dp"
+        android:layout_width="59dp"
         android:layout_height="match_parent"
-        android:paddingStart="8dp"
+        android:paddingStart="11dp"
         android:background="?android:attr/listChoiceBackgroundIndicator"
         android:scaleType="center" />
-
 </LinearLayout>
\ No newline at end of file
index b45f10f..a35e04b 100644 (file)
@@ -7,16 +7,13 @@
 <Button xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:minWidth="60dp"
-    android:minHeight="@dimen/infobar_touch_target_height"
+    android:background="?android:attr/selectableItemBackground"
+    android:fontFamily="sans-serif-medium"
+    android:minWidth="88dp"
+    android:minHeight="36dp"
     android:textSize="@dimen/infobar_button_text_size"
-    android:textColor="@drawable/infobar_button_text"
-    android:shadowColor="#FFF"
-    android:shadowDx="1.0"
-    android:shadowDy="1.0"
-    android:shadowRadius="1.0"
-    android:background="@drawable/infobar_button_normal_floating"
     android:paddingStart="@dimen/infobar_button_horizontal_padding"
     android:paddingEnd="@dimen/infobar_button_horizontal_padding"
     android:paddingTop="5dp"
-    android:paddingBottom="5dp" />
+    android:paddingBottom="5dp"
+    android:textAllCaps="true" />
index 95c47b4..d56dd76 100644 (file)
@@ -11,6 +11,7 @@
     android:layout_marginBottom="@dimen/infobar_margin"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
+    android:lineSpacingMultiplier="1.25"
     android:textDirection="locale"
     android:textSize="@dimen/infobar_text_size"
     android:textColor="@color/infobar_text" />
index 9ca17e0..15c3fe3 100644 (file)
@@ -27,5 +27,5 @@
         android:background="?android:attr/listChoiceBackgroundIndicator"
         android:padding="10dp"
         android:scaleType="fitCenter" />
-
+    
 </LinearLayout>
\ No newline at end of file
diff --git a/src/chrome/android/java/res/values-ldrtl/values.xml b/src/chrome/android/java/res/values-ldrtl/values.xml
new file mode 100644 (file)
index 0000000..9a5ffad
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2014 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- Menu Animation Constants -->
+    <item type="fraction" format="fraction" name="menu_animation_pivot_x">5%</item>
+</resources>
\ No newline at end of file
index 9ba2aea..172d226 100644 (file)
@@ -24,4 +24,8 @@
         <item name="android:listPreferredItemPaddingEnd">16dp</item>
         <item name="android:textSize">16sp</item>
     </style>
+    <style name="OverflowMenuAnim">
+        <item name="android:windowEnterAnimation">@anim/menu_enter</item>
+        <item name="android:windowExitAnimation">@anim/menu_exit</item>
+    </style>
 </resources>
index 7627e3b..06730b2 100644 (file)
@@ -5,10 +5,13 @@
 -->
 
 <resources>
-    <!-- Colors were copied from browser/views/infobars/infobars.cc -->
-    <color name="infobar_text">#000000</color>
-    <color name="infobar_info_background_separator">#afafaf</color>
-    <color name="infobar_warning_background_separator">#ccb771</color>
+    <!-- Infobar colors -->
+    <color name="infobar_text">#333</color>
+    <color name="infobar_background">#fff</color>
+    <color name="infobar_background_separator">#afafaf</color>
+    <color name="infobar_accent_blue">#4285f4</color>
+    <color name="infobar_accent_blue_pressed">#679df6</color>
+    <color name="infobar_tertiary_button_text">#969696</color>
 
     <!-- Tab Switcher Colors -->
     <color name="tab_switcher_background">#111111</color>
     <color name="accessibility_tab_switcher_list_item">#252525</color>
     <color name="accessibility_close_undo_text">#33b5e5</color>
 
-    <!-- Button Colors -->
-    <color name="button_pressed">#ff77c5e1</color>
-    <color name="button_focused">#ffa9d0df</color>
-
     <!--  App banner colors -->
     <color name="app_banner_install_button_fg">#ffffff</color>
     <color name="app_banner_open_button_fg">#777777</color>
index 0bd31d0..e1b6b0a 100644 (file)
@@ -15,8 +15,7 @@
     <dimen name="swipe_commit_distance">120dp</dimen>
 
     <!-- Custom Menu dimensions -->
-    <dimen name="menu_width">260dp</dimen>
-    <dimen name="menu_vertical_offset">0dp</dimen>
+    <dimen name="menu_width">258dp</dimen>
     <!-- The amount to fade the edges of the menu to indicate more content is available
          via scrolling. -->
     <dimen name="menu_vertical_fade_distance">15dp</dimen>
     <dimen name="edge_swipe_in_additional_slop">50dp</dimen>
     <dimen name="edge_swipe_out_slop">18dp</dimen>
     
-        <!-- Infobar dimensions -->
-    <!-- Text size of the InfoBar message. -->
+    <!-- Infobar dimensions -->
+    <!-- Text size of the infobar message. -->
     <dimen name="infobar_text_size">16sp</dimen>
-    <!-- Text size of text inside InfoBar buttons. -->
-    <dimen name="infobar_button_text_size">16sp</dimen>
-    <!-- Minimum dimension (height or width) of the upper row of an InfoBar. -->
-    <dimen name="infobar_min_size">60dp</dimen>
-    <!-- Margin between items in an InfoBar. -->
-    <dimen name="infobar_margin">10dp</dimen>
+    <!-- Text size of text inside infobar buttons. -->
+    <dimen name="infobar_button_text_size">14sp</dimen>
+    <!-- Minimum width of an infobar. -->
+    <dimen name="infobar_min_width">220dp</dimen>
+    <!-- Margin between items in an infobar. -->
+    <dimen name="infobar_margin">16dp</dimen>
     <!-- Left/right padding for infobar button text. -->
-    <dimen name="infobar_button_horizontal_padding">30dp</dimen>
+    <dimen name="infobar_button_horizontal_padding">20dp</dimen>
     <!-- Minimum height for a touch target. -->
     <dimen name="infobar_touch_target_height">40dp</dimen>
-    <!-- Dimension (height or width) of the InfoBar icon. -->
-    <dimen name="infobar_icon_size">31dp</dimen>
+    <!-- Width and height of the infobar icon. -->
+    <dimen name="infobar_icon_size">36dp</dimen>
 
     <!-- App banner dimensions -->
     <dimen name="app_banner_max_width">424dp</dimen>
@@ -1,12 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <!-- Copyright 2014 The Chromium Authors. All rights reserved.
+
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file.
 -->
 
 <resources>
-    <!-- Menu Dimensions -->
-    <!-- Necessary to align the menu with the bottom of the toolbar (the anchored button does not
-         extend to the bottom of the toolbar). -->
-    <dimen name="menu_vertical_offset">2dp</dimen>
+    <item name="menu_item_enter_anim_id" type="id" />
 </resources>
index ae109ff..836a302 100644 (file)
@@ -9,5 +9,9 @@
     <item type="id" name="infobar_close_button" />
     <item type="id" name="button_primary" />
     <item type="id" name="button_secondary" />
+    <item type="id" name="button_tertiary" />
     <item type="id" name="infobar_extra_check" />
+    
+    <!-- Menu Animation Constants -->
+    <item type="fraction" format="fraction" name="menu_animation_pivot_x">95%</item>
 </resources>
index 0ee5470..2ec6b9b 100644 (file)
@@ -63,5 +63,5 @@ public class EmptyTabObserver implements TabObserver {
             boolean isIframeSrcdoc) { }
 
     @Override
-    public void onDidChangeBrandColor(int color) { }
+    public void onDidChangeThemeColor(int color) { }
 }
index f2fdf3f..21e80f8 100644 (file)
@@ -31,67 +31,90 @@ public class NewTabPagePrefs {
     }
 
     /**
-     * Set snapshot document list collapsed or uncollapsed state in preferences.
-     * @param isCollapsed {@code True} Whether we want the snapshot documents list to be collapsed.
+     * Sets whether the list of currently open tabs is collapsed (vs expanded) on the Recent Tabs
+     * page.
+     * @param isCollapsed Whether we want the currently open tabs list to be collapsed.
+     */
+    public void setCurrentlyOpenTabsCollapsed(boolean isCollapsed) {
+        nativeSetCurrentlyOpenTabsCollapsed(mNativeNewTabPagePrefs, isCollapsed);
+    }
+
+    /**
+     * Gets whether the list of currently open tabs is collapsed (vs expanded) on Recent Tabs page.
+     * @return Whether the list of currently open tabs is collapsed (vs expanded) on
+     *         the Recent Tabs page.
+     */
+    public boolean getCurrentlyOpenTabsCollapsed() {
+        return nativeGetCurrentlyOpenTabsCollapsed(mNativeNewTabPagePrefs);
+    }
+
+    /**
+     * Sets whether the list of snapshot documents is collapsed (vs expanded) on the Recent Tabs
+     * page.
+     * @param isCollapsed Whether we want the snapshot documents list to be collapsed.
      */
     public void setSnapshotDocumentCollapsed(boolean isCollapsed) {
         nativeSetSnapshotDocumentCollapsed(mNativeNewTabPagePrefs, isCollapsed);
     }
 
     /**
-     * Get the snapshot document list collapsed or uncollapsed state in preferences.
-     * @return {@code True} Whether the snapshot documnets list is collapsed.
+     * Gets whether the list of snapshot documents is collapsed (vs expanded) on
+     * the Recent Tabs page.
+     * @return Whether the list of snapshot documents is collapsed (vs expanded) on
+     *         the Recent Tabs page.
      */
     public boolean getSnapshotDocumentCollapsed() {
         return nativeGetSnapshotDocumentCollapsed(mNativeNewTabPagePrefs);
     }
 
     /**
-     * Set recently closed tabs list collapsed or uncollapsed state in preferences.
-     * @param isCollapsed {@code True} Whether we want the recently closed tabs list to be
-     * collapsed.
+     * Sets whether the list of recently closed tabs is collapsed (vs expanded) on the Recent Tabs
+     * page.
+     * @param isCollapsed Whether we want the recently closed tabs list to be collapsed.
      */
     public void setRecentlyClosedTabsCollapsed(boolean isCollapsed) {
         nativeSetRecentlyClosedTabsCollapsed(mNativeNewTabPagePrefs, isCollapsed);
     }
 
     /**
-     * Get the recently closed document list collapsed or uncollapsed state in preferences.
-     * @return {@code True} Whether the recently closed list is collapsed.
+     * Gets whether the list of recently closed tabs is collapsed (vs expanded) on
+     * the Recent Tabs page.
+     * @return Whether the list of recently closed tabs is collapsed (vs expanded) on
+     *         the Recent Tabs page.
      */
     public boolean getRecentlyClosedTabsCollapsed() {
         return nativeGetRecentlyClosedTabsCollapsed(mNativeNewTabPagePrefs);
     }
 
     /**
-     * Set sync promo collapsed or uncollapsed state in preferences.
-     * @param isCollapsed {@code True} Whether we want the sync promo to be collapsed.
+     * Sets whether sync promo is collapsed (vs expanded) on the Recent Tabs page.
+     * @param isCollapsed Whether we want the sync promo to be collapsed.
      */
     public void setSyncPromoCollapsed(boolean isCollapsed) {
         nativeSetSyncPromoCollapsed(mNativeNewTabPagePrefs, isCollapsed);
     }
 
     /**
-     * Get the sync promo collapsed or uncollapsed state in preferences.
-     * @return {@code True} Whether the snapshot documnets list is collapsed.
+     * Gets whether sync promo is collapsed (vs expanded) on the Recent Tabs page.
+     * @return Whether the sync promo is collapsed (vs expanded) on the Recent Tabs page.
      */
     public boolean getSyncPromoCollapsed() {
         return nativeGetSyncPromoCollapsed(mNativeNewTabPagePrefs);
     }
 
     /**
-     * Set the given session collapsed or uncollapsed in preferences.
-     * @param session     Session to set collapsed or uncollapsed.
-     * @param isCollapsed {@code True} iff we want the session to be collapsed.
+     * Sets whether the given foreign session is collapsed (vs expanded) on the Recent Tabs page.
+     * @param session Session to set collapsed or expanded.
+     * @param isCollapsed Whether we want the foreign session to be collapsed.
      */
     public void setForeignSessionCollapsed(ForeignSession session, boolean isCollapsed) {
         nativeSetForeignSessionCollapsed(mNativeNewTabPagePrefs, session.tag, isCollapsed);
     }
 
     /**
-     * Get the given session collapsed or uncollapsed state in preferences.
+     * Gets whether the given foreign session is collapsed (vs expanded) on the Recent Tabs page.
      * @param  session Session to fetch collapsed state.
-     * @return         {@code True} if the session is collapsed, false if expanded.
+     * @return Whether the given foreign session is collapsed (vs expanded) on the Recent Tabs page.
      */
     public boolean getForeignSessionCollapsed(ForeignSession session) {
         return nativeGetForeignSessionCollapsed(mNativeNewTabPagePrefs, session.tag);
@@ -99,6 +122,10 @@ public class NewTabPagePrefs {
 
     private static native long nativeInit(Profile profile);
     private static native void nativeDestroy(long nativeNewTabPagePrefs);
+    private static native void nativeSetCurrentlyOpenTabsCollapsed(
+            long nativeNewTabPagePrefs, boolean isCollapsed);
+    private static native boolean nativeGetCurrentlyOpenTabsCollapsed(
+            long nativeNewTabPagePrefs);
     private static native void nativeSetSnapshotDocumentCollapsed(
             long nativeNewTabPagePrefs, boolean isCollapsed);
     private static native boolean nativeGetSnapshotDocumentCollapsed(
index c98b45a..9762af9 100644 (file)
@@ -14,14 +14,17 @@ import android.util.Log;
 
 import org.chromium.base.CalledByNative;
 
+import java.io.ByteArrayOutputStream;
 import java.util.UUID;
 
 /**
  * This is a helper class to create shortcuts on the Android home screen.
  */
 public class ShortcutHelper {
+    public static final String EXTRA_ICON = "org.chromium.chrome.browser.webapp_icon";
     public static final String EXTRA_ID = "org.chromium.chrome.browser.webapp_id";
     public static final String EXTRA_MAC = "org.chromium.chrome.browser.webapp_mac";
+    public static final String EXTRA_TITLE = "org.chromium.chrome.browser.webapp_title";
     public static final String EXTRA_URL = "org.chromium.chrome.browser.webapp_url";
 
     private static String sFullScreenAction;
@@ -62,13 +65,24 @@ public class ShortcutHelper {
             int red, int green, int blue, boolean isWebappCapable) {
         assert sFullScreenAction != null;
 
-        Intent shortcutIntent = null;
+        Intent shortcutIntent;
         if (isWebappCapable) {
+            // Encode the favicon as a base64 string (Launcher drops Bitmaps in the Intent).
+            String encodedIcon = "";
+            if (favicon != null) {
+                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+                favicon.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
+                byte[] byteArray = byteArrayOutputStream.toByteArray();
+                encodedIcon = Base64.encodeToString(byteArray, Base64.DEFAULT);
+            }
+
             // Add the shortcut as a launcher icon for a full-screen Activity.
             shortcutIntent = new Intent();
             shortcutIntent.setAction(sFullScreenAction);
-            shortcutIntent.putExtra(EXTRA_URL, url);
+            shortcutIntent.putExtra(EXTRA_ICON, encodedIcon);
             shortcutIntent.putExtra(EXTRA_ID, UUID.randomUUID().toString());
+            shortcutIntent.putExtra(EXTRA_TITLE, title);
+            shortcutIntent.putExtra(EXTRA_URL, url);
 
             // The only reason we convert to a String here is because Android inexplicably eats a
             // byte[] when adding the shortcut -- the Bundle received by the launched Activity even
index c3835b6..e9b9274 100644 (file)
@@ -283,9 +283,9 @@ public class Tab implements NavigationClient {
         }
 
         @Override
-        public void didChangeBrandColor(int color) {
+        public void didChangeThemeColor(int color) {
             for (TabObserver observer : mObservers) {
-                observer.onDidChangeBrandColor(color);
+                observer.onDidChangeThemeColor(color);
             }
         }
     }
@@ -1100,7 +1100,7 @@ public class Tab implements NavigationClient {
      * @param id The current id.  Maybe {@link #INVALID_TAB_ID}.
      * @return   A new id if {@code id} was {@link #INVALID_TAB_ID}, or {@code id}.
      */
-    private static int generateValidId(int id) {
+    public static int generateValidId(int id) {
         if (id == INVALID_TAB_ID) id = generateNextId();
         incrementIdCounterTo(id + 1);
 
index f48abad..42f0eb6 100644 (file)
@@ -144,8 +144,8 @@ public interface TabObserver {
             boolean isErrorPage, boolean isIframeSrcdoc);
 
     /**
-     * Called when the brand color is changed
+     * Called when the theme color is changed
      * @param color the new color in ARGB format.
      */
-    public void onDidChangeBrandColor(int color);
+    public void onDidChangeThemeColor(int color);
 }
index a227ef0..6f7f573 100644 (file)
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.appmenu;
 
+import android.animation.Animator;
+import android.animation.AnimatorSet;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Rect;
@@ -34,13 +36,15 @@ import java.util.List;
  *   - Disabled items are grayed out.
  */
 public class AppMenu implements OnItemClickListener, OnKeyListener {
+    /** Whether or not to show the software menu button in the menu. */
+    private static final boolean SHOW_SW_MENU_BUTTON = true;
+
     private static final float LAST_ITEM_SHOW_FRACTION = 0.5f;
 
     private final Menu mMenu;
     private final int mItemRowHeight;
     private final int mItemDividerHeight;
     private final int mVerticalFadeDistance;
-    private final int mAdditionalVerticalOffset;
     private ListPopupWindow mPopup;
     private AppMenuAdapter mAdapter;
     private AppMenuHandler mHandler;
@@ -67,7 +71,6 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
         mItemDividerHeight = itemDividerHeight;
         assert mItemDividerHeight >= 0;
 
-        mAdditionalVerticalOffset = res.getDimensionPixelSize(R.dimen.menu_vertical_offset);
         mVerticalFadeDistance = res.getDimensionPixelSize(R.dimen.menu_vertical_fade_distance);
     }
 
@@ -97,11 +100,24 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
                 mHandler.onMenuVisibilityChanged(false);
             }
         });
-        mPopup.setWidth(context.getResources().getDimensionPixelSize(R.dimen.menu_width));
 
         // Need to explicitly set the background here.  Relying on it being set in the style caused
         // an incorrectly drawn background.
-        mPopup.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.menu_bg));
+        if (isByHardwareButton) {
+            mPopup.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.menu_bg));
+        } else {
+            mPopup.setBackgroundDrawable(
+                    context.getResources().getDrawable(R.drawable.edge_menu_bg));
+            mPopup.setAnimationStyle(R.style.OverflowMenuAnim);
+        }
+
+        Rect bgPadding = new Rect();
+        mPopup.getBackground().getPadding(bgPadding);
+
+        int popupWidth = context.getResources().getDimensionPixelSize(R.dimen.menu_width) +
+                bgPadding.left + bgPadding.right;
+
+        mPopup.setWidth(popupWidth);
 
         mCurrentScreenRotation = screenRotation;
         mIsByHardwareButton = isByHardwareButton;
@@ -116,9 +132,12 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
             }
         }
 
+        boolean showMenuButton = !mIsByHardwareButton;
+        if (!SHOW_SW_MENU_BUTTON) showMenuButton = false;
         // A List adapter for visible items in the Menu. The first row is added as a header to the
         // list view.
-        mAdapter = new AppMenuAdapter(this, menuItems, LayoutInflater.from(context));
+        mAdapter = new AppMenuAdapter(
+                this, menuItems, LayoutInflater.from(context), showMenuButton);
         mPopup.setAdapter(mAdapter);
 
         setMenuHeight(menuItems.size(), visibleDisplayFrame);
@@ -134,6 +153,15 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
             mPopup.getListView().setVerticalFadingEdgeEnabled(true);
             mPopup.getListView().setFadingEdgeLength(mVerticalFadeDistance);
         }
+
+        mPopup.getListView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+            @Override
+            public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                mPopup.getListView().removeOnLayoutChangeListener(this);
+                runMenuItemEnterAnimations();
+            }
+        });
     }
 
     private void setPopupOffset(ListPopupWindow popup, int screenRotation, Rect appRect) {
@@ -141,6 +169,7 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
         popup.getBackground().getPadding(paddingRect);
         int[] anchorLocation = new int[2];
         popup.getAnchorView().getLocationInWindow(anchorLocation);
+        int anchorHeight = popup.getAnchorView().getHeight();
 
         // If we have a hardware menu button, locate the app menu closer to the estimated
         // hardware menu button location.
@@ -163,11 +192,11 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
             popup.setHorizontalOffset(horizontalOffset);
             // The menu is displayed above the anchored view, so shift the menu up by the top
             // padding of the background.
-            popup.setVerticalOffset(mAdditionalVerticalOffset - paddingRect.bottom);
+            popup.setVerticalOffset(-paddingRect.bottom);
         } else {
-            // The menu is displayed below the anchored view, so shift the menu up by the top
-            // padding of the background.
-            popup.setVerticalOffset(mAdditionalVerticalOffset - paddingRect.top);
+            // The menu is displayed over and below the anchored view, so shift the menu up by the
+            // height of the anchor view.
+            popup.setVerticalOffset(-anchorHeight);
         }
     }
 
@@ -212,7 +241,9 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
      */
     void dismiss() {
         mHandler.appMenuDismissed();
-        if (isShowing()) mPopup.dismiss();
+        if (isShowing()) {
+            mPopup.dismiss();
+        }
     }
 
     /**
@@ -238,9 +269,10 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
         int[] anchorViewLocation = new int[2];
         anchorView.getLocationOnScreen(anchorViewLocation);
         anchorViewLocation[1] -= appDimensions.top;
+        int anchorViewImpactHeight = mIsByHardwareButton ? anchorView.getHeight() : 0;
 
         int availableScreenSpace = Math.max(anchorViewLocation[1],
-                appDimensions.height() - anchorViewLocation[1] - anchorView.getHeight());
+                appDimensions.height() - anchorViewLocation[1] - anchorViewImpactHeight);
 
         Rect padding = new Rect();
         mPopup.getBackground().getPadding(padding);
@@ -264,4 +296,24 @@ public class AppMenu implements OnItemClickListener, OnKeyListener {
             mPopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
         }
     }
-}
\ No newline at end of file
+
+    private void runMenuItemEnterAnimations() {
+        AnimatorSet animation = new AnimatorSet();
+        AnimatorSet.Builder builder = null;
+
+        ViewGroup list = mPopup.getListView();
+        for (int i = 0; i < list.getChildCount(); i++) {
+            View view = list.getChildAt(i);
+            Object animatorObject = view.getTag(R.id.menu_item_enter_anim_id);
+            if (animatorObject != null) {
+                if (builder == null) {
+                    builder = animation.play((Animator) animatorObject);
+                } else {
+                    builder.with((Animator) animatorObject);
+                }
+            }
+        }
+
+        animation.start();
+    }
+}
index 6bf7f43..2b60292 100644 (file)
@@ -4,6 +4,10 @@
 
 package org.chromium.chrome.browser.appmenu;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
 import android.graphics.drawable.Drawable;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
@@ -12,10 +16,15 @@ import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
 import android.widget.ListView;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
+import org.chromium.ui.base.LocalizationUtils;
+import org.chromium.ui.interpolators.BakedBezierInterpolator;
 
 import java.util.List;
 
@@ -23,7 +32,7 @@ import java.util.List;
  * ListAdapter to customize the view of items in the list.
  */
 class AppMenuAdapter extends BaseAdapter {
-    private static final int VIEW_TYPE_COUNT = 4;
+    private static final int VIEW_TYPE_COUNT = 5;
 
     /**
      * Regular Android menu item that contains a title and an icon if icon is specified.
@@ -42,17 +51,38 @@ class AppMenuAdapter extends BaseAdapter {
      * Menu item that has four buttons. Every one of these buttons is displayed as an icon.
      */
     private static final int FOUR_BUTTON_MENU_ITEM = 3;
+    /**
+     * Menu item that has two buttons, the first one is a title and the second is a menu icon.
+     * This is similar to {@link #TITLE_BUTTON_MENU_ITEM} but has some slight layout differences.
+     */
+    private static final int MENU_BUTTON_MENU_ITEM = 4;
+
+    /** MenuItem Animation Constants */
+    private static final int ENTER_ITEM_DURATION_MS = 350;
+    private static final int ENTER_ITEM_BASE_DELAY_MS = 80;
+    private static final int ENTER_ITEM_ADDL_DELAY_MS = 30;
+    private static final float ENTER_STANDARD_ITEM_OFFSET_Y_DP = -10.f;
+    private static final float ENTER_STANDARD_ITEM_OFFSET_X_DP = 10.f;
+
+    /** Menu Button Layout Constants */
+    private static final float MENU_BUTTON_WIDTH_DP = 59.f;
+    private static final float MENU_BUTTON_START_PADDING_DP = 21.f;
 
     private final AppMenu mAppMenu;
     private final LayoutInflater mInflater;
     private final List<MenuItem> mMenuItems;
     private final int mNumMenuItems;
+    private final boolean mShowMenuButton;
+    private final float mDpToPx;
 
-    public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInflater inflater) {
+    public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInflater inflater,
+            boolean showMenuButton) {
         mAppMenu = appMenu;
         mMenuItems = menuItems;
         mInflater = inflater;
         mNumMenuItems = menuItems.size();
+        mShowMenuButton = showMenuButton;
+        mDpToPx = inflater.getContext().getResources().getDisplayMetrics().density;
     }
 
     @Override
@@ -67,14 +97,17 @@ class AppMenuAdapter extends BaseAdapter {
 
     @Override
     public int getItemViewType(int position) {
-        if (getItem(position).hasSubMenu()) {
-            if (getItem(position).getSubMenu().size() == 4) {
-                return FOUR_BUTTON_MENU_ITEM;
-            } else if (getItem(position).getSubMenu().size() == 3) {
-                return THREE_BUTTON_MENU_ITEM;
-            } else if (getItem(position).getSubMenu().size() == 2) {
-                return TITLE_BUTTON_MENU_ITEM;
-            }
+        MenuItem item = getItem(position);
+        boolean hasMenuButton = mShowMenuButton && position == 0;
+        int viewCount = item.hasSubMenu() ? item.getSubMenu().size() : 1;
+        if (hasMenuButton) viewCount++;
+
+        if (viewCount == 4) {
+            return FOUR_BUTTON_MENU_ITEM;
+        } else if (viewCount == 3) {
+            return THREE_BUTTON_MENU_ITEM;
+        } else if (viewCount == 2) {
+            return hasMenuButton ? MENU_BUTTON_MENU_ITEM : TITLE_BUTTON_MENU_ITEM;
         }
         return STANDARD_MENU_ITEM;
     }
@@ -94,6 +127,7 @@ class AppMenuAdapter extends BaseAdapter {
 
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
+        final boolean hasMenuButton = mShowMenuButton && position == 0;
         final MenuItem item = getItem(position);
         switch (getItemViewType(position)) {
             case STANDARD_MENU_ITEM: {
@@ -104,6 +138,8 @@ class AppMenuAdapter extends BaseAdapter {
                     holder.text = (TextView) convertView.findViewById(R.id.menu_item_text);
                     holder.image = (AppMenuItemIcon) convertView.findViewById(R.id.menu_item_icon);
                     convertView.setTag(holder);
+                    convertView.setTag(R.id.menu_item_enter_anim_id,
+                            buildStandardItemEnterAnimator(convertView, position));
                 } else {
                     holder = (StandardMenuItemViewHolder) convertView.getTag();
                 }
@@ -133,16 +169,23 @@ class AppMenuAdapter extends BaseAdapter {
                 if (convertView == null) {
                     holder = new ThreeButtonMenuItemViewHolder();
                     convertView = mInflater.inflate(R.layout.three_button_menu_item, parent, false);
-                    holder.buttonOne = (ImageButton) convertView.findViewById(R.id.button_one);
-                    holder.buttonTwo = (ImageButton) convertView.findViewById(R.id.button_two);
-                    holder.buttonThree = (ImageButton) convertView.findViewById(R.id.button_three);
+                    holder.buttons[0] = (ImageButton) convertView.findViewById(R.id.button_one);
+                    holder.buttons[1] = (ImageButton) convertView.findViewById(R.id.button_two);
+                    holder.buttons[2] = (ImageButton) convertView.findViewById(R.id.button_three);
                     convertView.setTag(holder);
+                    convertView.setTag(R.id.menu_item_enter_anim_id,
+                            buildIconItemEnterAnimator(holder.buttons, hasMenuButton));
                 } else {
                     holder = (ThreeButtonMenuItemViewHolder) convertView.getTag();
                 }
-                setupImageButton(holder.buttonOne, item.getSubMenu().getItem(0));
-                setupImageButton(holder.buttonTwo, item.getSubMenu().getItem(1));
-                setupImageButton(holder.buttonThree, item.getSubMenu().getItem(2));
+                setupImageButton(holder.buttons[0], item.getSubMenu().getItem(0));
+                setupImageButton(holder.buttons[1], item.getSubMenu().getItem(1));
+                if (hasMenuButton) {
+                    setupMenuButton(holder.buttons[3]);
+                } else {
+                    setupImageButton(holder.buttons[2], item.getSubMenu().getItem(2));
+                }
+
                 convertView.setFocusable(false);
                 convertView.setEnabled(false);
                 break;
@@ -152,34 +195,47 @@ class AppMenuAdapter extends BaseAdapter {
                 if (convertView == null) {
                     holder = new FourButtonMenuItemViewHolder();
                     convertView = mInflater.inflate(R.layout.four_button_menu_item, parent, false);
-                    holder.buttonOne = (ImageButton) convertView.findViewById(R.id.button_one);
-                    holder.buttonTwo = (ImageButton) convertView.findViewById(R.id.button_two);
-                    holder.buttonThree = (ImageButton) convertView.findViewById(R.id.button_three);
-                    holder.buttonFour = (ImageButton) convertView.findViewById(R.id.button_four);
+                    holder.buttons[0] = (ImageButton) convertView.findViewById(R.id.button_one);
+                    holder.buttons[1] = (ImageButton) convertView.findViewById(R.id.button_two);
+                    holder.buttons[2] = (ImageButton) convertView.findViewById(R.id.button_three);
+                    holder.buttons[3] = (ImageButton) convertView.findViewById(R.id.button_four);
                     convertView.setTag(holder);
+                    convertView.setTag(R.id.menu_item_enter_anim_id,
+                            buildIconItemEnterAnimator(holder.buttons, hasMenuButton));
                 } else {
                     holder = (FourButtonMenuItemViewHolder) convertView.getTag();
                 }
-                setupImageButton(holder.buttonOne, item.getSubMenu().getItem(0));
-                setupImageButton(holder.buttonTwo, item.getSubMenu().getItem(1));
-                setupImageButton(holder.buttonThree, item.getSubMenu().getItem(2));
-                setupImageButton(holder.buttonFour, item.getSubMenu().getItem(3));
+                setupImageButton(holder.buttons[0], item.getSubMenu().getItem(0));
+                setupImageButton(holder.buttons[1], item.getSubMenu().getItem(1));
+                setupImageButton(holder.buttons[2], item.getSubMenu().getItem(2));
+                if (hasMenuButton) {
+                    setupMenuButton(holder.buttons[3]);
+                } else {
+                    setupImageButton(holder.buttons[3], item.getSubMenu().getItem(3));
+                }
                 convertView.setFocusable(false);
                 convertView.setEnabled(false);
                 break;
             }
-            case TITLE_BUTTON_MENU_ITEM: {
+            case TITLE_BUTTON_MENU_ITEM:
+                // Fall through.
+            case MENU_BUTTON_MENU_ITEM: {
                 TitleButtonMenuItemViewHolder holder = null;
                 if (convertView == null) {
                     holder = new TitleButtonMenuItemViewHolder();
                     convertView = mInflater.inflate(R.layout.title_button_menu_item, parent, false);
                     holder.title = (TextView) convertView.findViewById(R.id.title);
                     holder.button = (ImageButton) convertView.findViewById(R.id.button);
+
+                    View animatedView = hasMenuButton ? holder.title : convertView;
+
                     convertView.setTag(holder);
+                    convertView.setTag(R.id.menu_item_enter_anim_id,
+                            buildStandardItemEnterAnimator(animatedView, position));
                 } else {
                     holder = (TitleButtonMenuItemViewHolder) convertView.getTag();
                 }
-                final MenuItem titleItem = item.getSubMenu().getItem(0);
+                final MenuItem titleItem = item.hasSubMenu() ? item.getSubMenu().getItem(0) : item;
                 holder.title.setText(titleItem.getTitle());
                 holder.title.setEnabled(titleItem.isEnabled());
                 holder.title.setFocusable(titleItem.isEnabled());
@@ -189,7 +245,11 @@ class AppMenuAdapter extends BaseAdapter {
                         mAppMenu.onItemClick(titleItem);
                     }
                 });
-                if (item.getSubMenu().getItem(1).getIcon() != null) {
+
+                if (hasMenuButton) {
+                    holder.button.setVisibility(View.VISIBLE);
+                    setupMenuButton(holder.button);
+                } else if (item.getSubMenu().getItem(1).getIcon() != null) {
                     holder.button.setVisibility(View.VISIBLE);
                     setupImageButton(holder.button, item.getSubMenu().getItem(1));
                 } else {
@@ -206,7 +266,11 @@ class AppMenuAdapter extends BaseAdapter {
     }
 
     private void setupImageButton(ImageButton button, final MenuItem item) {
+        // Store and recover the level of image as button.setimageDrawable
+        // resets drawable to default level.
+        int currentLevel = item.getIcon().getLevel();
         button.setImageDrawable(item.getIcon());
+        item.getIcon().setLevel(currentLevel);
         button.setContentDescription(item.getTitle());
         button.setEnabled(item.isEnabled());
         button.setFocusable(item.isEnabled());
@@ -218,22 +282,111 @@ class AppMenuAdapter extends BaseAdapter {
         });
     }
 
+    private void setupMenuButton(ImageButton button) {
+        button.setImageResource(R.drawable.btn_menu_pressed);
+        button.setContentDescription(button.getResources().getString(R.string.menu_dismiss_btn));
+        button.setEnabled(true);
+        button.setFocusable(true);
+        button.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mAppMenu.dismiss();
+            }
+        });
+
+        // Set the button layout to make it properly line up with any underlying menu button
+        ApiCompatibilityUtils.setPaddingRelative(
+                button, (int) (MENU_BUTTON_START_PADDING_DP * mDpToPx), 0, 0, 0);
+        button.getLayoutParams().width = (int) (MENU_BUTTON_WIDTH_DP * mDpToPx);
+        button.setScaleType(ScaleType.CENTER);
+    }
+
+    /**
+     * This builds an {@link Animator} for the enter animation of a standard menu item.  This means
+     * it will animate the alpha from 0 to 1 and translate the view from -10dp to 0dp on the y axis.
+     *
+     * @param view     The menu item {@link View} to be animated.
+     * @param position The position in the menu.  This impacts the start delay of the animation.
+     * @return         The {@link Animator}.
+     */
+    private Animator buildStandardItemEnterAnimator(final View view, int position) {
+        final float offsetYPx = ENTER_STANDARD_ITEM_OFFSET_Y_DP * mDpToPx;
+        final int startDelay = ENTER_ITEM_BASE_DELAY_MS + ENTER_ITEM_ADDL_DELAY_MS * position;
+
+        AnimatorSet animation = new AnimatorSet();
+        animation.playTogether(
+                ObjectAnimator.ofFloat(view, View.ALPHA, 0.f, 1.f),
+                ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, offsetYPx, 0.f));
+        animation.setDuration(ENTER_ITEM_DURATION_MS);
+        animation.setStartDelay(startDelay);
+        animation.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE);
+
+        animation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                view.setAlpha(0.f);
+            }
+        });
+        return animation;
+    }
+
+    /**
+     * This builds an {@link Animator} for the enter animation of icon row menu items.  This means
+     * it will animate the alpha from 0 to 1 and translate the views from 10dp to 0dp on the x axis.
+     *
+     * @param views        The list if icons in the menu item that should be animated.
+     * @param skipLastItem Whether or not the last item should be animated or not.
+     * @return             The {@link Animator}.
+     */
+    private Animator buildIconItemEnterAnimator(final ImageView[] views, boolean skipLastItem) {
+        final boolean rtl = LocalizationUtils.isLayoutRtl();
+        final float offsetXPx = ENTER_STANDARD_ITEM_OFFSET_X_DP * mDpToPx * (rtl ? -1.f : 1.f);
+        final int maxViewsToAnimate = views.length - (skipLastItem ? 1 : 0);
+
+        AnimatorSet animation = new AnimatorSet();
+        AnimatorSet.Builder builder = null;
+        for (int i = 0; i < maxViewsToAnimate; i++) {
+            final int startDelay = ENTER_ITEM_ADDL_DELAY_MS * i;
+
+            Animator alpha = ObjectAnimator.ofFloat(views[i], View.ALPHA, 0.f, 1.f);
+            Animator translate = ObjectAnimator.ofFloat(views[i], View.TRANSLATION_X, offsetXPx, 0);
+            alpha.setStartDelay(startDelay);
+            translate.setStartDelay(startDelay);
+            alpha.setDuration(ENTER_ITEM_DURATION_MS);
+            translate.setDuration(ENTER_ITEM_DURATION_MS);
+
+            if (builder == null) {
+                builder = animation.play(alpha);
+            } else {
+                builder.with(alpha);
+            }
+            builder.with(translate);
+        }
+        animation.setStartDelay(ENTER_ITEM_BASE_DELAY_MS);
+        animation.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE);
+
+        animation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                for (int i = 0; i < maxViewsToAnimate; i++) {
+                    views[i].setAlpha(0.f);
+                }
+            }
+        });
+        return animation;
+    }
+
     static class StandardMenuItemViewHolder {
         public TextView text;
         public AppMenuItemIcon image;
     }
 
     static class ThreeButtonMenuItemViewHolder {
-        public ImageButton buttonOne;
-        public ImageButton buttonTwo;
-        public ImageButton buttonThree;
+        public ImageButton[] buttons = new ImageButton[3];
     }
 
     static class FourButtonMenuItemViewHolder {
-        public ImageButton buttonOne;
-        public ImageButton buttonTwo;
-        public ImageButton buttonThree;
-        public ImageButton buttonFour;
+        public ImageButton[] buttons = new ImageButton[4];
     }
 
     static class TitleButtonMenuItemViewHolder {
index cb5354b..3e71ebd 100644 (file)
@@ -124,7 +124,6 @@ public class AnimationHelper implements ViewTreeObserver.OnGlobalLayoutListener
         if (mAnimationStarted) return;
         mAnimationStarted = true;
 
-        boolean infoBarsOnTop = mContainer.areInfoBarsOnTop();
         int indexOfWrapperView = mContainer.indexOfChild(mTargetWrapperView);
         assert indexOfWrapperView != -1;
 
@@ -136,16 +135,14 @@ public class AnimationHelper implements ViewTreeObserver.OnGlobalLayoutListener
         int cumulativeTopStart = 0;
         int cumulativeTopEnd = 0;
         int cumulativeEndHeight = 0;
-        if (!infoBarsOnTop) {
-            if (heightDifference >= 0) {
-                // The current container is smaller than the final container, so the current 0
-                // coordinate will be >= 0 in the final container.
-                cumulativeTopStart = heightDifference;
-            } else {
-                // The current container is bigger than the final container, so the current 0
-                // coordinate will be < 0 in the final container.
-                cumulativeTopEnd = -heightDifference;
-            }
+        if (heightDifference >= 0) {
+            // The current container is smaller than the final container, so the current 0
+            // coordinate will be >= 0 in the final container.
+            cumulativeTopStart = heightDifference;
+        } else {
+            // The current container is bigger than the final container, so the current 0
+            // coordinate will be < 0 in the final container.
+            cumulativeTopEnd = -heightDifference;
         }
 
         for (int i = 0; i < mContainer.getChildCount(); ++i) {
@@ -169,13 +166,12 @@ public class AnimationHelper implements ViewTreeObserver.OnGlobalLayoutListener
             } else {
                 // A translation is required to move the View into place.
                 int translation = heightDifference;
-                if (infoBarsOnTop) translation *= -1;
 
-                boolean translateDownward = false;
+                boolean translateDownward;
                 if (topStart < topEnd) {
-                    translateDownward = infoBarsOnTop;
+                    translateDownward = false;
                 } else if (topStart > topEnd) {
-                    translateDownward = !infoBarsOnTop;
+                    translateDownward = true;
                 } else {
                     translateDownward = bottomEnd > bottomStart;
                 }
@@ -204,28 +200,16 @@ public class AnimationHelper implements ViewTreeObserver.OnGlobalLayoutListener
 
         // Lock the InfoBarContainer's size at its largest during the animation to avoid
         // clipping issues.
-        final int oldContainerTop = mContainer.getTop();
-        final int oldContainerBottom = mContainer.getBottom();
-        final int newContainerTop;
-        final int newContainerBottom;
-        if (infoBarsOnTop) {
-            newContainerTop = oldContainerTop;
-            newContainerBottom = newContainerTop + cumulativeEndHeight;
-        } else {
-            newContainerBottom = oldContainerBottom;
-            newContainerTop = newContainerBottom - cumulativeEndHeight;
-        }
-        final int biggestContainerTop = Math.min(oldContainerTop, newContainerTop);
-        final int biggestContainerBottom = Math.max(oldContainerBottom, newContainerBottom);
+        int oldContainerTop = mContainer.getTop();
+        int newContainerTop = mContainer.getBottom() - cumulativeEndHeight;
+        int biggestContainerTop = Math.min(oldContainerTop, newContainerTop);
         mContainer.setTop(biggestContainerTop);
-        mContainer.setBottom(biggestContainerBottom);
 
         // Set up and run all of the animations.
         mAnimatorSet.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationStart(Animator animation) {
                 mTargetWrapperView.startTransition();
-                mContainer.startTransition();
             }
 
             @Override
@@ -236,8 +220,7 @@ public class AnimationHelper implements ViewTreeObserver.OnGlobalLayoutListener
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && mToShow != null &&
                         (mAnimationType == ANIMATION_TYPE_SHOW ||
                                 mAnimationType == ANIMATION_TYPE_SWAP)) {
-                    mToShow.announceForAccessibility(
-                            mInfoBar.getMessageText(mContainer.getContext()));
+                    mToShow.announceForAccessibility(mInfoBar.getMessage());
                 }
             }
         });
index b210709..af84fef 100644 (file)
@@ -4,88 +4,38 @@
 
 package org.chromium.chrome.browser.infobar;
 
-import android.content.Context;
-import android.text.SpannableStringBuilder;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.text.style.ClickableSpan;
-import android.view.View;
-
 /**
- * An infobar that presents the user with 2 buttons (typically OK, Cancel).
+ * An infobar that presents the user with several buttons.
+ *
+ * TODO(newt): merge this into InfoBar.java.
  */
-public class ConfirmInfoBar extends TwoButtonInfoBar {
-    // Message to prompt the user.
-    private final String mMessage;
-
-    // Link text shown to the user, in addition to the message.
-    private final String mLinkText;
-
-    // Typically set to "OK", or some other positive action.
+public class ConfirmInfoBar extends InfoBar {
+    /** Text shown on the primary button, e.g. "OK". */
     private final String mPrimaryButtonText;
 
-    // Typically set to "Cancel", or some other negative action.
+    /** Text shown on the secondary button, e.g. "Cancel".*/
     private final String mSecondaryButtonText;
 
-    // Listens for when either of the buttons is clicked.
-    private final InfoBarListeners.Confirm mConfirmListener;
+    /** Text shown on the extra button, e.g. "More info". */
+    private final String mTertiaryButtonText;
 
-    public ConfirmInfoBar(InfoBarListeners.Confirm confirmListener, int backgroundType,
-            int iconDrawableId, String message, String primaryButtonText,
-            String secondaryButtonText) {
-        this(confirmListener, backgroundType, iconDrawableId, message, null, primaryButtonText,
-                secondaryButtonText);
-    }
+    /** Notified when one of the buttons is clicked. */
+    private final InfoBarListeners.Confirm mConfirmListener;
 
-    public ConfirmInfoBar(InfoBarListeners.Confirm confirmListener, int backgroundType,
+    public ConfirmInfoBar(long nativeInfoBar, InfoBarListeners.Confirm confirmListener,
             int iconDrawableId, String message, String linkText, String primaryButtonText,
             String secondaryButtonText) {
-        this(0, confirmListener, backgroundType, iconDrawableId, message, linkText,
-                primaryButtonText, secondaryButtonText);
-    }
-
-    public ConfirmInfoBar(long nativeInfoBar, InfoBarListeners.Confirm confirmListener,
-            int backgroundType, int iconDrawableId, String message, String linkText,
-            String primaryButtonText, String secondaryButtonText) {
-        super(confirmListener, backgroundType, iconDrawableId);
-        mMessage = message;
-        mLinkText = linkText;
+        super(confirmListener, iconDrawableId, message);
         mPrimaryButtonText = primaryButtonText;
         mSecondaryButtonText = secondaryButtonText;
+        mTertiaryButtonText = linkText;
         mConfirmListener = confirmListener;
         setNativeInfoBar(nativeInfoBar);
     }
 
     @Override
-    public CharSequence getMessageText(Context context) {
-        // Construct text to be displayed on the infobar.
-        SpannableStringBuilder infobarMessage = new SpannableStringBuilder(mMessage);
-
-        // If we have a link text to display, append it.
-        if (!TextUtils.isEmpty(mLinkText)) {
-            SpannableStringBuilder spannableLinkText = new SpannableStringBuilder(mLinkText);
-            ClickableSpan onLinkClicked = new ClickableSpan() {
-                @Override
-                public void onClick(View view) {
-                    onLinkClicked();
-                }
-            };
-            spannableLinkText.setSpan(onLinkClicked, 0, spannableLinkText.length(),
-                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-            infobarMessage.append(" ");
-            infobarMessage.append(spannableLinkText);
-        }
-        return infobarMessage;
-    }
-
-    @Override
-    public String getPrimaryButtonText(Context context) {
-        return mPrimaryButtonText;
-    }
-
-    @Override
-    public String getSecondaryButtonText(Context context) {
-        return mSecondaryButtonText;
+    public void createContent(InfoBarLayout layout) {
+        layout.setButtons(mPrimaryButtonText, mSecondaryButtonText, mTertiaryButtonText);
     }
 
     @Override
index b43830e..d99fb15 100644 (file)
@@ -36,11 +36,8 @@ public class ConfirmInfoBarDelegate {
             String linkText, String buttonOk, String buttonCancel) {
         int drawableId = ResourceId.mapToDrawableId(enumeratedIconId);
 
-        // Apparently, yellow was the popular choice at the time these InfoBars were implemented
-        // because they stuck out more (hence the BACKGROUND_TYPE_WARNING) default.
-        ConfirmInfoBar infoBar = new ConfirmInfoBar(nativeInfoBar, null,
-                InfoBar.BACKGROUND_TYPE_WARNING, drawableId, message, linkText, buttonOk,
-                buttonCancel);
+        ConfirmInfoBar infoBar = new ConfirmInfoBar(nativeInfoBar, null, drawableId, message,
+                linkText, buttonOk, buttonCancel);
         return infoBar;
     }
 }
index 1bf45fd..216b35f 100644 (file)
@@ -16,7 +16,6 @@ import android.view.ViewGroup;
 import android.view.ViewParent;
 import android.widget.FrameLayout;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 
 import java.util.ArrayList;
@@ -36,7 +35,6 @@ public class ContentWrapperView extends FrameLayout {
     private static final int CONTENT_INDEX = 0;
 
     private final int mGravity;
-    private final boolean mInfoBarsFromTop;
     private final InfoBar mInfoBar;
 
     private View mViewToHide;
@@ -46,32 +44,22 @@ public class ContentWrapperView extends FrameLayout {
      * Constructs a ContentWrapperView object.
      * @param context The context to create this View with.
      */
-    public ContentWrapperView(Context context, InfoBar infoBar, int backgroundType, View panel,
-            boolean infoBarsFromTop) {
+    public ContentWrapperView(Context context, InfoBar infoBar, View panel) {
         // Set up this ViewGroup.
         super(context);
         mInfoBar = infoBar;
-        mGravity = infoBarsFromTop ? Gravity.BOTTOM : Gravity.TOP;
-        mInfoBarsFromTop = infoBarsFromTop;
-
-        // Pull out resources we need for the backgrounds.  Defaults to the INFO type.
-        int separatorBackground = R.color.infobar_info_background_separator;
-        int layoutBackground = R.drawable.infobar_info_background;
-        if (backgroundType == InfoBar.BACKGROUND_TYPE_WARNING) {
-            layoutBackground = R.drawable.infobar_warning_background;
-            separatorBackground = R.color.infobar_warning_background_separator;
-        }
+        mGravity = Gravity.TOP;
 
         // Set up this view.
         Resources resources = context.getResources();
         LayoutParams wrapParams = new LayoutParams(LayoutParams.MATCH_PARENT,
                 LayoutParams.WRAP_CONTENT);
         setLayoutParams(wrapParams);
-        ApiCompatibilityUtils.setBackgroundForView(this, resources.getDrawable(layoutBackground));
+        setBackgroundColor(resources.getColor(R.color.infobar_background));
 
         // Add a separator line that delineates different InfoBars.
         View separator = new View(context);
-        separator.setBackgroundColor(resources.getColor(separatorBackground));
+        separator.setBackgroundColor(resources.getColor(R.color.infobar_background_separator));
         addView(separator, new LayoutParams(LayoutParams.MATCH_PARENT, getBoundaryHeight(context),
                 mGravity));
 
@@ -161,20 +149,6 @@ public class ContentWrapperView extends FrameLayout {
 
             // We're transitioning between two views; set the alpha so it doesn't pop in.
             if (mViewToHide != null) mViewToShow.setAlpha(0.0f);
-
-            // Because of layout scheduling, we need to move the child Views downward before it
-            // occurs.  Failure to do so results in the Views being located incorrectly during the
-            // first few frames of the animation.
-            if (mInfoBarsFromTop && getViewToShowHeight() > getViewToHideHeight()) {
-                getLayoutParams().height = getViewToShowHeight();
-
-                int translation = getTransitionHeightDifference();
-                for (int i = 0; i < getChildCount(); ++i) {
-                    View v = getChildAt(i);
-                    v.setTop(v.getTop() + translation);
-                    v.setBottom(v.getBottom() + translation);
-                }
-            }
         }
     }
 
index 3b6ee18..403bf7d 100644 (file)
@@ -36,12 +36,8 @@ public abstract class InfoBar implements InfoBarView {
     public static final int ACTION_TYPE_TRANSLATE = 3;
     public static final int ACTION_TYPE_TRANSLATE_SHOW_ORIGINAL = 4;
 
-    // Background types
-    public static final int BACKGROUND_TYPE_INFO = 0;
-    public static final int BACKGROUND_TYPE_WARNING = 1;
-
-    private final int mBackgroundType;
     private final int mIconDrawableId;
+    private final CharSequence mMessage;
 
     private InfoBarListeners.Dismiss mListener;
     private ContentWrapperView mContentView;
@@ -66,18 +62,25 @@ public abstract class InfoBar implements InfoBarView {
 
     /**
      * @param listener Listens to when buttons have been clicked on the InfoBar.
-     * @param backgroundType Background type to use (INFO or WARNING).
      * @param iconDrawableId ID of the resource to use for the Icon.  If 0, no icon will be shown.
+     * @param message The message to show in the infobar.
      */
-    public InfoBar(InfoBarListeners.Dismiss listener, int backgroundType, int iconDrawableId) {
+    public InfoBar(InfoBarListeners.Dismiss listener, int iconDrawableId, CharSequence message) {
         mListener = listener;
         mId = generateId();
-        mBackgroundType = backgroundType;
         mIconDrawableId = iconDrawableId;
+        mMessage = message;
         mExpireOnNavigation = true;
     }
 
     /**
+     * @return The message shown in the infobar, useful for accessibility.
+     */
+    public CharSequence getMessage() {
+        return mMessage;
+    }
+
+    /**
      * Stores a pointer to the native-side counterpart of this InfoBar.
      * @param nativeInfoBarPtr Pointer to the NativeInfoBar.
      */
@@ -92,18 +95,20 @@ public abstract class InfoBar implements InfoBarView {
     /**
      * Change the pointer to the native-side counterpart of this InfoBar.  Native-side code is
      * responsible for managing the cleanup of the pointer.
-     * @param nativeInfoBarPtr Pointer to the NativeInfoBar.
+     * @param newInfoBarPtr Pointer to the NativeInfoBar.
      */
     protected void replaceNativePointer(long newInfoBarPtr) {
         mNativeInfoBarPtr = newInfoBarPtr;
     }
 
-    // Determine if the infobar should be dismissed when |url| is loaded.  Calling
-    // setExpireOnNavigation(true/false) causes this method always to return true/false.
-    // This only applies to java-only infobars. C++ infobars will use the same logic
-    // as other platforms so they are not attempted to be dismissed twice.
-    // It should really be removed once all infobars have a C++ counterpart.
-    public final boolean shouldExpire(String url) {
+    /**
+     * Determine if the infobar should be dismissed when a new page starts loading. Calling
+     * setExpireOnNavigation(true/false) causes this method always to return true/false.
+     * This only applies to java-only infobars. C++ infobars will use the same logic
+     * as other platforms so they are not attempted to be dismissed twice.
+     * It should really be removed once all infobars have a C++ counterpart.
+     */
+    public final boolean shouldExpire() {
         return mExpireOnNavigation && mNativeInfoBarPtr == 0;
     }
 
@@ -147,7 +152,10 @@ public abstract class InfoBar implements InfoBarView {
      */
     protected final View createView() {
         assert mContext != null;
-        return new InfoBarLayout(mContext, this, mBackgroundType, mIconDrawableId);
+
+        InfoBarLayout layout = new InfoBarLayout(mContext, this, mIconDrawableId, mMessage);
+        createContent(layout);
+        return layout;
     }
 
     /**
@@ -178,8 +186,7 @@ public abstract class InfoBar implements InfoBarView {
 
     protected ContentWrapperView getContentWrapper(boolean createIfNotFound) {
         if (mContentView == null && createIfNotFound) {
-            mContentView = new ContentWrapperView(getContext(), this, mBackgroundType,
-                    createView(), getInfoBarContainer().areInfoBarsOnTop());
+            mContentView = new ContentWrapperView(getContext(), this, createView());
             mContentView.setFocusable(false);
         }
         return mContentView;
@@ -208,10 +215,16 @@ public abstract class InfoBar implements InfoBarView {
     public void setControlsEnabled(boolean state) {
         mControlsEnabled = state;
 
-        // Handle the close button.
+        // Disable all buttons on the infobar.
         if (mContentView != null) {
             View closeButton = mContentView.findViewById(R.id.infobar_close_button);
+            View primaryButton = mContentView.findViewById(R.id.button_primary);
+            View secondaryButton = mContentView.findViewById(R.id.button_secondary);
+            View tertiaryButton = mContentView.findViewById(R.id.button_tertiary);
             if (closeButton != null) closeButton.setEnabled(state);
+            if (primaryButton != null) primaryButton.setEnabled(state);
+            if (secondaryButton != null) secondaryButton.setEnabled(state);
+            if (tertiaryButton != null) tertiaryButton.setEnabled(state);
         }
     }
 
@@ -228,16 +241,6 @@ public abstract class InfoBar implements InfoBarView {
     public void createContent(InfoBarLayout layout) {
     }
 
-    @Override
-    public String getPrimaryButtonText(Context context) {
-        return null;
-    }
-
-    @Override
-    public String getSecondaryButtonText(Context context) {
-        return null;
-    }
-
     /**
      * Returns the id of the tab this infobar is showing into.
      */
index a378301..2b3c5be 100644 (file)
@@ -16,11 +16,9 @@ import android.widget.LinearLayout;
 
 import com.google.common.annotations.VisibleForTesting;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.CalledByNative;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.UiUtils;
-import org.chromium.ui.base.DeviceFormFactor;
 
 import java.util.ArrayDeque;
 import java.util.ArrayList;
@@ -77,9 +75,6 @@ public class InfoBarContainer extends LinearLayout {
 
     private final AutoLoginDelegate mAutoLoginDelegate;
 
-    // Whether the infobar are shown on top (below the location bar) or at the bottom of the screen.
-    private final boolean mInfoBarsOnTop;
-
     // The list of all infobars in this container, regardless of whether they've been shown yet.
     private final ArrayList<InfoBar> mInfoBars = new ArrayList<InfoBar>();
 
@@ -114,9 +109,7 @@ public class InfoBarContainer extends LinearLayout {
         mAnimationSizer = new FrameLayout(activity);
         mAnimationSizer.setVisibility(INVISIBLE);
 
-        // The tablet has the infobars below the location bar. On the phone they are at the bottom.
-        mInfoBarsOnTop = DeviceFormFactor.isTablet(activity);
-        setGravity(determineGravity());
+        setGravity(Gravity.BOTTOM);
 
         // Chromium's InfoBarContainer may add an InfoBar immediately during this initialization
         // call, so make sure everything in the InfoBarContainer is completely ready beforehand.
@@ -132,9 +125,8 @@ public class InfoBarContainer extends LinearLayout {
         return mAnimationListener;
     }
 
-
     public boolean areInfoBarsOnTop() {
-        return mInfoBarsOnTop;
+        return false;
     }
 
     @Override
@@ -155,13 +147,9 @@ public class InfoBarContainer extends LinearLayout {
         }
     }
 
-    private int determineGravity() {
-        return mInfoBarsOnTop ? Gravity.TOP : Gravity.BOTTOM;
-    }
-
     private FrameLayout.LayoutParams createLayoutParams() {
         return new FrameLayout.LayoutParams(
-                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, determineGravity());
+                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
     }
 
     public void removeFromParentView() {
@@ -357,7 +345,7 @@ public class InfoBarContainer extends LinearLayout {
             targetView = info.target.getContentWrapper(true);
             assert mInfoBars.contains(info.target);
             toShow = targetView.detachCurrentView();
-            addView(targetView, mInfoBarsOnTop ? getChildCount() : 0,
+            addView(targetView, 0,
                     new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
         } else {
             targetView = info.target.getContentWrapper(false);
@@ -369,11 +357,11 @@ public class InfoBarContainer extends LinearLayout {
     }
 
     // Called by the tab when it has started loading a new page.
-    public void onPageStarted(String url) {
+    public void onPageStarted() {
         LinkedList<InfoBar> barsToRemove = new LinkedList<InfoBar>();
 
         for (InfoBar infoBar : mInfoBars) {
-            if (infoBar.shouldExpire(url)) {
+            if (infoBar.shouldExpire()) {
                 barsToRemove.add(infoBar);
             }
         }
@@ -445,14 +433,6 @@ public class InfoBarContainer extends LinearLayout {
         }
     }
 
-    public void startTransition() {
-        if (mInfoBarsOnTop) {
-            // We need to clip this view to its bounds while it is animated because the layout's
-            // z-ordering puts it on top of other infobars as it's being animated.
-            ApiCompatibilityUtils.postInvalidateOnAnimation(this);
-        }
-    }
-
     /**
      * Finishes off whatever animation is running.
      */
index 8443ae4..d5b2e3c 100644 (file)
@@ -5,8 +5,13 @@
 package org.chromium.chrome.browser.infobar;
 
 import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 import android.text.method.LinkMovementMethod;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -15,740 +20,525 @@ import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
-import org.chromium.ui.base.LocalizationUtils;
-
-import java.util.ArrayList;
 
 /**
- * Layout that can be used to arrange an InfoBar's View.
- * All InfoBars consist of at least:
- * - An icon representing the InfoBar's purpose on the left side.
+ * Layout that arranges an InfoBar's views. An InfoBarLayout consists of:
  * - A message describing the action that the user can take.
  * - A close button on the right side.
+ * - (optional) An icon representing the infobar's purpose on the left side.
+ * - (optional) Additional "custom" views (e.g. a checkbox and text, or a pair of spinners)
+ * - (optional) One or two buttons with text at the bottom.
  *
- * Views should never be added with anything but a call to addGroup() to ensure that groups are not
- * broken apart.
- *
- * Widths and heights defined in the LayoutParams will be overwritten due to the nature of the
- * layout algorithm.  However, setting a minimum width in another way, like TextView.getMinWidth(),
- * should still be obeyed.
+ * When adding custom views, widths and heights defined in the LayoutParams will be ignored.
+ * However, setting a minimum width in another way, like TextView.getMinWidth(), should still be
+ * obeyed.
  *
  * Logic for what happens when things are clicked should be implemented by the InfoBarView.
  */
 public class InfoBarLayout extends ViewGroup implements View.OnClickListener {
-    private static final String TAG = "InfoBarLayout";
 
     /**
      * Parameters used for laying out children.
      */
-    public static class LayoutParams extends ViewGroup.LayoutParams {
-        /** Alignment parameters that determine where in the main row an item will float. */
-        public static final int ALIGN_START = 0;
-        public static final int ALIGN_END = 1;
+    private static class LayoutParams extends ViewGroup.LayoutParams {
 
-        /** Whether the View is meant for the main row. */
-        public boolean isInMainRow;
+        public int startMargin;
+        public int endMargin;
+        public int topMargin;
+        public int bottomMargin;
 
-        /** Views grouped together are laid out together immediately adjacent to each other. */
-        public boolean isGroupedWithNextView;
+        // Where this view will be laid out. These values are assigned in onMeasure() and used in
+        // onLayout().
+        public int start;
+        public int top;
 
-        /** When on the main row, indicates whether the control floats on the left or the right. */
-        public int align;
+        LayoutParams(int startMargin, int topMargin, int endMargin, int bottomMargin) {
+            super(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+            this.startMargin = startMargin;
+            this.topMargin = topMargin;
+            this.endMargin = endMargin;
+            this.bottomMargin = bottomMargin;
+        }
+    }
 
-        /** If the control is a button, ID of the resource that was last used as its background. */
-        public int background;
+    private static class Group {
+        public View[] views;
+
+        /**
+         * The gravity of each view in Group. Must be either Gravity.START, Gravity.END, or
+         * Gravity.FILL_HORIZONTAL.
+         */
+        public int gravity = Gravity.START;
+
+        /** Whether the views are vertically stacked. */
+        public boolean isStacked;
+
+        void setHorizontalMode(int horizontalSpacing, int startMargin, int endMargin) {
+            isStacked = false;
+            for (int i = 0; i < views.length; i++) {
+                LayoutParams lp = (LayoutParams) views[i].getLayoutParams();
+                lp.startMargin = i == 0 ? startMargin : horizontalSpacing;
+                lp.topMargin = 0;
+                lp.endMargin = i == views.length - 1 ? endMargin : 0;
+                lp.bottomMargin = 0;
+            }
 
-        public LayoutParams() {
-            super(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
-            align = ALIGN_END;
-            isInMainRow = true;
         }
 
-        public LayoutParams(LayoutParams other) {
-            super(other);
-            isGroupedWithNextView = other.isGroupedWithNextView;
-            align = other.align;
-            isInMainRow = other.isInMainRow;
+        void setVerticalMode(int verticalSpacing, int bottomMargin) {
+            isStacked = true;
+            for (int i = 0; i < views.length; i++) {
+                LayoutParams lp = (LayoutParams) views[i].getLayoutParams();
+                lp.startMargin = 0;
+                lp.topMargin = i == 0 ? 0 : verticalSpacing;
+                lp.endMargin = 0;
+                lp.bottomMargin = i == views.length - 1 ? bottomMargin : 0;
+            }
         }
     }
 
-    private static class GroupInfo {
-        public int numViews;
-        public int width;
-        public int greatestMemberWidth;
-        public int endIndex;
-        public boolean hasButton;
-    };
-
-    private final int mDimensionMinSize;
-    private final int mDimensionMargin;
-    private final int mDimensionIconSize;
-    private final boolean mLayoutRTL;
-    private final InfoBarView mInfoBarView;
+    private static final int ROW_MAIN = 1;
+    private static final int ROW_OTHER = 2;
 
-    private final ImageView mIconView;
+    private final int mMargin;
+    private final int mIconSize;
+    private final int mMinWidth;
+    private final int mAccentColor;
+
+    private final InfoBarView mInfoBarView;
     private final TextView mMessageView;
     private final ImageButton mCloseButton;
+    private ImageView mIconView;
 
-    /** Background resource IDs to use for the buttons. */
-    private final int mBackgroundFloating;
-    private final int mBackgroundFullLeft;
-    private final int mBackgroundFullRight;
+    private Group mMainGroup;
+    private Group mCustomGroup;
+    private Group mButtonGroup;
 
     /**
-     * Indices of child Views that start new layout rows.
-     * The last entry is the number of child Views, allowing calculation of the size of each row by
-     * taking the difference between subsequent indices.
+     * These values are used during onMeasure() to track where the next view will be placed.
+     *
+     * mWidth is the infobar width.
+     * [mStart, mEnd) is the range of unoccupied space on the current row.
+     * mTop and mBottom are the top and bottom of the current row.
+     *
+     * These values, along with a view's gravity, are used to position the next view.
+     * These values are updated after placing a view and after starting a new row.
      */
-    private final ArrayList<Integer> mIndicesOfRows;
+    private int mWidth;
+    private int mStart;
+    private int mEnd;
+    private int mTop;
+    private int mBottom;
 
     /**
-     * Constructs the layout for the specified InfoBar.
+     * Constructs a layout for the specified InfoBar. After calling this, be sure to set the
+     * message, the buttons, and/or the custom content using setMessage(), setButtons(), and
+     * setCustomContent().
+     *
      * @param context The context used to render.
      * @param infoBarView InfoBarView that listens to events.
-     * @param backgroundType Type of InfoBar background being shown.
      * @param iconResourceId ID of the icon to use for the InfoBar.
+     * @param message The message to show in the infobar.
      */
-    public InfoBarLayout(Context context, InfoBarView infoBarView, int backgroundType,
-            int iconResourceId) {
+    public InfoBarLayout(Context context, InfoBarView infoBarView, int iconResourceId,
+            CharSequence message) {
         super(context);
-        mIndicesOfRows = new ArrayList<Integer>();
-        mLayoutRTL = LocalizationUtils.isLayoutRtl();
         mInfoBarView = infoBarView;
 
-        // Determine what backgrounds we'll be needing for the buttons.
-        if (backgroundType == InfoBar.BACKGROUND_TYPE_INFO) {
-            mBackgroundFloating = R.drawable.infobar_button_normal_floating;
-            mBackgroundFullLeft = R.drawable.infobar_button_normal_full_left;
-            mBackgroundFullRight = R.drawable.infobar_button_normal_full_right;
-        } else {
-            mBackgroundFloating = R.drawable.infobar_button_warning_floating;
-            mBackgroundFullLeft = R.drawable.infobar_button_warning_full_left;
-            mBackgroundFullRight = R.drawable.infobar_button_warning_full_right;
-        }
-
         // Grab the dimensions.
-        mDimensionMinSize =
-                context.getResources().getDimensionPixelSize(R.dimen.infobar_min_size);
-        mDimensionMargin =
-                context.getResources().getDimensionPixelSize(R.dimen.infobar_margin);
-        mDimensionIconSize =
-                context.getResources().getDimensionPixelSize(R.dimen.infobar_icon_size);
-
-        // Create the main controls.
-        mCloseButton = new ImageButton(context);
-        mIconView = new ImageView(context);
-        mMessageView = (TextView) LayoutInflater.from(context).inflate(R.layout.infobar_text, null);
-        addGroup(mCloseButton, mIconView, mMessageView);
+        Resources res = getResources();
+        mMargin = res.getDimensionPixelOffset(R.dimen.infobar_margin);
+        mIconSize = res.getDimensionPixelSize(R.dimen.infobar_icon_size);
+        mMinWidth = res.getDimensionPixelSize(R.dimen.infobar_min_width);
+        mAccentColor = res.getColor(R.color.infobar_accent_blue);
 
-        // Set up the close button.
+        // Set up the close button. Apply padding so it has a big touch target.
+        mCloseButton = new ImageButton(context);
         mCloseButton.setId(R.id.infobar_close_button);
-        mCloseButton.setImageResource(R.drawable.dismiss);
-        mCloseButton.setBackgroundResource(R.drawable.infobar_close_bg);
+        mCloseButton.setImageResource(R.drawable.infobar_close_button);
+        TypedArray a = getContext().obtainStyledAttributes(
+                new int [] {android.R.attr.selectableItemBackground});
+        Drawable closeButtonBackground = a.getDrawable(0);
+        a.recycle();
+        ApiCompatibilityUtils.setBackgroundForView(mCloseButton, closeButtonBackground);
+        mCloseButton.setPadding(mMargin, mMargin, mMargin, mMargin);
         mCloseButton.setOnClickListener(this);
-
-        mCloseButton.setContentDescription(getResources().getString(R.string.infobar_close));
+        mCloseButton.setContentDescription(res.getString(R.string.infobar_close));
+        mCloseButton.setLayoutParams(new LayoutParams(0, -mMargin, -mMargin, -mMargin));
+        addView(mCloseButton);
 
         // Set up the icon.
-        mIconView.setFocusable(false);
         if (iconResourceId != 0) {
+            mIconView = new ImageView(context);
             mIconView.setImageResource(iconResourceId);
-        } else {
-            mIconView.setVisibility(View.INVISIBLE);
+            mIconView.setFocusable(false);
+            mIconView.setLayoutParams(new LayoutParams(0, 0, mMargin / 2, 0));
+            mIconView.getLayoutParams().width = mIconSize;
+            mIconView.getLayoutParams().height = mIconSize;
         }
 
-        // Set up the TextView.
+        // Set up the message view.
+        mMessageView = (TextView) LayoutInflater.from(context).inflate(R.layout.infobar_text, null);
+        mMessageView.setText(message, TextView.BufferType.SPANNABLE);
         mMessageView.setMovementMethod(LinkMovementMethod.getInstance());
-        mMessageView.setText(infoBarView.getMessageText(context), TextView.BufferType.SPANNABLE);
-
-        // Only the close button floats to the right; the icon and the message both float left.
-        ((LayoutParams) mIconView.getLayoutParams()).align = LayoutParams.ALIGN_START;
-        ((LayoutParams) mMessageView.getLayoutParams()).align = LayoutParams.ALIGN_START;
-
-        // Vertically center the icon and close buttons of an unstretched InfoBar.  If the InfoBar
-        // is stretched, they both stay in place.
-        mIconView.getLayoutParams().width = mDimensionIconSize;
-        mIconView.getLayoutParams().height = mDimensionIconSize;
-
-        // We apply padding to the close button so that it has a big touch target.
-        int closeButtonHeight = mCloseButton.getDrawable().getIntrinsicHeight();
-        int closePadding = (mDimensionMinSize - closeButtonHeight) / 2;
-        if (closePadding >= 0) {
-            mCloseButton.setPadding(closePadding, closePadding, closePadding, closePadding);
+        mMessageView.setLinkTextColor(mAccentColor);
+        mMessageView.setLayoutParams(new LayoutParams(0, mMargin / 4, 0, 0));
+
+        if (mIconView != null) {
+            mMainGroup = addGroup(mIconView, mMessageView);
         } else {
-            assert closePadding >= 0 : "Assets are too large for this layout.";
+            mMainGroup = addGroup(mMessageView);
         }
-
-        // Add all of the other InfoBar specific controls.
-        infoBarView.createContent(this);
-    }
-
-    @Override
-    protected LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams();
     }
 
     /**
-     * Add a view to the Layout.
-     * This function must never be called with an index that isn't -1 to ensure that groups aren't
-     * broken apart.
+     * Sets the message to show on the infobar.
      */
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        if (index == -1) {
-            super.addView(child, index, params);
-        } else {
-            assert false : "Adding children at random places can break group structure.";
-            super.addView(child, -1, params);
-        }
+    public void setMessage(CharSequence message) {
+        mMessageView.setText(message, TextView.BufferType.SPANNABLE);
     }
 
     /**
-     * Add a group of Views that are measured and laid out together.
+     * Sets the custom content of the infobar. These views will be displayed in addition to the
+     * standard infobar controls (icon, text, buttons). Depending on the available space, view1 and
+     * view2 will be laid out:
+     *  - Side by side on the main row,
+     *  - Side by side on a separate row, each taking up half the width of the infobar,
+     *  - Stacked above each other on two separate rows, taking up the full width of the infobar.
      */
-    public void addGroup(View... group) {
-        for (int i = 0; i < group.length; i++) {
-            final View member = group[i];
-            addView(member);
-
-            LayoutParams params = (LayoutParams) member.getLayoutParams();
-            params.isGroupedWithNextView = (i != group.length - 1);
-        }
+    public void setCustomContent(View view1, View view2) {
+        mCustomGroup = addGroup(view1, view2);
     }
 
     /**
-     * Add up to two buttons to the layout.
-     *
-     * Buttons with null text are hidden from view.  The secondary button may only exist if the
-     * primary button does.
-     *
-     * @param primaryText Text for the primary button.
-     * @param secondaryText Text for the secondary button.
+     * Sets the custom content of the infobar to a single view. This view will be displayed in
+     * addition to the standard infobar controls. Depending on the available space, the view will be
+     * displayed:
+     *  - On the main row, start-aligned or end-aligned depending on whether there are also
+     *    buttons on the main row, OR
+     *  - On a separate row, start-aligned
      */
-    public void addButtons(String primaryText, String secondaryText) {
-        Button primaryButton = null;
-        Button secondaryButton = null;
-
-        if (!TextUtils.isEmpty(secondaryText)) {
-            secondaryButton = (Button) LayoutInflater.from(getContext()).inflate(
-                    R.layout.infobar_button, null);
-            secondaryButton.setId(R.id.button_secondary);
-            secondaryButton.setOnClickListener(this);
-            secondaryButton.setText(secondaryText);
-        }
-
-        if (!TextUtils.isEmpty(primaryText)) {
-            primaryButton = (Button) LayoutInflater.from(getContext()).inflate(
-                    R.layout.infobar_button, null);
-            primaryButton.setId(R.id.button_primary);
-            primaryButton.setOnClickListener(this);
-            primaryButton.setText(primaryText);
-        }
-
-        // Group the buttons together so that they are laid out next to each other.
-        if (primaryButton == null && secondaryButton != null) {
-            assert false : "When using only one button, make it the primary button.";
-        } else if (primaryButton != null && secondaryButton != null) {
-            addGroup(secondaryButton, primaryButton);
-        } else if (primaryButton != null) {
-            addGroup(primaryButton);
-        }
+    public void setCustomContent(View view) {
+        mCustomGroup = addGroup(view);
     }
 
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        final int rowWidth = right - left;
-        int rowTop = layoutMainRow(rowWidth);
-        for (int row = 1; row < mIndicesOfRows.size() - 1; row++) {
-            rowTop = layoutRow(row, rowTop, rowWidth);
-        }
+    /**
+     * Calls setButtons(primaryText, secondaryText, null).
+     */
+    public void setButtons(String primaryText, String secondaryText) {
+        setButtons(primaryText, secondaryText, null);
     }
 
     /**
-     * Lays out the controls in the main row.
-     *
-     * This method is complicated mainly because of the arbitrariness for when a control can
-     * float either left or right, and whether we're doing an RTL layout.
-     *
-     * Layout proceeds in three phases:
-     * - Laying out of the icon and close button are done separately from the rest of the controls
-     *   because they are locked into their respective corners.  These two controls bound the rest
-     *   of the controls in the main row.
-     *
-     * - Items floating to the left are then laid out, traversing the children array in a forwards
-     *   manner.  This includes the InfoBar message.
-     *
-     * - A final pass lays out items aligned to the end of the bar, traversing the children array
-     *   backwards so that the correct ordering of the children is preserved.  Going forwards would
-     *   cause buttons to flip (e.g.).
+     * Adds one, two, or three buttons to the layout.
      *
-     * @param width Maximum width of the row.
-     * @return How tall the main row is.
+     * @param primaryText Text for the primary button.
+     * @param secondaryText Text for the secondary button, or null if there isn't a second button.
+     * @param tertiaryText Text for the tertiary button, or null if there isn't a third button.
      */
-    private int layoutMainRow(int width) {
-        final int rowStart = mIndicesOfRows.get(0);
-        final int rowEnd = mIndicesOfRows.get(1);
-        final int rowHeight = computeMainRowHeight(rowStart, rowEnd);
-
-        // Lay out the icon and the close button.
-        int closeLeft;
-        int iconPadding = (mDimensionMinSize - mDimensionIconSize) / 2;
-        int iconLeft = iconPadding;
-        if (mLayoutRTL) {
-            iconLeft += width - mDimensionMinSize;
-            closeLeft = 0;
-        } else {
-            closeLeft = width - mCloseButton.getMeasuredWidth();
+    public void setButtons(String primaryText, String secondaryText, String tertiaryText) {
+        if (TextUtils.isEmpty(primaryText)) return;
+
+        LayoutInflater inflater = LayoutInflater.from(getContext());
+        Button primaryButton = (Button) inflater.inflate(R.layout.infobar_button, null);
+        primaryButton.setId(R.id.button_primary);
+        primaryButton.setOnClickListener(this);
+        primaryButton.setText(primaryText);
+        primaryButton.setBackgroundResource(R.drawable.btn_infobar_blue);
+        primaryButton.setTextColor(Color.WHITE);
+
+        if (TextUtils.isEmpty(secondaryText)) {
+            mButtonGroup = addGroup(primaryButton);
+            return;
         }
-        mIconView.layout(iconLeft, iconPadding, iconLeft + mDimensionIconSize,
-                iconPadding + mDimensionIconSize);
-        mCloseButton.layout(closeLeft, 0, closeLeft + mDimensionMinSize, mDimensionMinSize);
-
-        // Go from left to right to catch all items aligned with the start of the InfoBar.
-        int rowLeft = mDimensionMinSize;
-        int rowRight = width - mDimensionMinSize;
-        for (int i = rowStart; i < rowEnd; i++) {
-            final View child = getChildAt(i);
-            LayoutParams params = (LayoutParams) child.getLayoutParams();
-            if (params.align != LayoutParams.ALIGN_START || child.getVisibility() == View.GONE
-                    || child == mCloseButton || child == mIconView) {
-                continue;
-            }
 
-            // Everything is vertically centered.
-            int childTop = (rowHeight - child.getMeasuredHeight()) / 2;
-            int childLeft;
+        Button secondaryButton = (Button) inflater.inflate(R.layout.infobar_button, null);
+        secondaryButton.setId(R.id.button_secondary);
+        secondaryButton.setOnClickListener(this);
+        secondaryButton.setText(secondaryText);
+        secondaryButton.setTextColor(mAccentColor);
 
-            if (mLayoutRTL) {
-                if (!isMainControl(child)) rowRight -= mDimensionMargin;
-                childLeft = rowRight - child.getMeasuredWidth();
-                rowRight -= child.getMeasuredWidth();
-            } else {
-                if (!isMainControl(child)) rowLeft += mDimensionMargin;
-                childLeft = rowLeft;
-                rowLeft += child.getMeasuredWidth();
-            }
-
-            child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(),
-                    childTop + child.getMeasuredHeight());
+        if (TextUtils.isEmpty(tertiaryText)) {
+            mButtonGroup = addGroup(secondaryButton, primaryButton);
+            return;
         }
 
-        // Go from right to left to catch all items aligned with the end of the InfoBar.
-        for (int i = rowEnd - 1; i >= rowStart; i--) {
-            final View child = getChildAt(i);
-            LayoutParams params = (LayoutParams) child.getLayoutParams();
-            if (params.align != LayoutParams.ALIGN_END || child.getVisibility() == View.GONE
-                    || child == mCloseButton || child == mIconView) {
-                continue;
-            }
-
-            // Everything is vertically centered.
-            int childTop = (rowHeight - child.getMeasuredHeight()) / 2;
-            int childLeft;
+        Button tertiaryButton = (Button) inflater.inflate(R.layout.infobar_button, null);
+        tertiaryButton.setId(R.id.button_tertiary);
+        tertiaryButton.setOnClickListener(this);
+        tertiaryButton.setText(tertiaryText);
+        tertiaryButton.setPadding(mMargin / 2, tertiaryButton.getPaddingTop(), mMargin / 2,
+                tertiaryButton.getPaddingBottom());
+        tertiaryButton.setTextColor(
+                getContext().getResources().getColor(R.color.infobar_tertiary_button_text));
 
-            if (!mLayoutRTL) {
-                childLeft = rowRight - child.getMeasuredWidth();
-                rowRight -= child.getMeasuredWidth();
-                if (!isMainControl(child)) rowRight -= mDimensionMargin;
-            } else {
-                childLeft = rowLeft;
-                rowLeft += child.getMeasuredWidth();
-                if (!isMainControl(child)) rowLeft += mDimensionMargin;
-            }
-
-            child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(),
-                    childTop + child.getMeasuredHeight());
-        }
-
-        return rowHeight;
+        mButtonGroup = addGroup(tertiaryButton, secondaryButton, primaryButton);
     }
 
     /**
-     * Lays out the controls in the row other than the main one.
-     *
-     * This case is much simpler than the main row since the items are all equally sized and simply
-     * entails moving through the children and laying them down from the start of the InfoBar to the
-     * end.
-     *
-     * @param row Index of the row
-     * @param rowTop Y-coordinate of the layout the controls should be aligned to.
-     * @param width Maximum width of the row.
-     * @return How tall the row is.
+     * Adds a group of Views that are measured and laid out together.
      */
-    private int layoutRow(int row, int rowTop, int width) {
-        final int rowStart = mIndicesOfRows.get(row);
-        final int rowEnd = mIndicesOfRows.get(row + 1);
-        final boolean hasButton = isButton(getChildAt(rowStart));
-
-        int rowLeft = hasButton ? 0 : mDimensionMargin;
-        int rowRight = width - (hasButton ? 0 : mDimensionMargin);
-
-        for (int i = rowStart; i < rowEnd; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == View.GONE) continue;
-
-            int childLeft;
-            if (mLayoutRTL) {
-                childLeft = rowRight - child.getMeasuredWidth();
-                rowRight -= child.getMeasuredWidth() + (hasButton ? 0 : mDimensionMargin);
-            } else {
-                childLeft = rowLeft;
-                rowLeft += child.getMeasuredWidth() + (hasButton ? 0 : mDimensionMargin);
-            }
+    private Group addGroup(View... views) {
+        Group group = new Group();
+        group.views = views;
 
-            child.layout(childLeft, rowTop, childLeft + child.getMeasuredWidth(),
-                    rowTop + child.getMeasuredHeight());
+        for (View v : views) {
+            addView(v);
         }
-
-        return rowTop + computeRowHeight(rowStart, rowEnd);
+        return group;
     }
 
-    /**
-     * Checks if the child is one of the main InfoBar controls.
-     * @param child View to check.
-     * @return True if the child is one of the main controls.
-     */
-    private boolean isMainControl(View child) {
-        return child == mIconView || child == mMessageView || child == mCloseButton;
+    @Override
+    protected LayoutParams generateDefaultLayoutParams() {
+        return new LayoutParams(0, 0, 0, 0);
     }
 
-    /**
-     * Marks that the given index is the start of its own row.
-     * @param rowStartIndex Index of the child view at the start of the next row.
-     */
-    private void addRowStartIndex(int rowStartIndex) {
-        if (mIndicesOfRows.size() == 0
-                || rowStartIndex != mIndicesOfRows.get(mIndicesOfRows.size() - 1)) {
-            mIndicesOfRows.add(rowStartIndex);
-        }
-    }
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        // Place all the views in the positions already determined during onMeasure().
+        int width = right - left;
+        boolean isRtl = ApiCompatibilityUtils.isLayoutRtl(this);
 
-    /**
-     * Computes properties of the next group of Views to assign to rows.
-     * @param startIndex Index of the first child in the group.
-     * @return GroupInfo containing information about the current group.
-     */
-    private GroupInfo getNextGroup(int startIndex) {
-        GroupInfo groupInfo = new GroupInfo();
-        groupInfo.endIndex = startIndex;
-
-        final int childCount = getChildCount();
-        int currentChildIndex = startIndex;
-        while (groupInfo.endIndex < childCount) {
-            final View groupChild = getChildAt(groupInfo.endIndex);
-            if (groupChild.getVisibility() != View.GONE) {
-                groupInfo.hasButton |= isButton(groupChild);
-                groupInfo.width += groupChild.getMeasuredWidth();
-                groupInfo.greatestMemberWidth =
-                        Math.max(groupInfo.greatestMemberWidth, groupChild.getMeasuredWidth());
-                groupInfo.numViews++;
+        for (int i = 0; i < getChildCount(); i++) {
+            View child = getChildAt(i);
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            int childLeft = lp.start;
+            int childRight = lp.start + child.getMeasuredWidth();
+
+            if (isRtl) {
+                int tmp = width - childRight;
+                childRight = width - childLeft;
+                childLeft = tmp;
             }
-            groupInfo.endIndex++;
 
-            LayoutParams params = (LayoutParams) groupChild.getLayoutParams();
-            if (!params.isGroupedWithNextView) break;
+            child.layout(childLeft, lp.top, childRight, lp.top + child.getMeasuredHeight());
         }
-
-        return groupInfo;
-    }
-
-    @Override
-    protected void measureChild(View child, int widthSpec, int heightSpec) {
-        // If a control is on the main row, then it should be only as large as it wants to be.
-        // Otherwise, it must occupy the same amount of space as everything else on its row.
-        LayoutParams params = (LayoutParams) child.getLayoutParams();
-        params.width = params.isInMainRow ? LayoutParams.WRAP_CONTENT : LayoutParams.MATCH_PARENT;
-        super.measureChild(child, widthSpec, heightSpec);
     }
 
+    /**
+     * Measures *and* assigns positions to all of the views in the infobar. These positions are
+     * saved in each view's LayoutParams (lp.start and lp.top) and used during onLayout(). All of
+     * the interesting logic happens inside onMeasure(); onLayout() just assigns the already-
+     * determined positions and mirrors everything for RTL, if needed.
+     */
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         assert getLayoutParams().height == LayoutParams.WRAP_CONTENT
                 : "InfoBar heights cannot be constrained.";
 
-        final int maxWidth = MeasureSpec.getSize(widthMeasureSpec);
-        mIndicesOfRows.clear();
-
-        // Measure all children with the assumption that they may take up the full size of the
-        // parent.  This determines how big each child wants to be.
-        final int childCount = getChildCount();
-        for (int numChild = 0; numChild < childCount; numChild++) {
-            final View child = getChildAt(numChild);
-            if (child.getVisibility() == View.GONE) continue;
-            ((LayoutParams) child.getLayoutParams()).isInMainRow = true;
-            measureChild(child, widthMeasureSpec, heightMeasureSpec);
+        // Measure all children without imposing any size constraints on them. This determines how
+        // big each child wants to be.
+        int unspecifiedSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+        for (int i = 0; i < getChildCount(); i++) {
+            measureChild(getChildAt(i), unspecifiedSpec, unspecifiedSpec);
         }
 
-        // Allocate as many Views as possible to the main row, then place everything else on the
-        // following rows.
-        int currentChildIndex = measureMainRow(maxWidth);
-        measureRemainingRows(maxWidth, currentChildIndex);
+        // Avoid overlapping views, division by zero, infinite heights, and other fun problems that
+        // could arise with extremely narrow infobars.
+        mWidth = Math.max(MeasureSpec.getSize(widthMeasureSpec), mMinWidth);
+        mTop = mBottom = 0;
+        placeGroups();
 
-        // Buttons must have their backgrounds manually changed to give the illusion of having a
-        // single pixel boundary between them.
-        updateBackgroundsForButtons();
-
-        // Determine how tall the container should be by measuring all the children in their rows.
-        int layoutHeight = computeHeight();
-        setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
-                resolveSize(layoutHeight, heightMeasureSpec));
+        setMeasuredDimension(mWidth, resolveSize(mBottom, heightMeasureSpec));
     }
 
     /**
-     * Assign as many Views as can fit onto the main row.
-     *
-     * The main row consists of at least the icon, the close button, and the message.  Groups of
-     * controls are added to the main row as long as they can fit within the width of the InfoBar.
-     *
-     * @param maxWidth The maximum width of the main row.
-     * @return The index of the last child that couldn't fit on the main row.
+     * Assigns positions to all of the views in the infobar. The icon, text, and close button are
+     * placed on the main row. The custom content and finally the buttons are placed on the main row
+     * if they fit. Otherwise, they go on their own rows.
      */
-    private int measureMainRow(int maxWidth) {
-        final int childCount = getChildCount();
-
-        // The main row has the icon and the close button taking the upper left and upper right
-        // corners of the InfoBar, each of which occupies a square of
-        // mDimensionMinSize x mDimensionMinSize pixels.
-        GroupInfo mainControlInfo = getNextGroup(0);
-        int remainingWidth = maxWidth - (mDimensionMinSize * 2) - mMessageView.getMeasuredWidth();
-        addRowStartIndex(0);
-
-        // Go through the rest of the Views and keep adding them until they can't fit.
-        int currentChildIndex = mainControlInfo.endIndex;
-        while (currentChildIndex < childCount && remainingWidth > 0) {
-            GroupInfo groupInfo = getNextGroup(currentChildIndex);
-            int widthWithMargins = groupInfo.width + mDimensionMargin * groupInfo.numViews;
-
-            if (widthWithMargins <= remainingWidth) {
-                // If the group fits on the main row, add it.
-                currentChildIndex = groupInfo.endIndex;
-                remainingWidth -= widthWithMargins;
+    private void placeGroups() {
+        startRow();
+        placeChild(mCloseButton, Gravity.END);
+        placeGroup(mMainGroup);
+
+        int customGroupWidth = 0;
+        if (mCustomGroup != null) {
+            updateCustomGroupForRow(ROW_MAIN);
+            customGroupWidth = getWidthWithMargins(mCustomGroup);
+        }
+
+        int buttonGroupWidth = 0;
+        if (mButtonGroup != null) {
+            updateButtonGroupForRow(ROW_MAIN);
+            buttonGroupWidth = getWidthWithMargins(mButtonGroup);
+        }
+
+        boolean customGroupOnMainRow = customGroupWidth <= availableWidth();
+        boolean buttonGroupOnMainRow = customGroupWidth + buttonGroupWidth <= availableWidth();
+
+        if (mCustomGroup != null) {
+            if (customGroupOnMainRow) {
+                mCustomGroup.gravity = (mButtonGroup != null && buttonGroupOnMainRow)
+                        ? Gravity.START : Gravity.END;
             } else {
-                // We can't fit the current group on the main row.
-                break;
+                startRow();
+                updateCustomGroupForRow(ROW_OTHER);
             }
+            placeGroup(mCustomGroup);
         }
-        addRowStartIndex(currentChildIndex);
-
-        // The icon and the close button are set to be squares occupying the upper left and
-        // upper right corners of the InfoBar.
-        int specWidth = MeasureSpec.makeMeasureSpec(mDimensionMinSize, MeasureSpec.EXACTLY);
-        int specHeight = MeasureSpec.makeMeasureSpec(mDimensionMinSize, MeasureSpec.EXACTLY);
-        measureChild(mIconView, specWidth, specHeight);
-        measureChild(mCloseButton, specWidth, specHeight);
-
-        // Measure out everything else except the message.
-        remainingWidth = maxWidth - (mDimensionMinSize * 2);
-        for (int i = 0; i < currentChildIndex; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == View.GONE || isMainControl(child)) continue;
-
-            specWidth = MeasureSpec.makeMeasureSpec(remainingWidth, MeasureSpec.AT_MOST);
-            specHeight = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-            measureChild(child, specWidth, specHeight);
-            remainingWidth -= child.getMeasuredWidth() + mDimensionMargin;
+
+        if (mButtonGroup != null) {
+            if (!buttonGroupOnMainRow) {
+                startRow();
+                updateButtonGroupForRow(ROW_OTHER);
+
+                // If the infobar consists of just a main row and a buttons row, the buttons must be
+                // at least 32dp below the bottom of the message text.
+                if (mCustomGroup == null) {
+                    LayoutParams lp = (LayoutParams) mMessageView.getLayoutParams();
+                    int messageBottom = lp.top + mMessageView.getMeasuredHeight();
+                    mTop = Math.max(mTop, messageBottom + 2 * mMargin);
+                }
+            }
+            placeGroup(mButtonGroup);
         }
 
-        // The message sucks up the remaining width on the line after all other controls
-        // have gotten all the space they requested.
-        specWidth = MeasureSpec.makeMeasureSpec(remainingWidth, MeasureSpec.AT_MOST);
-        specHeight = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-        measureChild(mMessageView, specWidth, specHeight);
+        startRow();
 
-        return currentChildIndex;
+        // If everything fits on a single row, center everything vertically.
+        if (buttonGroupOnMainRow) {
+            int layoutHeight = mBottom;
+            for (int i = 0; i < getChildCount(); i++) {
+                View child = getChildAt(i);
+                int extraSpace = layoutHeight - child.getMeasuredHeight();
+                LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                lp.top = extraSpace / 2;
+            }
+        }
     }
 
     /**
-     * Assign children to rows in the layout.
-     *
-     * We first try to assign children in the same group to the same row, but only if they fit when
-     * they are of equal width.  Otherwise, we split the group onto multiple rows.
-     *
-     * @param maxWidth Maximum width that the row can take.
-     * @param currentChildIndex Start index of the current group.
+     * Places a group of views on the current row, or stacks them over multiple rows if
+     * group.isStacked is true. mStart, mEnd, and mBottom are updated to reflect the space taken by
+     * the group.
      */
-    private void measureRemainingRows(int maxWidth, int currentChildIndex) {
-        final int childCount = getChildCount();
-        final int specHeight = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-
-        while (currentChildIndex < childCount) {
-            GroupInfo groupInfo = getNextGroup(currentChildIndex);
-
-            int availableWidth;
-            int boundaryMargins;
-            if (groupInfo.hasButton) {
-                // Buttons take up the full width of the InfoBar.
-                availableWidth = maxWidth;
-                boundaryMargins = 0;
-            } else {
-                // Other controls obey the side boundaries, and have boundaries between them.
-                availableWidth = maxWidth - mDimensionMargin * 2;
-                boundaryMargins = (groupInfo.numViews - 1) * mDimensionMargin;
+    private void placeGroup(Group group) {
+        if (group.gravity == Gravity.END) {
+            for (int i = group.views.length - 1; i >= 0; i--) {
+                placeChild(group.views[i], group.gravity);
+                if (group.isStacked && i != 0) startRow();
             }
-
-            // Determine how wide each item would be on the same row, including boundaries.
-            int evenWidth = (availableWidth - boundaryMargins) / groupInfo.numViews;
-
-            if (groupInfo.greatestMemberWidth <= evenWidth) {
-                // Fit everything on the same row.
-                int specWidth = MeasureSpec.makeMeasureSpec(evenWidth, MeasureSpec.EXACTLY);
-                for (int i = currentChildIndex; i < groupInfo.endIndex; i++) {
-                    final View child = getChildAt(i);
-                    if (child.getVisibility() == View.GONE) continue;
-                    ((LayoutParams) child.getLayoutParams()).isInMainRow = false;
-                    measureChild(child, specWidth, specHeight);
-                }
-                addRowStartIndex(currentChildIndex);
-            } else {
-                // Add each member of the group to its own row.
-                int specWidth = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.EXACTLY);
-                for (int i = currentChildIndex; i < groupInfo.endIndex; i++) {
-                    final View child = getChildAt(i);
-                    if (child.getVisibility() == View.GONE) continue;
-                    ((LayoutParams) child.getLayoutParams()).isInMainRow = false;
-                    measureChild(child, specWidth, specHeight);
-                    addRowStartIndex(i);
-                }
+        } else {  // group.gravity is Gravity.START or Gravity.FILL_HORIZONTAL
+            for (int i = 0; i < group.views.length; i++) {
+                placeChild(group.views[i], group.gravity);
+                if (group.isStacked && i != group.views.length - 1) startRow();
             }
-
-            currentChildIndex = groupInfo.endIndex;
         }
-
-        addRowStartIndex(childCount);
     }
 
     /**
-     * Calculate how tall the layout is, accounting for margins and children.
-     * @return How big the layout should be.
+     * Places a single view on the current row, and updates the view's layout parameters to remember
+     * its position. mStart, mEnd, and mBottom are updated to reflect the space taken by the view.
      */
-    private int computeHeight() {
-        int cumulativeHeight = 0;
+    private void placeChild(View child, int gravity) {
+        LayoutParams lp = (LayoutParams) child.getLayoutParams();
 
-        // Calculate how big each row is.
-        final int numRows = mIndicesOfRows.size() - 1;
-        for (int row = 0; row < numRows; row++) {
-            final int rowStart = mIndicesOfRows.get(row);
-            final int rowEnd = mIndicesOfRows.get(row + 1);
+        int availableWidth = Math.max(0, mEnd - mStart - lp.startMargin - lp.endMargin);
+        if (child.getMeasuredWidth() > availableWidth || gravity == Gravity.FILL_HORIZONTAL) {
+            measureChildWithFixedWidth(child, availableWidth);
+        }
 
-            if (row == 0) {
-                cumulativeHeight += computeMainRowHeight(rowStart, rowEnd);
-            } else {
-                cumulativeHeight += computeRowHeight(rowStart, rowEnd);
-            }
+        if (gravity == Gravity.START || gravity == Gravity.FILL_HORIZONTAL) {
+            lp.start = mStart + lp.startMargin;
+            mStart = lp.start + child.getMeasuredWidth() + lp.endMargin;
+        } else {  // gravity == Gravity.END
+            lp.start = mEnd - lp.endMargin - child.getMeasuredWidth();
+            mEnd = lp.start - lp.startMargin;
         }
 
-        return cumulativeHeight;
+        lp.top = mTop + lp.topMargin;
+        mBottom = Math.max(mBottom, lp.top + child.getMeasuredHeight() + lp.bottomMargin);
     }
 
     /**
-     * Computes how tall the main row is.
-     * @param rowStart Index of the first child.
-     * @param rowEnd One past the index of the last child.
+     * Advances the current position to the next row and adds margins on the left, right, and top
+     * of the new row.
      */
-    private int computeMainRowHeight(int rowStart, int rowEnd) {
-        // The icon and close button already have their margins baked into their padding values,
-        // but the other Views have a margin above and below.
-        final int verticalMargins = mDimensionMargin * 2;
-        int rowHeight = mDimensionMinSize;
-        for (int i = rowStart; i < rowEnd; i++) {
-            View child = getChildAt(i);
-            if (child == mCloseButton || child == mIconView || child.getVisibility() == View.GONE) {
-                continue;
-            }
-            rowHeight = Math.max(rowHeight, child.getMeasuredHeight() + verticalMargins);
-        }
-        return rowHeight;
+    private void startRow() {
+        mStart = mMargin;
+        mEnd = mWidth - mMargin;
+        mTop = mBottom + mMargin;
+        mBottom = mTop;
+    }
+
+    private int availableWidth() {
+        return mEnd - mStart;
     }
 
     /**
-     * Computes how tall a row below the main row is.
-     *
-     * Margins are only applied downward since the rows above are handling the margin on their side.
-     * Buttons ignore margins since they have to be right against the boundary.
-     *
-     * @param rowStart Index of the first child.
-     * @param rowEnd One past the index of the last child.
+     * @return The width of the group, including the items' margins.
      */
-    private int computeRowHeight(int rowStart, int rowEnd) {
-        boolean isButtonRow = isButton(getChildAt(rowStart));
-        final int verticalMargins = isButtonRow ? 0 : mDimensionMargin;
-        int rowHeight = 0;
-        for (int i = rowStart; i < rowEnd; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == View.GONE) continue;
-            rowHeight = Math.max(rowHeight, child.getMeasuredHeight() + verticalMargins);
+    private int getWidthWithMargins(Group group) {
+        if (group.isStacked) return getWidthWithMargins(group.views[0]);
+
+        int width = 0;
+        for (View v : group.views) {
+            width += getWidthWithMargins(v);
         }
-        return rowHeight;
+        return width;
+    }
+
+    private int getWidthWithMargins(View child) {
+        LayoutParams lp = (LayoutParams) child.getLayoutParams();
+        return child.getMeasuredWidth() + lp.startMargin + lp.endMargin;
+    }
+
+    private void measureChildWithFixedWidth(View child, int width) {
+        int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
+        int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+        child.measure(widthSpec, heightSpec);
     }
 
     /**
-     * Determines if the given View is either the primary or secondary button.
-     * @param child View to check.
-     * @return Whether the child is the primary or secondary button.
+     * The button group has different layout properties (margins, gravity, etc) when placed on the
+     * main row as opposed to on a separate row. This updates the layout properties of the button
+     * group to prepare for placing it on either the main row or a separate row.
+     *
+     * @param row One of ROW_MAIN or ROW_OTHER.
      */
-    private boolean isButton(View child) {
-        return child.getId() == R.id.button_secondary || child.getId() == R.id.button_primary;
+    private void updateButtonGroupForRow(int row) {
+        int startEndMargin = row == ROW_MAIN ? mMargin : 0;
+        mButtonGroup.setHorizontalMode(mMargin / 2, startEndMargin, startEndMargin);
+        mButtonGroup.gravity = Gravity.END;
+
+        if (row == ROW_OTHER && mButtonGroup.views.length >= 2) {
+            int extraWidth = availableWidth() - getWidthWithMargins(mButtonGroup);
+            if (extraWidth < 0) {
+                // Group is too wide to fit on a single row, so stack the group items vertically.
+                mButtonGroup.setVerticalMode(mMargin / 2, 0);
+                mButtonGroup.gravity = Gravity.FILL_HORIZONTAL;
+            } else if (mButtonGroup.views.length == 3) {
+                // Align tertiary button at the start and the other two buttons at the end.
+                ((LayoutParams) mButtonGroup.views[0].getLayoutParams()).endMargin += extraWidth;
+            }
+        }
     }
 
     /**
-     * Update the backgrounds for the buttons to account for their current positioning.
-     * The primary and secondary buttons are special-cased in that their backgrounds change to
-     * create the illusion of a single-stroke boundary between them.
+     * Analagous to updateButtonGroupForRow(), but for the custom group istead of the button group.
      */
-    private void updateBackgroundsForButtons() {
-        boolean bothButtonsExist = findViewById(R.id.button_primary) != null
-                && findViewById(R.id.button_secondary) != null;
-
-        for (int row = 0; row < mIndicesOfRows.size() - 1; row++) {
-            final int rowStart = mIndicesOfRows.get(row);
-            final int rowEnd = mIndicesOfRows.get(row + 1);
-            final int rowSize = rowEnd - rowStart;
-
-            for (int i = rowStart; i < rowEnd; i++) {
-                final View child = getChildAt(i);
-                if (child.getVisibility() == View.GONE || !isButton(child)) continue;
-
-                // Determine which background we need to show.
-                int background;
-                if (row == 0) {
-                    // Button will be floating.
-                    background = mBackgroundFloating;
-                } else if (rowSize == 1 || !bothButtonsExist) {
-                    // Button takes up the full width of the screen.
-                    background = mBackgroundFullRight;
-                } else if (mLayoutRTL) {
-                    // Primary button will be to the left of the secondary.
-                    background = child.getId() == R.id.button_primary
-                            ? mBackgroundFullLeft : mBackgroundFullRight;
-                } else {
-                    // Primary button will be to the right of the secondary.
-                    background = child.getId() == R.id.button_primary
-                            ? mBackgroundFullRight : mBackgroundFullLeft;
-                }
-
-                // Update the background.
-                LayoutParams params = (LayoutParams) child.getLayoutParams();
-                if (params.background != background) {
-                    params.background = background;
-
-                    // Save the padding; Android decides to overwrite it on some builds.
-                    int paddingLeft = child.getPaddingLeft();
-                    int paddingTop = child.getPaddingTop();
-                    int paddingRight = child.getPaddingRight();
-                    int paddingBottom = child.getPaddingBottom();
-                    int buttonWidth = child.getMeasuredWidth();
-                    int buttonHeight = child.getMeasuredHeight();
-
-                    // Set the background, then restore the padding.
-                    child.setBackgroundResource(background);
-                    child.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
-
-                    // Re-measuring is necessary to correct the text gravity.
-                    int specWidth = MeasureSpec.makeMeasureSpec(buttonWidth, MeasureSpec.EXACTLY);
-                    int specHeight = MeasureSpec.makeMeasureSpec(buttonHeight, MeasureSpec.EXACTLY);
-                    measureChild(child, specWidth, specHeight);
-                }
+    private void updateCustomGroupForRow(int row) {
+        int startEndMargin = row == ROW_MAIN ? mMargin : 0;
+        mCustomGroup.setHorizontalMode(mMargin, startEndMargin, startEndMargin);
+        mCustomGroup.gravity = Gravity.START;
+
+        if (row == ROW_OTHER && mCustomGroup.views.length == 2) {
+            int extraWidth = availableWidth() - getWidthWithMargins(mCustomGroup);
+            if (extraWidth < 0) {
+                // Group is too wide to fit on a single row, so stack the group items vertically.
+                mCustomGroup.setVerticalMode(0, mMargin);
+                mCustomGroup.gravity = Gravity.FILL_HORIZONTAL;
+            } else {
+                // Expand the children to take up the entire row.
+                View view0 = mCustomGroup.views[0];
+                View view1 = mCustomGroup.views[1];
+                int extraWidth0 = extraWidth / 2;
+                int extraWidth1 = extraWidth - extraWidth0;
+                measureChildWithFixedWidth(view0, view0.getMeasuredWidth() + extraWidth0);
+                measureChildWithFixedWidth(view1, view1.getMeasuredWidth() + extraWidth1);
             }
         }
     }
@@ -760,14 +550,20 @@ public class InfoBarLayout extends ViewGroup implements View.OnClickListener {
      */
     @Override
     public void onClick(View view) {
-        mInfoBarView.setControlsEnabled(false);
+        // Disable the infobar controls unless the user clicked the tertiary button, which by
+        // convention is the "learn more" link.
+        if (view.getId() != R.id.button_tertiary) {
+            mInfoBarView.setControlsEnabled(false);
+        }
+
         if (view.getId() == R.id.infobar_close_button) {
             mInfoBarView.onCloseButtonClicked();
         } else if (view.getId() == R.id.button_primary) {
             mInfoBarView.onButtonClicked(true);
         } else if (view.getId() == R.id.button_secondary) {
             mInfoBarView.onButtonClicked(false);
+        } else if (view.getId() == R.id.button_tertiary) {
+            mInfoBarView.onLinkClicked();
         }
     }
-
 }
index 49d5ebd..44d1c76 100644 (file)
@@ -4,52 +4,24 @@
 
 package org.chromium.chrome.browser.infobar;
 
-import android.content.Context;
 
 /**
  * Functions needed to display an InfoBar UI.
  */
 public interface InfoBarView {
     /**
-     * Prepare the InfoBar for display and adding InfoBar-specific controls to the layout.
+     * Prepares the InfoBar for display and adds InfoBar-specific controls to the layout.
      * @param layout Layout containing all of the controls.
      */
     public void createContent(InfoBarLayout layout);
 
     /**
-     * Returns the message indicating what the InfoBar is informing or asking the user about.
-     * @param context Context to pull the string from.
-     * @return The string to display.
-     */
-    public CharSequence getMessageText(Context context);
-
-    /**
-     * Returns text to display on the primary button indicating that some action will be taken.
-     * Setting this to null prevents the button from being created.
-     * @param context Context to pull the string from.
-     * @return The string to display.
-     */
-    public String getPrimaryButtonText(Context context);
-
-    /**
-     * Returns text to display on the secondary button, typically indicating that some action will
-     * not be taken.
-     *
-     * Example text includes "Cancel" or "Nope".  Setting this to null prevents the button from
-     * being created.  It is illegal to have a secondary button without a primary button.
-     *
-     * @param context Context to pull the string from.
-     * @return The string to display.
-     */
-    public String getSecondaryButtonText(Context context);
-
-    /**
-     * Take some action related to the link being clicked.
+     * Takes some action related to the link being clicked.
      */
     public void onLinkClicked();
 
     /**
-     * Take some action related to the close button being clicked.
+     * Takes some action related to the close button being clicked.
      */
     public void onCloseButtonClicked();
 
index 20c3aea..941f0e2 100644 (file)
@@ -4,66 +4,33 @@
 
 package org.chromium.chrome.browser.infobar;
 
-import android.content.Context;
-
-import org.chromium.chrome.R;
 
 /**
  * A simple infobar that contains a message and a close icon on the right side.
  * This is used only in the context of Java code and is not associated with any native
  * InfoBarDelegate.
+ *
+ * TODO(newt): merge this into InfoBar.java
  */
 public class MessageInfoBar extends InfoBar {
-    private final CharSequence mTitle;
 
     /**
-     * Creates and returns an infobar with a white background and a close button on the right.
+     * Creates an infobar with a message and a close button.
      * @param title the text displayed in the infobar
-     * @return the infobar.
      */
-    public static MessageInfoBar createInfoBar(CharSequence title) {
-        return new MessageInfoBar(null, 0, title, BACKGROUND_TYPE_INFO);
+    public MessageInfoBar(CharSequence title) {
+        this(null, 0, title);
     }
 
     /**
-     * Creates and returns an infobar with a white background and a close button on the right.
-     * @param iconResourceId the icon shown on the right
-     * @param title the text displayed in the infobar
-     * @return the infobar.
+     * Creates an infobar with an icon, a message and a close button.
+     * @param listener A listener to be notified when the infobar is dismissed, or null.
+     * @param iconResourceId The icon to display in the infobar, or 0 if no icon should be shown.
+     * @param title The text to display in the infobar.
      */
-    public static MessageInfoBar createInfoBar(int iconResourceId, CharSequence title) {
-        return new MessageInfoBar(null, iconResourceId, title, BACKGROUND_TYPE_INFO);
-    }
-
-    /**
-     * Creates a warning infobar, with a yellow background and a warning icon on the right.
-     * @param title the text displayed in the infobar
-     * @return the infobar.
-     */
-    public static MessageInfoBar createWarningInfoBar(CharSequence title) {
-        return createWarningInfoBar(null, title);
-    }
-
-    /**
-     * Creates a warning infobar, with a yellow background and a warning icon on the right.
-     * @param listener an infobar dismissed listener
-     * @param title the text displayed in the infobar
-     * @return the infobar.
-     */
-    public static MessageInfoBar createWarningInfoBar(InfoBarListeners.Dismiss listener,
+    public MessageInfoBar(InfoBarListeners.Dismiss listener, int iconResourceId,
             CharSequence title) {
-        return new MessageInfoBar(listener, R.drawable.warning, title, BACKGROUND_TYPE_WARNING);
-    }
-
-    protected MessageInfoBar(InfoBarListeners.Dismiss listener, int iconResourceId,
-            CharSequence title, int backgroundType) {
-        super(listener, backgroundType, iconResourceId);
-        mTitle = title;
-    }
-
-    @Override
-    public CharSequence getMessageText(Context context) {
-        return mTitle;
+        super(listener, iconResourceId, title);
     }
 
     @Override
index 5788a60..0584270 100644 (file)
@@ -20,8 +20,8 @@ public class SavePasswordInfoBar extends ConfirmInfoBar {
     public SavePasswordInfoBar(long nativeInfoBar, SavePasswordInfoBarDelegate delegate,
             int iconDrawableId, String message, String primaryButtonText,
             String secondaryButtonText) {
-        super(nativeInfoBar, null, InfoBar.BACKGROUND_TYPE_WARNING, iconDrawableId,
-                message, null, primaryButtonText, secondaryButtonText);
+        super(nativeInfoBar, null, iconDrawableId, message,
+                null, primaryButtonText, secondaryButtonText);
         mNativeInfoBar = nativeInfoBar;
         mDelegate = delegate;
     }
@@ -32,7 +32,7 @@ public class SavePasswordInfoBar extends ConfirmInfoBar {
             mUseAdditionalAuthenticationCheckbox = new CheckBox(getContext());
             mUseAdditionalAuthenticationCheckbox.setText(
                     PasswordAuthenticationManager.getPasswordProtectionString());
-            layout.addGroup(mUseAdditionalAuthenticationCheckbox);
+            layout.setCustomContent(mUseAdditionalAuthenticationCheckbox);
         }
 
         super.createContent(layout);
index e0d413b..a3de964 100644 (file)
@@ -4,7 +4,6 @@
 package org.chromium.chrome.browser.infobar;
 
 import android.content.Context;
-import android.widget.TextView;
 
 import org.chromium.chrome.R;
 
@@ -23,16 +22,15 @@ public class TranslateAlwaysPanel implements TranslateSubPanel {
 
     @Override
     public void createContent(Context context, InfoBarLayout layout) {
-        TextView panelMessage = (TextView) layout.findViewById(R.id.infobar_message);
-        panelMessage.setText(context.getString(
+        layout.setMessage(context.getString(
                 R.string.translate_infobar_translation_done, mOptions.targetLanguage()));
 
         if (!mOptions.triggeredFromMenu()) {
-            TranslateCheckBox checkBox = new TranslateCheckBox(mOptions, mListener);
-            checkBox.createContent(context, layout);
+            TranslateCheckBox checkBox = new TranslateCheckBox(context, mOptions, mListener);
+            layout.setCustomContent(checkBox);
         }
 
-        layout.addButtons(context.getString(R.string.translate_button_done),
+        layout.setButtons(context.getString(R.string.translate_button_done),
                 context.getString(R.string.translate_show_original));
     }
 
index 1b2ba16..fdd246a 100644 (file)
@@ -6,38 +6,39 @@ package org.chromium.chrome.browser.infobar;
 import android.content.Context;
 import android.widget.CheckBox;
 import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
 
 import org.chromium.chrome.R;
 
 /**
  * A check box used to determine if a page should always be translated.
  */
-public class TranslateCheckBox {
+public class TranslateCheckBox extends CheckBox implements OnCheckedChangeListener {
+    private static final int TEXT_SIZE_SP = 13;
+
     private final SubPanelListener mListener;
     private final TranslateOptions mOptions;
 
-    public TranslateCheckBox(TranslateOptions options, SubPanelListener listener) {
+    public TranslateCheckBox(Context context, TranslateOptions options, SubPanelListener listener) {
+        super(context);
         mOptions = options;
         mListener = listener;
+
+        setId(R.id.infobar_extra_check);
+        setText(context.getString(R.string.translate_always_text, mOptions.sourceLanguage()));
+        setTextColor(context.getResources().getColor(R.color.infobar_text));
+        setTextSize(TEXT_SIZE_SP);
+        setChecked(mOptions.alwaysTranslateLanguageState());
+        setOnCheckedChangeListener(this);
     }
 
-    public void createContent(Context context, InfoBarLayout layout) {
-        CheckBox checkBox = new CheckBox(context);
-        checkBox.setId(R.id.infobar_extra_check);
-        checkBox.setText(context.getString(R.string.translate_always_text,
-                mOptions.sourceLanguage()));
-        checkBox.setChecked(mOptions.alwaysTranslateLanguageState());
-        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton view, boolean isChecked) {
-                mOptions.toggleAlwaysTranslateLanguageState(isChecked);
-                if (isChecked) {
-                    mListener.onPanelClosed(InfoBar.ACTION_TYPE_NONE);
-                } else {
-                    mListener.onOptionsChanged();
-                }
-            }
-        });
-        layout.addGroup(checkBox);
+    @Override
+    public void onCheckedChanged(CompoundButton view, boolean isChecked) {
+        mOptions.toggleAlwaysTranslateLanguageState(isChecked);
+        if (isChecked) {
+            mListener.onPanelClosed(InfoBar.ACTION_TYPE_NONE);
+        } else {
+            mListener.onOptionsChanged();
+        }
     }
 }
index 9300c01..56cc46e 100644 (file)
@@ -19,7 +19,7 @@ import org.chromium.ui.base.DeviceFormFactor;
 /**
  * Java version of the translate infobar
  */
-public class TranslateInfoBar extends TwoButtonInfoBar implements SubPanelListener {
+public class TranslateInfoBar extends InfoBar implements SubPanelListener {
     // Needs to be kept in sync with the Type enum in translate_infobar_delegate.h.
     public static final int BEFORE_TRANSLATE_INFOBAR = 0;
     public static final int TRANSLATING_INFOBAR = 1;
@@ -45,9 +45,7 @@ public class TranslateInfoBar extends TwoButtonInfoBar implements SubPanelListen
             int infoBarType, int sourceLanguageIndex, int targetLanguageIndex,
             boolean autoTranslatePair, boolean shouldShowNeverBar,
             boolean triggeredFromMenu, String[] languages) {
-        super(null, BACKGROUND_TYPE_INFO,
-                R.drawable.infobar_translate);
-
+        super(null, R.drawable.infobar_translate, null);
         mTranslateDelegate = delegate;
         mOptions = new TranslateOptions(sourceLanguageIndex, targetLanguageIndex, languages,
                 autoTranslatePair, triggeredFromMenu);
@@ -112,8 +110,7 @@ public class TranslateInfoBar extends TwoButtonInfoBar implements SubPanelListen
         return action;
     }
 
-    @Override
-    public CharSequence getMessageText(Context context) {
+    private CharSequence getMessageText(Context context) {
         switch (getInfoBarType()) {
             case BEFORE_TRANSLATE_INFOBAR:
                 String template = context.getString(R.string.translate_infobar_text);
@@ -138,8 +135,7 @@ public class TranslateInfoBar extends TwoButtonInfoBar implements SubPanelListen
         }
     }
 
-    @Override
-    public String getPrimaryButtonText(Context context) {
+    private String getPrimaryButtonText(Context context) {
         switch (getInfoBarType()) {
             case BEFORE_TRANSLATE_INFOBAR:
                 return context.getString(R.string.translate_button);
@@ -155,8 +151,7 @@ public class TranslateInfoBar extends TwoButtonInfoBar implements SubPanelListen
         }
     }
 
-    @Override
-    public String getSecondaryButtonText(Context context) {
+    private String getSecondaryButtonText(Context context) {
         switch (getInfoBarType()) {
             case BEFORE_TRANSLATE_INFOBAR:
                 return context.getString(R.string.translate_nope);
@@ -182,15 +177,17 @@ public class TranslateInfoBar extends TwoButtonInfoBar implements SubPanelListen
             return;
         }
 
+        Context context = layout.getContext();
+        layout.setMessage(getMessageText(context));
+        layout.setButtons(getPrimaryButtonText(context), getSecondaryButtonText(context));
+
         if (getInfoBarType() == AFTER_TRANSLATE_INFOBAR &&
                 !needsAlwaysPanel() &&
                 !mOptions.triggeredFromMenu()) {
             // Long always translate version
-             TranslateCheckBox checkBox = new TranslateCheckBox(mOptions, this);
-             checkBox.createContent(getContext(), layout);
+            TranslateCheckBox checkBox = new TranslateCheckBox(context, mOptions, this);
+            layout.setCustomContent(checkBox);
         }
-
-        super.createContent(layout);
     }
 
     // SubPanelListener implementation
index 7375eb3..fb48247 100644 (file)
@@ -70,15 +70,14 @@ public class TranslateLanguagePanel
         mTargetSpinner = null;
 
         String changeLanguage = context.getString(R.string.translate_infobar_change_languages);
-        TextView panelMessage = (TextView) layout.findViewById(R.id.infobar_message);
-        panelMessage.setText(changeLanguage);
+        layout.setMessage(changeLanguage);
 
         // Set up the spinners.
         createSpinners(context);
-        layout.addGroup(mSourceSpinner, mTargetSpinner);
+        layout.setCustomContent(mSourceSpinner, mTargetSpinner);
 
         // Set up the buttons.
-        layout.addButtons(context.getString(R.string.translate_button_done),
+        layout.setButtons(context.getString(R.string.translate_button_done),
                 context.getString(R.string.cancel));
     }
 
index 882ba38..81a5fe8 100644 (file)
@@ -4,7 +4,6 @@
 package org.chromium.chrome.browser.infobar;
 
 import android.content.Context;
-import android.widget.TextView;
 
 import org.chromium.chrome.R;
 
@@ -25,11 +24,9 @@ public class TranslateNeverPanel implements TranslateSubPanel {
     public void createContent(Context context, InfoBarLayout layout) {
         String changeLanguage = context.getString(
                 R.string.translate_never_translate_message_text, mOptions.sourceLanguage());
+        layout.setMessage(changeLanguage);
 
-        TextView panelMessage = (TextView) layout.findViewById(R.id.infobar_message);
-        panelMessage.setText(changeLanguage);
-
-        layout.addButtons(
+        layout.setButtons(
                 context.getString(R.string.translate_never_translate_site),
                 context.getString(R.string.translate_never_translate_language,
                         mOptions.sourceLanguage()));
diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TwoButtonInfoBar.java b/src/chrome/android/java/src/org/chromium/chrome/browser/infobar/TwoButtonInfoBar.java
deleted file mode 100644 (file)
index 4f3b951..0000000
+++ /dev/null
@@ -1,44 +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.chrome.browser.infobar;
-
-import android.content.Context;
-import android.widget.Button;
-
-import org.chromium.chrome.R;
-
-/**
- * An infobar that presents the user with up to 2 buttons.
- */
-public abstract class TwoButtonInfoBar extends InfoBar {
-    public TwoButtonInfoBar(InfoBarListeners.Dismiss dismissListener, int backgroundType,
-            int iconDrawableId) {
-        super(dismissListener, backgroundType, iconDrawableId);
-    }
-
-    /**
-     * Creates controls for the current InfoBar.
-     * @param layout InfoBarLayout to find controls in.
-     */
-    @Override
-    public void createContent(InfoBarLayout layout) {
-        Context context = layout.getContext();
-        layout.addButtons(getPrimaryButtonText(context), getSecondaryButtonText(context));
-    }
-
-    @Override
-    public void setControlsEnabled(boolean state) {
-        super.setControlsEnabled(state);
-
-        // Handle the buttons.
-        ContentWrapperView wrapper = getContentWrapper(false);
-        if (wrapper != null) {
-            Button primary = (Button) wrapper.findViewById(R.id.button_primary);
-            Button secondary = (Button) wrapper.findViewById(R.id.button_secondary);
-            if (primary != null) primary.setEnabled(state);
-            if (secondary != null) secondary.setEnabled(state);
-        }
-    }
-}
index 84fdff2..663a52b 100644 (file)
@@ -238,6 +238,9 @@ You are signing in with a managed account and giving its administrator control o
       <message name="IDS_TRANSLATE_NEVER_TRANSLATE_LANGUAGE" meaning="Android" desc="Text to display on the never translate language button. [CHAR-LIMIT=64]">
         Never translate <ph name="LANGUAGE">%1$s<ex>French</ex></ph>
       </message>
+      <message name="IDS_MENU_DISMISS_BTN" desc="Content description for the settings menu button when the menu is open.">
+        Dismiss the menu
+      </message>
       <message name="IDS_MENU_PRINT" desc="Menu item for printing the current page. [CHAR-LIMIT=27]">
         Print…
       </message>
index 652f468..7f3e9a0 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">አገናኝ አስቀምጥ</translation>
 <translation id="8034522405403831421">ይህ ገጽ በ<ph name="SOURCE_LANGUAGE"/> ነው። ወደ <ph name="TARGET_LANGUAGE"/> ይተርጎም?</translation>
 <translation id="4195643157523330669">በአዲስ ትር ክፈት</translation>
+<translation id="651048280540227067">ምናሌውን አሰናብት</translation>
 <translation id="3089395242580810162">ማንነትን በማያሳውቅ ትር ክፈት</translation>
 <translation id="8725066075913043281">እንደገና ይሞክሩ</translation>
 <translation id="8909135823018751308">አጋራ…</translation>
index abfe54d..565081a 100644 (file)
@@ -50,6 +50,7 @@
 <translation id="3992315671621218278">حفظ الرابط</translation>
 <translation id="8034522405403831421">هذه الصفحة باللغة <ph name="SOURCE_LANGUAGE"/>. هل تريد ترجمتها إلى اللغة <ph name="TARGET_LANGUAGE"/>؟</translation>
 <translation id="4195643157523330669">فتح الإشارة في علامة تبويب جديدة</translation>
+<translation id="651048280540227067">إغلاق القائمة</translation>
 <translation id="3089395242580810162">فتح في علامة تبويب تصفح متخفي</translation>
 <translation id="8725066075913043281">أعد المحاولة</translation>
 <translation id="8909135823018751308">مشاركة…</translation>
index 4a94d58..7ceb825 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">Запазване на връзката</translation>
 <translation id="8034522405403831421">Тази страница е на <ph name="SOURCE_LANGUAGE"/>. Да се преведе ли на <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Отваряне в нов раздел</translation>
+<translation id="651048280540227067">Отхвърляне на менюто</translation>
 <translation id="3089395242580810162">Отваряне в раздел „инкогнито“</translation>
 <translation id="8725066075913043281">Опитайте отново</translation>
 <translation id="8909135823018751308">Споделяне…</translation>
index 9f58e1e..f92fe51 100644 (file)
@@ -52,6 +52,7 @@ Inicieu la sessió amb un compte gestionat, de manera que concediu al seu admini
 <translation id="3992315671621218278">Desa l'enllaç</translation>
 <translation id="8034522405403831421">Aquesta pàgina està escrita en <ph name="SOURCE_LANGUAGE"/>. Voleu traduir-la a <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Obre en una pestanya nova</translation>
+<translation id="651048280540227067">Descarta el menú</translation>
 <translation id="3089395242580810162">Obre en una pestanya d'incògnit</translation>
 <translation id="8725066075913043281">Torna-ho a provar</translation>
 <translation id="8909135823018751308">Comparteix...</translation>
index ee10ecc..a607cbf 100644 (file)
@@ -52,6 +52,7 @@ Přihlašujete se pomocí spravovaného účtu a poskytujete jeho správci kontr
 <translation id="3992315671621218278">Uložit odkaz</translation>
 <translation id="8034522405403831421">Stránka je v jazyce <ph name="SOURCE_LANGUAGE"/>. Chcete ji přeložit do jazyka <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Otevřít na nové kartě</translation>
+<translation id="651048280540227067">Zavřít nabídku</translation>
 <translation id="3089395242580810162">Otevřít na anonymní kartě</translation>
 <translation id="8725066075913043281">Zkusit znovu</translation>
 <translation id="8909135823018751308">Sdílet…</translation>
index 9ddb650..3f40b28 100644 (file)
@@ -31,7 +31,7 @@ Du logger ind med en administreret konto, og du giver administratoren kontrol ov
 <translation id="3896036286668839683">Certifikatvisning</translation>
 <translation id="8583805026567836021">Kontodataene ryddes</translation>
 <translation id="4250680216510889253">Nej</translation>
-<translation id="8073388330009372546">Åbn billede i ny fane</translation>
+<translation id="8073388330009372546">Åbn billede  ny fane</translation>
 <translation id="552553974213252141">Blev teksten trukket korrekt ud?</translation>
 <translation id="8730621377337864115">Udfør</translation>
 <translation id="4170011742729630528">Tjenesten er ikke tilgængelig. Prøv igen senere.</translation>
@@ -42,7 +42,7 @@ Du logger ind med en administreret konto, og du giver administratoren kontrol ov
 <translation id="656628257199996201">Oversæt altid <ph name="SOURCE_LANGUAGE"/></translation>
 <translation id="9137013805542155359">Vis oprindelig</translation>
 <translation id="5684874026226664614">Ups! Denne side kunne ikke oversættes.</translation>
-<translation id="4619298195800598081">Åbn originalbillede i ny fane</translation>
+<translation id="4619298195800598081">Åbn originalbillede  ny fane</translation>
 <translation id="907015151729920253">Smart card</translation>
 <translation id="3063601790762993062">Gem video</translation>
 <translation id="6042308850641462728">Mere</translation>
@@ -51,7 +51,8 @@ Du logger ind med en administreret konto, og du giver administratoren kontrol ov
 <translation id="4148957013307229264">Installerer...</translation>
 <translation id="3992315671621218278">Gem link</translation>
 <translation id="8034522405403831421">Denne side er på <ph name="SOURCE_LANGUAGE"/>. Vil du oversætte den til <ph name="TARGET_LANGUAGE"/>?</translation>
-<translation id="4195643157523330669">Åbn i ny fane</translation>
+<translation id="4195643157523330669">Åbn på ny fane</translation>
+<translation id="651048280540227067">Luk menuen</translation>
 <translation id="3089395242580810162">Åbn i inkognitofane</translation>
 <translation id="8725066075913043281">Forsøg igen</translation>
 <translation id="8909135823018751308">Del…</translation>
@@ -75,7 +76,7 @@ Du logger ind med en administreret konto, og du giver administratoren kontrol ov
 <translation id="969096075394517431">Skift sprog</translation>
 <translation id="5556459405103347317">Genindlæs</translation>
 <translation id="5032574515228824816">Meddelelse</translation>
-<translation id="4847896847259487518">Tilføj bogmærke for siden</translation>
+<translation id="4847896847259487518">Tilføj siden som bogmærke</translation>
 <translation id="497421865427891073">Gå fremad</translation>
 <translation id="8310344678080805313">Standardfaner</translation>
 <translation id="6277522088822131679">Der opstod et problem med udskrivning af siden. Prøv igen.</translation>
index 05f0443..ce59487 100644 (file)
@@ -52,6 +52,7 @@ Sie melden sich gerade mit einem verwalteten Konto an und geben dem Administrato
 <translation id="3992315671621218278">Link speichern</translation>
 <translation id="8034522405403831421">Diese Seite ist auf <ph name="SOURCE_LANGUAGE"/>. In folgende Sprache übersetzen: <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">In neuem Tab öffnen</translation>
+<translation id="651048280540227067">Menü schließen</translation>
 <translation id="3089395242580810162">In Inkognito-Tab öffnen</translation>
 <translation id="8725066075913043281">Erneut versuchen</translation>
 <translation id="8909135823018751308">Teilen...</translation>
index 890c0ce..fc5076e 100644 (file)
@@ -51,7 +51,8 @@
 <translation id="4148957013307229264">Γίνεται εγκατάσταση...</translation>
 <translation id="3992315671621218278">Αποθήκευση συνδέσμου</translation>
 <translation id="8034522405403831421">Αυτή η σελίδα είναι στα <ph name="SOURCE_LANGUAGE"/>. Μετάφρασή της στα <ph name="TARGET_LANGUAGE"/>;</translation>
-<translation id="4195643157523330669">Άνοιγμα σε νέα καρτέ&amp;λα</translation>
+<translation id="4195643157523330669">Άνοιγμα σε νέα καρτέλα</translation>
+<translation id="651048280540227067">Παράβλεψη μενού</translation>
 <translation id="3089395242580810162">Άνοιγμα σε καρτέλα ανώνυμης περιήγησης</translation>
 <translation id="8725066075913043281">Προσπαθήστε ξανά</translation>
 <translation id="8909135823018751308">Κοινή χρήση…</translation>
index 5722737..c2530a1 100644 (file)
@@ -52,6 +52,7 @@ You are signing in with a managed account and giving its administrator control o
 <translation id="3992315671621218278">Save link</translation>
 <translation id="8034522405403831421">This page is in <ph name="SOURCE_LANGUAGE"/>. Translate it to <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Open in new tab</translation>
+<translation id="651048280540227067">Dismiss the menu</translation>
 <translation id="3089395242580810162">Open in incognito tab</translation>
 <translation id="8725066075913043281">Try again</translation>
 <translation id="8909135823018751308">Share…</translation>
index f6c0ef2..fd0af90 100644 (file)
@@ -52,6 +52,7 @@ Vas a acceder con una cuenta administrada, lo que significa que proporcionarás
 <translation id="3992315671621218278">Guardar vínculo</translation>
 <translation id="8034522405403831421">Esta página está en <ph name="SOURCE_LANGUAGE"/>. ¿Quieres traducirla al <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Abrir en una pestaña nueva</translation>
+<translation id="651048280540227067">Descartar el menú</translation>
 <translation id="3089395242580810162">Abrir en pestaña de incógnito</translation>
 <translation id="8725066075913043281">Intentar nuevamente</translation>
 <translation id="8909135823018751308">Compartir…</translation>
index ddbbdeb..6222c39 100644 (file)
@@ -52,6 +52,7 @@ Vas a iniciar sesión con una cuenta administrada, lo que significa que proporci
 <translation id="3992315671621218278">Guardar enlace</translation>
 <translation id="8034522405403831421">Esta página está escrita en <ph name="SOURCE_LANGUAGE"/>. ¿Quieres traducirla al <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Abrir en una pestaña nueva</translation>
+<translation id="651048280540227067">Ignorar el menú</translation>
 <translation id="3089395242580810162">Abrir en modo de incógnito</translation>
 <translation id="8725066075913043281">Volver a intentarlo</translation>
 <translation id="8909135823018751308">Compartir…</translation>
index ddcedb0..5c2219d 100644 (file)
@@ -50,6 +50,7 @@
 <translation id="3992315671621218278">ذخیره پیوند</translation>
 <translation id="8034522405403831421">این صفحه به زبان <ph name="SOURCE_LANGUAGE"/> است. مایلید آن را به <ph name="TARGET_LANGUAGE"/> ترجمه کنید؟</translation>
 <translation id="4195643157523330669">باز کردن در برگهٔ جدید</translation>
+<translation id="651048280540227067">نادیده گرفتن منو</translation>
 <translation id="3089395242580810162">باز کردن در برگه ناشناس</translation>
 <translation id="8725066075913043281">سعی مجدد</translation>
 <translation id="8909135823018751308">اشتراک‌گذاری‌...</translation>
index 9f55c57..bf0f39c 100644 (file)
@@ -52,6 +52,7 @@ Olet kirjautumassa hallinnoituun tiliin, jonka hallinnoijalla on oikeus muokata
 <translation id="3992315671621218278">Tallenna linkki</translation>
 <translation id="8034522405403831421">Sivu on kirjoitettu kielellä <ph name="SOURCE_LANGUAGE"/>. Haluatko kääntää sen kielelle <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Avaa uudessa välilehdessä</translation>
+<translation id="651048280540227067">Piilota valikko</translation>
 <translation id="3089395242580810162">Avaa incognito-välilehdessä</translation>
 <translation id="8725066075913043281">Yritä uudelleen</translation>
 <translation id="8909135823018751308">Jaa…</translation>
index 4dd626b..49f65ed 100644 (file)
@@ -52,6 +52,7 @@ Nagsa-sign in ka sa isang pinamamahalaang account at nagbibigay sa administrator
 <translation id="3992315671621218278">I-save ang link</translation>
 <translation id="8034522405403831421">Nasa <ph name="SOURCE_LANGUAGE"/> ang pahinang ito. Isalin ito sa <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Buksan sa bagong tab</translation>
+<translation id="651048280540227067">I-dismiss ang menu</translation>
 <translation id="3089395242580810162">Buksan sa tab na incognito</translation>
 <translation id="8725066075913043281">Muling subukan</translation>
 <translation id="8909135823018751308">Ibahagi…</translation>
index 1a82487..4c0543b 100644 (file)
@@ -52,6 +52,7 @@ Vous vous connectez avec un compte géré, et vous donnez à l'administrateur le
 <translation id="3992315671621218278">Enregistrer le lien</translation>
 <translation id="8034522405403831421">Cette page est rédigée en <ph name="SOURCE_LANGUAGE"/>. Voulez-vous la traduire en <ph name="TARGET_LANGUAGE"/> ?</translation>
 <translation id="4195643157523330669">Ouvrir dans un nouvel onglet</translation>
+<translation id="651048280540227067">Fermer le menu</translation>
 <translation id="3089395242580810162">Ouvrir dans un onglet de navigation privée</translation>
 <translation id="8725066075913043281">Réessayer</translation>
 <translation id="8909135823018751308">Partager…</translation>
index 2aa4266..ca45556 100644 (file)
@@ -22,7 +22,7 @@
 
 आप प्रबंधित खाते से प्रवेश कर रहे हैं और अपनी Chrome प्रोफ़ाइल को इसका व्यवस्थापक नियंत्रण दे रहे हैं. आपका Chrome डेटा इस खाते से स्थायी रूप से जुड़ जाएगा. इस खाते से डिस्कनेक्ट करने से स्थानीय Chrome डेटा हट जाएगा.</translation>
 <translation id="1966710179511230534">कृपया अपने प्रवेश विवरण अपडेट करें.</translation>
-<translation id="1623104350909869708">à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤\85तिरिà¤\95à¥\8dत à¤¸à¤\82वाद बनाने से रोकें</translation>
+<translation id="1623104350909869708">à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤\85तिरिà¤\95à¥\8dत à¤¡à¥\89यलà¥\89à¤\97 बनाने से रोकें</translation>
 <translation id="1426410128494586442">हां</translation>
 <translation id="8218346974737627104">प्रवेश की पुष्टि करें</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE"/>, टैब</translation>
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">लिंक सहेजें</translation>
 <translation id="8034522405403831421">यह पृष्ठ <ph name="SOURCE_LANGUAGE"/> में है. इसका <ph name="TARGET_LANGUAGE"/> में अनुवाद करें?</translation>
 <translation id="4195643157523330669">नए टैब में खोलें</translation>
+<translation id="651048280540227067">मेनू को खारिज करें</translation>
 <translation id="3089395242580810162">गुप्त टैब में खोलें</translation>
 <translation id="8725066075913043281">पुन: प्रयास करें</translation>
 <translation id="8909135823018751308">साझा करें…</translation>
index 08b78e4..68b1e2f 100644 (file)
@@ -52,6 +52,7 @@ Prijavljujete se svojim upravljanim računom i njenom administratoru dajete nadz
 <translation id="3992315671621218278">Spremi vezu</translation>
 <translation id="8034522405403831421">Jezik ove stranice jest <ph name="SOURCE_LANGUAGE"/>. Želite li je prevesti na <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Otvori u novoj kartici</translation>
+<translation id="651048280540227067">Odbacivanje izbornika</translation>
 <translation id="3089395242580810162">Otvori na kartici Anonimno</translation>
 <translation id="8725066075913043281">Pokušajte ponovo</translation>
 <translation id="8909135823018751308">Dijeljenje…</translation>
index 7271e73..359fa51 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">Link mentése</translation>
 <translation id="8034522405403831421">Ez az oldal <ph name="SOURCE_LANGUAGE"/> nyelven van. Lefordítja <ph name="TARGET_LANGUAGE"/> nyelvre?</translation>
 <translation id="4195643157523330669">Megnyitás új lapon</translation>
+<translation id="651048280540227067">Menü figyelmen kívül hagyása</translation>
 <translation id="3089395242580810162">Megnyitás inkognitólapon</translation>
 <translation id="8725066075913043281">Újrapróbálás</translation>
 <translation id="8909135823018751308">Megosztás...</translation>
index 81ce9d8..8c96c2f 100644 (file)
@@ -52,6 +52,7 @@ Anda masuk dengan akun yang dikelola dan memberikan administratornya kontrol ata
 <translation id="3992315671621218278">Simpan tautan</translation>
 <translation id="8034522405403831421">Laman ini berbahasa <ph name="SOURCE_LANGUAGE"/>. Terjemahkan ke <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Buka di tab baru</translation>
+<translation id="651048280540227067">Tutup menu</translation>
 <translation id="3089395242580810162">Buka di tab penyamaran</translation>
 <translation id="8725066075913043281">Coba lagi</translation>
 <translation id="8909135823018751308">Bagikan...</translation>
index 365783a..4610e23 100644 (file)
@@ -52,6 +52,7 @@ Stai per eseguire l'accesso con un account gestito e consentire al relativo ammi
 <translation id="3992315671621218278">Salva link</translation>
 <translation id="8034522405403831421">Questa pagina è in <ph name="SOURCE_LANGUAGE"/>. Tradurla in <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Apri in un'altra scheda</translation>
+<translation id="651048280540227067">Ignora il menu</translation>
 <translation id="3089395242580810162">Apri in scheda in incognito</translation>
 <translation id="8725066075913043281">Riprova</translation>
 <translation id="8909135823018751308">Condividi…</translation>
index 1d452a7..86ca273 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">שמור את הקישור</translation>
 <translation id="8034522405403831421">דף זה מוצג ב<ph name="SOURCE_LANGUAGE"/>. האם לתרגם אותו ל<ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">פתח בכרטיסייה חדשה</translation>
+<translation id="651048280540227067">סגור את התפריט</translation>
 <translation id="3089395242580810162">פתח בכרטיסיית גלישה בסתר</translation>
 <translation id="8725066075913043281">נסה שוב</translation>
 <translation id="8909135823018751308">שתף…</translation>
index a30d21e..25c92b6 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">リンクを保存</translation>
 <translation id="8034522405403831421">このページの言語は<ph name="SOURCE_LANGUAGE"/>です。<ph name="TARGET_LANGUAGE"/>に翻訳しますか?</translation>
 <translation id="4195643157523330669">新しいタブで開く</translation>
+<translation id="651048280540227067">メニューを閉じる</translation>
 <translation id="3089395242580810162">シークレット タブで開く</translation>
 <translation id="8725066075913043281">やり直し</translation>
 <translation id="8909135823018751308">共有...</translation>
index e93dbaa..01d2e59 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">링크 저장</translation>
 <translation id="8034522405403831421">이 페이지는 <ph name="SOURCE_LANGUAGE"/>로 되어 있습니다. <ph name="TARGET_LANGUAGE"/>로 번역하시겠습니까?</translation>
 <translation id="4195643157523330669">새 탭에서 열기</translation>
+<translation id="651048280540227067">메뉴 닫기</translation>
 <translation id="3089395242580810162">시크릿 탭에서 열기</translation>
 <translation id="8725066075913043281">다시 시도하세요</translation>
 <translation id="8909135823018751308">공유…</translation>
index a77ef98..4d719b0 100644 (file)
@@ -52,6 +52,7 @@ Prisijungiate naudodami valdomą paskyrą ir leidžiate administratoriui valdyti
 <translation id="3992315671621218278">Išsaugoti nuorodą</translation>
 <translation id="8034522405403831421">Šis puslapis yra <ph name="SOURCE_LANGUAGE"/> k. Išversti į <ph name="TARGET_LANGUAGE"/> k.?</translation>
 <translation id="4195643157523330669">Atidaryti naujame skirtuke</translation>
+<translation id="651048280540227067">Atsisakyti meniu</translation>
 <translation id="3089395242580810162">Atidaryti inkognito skirtuko lape</translation>
 <translation id="8725066075913043281">Bandyti dar kartą</translation>
 <translation id="8909135823018751308">Bendrinti…</translation>
index 4e3f691..afbf922 100644 (file)
@@ -52,6 +52,7 @@ Jūs pierakstāties, izmantojot pārvaldītu kontu, un ļaujat šī konta admini
 <translation id="3992315671621218278">Saglabāt saiti</translation>
 <translation id="8034522405403831421">Šī lapas saturs ir šādā valodā: <ph name="SOURCE_LANGUAGE"/>. Vai tulkot šādā valodā: <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Atvērt jaunā cilnē</translation>
+<translation id="651048280540227067">Nerādīt izvēlni</translation>
 <translation id="3089395242580810162">Atvērt inkognito režīma cilnē</translation>
 <translation id="8725066075913043281">Mēģināt vēlreiz</translation>
 <translation id="8909135823018751308">Kopīgot...</translation>
index d47a163..eaac249 100644 (file)
@@ -52,6 +52,7 @@ Je logt in met een beheerd account en geeft de beheerder controle over je Chrome
 <translation id="3992315671621218278">Link opslaan</translation>
 <translation id="8034522405403831421">Deze pagina is in het <ph name="SOURCE_LANGUAGE"/>. Vertalen naar het <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Openen op nieuw tabblad</translation>
+<translation id="651048280540227067">Het menu sluiten</translation>
 <translation id="3089395242580810162">Openen op incognitotabblad</translation>
 <translation id="8725066075913043281">Opnieuw proberen</translation>
 <translation id="8909135823018751308">Delen…</translation>
index d36fb4f..fa133e2 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
 <translation id="8588878054171169263">Lagre bildet</translation>
-<translation id="7998918019931843664">Åpne lukkede faner på nytt</translation>
+<translation id="7998918019931843664">Åpne lukkede faner igjen</translation>
 <translation id="4996978546172906250">Del via</translation>
 <translation id="5578795271662203820">Søk etter dette bildet i <ph name="SEARCH_ENGINE"/></translation>
 <translation id="6831043979455480757">Oversett</translation>
@@ -52,6 +52,7 @@ Du logger på med en administrert konto, og gir administratoren kontroll over Ch
 <translation id="3992315671621218278">Lagre linken</translation>
 <translation id="8034522405403831421">Denne siden er på <ph name="SOURCE_LANGUAGE"/>. Vil du oversette den til <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Åpne i ny fane</translation>
+<translation id="651048280540227067">Lukk menyen</translation>
 <translation id="3089395242580810162">Åpne i inkognitofane</translation>
 <translation id="8725066075913043281">Prøv igjen</translation>
 <translation id="8909135823018751308">Del</translation>
@@ -60,7 +61,7 @@ Du logger på med en administrert konto, og gir administratoren kontroll over Ch
 <translation id="1206892813135768548">Kopiér linkteksten</translation>
 <translation id="9154176715500758432">Bli værende på denne siden</translation>
 <translation id="7063006564040364415">Kunne ikke koble til synkroniseringstjeneren.</translation>
-<translation id="4271185234001491831">Aldri oversett <ph name="LANGUAGE"/></translation>
+<translation id="4271185234001491831">Oversett aldri <ph name="LANGUAGE"/></translation>
 <translation id="6671495933530132209">Kopiér bildet</translation>
 <translation id="8209050860603202033">Åpne bildet</translation>
 <translation id="2501278716633472235">Gå tilbake</translation>
index 9a4f46e..6e82553 100644 (file)
@@ -52,6 +52,7 @@ Logujesz się na zarządzane konto i dajesz jego administratorowi kontrolę nad
 <translation id="3992315671621218278">Zapisz link</translation>
 <translation id="8034522405403831421">Język tej strony to <ph name="SOURCE_LANGUAGE"/>. Przetłumaczyć ją na <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Otwórz w nowej karcie</translation>
+<translation id="651048280540227067">Zamknij to menu</translation>
 <translation id="3089395242580810162">Otwórz w karcie incognito</translation>
 <translation id="8725066075913043281">Spróbuj ponownie</translation>
 <translation id="8909135823018751308">Udostępnij…</translation>
index 0c9ee13..d52a4d0 100644 (file)
@@ -52,6 +52,7 @@ Você está fazendo login com uma conta gerenciada e fornecendo ao administrador
 <translation id="3992315671621218278">Salvar link</translation>
 <translation id="8034522405403831421">Esta página está escrita em <ph name="SOURCE_LANGUAGE"/>. Traduzi-la para <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Abrir em uma nova guia</translation>
+<translation id="651048280540227067">Ignorar menu</translation>
 <translation id="3089395242580810162">Abrir em guia anônima</translation>
 <translation id="8725066075913043281">Tentar novamente</translation>
 <translation id="8909135823018751308">Compartilhar...</translation>
index 913f7dc..7a558b6 100644 (file)
@@ -52,6 +52,7 @@ Está a iniciar sessão com uma conta gerida e a atribuir ao respetivo administr
 <translation id="3992315671621218278">Guardar link</translation>
 <translation id="8034522405403831421">Esta página está em <ph name="SOURCE_LANGUAGE"/>. Pretende traduzi-la para <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Abrir num novo separador</translation>
+<translation id="651048280540227067">Ignorar o menu</translation>
 <translation id="3089395242580810162">Abrir no separador de navegação anónima</translation>
 <translation id="8725066075913043281">Tentar novamente</translation>
 <translation id="8909135823018751308">Partilhar…</translation>
index 3a44855..2eacc20 100644 (file)
 <translation id="641643625718530986">Printați...</translation>
 <translation id="5763382633136178763">File incognito</translation>
 <translation id="5210365745912300556">Închideți fila</translation>
-<translation id="7658239707568436148">Anulaţi</translation>
+<translation id="7658239707568436148">Anulați</translation>
 <translation id="6458785801851713928">Sincronizarea nu este disponibilă pentru domeniul dvs.</translation>
 <translation id="2731700343119398978">Așteptați...</translation>
-<translation id="6846298663435243399">Se încarcă...</translation>
+<translation id="6846298663435243399">Se încarcă</translation>
 <translation id="7378627244592794276">Nu</translation>
 <translation id="3358663646935160692">Acest cont este gestionat de <ph name="DOMAIN_NAME"/>.
 
@@ -40,31 +40,32 @@ Urmează să vă conectați cu un cont gestionat și să acordați administrator
 <translation id="8374821112118309944">Trebuie să actualizați TalkBack la o versiune mai nouă.</translation>
 <translation id="4043215103217793252">Editați marcajul pentru această pagină</translation>
 <translation id="656628257199996201">Tradu întotdeauna din <ph name="SOURCE_LANGUAGE"/></translation>
-<translation id="9137013805542155359">Afișați originalul</translation>
+<translation id="9137013805542155359">Afișați varianta originală</translation>
 <translation id="5684874026226664614">Hopa. Această pagină nu a putut fi tradusă.</translation>
 <translation id="4619298195800598081">Imagine originală în filă nouă</translation>
 <translation id="907015151729920253">Card inteligent</translation>
 <translation id="3063601790762993062">Salvați videoclipul</translation>
-<translation id="6042308850641462728">Mai mult</translation>
+<translation id="6042308850641462728">Mai multe</translation>
 <translation id="7267430310003164111">Notificare pentru a descărca aplicația din Magazin Google Play.  Numele aplicației: <ph name="APP_NAME"/>.  Evaluarea medie a aplicației: <ph name="APP_RATING"/>.</translation>
 <translation id="303955801043931176">Fila a fost închisă</translation>
 <translation id="4148957013307229264">Se instalează...</translation>
 <translation id="3992315671621218278">Salvați linkul</translation>
 <translation id="8034522405403831421">Această pagină este în <ph name="SOURCE_LANGUAGE"/>. Doriți traducere în <ph name="TARGET_LANGUAGE"/>?</translation>
-<translation id="4195643157523330669">Deschideți într-o filă nouă</translation>
+<translation id="4195643157523330669">Deschideți în filă nouă</translation>
+<translation id="651048280540227067">Închide meniul</translation>
 <translation id="3089395242580810162">Deschideți într-o filă incognito</translation>
 <translation id="8725066075913043281">Încercați din nou</translation>
 <translation id="8909135823018751308">Trimiteți…</translation>
 <translation id="4269820728363426813">Copiați adresa linkului</translation>
 <translation id="4510973599275542560">Nu reîncărcați</translation>
 <translation id="1206892813135768548">Copiați textul linkului</translation>
-<translation id="9154176715500758432">Rămâneți pe această pagină</translation>
+<translation id="9154176715500758432">Rămâneți pe pagină</translation>
 <translation id="7063006564040364415">Nu s-a putut stabili conexiunea cu serverul de sincronizare.</translation>
 <translation id="4271185234001491831">Nu traduce niciodată din <ph name="LANGUAGE"/></translation>
 <translation id="6671495933530132209">Copiați imaginea</translation>
 <translation id="8209050860603202033">Deschideți imaginea</translation>
 <translation id="2501278716633472235">Înapoi</translation>
-<translation id="1285320974508926690">Nu doresc să se traducă niciodată acest site</translation>
+<translation id="1285320974508926690">Nu traduce niciodată acest site</translation>
 <translation id="5164482624172255778">Doriți ca data viitoare Google Chrome să propună traducerea paginilor în limba <ph name="LANGUAGE"/> de pe acest site?</translation>
 <translation id="8528538445849828817">Limba paginii: <ph name="SOURCE_LANGUAGE"/></translation>
 <translation id="4881695831933465202">Deschideți</translation>
index ba01517..a061871 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">Сохранить ссылку</translation>
 <translation id="8034522405403831421">Язык этой страницы: <ph name="SOURCE_LANGUAGE"/>. Перевести ее на <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Открыть в новой вкладке</translation>
+<translation id="651048280540227067">Закрыть меню</translation>
 <translation id="3089395242580810162">Открыть в режиме инкогнито</translation>
 <translation id="8725066075913043281">Повторить попытку</translation>
 <translation id="8909135823018751308">Отправка…</translation>
index 2948132..446d55e 100644 (file)
@@ -52,6 +52,7 @@ Prihlasujete sa pomocou spravovaného účtu a jeho správcovi tak umožňujete
 <translation id="3992315671621218278">Uložiť odkaz</translation>
 <translation id="8034522405403831421">Táto stránka je v jazyku <ph name="SOURCE_LANGUAGE"/>. Chcete ju preložiť do jazyka <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Otvoriť na novej karte</translation>
+<translation id="651048280540227067">Zavrieť ponuku</translation>
 <translation id="3089395242580810162">Otvoriť na karte inkognito</translation>
 <translation id="8725066075913043281">Skúsiť znova</translation>
 <translation id="8909135823018751308">Zdieľať…</translation>
index 40a9283..f70d784 100644 (file)
@@ -52,6 +52,7 @@ Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nad
 <translation id="3992315671621218278">Shrani povezavo</translation>
 <translation id="8034522405403831421">Ta stran je v jeziku <ph name="SOURCE_LANGUAGE"/>. Jo želite prevesti v jezik <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Odpri v novem zavihku</translation>
+<translation id="651048280540227067">Zapri meni</translation>
 <translation id="3089395242580810162">Odpri v zavihku brez beleženja zgodovine</translation>
 <translation id="8725066075913043281">Poskusite znova</translation>
 <translation id="8909135823018751308">Skupna raba …</translation>
index 5856cbc..a709204 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">Сачувај линк</translation>
 <translation id="8034522405403831421">Језик ове странице је <ph name="SOURCE_LANGUAGE"/>. Желите ли да је преведете на <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Отвори у новој &amp;картици</translation>
+<translation id="651048280540227067">Одбацивање менија</translation>
 <translation id="3089395242580810162">Отварање на картици без архивирања</translation>
 <translation id="8725066075913043281">Покушајте поново</translation>
 <translation id="8909135823018751308">Дели...</translation>
index 44dc6f6..5e0f798 100644 (file)
@@ -52,6 +52,7 @@ Du loggar in med ett hanterat konto, vilket innebär att administratören kontro
 <translation id="3992315671621218278">Spara länk</translation>
 <translation id="8034522405403831421">Den här sidan är skriven på <ph name="SOURCE_LANGUAGE"/>. Vill du översätta den till <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Öppna i ny flik</translation>
+<translation id="651048280540227067">Stäng menyn</translation>
 <translation id="3089395242580810162">Öppna i inkognitoflik</translation>
 <translation id="8725066075913043281">Försök igen</translation>
 <translation id="8909135823018751308">Dela …</translation>
index 34edf64..1712115 100644 (file)
@@ -52,6 +52,7 @@ Unaingia katika akaunti kwa kutumia akaunti inayosimamiwa na kumpa msimamizi wa
 <translation id="3992315671621218278">Hifadhi kiungo</translation>
 <translation id="8034522405403831421">Ukurasa huu ni wa lugha ya <ph name="SOURCE_LANGUAGE"/>. Je, ungependa kuutasfiri kuwa <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Fungua katika kichupo kipya</translation>
+<translation id="651048280540227067">Ondoa menyu</translation>
 <translation id="3089395242580810162">Fungua kwenye kichupo fiche</translation>
 <translation id="8725066075913043281">Jaribu tena</translation>
 <translation id="8909135823018751308">Shiriki...</translation>
index ef438ef..a6a250b 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">บันทึกลิงก์</translation>
 <translation id="8034522405403831421">หน้าเว็บนี้อยู่ในภาษา<ph name="SOURCE_LANGUAGE"/> ต้องการแปลเป็นภาษา<ph name="TARGET_LANGUAGE"/>ไหม</translation>
 <translation id="4195643157523330669">เปิดในแท็บใหม่</translation>
+<translation id="651048280540227067">ปิดเมนู</translation>
 <translation id="3089395242580810162">เปิดในแท็บไม่ระบุตัวตน</translation>
 <translation id="8725066075913043281">ลองอีกครั้ง</translation>
 <translation id="8909135823018751308">แชร์…</translation>
index 99c8b14..a118bc4 100644 (file)
@@ -52,6 +52,7 @@ Yönetilen bir hesapla oturum açıyor ve hesabın yöneticisine Chrome profilin
 <translation id="3992315671621218278">Bağlantıyı kaydet</translation>
 <translation id="8034522405403831421">Bu sayfa <ph name="SOURCE_LANGUAGE"/> dilinde. <ph name="TARGET_LANGUAGE"/> diline çevrilsin mi?</translation>
 <translation id="4195643157523330669">Yeni sekmede aç</translation>
+<translation id="651048280540227067">Menüyü kapat</translation>
 <translation id="3089395242580810162">Gizli sekmede aç</translation>
 <translation id="8725066075913043281">Yeniden dene</translation>
 <translation id="8909135823018751308">Paylaş…</translation>
index 396fd3f..2f66dfc 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">Зберегти посилання</translation>
 <translation id="8034522405403831421">Мова цієї сторінки: <ph name="SOURCE_LANGUAGE"/>. Перекласти її такою мовою: <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Відкрити в новій вкладці</translation>
+<translation id="651048280540227067">Закрити меню</translation>
 <translation id="3089395242580810162">Відкрити в анонімній вкладці</translation>
 <translation id="8725066075913043281">Повторити спробу</translation>
 <translation id="8909135823018751308">Надіслати…</translation>
index ae4d646..dd5feed 100644 (file)
@@ -20,7 +20,7 @@
 <translation id="7378627244592794276">Không</translation>
 <translation id="3358663646935160692">Tài khoản này được quản lý bởi <ph name="DOMAIN_NAME"/>.
 
-Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp cho quản trị viên quyền kiểm soát đối với tiểu sử trên Chrome của bạn. Dữ liệu Chrome của bạn sẽ vĩnh viễn gắn với tài khoản này. Ngắt kết nối khỏi tài khoản này sẽ xóa các dữ liệu Chrome cục bộ.</translation>
+Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp cho quản trị viên quyền kiểm soát đối với hồ sơ trên Chrome của bạn. Dữ liệu Chrome của bạn sẽ vĩnh viễn gắn với tài khoản này. Ngắt kết nối khỏi tài khoản này sẽ xóa các dữ liệu Chrome cục bộ.</translation>
 <translation id="1966710179511230534">Vui lòng cập nhật chi tiết đăng nhập của bạn.</translation>
 <translation id="1623104350909869708">Ngăn trang này tạo hộp thoại bổ sung</translation>
 <translation id="1426410128494586442">Có</translation>
@@ -52,6 +52,7 @@ Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp
 <translation id="3992315671621218278">Lưu liên kết</translation>
 <translation id="8034522405403831421">Trang này có ngôn ngữ là <ph name="SOURCE_LANGUAGE"/>. Dịch trang này sang <ph name="TARGET_LANGUAGE"/>?</translation>
 <translation id="4195643157523330669">Mở bằng tab mới</translation>
+<translation id="651048280540227067">Loại bỏ trình đơn</translation>
 <translation id="3089395242580810162">Mở bằng tab ẩn danh</translation>
 <translation id="8725066075913043281">Thử lại</translation>
 <translation id="8909135823018751308">Chia sẻ...</translation>
index 4ade567..724bbfc 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">保存链接</translation>
 <translation id="8034522405403831421">此网页的源语言为<ph name="SOURCE_LANGUAGE"/>,要将其翻译成<ph name="TARGET_LANGUAGE"/>吗?</translation>
 <translation id="4195643157523330669">在新标签页中打开</translation>
+<translation id="651048280540227067">关闭此菜单</translation>
 <translation id="3089395242580810162">在隐身标签页中打开</translation>
 <translation id="8725066075913043281">重试</translation>
 <translation id="8909135823018751308">分享…</translation>
index 2a69a4a..f4a35fc 100644 (file)
@@ -52,6 +52,7 @@
 <translation id="3992315671621218278">儲存連結</translation>
 <translation id="8034522405403831421">這個網頁的內容是<ph name="SOURCE_LANGUAGE"/>,需要翻譯成<ph name="TARGET_LANGUAGE"/>嗎?</translation>
 <translation id="4195643157523330669">在新分頁中開啟</translation>
+<translation id="651048280540227067">關閉選單</translation>
 <translation id="3089395242580810162">在無痕式分頁中開啟</translation>
 <translation id="8725066075913043281">再試一次</translation>
 <translation id="8909135823018751308">分享…</translation>
index b49c31d..b64767b 100644 (file)
@@ -62,12 +62,13 @@ public class TabManager extends LinearLayout {
         mContentVideoViewClient = videoViewClient;
         mContentViewHolder = (ViewGroup) findViewById(R.id.content_container);
         mToolbar = (ChromeShellToolbar) findViewById(R.id.toolbar);
-        mContentViewRenderView = new ContentViewRenderView(getContext(), mWindow) {
+        mContentViewRenderView = new ContentViewRenderView(getContext()) {
             @Override
             protected void onReadyToRender() {
                 if (mCurrentTab == null) createTab(mStartupUrl);
             }
         };
+        mContentViewRenderView.onNativeLibraryLoaded(mWindow);
         mContentViewHolder.addView(mContentViewRenderView,
                 new FrameLayout.LayoutParams(
                         FrameLayout.LayoutParams.MATCH_PARENT,
index c133ec7..4f0fa57 100644 (file)
@@ -99,8 +99,8 @@ public class ChromeShellUrlTest extends ChromeShellTestBase {
                     WindowAndroid windowAndroid = new WindowAndroid(
                             getInstrumentation().getTargetContext().getApplicationContext());
                     ContentViewRenderView contentViewRenderView =
-                            new ContentViewRenderView(getInstrumentation().getTargetContext(),
-                                    windowAndroid);
+                            new ContentViewRenderView(getInstrumentation().getTargetContext());
+                    contentViewRenderView.onNativeLibraryLoaded(windowAndroid);
                     contentViewRenderView.setCurrentContentViewCore(
                             activity.getActiveContentViewCore());
                 }
diff --git a/src/chrome/android/shell/res/drawable/menu_dots.png b/src/chrome/android/shell/res/drawable/menu_dots.png
deleted file mode 100644 (file)
index 01d6816..0000000
Binary files a/src/chrome/android/shell/res/drawable/menu_dots.png and /dev/null differ
index 16d3001..f3cec02 100644 (file)
@@ -32,7 +32,7 @@
         <ImageButton android:id="@+id/menu_button"
             android:layout_width="38dp"
             android:layout_height="38dp"
-            android:src="@drawable/menu_dots"
+            android:src="@drawable/btn_menu"
             android:background="?android:attr/selectableItemBackground"
             android:scaleType="center" />
     </org.chromium.chrome.shell.ChromeShellToolbar>
index b43dacd..67115ea 100644 (file)
@@ -10,6 +10,7 @@
 #include "base/at_exit.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
+#include "base/win/windows_version.h"
 #include "chrome/app/client_util.h"
 #include "chrome/browser/chrome_process_finder_win.h"
 #include "chrome/browser/policy/policy_path_parser.h"
@@ -97,7 +98,11 @@ int main() {
   // The exit manager is in charge of calling the dtors of singletons.
   base::AtExitManager exit_manager;
 
-  gfx::EnableHighDPISupport();
+  // We don't want to set DPI awareness on Vista because we don't support
+  // DirectWrite there. GDI fonts are kerned very badly, so better to leave
+  // DPI-unaware and at effective 1.0. See also ShouldUseDirectWrite().
+  if (base::win::GetVersion() > base::win::VERSION_VISTA)
+    gfx::EnableHighDPISupport();
 
   if (AttemptFastNotify(*CommandLine::ForCurrentProcess()))
     return 0;
index c1cf145..80cd0fb 100644 (file)
@@ -7,7 +7,9 @@
 #include "content/public/app/content_main.h"
 
 #if defined(OS_WIN)
+#include "base/debug/dump_without_crashing.h"
 #include "base/win/win_util.h"
+#include "chrome/common/chrome_constants.h"
 
 #define DLLEXPORT __declspec(dllexport)
 
@@ -38,6 +40,15 @@ int ChromeMain(int argc, const char** argv) {
   base::win::SetAbortBehaviorForCrashReporting();
   params.instance = instance;
   params.sandbox_info = sandbox_info;
+
+  // SetDumpWithoutCrashingFunction must be passed the DumpProcess function
+  // from the EXE and not from the DLL in order for DumpWithoutCrashing to
+  // function correctly.
+  typedef void (__cdecl *DumpProcessFunction)();
+  DumpProcessFunction DumpProcess = reinterpret_cast<DumpProcessFunction>(
+      ::GetProcAddress(::GetModuleHandle(chrome::kBrowserProcessExecutableName),
+          "DumpProcessWithoutCrash"));
+  base::debug::SetDumpWithoutCrashingFunction(DumpProcess);
 #else
   params.argc = argc;
   params.argv = argv;
index f16662f..9f3efbc 100644 (file)
@@ -2078,6 +2078,12 @@ Even if you have downloaded files from this website before, the website might ha
                    desc="In Title Case: Download context menu: Show information about interrupted downloads">
             &amp;More Information
           </message>
+        </if>  <!-- not use_titlecase -->
+        <if expr="is_win">
+          <message name="IDS_DOWNLOAD_MENU_ALWAYS_OPEN_PDF_IN_READER"
+                   desc="Download context menu: Open when download using Adobe Reader">
+            Always open in Adobe Reader
+          </message>
         </if>
       </if>
 
index 0b6627e..ac81899 100644 (file)
@@ -23,7 +23,7 @@
 <translation id="6777217372746654521">Osoiterivi näyttää sisältävän postilokeron. Käytä katuosoitetta tai rakennuksen osoitetta.</translation>
 <translation id="8471101563037901452">Tämä postinumero ei näytä vastaavan muuta osoitetta. Etkö tiedä postinumeroasi? Selvitä se <ph name="BEGIN_LINK"/>täällä<ph name="END_LINK"/>.</translation>
 <translation id="9207002871037636573">Anna postinumero, kuten <ph name="EXAMPLE"/>.</translation>
-<translation id="5089810972385038852">Osavaltio</translation>
+<translation id="5089810972385038852">Osavaltio/alue</translation>
 <translation id="6735419622867539268"><ph name="FIELD_VALUE"/> ei ole kelvollinen arvo tälle kentälle.</translation>
 <translation id="43113324827158664">Tätä ei voi jättää tyhjäksi.</translation>
 <translation id="3050787670591910834">Anna postinumero, kuten <ph name="EXAMPLE"/>.</translation>
index 1718b9e..84f133c 100644 (file)
@@ -17,8 +17,8 @@
 <translation id="2096368010154057602">Departament</translation>
 <translation id="7738983109397305830">Acest cod poștal ZIP nu pare să se potrivească cu restul adresei. Nu știți ce cod poștal ZIP aveți? Aflați <ph name="BEGIN_LINK"/>aici<ph name="END_LINK"/>.</translation>
 <translation id="3174168572213147020">Insulă</translation>
-<translation id="7139724024395191329">Emirat</translation>
-<translation id="6970216967273061347">District</translation>
+<translation id="7139724024395191329">Emiratul</translation>
+<translation id="6970216967273061347">Județ</translation>
 <translation id="6207937957461833379">Țară/Regiune</translation>
 <translation id="6777217372746654521">Se pare că rândul pentru adresă conține o căsuță poștală. Introdu o adresă cu numele străzii sau numărul clădirii.</translation>
 <translation id="8471101563037901452">Acest cod poștal nu pare să se potrivească cu restul adresei. Nu știți ce cod poștal aveți? Aflați <ph name="BEGIN_LINK"/>aici<ph name="END_LINK"/>.</translation>
@@ -27,7 +27,7 @@
 <translation id="6735419622867539268">Valoarea <ph name="FIELD_VALUE"/> nu este recunoscută pentru acest câmp.</translation>
 <translation id="43113324827158664">Acest câmp nu poate rămâne necompletat.</translation>
 <translation id="3050787670591910834">Trebuie să specificați un cod poștal, de exemplu, <ph name="EXAMPLE"/>.</translation>
-<translation id="6282194474023008486">Cod poştal</translation>
+<translation id="6282194474023008486">Cod poștal</translation>
 <translation id="4376888869070172068">Formatul codului poștal nu este recunoscut.</translation>
 <translation id="8446364922515257065">Do/Si</translation>
 <translation id="4518701284698680367">Trebuie să specificați un cod poștal ZIP, de exemplu, <ph name="EXAMPLE"/>. Nu știți ce cod poștal ZIP aveți? Aflați <ph name="BEGIN_LINK"/>aici<ph name="END_LINK"/>.</translation>
index 6f2b960..6487417 100644 (file)
@@ -77,7 +77,7 @@
         <ph name="ADVANCED_TITLE"/>
         पर जाएं और का &quot;<ph name="NO_PREFETCH_DESCRIPTION"/>&quot; चयन रद्द करें.
         यदि इससे समस्या का समाधान नहीं होता, तो बेहतर प्रदर्शन के लिए हम इस
-        à¤µà¤¿à¤\95लà¥\8dप à¤\95à¥\8b à¤ªà¥\81न: à¤\9aà¥\81ननà¥\87 à¤\95à¥\80 à¤\85नà¥\81शà¤\82सा à¤\95रते हैं.</translation>
+        à¤µà¤¿à¤\95लà¥\8dप à¤\95à¥\8b à¤ªà¥\81न: à¤\9aà¥\81ननà¥\87 à¤\95à¥\80 à¤¸à¥\81à¤\9dाव à¤¦à¥\87ते हैं.</translation>
 <translation id="7463979740390522693">Chromium - सूचनाएं (<ph name="QUANTITY"/> अपठित)</translation>
 <translation id="225614027745146050">आपका स्वागत है</translation>
 <translation id="5823381412099532241">क्रोमियम स्वयं को नवीनतम संस्करण में अपडेट नहीं कर सका, इसलिए आप शानदार नई सुविधाओं और सुरक्षा समाधानों का लाभ नहीं ले पा रहे हैं. आपको क्रोमियम को अपडेट करना होगा.</translation>
index 504dc81..e1faa95 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
 <translation id="6676384891291319759">Akses Internet</translation>
-<translation id="8586442755830160949">Hak Cipta <ph name="YEAR"/> Penulis Chromium. Semua hak dilindungi undang-undang.</translation>
+<translation id="8586442755830160949">Hak Cipta <ph name="YEAR"/> Pengarang Chromium. Semua hak dilindungi undang-undang.</translation>
 <translation id="6373523479360886564">Anda yakin ingin mencopot pemasangan Chromium?</translation>
 <translation id="5065199687811594072">Ingin Chrome menyimpan informasi kartu kredit ini untuk melengkapi formulir web?</translation>
 <translation id="6510925080656968729">Copot Pemasangan Chromium</translation>
@@ -54,7 +54,7 @@
 <translation id="4831257561365056138">Copot pemasangan Peluncur Aplikasi Chromium</translation>
 <translation id="4222580632002216401">Sekarang Anda telah masuk ke Chromium! Sinkronisasi dinonaktifkan oleh administrator Anda.</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD"/>Peringatan:<ph name="END_BOLD"/> Chromium tidak dapat mencegah ekstensi merekam riwayat penjelajahan Anda. Untuk menonaktifkan ekstensi ini dalam mode penyamaran, jangan pilih opsi ini.</translation>
-<translation id="985602178874221306">Penulis Chromium</translation>
+<translation id="985602178874221306">Pengarang Chromium</translation>
 <translation id="8628626585870903697">Chromium tidak menyertakan penampil PDF yang dibutuhkan agar Pratinjau Cetak berfungsi.</translation>
 <translation id="7138853919861947730">Chromium dapat menggunakan layanan web untuk meningkatkan pengalaman penjelajahan Anda.</translation>
 <translation id="934663725767849097">Cobalah cara baru menggunakan Chromium dengan Akun Google dan di komputer bersama.</translation>
index 85247ee..fc16d66 100644 (file)
@@ -22,7 +22,7 @@
 <translation id="455521026202544465">Obrigado por experimentar o novo Chromium. É necessário reiniciar o Chromium para ter certeza de que você salvou os trabalhos abertos antes de continuar.</translation>
 <translation id="731644333568559921">Atualizar o &amp;Chromium OS</translation>
 <translation id="7421823331379285070">O Chromium requer Windows XP ou posterior. Alguns recursos podem não funcionar.</translation>
-<translation id="7023267510504981715">É necessário fazer upgrade do Chromium para usar a Carteira virtual do Google [<ph name="ERROR_CODE"/>].</translation>
+<translation id="7023267510504981715">É necessário fazer upgrade do Chromium para usar a Google Wallet [<ph name="ERROR_CODE"/>].</translation>
 <translation id="1444754455097148408">Licenças de código aberto do Chromium</translation>
 <translation id="7419987137528340081">Se você preferir manter seus dados existentes do Chromium separadamente, pode criar um novo usuário do Chromium para <ph name="USER_NAME"/> .</translation>
 <translation id="5427571867875391349">Definir o Chromium como seu navegador padrão</translation>
index 1b29888..7b4ac3a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
-<translation id="6676384891291319759">Accesați Internetul</translation>
+<translation id="6676384891291319759">Accesați internetul</translation>
 <translation id="8586442755830160949">Copyright <ph name="YEAR"/> The Chromium Authors. Toate drepturile rezervate.</translation>
 <translation id="6373523479360886564">Sigur doriți să dezinstalați Chromium?</translation>
 <translation id="5065199687811594072">Doriți ca Chromium să salveze informațiile privind cardul de credit pentru completarea formularelor web?</translation>
 <translation id="6309712487085796862">Chromium utilizează camera foto.</translation>
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="5820394555380036790">Sistemul de operare Chromium</translation>
-<translation id="6757767188268205357">Doresc să nu mai fiu deranjat</translation>
+<translation id="6757767188268205357">Nu mă mai întreba</translation>
 <translation id="1745962126679160932">Chromium va stoca în siguranță informațiile dvs., astfel încât să nu trebuiască să le introduceți din nou, dar va trebui în continuare să confirmați codul de securitate al cardului pentru viitoarele plăți.</translation>
 <translation id="275588974610408078">Raportarea blocărilor nu este disponibilă în Chromium.</translation>
 <translation id="5909170354645388250">Nu se utilizează în Chromium. Substituent pentru a păstra hărțile cu resurse sincronizate. Este necesar un singur argument: $1.</translation>
@@ -191,7 +191,7 @@ Este posibil ca unele funcții să nu fie disponibile. Specificați un director
 <translation id="6485906693002546646">În prezent, folosiți <ph name="PROFILE_EMAIL"/> pentru a sincroniza datele Chromium. Pentru a actualiza preferințele de sincronizare sau pentru a folosi Chromium fără un Cont Google, accesați <ph name="SETTINGS_LINK"/>.</translation>
 <translation id="5772805321386874569">(necesită <ph name="BEGIN_BUTTON"/>repornirea<ph name="END_BUTTON"/> Chromium)</translation>
 <translation id="1688750314291223739">Configurați sincronizarea pentru a salva funcțiile personalizate ale browserului pe web și accesați-le din Chromium de pe orice computer.</translation>
-<translation id="8865765905101981392">Browser de Internet</translation>
+<translation id="8865765905101981392">Browser internet</translation>
 <translation id="8610831143142469229">Permiteți Chromium să acceseze rețeaua din setările pentru firewall sau
         antivirus.</translation>
 <translation id="6424492062988593837">Chromium a devenit și mai bun! Este disponibilă o nouă versiune.</translation>
@@ -201,7 +201,7 @@ Este posibil ca unele funcții să nu fie disponibile. Specificați un director
 <translation id="3889543394854987837">Dați clic pe numele dvs. pentru a deschide Chromium și a începe să navigați.</translation>
 <translation id="3130323860337406239">Chromium utilizează microfonul.</translation>
 <translation id="3249425904492147663">Ați încercat să accesați &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt;, dar serverul a furnizat un certificat expirat. Nu sunt disponibile informații care să indice dacă certificatul respectiv a fost compromis, din cauza faptului că este expirat. Acest lucru înseamnă că Chromium nu vă poate garanta că dvs. comunicați cu &lt;strong&gt;<ph name="DOMAIN2"/>&lt;/strong&gt; și nu cu un atacator. Ora computerului dvs. este setată la <ph name="CURRENT_TIME"/>. Credeți că această setare este corectă? În caz contrar, trebuie să corectați eroarea și să actualizați această pagină.</translation>
-<translation id="7196020411877309443">De ce primesc această notificare?</translation>
+<translation id="7196020411877309443">De ce văd acest lucru?</translation>
 <translation id="457845228957001925">Informații importante cu privire la datele dvs. Chromium</translation>
 <translation id="4567424176335768812">V-ați conectat ca <ph name="USER_EMAIL_ADDRESS"/>. Acum vă puteți accesa marcajele, istoricul și alte setări de pe toate dispozitivele pe care v-ați conectat.</translation>
 <translation id="7483335560992089831">Nu se poate instala aceeași versiune de Chromium care rulează în prezent. Închideți Chromium și încercați din nou.</translation>
index 9a31fe2..285c062 100644 (file)
@@ -99,7 +99,7 @@ Baadhi ya vipengele huenda visipatikane na mabadiliko katika mapendeleo hayatahi
 <translation id="3656661827369545115">Fungua Chromium kiotomatiki kompyuta yako inapowashwa</translation>
 <translation id="2241627712206172106">Kama unatumia kompyuta pamoja na wengine, marafiki na familia wanaweza kuvinjari tofauti na kusanidi Chromium jinsi wapendavyo.</translation>
 <translation id="6055895534982063517">Kuna toleo jipya la Chromium linalopatikana, na ni la kasi kuliko la awali.</translation>
-<translation id="8821041990367117597">Chromium haikuweza kusawazisha data yako kwa sababu maelezo yako ya kuingia katika akaunti yamemalizika muda.</translation>
+<translation id="8821041990367117597">Chromium haikuweza kusawazisha data yako kwa sababu maelezo yako ya kuingia katika akaunti yanahitaji kusasishwa.</translation>
 <translation id="4677944499843243528">Wasifu unaonekana kuwa unatumika na mchakato mwingine wa Chromium (<ph name="PROCESS_ID"/>) kwenye kompyuta nyingine (<ph name="HOST_NAME"/>). Chromium imefunga wasifu huu ili usifisidiwe. Kama una uhakika hakuna michakato mingine inatumia wasifu huu, unaweza kufungua wasifu na uzindue tena Chromium.</translation>
 <translation id="5405650547142096840">Ondoa kwenye Chromium</translation>
 <translation id="4994636714258228724">Jiongeze kwenye Chrome</translation>
index 5a3e307..329b16a 100644 (file)
@@ -18,7 +18,7 @@
 <translation id="2077129598763517140">ใช้การเร่งฮาร์ดแวร์เมื่อสามารถใช้ได้</translation>
 <translation id="1065672644894730302">ค่ากำหนดของคุณไม่สามารถอ่านได้ คุณลักษณะบางอย่างอาจใช้ไม่ได้และการเปลี่ยนแปลงค่ากำหนดจะไม่ได้รับการบันทึก</translation>
 <translation id="4423735387467980091">กำหนดค่าและควบคุม Chromium</translation>
-<translation id="1881322772814446296">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chromium à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96à¸\99ำออà¸\81ข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น คุณสามารถเลือกที่จะสร้างโปรไฟล์ใหม่เพื่อแยกเก็บข้อมูล Chromium ที่มีอยู่ของคุณ <ph name="LEARN_MORE"/></translation>
+<translation id="1881322772814446296">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chromium à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96ลà¸\9aข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น คุณสามารถเลือกที่จะสร้างโปรไฟล์ใหม่เพื่อแยกเก็บข้อมูล Chromium ที่มีอยู่ของคุณ <ph name="LEARN_MORE"/></translation>
 <translation id="455521026202544465">ขอขอบคุณสำหรับการลองใช้ Chromium ใหม่ Chromium จำเป็นต้องรีสตาร์ท์เพื่อให้แน่ใจว่าคุณได้บันทึกงานใดๆ ที่เปิดไว้แล้ว ก่อนที่จะดำเนินการต่อ</translation>
 <translation id="731644333568559921">อัปเดต &amp;Chromium OS</translation>
 <translation id="7421823331379285070">Chromium จำเป็นต้องใช้ Windows XP หรือรุ่นที่ใหม่กว่า คุณลักษณะบางอย่างอาจไม่ทำงาน</translation>
@@ -28,7 +28,7 @@
 <translation id="5427571867875391349">ตั้ง Chromium เป็นเบราว์เซอร์เริ่มต้นของคุณ</translation>
 <translation id="8030318113982266900">กำลังอัปเดตอุปกรณ์ของคุณไปยังช่อง <ph name="CHANNEL_NAME"/>...</translation>
 <translation id="3549345495227188780">เริ่มต้นใช้งาน Chromium OS</translation>
-<translation id="1668054258064581266">à¹\80มืà¹\88อà¸\99ำออà¸\81บัญชีของคุณออกจาก Chromium แล้ว คุณต้องโหลดแท็บที่เปิดอยู่ซ้ำเพื่อให้มีผล</translation>
+<translation id="1668054258064581266">à¹\80มืà¹\88อลà¸\9aบัญชีของคุณออกจาก Chromium แล้ว คุณต้องโหลดแท็บที่เปิดอยู่ซ้ำเพื่อให้มีผล</translation>
 <translation id="6953661834318318668">Chromium Toolbar</translation>
 <translation id="4285930937574705105">การติดตั้งล้มเหลวเนื่องจากมีข้อผิดพลาดที่ไม่ได้ระบุ หาก Chromium ทำงานอยู่ในขณะนี้ โปรดปิดและลองอีกครั้ง</translation>
 <translation id="1396446129537741364">Chromium กำลังพยายามแสดงรหัสผ่าน</translation>
 <translation id="6055895534982063517">มี Chromium รุ่นใหม่ให้ใช้งานแล้วและทำงานได้เร็วกว่าเดิม</translation>
 <translation id="8821041990367117597">Chromium ไม่สามารถซิงค์ข้อมูลของคุณเนื่องจากรายละเอียดการลงชื่อเข้าใช้บัญชีของคุณล้าสมัย</translation>
 <translation id="4677944499843243528">ดูเหมือนว่าโปรไฟล์กำลังถูกใช้งานโดยกระบวนการอื่นของ Chromium (<ph name="PROCESS_ID"/>) บนคอมพิวเตอร์อีกเครื่อง (<ph name="HOST_NAME"/>) Chromium ล็อกโปรไฟล์ไว้เพื่อไม่ให้โปรไฟล์เกิดความเสียหาย หากคุณมั่นใจว่าไม่มีกระบวนการอื่นใดกำลังใช้โปรไฟล์นี้อยู่ คุณสามารถปลดล็อกโปรไฟล์และเปิด Chromium ใหม่</translation>
-<translation id="5405650547142096840">à¸\99ำออà¸\81จาก Chromium</translation>
+<translation id="5405650547142096840">ลà¸\9aจาก Chromium</translation>
 <translation id="4994636714258228724">เพิ่มตัวคุณเองใน Chromium</translation>
 <translation id="7066436765290594559">Chromium OS ไม่สามารถซิงค์ข้อมูลของคุณ โปรดอัปเดตข้อความรหัสผ่านสำหรับการซิงค์</translation>
 <translation id="7747138024166251722">โปรแกรมติดตั้งสร้างไดเรกทอรีชั่วคราวไม่ได้ โปรดตรวจสอบพื้นที่ดิสก์ว่างและการอนุญาตให้ติดตั้งซอฟต์แวร์</translation>
 <translation id="6970811910055250180">กำลังอัปเดตอุปกรณ์ของคุณ...</translation>
 <translation id="2485422356828889247">ถอนการติดตั้ง</translation>
 <translation id="85843667276690461">รับความช่วยเหลือเกี่ยวกับการใช้ Chromium</translation>
-<translation id="5358375970380395591">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chromium à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96à¸\99ำออà¸\81ข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น <ph name="LEARN_MORE"/></translation>
+<translation id="5358375970380395591">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chromium à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96ลà¸\9aข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น <ph name="LEARN_MORE"/></translation>
 <translation id="9036189287518468038">Chromium App Launcher</translation>
 <translation id="8493179195440786826">Chromium ล้าสมัย</translation>
-<translation id="911206726377975832">à¸\99ำออà¸\81ข้อมูลการท่องเว็บด้วยหรือไม่</translation>
+<translation id="911206726377975832">ลà¸\9aข้อมูลการท่องเว็บด้วยหรือไม่</translation>
 <translation id="95514773681268843"><ph name="DOMAIN"/> กำหนดว่าคุณต้องอ่านและยอมรับข้อกำหนดในการให้บริการต่อไปนี้ก่อนใช้อุปกรณ์นี้ ข้อกำหนดเหล่านี้ไม่ขยาย แก้ไข หรือจำกัดข้อกำหนดของ Chromium OS</translation>
 <translation id="1699664235656412242">โปรดปิดหน้าต่าง Chromium ทั้งหมด (รวมทั้งในโหมด Windows 8 ด้วย) และลองอีกครั้ง</translation>
 <translation id="6734080038664603509">อัปเดต &amp;Chromium</translation>
@@ -241,7 +241,7 @@ Chromium ไม่สามารถกู้คืนการตั้งค
 <translation id="7617377681829253106">Chromium ดีขึ้นกว่าเดิม</translation>
 <translation id="442817494342774222">Chromium ได้รับการกำหนดค่าให้เปิดอัตโนมัติเมื่อคุณเริ่มคอมพิวเตอร์ของคุณ</translation>
 <translation id="8974095189086268230">Google Chrome OS เกิดขึ้นได้ด้วยการสนับสนุนจาก<ph name="BEGIN_LINK_CROS_OSS"/>ซอฟต์แวร์โอเพนซอร์ส<ph name="END_LINK_CROS_OSS"/>อื่นๆ</translation>
-<translation id="313551035350905294">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89อำà¸\99าà¸\88à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\83à¸\99à¸\81ารà¸\84วà¸\9aà¸\84ุมà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¸\96ูà¸\81à¸\9cูà¸\81à¸\95ิà¸\94à¸\81ัà¸\9a <ph name="USER_NAME"/> à¸­à¸¢à¹\88าà¸\87à¸\96าวร à¸\84ุà¸\93à¸\88ะสามารà¸\96à¸\99ำออà¸\81ข้อมูลนี้ผ่านแดชบอร์ด Google Accounts ได้ แต่จะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่นได้</translation>
+<translation id="313551035350905294">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89อำà¸\99าà¸\88à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\83à¸\99à¸\81ารà¸\84วà¸\9aà¸\84ุมà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chromium à¸\82อà¸\87à¸\84ุà¸\93 à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¸\96ูà¸\81à¸\9cูà¸\81à¸\95ิà¸\94à¸\81ัà¸\9a <ph name="USER_NAME"/> à¸­à¸¢à¹\88าà¸\87à¸\96าวร à¸\84ุà¸\93à¸\88ะสามารà¸\96ลà¸\9aข้อมูลนี้ผ่านแดชบอร์ด Google Accounts ได้ แต่จะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่นได้</translation>
 <translation id="8823523095753232532">เชื่อมโยงข้อมูล Chromium ของฉันกับบัญชีนี้</translation>
 <translation id="1808667845054772817">ติดตั้ง Chromium ใหม่</translation>
 <translation id="1221340462641866827">Chromium OS ไม่สนับสนุนการเปิดแอปพลิเคชันภายนอกเพื่อจัดการกับลิงก์ <ph name="SCHEME"/> ลิงก์ที่ร้องขอคือ <ph name="PROTOLINK"/></translation>
index 1b78798..8b3e9a9 100644 (file)
@@ -53,7 +53,7 @@
 <translation id="3032787606318309379">Đang thêm vào Chromium...</translation>
 <translation id="4831257561365056138">Gỡ cài đặt Trình chạy ứng dụng Chromium</translation>
 <translation id="4222580632002216401">Bạn hiện đã đăng nhập vào Chromium! Quản trị viên của bạn đã tắt tính năng Đồng bộ hóa.</translation>
-<translation id="4207043877577553402"><ph name="BEGIN_BOLD"/>Cảnh báo:<ph name="END_BOLD"/> Chromium không thể ngăn các tiện ích mở rộng ghi lại lịch sử duyệt web của bạn. Để tắt tiện ích mở rộng này trong chế độ ẩn danh, hãy bỏ chọn tùy chọn này.</translation>
+<translation id="4207043877577553402"><ph name="BEGIN_BOLD"/>Cảnh báo:<ph name="END_BOLD"/> Chromium không thể ngăn các tiện ích ghi lại lịch sử duyệt web của bạn. Để tắt tiện ích này trong chế độ ẩn danh, hãy bỏ chọn tùy chọn này.</translation>
 <translation id="985602178874221306">Tác giả Chromium</translation>
 <translation id="8628626585870903697">Chromium không bao gồm trình xem PDF được yêu cầu để tính năng xem trước bản in hoạt động.</translation>
 <translation id="7138853919861947730">Chromium có thể sử dụng các dịch vụ web để cải thiện trải nghiệm duyệt web của bạn.</translation>
@@ -61,7 +61,7 @@
 <translation id="3849925841547750267">Rất tiếc, các cài đặt Mozilla Firefox của bạn không khả dụng khi trình duyệt đó đang chạy. Để nhập các cài đặt đó vào Chromium, hãy lưu công việc của bạn và đóng tất cả các cửa sổ Firefox. Sau đó nhấp vào Tiếp tục.</translation>
 <translation id="7771626876550251690">Trong trường hợp này, địa chỉ được liệt kê trong chứng chỉ không khớp với địa chỉ của trang web mà trình duyệt của bạn đã cố gắng truy cập. Một lý do có thể giải thích cho trường hợp này là các kết nối của bạn đang bị chặn bởi một kẻ tấn công hiện đưa ra chứng chỉ của một trang web khác, điều này gây ra sự không khớp nhau. Một lý do khác có thể là máy chủ được thiết lập để trả về cùng một chứng chỉ cho nhiều trang web, bao gồm cả trang web bạn đang cố gắng truy cập, ngay cả khi chứng chỉ đó không hợp lệ cho tất cả các trang web này. Chromium có thể chắc chắn rằng bạn đã truy cập vào &lt;strong&gt;<ph name="DOMAIN2"/>&lt;/strong&gt; nhưng không thể xác minh rằng trang web đó cũng chính là trang web &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; mà bạn muốn truy cập. Nếu bạn tiếp tục, Chromium sẽ không kiểm tra bất kỳ trường hợp tên không trùng khớp nào khác.</translation>
 <translation id="7027298027173928763">Chromium không thể tự cập nhật lên phiên bản mới nhất nên bạn đã bỏ lỡ các tính năng mới tuyệt vời và các bản vá bảo mật. Bạn cần cài đặt lại Chromium theo cách thủ công.</translation>
-<translation id="8897323336392112261">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium hoặc nhấp vào nút Trang chủ.</translation>
+<translation id="8897323336392112261">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium hoặc nhấp vào nút Trang chủ.</translation>
 <translation id="4330585738697551178">Mô-đun này được xác định xung đột với Chromium.</translation>
 <translation id="3190315855212034486">Rất tiếc! Chromium đã gặp sự cố. Chạy lại ngay bây giờ?</translation>
 <translation id="3068515742935458733">Giúp cải thiện Chromium bằng cách gửi báo cáo sự cố và <ph name="UMA_LINK"/> tới Google</translation>
@@ -85,7 +85,7 @@
 <translation id="4298853828775962437">http://support.google.com/chrome/?p=ib_chromeframe</translation>
 <translation id="3509308970982693815">Hãy đóng tất cả cửa sổ Chromium và thử lại.</translation>
 <translation id="4077262827416206768">Hãy đóng tất cả cửa sổ Chromium và chạy lại Chromium để thay đổi này có hiệu lực.</translation>
-<translation id="6475912303565314141">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium.</translation>
+<translation id="6475912303565314141">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium.</translation>
 <translation id="1725059042853530269"><ph name="FILE_NAME"/> có thể gây hại cho trải nghiệm duyệt web của bạn, vì vậy Chromium đã chặn tệp đó.</translation>
 <translation id="750717762378961310">Đây là tệp độc hại và Chromium đã chặn tệp này.</translation>
 <translation id="6944967875980567883">Mô-đun được tải vào Chromium</translation>
 <translation id="6734080038664603509">Cập nhật &amp;Chromium</translation>
 <translation id="8862326446509486874">Bạn không có quyền thích hợp để cài đặt cấp hệ thống. Thử chạy lại trình cài đặt với vai trò Quản trị viên.</translation>
 <translation id="2535480412977113886">Chromium OS không thể đồng bộ hóa dữ liệu của bạn vì chi tiết đăng nhập tài khoản của bạn đã lỗi thời.</translation>
-<translation id="8697124171261953979">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium hoặc tìm kiếm từ Thanh địa chỉ.</translation>
+<translation id="8697124171261953979">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium hoặc tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="894903460958736500">Phần mềm đang chạy trên máy tính của bạn không tương thích với Chromium.</translation>
 <translation id="1774152462503052664">Cho phép Chromium chạy dưới nền</translation>
 <translation id="9022552996538154597">Đăng nhập vào Chromium</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="4987820182225656817">Khách có thể sử dụng Chromium mà không phải thoát khỏi bất cứ nội dung nào.</translation>
 <translation id="2216475571518225820">Trang web này đang sử dụng plugin Chromium Frame sắp không còn được hỗ trợ. Hãy gỡ cài đặt plugin này và tải xuống trình duyệt tương thích.</translation>
-<translation id="3487263810738775861">Một tiện ích mở rộng đã thay đổi trang nào được hiển thị khi bạn khởi động Chromium.</translation>
+<translation id="3487263810738775861">Một tiện ích đã thay đổi trang nào được hiển thị khi bạn khởi động Chromium.</translation>
 <translation id="5877064549588274448">Kênh đã thay đổi. Hãy khởi động lại thiết bị để áp dụng thay đổi.</translation>
 <translation id="6248213926982192922">Đặt Chromium làm trình duyệt mặc định</translation>
 <translation id="6309712487085796862">Chromium đang sử dụng máy ảnh của bạn.</translation>
 <translation id="3223794808658970984">Xem trước Chromium mới</translation>
 <translation id="3582788516608077514">Đang cập nhật Chromium...</translation>
 <translation id="7223968959479464213">Trình quản lý tác vụ - Chromium</translation>
-<translation id="1779356040007214683">Để làm cho Chromium an toàn hơn, chúng tôi đã vô hiệu hóa một số tiện ích mở rộng không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/> và có thể đã được thêm mà bạn không biết.</translation>
+<translation id="1779356040007214683">Để làm cho Chromium an toàn hơn, chúng tôi đã vô hiệu hóa một số tiện ích không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/> và có thể đã được thêm mà bạn không biết.</translation>
 <translation id="6638567566961868659">Tìm dấu trang của bạn trong menu Chromium hoặc trên thanh dấu trang.</translation>
 <translation id="2673087257647337101">Gần được cập nhật! Hãy chạy lại Chromium để hoàn tất cập nhật.</translation>
 <translation id="4864451188650489141">Bạn có thể thêm tài khoản Google khác và khóa Chromium của bạn bên dưới.</translation>
@@ -208,7 +208,7 @@ Một số tính năng có thể không khả dụng. Hãy chỉ định thư m
 <translation id="7641113255207688324">Chromium không phải là trình duyệt mặc định của bạn.</translation>
 <translation id="4458285410772214805">Vui lòng đăng xuất và đăng nhập lại để thay đổi này có hiệu lực.</translation>
 <translation id="761356813943268536">Chromium đang sử dụng máy ảnh và micrô của bạn.</translation>
-<translation id="805745970029938373">Bạn có thể thấy tất cả các thông báo từ ứng dụng, tiện ích mở rộng và trang web Chromium của bạn tại đây.</translation>
+<translation id="805745970029938373">Bạn có thể thấy tất cả các thông báo từ ứng dụng, tiện ích và trang web Chromium của bạn tại đây.</translation>
 <translation id="2119636228670142020">Giới thiệu về &amp;Chromium OS</translation>
 <translation id="1708666629004767631">Hiện đã có phiên bản Chromium mới an toàn hơn.</translation>
 <translation id="378917192836375108">Chromium cho phép bạn nhấp vào số điện thoại trên web và gọi tới số đó bằng Skype!</translation>
@@ -241,7 +241,7 @@ Chromium không thể khôi phục cài đặt của bạn.</translation>
 <translation id="7617377681829253106">Chromium được cải tiến hơn</translation>
 <translation id="442817494342774222">Chromium được định cấu hình để tự động chạy khi bạn khởi động máy tính của bạn.</translation>
 <translation id="8974095189086268230">Chromium OS trở nên khả thi là nhờ các <ph name="BEGIN_LINK_CROS_OSS"/>phần mềm nguồn mở<ph name="END_LINK_CROS_OSS"/> bổ sung.</translation>
-<translation id="313551035350905294">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát tiểu sử Chromium của mình. Dữ liệu Chromium của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn gắn với <ph name="USER_NAME"/>. Bạn có thể xóa dữ liệu này qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác.</translation>
+<translation id="313551035350905294">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát hồ sơ Chromium của mình. Dữ liệu Chromium của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn gắn với <ph name="USER_NAME"/>. Bạn có thể xóa dữ liệu này qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác.</translation>
 <translation id="8823523095753232532">Liên kết dữ liệu Chromium của tôi với tài khoản này</translation>
 <translation id="1808667845054772817">Cài đặt lại Chromium</translation>
 <translation id="1221340462641866827">Chromium OS không hỗ trợ chạy ứng dụng bên ngoài để xử lý các liên kết <ph name="SCHEME"/>. Liên kết được yêu cầu là <ph name="PROTOLINK"/>.</translation>
index b7eb648..58c4fd4 100644 (file)
@@ -1142,7 +1142,7 @@ nil</translation>
 <translation id="412730574613779332">Spandex</translation>
 <translation id="5302048478445481009">ቋንቋ</translation>
 <translation id="1395730723686586365">ማዘመኛ ጀምሯል</translation>
-<translation id="7989023212944932320">Google á\8b¨á\8c¥á\8a\95á\89\83á\89\84 á\8a á\88°á\88³ á\89 á\89\85á\88­á\89¥ á\8c\8aá\8b\9c <ph name="SITE"/> á\88\8bá\8b­ <ph name="BEGIN_LINK"/>á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b\8cá\88­<ph name="END_LINK"/> á\8a á\8c\8dá\8a\9dá\89·á\88\8dá\8d¢ á\89 á\88\98á\8b°á\89 á\8a\9b á\8c\8aá\8b\9c á\8b°á\88\85á\8a\95á\8a\90á\89³á\89¸á\8b\8d á\8b¨á\89°á\8c á\89 á\89\81 á\8bµá\88­ á\8c£á\89¢á\8b«á\8b\8eá\89½ á\8a á\8a\95á\8b³á\8a\95á\8bµ á\8c\8aá\8b\9c á\89 á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b\8cá\88­ á\88\8aá\8c á\89\81 á\8b­á\89½á\88\8bá\88\89á\8d¢ á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b­á\8b\98á\89± á\8b¨á\88\9aá\89³á\8b\88á\89\85 á\8b¨á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b\8cá\88­ á\8a á\88°á\88«á\8c­ á\8a¨á\88\86á\8a\90á\8b\8d <ph name="SUBRESOURCE_HOST"/> á\8a\90á\8b\8d á\8b¨á\88\98á\8c£á\8b\8dá\8d¢ á\8a¨á\8c¥á\89\82á\89µ á\88°á\8b\93á\89³á\89µ በኋላ ተመልሰው መምጣት አለብዎት።</translation>
+<translation id="7989023212944932320">Google á\8b¨á\8c¥á\8a\95á\89\83á\89\84 á\8a á\88°á\88³ á\89 á\89\85á\88­á\89¥ á\8c\8aá\8b\9c <ph name="SITE"/> á\88\8bá\8b­ <ph name="BEGIN_LINK"/>á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b\8cá\88­<ph name="END_LINK"/> á\8a á\8c\8dá\8a\9dá\89·á\88\8dá\8d¢ á\89 á\88\98á\8b°á\89 á\8a\9b á\8c\8aá\8b\9c á\8b°á\88\85á\8a\95á\8a\90á\89³á\89¸á\8b\8d á\8b¨á\89°á\8c á\89 á\89\81 á\8bµá\88­ á\8c£á\89¢á\8b«á\8b\8eá\89½ á\8a á\8a\95á\8b³á\8a\95á\8bµ á\8c\8aá\8b\9c á\89 á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b\8cá\88­ á\88\8aá\8c á\89\81 á\8b­á\89½á\88\8bá\88\89á\8d¢ á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b­á\8b\98á\89± á\8b¨á\88\9aá\89³á\8b\88á\89\85 á\8b¨á\89°á\8a\95á\8a®á\88\8d\8a á\8b\98á\88\8d á\8b\8cá\88­ á\8a á\88°á\88«á\8c­ á\8a¨á\88\86á\8a\90á\8b\8d <ph name="SUBRESOURCE_HOST"/> á\8a\90á\8b\8d á\8b¨á\88\98á\8c£á\8b\8dá\8d¢ á\8a¨á\8c¥á\89\82á\89µ á\88°á\8b\93á\89¶á\89½ በኋላ ተመልሰው መምጣት አለብዎት።</translation>
 <translation id="121201262018556460"><ph name="DOMAIN"/>ን ለመድረስ ሞክረዋል፣ ግን አገልጋዩ ደካማ ቁልፍ የያዘ የእውቅና ማረጋገጫ ነው ያቀረበው። አንድ አጥቂ የግል ቁልፉን ሰብሮ ሊሆን ይችላል፣ እና አገልጋዩ የጠበቁት ላይሆን ይችላል (ከአጥቂ ጋር እየተገናኙ ሊሆኑ ይችላሉ)።</translation>
 <translation id="5553089923092577885">የሰርቲፊኬት መምሪያ ጉድኝቶች</translation>
 <translation id="7410744438574300812">አንድ ቅጥያ በchrome.debugger ኤ ፒ አይ በኩል ከአንድ ገጽ ጋር ሲገናኝ የመረጃ አሞሌውን አታሳይ። ይህ ጥቆማ የቅጥያ ጀርባ ገጾችን ለማረም ያስፈልጋል።</translation>
@@ -2937,7 +2937,7 @@ nil</translation>
 <translation id="7347751611463936647">ይህንን ቅጥያ ለመጠቀም «<ph name="EXTENSION_KEYWORD"/>» ብለው፣ ከዚያ TAB፣ ከዚያ ትዕዛዝዎን ወይም ፍለጋዎን ይተይቡ።</translation>
 <translation id="878431691778285679">አስቀድመው በዚያ ስም ያለ ተጠቃሚ እያስተዳደሩ ያሉ ይመስላል። <ph name="LINE_BREAK"/><ph name="BEGIN_LINK"/><ph name="PROFILE_NAME"/>ን ወደዚህ መሳሪያ ማስመጣት<ph name="END_LINK"/> ፈልገው ነበር?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> ማይክሮፎንዎን መጠቀም ይፈልጋል።</translation>
-<translation id="2805756323405976993">á\89µá\8c\8dá\89 á\88«á\8b\8eá\89½ </translation>
+<translation id="2805756323405976993">á\88\98á\89°á\8c\8dá\89 á\88ªá\8b«á\8b\8eá\89½</translation>
 <translation id="5151511998946489774">የዚህ ድር ጣቢያ ማንነት በ<ph name="ISSUER"/> የተረጋገጠ ሲሆን በይፋ ኦዲት መደረግ የሚችል ነው።</translation>
 <translation id="1608626060424371292">ይህን ተጠቃሚ አስወግድ</translation>
 <translation id="2779552785085366231">ይህ ገጽ ወደ የመተግበሪያ አስጀማሪ ሊታከል ይችላል።</translation>
@@ -3987,6 +3987,7 @@ nil</translation>
 <translation id="6460601847208524483">ቀጣዩን አግኝ</translation>
 <translation id="397703832102027365">በማጠናቀቅ ላይ...</translation>
 <translation id="8146177459103116374">አስቀድመው በዚህ መሣሪያ ላይ ከተመዘገቡ <ph name="LINK2_START"/>እንደ ነባር ተጠቃሚ መግባት ይችላሉ<ph name="LINK2_END"/>።</translation>
+<translation id="5072836811783999860">የሚቀናበሩ ዕልባቶችን አሳይ</translation>
 <translation id="4856478137399998590">የተንቀሳቃሽ ስልክ ውሂብ አገልግሎትዎ የገበረና ስራ ላይ ለመዋል ዝግጁ ነው</translation>
 <translation id="3305389145870741612">ቅርጸት የመስራት ሂደቱ አንድ ሁለት ሰከንዶች ሊወስድ ይችላል። እባክዎ ይጠብቁ።</translation>
 <translation id="3648607100222897006">እነዚህ የሙከራ ባህሪያት በማንኛውም ጊዜ ሊቀየሩ፣ ሊሰበሩ ወይም ሊጠፉ ይችላሉ። ከእነዚህ ሙከራዎች ውስጥ አንዱን ቢያበሩት ምን ሊከሰት እንደሚችል ምንም አይነት ዋስትናዎችን አንሰጥም፣ እንዲያውም አሳሽዎ ድንገት ሊቃጠል ሁሉ ይችላል። ቀልዱን እንተወውና አሳሽዎ ሁሉንም ውሂብዎን ሊሰርዘው ይችላል ወይም ደግሞ ደህንነትዎ እና ግላዊነትዎ ባልተጠበቁ መንገዶች ጥቃት ሊደርስባቸው ይችላል። የሚያነቋቸውን ማንኛውም ሙከራዎች ለሁሉም የዚህ አሳሽ ተጠቃሚ ነው የሚነቁት። እባክዎ በጥንቃቄ ይቀጥሉ።</translation>
@@ -4418,6 +4419,7 @@ nil</translation>
 <translation id="6869402422344886127">ምልክት የተደረገበት አመልካች ሳጥን</translation>
 <translation id="3428010780253032925">በእይዎች ውስጥ በሬክታንግል-የተመሰረተ ኢላማን ያሰናክሉ</translation>
 <translation id="5637380810526272785">የግቤት ስልቶች</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/>ን አሳይ</translation>
 <translation id="2837049386027881519">ግንኙነቱ የቆየ የቲ ኤል ኤስ ወይም ኤስ ኤስ ኤል ፕሮቶኮል ስሪትን በመጠቀም እንደገና መሞከር ነበረበት። ይሄ በተለምዶ አገልጋዩ በጣም የቆየ ሶፍትዌር እየተጠቀመ መሆኑንና ሌሎች የደህንነት ችግሮች ሊኖሩበት ይችላል ማለት ነው።</translation>
 <translation id="404928562651467259">ማስጠንቀቂያ</translation>
 <translation id="4289300219472526559">መናገር ይጀምሩ</translation>
@@ -4751,6 +4753,7 @@ nil</translation>
 <translation id="6934265752871836553">Chrome ይዘትን በበለጠ ፍጥነት እንዲስል የበጣም ቅርብ ጊዜ ኮዱን ይጠቀሙ። ከዚህ ዱካ
         በስተጀርባ ያሉ ለውጦች ብዙ ይዘቶችን የመስበር ዕድላቸው ከፍተኛ ነው።</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">ሁልጊዜ በAdobe Reader ክፈት</translation>
 <translation id="8274359292107649245">Chromeን በዴስክቶፕ ላይ ክፈት</translation>
 <translation id="1571119610742640910">ለውሱን የስር ዳራዎች ማዋሃድ።</translation>
 <translation id="6514565641373682518">ይህ ገጽ የመዳፊት ጠቋሚዎን አሰናክሏል።</translation>
@@ -4951,6 +4954,7 @@ nil</translation>
 <translation id="824543159844843373">አስጀማሪ ንጥል 3 አግብር</translation>
 <translation id="3819800052061700452">&amp;በሙሉ ገጽ ማያ አሳይ</translation>
 <translation id="48607902311828362">የአውሮፕላን ሁነታ</translation>
+<translation id="711840821796638741">የሚቀናበሩ ዕልባቶችን አሳይ</translation>
 <translation id="3360297538363969800">ማተም አልተሳካም። እባክዎ አታሚዎን ይፈትሹትና እንደገና ይሞክሩ።</translation>
 <translation id="680572642341004180">የRLZ መከታተል በ<ph name="SHORT_PRODUCT_OS_NAME"/> ላይ አንቃ።</translation>
 <translation id="688797901999351107">እባክዎ እንዲመለስ የተጠየቀውን ኃይል መሙያ መጠቀም ያቁሙ።</translation>
index b57b1c6..671c166 100644 (file)
 <translation id="9033857511263905942">ل&amp;صق</translation>
 <translation id="1028690605877243613">استخدام تخطيط الرف البديل.</translation>
 <translation id="6736045498964449756">عفوًا، كلمتا المرور غير متطابقتين!</translation>
-<translation id="4558985768677321342">تÙ\85Ù\83Ù\8aÙ\86 Ø¥Ù\84غاء Ø§Ù\84Ù\82Ù\81Ù\84 Ø§Ù\84سÙ\87Ù\84.</translation>
+<translation id="4558985768677321342">تÙ\85Ù\83Ù\8aÙ\86 Ø¥Ù\84غاء Ø§Ù\84Ù\82Ù\81Ù\84 Ø¨Ø³Ù\87Ù\88Ù\84Ø©.</translation>
 <translation id="1221825588892235038">التحديد فقط</translation>
 <translation id="2227939492629426903">يعمل على تمكين قائمة الصور الشخصية الجديدة. فعند الدمج مع إدارة الملف الشخصي الجديد، يتم عرض قائمة الصور الشخصية لإدارة الملف الشخصي الجديد. أو عرض قائمة صور شخصية معاد تصميمها بنفس وظيفة القائمة القديمة، بالإضافة إلى بطاقة برنامج تعليمي في الأعلى تطلب من المستخدم تجربة واجهة مستخدم إدارة الملف الشخصي الجديد.</translation>
 <translation id="5582883434676861778">حظر <ph name="PRODUCT_NAME"/> الدخول إلى <ph name="HOST_NAME"/>، حيث تم الإبلاغ عن هذا الموقع كموقع للتصيد.</translation>
 <translation id="6460601847208524483">البحث عن التالي</translation>
 <translation id="397703832102027365">جارٍ الإنهاء...</translation>
 <translation id="8146177459103116374">إذا كنت مسجلاً على هذا الجهاز من قبل، يمكنك <ph name="LINK2_START"/>تسجيل الدخول كمستخدم حالي<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">عرض الإشارات المرجعية المدارة</translation>
 <translation id="4856478137399998590">تم تنشيط خدمة بيانات الجوال وهي جاهزة للاستخدام.</translation>
 <translation id="3305389145870741612">يمكن أن تستغرق عملية التنسيق ثانيتين. الرجاء الانتظار.</translation>
 <translation id="3648607100222897006">ربما تتغير أو تتعطل أو تختفي هذه الميزات التجريبية في أي وقت. ولا نعطي أي ضمانات حيال ما يمكن حدوثه إذا شغلت إحدى هذه الميزات التجريبية، وقد يتعطل المتصفح بشكل مفاجئ. وبشكل جدي، قد يحذف المتصفح جميع بياناتك، أو قد تتعرض خصوصيتك وأمانك للاختراق بطرق غير متوقعة. أي ميزات تجريبية تمكّنها سيتم تمكينها لجميع مستخدمي هذا المتصفح. الرجاء المتابعة بحذر.</translation>
 <translation id="6869402422344886127">مربّع اختيار محدد</translation>
 <translation id="3428010780253032925">تعطيل الاستهداف المستند إلى شكل المستطيل في طرق العرض</translation>
 <translation id="5637380810526272785">أسلوب الإدخال</translation>
+<translation id="3613134908380545408">عرض <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">‏يجب إعادة محاولة إجراء الاتصال باستخدام إصدار أقدم من بروتوكول TLS أو طبقة المقابس الآمنة. يعني هذا عادة أن الخادم يستخدم برنامجًا قديمًا جدًا وقد تكون به مشكلات أمان أخرى.</translation>
 <translation id="404928562651467259">تحذير</translation>
 <translation id="4289300219472526559">بدء التحدث</translation>
 <translation id="6934265752871836553">‏تتيح استخدام أحدث الشفرات ليضع Chrome المحتوى بشكل أسرع. من المرجح للغاية أن تؤدي التغييرات
         وراء هذا المسار إلى تعطيل الكثير من المحتوى.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">‏الفتح دائمًا باستخدام Adobe Reader</translation>
 <translation id="8274359292107649245">‏فتح Chrome على سطح المكتب</translation>
 <translation id="1571119610742640910">الجمع للخلفيات ذات الجذر الثابت.</translation>
 <translation id="6514565641373682518">عطّلت هذه الصفحة مؤشر الماوس.</translation>
 <translation id="824543159844843373">تنشيط عنصر المشغِّل 3</translation>
 <translation id="3819800052061700452">م&amp;لء الشاشة</translation>
 <translation id="48607902311828362">وضع الطائرة</translation>
+<translation id="711840821796638741">عرض الإشارات المرجعية المدارة</translation>
 <translation id="3360297538363969800">أخفقت الطباعة. يُرجى التحقق من الطابعة وإعادة المحاولة.</translation>
 <translation id="680572642341004180">‏تمكين تتبع RLZ في <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">الرجاء التوقف عن استخدام الشاحن الذي تم سحبه من الأسواق.</translation>
index 928fff8..288f834 100644 (file)
@@ -3928,6 +3928,7 @@ PDF файл или в Google Диск.</translation>
 <translation id="6460601847208524483">Търсене на следващото</translation>
 <translation id="397703832102027365">Довършва се...</translation>
 <translation id="8146177459103116374">Ако вече сте регистрирани на това устройство, можете <ph name="LINK2_START"/>да влезете като съществуващ потребител<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Показване на управляваните отметки</translation>
 <translation id="4856478137399998590">Услугата ви за данни е активирана и готова за употреба</translation>
 <translation id="3305389145870741612">Форматирането може да отнеме няколко секунди. Моля, изчакайте.</translation>
 <translation id="3648607100222897006">Тези експериментални функции може да се променят, повредят или изчезнат по всяко време. Не даваме абсолютно никаква гаранция какво може да се случи, ако включите някоя от тях. Възможно е дори браузърът ви спонтанно да се самозапали. Шегата настрани, браузърът ви може да изтрие всичките ви данни или сигурността и поверителността ви може да бъдат компрометирани по неочаквани начини. Активираните от вас експерименти ще работят за всички потребители на този браузър. Моля, действайте внимателно.</translation>
@@ -4356,6 +4357,7 @@ PDF файл или в Google Диск.</translation>
 <translation id="6869402422344886127">Отметнато квадратче за отметка</translation>
 <translation id="3428010780253032925">Деактивиране на основаното на правоъгълник насочване в изгледите</translation>
 <translation id="5637380810526272785">Метод за въвеждане</translation>
+<translation id="3613134908380545408">Показване на „<ph name="FOLDER_NAME"/>“</translation>
 <translation id="2837049386027881519">Връзката трябваше да се изпробва отново посредством по-стара версия на TLS или SSL протокола. Това обикновено означава, че сървърът използва много стар софтуер и може да има други проблеми със сигурността.</translation>
 <translation id="404928562651467259">ПРЕДУПРЕЖДЕНИЕ</translation>
 <translation id="4289300219472526559">Start Speaking</translation>
@@ -4678,7 +4680,7 @@ PDF файл или в Google Диск.</translation>
 <translation id="3160041952246459240">Разполагате със сертификати, които идентифицират тези сървъри:</translation>
 <translation id="5806573568064269889">Потвърждавам, че използвам зарядно устройство, върху което е залепен зелен стикер.</translation>
 <translation id="566920818739465183">Посетихте този сайт за първи път на <ph name="VISIT_DATE"/>.</translation>
-<translation id="2961695502793809356">Кликнете, за да преминете напред. Задръжте, за да видите историята</translation>
+<translation id="2961695502793809356">Кликнете, за да преминете напред. Задръжте, за да видите историята.</translation>
 <translation id="4092878864607680421">Най-новата версия на приложението „<ph name="APP_NAME"/>“ изисква повече разрешения, така че бе деактивирана.</translation>
 <translation id="5828228029189342317">Избрали сте определени типове файлове автоматично да се отварят след изтегляне. </translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
@@ -4688,6 +4690,7 @@ PDF файл или в Google Диск.</translation>
 <translation id="6934265752871836553">Използване на авангардния код в Chrome, за да се изобразява съдържанието по-бързо.
 Много вероятно е промените, на които се основава този път, да повредят голямо количество съдържание.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Отваряне винаги в Adobe Reader</translation>
 <translation id="8274359292107649245">Отваряне на Chrome на работния плот</translation>
 <translation id="1571119610742640910">Изграждане за фиксирани фонове на основните елементи.</translation>
 <translation id="6514565641373682518">Тази страница е деактивирала курсора на мишката ви.</translation>
@@ -4886,6 +4889,7 @@ PDF файл или в Google Диск.</translation>
 <translation id="824543159844843373">Активиране на елемент 3 от стартовия панел</translation>
 <translation id="3819800052061700452">На &amp;цял екран</translation>
 <translation id="48607902311828362">Самолетен режим</translation>
+<translation id="711840821796638741">Показване на управляваните отметки</translation>
 <translation id="3360297538363969800">Отпечатването не бе успешно. Моля, проверете принтера си и опитайте отново.</translation>
 <translation id="680572642341004180">Активиране на проследяването на RLZ в <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Моля, спрете да използвате изтегленото от пазара зарядно устройство.</translation>
index 0e69efd..ad971eb 100644 (file)
@@ -3967,6 +3967,7 @@ Google ড্রাইভের মধ্যে ফাইলগুলি আপ-
 <translation id="6460601847208524483">পরবর্তী খুঁজুন</translation>
 <translation id="397703832102027365">চূড়ান্ত হচ্ছে...</translation>
 <translation id="8146177459103116374">আপনি যদি এই ডিভাইসে ইতিমধ্যেই নিবন্ধন করে থাকনে, তাহলে আপনি <ph name="LINK2_START"/>একজন বিদ্যমান ব্যবহারকারী হিসাবে সাইন ইন করতে পারেন<ph name="LINK2_END"/>৷</translation>
+<translation id="5072836811783999860">পরিচালিত বুকমার্কগুলি দেখান</translation>
 <translation id="4856478137399998590">আপনার মোবাইল ডেটা পরিষেবা সক্রিয় করা হয়েছে এবং তা ব্যবহারের জন্য তৈরি আছে</translation>
 <translation id="3305389145870741612">বিন্যাসনের প্রক্রিয়াটিতে কয়েক সেকেন্ড সময় লাগতে পারে৷ দয়া করে অপেক্ষা করুন৷</translation>
 <translation id="3648607100222897006">এই পরীক্ষামূলক বৈশিষ্ট্যগুলি যেকোনো সময়ে পরিবর্তন, ভঙ্গ বা অদৃশ্য হয়ে যেতে পারে৷ আপনি এই পরীক্ষাগুলির যেকোনো একটি চালু করতে কী ঘটতে পারে সে সম্পর্কে আমরা কোনো রকম নিশ্চয়তা দিই না এবং এমনকি আপনার ব্রাউজার তাত্ক্ষণিকভাবে বিস্ফোরণ ঘটাতে পারে৷ মজা সরিয়ে, আপনার ব্রাউজার আপনার সকল ডেটা মুছে দিতে পারে, বা আপনার সুরক্ষা ও গোপনীয়তা অপ্রত্যাশিতভাবে ক্ষতিগ্রস্থ হতে পারে৷ আপনার দ্বারা সক্রিয় করা যেকোনো পরীক্ষা এই ব্রাউজারের সমস্ত ব্যবহারকারীদের জন্য সক্রিয় হবে৷ দয়া করে সাবধানতার সাথে এগিয়ে যান৷</translation>
@@ -4395,6 +4396,7 @@ Google ড্রাইভের মধ্যে ফাইলগুলি আপ-
 <translation id="6869402422344886127">পরীক্ষিত চেকবাক্স</translation>
 <translation id="3428010780253032925">দর্শনগুলিতে আয়তক্ষেত্র-ভিত্তিক টার্গেট অক্ষম করুন</translation>
 <translation id="5637380810526272785">ইনপুট  পদ্ধতি</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> দেখান</translation>
 <translation id="2837049386027881519">TLS অথবা SSL প্রোটোকলের পুরোনো সংস্করণ ব্যবহার করে সংযোগের জন্য পুনরায় চেষ্টা করা হয়েছে৷ সাধারণত এর অর্থ হল সার্ভার ভীষণ পুরোনো সংস্করণ ব্যবহার করছে এবং এতে অন্য কোনো নিরাপত্তা সমস্যা থাকতে পারে৷</translation>
 <translation id="404928562651467259">সতর্কতা</translation>
 <translation id="4289300219472526559">কথা বলা শুরু করুন</translation>
@@ -4727,6 +4729,7 @@ Google ড্রাইভের মধ্যে ফাইলগুলি আপ-
 <translation id="2859369953631715804">একটি মোবাইল নেটওয়ার্ক চয়ন করুন</translation>
 <translation id="6934265752871836553">Chrome যাতে আরো তাড়াতাড়ি সামগ্রী আনতে পারে তাই bleeding-edge কোড ব্যবহার করুন। এই পাথের পিছনের পরিবর্তনগুলি সামগ্রীর দিক থেকে সম্ভবত প্রচুর পরিবর্তন নিয়ে আসবে।</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">সর্বদা Adobe Reader এ খুলুন</translation>
 <translation id="8274359292107649245">ডেস্কটপে Chrome খুলুন</translation>
 <translation id="1571119610742640910">স্থির মূখ্য পশ্চাদপটগুলির জন্য কম্পোসিট করা হচ্ছে৷</translation>
 <translation id="6514565641373682518">এই পৃষ্ঠাটি আপনার মাউস কার্সরকে অক্ষম করেছে৷</translation>
@@ -4923,6 +4926,7 @@ Google ড্রাইভের মধ্যে ফাইলগুলি আপ-
 <translation id="824543159844843373">আরম্ভকারী আইটেম ৩ সক্রিয় করুন</translation>
 <translation id="3819800052061700452">&amp;পূর্ণ-স্ক্রীন</translation>
 <translation id="48607902311828362">বিমান মোড</translation>
+<translation id="711840821796638741">পরিচালিত বুকমার্কগুলি দেখান</translation>
 <translation id="3360297538363969800">মুদ্রণ করা গেল না৷ দয়া করে আপনার মুদ্রকটি পরীক্ষা করে আবার চেষ্টা করুন৷</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> এ RLZ নজর রাখা সক্ষম করুন৷</translation>
 <translation id="688797901999351107">প্রত্যাহার করা চার্জার ব্যবহার করা বন্ধ করুন।</translation>
index 593ef0f..30056d5 100644 (file)
@@ -72,7 +72,7 @@
 <translation id="7409233648990234464">Torna a iniciar i fes powerwash</translation>
 <translation id="7428534988046001922">Les aplicacions següents ja estan instal·lades:</translation>
 <translation id="787386463582943251">Afegeix una adreça electrònica</translation>
-<translation id="2833791489321462313">Cal contrasenya per activar aquesta opció</translation>
+<translation id="2833791489321462313">Sol·licita la contrasenya en sortir del mode de repòs</translation>
 <translation id="8208216423136871611">No desis</translation>
 <translation id="4405141258442788789">S'ha esgotat el temps de connexió de l'operació.</translation>
 <translation id="5048179823246820836">Nòrdic</translation>
 <translation id="1829192082282182671">&amp;Redueix</translation>
 <translation id="5042319201438341383">(UTC)</translation>
 <translation id="8564827370391515078">128</translation>
-<translation id="6390799748543157332">Les pàgines que visualitzeu en aquesta finestra no es mostraran a l'historial del navegador i no deixaran cap altre rastre a l'ordinador, com ara galetes, després de tancar totes les finestres de convidat obertes. De totes maneres, tots els fitxers que baixeu es conservaran.</translation>
+<translation id="6390799748543157332">Les pàgines que visualitzeu en aquesta finestra no es mostraran a l'historial del navegador i no deixaran cap altre rastre a l'ordinador, com ara galetes, després de tancar totes les finestres obertes de la sessió de convidat. No obstant això, es conservaran tots els fitxers que baixeu.</translation>
 <translation id="816055135686411707">Error en configurar la confiança del certificat</translation>
 <translation id="6714124459731960436">https:////mail.google.com//mail//?extsrc=mailto&amp;url=%s</translation>
 <translation id="4714531393479055912">Ara <ph name="PRODUCT_NAME"/> pot sincronitzar les contrasenyes.</translation>
 <translation id="4654488276758583406">Molt petit</translation>
 <translation id="6647228709620733774">URL de revocació de l'entitat emissora de certificats de Netscape</translation>
 <translation id="546411240573627095">Estil de teclat numèric</translation>
-<translation id="2310216585920710503">Configura el desbloqueig fàcil</translation>
+<translation id="2310216585920710503">Configura Desbloqueig fàcil</translation>
 <translation id="8425213833346101688">Canvia</translation>
 <translation id="2972581237482394796">&amp;Refés</translation>
 <translation id="5895138241574237353">Reinicia</translation>
 <translation id="2217501013957346740">Creeu un nom:</translation>
 <translation id="5177479852722101802">Continua bloquejant l'accés a la càmera i al micròfon</translation>
 <translation id="4422428420715047158">Domini:</translation>
-<translation id="7788444488075094252">Idiomes i entrada</translation>
+<translation id="7788444488075094252">Idiomes i introducció de text</translation>
 <translation id="6723354935081862304">Imprimeix a Google Docs i a altres destinacions al núvol. <ph name="BEGIN_LINK"/>Inicia la sessió<ph name="END_LINK"/> per imprimir a Google Cloud Print.</translation>
 <translation id="7115051913071512405">Prova-ho</translation>
 <translation id="8561096986926824116">Un canvi en la connexió a la xarxa ha interromput la connexió a
 <translation id="2391762656119864333">Revoca</translation>
 <translation id="3315158641124845231">Amaga <ph name="PRODUCT_NAME"/></translation>
 <translation id="7069168971636881066">Abans de crear un usuari supervisat, aquest dispositiu ha de tenir com a mínim un compte.</translation>
-<translation id="7766807826975222231">Guia ràpida</translation>
+<translation id="7766807826975222231">Visita guiada</translation>
 <translation id="2269471294353474737"><ph name="MARKUP_1"/>Accediu a fitxers des de qualsevol lloc, fins i tot fora de línia.<ph name="MARKUP_2"/>
     Els fitxers que són a Google Drive estan actualitzats i disponibles des de qualsevol dispositiu.<ph name="MARKUP_3"/>
     <ph name="MARKUP_4"/>Manteniu la seguretat dels fitxers.<ph name="MARKUP_5"/>
 <translation id="1005274289863221750">Utilitzar el micròfon i la càmera</translation>
 <translation id="2686444421126615064">Visualitzeu el compte</translation>
 <translation id="9215293857209265904">S'ha afegit &quot;<ph name="EXTENSION_NAME"/>&quot;</translation>
-<translation id="7693221960936265065">l'inici del període</translation>
+<translation id="7693221960936265065">tot</translation>
 <translation id="9105212490906037469">F2</translation>
 <translation id="4920887663447894854">Els llocs següents han bloquejat el seguiment de la vostra ubicació en aquesta pàgina:</translation>
 <translation id="8133676275609324831">&amp;Mostra a la carpeta</translation>
 <translation id="8651324101757295372">Xateja amb aquesta persona</translation>
 <translation id="6460423884798879930">Activa l'opció per enviar informació d'autenticació addicional al paquet SYN inicial per a un client ja connectat, de manera que permet que s'iniciï l'enviament de dades més ràpidament.</translation>
 <translation id="6563261555270336410">Detalls sobre <ph name="ELEMENTS_HOST_NAME"/></translation>
-<translation id="3200025317479269283">Divertiu-vos. Som aquí per ajudar-vos.</translation>
+<translation id="3200025317479269283">Divertiu-vos! Som aquí per ajudar-vos</translation>
 <translation id="5656983780125483728">S'està canviant a l'actualització anterior de <ph name="IDS_SHORT_PRODUCT_NAME"/>.</translation>
 <translation id="3470502288861289375">S'està copiant...</translation>
 <translation id="2719473049159220459">Emissor: <ph name="ISSUER"/></translation>
 <translation id="7501143156951160001">Si no teniu cap compte de Google, podeu <ph name="LINK_START"/>crear-ne un<ph name="LINK_END"/> ara.</translation>
 <translation id="4950138595962845479">Opcions...</translation>
 <translation id="4653235815000740718">S'ha produït un error durant la creació del mitjà de recuperació del sistema operatiu. No s'ha pogut trobar el dispositiu d'emmagatzematge utilitzat.</translation>
-<translation id="1407489512183974736">Centre retallat</translation>
+<translation id="1407489512183974736">Retallat al centre</translation>
 <translation id="6426222199977479699">Error de SSL</translation>
 <translation id="2688196195245426394">S'ha produït un error en registrar el dispositiu amb el servidor: <ph name="CLIENT_ERROR"/>.</translation>
 <translation id="667115622929458276">En aquests moments hi ha baixades d'incògnit en curs. Voleu sortir del mode d'incògnit i cancel·lar les baixades?</translation>
 <translation id="5661272705528507004">Aquesta targeta SIM està desactivada i no es pot utilitzar. Contacteu amb el vostre proveïdor de serveis perquè us la substitueixin.</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
 <translation id="3583413473134066075">Queda poc, queda poc... S'ha acabat el temps.</translation>
-<translation id="6585234750898046415">Trieu una imatge per visualitzar a la pantalla d'inici de sessió del vostre compte.</translation>
+<translation id="6585234750898046415">Trieu la imatge que es mostrarà al vostre compte a la pantalla d'inici de sessió.</translation>
 <translation id="7957054228628133943">Gestiona el bloqueig de finestres emergents...</translation>
-<translation id="179767530217573436">les últimes quatre setmanes</translation>
+<translation id="179767530217573436">fa quatre setmanes</translation>
 <translation id="2279770628980885996">S'ha detectat una situació inesperada mentre el servidor provava de completar la sol·licitud.</translation>
 <translation id="210116126541562594">Bloquejat de manera predeterminada</translation>
 <translation id="1986824139605408742">Si no recordeu la contrasenya, podeu continuar, però es perdran les dades locals. Només es recuperaran la configuració i les dades sincronitzades.</translation>
 <translation id="3873139305050062481">I&amp;nspecciona l'element</translation>
 <translation id="7445762425076701745">La identitat del servidor al qual esteu connectat no es pot acabar de validar. Esteu connectat a un servidor que utilitza un nom que només és vàlid dins la vostra xarxa, de manera que una autoritat de certificació externa no en pot validar la propietat. Com que de tota manera algunes autoritats de certificació emetran certificats per a aquests noms, no es pot assegurar que estigueu connectat al lloc web previst i no a un atacant.</translation>
 <translation id="1556537182262721003">No s'ha pogut desplaçar el directori d'extensions al perfil.</translation>
-<translation id="2946640296642327832">Activa el Bluetooth</translation>
+<translation id="2946640296642327832">Activa Bluetooth</translation>
 <translation id="5866557323934807206">Esborra aquesta configuració per a visites futures</translation>
 <translation id="126710816202626562">Idioma de traducció:</translation>
 <translation id="1194381338562257973">Activa les aplicacions efímeres experimentals</translation>
 <translation id="4801956050125744859">Mantén-les totes dues</translation>
 <translation id="3878840326289104869">S'està creant un usuari supervisat</translation>
 <translation id="406070391919917862">Aplicacions de fons</translation>
-<translation id="8820817407110198400">Preferits</translation>
+<translation id="8820817407110198400">Adreces d'interès</translation>
 <translation id="6347003977836730270">En lloc de la barra d'informació, es mostra l'opció per activar una experiència de l'usuari nova, la bombolla de traducció.</translation>
 <translation id="2580170710466019930">Espereu-vos mentre <ph name="PRODUCT_NAME"/> instal·la les últimes actualitzacions del sistema.</translation>
 <translation id="7428061718435085649">Utilitzeu les tecles Majús dreta i esquerra per seleccionar el 2n i el 3r candidats.</translation>
 <translation id="413121957363593859">Components</translation>
 <translation id="715487527529576698">El mode xinès inicial és xinès simplificat</translation>
 <translation id="6522350652862471760">Activa el nom i la icona del perfil de Google</translation>
-<translation id="6181259999130430430">Activa el desbloqueig fàcil per a aquest dispositiu</translation>
+<translation id="6181259999130430430">Activa Desbloqueig fàcil per a aquest dispositiu</translation>
 <translation id="8703575177326907206">La teva connexió a <ph name="DOMAIN"/> no està xifrada.</translation>
 <translation id="6135622770221372891">Identificadors de canal</translation>
 <translation id="8472623782143987204">recolzat per maquinari</translation>
 <translation id="2617604345341980855">Encara que hàgiu visitat aquest lloc web de manera segura altres vegades, és molt probable que si ho feu ara el vostre dispositiu quedi infectat amb programari maliciós.</translation>
 <translation id="2038896902310685531"><ph name="WALLET_ERROR"/>. Podeu completar aquesta transacció sense Google Wallet.</translation>
 <translation id="3925573269917483990">Càmera:</translation>
-<translation id="3170072451822350649">També podeu ometre l'inici de sessió i <ph name="LINK_START"/>navegar com a convidat<ph name="LINK_END"/>.</translation>
+<translation id="3170072451822350649">També podeu <ph name="LINK_START"/>navegar com a convidat<ph name="LINK_END"/> sense iniciar sessió.</translation>
 <translation id="8390449457866780408">El servidor no està disponible.</translation>
 <translation id="5098629044894065541">Hebreu</translation>
 <translation id="2609896558069604090">Crea dreceres...</translation>
@@ -639,7 +639,7 @@ Tots els usuaris han de tancar la sessió per continuar.</translation>
 <translation id="8158362770816748971">La vostra targeta virtual ja està a punt.</translation>
 <translation id="450298799867490781">Activa l'experimentació amb aplicacions efímeres, que s'inicien sense haver d'instal·lar-les a Chrome.</translation>
 <translation id="637601477428304897">Encara que hàgiu visitat aquest lloc web de manera segura altres vegades, és molt probable que si ho feu ara el vostre equip quedi infectat amb programari maliciós.</translation>
-<translation id="2152580633399033274">Mostra totes les imatges (opció recomanada)</translation>
+<translation id="2152580633399033274">Mostra totes les imatges (recomanat)</translation>
 <translation id="5618075537869101857">No s'ha pogut iniciar l'aplicació de quiosc.</translation>
 <translation id="6196041699996825846">Més informació sobre la navegació com a convidat</translation>
 <translation id="337286756654493126">Llegir carpetes que s'obrin a l'aplicació</translation>
@@ -676,7 +676,7 @@ Tots els usuaris han de tancar la sessió per continuar.</translation>
 <translation id="3718720264653688555">Teclat virtual</translation>
 <translation id="7760004034676677601">Aquesta pàgina d'inici és la que esperàveu?</translation>
 <translation id="3504135463003295723">Nom del grup:</translation>
-<translation id="3314070176311241517">Permet que tots els llocs executin JavaScript (opció recomanada)</translation>
+<translation id="3314070176311241517">Permet que tots els llocs executin JavaScript (recomanat)</translation>
 <translation id="4663254525753315077">Quan sigui possible, situa el contingut de desplaçament d'un element de desplaçament de desbordament en una capa composta perquè el desplaçament sigui més ràpid.</translation>
 <translation id="3280431534455935878">S'està preparant</translation>
 <translation id="5543983818738093899">S'està comprovant l'estat...</translation>
@@ -706,7 +706,7 @@ Tots els usuaris han de tancar la sessió per continuar.</translation>
 <translation id="3984921062031549150">Immobilitzacions del renderitzador</translation>
 <translation id="7925285046818567682">Esperant <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Bloqueja sempre l'accés a la càmera</translation>
-<translation id="2964845078799970531">El desbloqueig fàcil us permet desbloquejar el dispositiu Chromebook quan us trobeu a prop del telèfon.</translation>
+<translation id="2964845078799970531">Desbloqueig fàcil us permet desbloquejar el dispositiu Chromebook quan us trobeu a prop del telèfon.</translation>
 <translation id="5053803681436838483">Adreça d'enviament nova...</translation>
 <translation id="5952256601775839173">Activa el clic amb tres dits al ratolí tàctil.</translation>
 <translation id="3280237271814976245">Desa &amp;com a...</translation>
@@ -873,7 +873,7 @@ Tots els usuaris han de tancar la sessió per continuar.</translation>
 <translation id="3125649188848276916">Sí (no enregistris dades noves)</translation>
 <translation id="648927581764831596">No n'hi ha cap de disponible</translation>
 <translation id="6348657800373377022">Quadre de combinacions</translation>
-<translation id="7453382714306901283">L'ordinador conté un dispositiu de seguretat Trusted Platform Module (TPM), que s'utilitza per implementar moltes característiques importants de seguretat a Chrome OS. Visiteu el Centre d'ajuda del Chromebook per obtenir més informació: http://support.google.com/chromebook/?p=tpm.</translation>
+<translation id="7453382714306901283">L'ordinador conté un dispositiu de seguretat amb mòdul de plataforma de confiança  (TPM), que s'utilitza per implementar un gran nombre de funcions clau de seguretat a Chrome OS. Visiteu el Centre d'ajuda de Chromebook per obtenir més informació: http://support.google.com/chromebook/?p=tpm.</translation>
 <translation id="8064671687106936412">Clau:</translation>
 <translation id="2218515861914035131">Enganxa com a text sense format</translation>
 <translation id="1725149567830788547">Mostra els &amp;controls</translation>
@@ -982,7 +982,7 @@ Tots els usuaris han de tancar la sessió per continuar.</translation>
 <translation id="9068931793451030927">Camí:</translation>
 <translation id="283278805979278081">Fa una foto.</translation>
 <translation id="6111974609785983504">Permès de manera predeterminada</translation>
-<translation id="4992576607980257687">Pregunta'm quan un lloc vulgui utilitzar els missatges exclusius del sistema per accedir a dispositius MIDI (opció recomanada)</translation>
+<translation id="4992576607980257687">Pregunta'm quan un lloc vulgui utilitzar els missatges exclusius del sistema per accedir a dispositius MIDI (recomanat)</translation>
 <translation id="1407050882688520094">Teniu certificats arxivats que identifiquen les entitats emissores de certificats següents:</translation>
 <translation id="628816078521253632">Informació de l'aplicació...</translation>
 <translation id="6063810760121779748">Desactiva WebAudio</translation>
@@ -1019,7 +1019,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="159359590073980872">Memòria cau d'imatges</translation>
 <translation id="4668711410219362250">https://support.google.com/chrome/bin/answer.py?hl=<ph name="GRITLANGCODE_1"/>&amp;answer=165139&amp;p=settings_sign_in</translation>
 <translation id="3586931643579894722">Oculta els detalls</translation>
-<translation id="6285395082104474418">La safata d'estat mostra l'estat actual de la xarxa, de la bateria i d'altres elements.</translation>
+<translation id="6285395082104474418">La safata d'estat mostra l'estat actual de la xarxa, de la bateria i molt més.</translation>
 <translation id="3317459757438853210">A dues cares</translation>
 <translation id="6020949471045037306">Activa el sistema de gestió de perfils nous, inclosos el bloqueig del perfil i la IU del menú de l'avatar nou.</translation>
 <translation id="2011110593081822050">Treballador web: <ph name="WORKER_NAME"/></translation>
@@ -1126,7 +1126,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="1357589289913453911">Identificador de l'extensió</translation>
 <translation id="7570477672765183">Feu clic per començar</translation>
 <translation id="8688579245973331962">No veieu el vostre nom?</translation>
-<translation id="3804941997676372569">Cerqueu o digueu &quot;D'acord, Google&quot;</translation>
+<translation id="3804941997676372569">Cerqueu o digueu &quot;Ok Google&quot;</translation>
 <translation id="3226128629678568754">Premeu el botó de tornar a carregar per tornar a enviar les dades necessàries per carregar la pàgina.</translation>
 <translation id="1384035515048721170"><ph name="LEGAL_DOC_AGREEMENT"/> Per protegir-vos de fraus, es compartirà informació sobre el vostre ordinador (inclosa la ubicació) amb Google Wallet.</translation>
 <translation id="6166101525540035714">L'ús que feu de Chrome està subjecte a les <ph name="BEGIN_LINK1"/>Termes i condicions<ph name="END_LINK1"/> i a l'<ph name="BEGIN_LINK2"/>Avís de privadesa<ph name="END_LINK2"/> de Chrome.</translation>
@@ -1190,7 +1190,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="4988792151665380515">No s'ha pogut exportar la clau pública.</translation>
 <translation id="4764963217871264125">Afegeix un usuari</translation>
 <translation id="5053604404986157245">La contrasenya de TPM generada aleatòriament no està disponible. Això és normal després d'executar la funció Powerwash.</translation>
-<translation id="6333049849394141510">Selecciona les dades</translation>
+<translation id="6333049849394141510">Tria quines dades sincronitzar</translation>
 <translation id="1944921356641260203">S'ha trobat una actualització.</translation>
 <translation id="5990559369517809815">Una extensió ha bloquejat les peticions al servidor.</translation>
 <translation id="3828440302402348524">Sessió iniciada com a <ph name="USER_NAME"/>...</translation>
@@ -1256,7 +1256,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="3555812735919707620">Suprimeix l'extensió</translation>
 <translation id="220858061631308971">Introduïu aquest codi PIN a &quot;<ph name="DEVICE_NAME"/>&quot;:</translation>
 <translation id="6263082573641595914">Versió de CA de Microsoft</translation>
-<translation id="7716020873543636594">Fes clic automàticament quan el punter del ratolí s'aturi</translation>
+<translation id="7716020873543636594">Fes clic automàticament quan s'aturi el punter del ratolí</translation>
 <translation id="953345106084818179">Sol·licita permís</translation>
 <translation id="3105917916468784889">Captura Pantalla</translation>
 <translation id="7547811415869834682">Neerlandès</translation>
@@ -1284,7 +1284,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="9033857511263905942">&amp;Enganxa</translation>
 <translation id="1028690605877243613">Fes servir el disseny de prestatge alternatiu.</translation>
 <translation id="6736045498964449756">Les contrasenyes no coincideixen.</translation>
-<translation id="4558985768677321342">Activa el desbloqueig fàcil</translation>
+<translation id="4558985768677321342">Activa Desbloqueig fàcil</translation>
 <translation id="1221825588892235038">Només la selecció</translation>
 <translation id="2227939492629426903">Activa el nou menú d'avatar. Quan es combina amb una gestió de perfil nova, només mostra el nou menú d'avatar de gestió del perfil. En cas contrari, mostra un menú d'avatar redissenyat amb la mateixa funcionalitat que l'antic, més una targeta de tutorial a la part superior, que demana a l'usuari que provi la nova interfície d'usuari de gestió del perfil.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> ha bloquejat l'accés a <ph name="HOST_NAME"/>. Ens han informat que aquest lloc web és un lloc web de pesca.</translation>
@@ -1343,7 +1343,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="3866443872548686097">El mitjà de recuperació està llest i podeu eliminar-lo del sistema.</translation>
 <translation id="5525677322972469346">Crea un usuari supervisat nou</translation>
 <translation id="6824564591481349393">Copi&amp;a l'adreça electrònica</translation>
-<translation id="907148966137935206">No permetis que cap lloc mostri finestres emergents (opció recomanada)</translation>
+<translation id="907148966137935206">No permetis que cap lloc mostri finestres emergents (recomanat)</translation>
 <translation id="5184063094292164363">Consola de &amp;JavaScript</translation>
 <translation id="333371639341676808">Evita que aquesta pàgina creï diàlegs addicionals.</translation>
 <translation id="2280486287150724112">Marge dret</translation>
@@ -1355,7 +1355,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="4697214168136963651"><ph name="URL"/> s'ha bloquejat</translation>
 <translation id="5380103295189760361">Manteniu premudes les tecles Control, Alt, Maj o Cerca per veure les tecles de drecera per a aquests modificadors.</translation>
 <translation id="7791543448312431591">Afegeix</translation>
-<translation id="8569764466147087991">Seleccioneu un fitxer per obrir</translation>
+<translation id="8569764466147087991">Seleccioneu el fitxer que vulgueu obrir</translation>
 <translation id="9131487537093447019">Enviar missatges a dispositius Bluetooth i rebre'n</translation>
 <translation id="3010279545267083280">La contrasenya s'ha suprimit.</translation>
 <translation id="4275663329226226506">Multimèdia</translation>
@@ -1466,7 +1466,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="2266011376676382776">Pàgines sense resposta</translation>
 <translation id="2907619724991574506">URL d'inici</translation>
 <translation id="6780476430578694241">Menú d'aplicacions</translation>
-<translation id="5328285148748012771">Accediu a totes les vostres aplicacions des d'aquest pràctic selector. Jugueu a jocs, feu xats de vídeo, escolteu música, editeu documents o obteniu més aplicacions de Chrome Web Store.</translation>
+<translation id="5328285148748012771">Accediu a totes les vostres aplicacions des d'aquest pràctic menú. Jugueu, feu xats de vídeo, escolteu música, editeu documents o baixeu més aplicacions a Chrome Web Store.</translation>
 <translation id="2739191690716947896">Depura</translation>
 <translation id="3100609564180505575">Mòduls (<ph name="TOTAL_COUNT"/>) - Conflictes coneguts: <ph name="BAD_COUNT"/>, sospitats: <ph name="SUSPICIOUS_COUNT"/></translation>
 <translation id="641702813324074008">Activació de la interfície d'usuari basada en bombolles per desar contrasenyes</translation>
@@ -1476,7 +1476,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="6980956047710795611">Migra totes les dades de SO Chrome a la contrasenya nova
 (requereix la contrasenya anterior)</translation>
 <translation id="8652487083013326477">botó d'opció d'interval de pàgines</translation>
-<translation id="5204967432542742771">Introduïu la contrasenya</translation>
+<translation id="5204967432542742771">Escriviu la contrasenya</translation>
 <translation id="6686817083349815241">Desa la contrasenya</translation>
 <translation id="9025098623496448965">D'acord, torna a la pantalla d'inici de sessió</translation>
 <translation id="589737135092634133">Comproveu la configuració del servidor intermediari o contacteu amb l'administrador de la xarxa per
@@ -1539,7 +1539,7 @@ El mode d'incògnit, <ph name="SHORTCUT_KEY"/>, us pot resultar pràctic la prop
 <translation id="6237614789842758826">Cerca a Google</translation>
 <translation id="798525203920325731">Espais de nom de xarxa</translation>
 <translation id="7092106376816104">Excepcions de finestres emergents</translation>
-<translation id="8594787581355215556">Heu iniciat la sessió com a <ph name="USER_EMAIL_ADDRESS"/>. Gestioneu les dades sincronitzades al <ph name="BEGIN_LINK"/>Tauler de Google<ph name="END_LINK"/>.</translation>
+<translation id="8594787581355215556">Heu iniciat la sessió com a <ph name="USER_EMAIL_ADDRESS"/>. Gestioneu les dades sincronitzades al <ph name="BEGIN_LINK"/>Tauler de control de Google<ph name="END_LINK"/>.</translation>
 <translation id="6476634420120651145">Activa el canvi de mida ràpid del text</translation>
 <translation id="5402367795255837559">Braille</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME"/> no ha pogut completar la instal·lació, però es continuarà executant des de la imatge de disc.</translation>
@@ -1597,7 +1597,7 @@ Després de crear un usuari supervisat, podeu gestionar-ne la configuració en q
 <translation id="8418240940464873056">Mode hanja</translation>
 <translation id="4263757076580287579">El registre de la impressora s'ha cancel·lat.</translation>
 <translation id="5788367137662787332">Com a mínim una partició del dispositiu <ph name="DEVICE_LABEL"/> no s'ha pogut muntar.</translation>
-<translation id="392089482157167418">Activa ChromeVox (comentaris de veu)</translation>
+<translation id="392089482157167418">Activa ChromeVox (missatges de veu)</translation>
 <translation id="1886996562706621347">Permet que els llocs web sol·licitin esdevenir gestors predeterminats de protocols (recomanat)</translation>
 <translation id="6736329909263487977"><ph name="ISSUED_BY"/> [<ph name="ISSUED_TO"/>]</translation>
 <translation id="8899388739470541164">Vietnamita</translation>
@@ -1621,7 +1621,7 @@ Després de crear un usuari supervisat, podeu gestionar-ne la configuració en q
 <translation id="5889282057229379085">Nombre màxim de CA intermèdies: <ph name="NUM_INTERMEDIATE_CA"/></translation>
 <translation id="3180365125572747493">Introduïu una contrasenya per encriptar aquest fitxer de certificat.</translation>
 <translation id="8663625831674359823">NOTA: només funciona amb els canals Dev i Canary. Activa els suggeriments a l'omnibox, que es ressalten abans d'escriure.</translation>
-<translation id="7386824183915085801">La vostra versió de Chrome i del sistema operatiu s'enviarà juntament amb la informació addicional que vulgueu incloure a la secció anterior. Si incloeu l'adreça electrònica, Google podrà contactar-vos en relació amb els comentaris         que heu enviat. Aquesta informació s'utilitza per al diagnosi de problemes i per millorar Chrome. La informació personal que envieu, ja sigui de forma expressa o indirecta, es protegirà segons les nostres polítiques de privadesa.<ph name="BEGIN_BOLD"/> En enviar els comentaris, accepteu que Google els pugui utilitzar per millorar els seus productes o serveis.
+<translation id="7386824183915085801">La vostra versió de Chrome i del sistema operatiu s'enviarà juntament amb la informació addicional que vulgueu incloure a la secció anterior. Si incloeu l'adreça electrònica, Google podrà contactar-vos en relació amb els suggeriments que heu enviat. Aquesta informació s'utilitza per al diagnosi de problemes i per millorar Chrome. La informació personal que envieu, ja sigui de forma expressa o indirecta, es protegirà segons les nostres polítiques de privadesa.<ph name="BEGIN_BOLD"/> En enviar els suggeriments, accepteu que Google els pugui utilitzar per millorar els seus productes o serveis.
         <ph name="END_BOLD"/></translation>
 <translation id="123578888592755962">El disc és ple</translation>
 <translation id="5496587651328244253">Organitza</translation>
@@ -2078,7 +2078,7 @@ Després de crear un usuari supervisat, podeu gestionar-ne la configuració en q
 <translation id="8580634710208701824">Torna a carregar el marc</translation>
 <translation id="7606992457248886637">Entitats emissores</translation>
 <translation id="4197674956721858839">Selecció de ZIP</translation>
-<translation id="707392107419594760">Seleccioneu el vostre teclat:</translation>
+<translation id="707392107419594760">Seleccioneu el teclat:</translation>
 <translation id="8605503133013456784">No s'ha pogut desconnectar i dessincronitzar de: &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
 <translation id="2007404777272201486">Informa d'un problema...</translation>
 <translation id="4366509400410520531">Permès pel vostre usuari</translation>
@@ -2088,7 +2088,7 @@ Després de crear un usuari supervisat, podeu gestionar-ne la configuració en q
 <translation id="2390045462562521613">Oblida aquesta xarxa</translation>
 <translation id="1450927657625573300">Desactiva una optimització dissenyada per millorar la capacitat de resposta al desplaçament tàctil. Fa que tots els esdeveniments tàctils vagin al procés principal de parpelleig per cercar gestors, en comptes de fer un curtcircuit des del procés de composició.</translation>
 <translation id="3348038390189153836">S'ha detectat un dispositiu extraïble</translation>
-<translation id="1663298465081438178">Bondat sense complicacions.</translation>
+<translation id="1663298465081438178">Avantatges sense complicacions</translation>
 <translation id="8005540215158006229">Chrome ja està quasi llest</translation>
 <translation id="1666788816626221136">Teniu certificats arxivats que no s'ajusten a cap de les altres categories:</translation>
 <translation id="4821935166599369261">Creació de &amp;perfils activada</translation>
@@ -2171,11 +2171,11 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="215753907730220065">Surt de la pantalla completa</translation>
 <translation id="7849264908733290972">Obre la &amp;imatge en una pestanya nova</translation>
 <translation id="1560991001553749272">Afegit a les adreces d'interès.</translation>
-<translation id="3966072572894326936">Selecciona una altra carpeta...</translation>
+<translation id="3966072572894326936">Tria una altra carpeta...</translation>
 <translation id="8758455334359714415">DNS asíncron inserit</translation>
 <translation id="5585912436068747822">La formatació ha fallat</translation>
 <translation id="8766796754185931010">Kotoeri</translation>
-<translation id="6357619544108132570">Us donem la benvinguda a la família <ph name="SHORT_PRODUCT_NAME"/>. Aquest no és un ordinador normal.</translation>
+<translation id="6357619544108132570">Us donem la benvinguda a la família <ph name="SHORT_PRODUCT_NAME"/>. Aquest no és un ordinador convencional.</translation>
 <translation id="7786207843293321886">Surt de la sessió de convidat</translation>
 <translation id="3359256513598016054">Restriccions de normes de certificats</translation>
 <translation id="4433914671537236274">Creació d'un mitjà de recuperació</translation>
@@ -2276,9 +2276,9 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="8664389313780386848">&amp;Visualitza l'origen de la pàgina</translation>
 <translation id="1887402381088266116">Activa el text del camp de distància</translation>
 <translation id="6074825444536523002">Formulari de Google</translation>
-<translation id="13649080186077898">Gestiona la configuració de l'emplenament automàtic</translation>
+<translation id="13649080186077898">Gestiona la configuració d'Emplenament automàtic</translation>
 <translation id="3550915441744863158">Chrome s'actualitza automàticament perquè en tingueu sempre la versió més recent.</translation>
-<translation id="57646104491463491">Data modificada</translation>
+<translation id="57646104491463491">Data de modificació</translation>
 <translation id="3941357410013254652">Identificador de canal</translation>
 <translation id="7266345500930177944">Feu clic per executar <ph name="PLUGIN_NAME"/>.</translation>
 <translation id="1355542767438520308">S'ha produït un error. És possible que alguns elements no s'hagin suprimit.</translation>
@@ -2297,7 +2297,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="542872847390508405">Esteu navegant com a convidat.</translation>
 <translation id="8273972836055206582">Ara <ph name="FULLSCREEN_ORIGIN"/> es visualitza a pantalla completa i vol desactivar el cursor del ratolí.</translation>
 <translation id="1497522201463361063">No es pot canviar el nom a &quot;<ph name="FILE_NAME"/>&quot;. <ph name="ERROR_MESSAGE"/></translation>
-<translation id="8226742006292257240">A continuació trobareu la contrasenya de TPM generada aleatòriament que s'ha assignat al vostre equip:</translation>
+<translation id="8226742006292257240">A continuació, trobareu la contrasenya de TPM generada aleatòriament que s'ha assignat al vostre ordinador:</translation>
 <translation id="5010043101506446253">Autoritats certificadores</translation>
 <translation id="5452005759330179535">Pregunta'm quan un lloc vulgui mostrar notificacions d'escriptori (opció recomanada)</translation>
 <translation id="5287425679749926365">Els comptes</translation>
@@ -2350,7 +2350,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
           Inici &gt; Tauler de control &gt; Xarxa i Internet &gt; Xarxa i centre d'ús compartit &gt; Resolució de problemes (a la part inferior) &gt; Connexions d'Internet.
           <ph name="END_BOLD"/></translation>
 <translation id="6602090339694176254">Activa el servei experimental de suggeriments de Chrome.</translation>
-<translation id="2143915448548023856">Configuració de la pantalla</translation>
+<translation id="2143915448548023856">Configuració de visualització</translation>
 <translation id="724691107663265825">Aquest lloc conté programari maliciós</translation>
 <translation id="1084824384139382525">Copia l'adr&amp;eça de l'enllaç</translation>
 <translation id="2803306138276472711">Navegació segura de Google ha <ph name="BEGIN_LINK"/>detectat programari maliciós<ph name="END_LINK"/> recentment a la pàgina <ph name="SITE"/>. De vegades, els llocs web que acostumen a ser segurs s'infecten amb programari maliciós.</translation>
@@ -2360,7 +2360,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="918765022965757994">Inicia la sessió a aquest lloc com a: <ph name="EMAIL_ADDRESS"/></translation>
 <translation id="8216278935161109887">Tanqueu la sessió i torneu-la a iniciar</translation>
 <translation id="6254503684448816922">Compromís de clau</translation>
-<translation id="6555432686520421228">Elimina tots els comptes d'usuari i restableix el dispositiu <ph name="IDS_SHORT_PRODUCT_NAME"/> perquè sembli nou.</translation>
+<translation id="6555432686520421228">Suprimeix tots els comptes d'usuari i restableix el dispositiu <ph name="IDS_SHORT_PRODUCT_NAME"/>, com si fos nou.</translation>
 <translation id="1346748346194534595">A la dreta</translation>
 <translation id="7756363132985736290">El certificat ja existeix.</translation>
 <translation id="1181037720776840403">Elimina</translation>
@@ -2429,7 +2429,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="3866249974567520381">Descripció</translation>
 <translation id="2294358108254308676">Voleu instal·lar <ph name="PRODUCT_NAME"/>?</translation>
 <translation id="6549689063733911810">Recent</translation>
-<translation id="1529968269513889022">l'última setmana</translation>
+<translation id="1529968269513889022">la setmana passada</translation>
 <translation id="5542132724887566711">Perfil</translation>
 <translation id="7912145082919339430">Quan <ph name="PLUGIN_NAME"/> s'hagi acabat d'instal·lar, torneu a carregar la pàgina per activar-lo.</translation>
 <translation id="5196117515621749903">Torna a carregar ignorant la memòria cau</translation>
@@ -2461,7 +2461,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="3668570675727296296">Configuració d'idioma</translation>
 <translation id="2190469909648452501">Redueix</translation>
 <translation id="7754704193130578113">Pregunta on es desarà cada fitxer abans de baixar-lo</translation>
-<translation id="222949136907494149"><ph name="URL"/> vol fer servir la ubicació de l'equip.</translation>
+<translation id="222949136907494149"><ph name="URL"/> vol fer servir la ubicació de l'ordinador.</translation>
 <translation id="7654941827281939388">Aquest compte ja s'està utilitzant en aquest equip.</translation>
 <translation id="204914487372604757">Crea la drecera</translation>
 <translation id="696036063053180184">Configuració 3 (sense majúscules)</translation>
@@ -2481,7 +2481,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="4087148366934348322">El carregador està actualitzat.</translation>
 <translation id="1270699273812232624">Permet els elements</translation>
 <translation id="4018133169783460046">Mostra <ph name="PRODUCT_NAME"/> en aquest idioma</translation>
-<translation id="1257390253112646227">Reproduïu contingut, editeu, compartiu elements i completeu tasques.</translation>
+<translation id="1257390253112646227">Jugueu, editeu, compartiu i feu tot el que necessiteu</translation>
 <translation id="7482533734313877746">El temps necessari perquè <ph name="SHORT_PRODUCT_NAME"/> s'iniciï completament</translation>
 <translation id="1503914375822320413">L'operació de còpia ha fallat; s'ha produït un error inesperat: $1</translation>
 <translation id="3264544094376351444">Tipus de lletra Sans-serif</translation>
@@ -2639,7 +2639,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="8420728540268437431">Aquesta pàgina s'està traduint...</translation>
 <translation id="6256412060882652702">Powerwash del dispositiu <ph name="IDS_SHORT_PRODUCT_NAME"/></translation>
 <translation id="736515969993332243">S'estan cercant xarxes.</translation>
-<translation id="7806513705704909664">Activa l’emplenament automàtic per emplenar formularis web amb un sol clic.</translation>
+<translation id="7806513705704909664">Activa la funció Emplenament automàtic per emplenar formularis web amb un sol clic.</translation>
 <translation id="3150994199788134383">Una extensió ha passat a controlar la configuració del servidor intermediari. Això vol dir que pot modificar i trencar el contingut que publiqueu en línia, o bé consultar-lo sense permís. Si no esteu segur del motiu d'aquest canvi, és possible que no el vulgueu aplicar.</translation>
 <translation id="8026334261755873520">Supressió de les dades de navegació</translation>
 <translation id="605011065011551813">Un connector (<ph name="PLUGIN_NAME"/>) no respon.</translation>
@@ -2696,7 +2696,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="2932960728421974162">No es pot connectar al lloc web real de <ph name="SITE"/></translation>
 <translation id="509429900233858213">S'ha produït un error.</translation>
 <translation id="7227780179130368205">S'ha detectat programari maliciós!</translation>
-<translation id="2489428929217601177">l'últim dia</translation>
+<translation id="2489428929217601177">ahir</translation>
 <translation id="4278390842282768270">Permeses</translation>
 <translation id="2074527029802029717">No fixis la pestanya</translation>
 <translation id="1533897085022183721">Menys de <ph name="MINUTES"/>.</translation>
@@ -2726,7 +2726,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="2728812059138274132">S'estan cercant connectors...</translation>
 <translation id="7516331482824334944">Desactiva la compatibilitat de Chromecast experimental</translation>
 <translation id="2471964272749426546">Mètode d'introducció en tàmil (Tamil99)</translation>
-<translation id="9088917181875854783">Confirmeu que apareix aquesta contrasenya a &quot;<ph name="DEVICE_NAME"/>&quot;:</translation>
+<translation id="9088917181875854783">Confirmeu que aquesta clau d'accés apareix a &quot;<ph name="DEVICE_NAME"/>&quot;:</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="5236831943526452400">Esborra les galetes i altres dades dels llocs en tancar el navegador</translation>
 <translation id="1558834950088298812">Nombre de vegades que s'ha actualitzat una extensió</translation>
@@ -2757,7 +2757,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="1829129547161959350">Pingüí</translation>
 <translation id="8988255471271407508">La pàgina web no era a la memòria cau. Hi ha recursos que només es poden carregar de manera segura des de la memòria cau, com ara les pàgines generades a partir de dades enviades. <ph name="LINE_BREAK"/> Aquest error també pot produir-se a causa de la corrupció de la memòria cau, produïda per un tancament incorrecte. <ph name="LINE_BREAK"/> Si el problema continua, proveu d'esborrar la memòria cau.</translation>
 <translation id="1653828314016431939">D'acord, reinicia ara</translation>
-<translation id="7364796246159120393">Selecciona el fitxer</translation>
+<translation id="7364796246159120393">Tria un fitxer</translation>
 <translation id="6585283250473596934">S'està entrant en una sessió pública.</translation>
 <translation id="8915370057835397490">S'estan carregant els suggeriments</translation>
 <translation id="264911923226702984">Mystery nord-americà</translation>
@@ -2881,7 +2881,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="3784455785234192852">Bloqueja</translation>
 <translation id="515594325917491223">Escacs</translation>
 <translation id="1594155067816010104">Aquest fitxer malmetrà el vostre ordinador.</translation>
-<translation id="3378503599595235699">Conserva les dades locals només fins que surti del navegador</translation>
+<translation id="3378503599595235699">Desa les dades locals només fins que surti del navegador</translation>
 <translation id="8047248493720652249">Aquesta extensió no ha pogut posar nom a la baixada &quot;<ph name="ATTEMPTED_FILENAME"/>&quot; perquè una altra extensió (<ph name="EXTENSION_NAME"/>) ha indicat un nom de fitxer diferent &quot;<ph name="ACTUAL_FILENAME"/>&quot;.</translation>
 <translation id="5605830556594064952">Dvorak nord-americà</translation>
 <translation id="7347751611463936647">Per utilitzar aquesta extensió, escriviu &quot;<ph name="EXTENSION_KEYWORD"/>&quot;, premeu la tecla de tabulació i indiqueu l'ordre o la cerca.</translation>
@@ -3040,7 +3040,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="3613796918523876348">Recupera-ho de tota manera</translation>
 <translation id="7974087985088771286">Activa la pestanya 6</translation>
 <translation id="2857421400871862029">Pregunta'm quan un lloc intenti desactivar el cursor del ratolí (opció recomanada)</translation>
-<translation id="1910721550319506122">Benvingut!</translation>
+<translation id="1910721550319506122">Us donem la benvinguda</translation>
 <translation id="4035758313003622889">Gestor de &amp;tasques</translation>
 <translation id="6356936121715252359">Configuració d'emmagatzematge d'Adobe Flash Player...</translation>
 <translation id="8874184842967597500">No connectada</translation>
@@ -3058,7 +3058,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="2044540568167155862">Goats teleported</translation>
 <translation id="1776712937009046120">Afegeix un usuari</translation>
 <translation id="506152810699123561">Mètriques relacionades amb l'efecte de <ph name="SHORT_PRODUCT_NAME"/> a la memòria del sistema</translation>
-<translation id="674632704103926902">Activa l'opció fer un toc per arrossegar</translation>
+<translation id="674632704103926902">Activa l'opció tocar i arrossegar</translation>
 <translation id="8954952943849489823">El trasllat ha fallat, s'ha produït un error inesperat: $1</translation>
 <translation id="2318143611928805047">Mida del paper</translation>
 <translation id="7100897339030255923"><ph name="COUNT"/> elements seleccionats</translation>
@@ -3108,7 +3108,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="7466861475611330213">Estil de puntuació</translation>
 <translation id="2496180316473517155">Historial de navegació</translation>
 <translation id="602251597322198729">Aquest lloc està intentant baixar diversos fitxers. Vols permetre-ho?</translation>
-<translation id="6116921718742659598">Canvia la configuració d'idioma i d'entrada</translation>
+<translation id="6116921718742659598">Canvia la configuració d'idioma i d'introducció de text</translation>
 <translation id="4365673000813822030">La sincronització ha deixat de funcionar.</translation>
 <translation id="5178920624826650424">SHA-1</translation>
 <translation id="5942492703898707260">Afegiu les impressores a Google Cloud Print per poder imprimir documents des de qualsevol lloc.</translation>
@@ -3232,7 +3232,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="8755376271068075440">&amp;Més gran</translation>
 <translation id="8132793192354020517">Connectat a <ph name="NAME"/></translation>
 <translation id="8187473050234053012">El certificat de seguretat del servidor està revocat.</translation>
-<translation id="7052914147756339792">Defineix l'empaperat...</translation>
+<translation id="7052914147756339792">Estableix fons de pantalla...</translation>
 <translation id="5865597920301323962">Les galetes de: <ph name="DOMAIN"/> s'esborraran en sortir-ne.</translation>
 <translation id="2702540957532124911">Teclat:</translation>
 <translation id="7444983668544353857">Desactiva <ph name="NETWORKDEVICE"/></translation>
@@ -3307,7 +3307,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="3920504717067627103">Normes de certificats</translation>
 <translation id="7418949474175272990">Aquesta opció desactiva la compatibilitat a WebRTC per codificar seqüències de vídeo amb el maquinari de la plataforma.</translation>
 <translation id="2344028582131185878">Baixades automàtiques</translation>
-<translation id="155865706765934889">Touchpad</translation>
+<translation id="155865706765934889">Ratolí tàctil</translation>
 <translation id="3308134619352333507">Amaga el botó</translation>
 <translation id="7701040980221191251">Cap</translation>
 <translation id="1062407476771304334">Substitueix</translation>
@@ -3316,7 +3316,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="5917011688104426363">Barra adreces en mode de cerca </translation>
 <translation id="3269101346657272573">Introduïu el PIN</translation>
 <translation id="2822854841007275488">Àrab</translation>
-<translation id="6559948977408379772">Aquesta icona apareix quan l'usuari o el telèfon estan a prop i el desbloqueig fàcil està disponible. Només cal que feu clic per entrar-hi, perquè no cal contrasenya.</translation>
+<translation id="6559948977408379772">Aquesta icona apareix quan us trobeu a prop del telèfon i la funció Desbloqueig fàcil està disponible. Només cal que feu clic per accedir-hi, no cal contrasenya.</translation>
 <translation id="5857090052475505287">Carpeta nova</translation>
 <translation id="7450732239874446337">E/S de xarxa suspeses.</translation>
 <translation id="4003393903129308792">Activa el rasteritzador d'una còpia</translation>
@@ -3347,7 +3347,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="8014914694548037591">Aquesta extensió pot llegir i canviar la informació de l'usuari en qualsevol lloc web, com ara Google, Facebook, Yahoo, etc.</translation>
 <translation id="6503077044568424649">Els més visitats</translation>
 <translation id="9016164105820007189">S'està connectant a &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
-<translation id="7168109975831002660">Cos de lletra mínim</translation>
+<translation id="7168109975831002660">Mida mínima de tipus de lletra</translation>
 <translation id="7070804685954057874">Entrada directa</translation>
 <translation id="2631006050119455616">S'ha desat</translation>
 <translation id="5175870427301879686"><ph name="URL"/> vol emmagatzemar de forma permanent dades a l'equip local.</translation>
@@ -3394,12 +3394,12 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="2419414843209660528">Afegeix una drecera a aquesta pàgina web...</translation>
 <translation id="3529423920239848704">Nombre de vegades que <ph name="SHORT_PRODUCT_NAME"/> no s'ha tancat correctament</translation>
 <translation id="7022562585984256452">S'ha definit la pàgina d'inici.</translation>
-<translation id="267285457822962309">Canvieu la configuració específica del dispositiu i dels dispositius perifèrics.</translation>
+<translation id="267285457822962309">Canvieu la configuració específica del dispositiu i dels perifèrics.</translation>
 <translation id="1154228249304313899">Obre aquesta pàgina:</translation>
 <translation id="6976108581241006975">Consola JavaScript</translation>
 <translation id="60357267506638014">QWERTY txec</translation>
 <translation id="2478176599153288112">Permisos de fitxer multimèdia per a &quot;<ph name="EXTENSION"/>&quot;</translation>
-<translation id="3473479545200714844">Augment de pantalla</translation>
+<translation id="3473479545200714844">Lupa</translation>
 <translation id="6759193508432371551">Restabliment de fàbrica</translation>
 <translation id="2981493173545878420">Activat en totes les pàgines</translation>
 <translation id="3627588569887975815">Obre l'enllaç en una finestra d'inco&amp;gnito</translation>
@@ -3435,7 +3435,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="1526560967942511387">Document sense títol</translation>
 <translation id="3979748722126423326">Activa <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA o RSN)</translation>
-<translation id="7561031016893995297">Gestioneu els dispositius amb desbloqueig fàcil des de la configuració del compte</translation>
+<translation id="7561031016893995297">Gestioneu els dispositius amb Desbloqueig fàcil des de la pàgina de configuració del compte</translation>
 <translation id="2238379619048995541">Dades de l'estat de freqüència</translation>
 <translation id="4367133129601245178">C&amp;opia l'URL de la imatge</translation>
 <translation id="6326175484149238433">Elimina de Chrome</translation>
@@ -3582,7 +3582,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="8590375307970699841">Configurar actualitzacions automàtiques</translation>
 <translation id="265390580714150011">Valor del camp</translation>
 <translation id="3869917919960562512">Índex incorrecte.</translation>
-<translation id="7031962166228839643">S'està preparant el TPM; espereu (això pot trigar una estona)...</translation>
+<translation id="7031962166228839643">El mòdul TPM s'està preparant (aquest procés pot trigar una estona). Espereu...</translation>
 <translation id="769312636793844336">Per desar aquest fitxer per utilitzar-lo fora de línia, torneu a connectar-vos i&lt;br&gt;marqueu la casella de selecció <ph name="OFFLINE_CHECKBOX_NAME"/> per a aquest fitxer.</translation>
 <translation id="715118844758971915">Impressores clàssiques</translation>
 <translation id="5242724311594467048">Voleu activar &quot;<ph name="EXTENSION_NAME"/>&quot;?</translation>
@@ -3603,7 +3603,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="5321676762462132688">Si està activat, la configuració es mostrarà en una finestra nova en lloc de mostrar-se com a pestanya del navegador.</translation>
 <translation id="8986494364107987395">Envia automàticament estadístiques d'ús i informes d'error a Google</translation>
 <translation id="2377619091472055321">Restableix la configuració de <ph name="IDS_SHORT_PRODUCT_NAME"/> modificada</translation>
-<translation id="4062251648694601778">Gaudiu del vostre dispositiu <ph name="SHORT_PRODUCT_NAME"/>. Teniu cap pregunta? Podeu obtenir ajuda en qualsevol moment si feu clic al símbol ? de la safata d'estat.</translation>
+<translation id="4062251648694601778">Gaudiu del vostre dispositiu <ph name="SHORT_PRODUCT_NAME"/>. Teniu cap pregunta? Podeu obtenir ajuda en qualsevol moment fent clic al símbol ? de la safata d'estat.</translation>
 <translation id="6701535245008341853">No s'ha pogut obtenir el perfil.</translation>
 <translation id="8303655282093186569">Configuració de la introducció en pinyin</translation>
 <translation id="992779717417561630">Imprimeix mitjançant el diàleg de <ph name="CLOUD_PRINT_NAME"/>... <ph name="SHORTCUT_KEY"/></translation>
@@ -3634,7 +3634,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="3688578402379768763">Actualitzat</translation>
 <translation id="5275973617553375938">Fitxers recuperats de Google Drive</translation>
 <translation id="8213577208796878755">Hi ha disponible un altre dispositiu.</translation>
-<translation id="3445092916808119474">Fes que sigui la principal</translation>
+<translation id="3445092916808119474">Estableix com a principal</translation>
 <translation id="1012794136286421601">S'estan sincronitzant els documents, els fulls de càlcul, les diapositives i els dibuixos. Obriu l'aplicació Google Drive per accedir-hi en línia o fora de línia.</translation>
 <translation id="6374100501221763867">Desactiva la descodificació de vídeo accelerada mitjançant maquinari.</translation>
 <translation id="9101691533782776290">Inicia l'aplicació</translation>
@@ -3646,7 +3646,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="2433728760128592593">Premeu Alt + Maj per canviar entre els mètodes d'introducció.</translation>
 <translation id="1056898198331236512">Advertiment</translation>
 <translation id="5934281776477898549">Cap actualització</translation>
-<translation id="537813040452600081">Les pàgines que visualitzeu en aquesta finestra no es mostraran a l'historial del navegador i no deixaran cap altre rastre a l'ordinador, com ara galetes, després de tancar la sessió. Els fitxers que baixeu i les adreces d'interès que creeu no es conservaran.</translation>
+<translation id="537813040452600081">Les pàgines que visualitzeu en aquesta finestra no es mostraran a l'historial del navegador i no deixaran cap altre rastre a l'ordinador, com ara galetes, després de tancar la sessió. No es conservaran els fitxers que baixeu ni les adreces d'interès.</translation>
 <translation id="2608770217409477136">Fes servir la configuració predeterminada</translation>
 <translation id="3157931365184549694">Restaura</translation>
 <translation id="996250603853062861">S'està establint una connexió segura...</translation>
@@ -3707,7 +3707,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="5759272020525228995">El lloc web ha trobat un error mentre intentava recuperar <ph name="URL"/>.
         Pot ser que no estigui disponible a causa de tasques de manteniment o bé que estigui configurat de manera incorrecta.</translation>
 <translation id="4450472573074061292">Activa l'operació del directori Syncfs.</translation>
-<translation id="2946119680249604491">Afegeix connexió</translation>
+<translation id="2946119680249604491">Afegeix una connexió</translation>
 <translation id="641480858134062906">No s'ha pogut carregar <ph name="URL"/></translation>
 <translation id="3693415264595406141">Contrasenya:</translation>
 <translation id="8671210955687109937">Pot comentar</translation>
@@ -3909,7 +3909,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="2440604414813129000">Visualitza l'&amp;origen</translation>
 <translation id="816095449251911490"><ph name="SPEED"/> - <ph name="RECEIVED_AMOUNT"/>, <ph name="TIME_REMAINING"/></translation>
 <translation id="1084300930170237385">Informació sobre transparència</translation>
-<translation id="774465434535803574">Error de l'extensió de paquets</translation>
+<translation id="774465434535803574">Error de l'empaquetatge d'extensió</translation>
 <translation id="8200772114523450471">Reempren</translation>
 <translation id="5750676294091770309">Bloquejat per l'extensió</translation>
 <translation id="1302191857856401062">Permet el canvi ràpid d'usuaris al menú d'avatar.</translation>
@@ -3936,6 +3936,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="6460601847208524483">Cerca el següent</translation>
 <translation id="397703832102027365">S'està finalitzant...</translation>
 <translation id="8146177459103116374">Si ja esteu registrat en aquest dispositiu, podeu <ph name="LINK2_START"/>iniciar la sessió com a usuari existent<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Mostra les adreces d'interès gestionades</translation>
 <translation id="4856478137399998590">El servei de dades mòbil està activat i a punt per fer servir</translation>
 <translation id="3305389145870741612">El procés de format pot trigar uns quants segons. Espereu.</translation>
 <translation id="3648607100222897006">Aquestes funcions experimentals poden canviar, trencar-se o desaparèixer en qualsevol moment. No donem cap garantia sobre què pot passar si activeu algun d'aquests experiments, i fins i tot el vostre navegador es podria fregir de sobte. Bromes a part,és possible que el vostre navegador suprimeixi totes les vostres dades, o bé la seguretat i la privadesa poden estar compromeses de maneres inesperades. Qualsevol experiment que activeu s'activaran per a tots els usuaris d'aquest navegador. Continueu amb precaució.</translation>
@@ -3992,7 +3993,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="1104054824888299003">llarg</translation>
 <translation id="637062427944097960">Aquest fitxer s'ha obert en un altre escriptori. Aneu a <ph name="USER_NAME"/> (<ph name="MAIL_ADDRESS"/>) per veure'l.</translation>
 <translation id="7479479221494776793">Si continueu sense fer res, la sessió es tancarà d'aquí a <ph name="LOGOUT_TIME_LEFT"/>.</translation>
-<translation id="1465619815762735808">Clic per reproduir</translation>
+<translation id="1465619815762735808">Clic per executar</translation>
 <translation id="6941937518557314510">Inicieu la sessió a <ph name="TOKEN_NAME"/> per autenticar-vos a <ph name="HOST_NAME"/> amb el vostre certificat.</translation>
 <translation id="5850516540536751549">Aquest tipus de fitxer no és compatible. Visiteu <ph name="BEGIN_LINK"/>Chrome Web Store<ph name="END_LINK"/> per trobar una aplicació que pugui obrir aquest tipus de fitxer.
         <ph name="BEGIN_LINK_HELP"/>Més informació<ph name="END_LINK_HELP"/></translation>
@@ -4034,7 +4035,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="780301667611848630">No, gràcies</translation>
 <translation id="8209677645716428427">Un usuari supervisat pot explorar el web amb la vostra orientació. Com a administrador d'un usuari supervisat de Chrome, podeu fer el següent:</translation>
 <translation id="2812989263793994277">No mostris cap imatge</translation>
-<translation id="722363467515709460">Activa l'ampliador de pantalla</translation>
+<translation id="722363467515709460">Activa la lupa</translation>
 <translation id="7190251665563814471">Permet sempre aquests connectors a <ph name="HOST"/></translation>
 <translation id="2043684166640445160"><ph name="PRODUCT_NAME"/>
           no pot mostrar la pàgina web perquè l'equip no està connectat a Internet.</translation>
@@ -4108,9 +4109,9 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="5958529069007801266">Usuari supervisat</translation>
 <translation id="3129173833825111527">Marge esquerre</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/> K (<ph name="NUM_KILOBYTES_LIVE"/> K actius)</translation>
-<translation id="5554573843028719904">Altres xarxes Wi-Fi...</translation>
+<translation id="5554573843028719904">Una altra xarxa Wi-Fi...</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED"/>, <ph name="TIME_LEFT"/></translation>
-<translation id="7013485839273047434">Obtén més extensions</translation>
+<translation id="7013485839273047434">Baixa més extensions</translation>
 <translation id="2124335647227850314">Desactiva el calibratge de color de la pantalla encara que la pantalla admeti aquesta funció.</translation>
 <translation id="428565720843367874">S'ha produït un error inesperat en el programari antivirus mentre s'escanejava aquest fitxer.</translation>
 <translation id="7709152031285164251">Error: <ph name="INTERRUPT_REASON"/></translation>
@@ -4198,7 +4199,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="189358972401248634">Altres idiomes</translation>
 <translation id="721197778055552897"><ph name="BEGIN_LINK"/>Més informació<ph name="END_LINK"/> sobre aquest problema.</translation>
 <translation id="1699395855685456105">Revisió de maquinari:</translation>
-<translation id="4699172675775169585">Imatges i fitxers a la memòria cau</translation>
+<translation id="4699172675775169585">Imatges i fitxers emmagatzemats a la memòria cau</translation>
 <translation id="6680028776254050810">Canvia els usuaris</translation>
 <translation id="2908789530129661844">Allunya la pantalla</translation>
 <translation id="212464871579942993">El lloc web de <ph name="HOST_NAME"/> conté elements de llocs que semblen allotjar programari maliciós, és a dir, programari que pot malmetre l'equip o operar sense el vostre consentiment. El sol fet de visitar un lloc que allotgi aquest tipus de programari pot infectar el vostre equip. El lloc web en qüestió també allotja contingut de llocs que han estat detectats com a llocs de &quot;pesca&quot; (suplantació d'identitat). Els llocs de pesca enganyen els usuaris perquè proporcionin informació personal o financera i sovint fingeixen que són institucions de confiança, com ara entitats bancàries.</translation>
@@ -4244,9 +4245,9 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="736108944194701898">Velocitat del ratolí:</translation>
 <translation id="4350711002179453268">No es pot establir una connexió segura amb el servidor. Pot tractar-se d'un problema del servidor o és possible que es necessiti un certificat d'autenticació de client que no teniu.</translation>
 <translation id="750509436279396091">Obre la carpeta de baixades</translation>
-<translation id="5963026469094486319">Obtén temes</translation>
+<translation id="5963026469094486319">Cerca temes</translation>
 <translation id="7586312264284919041">Voleu traduir aquesta pàgina?</translation>
-<translation id="3855072293748278406">Accés del connector fora del sandbox</translation>
+<translation id="3855072293748278406">Accés del connector sense zona de proves</translation>
 <translation id="8357224663288891423">Tecles de drecera per a extensions i aplicacions</translation>
 <translation id="1893137424981664888">No hi ha connectors instal·lats.</translation>
 <translation id="4919810557098212913"><ph name="HOST"/> vol fer servir la vostra càmera.</translation>
@@ -4285,7 +4286,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="6040143037577758943">Tanca</translation>
 <translation id="5787146423283493983">Acord de clau</translation>
 <translation id="4265682251887479829">No trobeu el que esteu cercant?</translation>
-<translation id="216169395504480358">Afegeix Wi-Fi...</translation>
+<translation id="216169395504480358">Afegeix una Wi-Fi...</translation>
 <translation id="1804251416207250805">Desactiva l'enviament de pings per fer auditories d'enllaços.</translation>
 <translation id="5116628073786783676">De&amp;sa l'àudio com a...</translation>
 <translation id="6172346010137455972">Ja esteu a punt.</translation>
@@ -4308,7 +4309,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="3489444618744432220">Permès per la política</translation>
 <translation id="3925247638945319984">No teniu registres de WebRTC capturats recentment.</translation>
 <translation id="6626108645084335023">Estem esperant a realitzar una investigació de DNS.</translation>
-<translation id="1903219944620007795">Per l'entrada de text, seleccioneu un idioma per veure els mètodes d'entrada disponibles.</translation>
+<translation id="1903219944620007795">Seleccioneu un idioma per veure els mètodes d'introducció de text disponibles.</translation>
 <translation id="1850508293116537636">Gira en el sentit de les &amp;agulles del rellotge</translation>
 <translation id="76113267417806263">Sí, ho confirmo</translation>
 <translation id="7209475358897642338">Quin és el vostre idioma?</translation>
@@ -4319,7 +4320,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="8140778357236808512">Importa un usuari supervisat existent</translation>
 <translation id="6953992620120116713">Protocol HTTPS sobre QUIC experimental.</translation>
 <translation id="8737260648576902897">Instal·la Adobe Reader</translation>
-<translation id="7876243839304621966">Elimina-ho tot</translation>
+<translation id="7876243839304621966">Suprimeix-ho tot</translation>
 <translation id="5663459693447872156">Canvia automàticament a mitja amplada</translation>
 <translation id="8900820606136623064">Hongarès</translation>
 <translation id="495931528404527476">A Chrome</translation>
@@ -4363,7 +4364,8 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="9086302186042011942">Sincronització</translation>
 <translation id="6869402422344886127">Casella de selecció activada</translation>
 <translation id="3428010780253032925">Desactiva la focalització basada en rectangles a les visualitzacions</translation>
-<translation id="5637380810526272785">Mètode d'entrada</translation>
+<translation id="5637380810526272785">Mètode d'introducció de text</translation>
+<translation id="3613134908380545408">Mostra <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">S'ha hagut de tornar a intentar la connexió mitjançant una versió anterior del protocol TLS o SSL. Generalment, això vol dir que el servidor utilitza un programari molt antic i és possible que tingui altres problemes de seguretat.</translation>
 <translation id="404928562651467259">ADVERTIMENT</translation>
 <translation id="4289300219472526559">Comença a parlar</translation>
@@ -4433,7 +4435,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="8148264977957212129">Mètode d'entrada de pinyin</translation>
 <translation id="2288278176040912387">Tocadiscos</translation>
 <translation id="7772032839648071052">Confirmeu la frase de contrasenya</translation>
-<translation id="3676582787770338561">Activa el desbloqueig fàcil per a aquest dispositiu <ph name="DEVICE_TYPE"/></translation>
+<translation id="3676582787770338561">Activa Desbloqueig fàcil per a aquest <ph name="DEVICE_TYPE"/></translation>
 <translation id="2871813825302180988">Aquest compte ja s'utilitza en aquest dispositiu.</translation>
 <translation id="1642505962779453775">El darrer trimestre</translation>
 <translation id="3323235640813116393">Activa l'opció per desar pàgines com a MHTML: un únic fitxer de text que conté HTML i tots els subrecursos.</translation>
@@ -4696,6 +4698,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="6934265752871836553">Utilitzeu el codi de risc alt perquè Chrome recuperi contingut amb més rapidesa. És molt probable
         que els canvis d'aquest camí trenquin molt de contingut.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Obre sempre a Adobe Reader</translation>
 <translation id="8274359292107649245">Obre Chrome a l'escriptori</translation>
 <translation id="1571119610742640910">Composició per a fons d'arrel fixa</translation>
 <translation id="6514565641373682518">Aquesta pàgina ha desactivat el cursor del ratolí.</translation>
@@ -4739,7 +4742,7 @@ Assegureu-vos que no es mostri informació confidencial.</translation>
 <translation id="2739842825616753233">Pregunta'm quan un lloc requereixi l'accés a la càmera i al micròfon (opció recomanada)</translation>
 <translation id="8940081510938872932">L'equip està fent massa coses en aquests moments. Torneu-ho a provar més tard.</translation>
 <translation id="8848709220963126773">Canvi de mode amb la tecla Maj</translation>
-<translation id="6316806695097060329">El dispositiu <ph name="SHORT_PRODUCT_NAME"/> s'ha dissenyat per proporcionar-vos la millor experiència del web.</translation>
+<translation id="6316806695097060329">El dispositiu <ph name="SHORT_PRODUCT_NAME"/> s'ha dissenyat per proporcionar-vos la millor experiència possible al web.</translation>
 <translation id="49122815993216733">Error de càrrega d'extensions</translation>
 <translation id="3241720467332021590">Irlandès</translation>
 <translation id="8828933418460119530">Nom DNS</translation>
@@ -4810,7 +4813,7 @@ Premeu qualsevol tecla per continuar explorant.</translation>
 <translation id="5830720307094128296">Anomena i desa la pà&amp;gina...</translation>
 <translation id="2448312741937722512">Tipus</translation>
 <translation id="2568958845983666692">Kilobytes</translation>
-<translation id="5209320130288484488">No s'han trobat dispositius</translation>
+<translation id="5209320130288484488">No s'ha trobat cap dispositiu</translation>
 <translation id="473221644739519769">Afegir impressores a Google Cloud Print us permet imprimir des de qualsevol lloc i a qualsevol lloc. Compartiu les impressores amb qui vulgueu i imprimiu-hi des de Chrome, des del telèfon, des de la tauleta, des de l'ordinador o des de qualsevol altre dispositiu connectat al web.</translation>
 <translation id="6154080734794712683">Una extensió ha canviat la pàgina que es mostra quan feu clic al botó Inici.</translation>
 <translation id="4668954208278016290">S'ha produït un problema en extreure la imatge a l'equip.</translation>
@@ -4871,7 +4874,7 @@ Premeu qualsevol tecla per continuar explorant.</translation>
 <translation id="8941882480823041320">Paraula anterior</translation>
 <translation id="2489435327075806094">Velocitat del punter:</translation>
 <translation id="2574102660421949343">S'admeten les galetes de <ph name="DOMAIN"/>.</translation>
-<translation id="2773948261276885771">Estableix pàgines</translation>
+<translation id="2773948261276885771">Estableix les pàgines</translation>
 <translation id="3688526734140524629">Canvia el canal</translation>
 <translation id="3270847123878663523">&amp;Desfés el canvi d'ordre</translation>
 <translation id="4959447747655704388">Si enteneu els riscos que suposa per a la vostra seguretat, podeu <ph name="BEGIN_LINK"/>visitar aquest lloc infectat<ph name="END_LINK"/>.</translation>
@@ -4891,6 +4894,7 @@ Premeu qualsevol tecla per continuar explorant.</translation>
 <translation id="824543159844843373">Activa el tercer element de la barra d'execució ràpida</translation>
 <translation id="3819800052061700452">&amp;Pantalla completa</translation>
 <translation id="48607902311828362">Mode d'avió</translation>
+<translation id="711840821796638741">Mostra les adreces d'interès gestionades</translation>
 <translation id="3360297538363969800">Hi ha hagut un error en imprimir. Comproveu la impressora i torneu-ho a provar.</translation>
 <translation id="680572642341004180">Activa el seguiment RLZ a <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Deixeu d'utilitzar el carregador que se us ha demanat que torneu.</translation>
@@ -4947,7 +4951,7 @@ Premeu qualsevol tecla per continuar explorant.</translation>
 <translation id="1088086359088493902">Segons</translation>
 <translation id="73289266812733869">Ja no està seleccionat</translation>
 <translation id="1758230322558024056">Feu-hi clic o digueu &quot;Ok, Google&quot; per començar la cerca per veu</translation>
-<translation id="8639963783467694461">Configuració de l'Emplenament automàtic</translation>
+<translation id="8639963783467694461">Configuració d'Emplenament automàtic</translation>
 <translation id="2951247061394563839">Finestra central</translation>
 <translation id="3435738964857648380">Seguretat</translation>
 <translation id="9112987648460918699">Cerca...</translation>
@@ -5083,7 +5087,7 @@ Voleu acceptar?</translation>
 <translation id="8512476990829870887">Finalitza el procés</translation>
 <translation id="4121428309786185360">Caduca el</translation>
 <translation id="3406605057700382950">&amp;Mostra la Barra d'adreces d'interès</translation>
-<translation id="6807889908376551050">Mostra-les totes...</translation>
+<translation id="6807889908376551050">Mostra-ho tot...</translation>
 <translation id="962416441122492777">Completar l'inici de sessió</translation>
 <translation id="2049137146490122801">El vostre administrador ha desactivat l'accés als fitxers locals del vostre equip.</translation>
 <translation id="225240747099314620">Permet els identificadors per a contingut protegit (és possible que calgui reiniciar l'ordinador)</translation>
@@ -5108,7 +5112,7 @@ Voleu acceptar?</translation>
 <translation id="4645676300727003670">&amp;Conserva-ho</translation>
 <translation id="3225579507836276307">Una extensió de tercers ha bloquejat l'accés a aquesta pàgina web.</translation>
 <translation id="6815551780062710681">edita</translation>
-<translation id="6911468394164995108">Uneix-te a una altra...</translation>
+<translation id="6911468394164995108">Connecta't a una altra xarxa...</translation>
 <translation id="2510708650472996893">Color del perfil:</translation>
 <translation id="343467364461911375">Alguns serveis de contingut utilitzen els identificadors de màquina per identificar-vos de manera exclusiva amb la finalitat d'autoritzar l'accés al contingut protegit.</translation>
 <translation id="5061708541166515394">Contrast</translation>
@@ -5116,7 +5120,7 @@ Voleu acceptar?</translation>
 <translation id="2087822576218954668">Impressió: <ph name="PRINT_NAME"/></translation>
 <translation id="747459581954555080">Restaura'ls tots</translation>
 <translation id="7602079150116086782">Cap pestanya d'altres dispositius</translation>
-<translation id="7167486101654761064">Obre &amp;sempre els fitxers d'aquest tipus</translation>
+<translation id="7167486101654761064">&amp;Obre sempre els fitxers d'aquest tipus</translation>
 <translation id="6218364611373262432">Restableix l'estat d'instal·lació del Menú d'aplicacions en cada reinici. Mentre estigui activada aquesta opció, Chrome oblidarà que el menú s'ha instal·lat cada vegada que s'iniciï. Aquesta opció s'utilitza per fer proves al flux d'instal·lació del Menú d'aplicacions.</translation>
 <translation id="4396124683129237657">Targeta de crèdit nova...</translation>
 <translation id="4103763322291513355">Visiteu &lt;strong&gt;chrome://policy&lt;/strong&gt; per veure la llista d'URL inclosos a la llista negra i altres polítiques aplicades per l'administrador del sistema.</translation>
@@ -5132,7 +5136,7 @@ Voleu acceptar?</translation>
 <translation id="9013587737291179248">L'usuari supervisat no s'ha pogut importar. Comproveu l'espai disponible a la unitat de disc dur, els permisos i torneu-ho a provar.</translation>
 <translation id="7254951428499890870">Confirmeu que voleu iniciar &quot;<ph name="APP_NAME"/>&quot; en mode de diagnòstic?</translation>
 <translation id="4462159676511157176">Servidors de noms personalitzats</translation>
-<translation id="4575703660920788003">Premeu Maj i Alt per canviar el disseny del teclat.</translation>
+<translation id="4575703660920788003">Premeu Maj + Alt per canviar el disseny del teclat.</translation>
 <translation id="7240120331469437312">Nom alternatiu del subjecte del certificat</translation>
 <translation id="2669198762040460457">El nom d'usuari o la contrasenya que heu introduït no són correctes.</translation>
 <translation id="5849626805825065073">Si aquesta opció està desactivada, el text es renderitza amb antialiàsing en escala de grisos en lloc de LCD (subpíxels) en dur a terme la composició accelerada.</translation>
@@ -5164,7 +5168,7 @@ Voleu acceptar?</translation>
 <translation id="5284518706373932381">Torneu a aquest lloc web d'aquí a unes quantes hores. Navegació segura de Google ha <ph name="BEGIN_LINK"/>detectat programari maliciós<ph name="END_LINK"/> recentment a <ph name="SITE"/>. De vegades, els llocs web que acostumen a ser segurs s'infecten amb programari maliciós.</translation>
 <translation id="969892804517981540">Muntatge oficial</translation>
 <translation id="1691608011302982743">Heu retirat el dispositiu massa aviat.</translation>
-<translation id="445923051607553918">Uneix-me a una xarxa Wi-Fi</translation>
+<translation id="445923051607553918">Connexió a una xarxa Wi-Fi</translation>
 <translation id="1898137169133852367">Una operació Powerwash restableix el dispositiu <ph name="IDS_SHORT_PRODUCT_NAME"/> i el deixa com si fos nou. A més, el dispositiu farà el canvi a una actualització anterior de <ph name="IDS_SHORT_PRODUCT_NAME"/>.</translation>
 <translation id="4215898373199266584">El mode d'incògnit, <ph name="INCOGNITO_MODE_SHORTCUT"/>, us pot resultar pràctic la propera vegada.</translation>
 <translation id="1048597748939794622">Activat per força per a totes les capes</translation>
@@ -5181,7 +5185,7 @@ Voleu acceptar?</translation>
 <translation id="4377301101584272308">Permet que tots els llocs facin un seguiment de la meva ubicació física</translation>
 <translation id="2742870351467570537">Suprimeix els elements seleccionats</translation>
 <translation id="7561196759112975576">Sempre</translation>
-<translation id="2116673936380190819">l'última hora</translation>
+<translation id="2116673936380190819">fa una hora</translation>
 <translation id="5765491088802881382">No hi ha cap xarxa disponible</translation>
 <translation id="4119705021348785607">No sou l'usuari <ph name="PROFILE_DISPLAY_NAME"/>?</translation>
 <translation id="6941427089482296743">Suprimeix totes les que es mostren</translation>
index a899ea7..6dbaa5c 100644 (file)
@@ -516,7 +516,7 @@ Tyto i další pokyny naleznete v e-mailu, který byl odeslán na adresu <ph nam
 <translation id="413121957363593859">Komponenty</translation>
 <translation id="715487527529576698">Výchozí režim čínštiny je zjednodušená čínština</translation>
 <translation id="6522350652862471760">Aktivovat název a ikonu profilu Google</translation>
-<translation id="6181259999130430430">Povolit pro toto zařízení Snadné odemknutí</translation>
+<translation id="6181259999130430430">Povolit pro toto zařízení snadné odemknutí</translation>
 <translation id="8703575177326907206">Vaše spojení se serverem <ph name="DOMAIN"/> není šifrované.</translation>
 <translation id="6135622770221372891">ID kanálu</translation>
 <translation id="8472623782143987204">hardwarová</translation>
@@ -2183,7 +2183,7 @@ Dejte pozor, abyste mu nezpřístupnili žádné citlivé informace.</translatio
 <translation id="8758455334359714415">Integrovaný asynchronní klient DNS</translation>
 <translation id="5585912436068747822">Formátování se nezdařilo</translation>
 <translation id="8766796754185931010">Kotoeri</translation>
-<translation id="6357619544108132570">Vítejte v rodině produktů <ph name="SHORT_PRODUCT_NAME"/>. Toto není žádný obyčejný počítač.</translation>
+<translation id="6357619544108132570">Vítejte v rodině produktů <ph name="SHORT_PRODUCT_NAME"/>. Nejedná se o obyčejný počítač.</translation>
 <translation id="7786207843293321886">Odhlásit hosta</translation>
 <translation id="3359256513598016054">Omezení zásad certifikátu</translation>
 <translation id="4433914671537236274">Vytvoření média pro obnovení operačního systému</translation>
@@ -3323,7 +3323,7 @@ Zde poskytnutý diagnostický nástroj na řešení problémů s připojením v
 <translation id="5917011688104426363">Přepnout na adresní řádek v režimu vyhledávání</translation>
 <translation id="3269101346657272573">Zadejte kód PIN.</translation>
 <translation id="2822854841007275488">Arabština</translation>
-<translation id="6559948977408379772">Tato ikona se zobrazí, když jste s telefonem poblíž a je k dispozici Snadné odemknutí. Ke vstupu stačí kliknout, není potřeba zadávat heslo.</translation>
+<translation id="6559948977408379772">Tato ikona se zobrazí, když jste s telefonem poblíž a je k dispozici snadné odemknutí. Ke vstupu stačí kliknout, není potřeba zadávat heslo.</translation>
 <translation id="5857090052475505287">Nová složka</translation>
 <translation id="7450732239874446337">Funkce vstupu a výstupu sítě byly pozastaveny.</translation>
 <translation id="4003393903129308792">Povolit rasterizátor s jednou kopií</translation>
@@ -3443,7 +3443,7 @@ Zde poskytnutý diagnostický nástroj na řešení problémů s připojením v
 <translation id="1526560967942511387">Dokument bez názvu</translation>
 <translation id="3979748722126423326">Aktivovat <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA nebo RSN)</translation>
-<translation id="7561031016893995297">Zařízení pro Snadné odemknutí můžete spravovat v nastavení účtu.</translation>
+<translation id="7561031016893995297">Zařízení se snadným odemknutím můžete spravovat v nastavení účtu.</translation>
 <translation id="2238379619048995541">Data o stavu frekvence</translation>
 <translation id="4367133129601245178">K&amp;opírovat adresu URL obrázku</translation>
 <translation id="6326175484149238433">Odstranit z Chromu</translation>
@@ -3941,6 +3941,7 @@ Zde poskytnutý diagnostický nástroj na řešení problémů s připojením v
 <translation id="6460601847208524483">Najít další</translation>
 <translation id="397703832102027365">Dokončování...</translation>
 <translation id="8146177459103116374">V tomto zařízení jste již zaregistrováni. Můžete se <ph name="LINK2_START"/>přihlásit jako stávající uživatel<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Zobrazit spravované záložky</translation>
 <translation id="4856478137399998590">Datové služby jsou aktivovány a můžete je začít používat</translation>
 <translation id="3305389145870741612">Proces formátování může trvat několik sekund. Čekejte prosím.</translation>
 <translation id="3648607100222897006">Tyto experimentální funkce se mohou kdykoli změnit, zhroutit nebo zmizet. Nemůžeme vůbec zaručit, co se po zapnutí těchto experimentů stane. Prohlížeč může například samovolně vybouchnout. Ale bez legrace: Prohlížeč může smazat veškeré vaše údaje nebo neočekávanými způsoby narušit vaše zabezpečení či soukromí. Experimenty, které zapnete, budou k dispozici všem uživatelům prohlížeče. Buďte prosím obezřetní.</translation>
@@ -4372,6 +4373,7 @@ Zde poskytnutý diagnostický nástroj na řešení problémů s připojením v
 <translation id="6869402422344886127">Označené zaškrtávací políčko</translation>
 <translation id="3428010780253032925">Deaktivovat v zobrazeních cílení založené na obdélnících</translation>
 <translation id="5637380810526272785">Metoda zadávání dat</translation>
+<translation id="3613134908380545408">Zobrazit <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Pokus o připojení musel proběhnout znovu pomocí starší verze protokolu TLS nebo SSL. Obvykle to znamená, že server používá zastaralý software a může mít další problémy se zabezpečením.</translation>
 <translation id="404928562651467259">UPOZORNĚNÍ</translation>
 <translation id="4289300219472526559">Začít mluvit</translation>
@@ -4440,7 +4442,7 @@ Zde poskytnutý diagnostický nástroj na řešení problémů s připojením v
 <translation id="8148264977957212129">Metoda zadávání textu Pinyin</translation>
 <translation id="2288278176040912387">Gramofon</translation>
 <translation id="7772032839648071052">Potvrďte přístupové heslo</translation>
-<translation id="3676582787770338561">Povolit pro toto zařízení <ph name="DEVICE_TYPE"/> funkci Snadné odemknutí.</translation>
+<translation id="3676582787770338561">Povolit pro toto zařízení <ph name="DEVICE_TYPE"/> funkci snadného odemknutí.</translation>
 <translation id="2871813825302180988">Tento účet je v tomto zařízení již používán.</translation>
 <translation id="1642505962779453775">Poslední tři měsíce</translation>
 <translation id="3323235640813116393">Aktivuje ukládání stránek ve formátu MHTML, tj. do jednoho textového souboru s kódem HTML a všemi dílčími zdroji.</translation>
@@ -4703,6 +4705,7 @@ Výpočet času zbývajícího do úplného nabití</translation>
 <translation id="2859369953631715804">Vyberte mobilní síť</translation>
 <translation id="6934265752871836553">Aktivuje použití experimentálního nového kódu, který v Chromu zrychlí vykreslování obsahu. Kvůli změnám v této trase se pravděpodobně hodně obsahu nezobrazí správně.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Vždy otevřít v aplikaci Adobe Reader</translation>
 <translation id="8274359292107649245">Spustit Chrome na klasické ploše</translation>
 <translation id="1571119610742640910">Skládání pro pozadí s fixním kořenovým adresářem</translation>
 <translation id="6514565641373682518">Tato stránka deaktivovala ukazatel myši.</translation>
@@ -4902,6 +4905,7 @@ Chcete-li pokračovat v práci, stiskněte libovolnou klávesu.</translation>
 <translation id="824543159844843373">Aktivovat 3. položku spouštěče</translation>
 <translation id="3819800052061700452">&amp;Celá obrazovka</translation>
 <translation id="48607902311828362">Režim V letadle</translation>
+<translation id="711840821796638741">Zobrazit spravované záložky</translation>
 <translation id="3360297538363969800">Tisk se nezdařil. Zkontrolujte tiskárnu a zkuste to znovu.</translation>
 <translation id="680572642341004180">Aktivovat v systému <ph name="SHORT_PRODUCT_OS_NAME"/> sledování RLZ.</translation>
 <translation id="688797901999351107">Přestaňte prosím používat nabíječky, kterých se tento problém týká.</translation>
@@ -5142,7 +5146,7 @@ Přijímáte?</translation>
 <translation id="9013587737291179248">Jejda, dozorovaného uživatele nebylo možné importovat. Zkontrolujte místo na disku a oprávnění a zkuste to znovu.</translation>
 <translation id="7254951428499890870">Opravdu chcete aplikaci <ph name="APP_NAME"/> spustit v diagnostickém režimu?</translation>
 <translation id="4462159676511157176">Vlastní názvové servery</translation>
-<translation id="4575703660920788003">Rozložení klávesnice změníte stisknutím kláves Shift+Alt</translation>
+<translation id="4575703660920788003">Rozložení klávesnice změníte stisknutím kláves Shift+Alt.</translation>
 <translation id="7240120331469437312">Alternativní název subjektu certifikátu</translation>
 <translation id="2669198762040460457">Zadané uživatelské jméno nebo heslo je nesprávné.</translation>
 <translation id="5849626805825065073">Pokud je možnost deaktivována, při zrychleném skládání bude text vykreslen s antialiasingem ve stupních šedi, nikoli v režimu LCD (pomocí subpixelů).</translation>
index b9980b7..abf291b 100644 (file)
@@ -16,7 +16,7 @@
 <translation id="9048642391959913289">Hurtigere implementering af teksttilpasning.</translation>
 <translation id="2345460471437425338">Forkert certifikat til vært.</translation>
 <translation id="3688507211863392146">Skrive til filer og mapper, som du åbner i applikationen</translation>
-<translation id="3595596368722241419">Batteri fuldt</translation>
+<translation id="3595596368722241419">Batteri helt opladet</translation>
 <translation id="8098352321677019742"><ph name="PRODUCT_NAME"/>-underretninger</translation>
 <translation id="3566021033012934673">Din forbindelse er ikke privat</translation>
 <translation id="3228679360002431295">Opretter forbindelse og verificerer<ph name="ANIMATED_ELLIPSIS"/></translation>
@@ -43,7 +43,7 @@
 <translation id="3581034179710640788">Sikkerhedscertifikatet for dette website er udløbet!</translation>
 <translation id="2825758591930162672">Emnets offentlige nøgle</translation>
 <translation id="6370351608045086850">Aktivér understøttelse af overscrolling på virtuelt tastatur.</translation>
-<translation id="5137501176474113045">Slet denne vare</translation>
+<translation id="5137501176474113045">Slet dette element</translation>
 <translation id="8275038454117074363">Importer</translation>
 <translation id="8418445294933751433">&amp;Vis som fane</translation>
 <translation id="6985276906761169321">Id:</translation>
 <translation id="2972581237482394796">&amp;Annuller fortryd</translation>
 <translation id="5895138241574237353">Genstart</translation>
 <translation id="7012312584667795941">Identiteten af <ph name="ORGANIZATION"/> beliggende i <ph name="LOCALITY"/> er bekræftet af <ph name="ISSUER"/>, men virksomhedens dokumenter til offentlig revision kunne ikke bekræftes.</translation>
-<translation id="7113502843173351041">Kend din e-mailadresse</translation>
+<translation id="7113502843173351041">Kende din e-mailadresse</translation>
 <translation id="3726463242007121105">Denne enhed kan ikke åbnes, fordi dens filsystem ikke understøttes.</translation>
 <translation id="5606674617204776232"><ph name="PEPPER_PLUGIN_NAME"/> på <ph name="PEPPER_PLUGIN_DOMAIN"/> vil gerne have adgang til din enhed.</translation>
 <translation id="9008201768610948239">Ignorer</translation>
 <translation id="8804398419035066391">Kommunikere med andre websites</translation>
 <translation id="6023914116273780353">Tilpassede</translation>
 <translation id="7082055294850503883">Ignorer som standard CapsLock og indtastning af små bogstaver</translation>
-<translation id="4989966318180235467">Inspicer &amp;baggrundsside</translation>
+<translation id="4989966318180235467">Undersøg &amp;baggrundsside</translation>
 <translation id="4744603770635761495">Eksekverbar sti</translation>
 <translation id="3719826155360621982">Startside</translation>
 <translation id="5376169624176189338">Klik for at gå tilbage. Hold knappen inde for at se historikken.</translation>
 <translation id="2296019197782308739">EAP-metode:</translation>
 <translation id="42981349822642051">Udvid</translation>
 <translation id="7774497835322490043">Aktivér GDB-fejlfindingsstub. Dette vil stoppe en Native Client-applikationen ved opstart og vente på, at nacl-gdb (fra NaCl SDK) knytter sig til den.</translation>
-<translation id="1005274289863221750">Brug din mikrofon og dit kamera</translation>
+<translation id="1005274289863221750">Bruge din mikrofon og dit kamera</translation>
 <translation id="2686444421126615064">Se konto</translation>
 <translation id="9215293857209265904">&quot;<ph name="EXTENSION_NAME"/>&quot; er tilføjet</translation>
 <translation id="7693221960936265065">altid</translation>
 <translation id="6075880972317537864">Hackere på <ph name="BEGIN_BOLD"/><ph name="SITE"/><ph name="END_BOLD"/> vil muligvis forsøge at narre dig for at stjæle dine oplysninger (f.eks. adgangskoder, beskeder eller kreditkortoplysninger).</translation>
 <translation id="971058943242239041">Aktiverer brug af HTML-elementer til &quot;vinduesstyring&quot; i pakkede apps.</translation>
 <translation id="7377169924702866686">Caps Lock er slået til.</translation>
-<translation id="2565670301826831948">Hastighed for Touchpad:</translation>
+<translation id="2565670301826831948">Hastighed for touchpad:</translation>
 <translation id="7348093485538360975">Skærmtastatur</translation>
 <translation id="8178665534778830238">Indhold:</translation>
 <translation id="2610260699262139870">Fa&amp;ktisk størrelse</translation>
 <translation id="7982789257301363584">Netværk</translation>
 <translation id="2271281383664374369">Udvidelsesanmodninger til denne webadresse er blevet midlertidigt tilbageholdt.</translation>
 <translation id="8528962588711550376">Logger ind...</translation>
-<translation id="2336228925368920074">Føj alle faner til Bogmærker...</translation>
+<translation id="2336228925368920074">Tilføj alle faner som bogmærker...</translation>
 <translation id="8774934320277480003">Topmargen</translation>
 <translation id="1390548061267426325">Åbn som almindelig fane</translation>
 <translation id="8821003679187790298">Aktivér en forenklet og forbedret oplevelse i fuld skærm på Mac.</translation>
 <translation id="521582610500777512">Billede blev kasseret</translation>
 <translation id="762917759028004464"><ph name="BROWSER_NAME"/> er i øjeblikket din standardbrowser.</translation>
 <translation id="7740287852186792672">Søgeresultater</translation>
-<translation id="218492098606937156">Aktivér berøringsbegivenheder</translation>
+<translation id="218492098606937156">Aktivér berøringshændelser</translation>
 <translation id="300544934591011246">Forrige adgangskode</translation>
 <translation id="6015796118275082299">År</translation>
 <translation id="8106242143503688092">Indlæs ikke (anbefales)</translation>
 <translation id="2647434099613338025">Tilføj sprog</translation>
-<translation id="5733490203338352042">Medtag adresser fra dit kort med kontaktpersoner</translation>
+<translation id="5733490203338352042">Inkluder adresser fra dit kort med kontaktpersoner</translation>
 <translation id="5078796286268621944">Forkert pinkode</translation>
 <translation id="3480411814272635771">Forekomster, hvor en fane ikke svarede</translation>
 <translation id="8487678622945914333">Zoom ind</translation>
 <translation id="2179052183774520942">Tilføj søgemaskine</translation>
 <translation id="4043223219875055035">Log ind med din Google-konto for at tillade, at apps synkroniserer indstillinger og leverer andre tilpassede tjenester.</translation>
 <translation id="5498951625591520696">Der kunne ikke oprettes til serveren.</translation>
-<translation id="1621207256975573490">Gem ramme &amp;som ...</translation>
+<translation id="1621207256975573490">Gem ramme &amp;som...</translation>
 <translation id="173215889708382255">Del din skærm – <ph name="APP_NAME"/></translation>
 <translation id="4681260323810445443">Du har ikke adgang til websiden på <ph name="URL"/>. Du er muligvis nødt til at logge ind.</translation>
 <translation id="7207605296944356446">Mikrosekunder</translation>
 <translation id="660380282187945520">F9</translation>
 <translation id="8876215549894133151">Format:</translation>
 <translation id="8860454412039442620">Excel-regneark</translation>
-<translation id="5234764350956374838">Annuller</translation>
+<translation id="5234764350956374838">Luk</translation>
 <translation id="5245965967288377800">WiMAX-netværk</translation>
 <translation id="40027638859996362">Flytning af ord</translation>
 <translation id="3522708245912499433">Portugisisk</translation>
 <translation id="8158300065514217730">Log ind for at importere administrerede brugere</translation>
 <translation id="2789486458103222910">OK</translation>
 <translation id="4792711294155034829">&amp;Rapporter et problem...</translation>
-<translation id="5819484510464120153">Opret &amp;programgenveje ...</translation>
+<translation id="5819484510464120153">Opret a&amp;ppgenveje...</translation>
 <translation id="3088325635286126843">&amp;Omdøb...</translation>
 <translation id="5376931455988532197">Filen er for stor</translation>
 <translation id="5397578532367286026">Denne brugers forbrug og historik kan ses af administratoren (<ph name="MANAGER_EMAIL"/>) på chrome.com.</translation>
 <translation id="7501143156951160001">Hvis du ikke har en Google-konto, kan du <ph name="LINK_START"/>oprette en Google-konto<ph name="LINK_END"/> nu.</translation>
 <translation id="4950138595962845479">Indstillinger...</translation>
 <translation id="4653235815000740718">Der opstod et problem under oprettelsen af genoprettelsesmediet til operativsystemet. Den brugte lagerenhed kunne ikke findes.</translation>
-<translation id="1407489512183974736">Centreret beskåret</translation>
+<translation id="1407489512183974736">Centrér, beskær</translation>
 <translation id="6426222199977479699">SSL-Fejl</translation>
 <translation id="2688196195245426394">Fejl ved registrering af enheden med serveren: <ph name="CLIENT_ERROR"/>.</translation>
 <translation id="667115622929458276">Inkognitodownloads er i øjeblikket i gang. Vil du afslutte inkognitotilstand og annullere downloads?</translation>
 <translation id="9050666287014529139">Adgangssætning</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="8787254343425541995">Tillad proxyer til delte netværk</translation>
-<translation id="4755860829306298968">Administrer blokering af plugins ...</translation>
+<translation id="4755860829306298968">Administrer blokering af plugins...</translation>
 <translation id="8879284080359814990">&amp;Vis som fane</translation>
 <translation id="4314714876846249089"><ph name="PRODUCT_NAME"/>
           har problemer med at få adgang til netværket.
 <translation id="5707185214361380026">Det var ikke muligt at indlæse udvidelsen fra:</translation>
 <translation id="7331786426925973633">En webbrowser, som er skabt til hurtighed, enkelhed og sikkerhed</translation>
 <translation id="5584537427775243893">Importerer</translation>
-<translation id="4779735050989188948">Manipuler de indstillinger, som styrer websites' adgang til cookies, JavaScript og plug-ins</translation>
+<translation id="4779735050989188948">Manipulere de indstillinger, som styrer websites' adgang til cookies, JavaScript og plug-ins</translation>
 <translation id="168841957122794586">Servercertifikatet indeholder en svag kryptografisk nøgle.</translation>
 <translation id="4181841719683918333">Sprog</translation>
 <translation id="1758831820837444715">Konfigurer Ethernet-netværk</translation>
 <translation id="2617604345341980855">Selv hvis du tidligere har besøgt dette website uden problemer, vil et besøg nu med stor sandsynlighed resultere i, at din enhed inficeres med malware.</translation>
 <translation id="2038896902310685531">Ups! <ph name="WALLET_ERROR"/> Du kan gennemføre denne transaktion uden Google Wallet.</translation>
 <translation id="3925573269917483990">Kamera:</translation>
-<translation id="3170072451822350649">Du kan også springe login over og <ph name="LINK_START"/>browse som gæst<ph name="LINK_END"/>.</translation>
+<translation id="3170072451822350649">Du kan også springe login over og <ph name="LINK_START"/>anvende som gæst<ph name="LINK_END"/>.</translation>
 <translation id="8390449457866780408">Serveren er utilgængelig.</translation>
 <translation id="5098629044894065541">Hebraisk</translation>
 <translation id="2609896558069604090">Opret genveje...</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="4120329147617730038">En administrator har afvist samlet login fra flere konti for <ph name="USER_EMAIL"/>. Alle brugere skal logge ud for at fortsætte.</translation>
 <translation id="946914425737677270">Adgangskoder, der er gemt i Mac OS X Keychain, bliver brugt til at hjælpe dig med at logge ind uden at indtaste noget.</translation>
-<translation id="8584280235376696778">&amp;Åbn video i ny fane</translation>
+<translation id="8584280235376696778">&amp;Åbn video  ny fane</translation>
 <translation id="2845382757467349449">Vis altid bogmærkelinjen</translation>
 <translation id="3053013834507634016">Brug af certifikatnøgle</translation>
 <translation id="1155128971867755382">Jeg er indforstået med, at det kan skade min enhed, hvis jeg besøger dette website.</translation>
 <translation id="2152580633399033274">Vis alle billeder (anbefales)</translation>
 <translation id="5618075537869101857">Kioskapplikationen kunne desværre ikke startes.</translation>
 <translation id="6196041699996825846">Få flere oplysninger om gæstesession</translation>
-<translation id="337286756654493126">Læs mapper, som du åbner i applikationen</translation>
+<translation id="337286756654493126">Læse mapper, som du åbner i applikationen</translation>
 <translation id="2783661497142353826">Administrer kioskapplikationer</translation>
 <translation id="5701101281789450335">Indstillinger for sprog og indtastning...</translation>
 <translation id="5483838506518938965">Så er du klar</translation>
 <translation id="2263497240924215535">(Deaktiveret)</translation>
 <translation id="773426152488311044">Du er i øjeblikket den eneste bruger i <ph name="PRODUCT_NAME"/>.</translation>
 <translation id="2042078858148122628">Serveren på <ph name="HOST_NAME"/> kan ikke findes, fordi DNS-opslaget mislykkedes. DNS er den netværkstjeneste, der oversætter et websites navn til dets internetadresse. Denne fejl skyldes oftest, at der ikke er forbindelse til internettet, eller at netværket er konfigureret forkert. Det kan også skyldes en DNS-server, der ikke svarer, eller en firewall, der forhindrer <ph name="PRODUCT_NAME"/> i at få adgang til netværket.</translation>
-<translation id="2159087636560291862">I dette tilfælde er certifikatet ikke blevet verificeret af en tredjepart, som din computer har tillid til. Enhver kan oprette et certifikat og udgive sig for at være et hvilket som helst website, hvilket er grunden til, at det skal verificeres af en tredjepart, der er tillid til. Uden denne verificering er identitetsoplysningerne i certifikatet meningsløse. Det er derfor ikke muligt at verificere, at du kommunikerer med <ph name="DOMAIN"/> og ikke en person med ondsindede hensigter, som har oprettet sit eget certifikat og udgiver sig for at være <ph name="DOMAIN2"/>. Du bør ikke fortsætte.</translation>
+<translation id="2159087636560291862">I dette tilfælde er certifikatet ikke blevet bekræftet af en tredjepart, som din computer har tillid til. Enhver kan oprette et certifikat og udgive sig for at være et hvilket som helst website, hvilket er grunden til, at det skal verificeres af en tredjepart, der er tillid til. Uden denne verificering er identitetsoplysningerne i certifikatet meningsløse. Det er derfor ikke muligt at verificere, at du kommunikerer med <ph name="DOMAIN"/> og ikke en person med ondsindede hensigter, som har oprettet sit eget certifikat og udgiver sig for at være <ph name="DOMAIN2"/>. Du bør ikke fortsætte.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK"/>Hjælp<ph name="END_LINK"/></translation>
 <translation id="58625595078799656"><ph name="PRODUCT_NAME"/> kræver, at du krypterer dine data ved hjælp af enten din Google-adgangskode eller din egen adgangssætning.</translation>
-<translation id="3026050830483105579">Det hele er her.</translation>
+<translation id="3026050830483105579">Det er her det sker.</translation>
 <translation id="8017335670460187064"><ph name="LABEL"/></translation>
 <translation id="6840184929775541289">Er ikke en certificeringsautoritet</translation>
 <translation id="6099520380851856040">Forekom <ph name="CRASH_TIME"/></translation>
 <translation id="2964845078799970531">Med Nem oplåsning kan du låse din Chromebook op, når du i nærheden af ​​din telefon.</translation>
 <translation id="5053803681436838483">Ny leveringsadresse...</translation>
 <translation id="5952256601775839173">Aktivér tre-finger-klik på touchpad.</translation>
-<translation id="3280237271814976245">Gem &amp;som ...</translation>
+<translation id="3280237271814976245">Gem &amp;som...</translation>
 <translation id="8670262106224659584">Yama LSM enforcing</translation>
 <translation id="7221155467930685510">$1 GB</translation>
 <translation id="2624142942574147739">Denne side har adgang til dit kamera og din mikrofon.</translation>
 <translation id="7968833647796919681">Aktivér registrering af data om ydeevne</translation>
 <translation id="7645176681409127223"><ph name="USER_NAME"/> (ejer)</translation>
 <translation id="8427933533533814946">Foto af</translation>
-<translation id="5078638979202084724">Føj alle faner til Bogmærker</translation>
+<translation id="5078638979202084724">Tilføj alle faner som bogmærker</translation>
 <translation id="5585118885427931890">Bogmærkemappen blev ikke oprettet.</translation>
 <translation id="2553100941515833716">Gendan installationstilstanden for applisten ved genstart.</translation>
 <translation id="6019169947004469866">Beskær</translation>
 <translation id="2192280117622171197">En udvidelse har ændret, hvilken side der vises, når du søger via omnifeltet.</translation>
 <translation id="2731700343119398978">Vent et øjeblik...</translation>
 <translation id="5731751937436428514">Vietnamesisk indtastningsmetode (VIQR)</translation>
-<translation id="8412144371993786373">Føj den aktuelle side til Bogmærker</translation>
+<translation id="8412144371993786373">Tilføj den aktuelle side som bogmærke</translation>
 <translation id="1151169732719877940">Aktivér overenstemmende identitet mellem browser og cookie jar</translation>
 <translation id="7615851733760445951">&lt;ingen cookie er valgt&gt;</translation>
 <translation id="2493021387995458222">Vælg &quot;ord ad gangen&quot;</translation>
 <translation id="7378627244592794276">Nej</translation>
 <translation id="6949306908218145636">Tilføjer åbne sider som bogmærke...</translation>
 <translation id="2800537048826676660">Brug dette sprog til stavekontrol</translation>
-<translation id="68541483639528434">Luk andre faner</translation>
+<translation id="68541483639528434">Luk alle andre faner</translation>
 <translation id="941543339607623937">Ugyldig personlig nøgle.</translation>
 <translation id="1055184225775184556">&amp;Fortryd tilføjelse</translation>
 <translation id="863718024604665812">Renderer frøs</translation>
 <translation id="1779766957982586368">Luk vindue</translation>
 <translation id="4850886885716139402">Vis</translation>
 <translation id="89217462949994770">Du har angivet en forkert pinkode for mange gange. Kontakt <ph name="CARRIER_ID"/> for at få en ny 8-cifret nøgle til oplåsning af pinkode.</translation>
-<translation id="2776441542064982094">Det ser ud til, at der ikke kan registreres nogen tilgængelige enheder på netværket. Hvis din enhed er tændt og har forbindelse til internettet, kan du prøve at registrere den ved hjælp af vejledningen i instruktionsmanualen.</translation>
+<translation id="2776441542064982094">Det ser ud til, at der ikke er registreret nogen tilgængelige enheder på netværket. Hvis din enhed er tændt og har forbindelse til internettet, kan du prøve at registrere den ved hjælp af vejledningen i manualen.</translation>
 <translation id="8659716501582523573">IP-adresse:</translation>
 <translation id="7782102568078991263">Ikke flere forslag fra Google</translation>
 <translation id="8038111231936746805">(standard)</translation>
 <translation id="5774515636230743468">Manifest:</translation>
 <translation id="4960944339761782076">Brug bobler til anmodninger om tilladelse</translation>
 <translation id="1817871734039893258">Microsoft-filgendannelse</translation>
-<translation id="2423578206845792524">&amp;Gem billede som ...</translation>
+<translation id="2423578206845792524">&amp;Gem billede som...</translation>
 <translation id="6806236207372176468">Deaktiver understøttelse af videokodning til WebRTC.</translation>
 <translation id="7549584377607005141">Denne webside kræver data, du tidligere har indtastet, før den kan vises korrekt. Du kan sende disse data igen, men hvis du gør dette, gentager du enhver handling, som denne side tidligere har foretaget.</translation>
 <translation id="6954850746343724854">Aktiver Native Client for alle webapplikationer, selv dem der ikke installeres fra Chrome Webshop.</translation>
@@ -1025,7 +1025,7 @@ Psst! Prøv at bruge Inkognitotilstand <ph name="SHORTCUT_KEY"/> næste gang.</t
 <translation id="159359590073980872">Billedcache</translation>
 <translation id="4668711410219362250">https://support.google.com/chrome/bin/answer.py?hl=<ph name="GRITLANGCODE_1"/>&amp;answer=165139&amp;p=settings_sign_in</translation>
 <translation id="3586931643579894722">Skjul oplysninger</translation>
-<translation id="6285395082104474418">Statuslinjen viser dig den aktuelle status for dit netværk, batteri og meget mere.</translation>
+<translation id="6285395082104474418">I statusbakken kan du se den aktuelle status for dit netværk, batteri og meget mere.</translation>
 <translation id="3317459757438853210">Tosidet</translation>
 <translation id="6020949471045037306">Aktiverer det nye system til profiladministration, herunder profillåsning og den nye grænseflade med avatarmenu.</translation>
 <translation id="2011110593081822050">Web Worker: <ph name="WORKER_NAME"/></translation>
@@ -1060,7 +1060,7 @@ Psst! Prøv at bruge Inkognitotilstand <ph name="SHORTCUT_KEY"/> næste gang.</t
 <translation id="4839122884004914586">Tilsidesæt liste over gengivelse af software</translation>
 <translation id="3798449238516105146">Version</translation>
 <translation id="3608576286259426129">Eksempelvisning af billede fra bruger</translation>
-<translation id="5764483294734785780">&amp;Gem lyd som ...</translation>
+<translation id="5764483294734785780">&amp;Gem lyd som...</translation>
 <translation id="5252456968953390977">Roaming</translation>
 <translation id="8744641000906923997">Romaji</translation>
 <translation id="5451561500892538488">Skjul underretningsikonet</translation>
@@ -1098,7 +1098,7 @@ Beregner resterende tid</translation>
 <translation id="4887424188275796356">Åbn med standardvisningsprogram</translation>
 <translation id="5823933238730612365">PPAPI (ikke sandboxet)</translation>
 <translation id="5301751748813680278">Gæsteadgang.</translation>
-<translation id="121827551500866099">Vis alle downloads ...</translation>
+<translation id="121827551500866099">Vis alle downloads...</translation>
 <translation id="5949910269212525572">Serverens DNS-adresse kunne ikke bestemmes.</translation>
 <translation id="3115147772012638511">Venter på cache...</translation>
 <translation id="257088987046510401">Temaer</translation>
@@ -1133,7 +1133,7 @@ Beregner resterende tid</translation>
 <translation id="1357589289913453911">Udvidelses-id</translation>
 <translation id="7570477672765183">Klik her for starte</translation>
 <translation id="8688579245973331962">Kan du ikke se dit navn?</translation>
-<translation id="3804941997676372569">Søg, eller sig &quot;Ok Google</translation>
+<translation id="3804941997676372569">Søg, eller sig &quot;Ok Google&quot;</translation>
 <translation id="3226128629678568754">Tryk på genindlæsningsknappen for at genindsende de data, der er nødvendige for at indlæse siden.</translation>
 <translation id="1384035515048721170"><ph name="LEGAL_DOC_AGREEMENT"/> For at beskytte dig mod bedrageri vil oplysninger om din computer (herunder dens placering) blive delt med Google Wallet.</translation>
 <translation id="6166101525540035714">Din brug af Chrome er underlagt Chrome <ph name="BEGIN_LINK1"/>Servicevilkår<ph name="END_LINK1"/> og <ph name="BEGIN_LINK2"/>Erklæring om privatliv<ph name="END_LINK2"/>.</translation>
@@ -1147,7 +1147,7 @@ Beregner resterende tid</translation>
 <translation id="1849186935225320012">Denne side har fuld kontrol over MIDI-enheder.</translation>
 <translation id="7309416673261215716">Udvidelsens version</translation>
 <translation id="6840313690797192085">$1 PB</translation>
-<translation id="5971037678316050792">Kontrollér tilstand og parring af Bluetooth-adaptere</translation>
+<translation id="5971037678316050792">Kontrollere tilstand og parring af Bluetooth-adaptere</translation>
 <translation id="3313590242757056087">Du kan angive, hvilke websites den administrerede bruger skal kunne se, ved at konfigurere begrænsninger
     og indstillinger på <ph name="MANAGEMENT_URL"/>.
     Hvis du ikke ændrer standardindstillingerne, kan <ph name="USER_DISPLAY_NAME"/>
@@ -1181,7 +1181,7 @@ Beregner resterende tid</translation>
 <translation id="1645228020260124617"><ph name="PRECENTAGE"/> %</translation>
 <translation id="2585300050980572691">Standardindstillinger for søgning</translation>
 <translation id="2617919205928008385">Der er ikke nok plads til rådighed.</translation>
-<translation id="1608306110678187802">Udsk&amp;riv ramme ...</translation>
+<translation id="1608306110678187802">Udsk&amp;riv ramme...</translation>
 <translation id="3623574769078102674">Denne administrerede bruger administreres af <ph name="MANAGER_EMAIL"/>.</translation>
 <translation id="8919081441417203123">Dansk</translation>
 <translation id="5323213332664049067">Latinamerikansk</translation>
@@ -1286,9 +1286,9 @@ Beregner resterende tid</translation>
 <translation id="751507702149411736">Hviderussisk</translation>
 <translation id="6655190889273724601">Udviklertilstand</translation>
 <translation id="1071917609930274619">Omsætning af data til kode</translation>
-<translation id="3473105180351527598">Aktivér beskyttelse mod phishing og malware (skadevoldende programmer)</translation>
+<translation id="3473105180351527598">Aktivér beskyttelse mod phishing og malware (skadelige apps)</translation>
 <translation id="6151323131516309312">Tryk på <ph name="SEARCH_KEY"/> for at søge på <ph name="SITE_NAME"/></translation>
-<translation id="7541121857749629630">Billedundtagelser</translation>
+<translation id="7541121857749629630">Undtagelser for billeder</translation>
 <translation id="9033857511263905942">&amp;Indsæt</translation>
 <translation id="1028690605877243613">Brug det alternative hyldelayout.</translation>
 <translation id="6736045498964449756">Hov! Adgangskoderne stemmer ikke overens.</translation>
@@ -1313,7 +1313,7 @@ Beregner resterende tid</translation>
 <translation id="1451375123200651445">Webside, enkelt fil</translation>
 <translation id="7017354871202642555">Tilstanden kan ikke indstilles, når vinduet er indstillet.</translation>
 <translation id="222931766245975952">Fil forkortet</translation>
-<translation id="3101709781009526431">Dato og tidspunkt</translation>
+<translation id="3101709781009526431">Dato og klokkeslæt</translation>
 <translation id="2394566832561516196">Indstillingerne nulstilles ved næste genindlæsning.</translation>
 <translation id="4514542542275172126">Konfigurer ny administreret bruger</translation>
 <translation id="4279490309300973883">Spejling</translation>
@@ -1363,8 +1363,8 @@ Beregner resterende tid</translation>
 <translation id="4697214168136963651"><ph name="URL"/> blev blokeret</translation>
 <translation id="5380103295189760361">Hold Ctrl, Alt, Shift eller Søg nede for at se tastaturgenveje for disse ændringstaster.</translation>
 <translation id="7791543448312431591">Tilføj</translation>
-<translation id="8569764466147087991">Vælg en fil, som skal åbnes</translation>
-<translation id="9131487537093447019">Send beskeder til og modtag beskeder fra Bluetooth-enheder.</translation>
+<translation id="8569764466147087991">Vælg den fil, der skal åbnes</translation>
+<translation id="9131487537093447019">Sende beskeder til og modtage beskeder fra Bluetooth-enheder.</translation>
 <translation id="3010279545267083280">Adgangskoden er slettet</translation>
 <translation id="4275663329226226506">Medier</translation>
 <translation id="3629630062892748850">Relaterede webadresser og søgninger på Google.com</translation>
@@ -1420,7 +1420,7 @@ Beregner resterende tid</translation>
 <translation id="2344262275956902282">Brug tasterne - og = til at bladre igennem en kandidatliste.</translation>
 <translation id="3609138628363401169">Serveren understøtter ikke tilføjelse af TLS-genforhandling.</translation>
 <translation id="4926098191708537519">RSA</translation>
-<translation id="3369624026883419694">Identificer vært ...</translation>
+<translation id="3369624026883419694">Identificerer vært...</translation>
 <translation id="8870413625673593573">Senest lukkede</translation>
 <translation id="8297222119869486204">Aktivér elementet &quot;window-controls&quot;</translation>
 <translation id="9145357542626308749">Websitets sikkerhedscertifikat er signeret ved hjælp af en svag signaturalgoritme!</translation>
@@ -1451,7 +1451,7 @@ Beregner resterende tid</translation>
 <translation id="8856844195561710094">Kunne ikke standse opdagelse af Bluetooth-enhed.</translation>
 <translation id="2246340272688122454">Downloader genoprettelsesbillede...</translation>
 <translation id="5305688511332277257">Ingen installeret</translation>
-<translation id="1958802757844394735">Gendan browserindstillinger til deres oprindelige standardindstillinger.</translation>
+<translation id="1958802757844394735">Gendan browserindstillingerne til de oprindelige standardindstillinger.</translation>
 <translation id="8521441079177373948">Britisk</translation>
 <translation id="2816269189405906839">Kinesisk indtastningsmetode (cangjie)</translation>
 <translation id="1857166538520940818">Vedhæft fil:</translation>
@@ -1474,7 +1474,7 @@ Beregner resterende tid</translation>
 <translation id="2266011376676382776">Siden svarer ikke</translation>
 <translation id="2907619724991574506">Startwebadresser</translation>
 <translation id="6780476430578694241">Appliste</translation>
-<translation id="5328285148748012771">Få adgang til alle dine apps fra denne smarte appliste. Spil spil, videochat, lyt til musik, rediger dokumenter eller få flere apps fra Chrome Webshop.</translation>
+<translation id="5328285148748012771">Få adgang til alle dine apps via denne smarte appliste. Du kan spille spil, videochatte, lytte til musik, redigere dokumenter eller hente flere apps i Chrome Webshop.</translation>
 <translation id="2739191690716947896">Fejlretning</translation>
 <translation id="3100609564180505575">Moduler (<ph name="TOTAL_COUNT"/>) – Kendte konflikter: <ph name="BAD_COUNT"/>, under mistanke: <ph name="SUSPICIOUS_COUNT"/></translation>
 <translation id="641702813324074008">Aktivér grænseflade for Gem adgangskode i boble</translation>
@@ -1616,10 +1616,10 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="3335947283844343239">Åbn lukket fane igen</translation>
 <translation id="5848934677402291689">Gemmer som PDF</translation>
 <translation id="2480626392695177423">Skift mellem fuld/halv bredde for tegnsætningstilstand</translation>
-<translation id="5830410401012830739">Administrer indstillinger for placering ...</translation>
+<translation id="5830410401012830739">Administrer indstillinger for placering...</translation>
 <translation id="8787865569533773240">Nulstil de ændrede indstillinger for <ph name="IDS_SHORT_PRODUCT_NAME"/></translation>
 <translation id="1901377140875308934">Log ind på <ph name="SHORT_PRODUCT_NAME"/>...</translation>
-<translation id="5529098031581368697">Det nuværende tapet er indstillet af &quot;<ph name="APP_NAME"/>&quot;</translation>
+<translation id="5529098031581368697">Den nuværende baggrund er angivet af &quot;<ph name="APP_NAME"/>&quot;</translation>
 <translation id="7664333939334980398">64</translation>
 <translation id="3947376313153737208">Intet er valgt</translation>
 <translation id="1346104802985271895">Vietnamesisk indtastningsmetode (TELEX)</translation>
@@ -1633,7 +1633,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
           kan Google kontakte dig vedrørende din feedbackrapport. Denne feedback
           anvendes til at diagnosticere problemer og forbedre Chrome. Eventuelle personlige oplysninger,
           som du måtte indsende, hvad enten dette sker hændeligt eller bevidst, beskyttes i
-          overensstemmelse med vores privatlivspolitikker.<ph name="BEGIN_BOLD"/> Ved at indsende denne feedback accepterer du, at Google anvender din feedback,
+          overensstemmelse med vores privatlivspolitikker.<ph name="BEGIN_BOLD"/> Ved at indsende denne feedback accepterer du, at Google anvender din feedback
           til at forbedre et hvilket som helst Google-produkt eller en hvilken som helst Google-tjeneste.
           <ph name="END_BOLD"/></translation>
 <translation id="123578888592755962">Disken er fuld</translation>
@@ -1737,7 +1737,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="4776917500594043016">Adgangskode for <ph name="USER_EMAIL_ADDRESS"/></translation>
 <translation id="7792012425874949788">Der opstod en fejl under login</translation>
 <translation id="4105563239298244027">Få 1 TB gratis plads med Google Drev</translation>
-<translation id="8889883017054825362">Læs og rediger din browserhistorik</translation>
+<translation id="8889883017054825362">Læse og redigere din browserhistorik</translation>
 <translation id="7724603315864178912">Klip</translation>
 <translation id="8456681095658380701">Ugyldigt navn</translation>
 <translation id="3518086201899641494">Underretninger om captive portals</translation>
@@ -1805,7 +1805,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="3810973564298564668">Valgmuligheder</translation>
 <translation id="254416073296957292">&amp;Sprogindstillinger...</translation>
 <translation id="6652975592920847366">Opret et genoprettelsesmedie til operativsystemet</translation>
-<translation id="3759933321830434300">Bloker dele af websiderne</translation>
+<translation id="3759933321830434300">Blokere dele af websiderne</translation>
 <translation id="52912272896845572">Den private nøglefil er ugyldig.</translation>
 <translation id="3232318083971127729">Værdi:</translation>
 <translation id="8807632654848257479">Stabil</translation>
@@ -1832,10 +1832,10 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="1962233722219655970">Denne side bruger en Native Client-app, der ikke virker på din computer.</translation>
 <translation id="1108685299869803282">Over 80 % af dem, der ser denne advarsel, går tilbage i sikkerhed i stedet for at risikere at blive udsat for malware. Men hvis du forstår de sikkerhedsrisici, du udsætter dig for, kan du <ph name="BEGIN_LINK"/>gå til dette usikre website<ph name="END_LINK"/>, inden de skadelige programmer er blevet fjernet.</translation>
 <translation id="219008588003277019">Native Client-modul: <ph name="NEXE_NAME"/></translation>
-<translation id="2902382079633781842">Bogmærke blev tilføjet.</translation>
+<translation id="2902382079633781842">Bogmærket blev tilføjet.</translation>
 <translation id="5436510242972373446">Søg på <ph name="SITE_NAME"/>:</translation>
 <translation id="3800764353337460026">Symboltypografi</translation>
-<translation id="1278049586634282054">Se visninger:</translation>
+<translation id="1278049586634282054">Undersøg visninger:</translation>
 <translation id="3254434849914415189">Vælg standardappen for <ph name="FILE_TYPE"/>-filer:</translation>
 <translation id="4991420928586866460">Brug tasterne på øverste række som funktionstaster</translation>
 <translation id="4350019051035968019">Denne enhed kan ikke tilmeldes det domæne, som din konto hører under, da enheden er markeret til administration på et andet domæne.</translation>
@@ -1866,7 +1866,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="201192063813189384">Der opstod en fejl under læsning af data fra cache.</translation>
 <translation id="9126706773198551170">Aktivér nyt system til profiladministration</translation>
 <translation id="2345303327200536445">Ny version med kulørt baggrund</translation>
-<translation id="7441570539304949520">JavaScript-undtagelser</translation>
+<translation id="7441570539304949520">Undtagelser for JavaScript</translation>
 <translation id="1789575671122666129">Pop op-vinduer</translation>
 <translation id="8002117456258496331">Malware er skadelig software, der f.eks. forårsager identitetstyveri, økonomisk tab og permanent sletning af filer.</translation>
 <translation id="3215028073430859994">Appen har permanent adgang til <ph name="NUMBER_OF_FILES"/> filer.</translation>
@@ -1879,7 +1879,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="473775607612524610">Opdater</translation>
 <translation id="6122081475643980456">Din internetforbindelse bliver kontrolleret</translation>
 <translation id="8812403718714328880"><ph name="PRODUCT_NAME"/> har blokeret adgangen til <ph name="HOST_NAME"/> indtil videre.</translation>
-<translation id="2773013129377709345">Tilsidesæt brugergrænsefladen for bogmærker</translation>
+<translation id="2773013129377709345">Tilsidesætte brugergrænsefladen for bogmærker</translation>
 <translation id="1448389461181544401">Vil du gemme denne adgangskode?</translation>
 <translation id="148466539719134488">Schweizisk</translation>
 <translation id="8022523925619404071">Aktivér autoopdatering</translation>
@@ -1890,14 +1890,14 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="2462911512468050799">Du kan finde flere oplysninger på</translation>
 <translation id="2276503375879033601">Tilføj flere apps</translation>
 <translation id="2682935131208585215">Spørg om tilladelse, når et website forsøger at registrere din fysiske placering (anbefales)</translation>
-<translation id="5015344424288992913">Identificer proxy ...</translation>
+<translation id="5015344424288992913">Identificerer proxy...</translation>
 <translation id="4389091756366370506">Bruger <ph name="VALUE"/></translation>
 <translation id="4528459871550620573">Hvis du bruger Bluetooth, skal du sørge for, at dine enheder er klar til parring.</translation>
 <translation id="4620809267248568679">Denne indstilling håndhæves af en udvidelse.</translation>
 <translation id="2398703750948514961">Annulleret</translation>
 <translation id="4724168406730866204">Eten 26</translation>
 <translation id="308268297242056490">URI</translation>
-<translation id="8673026256276578048">Søg på nettet ...</translation>
+<translation id="8673026256276578048">Søg på nettet...</translation>
 <translation id="6529602333819889595">&amp;Annuller fortryd slet</translation>
 <translation id="2071393345806050157">Ingen lokal logfil.</translation>
 <translation id="3011362742078013760">Åbn alle bogmærker i &amp;inkognitovindue</translation>
@@ -1916,7 +1916,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="3481915276125965083">Følgende pop op-vinduer blev blokeret på denne side:</translation>
 <translation id="2030481566774242610">Mente du <ph name="LINK"/>?</translation>
 <translation id="3090871774332213558">&quot;<ph name="DEVICE_NAME"/>&quot; er parret</translation>
-<translation id="7705276765467986571">Bogmærkemodellen blev ikke indlæst</translation>
+<translation id="7705276765467986571">Bogmærkemodellen blev ikke indlæst.</translation>
 <translation id="750413812607578381">Du skal genstarte <ph name="PRODUCT_NAME"/> nu.</translation>
 <translation id="2638286699381354126">Opdater...</translation>
 <translation id="1196338895211115272">Den personlige nøgle kunne ikke eksporteres.</translation>
@@ -1980,9 +1980,9 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="5486561344817861625">Simuler genstart af browser</translation>
 <translation id="2367972762794486313">Vis apps</translation>
 <translation id="5602600725402519729">Gen&amp;indlæs</translation>
-<translation id="6955446738988643816">Inspicer pop op-vindue</translation>
+<translation id="6955446738988643816">Undersøg pop op-vindue</translation>
 <translation id="172612876728038702">TPM konfigureres. Vær tålmodig, det kan tage et par minutter.</translation>
-<translation id="6748140994595080445">Skift, hvordan <ph name="APP_NAME"/> skal håndtere og vise sprog</translation>
+<translation id="6748140994595080445">Angiv, hvordan <ph name="APP_NAME"/> skal håndtere og vise sprog</translation>
 <translation id="2836635946302913370">Login med dette brugernavn er blevet deaktiveret af din administrator.</translation>
 <translation id="3512307528596687562">Websiden på <ph name="URL"/> har resulteret i
           for mange omdirigeringer. Du kan måske løse problemet ved at slette dine cookies for dette website eller tillade cookies fra tredjeparter. Hvis ikke,
@@ -2084,7 +2084,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="313407085116013672">Fordi <ph name="IDS_SHORT_PRODUCT_OS_NAME"/> krypterer alle dine lokale data på sikker vis, skal du indtaste den gamle adgangskode nu for at låse disse data op.</translation>
 <translation id="3551320343578183772">Luk fanen</translation>
 <translation id="3345886924813989455">Der blev ikke fundet en understøttet browser</translation>
-<translation id="3712897371525859903">Gem side &amp;som ...</translation>
+<translation id="3712897371525859903">Gem side &amp;som...</translation>
 <translation id="4572659312570518089">Godkendelsen blev annulleret under tilslutning til &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
 <translation id="4925542575807923399">Kontoadministratoren kræver, at denne konto er den første konto, der logges ind på, i en session med samlet login fra flere konti.</translation>
 <translation id="5701381305118179107">Centrér</translation>
@@ -2105,7 +2105,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="2390045462562521613">Glem dette netværk</translation>
 <translation id="1450927657625573300">Deaktiverer en optimering, der har til formål at forbedre følsomheden for touchrulning. Tvinger alle trykhændelser til at gå til Blink Main Thread for at finde handlers i stedet for at omgå dem fra compositortråden.</translation>
 <translation id="3348038390189153836">Der er registreret en flytbar enhed</translation>
-<translation id="1663298465081438178">Gode sager uden problemer.</translation>
+<translation id="1663298465081438178">Nyttig info – uden dikkedarer.</translation>
 <translation id="8005540215158006229">Chrome er næsten klar.</translation>
 <translation id="1666788816626221136">Du har certifikatfiler, som ikke passer i nogen af de andre kategorier:</translation>
 <translation id="4821935166599369261">&amp;Profilering aktiveret</translation>
@@ -2176,9 +2176,9 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="2485422356828889247">Afinstaller</translation>
 <translation id="1731589410171062430">I alt: <ph name="NUMBER_OF_SHEETS"/> <ph name="SHEETS_LABEL"/> (<ph name="NUMBER_OF_PAGES"/> <ph name="PAGE_OR_PAGES_LABEL"/>)</translation>
 <translation id="7461924472993315131">Fastgør</translation>
-<translation id="7279701417129455881">Administrer blokering af cookies ...</translation>
+<translation id="7279701417129455881">Administrer blokering af cookies...</translation>
 <translation id="665061930738760572">Åbn i &amp;nyt vindue</translation>
-<translation id="4876895919560854374">Lås skærmen/lås skærmen op</translation>
+<translation id="4876895919560854374">Låse skærmen/låse skærmen op</translation>
 <translation id="1166359541137214543">ABC</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="5528368756083817449">Bogmærkeadministrator</translation>
@@ -2186,8 +2186,8 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="2826760142808435982">Forbindelsen er krypteret og godkendt ved hjælp af <ph name="CIPHER"/>, og den anvender <ph name="KX"/> som primær udvekslingsmekanisme.</translation>
 <translation id="215753907730220065">Afslut fuld skærm</translation>
 <translation id="7849264908733290972">Åbn &amp;billede på ny fane</translation>
-<translation id="1560991001553749272">Bogmærke tilføjet!</translation>
-<translation id="3966072572894326936">Vælg en anden mappe ...</translation>
+<translation id="1560991001553749272">Bogmærket er tilføjet!</translation>
+<translation id="3966072572894326936">Vælg en anden mappe...</translation>
 <translation id="8758455334359714415">Indbygget asynkron DNS</translation>
 <translation id="5585912436068747822">Formatering mislykkedes</translation>
 <translation id="8766796754185931010">Kotoeri</translation>
@@ -2231,7 +2231,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="388442998277590542">Siden med valgmuligheder '<ph name="OPTIONS_PAGE"/>' kunne ikke indlæses.</translation>
 <translation id="8449008133205184768">Sæt ind og match stil</translation>
 <translation id="5258266922137542658">PPAPI (i gang)</translation>
-<translation id="5127881134400491887">Administrer netværksforbindelser</translation>
+<translation id="5127881134400491887">Administrere netværksforbindelser</translation>
 <translation id="8028993641010258682">Størrelse</translation>
 <translation id="8329978297633540474">Almindelig tekst</translation>
 <translation id="7704305437604973648">Opgave</translation>
@@ -2324,7 +2324,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="8300259894948942413">Træk og slip ved berøring kan initieres via et langt tryk på et element, der kan trækkes.</translation>
 <translation id="1240892293903523606">DOM Inspector</translation>
 <translation id="5249624017678798539">Browseren lukkede ned, før overførslen var fuldført.</translation>
-<translation id="4474155171896946103">Føj alle faner til Bogmærker...</translation>
+<translation id="4474155171896946103">Tilføj alle faner som bogmærker...</translation>
 <translation id="5895187275912066135">Udstedt den</translation>
 <translation id="9100825730060086615">Tastaturtype</translation>
 <translation id="5197680270886368025">Synkroniseringen er fuldført.</translation>
@@ -2430,11 +2430,11 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="7222232353993864120">E-mailadresse</translation>
 <translation id="2128531968068887769">Native Client</translation>
 <translation id="7175353351958621980">Indlæst fra:</translation>
-<translation id="3489785055052024984">Læs og rediger din browserhistorik på alle enheder, hvor du er logget ind</translation>
+<translation id="3489785055052024984">Læse og redigere din browserhistorik på alle enheder, hvor du er logget ind</translation>
 <translation id="8248050856337841185">&amp;Indsæt</translation>
 <translation id="347785443197175480">Tillad fortsat, at <ph name="HOST"/> har adgang til dit kamera og din mikrofon</translation>
 <translation id="6052976518993719690">SSL-certificeringsautoritet</translation>
-<translation id="1175364870820465910">&amp;Udskriv ...</translation>
+<translation id="1175364870820465910">&amp;Udskriv...</translation>
 <translation id="3502662168994969388">Begrænser Native Client-applikationens GDB-baserede fejlretning ved hjælp af webadressen for manifestfilen. Native Client GDB-baseret fejlretning skal aktiveres, for at denne indstilling fungerer.</translation>
 <translation id="588258955323874662">Fuld skærm</translation>
 <translation id="6800914069727136216">I indholdspakke</translation>
@@ -2461,7 +2461,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="2950186680359523359">Serveren lukkede forbindelsen uden at sende nogen data.</translation>
 <translation id="4269099019648381197">Aktiverer valgmuligheden Anmod om website til tablet i menuen Indstillinger.</translation>
 <translation id="1645250822384430568">Vi har modtaget dine oplysninger, og vi behandler din anmodning.</translation>
-<translation id="9142623379911037913">Tillad, at <ph name="SITE"/> viser meddelelser på skrivebordet?</translation>
+<translation id="9142623379911037913">Vil du tillade, at <ph name="SITE"/> viser underretninger på skrivebordet?</translation>
 <translation id="3564708465992574908">Zoomniveauer</translation>
 <translation id="6546686722964485737">Opret forbindelse til WiMAX-netværk</translation>
 <translation id="266983583785200437">Hændelser vedrørende nedbrud og fejl i forbindelse med <ph name="SHORT_PRODUCT_NAME"/></translation>
@@ -2474,7 +2474,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="3668570675727296296">Sprogindstillinger</translation>
 <translation id="2190469909648452501">Mørkere</translation>
 <translation id="7754704193130578113">Spørg, hvor hver enkelt fil skal gemmes, inden download begynder</translation>
-<translation id="222949136907494149"><ph name="URL"/> vil bruge computerens placering.</translation>
+<translation id="222949136907494149"><ph name="URL"/> vil gerne anvende computerens placering.</translation>
 <translation id="7654941827281939388">Denne konto er allerede i brug på denne computer.</translation>
 <translation id="204914487372604757">Opret genvej</translation>
 <translation id="696036063053180184">3-sæt (ingen shift)</translation>
@@ -2500,7 +2500,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="3264544094376351444">Sans-serif-skrifttype</translation>
 <translation id="4628314759732363424">Skift...</translation>
 <translation id="4569155249847375786">Godkendt</translation>
-<translation id="5094721898978802975">Kommuniker med indbyggede applikationer</translation>
+<translation id="5094721898978802975">Kommunikere med indbyggede applikationer</translation>
 <translation id="1077946062898560804">Konfigurer automatiske opdateringer for alle brugere</translation>
 <translation id="3122496702278727796">Oprettelsen af datamappe mislykkedes</translation>
 <translation id="6690751852586194791">Vælg en administreret bruger, der skal føjes til denne enhed.</translation>
@@ -2550,7 +2550,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="5464632865477611176">Kør nu</translation>
 <translation id="4268025649754414643">Omsætning af nøgle til kode</translation>
 <translation id="916745092148443205">Fremhævning ved berøring</translation>
-<translation id="1168020859489941584">Åbner om <ph name="TIME_REMAINING"/> ...</translation>
+<translation id="1168020859489941584">Åbner om <ph name="TIME_REMAINING"/>...</translation>
 <translation id="9158715103698450907">Ups! Der opstod et problem med netværkskommunikationen under godkendelsen. Kontrollér din netværksforbindelse, og prøv igen.</translation>
 <translation id="1620510694547887537">Kamera</translation>
 <translation id="5270884342523754894">&quot;<ph name="EXTENSION"/>&quot; kan læse billeder, video- og lydfiler i de markerede mapper.</translation>
@@ -2567,7 +2567,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="5181140330217080051">Downloader</translation>
 <translation id="3736520371357197498">Hvis du forstår den sikkerhedsrisiko, du udsætter dig for, kan du <ph name="BEGIN_LINK"/>gå til dette usikre website<ph name="END_LINK"/>, inden de farlige programmer er fjernet.</translation>
 <translation id="4165738236481494247">Kør dette plugin</translation>
-<translation id="1386387014181100145">Goddaw.</translation>
+<translation id="1386387014181100145">Davs!</translation>
 <translation id="4890284164788142455">Thai</translation>
 <translation id="6049065490165456785">Billede fra internt kamera</translation>
 <translation id="4312207540304900419">Aktivér næste fane</translation>
@@ -2577,7 +2577,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="7595321929944401166">Dette plugin er ikke understøttet.</translation>
 <translation id="2580093683987647761">Ring på (866) 628-1371 (USA), (866) 628-1372 (Canada) eller 0800 026 0613 (Storbritannien) for at anmode om en ny gratis oplader.</translation>
 <translation id="3996912167543967198">Nulstiller...</translation>
-<translation id="7509822997156351101">Rediger dine tilgængelighedsindstillinger</translation>
+<translation id="7509822997156351101">Redigere dine indstillinger for hjælpefunktioner</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="1541724327541608484">Kontrollér stavning i ​​tekstfelter</translation>
 <translation id="8637688295594795546">Der findes en tilgængelig opdatering til systemet. Forbereder download...</translation>
@@ -2597,7 +2597,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="3714633008798122362">webkalender</translation>
 <translation id="3251759466064201842">&lt;Ikke en del af certifikatet&gt;</translation>
 <translation id="6186096729871643580">Antialias for LCD-tekst</translation>
-<translation id="3882882270042324158">Aktivér tilføjelse af scripts for tilgængelighed.</translation>
+<translation id="3882882270042324158">Aktivér tilføjelse af scripts for hjælpefunktioner.</translation>
 <translation id="7303492016543161086">Vis indstillinger for hjælpefunktioner i systemmenuen</translation>
 <translation id="6410257289063177456">Billedfiler</translation>
 <translation id="6419902127459849040">Centraleuropæisk</translation>
@@ -2616,7 +2616,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="5298219193514155779">Tema oprettet af</translation>
 <translation id="6307722552931206656">Googles navneservere – <ph name="BEGIN_LINK"/>Få flere oplysninger<ph name="END_LINK"/></translation>
 <translation id="6628328486509726751">Uploadet <ph name="WEBRTC_LOG_UPLOAD_TIME"/></translation>
-<translation id="1047726139967079566">Indsæt bogmærke for denne side...</translation>
+<translation id="1047726139967079566">Tilføj denne side som bogmærke...</translation>
 <translation id="151279668805528202">Aktivér den nye lydafspiller</translation>
 <translation id="9020142588544155172">Serveren afviste forbindelsen.</translation>
 <translation id="5234320766290789922">Tillad ikke, at hylden minimerer vinduet, hvis der kun findes ét aktivt vindue, der er knyttet til det element på hylden, der klikkes på.</translation>
@@ -2624,7 +2624,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="5428105026674456456">Spansk</translation>
 <translation id="8871696467337989339">Du benytter en ikke-understøttet kommandolinjemarkering: <ph name="BAD_FLAG"/>. Det går ud over stabiliteten og sikkerheden.</translation>
 <translation id="5163869187418756376">Deling mislykkedes. Kontrollér din forbindelse, og prøv igen senere.</translation>
-<translation id="1774833706453699074">Tilføj åbne sider til bogmærker...</translation>
+<translation id="1774833706453699074">Tilføj åbne sider som bogmærker...</translation>
 <translation id="5702389759209837579">Få adgang til dine åbne faner på alle dine enheder.</translation>
 <translation id="8381055888183086563">Aktiverer fejlretning af indstillinger for genvejsmenu, f.eks. Inspect Element for pakkede applikationer.</translation>
 <translation id="1189418886587279221">Aktivér hjælpefunktioner for at gøre din enhed nemmere at bruge.</translation>
@@ -2708,7 +2708,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="7117247127439884114">Log ind igen...</translation>
 <translation id="2932960728421974162">Der blev ikke oprettet forbindelse til det rigtige <ph name="SITE"/></translation>
 <translation id="509429900233858213">Der opstod en fejl.</translation>
-<translation id="7227780179130368205">Skadevoldende programmer registreret!</translation>
+<translation id="7227780179130368205">Der er registreret malware!</translation>
 <translation id="2489428929217601177">seneste døgn</translation>
 <translation id="4278390842282768270">Tilladt</translation>
 <translation id="2074527029802029717">Frigør fane</translation>
@@ -2766,7 +2766,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="4154664944169082762">Fingeraftryk</translation>
 <translation id="4193297030838143153">Ny faktureringsadresse...</translation>
 <translation id="3202578601642193415">Nyeste</translation>
-<translation id="1398853756734560583">Maksimer</translation>
+<translation id="1398853756734560583">Maksimér</translation>
 <translation id="1829129547161959350">Pingvin</translation>
 <translation id="8988255471271407508">Websiden blev ikke fundet i cachen. Visse ressourcer såsom sider, der genereres fra indsendte data, kan kun indlæses sikkert fra cachen. <ph name="LINE_BREAK"/> Denne fejl kan også skyldes beskadigelse af cachen på grund af en forkert lukning. <ph name="LINE_BREAK"/> Hvis problemet fortsætter, kan du prøve at rydde cachen.</translation>
 <translation id="1653828314016431939">OK, genstart nu</translation>
@@ -2807,13 +2807,13 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="7374461526650987610">Protokolhåndtering</translation>
 <translation id="2192505247865591433">Fra:</translation>
 <translation id="4634771451598206121">Log ind igen...</translation>
-<translation id="1035590878859356651">Føj denne side til bogmærker ...</translation>
+<translation id="1035590878859356651">Tilføj denne side som bogmærke...</translation>
 <translation id="5630205793128597629">Deaktiver DirectWrite</translation>
 <translation id="3944266449990965865">Hele skærmen</translation>
 <translation id="942954117721265519">Ingen billeder i denne mappe.</translation>
 <translation id="671928215901716392">Lås skærmen</translation>
 <translation id="2241468422635044128">Tilladt af udvidelse</translation>
-<translation id="3727187387656390258">Inspicer popupvindue</translation>
+<translation id="3727187387656390258">Undersøg pop op-vindue</translation>
 <translation id="361106536627977100">Flash-data</translation>
 <translation id="569068482611873351">Importer...</translation>
 <translation id="6571070086367343653">Rediger kreditkort</translation>
@@ -2826,7 +2826,7 @@ Når du har oprettet en ny administreret bruger, kan du til enhver tid administr
 <translation id="5622158329259661758">Deaktiverer brugen af GPU'en for at udføre lærredgengivelse i 2D og bruger softwaregengivelse i stedet.</translation>
 <translation id="8670869118777164560">Denne udvidelse kunne ikke omdirigere en netværksanmodning til <ph name="ATTEMPTED_REDIRECT_DESTINATION"/>, fordi en anden udvidelse (<ph name="EXTENSION_NAME"/>) omdirigerede den til <ph name="ACTUAL_REDIRECT_DESTINATION"/>.</translation>
 <translation id="3654092442379740616">Synkroniseringsfejl: <ph name="PRODUCT_NAME"/> er forældet og skal opdateres.</translation>
-<translation id="790040513076446191">Manipuler indstillinger til beskyttelse af personlige oplysninger</translation>
+<translation id="790040513076446191">Manipulere indstillinger til beskyttelse af personlige oplysninger</translation>
 <translation id="7260002739296185724">Aktivér brug af AVFoundation til optagelse af video og overvågning af videoenheder i OS X &gt;= 10.7. Hvis AVFoundation ikke aktiveres, bruges QTKit i stedet.</translation>
 <translation id="1463985642028688653">bloker</translation>
 <translation id="1715941336038158809">Ugyldigt brugernavn eller ugyldig adgangskode.</translation>
@@ -2984,7 +2984,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="4176463684765177261">Deaktiveret</translation>
 <translation id="2483350027598201151">Megabytes</translation>
 <translation id="3880349122676857713">Få adgang til alt det, som du skriver</translation>
-<translation id="154603084978752493">Tilføj som søge&amp;maskine ...</translation>
+<translation id="154603084978752493">Tilføj som søge&amp;maskine...</translation>
 <translation id="2079545284768500474">Fortryd</translation>
 <translation id="114140604515785785">Udvidelsens rodmappe:</translation>
 <translation id="3925842537050977900">Frigør fra hylde</translation>
@@ -2993,7 +2993,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="3972425373133383637">Hold dig ajour med det, du har brug for at vide, på alle dine enheder.</translation>
 <translation id="8493236660459102203">Mikrofon:</translation>
 <translation id="4788968718241181184">Vietnamesisk indtastningsmetode (TCVN6064)</translation>
-<translation id="3254409185687681395">Tilføj bogmærke til denne side</translation>
+<translation id="3254409185687681395">Tilføj denne side som bogmærke</translation>
 <translation id="5694501201003948907">Komprimerer $1 elementer...</translation>
 <translation id="2677924368525077324">Aktivér tekstredigering ved tryk</translation>
 <translation id="283669119850230892">Hvis du vil bruge netværket <ph name="NETWORK_ID"/>, skal du først oprette forbindelse til internettet nedenfor.</translation>
@@ -3023,7 +3023,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="4031910098617850788">F5</translation>
 <translation id="8960795431111723921">Vi undersøger i øjeblikket problemet.</translation>
 <translation id="862727964348362408">Midlertidigt standset</translation>
-<translation id="2482878487686419369">Meddelelser</translation>
+<translation id="2482878487686419369">Underretninger</translation>
 <translation id="8004582292198964060">Browser</translation>
 <translation id="2040460856718599782">Ups! Der opstod en fejl under forsøget på at godkende dig. Kontrollér dine loginoplysninger, og prøv igen.</translation>
 <translation id="695755122858488207">Ikke-valgte alternativknapper</translation>
@@ -3046,7 +3046,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="2386171414103162062">Forekomster, hvor en fane gik ned (&quot;<ph name="IDS_SAD_TAB_TITLE"/>&quot;)</translation>
 <translation id="761779991806306006">Der er ikke gemt nogen adgangskoder.</translation>
 <translation id="1692602667007917253">Hov! Der opstod en fejl</translation>
-<translation id="3922476559105512920">bruge serieforbundne enheder, der er sluttet til din computer</translation>
+<translation id="3922476559105512920">Bruge serieforbundne enheder, der er sluttet til din computer</translation>
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME"/> (udvidelses-id'et &quot;<ph name="EXTENSION_ID"/>&quot;) er ikke tilladt i denne sessionstype.</translation>
 <translation id="7062080924541270064"><ph name="BEGIN_LINK"/>Pluginnet Native Client<ph name="END_LINK"/> skal være aktiveret for at bruge denne funktion.</translation>
 <translation id="3613796918523876348">Gendan alligevel</translation>
@@ -3064,8 +3064,8 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="8106211421800660735">Kreditkortnummer</translation>
 <translation id="9159562891634783594">Aktivér registrering af uregistrerede cloudprintere fra Vis udskrift.</translation>
 <translation id="8843709518995654957"><ph name="LINK_START"/>Opret en administreret bruger<ph name="LINK_END"/> for denne enhed.</translation>
-<translation id="2872961005593481000">Luk</translation>
-<translation id="8986267729801483565">Download-placering:</translation>
+<translation id="2872961005593481000">Sluk</translation>
+<translation id="8986267729801483565">Placering for downloads:</translation>
 <translation id="5385003951485962612">Deaktiverer understøttelse af SAML-login for login på Chrome OS.</translation>
 <translation id="2044540568167155862">Goats teleported</translation>
 <translation id="1776712937009046120">Tilføj bruger</translation>
@@ -3074,7 +3074,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="8954952943849489823">Flytningen mislykkedes. Uventet fejl: $1</translation>
 <translation id="2318143611928805047">Papirstørrelse</translation>
 <translation id="7100897339030255923"><ph name="COUNT"/> elementer er markeret</translation>
-<translation id="4322394346347055525">Luk andre faner</translation>
+<translation id="4322394346347055525">Luk alle andre faner</translation>
 <translation id="2562743677925229011">Ikke logget ind på <ph name="SHORT_PRODUCT_NAME"/></translation>
 <translation id="5592595402373377407">Der er ikke nok data til rådighed endnu.</translation>
 <translation id="1556189134700913550">Anvend på alle</translation>
@@ -3090,8 +3090,8 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="3700834376805760154">Identiteten af <ph name="ORGANIZATION"/> beliggende i <ph name="LOCALITY"/> er bekræftet af <ph name="ISSUER"/>, og der kan foretages en offentlig revision af den.</translation>
 <translation id="436701661737309601">Ved et certifikat, der ikke er udløbet, gælder det, at udstederen af certifikatet er ansvarlig for at vedligeholde en &quot;tilbagekaldelsesliste&quot;. Hvis et certifikat på et tidspunkt kompromitteres, kan udstederen tilbagekalde det ved at føje det til tilbagekaldelseslisten, og derefter vil din browser ikke længere anse dette certifikat som pålideligt. Tilbagekaldelsesstatus kræves ikke for forældede certifikater, så selvom dette certifikat engang var gyldigt på det aktuelle website, er det ikke muligt at afgøre, om certifikatet er blevet kompromitteret og efterfølgende tilbagekaldt, eller om det stadigvæk er sikkert, på nuværende tidspunkt. Derfor er det umuligt at vide, om du kommunikerer med et troværdigt website, eller om certifikatet er blevet kompromitteret og nu styres af en hacker, som du kommunikerer med.</translation>
 <translation id="4342311272543222243">Hov! Der opstod en TPM-fejl.</translation>
-<translation id="3727884750434605207">Aktivér tilføjelse af scripts i stedet for den indbyggede tilgængelighed i Android.</translation>
-<translation id="1285484354230578868">Gem data i din Google Drev-konto</translation>
+<translation id="3727884750434605207">Aktivér tilføjelse af scripts i stedet for de indbyggede hjælpefunktioner i Android.</translation>
+<translation id="1285484354230578868">Gemme data på din Google Drev-konto</translation>
 <translation id="7106346894903675391">Køb mere lagerplads...</translation>
 <translation id="994289308992179865">&amp;Sløjfe</translation>
 <translation id="7596831438341298034">OK, start import</translation>
@@ -3101,7 +3101,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="8112754292007745564">Aktivér Web MIDI API</translation>
 <translation id="3302709122321372472">Css '<ph name="RELATIVE_PATH"/>' for indholdsscript kunne ikke indlæses.</translation>
 <translation id="305803244554250778">Opret programgenveje på følgende steder:</translation>
-<translation id="574392208103952083">Medium</translation>
+<translation id="574392208103952083">Mellem</translation>
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="3816844797124379499">Applikationen kunne ikke tilføjes, fordi det er i konflikt med &quot;<ph name="APP_NAME"/>&quot;.</translation>
 <translation id="7301360164412453905">Valgtaster for Hsu-tastaur</translation>
@@ -3192,7 +3192,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="2520481907516975884">Skift mellem kinesisk/engelsk</translation>
 <translation id="4056561919922437609"><ph name="TAB_COUNT"/> Faner</translation>
 <translation id="3612628222817739505">(<ph name="ACCELERATOR"/>)</translation>
-<translation id="6358450015545214790">Hvad betyder de?</translation>
+<translation id="6358450015545214790">Hvad betyder dette?</translation>
 <translation id="1156185823432343624">Lydstyrke: Lyd fra</translation>
 <translation id="6251924700383757765">Privatlivspolitik</translation>
 <translation id="1188807932851744811">Logfilen blev ikke uploadet.</translation>
@@ -3227,7 +3227,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="889901481107108152">Dette eksperiment er ikke tilgængeligt på din platform.</translation>
 <translation id="8238191901674777266">USA</translation>
 <translation id="1873879463550486830">SUID-sandkasse</translation>
-<translation id="8118860139461251237">Administrer dine downloads</translation>
+<translation id="8118860139461251237">Administrere dine downloads</translation>
 <translation id="5111852801054039429">Deaktiver WebRTC</translation>
 <translation id="2190355936436201913">(tom)</translation>
 <translation id="8515737884867295000">Den certifikatbaserede godkendelse mislykkedes</translation>
@@ -3236,7 +3236,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="2453021845418314664">Avancerede indstillinger for synkronisering</translation>
 <translation id="14720830734893704">Aktivér understøttelse af virtuelt tastatur.</translation>
 <translation id="5458214261780477893">Dvorak</translation>
-<translation id="1185924365081634987">Du kan også prøve at <ph name="GUEST_SIGNIN_LINK_START"/>browse som gæst<ph name="GUEST_SIGNIN_LINK_END"/> for at udbedre denne netværksfejl.</translation>
+<translation id="1185924365081634987">Du kan også prøve at <ph name="GUEST_SIGNIN_LINK_START"/>anvende som gæst<ph name="GUEST_SIGNIN_LINK_END"/> for at udbedre denne netværksfejl.</translation>
 <translation id="3960121209995357026">Aktivér automatisk stavekontrol</translation>
 <translation id="2214283295778284209"><ph name="SITE"/> er ikke tilgængelig</translation>
 <translation id="7984945080620862648">Du kan ikke gå til <ph name="SITE"/> lige nu, da websitet sendte krypterede legitimationsoplysninger, som Chrome ikke kan håndtere. Netværksfejl og angreb er normalt midlertidige, så denne side vil sandsynligvis fungere senere.</translation>
@@ -3391,7 +3391,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="7807711621188256451">Tillad altid, at <ph name="HOST"/> har adgang til dit kamera</translation>
 <translation id="7140928199327930795">Der er ingen andre tilgængelige enheder.</translation>
 <translation id="790025292736025802"><ph name="URL"/> blev ikke fundet</translation>
-<translation id="895347679606913382">Begynder ...</translation>
+<translation id="895347679606913382">Begynder...</translation>
 <translation id="3319048459796106952">Nyt &amp;inkognito-vindue</translation>
 <translation id="656398493051028875">Slettter &quot;<ph name="FILENAME"/>&quot;...</translation>
 <translation id="7517786267097410259">Opret en adgangskode –</translation>
@@ -3475,7 +3475,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="1403926504581035498">Aktivér SPDY/4</translation>
 <translation id="2809586584051668049">og <ph name="NUMBER_ADDITIONAL_DISABLED"/> mere</translation>
 <translation id="7347702518873971555">Køb abonnement</translation>
-<translation id="5285267187067365830">Installer plugin ...</translation>
+<translation id="5285267187067365830">Installer plugin...</translation>
 <translation id="2680208403056680091">Din internetforbindelse bliver kontrolleret</translation>
 <translation id="8662978096466608964">Chrome kan ikke indstille baggrunden.</translation>
 <translation id="5334844597069022743">Vis kilde</translation>
@@ -3585,7 +3585,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="9026731007018893674">download</translation>
 <translation id="3212792897911394068">Deaktiver den eksperimenterende version af Encrypted Media Extensions på video- og lydelementer.</translation>
 <translation id="6199775032047436064">Genindlæs den aktuelle side</translation>
-<translation id="6981982820502123353">Hjælpemidler</translation>
+<translation id="6981982820502123353">Hjælpefunktioner</translation>
 <translation id="7210998213739223319">Brugernavn.</translation>
 <translation id="4523336217659634227">Der opstod en fejl (<ph name="ERROR"/>) under download af pluginnet.</translation>
 <translation id="4478664379124702289">Gem lin&amp;k som...</translation>
@@ -3812,7 +3812,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="8026964361287906498">(Administreret af en virksomhedspolitik)</translation>
 <translation id="8261506727792406068">Slet</translation>
 <translation id="7800518121066352902">Roter m&amp;od uret</translation>
-<translation id="345693547134384690">Åbn &amp;billede i ny fane</translation>
+<translation id="345693547134384690">Åbn &amp;billede  ny fane</translation>
 <translation id="7422192691352527311">Indstillinger...</translation>
 <translation id="9004952710076978168">Modtog en meddelelse om en ukendt printer.</translation>
 <translation id="3911824782900911339">Siden Ny fane</translation>
@@ -3879,14 +3879,14 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="1254593899333212300">Direkte internetforbindelse</translation>
 <translation id="6107012941649240045">Udstedt til</translation>
 <translation id="3828373662010953415">Aktivér den nye avatarmenu</translation>
-<translation id="6483805311199035658">Åbner <ph name="FILE"/> ...</translation>
+<translation id="6483805311199035658">Åbner <ph name="FILE"/>...</translation>
 <translation id="940425055435005472">Skriftstørrelse:</translation>
 <translation id="494286511941020793">Hjælp til proxykonfiguration</translation>
 <translation id="2765217105034171413">Lille</translation>
 <translation id="9154176715500758432">Bliv på denne side</translation>
 <translation id="7938594894617528435">I øjeblikket offline</translation>
 <translation id="6825883775269213504">Russisk</translation>
-<translation id="9150045010208374699">Brug dit kamera</translation>
+<translation id="9150045010208374699">Bruge dit kamera</translation>
 <translation id="3842552989725514455">Serif-skrifttype</translation>
 <translation id="6898440773573063262">Terminalapplikationer kan nu konfigureres til at starte automatisk på enheden.</translation>
 <translation id="1813278315230285598">Tjenester</translation>
@@ -3900,10 +3900,10 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME"/> (det navn, der anvendes på enheden)</translation>
 <translation id="3177048931975664371">Klik for at skjule adgangskode</translation>
 <translation id="5852137567692933493">Genstart og Powerwash</translation>
-<translation id="3092544800441494315">Medtag dette skærmbillede:</translation>
+<translation id="3092544800441494315">Inkluder dette skærmbillede:</translation>
 <translation id="2633199387167390344"><ph name="NAME"/> bruger <ph name="USAGE"/> MB diskplads.</translation>
 <translation id="472177018469288237">Google Wallet er deaktiveret</translation>
-<translation id="7730449930968088409">Tag et skærmbillede af dit indhold</translation>
+<translation id="7730449930968088409">Tage et skærmbillede af dit indhold</translation>
 <translation id="1431605150566631089">Kontrollér oplader</translation>
 <translation id="5330145655348521461">Disse filer blev åbnet på en anden computer. Skift til <ph name="USER_NAME"/> (<ph name="MAIL_ADDRESS"/>) for at se dem.</translation>
 <translation id="7714464543167945231">Certifikat</translation>
@@ -3925,7 +3925,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="5750676294091770309">Blokeret af udvidelse</translation>
 <translation id="1302191857856401062">Aktiverer hurtige brugerskift i avatarmenuen.</translation>
 <translation id="7865978820218947446">Rediger bruger</translation>
-<translation id="523299859570409035">Undtagelser for meddelelser</translation>
+<translation id="523299859570409035">Undtagelser for underretninger</translation>
 <translation id="5470861586879999274">&amp;Annuller fortryd redigering</translation>
 <translation id="7017480957358237747">tillad eller forbyd visse websites,</translation>
 <translation id="1029595648591494741">Vil du prøve &quot;<ph name="EXTENSION_NAME"/>&quot;?</translation>
@@ -3947,6 +3947,7 @@ slettes permanent, når den administrerede bruger fjernes. Besøgte websites og
 <translation id="6460601847208524483">Find næste</translation>
 <translation id="397703832102027365">Afslutter...</translation>
 <translation id="8146177459103116374">Hvis du allerede har registreret dig på denne enhed, kan du <ph name="LINK2_START"/>logge ind som eksisterende bruger<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Vis administrerede bogmærker</translation>
 <translation id="4856478137399998590">Din mobildatatjeneste er aktiveret og klar til brug</translation>
 <translation id="3305389145870741612">Formateringen kan tage et par sekunder. Vent et øjeblik.</translation>
 <translation id="3648607100222897006">Disse eksperimentelle funktioner kan ændre sig, gå i stykker eller forsvinde når som helst. Vi giver absolut ingen garantier for, hvad der kan ske, hvis du aktiverer en af ​​disse eksperimentelle funktioner, og din browser kan måske endda finde på spontant at selvantænde. Spøg til side. Din browser kan muligvis slette alle dine data, eller din sikkerhed eller dine personlige oplysninger kan komme i fare på uventet vis. Enhver eksperimentel funktion, du aktiverer, aktiveres for alle brugere af denne browser. Vær forsigtig, hvis du fortsætter.</translation>
@@ -4065,7 +4066,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="8948393169621400698">Tillad altid plugins på <ph name="HOST"/></translation>
 <translation id="6527303717912515753">Del</translation>
 <translation id="8211154138148153396">Underretninger om enhedsregistrering på lokalt netværk.</translation>
-<translation id="3893536212201235195">Læs og rediger dine tilgængelighedsindstillinger</translation>
+<translation id="3893536212201235195">Læse og redigere dine indstillinger for hjælpefunktioner</translation>
 <translation id="5039512255859636053">$1 TB</translation>
 <translation id="4285498937028063278">Frigør</translation>
 <translation id="8734073480934656039">Ved at aktivere denne indstilling tillader du, at terminalapplikationer åbnes automatisk under opstart.</translation>
@@ -4103,7 +4104,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="8888432776533519951">Farve:</translation>
 <translation id="5294529402252479912">Opdater Adobe Reader nu</translation>
 <translation id="641087317769093025">Udvidelsen kunne ikke udpakkes</translation>
-<translation id="7461850476009326849">Deaktiver individuelle plugins ...</translation>
+<translation id="7461850476009326849">Deaktiver individuelle plugins...</translation>
 <translation id="2231990265377706070">Udråbstegn</translation>
 <translation id="7199540622786492483"><ph name="PRODUCT_NAME"/> er forældet, fordi der ikke er blevet genstartet i et stykke tid. Der er en tilgængelig opdatering, som vil blive taget i brug, så snart du genstarter.</translation>
 <translation id="2171101176734966184">Du forsøgte at få fat på <ph name="DOMAIN"/>, men serveren har præsenteret et certifikat, der er signeret med en svag signaturalgoritme. Det betyder, at sikkerhedsoplysningerne fra serveren kan være forfalskede, og at serveren muligvis ikke er den server, som du har forventet (du kommunikerer muligvis med en hacker).</translation>
@@ -4138,7 +4139,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="2137808486242513288">Tilføj en bruger</translation>
 <translation id="129553762522093515">Senest lukkede</translation>
 <translation id="1588870296199743671">Åbn link med...</translation>
-<translation id="4761104368405085019">Brug din mikrofon</translation>
+<translation id="4761104368405085019">Bruge din mikrofon</translation>
 <translation id="4287167099933143704">Angiv nøgle til oplåsning af pinkode</translation>
 <translation id="3936418843437416078">Installationer</translation>
 <translation id="3129140854689651517">Find tekst</translation>
@@ -4169,7 +4170,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="3593965109698325041">Begrænsninger for certifikatnavn</translation>
 <translation id="4358697938732213860">Tilføj en adresse</translation>
 <translation id="8396532978067103567">Forkert adgangskode.</translation>
-<translation id="5981759340456370804">Detaljeret statistik</translation>
+<translation id="5981759340456370804">Statistik til nørderne</translation>
 <translation id="9035022520814077154">Sikkerhedsfejl</translation>
 <translation id="7293654927214385623">Aktiverer QUIC via en bekræftet, krypteret kanal (kan erstatte HTTPS-transaktioner). Uden denne markering understøttes kun HTTP-anmodninger via QUIC. Dette har kun en effekt, hvis QUIC-protokollen er aktiveret.</translation>
 <translation id="8435379444928791035">Ryd cookies og andre data om websites og plugins, når du logger ud</translation>
@@ -4179,7 +4180,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="2867768963760577682">Åbn som fastgjort fane</translation>
 <translation id="8631032106121706562">Marguerit</translation>
 <translation id="1639239467298939599">Indlæser...</translation>
-<translation id="5457599981699367932">Gennemse som gæst</translation>
+<translation id="5457599981699367932">Anvend som gæst</translation>
 <translation id="8525428584879632762">Aktiveres på søgeresultatsider, eller når en indtastning behandles</translation>
 <translation id="2487656424763972284">Nem oplåsning</translation>
 <translation id="7047998246166230966">Markør</translation>
@@ -4213,14 +4214,14 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="6680028776254050810">Skift bruger</translation>
 <translation id="2908789530129661844">Zoom ud på skærmen</translation>
 <translation id="212464871579942993">Websitet på <ph name="HOST_NAME"/> indeholder elementer fra websites, som ser ud til at hoste malware, dvs. software, som kan beskadige din computer, eller på anden måde foretage handlinger, du ikke har accepteret. Alene det, at du besøger et website, der indeholder malware, kan inficere din computer. Websitet hoster også indhold fra websites, der er blevet rapporteret som &quot;phishingwebsites&quot;. Phishingwebsites narrer brugere til at opgive personlige eller finansielle oplysninger. Det foregår gerne ved, at man udgiver sig for at repræsentere velkendte institutioner, som f.eks. banker.</translation>
-<translation id="2673135533890720193">Læs din browserhistorik</translation>
+<translation id="2673135533890720193">Læse din browserhistorik</translation>
 <translation id="6860427144121307915">Åbn på en fane</translation>
-<translation id="887692350334376364">Medieundtagelser</translation>
+<translation id="887692350334376364">Undtagelser for medier</translation>
 <translation id="8156020606310233796">Listevisning</translation>
 <translation id="146000042969587795">Denne ramme blev blokeret, da den indeholder usikkert indhold.</translation>
 <translation id="3258924582848461629">Inputmetode med håndskrift til japansk</translation>
 <translation id="8426564434439698958">&amp;Søg efter dette billede på <ph name="SEARCH_ENGINE"/></translation>
-<translation id="4375035964737468845">Åbn downloadede filer</translation>
+<translation id="4375035964737468845">Åbne downloadede filer</translation>
 <translation id="3968739731834770921">Kana</translation>
 <translation id="7387829944233909572">Dialogboksen &quot;Ryd browserdata&quot;</translation>
 <translation id="8023801379949507775">Opdater udvidelser nu</translation>
@@ -4238,7 +4239,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="4104163789986725820">E&amp;ksporter...</translation>
 <translation id="9022026332614591902">Blokerede pop op-vinduer (<ph name="POP_UP_COUNT"/>)</translation>
 <translation id="380408572480438692">Aktiverer registrering af ydelsesdata, der hjælper Google med at forbedre systemet med tiden. Der sendes ingen data, før du indgiver en feedbackrapport (Alt-Shift-I) og medtager ydelsesdata. Du kan altid vende tilbage til dette skærmbillede for at deaktivere registreringen.</translation>
-<translation id="3654045516529121250">Læs dine tilgængelighedsindstillinger</translation>
+<translation id="3654045516529121250">Læse dine indstillinger for hjælpefunktioner</translation>
 <translation id="2113479184312716848">Åbn &amp;fil...</translation>
 <translation id="884264119367021077">Leveringsadresse</translation>
 <translation id="634208815998129842">Jobliste</translation>
@@ -4283,7 +4284,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="8679658258416378906">Aktiver fane 5</translation>
 <translation id="9049835026521739061">Tilstand med koreanske tegn</translation>
 <translation id="4763816722366148126">Vælg forrige indtastningsmetode</translation>
-<translation id="6458308652667395253">Administrer blokering af JavaScript ...</translation>
+<translation id="6458308652667395253">Administrer blokering af JavaScript...</translation>
 <translation id="8435334418765210033">Husket netværk</translation>
 <translation id="512608082539554821">Hvis denne indstilling er aktiveret, animeres overgange i selvstudiet for førstegangsbrugere.</translation>
 <translation id="8632275030377321303">Proxyen kan ikke ændres af brugeren.</translation>
@@ -4376,6 +4377,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="6869402422344886127">Markeret afkrydsningsfelt</translation>
 <translation id="3428010780253032925">Deaktiver visning af målretningsområde i rektangel</translation>
 <translation id="5637380810526272785">Indtastningsmetode</translation>
+<translation id="3613134908380545408">Vis <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Forbindelsen skulle prøves igen ved hjælp af en ældre version af TLS- eller SSL-protokollen. Det betyder typisk, at serveren bruger meget gammel software og kan have andre sikkerhedsproblemer.</translation>
 <translation id="404928562651467259">ADVARSEL</translation>
 <translation id="4289300219472526559">Start indtaling</translation>
@@ -4383,7 +4385,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="2872353916818027657">Skift primær skærm</translation>
 <translation id="497490572025913070">Kanter på sammensatte gengivne lag</translation>
 <translation id="4712556365486669579">Vil du gendanne malware?</translation>
-<translation id="9002707937526687073">Udsk&amp;riv ...</translation>
+<translation id="9002707937526687073">Udsk&amp;riv...</translation>
 <translation id="3851140433852960970">Der er intet tilgængeligt plugin, som kan vise dette indhold.</translation>
 <translation id="6583070985841601920">Logget ind som <ph name="USER_EMAIL_ADDRESS"/>. Synkronisering er deaktiveret af din administrator.</translation>
 <translation id="8942416694471994740">Adgang til din mikrofon styres af din administrator.</translation>
@@ -4452,7 +4454,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="7673697353781729403">Timer</translation>
 <translation id="7372527722222052179">Aktivér gengivelse af rasterbillede med nul kopier</translation>
 <translation id="6929555043669117778">Fortsæt blokering af pop op-vinduer</translation>
-<translation id="3508920295779105875">Vælg en anden mappe ...</translation>
+<translation id="3508920295779105875">Vælg en anden mappe...</translation>
 <translation id="2159915644201199628">Billedet kunne afkodes: '<ph name="IMAGE_NAME"/>'</translation>
 <translation id="904451693890288097">Indtast adgangskoden for &quot;<ph name="DEVICE_NAME"/>&quot;:</translation>
 <translation id="2987775926667433828">Kinesisk, traditionelt</translation>
@@ -4462,7 +4464,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="6187344976531853059">Flytning af vinduer til et andet skrivebord kan medføre uventede hændelser.</translation>
 <translation id="5355515193538070444">En Powerwash nulstiller din <ph name="IDS_SHORT_PRODUCT_NAME"/>-enhed til fabriksindstillingerne.</translation>
 <translation id="1839913225882990152">Fortæl os, hvad der sker.</translation>
-<translation id="3936390757709632190">&amp;Åbn lyd i ny fane</translation>
+<translation id="3936390757709632190">&amp;Åbn lyd  ny fane</translation>
 <translation id="3296763833017966289">Georgisk</translation>
 <translation id="2242687258748107519">Filoplysninger</translation>
 <translation id="1152775729948968688">Denne side indeholder dog andre ressourcer, der ikke er sikre. Disse ressourcer kan ses af andre under transporten, og de kan her ændres af en ondsindet part, så sidens opførsel kan blive forvansket.</translation>
@@ -4542,14 +4544,14 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="169515659049020177">Shift</translation>
 <translation id="3551117997325569860">Skift proxy ved at aktivere indstillingen &quot;<ph name="USE_SHARED_PROXIES"/>&quot;.</translation>
 <translation id="8906421963862390172">&amp;Indstillinger for stavekontrol</translation>
-<translation id="193971656137910869">Læs og rediger dine bogmærker</translation>
+<translation id="193971656137910869">Læse og redigere dine bogmærker</translation>
 <translation id="6268747994388690914">Importér bogmærker fra HTML-fil...</translation>
 <translation id="6096047740730590436">Åbn maksimeret</translation>
 <translation id="3924145049010392604">Meta</translation>
 <translation id="5365539031341696497">Thai indtastningsmetode (Kesmanee-tastatur)</translation>
 <translation id="5157635116769074044">Fastgør denne side til startskærmen...</translation>
 <translation id="2403091441537561402">Gateway:</translation>
-<translation id="668171684555832681">Andre ...</translation>
+<translation id="668171684555832681">Andre...</translation>
 <translation id="7540972813190816353">Der opstod en fejl ved søgning efter opdateringer: <ph name="ERROR"/></translation>
 <translation id="7029415434450801489">Implementerer en søgeknap i omnifeltet.</translation>
 <translation id="7664620655576155379">Ikke-understøttet Bluetooth-enhed: &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
@@ -4608,7 +4610,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="4771973620359291008">Der er opstået en ukendt fejl.</translation>
 <translation id="5509914365760201064">Udsteder: <ph name="CERTIFICATE_AUTHORITY"/></translation>
 <translation id="4941246025622441835">Anvend denne enhedsrekvisition, når du tilmelder enheden til virksomhedsadministration.</translation>
-<translation id="5449588825071916739">Gem alle faner som bogmærker</translation>
+<translation id="5449588825071916739">Tilføj alle faner som bogmærker</translation>
 <translation id="7073385929680664879">Gennemgå indtastningsmetoderne</translation>
 <translation id="7842062217214609161">Ingen genvej</translation>
 <translation id="6898699227549475383">Organisation (O)</translation>
@@ -4633,7 +4635,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="2509857212037838238">Installer <ph name="PLUGIN_NAME"/></translation>
 <translation id="2943400156390503548">Slides</translation>
 <translation id="3790146417033334899"><ph name="PLUGIN_NAME"/> fungerer kun på skrivebordet.</translation>
-<translation id="5117930984404104619">Overvåg adfærden for andre udvidelser, herunder de webadresser, du har besøgt.</translation>
+<translation id="5117930984404104619">Overvåge adfærden for andre udvidelser, herunder de webadresser, du har besøgt.</translation>
 <translation id="33022249435934718">GDI-håndtag</translation>
 <translation id="6308937455967653460">Gem lin&amp;k som...</translation>
 <translation id="741689768643916402">Google Wallet kan desværre kun bruges af købere med en amerikansk adresse hos denne sælger. Hvis du er amerikansk statsborger, skal du |ændre din privatadresse med Wallet| eller betale uden at bruge Google Wallet.</translation>
@@ -4644,7 +4646,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="3285322247471302225">Ny &amp;fane</translation>
 <translation id="3943582379552582368">&amp;Tilbage</translation>
 <translation id="1519264250979466059">Versionsdato</translation>
-<translation id="7607002721634913082">Midlertidigt standset</translation>
+<translation id="7607002721634913082">Sat på pause</translation>
 <translation id="7928710562641958568">Skub enheden ud</translation>
 <translation id="8729518820755801792">Chrome kan ikke åbne webadressen.</translation>
 <translation id="480990236307250886">Åbn startsiden</translation>
@@ -4665,7 +4667,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="3790909017043401679">Indtast pinkode til SIM-kort</translation>
 <translation id="1135328998467923690">Pakken er ugyldig: &quot;<ph name="ERROR_CODE"/>&quot;.</translation>
 <translation id="2339120501444485379">Indtast nyt navn</translation>
-<translation id="1753682364559456262">Administrer blokering af billeder ... </translation>
+<translation id="1753682364559456262">Administrer blokering af billeder...</translation>
 <translation id="6550675742724504774">Valgmuligheder</translation>
 <translation id="426564820080660648">Du kan søge efter opdateringer via Ethernet, Wi-Fi eller mobildata.</translation>
 <translation id="1834685210351639210">Renderer gik ned</translation>
@@ -4707,6 +4709,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="6934265752871836553">Brug kode, som endnu ikke er afprøvet, til at tvinge Chrome til at tegne indhold hurtigere. Ændringerne
         bag denne sti vil sandsynligvis ødelægge en stor mængde indhold.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Altid åben i Adobe Reader</translation>
 <translation id="8274359292107649245">Åbn Chrome på skrivebordet</translation>
 <translation id="1571119610742640910">Sammensætning til faste rootbaggrunde.</translation>
 <translation id="6514565641373682518">Denne side har deaktiveret din musemarkør.</translation>
@@ -4734,7 +4737,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="2665394472441560184">Tilføj et nyt ord</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="3653999333232393305">Tillad fortsat, at <ph name="HOST"/> har adgang til din mikrofon</translation>
-<translation id="3760460896538743390">Inspicer &amp;baggrundsside</translation>
+<translation id="3760460896538743390">Undersøg &amp;baggrundsside</translation>
 <translation id="5567989639534621706">Applikationscaches</translation>
 <translation id="9141716082071217089">Kan ikke kontrollere, om serverens certifikat er tilbagekaldt.</translation>
 <translation id="2436186046335138073">Vil du tillade, at <ph name="HANDLER_HOSTNAME"/> åbner alle <ph name="PROTOCOL"/>-links?</translation>
@@ -4765,7 +4768,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="3303260552072730022">En udvidelse har udløst fuld skærm.</translation>
 <translation id="7619338682741516875">Chrome Apps holder Chrome aktiv.</translation>
 <translation id="5212108862377457573">Juster konvertering baseret på forrige indtastning</translation>
-<translation id="3020960800108671197">Administrer blokering af ikke-sandboxede plugins ...</translation>
+<translation id="3020960800108671197">Administrer blokering af plugins uden for sandbox...</translation>
 <translation id="7992792113602598196">Fejltype: <ph name="ERROR_TYPE"/></translation>
 <translation id="8675377193764357545">Synkroniseret som <ph name="USER_EMAIL_ADDRESS"/></translation>
 <translation id="7265986070661382626">Du kan ikke gå til <ph name="SITE"/> lige nu, da websitet <ph name="BEGIN_LINK"/>anvender certifikatlåsning<ph name="END_LINK"/>. Netværksfejl og angreb er normalt midlertidige, så denne side vil sandsynligvis fungere senere.</translation>
@@ -4775,7 +4778,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="7549053541268690807">Søg i ordbog</translation>
 <translation id="8911079125461595075">Google har markeret <ph name="EXTENSION_NAME"/> som ondsindet, og installationen er blevet forhindret.</translation>
 <translation id="4347595254852029221">Aktivér hurtigt brugerskifte i avatarmenuen</translation>
-<translation id="5870086504539785141">Luk menuen for tilgængelighed</translation>
+<translation id="5870086504539785141">Luk menuen for hjælpefunktioner</translation>
 <translation id="9102800320402283920">Google Wallet kræver som minimum et fornavn og et efternavn.</translation>
 <translation id="7005848115657603926">Ugyldigt sideinterval, brug <ph name="EXAMPLE_PAGE_RANGE"/></translation>
 <translation id="3705722231355495246">-</translation>
@@ -4790,7 +4793,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="8056430285089645882">Det er forstået. Vis det ikke igen.</translation>
 <translation id="383652340667548381">Serbisk</translation>
 <translation id="6522797484310591766">Log ind nu</translation>
-<translation id="878069093594050299">Dette certifikat er blevet verificeret til følgende brug:</translation>
+<translation id="878069093594050299">Dette certifikat er blevet bekræftet til følgende brug:</translation>
 <translation id="7334320624316649418">&amp;Annuller fortryd omarrangering</translation>
 <translation id="815491593104042026">Ups! Godkendelsen mislykkedes, fordi den var konfigureret til at bruge en webadresse, som ikke er sikker (<ph name="BLOCKED_URL"/>). Kontakt din administrator.</translation>
 <translation id="5852112051279473187">Ups!  Der gik noget galt under tilmeldingen af denne enhed.  Prøv igen, eller kontakt din supportrepræsentant.</translation>
@@ -4839,7 +4842,7 @@ Tryk på en vilkårlig tast for at fortsætte udforskningen.</translation>
 <translation id="1580652505892042215">Kontekst:</translation>
 <translation id="3942974664341190312">2-sæt</translation>
 <translation id="8477241577829954800">Tilsidesat</translation>
-<translation id="6735304988756581115">Vis cookies og andre websitedata ...</translation>
+<translation id="6735304988756581115">Vis cookies og andre websitedata...</translation>
 <translation id="5996258716334177896">Din profil blev ikke åbnet korrekt. Nogle funktioner er muligvis ikke tilgængelige. Kontroller, at profilen eksisterer, og at du har tilladelse til at læse og skrive dens indhold.</translation>
 <translation id="7040138676081995583">Åbn med...</translation>
 <translation id="7953739707111622108">Denne enhed kan ikke åbnes, fordi dens filsystem ikke blev genkendt.</translation>
@@ -4905,6 +4908,7 @@ Tryk på en vilkårlig tast for at fortsætte udforskningen.</translation>
 <translation id="824543159844843373">Aktivér element 3 på applikationslisten</translation>
 <translation id="3819800052061700452">&amp;Fuld skærm</translation>
 <translation id="48607902311828362">Flytilstand</translation>
+<translation id="711840821796638741">Vis administrerede bogmærker</translation>
 <translation id="3360297538363969800">Udskrivning mislykkedes. Kontrollér din printer, og prøv igen.</translation>
 <translation id="680572642341004180">Aktivér RLZ-sporing i <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Undlad at bruge den tilbagekaldte oplader.</translation>
@@ -4938,7 +4942,7 @@ Tryk på en vilkårlig tast for at fortsætte udforskningen.</translation>
 <translation id="8054517699425078995">Denne type fil kan beskadige din enhed. Vil du beholde <ph name="FILE_NAME"/> alligevel?</translation>
 <translation id="3093189737735839308">Er du sikker på, at du vil installere <ph name="PLUGIN_NAME"/>? Du bør kun installere plugins, som du har tillid til</translation>
 <translation id="1928696683969751773">Opdateringer</translation>
-<translation id="6545834809683560467">Brug en forslagstjeneste til at hjælpe med at færdiggøre søgninger og webadresser, der indtastes på adresselinjen eller i søgefeltet i Appliste</translation>
+<translation id="6545834809683560467">Brug en forslagstjeneste til at færdiggøre søgninger og webadresser, der indtastes i adresselinjen eller i søgefeltet i Appliste</translation>
 <translation id="3582792037806681688">Samlet login fra flere konti er blevet deaktiveret for en bruger i denne session</translation>
 <translation id="3488065109653206955">Delvist aktiveret</translation>
 <translation id="3683524264665795342"><ph name="APP_NAME"/> anmoder om at dele din skærm</translation>
@@ -4978,7 +4982,7 @@ Tryk på en vilkårlig tast for at fortsætte udforskningen.</translation>
 <translation id="385051799172605136">Tilbage</translation>
 <translation id="4196861286325780578">&amp;Annuller fortryd flytning</translation>
 <translation id="5075306601479391924">Deaktiver påkrævede bevægelser for brugeren ved afspilning af medieelementer. Hvis du aktiverer dette, tillader du automatisk afspilning.</translation>
-<translation id="9112748030372401671">Skift baggrund</translation>
+<translation id="9112748030372401671">Skifte baggrund</translation>
 <translation id="8938356204940892126">Jeg giver op</translation>
 <translation id="2670965183549957348">Chewing indtastningsmetode</translation>
 <translation id="7839804798877833423">Hvis du henter disse filer, bruge du ca. <ph name="FILE_SIZE"/> mobildata.</translation>
@@ -5000,7 +5004,7 @@ Tryk på en vilkårlig tast for at fortsætte udforskningen.</translation>
 <translation id="8860520442470629999">Der anvendes et virtuelt kort til Google Wallet for denne transaktion. Et virtuelt kort er et nyt kortnummer, så sælgeren aldrig ser dit rigtige kreditkortnummer.</translation>
 <translation id="6586451623538375658">Skift primær museknap</translation>
 <translation id="475088594373173692">Første bruger</translation>
-<translation id="1731911755844941020">Sender anmodning ...</translation>
+<translation id="1731911755844941020">Sender anmodning...</translation>
 <translation id="7885283703487484916">meget kort</translation>
 <translation id="4361745360460842907">Åbn som fane</translation>
 <translation id="5238278114306905396">Appen &quot;<ph name="EXTENSION_NAME"/>&quot; blev automatisk fjernet.</translation>
@@ -5122,7 +5126,7 @@ Accepterer du?</translation>
 <translation id="4645676300727003670">&amp;Behold</translation>
 <translation id="3225579507836276307">En tredjepartsudvidelse har blokeret adgangen til denne webside.</translation>
 <translation id="6815551780062710681">rediger</translation>
-<translation id="6911468394164995108">Find andre... </translation>
+<translation id="6911468394164995108">Vælg et andet...</translation>
 <translation id="2510708650472996893">Farveprofil:</translation>
 <translation id="343467364461911375">Nogle indholdstjenester anvender maskin-id'er til entydigt at identificere dig med det formål at give adgang til beskyttet indhold.</translation>
 <translation id="5061708541166515394">Kontrast</translation>
@@ -5178,7 +5182,7 @@ Accepterer du?</translation>
 <translation id="5284518706373932381">Du bør komme tilbage til dette website om et par timer. Google Beskyttet browsing <ph name="BEGIN_LINK"/>registrerede malware<ph name="END_LINK"/> på <ph name="SITE"/> for nylig. Websites, der normalt er sikre, inficeres undertiden med malware.</translation>
 <translation id="969892804517981540">Officiel version</translation>
 <translation id="1691608011302982743">Du fjernede din enhed for hurtigt!</translation>
-<translation id="445923051607553918">Tilmeld dig et Wi-Fi-netværk</translation>
+<translation id="445923051607553918">Vælg Wi-Fi-netværk</translation>
 <translation id="1898137169133852367">En Powerwash nulstiller din <ph name="IDS_SHORT_PRODUCT_NAME"/>-enhed til fabriksindstillingerne. Desuden vender din enhed tilbage til en tidligere opdatering af <ph name="IDS_SHORT_PRODUCT_NAME"/>.</translation>
 <translation id="4215898373199266584">Psst! Prøv at bruge Inkognitotilstand (<ph name="INCOGNITO_MODE_SHORTCUT"/>) næste gang.</translation>
 <translation id="1048597748939794622">Automatisk aktivering for alle lag</translation>
index 8b9317b..4aed0ad 100644 (file)
 <translation id="2391762656119864333">Aufheben</translation>
 <translation id="3315158641124845231"><ph name="PRODUCT_NAME"/> ausblenden</translation>
 <translation id="7069168971636881066">Auf diesem Gerät muss mindestens ein Konto vorhanden sein, bevor ein betreuter Nutzer erstellt werden kann.</translation>
-<translation id="7766807826975222231">Tour</translation>
+<translation id="7766807826975222231">Tour starten</translation>
 <translation id="2269471294353474737"><ph name="MARKUP_1"/>Greifen Sie überall auf Ihre Dateien zu, auch offline.<ph name="MARKUP_2"/>
     Dateien in Google Drive sind aktuell und auf jedem Gerät verfügbar.<ph name="MARKUP_3"/>
     <ph name="MARKUP_4"/>Bewahren Sie Ihre Dateien sicher auf.<ph name="MARKUP_5"/>
@@ -710,7 +710,7 @@ Alle Nutzer müssen sich abmelden, um fortfahren zu können.</translation>
 <translation id="3984921062031549150">Renderer reagiert nicht mehr</translation>
 <translation id="7925285046818567682">Warten auf <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Zugriff auf die Kamera immer blockieren</translation>
-<translation id="2964845078799970531">Mit dem einfachen Entsperren können Sie Ihr Chromebook entsperren, sofern es sich in der Nähe Ihres Telefons befindet.</translation>
+<translation id="2964845078799970531">Mit &quot;Einfaches Entsperren&quot; können Sie Ihr Chromebook entsperren, sofern es sich in der Nähe Ihres Telefons befindet.</translation>
 <translation id="5053803681436838483">Neue Versandadresse...</translation>
 <translation id="5952256601775839173">Klicken mit drei Fingern für das Touchpad aktivieren</translation>
 <translation id="3280237271814976245">Speichern &amp;unter...</translation>
@@ -899,7 +899,7 @@ Alle Nutzer müssen sich abmelden, um fortfahren zu können.</translation>
 <translation id="7684540948112007255">Mehrere Dateien herunterladen</translation>
 <translation id="2537271621194795300">Starts</translation>
 <translation id="3636096452488277381">Hallo <ph name="USER_GIVEN_NAME"/></translation>
-<translation id="4911714727432509308">Es sind für keine Erweiterungen Tastaturkürzel zugewiesen.</translation>
+<translation id="4911714727432509308">Es sind für keine Erweiterungen Tastenkombinationen zugewiesen.</translation>
 <translation id="5999606216064768721">Titelleiste und Ränder des Systems verwenden</translation>
 <translation id="921568617530782833">Alle eigenen Daten auf von Ihnen besuchten Websites lesen und ändern</translation>
 <translation id="225943865679747347">Fehlercode: <ph name="ERROR_CODE"/></translation>
@@ -1167,7 +1167,7 @@ Geheimtipp: Verwenden Sie nächstes Mal den Inkognito-Modus (<ph name="SHORTCUT_
 <translation id="3791151686802386313">Erste Unternehmensanmeldung wird vorbereitet...</translation>
 <translation id="3393716657345709557">Angeforderter Eintrag wurde nicht im Cache gefunden.</translation>
 <translation id="7191454237977785534">Datei speichern unter</translation>
-<translation id="7241389281993241388">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Client-Zertifikat zu importieren.</translation>
+<translation id="7241389281993241388">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Clientzertifikat zu importieren.</translation>
 <translation id="8996526648899750015">Konto hinzufügen...</translation>
 <translation id="1773292249699193156">Für Ihr <ph name="ACCOUNT_EMAIL"/>-Konto verfügt die Erweiterung optional über folgende Berechtigungen:</translation>
 <translation id="7206693748120342859"><ph name="PLUGIN_NAME"/> wird heruntergeladen...</translation>
@@ -1357,7 +1357,7 @@ Geheimtipp: Verwenden Sie nächstes Mal den Inkognito-Modus (<ph name="SHORTCUT_
 <translation id="3118046075435288765">Server hat die Verbindung unerwartet geschlossen.</translation>
 <translation id="6133173853026656527"><ph name="FILE_NAME"/> wird verschoben...</translation>
 <translation id="4697214168136963651"><ph name="URL"/> wurde blockiert.</translation>
-<translation id="5380103295189760361">Halten Sie Strg, Alt, Shift oder Suchen gedrückt, um die Tastaturkürzel für diese Modifikatoren anzuzeigen.</translation>
+<translation id="5380103295189760361">Halten Sie Strg, Alt, Shift oder Suchen gedrückt, um die Tastenkombinationen für diese Modifikatoren anzuzeigen.</translation>
 <translation id="7791543448312431591">Hinzufügen</translation>
 <translation id="8569764466147087991">Zu öffnende Datei auswählen</translation>
 <translation id="9131487537093447019">Nachrichten an Bluetooth-Geräte senden und von diesen erhalten</translation>
@@ -2261,7 +2261,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="2322193970951063277">Kopf- und Fußzeilen</translation>
 <translation id="6436164536244065364">Im Web Store ansehen</translation>
 <translation id="9137013805542155359">Original anzeigen</translation>
-<translation id="6423731501149634044">Adobe Reader als Standard-PDF Viewer verwenden?</translation>
+<translation id="6423731501149634044">Adobe Reader als Standard-PDF-Viewer verwenden?</translation>
 <translation id="1965328510789761112">Privater Speicher</translation>
 <translation id="7312441861087971374"><ph name="PLUGIN_NAME"/> ist veraltet.</translation>
 <translation id="5790085346892983794">Abgeschlossen</translation>
@@ -2592,7 +2592,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="7303492016543161086">Optionen für Bedienungshilfen im Systemmenü anzeigen</translation>
 <translation id="6410257289063177456">Bilddateien</translation>
 <translation id="6419902127459849040">Mitteleuropäisch</translation>
-<translation id="6707389671160270963">SSL-Client-Zertifikat</translation>
+<translation id="6707389671160270963">SSL-Clientzertifikat</translation>
 <translation id="6083557600037991373">Zur Beschleunigung von Webseiten speichert <ph name="PRODUCT_NAME"/> heruntergeladene Dateien vorübergehend auf einem Laufwerk. Wenn <ph name="PRODUCT_NAME"/> nicht richtig beendet wird, können diese Dateien beschädigt werden, was schließlich zu einem Fehler führt. Das Problem kann gelöst werden, indem die Seite neu geladen wird, und ein richtiges Beenden sollte solchen Problemen in Zukunft vorbeugen.<ph name="LINE_BREAK"/>Sollte das Problem aber weiterhin auftreten, so versuchen Sie, den Cache zu leeren. In einigen Fällen kann dies auch auf Hardwareprobleme hinweisen.</translation>
 <translation id="5154176924561037127">F8</translation>
 <translation id="5298219193514155779">Design von</translation>
@@ -2879,7 +2879,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="7347751611463936647">Um diese Erweiterung zu verwenden, geben Sie &quot;<ph name="EXTENSION_KEYWORD"/>&quot; ein, dann TAB, und dann Ihren Befehl oder Ihre Suchanfrage.</translation>
 <translation id="878431691778285679">Offenbar verwalten Sie bereits einen Nutzer dieses Namens.<ph name="LINE_BREAK"/>Möchten Sie <ph name="BEGIN_LINK"/><ph name="PROFILE_NAME"/> auf dieses Gerät importieren<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> möchte Ihr Mikrofon verwenden.</translation>
-<translation id="2805756323405976993">Apps definitiv möglich</translation>
+<translation id="2805756323405976993">Apps</translation>
 <translation id="5151511998946489774">Die Identität dieser Website wurde von <ph name="ISSUER"/> überprüft und ist öffentlich überprüfbar.</translation>
 <translation id="1608626060424371292">Diesen Nutzer entfernen</translation>
 <translation id="2779552785085366231">Diese Seite kann zum App Launcher hinzugefügt werden.</translation>
@@ -3182,7 +3182,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="991969738502325513">Was sollten Sie tun?</translation>
 <translation id="1017280919048282932">&amp;Zum Wörterbuch hinzufügen</translation>
 <translation id="3534879087479077042">Was ist ein betreuter Nutzer?</translation>
-<translation id="7211828883345145708">Aktiviert zusätzliche Tastaturkürzel für die Fehlersuche in Chromium</translation>
+<translation id="7211828883345145708">Aktiviert zusätzliche Tastenkombinationen für die Fehlersuche in Chromium</translation>
 <translation id="8319414634934645341">Erweiterte Schlüsselverwendung</translation>
 <translation id="6056710589053485679">Normales Aktualisieren</translation>
 <translation id="4563210852471260509">Anfängliche Eingabesprache ist Chinesisch.</translation>
@@ -3264,7 +3264,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="1244303850296295656">Erweiterungsfehler</translation>
 <translation id="3541661933757219855">Drücken Sie zum Ausblenden &quot;Strg+Alt+/&quot; oder &quot;Esc&quot;</translation>
 <translation id="2948300991547862301">Zu <ph name="PAGE_TITLE"/> wechseln</translation>
-<translation id="5357579842739549440">Debugging-Tastaturkürzel</translation>
+<translation id="5357579842739549440">Debugging-Tastenkombinationen</translation>
 <translation id="4284834956062510583">Erweiterung deinstalliert</translation>
 <translation id="3660234220361471169">Nicht vertrauenswürdig</translation>
 <translation id="2679385451463308372">Über den Systemdialog drucken...</translation>
@@ -3306,7 +3306,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="5917011688104426363">Adressleiste im Suchmodus fokussieren</translation>
 <translation id="3269101346657272573">Geben Sie die PIN ein.</translation>
 <translation id="2822854841007275488">Arabisch</translation>
-<translation id="6559948977408379772">Dieses Symbol erscheint, wenn Ihr Telefon sich in der Nähe des Netzwerks befindet und die einfache Entsperrung verfügbar ist. Sie erhalten dann ohne Eingabe eines Passworts Zugriff.</translation>
+<translation id="6559948977408379772">Dieses Symbol erscheint, wenn Ihr Telefon sich in der Nähe des Netzwerks befindet und &quot;Einfaches Entsperren&quot; verfügbar ist. Sie erhalten dann ohne Eingabe eines Passworts Zugriff.</translation>
 <translation id="5857090052475505287">Neuer Ordner</translation>
 <translation id="7450732239874446337">Netzwerk-E/A unterbrochen</translation>
 <translation id="4003393903129308792">Rasterung mit 1 Kopie aktivieren</translation>
@@ -3422,7 +3422,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="1526560967942511387">Unbenanntes Dokument</translation>
 <translation id="3979748722126423326"><ph name="NETWORKDEVICE"/> aktivieren</translation>
 <translation id="7819857487979277519">PSK (WPA oder RSN)</translation>
-<translation id="7561031016893995297">Geräte mit einfacher Entsperrung in den Kontoeinstellungen verwalten</translation>
+<translation id="7561031016893995297">Geräte mit der Option &quot;Einfaches Entsperren&quot; in den Kontoeinstellungen verwalten</translation>
 <translation id="2238379619048995541">Daten für aktiven Zustand</translation>
 <translation id="4367133129601245178">Bild-URL k&amp;opieren</translation>
 <translation id="6326175484149238433">Aus Chrome entfernen</translation>
@@ -3476,7 +3476,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="1425734930786274278">Die folgenden Cookies wurden blockiert (Cookies von Drittanbietern werden ausnahmslos blockiert):</translation>
 <translation id="3290704484208221223">Prozent</translation>
 <translation id="5265562206369321422">Seit über einer Woche offline</translation>
-<translation id="6805647936811177813">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Client-Zertifikat von <ph name="HOST_NAME"/> herunterzuladen.</translation>
+<translation id="6805647936811177813">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Clientzertifikat von <ph name="HOST_NAME"/> herunterzuladen.</translation>
 <translation id="6412931879992742813">Neues Inkognitofenster</translation>
 <translation id="1105117579475534983">Webseite blockiert</translation>
 <translation id="1673103856845176271">Auf die Datei konnte aus Sicherheitsgründen nicht zugegriffen werden.</translation>
@@ -3772,7 +3772,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="9006533633560719845">Zustimmung des Nutzers für Erweiterungsskripts</translation>
 <translation id="4555769855065597957">Schatten</translation>
 <translation id="4366837566726634418">Die Auslastung des gemeinsamen Speichers insgesamt für alle Prozesse im Zusammenhang mit <ph name="SHORT_PRODUCT_NAME"/></translation>
-<translation id="6787839852456839824">Tastaturkürzel</translation>
+<translation id="6787839852456839824">Tastenkombinationen</translation>
 <translation id="1327297493974051953">Klickverzögerung deaktivieren</translation>
 <translation id="6791443592650989371">Aktivierungsstatus:</translation>
 <translation id="4801257000660565496">App-Verknüpfungen erstellen</translation>
@@ -3922,6 +3922,7 @@ Achten Sie darauf, dass dadurch keine vertraulichen Informationen offengelegt we
 <translation id="6460601847208524483">Nächste Übereinstimmung suchen</translation>
 <translation id="397703832102027365">Aktualisierung wird abgeschlossen...</translation>
 <translation id="8146177459103116374">Wenn Sie bereits auf diesem Gerät registriert sind, können Sie sich <ph name="LINK2_START"/>als vorhandener Nutzer anmelden<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Verwaltete Lesezeichen anzeigen</translation>
 <translation id="4856478137399998590">Ihr mobiler Datendienst ist aktiviert und einsatzbereit.</translation>
 <translation id="3305389145870741612">Die Formatierung kann einige Sekunden dauern. Bitte warten...</translation>
 <translation id="3648607100222897006">Diese experimentellen Funktionen können sich jederzeit ändern, abstürzen oder deaktiviert werden. Wir übernehmen keinerlei Gewährleistung für die Folgen der Aktivierung eines dieser Experimente. Es ist sogar möglich, dass Ihr Browser spontan in Flammen aufgeht. Spaß beiseite: Es ist möglich, dass Ihr Browser alle Ihre Daten löscht. Möglicherweise werden auch Ihre Sicherheits- und Datenschutzeinstellungen auf unerwartete Weise manipuliert. Alle von Ihnen aktivierten Experimente werden für alle Nutzer dieses Browsers aktiviert. Seien Sie also vorsichtig, wenn Sie fortfahren.</translation>
@@ -4233,7 +4234,7 @@ Möchten Sie <ph name="CONTROL_PANEL_APPLET_NAME"/> starten?</translation>
 <translation id="5963026469094486319">Designs abrufen</translation>
 <translation id="7586312264284919041">Möchten Sie diese Seite übersetzen?</translation>
 <translation id="3855072293748278406">Plug-in-Zugriff ohne Sandbox</translation>
-<translation id="8357224663288891423">Tastaturkürzel für Erweiterungen und Apps</translation>
+<translation id="8357224663288891423">Tastenkombinationen für Erweiterungen und Apps</translation>
 <translation id="1893137424981664888">Keine Plug-ins installiert</translation>
 <translation id="4919810557098212913"><ph name="HOST"/> möchte Ihre Kamera verwenden.</translation>
 <translation id="5434706434408777842">F3</translation>
@@ -4351,6 +4352,7 @@ Möchten Sie <ph name="CONTROL_PANEL_APPLET_NAME"/> starten?</translation>
 <translation id="6869402422344886127">Aktiviertes Kontrollkästchen</translation>
 <translation id="3428010780253032925">Zielbestimmung in Ansichten mithilfe von Rechtecken deaktivieren</translation>
 <translation id="5637380810526272785">Eingabemethode</translation>
+<translation id="3613134908380545408">&quot;<ph name="FOLDER_NAME"/>&quot; anzeigen</translation>
 <translation id="2837049386027881519">Das Herstellen der Verbindung musste mit einer älteren Version des TLS- oder SSL-Protokolls wiederholt werden. Normalerweise bedeutet dies, dass der Server sehr alte Software verwendet und möglicherweise andere Sicherheitsprobleme bestehen.</translation>
 <translation id="404928562651467259">Warnung</translation>
 <translation id="4289300219472526559">Sprachausgabe starten</translation>
@@ -4682,6 +4684,7 @@ Möchten Sie <ph name="CONTROL_PANEL_APPLET_NAME"/> starten?</translation>
 <translation id="2859369953631715804">Mobilfunknetz auswählen</translation>
 <translation id="6934265752871836553">Aktiviert den neuesten experimentellen Code für ein schnelleres Rendering von Inhalten in Chrome. Aufgrund der Änderungen dieses Pfades werden viele Inhalte wahrscheinlich nicht korrekt dargestellt.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Immer mit Adobe Reader öffnen</translation>
 <translation id="8274359292107649245">Chrome auf dem Desktop öffnen</translation>
 <translation id="1571119610742640910">Erstellung für feste Root-Hintergründe</translation>
 <translation id="6514565641373682518">Diese Seite hat den Mauszeiger deaktiviert.</translation>
@@ -4877,6 +4880,7 @@ Drücken Sie eine beliebige Taste, um fortzufahren.</translation>
 <translation id="824543159844843373">Übersichtselement 3 aktivieren</translation>
 <translation id="3819800052061700452">V&amp;ollbildmodus</translation>
 <translation id="48607902311828362">Flugmodus</translation>
+<translation id="711840821796638741">Verwaltete Lesezeichen anzeigen</translation>
 <translation id="3360297538363969800">Fehler beim Drucken. Bitte überprüfen Sie Ihren Drucker und versuchen Sie es erneut.</translation>
 <translation id="680572642341004180">RLZ-Nachverfolgung für <ph name="SHORT_PRODUCT_OS_NAME"/> aktivieren</translation>
 <translation id="688797901999351107">Verwenden Sie das zurückgerufene Ladegerät bitte nicht mehr.</translation>
@@ -5056,7 +5060,7 @@ Sind Sie einverstanden?</translation>
 <translation id="4912643508233590958">Inaktive Weckbefehle</translation>
 <translation id="7839192898639727867">Schlüssel-ID für Antragsteller des Zertifikats</translation>
 <translation id="4759238208242260848">Downloads</translation>
-<translation id="2879560882721503072">Das von <ph name="ISSUER"/> ausgestellte Client-Zertifikat wurde erfolgreich gespeichert.</translation>
+<translation id="2879560882721503072">Das von <ph name="ISSUER"/> ausgestellte Clientzertifikat wurde erfolgreich gespeichert.</translation>
 <translation id="1275718070701477396">Ausgewählt</translation>
 <translation id="1178581264944972037">Anhalten</translation>
 <translation id="3948633535993872459"><ph name="PROTOCOL"/>-Links</translation>
@@ -5088,7 +5092,7 @@ Sind Sie einverstanden?</translation>
 <translation id="7427348830195639090">Hintergrundseite: <ph name="BACKGROUND_PAGE_URL"/></translation>
 <translation id="8390029840652165810">Überprüfen Sie, ob Ihre Netzwerkverbindung funktioniert. Falls das Problem weiterhin besteht, melden Sie sich ab und wieder an, um Ihre Anmeldedaten neu zu laden.</translation>
 <translation id="4034042927394659004">Tastenhelligkeit verringern</translation>
-<translation id="5898154795085152510">Der Server hat ein ungültiges Client-Zertifikat zurückgegeben. Fehler <ph name="ERROR_NUMBER"/> (<ph name="ERROR_NAME"/>).</translation>
+<translation id="5898154795085152510">Der Server hat ein ungültiges Clientzertifikat zurückgegeben. Fehler <ph name="ERROR_NUMBER"/> (<ph name="ERROR_NAME"/>).</translation>
 <translation id="2704184184447774363">Microsoft-Dokumentsignatur</translation>
 <translation id="5677928146339483299">Blockiert</translation>
 <translation id="4645676300727003670">&amp;Beibehalten</translation>
@@ -5123,7 +5127,7 @@ Sind Sie einverstanden?</translation>
 <translation id="2669198762040460457">Sie haben einen falschen Nutzernamen oder ein falsches Passwort eingegeben.</translation>
 <translation id="5849626805825065073">Bei deaktivierter Option wird der Text bei beschleunigtem Aufbau mit Graustufen-Antialiasing anstelle von LCD-Subpixeln gerendert.</translation>
 <translation id="8509646642152301857">Beim Herunterladen des Wörterbuchs für die Rechtschreibprüfung ist ein Fehler aufgetreten.</translation>
-<translation id="1161575384898972166">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Client-Zertifikat zu exportieren.</translation>
+<translation id="1161575384898972166">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Clientzertifikat zu exportieren.</translation>
 <translation id="7056526158851679338">&amp;Geräte untersuchen</translation>
 <translation id="1718559768876751602">Jetzt ein Google-Konto erstellen</translation>
 <translation id="7408287099496324465">Wenn diese Option aktiviert ist, wird die EmbeddedSearch API zur Übermittlung von Suchanfragen auf der Suchergebnisseite verwendet.</translation>
@@ -5150,11 +5154,11 @@ Sind Sie einverstanden?</translation>
 <translation id="5284518706373932381">Sie sollten die Website in ein paar Stunden erneut besuchen. Google Safe Browsing hat kürzlich <ph name="BEGIN_LINK"/>Malware<ph name="END_LINK"/> auf <ph name="SITE"/> gefunden. Websites, die in der Regel sicher sind, können gelegentlich mit Malware infiziert sein.</translation>
 <translation id="969892804517981540">Offizieller Build</translation>
 <translation id="1691608011302982743">Sie haben das Gerät zu früh entfernt!</translation>
-<translation id="445923051607553918">WLAN-Netzwerk verwenden</translation>
+<translation id="445923051607553918">Mit WLAN-Netzwerk verbinden</translation>
 <translation id="1898137169133852367">Durch einen Powerwash wird Ihr <ph name="IDS_SHORT_PRODUCT_NAME"/>-Gerät auf den Werkszustand zurückgesetzt. Zusätzlich wird bei Ihrem Gerät ein früheres Update von <ph name="IDS_SHORT_PRODUCT_NAME"/> wiederhergestellt.</translation>
 <translation id="4215898373199266584">Geheimtipp: Verwenden Sie nächstes Mal den Inkognito-Modus (<ph name="INCOGNITO_MODE_SHORTCUT"/>).</translation>
 <translation id="1048597748939794622">Erzwingt die Einstellung auf allen Ebenen</translation>
-<translation id="9169496697824289689">Tastaturkürzel ansehen</translation>
+<translation id="9169496697824289689">Tastenkombinationen ansehen</translation>
 <translation id="420676372321767680">Dekodieren ohne Aufbau aktivieren</translation>
 <translation id="2925966894897775835">Tabellen</translation>
 <translation id="3349155901412833452">Kandidatenliste mit den Tasten &quot;,&quot; und &quot;.&quot; paginieren</translation>
index f6f2be0..94d29a4 100644 (file)
 <translation id="6460601847208524483">Εύρεση επόμενου</translation>
 <translation id="397703832102027365">Ολοκλήρωση…</translation>
 <translation id="8146177459103116374">Εάν έχετε ήδη εγγραφεί σε αυτήν τη συσκευή, μπορείτε <ph name="LINK2_START"/>να συνδεθείτε ως υπάρχων χρήστης<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Εμφάνιση διαχειριζόμενων σελιδοδεικτών</translation>
 <translation id="4856478137399998590">Η υπηρεσία δεδομένων κινητής συσκευής είναι ενεργοποιημένη και έτοιμη προς χρήση</translation>
 <translation id="3305389145870741612">Η διαδικασία διαμόρφωσης ενδέχεται να διαρκέσει μερικά δευτερόλεπτα. Περιμένετε.</translation>
 <translation id="3648607100222897006">Αυτές οι πειραματικές λειτουργίες ενδέχεται να αλλάξουν, να διακοπούν ή να εξαφανιστούν οποιαδήποτε στιγμή. Δεν παρέχουμε καμία εγγύηση όσον αφορά τι θα συμβεί σε περίπτωση που ενεργοποιήσετε κάποια από αυτές, ενώ το πρόγραμμα περιήγησής σας ενδέχεται να παρουσιάσει σφάλμα, όπως να διαγράψει όλα τα δεδομένα σας. Επίσης, η ασφάλεια και το απόρρητο ενδέχεται να παραβιαστούν με μη αναμενόμενους τρόπους. Αν ενεργοποιήσετε κάποια πειραματική λειτουργία, η λειτουργία θα ενεργοποιηθεί για όλους τους χρήστες αυτού του προγράμματος περιήγησης. Συνεχίστε με προσοχή.</translation>
 <translation id="6869402422344886127">Επιλεγμένο πλαίσιο ελέγχου</translation>
 <translation id="3428010780253032925">Απενεργοποίηση στόχευσης βάσει ορθογωνίου στις προβολές</translation>
 <translation id="5637380810526272785">Μέθοδος εισαγωγής</translation>
+<translation id="3613134908380545408">Εμφάνιση <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Η σύνδεση θα πρέπει να επαναληφθεί με χρήση μιας παλαιότερης έκδοσης του πρωτοκόλλου TLS ή SSL. Αυτό συνήθως σημαίνει ότι ο διακομιστής χρησιμοποιεί πολύ παλιό λογισμικό και ενδέχεται να αντιμετωπίζει ζητήματα ασφάλειας.</translation>
 <translation id="404928562651467259">ΠΡΟΕΙΔΟΠΟΙΗΣΗ</translation>
 <translation id="4289300219472526559">Έναρξη ομιλίας</translation>
 <translation id="6934265752871836553">Χρησιμοποιήστε κώδικα που βρίσκεται σε στάδιο εξέλιξης, ώστε το Chrome να αντλεί περιεχόμενο ταχύτερα. Οι αλλαγές
         σε αυτήν τη διαδρομή είναι πολύ πιθανό να έχουν ως αποτέλεσμα την καταστροφή πολλών περιεχομένων.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Να είναι πάντα ανοικτό στο Adobe Reader</translation>
 <translation id="8274359292107649245">Ανοίξτε το Chrome στην επιφάνεια εργασίας</translation>
 <translation id="1571119610742640910">Σύνθεση για σταθερές κεντρικές ταπετσαρίες.</translation>
 <translation id="6514565641373682518">Αυτή η σελίδα έχει απενεργοποιήσει τον δείκτη του ποντικιού σας.</translation>
 <translation id="824543159844843373">Ενεργοποίηση στοιχείου λειτουργίας εκκίνησης 3</translation>
 <translation id="3819800052061700452">&amp;Πλήρης οθόνη</translation>
 <translation id="48607902311828362">Λειτουργία πτήσης</translation>
+<translation id="711840821796638741">Εμφάνιση διαχειριζόμενων σελιδοδεικτών</translation>
 <translation id="3360297538363969800">Η εκτύπωση απέτυχε. Ελέγξτε τον εκτυπωτή σας και δοκιμάστε ξανά.</translation>
 <translation id="680572642341004180">Ενεργοποίηση παρακολούθησης RLZ στο <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Σταματήστε να χρησιμοποιείτε το φορτιστή που ανακλήθηκε.</translation>
index af76040..328abaf 100644 (file)
@@ -907,7 +907,7 @@ All users must sign out to continue.</translation>
 <translation id="3926862159284741883">Enable WebGL Draft Extensions</translation>
 <translation id="7684540948112007255">download multiple files.</translation>
 <translation id="2537271621194795300">Startups</translation>
-<translation id="3636096452488277381">Howdy, <ph name="USER_GIVEN_NAME"/>.</translation>
+<translation id="3636096452488277381">Hi, <ph name="USER_GIVEN_NAME"/>.</translation>
 <translation id="4911714727432509308">No extensions have keyboard shortcuts assigned.</translation>
 <translation id="5999606216064768721">Use System Title Bar and Borders</translation>
 <translation id="921568617530782833">Read and modify all your data on the websites that you visit</translation>
@@ -3963,6 +3963,7 @@ and incorrect credentials. Either an attacker is trying to pretend to be <ph nam
 <translation id="6460601847208524483">Find Next</translation>
 <translation id="397703832102027365">Finalising...</translation>
 <translation id="8146177459103116374">If you've already registered on this device, you can <ph name="LINK2_START"/>sign in as an existing user<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Show managed bookmarks</translation>
 <translation id="4856478137399998590">Your data service is activated and ready to use</translation>
 <translation id="3305389145870741612">The formatting process can take a couple of seconds. Please wait.</translation>
 <translation id="3648607100222897006">These experimental features may change, break or disappear at any time. We make absolutely no guarantees about what may happen if you turn one of these experiments on, and your browser may even spontaneously combust. Jokes aside, your browser may delete all your data or your security and privacy could be compromised in unexpected ways. Any experiments that you enable will be enabled for all users of this browser. Please proceed with caution.</translation>
@@ -4393,6 +4394,7 @@ and incorrect credentials. Either an attacker is trying to pretend to be <ph nam
 <translation id="6869402422344886127">Ticked checkbox</translation>
 <translation id="3428010780253032925">Disable rect-based targeting in views</translation>
 <translation id="5637380810526272785">Input Method</translation>
+<translation id="3613134908380545408">Show <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">The connection had to be retried using an older version of the TLS or SSL protocol. This typically means that the server is using very old software and may have other security issues.</translation>
 <translation id="404928562651467259">WARNING</translation>
 <translation id="4289300219472526559">Start Speaking</translation>
@@ -4726,6 +4728,7 @@ Calculating time until full</translation>
 <translation id="6934265752871836553">Use bleeding-edge code to make Chrome draw content faster. The changes
         behind this path are very likely to break lots of content.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Always open in Adobe Reader</translation>
 <translation id="8274359292107649245">Open Chrome on the desktop</translation>
 <translation id="1571119610742640910">Compositing for fixed root backgrounds.</translation>
 <translation id="6514565641373682518">This page has disabled your mouse cursor.</translation>
@@ -4926,6 +4929,7 @@ Press any key to continue exploring.</translation>
 <translation id="824543159844843373">Activate launcher item 3</translation>
 <translation id="3819800052061700452">&amp;Full screen</translation>
 <translation id="48607902311828362">Aeroplane mode</translation>
+<translation id="711840821796638741">Show Managed Bookmarks</translation>
 <translation id="3360297538363969800">Printing failed. Please check your printer and try again.</translation>
 <translation id="680572642341004180">Enable RLZ tracking on <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Please stop using the recalled charger.</translation>
index 2359e69..4a77266 100644 (file)
@@ -2894,7 +2894,7 @@ Asegúrate de no revelar información confidencial.</translation>
 <translation id="7347751611463936647">Para usar esta extensión, escribe &quot;<ph name="EXTENSION_KEYWORD"/>&quot;, luego PESTAÑA, luego tu comando o búsqueda.</translation>
 <translation id="878431691778285679">Parece que ya administras un usuario que tiene ese nombre.<ph name="LINE_BREAK"/>¿Quieres <ph name="BEGIN_LINK"/>importar a <ph name="PROFILE_NAME"/> a este dispositivo<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> desea usar tu micrófono.</translation>
-<translation id="2805756323405976993">Google Apps</translation>
+<translation id="2805756323405976993">Aplicaciones</translation>
 <translation id="5151511998946489774"><ph name="ISSUER"/> verificó la identidad de este sitio web, y se pudo confirmar su transparencia.</translation>
 <translation id="1608626060424371292">Eliminar este usuario</translation>
 <translation id="2779552785085366231">Esta página se puede agregar al Selector de aplicaciones.</translation>
@@ -3939,6 +3939,7 @@ Asegúrate de no revelar información confidencial.</translation>
 <translation id="6460601847208524483">Buscar siguiente</translation>
 <translation id="397703832102027365">Finalizando...</translation>
 <translation id="8146177459103116374">Si ya estás registrado en este dispositivo, puedes <ph name="LINK2_START"/>acceder como un usuario existente<ph name="LINK2_END"/> .</translation>
+<translation id="5072836811783999860">Mostrar marcadores administrados</translation>
 <translation id="4856478137399998590">Tu servicio de datos para celulares está activado y listo para ser utilizado</translation>
 <translation id="3305389145870741612">El proceso de formato puede tardar algunos segundos. Espera.</translation>
 <translation id="3648607100222897006">Estas funciones experimentales pueden modificarse, dejar de funcionar o desaparecer en cualquier momento. No ofrecemos ninguna garantía para lo que pueda ocurrir si activas alguno de estos experimentos, y es posible que tu navegador se bloquee repentinamente. Bromas aparte, ten en cuenta que el navegador puede eliminar todos tus datos y que tu seguridad y tu privacidad se podrían ver comprometidas de forma inesperada. Cualquier experimento que actives, se activará  para todos los usuarios de este navegador, así que te recomendamos que actúes con precaución.</translation>
@@ -4171,7 +4172,7 @@ Asegúrate de no revelar información confidencial.</translation>
 <translation id="2867768963760577682">Abrir como pestaña fija</translation>
 <translation id="8631032106121706562">Pétalos</translation>
 <translation id="1639239467298939599">Cargando</translation>
-<translation id="5457599981699367932">Navega como invitado</translation>
+<translation id="5457599981699367932">Navegar como invitado</translation>
 <translation id="8525428584879632762">Habilitado en páginas de resultados de búsqueda o durante el ingreso de texto</translation>
 <translation id="2487656424763972284">Desbloqueo sencillo</translation>
 <translation id="7047998246166230966">Puntero</translation>
@@ -4368,6 +4369,7 @@ Asegúrate de no revelar información confidencial.</translation>
 <translation id="6869402422344886127">Casilla de verificación marcada</translation>
 <translation id="3428010780253032925">Inhabilitar destinación por rectángulo en las vistas</translation>
 <translation id="5637380810526272785">Método de entrada</translation>
+<translation id="3613134908380545408">Mostrar <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Se intentó establecer la conexión nuevamente utilizando una versión anterior del protocolo SSL o TLS. Esto normalmente significa que el servidor está utilizando software muy antiguo y puede tener otros problemas de seguridad.</translation>
 <translation id="404928562651467259">ADVERTENCIA</translation>
 <translation id="4289300219472526559">Empezar a hablar</translation>
@@ -4699,6 +4701,7 @@ Asegúrate de no revelar información confidencial.</translation>
 <translation id="6934265752871836553">Utiliza el código nuevo y riesgoso para que Chrome obtenga contenido en menos tiempo. Es muy probable que
         los cambios en esta ruta causen fallos en gran parte del contenido.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Abrir siempre en Adobe Reader</translation>
 <translation id="8274359292107649245">Abrir Chrome en el escritorio</translation>
 <translation id="1571119610742640910">Composición de fondos raíz fijos</translation>
 <translation id="6514565641373682518">Esta página ha inhabilitado el cursor del mouse.</translation>
@@ -4897,6 +4900,7 @@ Presiona cualquier tecla para seguir navegando.</translation>
 <translation id="824543159844843373">Activar el elemento selector 3</translation>
 <translation id="3819800052061700452">&amp;Pantalla completa</translation>
 <translation id="48607902311828362">Modo de avión</translation>
+<translation id="711840821796638741">Mostrar marcadores administrados</translation>
 <translation id="3360297538363969800">Se produjo un error al imprimir. Revisa la impresora y vuelve a intentarlo.</translation>
 <translation id="680572642341004180">Habilitar el seguimiento de RLZ en <ph name="SHORT_PRODUCT_OS_NAME"/></translation>
 <translation id="688797901999351107">Deja de utilizar el cargador retirado del mercado.</translation>
@@ -5170,7 +5174,7 @@ Debes acceder para utilizar esta función.</translation>
 <translation id="5284518706373932381">Deberás regresar a este sitio web en unas horas. La Navegación segura de Google <ph name="BEGIN_LINK"/>detectó software malicioso<ph name="END_LINK"/> en <ph name="SITE"/> recientemente. A veces, los sitios web que suelen ser seguros contienen software malicioso.</translation>
 <translation id="969892804517981540">Build oficial</translation>
 <translation id="1691608011302982743">¡Retiraste tu dispositivo antes de tiempo!</translation>
-<translation id="445923051607553918">Unirte a la red Wi-Fi</translation>
+<translation id="445923051607553918">Únete a la red Wi-Fi</translation>
 <translation id="1898137169133852367">La función Powerwash restablece el dispositivo <ph name="IDS_SHORT_PRODUCT_NAME"/> para que quede como nuevo. Además, el dispositivo recuperará una actualización previa de <ph name="IDS_SHORT_PRODUCT_NAME"/>.</translation>
 <translation id="4215898373199266584">¡No se lo digas a nadie! El modo incógnito (<ph name="INCOGNITO_MODE_SHORTCUT"/>) puede resultarte útil la próxima vez.</translation>
 <translation id="1048597748939794622">Forzado en todas las capas</translation>
index 1ed04fd..ad9bc18 100644 (file)
@@ -3948,6 +3948,7 @@ Asegúrate de no revelar información confidencial.</translation>
 <translation id="6460601847208524483">Buscar siguiente</translation>
 <translation id="397703832102027365">Finalizando...</translation>
 <translation id="8146177459103116374">Si ya te has registrado en este dispositivo, puedes <ph name="LINK2_START"/>iniciar sesión con tu nombre de usuario<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Mostrar marcadores administrados</translation>
 <translation id="4856478137399998590">Tu servicio de datos móviles se ha activado y está listo para utilizarse.</translation>
 <translation id="3305389145870741612">El proceso de formateo puede tardar unos segundos. Espera...</translation>
 <translation id="3648607100222897006">Estas funciones experimentales pueden cambiar, dejar de funcionar o desaparecer en cualquier momento. No ofrecemos ningún tipo de garantía de lo que pueda ocurrir si se habilita alguna de estas funciones experimentales, y es posible que el navegador se bloquee repentinamente. Bromas aparte, ten en cuenta que el navegador puede eliminar todos tus datos y que tu seguridad y tu privacidad se podrían ver comprometidas de forma inesperada. Cualquier experimento que habilites se habilitará para todos los usuarios del navegador, así que te recomendamos que actúes con precaución.</translation>
@@ -4377,6 +4378,7 @@ Asegúrate de no revelar información confidencial.</translation>
 <translation id="6869402422344886127">Casilla de verificación seleccionada</translation>
 <translation id="3428010780253032925">Inhabilitar determinación de objetivo por rectángulos en vistas</translation>
 <translation id="5637380810526272785">Método de entrada</translation>
+<translation id="3613134908380545408">Mostrar <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Se ha vuelto a recuperar la conexión con una versión anterior del protocolo SSL o TLS. Este error suele indicar que el servidor utiliza un software demasiado obsoleto y que es posible que se produzcan otros problemas de seguridad.</translation>
 <translation id="404928562651467259">ADVERTENCIA</translation>
 <translation id="4289300219472526559">Empezar a hablar</translation>
@@ -4708,6 +4710,7 @@ Calculando el tiempo de carga completa</translation>
 <translation id="2859369953631715804">Selecciona una red móvil</translation>
 <translation id="6934265752871836553">Utiliza el código bleeding-edge para que Chrome obtenga contenido de forma más rápida. Es muy probable que los cambios en esta ruta impidan que diferentes tipos de contenido funcionen correctamente.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Abrir siempre en Adobe Reader</translation>
 <translation id="8274359292107649245">Abrir Chrome en el escritorio</translation>
 <translation id="1571119610742640910">Composición de fondos raíz fijos.</translation>
 <translation id="6514565641373682518">Esta página ha inhabilitado el cursor de tu ratón.</translation>
@@ -4908,6 +4911,7 @@ Pulsa cualquier tecla para seguir con la exploración.</translation>
 <translation id="824543159844843373">Activar elemento selector 3</translation>
 <translation id="3819800052061700452">&amp;Pantalla completa</translation>
 <translation id="48607902311828362">Modo avión</translation>
+<translation id="711840821796638741">Mostrar marcadores administrados</translation>
 <translation id="3360297538363969800">Se ha producido un error al imprimir. Comprueba la impresora y vuelve a intentarlo.</translation>
 <translation id="680572642341004180">Habilitar seguimiento de RLZ en <ph name="SHORT_PRODUCT_OS_NAME"/></translation>
 <translation id="688797901999351107">Deja de utilizar el cargador retirado del mercado.</translation>
index 019010d..ee9ef5e 100644 (file)
@@ -15,7 +15,7 @@
 <translation id="166179487779922818">Parool on liiga lühike.</translation>
 <translation id="9048642391959913289">Teksti suuruse automaatse muutmise kiirem rakendamine.</translation>
 <translation id="2345460471437425338">Hosti vale sertifikaat.</translation>
-<translation id="3688507211863392146">Kirjutage failidesse ja kaustadesse, mille rakenduses avate</translation>
+<translation id="3688507211863392146">Failidesse ja kaustadesse kirjutamine, mille rakenduses avate</translation>
 <translation id="3595596368722241419">Aku on täis</translation>
 <translation id="8098352321677019742">Toote <ph name="PRODUCT_NAME"/> märguanded</translation>
 <translation id="3566021033012934673">Teie ühendus ei ole privaatne</translation>
@@ -3466,7 +3466,7 @@ Veenduge, et te ei avalikustaks tundlikke andmeid.</translation>
 <translation id="1834560242799653253">Suund:</translation>
 <translation id="6440616190620341629">Lubab krüpteeritud meediumilaiendustele vaikimisi mittekoostava dekodeerimise rakenduses MediaDrm.</translation>
 <translation id="7185025270390719314">Vaadake ja muutke oma arvutis ja külastatavatel veebisaitidel kõiki oma andmeid</translation>
-<translation id="8353683614194668312">See võib:</translation>
+<translation id="8353683614194668312">Rakendus saab teha järgmist.</translation>
 <translation id="1047956942837015229"><ph name="COUNT"/> üksuse kustutamine ...</translation>
 <translation id="1531961661616401172">Luba katselised sünkroonitud märguanded.</translation>
 <translation id="7361039089383199231">$1 baiti</translation>
@@ -3954,6 +3954,7 @@ Veenduge, et te ei avalikustaks tundlikke andmeid.</translation>
 <translation id="6460601847208524483">Otsi järgmine</translation>
 <translation id="397703832102027365">Lõpetamine ...</translation>
 <translation id="8146177459103116374">Kui olete seadmes juba registreeritud, siis võite <ph name="LINK2_START"/>logida sisse olemasoleva kasutajana<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Kuva hallatud järjehoidjad</translation>
 <translation id="4856478137399998590">Teie mobiilne andmesideteenus on aktiveeritud ja kasutamiseks valmis</translation>
 <translation id="3305389145870741612">Vormindusprotsessile võib kuluda paar sekundit. Oodake.</translation>
 <translation id="3648607100222897006">Need eksperimentaalsed funktsioonid võivad igal ajal muutuda, rikki minna või kaduda. Me ei anna mingeid garantiisid selle kohta, mis juhtub, kui mõne eksperimendi sisse lülitate. Võimalik on teie brauseri iseeneslik süttimine. Kui tõsiselt rääkida, siis võib brauser kustutada kõik teie andmed või ootamatul viisil võidakse rikkuda teie turvalisust ja privaatsust. Kõik eksperimendid, mis te brauseris lubate, lubatakse brauseri kõigile kasutajatele. Jätkake ettevaatlikult.</translation>
@@ -4384,6 +4385,7 @@ kasutades juhtpaneeli funktsiooni <ph name="CONTROL_PANEL_APPLET_NAME"/>.
 <translation id="6869402422344886127">Märgitud märkeruut</translation>
 <translation id="3428010780253032925">Keela ristkülikul põhinev sihtimine kuvades</translation>
 <translation id="5637380810526272785">Sisestusmeetod</translation>
+<translation id="3613134908380545408">Kuva <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Ühenduse loomist tuli korrata TLS- või SSL-protokolli vanema versiooniga. See tähendab tavaliselt seda, et serveri tarkvara on väga vana ja sellel võib olla muid turvaprobleeme.</translation>
 <translation id="404928562651467259">HOIATUS</translation>
 <translation id="4289300219472526559">Alusta rääkimist</translation>
@@ -4717,6 +4719,7 @@ Täislaadimiseks kuluva aja arvutamine</translation>
 <translation id="6934265752871836553">Kasutage üliuut koodi, et Chrome joonistaks sisu kiiremini. Selle tee
         muudatused rikuvad väga suure tõenäosusega palju sisu.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Ava alati programmis Adobe Reader</translation>
 <translation id="8274359292107649245">Ava Chrome töölaual</translation>
 <translation id="1571119610742640910">Liitmine fikseeritud juurtaustade jaoks.</translation>
 <translation id="6514565641373682518">Leht keelas teie hiirekursori.</translation>
@@ -4916,6 +4919,7 @@ Mõned funktsioonid ei pruugi olla saadaval. Veenduge, et profiil on olemas ning
 <translation id="824543159844843373">Käiviti üksuse 3 aktiveerimine</translation>
 <translation id="3819800052061700452">&amp;Täisekraan</translation>
 <translation id="48607902311828362">Lennurežiim</translation>
+<translation id="711840821796638741">Kuva hallatud järjehoidjad</translation>
 <translation id="3360297538363969800">Printimine ebaõnnestus. Kontrollige printerit ja proovige uuesti.</translation>
 <translation id="680572642341004180">Lubage RLZ-i jälgimine rakenduses <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Ärge kasutage rohkem tagasikutsutud laadijat.</translation>
index 9a7587b..f948e5c 100644 (file)
 <translation id="4654488276758583406">خیلی کوچک</translation>
 <translation id="6647228709620733774">‏URL ابطال ارائه دهنده مجوز Netscape</translation>
 <translation id="546411240573627095">‏شیوه Numpad</translation>
-<translation id="2310216585920710503">تنظیم باز کردن قفل آسان</translation>
+<translation id="2310216585920710503">تنظیم «باز کردن قفل آسان»</translation>
 <translation id="8425213833346101688">تغییر</translation>
 <translation id="2972581237482394796">انجام مجدد</translation>
 <translation id="5895138241574237353">راه‌اندازی مجدد</translation>
 <translation id="3984921062031549150">توقف اجراکننده</translation>
 <translation id="7925285046818567682">منتظر <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">دسترسی به دوربین همیشه مسدود شود</translation>
-<translation id="2964845078799970531">‏باز کردن آسان قفل به شما امکان می‌دهد هنگامی که دستگاه Chromebook شما نزدیک تلفنتان است قفل آن را باز کنید.</translation>
+<translation id="2964845078799970531">‏هنگامی که دستگاه Chromebook شما نزدیک تلفن‌تان است می‌توانید با «باز کردن قفل آسان» قفل آن را باز کنید.</translation>
 <translation id="5053803681436838483">آدرس ارسال جدید...</translation>
 <translation id="5952256601775839173">کلیک سه انگشتی صفحه لمسی را فعال کنید.</translation>
 <translation id="3280237271814976245">ذخیره &amp;بعنوان</translation>
 <translation id="9033857511263905942">&amp;جای‌گذاری</translation>
 <translation id="1028690605877243613">از طرح‌بندی دیگر قفسه استفاده کنید.</translation>
 <translation id="6736045498964449756">اوه، گذرواژه‌ها مطابقت ندارند.</translation>
-<translation id="4558985768677321342">فعال کردن بازکردن آسان قفل.</translation>
+<translation id="4558985768677321342">فعال کردن «باز کردن قفل آسان».</translation>
 <translation id="1221825588892235038">فقط انتخاب</translation>
 <translation id="2227939492629426903">منوی چهره‌نمای جدید را فعال می‌کند. وقتی با مدیریت-نمایه-جدید ادغام می‌شود، صرفاً منوی چهره‌نمای مدیریت نمایه جدید را نمایش می‌دهد. در غیر اینصورت یک منوی چهره‌نمای دوباره طراحی شده که عملکردی مشابه منوی قبلی دارد و همچنین یک کارت آموزشی را در بالا نمایش می‌دهد که از کاربر می‌خواهد رابط کاربری مدیریت نمایه جدید را امتحان کند.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> دسترسی به <ph name="HOST_NAME"/> را مسدود کرده است. این وب‌سایت به عنوان یک وب‌سایت فیشینگ گزارش داده شده است.</translation>
 <translation id="5917011688104426363">فوکوس نوار آدرس در حالت جستجو</translation>
 <translation id="3269101346657272573">لطفاً کد پین را وارد کنید.</translation>
 <translation id="2822854841007275488">عربی</translation>
-<translation id="6559948977408379772">Ù\88Ù\82تÛ\8c Ø´Ù\85ا Ù\88 ØªÙ\84Ù\81Ù\86تاÙ\86 Ù\86زدÛ\8cÚ© Ù\87ستÛ\8cد Ù\88 Â«Ø¨Ø§Ø² Ú©Ø±Ø¯Ù\86 Ù\82Ù\81Ù\84 Ø¢Ø³Ø§Ù\86» Ø¯Ø± Ø¯Ø³ØªØ±Ø³ Ø§Ø³ØªØ\8c Ø§Û\8cÙ\86 Ù\86Ù\85اد Ù\86شاÙ\86 Ø¯Ø§Ø¯Ù\87 می‌شود. برای وارد شدن فقط کلیک کنید به گذرواژه نیازی نیست.</translation>
+<translation id="6559948977408379772">Ù\88Ù\82تÛ\8c ØªÙ\84Ù\81Ù\86â\80\8cتاÙ\86 Ø¯Ø± Ù\86زدÛ\8cÚ©Û\8c Ø´Ù\85است Ù\88 Â«Ø¨Ø§Ø² Ú©Ø±Ø¯Ù\86 Ù\82Ù\81Ù\84 Ø¢Ø³Ø§Ù\86» Ø¯Ø± Ø¯Ø³ØªØ±Ø³ Ø§Ø³ØªØ\8c Ø§Û\8cÙ\86 Ù\86Ù\85اد Ø¸Ø§Ù\87ر می‌شود. برای وارد شدن فقط کلیک کنید به گذرواژه نیازی نیست.</translation>
 <translation id="5857090052475505287">پوشهٔ جدید</translation>
 <translation id="7450732239874446337">‏IO شبکه در حالت تعلیق است.</translation>
 <translation id="4003393903129308792">فعال‌سازی رسام کپی تکی</translation>
 <translation id="6460601847208524483">یافتن بعدی</translation>
 <translation id="397703832102027365">نهایی‌سازی…</translation>
 <translation id="8146177459103116374">اگر قبلاً در این دستگاه ثبت‌نام کردید، می‌توانید <ph name="LINK2_START"/>به‌عنوان یک کاربر موجود، وارد شوید<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">نمایش نشانک‌های مدیریت شده</translation>
 <translation id="4856478137399998590">سرویس داده تلفن همراه شما فعال شده و آمادهٔ استفاده است.</translation>
 <translation id="3305389145870741612">مراحل قالب‌بندی چند ثانیه طول می‌کشد. لطفاً منتظر بمانید.</translation>
 <translation id="3648607100222897006">این ویژگی‌های آزمایشی ممکن است در هر زمانی تغییر کنند، نقض شوند یا ناپدید شوند. اگر یکی از این ویژگی‌های آزمایشی را فعال کنید ما هیچ تضمینی در مورد آنچه که ممکن است اتفاق بیفتد نداریم، و حتی ممکن است مرورگر شما خود به خود ناپدید شود. در واقع، ممکن است مرورگر شما تمام داده‌های شما را حذف کند یا امنیت و حریم خصوصی شما می‌تواند به صورت غیرمنتظره‌ای به خطر بیفتد. هر ویژگی آزمایشی که فعال می‌کنید برای تمام کاربران این مرورگر فعال خواهد شد. لطفاً با احتیاط ادامه دهید.</translation>
 <translation id="6869402422344886127">کادر انتخاب علامت زده شده</translation>
 <translation id="3428010780253032925">غیرفعال کردن هدف‌یابی برمبنای مستطیل در نماها</translation>
 <translation id="5637380810526272785">روش ورودی</translation>
+<translation id="3613134908380545408">نشان دادن <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">‏با استفاده از نسخه قدیمی پروتکل TLS یا SSL باید دوباره سعی کنید اتصال را برقرار کنید. یعنی سرور از نرم‌افزار خیلی قدیمی استفاده می‌کند و ممکن است مسائل امنیتی دیگری داشته باشد.</translation>
 <translation id="404928562651467259">اخطار</translation>
 <translation id="4289300219472526559">شروع صحبت</translation>
 <translation id="6934265752871836553">‏برای این‌که Chrome محتوا را سریع‌تر بکشد از کد بسیار پیشرو استفاده کنید. تغییراتی که
         در پشت این مسیر است به احتمال زیاد مقدار زیادی از محتوا را خراب می‌کند.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">‏همیشه در Adobe Reader باز شود</translation>
 <translation id="8274359292107649245">‏باز کردن Chrome در حالت دسک‌تاپ</translation>
 <translation id="1571119610742640910">ترکیب کردن برای پس‌زمینه‌های ریشه ثابت.</translation>
 <translation id="6514565641373682518">این صفحه مکان‌نمای ماوس شما را غیرفعال کرد.</translation>
 <translation id="824543159844843373">فعال کردن مورد راه‌انداز ۳</translation>
 <translation id="3819800052061700452">&amp;تمام صفحه</translation>
 <translation id="48607902311828362">حالت هواپیما</translation>
+<translation id="711840821796638741">نمایش نشانک‌های مدیریت شده</translation>
 <translation id="3360297538363969800">چاپ ناموفق بود. لطفاً چاپگرتان را بررسی کنید و دوباره امتحان کنید.</translation>
 <translation id="680572642341004180">‏‫فعال کردن ردیابی RLZ در <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">لطفاً استفاده از شارژر فراخوانی شده را متوقف کنید.</translation>
index 6b8c83a..f94668c 100644 (file)
@@ -62,7 +62,7 @@
 <translation id="6976652535392081960">Näytetään kohteita sähköpostiosoitteelle <ph name="EMAIL"/></translation>
 <translation id="7180611975245234373">Päivitä</translation>
 <translation id="4940047036413029306">Lainausm.</translation>
-<translation id="1497897566809397301">Salli paikallistietojen asettaminen (suositus)</translation>
+<translation id="1497897566809397301">Salli paikallisten tietojen asettaminen (suositus)</translation>
 <translation id="3275778913554317645">Avaa ikkunana</translation>
 <translation id="7994370417837006925">Kirjautuminen useaan tiliin</translation>
 <translation id="1420684932347524586">Hups! Satunnaisen yksityisen RSA-avaimen luominen epäonnistui.</translation>
 <translation id="2178614541317717477">Myöntäjäkompromissi</translation>
 <translation id="6464076120278668805">Poista käytöstä autocomplete='off'</translation>
 <translation id="4449935293120761385">Tietoja Automaattisesta täytöstä</translation>
-<translation id="4194570336751258953">Ota koskeuttamalla klikkaus käyttöön</translation>
+<translation id="4194570336751258953">Ota koskettamalla klikkaus käyttöön</translation>
 <translation id="6066742401428748382">Pääsy verkkosivulle evättiin</translation>
 <translation id="5111692334209731439">&amp;Kirjanmerkkien hallinta</translation>
 <translation id="906458777597946297">Suurenna ikkuna</translation>
@@ -675,7 +675,7 @@ Kaikkien käyttäjien täytyy kirjautua ulos jatkaakseen käyttöä.</translatio
 <translation id="1992397118740194946">Ei asetettu</translation>
 <translation id="6867678160199975333">Vaihda profiiliin <ph name="NEW_PROFILE_NAME"/></translation>
 <translation id="3718720264653688555">Virtuaalinäppäimistö</translation>
-<translation id="7760004034676677601">Onko tämä haluamasi aloitussivu?</translation>
+<translation id="7760004034676677601">Onko tämä haluamasi saapumissivu?</translation>
 <translation id="3504135463003295723">Ryhmän nimi:</translation>
 <translation id="3314070176311241517">Salli kaikkien sivustojen käyttää JavaScriptiä (suositus)</translation>
 <translation id="4663254525753315077">Kun mahdollista, sijoittaa ylivuotavan vierityselementin vieritettävän sisällön yhdistettyyn tasoon, mikä nopeuttaa vieritystä.</translation>
@@ -1395,7 +1395,7 @@ Psst! Suosittelemme käyttämään ensi kerralla incognito-tilaa <ph name="SHORT
 <translation id="2660779039299703961">Tapahtuma</translation>
 <translation id="4249248555939881673">Odotetaan verkkoyhteyttä…</translation>
 <translation id="996987097147224996">Paina ctrl+välilyönti, jos haluat valita edellisen syöttötavan.</translation>
-<translation id="4240069395079660403">Kohdetta <ph name="PRODUCT_NAME"/> ei voi näyttää tällä kielellä.</translation>
+<translation id="4240069395079660403"><ph name="PRODUCT_NAME"/> ei voi näyttää tällä kielellä.</translation>
 <translation id="747114903913869239">Virhe: laajennuksen koodauksen purkaminen ei onnistunut</translation>
 <translation id="7187885785158279764">Peruuta pääsy tiedostoon</translation>
 <translation id="3574210789297084292">kirjaudu sisään</translation>
@@ -2080,7 +2080,7 @@ Kun olet luonut uuden valvotun käyttäjän, voit hallinnoida hänen asetuksiaan
 <translation id="8580634710208701824">Lataa kehys uudelleen</translation>
 <translation id="7606992457248886637">Myöntäjät</translation>
 <translation id="4197674956721858839">Pakkaa valitut</translation>
-<translation id="707392107419594760">Valitse näppäimistösi:</translation>
+<translation id="707392107419594760">Valitse näppäimistö:</translation>
 <translation id="8605503133013456784">Laitteen <ph name="DEVICE_NAME"/> yhteyden katkaisu ja parin purkaminen epäonnistui.</translation>
 <translation id="2007404777272201486">Ilmoita ongelmasta...</translation>
 <translation id="4366509400410520531">Itse sallimasi</translation>
@@ -2290,7 +2290,7 @@ Varmista, että et paljasta arkaluonteisia tietoja.</translation>
 <translation id="5527463195266282916">Laajennuksesta on jo asennettu uudempi versio.</translation>
 <translation id="3289566588497100676">Helppo merkkien syöttö</translation>
 <translation id="6507969014813375884">yksinkertaistettu kiina</translation>
-<translation id="7341982465543599097">erittäin pieni</translation>
+<translation id="7341982465543599097">erittäin lyhyt</translation>
 <translation id="7314244761674113881">SOCKS-isäntä</translation>
 <translation id="4630590996962964935">Virheellinen merkki: $1</translation>
 <translation id="7709980197120276510">Klikkaamalla Jatka hyväksyt seuraavat ehdot ja käytännöt: <ph name="LEGAL_DOC_LINK_TEXT_1"/>, <ph name="LEGAL_DOC_LINK_TEXT_2"/>, <ph name="LEGAL_DOC_LINK_TEXT_3"/>, <ph name="LEGAL_DOC_LINK_TEXT_4"/> ja <ph name="LEGAL_DOC_LINK_TEXT_5"/>.</translation>
@@ -2544,7 +2544,7 @@ Varmista, että et paljasta arkaluonteisia tietoja.</translation>
 <translation id="8186706823560132848">Ohjelmisto</translation>
 <translation id="8121548268521822197">matkapuhelin</translation>
 <translation id="4692623383562244444">Hakukoneet</translation>
-<translation id="10614374240317010">Tallentamaton</translation>
+<translation id="10614374240317010">Ei tallenneta</translation>
 <translation id="3495304270784461826"><ph name="COUNT"/> virhettä.</translation>
 <translation id="5116300307302421503">Tiedoston jäsentäminen ei onnistu.</translation>
 <translation id="2745080116229976798">Microsoftin kelpaava alistaminen</translation>
@@ -2584,7 +2584,7 @@ Varmista, että et paljasta arkaluonteisia tietoja.</translation>
 <translation id="3251759466064201842">&lt;Ei osa varmennetta&gt;</translation>
 <translation id="6186096729871643580">LCD-tekstin reunojen silottelu</translation>
 <translation id="3882882270042324158">Ota käyttöön komentosarjojen lisääminen käytettävyyden parantamiseksi.</translation>
-<translation id="7303492016543161086">Näytä käytettävyysvalinnat järjestelmävalikossa</translation>
+<translation id="7303492016543161086">Näytä esteettömyysvalinnat järjestelmävalikossa</translation>
 <translation id="6410257289063177456">Kuvatiedostot </translation>
 <translation id="6419902127459849040">keskieurooppalainen</translation>
 <translation id="6707389671160270963">SSL-asiakasvarmenne</translation>
@@ -2604,7 +2604,7 @@ Varmista, että et paljasta arkaluonteisia tietoja.</translation>
 <translation id="1774833706453699074">Aseta avoimet sivut kirjanmerkeiksi…</translation>
 <translation id="5702389759209837579">Käytä kaikkien laitteidesi avoimia välilehtiä.</translation>
 <translation id="8381055888183086563">Ottaa käyttöön pakattujen sovelluksien kontekstivalikkokohteiden, kuten Inspect Elementin, vianetsinnän.</translation>
-<translation id="1189418886587279221">Laitteen käyttöä voi helpottaa käytettävyysominaisuuksien avulla.</translation>
+<translation id="1189418886587279221">Laitteen käyttöä voi helpottaa esteettömyysominaisuuksien avulla.</translation>
 <translation id="1152921474424827756">Käytä osoitteen <ph name="URL"/> <ph name="BEGIN_LINK"/>välimuistiversiota<ph name="END_LINK"/></translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN"/> poisti hiiren osoittimen käytöstä.</translation>
 <translation id="6404451368029478467"><ph name="PRODUCT_NAME"/> päivittyy automaattisesti, joten käytössäsi on aina uusin versio. Kun lataus on valmis, <ph name="PRODUCT_NAME"/> käynnistyy uudelleen ja voit aloittaa käytön.</translation>
@@ -3522,7 +3522,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="523397668577733901">Haluatko mieluummin <ph name="BEGIN_LINK"/>selata galleriaa<ph name="END_LINK"/>?</translation>
 <translation id="2922350208395188000">Palvelimen varmennetta ei voi tarkistaa.</translation>
 <translation id="3778740492972734840">&amp;Kehittäjän työkalut</translation>
-<translation id="8335971947739877923">Vienti...</translation>
+<translation id="8335971947739877923">Vie...</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN"/> on nyt koko ruudun kokoinen ja on poistanut hiiren osoittimen käytöstä.</translation>
 <translation id="38275787300541712">Paina Enter, kun olet valmis</translation>
 <translation id="6004539838376062211">&amp;Oikoluvun asetukset</translation>
@@ -3922,6 +3922,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="6460601847208524483">Hae seuraava</translation>
 <translation id="397703832102027365">Viimeistellään...</translation>
 <translation id="8146177459103116374">Jos olet jo rekisteröitynyt tällä laitteella, voit <ph name="LINK2_START"/>kirjautua sisään olemassa olevana käyttäjänä<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Näytä hallinnoidut kirjanmerkit</translation>
 <translation id="4856478137399998590">Tiedonsiirtopalvelu on aktivoitu ja valmis käyttöön</translation>
 <translation id="3305389145870741612">Alustus voi kestää pari sekuntia. Odota.</translation>
 <translation id="3648607100222897006">Nämä kokeelliset ominaisuudet voivat muuttua, rikkoutua tai kadota milloin tahansa. Emme takaa mitä tapahtuu, jos otat kokeiluja käyttöön – selaimesi saattaa jopa syttyä palamaan. Vitsit sikseen: selaimesi voi oikeasti poistaa kaikki tietosi, tai tietosuojasi voi vaarantua arvaamattomilla tavoilla. Kaikki tämän selaimen käyttäjät voivat käyttää käyttöön ottamiasi kokeiluita. Jatka omalla vastuullasi.</translation>
@@ -4091,7 +4092,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="5958529069007801266">Valvottu käyttäjä</translation>
 <translation id="3129173833825111527">Vasen reuna</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/> kt (<ph name="NUM_KILOBYTES_LIVE"/> kt live)</translation>
-<translation id="5554573843028719904">Muu wifi-verkko...</translation>
+<translation id="5554573843028719904">Muu Wi-Fi-verkko...</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED"/>, <ph name="TIME_LEFT"/></translation>
 <translation id="7013485839273047434">Hanki lisää laajennuksia</translation>
 <translation id="2124335647227850314">Poista näytön värikalibrointi käytöstä, vaikka näyttö tukisi tätä ominaisuutta.</translation>
@@ -4268,7 +4269,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="6040143037577758943">Sulje</translation>
 <translation id="5787146423283493983">Avainsopimus</translation>
 <translation id="4265682251887479829">Etkö löydä etsimääsi?</translation>
-<translation id="216169395504480358">Lisää wifi-yhteys...</translation>
+<translation id="216169395504480358">Lisää Wi-Fi-yhteys...</translation>
 <translation id="1804251416207250805">Poista hyperlinkkien tarkistus käytöstä.</translation>
 <translation id="5116628073786783676">T&amp;allenna äänitiedosto nimellä...</translation>
 <translation id="6172346010137455972">Voit jatkaa laturin käyttöä.</translation>
@@ -4348,6 +4349,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="6869402422344886127">Valittu valintaruutu</translation>
 <translation id="3428010780253032925">Poista käytöstä suorakaiteeseen perustuva kohdistaminen näkymissä</translation>
 <translation id="5637380810526272785">Syöttötapa</translation>
+<translation id="3613134908380545408">Näytä <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Yhteyden muodostamista täytyi yrittää uudelleen TLS- tai SSL-protokollan vanhemmalla versiolla. Yleensä tämä johtuu siitä, että palvelin käyttää vanhentunutta ohjelmistoa. Palvelimen suojaus ei välttämättä ole ajan tasalla.</translation>
 <translation id="404928562651467259">Varoitus</translation>
 <translation id="4289300219472526559">Aloita puhuminen</translation>
@@ -4452,7 +4454,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="3603622770190368340">Hanki verkkovarmenne</translation>
 <translation id="6196207969502475924">Puhehaku</translation>
 <translation id="359283478042092570">Sisään</translation>
-<translation id="6791586529990783225">Selainasetuksien nollaaminen</translation>
+<translation id="6791586529990783225">Nollaa selainasetukset</translation>
 <translation id="449782841102640887">Pysy suojattuna</translation>
 <translation id="2927657246008729253">Vaihda...</translation>
 <translation id="7978412674231730200">Yksityinen avain</translation>
@@ -4629,7 +4631,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="5143151113947480436">Käyttää kopioitavia ja liitettäviä tietoja.</translation>
 <translation id="6051028581720248124">Käyttämällä FedEx Office -palvelua hyväksyt sen <ph name="START_LINK"/>käyttöehdot<ph name="END_LINK"/>.</translation>
 <translation id="5435226530530647560">Virheellinen poistuminen</translation>
-<translation id="1979718561647571293">Onko tämä haluamasi aloitussivu?</translation>
+<translation id="1979718561647571293">Onko tämä haluamasi saapumissivu?</translation>
 <translation id="6608140561353073361">Kaikki evästeet ja sivuston tiedot...</translation>
 <translation id="6485131920355264772">Tilatietojen noutaminen epäonnistui</translation>
 <translation id="6547316139431024316">Älä varoita uudelleen tästä laajennuksesta</translation>
@@ -4678,6 +4680,7 @@ ei saa yhteyttä sivustoon. Syynä on yleensä verkon ongelma, mutta ongelma saa
 <translation id="2859369953631715804">Valitse mobiiliverkko</translation>
 <translation id="6934265752871836553">Nopeuta Chromen ruudullepiirtämistä uuden koodin avulla. Jos otat nämä muutokset käyttöön, suuri määrä sisältöä lakkaa luultavasti toimimasta.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Avaa aina Adobe Readerissa</translation>
 <translation id="8274359292107649245">Avaa Chrome työpöydällä</translation>
 <translation id="1571119610742640910">Koostaminen kiinteille taustoille.</translation>
 <translation id="6514565641373682518">Tämä sivu on poistanut hiiren osoittimen käytöstä.</translation>
@@ -4871,6 +4874,7 @@ Julkinen eksponentti (<ph name="PUBLIC_EXPONENT_NUM_BITS"/> bittiä):
 <translation id="824543159844843373">Aktivoi käynnistyskohde 3</translation>
 <translation id="3819800052061700452">&amp;Koko näyttö</translation>
 <translation id="48607902311828362">Lentokonetila</translation>
+<translation id="711840821796638741">Näytä hallinnoidut kirjanmerkit</translation>
 <translation id="3360297538363969800">Tulostus epäonnistui. Tarkista tulostin ja yritä uudelleen.</translation>
 <translation id="680572642341004180">Salli kohteen <ph name="SHORT_PRODUCT_OS_NAME"/> RLZ-seuranta.</translation>
 <translation id="688797901999351107">Lopeta käytöstä poistettavan laturin käyttö.</translation>
@@ -4904,7 +4908,7 @@ Julkinen eksponentti (<ph name="PUBLIC_EXPONENT_NUM_BITS"/> bittiä):
 <translation id="8054517699425078995">Tämäntyyppinen tiedosto voi vahingoittaa laitettasi. Haluatko silti säilyttää tiedoston <ph name="FILE_NAME"/>?</translation>
 <translation id="3093189737735839308">Haluatko varmasti asentaa laajennuksen <ph name="PLUGIN_NAME"/>? Asenna vain laajennuksia, joihin luotat.</translation>
 <translation id="1928696683969751773">Päivitykset</translation>
-<translation id="6545834809683560467">Käytä ennakointipalvelua, niin osoitepalkkiin tai sovelluksien käynnistysohjelman hakukenttään kirjoitetut hakulausekkeet ja URL-osoitteet täydennetään.</translation>
+<translation id="6545834809683560467">Käytä ennakointipalvelua, niin osoitepalkkiin tai sovelluksien käynnistysohjelman hakukenttään kirjoitetut hakulausekkeet ja URL-osoitteet täydennetään</translation>
 <translation id="3582792037806681688">Useisiin tileihin kirjautuminen on kielletty yhdeltä tämän istunnon käyttäjistä</translation>
 <translation id="3488065109653206955">Osittain aktivoitu</translation>
 <translation id="3683524264665795342">Ruudunjakopyyntö sovellukselta <ph name="APP_NAME"/></translation>
@@ -5144,7 +5148,7 @@ Sinun on oltava kirjautuneena sisään, jotta voit käyttää tätä ominaisuutt
 <translation id="5284518706373932381">Suosittelemme palaamaan sivustoon muutaman tunnin kuluttua. Google-selaussuoja havaitsi sivustossa <ph name="SITE"/> äskettäin <ph name="BEGIN_LINK"/>haittaohjelmia<ph name="END_LINK"/>. Tavallisesti turvalliset sivustot voivat joskus saada haittaohjelmatartunnan.</translation>
 <translation id="969892804517981540">Virallinen koontiversio</translation>
 <translation id="1691608011302982743">Irrotit laitteesi liian pian!</translation>
-<translation id="445923051607553918">Yhdistä wifi-verkkoon</translation>
+<translation id="445923051607553918">Yhdistä Wi-Fi-verkkoon</translation>
 <translation id="1898137169133852367">Powerwash palauttaa <ph name="IDS_SHORT_PRODUCT_NAME"/>-laitteesi uutta vastaavaan tilaan. Lisäksi laitteesi palautetaan aiempaan <ph name="IDS_SHORT_PRODUCT_NAME"/>-versioon.</translation>
 <translation id="4215898373199266584">Psst! Suosittelemme käyttämään ensi kerralla incognito-tilaa (<ph name="INCOGNITO_MODE_SHORTCUT"/>).</translation>
 <translation id="1048597748939794622">Ota käyttöön kaikille tasoille</translation>
index 49c85ad..071dbf0 100644 (file)
@@ -3967,6 +3967,7 @@ Tiyaking hindi ka maglalantad ng anumang sensitibong impormasyon.</translation>
 <translation id="6460601847208524483">Find Next</translation>
 <translation id="397703832102027365">Tinatapos...</translation>
 <translation id="8146177459103116374">Kung nakarehistro ka na sa device na ito, maaari kang <ph name="LINK2_START"/>mag-sign in bilang isang umiiral nang user<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Ipakita ang mga pinamamahalaang bookmark</translation>
 <translation id="4856478137399998590">Na-activate na ang iyong serbisyo ng data ng mobile at handa nang magamit</translation>
 <translation id="3305389145870741612">Maaaring tumagal nang ilang segundo ang proseso ng pag-format. Mangyaring maghintay.</translation>
 <translation id="3648607100222897006">Maaaring mabago, masira, o mawala anumang oras ang mga pang-eksperimentong tampok na ito. Ganap kaming walang garantiya tungkol sa kung ano ang maaaring mangyari kung bubuksan mo ang isa sa mga eksperimentong ito, at maaari pang biglang masunog ang iyong browser. Walang halong pagbibiro, maaaring tanggalin ng iyong browser ang lahat ng iyong data, o maaaring makompromiso sa mga hindi inaasahang paraan ang iyong seguridad at privacy. Anumang mga eksperimento na iyong papaganahin ay mapapagana para sa lahat ng mga user sa browser na ito. Mangyaring maingat na magpatuloy.</translation>
@@ -4399,6 +4400,7 @@ Tiyaking hindi ka maglalantad ng anumang sensitibong impormasyon.</translation>
 <translation id="6869402422344886127">Sinuri na ang check box</translation>
 <translation id="3428010780253032925">I-disable ang rect-based na pagta-target sa mga view</translation>
 <translation id="5637380810526272785">Input Method</translation>
+<translation id="3613134908380545408">Ipakita ang <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Kinailangang subukang muli ang koneksyon gamit ang mas lumang bersyon ng protocol ng TLS o SSL. Kadasalan ay nangangahulugan ito na ang server ay gumagamit ng napakalumang software at maaaring may iba pang mga isyu sa seguridad.</translation>
 <translation id="404928562651467259">BABALA</translation>
 <translation id="4289300219472526559">Simulan ang Pagsasalita</translation>
@@ -4732,6 +4734,7 @@ Kinakalkula ang oras hanggang sa mapuno</translation>
 <translation id="6934265752871836553">Gumamit ng bleeding-edge code upang gawing mas mabilis ang pagkuha ng nilalaman ng Chrome. Ang mga pagbabago
         sa likod ng path na ito ay ganap na malamang na makakasira nang maraming nilalaman.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Palaging buksan sa Adobe Reader</translation>
 <translation id="8274359292107649245">Buksan ang Chrome sa desktop</translation>
 <translation id="1571119610742640910">Pagko-composite para sa mga naayos na root background.</translation>
 <translation id="6514565641373682518">Hindi pinagana ng pahinang ito ang cursor ng iyong mouse.</translation>
@@ -4932,6 +4935,7 @@ Pumindot ng anumang key upang magpatuloy sa pagtuklas.</translation>
 <translation id="824543159844843373">I-activate ang launcher item 3</translation>
 <translation id="3819800052061700452">&amp;Full screen</translation>
 <translation id="48607902311828362">Airplane mode</translation>
+<translation id="711840821796638741">Ipakita ang Mga Pinamamahalaang Bookmark</translation>
 <translation id="3360297538363969800">Hindi nakapag-print. Pakisuri ang iyong printer at subukang muli.</translation>
 <translation id="680572642341004180">Paganahin ang pagsubaybay ng RLZ sa <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Mangyaring itigil ang paggamit ng ibinalik na charger.</translation>
index 41fc45c..7db02c4 100644 (file)
@@ -396,7 +396,7 @@ puis cliquez sur <ph name="BEGIN_BOLD"/>OK<ph name="END_BOLD"/>.</translation>
 <translation id="8034955203865359138">Aucune entrée d'historique trouvée.</translation>
 <translation id="9130015405878219958">Le mode indiqué est incorrect.</translation>
 <translation id="6615807189585243369"><ph name="BURNT_AMOUNT"/> copié(s) sur <ph name="TOTAL_SIZE"/></translation>
-<translation id="7501143156951160001">Le cas échéant, vous pouvez <ph name="LINK_START"/>créer un compte Google<ph name="LINK_END"/> maintenant.</translation>
+<translation id="7501143156951160001">Si vous ne possédez pas de compte Google, vous pouvez en <ph name="LINK_START"/>créer un <ph name="LINK_END"/> maintenant.</translation>
 <translation id="4950138595962845479">Options...</translation>
 <translation id="4653235815000740718">Un problème est survenu lors de la création du support de récupération du système d'exploitation. Le périphérique de stockage utilisé est introuvable.</translation>
 <translation id="1407489512183974736">Rogner et centrer</translation>
@@ -3969,6 +3969,7 @@ au site <ph name="SITE"/>, des identifiants inhabituels et incorrects ont été
 <translation id="6460601847208524483">Rechercher le suivant</translation>
 <translation id="397703832102027365">Finalisation en cours…</translation>
 <translation id="8146177459103116374">Si vous êtes déjà enregistré sur ​​cet appareil, vous pouvez vous <ph name="LINK2_START"/>connecter en tant qu'utilisateur existant<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Afficher les favoris gérés</translation>
 <translation id="4856478137399998590">Votre service Internet mobile est activé et prêt à l'emploi.</translation>
 <translation id="3305389145870741612">Le processus de formatage peut prendre quelques secondes. Veuillez patienter.</translation>
 <translation id="3648607100222897006">Ces fonctionnalités expérimentales sont susceptibles d'être modifiées, de cesser de fonctionner ou de disparaître à tout moment. Nous ne garantissons en aucun cas les conséquences de l'activation de l'une d'entre elles. Il est même possible que votre navigateur s'auto-détruise ! Plus sérieusement, votre navigateur risque de supprimer toutes vos données. Votre sécurité et la confidentialité de vos données peuvent également être compromises de manière inattendue. Toute fonctionnalité expérimentale que vous activez le sera pour tous les utilisateurs de ce navigateur. Faites donc attention.</translation>
@@ -4398,6 +4399,7 @@ Souhaitez-vous lancer <ph name="CONTROL_PANEL_APPLET_NAME"/> ?</translation>
 <translation id="6869402422344886127">Case cochée</translation>
 <translation id="3428010780253032925">Désactiver le ciblage rectangulaire dans les affichages</translation>
 <translation id="5637380810526272785">Mode de saisie</translation>
+<translation id="3613134908380545408">Afficher &quot;<ph name="FOLDER_NAME"/>&quot;</translation>
 <translation id="2837049386027881519">Une nouvelle tentative de connexion a dû être effectuée à l'aide d'une ancienne version du protocole TLS ou SSL. Cela signifie généralement que le serveur utilise un logiciel obsolète, et qu'il est possible qu'il rencontre d'autres problèmes de sécurité.</translation>
 <translation id="404928562651467259">AVERTISSEMENT</translation>
 <translation id="4289300219472526559">Commencer à parler</translation>
@@ -4730,6 +4732,7 @@ Souhaitez-vous lancer <ph name="CONTROL_PANEL_APPLET_NAME"/> ?</translation>
 <translation id="6934265752871836553">Utilisez le code &quot;bleeding-edge&quot; afin que le chargement du contenu soit plus rapide dans Chrome.
         Les modifications que ce chemin implique sont fortement susceptibles de diviser une grande partie du contenu.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Toujours ouvrir dans Adobe Reader</translation>
 <translation id="8274359292107649245">Ouvrir Google Chrome sur le Bureau</translation>
 <translation id="1571119610742640910">Composition pour les images de fond racine fixes</translation>
 <translation id="6514565641373682518">Cette page a désactivé le curseur de votre souris.</translation>
@@ -4929,6 +4932,7 @@ Pour poursuivre l'exploration, veuillez appuyer sur n'importe quelle touche.</tr
 <translation id="824543159844843373">Activer l'élément 3 du lanceur d'applications</translation>
 <translation id="3819800052061700452">&amp;Plein écran</translation>
 <translation id="48607902311828362">Mode Avion</translation>
+<translation id="711840821796638741">Afficher les favoris gérés</translation>
 <translation id="3360297538363969800">Échec de l'impression. Veuillez vérifier votre imprimante, puis réessayer.</translation>
 <translation id="680572642341004180">Activer le suivi RLZ pour <ph name="SHORT_PRODUCT_OS_NAME"/></translation>
 <translation id="688797901999351107">Veuillez cesser toute utilisation du chargeur que nous avons rappelé.</translation>
index 5c8358b..933e8eb 100644 (file)
 <translation id="6460601847208524483">આગલું શોધો</translation>
 <translation id="397703832102027365">ફાઇનલ કરી રહ્યું છે...</translation>
 <translation id="8146177459103116374">જો તમે આ ઉપકરણ પર પહેલાથી નોંધણી કરાવી છે, તો તમે <ph name="LINK2_START"/>અસ્તિત્વમાં છે તે વપરાશકર્તા તરીકે સાઇન ઇન<ph name="LINK2_END"/> કરી શકો છો.</translation>
+<translation id="5072836811783999860">સંચાલિત બુકમાર્ક્સ દર્શાવો</translation>
 <translation id="4856478137399998590">તમારી મોબાઇલ ડેટા સેવા સક્રિય થઈ છે અને ઉપયોગ માટે તૈયાર છે</translation>
 <translation id="3305389145870741612">ફોર્મેટ કરવાની પ્રક્રિયામાં થોડો સમય લાગી શકે છે. કૃપા કરીને રાહ જુઓ.</translation>
 <translation id="3648607100222897006">આ પ્રાયોગિક સુવિધાઓ કોઈપણ સમયે બદલાઈ, ભંગ અથવા અદૃશ્ય થઈ શકે છે. જો તમે આમાંના કોઈ એક પ્રયોગને ચાલુ કરો છો તો તેનું શું થશે તેની અમે કોઈ ગેરેંટી આપી શકતા નથી, બને કે તમારું બ્રાઉઝર પણ ભડકી ઉઠે. તમારું બ્રાઉઝર તમારા ડેટાને કાઢી નાખી શકે છે, અથવા તમારી સુરક્ષા અને ગોપનીયતા સાથે અનપેક્ષિત રીતે ચેડા થઈ શકે છે. તમે જે પ્રયોગોને અક્ષમ કરો છો તે આ બ્રાઉઝરના બધા વપરાશકર્તાઓ માટે સક્ષમ થશે. કૃપા કરીને સાવધાનીપૂર્વક આગળ વધો.</translation>
 <translation id="6869402422344886127">ચેક કરેલું ચેક બૉક્સ</translation>
 <translation id="3428010780253032925">દૃશ્યોમાં લંબચોરસ-આધારિત લક્ષ્યીકરણ અક્ષમ કરો</translation>
 <translation id="5637380810526272785">ઇનપુટ પદ્ધતિ</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> ને દર્શાવો</translation>
 <translation id="2837049386027881519">TLS અથવા SSL પ્રોટોકોલનાં જૂના સંસ્કરણનો ઉપયોગ કરીને કનેક્શન માટે ફરીથી પ્રયાસ કરવાની જરૂર હતી. સામાન્ય રીતે આનો અર્થ એ થાય છે કે સર્વર ખૂબ જૂના સૉફ્ટવેરનો ઉપયોગ કરે છે અને તેમાં અન્ય સુરક્ષા સમસ્યાઓ હોઈ શકે છે.</translation>
 <translation id="404928562651467259">ચેતવણી</translation>
 <translation id="4289300219472526559">બોલવાનું પ્રારંભ કરો</translation>
 <translation id="6934265752871836553">Chrome ઝડપથી સામગ્રી બનાવે તે માટે બ્લીડિંગ-એજ કોડનો ઉપયોગ કરો. આ પાથની
         પાછળના ફેરફારો વધુ સંભવિત રૂપે ઘણી સામગ્રીને વિભક્ત કરે છે.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">હંમેશાં Adobe Reader માં ખોલો</translation>
 <translation id="8274359292107649245">ડેસ્કટોપ પર Chrome ખોલો</translation>
 <translation id="1571119610742640910">નિયત રુટ બેકગ્રાઉન્ડ્સ માટે સંમિશ્રણ.</translation>
 <translation id="6514565641373682518">આ પૃષ્ઠે તમારા માઉસ કર્સરને અક્ષમ કર્યું છે.</translation>
 <translation id="824543159844843373">લૉંચર આઇટમ 3 સક્રિય કરો</translation>
 <translation id="3819800052061700452">&amp;પૂર્ણ સ્ક્રીન</translation>
 <translation id="48607902311828362">એરપ્લેન મોડ</translation>
+<translation id="711840821796638741">સંચાલિત બુકમાર્ક્સ દર્શાવો</translation>
 <translation id="3360297538363969800">છાપવાનું નિષ્ફળ થયું. કૃપા કરીને તમારું પ્રિન્ટર તપાસો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> પર RLZ ટ્રેકિંગને સક્ષમ કરો.</translation>
 <translation id="688797901999351107">કૃપા કરીને પાછા મંગાવેલા ચાર્જરને ઉપયોગ કરવાનું બંધ કરો.</translation>
index 0e7c122..5fd2ec2 100644 (file)
@@ -7,7 +7,7 @@
 <translation id="9056953843249698117">Store</translation>
 <translation id="6431217872648827691">आपके Google पासवर्ड के द्वारा 
           <ph name="TIME"/> तक का सभी डेटा एन्क्रिप्ट किया गया था</translation>
-<translation id="335581015389089642">वाà¤\95à¥\8d</translation>
+<translation id="335581015389089642">बà¥\8bलà¥\80</translation>
 <translation id="1890570400853666479">स्थिर गैलरी के बजाय प्रयोगात्मक नई गैलरी का उपयोग करें.</translation>
 <translation id="8206745257863499010">ब्‍लुसी</translation>
 <translation id="3314762460582564620">प्लेन झुयिन मोड.  स्वचालित उम्मीदवार चयन और संबंधित विकल्प
 <translation id="7282353081473341772">ऐप्स को इंस्टॉल किए बिना आज़माएं</translation>
 <translation id="3384773155383850738">सुझावों की अधिकतम संख्या</translation>
 <translation id="1014321050861012327">अपने आप पासवर्ड सहेजें.</translation>
-<translation id="3606271085912431278">à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80 à¤¸à¤\82वाद à¤\85à¤\95à¥\8dषम à¤\95रà¥\87à¤\82. à¤¯à¤¦à¤¿ à¤\85à¤\95à¥\8dषम à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8b, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\90पà¥\8dस à¤²à¥\89नà¥\8dà¤\9aर à¤®à¥\87नà¥\82 à¤®à¥\87à¤\82 'à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80' à¤¸à¤\82दरà¥\8dभ à¤®à¥\87नà¥\82 à¤\95à¥\8b à¤\9aà¥\81न à¤¸à¤\95à¥\87à¤\97ा à¤¤à¤¾à¤\95ि à¤\9aयनित à¤\90पà¥\8dस à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80 à¤¸à¤\82वाद दिखाया जा सके.</translation>
+<translation id="3606271085912431278">à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80 à¤¡à¥\89यलà¥\89à¤\97 à¤\85à¤\95à¥\8dषम à¤\95रà¥\87à¤\82. à¤¯à¤¦à¤¿ à¤\85à¤\95à¥\8dषम à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8b, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\90पà¥\8dस à¤²à¥\89नà¥\8dà¤\9aर à¤®à¥\87नà¥\82 à¤®à¥\87à¤\82 'à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80' à¤¸à¤\82दरà¥\8dभ à¤®à¥\87नà¥\82 à¤\95à¥\8b à¤\9aà¥\81न à¤¸à¤\95à¥\87à¤\97ा à¤¤à¤¾à¤\95ि à¤\9aयनित à¤\90पà¥\8dस à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80 à¤¡à¥\89यलà¥\89à¤\97 दिखाया जा सके.</translation>
 <translation id="8677212948402625567">सभी संक्षिप्त करें...</translation>
 <translation id="8008366997883261463">श्वान</translation>
 <translation id="2056996954182910740">ऐप्स लॉन्चर सक्षम करें.</translation>
 <translation id="3208703785962634733">पुष्टि न की गई</translation>
 <translation id="620329680124578183">लोड न करें (सुझाव)</translation>
 <translation id="6300924177400055566">आपकी Google डिस्क में &quot;<ph name="FILE_NAME"/>&quot; को सहेजने के लिए पर्याप्त स्थान नहीं है. कृपया फ़ाइलें निकालें या <ph name="BEGIN_LINK"/>अधिक संग्रहण स्थान खरीदें<ph name="END_LINK"/>.</translation>
-<translation id="9074739597929991885">Bluetooth</translation>
+<translation id="9074739597929991885">ब्लूटूथ</translation>
 <translation id="2653266418988778031">यदि आप किसी प्रमाणन प्राधिकरण (CA) प्रमाणपत्र को हटाते हैं, तो आपका ब्राउज़र उस CA द्वारा जारी किए गए किसी भी प्रमाणपत्र पर विश्‍वास नहीं करेगा.</translation>
 <translation id="4237357878101553356">हम आपकी खाता जानकारी सत्यापित करने में असमर्थ थे. |इस समस्या को ठीक करें|</translation>
 <translation id="2217501013957346740">कोई नाम बनाएं -</translation>
 <translation id="8561096986926824116">नेटवर्क कनेक्शन में बदलाव के कारण
         <ph name="HOST_NAME"/>
         का कनेक्शन बाधित हुआ.</translation>
-<translation id="8804398419035066391">सहयà¥\8bà¤\97à¥\80 à¤µà¥\87बसाà¤\87à¤\9fà¥\8bà¤\82 à¤¸à¥\87 à¤¸à¤\82वाद करें</translation>
+<translation id="8804398419035066391">सहयà¥\8bà¤\97à¥\80 à¤µà¥\87बसाà¤\87à¤\9fà¥\8bà¤\82 à¤¸à¥\87 à¤¡à¥\89यलà¥\89à¤\97 करें</translation>
 <translation id="6023914116273780353">वैयक्तिकृत</translation>
 <translation id="7082055294850503883">डिफ़ॉल्ट रूप से CapsLock स्थिति और इनपुट लोअरकेस को अनदेखा करें</translation>
 <translation id="4989966318180235467">निरीक्षण और पृष्ठभूमि पृष्ठ</translation>
 <translation id="6993929801679678186">स्वतः-भरण पूर्वानुमान दिखाएं</translation>
 <translation id="4425149324548788773">मेरी डिस्क</translation>
 <translation id="7194698607141260640">प्रक्रिया समाप्त हो गई</translation>
-<translation id="7264275118036872269">Bluetooth उपकरण का अन्‍वेषण प्रारंभ करने में विफल.</translation>
+<translation id="7264275118036872269">ब्लूटूथ उपकरण का अन्‍वेषण प्रारंभ करने में विफल.</translation>
 <translation id="3855676282923585394">बुकमार्क और सेटिंग आयात करें...</translation>
 <translation id="1116694919640316211">इसके बारे में</translation>
 <translation id="8381977081675353473">स्लोवाकियाई</translation>
 <translation id="3873139305050062481">तत्व की जां&amp;च करें</translation>
 <translation id="7445762425076701745">जिस सर्वर से आप कनेक्‍ट हैं उसकी पहचान पूर्णत: सत्‍यापित नहीं की जा सकती. आपने केवल आपके नेटवर्क में ही मान्‍य नाम का उपयोग कर किसी सर्वर से कनेक्‍ट किया है, जिसकी मान्‍यता का सत्‍यापन कोई बाह्य प्रमाणपत्र प्राधिकरण नहीं करता है. जैसा कि कुछ प्रमाणपत्र प्राधिकरण इन नामों के लिए प्रमाणपत्र जारी कर देंगे, और इस पर ध्यान नहीं दिया जाएगा कि यह सुनिश्‍चित करने का कोई तरीका नहीं है कि आप नियत वेबसाइट से कनेक्‍ट हैं, न कि किसी आक्रमणकर्ता से.</translation>
 <translation id="1556537182262721003">एक्सटेंशन निर्देशिका को प्रोफ़ाइल में नहीं ले जा सका.</translation>
-<translation id="2946640296642327832">Bluetooth सक्षम करें</translation>
+<translation id="2946640296642327832">ब्लूटूथ सक्षम करें</translation>
 <translation id="5866557323934807206">भविष्य के विज़िट के लिए ये सेटिंग साफ़ करें</translation>
 <translation id="126710816202626562">अनुवाद की भाषा:</translation>
 <translation id="1194381338562257973">प्रयोगात्मक अल्पकालिक ऐप्‍स सक्षम करें.</translation>
 <translation id="2580170710466019930">कृपया <ph name="PRODUCT_NAME"/> के नवीनतम सिस्‍टम अपडेट स्थापित होने तक प्रतीक्षा करें.</translation>
 <translation id="7428061718435085649">द्वितीय और तृतीय उम्‍मीदवारों का चयन करने के लिए बाईं और दाईं Shift कुंजी का उपयोग करें</translation>
 <translation id="1070066693520972135">WEP</translation>
-<translation id="2630681426381349926">शुरू करने के लिए Wi-Fi से कनेक्ट करें</translation>
+<translation id="2630681426381349926">शुरू करने के लिए वाई-फ़ाई  से कनेक्ट करें</translation>
 <translation id="1764226536771329714">बीटा</translation>
 <translation id="5191625995327478163">&amp;भाषा सेटिंग...</translation>
 <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME"/> (पहले से इस उपकरण पर है)</translation>
 <translation id="3704726585584668805">प्रक्रिया से बाहर के PDF प्लग इन को सक्षम करें.</translation>
 <translation id="5486326529110362464">निजी कुंजी के लिए इनपुट मान मौजूद होना चाहिए.</translation>
 <translation id="6824725898506587159">भाषाएं प्रबंधित करें</translation>
-<translation id="8190907767443402387">Chrome à¤\95à¥\8b à¤¬à¥\87हतर à¤¬à¤¨à¤¾à¤¨à¥\87 à¤®à¥\87à¤\82 à¤¸à¤¹à¤¾à¤¯à¤¤à¤¾ à¤\95à¥\87 à¤²à¤¿à¤\8f à¥\9eà¥\80डबà¥\88à¤\95 भेजें</translation>
+<translation id="8190907767443402387">Chrome à¤\95à¥\8b à¤¬à¥\87हतर à¤¬à¤¨à¤¾à¤¨à¥\87 à¤®à¥\87à¤\82 à¤¸à¤¹à¤¾à¤¯à¤¤à¤¾ à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¸à¥\81à¤\9dाव भेजें</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="4120329147617730038">किसी व्यवस्थापक ने <ph name="USER_EMAIL"/> के लिए एकाधिक प्रवेश अस्वीकार कर दिए हैं.
 जारी रखने के लिए सभी उपयोगकर्ताओं को प्रस्थान करना होगा.</translation>
 <translation id="3280431534455935878">तैयार कर रहा है</translation>
 <translation id="5543983818738093899">स्थिति की जांच की जा रही है...</translation>
 <translation id="3808578571859520191">V1</translation>
-<translation id="7694852551296697632">USB और Bluetooth पर इनपुट उपकरण एक्सेस करें</translation>
+<translation id="7694852551296697632">USB और ब्लूटूथ पर इनपुट उपकरण एक्सेस करें</translation>
 <translation id="3897092660631435901">मेनू</translation>
 <translation id="7024867552176634416">उपयोग के लिए किसी निकालने योग्य संग्रहण डिवाइस को चुनें</translation>
 <translation id="7794058097940213561">उपकरण स्‍वरूपित करें</translation>
 <translation id="6780439250949340171">अन्य सेटिंग प्रबंधित करें</translation>
 <translation id="8912793549644936705">खींचें</translation>
 <translation id="1464724975715666883">1 त्रुटि.</translation>
-<translation id="7864539943188674973">Bluetooth अक्षम करें</translation>
+<translation id="7864539943188674973">ब्लूटूथ अक्षम करें</translation>
 <translation id="1486096554574027028">पासवर्ड खोजें</translation>
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME"/> को पता चला है कि संभवतः आपके ब्राउज़र की सेटिंग आपकी जानकारी के बिना बदल दी गई हैं. क्या आप उन्हें उनके मूल डिफ़ॉल्ट पर रीसेट करना चाहते हैं?</translation>
 <translation id="1836938920852968258">NTP 'अन्‍य उपकरण' मेनू अक्षम करें.</translation>
 <translation id="1849186935225320012">इस पृष्ठ के पास MIDI उपकरणों का पूर्ण नियंत्रण है.</translation>
 <translation id="7309416673261215716">एक्सटेंशन का संस्करण</translation>
 <translation id="6840313690797192085">$1 PB</translation>
-<translation id="5971037678316050792">Bluetooth एडाप्टर स्थिति और युग्मन नियंत्रित करें</translation>
+<translation id="5971037678316050792">ब्लूटूथ एडाप्टर स्थिति और युग्मन नियंत्रित करें</translation>
 <translation id="3313590242757056087">पर्यवेक्षित उपयोगकर्ता द्वारा देखी जा सकने वाली वेबसाइटें सेट करने के लिए, आप <ph name="MANAGEMENT_URL"/> पर जाकर प्रतिबंधों और
     सेटिंग को कॉन्फ़िगर कर सकते हैं.
     यदि आप डिफ़ॉल्ट सेटिंग नहीं बदलते हैं, तो <ph name="USER_DISPLAY_NAME"/>
 <translation id="5323213332664049067">लैटिन अमेरिकी</translation>
 <translation id="3778152852029592020">डाउनलोड रद्द कर दिया गया था.</translation>
 <translation id="1455069690867658873">नए संस्करण के साथ इतिहास स्ट्रिंग</translation>
-<translation id="6241530762627360640">अपने सिस्टम के साथ युग्मित Bluetooth उपकरणों से संबंधित जानकारी एक्सेस करें और आस-पास के Bluetooth उपकरणों की खोज करें.</translation>
+<translation id="6241530762627360640">अपने सिस्टम के साथ युग्मित ब्लूटूथ उपकरणों से संबंधित जानकारी एक्सेस करें और आस-पास के ब्लूटूथ उपकरणों की खोज करें.</translation>
 <translation id="7831368056091621108">अपने सभी उपकरणों पर यह एक्सटेंशन, अपना इतिहास, और अन्य Chrome सेटिंग प्राप्त करने के लिए.</translation>
 <translation id="5469868506864199649">इतालवी</translation>
 <translation id="7427315641433634153">MSCHAP</translation>
 <translation id="6285905808004014074">ऑफ़लाइन स्वत: पुन: लोड करना मोड सक्षम करें</translation>
 <translation id="1195447618553298278">अज्ञात त्रुटि.</translation>
 <translation id="2617653079636271958">ज़ूम करें: <ph name="VALUE"/>%</translation>
-<translation id="7427916543828159271">Wi-Fi और मोबाइल डेटा बंद किए गए हैं.
+<translation id="7427916543828159271">वाई-फ़ाई  और मोबाइल डेटा बंद किए गए हैं.
           <ph name="LINE_BREAK"/>
           आपके द्वारा नेटवर्क से कनेक्ट होते ही पृष्ठ लोड किया जा सकता है.</translation>
 <translation id="1718685839849651010">किसी अज्ञात लॉग से</translation>
 <translation id="6736045498964449756">ओह, पासवर्ड मेल नहीं खाते!</translation>
 <translation id="4558985768677321342">आसान अनलॉक सक्षम करें.</translation>
 <translation id="1221825588892235038">केवल चयन</translation>
-<translation id="2227939492629426903">नà¤\8f à¤\85वतार à¤®à¥\87नà¥\82 à¤\95à¥\8b à¤¸à¤\95à¥\8dषम à¤\95रता à¤¹à¥\88. à¤¨à¤\8f à¤ªà¥\8dरà¥\8bफ़ाà¤\87ल à¤ªà¥\8dरबà¤\82धन à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤¸à¤\82यà¥\8bà¤\9cित à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤°, à¤¯à¤¹ à¤\95à¥\87वल à¤¨à¤¯à¤¾ à¤ªà¥\8dरà¥\8bफ़ाà¤\87ल à¤ªà¥\8dरबà¤\82धन à¤\85वतार à¤®à¥\87नà¥\82 à¤¦à¤¿à¤\96ाता à¤¹à¥\88. à¤\85नà¥\8dयथा à¤¯à¤¹ à¤ªà¥\81रानà¥\80 à¤\95ारà¥\8dयà¤\95à¥\8dषमता à¤\95à¥\87 à¤¸à¤®à¤¾à¤¨ à¤¹à¥\80 à¤ªà¥\81न: à¤¡à¤¿à¤\9c़ाà¤\87न à¤\95िया à¤\97या à¤\85वतार à¤®à¥\87नà¥\82 à¤¦à¤¿à¤\96ाता à¤¹à¥\88, à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤¶à¥\80रà¥\8dष à¤ªà¤° à¤\8fà¤\95 à¤\9fà¥\8dयà¥\82à¤\9fà¥\8bरियल कार्ड जो उपयोगकर्ता को संकेत देता है कि वह नए प्रोफ़ाइल प्रबंधन UI को आज़माएं.</translation>
+<translation id="2227939492629426903">नà¤\8f à¤\85वतार à¤®à¥\87नà¥\82 à¤\95à¥\8b à¤¸à¤\95à¥\8dषम à¤\95रता à¤¹à¥\88. à¤¨à¤\8f à¤ªà¥\8dरà¥\8bफ़ाà¤\87ल à¤ªà¥\8dरबà¤\82धन à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤¸à¤\82यà¥\8bà¤\9cित à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤°, à¤¯à¤¹ à¤\95à¥\87वल à¤¨à¤¯à¤¾ à¤ªà¥\8dरà¥\8bफ़ाà¤\87ल à¤ªà¥\8dरबà¤\82धन à¤\85वतार à¤®à¥\87नà¥\82 à¤¦à¤¿à¤\96ाता à¤¹à¥\88. à¤\85नà¥\8dयथा à¤¯à¤¹ à¤ªà¥\81रानà¥\80 à¤\95ारà¥\8dयà¤\95à¥\8dषमता à¤\95à¥\87 à¤¸à¤®à¤¾à¤¨ à¤¹à¥\80 à¤ªà¥\81न: à¤¡à¤¿à¤\9c़ाà¤\87न à¤\95िया à¤\97या à¤\85वतार à¤®à¥\87नà¥\82 à¤¦à¤¿à¤\96ाता à¤¹à¥\88, à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤¶à¥\80रà¥\8dष à¤ªà¤° à¤\8fà¤\95 à¤¨à¤¿à¤°à¥\8dदà¥\87श कार्ड जो उपयोगकर्ता को संकेत देता है कि वह नए प्रोफ़ाइल प्रबंधन UI को आज़माएं.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> ने <ph name="HOST_NAME"/> की पहुंच अवरोधित कर दी है.  यह वेबसाइट फ़िशिंग वेबसाइट के रूप में रिपोर्ट की गई है.</translation>
 <translation id="7201354769043018523">दायां कोष्ठक</translation>
 <translation id="567825475051805403">अधिक Apps</translation>
 <translation id="1272079795634619415">रोकें</translation>
 <translation id="2462724976360937186">प्रमाणन प्राधिकरण कुंजी आईडी</translation>
 <translation id="981121421437150478">ऑफ़लाइन</translation>
-<translation id="2964193600955408481">Wi-Fi अक्षम करें</translation>
+<translation id="2964193600955408481">वाई-फ़ाई  अक्षम करें</translation>
 <translation id="6786747875388722282">एक्‍सटेंशन</translation>
 <translation id="2570648609346224037">पुनर्प्राप्‍ति चित्र डाउनलोड करते समय समस्‍या आई थी.</translation>
 <translation id="5372384633701027870">जब आप अपने ब्राउज़र से बाहर निकलें तो कुकी और अन्य साइट डेटा साफ़ करें</translation>
 <translation id="5380103295189760361">उन संशोधकों के कीबोर्ड शॉर्टकट देखने के लिए Control, Alt, Shift, या Search को दबाए रखें.</translation>
 <translation id="7791543448312431591">जोड़ें</translation>
 <translation id="8569764466147087991">खोलने के लिए फ़ाइल को चुनें</translation>
-<translation id="9131487537093447019">Bluetooth उपकरणों को संदेश भेजें और उनसे संदेश प्राप्त करें.</translation>
+<translation id="9131487537093447019">ब्लूटूथ उपकरणों को संदेश भेजें और उनसे संदेश प्राप्त करें.</translation>
 <translation id="3010279545267083280">पासवर्ड हटा दिया गया</translation>
 <translation id="4275663329226226506">मीडिया</translation>
 <translation id="3629630062892748850">संबंधित URL और Google.com खोज</translation>
 <translation id="6051086608691487286">ओवरले स्क्रॉलबार</translation>
 <translation id="6132509723755265994">Google वॉलेट इस व्यापारी के साथ समर्थित नहीं है.</translation>
 <translation id="2378075407703503998"><ph name="SELCTED_FILE_COUNT"/> फ़ाइलें चयनित</translation>
-<translation id="4498419978438799658">सà¤\82शà¥\8dलà¥\87षिâ\80\8dत à¤µà¤¾à¤\95à¥\8d का उपयोग करके बोले गए सभी टेक्स्ट तक पहुंचें</translation>
+<translation id="4498419978438799658">सà¤\82शà¥\8dलà¥\87षिâ\80\8dत à¤¬à¥\8bलà¥\80 का उपयोग करके बोले गए सभी टेक्स्ट तक पहुंचें</translation>
 <translation id="7339898014177206373">नई विंडो</translation>
 <translation id="8362900609631365882">पहुंच-योग्यता टैब स्विचर सक्षम करें.</translation>
 <translation id="1895215930471128025">सैंडबॉक्स न किए गए प्लग-इन को कभी भी <ph name="HOST"/> पर अनुमति न दें</translation>
 <translation id="6561442619165486567">इस फ़ाइल को साझा करने का तरीका बदलें.</translation>
 <translation id="5332360333956573658">वॉलेट में डेटा नहीं सहेजा जा सका.</translation>
 <translation id="3759371141211657149">हैंडलर सेटिंग प्रबंधित करें...</translation>
-<translation id="8856844195561710094">Bluetooth उपकरण अन्‍वेषण बंद करने में विफल.</translation>
+<translation id="8856844195561710094">ब्लूटूथ उपकरण अन्‍वेषण बंद करने में विफल.</translation>
 <translation id="2246340272688122454">पुनर्प्राप्ति चित्र डाउनलोड कर रहा है...</translation>
 <translation id="5305688511332277257">कुछ भी इंस्टॉल नहीं है</translation>
 <translation id="1958802757844394735">ब्राउज़र सेटिंग को उनके मूल डिफ़ॉल्ट रूप में पुनर्स्थापित करना.</translation>
 <translation id="7654972694106903394">कंपोज़िट स्पर्श हिट परीक्षण अक्षम करें.</translation>
 <translation id="8466234950814670489">Tar संग्रह</translation>
 <translation id="6915678159055240887">Chromebox</translation>
-<translation id="6727885664418233357">&lt;p&gt;वर्तमान में <ph name="SITE"/> के साथ आपके सुरक्षित कनेक्‍शन में कुछ बाधा आ रही है.&lt;/p&gt; &lt;p&gt;<ph name="BEGIN_BOLD"/>कुछ मिनटों में या किसी नए नेटवर्क पर स्‍विच करने के बाद इस पृष्ठ को पुन: लोड करके देखें.<ph name="END_BOLD"/> यदि आपने हाल ही में नए Wi-Fi नेटवर्क से कनेक्‍ट किया है, तो पुन: लोड करने से पहले प्रवेश करना पूर्ण करें.&lt;/p&gt; &lt;p&gt;यदि आप अभी <ph name="SITE"/> पर जाने वाले थे, तो हो सकता है आपने आक्रमणकर्ता के साथ निजी जानकारी साझा की हो. आपकी गोपनीयता की सुरक्षा करने के लिए, Chrome, वास्‍तविक <ph name="SITE"/> से सुरक्षित कनेक्‍शन स्‍थापित नहीं कर सकने तक पृष्ठ को लोड नहीं करेगा .&lt;/p&gt;</translation>
+<translation id="6727885664418233357">&lt;p&gt;वर्तमान में <ph name="SITE"/> के साथ आपके सुरक्षित कनेक्‍शन में कुछ बाधा आ रही है.&lt;/p&gt; &lt;p&gt;<ph name="BEGIN_BOLD"/>कुछ मिनटों में या किसी नए नेटवर्क पर स्‍विच करने के बाद इस पृष्ठ को पुन: लोड करके देखें.<ph name="END_BOLD"/> यदि आपने हाल ही में नए वाई-फ़ाई  नेटवर्क से कनेक्‍ट किया है, तो पुन: लोड करने से पहले प्रवेश करना पूर्ण करें.&lt;/p&gt; &lt;p&gt;यदि आप अभी <ph name="SITE"/> पर जाने वाले थे, तो हो सकता है आपने आक्रमणकर्ता के साथ निजी जानकारी साझा की हो. आपकी गोपनीयता की सुरक्षा करने के लिए, Chrome, वास्‍तविक <ph name="SITE"/> से सुरक्षित कनेक्‍शन स्‍थापित नहीं कर सकने तक पृष्ठ को लोड नहीं करेगा .&lt;/p&gt;</translation>
 <translation id="8813811964357448561">कागज़</translation>
 <translation id="2125314715136825419">Adobe Reader अपडेट किए बिना आगे बढें (अनुशंसित नहीं)</translation>
 <translation id="5034510593013625357">होस्‍टनाम आकार</translation>
 <translation id="2682935131208585215">जब कोई साइट आपका भौतिक स्थान ट्रैक करे, तो पूछें (सुझाव)</translation>
 <translation id="5015344424288992913">प्रॉक्सी को परिष्कृत कर रहा है...</translation>
 <translation id="4389091756366370506">उपयोगकर्ता <ph name="VALUE"/></translation>
-<translation id="4528459871550620573">यदि आप Bluetooth का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपके उपकरण युग्मित करने के लिए तैयार हैं.</translation>
+<translation id="4528459871550620573">यदि आप ब्लूटूथ का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपके उपकरण युग्मित करने के लिए तैयार हैं.</translation>
 <translation id="4620809267248568679">यह सेटिंग किसी एक्‍सटेंशन द्वारा लागू की गई है.</translation>
 <translation id="2398703750948514961">रद्द किया गया</translation>
 <translation id="4724168406730866204">ईटेन 26</translation>
 <translation id="9088175547465404130">यह <ph name="CUSTODIAN_EMAIL"/> द्वारा पर्यवेक्षित उपयोगकर्ता है.</translation>
 <translation id="7733391738235763478">(<ph name="NUMBER_VISITS"/>)</translation>
 <translation id="450099669180426158">विस्मयादिबोधक चिह्न आइकन</translation>
-<translation id="902061379691003866">&lt;p&gt;आपकी जानकारी की सुरक्षा के लिए <ph name="SITE"/> सामान्‍यतया एन्‍क्रिप्‍शन (SSL) का उपयोग करती है. Chrome द्वारा इस बार <ph name="SITE"/> से कनेक्‍ट करने का प्रयास किए जाने पर, <ph name="SITE"/> ने असामान्‍य और गलत क्रेडेंशियल लौटाए. या तो कोई हमलावर <ph name="SITE"/> होने का दावा करने का प्रयास कर रहा है, या किसी Wi-Fi प्रवेश स्‍क्रीन ने कनेक्‍शन बाधित कर दिया है. आपकी जानकारी अभी भी सुरक्षित है क्‍योंकि Chrome ने किसी भी डेटा का आदान-प्रदान किए जाने से पहले ही कनेक्‍शन रोक दिया था.&lt;/p&gt; &lt;p&gt;नेटवर्क त्रुटियां और हमले आमतौर पर अस्‍थायी होते हैं, इसलिए संभवत: यह पृष्ठ बाद में ठीक से काम करेगा. आप अन्‍य नेटवर्क पर भी स्‍विच करके देख सकते हैं.&lt;/p&gt;</translation>
+<translation id="902061379691003866">&lt;p&gt;आपकी जानकारी की सुरक्षा के लिए <ph name="SITE"/> सामान्‍यतया एन्‍क्रिप्‍शन (SSL) का उपयोग करती है. Chrome द्वारा इस बार <ph name="SITE"/> से कनेक्‍ट करने का प्रयास किए जाने पर, <ph name="SITE"/> ने असामान्‍य और गलत क्रेडेंशियल लौटाए. या तो कोई हमलावर <ph name="SITE"/> होने का दावा करने का प्रयास कर रहा है, या किसी वाई-फ़ाई  प्रवेश स्‍क्रीन ने कनेक्‍शन बाधित कर दिया है. आपकी जानकारी अभी भी सुरक्षित है क्‍योंकि Chrome ने किसी भी डेटा का आदान-प्रदान किए जाने से पहले ही कनेक्‍शन रोक दिया था.&lt;/p&gt; &lt;p&gt;नेटवर्क त्रुटियां और हमले आमतौर पर अस्‍थायी होते हैं, इसलिए संभवत: यह पृष्ठ बाद में ठीक से काम करेगा. आप अन्‍य नेटवर्क पर भी स्‍विच करके देख सकते हैं.&lt;/p&gt;</translation>
 <translation id="5612734644261457353">क्षमा करें, आपका पासवर्ड अभी भी सत्यापित नहीं किया जा सकता. ध्यान दें: यदि आपने हाल ही में अपना पासवर्ड बदला है, तो आपके प्रस्थान करते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का उपयोग करें.</translation>
 <translation id="2908162660801918428">निर्देशिका द्वारा मीडिया गैलरी जोड़ें</translation>
 <translation id="2282872951544483773">अनुपलब्ध प्रयोग</translation>
 <translation id="7290594223351252791">पंजीकरण की पुष्टि करें</translation>
 <translation id="8249681497942374579">डेस्कटॉप शॉर्टकट निकालें</translation>
 <translation id="8898786835233784856">अगला टैब को चुनें</translation>
-<translation id="4011708746171704399">फ़रà¥\8dसà¥\8dà¤\9f-रन à¤\9fà¥\8dयà¥\82à¤\9fà¥\8bरियल में एनिमेट होने वाले संक्रमणों को सक्षम करें.</translation>
+<translation id="4011708746171704399">फ़रà¥\8dसà¥\8dà¤\9f-रन à¤¨à¤¿à¤°à¥\8dदà¥\87श में एनिमेट होने वाले संक्रमणों को सक्षम करें.</translation>
 <translation id="9111102763498581341">अनलॉक करें</translation>
 <translation id="5975792506968920132">बैटरी चार्ज का प्रतिशत</translation>
 <translation id="289695669188700754">कुंजी ID: <ph name="KEY_ID"/></translation>
 <translation id="2803306138276472711">Google सुरक्षित ब्राउज़िंग को <ph name="SITE"/> पर हाल ही में <ph name="BEGIN_LINK"/>मैलवेयर का पता चला<ph name="END_LINK"/> है. आमतौर पर सुरक्षित रहने वाली वेबसाइटें कभी-कभी मैलवेयर से संक्रमित हो जाती हैं.</translation>
 <translation id="1221462285898798023">कृपया सामान्य उपयोगकर्ता के रूप में <ph name="PRODUCT_NAME"/> को प्रारंभ करें. रूट के रूप में चलाने के लिए, प्रोफ़ाइल जानकारी के संग्रहण के लिए आपको कोई वैकल्पिक --उपयोगकर्ता-डेटा-निर्देशिका निर्दिष्ट करनी होगी.</translation>
 <translation id="3220586366024592812"><ph name="CLOUD_PRINT_NAME"/> कनेक्‍टर प्रक्रिया क्रैश हो गई है. पुन: प्रारंभ करें?</translation>
-<translation id="2379281330731083556">सिसà¥\8dâ\80\8dà¤\9fम à¤¸à¤\82वाद का उपयोग करके प्रिंट करें… <ph name="SHORTCUT_KEY"/></translation>
+<translation id="2379281330731083556">सिसà¥\8dâ\80\8dà¤\9fम à¤¡à¥\89यलà¥\89à¤\97 का उपयोग करके प्रिंट करें… <ph name="SHORTCUT_KEY"/></translation>
 <translation id="918765022965757994">इस साइट में इस रूप में प्रवेश करें: <ph name="EMAIL_ADDRESS"/></translation>
 <translation id="8216278935161109887">प्रस्थान करें फिर पुन: प्रवेश करें</translation>
 <translation id="6254503684448816922">कुंजी समझौता</translation>
 <translation id="2819994928625218237">कोई वर्तनी सुझाव &amp;नहीं</translation>
 <translation id="382518646247711829">यदि आप प्रॉक्सी सर्वर का उपयोग करते हैं...</translation>
 <translation id="1923342640370224680">पिछला घंटा</translation>
-<translation id="6432458268957186486"><ph name="CLOUD_PRINT_NAME"/> à¤¸à¤\82वाद का उपयोग करके प्रिंट करें...</translation>
+<translation id="6432458268957186486"><ph name="CLOUD_PRINT_NAME"/> à¤¡à¥\89यलà¥\89à¤\97 का उपयोग करके प्रिंट करें...</translation>
 <translation id="2382694417386844779">ऑम्निबॉक्स में URL को छिपा देता है और उसके बजाय होस्टनाम को क्लिक करने योग्य चिप में दिखाता है.</translation>
 <translation id="2950186680359523359">कोई डेटा भेजे बिना सर्वर ने कनेक्‍शन बंद कर दिया.</translation>
 <translation id="4269099019648381197">सेटिंग मेनू में अनुरोध टेबलेट साइट विकल्प सक्षम करता है.</translation>
 <translation id="971774202801778802">URL बुकमार्क करें</translation>
 <translation id="3979395879372752341">नया एक्सटेंशन जोड़ा गया (<ph name="EXTENSION_NAME"/>)</translation>
 <translation id="2609632851001447353">विविधताएं</translation>
-<translation id="2127166530420714525">Bluetooth एडैप्‍टर की पॉवर स्थिति बदलने में विफल.</translation>
+<translation id="2127166530420714525">ब्लूटूथ एडैप्‍टर की पॉवर स्थिति बदलने में विफल.</translation>
 <translation id="2765718175690078089">प्रयोगात्‍मक स्‍ट्रीमलाइन किए गए होस्‍टेड ऐप्‍स को सक्षम करें.</translation>
 <translation id="2824775600643448204">पता और खोज बार</translation>
 <translation id="7716781361494605745">Netscape प्रमाणन प्राधिकरण नीति URL</translation>
 <translation id="4146175323503586871"><ph name="SERVICE_NAME"/> जांचना चाहती है कि क्या आपका Chrome OS उपकरण ऑफ़र के लिए पात्र है या नहीं. <ph name="MORE_INFO_LINK"/></translation>
 <translation id="8059417245945632445">&amp;उपकरणों का परीक्षण करें</translation>
 <translation id="3391392691301057522">पुराना पिन:</translation>
-<translation id="96421021576709873">Wi-Fi नेटवर्क</translation>
+<translation id="96421021576709873">वाई-फ़ाई  नेटवर्क</translation>
 <translation id="1344519653668879001">हाइपरलिंक लेखा परीक्षा अक्षम करें</translation>
 <translation id="6463795194797719782">&amp;संपादित करें</translation>
 <translation id="8816881387529772083">MIDI पूर्ण नियंत्रण</translation>
 <translation id="7516331482824334944">प्रयोगात्मक Chromecast सहायता अक्षम करें</translation>
 <translation id="2471964272749426546">तमिल इनपुट विधि (Tamil99)</translation>
 <translation id="9088917181875854783">कृपया पुष्टि करें कि यह पासकुंजी &quot;<ph name="DEVICE_NAME"/>&quot; पर दिखाई गई है:</translation>
-<translation id="8814190375133053267">Wi-Fi</translation>
+<translation id="8814190375133053267">वाई-फ़ाई </translation>
 <translation id="5236831943526452400">जब आप अपना ब्राउज़र बंद करें तो कुकी तथा अन्य साइट डेटा साफ़ करें</translation>
 <translation id="1558834950088298812">एक्सटेंशन के अपडेट होने की पुनरावृत्तियां</translation>
 <translation id="8410619858754994443">पासवर्ड की पुष्टि करें:</translation>
 <translation id="7347751611463936647">इस एक्सटेंशन का उपयोग करने के लिए, &quot;<ph name="EXTENSION_KEYWORD"/>&quot; लिखें, फिर टैब लगाएं, फिर अपना आदेश या खोज लिखें.</translation>
 <translation id="878431691778285679">ऐसा लगता है आप पहले से ही उस नाम से किसी उपयोगकर्ता को प्रबंधित कर रहे हैं.<ph name="LINE_BREAK"/>क्या आप<ph name="BEGIN_LINK"/> <ph name="PROFILE_NAME"/> को इस उपकरण में निर्यात करना चाहते थे<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> आपके माइक्रोफ़ोन का उपयोग करना चाहता है.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">ऐप्स</translation>
 <translation id="5151511998946489774">इस वेबसाइट की पहचान को <ph name="ISSUER"/> द्वारा सत्यापित किया गया है और यह सार्वजनिक रूप से ऑडिट किए जाने योग्य है.</translation>
 <translation id="1608626060424371292">इस उपयोगकर्ता को निकालें</translation>
 <translation id="2779552785085366231">इस पृष्ठ को ऐप्स लॉन्चर में जोड़ा जा सकता है</translation>
 <ph name="EXTENSION_FILE"/></translation>
 <translation id="499165176004408815">उच्च कंट्रास्ट मोड उपयोग करें</translation>
 <translation id="2928940441164925372">निष्पादन-संबंधी मेट्रिक्स और ईवेंट का प्रयोग में नहीं एकत्रीकरण सक्षम करें और इस डेटा को ग्राफ़िकल फ़ैशन में देखने का विकल्प प्रदान करें. डेटा देखने के लिए, chrome://performance पर जाएं.</translation>
-<translation id="3289856944988573801">अपडेट की जांच करने के लिए, कृपया Ethernet या Wi-Fi उपयोग करें.</translation>
+<translation id="3289856944988573801">अपडेट की जांच करने के लिए, कृपया Ethernet या वाई-फ़ाई  उपयोग करें.</translation>
 <translation id="6371865199884571412">इस वेबसाइट में शॉर्टकट जोड़ें...</translation>
 <translation id="7248671827512403053">ऐप्स </translation>
 <translation id="247500748408468353">कृपया अपने व्‍यवस्‍थापक से संपर्क करें या पुन: प्रयास करें.</translation>
 <translation id="6042308850641462728">अधिक</translation>
 <translation id="8318945219881683434">निरस्तीकरण जांचने में विफ़ल रहा.</translation>
 <translation id="4719197194005159666">Chrome Apps के खुले होने पर Chrome छोड़ने से रोकता है.</translation>
-<translation id="4676187981481349427">आपकी जानकारी की रक्षा करने के लिए <ph name="SITE"/> आमतौर पर एन्क्रिप्शन का उपयोग करती है. जब Chrome ने इस बार <ph name="SITE"/> से कनेक्ट करने का प्रया किया, तो वेबसाइट ने असाधारण और गलत क्रेडेंशियल वापस भेज दिए. या तो कोई हमलावर <ph name="SITE"/> होने का दावा करने का प्रयास कर रहा है या किसी Wi-Fi प्रवेश स्क्रीन ने कनेक्शन को बाधित कर दिया है. आपकी जानकारी अभी भी सुरक्षित है क्योंकि किसी भी डेटा के आदान-प्रदान से पहले ही Chrome ने कनेक्शन को रोक दिया था.</translation>
+<translation id="4676187981481349427">आपकी जानकारी की रक्षा करने के लिए <ph name="SITE"/> आमतौर पर एन्क्रिप्शन का उपयोग करती है. जब Chrome ने इस बार <ph name="SITE"/> से कनेक्ट करने का प्रया किया, तो वेबसाइट ने असाधारण और गलत क्रेडेंशियल वापस भेज दिए. या तो कोई हमलावर <ph name="SITE"/> होने का दावा करने का प्रयास कर रहा है या किसी वाई-फ़ाई  प्रवेश स्क्रीन ने कनेक्शन को बाधित कर दिया है. आपकी जानकारी अभी भी सुरक्षित है क्योंकि किसी भी डेटा के आदान-प्रदान से पहले ही Chrome ने कनेक्शन को रोक दिया था.</translation>
 <translation id="1408789165795197664">उन्नत...</translation>
 <translation id="1650709179466243265">www. और .com जोड़ें और पता खोलें</translation>
 <translation id="3700834376805760154"><ph name="LOCALITY"/> पर <ph name="ORGANIZATION"/> की पहचान को <ph name="ISSUER"/> द्वारा सत्यापित किया गया है और वह सार्वजनिक रूप से ऑडिट किए जाने योग्य है.</translation>
-<translation id="436701661737309601">à¤\95िसà¥\80 à¤\90सà¥\87 à¤ªà¥\8dरमाणपतà¥\8dर à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\9cिसà¤\95à¥\80 à¤¸à¤®à¤¯-सà¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¨ à¤¹à¥\81à¤\88 à¤¹à¥\8b, à¤\89सà¤\95à¥\80 ''निरसà¥\8dतà¥\80à¤\95रण à¤¸à¥\82à¤\9aà¥\80'' à¤\95à¥\80 à¤¦à¥\87à¤\96रà¥\87à¤\96 à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\89स à¤ªà¥\8dरमाणपतà¥\8dर à¤\95ा à¤\9cारà¥\80à¤\95रà¥\8dता à¤\89तà¥\8dतरदायà¥\80 à¤¹à¥\8bता à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤ªà¥\8dरमाणपतà¥\8dर à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\95भà¥\80 à¤­à¥\80 à¤\9bà¥\87à¥\9cà¤\9bाà¥\9c à¤\95à¥\80 à¤\9cातà¥\80 à¤¹à¥\88, à¤¤à¥\8b à¤\9cारà¥\80à¤\95रà¥\8dता à¤\89सà¥\87 à¤¨à¤¿à¤°à¤¸à¥\8dतà¥\80à¤\95रण à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bà¥\9cà¤\95र à¤¨à¤¿à¤°à¤¸à¥\8dत à¤\95र à¤¸à¤\95ता à¤¹à¥\88, à¤\94र à¤\87सà¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¯à¤¹ à¤ªà¥\8dरमाणपतà¥\8dर à¤\86पà¤\95à¥\87 à¤¬à¥\8dराà¤\89à¤\9c़र à¤\95à¥\87 à¤²à¤¿à¤\8f à¤µà¤¿à¤¶à¥\8dवसनà¥\80य à¤¨à¤¹à¥\80à¤\82 à¤°à¤¹à¥\87à¤\97ा. à¤¨à¤¿à¤°à¤¸à¥\8dतà¥\80à¤\95रण à¤¸à¥\8dथिति à¤\95à¥\80 à¤¦à¥\87à¤\96रà¥\87à¤\96 à¤\95रनà¥\87 à¤\95à¥\80 à¤\86वशà¥\8dयà¤\95ता, à¤¸à¤®à¤¯-सà¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9aà¥\81à¤\95à¥\87 à¤ªà¥\8dरमाणपतà¥\8dरà¥\8bà¤\82 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88, à¤\87सलिà¤\8f à¤\9cबà¤\95ि à¤\86पà¤\95à¥\87 à¤¦à¥\8dवारा à¤¦à¥\87à¤\96à¥\80 à¤\9cा à¤°à¤¹à¥\80 à¤µà¥\87बसाà¤\87à¤\9f à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\87स à¤ªà¥\8dरमाणपतà¥\8dर à¤\95ा à¤\89पयà¥\8bà¤\97 à¤®à¤¾à¤¨à¥\8dय à¤°à¥\82प à¤®à¥\87à¤\82 à¤\95िया à¤\9cाता à¤¹à¥\88, à¤\87स à¤¸à¥\8dथिति à¤®à¥\87à¤\82 à¤¯à¤¹ à¤¨à¤¿à¤°à¥\8dधारित à¤\95रना à¤¸à¤\82भव à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88 à¤\95ि à¤\95à¥\8dया à¤\87स à¤ªà¥\8dरमाणपतà¥\8dर à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\9bà¥\87à¥\9cà¤\9bाà¥\9c à¤\95à¥\80 à¤\97à¤\88 à¤¥à¥\80, à¤\94र à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤\87सà¥\87 à¤¨à¤¿à¤°à¤¸à¥\8dत à¤\95िया à¤\97या à¤¥à¤¾, à¤¯à¤¾ à¤¯à¤¹ à¤\85ब à¤­à¥\80 à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\88. à¤\90सà¥\87 à¤®à¥\87à¤\82 à¤¯à¤¹ à¤¬à¤¤à¤¾ à¤ªà¤¾à¤¨à¤¾ à¤\85सà¤\82भव à¤¹à¥\88 à¤\95ि à¤\95à¥\8dया à¤\86प à¤\95िसà¥\80 à¤µà¥\88ध à¤µà¥\87बसाà¤\87à¤\9f à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤¸à¤\82वाद कर रहे हैं, या क्या प्रमाणपत्र के साथ छेड़छाड़ की गई थी और क्या वह अभी किसी ऐसे हमलावर के अधीन है जिसके साथ आप बातचीत कर रहे हैं.</translation>
+<translation id="436701661737309601">à¤\95िसà¥\80 à¤\90सà¥\87 à¤ªà¥\8dरमाणपतà¥\8dर à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\9cिसà¤\95à¥\80 à¤¸à¤®à¤¯-सà¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¨ à¤¹à¥\81à¤\88 à¤¹à¥\8b, à¤\89सà¤\95à¥\80 ''निरसà¥\8dतà¥\80à¤\95रण à¤¸à¥\82à¤\9aà¥\80'' à¤\95à¥\80 à¤¦à¥\87à¤\96रà¥\87à¤\96 à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\89स à¤ªà¥\8dरमाणपतà¥\8dर à¤\95ा à¤\9cारà¥\80à¤\95रà¥\8dता à¤\89तà¥\8dतरदायà¥\80 à¤¹à¥\8bता à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤ªà¥\8dरमाणपतà¥\8dर à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\95भà¥\80 à¤­à¥\80 à¤\9bà¥\87à¥\9cà¤\9bाà¥\9c à¤\95à¥\80 à¤\9cातà¥\80 à¤¹à¥\88, à¤¤à¥\8b à¤\9cारà¥\80à¤\95रà¥\8dता à¤\89सà¥\87 à¤¨à¤¿à¤°à¤¸à¥\8dतà¥\80à¤\95रण à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bà¥\9cà¤\95र à¤¨à¤¿à¤°à¤¸à¥\8dत à¤\95र à¤¸à¤\95ता à¤¹à¥\88, à¤\94र à¤\87सà¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¯à¤¹ à¤ªà¥\8dरमाणपतà¥\8dर à¤\86पà¤\95à¥\87 à¤¬à¥\8dराà¤\89à¤\9c़र à¤\95à¥\87 à¤²à¤¿à¤\8f à¤µà¤¿à¤¶à¥\8dवसनà¥\80य à¤¨à¤¹à¥\80à¤\82 à¤°à¤¹à¥\87à¤\97ा. à¤¨à¤¿à¤°à¤¸à¥\8dतà¥\80à¤\95रण à¤¸à¥\8dथिति à¤\95à¥\80 à¤¦à¥\87à¤\96रà¥\87à¤\96 à¤\95रनà¥\87 à¤\95à¥\80 à¤\86वशà¥\8dयà¤\95ता, à¤¸à¤®à¤¯-सà¥\80मा à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9aà¥\81à¤\95à¥\87 à¤ªà¥\8dरमाणपतà¥\8dरà¥\8bà¤\82 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88, à¤\87सलिà¤\8f à¤\9cबà¤\95ि à¤\86पà¤\95à¥\87 à¤¦à¥\8dवारा à¤¦à¥\87à¤\96à¥\80 à¤\9cा à¤°à¤¹à¥\80 à¤µà¥\87बसाà¤\87à¤\9f à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\87स à¤ªà¥\8dरमाणपतà¥\8dर à¤\95ा à¤\89पयà¥\8bà¤\97 à¤®à¤¾à¤¨à¥\8dय à¤°à¥\82प à¤®à¥\87à¤\82 à¤\95िया à¤\9cाता à¤¹à¥\88, à¤\87स à¤¸à¥\8dथिति à¤®à¥\87à¤\82 à¤¯à¤¹ à¤¨à¤¿à¤°à¥\8dधारित à¤\95रना à¤¸à¤\82भव à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88 à¤\95ि à¤\95à¥\8dया à¤\87स à¤ªà¥\8dरमाणपतà¥\8dर à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\9bà¥\87à¥\9cà¤\9bाà¥\9c à¤\95à¥\80 à¤\97à¤\88 à¤¥à¥\80, à¤\94र à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤\87सà¥\87 à¤¨à¤¿à¤°à¤¸à¥\8dत à¤\95िया à¤\97या à¤¥à¤¾, à¤¯à¤¾ à¤¯à¤¹ à¤\85ब à¤­à¥\80 à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\88. à¤\90सà¥\87 à¤®à¥\87à¤\82 à¤¯à¤¹ à¤¬à¤¤à¤¾ à¤ªà¤¾à¤¨à¤¾ à¤\85सà¤\82भव à¤¹à¥\88 à¤\95ि à¤\95à¥\8dया à¤\86प à¤\95िसà¥\80 à¤µà¥\88ध à¤µà¥\87बसाà¤\87à¤\9f à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤¡à¥\89यलà¥\89à¤\97 कर रहे हैं, या क्या प्रमाणपत्र के साथ छेड़छाड़ की गई थी और क्या वह अभी किसी ऐसे हमलावर के अधीन है जिसके साथ आप बातचीत कर रहे हैं.</translation>
 <translation id="4342311272543222243">ओह, TPM त्रुटि.</translation>
 <translation id="3727884750434605207">स्थानीय Android पहुंच-योग्यता के बजाय स्क्रिप्ट इंजेक्शन सक्षम करें.</translation>
 <translation id="1285484354230578868">डेटा को अपने Google डिस्क खाते में संगृहीत करें</translation>
 
         यदि यह उपकरण आपके संगठन का नहीं है, और यह आपका निजी उपकरण है, तो आप उपकरण का नामांकन रद्द करने के लिए अभी Ctrl+Alt+E दबा सकते हैं और प्रवेश स्क्रीन पर वापस जा सकते हैं.</translation>
 <translation id="2890624088306605051">केवल समन्‍वयित सेटिंग और डेटा पुनर्प्राप्त करें</translation>
-<translation id="5675225387922096989">à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80 à¤¸à¤\82वाद को अक्षम करें.</translation>
+<translation id="5675225387922096989">à¤\90पà¥\8dस à¤\9cानà¤\95ारà¥\80 à¤¡à¥\89यलà¥\89à¤\97 को अक्षम करें.</translation>
 <translation id="4779083564647765204">ज़ूम</translation>
 <translation id="6397363302884558537">बोलना रोकें</translation>
 <translation id="6957703620025723294">प्रयोगात्मक कैनवास सुविधाएं सक्षम करें</translation>
 <translation id="4062251648694601778">अपने <ph name="SHORT_PRODUCT_NAME"/> उपकरण का आनंद लें. क्या आपके पास प्रश्न हैं? आप स्थिति ट्रे में &quot;?&quot; क्लिक करके कभी भी सहायता प्राप्त कर सकते हैं.</translation>
 <translation id="6701535245008341853">प्रोफ़ाइल प्राप्त नहीं कर सका.</translation>
 <translation id="8303655282093186569">पिनयिन इनपुट सेटिंग</translation>
-<translation id="992779717417561630"><ph name="CLOUD_PRINT_NAME"/> à¤¸à¤\82वाद का उपयोग करके प्रिंट करें... <ph name="SHORTCUT_KEY"/></translation>
+<translation id="992779717417561630"><ph name="CLOUD_PRINT_NAME"/> à¤¡à¥\89यलà¥\89à¤\97 का उपयोग करके प्रिंट करें... <ph name="SHORTCUT_KEY"/></translation>
 <translation id="1991402313603869273"><ph name="PLUGIN_NAME"/> को अनुमति नहीं है.</translation>
 <translation id="527605982717517565"><ph name="HOST"/> पर JavaScript को हमेशा अनुमति दें</translation>
 <translation id="702373420751953740">PRL संस्करण:</translation>
 <translation id="6460601847208524483">अगला ढूंढें</translation>
 <translation id="397703832102027365">अंतिम रूप दिया जा रहा है...</translation>
 <translation id="8146177459103116374">यदि आप इस उपकरण पर पहले से पंजीकृत हैं, तो आप <ph name="LINK2_START"/>मौजूदा उपयोगकर्ता के रूप में प्रवेश<ph name="LINK2_END"/> कर सकते हैं.</translation>
+<translation id="5072836811783999860">प्रबंधित बुकमार्क दिखाएं</translation>
 <translation id="4856478137399998590">आपकी मोबाइल डेटा सेवा सक्रिय कर दी गई है और उपयोग के लिए तैयार है</translation>
 <translation id="3305389145870741612">स्‍वरूपण प्रक्रिया में कुछ सेकंड लग सकते हैं. कृपया प्रतीक्षा करें.</translation>
 <translation id="3648607100222897006">ये प्रायोगिक विशेषताएं किसी भी समय बदल, अनिरंतर या गायब हो सकती हैं. हम इस बात की कोई भी गारंटी नहीं दे सकते कि आपके द्वारा इनमें से किसी भी प्रयोग को चालू करने पर क्या हो सकता है, और यहां तक कि आपका ब्राउज़र नष्ट भी हो सकता है. मज़ाक छोड़ें, आपका ब्राउज़र आपका पूरा डेटा हटा सकता है, या आपकी सुरक्षा और गोपनीयता अप्रत्याशित रूप से ख़तरे में पड़ सकती है. आपके द्वारा सक्षम किए गए कोई भी प्रयोग इस ब्राउज़र के सभी उपयोगकर्ताओं के लिए सक्षम होंगे. कृपया सावधानी से आगे बढ़ें.</translation>
 <translation id="5958529069007801266">पर्यवेक्षित उपयोगकर्ता</translation>
 <translation id="3129173833825111527">बायां हाशिया</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/>K (<ph name="NUM_KILOBYTES_LIVE"/>K लाइव)</translation>
-<translation id="5554573843028719904">अन्‍य Wi-Fi नेटवर्क...</translation>
+<translation id="5554573843028719904">अन्‍य वाई-फ़ाई  नेटवर्क...</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED"/>, <ph name="TIME_LEFT"/></translation>
 <translation id="7013485839273047434">और अधिक एक्सटेंशन प्राप्त करें</translation>
 <translation id="2124335647227850314">डिस्प्ले के रंग को कैलिब्रेट करना अक्षम करें भले ही डिस्प्ले द्वारा सुविधा का समर्थन किया जाता हो.</translation>
 <translation id="7009102566764819240">नीचे पृष्ठ के लिए सभी असुरक्षित तत्वों की सूची दी गई है. किसी विशिष्ट संसाधन के लिए मैलवेयर थ्रेड पर अधिक जानकारी हेतु नैदानिक लिंक पर क्लिक करें. यदि आप जानते हैं कि किसी संसाधन को ग़लती से फ़िशिंग के रूप में रिपोर्ट किया गया है, तो 'रिपोर्ट त्रुटि' लिंक क्लिक करें.</translation>
 <translation id="3592260987370335752">&amp;अधिक जानें</translation>
 <translation id="3631337165634322335">नीचे दिए गए अपवाद केवल वर्तमान गुप्त सत्र पर ही लागू हैं.</translation>
-<translation id="676327646545845024">à¤\87स à¤ªà¥\8dरà¤\95ार à¤\95à¥\87 à¤¸à¤­à¥\80 à¤²à¤¿à¤\82à¤\95 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¸à¤\82वाद पुन: कभी न दिखाएं.</translation>
+<translation id="676327646545845024">à¤\87स à¤ªà¥\8dरà¤\95ार à¤\95à¥\87 à¤¸à¤­à¥\80 à¤²à¤¿à¤\82à¤\95 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¡à¥\89यलà¥\89à¤\97 पुन: कभी न दिखाएं.</translation>
 <translation id="1485146213770915382">खोज शब्द प्रविष्ट करने के URL में <ph name="SEARCH_TERMS_LITERAL"/> सम्मिलित करें. </translation>
 <translation id="8141725884565838206">अपने पासवर्ड प्रबंधित करें</translation>
 <translation id="4839303808932127586">इस रूप में वीडियो स&amp;हेजें...</translation>
 <translation id="8426564434439698958">इस चित्र के लिए <ph name="SEARCH_ENGINE"/>  &amp;खोजें</translation>
 <translation id="4375035964737468845">डाउनलोड की गई फ़ाइलें खोलें</translation>
 <translation id="3968739731834770921">काना</translation>
-<translation id="7387829944233909572">&quot;बà¥\8dराà¤\89à¤\9cिà¤\82à¤\97 à¤¡à¥\87à¤\9fा à¤¸à¤¾à¤«à¤¼ à¤\95रà¥\87à¤\82&quot; à¤¸à¤\82वाद</translation>
+<translation id="7387829944233909572">&quot;बà¥\8dराà¤\89à¤\9cिà¤\82à¤\97 à¤¡à¥\87à¤\9fा à¤¸à¤¾à¤«à¤¼ à¤\95रà¥\87à¤\82&quot; à¤¡à¥\89यलà¥\89à¤\97</translation>
 <translation id="8023801379949507775">एक्सटेंशन अभी अपडेट करें</translation>
 <translation id="5963453369025043595"><ph name="NUM_HANDLES"/> (<ph name="NUM_KILOBYTES_LIVE"/> उच्चतम)</translation>
 <translation id="2524800364695118482">यह निम्न कार्य कर सकता है:</translation>
 <translation id="4763816722366148126">पिछली इनपुट पद्धति को चुनें</translation>
 <translation id="6458308652667395253">JavaScript अवरोधन प्रबंधित करें...</translation>
 <translation id="8435334418765210033">याद किए गए नेटवर्क</translation>
-<translation id="512608082539554821">यदि à¤¸à¤\95à¥\8dषम à¤¹à¥\8b, à¤¤à¥\8b à¤«à¤¼à¤°à¥\8dसà¥\8dà¤\9f-रन à¤\9fà¥\8dयà¥\82à¤\9fà¥\8bरियल के दौरान संक्रमणों को एनिमेट किया जाता है.</translation>
+<translation id="512608082539554821">यदि à¤¸à¤\95à¥\8dषम à¤¹à¥\8b, à¤¤à¥\8b à¤«à¤¼à¤°à¥\8dसà¥\8dà¤\9f-रन à¤¨à¤¿à¤°à¥\8dदà¥\87श के दौरान संक्रमणों को एनिमेट किया जाता है.</translation>
 <translation id="8632275030377321303">उपयोगकर्ता द्वारा प्रॉक्सी में बदलाव नहीं किया जा सकता.</translation>
 <translation id="6449285849137521213">&quot;<ph name="EXTENSION_NAME"/>&quot; ऐप्स  जोड़ा गया.</translation>
 <translation id="6516193643535292276">इंटरनेट से कनेक्‍ट होने में असमर्थ</translation>
 <translation id="6040143037577758943">बंद करें</translation>
 <translation id="5787146423283493983">मुख्य अनुबंध</translation>
 <translation id="4265682251887479829">आप जो खोज रहे हैं, उसे ढूंढ़ा सकता?</translation>
-<translation id="216169395504480358">Wi-Fi जोड़ें...</translation>
+<translation id="216169395504480358">वाई-फ़ाई  जोड़ें...</translation>
 <translation id="1804251416207250805">हाइपरलिंक ऑडिटिंग पिंग भेजना अक्षम करें. </translation>
 <translation id="5116628073786783676">इस रूप में ऑडियो स&amp;हेजें...</translation>
 <translation id="6172346010137455972">आप उपयोग करने के लिए तैयार हैं.</translation>
 <translation id="5486275809415469523"><ph name="APP_NAME"/> आपकी स्क्रीन <ph name="TAB_NAME"/> के साथ साझा कर रहा है.</translation>
 <translation id="8982248110486356984">उपयोगकर्ताओं को स्विच करें</translation>
 <translation id="716640248772308851">&quot;<ph name="EXTENSION"/>&quot; चेक किए गए स्‍थानों में चित्रों, वीडियो, और ध्‍वनि फ़ाइलों को पढ़ सकता है.</translation>
-<translation id="7887864092952184874">Bluetooth माउस युग्मित किया गया</translation>
+<translation id="7887864092952184874">ब्लूटूथ माउस युग्मित किया गया</translation>
 <translation id="7649070708921625228">सहायता</translation>
 <translation id="858637041960032120">फ़ोन नंबर जोड़ें
 </translation>
 <translation id="6869402422344886127">चयनित चेक बॉक्‍स</translation>
 <translation id="3428010780253032925">दृश्यों में रेक्ट-आधारित लक्ष्यीकरण अक्षम करें</translation>
 <translation id="5637380810526272785">इनपुट पद्धति</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> दिखाएं</translation>
 <translation id="2837049386027881519">TLS या SSL प्रोटोकॉल के किसी पुराने संस्करण का उपयोग करके कनेक्शन का पुनः प्रयास किया जाना चाहिए था. आमतौर पर इसका अर्थ है कि सर्वर बहुत पुराने सॉफ़्टवेयर का उपयोग कर रहा है और उसमें अन्य सुरक्षा समस्याएं हो सकती हैं.</translation>
 <translation id="404928562651467259">चेतावनी</translation>
 <translation id="4289300219472526559">बोलना प्रारंभ करें</translation>
 <translation id="4980112683975062744">सर्वर से डुप्‍लीकेट शीर्षलेख प्राप्त हुए</translation>
 <translation id="3828029223314399057">बुकमार्क खोजें</translation>
 <translation id="4885705234041587624">MSCHAPv2</translation>
-<translation id="8498716162437226120">Bluetooth उपकरण जोड़ें</translation>
+<translation id="8498716162437226120">ब्लूटूथ उपकरण जोड़ें</translation>
 <translation id="5614190747811328134">उपयोगकर्ता सूचना</translation>
 <translation id="8677914765885474883">चेतावनी: डेटा एकीकृत नहीं किया जा रहा है! इससे पृष्ठ धीमा हो सकता है!</translation>
 <translation id="3163460631729938959">अनुमतियां दिखाएं</translation>
 <translation id="668171684555832681">अन्य...</translation>
 <translation id="7540972813190816353">अपडेट की जांच करते समय कोई त्रुटि आई: <ph name="ERROR"/></translation>
 <translation id="7029415434450801489">ऑम्निबॉक्स में खोज बटन रखता है.</translation>
-<translation id="7664620655576155379">असमर्थित Bluetooth उपकरण: &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
+<translation id="7664620655576155379">असमर्थित ब्लूटूथ उपकरण: &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
 <translation id="2225024820658613551">आपको आगे नहीं बढ़ना चाहिए, &lt;strong&gt;विशेष रूप से&lt;/strong&gt; तब यदि आपने पहले कभी इस साइट के लिए यह चेतावनी नहीं देखी हो.</translation>
 <translation id="2049639323467105390">यह उपकरण <ph name="DOMAIN"/> द्वारा प्रबंधित है.</translation>
 <translation id="1932098463447129402">पहले नहीं</translation>
 <translation id="2339120501444485379">नया नाम डालें</translation>
 <translation id="1753682364559456262">चित्र अवरोधन प्रबंधित करें...</translation>
 <translation id="6550675742724504774">विकल्प</translation>
-<translation id="426564820080660648">अपडेट की जांच करने के लिए, कृपया Ethernet या Wi-Fi उपयोग करें.</translation>
+<translation id="426564820080660648">अपडेट की जांच करने के लिए, कृपया Ethernet या वाई-फ़ाई  उपयोग करें.</translation>
 <translation id="1834685210351639210">रेंडरर क्रैश हो गया</translation>
 <translation id="2889064240420137087">इनके साथ लिंक खोलें...</translation>
 <translation id="431076611119798497">&amp;विवरण</translation>
 <translation id="6934265752871836553">ब्लीडिंग-एज कोड का उपयोग करें ताकि Chrome सामग्री को तेज़ी से निकाल सके. इस पथ की पृष्ठभूमि में
         होने वाले बदलाव बहुत हद तक ढेर सारी सामग्री को विभाजित कर देंगे.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">हमेशा Adobe Reader में खोलें</translation>
 <translation id="8274359292107649245">डेस्कटॉप पर Chrome खोलें</translation>
 <translation id="1571119610742640910">नियत रूट पृष्ठभूमियों के लिए संयोजन.</translation>
 <translation id="6514565641373682518">इस पृष्ठ ने आपका माउस कर्सर अक्षम कर दिया है.</translation>
 <translation id="824543159844843373">लॉन्चर आइटम 3 सक्रिय करें</translation>
 <translation id="3819800052061700452">&amp;पूर्ण स्क्रीन</translation>
 <translation id="48607902311828362">हवाई जहाज़ मोड</translation>
+<translation id="711840821796638741">प्रबंधित बुकमार्क दिखाएं</translation>
 <translation id="3360297538363969800">प्रिंट करना विफल रहा. कृपया अपना प्रिंटर जांचें और पुन: प्रयास करें.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> पर RLZ ट्रैकिंग सक्षम करें.</translation>
 <translation id="688797901999351107">कृपया वापस मंगाए गए चार्जर का उपयोग बंद कर दें.</translation>
 <translation id="5284518706373932381">आप कुछ ही घंटे में इस वेबसाइट पर वापस आ जाएंगे. Google सुरक्षित ब्राउज़िंग को <ph name="SITE"/> पर हाल ही में <ph name="BEGIN_LINK"/>मैलवेयर का पता चला<ph name="END_LINK"/> है. आमतौर पर सुरक्षित रहने वाली वेबसाइटें मैलवेयर से संक्रमित हो सकती हैं.</translation>
 <translation id="969892804517981540">आधिकारिक बिल्ड</translation>
 <translation id="1691608011302982743">आपने अपना उपकरण बहुत जल्‍दी निकाल लिया है!</translation>
-<translation id="445923051607553918">Wi-Fi नेटवर्क से जुड़ें</translation>
+<translation id="445923051607553918">वाई-फ़ाई  नेटवर्क से जुड़ें</translation>
 <translation id="1898137169133852367">पावरवॉश आपके <ph name="IDS_SHORT_PRODUCT_NAME"/> उपकरण को नए जैसा रीसेट कर देता है. इसके अतिरिक्त, आपका उपकरण <ph name="IDS_SHORT_PRODUCT_NAME"/> के पिछले अपडेट पर वापस चला जाएगा.</translation>
 <translation id="4215898373199266584">श्श्श! गुप्त मोड (<ph name="INCOGNITO_MODE_SHORTCUT"/>) अगली बार उपयोगी हो सकता है.</translation>
 <translation id="1048597748939794622">सभी परतों के लिए बलपूर्वक सक्षम करें</translation>
 <translation id="5849869942539715694">एक्सटेंशन पैक करें...</translation>
 <translation id="7339785458027436441">लिखते समय वर्तनी की जांच करें</translation>
 <translation id="5233736638227740678">&amp;चिपकाएं</translation>
-<translation id="1828901632669367785">सिसà¥\8dâ\80\8dà¤\9fम à¤¸à¤\82वाद का उपयोग करके प्रिंट करें…</translation>
+<translation id="1828901632669367785">सिसà¥\8dâ\80\8dà¤\9fम à¤¡à¥\89यलà¥\89à¤\97 का उपयोग करके प्रिंट करें…</translation>
 <translation id="1801298019027379214">गलत पिन, कृपया पुनः प्रयास करें. शेष प्रयास: <ph name="TRIES_COUNT"/></translation>
 <translation id="534749176369872155"><ph name="SITE"/> ने Chrome को पहले से स्‍वीकृत प्रमाणपत्र क्रेडेंशियल की सूची उपलब्‍ध कराई. Chrome को इस कनेक्‍शन प्रयास के दौरान पहले से स्‍वीकृत कोई क्रेडेंशियल प्राप्त नहीं हुआ, जो दर्शाता है कि आक्रमणकर्ता <ph name="SITE"/> का प्रतिरूपण करने का प्रयास कर रहा है.</translation>
 <translation id="992543612453727859">वाक्यांश सामने जोड़ें</translation>
index 8c108b9..8279b6c 100644 (file)
@@ -3930,6 +3930,7 @@ Ne otkrivajte nikakve osjetljive podatke.</translation>
 <translation id="6460601847208524483">Traži sljedeće</translation>
 <translation id="397703832102027365">Dovršavanje...</translation>
 <translation id="8146177459103116374">Ako ste već registrirani na ovom uređaju, možete <ph name="LINK2_START"/>se prijaviti kao postojeći korisnik<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Prikaži upravljane oznake</translation>
 <translation id="4856478137399998590">Vaša mobilna podatkovna usluga aktivirana je i spremna za upotrebu</translation>
 <translation id="3305389145870741612">Postupak formatiranja može potrajati nekoliko sekundi. Pričekajte.</translation>
 <translation id="3648607100222897006">Te eksperimentalne značajke mogu se promijeniti, pokvariti ili nestati u bilo kojem trenutku. Ne dajemo apsolutno nikakva jamstva o tome što se može dogoditi ako uključite jedan od tih eksperimenata, a vaš preglednik čak može spontano sagorjeti. Šalu na stranu, vaš preglednik može izbrisati sve vaše podatke ili vaša sigurnost i privatnost mogu biti ugrožene na neočekivane načine. Svi eksperimenti koje omogućite bit će omogućeni za sve korisnike ovog preglednika. Nastavite uz oprez.</translation>
@@ -4359,6 +4360,7 @@ Ne otkrivajte nikakve osjetljive podatke.</translation>
 <translation id="6869402422344886127">Označeni okvir za izbor</translation>
 <translation id="3428010780253032925">Onemogući ciljanje na temelju pravokutnika u prikazima</translation>
 <translation id="5637380810526272785">Način unosa</translation>
+<translation id="3613134908380545408">Prikaži <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Bio je nužan ponovni pokušaj povezivanja starijom verzijom protokola TLS ili SSL. To uobičajeno znači da poslužitelj upotrebljava vrlo stari softver te da može imati druge sigurnosne probleme.</translation>
 <translation id="404928562651467259">UPOZORENJE</translation>
 <translation id="4289300219472526559">Počni govoriti</translation>
@@ -4690,6 +4692,7 @@ Ne otkrivajte nikakve osjetljive podatke.</translation>
 <translation id="2859369953631715804">Odaberite mobilnu mrežu</translation>
 <translation id="6934265752871836553">Upotrijebite najnoviji kôd u razvoju za brže iscrtavanje sadržaja u Chromeu. Promjene na kojima se temelji putanja vjerojatno će prekinuti mnogo sadržaja.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Uvijek otvaraj u Adobe Readeru</translation>
 <translation id="8274359292107649245">Otvori Chrome na radnoj površini</translation>
 <translation id="1571119610742640910">Uslojavanje za fiksne korijenske pozadine.</translation>
 <translation id="6514565641373682518">Ova stranica onemogućila je pokazivač miša.</translation>
@@ -4888,6 +4891,7 @@ Pritisnite bilo koju tipku da biste nastavili istraživati.</translation>
 <translation id="824543159844843373">Aktiviranje 3. stavke pokretača</translation>
 <translation id="3819800052061700452">&amp;Puni ekran</translation>
 <translation id="48607902311828362">Način rada u zrakoplovu</translation>
+<translation id="711840821796638741">Prikaži upravljane oznake</translation>
 <translation id="3360297538363969800">Ispis nije uspio. Provjerite svoj pisač i pokušajte ponovo.</translation>
 <translation id="680572642341004180">Omogući praćenje RLZ-a za <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Prestanite upotrebljavati opozvani punjač.</translation>
index 5be2ff9..9abb890 100644 (file)
@@ -2890,7 +2890,7 @@ Győződjön meg arról, hogy nem ad ki bizalmas adatokat.</translation>
 <translation id="7347751611463936647">A kifejezés használatához írja be a következőt: &quot;<ph name="EXTENSION_KEYWORD"/>&quot;, ezután nyomja meg a TAB-ot, majd parancsát vagy keresését.</translation>
 <translation id="878431691778285679">Úgy tűnik, Ön már kezel egy ilyen nevű felhasználót.<ph name="LINE_BREAK"/>Inkább <ph name="BEGIN_LINK"/>importálni szeretné <ph name="PROFILE_NAME"/> felhasználót erre az eszközre<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195">A(z) <ph name="HOST"/> a mikrofont kívánja használni.</translation>
-<translation id="2805756323405976993">Google Alkalmazások</translation>
+<translation id="2805756323405976993">Alkalmazások</translation>
 <translation id="5151511998946489774">A(z) <ph name="ISSUER"/> igazolta ennek a webhelynek az identitását, és az nyilvánosan megtekinthető.</translation>
 <translation id="1608626060424371292">Felhasználó eltávolítása</translation>
 <translation id="2779552785085366231">Az oldal nem adható hozzá az Alkalmazásindítóhoz</translation>
@@ -3937,6 +3937,7 @@ Győződjön meg arról, hogy nem ad ki bizalmas adatokat.</translation>
 <translation id="6460601847208524483">Következő keresése</translation>
 <translation id="397703832102027365">Véglegesítés...</translation>
 <translation id="8146177459103116374">Ha már regisztrálva van ezen az eszközön, akkor <ph name="LINK2_START"/>bejelentkezhet meglévő felhasználóként<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Kezelt könyvjelzők megjelenítése</translation>
 <translation id="4856478137399998590">Adatszolgáltatását aktiválta, és az használatra kész</translation>
 <translation id="3305389145870741612">A formázási folyamat eltarthat néhány másodpercig. Kérjük, várjon.</translation>
 <translation id="3648607100222897006">Ezek a kísérleti funkciók bármikor megváltozhatnak, elromolhatnak vagy eltűnhetnek. Nem vállalunk semmilyen garanciát az ezen kísérleti funkciók bekapcsolásából származó eseményekért; továbbá böngészője váratlanul összeomolhat. A viccet félretéve, a böngészője törölheti az összes adatot, valamint különböző módokon veszélyeztetheti biztonságát és adatvédelmét. Ha bármilyen kísérleti funkciót engedélyez, az a böngésző minden felhasználója számára engedélyezve lesz. Kérjük, óvatosan lépjen tovább.</translation>
@@ -4366,6 +4367,7 @@ letiltásához nyomja le a Ctrl+Alt+Z billentyűkombinációt.</translation>
 <translation id="6869402422344886127">Bejelölt jelölőnégyzet</translation>
 <translation id="3428010780253032925">A téglalap alapú célzás letiltása a nézetekben</translation>
 <translation id="5637380810526272785">Beviteli módszer</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> megjelenítése</translation>
 <translation id="2837049386027881519">A kapcsolat felépítését újra meg kellett próbálni egy régebbi verziójú TLS- vagy SSL-protokoll használatával. Ez általában azt jelenti, hogy a szerver nagyon régi szoftvert használ, és lehetnek vele más biztonsági problémák is.</translation>
 <translation id="404928562651467259">FIGYELMEZTETÉS</translation>
 <translation id="4289300219472526559">Beszéd megkezdése</translation>
@@ -4698,6 +4700,7 @@ letiltásához nyomja le a Ctrl+Alt+Z billentyűkombinációt.</translation>
 <translation id="6934265752871836553">Instabil kód használata, hogy a Chrome gyorsabban kirajzolja a tartalmakat. Az e mögött az útvonal mögött álló
         változtatások miatt sok tartalom valószínűleg rosszul fog megjelenni.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Megnyitás mindig az Adobe Readerben</translation>
 <translation id="8274359292107649245">A Chrome megnyitása az asztalon</translation>
 <translation id="1571119610742640910">Összeállítás rögzített gyökérhátterekhez.</translation>
 <translation id="6514565641373682518">Ez az oldal letiltotta az egérmutatóját.</translation>
@@ -4895,6 +4898,7 @@ letiltásához nyomja le a Ctrl+Alt+Z billentyűkombinációt.</translation>
 <translation id="824543159844843373">3. indítóelem bekapcsolása</translation>
 <translation id="3819800052061700452">&amp;Teljes képernyő</translation>
 <translation id="48607902311828362">Repülőgép üzemmód</translation>
+<translation id="711840821796638741">Kezelt könyvjelzők megjelenítése</translation>
 <translation id="3360297538363969800">A nyomtatás sikertelen. Ellenőrizze a nyomtatót, majd próbálja újra.</translation>
 <translation id="680572642341004180">RLZ-követés engedélyezése a következő esetében: <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Kérjük, ne használja tovább a visszahívott töltőt!</translation>
index 02ed373..5495d64 100644 (file)
@@ -3944,6 +3944,7 @@ dan tidak biasa. Bisa jadi penyerang berpura-pura menjadi <ph name="SITE"/>, ata
 <translation id="6460601847208524483">Temukan Berikutnya</translation>
 <translation id="397703832102027365">Mengakhiri...</translation>
 <translation id="8146177459103116374">Jika Anda telah terdaftar di perangkat ini, Anda dapat <ph name="LINK2_START"/>masuk sebagai pengguna yang ada<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Tampilkan bookmark yang dikelola</translation>
 <translation id="4856478137399998590">Layangan data seluler Anda diaktifkan dan siap untuk digunakan</translation>
 <translation id="3305389145870741612">Proses pemformatan dapat memakan waktu beberapa detik. Harap tunggu.</translation>
 <translation id="3648607100222897006">Fitur eksperimental ini bisa berubah, rusak, atau hilang kapan saja. Kami sama sekali tidak menjamin apa yang akan terjadi saat eksperimen ini dinyalakan, siapa tahu browser Anda tiba-tiba hangus terbakar! Becanda! Tapi bisa jadi browser akan menghapus semua data, atau keamanan dan privasi Anda akan disusupi secara tak terduga. Eksperimen yang Anda aktifkan akan diaktifkan untuk semua pengguna browser ini. Lanjutkan dengan hati-hati.</translation>
@@ -4220,7 +4221,7 @@ dan tidak biasa. Bisa jadi penyerang berpura-pura menjadi <ph name="SITE"/>, ata
 <translation id="4375035964737468845">Membuka file yang diunduh</translation>
 <translation id="3968739731834770921">Kana</translation>
 <translation id="7387829944233909572">Dialog &quot;Hapus data penjelajahan&quot;</translation>
-<translation id="8023801379949507775">Mutakhirkan ekstensi sekarang</translation>
+<translation id="8023801379949507775">Perbarui ekstensi sekarang</translation>
 <translation id="5963453369025043595"><ph name="NUM_HANDLES"/> (<ph name="NUM_KILOBYTES_LIVE"/> maksimal)</translation>
 <translation id="2524800364695118482">Ini Dapat:</translation>
 <translation id="6782622603507084740">Aktifkan API Penelusuran yang Disematkan</translation>
@@ -4275,7 +4276,7 @@ dan tidak biasa. Bisa jadi penyerang berpura-pura menjadi <ph name="SITE"/>, ata
 <translation id="3737514536860147030">Pelajari lebih lanjut tentang penjelajahan dalam penyamaran</translation>
 <translation id="621638399744152264"><ph name="VALUE"/>%</translation>
 <translation id="3082520371031013475">Setelan touchpad dan mouse</translation>
-<translation id="4927301649992043040">Paket Ekstensi</translation>
+<translation id="4927301649992043040">Kemas Ekstensi</translation>
 <translation id="5939518447894949180">Atur ulang</translation>
 <translation id="8679658258416378906">Aktifkan tab 5</translation>
 <translation id="9049835026521739061">Mode Hangul</translation>
@@ -4372,6 +4373,7 @@ dan tidak biasa. Bisa jadi penyerang berpura-pura menjadi <ph name="SITE"/>, ata
 <translation id="6869402422344886127">Kotak centang yang telah dicentang</translation>
 <translation id="3428010780253032925">Nonaktifkan penargetan berbasis kotak pada tampilan</translation>
 <translation id="5637380810526272785">Metode Masukan</translation>
+<translation id="3613134908380545408">Tampilkan <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Sambungan harus dicoba lagi menggunakan versi yang lebih lama dari protokol TLS atau SSL. Biasanya, ini artinya server menggunakan perangkat lunak yang amat lawas dan mungkin mengalami masalah keamanan lainnya.</translation>
 <translation id="404928562651467259">PERINGATAN</translation>
 <translation id="4289300219472526559">Mulai Berbicara</translation>
@@ -4599,7 +4601,7 @@ dan tidak biasa. Bisa jadi penyerang berpura-pura menjadi <ph name="SITE"/>, ata
 <translation id="2089090684895656482">Lebih Sedikit</translation>
 <translation id="6656103420185847513">Edit Folder</translation>
 <translation id="4918241738772068049">Tindakan yang diperlukan untuk menyambung</translation>
-<translation id="1949433054743893124">Menggunakan mode penyamaran tidak menyembunyikan penjelajahan dari pimpinan atau penyedia layanan internet Anda, maupun situs web yang dikunjungi.</translation>
+<translation id="1949433054743893124">Menggunakan mode penyamaran tidak menyembunyikan penjelajahan dari perusahaan Anda, penyedia layanan internet Anda, maupun situs web yang dikunjungi.</translation>
 <translation id="1132391573698572126">Subjek: <ph name="SUBJECT"/></translation>
 <translation id="4193154014135846272">Dokumen Google</translation>
 <translation id="4771973620359291008">Terjadi kesalahan yang tidak diketahui.</translation>
@@ -4704,6 +4706,7 @@ dan tidak biasa. Bisa jadi penyerang berpura-pura menjadi <ph name="SITE"/>, ata
 <translation id="6934265752871836553">Gunakan kode bleeding-edge untuk membuat Chrome menggambar konten lebih cepat. Perubahan
         di balik jalur ini sangat mungkin merusak banyak konten.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Selalu buka di Adobe Reader</translation>
 <translation id="8274359292107649245">Buka Chrome di desktop</translation>
 <translation id="1571119610742640910">Pengomposisian untuk memperbaiki latar belakang akar.</translation>
 <translation id="6514565641373682518">Laman ini telah menonaktifkan kursor mouse Anda.</translation>
@@ -4902,6 +4905,7 @@ Tekan sembarang tombol untuk melanjutkan penjelajahan.</translation>
 <translation id="824543159844843373">Aktifkan item peluncur 3</translation>
 <translation id="3819800052061700452">Layar penuh</translation>
 <translation id="48607902311828362">Mode pesawat</translation>
+<translation id="711840821796638741">Tampilkan Bookmark yang Dikelola</translation>
 <translation id="3360297538363969800">Gagal mencetak. Periksa printer Anda dan coba lagi.</translation>
 <translation id="680572642341004180">Aktifkan pelacakan RLZ pada <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Jangan memakai pengisi daya (charger) yang ditarik kembali.</translation>
@@ -5029,7 +5033,7 @@ Tekan sembarang tombol untuk melanjutkan penjelajahan.</translation>
   • Anda dapat mengakhirinya kapan saja
 
 Terima?</translation>
-<translation id="8251578425305135684">Thumbnail dihapus.</translation>
+<translation id="8251578425305135684">Gambar kecil dihapus.</translation>
 <translation id="6163522313638838258">Luaskan semua...</translation>
 <translation id="31454997771848827">Domain grup</translation>
 <translation id="3188465121994729530">Rata-rata Perpindahan</translation>
@@ -5205,7 +5209,7 @@ File Kunci: <ph name="KEY_FILE"/>
 
 Simpan file kunci Anda di tempat yang aman. Anda akan membutuhkannya untuk membuat versi baru ekstensi.</translation>
 <translation id="5522156646677899028">Ekstensi ini berisi kerentanan keamanan serius.</translation>
-<translation id="1004032892340602806">Izinkan semua situs menggunakan plugin unuk mengakses komputer Anda</translation>
+<translation id="1004032892340602806">Izinkan semua situs menggunakan plugin untuk mengakses komputer Anda</translation>
 <translation id="3813984289128269159">Ok Google</translation>
 <translation id="417475959318757854">Letakkan Peluncur Aplikasi di tengah.</translation>
 <translation id="5218183485292899140">Prancis Swiss</translation>
index 6c201e1..2f82781 100644 (file)
 <translation id="4654488276758583406">Molto piccole</translation>
 <translation id="6647228709620733774">URL di revoca dell'autorità di certificazione Netscape</translation>
 <translation id="546411240573627095">Stile tastierino</translation>
-<translation id="2310216585920710503">Configura Sblocco facilitato</translation>
+<translation id="2310216585920710503">Configura Sblocco rapido</translation>
 <translation id="8425213833346101688">Cambia</translation>
 <translation id="2972581237482394796">&amp;Ripeti</translation>
 <translation id="5895138241574237353">Riavvia</translation>
 <translation id="413121957363593859">Componenti</translation>
 <translation id="715487527529576698">La modalità cinese iniziale è il cinese semplificato</translation>
 <translation id="6522350652862471760">Attiva nome e icona del profilo Google</translation>
-<translation id="6181259999130430430">Attiva Sblocco facilitato per questo dispositivo.</translation>
+<translation id="6181259999130430430">Attiva Sblocco rapido per questo dispositivo.</translation>
 <translation id="8703575177326907206">La connessione a <ph name="DOMAIN"/> non è crittografata.</translation>
 <translation id="6135622770221372891">ID canali</translation>
 <translation id="8472623782143987204">basato sull'hardware</translation>
@@ -702,7 +702,7 @@ Per continuare, devono disconnettersi tutti gli utenti.</translation>
 <translation id="3984921062031549150">Blocchi del renderer</translation>
 <translation id="7925285046818567682">In attesa di risposta da <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Impedisci sempre l'accesso alla webcam</translation>
-<translation id="2964845078799970531">La funzione Sblocco facilitato ti consente di sbloccare il Chromebook quando è vicino al tuo telefono.</translation>
+<translation id="2964845078799970531">La funzione Sblocco rapido ti consente di sbloccare il Chromebook quando è vicino al tuo telefono.</translation>
 <translation id="5053803681436838483">Nuovo indirizzo di spedizione...</translation>
 <translation id="5952256601775839173">Attiva clic con tre dita su touchpad.</translation>
 <translation id="3280237271814976245">Salva con &amp;nome...</translation>
@@ -1278,7 +1278,7 @@ La pagina potrà essere caricata dopo che ti sei connesso a una rete.</translati
 <translation id="9033857511263905942">&amp;Incolla</translation>
 <translation id="1028690605877243613">Consente di utilizzare il layout scaffale alternativo.</translation>
 <translation id="6736045498964449756">Spiacenti, le password non corrispondono.</translation>
-<translation id="4558985768677321342">Attiva Sblocco facilitato.</translation>
+<translation id="4558985768677321342">Attiva Sblocco rapido.</translation>
 <translation id="1221825588892235038">Solo selezione</translation>
 <translation id="2227939492629426903">Consente di attivare il nuovo menu avatar. Quando utilizzato in combinazione con la nuova gestione del profilo, mostra semplicemente il nuovo menu avatar di gestione del profilo. In caso contrario, mostra un menu avatar riprogettato con le stesse funzionalità di quello precedente, oltre a una scheda tutorial nella parte superiore in cui all'utente viene chiesto di provare la nuova interfaccia utente di gestione del profilo.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> ha bloccato l'accesso a <ph name="HOST_NAME"/>. Questo sito web è stato segnalato come sito di phishing.</translation>
@@ -3297,7 +3297,7 @@ Assicurati di non mostrare informazioni riservate.</translation>
 <translation id="5917011688104426363">Imposta barra degli indirizzi su modalità di ricerca</translation>
 <translation id="3269101346657272573">Inserisci il PIN.</translation>
 <translation id="2822854841007275488">Arabo</translation>
-<translation id="6559948977408379772">Questa icona viene visualizzata quando il tuo telefono è vicino a te ed è disponibile la funzione Sblocco facilitato. Fai clic per accedere; non servono password.</translation>
+<translation id="6559948977408379772">Questa icona viene visualizzata quando il tuo telefono è vicino a te ed è disponibile la funzione Sblocco rapido. Fai clic per accedere; non servono password.</translation>
 <translation id="5857090052475505287">Nuova cartella</translation>
 <translation id="7450732239874446337">Operazioni di I/O di rete sospese.</translation>
 <translation id="4003393903129308792">Attiva unità di rasterizzazione one-copy</translation>
@@ -3416,7 +3416,7 @@ Assicurati di non mostrare informazioni riservate.</translation>
 <translation id="1526560967942511387">Documento senza titolo</translation>
 <translation id="3979748722126423326">Abilita <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA o RSN)</translation>
-<translation id="7561031016893995297">Gestisci i dispositivi con Sblocco facilitato nelle impostazioni del tuo account.</translation>
+<translation id="7561031016893995297">Gestisci i dispositivi con Sblocco rapido nelle impostazioni del tuo account.</translation>
 <translation id="2238379619048995541">Dati sullo stato di frequenza</translation>
 <translation id="4367133129601245178">C&amp;opia URL immagine</translation>
 <translation id="6326175484149238433">Rimuovi da Chrome</translation>
@@ -3914,6 +3914,7 @@ Assicurati di non mostrare informazioni riservate.</translation>
 <translation id="6460601847208524483">Trova successivo</translation>
 <translation id="397703832102027365">Finalizzazione in corso...</translation>
 <translation id="8146177459103116374">Se sei già registrato sul dispositivo in uso, puoi <ph name="LINK2_START"/>accedere come utente esistente<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Mostra Preferiti gestiti</translation>
 <translation id="4856478137399998590">Il servizio dati mobile è attivo e pronto all'uso</translation>
 <translation id="3305389145870741612">La procedura di formattazione può richiedere alcuni secondi. Attendi.</translation>
 <translation id="3648607100222897006">Queste funzioni sperimentali potrebbero essere modificate, essere interrotte o scomparire in qualsiasi momento. Non offriamo assolutamente alcuna garanzia su ciò potrebbe accadere se attivi uno di questi esperimenti: il tuo browser potrebbe persino andare in autocombustione! Scherzi a parte, il browser potrebbe eliminare tutti i tuoi dati oppure la tua sicurezza e la tua privacy potrebbero essere compromesse in modi inaspettati. Tutti gli esperimenti che attivi saranno abilitati per tutti gli utenti di questo browser. Procedi con cautela.</translation>
@@ -4148,7 +4149,7 @@ Assicurati di non mostrare informazioni riservate.</translation>
 <translation id="1639239467298939599">Caricamento</translation>
 <translation id="5457599981699367932">Esplora come ospite</translation>
 <translation id="8525428584879632762">Attivato nelle pagine dei risultati di ricerca o durante l'inserimento</translation>
-<translation id="2487656424763972284">Sblocco facilitato</translation>
+<translation id="2487656424763972284">Sblocco rapido</translation>
 <translation id="7047998246166230966">Puntatore</translation>
 <translation id="743268637741709136">Disattiva ricerca vocale in Avvio applicazioni. Se disattivi la funzione, l'utente non potrà eseguire ricerche utilizzando comandi vocali.</translation>
 <translation id="3252266817569339921">Francese</translation>
@@ -4342,6 +4343,7 @@ Assicurati di non mostrare informazioni riservate.</translation>
 <translation id="6869402422344886127">Casella di controllo selezionata</translation>
 <translation id="3428010780253032925">Disattiva targeting basato su rettangolo nelle visualizzazioni</translation>
 <translation id="5637380810526272785">Metodo di immissione</translation>
+<translation id="3613134908380545408">Mostra <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">È stato necessario ritentare la connessione utilizzando una versione precedente del protocollo TLS o SSL. In genere questo significa che il server utilizza software molto obsoleto e che potrebbe avere altri problemi di sicurezza.</translation>
 <translation id="404928562651467259">AVVISO</translation>
 <translation id="4289300219472526559">Avvia comandi vocali</translation>
@@ -4411,7 +4413,7 @@ Assicurati di non mostrare informazioni riservate.</translation>
 <translation id="8148264977957212129">Metodo di immissione Pinyin</translation>
 <translation id="2288278176040912387">Giradischi</translation>
 <translation id="7772032839648071052">Conferma passphrase</translation>
-<translation id="3676582787770338561">Attiva Sblocco facilitato per il dispositivo <ph name="DEVICE_TYPE"/>.</translation>
+<translation id="3676582787770338561">Attiva Sblocco rapido per il dispositivo <ph name="DEVICE_TYPE"/>.</translation>
 <translation id="2871813825302180988">Questo account è già in uso su questo dispositivo.</translation>
 <translation id="1642505962779453775">Ultimo trimestre</translation>
 <translation id="3323235640813116393">Consente di attivare il salvataggio delle pagine in MHTML: un singolo file di testo contenente il codice HTML e tutte le risorse secondarie.</translation>
@@ -4674,6 +4676,7 @@ Assicurati di non mostrare informazioni riservate.</translation>
 <translation id="6934265752871836553">Utilizza il codice sperimentale per consentire a Chrome di individuare contenuti più rapidamente. È molto probabile
         che le modifiche dovute a questo percorso rendano inutilizzabili molti contenuti.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Apri sempre in Adobe Reader</translation>
 <translation id="8274359292107649245">Apri Chrome su desktop</translation>
 <translation id="1571119610742640910">Composizione per sfondi principali fissi.</translation>
 <translation id="6514565641373682518">Questa pagina ha disattivato il puntatore del mouse.</translation>
@@ -4869,6 +4872,7 @@ Premi un tasto qualsiasi per continuare a esplorare.</translation>
 <translation id="824543159844843373">Consente di attivare l'elemento 3 di Avvio applicazioni</translation>
 <translation id="3819800052061700452">&amp;Schermo intero</translation>
 <translation id="48607902311828362">Modalità aereo</translation>
+<translation id="711840821796638741">Mostra Preferiti gestiti</translation>
 <translation id="3360297538363969800">Errore di stampa. Controlla la stampante e riprova.</translation>
 <translation id="680572642341004180">Attiva tracciamento RLZ su <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Ti invitiamo a non utilizzare più il caricabatterie da sostituire.</translation>
index 4d819e3..36c1f74 100644 (file)
@@ -3052,7 +3052,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="2044540568167155862">Goats Teleported</translation>
 <translation id="1776712937009046120">הוסף משתמש</translation>
 <translation id="506152810699123561">מדדים המתייחסים להשפעה של <ph name="SHORT_PRODUCT_NAME"/> על הזיכרון של המערכת</translation>
-<translation id="674632704103926902">×\94פע×\9c ×\92ר×\99ר×\94 ×\91הקשה</translation>
+<translation id="674632704103926902">×\94פע×\9c ×\92ר×\99ר×\94 ×\95הקשה</translation>
 <translation id="8954952943849489823">ההעברה נכשלה, שגיאה לא צפויה: $1</translation>
 <translation id="2318143611928805047">גודל נייר</translation>
 <translation id="7100897339030255923">נבחרו <ph name="COUNT"/> פריטים</translation>
@@ -3310,7 +3310,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="5917011688104426363">התמקד בסרגל הכתובות במצב חיפוש</translation>
 <translation id="3269101346657272573">‏הזן את ה-PIN.</translation>
 <translation id="2822854841007275488">ערבית</translation>
-<translation id="6559948977408379772">×\94ס×\9e×\9c ×\94×\96×\94 ×\9e×\95פ×\99×¢ ×\9bש×\90ת×\94 ×\95×\94×\98×\9cפ×\95×\9f ×©×\9c×\9a × ×\9eצ×\90×\99×\9d ×\91קר×\91ת ×\9eק×\95×\9d ×\95×\94ת×\9b×\95× ×\94 '×\91×\99×\98×\95×\9c ×§×\9c ×©×\9c × ×¢×\99×\9c×\94' זמינה. לחץ כדי להיכנס, ללא צורך בסיסמה.</translation>
+<translation id="6559948977408379772">×\94ס×\9e×\9c ×\94×\96×\94 ×\9e×\95פ×\99×¢ ×\9bש×\90ת×\94 ×\95×\94×\98×\9cפ×\95×\9f ×©×\9c×\9a × ×\9eצ×\90×\99×\9d ×\91קר×\91ת ×\9eק×\95×\9d ×\95×\94ת×\9b×\95× ×\94 '×\91×\99×\98×\95×\9c × ×¢×\99×\9c×\94 ×§×\9c' זמינה. לחץ כדי להיכנס, ללא צורך בסיסמה.</translation>
 <translation id="5857090052475505287">תיקייה חדשה</translation>
 <translation id="7450732239874446337">הקלט והפלט של הרשת הושעו.</translation>
 <translation id="4003393903129308792">הפעל את יוצר רשת הנקודות עבור עותק יחיד</translation>
@@ -3426,7 +3426,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="1526560967942511387">מסמך ללא שם</translation>
 <translation id="3979748722126423326">אפשר <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">‏PSK ‏(WPA או RSN)</translation>
-<translation id="7561031016893995297">× ×\94×\9c ×\9e×\9bש×\99ר×\99×\9d ×©×\94×\95פע×\9c ×\91×\94×\9d '×\91×\99×\98×\95×\9c ×§×\9c ×©×\9c × ×¢×\99×\9c×\94' בהגדרות החשבון שלך.</translation>
+<translation id="7561031016893995297">× ×\94×\9c ×\9e×\9bש×\99ר×\99×\9d ×©×\94×\95פע×\9c ×\91×\94×\9d '×\91×\99×\98×\95×\9c × ×¢×\99×\9c×\94 ×§×\9c' בהגדרות החשבון שלך.</translation>
 <translation id="2238379619048995541">נתוני מצב תדירות</translation>
 <translation id="4367133129601245178">ה&amp;עתק כתובת אתר של תמונה</translation>
 <translation id="6326175484149238433">‏הסר מ-Chrome</translation>
@@ -3926,6 +3926,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="6460601847208524483">חפש את הבא</translation>
 <translation id="397703832102027365">מסיים...</translation>
 <translation id="8146177459103116374">אם אתה כבר רשום במכשיר זה, תוכל <ph name="LINK2_START"/>להתחבר כמשתמש קיים<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">הצג סימניות מנוהלות</translation>
 <translation id="4856478137399998590">שירות הנתונים הסלולריים פועל ומוכן לשימוש</translation>
 <translation id="3305389145870741612">תהליך הפרמוט עשוי להימשך מספר שניות. אנא המתן.</translation>
 <translation id="3648607100222897006">תכונות ניסיוניות אלה עשויות להשתנות, להפסיק לעבוד או להיעלם בכל עת. איננו מביעים כל אחריות לגבי ההשלכות של הפעלה של אחד מניסויים אלה, וייתכן אף שהדפדפן שלך יתלקח באופן ספונטני. צחוק בצד, הדפדפן עלול למחוק את כל הנתונים שלך, או שהאבטחה והפרטיות שלך ייפגעו בדרכים לא צפויות. כל ניסוי שתאפשר יהפוך לפעיל עבור כל המשתמשים בדפדפן זה. המשך בזהירות.</translation>
@@ -4028,7 +4029,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="780301667611848630">לא תודה</translation>
 <translation id="8209677645716428427">‏משתמש בפיקוח יכול לסייר באינטרנט בהדרכתך. כמנהל של משתמש בפיקוח ב-Chrome, אתה יכול:</translation>
 <translation id="2812989263793994277">אל תציג אף תמונה</translation>
-<translation id="722363467515709460">×\90פשר את מגדיל התצוגה</translation>
+<translation id="722363467515709460">×\94פע×\9c את מגדיל התצוגה</translation>
 <translation id="7190251665563814471">אפשר תמיד יישומי פלאגין אלה ב-<ph name="HOST"/></translation>
 <translation id="2043684166640445160"><ph name="PRODUCT_NAME"/> אינו יכול להציג את דף האינטרנט מכיוון שהמחשב אינו מחובר לאינטרנט.</translation>
 <translation id="5390222677196640946">‏הצג קובצי Cookie ונתוני אתר אחרים</translation>
@@ -4163,7 +4164,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="1639239467298939599">טוען</translation>
 <translation id="5457599981699367932">גלוש כאורח</translation>
 <translation id="8525428584879632762">מופעל בדפים של תוצאות חיפוש או כשמתבצעת הזנת קלט.</translation>
-<translation id="2487656424763972284">×\91×\99×\98×\95×\9c ×§×\9c ×©×\9c × ×¢×\99×\9c×\94</translation>
+<translation id="2487656424763972284">×\91×\99×\98×\95×\9c × ×¢×\99×\9c×\94 ×§×\9c</translation>
 <translation id="7047998246166230966">מצביע</translation>
 <translation id="743268637741709136">השבת חיפוש קולי במפעיל היישומים. אם אפשרות זו מושבתת, המשתמש לא יוכל לחפש באמצעות דיבור.</translation>
 <translation id="3252266817569339921">צרפתית</translation>
@@ -4358,6 +4359,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="6869402422344886127">תיבת סימון שסומנה</translation>
 <translation id="3428010780253032925">השבת מיקוד מבוסס-מלבן בתצוגות</translation>
 <translation id="5637380810526272785">שיטת קלט</translation>
+<translation id="3613134908380545408">הצג את <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">‏היה צורך לנסות שוב את החיבור באמצעות גרסה ישנה יותר של פרוטוקול TLS או SSL. לרוב, פירוש הדבר הוא שהשרת משתמש בתוכנה ישנה מאוד וייתכן שיש לו בעיות אבטחה אחרות.</translation>
 <translation id="404928562651467259">אזהרה</translation>
 <translation id="4289300219472526559">התחל לדבר</translation>
@@ -4427,7 +4429,7 @@ JavaScript ויישומי פלאגין.</translation>
 <translation id="8148264977957212129">‏שיטת קלט Pinyin</translation>
 <translation id="2288278176040912387">פטיפון</translation>
 <translation id="7772032839648071052">אשר משפט-סיסמה</translation>
-<translation id="3676582787770338561">×\94פע×\9c '×\91×\99×\98×\95×\9c ×§×\9c ×©×\9c × ×¢×\99×\9c×\94' עבור <ph name="DEVICE_TYPE"/> זה.</translation>
+<translation id="3676582787770338561">×\94פע×\9c '×\91×\99×\98×\95×\9c × ×¢×\99×\9c×\94 ×§×\9c' עבור <ph name="DEVICE_TYPE"/> זה.</translation>
 <translation id="2871813825302180988">חשבון זה כבר נמצא בשימוש במכשיר זה.</translation>
 <translation id="1642505962779453775">ברבעון האחרון</translation>
 <translation id="3323235640813116393">‏מפעיל שמירה של דפים כ-HTML: קובץ טקסט יחיד המכיל HTML ואת כל משאבי המשנה.</translation>
@@ -4693,6 +4695,7 @@ Del</translation>
 <translation id="2859369953631715804">בחר רשת לנייד</translation>
 <translation id="6934265752871836553">‏השתמש בקוד ניסיוני כדי לגרום ל-Chrome לעבד תוכן מהר יותר. ייתכן מאוד שהשינויים שברקע הנתיב הזה יפגמו בחלק גדול מהתוכן.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">‏פתח תמיד ב-Adobe Reader</translation>
 <translation id="8274359292107649245">‏פתח את Chrome בשולחן העבודה</translation>
 <translation id="1571119610742640910">כתיבה עבור רקעי בסיס קבועים.</translation>
 <translation id="6514565641373682518">דף זה השבית את סמן העכבר שלך.</translation>
@@ -4891,6 +4894,7 @@ Del</translation>
 <translation id="824543159844843373">הפעל את פריט המפעיל 3</translation>
 <translation id="3819800052061700452">&amp;מסך מלא</translation>
 <translation id="48607902311828362">מצב טיסה</translation>
+<translation id="711840821796638741">הצג סימניות מנוהלות</translation>
 <translation id="3360297538363969800">ההדפסה נכשלה. בדוק את המדפסת ונסה שוב.</translation>
 <translation id="680572642341004180">‏הפעל מעקב RLZ ב-<ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">אנו מבקשים שתפסיק להשתמש במטען שהוצא לו ריקול.</translation>
index 9531696..b589ef4 100644 (file)
@@ -60,7 +60,7 @@
 <translation id="5378437846548426165">TLS / SSL 警告のバージョンを切り替えます。</translation>
 <translation id="6476748132434603124"><ph name="SITE"/> は Chrome に対してエラーのある証明書をブロックするよう指示していますが、この接続の試行中に Chrome が受け取った証明書にエラーがあります。</translation>
 <translation id="3293894718455402932">「<ph name="EXTENSION"/>」は、選択されたフォルダ内の画像、動画、音声ファイルの読み取りと書き込みを行うことができます。</translation>
-<translation id="6976652535392081960"><ph name="EMAIL"/> の送信先を表示しています</translation>
+<translation id="6976652535392081960">送信先を表示しています(<ph name="EMAIL"/>)</translation>
 <translation id="7180611975245234373">更新</translation>
 <translation id="4940047036413029306">引用符</translation>
 <translation id="1497897566809397301">ローカルへのデータ設定を許可する(推奨)</translation>
@@ -93,7 +93,7 @@
 <translation id="5437452584883783369">プレビューを終了して再起動</translation>
 <translation id="7392118418926456391">ウイルス スキャンに失敗しました</translation>
 <translation id="1156689104822061371">キーボード レイアウト:</translation>
-<translation id="4764776831041365478"><ph name="URL"/> のウェブページは一時的に停止しているか、新しい URL に移動した可能性があります。</translation>
+<translation id="4764776831041365478"><ph name="URL"/> のウェブページは一時的に停止しているか、新しいウェブアドレスに移動した可能性があります。</translation>
 <translation id="6156863943908443225">スクリプト キャッシュ</translation>
 <translation id="4274187853770964845">同期エラー: 同期を停止してからもう一度開始してください。</translation>
 <translation id="6499114579475440437">ログインして Google ウォレットで支払う</translation>
 <translation id="8651324101757295372">このユーザーとチャット</translation>
 <translation id="6460423884798879930">以前接続したクライアントの認証情報を最初の SYN パケットで送信し、データ送信が迅速に開始されるようにするには、このオプションを有効にします。</translation>
 <translation id="6563261555270336410"><ph name="ELEMENTS_HOST_NAME"/> の詳細</translation>
-<translation id="3200025317479269283">å\9b°ã\81£ã\81\9fã\82\89ã\81\93ã\81\93をクリック。</translation>
+<translation id="3200025317479269283">å\9b°ã\81£ã\81\9fã\82\89ã\81\84ã\81¤ã\81§ã\82\82ã\83\98ã\83«ã\83\97をクリック。</translation>
 <translation id="5656983780125483728">前回の <ph name="IDS_SHORT_PRODUCT_NAME"/> アップデートの状態に戻しています。</translation>
 <translation id="3470502288861289375">コピーしています...</translation>
 <translation id="2719473049159220459">発行元: <ph name="ISSUER"/></translation>
 <translation id="409504436206021213">再読み込みしない</translation>
 <translation id="3785308913036335955">アプリのショートカットを表示</translation>
 <translation id="8795916974678578410">新規ウインドウ</translation>
-<translation id="2733275712367076659">自分を識別するためにこれらの機関から発行された証明書を所持しています:</translation>
+<translation id="2733275712367076659">次の機関から発行された、ユーザーを識別する証明書があります:</translation>
 <translation id="230927227160767054">このページはサービス ハンドラのインストールを求めています。</translation>
 <translation id="5334142896108694079">スクリプト キャッシュ</translation>
 <translation id="4801512016965057443">モバイル データ ローミングを許可する</translation>
 <translation id="2902382079633781842">ブックマークが追加されました</translation>
 <translation id="5436510242972373446"><ph name="SITE_NAME"/> を検索:</translation>
 <translation id="3800764353337460026">記号のスタイル</translation>
-<translation id="1278049586634282054">ビューを調査:</translation>
+<translation id="1278049586634282054">ビューを検証:</translation>
 <translation id="3254434849914415189"><ph name="FILE_TYPE"/> ファイルのデフォルト アプリを選択:</translation>
 <translation id="4991420928586866460">キーボードの最上段のキーをファンクション キーとして使用する</translation>
 <translation id="4350019051035968019">このデバイスは、別のドメインの管理対象として指定されているため、現在のアカウントの所属先ドメインに登録することはできません。</translation>
 <translation id="6597017209724497268">サンプル</translation>
 <translation id="8183644773978894558">現在シークレット モードでダウンロードを実行中です。ダウンロードがキャンセルされますが、シークレット モードを終了してもよろしいですか?</translation>
 <translation id="8767072502252310690">ユーザー</translation>
-<translation id="683526731807555621">æ\96°ã\81\97ã\81\84æ¤\9cç´¢ã\82¨ã\83³ã\82¸ã\83³ã\82\92追å\8a </translation>
+<translation id="683526731807555621">検索エンジンを追加</translation>
 <translation id="6871644448911473373">OCSP レスポンダ: <ph name="LOCATION"/></translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT"/> 個のフォルダを選択しました</translation>
 <translation id="8281886186245836920">スキップ</translation>
 <translation id="5261073535210137151">このフォルダには <ph name="COUNT"/> 件のブックマークがあります。削除してもよろしいですか?</translation>
 <translation id="59174027418879706">有効</translation>
 <translation id="4194415033234465088">Dachen 26</translation>
-<translation id="8800004011501252845">対象の宛先の表示</translation>
+<translation id="8800004011501252845">送信先を表示しています:</translation>
 <translation id="3554751249011484566">以下の詳細が <ph name="SITE"/> と共有されます</translation>
 <translation id="872537912056138402">クロアチア語</translation>
 <translation id="6639554308659482635">SQLite メモリ</translation>
 <translation id="4534166495582787863">タッチパッドの 3 本指タップをミドル ボタン(ホイール クリック)として認識する機能を有効にします。</translation>
 <translation id="3668570675727296296">言語設定</translation>
 <translation id="2190469909648452501">減少</translation>
-<translation id="7754704193130578113">ã\83\95ã\82¡ã\82¤ã\83«ã\81\94ã\81¨ã\81«ä¿\9då­\98ã\81\99ã\82\8b場所を確認する</translation>
+<translation id="7754704193130578113">ã\83\80ã\82¦ã\83³ã\83­ã\83¼ã\83\89å\89\8dã\81«å\90\84ã\83\95ã\82¡ã\82¤ã\83«ã\81®ä¿\9då­\98場所を確認する</translation>
 <translation id="222949136907494149"><ph name="URL"/> ではパソコンの現在地情報が必要となります。</translation>
 <translation id="7654941827281939388">このアカウントは既にこのパソコンで使用されています。</translation>
 <translation id="204914487372604757">ショートカットを作成</translation>
 <translation id="4087148366934348322">お使いの充電器は最新です。</translation>
 <translation id="1270699273812232624">アイテムを許可</translation>
 <translation id="4018133169783460046"><ph name="PRODUCT_NAME"/> をこの言語で表示</translation>
-<translation id="1257390253112646227">再生、編集、共有、各種作業。</translation>
+<translation id="1257390253112646227">遊ぶ、編集する、共有する、他にもいろいろ。</translation>
 <translation id="7482533734313877746"><ph name="SHORT_PRODUCT_NAME"/> が完全に起動するまでの所要時間</translation>
 <translation id="1503914375822320413">コピーできませんでした。予期しないエラー: $1</translation>
 <translation id="3264544094376351444">Sans Serif フォント</translation>
 <translation id="2965328226365382335">15 分以内</translation>
 <translation id="6731320427842222405">数分かかることがあります</translation>
 <translation id="7503191893372251637">Netscape 証明書タイプ</translation>
-<translation id="4135450933899346655">自分の証明書</translation>
+<translation id="4135450933899346655">ユーザーの証明書</translation>
 <translation id="971774202801778802">ブックマーク URL</translation>
 <translation id="3979395879372752341">新しい拡張機能が追加されました(<ph name="EXTENSION_NAME"/>)</translation>
 <translation id="2609632851001447353">バリエーション</translation>
 <translation id="7347751611463936647">この拡張機能を使用するには、「<ph name="EXTENSION_KEYWORD"/>」と入力して Tab キーを押してからコマンドまたは検索キーワードを入力してください。</translation>
 <translation id="878431691778285679">この名前でユーザーを既に管理しているようです。<ph name="LINE_BREAK"/><ph name="BEGIN_LINK"/>このデバイスに <ph name="PROFILE_NAME"/> をインポート<ph name="END_LINK"/>しますか?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> がマイクへのアクセスを求めています。</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">アプリ</translation>
 <translation id="5151511998946489774">このウェブサイトの識別情報は <ph name="ISSUER"/> により確認済みで、公開監査が可能です。</translation>
 <translation id="1608626060424371292">このユーザーを削除</translation>
 <translation id="2779552785085366231">このページをアプリ ランチャーに追加できます</translation>
 <translation id="5141240743006678641">Google の認証情報で同期パスワードを暗号化する</translation>
 <translation id="5866389191145427800">キャプチャ画像がアップスケーリングされる場合の品質設定を指定します。</translation>
 <translation id="5500122897333236901">アイスランド語</translation>
-<translation id="4958202758642732872">フルスクリーンの例外</translation>
+<translation id="4958202758642732872">全画面表示の例外</translation>
 <translation id="6990778048354947307">暗色系テーマ</translation>
 <translation id="8119631488458759651">このサイトを削除</translation>
 <translation id="158765438169997550">このオプションを有効にすると、描画はメイン スレッドではなく別のスレッドで行われます。</translation>
 <translation id="2857421400871862029">サイトがマウス カーソルを無効にしようとしたときに確認する(推奨)</translation>
 <translation id="1910721550319506122">ようこそ!</translation>
 <translation id="4035758313003622889">タスク マネージャ(&amp;T)</translation>
-<translation id="6356936121715252359">Adobe Flash Player の保存設定...</translation>
+<translation id="6356936121715252359">Adobe Flash Player のストレージ設定...</translation>
 <translation id="8874184842967597500">未接続</translation>
 <translation id="7313804056609272439">ベトナム語の入力方法(VNI)</translation>
 <translation id="8599675288025166194">リンク可能な一時アプリの試験運用機能を有効にする。</translation>
 <translation id="8232829399891359332">セッションの復元</translation>
 <translation id="3308116878371095290">このページの Cookie は設定されませんでした。</translation>
 <translation id="7521387064766892559">Javascript</translation>
-<translation id="1545786162090505744">検索キーワードの代わりに %s を含む URL</translation>
+<translation id="1545786162090505744">URL(%s=検索語句)</translation>
 <translation id="7219179957768738017">この接続には <ph name="SSL_VERSION"/> を使用しています。</translation>
 <translation id="7006634003215061422">下余白</translation>
 <translation id="7014174261166285193">インストールできませんでした。</translation>
 <translation id="5765780083710877561">説明:</translation>
 <translation id="1740044382983372319">インストールされた拡張機能</translation>
 <translation id="338583716107319301">セパレータ</translation>
-<translation id="2079053412993822885">自分の証明書のいずれかを削除すると、それを使った自分の身元の確認はできなくなります。</translation>
+<translation id="2079053412993822885">ユーザーの証明書のいずれかを削除すると、それを使って身元を証明することはできなくなります。</translation>
 <translation id="7221869452894271364">このページを再読み込みします</translation>
 <translation id="8446884382197647889">詳細</translation>
 <translation id="9006533633560719845">拡張機能のスクリプトに対するユーザーの同意</translation>
 <translation id="6460601847208524483">次を検索</translation>
 <translation id="397703832102027365">最終処理中...</translation>
 <translation id="8146177459103116374">このデバイスでの登録が済んでいる場合は<ph name="LINK2_START"/>既存のユーザー<ph name="LINK2_END"/>としてログインできます。</translation>
+<translation id="5072836811783999860">管理対象のブックマークを表示</translation>
 <translation id="4856478137399998590">モバイル データ サービスがご利用いただけるようになりました</translation>
 <translation id="3305389145870741612">フォーマット処理には数秒かかることがあります。しばらくお待ちください。</translation>
 <translation id="3648607100222897006">この試験運用機能は、随時変更、中断、提供中止されることがあります。これらの機能のいずれかを有効にした場合に生じる結果について、Google は一切保証しません。ブラウザによってすべてのデータが削除されたり、予期せぬ方法でセキュリティやプライバシーが侵害されたりする可能性があります。有効にした試験運用機能は同じブラウザを使用する全ユーザーに対して有効になります。続行する場合は十分ご注意ください。</translation>
 <translation id="6869402422344886127">チェックボックスがオン</translation>
 <translation id="3428010780253032925">四角形エリアからの目標認識機能を無効にする</translation>
 <translation id="5637380810526272785">入力方法</translation>
+<translation id="3613134908380545408">「<ph name="FOLDER_NAME"/>」を表示</translation>
 <translation id="2837049386027881519">旧バージョンの TLS または SSL プロトコルで接続を再試行する必要がありました。これは通常、サーバーのソフトウェアが非常に古く、他のセキュリティ問題が発生している可能性があるということです。</translation>
 <translation id="404928562651467259">警告</translation>
 <translation id="4289300219472526559">読み上げを開始</translation>
 <translation id="5187295959347858724"><ph name="SHORT_PRODUCT_NAME"/> にログインしています。ブックマーク、履歴、その他の設定は Google アカウントに同期されます。</translation>
 <translation id="2421956571193030337">この機能は信頼できるアカウントでのみ使用してください。</translation>
 <translation id="3608454375274108141">F10</translation>
-<translation id="444267095790823769">保護コンテンツの例外</translation>
+<translation id="444267095790823769">ä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\82³ã\83³ã\83\86ã\83³ã\83\84ã\81®ä¾\8bå¤\96</translation>
 <translation id="7419106976560586862">プロフィール パス</translation>
 <translation id="6929214587416566742">デスクトップ通知</translation>
 <translation id="5271549068863921519">パスワードを保存</translation>
 <translation id="6934265752871836553">試験運用版のコードを使用して、Chrome でより高速にコンテンツが読み込まれるようにします。
         このパスの背後での変更により、多くのコンテンツが壊れる可能性があります。</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">常に Adobe Reader で開く</translation>
 <translation id="8274359292107649245">デスクトップで Chrome を開く</translation>
 <translation id="1571119610742640910">固定ルート バックグラウンドの合成。</translation>
 <translation id="6514565641373682518">このページではマウス カーソルが無効になります。</translation>
 <translation id="824543159844843373">ランチャー アイテム 3 をアクティブにする</translation>
 <translation id="3819800052061700452">全画面表示(&amp;F)</translation>
 <translation id="48607902311828362">機内モード</translation>
+<translation id="711840821796638741">管理対象のブックマークを表示</translation>
 <translation id="3360297538363969800">印刷できませんでした。プリンタを確認してもう一度お試しください。</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> での RLZ トラッキングを有効にする。</translation>
 <translation id="688797901999351107">リコール対象の充電器はご使用を中止してください。</translation>
     <ph name="DESCRIPTION"/></translation>
 <translation id="1088086359088493902">秒</translation>
 <translation id="73289266812733869">選択されていません</translation>
-<translation id="1758230322558024056">クリックするか「Ok Google」と話して、音声検索を開始します</translation>
+<translation id="1758230322558024056">クリックするか「OK Google」と話して、音声検索を開始します</translation>
 <translation id="8639963783467694461">自動入力の設定</translation>
 <translation id="2951247061394563839">ウィンドウを中央に配置</translation>
 <translation id="3435738964857648380">セキュリティ</translation>
 <translation id="3307950238492803740">すべてをデバッグする。</translation>
 <translation id="2087822576218954668">印刷: <ph name="PRINT_NAME"/></translation>
 <translation id="747459581954555080">すべて復元</translation>
-<translation id="7602079150116086782">ä»\96ã\81®ã\83\87ã\83\90ã\82¤ã\82¹ã\81\8bã\82\89ã\81®ã\82¿ã\83\96ã\81¯ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93</translation>
+<translation id="7602079150116086782">ä»\96ã\81®ã\83\87ã\83\90ã\82¤ã\82¹ã\81\8bã\82\89ã\81®ã\82¿ã\83\96ã\81ªã\81\97</translation>
 <translation id="7167486101654761064">この種類のファイルは常に開く(&amp;A)</translation>
 <translation id="6218364611373262432">再起動の都度、アプリ ランチャーのインストール状態をリセットします。このフラグが設定されている場合、Chrome は起動のたびにランチャーのインストール記録を消去します。この設定はアプリ ランチャーのインストール手順をテストするために使用します。</translation>
 <translation id="4396124683129237657">新しいクレジット カード...</translation>
index 6e5aa3e..f7158b2 100644 (file)
 <translation id="4654488276758583406">ತುಂಬಾ ಚಿಕ್ಕದು</translation>
 <translation id="6647228709620733774">Netscape ಪ್ರಮಾಣಪತ್ರ ಪ್ರಾಧಿಕಾರ ಹಿಂತೆಗೆದುಕೊಳ್ಳುವಿಕೆ URL</translation>
 <translation id="546411240573627095">ಸಂಖ್ಯೆ‌ಪ್ಯಾಡ್ ಶೈಲಿ</translation>
-<translation id="2310216585920710503">ಸà³\81ಲಭ à²\85ನà³\8dâ\80\8dಲಾಕ್ ಹೊಂದಿಸು</translation>
+<translation id="2310216585920710503">ಸರಳ à²\85ನà³\8dâ\80\8cಲಾಕ್ ಹೊಂದಿಸು</translation>
 <translation id="8425213833346101688">ಬದಲಿಸಿ</translation>
 <translation id="2972581237482394796">&amp;ಮತ್ತೆಮಾಡು</translation>
 <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="3899968422636198696"><ph name="ORGNAME"/> <ph name="HOSTNAME"/></translation>
 <translation id="2391762656119864333">ಹಿಂತೆಗೆದುಕೊ</translation>
 <translation id="3315158641124845231"><ph name="PRODUCT_NAME"/> ಅನ್ನು ಮರೆಮಾಡಿ</translation>
-<translation id="7069168971636881066">ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವುದಕ್ಕೂ ಮುನ್ನ ಈ ಸಾಧನದಲ್ಲಿ ಕನಿಷ್ಠ ಪಕ್ಷ ಒಂದು ಖಾತೆಯಾದರೂ ಅಸ್ತಿತ್ವದಲ್ಲಿರಬೇಕು.</translation>
+<translation id="7069168971636881066">ಮೇಲ್ವಿಚಾರಣೆಗೊಳಪಟ್ಟ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವುದಕ್ಕೂ ಮುನ್ನ ಈ ಸಾಧನದಲ್ಲಿ ಕನಿಷ್ಠ ಪಕ್ಷ ಒಂದು ಖಾತೆಯಾದರೂ ಅಸ್ತಿತ್ವದಲ್ಲಿರಬೇಕು.</translation>
 <translation id="7766807826975222231">ಪ್ರವಾಸವನ್ನು ಕೈಗೊಳ್ಳಿ</translation>
 <translation id="2269471294353474737"><ph name="MARKUP_1"/>ಆಫ್‌ಲೈ‌ನ್‌ನಲ್ಲಿದ್ದರೂ ಸಹ, ಎಲ್ಲಿಂದಬೇಕಾದರೂ ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ.<ph name="MARKUP_2"/>
        Google ಡ್ರೈವ್‌ನಲ್ಲಿರುವ ಫೈಲ್‌ಗಳು ನವೀಕೃತವಾಗಿರುತ್ತವೆ ಮತ್ತು ಯಾವುದೇ ಸಾಧನದಿಂದ ಲಭ್ಯವಿರುತ್ತವೆ.<ph name="MARKUP_3"/>
 <translation id="8974161578568356045">ಸ್ವಯಂ ಪತ್ತೆ</translation>
 <translation id="1549045574060481141">ಡೌನ್‌ಲೋಡ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ</translation>
 <translation id="5388588172257446328">ಬಳಕೆದಾರಹೆಸರು:</translation>
-<translation id="1657406563541664238">Google à²\97à³\86 à²¬à²³à²\95à³\86ಯ à²\85à²\82à²\95ಿà²\85à²\82ಶà²\97ಳà³\81 à²®à²¤à³\8dತà³\81 à²\95à³\8dರà³\8dಯಾಶà³\8d à²µà²°à²¦à²¿à²¯à²¨à³\8dನà³\81 à²¸à³\8dವಯà²\82à²\9aಾಲಿತವಾà²\97ಿ à²\95ಳà³\81ಹಿಸà³\81ವ à²®à³\82ಲà²\95 <ph name="PRODUCT_NAME"/> à²\85ನà³\8dನà³\81 à²\89ತà³\8dತಮà²\97à³\8aಳಿಸಲà³\81 à²¸à²¹à²¾à²¯ à²®à²¾à²¡à³\81</translation>
+<translation id="1657406563541664238">Google à²\97à³\86 à²¬à²³à²\95à³\86ಯ à²\85à²\82à²\95ಿà²\85à²\82ಶà²\97ಳà³\81 à²®à²¤à³\8dತà³\81 à²\95à³\8dರà³\8dಯಾಶà³\8d à²µà²°à²¦à²¿à²¯à²¨à³\8dನà³\81 à²¸à³\8dವಯà²\82à²\9aಾಲಿತವಾà²\97ಿ à²\95ಳà³\81ಹಿಸà³\81ವ à²®à³\82ಲà²\95 <ph name="PRODUCT_NAME"/> à²\85ನà³\8dನà³\81 à²\89ತà³\8dತಮà²\97à³\8aಳಿಸಲà³\81 à²¸à²¹à²¾à²¯ à²®à²¾à²¡à²¿</translation>
 <translation id="8339012082103782726">ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್‍ಗಳಿಗೆ ಸೈಟ್‍ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸಬೇಡಿ</translation>
 <translation id="7982789257301363584">ನೆಟ್‌ವರ್ಕ್</translation>
 <translation id="2271281383664374369">ಈ URL ವಿಸ್ತರಣೆ ವಿನಂತಿಯನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿಯಂತ್ರಿಸಲಾಗಿದೆ.</translation>
 <translation id="8034955203865359138">ಯಾವುದೇ ಇತಿಹಾಸ ನಮೂದುಗಳು ಕಂಡುಬಂದಿಲ್ಲ.</translation>
 <translation id="9130015405878219958">ಅಮಾನ್ಯ ಮೋಡ್ ನಮೂದಿಸಲಾಗಿದೆ.</translation>
 <translation id="6615807189585243369"><ph name="BURNT_AMOUNT"/> / <ph name="TOTAL_SIZE"/> ನಕಲುಗೊಂಡಿದೆ</translation>
-<translation id="7501143156951160001">ನà³\80ವà³\81 Google à²\96ಾತà³\86ಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿರದಿದà³\8dದರà³\86 à²\87ದà³\80à²\97 à²¨à³\80ವà³\81 <ph name="LINK_START"/>Google ಖಾತೆಯನ್ನು ರಚಿಸಬಹುದು<ph name="LINK_END"/>.</translation>
+<translation id="7501143156951160001">ನಿಮà³\8dಮ à²¬à²³à²¿ Google à²\96ಾತà³\86 à²\87ಲà³\8dಲವà³\86à²\82ದಾದರà³\86 à²¨à³\80ವà³\81 à²\88à²\97ಲà³\87 <ph name="LINK_START"/>Google ಖಾತೆಯನ್ನು ರಚಿಸಬಹುದು<ph name="LINK_END"/>.</translation>
 <translation id="4950138595962845479">ಆಯ್ಕೆಗಳು...</translation>
 <translation id="4653235815000740718">OS ಪುನರ್‌ಪ್ರಾಪ್ತಿ ಮಾಧ್ಯಮವನ್ನು ರಚಿಸುವಲ್ಲಿ ಒಂದು ಸಮಸ್ಯೆ ಇದೆ. ಬಳಸಿದ ಸಂಗ್ರಹ ಸಾಧನವನ್ನು ಕಂಡುಹಿಡಿಯಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="1407489512183974736">ಮಧ್ಯಕ್ಕೆ ಕತ್ತರಿಸಲಾಗಿರುವುದು</translation>
 <translation id="413121957363593859">ಘಟಕಾಂಶಗಳು</translation>
 <translation id="715487527529576698">ಸರಳೀಕೃತ ಚೈನೀಸ್ ಆರಂಭದ ಚೈನೀಸ್ ಮೋಡ್ ಆಗಿದೆ</translation>
 <translation id="6522350652862471760">Google ಪ್ರೊಫೈಲ್‌ ಹೆಸರು ಮತ್ತು ಐಕಾನ್‌ ಸಕ್ರಿಯಗೊಳಿಸು</translation>
-<translation id="6181259999130430430">à²\88 à²¸à²¾à²§à²¨à²\95à³\8dà²\95ಾà²\97ಿ à²¸à³\81ಲಭ à²\85ನà³\8dâ\80\8cಲಾà²\95à³\8d à²\85ನà³\8dನà³\81 ಸಕ್ರಿಯಗೊಳಿಸು.</translation>
+<translation id="6181259999130430430">à²\88 à²¸à²¾à²§à²¨à²\95à³\8dà²\95ಾà²\97ಿ à²¸à²°à²³ à²\85ನà³\8dâ\80\8cಲಾà²\95à³\8d ಸಕ್ರಿಯಗೊಳಿಸು.</translation>
 <translation id="8703575177326907206"><ph name="DOMAIN"/> ಗೆ ನಿಮ್ಮ ಸಂಪರ್ಕವು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಆಗಿಲ್ಲ.</translation>
 <translation id="6135622770221372891">ಚಾನಲ್  IDಗಳು</translation>
 <translation id="8472623782143987204">ಹಾರ್ಡ್‌ವೇರ್-ಹಿಂತಿರುಗಿಸಿದೆ</translation>
 <translation id="2617604345341980855">ನೀವು ಈ ಹಿಂದೆ ವೆಬ್‌ಸೈಟ್‌ಗೆ ಸುರಕ್ಷಿತವಾಗಿ ಭೇಟಿ ನೀಡಿದ್ದರೂ ಸಹ, ಇದೀಗ ಅದಕ್ಕೆ ಭೇಟಿ ನೀಡುವುದರಿಂದ ಮಾಲ್‌ವೇರ್‌‌ ಮೂಲಕ ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಧಕ್ಕೆಯಾಗುವ ಸಾಧ್ಯತೆ ಇರುತ್ತದೆ.</translation>
 <translation id="2038896902310685531">ಓಹ್, <ph name="WALLET_ERROR"/> Google Wallet ಇಲ್ಲದೆಯೇ ಈ ವಹಿವಾಟನ್ನು ನೀವು ಪೂರ್ಣಗೊಳಿಸಬಹುದು.</translation>
 <translation id="3925573269917483990">ಕ್ಯಾಮರಾ:</translation>
-<translation id="3170072451822350649">ನà³\80ವà³\81 à²¸à³\88ನà³\8d à²\87ನà³\8d à²®à²¾à²¡à³\81ವà³\81ದನà³\8dನà³\81 à²¸à³\8dà²\95ಿಪà³\8dâ\80\8c à²®à²¾à²¡à²¬à²¹à³\81ದà³\81 à²¹à²¾à²\97à³\82 <ph name="LINK_START"/>à²\85ತಿಥಿಯà²\82ತà³\86 ಬ್ರೌಸ್ ಮಾಡಬಹುದು<ph name="LINK_END"/>.</translation>
+<translation id="3170072451822350649">ನà³\80ವà³\81 à²¸à³\88ನà³\8d à²\87ನà³\8d à²®à²¾à²¡à³\81ವà³\81ದನà³\8dನà³\81 à²¸à³\8dà²\95ಿಪà³\8dâ\80\8c à²®à²¾à²¡à²¬à²¹à³\81ದà³\81 à²¹à²¾à²\97à³\82 <ph name="LINK_START"/>à²\85ತಿಥಿಯಾà²\97ಿ ಬ್ರೌಸ್ ಮಾಡಬಹುದು<ph name="LINK_END"/>.</translation>
 <translation id="8390449457866780408">ಸರ್ವರ್ ಲಭ್ಯವಿಲ್ಲ.</translation>
 <translation id="5098629044894065541">ಹೀಬ್ರ್ಯೂ</translation>
 <translation id="2609896558069604090">ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ರಚಿಸಿ...</translation>
 <translation id="3984921062031549150">ರೆಂಡರರ್ ಫ್ರೀಜ್‌ಗಳು</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME"/> ಗಾಗಿ ಕಾಯುತ್ತಿದೆ...</translation>
 <translation id="1079766198702302550">ಯಾವಾಗಲೂ ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
-<translation id="2964845078799970531">ನಿಮà³\8dಮ à²«à³\8bನà³\8dâ\80\8cà²\97à³\86 à²¸à²®à³\80ಪದಲà³\8dಲಿರà³\81ವಾà²\97 à²¨à²¿à²®à³\8dಮ Chromebook à²\85ನà³\8dâ\80\8cಲಾà²\95à³\8d à²®à²¾à²¡à²²à³\81 à²¸à³\81ಲಭ ಅನ್‌ಲಾಕ್ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.</translation>
+<translation id="2964845078799970531">ನಿಮà³\8dಮ à²«à³\8bನà³\8dâ\80\8cà²\97à³\86 à²¸à²®à³\80ಪದಲà³\8dಲಿರà³\81ವಾà²\97 à²¨à²¿à²®à³\8dಮ Chromebook à²\85ನà³\8dâ\80\8cಲಾà²\95à³\8d à²®à²¾à²¡à²²à³\81 à²¸à²°à²³ ಅನ್‌ಲಾಕ್ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.</translation>
 <translation id="5053803681436838483">ಹೊಸ ಶಿಪ್ಪಿಂಗ್ ವಿಳಾಸ...</translation>
 <translation id="5952256601775839173">ಟಚ್‌ಪ್ಯಾಡ್ ಮೂರು-ಫಿಂಗರ್‌-ಕ್ಲಿಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="3280237271814976245">&amp;ಇದರಂತೆ ಉಳಿಸು</translation>
 <translation id="3125649188848276916">ಹೌದು (ಹೊಸ ಡೇಟಾವನ್ನು ದಾಖಲಿಸಬೇಡಿ)</translation>
 <translation id="648927581764831596">ಯಾವುದೂ ಲಭ್ಯವಿಲ್ಲ</translation>
 <translation id="6348657800373377022">ಕಾಂಬೊ ಬಾಕ್ಸ್</translation>
-<translation id="7453382714306901283">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಒಂದು ವಿಶ್ವಾಸಾರ್ಹ ಪ್ಲ್ಯಾಟ್‌ಫಾರ್ಮ್ ಮಾಡ್ಯೂಲ್ (TPM) ಸುರಕ್ಷತಾ ಸಾಧನವನ್ನು ಒಳಗೊಂಡಿದೆ, ಅದನ್ನು Chrome OS ನಲ್ಲಿ ಹಲವಾರು ಕ್ಲಿಷ್ಟಕರ ಸುರಕ್ಷತಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಬಳಸಬಹುದಾಗಿದೆ. ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಲು Chromebook ಸಹಾಯ ಕೇಂದ್ರಕ್ಕೆ ಭೇಟಿ ನೀಡಿ: http://support.google.com/chromebook/?p=tpm</translation>
+<translation id="7453382714306901283">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಒಂದು ವಿಶ್ವಾಸಾರ್ಹ ಪ್ಲ್ಯಾಟ್‌ಫಾರ್ಮ್ ಮಾಡ್ಯೂಲ್ (TPM) ಸುರಕ್ಷತಾ ಸಾಧನವನ್ನು ಒಳಗೊಂಡಿದೆ. ಅದನ್ನು Chrome OS ನಲ್ಲಿ ಹಲವಾರು ಕ್ಲಿಷ್ಟಕರ ಸುರಕ್ಷತಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಬಳಸಬಹುದು. ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಲು Chromebook ಸಹಾಯ ಕೇಂದ್ರಕ್ಕೆ ಭೇಟಿ ನೀಡಿ: http://support.google.com/chromebook/?p=tpm</translation>
 <translation id="8064671687106936412">ಕೀ:</translation>
 <translation id="2218515861914035131">ಸಾಮಾನ್ಯ ಪಠ್ಯವನ್ನಾಗಿ ಅಂಟಿಸು</translation>
 <translation id="1725149567830788547">&amp;ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="9033857511263905942">&amp;ಅಂಟಿಸಿ</translation>
 <translation id="1028690605877243613">ಪರ್ಯಾಯ ಶೆಲ್ಫ್ ಲೇಔಟ್ ಅನ್ನು ಬಳಸಿ.</translation>
 <translation id="6736045498964449756">ಓಹ್, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ!</translation>
-<translation id="4558985768677321342">ಸà³\81ಲಭ ಅನ್‌ಲಾಕ್ ಸಕ್ರಿಯಗೊಳಿಸು.</translation>
+<translation id="4558985768677321342">ಸರಳ ಅನ್‌ಲಾಕ್ ಸಕ್ರಿಯಗೊಳಿಸು.</translation>
 <translation id="1221825588892235038">ಆಯ್ಕೆ ಮಾತ್ರ</translation>
 <translation id="2227939492629426903">ಹೊಸ ಅವತಾರ್ ಮೆನುವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ಹೊಸ-ಪ್ರೊಫೈಲ್-ನಿರ್ವಹಣೆ ಜೊತೆಗೆ ಸೇರಿಸಿದಾಗ, ಇದು ಅವತಾರ್ ಮೆನುವಿನ ಹೊಸ ಪ್ರೊಫೈಲ್ ನಿರ್ವಹಣೆಯನ್ನು ತೋರಿಸುತ್ತದೆ. ಇಲ್ಲವಾದಲ್ಲಿ ಇದು ಹಳೆಯದಂತಿರುವ ಒಂದೇ ರೀತಿಯ ಕ್ರಿಯಾತ್ಮಕತೆಯೊಂದಿಗೆ ಮರು ವಿನ್ಯಾಸ ಮಾಡಿದ ಅವತಾರ್ ಮೆನು ಅನ್ನು ತೋರಿಸುತ್ತದೆ, ಜೊತೆಗೆ ಬಳಕೆದಾರರಿಗೆ ಟ್ಯುಟೋರಿಯಲ್ ಕಾರ್ಡ್ ಹೊಸ ಪ್ರೊಫೈಲ್ ನಿರ್ವಹಣೆ UI ಪ್ರಯತ್ನಿಸಲು ಉನ್ನತವಾಗಿ ಪ್ರೇರೇಪಿಸುತ್ತವೆ</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> ಅನ್ನು <ph name="HOST_NAME"/> ಗೆ ಪ್ರವೇಶಿಸಲು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ಫಿಶಿಂಗ್ ವೆಬ್‌ಸೈಟ್‌ನಂತೆ ಈ ವೆಬ್‌ಸೈಟ್ ವರದಿ ಮಾಡಲಾಗಿದೆ.</translation>
 <translation id="8852742364582744935">ಕೆಳಗಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ:</translation>
 <translation id="2916073183900451334">ಫಾರ್ಮ್ ಕ್ಷೇತ್ರಗಳಂತೆ ವೆಬ್‌ಪುಟದಲ್ಲಿನ ಹೈಲೈಟ್ ಲಿಂಕ್‌ಗಳ ಟ್ಯಾಬ್ ಒತ್ತಿರಿ</translation>
 <translation id="7772127298218883077"><ph name="PRODUCT_NAME"/> ಬಗ್ಗೆ</translation>
-<translation id="2090876986345970080">ಸಿಸà³\8dà²\9fà²\82 à²­à²¦à³\8dರತà³\86 ಸೆಟ್ಟಿಂಗ್</translation>
+<translation id="2090876986345970080">ಸಿಸà³\8dà²\9fà²\82 à²¸à³\81ರà²\95à³\8dಷತಾ ಸೆಟ್ಟಿಂಗ್</translation>
 <translation id="3728067901555601989">OTP: </translation>
 <translation id="3475447146579922140">Google ಸ್ಪ್ರೆಡ್‌ಶೀಟ್‌</translation>
 <translation id="6856526171412069413">ಪಿಂಚ್ ಅಳತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="6731255991101203740">ಅನ್ ಜಿಪ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಡೈರೆಕ್ಟರಿ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ: '<ph name="DIRECTORY_PATH"/>'</translation>
 <translation id="3816846830151612068">ಈ ಸೌಲಭ್ಯಗಳ ಸುರಕ್ಷತೆಯನ್ನು ಬಳಸಲು ನೀವು ಈ ವಿಸ್ತರಣೆಯನ್ನು ನಂಬುತ್ತೀರಾ?</translation>
 <translation id="7885253890047913815">ಇತ್ತೀಚಿನ ಗಮ್ಯಸ್ಥಾನಗಳು</translation>
-<translation id="3646789916214779970">ಡà³\80ಫಾಲà³\8dà²\9fà³\8d à²¥à³\80ಮà³\8dâ\80\8cà²\97à³\86 à²®à²°à³\81ಹà³\8aà²\82ದಿಸಿ</translation>
+<translation id="3646789916214779970">ಡà³\80ಫಾಲà³\8dà²\9fà³\8d à²¥à³\80ಮà³\8dâ\80\8cà²\97à³\86 à²®à²°à³\81ಹà³\8aà²\82ದಿಸà³\81</translation>
 <translation id="9220525904950070496">ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕಿ</translation>
 <translation id="151922265591345427">1024</translation>
 <translation id="3039828483675273919">$1 ಐಟಂಗಳನ್ನು ಸರಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="542872847390508405">ನೀವು ಒಬ್ಬ ಅತಿಥಿಯಂತೆ ಬ್ರೌಸ್ ಮಾಡುತ್ತಿರುವಿರಿ</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN"/> ಇದೀಗ ಪೂರ್ಣಪರದೆಯಾಗಿದೆ ಮತ್ತು ನಿಮ್ಮ ಮೌಸ್ ಕರ್ಸರ್‌ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗಿದೆ.</translation>
 <translation id="1497522201463361063">&quot;<ph name="FILE_NAME"/>&quot; ಗೆ ಮರುಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. <ph name="ERROR_MESSAGE"/></translation>
-<translation id="8226742006292257240">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಹೊಂದಿಸಲಾದ ಯಾದೃಚ್ಛಿಕವಾಗಿ ರಚಿಸಲಾದ TPM ಪಾಸ್‌ವರ್ಡ್ ಕೆಳಗಿದೆ:</translation>
+<translation id="8226742006292257240">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಹೊಂದಿಸಲಾದ, ರ‍್ಯಾಂಡಮ್‌‌ ಆಗಿ ರಚಿಸಲಾದ TPM ಪಾಸ್‌ವರ್ಡ್ ಕೆಳಗಿದೆ:</translation>
 <translation id="5010043101506446253">ಪ್ರಮಾಣಪತ್ರ ಪ್ರಾಧಿಕಾರ</translation>
 <translation id="5452005759330179535">ಡೆಸ್ಕ್‌ಟಾಪ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಲು ಸೈಟ್ ಕೇಳಿದಲ್ಲಿ ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="5287425679749926365">ನಿಮ್ಮ ಖಾತೆಗಳು</translation>
 <translation id="408898940369358887">ಪ್ರಾಯೋಗಿಕ JavaScript ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="7489605380874780575">ಅರ್ಹತೆಯನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="6607831829715835317">ಹೆಚ್ಚಿನ ಪರಿ&amp;ಕರಗಳು</translation>
-<translation id="2532589005999780174">à²\89ನà³\8dನತ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</translation>
+<translation id="2532589005999780174">ಹà³\86à²\9aà³\8dà²\9aಿನ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2643698698624765890">ವಿಂಡೋ ಮೆನುವಿನಲ್ಲಿ ವಿಸ್ತರಣೆಗಳನ್ನು ಕ್ಲಿಕ್ ಮಾಡುವುದರ ಮೂಲಕ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
 <translation id="4846680374085650406">ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್‌ಗಾಗಿ ನಿರ್ವಾಹಕರ ಶಿಫಾರಸನ್ನು ಅನುಸರಿಸುತ್ತಿರುವಿರಿ.</translation>
 <translation id="5917011688104426363">ಹುಡುಕಾಟ ಮೋಡ್‌ನಲ್ಲಿ ವಿಳಾಸ ಬಾರ್ ಅನ್ನು ಗಮನಿಸಿ</translation>
 <translation id="3269101346657272573">ದಯವಿಟ್ಟು PIN ನಮೂದಿಸಿ.</translation>
 <translation id="2822854841007275488">ಅರೇಬಿಕ್</translation>
-<translation id="6559948977408379772">ನà³\80ವà³\81 à²®à²¤à³\8dತà³\81 à²¨à²¿à²®à³\8dಮ à²«à³\8bನà³\8d à²¸à²®à³\80ಪದಲà³\8dಲಿರà³\81ವಾà²\97 à²®à²¤à³\8dತà³\81 à²¸à³\81ಲಭ ಅನ್‌ಲಾಕ್ ಲಭ್ಯವಿರುವಾಗ ಈ ಐಕಾನ್ ಗೋಚರಿಸುತ್ತದೆ. ಕೇವಲ ಪ್ರವೇಶಿಸು ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ, ಯಾವುದೇ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿಲ್ಲ.</translation>
+<translation id="6559948977408379772">ನà³\80ವà³\81 à²®à²¤à³\8dತà³\81 à²¨à²¿à²®à³\8dಮ à²«à³\8bನà³\8d à²¸à²®à³\80ಪದಲà³\8dಲಿರà³\81ವಾà²\97 à²®à²¤à³\8dತà³\81 à²¸à²°à²³ ಅನ್‌ಲಾಕ್ ಲಭ್ಯವಿರುವಾಗ ಈ ಐಕಾನ್ ಗೋಚರಿಸುತ್ತದೆ. ಕೇವಲ ಪ್ರವೇಶಿಸು ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ, ಯಾವುದೇ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿಲ್ಲ.</translation>
 <translation id="5857090052475505287">ಹೊಸ ಫೋಲ್ಡರ್</translation>
 <translation id="7450732239874446337">ನೆಟ್‌ವರ್ಕ್ IO ಅಮಾನತುಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="4003393903129308792">ಒಂದು-ಪ್ರತಿ-ರಾಸ್ಟ್ರರೈಜರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="1526560967942511387">ಶೀರ್ಷಿಕೆರಹಿತ ದಾಖಲೆ</translation>
 <translation id="3979748722126423326"><ph name="NETWORKDEVICE"/> ಕ್ರಿಯಾತ್ಮಕಗೊಳಿಸು</translation>
 <translation id="7819857487979277519">PSK (WPA ಅಥವಾ RSN)</translation>
-<translation id="7561031016893995297">ನಿಮà³\8dಮ à²\96ಾತà³\86ಯ à²¸à³\86à²\9fà³\8dà²\9fಿà²\82à²\97à³\8dâ\80\8cà²\97ಳಲà³\8dಲಿ à²¸à³\81ಲಭ ಅನ್‌ಲಾಕ್ ಸಾಧನಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
+<translation id="7561031016893995297">ನಿಮà³\8dಮ à²\96ಾತà³\86ಯ à²¸à³\86à²\9fà³\8dà²\9fಿà²\82à²\97à³\8dâ\80\8cà²\97ಳಲà³\8dಲಿ à²¸à²°à²³ ಅನ್‌ಲಾಕ್ ಸಾಧನಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
 <translation id="2238379619048995541">ಆವರ್ತನ ಸ್ಥಿತಿಯ ಡೇಟಾ</translation>
 <translation id="4367133129601245178">ಇಮೇಜ್ URL ಅನ್ನು ನಕ&amp;ಲಿಸಿ</translation>
 <translation id="6326175484149238433">Chrome ನಿಂದ ತೆಗೆದುಹಾಕು</translation>
 <translation id="9026731007018893674">ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</translation>
 <translation id="3212792897911394068">ವೀಡಿಯೋ ಮತ್ತು ಆಡಿಯೋ ಅಂಶಗಳಲ್ಲಿ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾದ ಮಾಧ್ಯಮ ವಿಸ್ತರಣೆಗಳ ಪ್ರಾಯೋಗಿಕ ಆವೃತ್ತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="6199775032047436064">ಪ್ರಸ್ತುತ ಪುಟವನ್ನು ಮರುತುಂಬಿಸಿ</translation>
-<translation id="6981982820502123353">ಪ್ರವೇಶಿಸುವಿಕೆ</translation>
+<translation id="6981982820502123353">ಪ್ರವೇಶ</translation>
 <translation id="7210998213739223319">ಬಳಕೆದಾರಹೆಸರು.</translation>
 <translation id="4523336217659634227">ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡುತ್ತಿರುವಾಗ ಸಮಸ್ಯೆ (<ph name="ERROR"/>) ಯೊಂದು ಕಂಡುಬಂದಿದೆ.</translation>
 <translation id="4478664379124702289">ಇದರಂತೆ ಲಿಂ&amp;ಕ್ ಅನ್ನು ಉಳಿಸಿ...</translation>
 <translation id="8590375307970699841">ಸ್ವಯಂಚಾಲಿತ ನವೀಕರಣಗಳನ್ನು ಹೊಂದಿಸಿ</translation>
 <translation id="265390580714150011">ಕ್ಷೇತ್ರ ಮೌಲ್ಯ</translation>
 <translation id="3869917919960562512">ತಪ್ಪಾದ ವಿಷಯಸೂಚಿ. </translation>
-<translation id="7031962166228839643">TPM à²\85ನà³\8dನà³\81 à²¸à²¿à²¦à³\8dಧಪಡಿಸಲಾà²\97à³\81ತà³\8dತಿದà³\86, à²¦à²¯à²µà²¿à²\9fà³\8dà²\9fà³\81 à²¨à²¿à²°à³\80à²\95à³\8dಷಿಸಿ (à²\87ದà²\95à³\8dà²\95à³\86 à²\95à³\86ಲವà³\81 à²¨à²¿à²®à²¿à²·à²\97ಳà³\81 à²¤à³\86à²\97à³\86ದà³\81à²\95à³\8aಳà³\8dಳಬಹುದು)…</translation>
+<translation id="7031962166228839643">TPM à²\85ನà³\8dನà³\81 à²¸à²¿à²¦à³\8dಧಪಡಿಸಲಾà²\97à³\81ತà³\8dತಿದà³\86, à²\95à³\8aà²\82à²\9a à²\95ಾಯಿರಿ (à²\87ದà²\95à³\8dà²\95à³\86 à²\95à³\86ಲವà³\81 à²¨à²¿à²®à²¿à²·à²\97ಳ à²\95ಾಲಾವà²\95ಾಶ à²¬à³\87à²\95ಾà²\97ಬಹುದು)…</translation>
 <translation id="769312636793844336">ಆಫ್‌ಲೈನ್ ಬಳಕೆಗಾಗಿ ಈ ಫೈಲ್ ಅನ್ನು ಉಳಿಸಲು, ಆನ್‌ಲೈನ್‌ಗೆ ಹಿಂತಿರುಗಿ ಮತ್ತು&lt;br&gt;ಈ ಫೈಲ್‌ಗಾಗಿ <ph name="OFFLINE_CHECKBOX_NAME"/> ಚೆಕ್‌ಬಾಕ್ಸ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
 <translation id="715118844758971915">ಕ್ಲಾಸಿಕ್ ಮುದ್ರಕಗಳು</translation>
 <translation id="5242724311594467048">&quot;<ph name="EXTENSION_NAME"/>&quot; ಸಕ್ರಿಯಗೊಳಿಸುವುದೆ?</translation>
 <translation id="6460601847208524483">ಮುಂದಿನದು ಕಂಡುಹಿಡಿಯಿರಿ</translation>
 <translation id="397703832102027365">ಅಂತಿಮಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="8146177459103116374">ಈ ಸಾಧನದಲ್ಲಿ ನೀವು ಈಗಾಗಲೇ ನೋಂದಾಯಿಸಿದ್ದರೆ, ನೀವು <ph name="LINK2_START"/>ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬಳಕೆದಾರನಂತೆ ಸೈನ್ ಇನ್<ph name="LINK2_END"/> ಮಾಡಬಹುದು.</translation>
+<translation id="5072836811783999860">ನಿರ್ವಹಿಸಲಾದ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ತೋರಿಸು</translation>
 <translation id="4856478137399998590">ನಿಮ್ಮ ಮೊಬೈಲ್ ಡೇಟಾ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು ಬಳಕೆಗೆ ಸಿದ್ಧವಾಗಿದೆ</translation>
 <translation id="3305389145870741612">ಸ್ವರೂಪಣೆಯ ಪ್ರಕ್ರಿಯೆಯು ಕೆಲವು ಸೆಕೆಂಡ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು. ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.</translation>
 <translation id="3648607100222897006">ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಯಾವುದೇ ಸಮಯದಲ್ಲಾದರೂ ಬದಲಾಗಬಹುದು, ಒಡೆಯಬಹುದು, ಅಥವಾ ಕಾಣೆಯಾಗಬಹುದು. ಒಂದು ಪ್ರಯೋಗವನ್ನು ಆನ್ ಮಾಡಿದರೆ ಏನು ಆಗಬಹುದು ಎಂಬುವುದರ ಬಗ್ಗೆ ನಾವು ಯಾವುದೇ ಖಾತ್ರಿಗಳನ್ನು ನೀಡುವುದಿಲ್ಲ, ಮತ್ತು ನಿಮ್ಮ ಬ್ರೌಸರ್ ನಿರಂತರವಾಗಿ ದಹನಕ್ಕೊಳಗಾಗಬಹುದು. ಜೋಕ್‌ಗಳು ಆ ಕಡೆ ಇರಲಿ, ನಿಮ್ಮ ಬ್ರೌಸರ್ ನಿಮ್ಮ ಎಲ್ಲ ಡೇಟಾವನ್ನು ಅಳಿಸಿ ಹಾಕಬಹುದು, ಅಥವಾ ನಿಮ್ಮ ಸುರಕ್ಷಿತ ಮತ್ತು ಗೌಪ್ಯತೆಯು ಅನಿರೀಕ್ಷಿತ ರೀತಿಯಲ್ಲಿ ಧಕ್ಕೆಯುಂಟಾಗಬಹುದು. ಯಾವುದೇ ಪ್ರಯೋಗಗಳನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ ಈ ಬ್ರೌಸರ್‌ನ ಎಲ್ಲ ಬಳಕೆದಾರರಿಗೂ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದು. ದಯವಿಟ್ಟು ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ.</translation>
 <translation id="8686213429977032554">ಈ ಡ್ರೈವ್ ಫೈಲ್ ಅನ್ನು ಇನ್ನೂ ಹಂಚಿಕೊಳ್ಳಲಾಗಿಲ್ಲ</translation>
 <translation id="2448046586580826824">ಸುರಕ್ಷಿತ HTTP ಪ್ರಾಕ್ಸಿ </translation>
 <translation id="4032534284272647190"><ph name="URL"/> ಗೆ ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ.</translation>
-<translation id="5958529069007801266">ಮà³\86à³\95ಲà³\8dವಿà²\9aಾರಣà³\86ಯ ಬಳಕೆದಾರರು</translation>
+<translation id="5958529069007801266">ಮà³\86à³\95ಲà³\8dವಿà²\9aಾರಣà³\86à²\97à³\8aಳಪà²\9fà³\8dà²\9f ಬಳಕೆದಾರರು</translation>
 <translation id="3129173833825111527">ಎಡ ಅಂಚು</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/>K (<ph name="NUM_KILOBYTES_LIVE"/>K ಲೈವ್)</translation>
-<translation id="5554573843028719904">ಇತರೆWi-Fi  ನೆಟ್‌ವರ್ಕ್...</translation>
+<translation id="5554573843028719904">ಇತರೆ Wi-Fi ನೆಟ್‌ವರ್ಕ್...</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED"/>, <ph name="TIME_LEFT"/></translation>
 <translation id="7013485839273047434">ಇನ್ನಷ್ಟು ವಿಸ್ತರಣೆಗಳನ್ನು ಪಡೆಯಿರಿ</translation>
 <translation id="2124335647227850314">ಪ್ರದರ್ಶಕವು ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬೆಂಬಲಿಸಿದರೂ ಸಹ ಪ್ರದರ್ಶಕದ ಬಣ್ಣ ಮಾಪನಾಂಕ ಮಾಡುವುದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="1639239467298939599">ಲೋಡ್ ಆಗುತ್ತಿದೆ</translation>
 <translation id="5457599981699367932">ಅತಿಥಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಿ</translation>
 <translation id="8525428584879632762">ಹುಡುಕಾಟ ಫಲಿತಾಂಶದ ಪುಟಗಳಲ್ಲಿ ಅಥವಾ ಇನ್‌ಪುಟ್ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿರುವಾಗ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
-<translation id="2487656424763972284">ಸà³\81ಲಭ ಅನ್‌ಲಾಕ್</translation>
+<translation id="2487656424763972284">ಸರಳ ಅನ್‌ಲಾಕ್</translation>
 <translation id="7047998246166230966">ಪಾಯಿಂಟರ್‌</translation>
 <translation id="743268637741709136">ಅಪ್ಲಿಕೇಶನ್‌ ಲಾಂಚರ್‍‌ನಲ್ಲಿ ಧ್ವನಿ ಹುಡುಕಾಟವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ. ಒಂದು ವೇಳೆ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಲ್ಲಿ, ಬಳಕೆದಾರರು ತಮ್ಮ ಭಾಷಣದ ಮೂಲಕ ಹುಡುಕಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="3252266817569339921">ಫ್ರೆಂಚ್</translation>
 <translation id="736108944194701898">ಮೌಸ್ ವೇಗ:</translation>
 <translation id="4350711002179453268">ಸರ್ವರ್‌ಗೆ ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಮಾಡಲಾಗಲಿಲ್ಲ. ಇದು ಸರ್ವರ್‌ನೊಂದಿಗೆ ಸಮಸ್ಯೆಯ ಕಾರಣದಿಂದ ಆಗಿರಬಹುದು, ಅಥವಾ ಅದಕ್ಕೆ ನೀವು ಹೊಂದಿರದ ಗ್ರಾಹಕ ಪ್ರಮಾಣೀಕರಣ ಪ್ರಮಾಣಪತ್ರದ ಅಗತ್ಯವಿರಬಹುದು.</translation>
 <translation id="750509436279396091">ಡೌನ್‌ಲೋಡ್‌ಗಳ ಫೋಲ್ಡರ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation>
-<translation id="5963026469094486319">ಥೀಮ್‌ಗಳನ್ನು ಪಡೆಯಿರಿ</translation>
+<translation id="5963026469094486319">ಥೀಮ್‌ಗಳನ್ನು ಪಡೆ</translation>
 <translation id="7586312264284919041">ನೀವು ಈ ಪುಟವನ್ನು ಅನುವಾದಿಸಲು ಬಯಸುವಿರಾ?</translation>
 <translation id="3855072293748278406">ಪ್ಲಗಿನ್ ಪ್ರವೇಶವನ್ನು ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="8357224663288891423">ವಿಸ್ತರಣೆಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌‌ಕಟ್‌ಗಳು</translation>
 <translation id="3242118113727675434">ಸ್ಪರ್ಶಿಸುವ ಪಾಯಿಂಟ್‌ಗಳಿಗಾಗಿ HUD ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="8308179586020895837">ನಿಮ್ಮ ಕ್ಯಾಮೆರಾ ಪ್ರವೇಶಿಸಲು <ph name="HOST"/> ಬಯಸುತ್ತದೆಯೇ ಎಂಬುದನ್ನು ಕೇಳಿ</translation>
 <translation id="5129662217315786329">ಪೋಲಿಶ್</translation>
-<translation id="8513974249124254369">ChromeVox (ಮಾತನಾಡà³\81ವ ಪ್ರತಿಕ್ರಿಯೆ) ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು Ctrl+Alt+Z ಒತ್ತಿರಿ.</translation>
+<translation id="8513974249124254369">ChromeVox (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ) ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು Ctrl+Alt+Z ಒತ್ತಿರಿ.</translation>
 <translation id="117624967391683467"><ph name="FILE_NAME"/> ನಕಲಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="3095995014811312755">ಆವೃತ್ತಿ</translation>
 <translation id="7052500709156631672">ಅಪ್‌ಸ್ಟ್ರೀಮ್ ಸರ್ವರ್‌ನಿಂದ ಗೇಟ್‌ವೇ ಅಥವಾ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಅಮಾನ್ಯ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸ್ವೀಕರಿಸಿದೆ.</translation>
 <translation id="6869402422344886127">ಗುರುತಿಸಿದ ಚೆಕ್ ಬಾಕ್ಸ್</translation>
 <translation id="3428010780253032925">ವೀಕ್ಷಣೆಗಳಲ್ಲಿನ ಆಯತಾಕಾರ ಆಧಾರಿತ ಗುರಿಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="5637380810526272785">ಇನ್‌ಪುಟ್ ವಿಧಾನ</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> ತೋರಿಸು</translation>
 <translation id="2837049386027881519">TLS ಅಥವಾ SSL ಪ್ರೊಟೊಕಾಲ್‌ನ ಹಳೆಯ ಆವೃತ್ತಿಯನ್ನು ಬಳಸುತ್ತಿರುವುದರಿಂದ ಸಂಪರ್ಕವನ್ನು ಮರುಪ್ರಯತ್ನಿಸಬೇಕಾಗಿದೆ. ಪ್ರಾತಿನಿಧಿಕವಾಗಿ ಇದರರ್ಥವೇನೆಂದರೆ ಸರ್ವರ್ ತುಂಬಾ ಹಳೆಯ ಸಾಫ್ಟ್‌ವೇರ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ ಮತ್ತು ಇತರ ಭದ್ರತಾ ಸಮಸ್ಯೆಗಳನ್ನು ಹೊಂದಿರಬಹುದು.</translation>
 <translation id="404928562651467259">ಎಚ್ಚರಿಕೆ</translation>
 <translation id="4289300219472526559">ಮಾತನಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="8148264977957212129">ಪಿನ್‌ಯಿನ್ ಇನ್‌ಪುಟ್ ವಿಧಾನ</translation>
 <translation id="2288278176040912387">ರೆಕಾರ್ಡ್ ಪ್ಲೇಯರ್</translation>
 <translation id="7772032839648071052">ಪಾಸ್‌ಫ್ರೇಸ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ</translation>
-<translation id="3676582787770338561">à²\88 <ph name="DEVICE_TYPE"/> à²\97ಾà²\97ಿ à²¸à³\81ಲಭ ಅನ್‌ಲಾಕ್ ಸಕ್ರಿಯಗೊಳಿಸು.</translation>
+<translation id="3676582787770338561">à²\88 <ph name="DEVICE_TYPE"/> à²\97ಾà²\97ಿ à²¸à²°à²³ ಅನ್‌ಲಾಕ್ ಸಕ್ರಿಯಗೊಳಿಸು.</translation>
 <translation id="2871813825302180988">ಈ ಸಾಧನದಲ್ಲಿ ಈ ಖಾತೆಯನ್ನು ಈಗಾಗಲೇ ಬಳಸಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="1642505962779453775">ಕೊನೆಯ ತ್ರೈಮಾಸಿಕ</translation>
 <translation id="3323235640813116393">MHTML ನಂತೆ ಉಳಿಸಿರುವ ಪುಟಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ: HTML ಮತ್ತು ಎಲ್ಲಾ ಉಪ-ಸಂಪನ್ಮೂಲಗಳನ್ನು ಹೊಂದಿರುವ ಏಕೈಕ ಪಠ್ಯದ ಫೈಲ್.</translation>
 <translation id="2927657246008729253">ಬದಲಿಸು...</translation>
 <translation id="7978412674231730200">ಖಾಸಗಿ ಕೀಲಿ</translation>
 <translation id="7026195417816346611">ಸ್ಥಳೀಯ ಡೇಟಾ ಸಂಗ್ರಹಣೆ</translation>
-<translation id="5308380583665731573">ಸà²\82ಪರà³\8dà²\95ಿಸಿ</translation>
+<translation id="5308380583665731573">ಸà²\82ಪರà³\8dà²\95ಿಸà³\81</translation>
 <translation id="1526496236488270004">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಿಂದ ಫೋಟೊಗಳು, ಸಂಗೀತ ಮತ್ತು ಇತರೆ ಮಾಧ್ಯಮವನ್ನು ಪ್ರವೇಶಿಸಿ ಮತ್ತು ಬದಲಾಯಿಸಿ.</translation>
 <translation id="6489534406876378309">ವಿಫಲತೆಗಳನ್ನು ಅಪ್‌ಲೋಡ್‌ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸು</translation>
 <translation id="9111395131601239814"><ph name="NETWORKDEVICE"/>: <ph name="STATUS"/></translation>
 <translation id="7928710562641958568">ಸಾಧನ ಎಜೆಕ್ಟ್ ಮಾಡಿ</translation>
 <translation id="8729518820755801792">Chrome ನಲ್ಲಿ ಈ URL ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="480990236307250886">ಮುಖ ಪುಟ ತೆರೆಯಿರಿ</translation>
-<translation id="6380143666419481200">à²\85à²\82à²\97à³\80à²\95ರಿಸಿ ಮತ್ತು ಮುಂದುವರಿಯಿರಿ</translation>
+<translation id="6380143666419481200">ಸಮà³\8dಮತಿಸಿ ಮತ್ತು ಮುಂದುವರಿಯಿರಿ</translation>
 <translation id="713122686776214250">&amp;ಪುಟ ಸೇರಿಸು...</translation>
 <translation id="4816492930507672669">ಪುಟಕ್ಕೆ ಹೊಂದಿಸು</translation>
 <translation id="1485015260175968628">ಇದೀಗ ಸಾಧ್ಯ:</translation>
 <translation id="6934265752871836553">Chrome ವಿಷಯವನ್ನು ತ್ವರಿತಗತಿಯಲ್ಲಿ ಪಡೆದುಕೊಳ್ಳುವಂತೆ ಮಾಡಲು ಬ್ಲೀಡಿಂಗ್-ಎಡ್ಜ್-ಕೋಡ್ ಬಳಸಿ. ಈ ಹಾದಿಗಳ
         ಹಿಂದಿರುವ ಬದಲಾವಣೆಗಳು ಸಾಕಷ್ಟು ವಿಷಯಗಳಿಗೆ ಧಕ್ಕೆ ಉಂಟುಮಾಡುವ ಸಾಧ್ಯತೆಗಳಿವೆ.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">ಯಾವಾಗಲೂ Adobe Reader ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="8274359292107649245">ಡೆಸ್ಕ್‌ಟಾಪ್‌ನಲ್ಲಿ Chrome ತೆರೆಯಿರಿ</translation>
 <translation id="1571119610742640910">ಸ್ಥಿರ ಮೂಲ ಹಿನ್ನೆಲೆಗಳಿಗಾಗಿ ಸಂಯೋಜನೆ.</translation>
 <translation id="6514565641373682518">ಈ ಪುಟವು ನಿಮ್ಮ ಮೌಸ್ ಕರ್ಸರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿದೆ.</translation>
 <translation id="4785040501822872973"><ph name="LOGOUT_TIME_LEFT"/> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಈ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲಾಗುತ್ತದೆ.
 ಅನ್ವೇಷಿಸುವುದನ್ನು ಮುಂದುವರಿಸಲು ಯಾವುದೇ ಕೀ ಅನ್ನು ಒತ್ತಿರಿ.</translation>
 <translation id="4084682180776658562">ಬುಕ್‌ಮಾರ್ಕ್</translation>
-<translation id="8859057652521303089">ನಿಮ್ಮ ಭಾಷೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ:</translation>
+<translation id="8859057652521303089">ನಿಮ್ಮ ಭಾಷೆ ಆಯ್ಕೆ ಮಾಡಿ:</translation>
 <translation id="2632795170092344386">ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ಮುಚ್ಚುವಾಗ ಕುಕೀಗಳು ಮತ್ತು ಇತರೆ ಸೈಟ್‍ಗಳು ಹಾಗೂ ಪ್ಲಗ್-ಇನ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation>
 <translation id="5941864346249299673">ನೆಟ್‌ವರ್ಟ್‌ನಾದ್ಯಂತ ಓದಲಾದ ಬೈಟ್‌ಗಳ ಸಂಖ್ಯೆ</translation>
 <translation id="3030138564564344289">ಡೌನ್‌ಲೋಡ್ ಮರುಪ್ರಯತ್ನಿಸಿ</translation>
 <translation id="824543159844843373">ಲಾಂಚರ್ ಐಟಂ 3 ಸಕ್ರಿಯಗೊಳಿಸು</translation>
 <translation id="3819800052061700452">&amp;ಪೂರ್ಣ-ಪರದೆ</translation>
 <translation id="48607902311828362">ಏರ್‌ಪ್ಲೇನ್ ಮೋಡ್</translation>
+<translation id="711840821796638741">ನಿರ್ವಹಿಸಲಾದ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ತೋರಿಸು</translation>
 <translation id="3360297538363969800">ಮುದ್ರಣ ವಿಫಲಗೊಂಡಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಮುದ್ರಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> ನಲ್ಲಿ RLZ ಟ್ರ್ಯಾಕಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="688797901999351107">ಮರುಪಡೆಯಲಾದ ಚಾರ್ಜರ್ ಬಳಕೆಯನ್ನು ನಿಲ್ಲಿಸಿ.</translation>
index b2a6542..74ef97c 100644 (file)
 <translation id="3984921062031549150">렌더러 정지</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME"/>의 응답을 기다리는 중...</translation>
 <translation id="1079766198702302550">카메라 액세스 항상 차단</translation>
-<translation id="2964845078799970531">내 휴대전화와 가까워지면 편리한 잠금 해제 기능이 Chromebook을 해제해 줍니다.</translation>
+<translation id="2964845078799970531">내 휴대전화와 가까워지면 간편 잠금 해제 기능이 Chromebook을 잠금 해제해 줍니다.</translation>
 <translation id="5053803681436838483">새 배송지 주소...</translation>
 <translation id="5952256601775839173">손가락 세 개로 터치패드를 클릭하는 기능을 사용하도록 설정합니다.</translation>
 <translation id="3280237271814976245">다른 이름으로 저장(&amp;A)...</translation>
@@ -1303,7 +1303,7 @@ http://support.google.com/chromebook/?p=tpm</translation>
 <translation id="9033857511263905942">붙여넣기(&amp;P)</translation>
 <translation id="1028690605877243613">대체 임시보관함 레이아웃을 사용합니다.</translation>
 <translation id="6736045498964449756">비밀번호가 일치하지 않습니다.</translation>
-<translation id="4558985768677321342">편리한 잠금 해제 사용 설정</translation>
+<translation id="4558985768677321342">간편 잠금 해제 사용 설정</translation>
 <translation id="1221825588892235038">선택 영역만</translation>
 <translation id="2227939492629426903">새 아바타 메뉴를 사용 설정합니다. 새 프로필 관리 시스템과 결합되면 새 프로필 관리 아바타 메뉴를 표시합니다. 그렇지 않은 경우, 사용자에게 새 프로필 관리 UI 사용을 권하는 메시지가 상단에 표시된 안내 카드와 함께, 기존 메뉴와 같은 기능을 가진 새로운 아바타 메뉴를 표시합니다.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/>이(가) <ph name="HOST_NAME"/> 액세스를 차단하고 있습니다.  이 웹사이트는 피싱 웹사이트로 신고되었습니다.</translation>
@@ -3964,6 +3964,7 @@ http://support.google.com/chromebook/?p=tpm</translation>
 <translation id="6460601847208524483">다음 찾기</translation>
 <translation id="397703832102027365">완료 중...</translation>
 <translation id="8146177459103116374">이 기기에 이미 등록한 경우 <ph name="LINK2_START"/>기존 사용자로 로그인<ph name="LINK2_END"/>할 수 있습니다.</translation>
+<translation id="5072836811783999860">관리 북마크 표시</translation>
 <translation id="4856478137399998590">모바일 데이터 서비스가 활성화되었으며 사용할 준비가 되었습니다.</translation>
 <translation id="3305389145870741612">포맷하는 데 몇 초 정도 걸립니다. 잠시 기다려 주세요.</translation>
 <translation id="3648607100222897006">해당 실험용 기능은 언제든지 변경, 중지 및 취소될 수 있습니다. 해당 실험용 기능을 사용할 때 발생하는 일에 대해 Google은 보장하지 않습니다. 데이터가 삭제되거나 개인 정보가 예기치 않은 방법으로 유출될 수 있습니다. 본인이 사용 설정한 모든 실험 기능은 해당 브라우저의 다른 사용자도 사용하게 됩니다. 주의해서 진행하시기 바랍니다.</translation>
@@ -4395,6 +4396,7 @@ http://support.google.com/chromebook/?p=tpm</translation>
 <translation id="6869402422344886127">확인란 선택함</translation>
 <translation id="3428010780253032925">보기에 직사각형 기반 타겟팅 사용 중지</translation>
 <translation id="5637380810526272785">입력 방법</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> 표시</translation>
 <translation id="2837049386027881519">TLS 또는 SSL 프로토콜의 이전 버전을 사용하여 다시 연결을 시도했습니다. 일반적으로 서버가 아주 오래된 소프트웨어를 사용 중이며 기타 보안 문제가 있기 때문일 수 있습니다.</translation>
 <translation id="404928562651467259">경고</translation>
 <translation id="4289300219472526559">말하기 시작</translation>
@@ -4728,6 +4730,7 @@ http://support.google.com/chromebook/?p=tpm</translation>
 <translation id="6934265752871836553">최첨단 코드를 사용하여 Chrome에서 더욱 빨리 콘텐츠를 가져오도록 합니다. 이 경로
         뒤에 있는 변경사항으로 인해 더 많은 콘텐츠가 중단될 수 있습니다.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">항상 Adobe Reader에서 열기</translation>
 <translation id="8274359292107649245">데스크톱에서 Chrome 열기</translation>
 <translation id="1571119610742640910">고정 루트 백그라운드 합성</translation>
 <translation id="6514565641373682518">이 페이지에서 마우스 커서를 사용 중지했습니다.</translation>
@@ -4928,6 +4931,7 @@ http://support.google.com/chromebook/?p=tpm</translation>
 <translation id="824543159844843373">실행기 항목 3 활성화</translation>
 <translation id="3819800052061700452">전체화면(&amp;F)</translation>
 <translation id="48607902311828362">비행 모드</translation>
+<translation id="711840821796638741">관리 북마크 표시</translation>
 <translation id="3360297538363969800">인쇄에 실패했습니다. 프린터를 확인한 후 다시 시도해 주세요.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/>에서 RLZ 추적을 사용합니다.</translation>
 <translation id="688797901999351107">리콜된 충전기 사용을 중단하세요.</translation>
index 9593e2c..8fa0308 100644 (file)
 <translation id="413121957363593859">Komponentai</translation>
 <translation id="715487527529576698">Pradinis kinų k. režimas yra supaprastinta kinų k.</translation>
 <translation id="6522350652862471760">Įgalinti „Google“ profilio pavadinimą ir piktogramą</translation>
-<translation id="6181259999130430430">Šiame įrenginyje įgalinti lengvo atrakinimo funkciją.</translation>
+<translation id="6181259999130430430">Šiame įrenginyje įgalinti Lengvą atrakinimą.</translation>
 <translation id="8703575177326907206">Jūsų ryšys su <ph name="DOMAIN"/> nekoduotas.</translation>
 <translation id="6135622770221372891">Kanalų ID</translation>
 <translation id="8472623782143987204">palaikoma aparatinės įrangos</translation>
@@ -718,7 +718,7 @@ Norint tęsti, visi naudotojai turi atsijungti.</translation>
 <translation id="3984921062031549150">Pateikimo priemonės strigtys</translation>
 <translation id="7925285046818567682">Laukiama <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Visada blokuoti prieigą prie fotoaparato</translation>
-<translation id="2964845078799970531">Naudodami lengvo atrakinimo funkciją galite atrakinti „Chromebook“, kai esate netoli telefono.</translation>
+<translation id="2964845078799970531">Naudodami Lengvą atrakinimą galite atrakinti „Chromebook“, kai esate netoli telefono.</translation>
 <translation id="5053803681436838483">Naujas pristatymo adresas...</translation>
 <translation id="5952256601775839173">Įgalinti jutiklinės dalies paspaudimą trim pirštais.</translation>
 <translation id="3280237271814976245">Išsaugoti &amp;kaip...</translation>
@@ -1299,7 +1299,7 @@ likęs akumuliatoriaus laikas</translation>
 <translation id="9033857511263905942">&amp;Įklijuoti</translation>
 <translation id="1028690605877243613">Naudoti alternatyvų lentynos išdėstymą.</translation>
 <translation id="6736045498964449756">Oi, slaptažodžiai nesutampa.</translation>
-<translation id="4558985768677321342">Įgalinti lengvo atrakinimo funkciją.</translation>
+<translation id="4558985768677321342">Įgalinti Lengvą atrakinimą.</translation>
 <translation id="1221825588892235038">Tik pasirinkimas</translation>
 <translation id="2227939492629426903">Įgalinamas naujas pseudoportreto meniu. Kai derinama su naujo profilio tvarkymo funkcija, tiesiog rodomas naujas profilio tvarkymo pseudoportreto meniu. Kitu atveju rodomas atnaujinto dizaino pseudoportreto meniu, kurio funkcijos tokios pačios kaip ir seno meniu, o viršuje rodoma mokymo programos kortelė, kuri ragina naudotoją išbandyti naują profilio tvarkymo NS.</translation>
 <translation id="5582883434676861778">„<ph name="PRODUCT_NAME"/>“ užblokavo prieigą prie <ph name="HOST_NAME"/>.  Pranešta, kad šioje svetainėje sukčiaujama.</translation>
@@ -3353,7 +3353,7 @@ Sukūrę naują prižiūrimą naudotoją, bet kuriuo metu galite valdyti jo nust
 <translation id="5917011688104426363">Fokusuoti adreso juostą paieškos režimu</translation>
 <translation id="3269101346657272573">Įveskite PIN kodą.</translation>
 <translation id="2822854841007275488">arabų</translation>
-<translation id="6559948977408379772">Ši piktograma rodoma, kai jūs ir jūsų telefonas esate netoliese ir lengvo atrakinimo funkcija yra pasiekiama. Tiesiog spustelėkite, kad paleistumėte funkciją (jokio slaptažodžio nereikia).</translation>
+<translation id="6559948977408379772">Ši piktograma rodoma, kai jūs ir jūsų telefonas esate netoliese ir Lengvas atrakinimas yra pasiekiamas. Tiesiog spustelėkite, kad paleistumėte funkciją (jokio slaptažodžio nereikia).</translation>
 <translation id="5857090052475505287">Naujas aplankas</translation>
 <translation id="7450732239874446337">Tinklo IO sustabdytas.</translation>
 <translation id="4003393903129308792">Įgalinti vienos kopijos rastrinio vaizdo keitimo priemonę</translation>
@@ -3473,7 +3473,7 @@ Sukūrę naują prižiūrimą naudotoją, bet kuriuo metu galite valdyti jo nust
 <translation id="1526560967942511387">Dokumentas be pavadinimo</translation>
 <translation id="3979748722126423326">Įgalinti <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA ar RSN)</translation>
-<translation id="7561031016893995297">Tvarkykite lengvo atrakinimo funkciją naudojančius įrenginius savo paskyros nustatymuose.</translation>
+<translation id="7561031016893995297">Tvarkykite Lengvo atrakinimą naudojančius įrenginius savo paskyros nustatymuose.</translation>
 <translation id="2238379619048995541">Dažnumo būsenos duomenys</translation>
 <translation id="4367133129601245178">K&amp;opijuoti vaizdo URL</translation>
 <translation id="6326175484149238433">Pašalinti iš „Chrome“</translation>
@@ -3974,6 +3974,7 @@ Sukūrę naują prižiūrimą naudotoją, bet kuriuo metu galite valdyti jo nust
 <translation id="6460601847208524483">Rasti kitą</translation>
 <translation id="397703832102027365">Užbaigiama...</translation>
 <translation id="8146177459103116374">Jei jau esate užsiregistravę šiame įrenginyje, galite <ph name="LINK2_START"/>prisijungti kaip esamas naudotojas<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Rodyti tvarkomas žymes</translation>
 <translation id="4856478137399998590">Duomenų mobiliesiems paslauga suaktyvinta ir paruošta naudoti</translation>
 <translation id="3305389145870741612">Formatavimas gali užtrukti kelias sekundes. Palaukite.</translation>
 <translation id="3648607100222897006">Šios eksperimentinės funkcijos gali bet kada pasikeisti, neveikti ar išnykti. Negarantuojame, kas nutiks, kai įjungsite šiuo eksperimentus. Jūsų naršyklė gali netgi savaime sudegti. Kalbant rimtai, naršyklė gali ištrinti visus duomenis arba jūsų saugumas ir privatumas gali būti pažeisti netikėtais būdais. Visi eksperimentai, kuriuos įgalinsite, bus įgalinti visiems naudotojams. Elkitės atsargiai.</translation>
@@ -4406,6 +4407,7 @@ Ar norite paleisti „<ph name="CONTROL_PANEL_APPLET_NAME"/>“?</translation>
 <translation id="6869402422344886127">Pažymėtas žymimasis laukelis</translation>
 <translation id="3428010780253032925">Išjungti taikymą pagal stačiakampį rodiniuose</translation>
 <translation id="5637380810526272785">Įvesties metodas</translation>
+<translation id="3613134908380545408">Rodyti „<ph name="FOLDER_NAME"/>“</translation>
 <translation id="2837049386027881519">Buvo bandyta prisijungti iš naujo naudojant senesnės versijos TLS arba SSL protokolą. Tai paprastai reiškia, kad serveryje naudojama labai sena programinė įranga ir jame gali būti kitų saugumo problemų.</translation>
 <translation id="404928562651467259">ĮSPĖJIMAS</translation>
 <translation id="4289300219472526559">Pradėti kalbėti</translation>
@@ -4474,7 +4476,7 @@ Ar norite paleisti „<ph name="CONTROL_PANEL_APPLET_NAME"/>“?</translation>
 <translation id="8148264977957212129">„Pinyin“ įvesties metodas</translation>
 <translation id="2288278176040912387">Grotuvas</translation>
 <translation id="7772032839648071052">Patvirtinti slaptafrazę</translation>
-<translation id="3676582787770338561">Šiame „<ph name="DEVICE_TYPE"/>“ įgalinti lengvo atrakinimo funkciją.</translation>
+<translation id="3676582787770338561">Šiame „<ph name="DEVICE_TYPE"/>“ įgalinti Lengvą atrakinimą.</translation>
 <translation id="2871813825302180988">Ši paskyra jau naudojama šiame įrenginyje.</translation>
 <translation id="1642505962779453775">Pastarasis ketvirtis</translation>
 <translation id="3323235640813116393">Leidžia saugoti puslapius kaip HTML: vieną teksto failą su HTML ir visais papildomais ištekliais.</translation>
@@ -4738,6 +4740,7 @@ Skaičiuojamas laikas, kol bus įkrauta</translation>
 <translation id="6934265752871836553">Naudokite moderniausią kodą, kad „Chrome“ greičiau gautų turinį. Dėl šio kelio
         pakeitimų gali būti sugadinta didelė dalis turinio.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Visada atidaryti naudojant „Adobe Reader“</translation>
 <translation id="8274359292107649245">Atidaryti „Chrome“ darbalaukio režimu</translation>
 <translation id="1571119610742640910">Fiksuotų pagrindinių fonų kūrimas.</translation>
 <translation id="6514565641373682518">Šiame puslapyje neleidžiamas pelės žymeklis.</translation>
@@ -4938,6 +4941,7 @@ Jei norite toliau naršyti, paspauskite bet kurį klavišą.</translation>
 <translation id="824543159844843373">Aktyvinti 3 paleidimo priemonės elementą</translation>
 <translation id="3819800052061700452">&amp;Visas ekranas</translation>
 <translation id="48607902311828362">Lėktuvo režimas</translation>
+<translation id="711840821796638741">Rodyti tvarkomas žymes</translation>
 <translation id="3360297538363969800">Spausdinti nepavyko. Patikrinkite spausdintuvą ir bandykite dar kartą.</translation>
 <translation id="680572642341004180">Įgalinti RLZ stebėjimą „<ph name="SHORT_PRODUCT_OS_NAME"/>“.</translation>
 <translation id="688797901999351107">Nebenaudokite panaikinto įkroviklio.</translation>
index ed565d5..fb17fe4 100644 (file)
@@ -521,7 +521,7 @@ Lūdzu, pārbaudiet savu e-pasta iesūtni (<ph name="ACCOUNT_EMAIL"/>), lai skat
 <translation id="413121957363593859">Komponenti</translation>
 <translation id="715487527529576698">Sākotnējais ķīniešu valodas režīms ir vienkāršotā ķīniešu valoda</translation>
 <translation id="6522350652862471760">Iespējot Google profila nosaukumu un ikonu</translation>
-<translation id="6181259999130430430">Iespējot ierīcei vieglo atbloķēšanu.</translation>
+<translation id="6181259999130430430">Iespējot ierīcei vienkāršo atbloķēšanu.</translation>
 <translation id="8703575177326907206">Jūsu savienojums ar <ph name="DOMAIN"/> nav kodēts.</translation>
 <translation id="6135622770221372891">Kanālu ID</translation>
 <translation id="8472623782143987204">hardware-backed</translation>
@@ -1946,8 +1946,7 @@ Kad esat izveidojis uzraudzītu lietotāju, varat pārvaldīt tā iestatījumus
 <translation id="2633212996805280240">Vai noņemt paplašinājumu <ph name="EXTENSION_NAME"/>?</translation>
 <translation id="9084064520949870008">Atvērt kā logu</translation>
 <translation id="4075084141581903552">E-pasta adresei <ph name="EMAIL_ADDRESS"/> ir pieejama automātiskā pierakstīšanās.</translation>
-<translation id="1293556467332435079"> Faili
-</translation>
+<translation id="1293556467332435079">Faili</translation>
 <translation id="2287590536030307392">Izslēdz visus bezvadu savienojumus.</translation>
 <translation id="8535658110233909809">Paplašinājuma atrašanās vieta</translation>
 <translation id="8116483400482790018">Pielāgota pareizrakstības vārdnīca</translation>
@@ -3334,7 +3333,7 @@ neparastus un nepareizus akreditācijas datus. Vai nu uzbrucējs mēģina uzdoti
 <translation id="5917011688104426363">Iez. adreses joslu mekl. rež-ā  </translation>
 <translation id="3269101346657272573">Ievadiet PIN.</translation>
 <translation id="2822854841007275488">Arābu</translation>
-<translation id="6559948977408379772">Šī ikona tiek rādīta, kad jūs un jūsu tālrunis atrodas tuvumā un ir pieejama vieglā atbloķēšana. Vienkārši noklikšķiniet, lai ieietu (parole nav nepieciešama).</translation>
+<translation id="6559948977408379772">Šī ikona tiek rādīta, kad jūs un jūsu tālrunis atrodas tuvumā un ir pieejama vienkāršā atbloķēšana. Vienkārši noklikšķiniet, lai ieietu (parole nav nepieciešama).</translation>
 <translation id="5857090052475505287">Jauna mape</translation>
 <translation id="7450732239874446337">Tīkla IO apturēta.</translation>
 <translation id="4003393903129308792">Vienas kopijas rastrētāja iespējošana.</translation>
@@ -3454,7 +3453,7 @@ Vēl jālādē: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
 <translation id="1526560967942511387">Dokuments bez nosaukuma</translation>
 <translation id="3979748722126423326">Iespējot <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA vai RSN)</translation>
-<translation id="7561031016893995297">Pārvaldiet vieglās atbloķēšanas ierīces sava konta iestatījumos.</translation>
+<translation id="7561031016893995297">Pārvaldiet vienkāršās atbloķēšanas ierīces sava konta iestatījumos.</translation>
 <translation id="2238379619048995541">Dati par frekvences stāvokli</translation>
 <translation id="4367133129601245178">K&amp;opēt attēla URL</translation>
 <translation id="6326175484149238433">Noņemt no pārlūka Chrome</translation>
@@ -3954,6 +3953,7 @@ Vēl jālādē: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
 <translation id="6460601847208524483">Atrast nākamo</translation>
 <translation id="397703832102027365">Notiek pabeigšana...</translation>
 <translation id="8146177459103116374">Ja esat jau reģistrējies šajā ierīcē, varat <ph name="LINK2_START"/>pierakstīties kā esošs lietotājs<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Rādīt pārvaldītās grāmatzīmes</translation>
 <translation id="4856478137399998590">Jūsu mobilo datu pakalpojums ir aktivizēts un gatavs lietošanai</translation>
 <translation id="3305389145870741612">Formatēšanas process var ilgt pāris sekundes. Lūdzu, uzgaidiet.</translation>
 <translation id="3648607100222897006">Šīs eksperimentālās funkcijas jebkurā laikā var mainīties, pārstāt darboties vai pazust. Mēs nesniedzam pilnīgi nekādas garantijas tam, kas var notikt, ja jūs ieslēdzat vienu no šiem eksperimentiem. Jūsu pārlūks var pat sabrukt. Nopietni runājot, pārlūks var izdzēst visus jūsu datus vai arī neparedzamā veidā var tikt pārkāpti drošības un konfidencialitātes noteikumi. Visi jūsu aktivizētie eksperimenti tiks aktivizēti visiem šī pārlūka lietotājiem. Lūdzu, esiet uzmanīgs!</translation>
@@ -3966,7 +3966,7 @@ Vēl jālādē: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
 <translation id="7564847347806291057">Pārtraukt procesu</translation>
 <translation id="7847212883280406910">Nospiediet Ctrl+Alt+S, lai pārslēgtos uz <ph name="IDS_SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="1607220950420093847">Jūsu konts, iespējams, ir dzēsts vai atspējots. Lūdzu, izrakstieties.</translation>
-<translation id="5613695965848159202">Anonīmi identifikācijas dati:</translation>
+<translation id="5613695965848159202">Anonīma indentitāte:</translation>
 <translation id="4331990704689932958">Operētājsistēma <ph name="PRODUCT_NAME"/> tiek atjaunināta automātiski, tādēļ jums vienmēr būs pieejama visjaunākā versija.</translation>
 <translation id="5159383109919732130"><ph name="BEGIN_BOLD"/>Vēl neatvienojiet ierīci!<ph name="END_BOLD"/>
    <ph name="LINE_BREAKS"/>
@@ -4190,7 +4190,7 @@ Vai vēlaties palaist rīku <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation
 <translation id="1639239467298939599">Notiek ielāde</translation>
 <translation id="5457599981699367932">Pārlūkot kā viesim</translation>
 <translation id="8525428584879632762">Iespējota meklēšanas rezultātu lapās vai vaicājuma ievades laikā</translation>
-<translation id="2487656424763972284">Vieglā atbloķēšana</translation>
+<translation id="2487656424763972284">Vienkāršā atbloķēšana</translation>
 <translation id="7047998246166230966">Rādītājs</translation>
 <translation id="743268637741709136">Atspējot meklēšanu ar balsi lietotņu palaidējā. Pēc atspējošanas lietotājs nevarēs veikt meklēšanu ar balsi.</translation>
 <translation id="3252266817569339921">Franču</translation>
@@ -4385,6 +4385,7 @@ Vai vēlaties palaist rīku <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation
 <translation id="6869402422344886127">Atzīmēta izvēles rūtiņa</translation>
 <translation id="3428010780253032925">Atspējot uz taisnstūra formu balstītu mērķu atlasi skatījumos</translation>
 <translation id="5637380810526272785">Ievades metode</translation>
+<translation id="3613134908380545408">Mapes “<ph name="FOLDER_NAME"/>” rādīšana</translation>
 <translation id="2837049386027881519">Savienojums bija jāizveido vēlreiz, izmantojot vecāku TLS vai SSL protokola versiju. Parasti tas nozīmē, ka servera programmatūra ir novecojusi un ir iespējamas citas ar drošību saistītas problēmas.</translation>
 <translation id="404928562651467259">BRĪDINĀJUMS</translation>
 <translation id="4289300219472526559">Sākt runāt</translation>
@@ -4454,7 +4455,7 @@ Vai vēlaties palaist rīku <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation
 <translation id="8148264977957212129">Pinyin valodas ievades metode</translation>
 <translation id="2288278176040912387">Ierakstu atskaņotājs</translation>
 <translation id="7772032839648071052">Apstipriniet ieejas frāzi</translation>
-<translation id="3676582787770338561">Iespējot vieglo atbloķēšanu šai ierīcei: <ph name="DEVICE_TYPE"/>.</translation>
+<translation id="3676582787770338561">Iespējot vienkāršo atbloķēšanu šai ierīcei: <ph name="DEVICE_TYPE"/>.</translation>
 <translation id="2871813825302180988">Šis konts jau tiek izmantots šajā ierīcē.</translation>
 <translation id="1642505962779453775">Pēdējais ceturksnis</translation>
 <translation id="3323235640813116393">Ļauj saglabāt lapas kā MHTML: vienu teksta failu ar HTML un visiem apakšresursiem.</translation>
@@ -4718,6 +4719,7 @@ Tiek rēķināts atlikušais uzlādes laiks</translation>
 <translation id="6934265752871836553">Izmantojiet kodu “bleeding-edge”, lai Chrome ātrāk atveidotu saturu. Veicot izmaiņas
         pēc šī ceļa, visticamāk, tiks bojāta liela satura daļa.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Vienmēr atvērt programmā Adobe Reader</translation>
 <translation id="8274359292107649245">Atvērt pārlūku Chrome darbvirsmā</translation>
 <translation id="1571119610742640910">Fiksētu saknes fonu kompozicionēšana.</translation>
 <translation id="6514565641373682518">Šī lapa ir atspējojusi jūsu peles kursoru.</translation>
@@ -4918,6 +4920,7 @@ Lai turpinātu skatīšanu, nospiediet jebkuru taustiņu.</translation>
 <translation id="824543159844843373">Aktivizēt 3. palaidēja vienumu</translation>
 <translation id="3819800052061700452">&amp;Pilnekrāna režīms</translation>
 <translation id="48607902311828362">Lidmašīnas režīms</translation>
+<translation id="711840821796638741">Pārvaldīto grāmatzīmju rādīšana</translation>
 <translation id="3360297538363969800">Drukāšana neizdevās. Lūdzu, pārbaudiet printeri un mēģiniet vēlreiz.</translation>
 <translation id="680572642341004180">Iespējot RLZ izsekošanu operētājsistēmā <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Lūdzu, pārtrauciet atsauktās uzlādes ierīces izmantošanu.</translation>
index c3c5d63..85d68bd 100644 (file)
@@ -2924,7 +2924,7 @@ Google Chrome മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കും.
 <translation id="7347751611463936647">ഈ വിപുലീകരണം ഉപയോഗിക്കുക, &quot;<ph name="EXTENSION_KEYWORD"/>&quot; ടൈപ്പുചെയ്യുക, തുടര്‍ന്ന് TAB, തുടര്‍ന്ന് നിങ്ങളുടെ കമാന്‍റ് അല്ലെങ്കില്‍ തിരയല്‍.</translation>
 <translation id="878431691778285679">നിങ്ങൾ ഇതിനകം ആ പേരിൽ ഒരു ഉപയോക്താവിനെ നിയന്ത്രിക്കുന്നതുപോലെ തോന്നുന്നു.<ph name="LINE_BREAK"/>ഈ ഉപകരണത്തിലേക്ക് <ph name="BEGIN_LINK"/><ph name="PROFILE_NAME"/> ഇമ്പോർട്ടുചെയ്യുന്നതിന് നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടോ<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> എന്നതിന് ഒരു മൈക്രോഫോൺ ഉപയോഗിക്കണം.</translation>
-<translation id="2805756323405976993">à´\85à´ªàµ\8dലിà´\95àµ\8dà´\95àµ\87à´·à´¨àµ\8dâ\80\8dà´¸àµ\8d</translation>
+<translation id="2805756323405976993">à´\86à´ªàµ\8dà´¸àµ\8d</translation>
 <translation id="5151511998946489774">ഈ വെബ്സൈറ്റിന്റെ ഐഡന്റിറ്റി <ph name="ISSUER"/> സ്ഥിരീകരിച്ചതും എല്ലാവർക്കും ഓഡിറ്റുചെയ്യാനാവുന്നതുമാണ്.</translation>
 <translation id="1608626060424371292">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുക</translation>
 <translation id="2779552785085366231">ഈ പേജ് അപ്ലിക്കേഷൻ ലോഞ്ചറിലേക്ക് ചേർക്കാം</translation>
@@ -3971,6 +3971,7 @@ Google Chrome മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കും.
 <translation id="6460601847208524483">അടുത്തത് കണ്ടെത്തുക</translation>
 <translation id="397703832102027365">തീര്‍ച്ചപ്പെടുത്തുന്നു...</translation>
 <translation id="8146177459103116374">നിങ്ങൾ ഇതിനകം ഈ ഉപകരണത്തിൽ രജിസ്റ്റർ ചെയ്‌തെങ്കിൽ, <ph name="LINK2_START"/>നിലവിലുള്ള ഉപയോക്താവായി സൈൻ ഇൻ ചെയ്യാൻ<ph name="LINK2_END"/> നിങ്ങൾക്ക് കഴിയും.</translation>
+<translation id="5072836811783999860">നിയന്ത്രിത ബുക്ക്മാർക്കുകൾ കാണിക്കുക</translation>
 <translation id="4856478137399998590">നിങ്ങളുടെ ഡാറ്റ സേവനം സജീവമാക്കി ഒപ്പം ഉപയോഗക്ഷമവുമായി</translation>
 <translation id="3305389145870741612">ഫോർമാറ്റിംഗ് പ്രക്രിയയ്ക്ക് കുറച്ച് നിമിഷങ്ങളെടുക്കും. ദയവായി കാത്തിരിക്കുക.</translation>
 <translation id="3648607100222897006">ഈ പരീക്ഷണ സവിശേഷതകൾ ഏത് സമയത്തും മാറുകയോ തകരാറിലാകുകയോ അപ്രത്യക്ഷമാവുകയോ ചെയ്യാം. നിങ്ങൾ ഈ പരീക്ഷണങ്ങളിലൊന്ന് ഓൺ ചെയ്താൽ എന്ത് സംഭവിക്കുമെന്നത് സംബന്ധിച്ച് ഞങ്ങൾ പൂർണ്ണമായ ഒരു ഉറപ്പും നൽകില്ല, മാത്രമല്ല നിങ്ങളുടെ ബ്രൌസർ ആക്സ്മികമായി തകരാറിലാകുക പോലും ചെയ്തേക്കാം. തമാശ നിർത്തൂ, നിങ്ങളുടെ എല്ലാ ഡാറ്റയെയും ബ്രൌസർ ഇല്ലാതാക്കിയേക്കാം, അല്ലെങ്കിൽ നിങ്ങളുടെ സുരക്ഷയും സ്വകാര്യതയും അപ്രതീക്ഷിതമായ രീതിയിൽ തകരാറിലായേക്കാം. നിങ്ങൾ പ്രാപ്തമാക്കുന്ന ഏത് പരീക്ഷണങ്ങളും ഈ ബ്രൗസറിന്റെ എല്ലാ ഉപയോക്താക്കൾക്കുമായി പ്രാപ്തമാക്കിയിരിക്കും. ദയവായി ശ്രദ്ധയോടെ തുടരുക.</translation>
@@ -4402,6 +4403,7 @@ Google Chrome മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കും.
 <translation id="6869402422344886127">ചെക്ക്‌ബോക്സില്‍ ചെക്കടയാളമിട്ടു</translation>
 <translation id="3428010780253032925">കാഴ്‌ചകളിൽ ദീർഘചതുരം അധിഷ്‌തിതമാക്കിയ ടാർഗെറ്റുചെയ്യൽ പ്രവർത്തനരഹിതമാക്കുക</translation>
 <translation id="5637380810526272785">ഇന്‍‌പുട്ട് രീതി</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> എന്നത് കാണിക്കുക</translation>
 <translation id="2837049386027881519">TLS അല്ലെങ്കിൽ SSL പ്രോട്ടോക്കോളിന്റെ ഒരു പഴയ പതിപ്പ് ഉപയോഗിച്ച് കണക്ഷനായി വീണ്ടും ശ്രമിക്കേണ്ടതുണ്ട്. സെർവർ വളരെ പഴയ ഒരു സോഫ്റ്റ്‌വെയർ ഉപയോഗിക്കുന്നതിനാൽ സുരക്ഷാ പ്രശ്‌നങ്ങൾക്ക് ഇടയുണ്ടാകാമെന്നതാണ് സാധാരണ ഗതിയിൽ ഇതിനർത്ഥം.</translation>
 <translation id="404928562651467259">മുന്നറിയിപ്പ്</translation>
 <translation id="4289300219472526559">സംഭാഷണം ആരംഭിക്കുക</translation>
@@ -4736,6 +4738,7 @@ Google Chrome മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കും.
 <translation id="6934265752871836553">Chrome-നെ ഉള്ളടക്കം വേഗത്തിൽ മനസ്സിലാക്കുന്ന തരത്തിലാക്കുന്നതിന് ബ്ലീഡിംഗ്-എഡ്ജ് കോഡ് ഉപയോഗിക്കുക. ഈ പാത്തിൽ വരുത്തുന്ന മാറ്റങ്ങൾ
         ഉള്ളടക്കത്തിലെ വലിയൊരു ഭാഗം നഷ്‌ടപ്പെടുത്തുന്നതിനുള്ള സാധ്യത വർദ്ധിപ്പിക്കുന്നു.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">എപ്പോഴും Adobe Reader-ൽ തുറക്കുക</translation>
 <translation id="8274359292107649245">ഡെസ്ക്‌ടോപ്പിൽ Chrome തുറക്കുക</translation>
 <translation id="1571119610742640910">പരിഹരിച്ച റൂട്ട് പശ്ചാത്തലങ്ങൾക്കായി കമ്പോസിറ്റുചെയ്യുന്നു.</translation>
 <translation id="6514565641373682518">ഈ പേജ് നിങ്ങളുടെ മൗസ് കഴ്‌സർ അപ്രാപ്‌തമാക്കി.</translation>
@@ -4936,6 +4939,7 @@ Google Chrome മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കും.
 <translation id="824543159844843373">ലോഞ്ചർ ഇനം 3 സജീവമാക്കുക</translation>
 <translation id="3819800052061700452">&amp;പൂര്‍ണ്ണ സ്‌ക്രീന്‍</translation>
 <translation id="48607902311828362">എയർപ്ലെയിൻ മോഡ്</translation>
+<translation id="711840821796638741">നിയന്ത്രിത ബുക്ക്മാർക്കുകൾ കാണിക്കുക</translation>
 <translation id="3360297538363969800">പ്രിന്റുചെയ്യൽ പരാജയപ്പെട്ടു. നിങ്ങളുടെ പ്രിന്റർ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/>-ൽ RLZ ട്രാക്കുചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="688797901999351107">മടക്കിനൽകേണ്ട ചാർജർ ഉപയോഗിക്കുന്നത് നിർത്തുക.</translation>
index 3833aef..40f89dc 100644 (file)
 <translation id="6460601847208524483">पुढील शोधा</translation>
 <translation id="397703832102027365">पूर्ण करीत आहे...</translation>
 <translation id="8146177459103116374">आपण या डिव्हाइसवर आधीपासूनच नोंदणीकृत असल्यास, आपण <ph name="LINK2_START"/>विद्यमान वापरकर्ता म्हणून साइन इन<ph name="LINK2_END"/> करु शकता.</translation>
+<translation id="5072836811783999860">व्यवस्थापित बुकमार्क दर्शवा</translation>
 <translation id="4856478137399998590">आपली मोबाइल सेवा सक्रिय झाली आणि वापरण्यासाठी तयार आहे</translation>
 <translation id="3305389145870741612">स्वरूपन प्रक्रियेस दोन सेकंद लागू शकतात. कृपया प्रतीक्षा करा.</translation>
 <translation id="3648607100222897006">ही प्रायोगिक वैशिष्ट्ये कधीही बदलू, खंडित होऊ किंवा अदृश्य होऊ शकतात. आपण या प्रयोगांपैकी एकही चालू ठेवल्यास काय होऊ शकते याबद्दल आम्ही निश्चितपणे कोणतीही हमी व्यक्त करत नाही आणि आपला ब्राउझर कदाचित आपोआप पेटू शकतो. चेष्टा सोडून द्या, आपला ब्राउझर आपला सर्व डेटा हटवू शकतो, किंवा आपली सुरक्षा आणि गोपनीयतेशी अनपेक्षित मार्गांनी तडजोड केली जाऊ शकते. आपण सक्षम केलेले कोणतेही प्रयोग या ब्राउझरच्या सर्व वापरकर्त्यांसाठी सक्षम केले जातील. कृपया सावधगिरीने पुढे जा.</translation>
 <translation id="6869402422344886127">चेक बॉक्स तपासले</translation>
 <translation id="3428010780253032925">दृश्यांमधील आयात-आधारित लक्ष्य अक्षम करा</translation>
 <translation id="5637380810526272785">इनपुट पद्धत</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> दर्शवा</translation>
 <translation id="2837049386027881519">TLS किंवा SSL प्रोटॉकॉलची जुनी आवृत्ती वापरून कनेक्शन पुनर्प्रयत्न केला. असे विशेषकरून तेव्हाच होते जेव्हा सर्व्हर खूपच जुने सॉफ्टवेअर वापरत आहे आणि इतर सुरक्षितता समस्या येत असू शकतात.</translation>
 <translation id="404928562651467259">चेतावणी:</translation>
 <translation id="4289300219472526559">बोलणे प्रारंभ करा</translation>
 <translation id="6934265752871836553">Chrome अधिक जलदपणे सामग्री काढण्यास लावण्यासाठी ब्लीडिंग-एज कोड वापरा. या पथामागील
         बदलांची भरपूर सामग्री खंडित करण्याची शक्यता असते.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Adobe Reader मध्ये नेहमी उघडा</translation>
 <translation id="8274359292107649245">डेस्कटॉपवर Chrome उघडा</translation>
 <translation id="1571119610742640910">निश्चित मूळ पार्श्वभूमीकरिता संयुक्तीकरण.</translation>
 <translation id="6514565641373682518">या पृष्‍ठाने आपला माऊस कर्सर अक्षम केला आहे.</translation>
 <translation id="824543159844843373">लाँचर आयटम 3 सक्रिय करा</translation>
 <translation id="3819800052061700452">&amp;पूर्ण स्क्रीन</translation>
 <translation id="48607902311828362">विमान मोड</translation>
+<translation id="711840821796638741">व्यवस्थापित बुकमार्क दर्शवा</translation>
 <translation id="3360297538363969800">मुद्रण अयशस्वी. कृपया आपला प्रिंटर तपासा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> वरील RLZ ट्रॅकिंग सक्षम करा.</translation>
 <translation id="688797901999351107">कृपया परत मागवलेले चार्जर वापरणे थांबवा.</translation>
index a67219b..60784f4 100644 (file)
@@ -3983,6 +3983,7 @@ luar biasa dan salah. Sama ada penyerang sedang cuba menyamar sebagai <ph name="
 <translation id="6460601847208524483">Cari Seterusnya</translation>
 <translation id="397703832102027365">Menyelesaikan...</translation>
 <translation id="8146177459103116374">Jika anda telah mendaftar pada peranti ini, anda boleh <ph name="LINK2_START"/>log masuk sebagai pengguna sedia ada<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Tunjukkan penanda halaman terurus</translation>
 <translation id="4856478137399998590">Perkhidmatan data mudah alih anda diaktifkan dan sedia untuk digunakan</translation>
 <translation id="3305389145870741612">Proses memformat boleh mengambil masa beberapa saat. Sila tunggu.</translation>
 <translation id="3648607100222897006">Ciri percubaan ini mungkin berubah, pecah atau hilang pada bila-bila masa. Kami sama sekali tidak menjamin mengenai apa yang akan berlaku jika anda menghidupkan salah satu percubaan ini, dan penyemak imbas anda juga mungkin terbakar secara spontan. Saya tidak melawak, penyemak imbas anda boleh memadamkan semua data, atau keselamatan dan privasi anda boleh terjejas dalam cara yang tidak dijangka. Sebarang percubaan yang anda dayakan akan dilumpuhkan untuk semua pengguna penyemak imbas ini. Sila teruskan dengan berhati-hati.</translation>
@@ -4413,6 +4414,7 @@ luar biasa dan salah. Sama ada penyerang sedang cuba menyamar sebagai <ph name="
 <translation id="6869402422344886127">Kotak pilihan ditandakan</translation>
 <translation id="3428010780253032925">Lumpuhkan penyasaran berdasarkan segi empat bujur dalam paparan</translation>
 <translation id="5637380810526272785">Kaedah Masukan</translation>
+<translation id="3613134908380545408">Tunjukkan <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Sambungan perlu dicuba semula menggunakan versi protokol TLS atau SSL yang lebih lama. Biasanya, perkara ini bermaksud bahawa pelayan menggunakan perisian yang sangat lama dan mungkin mempunyai isu keselamatan yang lain.</translation>
 <translation id="404928562651467259">AMARAN</translation>
 <translation id="4289300219472526559">Mula Bercakap</translation>
@@ -4613,7 +4615,7 @@ luar biasa dan salah. Sama ada penyerang sedang cuba menyamar sebagai <ph name="
 <translation id="3004391367407090544">Sila datang lagi kemudian</translation>
 <translation id="751288520640551775">Cipta pengguna</translation>
 <translation id="6262654738522632143">Penyegerakan latar belakang ServiceWorker membenarkan ServiceWorker menghantar mesej dan mengemas kini sumber walaupun semasa halaman adalah di  latar belakang.</translation>
-<translation id="8698171900303917290">Masalah memasang?</translation>
+<translation id="8698171900303917290">Masalah pemasangan?</translation>
 <translation id="2440443888409942524">Kaedah input Pinyin (untuk papan kekunci AS Dvorak)</translation>
 <translation id="830868413617744215">Beta</translation>
 <translation id="2501797496290880632">Taipkan pintasan</translation>
@@ -4746,6 +4748,7 @@ Mengira masa sehingga penuh</translation>
 <translation id="6934265752871836553">Gunakan kod terbaharu untuk membuatkan Chrome mengatur kandungan dengan lebih pantas. Perubahan
         di belakang laluan ini amat berkemungkinan akan memisahkan banyak kandungan.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Sentiasa buka dalam Adobe Reader</translation>
 <translation id="8274359292107649245">Buka Chrome pada desktop</translation>
 <translation id="1571119610742640910">Penggubahan untuk latar belakang punca tetap.</translation>
 <translation id="6514565641373682518">Halaman ini telah melumpuhkan kursor tetikus anda.</translation>
@@ -4945,6 +4948,7 @@ Tekan sebarang kekunci untuk terus meneroka.</translation>
 <translation id="824543159844843373">Aktifkan item pelancar 3</translation>
 <translation id="3819800052061700452">&amp;Skrin penuh</translation>
 <translation id="48607902311828362">Mod kapal terbang</translation>
+<translation id="711840821796638741">Tunjukkan Penanda Halaman Terurus</translation>
 <translation id="3360297538363969800">Pencetakan gagal. Sila periksa pencetak anda dan cuba lagi.</translation>
 <translation id="680572642341004180">Dayakan pengesan RLZ pada <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Tolong berhenti menggunakan pengecas yang dipanggil balik.</translation>
index 3638fc2..e3c87ac 100644 (file)
 <translation id="8034955203865359138">Geen items gevonden.</translation>
 <translation id="9130015405878219958">Ongeldige modus opgegeven.</translation>
 <translation id="6615807189585243369"><ph name="BURNT_AMOUNT"/> van <ph name="TOTAL_SIZE"/> gekopieerd</translation>
-<translation id="7501143156951160001">Als je geen Google-account heeft, kun je nu <ph name="LINK_START"/>een Google-account maken<ph name="LINK_END"/>.</translation>
+<translation id="7501143156951160001">Als je geen Google-account hebt, kun je nu <ph name="LINK_START"/>een Google-account maken<ph name="LINK_END"/>.</translation>
 <translation id="4950138595962845479">Opties...</translation>
 <translation id="4653235815000740718">Er is een probleem opgetreden tijdens het maken van het OS-herstelmedium. Het gebruikte opslagapparaat kan niet worden gevonden.</translation>
 <translation id="1407489512183974736">Midden bijsnijden</translation>
@@ -724,7 +724,7 @@ Alle gebruikers moet uitloggen om door te gaan.</translation>
 <translation id="3984921062031549150">Renderer loopt vast</translation>
 <translation id="7925285046818567682">Wachten op <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Cameratoegang altijd blokkeren</translation>
-<translation id="2964845078799970531">Met 'Eenvoudig ontgrendelen' kun je je Chromebook ontgrendelen wanneer deze in de buurt van je telefoon is.</translation>
+<translation id="2964845078799970531">Met Eenvoudig ontgrendelen kun je je Chromebook ontgrendelen wanneer deze in de buurt van je telefoon is.</translation>
 <translation id="5053803681436838483">Nieuw verzendadres…</translation>
 <translation id="5952256601775839173">Drie keer met de vinger klikken op de touchpad inschakelen.</translation>
 <translation id="3280237271814976245">Opslaan &amp;als...</translation>
@@ -1306,7 +1306,7 @@ Resterende tijd berekenen</translation>
 <translation id="9033857511263905942">&amp;Plakken</translation>
 <translation id="1028690605877243613">De alternatieve indeling van Toolbar gebruiken.</translation>
 <translation id="6736045498964449756">De wachtwoorden komen niet overeen.</translation>
-<translation id="4558985768677321342">'Eenvoudig ontgrendelen' inschakelen.</translation>
+<translation id="4558985768677321342">Eenvoudig ontgrendelen inschakelen.</translation>
 <translation id="1221825588892235038">Alleen selectie</translation>
 <translation id="2227939492629426903">Schakelt het nieuwe avatarmenu in. Indien gecombineerd met beheer van nieuwe profielen wordt het avatarmenu voor het beheren van nieuwe profielen weergegeven. Anders wordt een vernieuwd avatarmenu weergegeven met dezelfde functionaliteit als het oude menu, evenals een trainingskaart boven aan het scherm waarin de gebruiker wordt gevraagd de gebruikersinterface voor het beheren van nieuwe profielen te proberen.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> heeft de toegang tot <ph name="HOST_NAME"/> geblokkeerd. Deze website is gemeld als phishingwebsite.</translation>
@@ -3975,6 +3975,7 @@ Zorg ervoor dat je geen gevoelige informatie weergeeft.</translation>
 <translation id="6460601847208524483">Zoek volgende</translation>
 <translation id="397703832102027365">Wordt voltooid...</translation>
 <translation id="8146177459103116374">Als je al bent geregistreerd op dit apparaat, kun je <ph name="LINK2_START"/>inloggen als een bestaande gebruiker<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Beheerde bladwijzers weergeven</translation>
 <translation id="4856478137399998590">Je mobiele netwerk is actief en klaar voor gebruik</translation>
 <translation id="3305389145870741612">Het formatteren kan enkele seconden duren. Een ogenblik geduld.</translation>
 <translation id="3648607100222897006">Deze experimentele functies kunnen op elk moment worden aangepast, vastlopen of verdwijnen. We bieden geen enkele garantie aangaande wat er gebeurt als je een van deze experimenten inschakelt: je browser kan zelfs spontaan in brand vliegen. Alle gekheid op een stokje, het is mogelijk dat alle gegevens in je browser worden gewist, of dat je veiligheid en privacy op onverwachte manieren risico lopen. Experimenten die je inschakelt, worden ingeschakeld voor alle gebruikers van deze browser. Let dus goed op wat je doet.</translation>
@@ -4407,6 +4408,7 @@ Zorg ervoor dat je geen gevoelige informatie weergeeft.</translation>
 <translation id="6869402422344886127">Aangevinkt selectievakje</translation>
 <translation id="3428010780253032925">Targeting op basis van rechthoeken in weergaven uitschakelen</translation>
 <translation id="5637380810526272785">Invoermethode</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> weergeven</translation>
 <translation id="2837049386027881519">Er moest opnieuw worden geprobeerd verbinding te maken met een oudere versie van het TLS- of SSL-protocol. Dit betekent meestal dat de server zeer oude software gebruikt en mogelijk andere beveiligingsproblemen heeft.</translation>
 <translation id="404928562651467259">WAARSCHUWING</translation>
 <translation id="4289300219472526559">Inspreken starten</translation>
@@ -4739,6 +4741,7 @@ Tijd berekenen tot vol</translation>
 <translation id="6934265752871836553">Gebruik uiterst geavanceerde code om Chrome sneller inhoud te laten weergeven. Met de wijzigingen
         in dit pad wordt hoogstwaarschijnlijk veel inhoud onderbroken.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Altijd in Adobe Reader openen</translation>
 <translation id="8274359292107649245">Chrome openen op desktop</translation>
 <translation id="1571119610742640910">Samenstelling voor vaste basisachtergronden.</translation>
 <translation id="6514565641373682518">Deze pagina heeft je muisaanwijzer uitgeschakeld.</translation>
@@ -4939,6 +4942,7 @@ Druk op een toets om door te gaan met verkennen.</translation>
 <translation id="824543159844843373">Item 3 in het opstartprogramma activeren</translation>
 <translation id="3819800052061700452">&amp;Volledig scherm</translation>
 <translation id="48607902311828362">Vliegmodus</translation>
+<translation id="711840821796638741">Beheerde bladwijzers weergeven</translation>
 <translation id="3360297538363969800">Afdrukken is mislukt. Controleer je printer en probeer het opnieuw.</translation>
 <translation id="680572642341004180">Bijhouden met RLZ inschakelen voor <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Stop met het gebruiken van de teruggeroepen oplader.</translation>
index 441bda2..6280972 100644 (file)
@@ -5,7 +5,7 @@
 <translation id="6879617193011158416">Vis eller skjul bokmerkefelt</translation>
 <translation id="4590324241397107707">Databaselagring</translation>
 <translation id="9056953843249698117">Butikk</translation>
-<translation id="6431217872648827691">Alle dataene ble kryptert med Google-passordet ditt fra den <ph name="TIME"/></translation>
+<translation id="6431217872648827691">Alle dataene ble kryptert med Google-passordet ditt fra og med <ph name="TIME"/></translation>
 <translation id="335581015389089642">Tale</translation>
 <translation id="1890570400853666479">Bruk det nye eksperimentelle galleriet i stedet for den stabile versjonen.</translation>
 <translation id="8206745257863499010">Plystre</translation>
@@ -52,7 +52,7 @@
 <translation id="7900476766547206086">Passord er nødvendig for påloggede brukere, fordi én eller flere brukere har denne innstillingen aktivert.</translation>
 <translation id="8870272765758621889">Dette er en administrert bruker som administreres av <ph name="CUSTODIAN_EMAIL"/>. Påloggingsinformasjonen for kontoen din er utløpt.</translation>
 <translation id="3300394989536077382">Signert av</translation>
-<translation id="654233263479157500">Bruk en nettjeneste til å løse problemer med navigasjonsfeil</translation>
+<translation id="654233263479157500">Bruk en nettjeneste til å løse problemer med navigeringsfeil</translation>
 <translation id="3792890930871100565">Koble fra skrivere</translation>
 <translation id="5378437846548426165">Bytt mellom ulike versjoner av TLS-/SSL-advarselen.</translation>
 <translation id="6476748132434603124"><ph name="SITE"/> har bedt Chrome om å blokkere eventuelle sertifikater med feil, men sertifikatet Chrome mottok under denne tilkoblingen, inneholder en feil.</translation>
@@ -70,7 +70,7 @@
 <translation id="7409233648990234464">Start på nytt og bruk Powerwash</translation>
 <translation id="7428534988046001922">Følgende programmer er nå installert:</translation>
 <translation id="787386463582943251">Legg til e-postadresse</translation>
-<translation id="2833791489321462313">Krev passord for å vekke fra sovemodus</translation>
+<translation id="2833791489321462313">Krev passord for å vekke fra hvilemodus</translation>
 <translation id="8208216423136871611">Ikke lagre</translation>
 <translation id="4405141258442788789">Operasjonen ble tidsavbrutt.</translation>
 <translation id="5048179823246820836">Nordisk</translation>
 <translation id="4654488276758583406">Veldig liten</translation>
 <translation id="6647228709620733774">Nettadresse for tilbakekalling av Netscape-autoritetssertifikat</translation>
 <translation id="546411240573627095">Talltastaturstil</translation>
-<translation id="2310216585920710503">Konfigurer enkel opplåsing</translation>
+<translation id="2310216585920710503">Konfigurer Enkel opplåsing</translation>
 <translation id="8425213833346101688">Endre</translation>
 <translation id="2972581237482394796">Gjø&amp;r om</translation>
 <translation id="5895138241574237353">Start på nytt</translation>
 <translation id="528468243742722775">End</translation>
 <translation id="1723824996674794290">&amp;Nytt vindu</translation>
 <translation id="1313405956111467313">Automatisk konfigurasjon av mellomtjener</translation>
-<translation id="3527276236624876118">En overvåket bruker ved navn <ph name="USER_DISPLAY_NAME"/> er opprettet.</translation>
+<translation id="3527276236624876118">En administrert bruker med navnet <ph name="USER_DISPLAY_NAME"/> er opprettet.</translation>
 <translation id="4367782753568896354">Vi kunne ikke installere følgende:</translation>
 <translation id="1589055389569595240">Vis stavekontroll og grammatikk</translation>
 <translation id="7017587484910029005">Skriv inn tegnene du ser i bildet nedenfor.</translation>
 <translation id="3899968422636198696"><ph name="ORGNAME"/> <ph name="HOSTNAME"/></translation>
 <translation id="2391762656119864333">Opphev</translation>
 <translation id="3315158641124845231">Skjul <ph name="PRODUCT_NAME"/></translation>
-<translation id="7069168971636881066">Minst én konto må finnes på denne enheten før du oppretter en overvåket bruker.</translation>
+<translation id="7069168971636881066">Minst én konto må finnes på denne enheten før du oppretter en administrert bruker.</translation>
 <translation id="7766807826975222231">Få en innføring</translation>
 <translation id="2269471294353474737"><ph name="MARKUP_1"/>Tilgang til filer uansett hvor du er, til og med uten nett.<ph name="MARKUP_2"/>
         Filer i Google Disk er oppdatert og tilgjengelige fra hvilken som helst enhet.<ph name="MARKUP_3"/>
 <translation id="4920887663447894854">Følgende nettsteder har blitt nektet tillatelse til å spore posisjonen din på siden:</translation>
 <translation id="8133676275609324831">&amp;Vis i mappe</translation>
 <translation id="302014277942214887">Skriv inn app-ID-en eller nettadressen til nettbutikken.</translation>
-<translation id="26224892172169984">Ikke tillat nettsteder å behandle protokoller</translation>
+<translation id="26224892172169984">Ikke tillat noen nettsteder å behandle protokoller</translation>
 <translation id="645705751491738698">Fortsett blokkering av JavaScript</translation>
 <translation id="9177556055091995297">Administrer kredittkort</translation>
 <translation id="4780321648949301421">L&amp;agre side som</translation>
-<translation id="8630903300770275248">Importer den overvåkede brukeren</translation>
+<translation id="8630903300770275248">Importér den administrerte brukeren</translation>
 <translation id="4552678318981539154">Kjøp mer lagringsplass</translation>
 <translation id="5780066559993805332">(Best)</translation>
 <translation id="3011284594919057757">Om Flash</translation>
 <translation id="1510030919967934016">Denne siden har blitt nektet tillatelse til å spore posisjonen din.</translation>
 <translation id="5748743223699164725">Aktiver eksperimentelle nettplattform-funksjoner som er under utvikling.</translation>
 <translation id="8110513421455578152">Angi standardhøyden for paneler</translation>
-<translation id="7002454948392136538">Velg administratoren for denne overvåkede brukeren</translation>
+<translation id="7002454948392136538">Velg administratoren for denne administrerte brukeren</translation>
 <translation id="4640525840053037973">Logg på med Google-kontoen din</translation>
 <translation id="4923279099980110923">Ja, jeg ønsker å hjelpe</translation>
 <translation id="5255315797444241226">Passordet du skrev inn, er feil.</translation>
 <translation id="5245965967288377800">WiMAX-nettverk</translation>
 <translation id="40027638859996362">Ordforflytning</translation>
 <translation id="3522708245912499433">Portugisisk</translation>
-<translation id="6303187936217840894">Nettleserinnstillingene dine gjenopprettes til opprinnelig standard. Dette tilbakestiller startsiden, Ny fane-siden og søkemotoren – i tillegg til at utvidelser deaktiveres og at festede faner løses ut. Tilbakestillingen fjerner også andre midlertidige eller bufrede data, som informasjonskapsler og innholds- og nettstedsdata.</translation>
+<translation id="6303187936217840894">Nettleserinnstillingene dine gjenopprettes til opprinnelig standard. Dette tilbakestiller startsiden, Ny fane-siden og søkemotoren – i tillegg til at utvidelser deaktiveres og at festede faner løsnes. Tilbakestillingen fjerner også andre midlertidige eller bufrede data, som informasjonskapsler og innholds- og nettstedsdata.</translation>
 <translation id="6928441285542626375">Aktiver TCP Fast Open</translation>
 <translation id="7792388396321542707">Stopp deling</translation>
 <translation id="5463275305984126951">Indeks for <ph name="LOCATION"/></translation>
 <translation id="8034304765210371109">Aktiver den eksperimentelle versjonen av appvelgeren.</translation>
-<translation id="8959810181433034287">Den overvåkede brukeren må bruke dette passordet til å logge seg på, så velg et sikkert passord, og husk å formidle det til den overvåkede brukeren.</translation>
+<translation id="8959810181433034287">Den administrerte brukeren må bruke dette passordet til å logge seg på, så velg et sikkert passord, og husk å formidle det til den administrerte brukeren.</translation>
 <translation id="5154917547274118687">Minne</translation>
 <translation id="1493492096534259649">Dette språket kan ikke brukes til stavekontroll</translation>
 <translation id="6628463337424475685"><ph name="ENGINE"/> Søk</translation>
 <translation id="3382073616108123819">Beklager. Systemet kunne ikke fastslå enhetsidentifikatorer for denne enheten.</translation>
 <translation id="9041603713188951722">Vis innstillingene i et vindu</translation>
 <translation id="5419294236999569767">Systemtid</translation>
-<translation id="8158300065514217730">Logg på for å importere overvåkede brukere</translation>
+<translation id="8158300065514217730">Logg på for å importere administrerte brukere</translation>
 <translation id="2789486458103222910">OK</translation>
 <translation id="4792711294155034829">&amp;Rapporter et problem</translation>
 <translation id="5819484510464120153">Opprett &amp;snarveier til programmer...</translation>
 <translation id="4218259925454408822">Logg på en annen konto</translation>
 <translation id="2178614541317717477">Sertifiseringsinstans-kompromiss</translation>
 <translation id="6464076120278668805">Deaktiver ignoreringen av autocomplete='off'</translation>
-<translation id="4449935293120761385">Om funksjonen Autofyll</translation>
+<translation id="4449935293120761385">Om autofyll-funksjonen</translation>
 <translation id="4194570336751258953">Aktiver berøringsklikk</translation>
 <translation id="6066742401428748382">Tilgang til nettstedet ble avvist</translation>
 <translation id="5111692334209731439">&amp;Bokmerkebehandling</translation>
 <translation id="5661272705528507004">Dette SIM-kortet er deaktivert og kan ikke brukes. Kontakt tjenesteleverandøren og be om nytt SIM-kort.</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
 <translation id="3583413473134066075">Tre... To... En...</translation>
-<translation id="6585234750898046415">Velg et bilde som vises på påloggingsskjermen til kontoen.</translation>
+<translation id="6585234750898046415">Velg et bilde som vises på påloggingsskjermen for kontoen.</translation>
 <translation id="7957054228628133943">Administrer blokkering av forgrunnsvinduer</translation>
 <translation id="179767530217573436">de fire siste ukene</translation>
 <translation id="2279770628980885996">En uventet tilstand oppstod mens tjeneren forsøkte å utføre forespørselen.</translation>
@@ -481,7 +481,7 @@ Sjekk e-posten din på <ph name="ACCOUNT_EMAIL"/> for instruksjoner om dette og
 <translation id="3873139305050062481">I&amp;nspiser element</translation>
 <translation id="7445762425076701745">Identiteten til tjernen du er tilkoblet kan ikke valideres. Du er tilkoblet en tjener som bruker et navn som kun er gyldig i ditt nettverk, som en ekstern sertifiseringsinstans ikke har noen mulighet til å validere eierskap for. Siden enkelte sertifiseringsinstanser likevel utsteder sertifikater for disse navnene, er det umulig å sikre at du er tilkoblet ønsket nettsted og ikke en angriper.</translation>
 <translation id="1556537182262721003">Katalogen over utvidelser kan ikke flyttes til profilen.</translation>
-<translation id="2946640296642327832">Aktiver Bluetooth</translation>
+<translation id="2946640296642327832">Aktivér Bluetooth</translation>
 <translation id="5866557323934807206">Fjern disse innstillingene for fremtidige besøk</translation>
 <translation id="126710816202626562">Målspråket:</translation>
 <translation id="1194381338562257973">Slå på eksperimentelle midlertidige apper.</translation>
@@ -490,7 +490,7 @@ Sjekk e-posten din på <ph name="ACCOUNT_EMAIL"/> for instruksjoner om dette og
 <translation id="949088605431823851">Hvor kjøpte du din HP Chromebook 11?</translation>
 <translation id="9087353528325876418">Nettadresse for automatisk oppdagelse av nettmellomtjener</translation>
 <translation id="4801956050125744859">Behold begge</translation>
-<translation id="3878840326289104869">Oppretter en overvåket bruker …</translation>
+<translation id="3878840326289104869">Oppretter en administrert bruker</translation>
 <translation id="406070391919917862">Bakgrunnsprogrammer</translation>
 <translation id="8820817407110198400">Bokmerker</translation>
 <translation id="6347003977836730270">«Aktiver nye Translate bubble UX» tilbys i stedet for informasjonsraden.</translation>
@@ -507,19 +507,19 @@ Sjekk e-posten din på <ph name="ACCOUNT_EMAIL"/> for instruksjoner om dette og
 <translation id="3809280248639369696">Marsboer</translation>
 <translation id="1985136186573666099"><ph name="PRODUCT_NAME"/> bruker innstillingene for datamaskinens systemmellomtjener for å koble til nettverket.</translation>
 <translation id="6435285122322546452">Administrer kioskapper</translation>
-<translation id="5748409721703101646">Chromebooken din kunne ikke koble til Internett via <ph name="NETWORK_NAME"/>. Velg et annet nettverk. <ph name="LEARN_MORE_LINK_START"/>Finn ut mer<ph name="LEARN_MORE_LINK_END"/></translation>
+<translation id="5748409721703101646">Chromebooken din kunne ikke koble til Internett via <ph name="NETWORK_NAME"/>. Velg et annet nettverk. <ph name="LEARN_MORE_LINK_START"/>Les mer<ph name="LEARN_MORE_LINK_END"/></translation>
 <translation id="1064835277883315402">Tilkobling til privat nettverk</translation>
 <translation id="6508261954199872201">Program: <ph name="APP_NAME"/></translation>
 <translation id="3700528541715530410">Beklager. Det ser ut til at du ikke har tillatelse til å åpne denne siden.</translation>
 <translation id="2713008223070811050">Administrer skjermer</translation>
-<translation id="5145331109270917438">Endringsdato</translation>
+<translation id="5145331109270917438">Dato endret</translation>
 <translation id="6596816719288285829">IP-adresse</translation>
 <translation id="7603461642606849762">Feilsøk bare hvis nettadressen til manifestet slutter med debug.nmf.</translation>
 <translation id="8656768832129462377">Ikke merk av</translation>
 <translation id="413121957363593859">Komponenter</translation>
 <translation id="715487527529576698">Opprinnelig kinesisk modus er forenklet kinesisk</translation>
 <translation id="6522350652862471760">Slå på Google-profilnavn og -ikon</translation>
-<translation id="6181259999130430430">Slå på enkel opplåsing for denne enheten.</translation>
+<translation id="6181259999130430430">Slå på Enkel opplåsing for denne enheten.</translation>
 <translation id="8703575177326907206">Tilkoblingen til <ph name="DOMAIN"/> er ikke kryptert.</translation>
 <translation id="6135622770221372891">ID-er for kanal</translation>
 <translation id="8472623782143987204">maskinvarestøttet</translation>
@@ -533,24 +533,23 @@ Sjekk e-posten din på <ph name="ACCOUNT_EMAIL"/> for instruksjoner om dette og
           dvalemodus. Når dette skjer, stenges nettverkstilkoblinger av,
           og nye nettverksforespørsler mislykkes. Du skal kunne løse dette ved å
           laste inn siden på nytt.</translation>
-<translation id="8791534160414513928">Send en Deaktivering av sporing-forespørsel med nettrafikken din</translation>
+<translation id="8791534160414513928">Send en «Ingen sporing»-forespørsel med nettrafikken din</translation>
 <translation id="485316830061041779">Tysk</translation>
 <translation id="9132971099789715557">Hold Søk-tasten nede for å endre funksjonene for tastene på øverste rad.</translation>
 <translation id="6500116422101723010">Tjeneren kan ikke behandle forespørselen for øyeblikket. Denne koden antyder at dette er en midlertidig tilstand, og at tjeneren vil fungere igjen etter en forsinkelse.</translation>
 <translation id="1644574205037202324">Logg</translation>
 <translation id="2386631145847373156">Du må være pålogget for å logge deg av.</translation>
 <translation id="4206944295053515692">Be Google om forslag</translation>
-<translation id="1297175357211070620">Til</translation>
+<translation id="1297175357211070620">Destinasjon</translation>
 <translation id="479280082949089240">Denne siden har lagret informasjonskapsler på datamaskinen</translation>
 <translation id="1984642098429648350">Forankre vinduet til høyre</translation>
-<translation id="6204930791202015665">Vis...</translation>
+<translation id="6204930791202015665">Se</translation>
 <translation id="8713570323158206935">Send <ph name="BEGIN_LINK1"/>systeminformasjon<ph name="END_LINK1"/></translation>
 <translation id="727952162645687754">Nedlastingsfeil</translation>
 <translation id="5941343993301164315">Logg på <ph name="TOKEN_NAME"/>.</translation>
 <translation id="1916935104118658523">Skjul dette programtillegget</translation>
 <translation id="1046059554679513793">Dette navnet er allerede i bruk!</translation>
-<translation id="2587922270115112871">Oppretting av en overvåket bruker oppretter ikke noen Google-konto, og vedkommendes innstillinger
-    og data blir ikke kopiert til andre enheter med Chrome-synkronisering. En overvåket bruker er bare tilgjengelig på denne enheten.</translation>
+<translation id="2587922270115112871">Når du oppretter en administrert bruker, oppretter du ikke en Google-konto, og vedkommendes innstillinger og data blir ikke kopiert til andre enheter med Chrome-synkronisering. En administrert bruker er bare tilgjengelig på denne enheten.</translation>
 <translation id="7342729285348293164">Logg på <ph name="PRODUCT_NAME"/> med Google-kontoen for å lagre personlig tilpassede nettleserfunksjoner på nettet, slik at du kan få tilgang til dem i <ph name="PRODUCT_NAME"/> fra alle datamaskiner. Du blir også automatisk logget på alle Google-tjenestene du liker.</translation>
 <translation id="2542049655219295786">Google-tabell</translation>
 <translation id="3899879303189199559">Frakoblet i over ett år</translation>
@@ -613,7 +612,7 @@ Sjekk e-posten din på <ph name="ACCOUNT_EMAIL"/> for instruksjoner om dette og
 <translation id="5948544841277865110">Legg til privat nettverk</translation>
 <translation id="7088434364990739311">Kunne ikke starte søk etter oppdateringer (feilkode <ph name="ERROR"/>).</translation>
 <translation id="7113536735712968774">Vis færre …</translation>
-<translation id="1353966721814789986">Oppstartssider</translation>
+<translation id="1353966721814789986">Oppstartsider</translation>
 <translation id="5233019165164992427">NaCl-feilsøkingsport</translation>
 <translation id="2617604345341980855">Selv om du trygt har besøkt dette nettstedet i det siste, er svært sannsynlig at enheten din blir infisert med skadelig programvare hvis du besøker det nå.</translation>
 <translation id="2038896902310685531">Beklager. <ph name="WALLET_ERROR"/> – Du kan fullføre denne transaksjonen uten Google Wallet.</translation>
@@ -657,7 +656,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="4973698491777102067">Slett følgende elementer fra:</translation>
 <translation id="9021662811137657072">Virus oppdaget</translation>
 <translation id="4241404202385006548">Slå av utvidelsene dine, og last så inn denne nettsiden på nytt</translation>
-<translation id="6074963268421707432">Ikke tillat noen nettsteder å vise skrivebordsvarslinger</translation>
+<translation id="6074963268421707432">Ikke tillat noen nettsteder å vise skrivebordsvarsler</translation>
 <translation id="3603385196401704894">Canadisk fransk</translation>
 <translation id="4869253927035988743">Aktiverer katalogstøtte for synkronisering av filsystem.</translation>
 <translation id="1995173078718234136">Skanner innhold ...</translation>
@@ -713,7 +712,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="3984921062031549150">Gjengivelsen slutter å fungere</translation>
 <translation id="7925285046818567682">Venter på <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Blokkér alltid bruk av kameraet</translation>
-<translation id="2964845078799970531">Med enkel opplåsing kan du låse opp Chromebooken når den er i nærheten av telefonen din.</translation>
+<translation id="2964845078799970531">Med Enkel opplåsing kan du låse opp Chromebooken når den er i nærheten av telefonen din.</translation>
 <translation id="5053803681436838483">Ny leveringsadresse</translation>
 <translation id="5952256601775839173">Aktivér trefingerklikk for styreflaten.</translation>
 <translation id="3280237271814976245">L&amp;agre som...</translation>
@@ -732,7 +731,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="5396126354477659676"><ph name="PEPPER_PLUGIN_NAME"/> på <ph name="PEPPER_PLUGIN_DOMAIN"/> ber om tilgang til datamaskinen din.</translation>
 <translation id="7850851215703745691">Disse Disk-filene er ikke delt ennå</translation>
 <translation id="5946591249682680882">Rapport-ID <ph name="WEBRTC_LOG_REPORT_ID"/></translation>
-<translation id="3435896845095436175">Aktiver</translation>
+<translation id="3435896845095436175">Aktivér</translation>
 <translation id="1891668193654680795">Stol på dette sertifikatet for å identifisere programvareprodusenter.</translation>
 <translation id="7968833647796919681">Aktiverer innsamling av ytelsesdata</translation>
 <translation id="7645176681409127223"><ph name="USER_NAME"/> (eier)</translation>
@@ -807,7 +806,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="8257950718085972371">Fortsett blokkering av kameratilgang</translation>
 <translation id="5390284375844109566">Indeksert database</translation>
 <translation id="411666854932687641">Privat minne</translation>
-<translation id="119944043368869598">Tøm listen</translation>
+<translation id="119944043368869598">Fjern alle</translation>
 <translation id="3467848195100883852">Aktiver automatisk stavekorreksjon</translation>
 <translation id="1336254985736398701">Vis side&amp;informasjon</translation>
 <translation id="5039440886426314758">Vil du installere disse programmene og utvidelsene?</translation>
@@ -816,9 +815,9 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="1007408791287232274">Kunne ikke laste inn enhetene.</translation>
 <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP"/>.html</translation>
 <translation id="8437332772351535342">Starter du på nytt i skrivebordsmodus, lukkes og startes Chrome-appene dine på nytt.</translation>
-<translation id="164814987133974965">En overvåket bruker kan utforske nettet med din veiledning. Som administrator for en overvåket bruker, kan du
+<translation id="164814987133974965">En administrert bruker kan utforske nettet med din veiledning. Som administrator for en administrert bruker, kan du
     <ph name="BEGIN_BOLD"/>tillate eller blokkere<ph name="END_BOLD"/> bestemte nettsteder,
-    <ph name="BEGIN_BOLD"/>gjennomgå<ph name="END_BOLD"/> nettsteder den overvåkede brukeren har besøkt og
+    <ph name="BEGIN_BOLD"/>gjennomgå<ph name="END_BOLD"/> nettsteder den administrerte brukeren har besøkt og
     <ph name="BEGIN_BOLD"/>administrere<ph name="END_BOLD"/> andre innstillinger.</translation>
 <translation id="6828153365543658583">Begrens pålogging til følgende brukere:</translation>
 <translation id="8106045200081704138">Delt med meg</translation>
@@ -842,7 +841,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="1151169732719877940">Aktiver identitetssamsvar mellom nettleseren og informasjonskapsel-lageret</translation>
 <translation id="7615851733760445951">&lt;ingen informasjonskapsel valgt&gt;</translation>
 <translation id="2493021387995458222">Velg «ord om gangen»</translation>
-<translation id="5279600392753459966">Blokker alle</translation>
+<translation id="5279600392753459966">Blokkér alle</translation>
 <translation id="5723508132121499792">Ingen bakgrunnsprogrammer kjører</translation>
 <translation id="474421578985060416">Blokkert av deg</translation>
 <translation id="7392915005464253525">Gj&amp;enåpne det lukkede vinduet</translation>
@@ -902,7 +901,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="3926862159284741883">Aktiver utkastutvidelser for WebGL</translation>
 <translation id="7684540948112007255">last ned flere filer.</translation>
 <translation id="2537271621194795300">Oppstarter</translation>
-<translation id="3636096452488277381">Heisann <ph name="USER_GIVEN_NAME"/>.</translation>
+<translation id="3636096452488277381">Heisann, <ph name="USER_GIVEN_NAME"/>.</translation>
 <translation id="4911714727432509308">Ingen utvidelser har tildelte hurtigtaster.</translation>
 <translation id="5999606216064768721">Bruk systemets tittelfelt og kantlinjer</translation>
 <translation id="921568617530782833">lese og endre alle dataene på nettstedene du besøker</translation>
@@ -923,9 +922,9 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="2018352199541442911">Beklager, men den eksterne lagringsenheten din støttes foreløpig ikke.</translation>
 <translation id="2678063897982469759">Slå på igjen</translation>
 <translation id="1779766957982586368">Lukk vindu</translation>
-<translation id="4850886885716139402">Vis</translation>
+<translation id="4850886885716139402">Visning</translation>
 <translation id="89217462949994770">Du har angitt feil personlig kode for mange ganger. Kontakt <ph name="CARRIER_ID"/> for å få en ny 8-sifret opplåsingskode</translation>
-<translation id="2776441542064982094">Det ser ut til at det ikke er noen enheter som kan registreres på nettverket. Hvis enheten din er slått på og koblet til Internett, kan du prøve å registerer den ved å følge instruksjonene i instruksjonsmanualen.</translation>
+<translation id="2776441542064982094">Det ser ut til at det ikke er noen enheter som kan registreres på nettverket. Hvis enheten din er slått på og koblet til Internett, kan du prøve å registrere den ved å følge instruksjonene i instruksjonshåndboken.</translation>
 <translation id="8659716501582523573">IP-adresse:</translation>
 <translation id="7782102568078991263">Google har ikke flere forslag</translation>
 <translation id="8038111231936746805">(standard)</translation>
@@ -934,7 +933,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="567881659373499783">Versjon <ph name="PRODUCT_VERSION"/></translation>
 <translation id="344100820105975148">Aktiver rene, nettbaserte påloggingsflyter.</translation>
 <translation id="8261378640211443080">Denne utvidelsen er ikke oppført i <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/>, og kan ha blitt lagt uten at du har vært klar over det.</translation>
-<translation id="8899851313684471736">&amp;Åpne link i nytt vindu</translation>
+<translation id="8899851313684471736">Å&amp;pne linken i et nytt vindu</translation>
 <translation id="4110342520124362335">Informasjonskapsler fra <ph name="DOMAIN"/> blokkert.</translation>
 <translation id="2198315389084035571">Kinesisk (forenklet)</translation>
 <translation id="3303818374450886607">Kopier</translation>
@@ -957,7 +956,7 @@ Alle brukere må logge av for å fortsette.</translation>
 <translation id="4439244508678316632">Innholdslisenser</translation>
 <translation id="3940082421246752453">Tjeneren støtter ikke HTTP-versjonen som ble brukt i forespørselen.</translation>
 <translation id="6909461304779452601">Programmer, utvidelser og brukerskript kan ikke legges til fra dette nettstedet.</translation>
-<translation id="661719348160586794">Dine lagrede passord listes opp her.</translation>
+<translation id="661719348160586794">Dine lagrede passord vises her.</translation>
 <translation id="6874604403660855544">&amp;Legg til likevel</translation>
 <translation id="8352772353338965963">Legg til en konto for multipålogging. Alle påloggede kontoer kan brukes uten passord, så denne funksjonen burde bare brukes med pålitelige kontoer.</translation>
 <translation id="5361686177218315158">Unntakene for kamera og mikrofon i Adobe Flash Player er forskjellige.</translation>
@@ -1027,7 +1026,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="159359590073980872">Bildebuffer</translation>
 <translation id="4668711410219362250">https://support.google.com/chrome/bin/answer.py?hl=<ph name="GRITLANGCODE_1"/>&amp;answer=165139&amp;p=settings_sign_in</translation>
 <translation id="3586931643579894722">Skjul detaljer</translation>
-<translation id="6285395082104474418">Statusfeltet viser deg den gjeldende tilstanden til nettverket, batteriet og mer.</translation>
+<translation id="6285395082104474418">Statusfeltet viser deg status for nettverket, batteriet og mer.</translation>
 <translation id="3317459757438853210">Tosidig</translation>
 <translation id="6020949471045037306">Aktiverer det nye systemet for profiladministrasjon, inkludert profil-låsing og det nye brukergrensesnittet for brukerbilder.</translation>
 <translation id="2011110593081822050">Nettarbeider: <ph name="WORKER_NAME"/></translation>
@@ -1134,7 +1133,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="1357589289913453911">Utvidelses-ID</translation>
 <translation id="7570477672765183">Klikk for å starte</translation>
 <translation id="8688579245973331962">Ser du ikke navnet ditt?</translation>
-<translation id="3804941997676372569">Søk eller si OK Google</translation>
+<translation id="3804941997676372569">Søk, eller si «Ok Google»</translation>
 <translation id="3226128629678568754">Trykk på knappen for å laste inn på nytt, for å sende inn dataene som trengs for å laste inn siden på nytt.</translation>
 <translation id="1384035515048721170"><ph name="LEGAL_DOC_AGREEMENT"/> For å beskytte deg mot svindel, deles informasjon om datamaskinen din (inkludert plasseringen) med Google Wallet.</translation>
 <translation id="6166101525540035714">Bruk av Chrome er underlagt <ph name="BEGIN_LINK1"/>vilkårene for bruk<ph name="END_LINK1"/> og <ph name="BEGIN_LINK2"/>personvernmerknaden<ph name="END_LINK2"/> for Chrome.</translation>
@@ -1149,7 +1148,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="7309416673261215716">Versjon av utvidelse</translation>
 <translation id="6840313690797192085">$1 PB</translation>
 <translation id="5971037678316050792">kontrollere statusen og tilkoblingen for Bluetooth-adapteren</translation>
-<translation id="3313590242757056087">For å angi hvilke nettsteder den overvåkede brukeren kan bruke, kan du konfigurere begrensninger og innstillinger ved å gå til <ph name="MANAGEMENT_URL"/>.
+<translation id="3313590242757056087">For å angi hvilke nettsteder den administrerte brukeren kan bruke, kan du konfigurere begrensninger og innstillinger ved å gå til <ph name="MANAGEMENT_URL"/>.
     Hvis du ikke endrer standardinnstillingene, kan <ph name="USER_DISPLAY_NAME"/>
     surfe på hele nettet.</translation>
 <translation id="2694026874607847549">Én informasjonskapsel</translation>
@@ -1167,7 +1166,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6802031077390104172"><ph name="USAGE"/> (<ph name="OID"/>)</translation>
 <translation id="6025215716629925253">Stabelsporing</translation>
-<translation id="4052120076834320548">Bittelite</translation>
+<translation id="4052120076834320548">Bitteliten</translation>
 <translation id="3791151686802386313">Forbereder den første bedriftspåloggingen …</translation>
 <translation id="3393716657345709557">Forespurt oppføring ble ikke funnet i bufferen.</translation>
 <translation id="7191454237977785534">Lagre filen som</translation>
@@ -1182,7 +1181,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="2585300050980572691">Standardinnstillinger for søk</translation>
 <translation id="2617919205928008385">Ikke tilstrekkelig plass</translation>
 <translation id="1608306110678187802">Sk&amp;riv ut ramme...</translation>
-<translation id="3623574769078102674">Denne overvåkede brukeren blir administrert av <ph name="MANAGER_EMAIL"/>.</translation>
+<translation id="3623574769078102674">Denne administrerte brukeren blir administrert av <ph name="MANAGER_EMAIL"/>.</translation>
 <translation id="8919081441417203123">Dansk</translation>
 <translation id="5323213332664049067">Latinamerikansk</translation>
 <translation id="3778152852029592020">Nedlastingen ble avbrutt.</translation>
@@ -1290,7 +1289,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="9033857511263905942">&amp;Lim inn</translation>
 <translation id="1028690605877243613">Bruk den alternative hylleutformingen.</translation>
 <translation id="6736045498964449756">Beklager. Passordene samsvarer ikke!</translation>
-<translation id="4558985768677321342">Aktiver enkel opplåsing.</translation>
+<translation id="4558985768677321342">Aktiver Enkel opplåsing.</translation>
 <translation id="1221825588892235038">Bare utvalg</translation>
 <translation id="2227939492629426903">Aktiverer den nye brukerbildemenyen. Når den kombineres med ny profiladministrasjon, vises den nye brukerbildemenyen for administrasjon av profiler. I andre tilfeller viser den en brukerbildemeny med ny utforming, men med samme funksjonalitet som den gamle menyen. I tillegg vises et veiledningskort øverst som ber brukeren om å prøve det nye grensesnittet for administrasjon av profiler.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> har blokkert tilgangen til <ph name="HOST_NAME"/>. Dette nettstedet har blitt rapportert som et nettfiskingsnettsted.</translation>
@@ -1299,7 +1298,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="508794495705880051">Legg til nytt kredittkort</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="2462724976360937186">Nøkkel-ID for sertifiseringsinstans</translation>
-<translation id="981121421437150478">Uten nettilgang</translation>
+<translation id="981121421437150478">Uten nett</translation>
 <translation id="2964193600955408481">Deaktiver Wi-Fi</translation>
 <translation id="6786747875388722282">Utvidelser</translation>
 <translation id="2570648609346224037">Det oppstod et problem under nedlasting av gjenopprettingsbilde.</translation>
@@ -1313,7 +1312,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="222931766245975952">Filen er komprimert</translation>
 <translation id="3101709781009526431">Dato og klokkeslett</translation>
 <translation id="2394566832561516196">Innstillingene slettes neste gang siden lastes inn på nytt</translation>
-<translation id="4514542542275172126">Konfigurer en ny overvåket bruker</translation>
+<translation id="4514542542275172126">Konfigurer en ny administrert bruker</translation>
 <translation id="4279490309300973883">Speiling</translation>
 <translation id="2869742291459757746">Tillat brukeren å la Chrome generere passord når sider for kontoopprettelse oppdages.</translation>
 <translation id="7079038783243627996">«<ph name="EXTENSION"/>» får tillatelse til å lese og slette bilde-, video- og lydfiler i de valgte mappene.</translation>
@@ -1395,7 +1394,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="8249048954461686687">OEM-mappe</translation>
 <translation id="1105608846356399385">Gå til nettsted</translation>
 <translation id="7218608093942361839"><ph name="PRODUCT_NAME"/> <ph name="PRODUCT_VERSION"/> (plattform <ph name="PLATFORM_VERSION"/>)</translation>
-<translation id="54870580363317966">Velg et brukerbilde for denne overvåkede brukeren.</translation>
+<translation id="54870580363317966">Velg et brukerbilde for denne administrerte brukeren.</translation>
 <translation id="839736845446313156">Registrer</translation>
 <translation id="2660779039299703961">Aktivitet</translation>
 <translation id="4249248555939881673">Venter på nettverkstilkobling …</translation>
@@ -1406,7 +1405,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="3574210789297084292">logg på</translation>
 <translation id="5254480569305195883">Aktiver støtte for ServiceWorker-synkroniseringshendelser i bakgrunnen.</translation>
 <translation id="2134149231879627725">La Google hjelpe deg med å låse, slette og finne enheten din fra en ekstern plassering.</translation>
-<translation id="1146204723345436916">Importer bokmerker fra HTML-fil</translation>
+<translation id="1146204723345436916">Importér bokmerker fra HTML-fil</translation>
 <translation id="2113921862428609753">Informasjonstilgang til instans</translation>
 <translation id="9190063653747922532">L2TP/IPsec + forhåndsdelt nøkkel</translation>
 <translation id="5227536357203429560">Legg til privat nettverk</translation>
@@ -1478,7 +1477,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="641702813324074008">Aktiver boblegrensesnittet for passordlagring</translation>
 <translation id="3627671146180677314">Tid for fornying av Netscape-sertifikat</translation>
 <translation id="6869967057083711802">Denne filtypen støttes ikke. Gå til <ph name="BEGIN_LINK"/>Chrome Nettmarked<ph name="END_LINK"/> for å finne en liknende app.
-    <ph name="BEGIN_LINK_HELP"/>Finn ut mer<ph name="END_LINK_HELP"/></translation>
+    <ph name="BEGIN_LINK_HELP"/>Les mer<ph name="END_LINK_HELP"/></translation>
 <translation id="6980956047710795611">Overfør alle Chrome OS-data til det nye passordet (krever det forrige passordet)</translation>
 <translation id="8652487083013326477">alternativknapp for sideomfang</translation>
 <translation id="5204967432542742771">Skriv inn passordet</translation>
@@ -1510,7 +1509,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="3616113530831147358">Lyd</translation>
 <translation id="23030561267973084">«<ph name="EXTENSION_NAME"/>» har bedt om ekstra tilgang.</translation>
 <translation id="6957887021205513506">Tjenersertifikatet ser ut til å være forfalsket.</translation>
-<translation id="8957709627709183338">Det er bare eieren av enheten som kan opprette overvåkede brukere.</translation>
+<translation id="8957709627709183338">Det er bare eieren av enheten som kan opprette administrerte brukere.</translation>
 <translation id="8551494947769799688">Latvisk</translation>
 <translation id="4567676092950881857">Deaktiver SAML-pålogging.</translation>
 <translation id="4803909571878637176">Avinstallering</translation>
@@ -1570,7 +1569,7 @@ Forresten: Inkognitomodus (<ph name="SHORTCUT_KEY"/>) kan være kjekt neste gang
 <translation id="3009779501245596802">Indekserte databaser</translation>
 <translation id="1404301347395550388">Aktiver krypterte mediautvidelser.</translation>
 <translation id="3041612393474885105">Sertifikatinformasjon</translation>
-<translation id="5023943178135355362">Australsk rulling <ph name="BEGIN_LINK"/>Finn ut mer<ph name="END_LINK"/></translation>
+<translation id="5023943178135355362">Australsk rulling <ph name="BEGIN_LINK"/>Les mer<ph name="END_LINK"/></translation>
 <translation id="7378810950367401542">/</translation>
 <translation id="6426039856985689743">Deaktiver mobildata</translation>
 <translation id="8571992327053899347">En administrert bruker kan utforske nettet med veiledning fra deg. Som administrator av en administrert bruker i Chrome, kan du
@@ -1624,11 +1623,8 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
 <translation id="5889282057229379085">Maksimalt antall mellomliggende sertifiseringsinstanser: <ph name="NUM_INTERMEDIATE_CA"/></translation>
 <translation id="3180365125572747493">Skriv inn et passord for å kryptere denne sertifikatfilen.</translation>
 <translation id="8663625831674359823">MERK: Fungerer bare med utvikler- og canary-kanaler. Slår på forslag i multifunksjonsfeltet som vises før du begynner å skrive i feltet.</translation>
-<translation id="7386824183915085801">Chrome- og operativsystem-versjonen din sendes inn i tillegg til annen
-        informasjon du tar med ovenfor. Hvis du inkluderer e-postadressen
-        din, kan det hende at Google kontakter deg angående tilbakemeldingen din. Tilbakemeldingene brukes til å diagnostisere problemer, og forbedre Chrome.
-        Personlige opplysninger du sender inn, med intensjon eller ved et uhell, beskyttes i henhold til personvernreglene våre.<ph name="BEGIN_BOLD"/> Ved å sende inn denne tilbakemeldingen godtar du at Google bruker tilbakemeldingen du sender inn til å forbedre et Google-produkt eller -tjeneste.
-        <ph name="END_BOLD"/></translation>
+<translation id="7386824183915085801">Chrome- og operativsystem-versjonen din sendes inn, i tillegg til annen informasjon du tar med ovenfor. Hvis du inkluderer e-postadressen din, kan det hende at Google kontakter deg angående tilbakemeldingen din. Tilbakemeldingene brukes til å diagnostisere problemer og forbedre Chrome. Personlige opplysninger du sender inn, med hensikt eller ved et uhell, beskyttes i henhold til personvernreglene våre.<ph name="BEGIN_BOLD"/> Ved å sende inn denne tilbakemeldingen godtar du at Google bruker tilbakemeldingen du sender inn, til å forbedre et Google-produkt eller en Google-tjeneste.
+<ph name="END_BOLD"/></translation>
 <translation id="123578888592755962">Harddisken er full</translation>
 <translation id="5496587651328244253">Organiser</translation>
 <translation id="5967867314010545767">Fjern fra loggen</translation>
@@ -1648,7 +1644,7 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
 <translation id="6915711422691334155">Denne utvidelsen kan lese og endre alle dataene på datamaskinen din og alle nettsteder, herunder Google, Facebook, Yahoo osv.</translation>
 <translation id="6095666334801788310">Skriv inn passordet ditt på nytt</translation>
 <translation id="7360506455591495242">Signert sertifikat for tidsstempelvisning</translation>
-<translation id="3925083541997316308">Apper og utvidelser kan ikke endres av overvåkede brukere.</translation>
+<translation id="3925083541997316308">Apper og utvidelser kan ikke endres av administrerte brukere.</translation>
 <translation id="8425755597197517046">&amp;Lim inn og søk</translation>
 <translation id="6341850831632289108">Oppdaging av den fysiske plasseringen din</translation>
 <translation id="3003623123441819449">CSS-buffer</translation>
@@ -1673,7 +1669,7 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
 <translation id="4628757576491864469">Enheter</translation>
 <translation id="8461914792118322307">Mellomtjener</translation>
 <translation id="4707934200082538898">Sjekk e-posten din på <ph name="BEGIN_BOLD"/><ph name="MANAGER_EMAIL"/><ph name="END_BOLD"/> for flere instruksjoner.</translation>
-<translation id="8680544835056685300">Vi er stadig på utkikk etter måter å gjøre surfingen din tryggere på. Tidligere kunne et hvilket som helst nettsted be deg å legge til en utvidelse i nettleseren din. I de nyeste versjonene av Google Chrome, må du eksplisitt gi beskjed til Chrome om at du ønsker å installere disse utvidelsene ved å legge dem til via Utvidelser-siden. <ph name="BEGIN_LINK"/>Finn ut mer<ph name="END_LINK"/></translation>
+<translation id="8680544835056685300">Vi er stadig på utkikk etter måter å gjøre surfingen din tryggere på. Tidligere kunne et hvilket som helst nettsted be deg å legge til en utvidelse i nettleseren din. I de nyeste versjonene av Google Chrome, må du eksplisitt gi beskjed til Chrome om at du ønsker å installere disse utvidelsene ved å legge dem til via Utvidelser-siden. <ph name="BEGIN_LINK"/>Les mer<ph name="END_LINK"/></translation>
 <translation id="4089521618207933045">Har undermeny</translation>
 <translation id="3470442499439619530">Fjern denne brukeren</translation>
 <translation id="1936157145127842922">Vis i mappe</translation>
@@ -1763,7 +1759,7 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
 <translation id="4284105660453474798">Er du sikker på at du vil slette $1?</translation>
 <translation id="1600857548979126453">få tilgang til bakdata for sidefeilsøkingsprogrammet</translation>
 <translation id="2862043554446264826">Feilsøk alt unntatt det sikre skallet og PNaCl-oversetteren.</translation>
-<translation id="3516765099410062445">Viser loggen fra de påloggede enhetene. <ph name="BEGIN_LINK"/>Finn ut mer<ph name="END_LINK"/></translation>
+<translation id="3516765099410062445">Viser loggen fra de påloggede enhetene. <ph name="BEGIN_LINK"/>Les mer<ph name="END_LINK"/></translation>
 <translation id="4378551569595875038">Kobler til...</translation>
 <translation id="7573172247376861652">Batterilading</translation>
 <translation id="7029809446516969842">Passord</translation>
@@ -1861,7 +1857,7 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
 <translation id="201192063813189384">Feil under lesing fra hurtigbuffer.</translation>
 <translation id="9126706773198551170">Aktiver et nytt profiladministrasjons-system</translation>
 <translation id="2345303327200536445">Ny versjon med fargerik bakgrunn</translation>
-<translation id="7441570539304949520">Unntak for JavaScript</translation>
+<translation id="7441570539304949520">JavaScript-unntak</translation>
 <translation id="1789575671122666129">Forgrunnsvinduer</translation>
 <translation id="8002117456258496331">Skadelig programvare er ondsinnet programvare som forårsaker ting som identitetstyveri, økonomisk tap og permanent sletting av filer.</translation>
 <translation id="3215028073430859994">Den har permanent tilgang til  <ph name="NUMBER_OF_FILES"/> filer.</translation>
@@ -1924,7 +1920,7 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
 <translation id="3058212636943679650">Hvis du noen gang skulle trenge å gjenopprette datamaskinens operativsystem, må du ha SD-kort eller USB-minnepinne for gjenoppretting.</translation>
 <translation id="7238196028794870999">Fortsett å tillate programtillegg uten prosessisolering</translation>
 <translation id="7252661675567922360">Ikke last inn</translation>
-<translation id="1983959805486816857">Når du har opprettet en ny overvåket bruker, kan du administrere innstillingene når som helst fra hvilken som helst enhet på <ph name="MANAGEMENT_URL"/>.</translation>
+<translation id="1983959805486816857">Når du har opprettet en ny administrert bruker, kan du administrere innstillingene når som helst fra hvilken som helst enhet på <ph name="MANAGEMENT_URL"/>.</translation>
 <translation id="2815382244540487333">Følgende informasjonskapsler ble blokkert:</translation>
 <translation id="1084538181352409184">Sjekk innstillingene for mellomtjeneren eller kontakt en nettverksadministrator for å kontrollere at den fungerer.
           <ph name="PLATFORM_TEXT"/></translation>
@@ -1989,7 +1985,7 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
 <translation id="6588399906604251380">Aktiver stavekontroll</translation>
 <translation id="4572815280350369984"><ph name="FILE_TYPE"/>-fil</translation>
 <translation id="3012890944909934180">Start Chrome på nytt via skrivebordet</translation>
-<translation id="7053983685419859001">Blokker</translation>
+<translation id="7053983685419859001">Blokkér</translation>
 <translation id="7912024687060120840">I mappen:</translation>
 <translation id="2485056306054380289">Tjenerens CA-sertifikat:</translation>
 <translation id="5631861698741076898">Beklager. Du kunne ikke logge på. Påloggingen mislyktes fordi den var konfigurert til å bruke en usikret nettadresse (<ph name="BLOCKED_URL"/>).</translation>
@@ -2001,7 +1997,7 @@ Når du har opprettet en ny administrert bruker, kan du når som helst administr
           for mange viderekoblinger. Problemet kan kanskje løses ved å slette informasjonskapslene dine for dette nettstedet eller tillate informasjonskapsler fra tredjeparter.
           Hvis dette ikke løser problemet, dreier det seg kanskje om et problem med konfigurasjonen av tjeneren, og ikke med
           datamaskinen din.</translation>
-<translation id="5488468185303821006">Tillat inkognitoer</translation>
+<translation id="5488468185303821006">Tillat i inkognitomodus</translation>
 <translation id="1546703252838446285">På kontoen <ph name="ACCOUNT_EMAIL"/> kan den:</translation>
 <translation id="6556866813142980365">Gjør om</translation>
 <translation id="8824701697284169214">Legg til si&amp;de</translation>
@@ -2051,7 +2047,7 @@ annet sertifikat, kan du prøve å bruke dette. Ellers kan du forsøke å
 <translation id="9220525904950070496">Fjern konto</translation>
 <translation id="151922265591345427">1024</translation>
 <translation id="3039828483675273919">Flytter $1 elementer ...</translation>
-<translation id="7816949580378764503">Identiteten ble bekreftet</translation>
+<translation id="7816949580378764503">Identiteten er bekreftet</translation>
 <translation id="1521442365706402292">Administrer sertifikater</translation>
 <translation id="1679068421605151609">Utviklerverktøy</translation>
 <translation id="7014051144917845222"><ph name="PRODUCT_NAME"/> sitt forsøk på tilkobling til <ph name="HOST_NAME"/> ble avvist. Nettstedet kan være nede, eller det kan hende at nettverket ditt ikke er riktig konfigurert.</translation>
@@ -2059,7 +2055,7 @@ annet sertifikat, kan du prøve å bruke dette. Ellers kan du forsøke å
 <translation id="4332213577120623185">Mer informasjon er nødvendig for å fullføre dette kjøpet.</translation>
 <translation id="9201305942933582053">Google Nå for Chrome!</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
-<translation id="6896758677409633944">Kopier</translation>
+<translation id="6896758677409633944">Kopiér</translation>
 <translation id="8986362086234534611">Glem</translation>
 <translation id="5260508466980570042">Beklager, e-postadressen eller passordet kan ikke verifiseres. Prøv på nytt.</translation>
 <translation id="7887998671651498201">Følgende programtillegg svarer ikke: <ph name="PLUGIN_NAME"/>Vil du stoppe det?</translation>
@@ -2093,7 +2089,7 @@ annet sertifikat, kan du prøve å bruke dette. Ellers kan du forsøke å
 <translation id="4197674956721858839">Zip-utvalg</translation>
 <translation id="707392107419594760">Velg tastatur:</translation>
 <translation id="8605503133013456784">Kunne ikke fjerne tilknytning til og koble fra «<ph name="DEVICE_NAME"/>».</translation>
-<translation id="2007404777272201486">Rapporter et problem</translation>
+<translation id="2007404777272201486">Rapportér et problem</translation>
 <translation id="4366509400410520531">Tillatt av deg</translation>
 <translation id="2218947405056773815">Beklager. <ph name="API_NAME"/> støtte på et hinder.</translation>
 <translation id="1783075131180517613">Oppdater passordfrasen for synkronisering.</translation>
@@ -2101,7 +2097,7 @@ annet sertifikat, kan du prøve å bruke dette. Ellers kan du forsøke å
 <translation id="2390045462562521613">Glem dette nettverket</translation>
 <translation id="1450927657625573300">Deaktiverer en optimalisering som skal forbedre reaksjonsfølsomhet ved berøringsrulling. Tvinger alle berøringsaktiviteter i retning signalets hovedtråd for å se etter behandlere, i stedet for potensielt å forårsake kortslutning fra komposisjonstråden.</translation>
 <translation id="3348038390189153836">Oppdaget flyttbar enhet</translation>
-<translation id="1663298465081438178">Alt du trenger å vite – helt enkelt.</translation>
+<translation id="1663298465081438178">Alt du trenger å vite – enkelt og greit.</translation>
 <translation id="8005540215158006229">Chrome er nesten klar.</translation>
 <translation id="1666788816626221136">Du har en fil med sertifikater som ikke passer inn i de angitte kategoriene:</translation>
 <translation id="4821935166599369261">&amp;Profilering aktivert</translation>
@@ -2126,7 +2122,7 @@ annet sertifikat, kan du prøve å bruke dette. Ellers kan du forsøke å
 <translation id="4131410914670010031">Svarthvitt</translation>
 <translation id="3800503346337426623">Hopp over pålogging og surf som gjest</translation>
 <translation id="2615413226240911668">Denne siden inneholder imidlertid ressurser som ikke er sikre. Disse ressursene er synlige for andre mens de er i transitt, og en angriper kan modifisere dem for å endre på sidens utseende.</translation>
-<translation id="1416136326154112077">Innstillingene og surfeloggen for denne overvåkede brukeren kan fortsatt ses av administratoren på <ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/></translation>
+<translation id="1416136326154112077">Innstillingene og surfeloggen for denne administrerte brukeren kan fortsatt ses av administratoren på <ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/></translation>
 <translation id="197288927597451399">Behold</translation>
 <translation id="5880867612172997051">Nettverkstilgang er sperret</translation>
 <translation id="5495466433285976480">Dette fjerner alle lokale brukere, filer, data og andre innstillinger etter neste omstart. Alle brukere må logge inn på nytt.</translation>
@@ -2143,7 +2139,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="6122589160611523048">Nettfisking i sikte!</translation>
 <translation id="8049913480579063185">Navn på utvidelse</translation>
 <translation id="7584802760054545466">Kobler til <ph name="NETWORK_ID"/></translation>
-<translation id="9088175547465404130">Dette er en overvåket bruker som administreres av <ph name="CUSTODIAN_EMAIL"/>.</translation>
+<translation id="9088175547465404130">Dette er en administrert bruker som administreres av <ph name="CUSTODIAN_EMAIL"/>.</translation>
 <translation id="7733391738235763478">(<ph name="NUMBER_VISITS"/>)</translation>
 <translation id="450099669180426158">Utropstegnikon</translation>
 <translation id="902061379691003866">&lt;p&gt;<ph name="SITE"/> bruker normalt sett kryptering (SSL) for å beskytte informasjonen din. Når Chrome forsøkte å koble til <ph name="SITE"/> denne gangen, returnerte <ph name="SITE"/> uvanlig og ukorrekt legitimasjon. Enten er det en hacker som gir seg ut for å være <ph name="SITE"/>, eller så har en påloggingsside for et Wi-Fi-nettverk avbrutt tilkoblingen. Informasjonen er fortsatt sikker, fordi Chrome avbrøt tilkoblingen før det ble overført noen data.&lt;/p&gt; &lt;p&gt;Nettverksfeil og -angrep er som regel kortvarige, så denne siden fungerer nok igjen senere. Du kan også prøve å bytte til et annet nettverk.&lt;/p&gt;</translation>
@@ -2166,7 +2162,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="1559235587769913376">Angi Unicode-tegn</translation>
 <translation id="3297788108165652516">Dette nettverket deles med andre brukere.</translation>
 <translation id="4810984886082414856">Enkel buffer for HTTP.</translation>
-<translation id="1548132948283577726">Nettsteder som aldri lagrer passord listes opp her.</translation>
+<translation id="1548132948283577726">Nettsteder som aldri lagrer passord, vises her.</translation>
 <translation id="583281660410589416">Ukjent</translation>
 <translation id="3774278775728862009">Inndatametode for thai (TIS-820.2538-tastatur)</translation>
 <translation id="9115675100829699941">&amp;Bokmerker</translation>
@@ -2180,7 +2176,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="5528368756083817449">Bokmerkebehandling</translation>
 <translation id="8345300166402955056">Reduser databruken ved å laste inn optimaliserte nettsider via Google-mellomtjenere.</translation>
-<translation id="2826760142808435982">Tilkoblingen er kryptert ved hjelp av <ph name="CIPHER"/>, og bruker <ph name="KX"/> som nøkkelutvekslingsmekanisme.</translation>
+<translation id="2826760142808435982">Tilkoblingen er kryptert ved hjelp av <ph name="CIPHER"/>, og bruker <ph name="KX"/> som mekanisme for nøkkelutveksling.</translation>
 <translation id="215753907730220065">Avslutt fullskjermmodus</translation>
 <translation id="7849264908733290972">Åpne b&amp;ilde i ny fane</translation>
 <translation id="1560991001553749272">Bokmerke lagt til.</translation>
@@ -2241,7 +2237,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="2120316813730635488">Forekomster der en utvidelse ble installert</translation>
 <translation id="8398877366907290961">Fortsett likevel</translation>
 <translation id="5063180925553000800">Ny personlig kode:</translation>
-<translation id="4883178195103750615">Eksporter bokmerker til HTML-fil</translation>
+<translation id="4883178195103750615">Eksportér bokmerker til HTML-fil</translation>
 <translation id="2496540304887968742">Enheten må ha kapasitet på 4 GB eller mer.</translation>
 <translation id="6974053822202609517">Høyre til venstre</translation>
 <translation id="3752673729237782832">Mine enheter</translation>
@@ -2263,7 +2259,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="3898521660513055167">Tokenstatus</translation>
 <translation id="1950295184970569138">*Google-profilbilde (laster inn)</translation>
 <translation id="8063491445163840780">Aktiver fane 4</translation>
-<translation id="7939997691108949385">Administratoren kan konfigurere begrensninger og innstillinger for denne overvåkede brukeren på <ph name="MANAGEMENT_URL"/>.</translation>
+<translation id="7939997691108949385">Administratoren kan konfigurere begrensninger og innstillinger for denne administrerte brukeren på <ph name="MANAGEMENT_URL"/>.</translation>
 <translation id="2322193970951063277">Topp- og bunntekst</translation>
 <translation id="6436164536244065364">Se i Nettmarked</translation>
 <translation id="9137013805542155359">Vis original</translation>
@@ -2310,7 +2306,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="542872847390508405">Du surfer som gjest</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN"/> kjører nå i full skjerm, og vil deaktivere markøren din.</translation>
 <translation id="1497522201463361063">Kunne ikke gi «<ph name="FILE_NAME"/>» nytt navn. <ph name="ERROR_MESSAGE"/></translation>
-<translation id="8226742006292257240">Nedenfor ser du et tilfeldig generert TPM-passord som har blitt tildelt datamaskinen din:</translation>
+<translation id="8226742006292257240">Nedenfor ser du et tilfeldig generert TPM-passord som er tildelt datamaskinen din:</translation>
 <translation id="5010043101506446253">Sertifiseringsinstanser</translation>
 <translation id="5452005759330179535">Spør når et nettsted ønsker å vise skrivebordsvarsler (anbefales)</translation>
 <translation id="5287425679749926365">Dine kontoer</translation>
@@ -2321,7 +2317,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8300259894948942413">Dra og slipp-funksjonalitet ved berøring kan startes ved å holde lenge på elementet som skal flyttes.</translation>
 <translation id="1240892293903523606">DOM-inspektør</translation>
 <translation id="5249624017678798539">Nettleseren krasjet før nedlastingen var ferdig.</translation>
-<translation id="4474155171896946103">Legg inn bokmerke for alle åpne faner</translation>
+<translation id="4474155171896946103">Bokmerk alle fanene</translation>
 <translation id="5895187275912066135">Utstedt</translation>
 <translation id="9100825730060086615">Tastaturtype</translation>
 <translation id="5197680270886368025">Synkroniseringen er fullført.</translation>
@@ -2338,8 +2334,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="4419409365248380979">Tillat alltid at <ph name="HOST"/> angir informasjonskapsler</translation>
 <translation id="813582937903338561">Den siste dagen</translation>
 <translation id="5337771866151525739">Installert av en tredjepart.</translation>
-<translation id="7563991800558061108">For å rette opp i denne feilen må du logge på Google-kontoen din
-    fra påloggingssiden. Du kan deretter logge av Google-kontoen, og prøve å opprette en overvåket bruker på nytt.</translation>
+<translation id="7563991800558061108">For å rette opp i denne feilen må du logge på Google-kontoen din fra påloggingssiden. Deretter kan du logge av Google-kontoen, og prøve å opprette en administrert bruker på nytt.</translation>
 <translation id="6644715561133361290">Aktiver eller deaktiver bruk av utviklingsversjonen av proxy-tjeneren for datareduksjon.</translation>
 <translation id="3530279468460174821">Deaktiver Quickoffice-komponentutvidelsen for testformål.</translation>
 <translation id="3578308799074845547">Aktiver programlisteelement 7</translation>
@@ -2415,7 +2410,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="18139523105317219">Navn på EDI-enhet</translation>
 <translation id="8356258244599961364">Dette språket har ingen inndatametoder.</translation>
 <translation id="733186066867378544">Unntak for geografisk posisjonering</translation>
-<translation id="3328801116991980348">Opplysninger om nettstedet</translation>
+<translation id="3328801116991980348">Informasjon om nettstedet</translation>
 <translation id="7337488620968032387"><ph name="PRODUCT_NAME"/>
           har problemer med tilgangen til nettverket.
           <ph name="LINE_BREAK"/>
@@ -2443,7 +2438,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="3866249974567520381">Beskrivelse</translation>
 <translation id="2294358108254308676">Ønsker du å installere <ph name="PRODUCT_NAME"/>?</translation>
 <translation id="6549689063733911810">Siste</translation>
-<translation id="1529968269513889022">den foregående uken</translation>
+<translation id="1529968269513889022">den siste uken</translation>
 <translation id="5542132724887566711">Profil</translation>
 <translation id="7912145082919339430">Last inn siden på nytt for å aktivere <ph name="PLUGIN_NAME"/> etter installering.</translation>
 <translation id="5196117515621749903">Last inn buffer på nytt</translation>
@@ -2504,7 +2499,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="5094721898978802975">kommunisere med samarbeidende integrerte apper</translation>
 <translation id="1077946062898560804">Valg av automatiske oppdateringer for alle brukere</translation>
 <translation id="3122496702278727796">Kan ikke opprette datakatalog</translation>
-<translation id="6690751852586194791">Velg en overvåket bruker som skal legges til på denne enheten.</translation>
+<translation id="6690751852586194791">Velg en administrert bruker som skal legges til på denne enheten.</translation>
 <translation id="8572981282494768930">Ikke la nettsteder få tilgang til kameraet og mikrofonen din</translation>
 <translation id="6990081529015358884">Du har ikke tilgjengelig lagringsplass</translation>
 <translation id="5273628206174272911">Eksperimentell loggnavigering som følge av horisontal overrulling.</translation>
@@ -2559,7 +2554,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8186706823560132848">Programvare</translation>
 <translation id="8121548268521822197">mobil</translation>
 <translation id="4692623383562244444">Søkemotorer</translation>
-<translation id="10614374240317010">Aldri lagrede</translation>
+<translation id="10614374240317010">Aldri lagret</translation>
 <translation id="3495304270784461826"><ph name="COUNT"/> feil.</translation>
 <translation id="5116300307302421503">Kan ikke analysere filen.</translation>
 <translation id="2745080116229976798">Microsoft kvalifisert underordning</translation>
@@ -2615,7 +2610,7 @@ Pass på at du ikke deler privat informasjon.</translation>
         tilfeller kan dette være et symptom på at maskinvaren er i ferd med å svikte.</translation>
 <translation id="5154176924561037127">F8</translation>
 <translation id="5298219193514155779">Tema opprettet av</translation>
-<translation id="6307722552931206656">Google-navnetjenere – <ph name="BEGIN_LINK"/>Finn ut mer<ph name="END_LINK"/></translation>
+<translation id="6307722552931206656">Google-navnetjenere – <ph name="BEGIN_LINK"/>Les mer<ph name="END_LINK"/></translation>
 <translation id="6628328486509726751">Lastet opp <ph name="WEBRTC_LOG_UPLOAD_TIME"/></translation>
 <translation id="1047726139967079566">Legg til bokmerke for denne siden</translation>
 <translation id="151279668805528202">Aktiver den nye lydavspilleren</translation>
@@ -2628,7 +2623,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="1774833706453699074">Bokmerk åpne sider …</translation>
 <translation id="5702389759209837579">Få tilgang til de åpne fanene dine, på alle enhetene dine.</translation>
 <translation id="8381055888183086563">Aktiverer menyalternativer for feilsøkingskontekst slik som Inspiser element for pakkede apper.</translation>
-<translation id="1189418886587279221">Aktiver tilgjengelighetsfunksjoner for å gjøre enheten din enklere å bruke.</translation>
+<translation id="1189418886587279221">Aktivér tilgjengelighetsfunksjoner for å gjøre enheten din enklere å bruke.</translation>
 <translation id="1152921474424827756">Åpne en <ph name="BEGIN_LINK"/>bufret kopi<ph name="END_LINK"/> av <ph name="URL"/></translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN"/> har deaktivert markøren din.</translation>
 <translation id="6404451368029478467"><ph name="PRODUCT_NAME"/> oppdateres automatisk slik at du alltid har den nyeste versjonen. Når nedlastingen er ferdig startes <ph name="PRODUCT_NAME"/> på nytt og du kan fortsette.</translation>
@@ -2653,9 +2648,9 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8420728540268437431">Denne siden blir oversatt …</translation>
 <translation id="6256412060882652702">Powerwash <ph name="IDS_SHORT_PRODUCT_NAME"/>-enheten din</translation>
 <translation id="736515969993332243">Skanner etter nettverk.</translation>
-<translation id="7806513705704909664">Aktiver autofyll for å fylle ut nettskjemaer med ett enkelt klikk.</translation>
+<translation id="7806513705704909664">Aktivér autofyll for å fylle ut nettskjemaer med ett enkelt klikk.</translation>
 <translation id="3150994199788134383">En utvidelse har tatt kontrollen over proxy-tjenerinnstillingene dine, noe som betyr at den kan endre, ødelegge eller spionere på alt du foretar deg på nettet. Hvis du ikke er sikker på hvorfor denne endringen fant sted, vil du mest sannsynlig ikke ha den.</translation>
-<translation id="8026334261755873520">Slett logg</translation>
+<translation id="8026334261755873520">Slett nettleserdata</translation>
 <translation id="605011065011551813">En programutvidelse (<ph name="PLUGIN_NAME"/>) svarer ikke.</translation>
 <translation id="1467432559032391204">Venstre</translation>
 <translation id="6395423953133416962">Send <ph name="BEGIN_LINK1"/>systeminformasjon<ph name="END_LINK1"/> og <ph name="BEGIN_LINK2"/>-målinger<ph name="END_LINK2"/></translation>
@@ -2776,7 +2771,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8915370057835397490">Laster inn forslag …</translation>
 <translation id="264911923226702984">Amerikansk Mystery</translation>
 <translation id="1511623662787566703">Logget på som <ph name="USER_EMAIL_ADDRESS"/>. Synkronisering har blitt stoppet via Google Oversikt.</translation>
-<translation id="4352333825734680558">Beklager, den nye overvåkede brukeren kunne ikke opprettes. Kontrollér nettverksforbindelsen din og prøv på nytt senere.</translation>
+<translation id="4352333825734680558">Beklager, den nye administrerte brukeren kunne ikke opprettes. Kontrollér nettverksforbindelsen din, og prøv på nytt senere.</translation>
 <translation id="174773101815569257">Muselås</translation>
 <translation id="1758018619400202187">EAP-TLS</translation>
 <translation id="5349232103361262400">Hvis aktivert, analyseres nettsteders metatagger for installeringsvarsler for app.</translation>
@@ -2808,7 +2803,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7374461526650987610">Protokollbehandlere</translation>
 <translation id="2192505247865591433">Fra:</translation>
 <translation id="4634771451598206121">Logg på igjen</translation>
-<translation id="1035590878859356651">Legg til bokmerke for denne siden</translation>
+<translation id="1035590878859356651">Bokmerk denne siden</translation>
 <translation id="5630205793128597629">Deaktiver DirectWrite</translation>
 <translation id="3944266449990965865">Hele skjermen</translation>
 <translation id="942954117721265519">Det fins ingen bilder i denne katalogen.</translation>
@@ -2855,7 +2850,7 @@ Pass på at du ikke deler privat informasjon.</translation>
           kan ikke koble seg til mellomtjeneren.</translation>
 <translation id="7687314205250676044">Endre tilbake til <ph name="FROM_LOCALE"/> (krever avlogging)</translation>
 <translation id="1899708097738826574"><ph name="OPTIONS_TITLE"/> – <ph name="SUBPAGE_TITLE"/></translation>
-<translation id="6862635236584086457">Alle filene som lagres i denne mappen blir automatisk sikkerhetskopiert på nettet</translation>
+<translation id="6862635236584086457">Alle filene som lagres i denne mappen, blir automatisk sikkerhetskopiert på nettet</translation>
 <translation id="5854912040170951372">Pizzaelsker</translation>
 <translation id="4027804175521224372">(Du går glipp av ting – <ph name="IDS_SYNC_PROMO_NOT_SIGNED_IN_STATUS_LINK"/>)</translation>
 <translation id="8112425722462119913">Aktiver det nye galleriet</translation>
@@ -2900,11 +2895,11 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7347751611463936647">For å bruke denne utvidelsen, skriver du «<ph name="EXTENSION_KEYWORD"/>» , trykker på TAB, og skriver kommandoordet eller søkeordet.</translation>
 <translation id="878431691778285679">Det ser ut som om du allerede administrerer en bruker med det navnet.<ph name="LINE_BREAK"/>Ville du <ph name="BEGIN_LINK"/>importere <ph name="PROFILE_NAME"/> til denne enheten<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> ønsker å bruke mikrofonen din.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Apper</translation>
 <translation id="5151511998946489774">Identiteten til dette nettstedet har blitt bekreftet av <ph name="ISSUER"/> og er offentlig tilgjengelig.</translation>
 <translation id="1608626060424371292">Fjern denne brukeren</translation>
 <translation id="2779552785085366231">Denne siden kan legges til i appvelgeren</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME"/> er opprettet som overvåket bruker.</translation>
+<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME"/> er opprettet som administrert bruker.</translation>
 <translation id="3651020361689274926">Den forespurte ressursen finnes ikke lenger, og har ingen videresendingsadresse. Det antas at denne tilstanden er varig.</translation>
 <translation id="6003284010415283671">Legg til apper</translation>
 <translation id="2989786307324390836">DER-kodet binært, enkelt sertifikat</translation>
@@ -2920,7 +2915,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8193362611902704788">Aktiver appvelgeren. Når du aktiverer den, opprettes det operativsystem-snarveier til appvelgeren.</translation>
 <translation id="5121130586824819730">Harddisken din er full. Lagre på et annet sted, eller frigjør plass på harddisken.</translation>
 <translation id="1875987452136482705">Dette alternativet deaktiverer støtte i WebRTC for dekoding av videostrømmer ved hjelp plattformsmaskinvare.</translation>
-<translation id="6164005077879661055">Alle filer og lokale data tilknyttet den overvåkede brukeren slettes permanent når den overvåkede brukeren fjernes. Besøkte nettsteder og innstillinger for denne overvåkende brukeren kan fortsatt ses av administratoren på <ph name="MANAGEMENT_URL"/>.</translation>
+<translation id="6164005077879661055">Alle filer og lokale data tilknyttet den administrerte brukeren slettes permanent når den administrerte brukeren fjernes. Besøkte nettsteder og innstillinger for denne administrerte brukeren kan fortsatt ses av administratoren på <ph name="MANAGEMENT_URL"/>.</translation>
 <translation id="6723839937902243910">Strøm</translation>
 <translation id="1031460590482534116">Det oppstod en feil under lagring av klientsertifikatet. Feil <ph name="ERROR_NUMBER"/> (<ph name="ERROR_NAME"/>).</translation>
 <translation id="8221511411222784897">Chrome oppdaget at noen av nettleserens innstillinger ble endret av et annet program. De aktuelle innstillingene er tilbakestilt til de opprinnelige standardinnstillingene.</translation>
@@ -2970,7 +2965,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="2505402373176859469"><ph name="RECEIVED_AMOUNT"/> av <ph name="TOTAL_SIZE"/></translation>
 <translation id="9127762771585363996">Snu kamerabildet horisontalt</translation>
 <translation id="4724450788351008910">Tilknytning endret</translation>
-<translation id="2249605167705922988">for eksempel 1-5, 8, 11-13</translation>
+<translation id="2249605167705922988">f.eks. 1–5, 8, 11–13</translation>
 <translation id="1520505881707245707">Du kan bruke dette flagget til å slå på en funksjon som kan bekrefte om filinnholdet i utvidelsene fra nettmarkedet, samsvarer med det du kan forvente (det som er oppgitt). Med dette flagget kan du slå på funksjonen om denne ikke alt er slått på, men du kan ikke slå den av (siden det ville åpnet for at skadelig programvare kunne tuklet med denne innstillingen).</translation>
 <translation id="8572510699242209592">Gigabyte</translation>
 <translation id="8691686986795184760">(Aktivert av virksomhetens retningslinjer)</translation>
@@ -3011,7 +3006,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8119631488458759651">fjern dette nettstedet</translation>
 <translation id="158765438169997550">Hvis aktivert, gjøres tegning i en separat tråd i stedet for hovedtråden.</translation>
 <translation id="5225324770654022472">Vis appsnarveien</translation>
-<translation id="1408803555324839240">Beklager! Den nye overvåkede brukeren kunne ikke opprettes. Sjekk at du er pålogget og prøv på nytt.</translation>
+<translation id="1408803555324839240">Beklager! Den nye administrerte brukeren kunne ikke opprettes. Sjekk at du er pålogget og prøv på nytt.</translation>
 <translation id="8153607920959057464">Denne filen kan ikke vises.</translation>
 <translation id="5817397429773072584">Kinesisk (tradisjonell)</translation>
 <translation id="444134486829715816">Utvid</translation>
@@ -3023,7 +3018,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="4031910098617850788">F5</translation>
 <translation id="8960795431111723921">Vi undersøker dette problemet for øyeblikket.</translation>
 <translation id="862727964348362408">Stanset</translation>
-<translation id="2482878487686419369">Varslinger</translation>
+<translation id="2482878487686419369">Varsler</translation>
 <translation id="8004582292198964060">Nettleser</translation>
 <translation id="2040460856718599782">Beklager!  Det oppsto en feil da vi forsøkte å autentisere deg. Kontrollér påloggingslegitimasjonen, og prøv på nytt.</translation>
 <translation id="695755122858488207">Ikke valgt alternativknapp</translation>
@@ -3063,14 +3058,14 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="6739254200873843030">Kortet er utløpt. Sjekk datoen eller legg inn et nytt kort.</translation>
 <translation id="8106211421800660735">Kredittkortnummer</translation>
 <translation id="9159562891634783594">Aktiver registrering av uregistrerte nettskyskrivere fra utskriftsforhåndsvisningen.</translation>
-<translation id="8843709518995654957"><ph name="LINK_START"/>Opprett en overvåket bruker <ph name="LINK_END"/> for denne enheten.</translation>
+<translation id="8843709518995654957"><ph name="LINK_START"/>Opprett en administrert bruker<ph name="LINK_END"/> for denne enheten.</translation>
 <translation id="2872961005593481000">Avslutt</translation>
 <translation id="8986267729801483565">Plassering for nedlasting:</translation>
 <translation id="5385003951485962612">Deaktiverer støtte for SAML-pålogging for Chrome OS-pålogging.</translation>
 <translation id="2044540568167155862">Goats Teleported</translation>
 <translation id="1776712937009046120">Legg til bruker</translation>
 <translation id="506152810699123561">Beregninger knyttet til effekten <ph name="SHORT_PRODUCT_NAME"/> har på systemets minne</translation>
-<translation id="674632704103926902">Aktiver trykk og dra</translation>
+<translation id="674632704103926902">Aktivér trykk og dra</translation>
 <translation id="8954952943849489823">Flytting mislyktes på grunn av uventet feil: $1</translation>
 <translation id="2318143611928805047">Papirstørrelse</translation>
 <translation id="7100897339030255923"><ph name="COUNT"/> elementer er valgt</translation>
@@ -3127,7 +3122,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="2332131598580221120">Se i Nettmarked</translation>
 <translation id="7026338066939101231">Reduser</translation>
 <translation id="2556876185419854533">&amp;Angre endringen</translation>
-<translation id="5875858680971105888">Beklager, den overvåkede brukeren kunne ikke importeres. Sjekk nettverksforbindelsen din og prøv på nytt senere.</translation>
+<translation id="5875858680971105888">Beklager, den administrerte brukeren kunne ikke importeres. Sjekk nettverksforbindelsen din og prøv på nytt senere.</translation>
 <translation id="5411472733320185105">Ikke bruk mellomtjenerinnstillinger for følgende tjenere og domener:</translation>
 <translation id="7358682983403815415">De åpne fanene, bokmerkene, loggen og mer blir synkronisert med Google-kontoen din.</translation>
 <translation id="3685121001045880436">Det er sannsynlig at tjeneren som er vert for nettsiden har blitt overbelastet eller at det har oppstått en feil.
@@ -3202,7 +3197,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="3543393733900874979">Oppdatering mislyktes (feil: <ph name="ERROR_NUMBER"/>)</translation>
 <translation id="991969738502325513">Hva bør du gjøre?</translation>
 <translation id="1017280919048282932">&amp;Legg til i ordliste</translation>
-<translation id="3534879087479077042">Hva er en overvåket bruker?</translation>
+<translation id="3534879087479077042">Hva er en administrert bruker?</translation>
 <translation id="7211828883345145708">Aktiverer flere hurtigtaster som er nyttige for feilsøking av Chromium.</translation>
 <translation id="8319414634934645341">Utvidet bruk av nøkkel</translation>
 <translation id="6056710589053485679">Normal innlasting på nytt</translation>
@@ -3244,7 +3239,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8755376271068075440">&amp;Større</translation>
 <translation id="8132793192354020517">Tilkoblet <ph name="NAME"/></translation>
 <translation id="8187473050234053012">Tjenerens sikkerhetssertifikat er tilbakekalt.</translation>
-<translation id="7052914147756339792">Angi bakgrunnsbilde</translation>
+<translation id="7052914147756339792">Angi bakgrunn</translation>
 <translation id="5865597920301323962">Informasjonskapsler fra <ph name="DOMAIN"/> blir slettet ved avslutning.</translation>
 <translation id="2702540957532124911">Tastatur:</translation>
 <translation id="7444983668544353857">Deaktiver <ph name="NETWORKDEVICE"/></translation>
@@ -3328,7 +3323,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="5917011688104426363">Fokuser adressefelt i søkemodus</translation>
 <translation id="3269101346657272573">Skriv inn personlig kode.</translation>
 <translation id="2822854841007275488">Arabisk</translation>
-<translation id="6559948977408379772">Dette ikonet vises når du og telefonen din er i nærheten og enkel opplåsing er tilgjengelig. Bare klikk for å åpne – ingen passord kreves.</translation>
+<translation id="6559948977408379772">Dette ikonet vises når du og telefonen din er i nærheten og Enkel opplåsing er tilgjengelig. Bare klikk for å åpne – ingen passord kreves.</translation>
 <translation id="5857090052475505287">Ny mappe</translation>
 <translation id="7450732239874446337">Nettverks-IO er sperret.</translation>
 <translation id="4003393903129308792">Aktiver én-kopis rasterenhet</translation>
@@ -3355,7 +3350,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7925686952655276919">Ikke bruk mobildata ved synkronisering</translation>
 <translation id="8014914694548037591">Denne utvidelsen kan lese og endre informasjonen din på alle nettsteder, herunder Google, Facebook, Yahoo osv.</translation>
 <translation id="6503077044568424649">Mest besøkt</translation>
-<translation id="9016164105820007189">Tilknytter «<ph name="DEVICE_NAME"/>».</translation>
+<translation id="9016164105820007189">Kobler til «<ph name="DEVICE_NAME"/>».</translation>
 <translation id="7168109975831002660">Minste skriftstørrelse</translation>
 <translation id="7070804685954057874">Direkte inndata</translation>
 <translation id="2631006050119455616">Lagret</translation>
@@ -3399,11 +3394,11 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="6672789615126913676">Bruken og loggen for denne brukeren kan gjennomgås av administratoren (<ph name="CUSTODIAN_EMAIL"/>) på chrome.com</translation>
 <translation id="4010065515774514159">Nettleserhandling</translation>
 <translation id="3733533226834394996">SHA-224</translation>
-<translation id="7295019613773647480">Aktiver overvåkede brukere</translation>
+<translation id="7295019613773647480">Aktivér administrerte brukere</translation>
 <translation id="2419414843209660528">Legg til en snarvei til denne nettsiden</translation>
 <translation id="3529423920239848704">Forekomster der <ph name="SHORT_PRODUCT_NAME"/> ikke ble avsluttet på riktig måte</translation>
 <translation id="7022562585984256452">Startsiden din er angitt.</translation>
-<translation id="267285457822962309">Endre innstillinger spesifikke for enheten din og eksterne enheter.</translation>
+<translation id="267285457822962309">Endre innstillinger som er spesifikke for enheten din og eksterne enheter.</translation>
 <translation id="1154228249304313899">Åpne denne siden:</translation>
 <translation id="6976108581241006975">JavaScript-konsoll</translation>
 <translation id="60357267506638014">Tsjekkisk QWERTY</translation>
@@ -3411,7 +3406,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="3473479545200714844">Skjermforstørrer</translation>
 <translation id="6759193508432371551">Tilbakestilling til fabrikkstandard</translation>
 <translation id="2981493173545878420">Slått på for alle sider</translation>
-<translation id="3627588569887975815">Åpne linken i inkognitovindu</translation>
+<translation id="3627588569887975815">Åpne linken i inko&amp;gnitovindu</translation>
 <translation id="4916657783933881060">Hva betyr dette?</translation>
 <translation id="5851868085455377790">Utsteder </translation>
 <translation id="3549797760399244642">Gå til drive.google.com</translation>
@@ -3444,7 +3439,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="1526560967942511387">Dokument uten tittel</translation>
 <translation id="3979748722126423326">Aktiver <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA eller RSN)</translation>
-<translation id="7561031016893995297">Administrer enheter med enkel opplåsing i kontoinnstillingene dine.</translation>
+<translation id="7561031016893995297">Administrer enheter med Enkel opplåsing i kontoinnstillingene dine.</translation>
 <translation id="2238379619048995541">Data om frekvenstilstand</translation>
 <translation id="4367133129601245178">K&amp;opier bildeadressen</translation>
 <translation id="6326175484149238433">Fjern fra Chrome</translation>
@@ -3602,7 +3597,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7054808953701320293">Den er grei. Ikke vis meg dette igjen.</translation>
 <translation id="144932861331386147">Du må koble til Internett for å oppdatere Chromebook.</translation>
 <translation id="2938685643439809023">Mongolsk</translation>
-<translation id="5737306429639033676">Forutsi nettverkshandlinger for å forbedre lastingen av sider</translation>
+<translation id="5737306429639033676">Forutsi nettverkshandlinger for å forbedre innlastingen av sider</translation>
 <translation id="4530494379350999373">Opprinnelse</translation>
 <translation id="2070909990982335904">Navn som starter med et punktum, er reservert for systemet. Velg et annet navn.</translation>
 <translation id="3707020109030358290">Ikke en sertifiseringsinstans.</translation>
@@ -3615,7 +3610,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="4062251648694601778">Kos deg med <ph name="SHORT_PRODUCT_NAME"/>-enheten din. Har du spørsmål? Du kan alltid få hjelp ved å klikke på spørsmålstegnet i statusfeltet.</translation>
 <translation id="6701535245008341853">Kan ikke hente profil.</translation>
 <translation id="8303655282093186569">Inndatainnstillinger for pinyin</translation>
-<translation id="992779717417561630">Skriv ut ved hjelp av dialogen <ph name="CLOUD_PRINT_NAME"/> – <ph name="SHORTCUT_KEY"/></translation>
+<translation id="992779717417561630">Skriv ut via <ph name="CLOUD_PRINT_NAME"/>-dialogen (<ph name="SHORTCUT_KEY"/>)</translation>
 <translation id="1991402313603869273"><ph name="PLUGIN_NAME"/> tillates ikke.</translation>
 <translation id="527605982717517565">Tillat alltid JavaScript på <ph name="HOST"/></translation>
 <translation id="702373420751953740">PRL-versjon:</translation>
@@ -3633,7 +3628,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="2750518858905599015"><ph name="SHORT_PRODUCT_NAME"/> er oppdatert</translation>
 <translation id="7554791636758816595">Ny fane</translation>
 <translation id="3630337581925712713"><ph name="PERMISSION_TYPE_LABEL"/>:</translation>
-<translation id="2740393541869613458">gjennomgå nettstedene den overvåkede brukeren har besøkt, og</translation>
+<translation id="2740393541869613458">gjennomgå nettstedene den administrerte brukeren har besøkt, og</translation>
 <translation id="1114091355035739006">Bruk medianer for å minimere avvik i ytelsesdataene</translation>
 <translation id="3330616135759834145">Mottok flere distinkte Content-Disposition-overskrifter.  Dette tillates ikke, som et
         beskyttelsestiltak mot angrep som splitter HTTP-svar.</translation>
@@ -3652,7 +3647,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="4677772697204437347">GPU-minne</translation>
 <translation id="3085235303151103497">Aktiver feilsøking for pakkede apper.</translation>
 <translation id="2645575947416143543">Hvis du imidlertid jobber i en organisasjon som produserer sine egne sertifikater og du prøver å koble deg til et internt nettsted tilhørende denne organisasjonen med et slikt sertifikat, kan du muligens løse dette problemet på en trygg måte. Du kan importere organisasjonens rotsertifikat som «rotsertifikat». Da vil sertifikater som er utstedt eller bekreftet av din organisasjon, betraktes som pålitelige, og du vil ikke få denne feilen neste gang du prøver å koble deg til et internt nettsted. Ta kontakt med organisasjonens brukerstøtte for å få hjelp med å legge til et nytt rotsertifikat på datamaskinen.</translation>
-<translation id="2433728760128592593">Trykk på alt + shift for å bytte mellom inndatametoder.</translation>
+<translation id="2433728760128592593">Trykk på Alt + Shift for å bytte mellom inndatametoder.</translation>
 <translation id="1056898198331236512">Advarsel</translation>
 <translation id="5934281776477898549">Ingen oppdatering</translation>
 <translation id="537813040452600081">Sider i dette vinduet vises ikke i nettleserloggen, og de legger ikke igjen andre spor (f.eks. informasjonskapsler) på datamaskinen etter at du har logget av. Filer du laster ned og bokmerker du oppretter, lagres ikke.</translation>
@@ -3715,7 +3710,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="166278006618318542">Algoritme for enhetens offentlige nøkkel</translation>
 <translation id="5759272020525228995">Nettstedet støtte på en feil ved henting av <ph name="URL"/>. Det kan være stengt for vedlikehold eller feilaktig konfigurert.</translation>
 <translation id="4450472573074061292">Aktiver støtte for Syncfs-mapper.</translation>
-<translation id="2946119680249604491">Legg til tilknytning</translation>
+<translation id="2946119680249604491">Legg til forbindelse</translation>
 <translation id="641480858134062906">Fikk ikke lastet inn <ph name="URL"/></translation>
 <translation id="3693415264595406141">Passord:</translation>
 <translation id="8671210955687109937">Kan kommentere</translation>
@@ -3725,10 +3720,10 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7077829361966535409">Påloggingssiden kunne ikke lastes inn med de gjeldende mellomtjenerinnstillingene. <ph name="GAIA_RELOAD_LINK_START"/>Forsøk å logge deg på igjen<ph name="GAIA_RELOAD_LINK_END"/> eller endre <ph name="PROXY_SETTINGS_LINK_START"/>mellomtjenerinnstillingene<ph name="PROXY_SETTINGS_LINK_END"/>.</translation>
 <translation id="4055023634561256217">En omstart er nødvendig før enheten din kan tilbakestilles med Powerwash.</translation>
 <translation id="8088137642766812908">Forsiktig, denne funksjonen kan bite</translation>
-<translation id="7587809973037713780">Ikke la nettsteder bruke et programtillegg for å få tilgang til datamaskinen din</translation>
+<translation id="7587809973037713780">Ikke la noen nettsteder bruke et programtillegg for å få tilgang til datamaskinen din</translation>
 <translation id="4831943061551898619">Testoppstarter</translation>
 <translation id="3412265149091626468">Gå til utvalg</translation>
-<translation id="3764800135428056022">Tilby å lagre passordene dine på nett.</translation>
+<translation id="3764800135428056022">Tilby å lagre passordene du bruker på nettet.</translation>
 <translation id="5358016106459232452">Tiden det tar å fullføre en oppstart av <ph name="SHORT_PRODUCT_NAME"/> i et testmiljø</translation>
 <translation id="7509179828847922845">Forbindelsen til <ph name="HOST_NAME"/> ble avbrutt.</translation>
 <translation id="2911372483530471524">PID-navneområder</translation>
@@ -3839,7 +3834,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7385854874724088939">Det oppstod en feil under forsøket på å skrive ut. Kontroller skriveren og prøv igjen.</translation>
 <translation id="770015031906360009">Gresk</translation>
 <translation id="7455133967321480974">Bruk global standardinnstilling (Blokkér)</translation>
-<translation id="8463215747450521436">Denne overvåkede brukeren kan ha blitt slettet eller deaktivert av administratoren. Ta kontakt med administratoren hvis du vil fortsette å logge på som denne brukeren.</translation>
+<translation id="8463215747450521436">Denne administrerte brukeren kan ha blitt slettet eller deaktivert av administratoren. Ta kontakt med administratoren hvis du vil fortsette å logge på som denne brukeren.</translation>
 <translation id="3454157711543303649">Aktiveringen er fullført</translation>
 <translation id="3895034729709274924">Aktiver stille feilsøking.</translation>
 <translation id="884923133447025588">Finner ingen tilbakekallingsmekanisme.</translation>
@@ -3861,7 +3856,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8782565991310229362">Oppstart av kiosk-appen er avbrutt.</translation>
 <translation id="2252923619938421629">Bidra til å gjøre Google Chrome bedre ved å rapportere gjeldende innstillinger</translation>
 <translation id="4647697156028544508">Skriv inn PIN-koden for «<ph name="DEVICE_NAME"/>»:</translation>
-<translation id="1062866675591297858">Administrer de overvåkede brukerne dine via <ph name="BEGIN_LINK"/>oversikten for overvåkede brukere<ph name="END_LINK"/>.</translation>
+<translation id="1062866675591297858">Administrer de administrerte brukerne dine via <ph name="BEGIN_LINK"/>oversikten for administrerte brukere<ph name="END_LINK"/>.</translation>
 <translation id="7671130400130574146">Bruk systemets tittellinje og kantlinjer</translation>
 <translation id="9111791539553342076">Denne utvidelsen kunne ikke endre svaroverskriften «<ph name="HEADER_NAME"/>» i en nettverksforespørsel fordi endringen kom i konflikt med en annen utvidelse (<ph name="EXTENSION_NAME"/>).</translation>
 <translation id="9170848237812810038">&amp;Angre</translation>
@@ -3944,6 +3939,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="6460601847208524483">Finn neste</translation>
 <translation id="397703832102027365">Fullfører …</translation>
 <translation id="8146177459103116374">Hvis du allerede er registrert på denne enheten, kan du <ph name="LINK2_START"/>logge deg på som en eksisterende bruker<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Vis administrerte bokmerker</translation>
 <translation id="4856478137399998590">Mobildatatjenesten er aktivert og klar til bruk</translation>
 <translation id="3305389145870741612">Formateringsprosessen kan ta et par sekunder. Vent litt.</translation>
 <translation id="3648607100222897006">Disse eksperimentelle funksjonene kan bli endret, satt på pause eller forsvinne når som helst. Vi gir absolutt ingen garantier om hva som kan skje hvis du slår på et av disse eksperimentene – nettleseren kan til og med spontanantenne. Spøk til side: Nettleseren kan komme til å slette alle dataene dine eller sikkerheten og personvernet kan bli kompromittert på uventede måter. Eventuelle eksperimenter du aktiverer bli aktivert for alle brukere av denne nettleseren. Vær forsiktig hvis du fortsetter.</translation>
@@ -3972,7 +3968,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="2836802726677668254">Ny versjon</translation>
 <translation id="5233930340889611108">WebKit</translation>
 <translation id="8260864402787962391">Mus</translation>
-<translation id="1775135663370355363">Viser loggen fra denne enheten. <ph name="BEGIN_LINK"/>Finn ut mer<ph name="END_LINK"/></translation>
+<translation id="1775135663370355363">Viser loggen fra denne enheten. <ph name="BEGIN_LINK"/>Les mer<ph name="END_LINK"/></translation>
 <translation id="8276560076771292512">Tøm bufferen og kjør en hard nyinnlasting</translation>
 <translation id="9076523132036239772">Beklager, men angitt e-postadresse eller passord kunne ikke bekreftes. Prøv å koble deg til et nettverk først.</translation>
 <translation id="4260442535208228602">Legg til i appvelgeren</translation>
@@ -4003,7 +3999,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="1465619815762735808">Klikk for å spille av</translation>
 <translation id="6941937518557314510">Logg på <ph name="TOKEN_NAME"/> for å godkjenne <ph name="HOST_NAME"/> med sertifikatet ditt.</translation>
 <translation id="5850516540536751549">Denne filtypen støttes ikke. Gå til <ph name="BEGIN_LINK"/>Chrome Nettmarked<ph name="END_LINK"/> for å finne en app som kan åpne denne filtypen.
-    <ph name="BEGIN_LINK_HELP"/>Finn ut mer<ph name="END_LINK_HELP"/></translation>
+    <ph name="BEGIN_LINK_HELP"/>Les mer<ph name="END_LINK_HELP"/></translation>
 <translation id="7361824946268431273">En raskere, enklere og sikrere datamaskin</translation>
 <translation id="1313705515580255288">Bokmerkene, loggen og andre innstillinger synkroniseres til Google-kontoen din.</translation>
 <translation id="2099686503067610784">Slette tjenersertifikatet «<ph name="CERTIFICATE_NAME"/>»?</translation>
@@ -4039,7 +4035,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="6681668084120808868">Ta et bilde</translation>
 <translation id="1368265273904755308">Rapportér problem</translation>
 <translation id="780301667611848630">Nei takk</translation>
-<translation id="8209677645716428427">En overvåket bruker kan utforske nettet med veiledning fra deg. Som administrator for en overvåket bruker i Chrome kan du:</translation>
+<translation id="8209677645716428427">En administrert bruker kan utforske nettet med veiledning fra deg. Som administrator for en administrert bruker i Chrome kan du:</translation>
 <translation id="2812989263793994277">Ikke vis bilder</translation>
 <translation id="722363467515709460">Aktiver skjermforstørrer</translation>
 <translation id="7190251665563814471">Tillat alltid disse programtilleggene på <ph name="HOST"/></translation>
@@ -4112,7 +4108,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8686213429977032554">Denne Disk-filen er ikke delt ennå</translation>
 <translation id="2448046586580826824">Sikker HTTP-mellomtjener</translation>
 <translation id="4032534284272647190">Tilgang til <ph name="URL"/> ble avvist.</translation>
-<translation id="5958529069007801266">Overvåket bruker</translation>
+<translation id="5958529069007801266">Administrert bruker</translation>
 <translation id="3129173833825111527">Venstre marg</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/> kB (<ph name="NUM_KILOBYTES_LIVE"/> kB ubrukt)</translation>
 <translation id="5554573843028719904">Annet Wi-Fi-nettverk</translation>
@@ -4150,7 +4146,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7015226785571892184">Følgende program startes hvis du godtar denne forespørselen:
 
  <ph name="APPLICATION"/></translation>
-<translation id="177336675152937177">Data for apper tjeneren er vert for</translation>
+<translation id="177336675152937177">Appdata tjeneren er vert for</translation>
 <translation id="6804671422566312077">Åpne alle bokmerker i &amp;nytt vindu</translation>
 <translation id="4356871690555779302">Nettstedet på <ph name="HOST_NAME"/> inneholder elementer fra nettsteder som ser ut til å være vert for skadelig programvare – programvare som kan skade enheten din eller utføre handlinger uten ditt samtykke. Det å besøke et nettsted med skadelig programvare kan være nok til at den mobile enheten din blir infisert.</translation>
 <translation id="4009293373538135798">Uriktige avslutninger</translation>
@@ -4254,19 +4250,19 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="4350711002179453268">Kan ikke opprette en sikker tilkobling til tjeneren. Det kan være at tjeneren har problemer, eller at det kreves et klientautentiseringssertifikat som du mangler.</translation>
 <translation id="750509436279396091">Åpne nedlastingsmappen</translation>
 <translation id="5963026469094486319">Hent temaer</translation>
-<translation id="7586312264284919041">Har du lyst til å få denne siden oversatt?</translation>
+<translation id="7586312264284919041">Vil du få denne siden oversatt?</translation>
 <translation id="3855072293748278406">Tilgang til programtillegg utenfor testmiljø</translation>
 <translation id="8357224663288891423">Hurtigtaster for utvidelser og apper</translation>
 <translation id="1893137424981664888">Ingen programtillegg er installert.</translation>
 <translation id="4919810557098212913"><ph name="HOST"/> ønsker å bruke kameraet ditt.</translation>
 <translation id="5434706434408777842">F3</translation>
-<translation id="3718288130002896473">Atferd</translation>
+<translation id="3718288130002896473">Funksjonalitet</translation>
 <translation id="2300302924877190394">Deaktiver Google Disk på denne enheten</translation>
 <translation id="4813512666221746211">Nettverksfeil</translation>
 <translation id="8711402221661888347">Burger</translation>
 <translation id="1967178421351654130">Kortet ditt har blitt beskyttet med det virtuelle kortet for Google Wallet (<ph name="FRONTING_CREDIT_CARD"/>), og dette nummeret kommer til å vises på kvitteringen. Dette kjøpet blir fortsatt belastet til <ph name="BACKING_CREDIT_CARD"/>.</translation>
 <translation id="1254117744268754948">Valg av mappe</translation>
-<translation id="2168725742002792683">Filutvidelser</translation>
+<translation id="2168725742002792683">Filetternavn</translation>
 <translation id="7936369818837152377">Tiden det tar å gjenopprette en tidligere nettleserøkt</translation>
 <translation id="3974195870082915331">Klikk for å vise passord</translation>
 <translation id="2612676031748830579">Kortnummer</translation>
@@ -4322,10 +4318,10 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="76113267417806263">Ja, jeg er sikker</translation>
 <translation id="7209475358897642338">Hva er språket ditt?</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME"/> (administrert)</translation>
-<translation id="9149866541089851383">Rediger...</translation>
+<translation id="9149866541089851383">Rediger</translation>
 <translation id="8735794438432839558">Koble til Internett for å logge deg på Chromebook.</translation>
 <translation id="7939412583708276221">Behold uansett</translation>
-<translation id="8140778357236808512">Importer en eksisterende overvåket bruker</translation>
+<translation id="8140778357236808512">Importér en eksisterende administrert bruker</translation>
 <translation id="6953992620120116713">HTTPS via eksperimentell QUIC-protokoll.</translation>
 <translation id="8737260648576902897">Installer Adobe Reader</translation>
 <translation id="7876243839304621966">Fjern alle</translation>
@@ -4360,7 +4356,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7052500709156631672">Portner- eller mellomtjeneren mottok et ugyldig svar fra en annen tjener.</translation>
 <translation id="281133045296806353">Opprettet nytt vindu i eksisterende nettleserøkt.</translation>
 <translation id="3605780360466892872">Businessmann</translation>
-<translation id="4709423352780499397">Data lagret lokalt</translation>
+<translation id="4709423352780499397">Data som er lagret lokalt</translation>
 <translation id="8204484782770036444">• <ph name="PERMISSION"/></translation>
 <translation id="7144878232160441200">Prøv på nytt</translation>
 <translation id="3570985609317741174">Nettinnhold</translation>
@@ -4374,6 +4370,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="6869402422344886127">Avmerket avmerkingsboks</translation>
 <translation id="3428010780253032925">Deaktiver rect-basert målretting i visninger</translation>
 <translation id="5637380810526272785">Inndatametode</translation>
+<translation id="3613134908380545408">Vis <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Tilkoblingen måtte måtte prøves på nytt ved hjelp av en eldre versjon av TLS- eller SSL-protokollen. Dette betyr vanligvis at tjeneren bruker veldig gammel programvare og kan ha andre sikkerhetsproblemer.</translation>
 <translation id="404928562651467259">ADVARSEL</translation>
 <translation id="4289300219472526559">Begynn å snakke</translation>
@@ -4408,7 +4405,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME"/> krever nye tillatelser</translation>
 <translation id="5582414689677315220">Ved å klikke på «Fortsett» godtar du <ph name="LEGAL_DOC_LINK_TEXT_1"/>, <ph name="LEGAL_DOC_LINK_TEXT_2"/> og <ph name="LEGAL_DOC_LINK_TEXT_3"/>.</translation>
 <translation id="8928220460877261598">Du er nå logget på Chrome.</translation>
-<translation id="1409390508152595145">Opprett overvåket bruker</translation>
+<translation id="1409390508152595145">Opprett administrert bruker</translation>
 <translation id="7484964289312150019">Åpne alle bokmerker i &amp;nytt vindu</translation>
 <translation id="1731346223650886555">Semikolon</translation>
 <translation id="4450974146388585462">Diagnostiser</translation>
@@ -4442,7 +4439,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="8148264977957212129">Pinyin inndatametode</translation>
 <translation id="2288278176040912387">Platespiller</translation>
 <translation id="7772032839648071052">Bekreft passord</translation>
-<translation id="3676582787770338561">Slå på enkel opplåsing for denne <ph name="DEVICE_TYPE"/>-enheten.</translation>
+<translation id="3676582787770338561">Slå på Enkel opplåsing for denne <ph name="DEVICE_TYPE"/>-enheten.</translation>
 <translation id="2871813825302180988">Denne kontoen er allerede i bruk på denne enheten.</translation>
 <translation id="1642505962779453775">Det siste kvartalet</translation>
 <translation id="3323235640813116393">Gjør det mulig å lagre sider som MHTML – én enkelt tekstfil som inneholder HTML og alle underressurser.</translation>
@@ -4480,7 +4477,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="359283478042092570">Angi</translation>
 <translation id="6791586529990783225">Tilbakestill nettleserinnstillingene</translation>
 <translation id="449782841102640887">Ikke ta sjansen!</translation>
-<translation id="2927657246008729253">Endre...</translation>
+<translation id="2927657246008729253">Endre</translation>
 <translation id="7978412674231730200">Privatnøkkel</translation>
 <translation id="7026195417816346611">Lokal datalagring</translation>
 <translation id="5308380583665731573">Koble til</translation>
@@ -4617,7 +4614,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="978146274692397928">Opprinnelig tegnsettingsbredde er satt til Full</translation>
 <translation id="4775266380558160821">Tillat alltid disse programtilleggene på <ph name="HOST"/></translation>
 <translation id="6921812972154549137">Informasjonskapsler og andre nettsteds- og programtilleggsdata</translation>
-<translation id="6886871292305414135">Åpne link i ny &amp;fane</translation>
+<translation id="6886871292305414135">Åpne linken i en ny &amp;fane</translation>
 <translation id="4499634737431431434">Uker</translation>
 <translation id="7961015016161918242">Aldri</translation>
 <translation id="3950924596163729246">Får ikke tilgang til nettverket.</translation>
@@ -4656,7 +4653,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="6051028581720248124">Ved utskrift til FedEx-kontorer, godtar du <ph name="START_LINK"/>vilkårene<ph name="END_LINK"/> deres.</translation>
 <translation id="5435226530530647560">Uriktig avslutning</translation>
 <translation id="1979718561647571293">Er dette oppstartssiden du forventet?</translation>
-<translation id="6608140561353073361">Se alle informasjonskapsler og data fra nettsteder</translation>
+<translation id="6608140561353073361">Se alle informasjonskapsler og nettstedsdata</translation>
 <translation id="6485131920355264772">Kunne ikke hente informasjon om lagringsplass</translation>
 <translation id="6547316139431024316">Ikke advar om denne utvidelsen igjen</translation>
 <translation id="8007030362289124303">Lavt batteri</translation>
@@ -4674,7 +4671,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="3955493773677071476">Opprett snarveier</translation>
 <translation id="8655319619291175901">Beklager. Noe gikk galt.</translation>
 <translation id="5040262127954254034">Personvern</translation>
-<translation id="4345703751611431217">Programvareinkompatibilitet: Finn ut mer</translation>
+<translation id="4345703751611431217">Inkompatibel programvare: Les mer</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME"/> er deaktivert. Gå til <ph name="CHROME_PLUGINS_LINK"/> for å aktivere det på nytt.</translation>
 <translation id="3258281577757096226">3 sett (endelig)</translation>
 <translation id="973473557718930265">Avslutt</translation>
@@ -4704,6 +4701,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="2859369953631715804">Velg et mobilt nettverk</translation>
 <translation id="6934265752871836553">Du kan bruke ny kode som ikke er ferdig testet for å få Chrome til å gjengi innhold kjappere. Det er stor sjanse for at endringene bak denne banen kan ødelegge mye av innholdsvisningen.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Åpne alltid i Adobe Reader</translation>
 <translation id="8274359292107649245">Åpne Chrome fra skrivebordet</translation>
 <translation id="1571119610742640910">Sammensetting for bakgrunner med fast rot.</translation>
 <translation id="6514565641373682518">Denne siden har deaktivert markøren din.</translation>
@@ -4742,7 +4740,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="4799797264838369263">Dette alternativet kontrolleres av virksomhetens retningslinjer. Kontakt administratoren for mer informasjon.</translation>
 <translation id="1931152874660185993">Ingen komponenter er installert.</translation>
 <translation id="8704521619148782536">Dette tar mye lengre tid enn normalt. Du kan fortsette å vente eller avbryte og prøve på nytt senere.</translation>
-<translation id="4492190037599258964">Søkeresultater for <ph name="SEARCH_STRING"/></translation>
+<translation id="4492190037599258964">Søkeresultater for «<ph name="SEARCH_STRING"/>»</translation>
 <translation id="9154418932169119429">Dette bildet er ikke tilgjengelig utenfor Internett.</translation>
 <translation id="2739842825616753233">Spør når et nettsted krever tilgang til kameraet og mikrofonen (anbefales)</translation>
 <translation id="8940081510938872932">Datamaskinen din har for mange baller i luften nå. Prøv på nytt senere.</translation>
@@ -4757,7 +4755,7 @@ Pass på at du ikke deler privat informasjon.</translation>
 <translation id="5170477580121653719">Ledig lagringsplass på Google Disk: <ph name="SPACE_AVAILABLE"/>.</translation>
 <translation id="4114470632216071239">Lås SIM-kort (krev personlig kode for å bruke mobildata)</translation>
 <translation id="6581162200855843583">Google Disk-link</translation>
-<translation id="5783221160790377646">På grunn av en feil ble det ikke opprettet noen overvåket bruker. Prøv på nytt senere.</translation>
+<translation id="5783221160790377646">På grunn av en feil ble det ikke opprettet noen administrert bruker. Prøv på nytt senere.</translation>
 <translation id="340771324714262530">Stopp speiling</translation>
 <translation id="3303260552072730022">En utvidelse utløste full skjerm.</translation>
 <translation id="7619338682741516875">Apper holder Chrome i gang.</translation>
@@ -4874,7 +4872,7 @@ Trykk på en tast for å fortsette økten.</translation>
 <translation id="1981905533439890161">Bekreftelse av nytt program</translation>
 <translation id="7717014941119698257">Laster ned: <ph name="STATUS"/></translation>
 <translation id="2785530881066938471">Kan ikke laste inn filen «<ph name="RELATIVE_PATH"/>» for innholdsskript. Den er ikke UTF-8-kodet.</translation>
-<translation id="8744525654891896746">Velg et brukerbilde for denne overvåkede brukeren</translation>
+<translation id="8744525654891896746">Velg et brukerbilde for denne administrerte brukeren</translation>
 <translation id="3807747707162121253">&amp;Avbryt</translation>
 <translation id="202352106777823113">Nedlastingen tok for lang tid og ble stoppet av nettverket.</translation>
 <translation id="6155817405098385604">Ikke bruk 3D-programvare for rasterisering som alternativ når GPU ikke kan brukes.</translation>
@@ -4902,13 +4900,14 @@ Trykk på en tast for å fortsette økten.</translation>
 <translation id="824543159844843373">Aktiver programlisteelement 3</translation>
 <translation id="3819800052061700452">&amp;Full skjerm</translation>
 <translation id="48607902311828362">Flymodus</translation>
+<translation id="711840821796638741">Vis administrerte bokmerker</translation>
 <translation id="3360297538363969800">Utskriften mislyktes. Kontrollér skriveren og prøv på nytt.</translation>
 <translation id="680572642341004180">Aktiver RLZ-sporing for <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Vi ber deg slutte å bruke den tilbakekalte laderen.</translation>
 <translation id="4746971725921104503">Det kan virke som om du allerede administrerer en bruker med det navnet. Ville du <ph name="LINK_START"/>importere <ph name="USER_DISPLAY_NAME"/> til denne enheten<ph name="LINK_END"/>?</translation>
 <translation id="8142699993796781067">Privat nettverk</translation>
 <translation id="3517839692979918726"><ph name="APP_NAME"/> ønsker å dele innholdet på skjermen din. Velg hva du ønsker å dele.</translation>
-<translation id="1374468813861204354">forslag</translation>
+<translation id="1374468813861204354">forslagene</translation>
 <translation id="5906065664303289925">Maskinvareadresse:</translation>
 <translation id="2498436043474441766">Legg til skrivere</translation>
 <translation id="1190144681599273207">Henting av denne filen kommer til å bruke ca. <ph name="FILE_SIZE"/> mobildata.</translation>
@@ -5053,7 +5052,7 @@ Vil du godta dette?</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="421182450098841253">&amp;Vis bokmerkerad</translation>
 <translation id="2948083400971632585">På innstillingssiden kan du deaktivere eventuelle mellomtjenere for tilkoblinger.</translation>
-<translation id="4481249487722541506">Last upakket utvidelse</translation>
+<translation id="4481249487722541506">Last inn upakket utvidelse</translation>
 <translation id="356512994079769807">Systeminstallasjonsinnstillinger</translation>
 <translation id="8180239481735238521">side</translation>
 <translation id="7532099961752278950">Angitt av program:</translation>
@@ -5121,13 +5120,13 @@ Vil du godta dette?</translation>
 <translation id="6815551780062710681">rediger</translation>
 <translation id="6911468394164995108">Koble til annet</translation>
 <translation id="2510708650472996893">Fargeprofil:</translation>
-<translation id="343467364461911375">Noen innholdstjenester bruker maskinidentifikatorer for å identifisere deg med tanke på autorisasjon for tilgang til beskyttet innhold.</translation>
+<translation id="343467364461911375">Noen innholdstjenester bruker maskinidentifikatorer for å identifisere deg før du får tilgang til beskyttet innhold.</translation>
 <translation id="5061708541166515394">Kontrast</translation>
 <translation id="3307950238492803740">Feilsøk alt.</translation>
 <translation id="2087822576218954668">Skriv ut: <ph name="PRINT_NAME"/></translation>
 <translation id="747459581954555080">Gjenopprett alt</translation>
 <translation id="7602079150116086782">Ingen faner fra andre enheter</translation>
-<translation id="7167486101654761064">&amp;Alltid åpne filer av denne typen</translation>
+<translation id="7167486101654761064">Åpne &amp;alltid filer av denne typen</translation>
 <translation id="6218364611373262432">Tilbakestill installeringstilstanden til appvelgeren ved hver oppstart. Når dette flagget er angitt, anser Chrome appvelgeren som ikke-installert ved alle oppstarter. Dette gjøres for å teste installeringsflyten til appvelgeren.</translation>
 <translation id="4396124683129237657">Nytt kredittkort</translation>
 <translation id="4103763322291513355">Gå til &lt;strong&gt;chrome://policy&lt;/strong&gt; for å se listen over sperrede nettadresser og andre innstillinger aktivert av systemadministratoren din.</translation>
@@ -5140,7 +5139,7 @@ Vil du godta dette?</translation>
 <translation id="8241806945692107836">Fastslår enhetskonfigurasjonen …</translation>
 <translation id="2273562597641264981">Operatør:</translation>
 <translation id="122082903575839559">Signaturalgoritme for sertifikat</translation>
-<translation id="9013587737291179248">Ojsann! Den overvåkede brukeren kunne ikke importeres. Sjekk harddiskplassen og tillatelsene dine og prøv på nytt.</translation>
+<translation id="9013587737291179248">Ojsann! Den administrerte brukeren kunne ikke importeres. Sjekk harddiskplassen og tillatelsene dine, og prøv på nytt.</translation>
 <translation id="7254951428499890870">Er du sikker på at du ønsker å starte <ph name="APP_NAME"/> i diagnostikkmodus?</translation>
 <translation id="4462159676511157176">Egendefinerte navnetjenere</translation>
 <translation id="4575703660920788003">Trykk på Shift + Alt for å bytte tastaturoppsett.</translation>
@@ -5152,7 +5151,7 @@ Vil du godta dette?</translation>
 <translation id="7056526158851679338">&amp;Inspiser enheter</translation>
 <translation id="1718559768876751602">Opprett Google-konto nå</translation>
 <translation id="7408287099496324465">Hvis aktivert, blir API-en for innebygde søk brukt til å sende inn søkene på siden med søkeresultater.</translation>
-<translation id="2731710757838467317">Oppretter den overvåkede brukeren din. Dette kan ta litt tid.</translation>
+<translation id="2731710757838467317">Oppretter den administrerte brukeren din. Dette kan ta litt tid.</translation>
 <translation id="1884319566525838835">Sandkassestatus</translation>
 <translation id="2770465223704140727">Fjern fra listen</translation>
 <translation id="8314013494437618358">Trådbasert sammensetting</translation>
@@ -5170,7 +5169,7 @@ Vil du godta dette?</translation>
 <translation id="7353601530677266744">Kommandolinje </translation>
 <translation id="2766006623206032690">&amp;Lim inn og gå til</translation>
 <translation id="5286673433070377078">Gjengivelsesbaner som ikke er testet – STOR SJANSE FOR AT NETTLESEREN DIN KRASJER</translation>
-<translation id="4682551433947286597">Bakgrunnsbilder vises på påloggingsskjermen.</translation>
+<translation id="4682551433947286597">Bakgrunner vises på påloggingsskjermen.</translation>
 <translation id="4394049700291259645">Deaktiver</translation>
 <translation id="5284518706373932381">Du bør komme tilbake til denne siden om noen timer. Google Safe Browsing oppdaget nylig<ph name="BEGIN_LINK"/>skadelig programvare<ph name="END_LINK"/> på <ph name="SITE"/>. Nettsteder som vanligvis er trygge, er noen ganger infisert med skadelig programvare.</translation>
 <translation id="969892804517981540">Offisiell delversjon</translation>
index ba64c5b..3f9cd03 100644 (file)
@@ -3937,6 +3937,7 @@ i nieprawidłowe poświadczenia. Albo osoba atakująca próbuje podszyć się po
 <translation id="6460601847208524483">Znajdź następne</translation>
 <translation id="397703832102027365">Kończę...</translation>
 <translation id="8146177459103116374">Jeśli zarejestrowałeś się już na tym urządzeniu, możesz <ph name="LINK2_START"/>zalogować się jako istniejący użytkownik<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Pokaż zakładki zarządzane</translation>
 <translation id="4856478137399998590">Komórkowa usługa transmisji danych została aktywowana i jest gotowa do użycia</translation>
 <translation id="3305389145870741612">Proces formatowania może potrwać kilka sekund. Czekaj.</translation>
 <translation id="3648607100222897006">Funkcje eksperymentalne mogą w dowolnej chwili ulec zmianie, awarii lub też zostać wycofane. Nie dajemy absolutnie żadnych gwarancji dotyczących tego, co się może stać po włączeniu jednego z tych eksperymentów – równie dobrze może dojść do samozapłonu przeglądarki. Żarty żartami, ale teoretycznie jest możliwe na przykład usunięcie wszystkich Twoich danych przez przeglądarkę lub nieprzewidziane naruszenie Twojego bezpieczeństwa i prywatności. Każdy włączony eksperyment zostanie włączony dla wszystkich użytkowników tej przeglądarki. Prosimy o zachowanie ostrożności.</translation>
@@ -4365,6 +4366,7 @@ i nieprawidłowe poświadczenia. Albo osoba atakująca próbuje podszyć się po
 <translation id="6869402422344886127">Zaznaczone pole wyboru</translation>
 <translation id="3428010780253032925">Wyłącz oparte na prostokątach kierowanie w widokach</translation>
 <translation id="5637380810526272785">Sposób wprowadzania tekstu</translation>
+<translation id="3613134908380545408">Pokaż <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Konieczne było ponowienie próby połączenia przy użyciu starszej wersji protokołu TLS lub SSL. To zwykle oznacza, że serwer używa bardzo starego oprogramowania i może zawierać inne luki w zabezpieczeniach.</translation>
 <translation id="404928562651467259">OSTRZEŻENIE</translation>
 <translation id="4289300219472526559">Zacznij mówić</translation>
@@ -4696,6 +4698,7 @@ i nieprawidłowe poświadczenia. Albo osoba atakująca próbuje podszyć się po
 <translation id="2859369953631715804">Wybierz sieć komórkową</translation>
 <translation id="6934265752871836553">Użyj najnowszego, nieprzetestowanego kodu, by przyspieszyć wyświetlanie materiałów w Chrome. Zmiany mogą jednak spowodować zatrzymanie dużej ilości treści.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Zawsze otwieraj w Adobe Reader</translation>
 <translation id="8274359292107649245">Otwórz Chrome na pulpicie</translation>
 <translation id="1571119610742640910">Komponowanie w celu uzyskania stałych teł podstawowych.</translation>
 <translation id="6514565641373682518">Ta strona wyłączyła kursor myszy.</translation>
@@ -4891,6 +4894,7 @@ Naciśnij dowolny klawisz, by kontynuować przeglądanie.</translation>
 <translation id="824543159844843373">Aktywuj element 3 programu uruchamiającego</translation>
 <translation id="3819800052061700452">&amp;Pełny ekran</translation>
 <translation id="48607902311828362">Tryb samolotowy</translation>
+<translation id="711840821796638741">Pokaż zakładki zarządzane</translation>
 <translation id="3360297538363969800">Drukowanie nie udało się. Sprawdź swoją drukarkę i spróbuj ponownie.</translation>
 <translation id="680572642341004180">Włącz monitorowanie RLZ w <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Nie korzystaj już więcej z wycofanej ładowarki.</translation>
index df00701..092b98f 100644 (file)
@@ -96,7 +96,7 @@
 <translation id="4764776831041365478">A página da web em <ph name="URL"/> pode estar temporariamente indisponível ou pode ter sido movida permanentemente para um novo endereço da web.</translation>
 <translation id="6156863943908443225">Cache de script</translation>
 <translation id="4274187853770964845">Erro de sincronização: pare e reinicie o processo.</translation>
-<translation id="6499114579475440437">Fazer login para pagar com a Carteira virtual do Google</translation>
+<translation id="6499114579475440437">Fazer login para pagar com a Google Wallet</translation>
 <translation id="656293578423618167">O caminho ou nome do arquivo é muito longo. Salve com um nome mais curto ou em outro local.</translation>
 <translation id="3484869148456018791">Obter novo certificado</translation>
 <translation id="151501797353681931">Importados do Safari</translation>
 <translation id="1461041542809785877">Desempenho</translation>
 <translation id="2861301611394761800">A atualização do sistema foi concluída. Reinicie o sistema.</translation>
 <translation id="551752069230578406">Adicionando a impressora a sua conta. Isso pode demorar um pouco...</translation>
-<translation id="2108058520826444209">Aviso: você não está conectado aos servidores de produção da Carteira virtual do Google. Os cartões emitidos serão invalidados.</translation>
+<translation id="2108058520826444209">Aviso: você não está conectado aos servidores de produção da Google Wallet. Os cartões emitidos serão invalidados.</translation>
 <translation id="4858913220355269194">Pelé</translation>
 <translation id="2231238007119540260">Ao excluir um certificado do servidor, você restaura as verificações de segurança normais do servidor e solicita que ele utilize um certificado válido.</translation>
-<translation id="6489433341782457580">Para desenvolvedores: use o serviço de sandbox para chamadas da API da Carteira virtual do Google para requestAutocomplete().</translation>
+<translation id="6489433341782457580">Para desenvolvedores: use o serviço de sandbox para chamadas da API da Google Wallet para requestAutocomplete().</translation>
 <translation id="8186609076106987817">O servidor não encontrou o arquivo.</translation>
 <translation id="2846816712032308263">Ativa o fechamento rápido de guias/janelas – executa um gerenciador js de onunload da guia, independentemente da GUI.</translation>
 <translation id="9134410174832249455">O <ph name="PRODUCT_NAME"/> não pôde carregar a página porque <ph name="HOST_NAME"/> demorou muito para responder. O site está em manutenção ou sua conexão com a Internet não está funcionando.</translation>
 <translation id="8651324101757295372">Bater papo com esta pessoa</translation>
 <translation id="6460423884798879930">Ativar a opção de enviar informações extras de autenticação no pacote SYN inicial para um cliente anteriormente conectado, permitindo mais rapidez no início do envio de dados.</translation>
 <translation id="6563261555270336410">Detalhes sobre <ph name="ELEMENTS_HOST_NAME"/></translation>
-<translation id="3200025317479269283">Divirta-se. Estamos aqui para ajudá-lo.</translation>
+<translation id="3200025317479269283">Divirta-se! Estamos aqui para ajudá-lo.</translation>
 <translation id="5656983780125483728">Revertendo para atualização anterior do <ph name="IDS_SHORT_PRODUCT_NAME"/>.</translation>
 <translation id="3470502288861289375">Copiando...</translation>
 <translation id="2719473049159220459">Emissor: <ph name="ISSUER"/></translation>
 <translation id="1986824139605408742">Se não conseguir lembrar sua senha, você poderá prosseguir, mas os dados locais serão perdidos. Apenas as configurações e os dados sincronizados serão recuperados.</translation>
 <translation id="9123413579398459698">Proxy FTP</translation>
 <translation id="1751752860232137596">Habilitar implementação experimental de rolagem suave.</translation>
-<translation id="9142627797714859698">Ao clicar em &quot;Continuar&quot;, você concorda em usar a Carteira virtual do Google. Para protegê-lo de fraudes, as informações sobre seu computador (incluindo seu local) serão compartilhadas com a Carteira virtual do Google.</translation>
+<translation id="9142627797714859698">Ao clicar em &quot;Continuar&quot;, você concorda em usar a Google Wallet. Para protegê-lo de fraudes, as informações sobre seu computador (incluindo seu local) serão compartilhadas com a Google Wallet.</translation>
 <translation id="8534801226027872331">Nesse caso, o certificado apresentado ao navegador tem erros e não pode ser compreendido. Desse modo, não conseguimos reconhecer as informações de identidade do certificado ou algumas outras informações do certificado foram usadas para proteger a conexão. Você não deve continuar.</translation>
 <translation id="3608527593787258723">Ativar a guia 1</translation>
 <translation id="4130750466177569591">Aceito</translation>
 <translation id="3873139305050062481">&amp;Inspecionar elemento</translation>
 <translation id="7445762425076701745">A identidade do servidor ao qual você está conectado não pode ser validada completamente. Você está conectado ao servidor com um nome válido somente na sua rede e que, portanto, uma autoridade de certificação externa não consegue validar a propriedade. Como algumas autoridades de certificação emitem certificados para esses nomes mesmo assim, não é possível garantir que você esteja conectado ao site que gostaria e não a um invasor.</translation>
 <translation id="1556537182262721003">Não foi possível mover o diretório de extensões para o perfil.</translation>
-<translation id="2946640296642327832">Ativar bluetooth</translation>
+<translation id="2946640296642327832">Ativar Bluetooth</translation>
 <translation id="5866557323934807206">Limpar estas configurações para visitas futuras</translation>
 <translation id="126710816202626562">Idioma de tradução:</translation>
 <translation id="1194381338562257973">Ativar aplicativos temporários experimentais.</translation>
 <translation id="1353966721814789986">Páginas de inicialização</translation>
 <translation id="5233019165164992427">Porta de depuração de Cliente nativo</translation>
 <translation id="2617604345341980855">Mesmo que você já tenha visitado este website com segurança anteriormente, é muito provável que visitá-lo agora infecte seu dispositivo com malware.</translation>
-<translation id="2038896902310685531">Ops, <ph name="WALLET_ERROR"/> Conclua esta transação sem a Carteira virtual do Google.</translation>
+<translation id="2038896902310685531">Ops, <ph name="WALLET_ERROR"/> Conclua esta transação sem a Google Wallet.</translation>
 <translation id="3925573269917483990">Câmera:</translation>
 <translation id="3170072451822350649">Também é possível ignorar o login e <ph name="LINK_START"/>navegar como visitante<ph name="LINK_END"/>.</translation>
 <translation id="8390449457866780408">Servidor não disponível.</translation>
@@ -887,7 +887,7 @@ Todos os usuários devem sair para continuar.</translation>
 <translation id="4307281933914537745">Saiba mais sobre a recuperação de sistema</translation>
 <translation id="2849936225196189499">Crítico</translation>
 <translation id="9001035236599590379">Tipo MIME</translation>
-<translation id="7238207184783103780">A Carteira virtual do Google está indisponível no momento.</translation>
+<translation id="7238207184783103780">A Google Wallet está indisponível no momento.</translation>
 <translation id="3451859089869683931">Número de telefone inválido. Verifique e tente novamente.</translation>
 <translation id="3464868340187708956">Adicionar novo usuário</translation>
 <translation id="7986039047000333986">Uma atualização especial de segurança para <ph name="PRODUCT_NAME"/> foi aplicada. Para que ela tenha efeito, é necessário reiniciar agora (suas guias serão restauradas).</translation>
@@ -1019,7 +1019,7 @@ Dica: o modo de navegação anônimo <ph name="SHORTCUT_KEY"/> pode ser útil da
 <translation id="159359590073980872">Cache de imagem</translation>
 <translation id="4668711410219362250">https://support.google.com/chrome/bin/answer.py?hl=pt-BR<ph name="GRITLANGCODE_1"/>&amp;answer=165139&amp;p=settings_sign_in</translation>
 <translation id="3586931643579894722">Ocultar detalhes</translation>
-<translation id="6285395082104474418">A bandeja de status mostra o estado atual da rede, da bateria, dentre outros.</translation>
+<translation id="6285395082104474418">A bandeja de status mostra o estado atual da rede e da bateria, dentre outros.</translation>
 <translation id="3317459757438853210">Frente e verso</translation>
 <translation id="6020949471045037306">Ativa o novo sistema de gerenciamento de perfis, incluindo bloqueio de perfis e a nova interface de usuário do menu de avatar.</translation>
 <translation id="2011110593081822050">Operador da web: <ph name="WORKER_NAME"/></translation>
@@ -1048,7 +1048,7 @@ Dica: o modo de navegação anônimo <ph name="SHORTCUT_KEY"/> pode ser útil da
 <translation id="5334142896108694079">Cache de script</translation>
 <translation id="4801512016965057443">Permitir roaming de dados móveis</translation>
 <translation id="473546211690256853">Esta conta é gerenciada por <ph name="DOMAIN"/></translation>
-<translation id="7952477692462853927">A Carteira virtual do Google encontrou um erro.</translation>
+<translation id="7952477692462853927">A Google Wallet encontrou um erro.</translation>
 <translation id="288024221176729610">Tcheco</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="4839122884004914586">Substituir a lista de renderização do software</translation>
@@ -1128,7 +1128,7 @@ Dica: o modo de navegação anônimo <ph name="SHORTCUT_KEY"/> pode ser útil da
 <translation id="8688579245973331962">Não encontra seu nome?</translation>
 <translation id="3804941997676372569">Pesquise ou diga &quot;Ok Google&quot;</translation>
 <translation id="3226128629678568754">Pressione o botão &quot;Atualizar&quot; para reenviar os dados necessários para carregar a página.</translation>
-<translation id="1384035515048721170"><ph name="LEGAL_DOC_AGREEMENT"/> Para protegê-lo de fraudes, as informações sobre seu computador (incluindo seu local) serão compartilhadas com a Carteira virtual do Google.</translation>
+<translation id="1384035515048721170"><ph name="LEGAL_DOC_AGREEMENT"/> Para protegê-lo de fraudes, as informações sobre seu computador (incluindo seu local) serão compartilhadas com a Google Wallet.</translation>
 <translation id="6166101525540035714">O uso do Google Chrome está sujeito aos <ph name="BEGIN_LINK1"/>Termos de Serviço<ph name="END_LINK1"/> e ao <ph name="BEGIN_LINK2"/>Aviso de Privacidade<ph name="END_LINK2"/> do Google Chrome.</translation>
 <translation id="702455272205692181"><ph name="EXTENSION_NAME"/></translation>
 <translation id="6871690136546646783">Desativa o suporte ao ajuste de toque. O ajuste de toque é o processo de refinamento da posição de um gesto de toque, a fim de compensar toques com baixa resolução em comparação a um mouse.</translation>
@@ -1426,7 +1426,7 @@ Dica: o modo de navegação anônimo <ph name="SHORTCUT_KEY"/> pode ser útil da
 <translation id="4421932782753506458">Pelúcia</translation>
 <translation id="962520199903263026">Teste de campo de feedback para verificação ortográfica.</translation>
 <translation id="6051086608691487286">Barras de rolagem de sobreposição</translation>
-<translation id="6132509723755265994">Este comerciante não é aceito pela Carteira virtual do Google.</translation>
+<translation id="6132509723755265994">Este comerciante não é aceito pela Google Wallet.</translation>
 <translation id="2378075407703503998"><ph name="SELCTED_FILE_COUNT"/> arquivos selecionados</translation>
 <translation id="4498419978438799658">Acessar todo o texto falado com voz sintetizada</translation>
 <translation id="7339898014177206373">Nova janela</translation>
@@ -1439,7 +1439,7 @@ Dica: o modo de navegação anônimo <ph name="SHORTCUT_KEY"/> pode ser útil da
 <translation id="2995880258819891653">Ativa o último item do iniciador</translation>
 <translation id="6913830198853875055">Quando a pré-busca está ativada, os resultados da pesquisa são exibidos no lugar da página original, no momento do download e do processamento.</translation>
 <translation id="6561442619165486567">Altere a forma como esse arquivo é compartilhado.</translation>
-<translation id="5332360333956573658">Não foi possível salvar os dados na Carteira virtual do Google.</translation>
+<translation id="5332360333956573658">Não foi possível salvar os dados na Google Wallet.</translation>
 <translation id="3759371141211657149">Gerenciar configurações de manipulador ...</translation>
 <translation id="8856844195561710094">Falha ao interromper a descoberta de dispositivos bluetooth.</translation>
 <translation id="2246340272688122454">Fazendo download da imagem de recuperação...</translation>
@@ -1644,7 +1644,7 @@ Depois que um novo usuário supervisionado é criado, é possível gerenciar as
 <translation id="8293206222192510085">Adicionar favorito</translation>
 <translation id="2592884116796016067">Uma parte desta página (HTML WebWorker) travou. Por isso, é possível que ela não funcione corretamente.</translation>
 <translation id="4411578466613447185">Signatário do código</translation>
-<translation id="3029595853063638932">Gerando o cartão virtual da Carteira virtual do Google...</translation>
+<translation id="3029595853063638932">Gerando o Cartão Google Wallet virtual...</translation>
 <translation id="1354868058853714482">O Adobe Reader está desatualizado e pode oferecer insegurança.</translation>
 <translation id="6915711422691334155">Esta extensão pode ler e alterar todos os dados no seu computador e todos os websites, incluindo Google, Facebook, Yahoo etc.</translation>
 <translation id="6095666334801788310">Insira sua senha novamente</translation>
@@ -2422,7 +2422,7 @@ Não exponha nenhuma informação confidencial.</translation>
 <translation id="2563185590376525700">Rã</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME"/> não pôde se conectar a <ph name="NETWORK_ID"/>. Selecione outra rede ou tente novamente.</translation>
 <translation id="2086712242472027775">Sua conta não funciona com <ph name="PRODUCT_NAME"/>. Entre em contato com o administrador do domínio ou use uma Conta do Google normal para fazer login.</translation>
-<translation id="1970103697564110434">A Carteira virtual do Google está protegendo seu cartão</translation>
+<translation id="1970103697564110434">A Google Wallet está protegendo seu cartão</translation>
 <translation id="7222232353993864120">Endereço de e-mail</translation>
 <translation id="2128531968068887769">Cliente nativo</translation>
 <translation id="7175353351958621980">Carregado de:</translation>
@@ -3152,7 +3152,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="1002064594444093641">&amp;Imprimir frame...</translation>
 <translation id="7816975051619137001">Corrigir ortografia automaticamente</translation>
 <translation id="4608500690299898628">&amp;Buscar...</translation>
-<translation id="7068997575282883954">Salvar e proteger seus dados com o Google Wallet.</translation>
+<translation id="7068997575282883954">Salvar e proteger seus dados com a Google Wallet.</translation>
 <translation id="7582582252461552277">Preferir esta rede</translation>
 <translation id="3574305903863751447"><ph name="CITY"/>, <ph name="STATE"/> <ph name="COUNTRY"/></translation>
 <translation id="8724859055372736596">&amp;Mostrar na pasta</translation>
@@ -3462,7 +3462,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="1531961661616401172">Ativar Notificações sincronizadas experimentais.</translation>
 <translation id="7361039089383199231">$1 bytes</translation>
 <translation id="191688485499383649">Ocorreu um erro desconhecido ao tentar conectar-se a &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
-<translation id="7208594729785140450">O Google Wallet não suporta esta versão do Google Chrome ou não reconhece sua chave da API do Google.</translation>
+<translation id="7208594729785140450">A Google Wallet não suporta esta versão do Google Chrome ou não reconhece sua chave da API do Google.</translation>
 <translation id="6874681241562738119">Erro de login</translation>
 <translation id="5135533361271311778">Não foi possível criar um item de favorito.</translation>
 <translation id="4477219268485577442">Búlgaro fonético</translation>
@@ -3476,7 +3476,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="2680208403056680091">Sua conexão com a Internet está sendo controlada</translation>
 <translation id="8662978096466608964">O Google Chrome não pode definir o plano de fundo.</translation>
 <translation id="5334844597069022743">Exibir código fonte</translation>
-<translation id="5534520101572674276">Calculando tamanho</translation>
+<translation id="5534520101572674276">Calculando tamanho...</translation>
 <translation id="9024127637873500333">&amp;Abrir em nova guia</translation>
 <translation id="1145509906569575332">Abrir área de trabalho Ash</translation>
 <translation id="2332742915001411729">Redefinir para os valores padrão</translation>
@@ -3892,14 +3892,14 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="3672159315667503033"><ph name="URL"/> quer armazenar permanentemente dados grandes no computador local.</translation>
 <translation id="373572798843615002">1 guia</translation>
 <translation id="4806065163318322702">Ativar entrada de fala</translation>
-<translation id="6190185222845843088">Usar servidores da sandbox da Carteira virtual do Google</translation>
+<translation id="6190185222845843088">Usar servidores da sandbox da Google Wallet</translation>
 <translation id="3574772456110518971">Desativar o suporte experimental do Chromecast que permite reproduzir e controlar vídeos da Web em dispositivos Chromecast.</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME"/> (nome usado neste dispositivo)</translation>
 <translation id="3177048931975664371">Clique para ocultar senha</translation>
 <translation id="5852137567692933493">Reiniciar e executar PowerWash</translation>
 <translation id="3092544800441494315">Incluir esta captura de tela:</translation>
 <translation id="2633199387167390344"><ph name="NAME"/> está usando <ph name="USAGE"/> MB de espaço em disco.</translation>
-<translation id="472177018469288237">A Carteira virtual do Googel está desativada</translation>
+<translation id="472177018469288237">A Google Wallet está desativada</translation>
 <translation id="7730449930968088409">Capturar o conteúdo da sua tela</translation>
 <translation id="1431605150566631089">Verifique o carregador</translation>
 <translation id="5330145655348521461">Estes arquivos estão abertos em uma área de trabalho diferente. Mude para <ph name="USER_NAME"/> (<ph name="MAIL_ADDRESS"/>) para vê-los.</translation>
@@ -3927,7 +3927,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="7017480957358237747">permitir ou proibir determinados websites,</translation>
 <translation id="1029595648591494741">Testar &quot;<ph name="EXTENSION_NAME"/>&quot;?</translation>
 <translation id="5423849171846380976">Ativado</translation>
-<translation id="4080955692611561961">Desativar Carteira virtual do Google</translation>
+<translation id="4080955692611561961">Desativar Google Wallet</translation>
 <translation id="7077872827894353012">Manipuladores de protocolo ignorados</translation>
 <translation id="3158564748719736353">Se ativada, uma notificação é exibida quando o dispositivo é conectado a uma rede do portal cativo.</translation>
 <translation id="5397794290049113714">Você</translation>
@@ -3944,6 +3944,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="6460601847208524483">Localizar próximo</translation>
 <translation id="397703832102027365">Finalizando...</translation>
 <translation id="8146177459103116374">Se você já se registrou neste dispositivo, pode <ph name="LINK2_START"/>fazer login como usuário existente<ph name="LINK2_END"/> .</translation>
+<translation id="5072836811783999860">Mostrar favoritos gerenciados</translation>
 <translation id="4856478137399998590">Seu serviço de dados móveis foi ativado e está pronto para ser usado</translation>
 <translation id="3305389145870741612">O processo de formatação pode levar alguns segundos. Aguarde.</translation>
 <translation id="3648607100222897006">Estes recursos experimentais podem ser alterados, cancelados ou desaparecer a qualquer momento. Não oferecemos qualquer garantia sobre o que possa acontecer ao ativar algum desses experimentos: seu navegador pode inclusive entrar em combustão espontânea. Brincadeiras à parte, o navegador pode excluir todos seus dados ou comprometer sua segurança e privacidade de maneira inesperada. Experimentos ativados serão habilitados para todos os usuários do navegador, portanto tenha cautela ao prosseguir.</translation>
@@ -4096,7 +4097,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="8962198349065195967">Esta rede é configurada por seu administrador.</translation>
 <translation id="357479282490346887">Lituano</translation>
 <translation id="2143778271340628265">Configuração manual de proxy</translation>
-<translation id="440150639010863291">Usar a Carteira virtual do Google</translation>
+<translation id="440150639010863291">Usar a Google Wallet</translation>
 <translation id="8888432776533519951">Cor:</translation>
 <translation id="5294529402252479912">Atualize o Adobe Reader agora</translation>
 <translation id="641087317769093025">Não foi possível descompactar a extensão</translation>
@@ -4263,7 +4264,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="2300302924877190394">Desativar o Google Drive neste dispositivo</translation>
 <translation id="4813512666221746211">Erro na rede</translation>
 <translation id="8711402221661888347">Xis</translation>
-<translation id="1967178421351654130">Seu cartão foi protegido pelo cartão virtual da Carteira virtual do Google (<ph name="FRONTING_CREDIT_CARD"/>) e este número aparecerá em seu recibo. Esta compra ainda será cobrada em seu <ph name="BACKING_CREDIT_CARD"/>.</translation>
+<translation id="1967178421351654130">Seu cartão foi protegido pelo Cartão Google Wallet virtual (<ph name="FRONTING_CREDIT_CARD"/>) e este número aparecerá em seu recibo. Esta compra ainda será cobrada em seu <ph name="BACKING_CREDIT_CARD"/>.</translation>
 <translation id="1254117744268754948">Escolher pasta</translation>
 <translation id="2168725742002792683">Extensões de arquivo</translation>
 <translation id="7936369818837152377">O tempo que leva para restaurar uma sessão de navegação anterior</translation>
@@ -4373,6 +4374,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="6869402422344886127">Caixa de seleção marcada</translation>
 <translation id="3428010780253032925">Desativar segmentação baseada em retângulo nas visualizações</translation>
 <translation id="5637380810526272785">Método de entrada</translation>
+<translation id="3613134908380545408">Mostrar <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Foi necessário fazer uma nova tentativa de conexão usando uma versão mais antiga do protocolo TLS ou SSL. Isso normalmente significa que o servidor está usando software muito antigo e pode apresentar outros problemas de segurança.</translation>
 <translation id="404928562651467259">AVISO</translation>
 <translation id="4289300219472526559">Comece a falar</translation>
@@ -4387,7 +4389,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="5556459405103347317">Recarregar</translation>
 <translation id="7464861219980961605">Excluir senhas salvas</translation>
 <translation id="7507930499305566459">Certificado do respondente de status</translation>
-<translation id="5831217499016131155">Carteira virtual do Google</translation>
+<translation id="5831217499016131155">Google Wallet</translation>
 <translation id="3958088479270651626">Importar favoritos e configurações</translation>
 <translation id="8518865679229538285">Método de entrada Tamil (máquina de escrever)</translation>
 <translation id="4918745183464912186">Austrália</translation>
@@ -4527,7 +4529,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="1698647588772720278">Desativar APIs Encrypted Media Extensions prefixadas.</translation>
 <translation id="2286454467119466181">Simples</translation>
 <translation id="6666647326143344290">com sua Conta do Google</translation>
-<translation id="4564097437843356814">Há algo errado com sua conta da Carteira virtual do Google.</translation>
+<translation id="4564097437843356814">Há algo errado com sua conta da Google Wallet.</translation>
 <translation id="4547992677060857254">A pasta selecionada contém arquivos confidenciais. Tem certeza de que deseja conceder a &quot;$1&quot; acesso permanente de gravação a esta pasta?</translation>
 <translation id="4980112683975062744">Cabeçalhos duplicados recebidos do servidor</translation>
 <translation id="3828029223314399057">Pesquisar favoritos</translation>
@@ -4558,7 +4560,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="3819415294190923087">Selecione uma rede</translation>
 <translation id="7325437708553334317">Extensão de alto contraste</translation>
 <translation id="9203394577866137354">Status de validação</translation>
-<translation id="4076313158939304412">Proteja seu pagamento com o Google Wallet.</translation>
+<translation id="4076313158939304412">Proteja seu pagamento com a Google Wallet.</translation>
 <translation id="6708242697268981054">Origem:</translation>
 <translation id="1909880997794698664">Tem certeza de que deseja manter permanentemente este dispositivo no modo  quiosque?</translation>
 <translation id="1986281090560408715">Ativa um heads-up display no canto superior esquerdo da tela que lista informações sobre os pontos de toque na tela.</translation>
@@ -4633,7 +4635,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="5117930984404104619">Monitorar o comportamento de outras extensões, incluindo URLs visitados</translation>
 <translation id="33022249435934718">Processamentos de GDI</translation>
 <translation id="6308937455967653460">Salvar &amp;link como...</translation>
-<translation id="741689768643916402">A Carteira virtual do Google só pode ser usada com este comerciante por compradores residentes nos EUA. Se você for morador dos EUA, |altere seu endereço residencial na Carteira virtual do Google| ou pague usando outra forma de pagamento.</translation>
+<translation id="741689768643916402">A Google Wallet só pode ser usada com este comerciante por compradores residentes nos EUA. Se você for morador dos EUA, |altere seu endereço residencial na Google Wallet| ou pague usando outra forma de pagamento.</translation>
 <translation id="5828633471261496623">Imprimindo...</translation>
 <translation id="2420698750843121542">Ativar a API Encrypted Media Extensions em elementos de áudio e vídeo. Isso ativa a versão mais recente de Encrypted Media Extensions.</translation>
 <translation id="5421136146218899937">Limpar dados de navegação...</translation>
@@ -4704,6 +4706,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="6934265752871836553">Usa o código da tecnologia &quot;bleeding-edge&quot; para que o Chrome encontre resultados mais rápido. As alterações feitas
         neste caminho podem trazer vários resultados.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Sempre abrir com o Adobe Reader</translation>
 <translation id="8274359292107649245">Abrir o Google Chrome na área de trabalho</translation>
 <translation id="1571119610742640910">Composição para planos de fundo raiz fixos.</translation>
 <translation id="6514565641373682518">Esta página desativou o cursor do mouse.</translation>
@@ -4773,7 +4776,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="8911079125461595075">O Google sinalizou a extensão <ph name="EXTENSION_NAME"/> como maliciosa e impediu a instalação.</translation>
 <translation id="4347595254852029221">Ativar alternância rápida de usuários no menu do avatar</translation>
 <translation id="5870086504539785141">Fechar o menu de acessibilidade</translation>
-<translation id="9102800320402283920">A Carteira virtual do Google exige pelo menos um nome e um sobrenome.</translation>
+<translation id="9102800320402283920">A Google Wallet exige pelo menos um nome e um sobrenome.</translation>
 <translation id="7005848115657603926">Intervalo de páginas inválido. Use <ph name="EXAMPLE_PAGE_RANGE"/></translation>
 <translation id="3705722231355495246">-</translation>
 <translation id="6251889282623539337">Termos de Serviço de <ph name="DOMAIN"/></translation>
@@ -4900,6 +4903,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="824543159844843373">Ativa o item 3 do iniciador</translation>
 <translation id="3819800052061700452">&amp;Tela cheia</translation>
 <translation id="48607902311828362">Modo avião</translation>
+<translation id="711840821796638741">Mostrar favoritos gerenciados</translation>
 <translation id="3360297538363969800">Ocorreu uma falha na impressão. Verifique sua impressora e tente novamente.</translation>
 <translation id="680572642341004180">Ativar rastreamento RLZ no <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Pare de usar o carregador submetido a recall.</translation>
@@ -4992,7 +4996,7 @@ incomuns e incorretas. Isso significa que um invasor está fingindo ser <ph name
 <translation id="2989474696604907455">não conectado</translation>
 <translation id="6612358246767739896">Conteúdo protegido</translation>
 <translation id="1593594475886691512">Formatando...</translation>
-<translation id="8860520442470629999">O cartão virtual do Google Wallet será usado para essa transação. Um cartão virtual é um novo número de cartão para que o vendedor nunca veja o número real do seu cartão de crédito.</translation>
+<translation id="8860520442470629999">O cartão virtual da Google Wallet será usado para essa transação. Um cartão virtual é um novo número de cartão para que o vendedor nunca veja o número real do seu cartão de crédito.</translation>
 <translation id="6586451623538375658">Trocar botão principal do mouse</translation>
 <translation id="475088594373173692">Primeiro usuário</translation>
 <translation id="1731911755844941020">Enviando solicitação...</translation>
index 083260d..13040db 100644 (file)
@@ -72,7 +72,7 @@
 <translation id="7409233648990234464">Reiniciar e Powerwash</translation>
 <translation id="7428534988046001922">As seguintes aplicações estão agora instaladas:</translation>
 <translation id="787386463582943251">Adicionar endereço de email</translation>
-<translation id="2833791489321462313">Requer a activação da palavra-passe a partir do modo de suspensão</translation>
+<translation id="2833791489321462313">Requer palavra-passe para ativar a partir do modo de suspensão</translation>
 <translation id="8208216423136871611">Não guardar</translation>
 <translation id="4405141258442788789">A operação excedeu o tempo limite.</translation>
 <translation id="5048179823246820836">Nórdico</translation>
 <translation id="8651324101757295372">Iniciar um chat com esta pessoa</translation>
 <translation id="6460423884798879930">Ativa a opção para enviar informações de autenticação adicionais no pacote SYN inicial para um cliente ligado anteriormente, permitindo que o envio de dados seja iniciado mais rapidamente.</translation>
 <translation id="6563261555270336410">Detalhes sobre <ph name="ELEMENTS_HOST_NAME"/></translation>
-<translation id="3200025317479269283">Divirta-se! Estamos aqui para o/a ajudar.</translation>
+<translation id="3200025317479269283">Divirta-se! Estamos aqui para o(a) ajudar.</translation>
 <translation id="5656983780125483728">A reverter para a atualização anterior de <ph name="IDS_SHORT_PRODUCT_NAME"/>.</translation>
 <translation id="3470502288861289375">A copiar...</translation>
 <translation id="2719473049159220459">Emissor: <ph name="ISSUER"/></translation>
 <translation id="7501143156951160001">Se não tiver uma Conta Google, pode <ph name="LINK_START"/>criar uma Conta Google<ph name="LINK_END"/> agora.</translation>
 <translation id="4950138595962845479">Opções...</translation>
 <translation id="4653235815000740718">Ocorreu um problema ao criar o suporte de dados de recuperação do SO. Não foi possível localizar o dispositivo de armazenamento utilizado.</translation>
-<translation id="1407489512183974736">Cortado no Centro</translation>
+<translation id="1407489512183974736">Cortado no centro</translation>
 <translation id="6426222199977479699">Erro de SSL</translation>
 <translation id="2688196195245426394">Erro ao registar o dispositivo no servidor: <ph name="CLIENT_ERROR"/>.</translation>
 <translation id="667115622929458276">Estão atualmente em curso transferências no modo de navegação anónima. Pretende sair do modo de navegação anónima e cancelar as transferências?</translation>
 <translation id="2178614541317717477">AC comprometida</translation>
 <translation id="6464076120278668805">Desativar ignorar preenchimento automático=&quot;off&quot;</translation>
 <translation id="4449935293120761385">Acerca do preenchimento automático</translation>
-<translation id="4194570336751258953">Activar tocar para clicar</translation>
+<translation id="4194570336751258953">Ativar tocar para clicar</translation>
 <translation id="6066742401428748382">O acesso à página Web foi negado</translation>
 <translation id="5111692334209731439">&amp;Gestor de Marcadores</translation>
 <translation id="906458777597946297">Maximizar janela</translation>
@@ -656,7 +656,7 @@ Todos os utilizadores têm de terminar sessão para continuar.</translation>
 <translation id="6196041699996825846">Saiba mais acerca da navegação como convidado</translation>
 <translation id="337286756654493126">Ler pastas que são abertas na aplicação</translation>
 <translation id="2783661497142353826">Gerir Aplicações de Quiosque</translation>
-<translation id="5701101281789450335">Definições de idioma e introdução...</translation>
+<translation id="5701101281789450335">Definições de idioma e de introdução...</translation>
 <translation id="5483838506518938965">O processo está concluído</translation>
 <translation id="6431347207794742960">O <ph name="PRODUCT_NAME"/> irá configurar actualizações automáticas para todos os utilizadores deste computador.</translation>
 <translation id="4973698491777102067">Limpe os seguintes itens de:</translation>
@@ -906,7 +906,7 @@ Todos os utilizadores têm de terminar sessão para continuar.</translation>
 <translation id="3926862159284741883">Ativar Extensões de Rascunho WebGL</translation>
 <translation id="7684540948112007255">transferir vários ficheiros.</translation>
 <translation id="2537271621194795300">Arranques</translation>
-<translation id="3636096452488277381">Olá, <ph name="USER_GIVEN_NAME"/>.</translation>
+<translation id="3636096452488277381">Olá <ph name="USER_GIVEN_NAME"/>.</translation>
 <translation id="4911714727432509308">Não existem extensões com atalhos de teclado atribuídos.</translation>
 <translation id="5999606216064768721">Utilizar os Limites e a Barra de Título do Sistema</translation>
 <translation id="921568617530782833">Ler e modificar todos os dados nos sites que visitar</translation>
@@ -1030,7 +1030,7 @@ O modo de navegação anónima <ph name="SHORTCUT_KEY"/> pode ser útil da próx
 <translation id="159359590073980872">Cache de Imagem</translation>
 <translation id="4668711410219362250">https://support.google.com/chrome/bin/answer.py?hl=<ph name="GRITLANGCODE_1"/>&amp;answer=165139&amp;p=settings_sign_in</translation>
 <translation id="3586931643579894722">Ocultar detalhes</translation>
-<translation id="6285395082104474418">O tabuleiro do estado mostra o estado atual da rede e da bateria, entre outros.</translation>
+<translation id="6285395082104474418">O tabuleiro de estado mostra o estado atual da rede e da bateria, entre outros.</translation>
 <translation id="3317459757438853210">Frente e verso</translation>
 <translation id="6020949471045037306">Ativa o novo sistema de gestão de perfis, incluindo o bloqueio do perfil e a nova interface do menu do avatar.</translation>
 <translation id="2011110593081822050">Processo de trabalho na Web: <ph name="WORKER_NAME"/></translation>
@@ -1290,7 +1290,7 @@ O modo de navegação anónima <ph name="SHORTCUT_KEY"/> pode ser útil da próx
 <translation id="751507702149411736">Bielorrusso</translation>
 <translation id="6655190889273724601">Modo de programador</translation>
 <translation id="1071917609930274619">Cifragem de dados</translation>
-<translation id="3473105180351527598">Activar protecção contra phishing e software maligno</translation>
+<translation id="3473105180351527598">Ativar proteção contra phishing e software maligno</translation>
 <translation id="6151323131516309312">Prima <ph name="SEARCH_KEY"/> para pesquisar no <ph name="SITE_NAME"/></translation>
 <translation id="7541121857749629630">Exceções de imagem</translation>
 <translation id="9033857511263905942">C&amp;olar</translation>
@@ -1550,7 +1550,7 @@ O modo de navegação anónima <ph name="SHORTCUT_KEY"/> pode ser útil da próx
 <translation id="6237614789842758826">Pesquise no Google</translation>
 <translation id="798525203920325731">Espaços de nomes da rede</translation>
 <translation id="7092106376816104">Exceções de pop-up</translation>
-<translation id="8594787581355215556">Sessão iniciada como <ph name="USER_EMAIL_ADDRESS"/>. Faça a gestão dos seus dados sincronizados no <ph name="BEGIN_LINK"/>Painel de Controlo do Google<ph name="END_LINK"/>.</translation>
+<translation id="8594787581355215556">Sessão iniciada como <ph name="USER_EMAIL_ADDRESS"/>. Faça a gestão dos seus dados sincronizados no <ph name="BEGIN_LINK"/>Painel de controlo do Google<ph name="END_LINK"/>.</translation>
 <translation id="6476634420120651145">Ativar dimensionamento automático do texto rapidamente</translation>
 <translation id="5402367795255837559">Braille</translation>
 <translation id="263325223718984101">O <ph name="PRODUCT_NAME"/> não conseguiu terminar a instalação, mas continuará a executar a partir da respectiva imagem de disco.</translation>
@@ -1608,7 +1608,7 @@ Depois de criar um novo utilizador supervisionado, pode gerir as respetivas defi
 <translation id="8418240940464873056">Modo Hanja (caracteres chineses)</translation>
 <translation id="4263757076580287579">O registo da impressora foi cancelado.</translation>
 <translation id="5788367137662787332">Lamentamos, mas não foi possível montar, pelo menos, uma partição no aparelho <ph name="DEVICE_LABEL"/>.</translation>
-<translation id="392089482157167418">Ativar o ChromeVox (respostas faladas)</translation>
+<translation id="392089482157167418">Ativar ChromeVox (comentários falados)</translation>
 <translation id="1886996562706621347">Permitir que os Web sites peçam para se tornarem os processadores de protocolos predefinidos (recomendado)</translation>
 <translation id="6736329909263487977"><ph name="ISSUED_BY"/> [ <ph name="ISSUED_TO"/> ]</translation>
 <translation id="8899388739470541164">Vietnamita</translation>
@@ -1627,7 +1627,7 @@ Depois de criar um novo utilizador supervisionado, pode gerir as respetivas defi
 <translation id="7664333939334980398">64</translation>
 <translation id="3947376313153737208">Sem selecção</translation>
 <translation id="1346104802985271895">Método de introdução vietnamita (TELEX)</translation>
-<translation id="2242603986093373032">Não existem aparelhos</translation>
+<translation id="2242603986093373032">Nenhum dispositivo</translation>
 <translation id="7713873128508426081">Sempre permitido</translation>
 <translation id="5889282057229379085">Número máximo de ACs intermédias:<ph name="NUM_INTERMEDIATE_CA"/></translation>
 <translation id="3180365125572747493">Introduza uma palavra-passe para encriptar este ficheiro de certificado.</translation>
@@ -1671,7 +1671,7 @@ Depois de criar um novo utilizador supervisionado, pode gerir as respetivas defi
 <translation id="6914291514448387591">O <ph name="PLUGIN_NAME"/> necessita da sua permissão para ser executado.</translation>
 <translation id="1123316951456119629">Ao desligar a sua Conta do Google do <ph name="PRODUCT_NAME"/>, os dados permanecerão no computador, mas as alterações já não serão sincronizadas com a sua Conta do Google. Os dados já armazenados na Conta do Google permanecerão lá até que os remova através do <ph name="BEGIN_LINK"/>Painel de Controlo Google<ph name="END_LINK"/>.</translation>
 <translation id="8705331520020532516">Número de série</translation>
-<translation id="1665770420914915777">Utilizar a página &quot;Novo separador&quot;</translation>
+<translation id="1665770420914915777">Utilizar a página Novo separador</translation>
 <translation id="160747070824041275">Extensão Atualizada</translation>
 <translation id="1691063574428301566">O seu computador será reiniciado quando a actualização estiver concluída.</translation>
 <translation id="1042574203789536285"><ph name="URL"/> pretende armazenar definitivamente dados de grandes dimensões no seu dispositivo.</translation>
@@ -1681,7 +1681,7 @@ Depois de criar um novo utilizador supervisionado, pode gerir as respetivas defi
 <translation id="3512810056947640266">URL (opcional):</translation>
 <translation id="131364520783682672">Caps Lock</translation>
 <translation id="2335122562899522968">Esta página define os cookies.</translation>
-<translation id="4628757576491864469">Aparelhos</translation>
+<translation id="4628757576491864469">Dispositivos</translation>
 <translation id="8461914792118322307">Proxy</translation>
 <translation id="4707934200082538898">Verifique o seu email em <ph name="BEGIN_BOLD"/><ph name="MANAGER_EMAIL"/><ph name="END_BOLD"/> par obter mais instruções.</translation>
 <translation id="8680544835056685300">Estamos constantemente a tentar tornar a navegação mais segura. Anteriormente, qualquer Website poderia solicitar-lhe que adicionasse uma extensão ao navegador. Nas versões mais recentes do Google Chrome, tem de definir explicitamente no Chrome que pretende instalar estas extensões adicionando-as através da página Extensões. <ph name="BEGIN_LINK"/>Saiba mais<ph name="END_LINK"/></translation>
@@ -2100,7 +2100,7 @@ Depois de criar um novo utilizador supervisionado, pode gerir as respetivas defi
 <translation id="8580634710208701824">Recarregar frame</translation>
 <translation id="7606992457248886637">Autoridades</translation>
 <translation id="4197674956721858839">Seleção de zip</translation>
-<translation id="707392107419594760">Seleccionar o teclado:</translation>
+<translation id="707392107419594760">Selecionar teclado:</translation>
 <translation id="8605503133013456784">Falha ao desligar e desemparelhar de &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
 <translation id="2007404777272201486">Comunicar um problema...</translation>
 <translation id="4366509400410520531">Permitido por si</translation>
@@ -2320,7 +2320,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="542872847390508405">Está a navegar como Convidado</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN"/> está agora em ecrã inteiro e pretende desativar o cursor do rato.</translation>
 <translation id="1497522201463361063">Não é possível mudar o nome de &quot;<ph name="FILE_NAME"/>&quot;. <ph name="ERROR_MESSAGE"/></translation>
-<translation id="8226742006292257240">Em baixo, encontra-se a palavra-passe TPM, gerada aleatoriamente, que foi atribuída ao seu computador:</translation>
+<translation id="8226742006292257240">A palavra-passe TPM abaixo foi gerada aleatoriamente e atribuída ao seu computador:</translation>
 <translation id="5010043101506446253">Autoridade de certificação</translation>
 <translation id="5452005759330179535">Perguntar quando um site quiser mostrar notificações do ambiente de trabalho (recomendado)</translation>
 <translation id="5287425679749926365">As suas contas</translation>
@@ -2731,7 +2731,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="1611704746353331382">Exportar Marcadores para Ficheiro HTML...</translation>
 <translation id="662607201886173483">DSA</translation>
 <translation id="2391419135980381625">Tipo de letra padrão</translation>
-<translation id="8652139471850419555">Redes Preferidas</translation>
+<translation id="8652139471850419555">Redes preferidas</translation>
 <translation id="7893393459573308604"><ph name="ENGINE_NAME"/> (Predefinição)</translation>
 <translation id="5392544185395226057">Ative o suporte do Native Client.</translation>
 <translation id="5400640815024374115">O chip do TPM (Trusted Platform Module/Módulo de plataforma fidedigna) está desactivado ou não existe.</translation>
@@ -2986,7 +2986,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="7913678092679498828">OK, compreendi</translation>
 <translation id="3655670868607891010">Se vê isto com frequência, experimente <ph name="HELP_LINK"/>.</translation>
 <translation id="4504940961672722399">Clique no ícone ou prima <ph name="EXTENSION_SHORTCUT"/> para utilizar esta extensão.</translation>
-<translation id="2523966157338854187">Abra uma página específica ou um conjunto de páginas.</translation>
+<translation id="2523966157338854187">Abrir uma página específica ou um conjunto de páginas.</translation>
 <translation id="4176463684765177261">Desativado</translation>
 <translation id="2483350027598201151">Megabytes</translation>
 <translation id="3880349122676857713">Aceder a tudo o que escrever</translation>
@@ -3058,7 +3058,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="3613796918523876348">Recuperar mesmo assim</translation>
 <translation id="7974087985088771286">Activar separador 6</translation>
 <translation id="2857421400871862029">Perguntar quando um site tentar desativar o cursor do rato (recomendado)</translation>
-<translation id="1910721550319506122">Bem-vindo!</translation>
+<translation id="1910721550319506122">Bem-vindo(a)!</translation>
 <translation id="4035758313003622889">Gestor de &amp;tarefas</translation>
 <translation id="6356936121715252359">Definições de armazenamento do Adobe Flash Player...</translation>
 <translation id="8874184842967597500">Sem ligação</translation>
@@ -3076,7 +3076,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="2044540568167155862">Cabras teletransportadas</translation>
 <translation id="1776712937009046120">Adicionar utilizador</translation>
 <translation id="506152810699123561">Métricas relativas ao impacto do <ph name="SHORT_PRODUCT_NAME"/> na memória do sistema</translation>
-<translation id="674632704103926902">Ativar arrastamento através do toque</translation>
+<translation id="674632704103926902">Ativar arrastamento através do toque</translation>
 <translation id="8954952943849489823">Falha ao mover, erro inesperado: $1</translation>
 <translation id="2318143611928805047">Tamanho do papel</translation>
 <translation id="7100897339030255923"><ph name="COUNT"/> itens selecionados</translation>
@@ -3190,7 +3190,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="8044899503464538266">Lento</translation>
 <translation id="3789841737615482174">Instalar</translation>
 <translation id="4320697033624943677">Adicionar utilizadores</translation>
-<translation id="1283379245075810567">Iniciar espelhamento</translation>
+<translation id="1283379245075810567">Iniciar espelhamento</translation>
 <translation id="9153934054460603056">Guardar identidade e palavra-passe</translation>
 <translation id="33870491292291061">Para utilizar <ph name="NETWORK_ID"/>, é necessário visitar a página de início de sessão da rede. Clique para aceder à página de início de sessão.</translation>
 <translation id="4594403342090139922">&amp;Anular eliminação</translation>
@@ -3412,7 +3412,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="2419414843209660528">Adicionar atalho para este Website...</translation>
 <translation id="3529423920239848704">Ocorrências em que o <ph name="SHORT_PRODUCT_NAME"/> não encerrou corretamente</translation>
 <translation id="7022562585984256452">A sua página inicial foi definida.</translation>
-<translation id="267285457822962309">Alterar as definições específicas para o seu aparelho e periféricos.</translation>
+<translation id="267285457822962309">Alterar as definições específicas para o seu dispositivo e periféricos.</translation>
 <translation id="1154228249304313899">Abrir esta página:</translation>
 <translation id="6976108581241006975">Consola de JavaScript</translation>
 <translation id="60357267506638014">Checo QWERTY</translation>
@@ -3493,7 +3493,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="3968098439516354663">É necessário o <ph name="PLUGIN_NAME"/> para apresentar este conteúdo.</translation>
 <translation id="2636625531157955190">O Chrome não consegue aceder à imagem.</translation>
 <translation id="1166212789817575481">Fechar Separadores à Direita</translation>
-<translation id="6472893788822429178">Mostrar botão Página inicial</translation>
+<translation id="6472893788822429178">Mostrar botão Página Inicial</translation>
 <translation id="4270393598798225102">Versão <ph name="NUMBER"/></translation>
 <translation id="479536056609751218">Página Web, Apenas HTML</translation>
 <translation id="8822808012507380471">A utilização combinada de memória privada de todos os processos relacionados com o <ph name="SHORT_PRODUCT_NAME"/></translation>
@@ -3611,7 +3611,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="7054808953701320293">Entendido, não voltar a mostrar esta mensagem.</translation>
 <translation id="144932861331386147">Ligue-se à Internet para atualizar o Chromebook.</translation>
 <translation id="2938685643439809023">Mongol</translation>
-<translation id="5737306429639033676">Prever acções na rede para acelerar o carregamento das páginas</translation>
+<translation id="5737306429639033676">Prever ações na rede para acelerar o carregamento das páginas</translation>
 <translation id="4530494379350999373">Origem</translation>
 <translation id="2070909990982335904">Os nomes que começam por ponto estão reservados para o sistema. Escolha outro nome.</translation>
 <translation id="3707020109030358290">Não é uma autoridade de certificação.</translation>
@@ -3953,6 +3953,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="6460601847208524483">Localizar seguinte</translation>
 <translation id="397703832102027365">A finalizar...</translation>
 <translation id="8146177459103116374">Se já estiver registado neste aparelho, pode <ph name="LINK2_START"/>iniciar sessão como um utilizador existente<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Mostrar marcadores geridos</translation>
 <translation id="4856478137399998590">O seu serviço de dados móveis está ativado e pronto a utilizar</translation>
 <translation id="3305389145870741612">O processo de formatação pode demorar alguns segundos. Aguarde.</translation>
 <translation id="3648607100222897006">Estas funcionalidades experimentais podem mudar, deixar de funcionar ou desaparecer a qualquer momento. Não nos responsabilizamos pelo que possa acontecer se ativar uma destas funcionalidades experimentais e o navegador pode até entrar em combustão espontânea. Brincadeiras à parte, o navegador pode eliminar todos os dados ou a sua segurança e privacidade podem ficar comprometidas de formas inesperadas. Todas as experiências que ativar serão ativadas para todos os utilizadores deste navegador. Continue com cuidado.</translation>
@@ -4283,7 +4284,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="8116972784401310538">&amp;Gestor de marcadores</translation>
 <translation id="3737514536860147030">Saiba mais acerca da navegação anónima</translation>
 <translation id="621638399744152264"><ph name="VALUE"/>%</translation>
-<translation id="3082520371031013475">Definições do touchpad e rato</translation>
+<translation id="3082520371031013475">Definições do touchpad e do rato</translation>
 <translation id="4927301649992043040">Comprimir extensão</translation>
 <translation id="5939518447894949180">Repor</translation>
 <translation id="8679658258416378906">Activar separador 5</translation>
@@ -4382,6 +4383,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="6869402422344886127">Caixa de verificação assinalada</translation>
 <translation id="3428010780253032925">Desativar segmentação com base no retângulo nas vistas</translation>
 <translation id="5637380810526272785">Método de introdução</translation>
+<translation id="3613134908380545408">Mostrar <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">A ligação tinha de ser repetida utilizando uma versão mais antiga do protocolo TLS ou SSL. Isso normalmente significa que o servidor está a utilizar um software muito antigo e pode ter outros problemas de segurança.</translation>
 <translation id="404928562651467259">AVISO</translation>
 <translation id="4289300219472526559">Comece a Falar</translation>
@@ -4409,7 +4411,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="4467798014533545464">Mostrar URL</translation>
 <translation id="5923417893962158855">Transferências no modo de navegação anónima em curso</translation>
 <translation id="1227507814927581609">A autenticação falhou ao ligar a &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
-<translation id="7136694880210472378">Utilizar como predefinição</translation>
+<translation id="7136694880210472378">Predefinir</translation>
 <translation id="3274763671541996799">Mudou para o ecrã inteiro.</translation>
 <translation id="7681202901521675750">O cartão SIM está bloqueado - introduza o código PIN. Tentativas restantes: <ph name="TRIES_COUNT"/></translation>
 <translation id="2489918096470125693">Adicionar &amp;Pasta...</translation>
@@ -4486,7 +4488,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="3603622770190368340">Obter certificado de rede</translation>
 <translation id="6196207969502475924">Pesquisa por Voz</translation>
 <translation id="359283478042092570">Aceder</translation>
-<translation id="6791586529990783225">Repor as definições do navegador</translation>
+<translation id="6791586529990783225">Repor definições do navegador</translation>
 <translation id="449782841102640887">Proteja-se</translation>
 <translation id="2927657246008729253">Alterar...</translation>
 <translation id="7978412674231730200">Chave privada</translation>
@@ -4564,7 +4566,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="1932098463447129402">Não anterior a</translation>
 <translation id="5409029099497331039">Surpreenda-me</translation>
 <translation id="7845920762538502375">O <ph name="PRODUCT_NAME"/> não conseguiu sincronizar os dados, porque não foi possível ligar ao servidor de sincronização. A tentar novamente...</translation>
-<translation id="3819415294190923087">Selecionar uma rede</translation>
+<translation id="3819415294190923087">Selecionar uma rede:</translation>
 <translation id="7325437708553334317">Extensão Alto Contraste</translation>
 <translation id="9203394577866137354">Estado de validação</translation>
 <translation id="4076313158939304412">Proteger o seu pagamento com o Google Wallet.</translation>
@@ -4712,6 +4714,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="2859369953631715804">Selecionar uma rede de telemóvel</translation>
 <translation id="6934265752871836553">Utilize o código avançado para que o Chrome processe conteúdo mais rapidamente. As alterações neste caminho têm uma grande probabilidade de dividir bastante conteúdo.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Sempre aberto no Adobe Reader</translation>
 <translation id="8274359292107649245">Abrir o Chrome no ambiente de trabalho</translation>
 <translation id="1571119610742640910">Composição de fundos de raiz fixa.</translation>
 <translation id="6514565641373682518">Esta página desativou o cursor do rato.</translation>
@@ -4755,7 +4758,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="2739842825616753233">Perguntar quando um site pretender aceder à sua câmara e ao seu microfone (recomendado)</translation>
 <translation id="8940081510938872932">O seu computador está a executar demasiadas operações neste momento. Tente novamente mais tarde.</translation>
 <translation id="8848709220963126773">Alteração de modo com tecla Shift</translation>
-<translation id="6316806695097060329">Este dispositivo <ph name="SHORT_PRODUCT_NAME"/> foi concebido para proporcionar a melhor experiência Web para si.</translation>
+<translation id="6316806695097060329">Este dispositivo <ph name="SHORT_PRODUCT_NAME"/> foi concebido para lhe proporcionar a melhor experiência Web.</translation>
 <translation id="49122815993216733">Erro de carregamento da extensão</translation>
 <translation id="3241720467332021590">Irlandês</translation>
 <translation id="8828933418460119530">Nome de DNS</translation>
@@ -4815,7 +4818,7 @@ Certifique-se de que não revela informações sensíveis.</translation>
 <translation id="4785040501822872973">Este computador será reposto dentro de <ph name="LOGOUT_TIME_LEFT"/> segundos.
 Prima qualquer tecla para continuar a explorar.</translation>
 <translation id="4084682180776658562">Marcar</translation>
-<translation id="8859057652521303089">Seleccionar idioma:</translation>
+<translation id="8859057652521303089">Selecionar idioma:</translation>
 <translation id="2632795170092344386">Limpar cookies e outros dados de plug-in do site quando fechar o navegador</translation>
 <translation id="5941864346249299673">O número de bytes lidos pela rede</translation>
 <translation id="3030138564564344289">Repetir transferência</translation>
@@ -4848,7 +4851,7 @@ Prima qualquer tecla para continuar a explorar.</translation>
 <translation id="5996258716334177896">Não foi possível abrir o seu perfil corretamente. Algumas funcionalidades podem não estar disponíveis. Confirme se o perfil existe e se tem permissão para ler e gravar o respetivo conteúdo.</translation>
 <translation id="7040138676081995583">Abrir com...</translation>
 <translation id="7953739707111622108">Não é possível abrir este aparelho porque o sistema de ficheiros não foi reconhecido.</translation>
-<translation id="2433507940547922241">Aspecto</translation>
+<translation id="2433507940547922241">Aspeto</translation>
 <translation id="6051354611314852653">Ups! O sistema não conseguiu autorizar o acesso da API para este dispositivo.</translation>
 <translation id="7851716364080026749">Impedir sempre o acesso à câmara e microfone</translation>
 <translation id="839072384475670817">Criar Atalho&amp;s da Aplicação...</translation>
@@ -4910,6 +4913,7 @@ Prima qualquer tecla para continuar a explorar.</translation>
 <translation id="824543159844843373">Ativar o item do iniciador 3</translation>
 <translation id="3819800052061700452">&amp;Ecrã inteiro</translation>
 <translation id="48607902311828362">Modo de avião</translation>
+<translation id="711840821796638741">Mostrar marcadores geridos</translation>
 <translation id="3360297538363969800">Falha ao imprimir. Verifique a impressora e tente novamente.</translation>
 <translation id="680572642341004180">Ativar o controlo RLZ em <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Deixe de utilizar o carregador recolhido.</translation>
@@ -5127,7 +5131,7 @@ Aceita?</translation>
 <translation id="4645676300727003670">&amp;Manter</translation>
 <translation id="3225579507836276307">Uma extensão de terceiros bloqueou o acesso a esta página Web.</translation>
 <translation id="6815551780062710681">editar</translation>
-<translation id="6911468394164995108">Aderir a outra...</translation>
+<translation id="6911468394164995108">Ligar-se a outra...</translation>
 <translation id="2510708650472996893">Perfil de cor:</translation>
 <translation id="343467364461911375">Alguns serviços de conteúdo utilizam identificadores de máquina para identificar o utilizador de forma exclusiva para autorizar o acesso a conteúdo protegido.</translation>
 <translation id="5061708541166515394">Contraste</translation>
@@ -5178,12 +5182,12 @@ Aceita?</translation>
 <translation id="7353601530677266744">Linha de comandos</translation>
 <translation id="2766006623206032690">Co&amp;lar e ir</translation>
 <translation id="5286673433070377078">Caminhos do renderizador avançado – É PROVÁVEL QUE PROVOQUE UMA FALHA DO NAVEGADOR</translation>
-<translation id="4682551433947286597">As imagens de fundo aparecem no Ecrã de Início de Sessão.</translation>
+<translation id="4682551433947286597">As imagens de fundo aparecem no Ecrã de início de sessão.</translation>
 <translation id="4394049700291259645">Desactivar</translation>
 <translation id="5284518706373932381">Deve poder voltar a este Website dentro de algumas horas. A Navegação Segura do Google <ph name="BEGIN_LINK"/>detetou software malicioso<ph name="END_LINK"/> recentemente em <ph name="SITE"/>. Os Websites que normalmente são seguros por vezes são infetados com software malicioso.</translation>
 <translation id="969892804517981540">Compilação oficial</translation>
 <translation id="1691608011302982743">Removeu o dispositivo muito cedo!</translation>
-<translation id="445923051607553918">Ligar a uma rede Wi-Fi...</translation>
+<translation id="445923051607553918">Ligar a uma rede Wi-Fi</translation>
 <translation id="1898137169133852367">Um Powerwash repõe o seu dispositivo <ph name="IDS_SHORT_PRODUCT_NAME"/> para o deixar como novo. Além disso, o dispositivo reverterá para uma atualização anterior do <ph name="IDS_SHORT_PRODUCT_NAME"/>.</translation>
 <translation id="4215898373199266584">O modo de navegação anónima (<ph name="INCOGNITO_MODE_SHORTCUT"/>) pode ser útil da próxima vez.</translation>
 <translation id="1048597748939794622">Ativação forçada de todas as camadas</translation>
index 827e54f..8fefb00 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
 <translation id="1155759005174418845">Catalană</translation>
-<translation id="6879617193011158416">Comutați bara de marcaje</translation>
+<translation id="6879617193011158416">Afișați/ascundeți bara de marcaje</translation>
 <translation id="4590324241397107707">Spațiu de stocare a bazei de date</translation>
 <translation id="9056953843249698117">Magazin</translation>
 <translation id="6431217872648827691">Toate datele au fost criptate cu parola Google începând cu
@@ -33,9 +33,9 @@
 <translation id="3828924085048779000">Expresia de acces trebuie să fie introdusă.</translation>
 <translation id="1844692022597038441">Acest fișier nu este disponibil offline.</translation>
 <translation id="2709516037105925701">Completare automată</translation>
-<translation id="3916445069167113093">Acest tip de fișier poate dăuna computerului dvs. Doriți să păstrați totuși <ph name="FILE_NAME"/>?</translation>
+<translation id="3916445069167113093">Acest tip de fișier poate dăuna computerului. Doriți să păstrați <ph name="FILE_NAME"/> totuși?</translation>
 <translation id="5429818411180678468">Cu lățime întreagă</translation>
-<translation id="250599269244456932">Rulați automat (recomandat)</translation>
+<translation id="250599269244456932">Rulează automat (recomandat)</translation>
 <translation id="4121993058175073134">Pentru trimitere date de export în rețea, configurați e-mailul în Setări.</translation>
 <translation id="8099771777867258638">Focalizați pe lansator</translation>
 <translation id="6865313869410766144">Datele salvate pentru completarea automată a formularelor</translation>
@@ -54,7 +54,7 @@
 <translation id="8870272765758621889">Acesta este un utilizator monitorizat, gestionat de <ph name="CUSTODIAN_EMAIL"/>.
   Detaliile dvs. de conectare la cont sunt învechite.</translation>
 <translation id="3300394989536077382">Semnat de</translation>
-<translation id="654233263479157500">Folosește un serviciu web pentru a ajuta la soluționarea erorilor de navigare</translation>
+<translation id="654233263479157500">Folosiți un serviciu web pentru a soluționa erorile de navigare</translation>
 <translation id="3792890930871100565">Deconectați imprimantele</translation>
 <translation id="5378437846548426165">Comută între diferitele versiuni ale avertismentului privind TLS/SSL.</translation>
 <translation id="6476748132434603124">Site-ul <ph name="SITE"/> a solicitat browserului Chrome să blocheze certificatele cu erori, iar certificatul primit de Chrome în timpul încercării de conectare conține o eroare.</translation>
@@ -62,7 +62,7 @@
 <translation id="6976652535392081960">Se afișează destinațiile pentru <ph name="EMAIL"/></translation>
 <translation id="7180611975245234373">Actualizați</translation>
 <translation id="4940047036413029306">Ghilimele</translation>
-<translation id="1497897566809397301">Permiteți setarea datelor locale (recomandat)</translation>
+<translation id="1497897566809397301">Permite setarea datelor locale (recomandat)</translation>
 <translation id="3275778913554317645">Deschideți ca fereastră</translation>
 <translation id="7994370417837006925">Conectare multiplă</translation>
 <translation id="1420684932347524586">Hopa! Generarea cheii private RSA aleatorii nu a reușit.</translation>
@@ -72,7 +72,7 @@
 <translation id="7409233648990234464">Relansați și porniți Powerwash</translation>
 <translation id="7428534988046001922">Acum sunt instalate următoarele aplicații:</translation>
 <translation id="787386463582943251">Adăugați adresa de e-mail</translation>
-<translation id="2833791489321462313">Se solicită parola pentru trecerea la starea activă</translation>
+<translation id="2833791489321462313">Se solicită parola pentru ieșirea din inactivitate</translation>
 <translation id="8208216423136871611">Nu salvați</translation>
 <translation id="4405141258442788789">Operația a expirat.</translation>
 <translation id="5048179823246820836">Nordică</translation>
@@ -80,7 +80,7 @@
 <translation id="7180735793221405711">Activați metaeticheta pentru dimensiunea grafică.</translation>
 <translation id="1763046204212875858">Creați comenzi rapide pentru aplicație</translation>
 <translation id="2105006017282194539">Nu s-a încărcat încă</translation>
-<translation id="7821009361098626711">Serverul <ph name="DOMAIN"/> necesită un nume de utilizator și o parolă. Mesaj de la server: <ph name="REALM"/>.</translation>
+<translation id="7821009361098626711">Serverul <ph name="DOMAIN"/> necesită un nume de utilizator și o parolă. Mesajul serverului este: <ph name="REALM"/>.</translation>
 <translation id="8546541260734613940">[*.]example.com</translation>
 <translation id="524759338601046922">Reintroduceți noul cod PIN:</translation>
 <translation id="2580889980133367162">Permiteți întotdeauna <ph name="HOST"/> să descarce mai multe fișiere</translation>
@@ -99,7 +99,7 @@
 <translation id="656293578423618167">Calea sau numele fișierului sunt prea lungi. Salvați utilizând un nume mai scurt sau într-o altă locație.</translation>
 <translation id="3484869148456018791">Obțineți un certificat nou</translation>
 <translation id="151501797353681931">Importate din Safari</translation>
-<translation id="586567932979200359">Rulați <ph name="PRODUCT_NAME"/> de pe imaginea sa de pe disc. Instalarea sa pe computer vă permite să îl rulați fără imaginea de pe disc și asigură actualizarea acestuia.</translation>
+<translation id="586567932979200359">Rulați <ph name="PRODUCT_NAME"/> din imaginea sa de pe disc. Instalarea sa pe computer vă permite să îl rulați fără imaginea de pe disc și asigură actualizarea acestuia.</translation>
 <translation id="1036860914056215505">Codul extensiei</translation>
 <translation id="3775432569830822555">Certificat de server SSL</translation>
 <translation id="1829192082282182671">Mi&amp;cșorați</translation>
 <translation id="4714531393479055912"><ph name="PRODUCT_NAME"/> vă poate sincroniza parolele acum.</translation>
 <translation id="6307990684951724544">Sistem ocupat</translation>
 <translation id="7904094684485781019">Administratorul acestui cont a dezactivat conectarea multiplă.</translation>
-<translation id="2025632980034333559"><ph name="APP_NAME"/> s-a blocat. Faceți clic pe acest balon pentru a reîncărca extensia.</translation>
+<translation id="2025632980034333559"><ph name="APP_NAME"/> s-a blocat. Dați clic pe acest balon pentru a reîncărca extensia.</translation>
 <translation id="687588960939994211">Ștergeți și istoricul, marcajele, setările și alte date Chrome salvate pe acest dispozitiv.</translation>
 <translation id="4581823559337371475">Serviciul de conectare de mai jos este găzduit de <ph name="SAML_DOMAIN"/>. Pentru a continua, conectați-vă.</translation>
-<translation id="6322279351188361895">Citirea cheii private nu a reușit.</translation>
+<translation id="6322279351188361895">Cheia privată nu a fost citită.</translation>
 <translation id="7401543881546089382">Ștergeți comanda rapidă</translation>
 <translation id="3781072658385678636">Următoarele pluginuri au fost blocate pe această pagină:</translation>
 <translation id="2597852038534460976">Chrome nu poate accesa imaginile de fundal. Conectați-vă la o rețea.</translation>
 <translation id="3648460724479383440">Buton radio selectat</translation>
 <translation id="512903556749061217">conectat</translation>
-<translation id="4654488276758583406">Foarte mic</translation>
+<translation id="4654488276758583406">Foarte mică</translation>
 <translation id="6647228709620733774">Adresă URL de revocare a autorității de certificare Netscape</translation>
 <translation id="546411240573627095">Stil tastatură numerică</translation>
 <translation id="2310216585920710503">Configurați Deblocarea ușoară</translation>
 <translation id="8425213833346101688">Modificați</translation>
-<translation id="2972581237482394796">&amp;Refaceți</translation>
-<translation id="5895138241574237353">Reporniți</translation>
+<translation id="2972581237482394796">&amp;Repetați</translation>
+<translation id="5895138241574237353">Reîncepeți</translation>
 <translation id="7012312584667795941">Identitatea companiei <ph name="ORGANIZATION"/> din <ph name="LOCALITY"/> a fost verificată de <ph name="ISSUER"/>, dar verificarea înregistrărilor de auditare publică nu a reușit.</translation>
 <translation id="7113502843173351041">Vede adresa dvs. de e-mail</translation>
 <translation id="3726463242007121105">Acest dispozitiv nu poate fi deschis, deoarece sistemul său de fișiere nu este acceptat.</translation>
 <translation id="5606674617204776232">Pluginul <ph name="PEPPER_PLUGIN_NAME"/> de pe <ph name="PEPPER_PLUGIN_DOMAIN"/> dorește să vă acceseze dispozitivul.</translation>
 <translation id="9008201768610948239">Ignorați</translation>
-<translation id="528468243742722775">End (La sfârșit)</translation>
+<translation id="528468243742722775">Sfârșit</translation>
 <translation id="1723824996674794290">&amp;Fereastră nouă</translation>
-<translation id="1313405956111467313">Configurare automată a serverului proxy</translation>
+<translation id="1313405956111467313">Configurare automată proxy</translation>
 <translation id="3527276236624876118">A fost creat un utilizator monitorizat, cu numele <ph name="USER_DISPLAY_NAME"/>.</translation>
 <translation id="4367782753568896354">Nu am reușit să instalăm:</translation>
 <translation id="1589055389569595240">Afișați verificarea ortografiei și a gramaticii</translation>
-<translation id="7017587484910029005">Introduceți caracterele din imaginea de mai jos.</translation>
+<translation id="7017587484910029005">Introduceți caracterele pe care le vedeți în imaginea de mai jos.</translation>
 <translation id="9013589315497579992">Certificat de autentificare client SSL nevalid.</translation>
 <translation id="5410992958511618392">Selectare prin glisare</translation>
 <translation id="2278098630001018905">Folosiți altă adresă de expediere</translation>
 <translation id="5427459444770871191">Rotiți în sensul acelor de &amp;ceasornic</translation>
 <translation id="2923240520113693977">Estonă</translation>
 <translation id="7282353081473341772">Încercați aplicația fără să o instalați</translation>
-<translation id="3384773155383850738">Număr maxim de sugestii</translation>
+<translation id="3384773155383850738">Numărul maxim de sugestii</translation>
 <translation id="1014321050861012327">Salvați automat parolele.</translation>
 <translation id="3606271085912431278">Dezactivează caseta de dialog cu informații despre aplicație. Dacă nu este dezactivat, utilizatorul va putea selecta meniul contextual „Informații despre aplicație” din Lansatorul de aplicații pentru a afișa caseta de dialog cu informații despre aplicația selectată.</translation>
 <translation id="8677212948402625567">Restrângeți-le pe toate...</translation>
 <translation id="8008366997883261463">Terier</translation>
 <translation id="2056996954182910740">Activați Lansatorul de aplicații.</translation>
-<translation id="7600965453749440009">Nu traduce niciodată când pagina este în <ph name="LANGUAGE"/></translation>
+<translation id="7600965453749440009">Nu traduce niciodată din <ph name="LANGUAGE"/></translation>
 <translation id="3208703785962634733">Neconfirmat</translation>
 <translation id="620329680124578183">Nu încărcați (recomandat)</translation>
 <translation id="6300924177400055566">Nu aveți suficient spațiu în Disc Google pentru a salva „<ph name="FILE_NAME"/>”. Eliminați unele fișiere sau <ph name="BEGIN_LINK"/>achiziționați mai mult spațiu de stocare<ph name="END_LINK"/>.</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
-<translation id="2653266418988778031">Dacă ștergeți un certificat de la Autoritatea de certificare (CA), browserul dvs. nu va mai acorda încredere niciunui certificat emis de respectiva Autoritate de certificare.</translation>
+<translation id="2653266418988778031">Dacă ștergeți un certificat al unei autorități de certificare (CA), browserul dvs. nu va mai avea încredere în niciun certificat emis de acea CA.</translation>
 <translation id="4237357878101553356">Informațiile contului nu au putut fi verificate. |Remediați această problemă|</translation>
 <translation id="2217501013957346740">Creați un nume –</translation>
 <translation id="5177479852722101802">Blocați în continuare accesul la cameră și microfon</translation>
         a fost întreruptă de o schimbare a conexiunii la internet.</translation>
 <translation id="8804398419035066391">Comunicarea cu site-urile web cooperante</translation>
 <translation id="6023914116273780353">Personalizate</translation>
-<translation id="7082055294850503883">Ignorați starea CapsLock și introduceți în mod prestabilit litere mici</translation>
+<translation id="7082055294850503883">Ignorați starea CapsLock și introduceți litere mici în mod prestabilit</translation>
 <translation id="4989966318180235467">Inspectați pagina de fun&amp;dal</translation>
 <translation id="4744603770635761495">Cale executabilă</translation>
-<translation id="3719826155360621982">Pagină de pornire</translation>
-<translation id="5376169624176189338">Clic pentru a merge înapoi, țineți apăsat pentru a vedea istoricul</translation>
+<translation id="3719826155360621982">Pagina de pornire</translation>
+<translation id="5376169624176189338">Dați clic pentru a naviga înapoi, țineți apăsat pentru a vedea istoricul</translation>
 <translation id="7897900149154324287">Pe viitor, asigurați-vă că eliminați dispozitivul amovibil din aplicația Fișiere înainte să îl deconectați. În caz contrar, este posibil să pierdeți date.</translation>
 <translation id="2238306952867036727">Dezactivați comprimarea stratului</translation>
 <translation id="9181716872983600413">Unicod</translation>
 <translation id="2566124945717127842">Folosiți Powerwash pentru a reseta dispozitivul <ph name="IDS_SHORT_PRODUCT_NAME"/> la configurația din fabrică.</translation>
 <translation id="3609785682760573515">Se sincronizează...</translation>
-<translation id="1383861834909034572">Se deschide când este complet</translation>
+<translation id="1383861834909034572">Se va deschide după finalizare</translation>
 <translation id="5727728807527375859">Extensiile, aplicațiile și temele pot dăuna computerului. Sigur doriți să continuați?</translation>
 <translation id="3857272004253733895">Schemă Pinyin dublu</translation>
 <translation id="3559661023937741623">Pentru siguranța dvs., verificați detaliile cardului.</translation>
 <translation id="6489433341782457580">Pentru dezvoltatori: utilizați mediul de testare securizat pentru apelările rutinei requestAutocomplete() din API-ul Wallet.</translation>
 <translation id="8186609076106987817">Serverul nu a putut găsi fișierul.</translation>
 <translation id="2846816712032308263">Activează închiderea rapidă a filei/ferestrei – rulează un handler js onunload al filei independent de GUI.</translation>
-<translation id="9134410174832249455"><ph name="PRODUCT_NAME"/> nu a putut încărca pagina web, deoarece <ph name="HOST_NAME"/> a avut nevoie de prea mult timp pentru a răspunde. Este posibil ca site-ul să nu funcționeze sau să aveți probleme cu conexiunea la internet.</translation>
+<translation id="9134410174832249455"><ph name="PRODUCT_NAME"/>
+        nu a putut încărca pagina web, deoarece
+        <ph name="HOST_NAME"/>
+        a avut nevoie de prea mult timp pentru a răspunde. Este posibil ca site-ul să nu funcționeze sau
+        să aveți probleme cu conexiunea la internet.</translation>
 <translation id="7624154074265342755">Rețele wireless</translation>
 <translation id="3899968422636198696"><ph name="ORGNAME"/> <ph name="HOSTNAME"/></translation>
 <translation id="2391762656119864333">Revocați</translation>
 <translation id="4920887663447894854">Urmărirea locației dvs. pe această pagină a fost blocată pentru următoarele site-uri:</translation>
 <translation id="8133676275609324831">&amp;Afișați în dosar</translation>
 <translation id="302014277942214887">Introduceți ID-ul aplicației sau adresa URL a magazinului web.</translation>
-<translation id="26224892172169984">Nu permiteți site-urilor să gestioneze protocoale</translation>
+<translation id="26224892172169984">Nu permite site-urilor să gestioneze protocoale</translation>
 <translation id="645705751491738698">Continuați blocarea JavaScript</translation>
 <translation id="9177556055091995297">Gestionați cardurile de credit</translation>
 <translation id="4780321648949301421">Salvați pagina ca...</translation>
 <translation id="2565670301826831948">Viteză touchpad:</translation>
 <translation id="7348093485538360975">Tastatură pe ecran</translation>
 <translation id="8178665534778830238">Conținut:</translation>
-<translation id="2610260699262139870">Dim&amp;ensiunea actuală</translation>
-<translation id="4535734014498033861">Conectarea la serverul proxy a eșuat.</translation>
+<translation id="2610260699262139870">Di&amp;mensiunea actuală</translation>
+<translation id="4535734014498033861">Conexiunea la serverul proxy nu a reușit.</translation>
 <translation id="558170650521898289">Verificare a driverelor hardware pentru Microsoft Windows</translation>
 <translation id="5866560098872665830">ServiceWorker este un nou tip de instrument web, care poate intercepta solicitările de resurse. Pentru mai multe informații, consultați https://github.com/slightlyoff/ServiceWorker.</translation>
 <translation id="4395129973926795186">Între <ph name="START_DATE"/> și <ph name="END_DATE"/></translation>
 <translation id="8974161578568356045">Detectare automată</translation>
 <translation id="1549045574060481141">Confirmați descărcarea</translation>
 <translation id="5388588172257446328">Nume de utilizator:</translation>
-<translation id="1657406563541664238">Ajutați la îmbunătățirea <ph name="PRODUCT_NAME"/> prin trimiterea automată de statistici de utilizare și rapoarte de avarie la Google</translation>
+<translation id="1657406563541664238">Trimiteți automat statistici de utilizare și rapoarte de blocare la Google pentru a contribui la îmbunătățirea <ph name="PRODUCT_NAME"/>.</translation>
 <translation id="8339012082103782726">Nu permite site-urilor să acceseze microfonul</translation>
 <translation id="7982789257301363584">Rețea</translation>
 <translation id="2271281383664374369">Solicitările adresate de extensii acestei adrese URL au fost suspendate temporar.</translation>
 <translation id="5748743223699164725">Activați funcțiile experimentale ale platformei web în dezvoltare.</translation>
 <translation id="8110513421455578152">Specificați înălțimea prestabilită a panourilor.</translation>
 <translation id="7002454948392136538">Alegeți administratorul pentru acest utilizator monitorizat</translation>
-<translation id="4640525840053037973">Conectați-vă utilizând Contul dvs. Google</translation>
+<translation id="4640525840053037973">Conectați-vă folosind Contul Google</translation>
 <translation id="4923279099980110923">Da, doresc să ajut</translation>
 <translation id="5255315797444241226">Expresia de acces pe care ați introdus-o nu este corectă.</translation>
 <translation id="521582610500777512">Fotografia a fost ștearsă</translation>
 <translation id="3846593650622216128">Aceste setări sunt impuse de o extensie.</translation>
 <translation id="8185331656081929126">Afișați notificări când în rețea sunt detectate imprimante noi</translation>
 <translation id="2972557485845626008">Firmware</translation>
-<translation id="735327918767574393">Ceva nu a mers bine la afișarea acestei pagini web. Pentru a continua, reîncărcați-o sau vizitați altă pagină.</translation>
+<translation id="735327918767574393">A apărut o eroare la afișarea acestei pagini web. Pentru a continua, reîncărcați-o sau vizitați altă pagină.</translation>
 <translation id="7607274158153386860">Solicitați site-ul pentru tablete</translation>
 <translation id="8028060951694135607">Recuperare de chei Microsoft</translation>
 <translation id="323962671734198379"><ph name="ERROR_DESCRIPTION_TEXT"/>
 <translation id="6391832066170725637">Fișierul sau directorul nu a putut fi găsit.</translation>
 <translation id="6980028882292583085">Alertă JavaScript</translation>
 <translation id="577624874850706961">Căutați cookie-uri</translation>
-<translation id="5494920125229734069">Selectați tot</translation>
+<translation id="5494920125229734069">Selectați-le pe toate</translation>
 <translation id="3868718841498638222">Ați trecut la canalul <ph name="CHANNEL_NAME"/>.</translation>
-<translation id="7931071620596053769">Următoarea(ele) pagină(i) a(u) devenit inactivă(e). Puteți aștepta să devină activă(e) sau să o(le) închideți.</translation>
+<translation id="7931071620596053769">Următoarele pagini au devenit inactive. Puteți aștepta să devină active sau puteți să le închideți.</translation>
 <translation id="7938958445268990899">Certificatul serverului nu este încă valid.</translation>
 <translation id="4569998400745857585">Meniu ce conține extensiile ascunse</translation>
 <translation id="4081383687659939437">Salvați informațiile</translation>
-<translation id="1801827354178857021">Perioada</translation>
+<translation id="1801827354178857021">Punct</translation>
 <translation id="238526402387145295">Nu puteți accesa acum site-ul <ph name="SITE"/>, deoarece acesta <ph name="BEGIN_LINK"/>folosește HSTS<ph name="END_LINK"/>. Erorile de rețea și atacurile sunt de obicei temporare și probabil că această pagină va funcționa mai târziu.</translation>
 <translation id="4560332071395409256">Faceți clic pe
           <ph name="BEGIN_BOLD"/>Start<ph name="END_BOLD"/>,
 <translation id="8670737526251003256">Se caută dispozitive...</translation>
 <translation id="1165039591588034296">Eroare</translation>
 <translation id="2278562042389100163">Deschideți fereastra de browser</translation>
-<translation id="5246282308050205996"><ph name="APP_NAME"/> s-a blocat. Faceți clic pe balon pentru a reporni aplicația.</translation>
+<translation id="5246282308050205996"><ph name="APP_NAME"/> s-a blocat. Dați clic pe balon pentru a reporni aplicația.</translation>
 <translation id="1201895884277373915">Mai multe de la acest site</translation>
 <translation id="9218430445555521422">Setați ca prestabilit</translation>
 <translation id="5027550639139316293">Certificat pentru e-mail</translation>
 <translation id="660380282187945520">F9</translation>
 <translation id="8876215549894133151">Format:</translation>
 <translation id="8860454412039442620">Foaie de calcul Excel</translation>
-<translation id="5234764350956374838">Renunțați</translation>
+<translation id="5234764350956374838">Închideți</translation>
 <translation id="5245965967288377800">Rețeaua WiMAX</translation>
 <translation id="40027638859996362">Mutarea cuvintelor</translation>
 <translation id="3522708245912499433">Portugheză</translation>
 <translation id="8034304765210371109">Activează versiunea experimentală a Lansatorului de aplicații.</translation>
 <translation id="8959810181433034287">Utilizatorul monitorizat va trebui să utilizeze această parolă pentru a se conecta. Prin urmare, alegeți o parolă sigură și nu uitați să discutați despre aceasta cu utilizatorul monitorizat.</translation>
 <translation id="5154917547274118687">Memorie</translation>
-<translation id="1493492096534259649">Această limbă nu poate fi utilizată pentru o verificare ortografică</translation>
+<translation id="1493492096534259649">Această limbă nu poate fi utilizată pentru verificarea ortografică</translation>
 <translation id="6628463337424475685">Căutare <ph name="ENGINE"/></translation>
 <translation id="8651324101757295372">Conversați prin chat cu această persoană</translation>
 <translation id="6460423884798879930">Activați opțiunea pentru a trimite informații de autentificare suplimentare în pachetul SYN inițial pentru un client conectat anterior, ceea ce permite o pornire mai rapidă a trimiterii datelor.</translation>
 <translation id="2856203831666278378">Răspunsul de la server conținea antete duplicat. Această problemă este determinată în general de un site web sau de un proxy configurat greșit. Numai administratorul site-ului web sau al proxy-ului poate soluționa această problemă.</translation>
 <translation id="3587482841069643663">Toate</translation>
 <translation id="6698381487523150993">Creat:</translation>
-<translation id="4684748086689879921">Ignorați importul</translation>
+<translation id="4684748086689879921">Omiteți importul</translation>
 <translation id="6418443601594065950">Dezactivați ferestrele pop-up din bara de informații pentru conținutul media protejat.</translation>
 <translation id="8191230140820435481">Gestionează aplicațiile, extensiile și temele dvs.</translation>
 <translation id="8279107132611114222">Solicitarea dvs. de a accesa acest site a fost trimisă către <ph name="NAME"/>.</translation>
 <translation id="6615807189585243369">Copiat: <ph name="BURNT_AMOUNT"/> din <ph name="TOTAL_SIZE"/></translation>
 <translation id="7501143156951160001">Dacă nu aveți un Cont Google, puteți să <ph name="LINK_START"/>creați un Cont Google<ph name="LINK_END"/> acum.</translation>
 <translation id="4950138595962845479">Opțiuni...</translation>
-<translation id="4653235815000740718">A apărut o problemă la crearea suportului de recuperare pentru SO. Dispozitivul de stocare utilizat nu a putut fi găsit.</translation>
+<translation id="4653235815000740718">A apărut o problemă la crearea suportului de recuperare a sistemului de operare. Nu s-a găsit dispozitivul de stocare utilizat.</translation>
 <translation id="1407489512183974736">Pe centru, decupat</translation>
 <translation id="6426222199977479699">Eroare SSL</translation>
 <translation id="2688196195245426394">Eroare la înregistrarea gadgetului pe server: <ph name="CLIENT_ERROR"/>.</translation>
 <translation id="667115622929458276">Mai multe descărcări incognito sunt în desfășurare. Doriți să ieșiți din modul incognito și să anulați descărcările?</translation>
 <translation id="1528372117901087631">Conexiune la internet</translation>
-<translation id="1788636309517085411">Utilizați locația prestabilită</translation>
+<translation id="1788636309517085411">Utilizați setările prestabilite</translation>
 <translation id="4159435316791146348">În urma aprobării și îndrumării de la CPSC și de la alte agenții de reglementare, Google și HP recheamă de pe piață încărcătorul original pentru Chromebookul HP 11.</translation>
 <translation id="2716483787622029543">Accesează și șterge fotografii, muzică și alte tipuri de conținut media de pe computer</translation>
 <translation id="7659660321065362272">Actualizare importantă pentru Chromebook HP 11</translation>
 <translation id="5965661248935608907">Stabilește și ce pagină se afișează când dați clic pe butonul Pagină de pornire sau când căutați din caseta polivalentă.</translation>
 <translation id="9177499212658576372">În prezent, sunteți conectat la rețeaua <ph name="NETWORK_TYPE"/>.</translation>
 <translation id="8589311641140863898">API-uri ale extensiilor experimentale</translation>
-<translation id="869891660844655955">Data expirării</translation>
+<translation id="869891660844655955">Dată de expirare</translation>
 <translation id="8336153091935557858">Ieri, la <ph name="YESTERDAY_DAYTIME"/></translation>
 <translation id="8642171459927087831">Indicativ de acces</translation>
 <translation id="8289355894181816810">Dacă nu știți sigur ce înseamnă aceasta, contactați administratorul de rețea.</translation>
 <translation id="4218259925454408822">Conectați-vă la alt cont</translation>
-<translation id="2178614541317717477">Compromis CA</translation>
+<translation id="2178614541317717477">Compromitere CA</translation>
 <translation id="6464076120278668805">Dezactivați opțiunea Ignoră autocomplete='off'</translation>
-<translation id="4449935293120761385">Despre Completarea automată</translation>
-<translation id="4194570336751258953">Activați funcția de atingere pentru a face clic</translation>
-<translation id="6066742401428748382">Accesul la pagina web a fost refuzat</translation>
+<translation id="4449935293120761385">Despre completarea automată</translation>
+<translation id="4194570336751258953">Activați funcția atingeți pentru clic</translation>
+<translation id="6066742401428748382">Accesul către pagina web a fost refuzat</translation>
 <translation id="5111692334209731439">&amp;Manager de marcaje</translation>
 <translation id="906458777597946297">Maximizați fereastra</translation>
 <translation id="1199341378292808368">Săptămâna trecută</translation>
 <translation id="2638942478653899953">Google Drive nu a putut fi accesat. <ph name="BEGIN_LINK"/>Deconectați-vă<ph name="END_LINK"/> și conectați-vă din nou.</translation>
 <translation id="1983450660696935749">Numărul de dezactivări ale unei extensii</translation>
 <translation id="3084548735795614657">Plasați pentru instalare</translation>
-<translation id="5661272705528507004">Cartela SIM este dezactivată și nu poate fi utilizată. Contactați furnizorul de servicii pentru o înlocuire.</translation>
+<translation id="5661272705528507004">Cardul SIM este dezactivat și nu poate fi utilizat. Contactați furnizorul de servicii pentru o înlocuire.</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
 <translation id="3583413473134066075">Mai este puțin... Gata!</translation>
 <translation id="6585234750898046415">Alegeți o imagine pentru a fi afișată pentru contul dvs. pe ecranul de conectare.</translation>
-<translation id="7957054228628133943">Gestionați blocarea ferestrelor de tip pop-up...</translation>
+<translation id="7957054228628133943">Gestionați blocarea ferestrelor pop-up...</translation>
 <translation id="179767530217573436">ultimele 4 săptămâni</translation>
 <translation id="2279770628980885996">Când serverul a încercat să îndeplinească solicitarea, a apărut o situație neașteptată.</translation>
 <translation id="210116126541562594">Blocat în mod prestabilit</translation>
 <translation id="1986824139605408742">Dacă nu vă puteți aminti parola, puteți continua, dar datele locale se vor pierde. Vor fi preluate numai setările și datele sincronizate.</translation>
 <translation id="9123413579398459698">Proxy FTP</translation>
-<translation id="1751752860232137596">Permiteți implementarea derulării line experimentale.</translation>
+<translation id="1751752860232137596">Activează implementarea derulării line experimentale.</translation>
 <translation id="9142627797714859698">Dacă dați clic pe Continuați, sunteți de acord să utilizați Google Wallet. Pentru a vă proteja împotriva fraudei, Google Wallet va avea acces la informații despre computer (inclusiv la locația acestuia).</translation>
-<translation id="8534801226027872331">În acest caz, certificatul prezentat pentru browser-ul dvs. are erori și nu poate fi înțeles. Aceasta poate însemna că nu putem înțelege informațiile despre identitate din certificat sau că alte informații din certificat securizau până acum conexiunea. Nu trebuie să mergeți mai departe.</translation>
+<translation id="8534801226027872331">În acest caz, certificatul prezentat browserului dvs. are erori și nu poate fi înțeles. Aceasta poate însemna că nu putem înțelege informațiile despre identitate din certificat sau anumite alte informații din certificatul utilizat pentru a securiza conexiunea. Vă recomandăm să nu continuați.</translation>
 <translation id="3608527593787258723">Activați fila 1</translation>
 <translation id="4130750466177569591">Sunt de acord</translation>
-<translation id="6993929801679678186">Afișați predicțiile funcției Completare automată</translation>
+<translation id="6993929801679678186">Afișați predicțiile de completare automată</translation>
 <translation id="4425149324548788773">Discul meu</translation>
 <translation id="7194698607141260640">Proces eliminat</translation>
 <translation id="7264275118036872269">Pornirea descoperirii dispozitivelor Bluetooth a eșuat.</translation>
-<translation id="3855676282923585394">Import marcaje și setări...</translation>
+<translation id="3855676282923585394">Importați marcajele și setările...</translation>
 <translation id="1116694919640316211">Despre</translation>
 <translation id="8381977081675353473">Slovacă</translation>
 <translation id="2849866606957084126">A fost creat utilizatorul monitorizat <ph name="NEW_PROFILE_NAME"/>. Pentru a stabili ce site-uri poate accesa acest utilizator monitorizat, puteți configura restricții și setări accesând <ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/>. Dacă nu modificați setările prestabilite, <ph name="NEW_PROFILE_NAME"/> poate accesa toate site-urile de pe web.
@@ -464,7 +468,7 @@ Pentru instrucțiuni suplimentare, verificați-vă e-mailurile la adresa <ph nam
 <translation id="8546306075665861288">Memorie cache de imagini</translation>
 <translation id="5904093760909470684">Configurare proxy</translation>
 <translation id="5706551819490830015">Gestionați adresele de facturare...</translation>
-<translation id="3348643303702027858">Crearea suportului de recuperare pentru SO a fost anulată.</translation>
+<translation id="3348643303702027858">Crearea suportului de recuperare pentru sistemul de operare a fost anulată.</translation>
 <translation id="7027779093245283639">În această pagină web a fost inserat conținut de la <ph name="ELEMENTS_HOST_NAME"/>, un distribuitor cunoscut de programe malware. Dacă accesați acum pagina, este foarte probabil să vă infectați dispozitivul cu programe malware.</translation>
 <translation id="749028671485790643">Persoana <ph name="VALUE"/></translation>
 <translation id="741906494724992817">Această aplicație nu solicită nicio permisiune specială.</translation>
@@ -484,27 +488,27 @@ Pentru instrucțiuni suplimentare, verificați-vă e-mailurile la adresa <ph nam
           <ph name="PRODUCT_NAME"/>
           este un intrus pe dispozitivul dvs. și blochează conectarea acestuia la internet.</translation>
 <translation id="3873139305050062481">I&amp;nspectați elementul</translation>
-<translation id="7445762425076701745">Identitatea serverului la care sunteți conectat(ă) nu poate fi validată complet. Sunteți conectat(ă) la un server care utilizează un nume valid numai în rețeaua dvs., a cărui proprietate nu poate fi validată de o autoritate de certificare externă. Deoarece unele autorități de certificare vor emite certificate pentru aceste nume în ciuda acestui fapt, nu există nicio modalitate de a ne asigura că aveți legătură cu site-ul web respectiv și că nu sunteți un atacator.</translation>
-<translation id="1556537182262721003">Imposibil de mutat directorul extensiei în profil.</translation>
+<translation id="7445762425076701745">Identitatea serverului la care v-ați conectat nu poate fi validată complet. Sunteți conectat(ă) la un server folosind un nume valid numai în rețeaua dvs., pentru care o autoritate de certificare externă nu are nici o modalitate de a-l valida. Deoarece unele autorități de certificare vor emite certificate pentru aceste nume oricum, nu există nicio modalitate de a vă asigura că sunteți conectat(ă) la site-ul corect și nu la un atacator.</translation>
+<translation id="1556537182262721003">Directorul extensiei nu se poate muta în profil.</translation>
 <translation id="2946640296642327832">Activați Bluetooth</translation>
-<translation id="5866557323934807206">Ștergeți aceste setări pentru accesările viitoare</translation>
+<translation id="5866557323934807206">Ștergeți aceste setări pentru vizite viitoare</translation>
 <translation id="126710816202626562">Limba traducerii:</translation>
 <translation id="1194381338562257973">Activați aplicațiile efemere experimentale.</translation>
-<translation id="5355351445385646029">Apăsați pe Space pentru a selecta candidatul</translation>
+<translation id="5355351445385646029">Apăsați pe bara de spațiu pentru a selecta sugestia</translation>
 <translation id="5453029940327926427">Închideți filele</translation>
 <translation id="949088605431823851">De unde ați achiziționat Chromebookul HP 11?</translation>
 <translation id="9087353528325876418">Adresa URL a protocolului WPAD (Web Proxy Auto-Discovery)</translation>
 <translation id="4801956050125744859">Păstrați-le pe amândouă</translation>
 <translation id="3878840326289104869">Se creează utilizatorul monitorizat</translation>
-<translation id="406070391919917862">Aplicații de fundal</translation>
+<translation id="406070391919917862">Aplicații în fundal</translation>
 <translation id="8820817407110198400">Marcaje</translation>
 <translation id="6347003977836730270">Permiteți ca în locul barei cu informații să fie afișată noua interfață cu balonul Traducere.</translation>
 <translation id="2580170710466019930">Așteptați în timp ce <ph name="PRODUCT_NAME"/> instalează cele mai recente actualizări de sistem.</translation>
-<translation id="7428061718435085649">Utilizați tastele Shift din dreapta și din stânga pentru a selecta al doilea și al treilea candidat</translation>
+<translation id="7428061718435085649">Utilizați tastele Shift din dreapta și din stânga pentru a selecta a doua și a treia sugestie</translation>
 <translation id="1070066693520972135">WEP</translation>
 <translation id="2630681426381349926">Conectați-vă la Wi-Fi pentru a începe</translation>
 <translation id="1764226536771329714">beta</translation>
-<translation id="5191625995327478163">Setați &amp;limba...</translation>
+<translation id="5191625995327478163">&amp;Setări de limbă...</translation>
 <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME"/> (există deja pe acest dispozitiv)</translation>
 <translation id="734651947642430719">Metodă de introducere pentru tamilă (InScript)</translation>
 <translation id="3649256019230929621">Minimizați fereastra</translation>
@@ -514,23 +518,23 @@ Pentru instrucțiuni suplimentare, verificați-vă e-mailurile la adresa <ph nam
 <translation id="6435285122322546452">Gestionați aplicațiile de tip chioșc...</translation>
 <translation id="5748409721703101646">Chromebookul nu se poate conecta la internet folosind <ph name="NETWORK_NAME"/>. Alegeți altă rețea. <ph name="LEARN_MORE_LINK_START"/>Aflați mai multe<ph name="LEARN_MORE_LINK_END"/></translation>
 <translation id="1064835277883315402">Alăturați-vă rețelei private</translation>
-<translation id="6508261954199872201">Aplic.: <ph name="APP_NAME"/></translation>
+<translation id="6508261954199872201">Aplicație: <ph name="APP_NAME"/></translation>
 <translation id="3700528541715530410">Hopa, se pare că nu aveți permisiunea de a accesa această pagină.</translation>
 <translation id="2713008223070811050">Gestionați ecranele</translation>
 <translation id="5145331109270917438">Data modificării</translation>
 <translation id="6596816719288285829">Adresă IP</translation>
 <translation id="7603461642606849762">Se încearcă remedierea erorilor numai dacă adresa URL a manifestului se termină în debug.nmf.</translation>
-<translation id="8656768832129462377">Fără verificare</translation>
+<translation id="8656768832129462377">Nu verificați</translation>
 <translation id="413121957363593859">Componente</translation>
 <translation id="715487527529576698">Modul inițial pentru chineză este chineza simplificată</translation>
 <translation id="6522350652862471760">Activați numele și pictograma profilului Google</translation>
 <translation id="6181259999130430430">Activați Deblocarea ușoară pentru acest dispozitiv.</translation>
-<translation id="8703575177326907206">Conexiunea dvs. cu <ph name="DOMAIN"/> nu este criptată.</translation>
+<translation id="8703575177326907206">Conexiunea la <ph name="DOMAIN"/> nu este criptată.</translation>
 <translation id="6135622770221372891">Coduri de canal</translation>
 <translation id="8472623782143987204">susținut de hardware</translation>
 <translation id="8545107379349809705">Ascundeți informațiile...</translation>
 <translation id="4865571580044923428">Gestionați excepțiile...</translation>
-<translation id="2526619973349913024">Verificaţi dacă există actualizări</translation>
+<translation id="2526619973349913024">Verificați dacă există actualizări</translation>
 <translation id="3716615839203649375">permiteți</translation>
 <translation id="1300293448253992908">Activați alertele de instalare a aplicațiilor</translation>
 <translation id="4559767610552730302">Bokeh</translation>
@@ -541,14 +545,14 @@ Pentru instrucțiuni suplimentare, verificați-vă e-mailurile la adresa <ph nam
 <translation id="8791534160414513928">Trimite o solicitare „Nu urmări” odată cu traficul de navigare</translation>
 <translation id="485316830061041779">Germană</translation>
 <translation id="9132971099789715557">Țineți apăsată tasta Căutare pentru a schimba comportamentul tastelor de pe rândul de sus.</translation>
-<translation id="6500116422101723010">Momentan, serverul nu poate gestiona solicitarea. Acest cod indică starea sa de indisponibilitate temporară, iar serverul își va relua funcționarea după un timp.</translation>
+<translation id="6500116422101723010">În prezent, serverul nu poate gestiona cererea. Acest cod indică o condiție temporară, iar serverul va funcționa din nou după un timp.</translation>
 <translation id="1644574205037202324">Istoric</translation>
 <translation id="2386631145847373156">Vă puteți deconecta doar dacă sunteți conectat(ă).</translation>
 <translation id="4206944295053515692">Solicitați sugestii de la Google</translation>
 <translation id="1297175357211070620">Destinație</translation>
-<translation id="479280082949089240">Cookie-urile setate de această pagină</translation>
+<translation id="479280082949089240">Cookie-uri setate de această pagină</translation>
 <translation id="1984642098429648350">Andocați fereastra la dreapta</translation>
-<translation id="6204930791202015665">Afișați...</translation>
+<translation id="6204930791202015665">Vedeți...</translation>
 <translation id="8713570323158206935">Trimiteți <ph name="BEGIN_LINK1"/>informații de sistem<ph name="END_LINK1"/></translation>
 <translation id="727952162645687754">Eroare la descărcare</translation>
 <translation id="5941343993301164315">Conectați-vă la <ph name="TOKEN_NAME"/>.</translation>
@@ -600,12 +604,11 @@ Pentru instrucțiuni suplimentare, verificați-vă e-mailurile la adresa <ph nam
 <translation id="1758831820837444715">Configurați rețeaua Ethernet</translation>
 <translation id="6535131196824081346">Această eroare poate avea loc când vă conectați la un server (HTTPS) sigur. Aceasta
         înseamnă că serverul încearcă să stabilească o conexiune sigură dar, din cauza
-        unei erori dezastruoase de configurare, conexiunea nu ar fi deloc sigură!
+        unei erori de configurare, conexiunea nu ar fi deloc sigură!
         <ph name="LINE_BREAK"/> În acest caz,
         serverul trebuie să fie reparat.
         <ph name="PRODUCT_NAME"/>
-        nu va utiliza conexiuni nesigure pentru
-a vă proteja confidențialitatea.</translation>
+        nu va utiliza conexiuni nesigure pentru a vă proteja confidențialitatea.</translation>
 <translation id="7851858861565204677">Alte dispozitive</translation>
 <translation id="1662837784918284394">(niciunul)</translation>
 <translation id="2573269395582837871">Alegeți o imagine și un nume</translation>
@@ -646,13 +649,13 @@ a vă proteja confidențialitatea.</translation>
 Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="946914425737677270">Parolele salvate în Keychain de pe Mac OS X vor fi utilizate pentru a vă permite conectarea fără să introduceți text.</translation>
 <translation id="8584280235376696778">&amp;Deschideți videoclipul într-o filă nouă</translation>
-<translation id="2845382757467349449">Afișează mereu bara de marcaje</translation>
+<translation id="2845382757467349449">Afișați mereu bara de marcaje</translation>
 <translation id="3053013834507634016">Utilizare cheie de certificat</translation>
 <translation id="1155128971867755382">Înțeleg că accesarea acestui site poate produce pagube dispozitivului.</translation>
 <translation id="8158362770816748971">Cardul virtual este gata.</translation>
 <translation id="450298799867490781">Activează experimentele cu aplicații efemere, care sunt lansate fără instalarea acestora în Chrome.</translation>
 <translation id="637601477428304897">Chiar dacă, în trecut, ați accesat în siguranță acest site web, dacă îl accesați acum, este foarte probabil să vă infectați computerul cu programe malware.</translation>
-<translation id="2152580633399033274">Afișați toate imaginile (recomandat)</translation>
+<translation id="2152580633399033274">Afișează toate imaginile (recomandat)</translation>
 <translation id="5618075537869101857">Hopa, aplicația de tip chioșc nu a putut fi lansată.</translation>
 <translation id="6196041699996825846">Aflați mai multe despre navigarea ca invitat</translation>
 <translation id="337286756654493126">Citește dosarele pe care le deschideți în aplicație</translation>
@@ -663,7 +666,7 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="4973698491777102067">Eliminați elementele următoare din:</translation>
 <translation id="9021662811137657072">S-a detectat un virus</translation>
 <translation id="4241404202385006548">Dezactivați extensiile, apoi reîncărcați această pagină web</translation>
-<translation id="6074963268421707432">Nu permiteți niciunui site să afișeze notificări pe desktop</translation>
+<translation id="6074963268421707432">Nu permite niciunui site să afișeze notificări pe desktop</translation>
 <translation id="3603385196401704894">Franceză canadiană</translation>
 <translation id="4869253927035988743">Activează acceptarea directoarelor pentru utilitarul de sincronizare a sistemului de fișiere.</translation>
 <translation id="1995173078718234136">Se scanează conținutul...</translation>
@@ -673,7 +676,7 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="220138918934036434">Ascundeți butonul</translation>
 <translation id="1491151370853475546">Reîncărcați această pagină</translation>
 <translation id="5374359983950678924">Schimbați imaginea</translation>
-<translation id="2859738163554174612">Nu doresc să mi se ofere niciodată conectarea</translation>
+<translation id="2859738163554174612">Nu mai oferi niciodată conectarea</translation>
 <translation id="1378727793141957596">Bun venit la Disc Google!</translation>
 <translation id="2401053206567162910">Aplicația nu este acceptată în prezent pe acest gadget, dar experții Chrome se străduie să o pună la dispoziție în curând.</translation>
 <translation id="3273410961255278341">Trimiteți pentru:</translation>
@@ -684,12 +687,12 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="5210365745912300556">Închideți fila</translation>
 <translation id="8628085465172583869">Nume de gazdă server:</translation>
 <translation id="3633586230741134985">Setări pentru lansatorul de aplicații</translation>
-<translation id="1992397118740194946">Nesetat</translation>
+<translation id="1992397118740194946">Nu este setat</translation>
 <translation id="6867678160199975333">Comutați la <ph name="NEW_PROFILE_NAME"/></translation>
 <translation id="3718720264653688555">Tastatură virtuală</translation>
 <translation id="7760004034676677601">Aceasta este pagina de pornire la care vă așteptați?</translation>
 <translation id="3504135463003295723">Numele grupului:</translation>
-<translation id="3314070176311241517">Permiteți tuturor site-urilor să ruleze JavaScript (recomandat)</translation>
+<translation id="3314070176311241517">Permite tuturor site-urilor să ruleze JavaScript (recomandat)</translation>
 <translation id="4663254525753315077">Atunci când este posibil, plasează conținutul derulant al unui element de derulare pe un strat compus, pentru derulare mai rapidă.</translation>
 <translation id="3280431534455935878">Se pregătește</translation>
 <translation id="5543983818738093899">Se verifică starea...</translation>
@@ -705,10 +708,18 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="4381849418013903196">Două puncte</translation>
 <translation id="8368859634510605990">&amp;Deschideți toate marcajele</translation>
 <translation id="6011428075245673124">Activează gestionarea metaetichetei pentru dimensiunea grafică pentru ca paginile să aibă permisiunea de a seta lățimea aspectului și proprietățile de zoom ale utilizatorilor.</translation>
-<translation id="2263497240924215535">(Dezactivată)</translation>
+<translation id="2263497240924215535">(dezactivat)</translation>
 <translation id="773426152488311044">În prezent sunteți singurul utilizator al produsului <ph name="PRODUCT_NAME"/>.</translation>
-<translation id="2042078858148122628">Serverul de la <ph name="HOST_NAME"/> nu poate fi găsit, deoarece căutarea DNS a eșuat. DNS este serviciul de rețea care translatează numele unui site web în adresa sa de internet. Această eroare este cel mai adesea cauzată de lipsa unei conexiuni la internet sau de o rețea greșit configurată. Aceasta poate fi, de asemenea, cauzată de un server DNS care nu răspunde sau de un firewall care împiedică <ph name="PRODUCT_NAME"/> să acceseze rețeaua.</translation>
-<translation id="2159087636560291862">În acest caz, certificatul nu a fost verificat de către o terță parte configurată pe computerul dvs. ca fiind de încredere. Oricine poate crea un certificat pretinzând că reprezintă orice site web dorește, motiv pentru care acesta trebuie verificat de o terță parte configurată pe computerul dvs. ca fiind de încredere. În lipsa acestei verificări, informațiile privind identitatea din certificat nu au nicio valoare. Prin urmare nu este posibil să se verifice dacă dvs. comunicați cu <ph name="DOMAIN"/> și nu cu un atacator care generează propriul său certificat, susținând că este <ph name="DOMAIN2"/>. Vă recomandam să nu mergeți mai departe de acest punct.</translation>
+<translation id="2042078858148122628">Serverul de la
+        <ph name="HOST_NAME"/>
+        nu poate fi găsit, deoarece căutarea DNS nu a reușit. DNS este serviciul de rețea
+        care translatează numele unui site în adresa sa de internet. Această
+        eroare este cel mai adesea cauzată de lipsa unei conexiuni la internet sau
+        de o rețea greșit configurată. Aceasta poate fi, de asemenea, cauzată de un server DNS
+         care nu răspunde sau de un firewall care împiedică
+        <ph name="PRODUCT_NAME"/>
+        să acceseze rețeaua.</translation>
+<translation id="2159087636560291862">În acest caz, certificatul nu a fost confirmat de către o terță parte în care computerul dvs. are încredere. Oricine poate crea un certificat, asumându-și identitatea oricărui site dorește, iar din acest motiv, este important ca certificatul să fie confirmat de o terță parte de încredere. Fără această confirmare, informațiile privind identitatea din certificat nu au nicio valoare. Nu este, așadar, posibil să se verifice dacă dvs. comunicați cu <ph name="DOMAIN"/>, nu cu un atacator care își generează propriul certificat, pretinzând că este <ph name="DOMAIN2"/>. Vă recomandăm să nu continuați.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK"/>Ajutor<ph name="END_LINK"/></translation>
 <translation id="58625595078799656"><ph name="PRODUCT_NAME"/> vă solicită criptarea datelor utilizând fie parola Google, fie propria expresie de acces.</translation>
 <translation id="3026050830483105579">Totul este aici.</translation>
@@ -726,7 +737,7 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="8670262106224659584">Aplicarea modulului Yama LSM</translation>
 <translation id="7221155467930685510">$1 GB</translation>
 <translation id="2624142942574147739">Această pagină vă accesează camera și microfonul.</translation>
-<translation id="7658239707568436148">Anulaţi</translation>
+<translation id="7658239707568436148">Anulați</translation>
 <translation id="557722062034137776">Resetarea dispozitivului nu va afecta conturile Google sau datele sincronizate cu aceste conturi. Cu toate acestea, toate fișierele salvate local pe dispozitiv vor fi șterse.</translation>
 <translation id="8695825812785969222">Deschideți &amp;locația...</translation>
 <translation id="4538417792467843292">Ștergeți cuvântul</translation>
@@ -739,12 +750,12 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="7850851215703745691">La aceste fișiere din Drive nu s-a permis încă accesul</translation>
 <translation id="5946591249682680882">ID raport <ph name="WEBRTC_LOG_REPORT_ID"/></translation>
 <translation id="3435896845095436175">Activați</translation>
-<translation id="1891668193654680795">Acordați încredere acestui certificat pentru identificarea marcatorilor de software.</translation>
+<translation id="1891668193654680795">Aveți încredere în acest certificat pentru a identifica furnizorii de software.</translation>
 <translation id="7968833647796919681">Activați culegerea datelor privind performanța</translation>
 <translation id="7645176681409127223"><ph name="USER_NAME"/> (proprietar)</translation>
 <translation id="8427933533533814946">Fotografie de</translation>
 <translation id="5078638979202084724">Marcați toate filele</translation>
-<translation id="5585118885427931890">Dosarul pentru marcaje nu a putut fi creat.</translation>
+<translation id="5585118885427931890">Nu se poate crea un dosar pentru marcaje.</translation>
 <translation id="2553100941515833716">Resetați starea de instalare a Lansatorului de aplicații la fiecare repornire.</translation>
 <translation id="6019169947004469866">Decupați</translation>
 <translation id="6455348477571378046">Tip de certificat:</translation>
@@ -752,7 +763,7 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="4092067639640979396">Activează compatibilitatea experimentală pentru redimensionare utilizând ciupirea.</translation>
 <translation id="5569602728237807248">Accesează pictogramele site-urilor pe care le vizitați</translation>
 <translation id="1547297114045837579">Activați rasterizarea la nivel de GPU.</translation>
-<translation id="3241680850019875542">Selectați directorul rădăcină al extensiei pentru care se va crea pachetul. Pentru actualizarea unei extensii, selectați, de asemenea, fișierul cu cheia privată care va fi reutilizat.</translation>
+<translation id="3241680850019875542">Selectați directorul rădăcină al extensiei ce trebuie împachetată. Pentru a actualiza o extensie, selectați și fișierul cu cheia privată pentru reutilizare.</translation>
 <translation id="7845849068167576533">Chiar dacă ați accesat anterior acest site, acum nu este sigur. Navigarea sigură Google <ph name="BEGIN_LINK"/>a detectat recent programe malware<ph name="END_LINK"/> pe <ph name="SITE"/>. Site-urile care sunt de obicei sigure sunt uneori infectate cu programe malware. Conținutul rău-intenționat provine de la <ph name="SUBRESOURCE_HOST"/>, un distribuitor cunoscut de programe malware.</translation>
 <translation id="2541178044065537882">Plugin blocat</translation>
 <translation id="2149850907588596975">Parole și formulare</translation>
@@ -765,11 +776,11 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="2399147786307302860">Setări avansate de sincronizare...</translation>
 <translation id="490074449735753175">Utilizează un serviciu web pentru a corecta greșelile de scriere</translation>
 <translation id="7972714317346275248">PKCS #1 SHA-384 cu criptare RSA</translation>
-<translation id="3020990233660977256">Număr de serie: <ph name="SERIAL_NUMBER"/></translation>
+<translation id="3020990233660977256">Numărul de serie: <ph name="SERIAL_NUMBER"/></translation>
 <translation id="9106577689055281370">Până la golirea bateriei mai sunt <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
 <translation id="5524517123096967210">Fișierul nu a putut fi citit.</translation>
 <translation id="8426519927982004547">HTTPS/SSL</translation>
-<translation id="5548207786079516019">Acesta este o instalare secundară a <ph name="PRODUCT_NAME"/> și acesta nu poate fi setat ca browser implicit.</translation>
+<translation id="5548207786079516019">Aceasta este o instalare secundară a <ph name="PRODUCT_NAME"/> și nu poate fi configurat ca browser prestabilit.</translation>
 <translation id="3984413272403535372">Eroare la semnarea extensiei.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="3298461240075561421">Chiar dacă anterior ați descărcat fișiere de pe site, acesta ar putea fi compromis. În loc să recuperați fișierul, ați putea încerca să îl descărcați din nou mai târziu.</translation>
@@ -783,11 +794,11 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="6406303162637086258">Simulați repornirea browserului</translation>
 <translation id="7428296649065852053">Timpul necesar pentru a încărca o pagină web</translation>
 <translation id="8725178340343806893">Preferințe/Marcaje</translation>
-<translation id="5177526793333269655">Vizualizare miniatură</translation>
+<translation id="5177526793333269655">Vizualizare cu miniaturi</translation>
 <translation id="3649138363871392317">Fotografia a fost creată</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT"/> (de) utilizatori</translation>
-<translation id="8926389886865778422">Nu doresc să fiu întrebat din nou</translation>
-<translation id="2836269494620652131">Închidere cu eroare</translation>
+<translation id="8926389886865778422">Nu mai întreba</translation>
+<translation id="2836269494620652131">Blocare</translation>
 <translation id="1066332784716773939">Diagnosticați erorile...</translation>
 <translation id="6985235333261347343">Agent Microsoft de recuperare a cheilor</translation>
 <translation id="8245799906159200274">În prezent, utilizați canalul <ph name="CHANNEL_NAME"/>.</translation>
@@ -804,7 +815,7 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="3872166400289564527">Stocare externă</translation>
 <translation id="1442912890475371290">Încercarea <ph name="BEGIN_LINK"/> de a accesa o pagină de pe <ph name="DOMAIN"/><ph name="END_LINK"/> a fost blocată.</translation>
 <translation id="5912378097832178659">&amp;Editați motoarele de căutare...</translation>
-<translation id="3749289110408117711">Nume fișier</translation>
+<translation id="3749289110408117711">Nume de fișier</translation>
 <translation id="3893630138897523026">ChromeVox (feedback rostit)</translation>
 <translation id="1723940674997333416">Permiteți traficul nesecurizat prin WebSocket provenit de la https</translation>
 <translation id="5538092967727216836">Reîncărcați cadrul</translation>
@@ -812,7 +823,7 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="8257950718085972371">Blocați în continuare accesul la cameră</translation>
 <translation id="5390284375844109566">Bază de date indexată</translation>
 <translation id="411666854932687641">Memorie privată</translation>
-<translation id="119944043368869598">Ștergeți toate descărcările</translation>
+<translation id="119944043368869598">Ștergeți-le pe toate</translation>
 <translation id="3467848195100883852">Activați corectarea automată a ortografiei</translation>
 <translation id="1336254985736398701">Vedeți &amp;informații despre pagină</translation>
 <translation id="5039440886426314758">Instalați aceste aplicații și extensii?</translation>
@@ -825,35 +836,35 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
     <ph name="BEGIN_BOLD"/>să permiteți sau să restricționați<ph name="END_BOLD"/> accesul la anumite site-uri;
     <ph name="BEGIN_BOLD"/>să examinați<ph name="END_BOLD"/> site-urile accesate de utilizatorul monitorizat;
     <ph name="BEGIN_BOLD"/>să gestionați<ph name="END_BOLD"/> alte setări.</translation>
-<translation id="6828153365543658583">Restricționați conectarea următorilor utilizatori:</translation>
+<translation id="6828153365543658583">Restricționați conectarea la următorii utilizatori:</translation>
 <translation id="8106045200081704138">În colaborare cu mine</translation>
 <translation id="1652965563555864525">Dezactivați &amp;sunetul</translation>
 <translation id="4200983522494130825">Filă &amp;nouă</translation>
 <translation id="7979036127916589816">Eroare de sincronizare</translation>
 <translation id="4426082685552308673">Medie</translation>
 <translation id="802597130941734897">Gestionați adresele de expediere...</translation>
-<translation id="1029317248976101138">Măriți</translation>
+<translation id="1029317248976101138">Zoom</translation>
 <translation id="1763108912552529023">Explorați în continuare</translation>
 <translation id="5455790498993699893"><ph name="ACTIVE_MATCH"/> din <ph name="TOTAL_MATCHCOUNT"/></translation>
 <translation id="1617097702943948177">Stocare temporară:</translation>
 <translation id="6551508934388063976">Comanda nu este disponibilă. Pentru a deschide o fereastră nouă, apăsați pe Ctrl+N.</translation>
-<translation id="1202290638211552064">Serverul gateway sau proxy a expirat în timpul așteptării răspunsului de la un server superior.</translation>
+<translation id="1202290638211552064">Conexiunea la gateway sau la serverul proxy a expirat când se aștepta un răspuns de la un server ierarhic superior.</translation>
 <translation id="5089823027662815955">&amp;Căutați imaginea cu <ph name="SEARCH_ENGINE"/></translation>
-<translation id="7765158879357617694">Mutaţi</translation>
+<translation id="7765158879357617694">Mutați</translation>
 <translation id="2192280117622171197">O extensie a modificat ce pagină se afișează când căutați din caseta polivalentă.</translation>
 <translation id="2731700343119398978">Așteptați...</translation>
-<translation id="5731751937436428514">Metoda de introducere pentru vietnameză (VIQR)</translation>
+<translation id="5731751937436428514">Metoda de introducere a textului în vietnameză (VIQR)</translation>
 <translation id="8412144371993786373">Marcați pagina curentă</translation>
 <translation id="1151169732719877940">Activați consecvența de identitate între browser și depozitul de cookie-uri</translation>
 <translation id="7615851733760445951">&lt;niciun cookie selectat&gt;</translation>
 <translation id="2493021387995458222">Selectați „câte un cuvânt”</translation>
-<translation id="5279600392753459966">Blocați-le pe toate</translation>
-<translation id="5723508132121499792">Nu rulează nicio aplicație de fundal</translation>
+<translation id="5279600392753459966">Blochează-le pe toate</translation>
+<translation id="5723508132121499792">Nu rulează aplicații în fundal</translation>
 <translation id="474421578985060416">Blocat de dvs.</translation>
 <translation id="7392915005464253525">R&amp;edeschideți fereastra închisă</translation>
 <translation id="3433621910545056227">Hopa! Sistemul nu a reușit să blocheze atributele la instalarea pe gadget.</translation>
 <translation id="6677037229676347494">ID-ul așteptat era „<ph name="EXPECTED_ID"/>”, dar ID-ul a fost „<ph name="NEW_ID"/>”.</translation>
-<translation id="7400418766976504921">Adresa URL</translation>
+<translation id="7400418766976504921">Adresă URL</translation>
 <translation id="7456847797759667638">Deschideți o locație...</translation>
 <translation id="5622017037336776003">Deschideți fișierul PDF în Google Reader</translation>
 <translation id="7378627244592794276">Nu</translation>
@@ -869,7 +880,7 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="4022426551683927403">&amp;Adăugați în dicționar</translation>
 <translation id="5639549361331209298">Reîncărcați această pagină. Țineți apăsat pentru a vedea mai multe opțiuni</translation>
 <translation id="2897878306272793870">Sunteți sigur că doriți să deschideți <ph name="TAB_COUNT"/> (de) file?</translation>
-<translation id="312759608736432009">Producător dispozitiv:</translation>
+<translation id="312759608736432009">Fabricantul dispozitivului:</translation>
 <translation id="4814834690657896884">„<ph name="CLIENT_NAME"/>” depanează această filă.</translation>
 <translation id="1225177025209879837">Se procesează solicitarea...</translation>
 <translation id="362276910939193118">Afișați întregul istoric</translation>
@@ -986,24 +997,24 @@ Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
 <translation id="7530016656428373557">Rata de descărcare în wați</translation>
 <translation id="5774515636230743468">Manifest:</translation>
 <translation id="4960944339761782076">Folosiți baloane pentru solicitări de permisiuni</translation>
-<translation id="1817871734039893258">Recuperare de fișiere Microsoft</translation>
+<translation id="1817871734039893258">Recuperare fișiere Microsoft</translation>
 <translation id="2423578206845792524">Sal&amp;vați imaginea ca...</translation>
 <translation id="6806236207372176468">Dezactivați compatibilitatea pentru codificarea video WebRTC prin hardware.</translation>
 <translation id="7549584377607005141">Pentru a fi afișată corespunzător, această pagină web necesită date pe care le-ați introdus anterior. Puteți trimite aceste date din nou, dar astfel veți repeta orice acțiuni realizate anterior de această pagină.</translation>
 <translation id="6954850746343724854">Activează modul Client nativ pentru toate aplicațiile web, chiar și pentru cele care nu au fost instalate din Magazinul web Chrome.</translation>
 <translation id="1255280268830828398">Excepții privind pluginurile</translation>
 <translation id="9068931793451030927">Calea:</translation>
-<translation id="283278805979278081">Faceți o fotografie.</translation>
+<translation id="283278805979278081">Fotografiați.</translation>
 <translation id="6111974609785983504">Permis în mod prestabilit</translation>
 <translation id="4992576607980257687">Notifică-mă dacă un site dorește să utilizeze mesajele rezervate sistemului ca să acceseze dispozitivele MIDI (recomandat)</translation>
 <translation id="1407050882688520094">Aveți stocate certificate care identifică aceste autorități de certificare:</translation>
 <translation id="628816078521253632">Informații despre aplicație...</translation>
 <translation id="6063810760121779748">Dezactivați WebAudio</translation>
 <translation id="4287689875748136217">Pagina web nu se poate încărca, deoarece serverul nu a trimis date.</translation>
-<translation id="1634788685286903402">Acordați încredere acestui certificat pentru identificarea utilizatorilor de e-mail.</translation>
+<translation id="1634788685286903402">Aveți încredere în acest certificat pentru a identifica utilizatorii de e-mail.</translation>
 <translation id="1856715684130786728">Adăugați o locație...</translation>
 <translation id="7219357088166514551">Căutați cu <ph name="ENGINE"/> sau introduceți adresa URL</translation>
-<translation id="4684427112815847243">Se sincronizează integral</translation>
+<translation id="4684427112815847243">Sincronizare totală</translation>
 <translation id="4699357559218762027">(lansată automat)</translation>
 <translation id="4037463823853863991">Activează comutatorul filelor de accesibilitate pentru Android.</translation>
 <translation id="7394102162464064926">Sigur doriți să ștergeți aceste pagini din istoric?
@@ -1016,7 +1027,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="2441392884867482684">Această pagină este acum în modul ecran complet și dorește să dezactiveze cursorul mouse-ului dvs.</translation>
 <translation id="1049376040497900836">Numărul de schimbări ale versiunii <ph name="SHORT_PRODUCT_NAME"/></translation>
 <translation id="1422780722984745882">S-au primit mai multe anteturi Location. Acest lucru nu este permis, ca măsură de protecție împotriva atacurilor prin divizarea răspunsului HTTP.</translation>
-<translation id="7787129790495067395">În prezent utilizați o expresie de acces. Dacă ați uitat expresia de acces, puteți reseta sincronizarea pentru a șterge datele dvs. de pe serverele Google utilizând Tabloul de bord Google.</translation>
+<translation id="7787129790495067395">În prezent utilizați o expresie de acces. Dacă ați uitat-o, puteți reseta sincronizarea pentru a șterge datele de pe serverele Google utilizând Tabloul de bord Google.</translation>
 <translation id="2098305189700762159">Nu a fost găsit</translation>
 <translation id="2260654768907572711">PLUGIN DE BROWSER</translation>
 <translation id="2521119273159503752">ID jurnal</translation>
@@ -1032,9 +1043,9 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="4668711410219362250">https://support.google.com/chrome/bin/answer.py?hl=<ph name="GRITLANGCODE_1"/>&amp;answer=165139&amp;p=settings_sign_in</translation>
 <translation id="3586931643579894722">Ascundeți detaliile</translation>
 <translation id="6285395082104474418">Bara de stare vă arată starea actuală a rețelei, a bateriei și alte informații.</translation>
-<translation id="3317459757438853210">Duplex</translation>
+<translation id="3317459757438853210">Față-verso</translation>
 <translation id="6020949471045037306">Activează noul sistem de gestionare a profilurilor, inclusiv blocarea profilurilor și noua interfață de utilizare cu meniu cu avatare.</translation>
-<translation id="2011110593081822050">Proces Worker Web: <ph name="WORKER_NAME"/></translation>
+<translation id="2011110593081822050">Instrument web: <ph name="WORKER_NAME"/></translation>
 <translation id="3294437725009624529">Invitat</translation>
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN"/> este acum pe ecran complet.</translation>
 <translation id="1465078513372056452">Utilizați adresa de facturare pentru expediere</translation>
@@ -1042,10 +1053,10 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="3866891870106102201">Descărcați aplicații</translation>
 <translation id="8946700122400538408">Activați compatibilitatea pentru ServiceWorker.</translation>
 <translation id="3512284449647229026">Paginile care nu se încarcă când browserul este offline se vor reîncărca automat numai dacă fila acestora este vizibilă.</translation>
-<translation id="8494979374722910010">Încercarea de conectare la server a eșuat.</translation>
+<translation id="8494979374722910010">Încercarea de conectare la server nu a reușit.</translation>
 <translation id="5241364149922736632">Adesea, comercianții au nevoie de numărul dvs. de telefon pentru cazurile în care apar probleme cu expedierea comenzii.</translation>
 <translation id="1864756863218646478">Fișierul nu a putut fi găsit.</translation>
-<translation id="7810202088502699111">Ferestrele de tip pop-up au fost blocate pe această pagină.</translation>
+<translation id="7810202088502699111">Ferestrele pop-up au fost blocate pe această pagină.</translation>
 <translation id="3808873045540128170">Și dus a fost!</translation>
 <translation id="744341768939279100">Creați un profil nou</translation>
 <translation id="646727171725540434">Proxy HTTP</translation>
@@ -1071,7 +1082,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="8744641000906923997">Romaji</translation>
 <translation id="5451561500892538488">Ascundeți pictograma Notificări</translation>
 <translation id="8784626084144195648">Medie limitată</translation>
-<translation id="348620396154188443">Permiteți tuturor site-urilor să afișeze notificări pe desktop</translation>
+<translation id="348620396154188443">Permite tuturor site-urilor să afișeze notificări pe desktop</translation>
 <translation id="7375125077091615385">Tip:</translation>
 <translation id="8214489666383623925">Deschideți fișierul...</translation>
 <translation id="4583537898417244378">Fișier nevalid sau deteriorat.</translation>
@@ -1089,7 +1100,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="5182671122927417841">Dezactivați extensiile</translation>
 <translation id="4242577469625748426">Setările de politică nu au putut fi instalate pe gadget: <ph name="VALIDATION_ERROR"/>.</translation>
 <translation id="8165208966034452696"><ph name="PLUGIN_NAME"/></translation>
-<translation id="4933484234309072027">încorporată în <ph name="URL"/></translation>
+<translation id="4933484234309072027">încorporat în <ph name="URL"/></translation>
 <translation id="5554720593229208774">Autoritate de certificare e-mail</translation>
 <translation id="6041395869988343674">Noua versiune și un mesaj prietenos</translation>
 <translation id="862750493060684461">Memorie cache CSS</translation>
@@ -1104,24 +1115,24 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="5823933238730612365">PPAPI (scos din mediul de testare)</translation>
 <translation id="5301751748813680278">Se conectează ca invitat.</translation>
 <translation id="121827551500866099">Afișați toate descărcările...</translation>
-<translation id="5949910269212525572">Nu se poate rezolva adresa DNS a serverului.</translation>
-<translation id="3115147772012638511">Se așteaptă cache-ul</translation>
+<translation id="5949910269212525572">Nu s-a putut rezolva adresa DNS a serverului.</translation>
+<translation id="3115147772012638511">Se așteaptă cache-ul...</translation>
 <translation id="257088987046510401">Teme</translation>
-<translation id="6771079623344431310">Nu poate fi realizată conexiunea la serverul proxy</translation>
+<translation id="6771079623344431310">Nu se poate stabili conexiunea cu serverul proxy</translation>
 <translation id="7740996059027112821">Standard</translation>
-<translation id="409980434320521454">Sincronizarea a eșuat</translation>
+<translation id="409980434320521454">Sincronizarea nu a reușit</translation>
 <translation id="192144045824434199">Activați ferestrele panou care se deschid în afara cadrului de browser. Încercările de a deschide un panou vor determina deschiderea unei ferestre de tip pop-up, dacă această setare nu este activată. Panourile sunt activate întotdeauna în canalele pentru dezvoltatori și în cele din versiunea canary.</translation>
 <translation id="7051943809462976355">Se caută mouse-ul...</translation>
 <translation id="6344783595350022745">Ștergeți textul</translation>
 <translation id="1426410128494586442">Da</translation>
 <translation id="2359345697448000899">Gestionați extensiile făcând clic pe Extensii în meniul Instrumente.</translation>
-<translation id="6725970970008349185">Numărul de candidați de afișat pe pagină</translation>
+<translation id="6725970970008349185">Numărul de sugestii de afișat pe pagină</translation>
 <translation id="6513615899227776181">Plugin: <ph name="PLUGIN_NAME"/></translation>
-<translation id="6198252989419008588">Schimbați codul PIN</translation>
+<translation id="6198252989419008588">Modificați codul PIN</translation>
 <translation id="5749483996735055937">A apărut o problemă la copierea imaginii de recuperare pe dispozitiv.</translation>
 <translation id="5756163054456765343">C&amp;entrul de ajutor</translation>
 <translation id="4341364588986930687">Domeniul <ph name="DOMAIN"/> necesită verificarea identității dispozitivului dvs. de către Google, pentru a determina eligibilitatea pentru redarea avansată a conținutului media protejat. <ph name="LEARN_MORE"/>.</translation>
-<translation id="7643817847124207232">S-a pierdut conexiunea la Internet.</translation>
+<translation id="7643817847124207232">A fost pierdută conexiunea la internet.</translation>
 <translation id="4871210892959306034">$1 KB</translation>
 <translation id="932327136139879170">Pagina de pornire</translation>
 <translation id="3561204836318837461">BSSID:</translation>
@@ -1134,7 +1145,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="121201262018556460">Ați încercat să accesați <ph name="DOMAIN"/>, dar serverul a furnizat un certificat care conține o cheie slabă. Un atacator ar fi putut sparge cheia privată și este posibil ca serverul să nu fie cel așteptat de dvs. (este posibil să comunicați cu un atacator).</translation>
 <translation id="5553089923092577885">Mapări de certificate de politică</translation>
 <translation id="7410744438574300812">Nu afișați bara de informații când se atașează o extensie unei pagini utilizând API-ul chrome.debugger. Acest marcaj este necesar pentru a remedia erorile paginilor cu extensii din fundal.</translation>
-<translation id="1275018677838892971">Site-ul web de la <ph name="HOST_NAME"/> conține elemente de pe site-uri care au fost raportate ca fiind site-uri de „phishing”. Site-urile care practică phishingul îi înșeală pe utilizatori pentru ca aceștia să dezvăluie informații personale sau financiare, adesea însușindu-și identitatea unor instituții de încredere, precum băncile.</translation>
+<translation id="1275018677838892971">Site-ul de la <ph name="HOST_NAME"/> conține elemente de pe site-uri care au fost raportate ca fiind site-uri de „phishing”. Site-urile de phishing îi înșală pe utilizatori pentru ca aceștia să dezvăluie informații personale sau financiare, adesea însușindu-și identitatea unor instituții de încredere, precum băncile.</translation>
 <translation id="1357589289913453911">Codul extensiei</translation>
 <translation id="7570477672765183">Faceți clic pentru a începe</translation>
 <translation id="8688579245973331962">Numele dvs. nu apare?</translation>
@@ -1159,20 +1170,20 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
     poate răsfoi toate site-urile de pe web.</translation>
 <translation id="2694026874607847549">1 cookie</translation>
 <translation id="469230890969474295">Dosar OEM</translation>
-<translation id="3909791450649380159">&amp;Decupați</translation>
+<translation id="3909791450649380159">&amp;Tăiați</translation>
 <translation id="2955913368246107853">Închideți Bara de căutare</translation>
 <translation id="4044260751144303020">Compunere pentru elementele cu poziție fixă.</translation>
 <translation id="8722708758503989074">Activează un manager de focalizare experimental pentru a urmări clienții de introducere a textului.</translation>
 <translation id="5642508497713047">Semnatar CRL</translation>
-<translation id="813082847718468539">Afișați informațiile privind site-ul</translation>
+<translation id="813082847718468539">Vedeți informațiile privind site-ul</translation>
 <translation id="127353061808977798">Fonturi și codificare</translation>
-<translation id="3122464029669770682">Procesor</translation>
+<translation id="3122464029669770682">CPU</translation>
 <translation id="1684861821302948641">Opriți paginile</translation>
 <translation id="6080689532560039067">Verificați ora sistemului</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6802031077390104172"><ph name="USAGE"/> (<ph name="OID"/>)</translation>
 <translation id="6025215716629925253">Urmărire stivă</translation>
-<translation id="4052120076834320548">Minuscul</translation>
+<translation id="4052120076834320548">Mic</translation>
 <translation id="3791151686802386313">Se pregătește pentru prima conectare ca întreprindere...</translation>
 <translation id="3393716657345709557">Intrarea solicitată nu a fost găsită în memoria cache.</translation>
 <translation id="7191454237977785534">Salvați fișierul ca</translation>
@@ -1198,9 +1209,9 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="7427315641433634153">MSCHAP</translation>
 <translation id="7894561412851759784">În acest caz, certificatul nu a fost confirmat de o terță parte în care dispozitivul dvs. are încredere. Oricine poate crea un certificat, asumându-și identitatea oricărui site dorește, iar din acest motiv, este important ca certificatul să fie confirmat de o terță parte de încredere. Fără această confirmare, informațiile de identitate din certificat nu au nicio valoare. Nu este, așadar, posibil să se verifice dacă dvs. comunicați cu <ph name="DOMAIN"/>, și nu cu un atacator care își generează propriul certificat, pretinzând că este <ph name="DOMAIN2"/>. Vă recomandăm să nu continuați.</translation>
 <translation id="6622980291894852883">Continuați blocarea imaginilor</translation>
-<translation id="1710259589646384581">SO</translation>
+<translation id="1710259589646384581">Sistem de operare</translation>
 <translation id="8769662576926275897">Detaliile cardului</translation>
-<translation id="4988792151665380515">Exportarea cheii publice nu a reușit.</translation>
+<translation id="4988792151665380515">Exportul cheii publice nu a reușit.</translation>
 <translation id="4764963217871264125">Adăugați un utilizator</translation>
 <translation id="5053604404986157245">Parola TPM generată aleatoriu nu este disponibilă. Acest lucru este normal după utilizarea Powerwash.</translation>
 <translation id="6333049849394141510">Alegeți elementele de sincronizat</translation>
@@ -1244,7 +1255,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="5747785204778348146">Canal pentru dezvoltatori – instabil</translation>
 <translation id="3590194807845837023">Deblocați profilul și relansați Chrome</translation>
 <translation id="6644756108386233011">Resetați setările <ph name="IDS_SHORT_PRODUCT_NAME"/> modificate?</translation>
-<translation id="1090126737595388931">Nu rulează nicio aplicație de fundal</translation>
+<translation id="1090126737595388931">Nu rulează aplicații în fundal</translation>
 <translation id="6285905808004014074">Activați modul de reîncărcare automată a paginilor offline</translation>
 <translation id="1195447618553298278">Eroare necunoscută.</translation>
 <translation id="2617653079636271958">Zoom: <ph name="VALUE"/> %</translation>
@@ -1258,10 +1269,10 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="6750299625019870383">Activați închiderea rapidă a filelor/ferestrelor</translation>
 <translation id="5228309736894624122">Eroare de protocol SSL.</translation>
 <translation id="8008356846765065031">Internet deconectat. Verificați conexiunea la internet.</translation>
-<translation id="8216170236829567922">Metoda de introducere pentru thai (tastatură Pattachote)</translation>
+<translation id="8216170236829567922">Metoda de introducere a textului în thai (tastatură Pattachote)</translation>
 <translation id="799547531016638432">Eliminați comanda rapidă</translation>
 <translation id="8464132254133862871">Acest cont de utilizator nu este eligibil pentru serviciu.</translation>
-<translation id="6812349420832218321"><ph name="PRODUCT_NAME"/> nu poate fi rulat ca root.</translation>
+<translation id="6812349420832218321"><ph name="PRODUCT_NAME"/> nu poate fi rulat în modul root.</translation>
 <translation id="8442065444327205563">Documentul este gata de afișare.</translation>
 <translation id="236141728043665931">Blocați întotdeauna accesul la microfon</translation>
 <translation id="2307462900900812319">Configurați rețeaua</translation>
@@ -1273,9 +1284,9 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="953345106084818179">Solicitați permisiunea</translation>
 <translation id="3105917916468784889">Realizați o captură de ecran</translation>
 <translation id="7547811415869834682">Olandeză</translation>
-<translation id="1587275751631642843">Consolă pentru &amp;JavaScript</translation>
-<translation id="8460696843433742627">A fost primit un răspuns nevalid la încercarea de încărcare a <ph name="URL"/>.
-        Este posibilul ca serverul să fie dezactivat pentru întreținere sau să fie configurat incorect.</translation>
+<translation id="1587275751631642843">Consolă &amp;JavaScript</translation>
+<translation id="8460696843433742627">În timpul încercării de încărcare a adresei <ph name="URL"/>, s-a primit un răspuns nevalid.
+        Este posibil ca serverul să fie oprit pentru lucrări de întreținere sau să fie configurat incorect.</translation>
 <translation id="297870353673992530">Server DNS:</translation>
 <translation id="6445450263907939268">Dacă nu doriți aceste modificări, puteți restabili setările anterioare.</translation>
 <translation id="3756585063990248657">Urmează să accesați un site web raportat ca site de phishing!</translation>
@@ -1287,11 +1298,11 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="6964308487066031935">Adăugați dosarele la „<ph name="EXTENSION"/>”?</translation>
 <translation id="851263357009351303">Permiteți întotdeauna ca <ph name="HOST"/> să afișeze imagini</translation>
 <translation id="7852934890287130200">Creați, modificați sau ștergeți profiluri.</translation>
-<translation id="3511307672085573050">Copiați adresa linkului</translation>
+<translation id="3511307672085573050">Copiați adre&amp;sa linkului</translation>
 <translation id="751507702149411736">Belarusă</translation>
-<translation id="6655190889273724601">Mod dezvoltator</translation>
-<translation id="1071917609930274619">Cifrarea datelor</translation>
-<translation id="3473105180351527598">Activează protecția pentru phishing și malware</translation>
+<translation id="6655190889273724601">Mod pentru dezvoltatori</translation>
+<translation id="1071917609930274619">Cifrare de date</translation>
+<translation id="3473105180351527598">Activați protecția împotriva phishingului și a programelor malware</translation>
 <translation id="6151323131516309312">Apăsați pe <ph name="SEARCH_KEY"/> pentru a căuta în <ph name="SITE_NAME"/></translation>
 <translation id="7541121857749629630">Excepții privind imaginile</translation>
 <translation id="9033857511263905942">&amp;Inserați</translation>
@@ -1301,15 +1312,15 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="1221825588892235038">Numai elementele selectate</translation>
 <translation id="2227939492629426903">Activează noul meniu cu avatare. Când este combinat cu noul sistem de gestionare a profilurilor, afișează doar meniul cu avatare pentru noul sistem de gestionare a profilurilor. În caz contrar, afișează un meniu cu avatare reproiectat, cu aceeași funcționalitate ca a vechiului sistem și un card cu un tutorial în partea de sus, care notifică utilizatorul să încerce noua interfață de utilizare a sistemului de gestionare a profilurilor.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> a blocat accesul la <ph name="HOST_NAME"/>. Acest site web a fost raportat ca site de phishing.</translation>
-<translation id="7201354769043018523">Parant. dreaptă</translation>
+<translation id="7201354769043018523">Parant. înch.</translation>
 <translation id="567825475051805403">Mai multe aplicații</translation>
 <translation id="508794495705880051">Adăugați un card de credit nou...</translation>
 <translation id="1272079795634619415">Opriți</translation>
-<translation id="2462724976360937186">ID cheie emis de Autoritatea de certificare</translation>
+<translation id="2462724976360937186">ID cheie autoritate de certificare</translation>
 <translation id="981121421437150478">Offline</translation>
 <translation id="2964193600955408481">Dezactivați Wi-Fi</translation>
 <translation id="6786747875388722282">Extensii</translation>
-<translation id="2570648609346224037">A apărut o problemă în timpul descărcării imaginii de recuperare.</translation>
+<translation id="2570648609346224037">A apărut o problemă la descărcarea imaginii de recuperare.</translation>
 <translation id="5372384633701027870">Cookie-urile și alte date privind site-urile sunt șterse când închid browserul</translation>
 <translation id="4781787911582943401">Mărește ecranul</translation>
 <translation id="9053965862400494292">A apărut o eroare la configurarea sincronizării.</translation>
@@ -1334,7 +1345,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="273093730430620027">Această pagină vă accesează camera.</translation>
 <translation id="5605623530403479164">Alte motoare de căutare</translation>
 <translation id="3345234884557051648">Am sunat la acest număr și am solicitat un încărcător de schimb.</translation>
-<translation id="5710435578057952990">Identitatea acestui site nu a fost verificată.</translation>
+<translation id="5710435578057952990">Identitatea acestui site nu a fost confirmată.</translation>
 <translation id="5813119285467412249">&amp;Repetați adăugarea</translation>
 <translation id="1303319084542230573">Adăugați o imprimantă</translation>
 <translation id="495170559598752135">Acțiuni</translation>
@@ -1350,15 +1361,15 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="5880247576487732437">Indicativ prezent</translation>
 <translation id="7157063064925785854">Dacă dați clic pe Continuați, sunteți de acord cu <ph name="LEGAL_DOC_LINK_TEXT_1"/>, <ph name="LEGAL_DOC_LINK_TEXT_2"/>, <ph name="LEGAL_DOC_LINK_TEXT_3"/> și <ph name="LEGAL_DOC_LINK_TEXT_4"/>.</translation>
 <translation id="8412498037462710569">Confirm că nu doresc să primesc un încărcător gratuit de schimb.</translation>
-<translation id="3368922792935385530">Conectat</translation>
+<translation id="3368922792935385530">Conectată</translation>
 <translation id="5431473096922271583">Vă rugăm să verificați dacă folosiți un încărcător original.</translation>
 <translation id="3478477114335130296">Este posibil ca unele setări să fi fost modificate fără cunoștința dvs.</translation>
 <translation id="3866443872548686097">Suportul dvs. de recuperare este gata. Îl puteți elimina din sistem.</translation>
 <translation id="5525677322972469346">Creați un nou utilizator monitorizat</translation>
 <translation id="6824564591481349393">Copiați adresa de &amp;e-mail</translation>
-<translation id="907148966137935206">Nu permiteți niciunui site să afișeze ferestre de tip pop-up (recomandat)</translation>
+<translation id="907148966137935206">Nu permite niciunui site să afișeze ferestre pop-up (recomandat)</translation>
 <translation id="5184063094292164363">Consolă &amp;JavaScript</translation>
-<translation id="333371639341676808">Restricționați crearea de dialoguri suplimentare de către această pagină.</translation>
+<translation id="333371639341676808">Împiedicați această pagină să creeze alte casete de dialog.</translation>
 <translation id="2280486287150724112">Margine la dreapta</translation>
 <translation id="5631017369956619646">Utilizarea procesorului</translation>
 <translation id="7223775956298141902">Hopa... Nu aveți nicio extensie :-(</translation>
@@ -1384,7 +1395,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="6424403873117573177">Cu toate acestea, dacă lucrați într-o organizație care își generează propriile certificate și încercați să vă conectați la un site web intern al respectivei organizații utilizând un astfel de certificat, este posibil să rezolvați această problemă în siguranță. Puteți să importați certificatul rădăcină al organizației sub formă de „certificat rădăcină&quot;, urmând ca certificatele emise sau confirmate de organizație să fie considerate de încredere. Astfel, nu se va mai afișa această eroare data viitoare când încercați să vă conectați la un site web intern. Contactați personalul de ajutor al organizației pentru asistență privind adăugarea unui nou certificat rădăcină pe dispozitiv.</translation>
 <translation id="2450531422290975480">Dacă înțelegeți riscurile de securitate, puteți să <ph name="BEGIN_LINK"/>accesați acest site nesigur<ph name="END_LINK"/> (nerecomandat) înainte ca programele periculoase să fie eliminate.</translation>
 <translation id="1721937473331968728">Puteți adăuga la <ph name="CLOUD_PRINT_NAME"/> imprimantele clasice pe care le-ați conectat la computer.</translation>
-<translation id="3341703758641437857">Permiteți accesul la adresele URL spre fișiere</translation>
+<translation id="3341703758641437857">Permiteți accesul la adresele URL de fișiere</translation>
 <translation id="6948142510520900350">&lt;strong&gt;Administratorul de sistem&lt;/strong&gt; a blocat accesul la această pagină web.</translation>
 <translation id="5702898740348134351">&amp;Editați motoarele de căutare...</translation>
 <translation id="3687701603889589626">Permite rularea extensiilor la adresele URL chrome://, atunci când extensiile solicită în mod explicit această permisiune.</translation>
@@ -1422,13 +1433,13 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="2401813394437822086">Nu vă puteți accesa contul?</translation>
 <translation id="4906679076183257864">Resetați la valorile prestabilite</translation>
 <translation id="4747597332667805440">Activați interfața cu baloane pentru restabilirea sesiunii.</translation>
-<translation id="2344262275956902282">Utilizați tastele - și = pentru a pagina o listă de candidați</translation>
+<translation id="2344262275956902282">Utilizați tastele - și = pentru a pagina o listă de sugestii</translation>
 <translation id="3609138628363401169">Serverul nu acceptă extensia de renegociere TLS.</translation>
 <translation id="4926098191708537519">RSA</translation>
 <translation id="3369624026883419694">Se rezolvă gazda...</translation>
 <translation id="8870413625673593573">Închise recent</translation>
 <translation id="8297222119869486204">Activați elementul „window-controls”</translation>
-<translation id="9145357542626308749">Certificatul de securitate al site-ului este semnat utilizând un algoritm de semnături slab!</translation>
+<translation id="9145357542626308749">Certificatul de securitate al site-ului este semnat utilizând un algoritm de semnare slab!</translation>
 <translation id="8502803898357295528">Parola dvs. a fost schimbată</translation>
 <translation id="5171045022955879922">Căutați sau introduceți adresa URL</translation>
 <translation id="6830600606572693159">Pagina web de la <ph name="URL"/> nu este disponibilă momentan. Poate fi supraîncărcată sau dezactivată pentru lucrări de întreținere.</translation>
@@ -1452,13 +1463,13 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="6913830198853875055">Dacă este activat, previzualizările rezultatelor de căutare sunt preluate în avans și schimbate cu pagina originală când aceasta este descărcată și redată.</translation>
 <translation id="6561442619165486567">Modificați modul în care se permite accesul la acest fișier.</translation>
 <translation id="5332360333956573658">Nu au putut fi salvate datele în Google Wallet.</translation>
-<translation id="3759371141211657149">Gestionați setările pentru programele asociate...</translation>
+<translation id="3759371141211657149">Gestionați setările pentru handlere...</translation>
 <translation id="8856844195561710094">Oprirea descoperirii dispozitivelor Bluetooth a eșuat.</translation>
 <translation id="2246340272688122454">Se descarcă imaginea de recuperare...</translation>
 <translation id="5305688511332277257">Niciunul instalat</translation>
 <translation id="1958802757844394735">Restabiliți setările browserului la valorile standard inițiale.</translation>
 <translation id="8521441079177373948">UK</translation>
-<translation id="2816269189405906839">Metoda de introducere pentru chineză (cangjie)</translation>
+<translation id="2816269189405906839">Metoda de introducere a textului în chineză (cangjie)</translation>
 <translation id="1857166538520940818">Atașați fișierul:</translation>
 <translation id="2149951639139208969">Deschideți adresa într-o filă nouă</translation>
 <translation id="8012382203418782830">Pagina a fost tradusă.</translation>
@@ -1469,25 +1480,25 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="9154967591629748964">Numărul maxim de panouri pentru zona de interes</translation>
 <translation id="2655386581175833247">Certificat de utilizator:</translation>
 <translation id="5039804452771397117">Permiteți</translation>
-<translation id="5435964418642993308">Apăsați pe Enter pentru a reveni, pe tasta pentru meniu contextual pentru a afișa istoricul</translation>
+<translation id="5435964418642993308">Apăsați pe Enter pentru a naviga înapoi, pe tasta pentru meniu contextual pentru a afișa istoricul</translation>
 <translation id="6815206662964743929">Comutați la alt utilizator</translation>
 <translation id="81686154743329117">ZRM</translation>
 <translation id="2150139952286079145">Căutați destinații</translation>
 <translation id="4713309396072794887">Instalați aceste extensii?</translation>
 <translation id="5637940320504994319">Nu aveți spațiu suficient în Disc Google</translation>
 <translation id="8194797478851900357">&amp;Anulați mutarea</translation>
-<translation id="2266011376676382776">Pagină(i) inactivă(e)</translation>
+<translation id="2266011376676382776">Pagini inactive</translation>
 <translation id="2907619724991574506">Adrese URL de pornire</translation>
 <translation id="6780476430578694241">Lansatorul de aplicații</translation>
 <translation id="5328285148748012771">Accesați toate aplicațiile dvs. din acest lansator ușor de utilizat. Jucați jocuri, comunicați prin chat video, ascultați muzică, editați documente sau obțineți mai multe aplicații din Magazinul web Chrome.</translation>
 <translation id="2739191690716947896">Remediați erorile</translation>
-<translation id="3100609564180505575">Module (<ph name="TOTAL_COUNT"/>) – Conflicte cunoscute: <ph name="BAD_COUNT"/>, probabile: <ph name="SUSPICIOUS_COUNT"/></translation>
+<translation id="3100609564180505575">Module (<ph name="TOTAL_COUNT"/>) – Conflicte cunoscute: <ph name="BAD_COUNT"/>, suspectate: <ph name="SUSPICIOUS_COUNT"/></translation>
 <translation id="641702813324074008">Activați interfața cu baloane pentru salvarea parolelor</translation>
 <translation id="3627671146180677314">Interval de reînnoire a certificatului Netscape</translation>
 <translation id="6869967057083711802">Acest tip de fișier nu este acceptat. Accesați <ph name="BEGIN_LINK"/>Magazinul web Chrome<ph name="END_LINK"/> pentru a găsi o aplicație similară.
         <ph name="BEGIN_LINK_HELP"/>Aflați mai multe<ph name="END_LINK_HELP"/></translation>
 <translation id="6980956047710795611">Efectuați migrarea tuturor datelor din sistemul de operare Chrome la noua parolă (este necesară parola anterioară)</translation>
-<translation id="8652487083013326477">buton radio interval pagini</translation>
+<translation id="8652487083013326477">buton radio interval de pagini</translation>
 <translation id="5204967432542742771">Introduceți parola</translation>
 <translation id="6686817083349815241">Salvați parola</translation>
 <translation id="9025098623496448965">OK, revin la ecranul de conectare</translation>
@@ -1498,12 +1509,12 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="5485754497697573575">Restabiliți toate filele</translation>
 <translation id="7892100671754994880">Utilizatorul următor</translation>
 <translation id="5532223876348815659">Global</translation>
-<translation id="644038709730536388">Aflați mai multe despre cum să vă protejați de software rău-intenționat online.</translation>
+<translation id="644038709730536388">Aflați mai multe despre cum să vă protejați de software-ul rău-intenționat online.</translation>
 <translation id="340013220407300675">Atacatorii pot încerca să vă fure informațiile de pe <ph name="BEGIN_BOLD"/><ph name="SITE"/><ph name="END_BOLD"/> (de exemplu, parolele, mesajele sau informațiile despre cardurile de credit).</translation>
-<translation id="2155931291251286316">Permiteți întotdeauna afișarea ferestrelor de tip pop-up de la <ph name="HOST"/></translation>
+<translation id="2155931291251286316">Permiteți întotdeauna afișarea ferestrelor pop-up de la <ph name="HOST"/></translation>
 <translation id="3445830502289589282">Autentificare faza 2:</translation>
 <translation id="5650551054760837876">Nu au fost găsite rezultate de căutare.</translation>
-<translation id="5494362494988149300">Doresc să se deschidă după &amp;descărcare</translation>
+<translation id="5494362494988149300">Deschideți când s-a &amp;descărcat</translation>
 <translation id="2956763290572484660"><ph name="COOKIES"/> (de) cookie-uri</translation>
 <translation id="4552743797467545052">Rularea unui plugin scos din mediul de testare a fost permisă pe această pagină.</translation>
 <translation id="8041535018532787664">Adăugați o aplicație de tip chioșc:</translation>
@@ -1514,7 +1525,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="8425492902634685834">Fixați pe Bara de activități</translation>
 <translation id="5841087406288323122">Validarea nu a reușit</translation>
 <translation id="7487099628810939106">Întârziere înaintea clicului:</translation>
-<translation id="825608351287166772">Certificatele au o perioadă de valabilitate, ca și orice document de identitate (cum ar fi un pașaport) pe care îl aveți. Certificatul prezentat browser-ului dvs. nu este încă valabil. Când un certificat se află în afara perioadei sale de valabilitate, anumite informații despre starea certificatului (dacă a fost revocat și nu mai prezintă garanție) nu este necesar să fie menținute. Prin urmare, nu este posibil să se confirme faptul că acest certificat este demn de încredere. Nu trebuie să mergeți mai departe.</translation>
+<translation id="825608351287166772">Certificatele au o perioadă de valabilitate, ca și orice document de identitate (cum ar fi un pașaport) pe care îl aveți. Certificatul prezentat browserului dvs. nu este încă valabil. Când un certificat se află în afara perioadei sale de valabilitate, anumite informații despre starea certificatului (dacă a fost revocat și nu mai prezintă garanție) nu este necesar să fie menținute. Prin urmare, nu este posibil să se confirme faptul că acest certificat este demn de încredere. Vă recomandăm să nu continuați.</translation>
 <translation id="2381823505763074471">Deconectați utilizatorul <ph name="PROFILE_USERNAME"/>.</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="23030561267973084">„<ph name="EXTENSION_NAME"/>” a solicitat permisiuni suplimentare.</translation>
@@ -1523,7 +1534,7 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="8551494947769799688">Letonă</translation>
 <translation id="4567676092950881857">Dezactivați conectarea SAML.</translation>
 <translation id="4803909571878637176">Se dezinstalează</translation>
-<translation id="5209518306177824490">Amprentă SHA-1</translation>
+<translation id="5209518306177824490">Amprentă digitală SHA-1</translation>
 <translation id="2546283357679194313">Cookie-uri și date privind site-ul</translation>
 <translation id="5833610766403489739">Fișierul nu poate fi găsit. Verificați setarea locației de descărcare și încercați din nou.</translation>
 <translation id="4926150172344704583">Canada</translation>
@@ -1538,10 +1549,10 @@ Data viitoare ați putea utiliza combinația <ph name="SHORTCUT_KEY"/> pentru a
 <translation id="6602956230557165253">Utilizați butoanele săgeată la stânga și la dreapta pentru a naviga.</translation>
 <translation id="3612070600336666959">Se dezactivează</translation>
 <translation id="5178612934849781517">Dacă este activat, se va folosi un flux de conectare exclusiv online la prima rulare/în pagina Filă nouă/din meniul cheie/în pagina cu setări. În caz contrar, se va folosi un flux nativ cu WebView încorporat.</translation>
-<translation id="3759461132968374835">Nu aveți închideri cu eroare raportate recent. Închiderile cu eroare care au avut loc atunci când raportarea acestora a fost dezactivată nu vor apărea aici.</translation>
+<translation id="3759461132968374835">Nu există blocări raportate recent. Blocările care au avut loc când raportarea blocărilor era dezactivată nu vor apărea aici.</translation>
 <translation id="189210018541388520">Deschideți ecranul complet</translation>
-<translation id="8795668016723474529">Adăugați o carte de credit</translation>
-<translation id="5860033963881614850">Dezactivat</translation>
+<translation id="8795668016723474529">Adăugați un card de credit</translation>
+<translation id="5860033963881614850">Oprită</translation>
 <translation id="6575251558004911012">Notifică-mă dacă un site solicită acces la cameră (recomandat)</translation>
 <translation id="4116663294526079822">Permiteți întotdeauna pe acest site</translation>
 <translation id="7547317915858803630">Avertisment: setările <ph name="PRODUCT_NAME"/> sunt stocate pe o unitate de rețea, ceea ce poate duce la încetiniri, blocări sau chiar la pierderi de date.</translation>
@@ -1598,7 +1609,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="6718273304615422081">Se arhivează...</translation>
 <translation id="4109135793348361820">Mutați fereastra la <ph name="USER_NAME"/> (<ph name="USER_EMAIL"/>)</translation>
 <translation id="8104727996780335409">Anonim</translation>
-<translation id="3733127536501031542">Server SSL cu upgrade</translation>
+<translation id="3733127536501031542">Server SSL cu Step-Up</translation>
 <translation id="7473891865547856676">Nu, mulțumesc</translation>
 <translation id="8312871300878166382">Inserați în dosar</translation>
 <translation id="49896407730300355">Rotiți în sens &amp;invers acelor de ceasornic</translation>
@@ -1606,7 +1617,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="5745056705311424885">A fost detectat un stick de memorie USB</translation>
 <translation id="626568068055008686">Parola nu este corectă sau fișierul este deteriorat.</translation>
 <translation id="939598580284253335">Introduceți expresia de acces</translation>
-<translation id="8418240940464873056">Mod Litere chinezești</translation>
+<translation id="8418240940464873056">Mod Hanja</translation>
 <translation id="4263757076580287579">Înregistrarea imprimantei a fost anulată.</translation>
 <translation id="5788367137662787332">Ne pare rău, cel puțin o partiție de pe dispozitivul <ph name="DEVICE_LABEL"/> nu a putut fi montată.</translation>
 <translation id="392089482157167418">Activați ChromeVox (feedback rostit)</translation>
@@ -1621,13 +1632,13 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="3335947283844343239">Redeschideți fila închisă</translation>
 <translation id="5848934677402291689">Se salvează în format PDF</translation>
 <translation id="2480626392695177423">Comutați modul de punctuație cu lățime întreagă/pe jumătate</translation>
-<translation id="5830410401012830739">Gestionați setările locației...</translation>
+<translation id="5830410401012830739">Gestionați setările privind locația...</translation>
 <translation id="8787865569533773240">Resetați setările <ph name="IDS_SHORT_PRODUCT_NAME"/> modificate</translation>
 <translation id="1901377140875308934">Conectați-vă la <ph name="SHORT_PRODUCT_NAME"/>...</translation>
 <translation id="5529098031581368697">Fundalul actual este setat de „<ph name="APP_NAME"/>”</translation>
 <translation id="7664333939334980398">64</translation>
 <translation id="3947376313153737208">Nicio selecție</translation>
-<translation id="1346104802985271895">Metoda de introducere pentru vietnameză (TELEX)</translation>
+<translation id="1346104802985271895">Metoda de introducere a textului în vietnameză (TELEX)</translation>
 <translation id="2242603986093373032">Niciun dispozitiv</translation>
 <translation id="7713873128508426081">Permis întotdeauna</translation>
 <translation id="5889282057229379085">Număr maxim de Autorități de certificare (CA) intermediare: <ph name="NUM_INTERMEDIATE_CA"/></translation>
@@ -1645,12 +1656,12 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="5496587651328244253">Organizați</translation>
 <translation id="5967867314010545767">Eliminați din istoric</translation>
 <translation id="5984222099446776634">Recently visited (Vizitate recent)</translation>
-<translation id="4821086771593057290">Parola dvs. s-a schimbat. Încercați din nou cu noua parolă.</translation>
+<translation id="4821086771593057290">Parola dvs. s-a modificat. Încercați din nou cu noua parolă.</translation>
 <translation id="6080696365213338172">Ați accesat conținut utilizând un certificat oferit de administrator. Datele pe care le transmiteți către <ph name="DOMAIN"/> pot fi interceptate de administratorul dvs.</translation>
 <translation id="7075513071073410194">PKCS #1 MD5 cu criptare RSA</translation>
 <translation id="7767646430896201896">Opțiuni:</translation>
 <translation id="3562567103352435966">Site-ul web de la <ph name="HOST_NAME"/> conține elemente de pe site-uri care par a găzdui programe malware – software care poate dăuna dispozitivului sau care poate funcționa fără consimțământul dvs. Dispozitivul poate fi infectat prin simpla accesare a unui site care conține programe malware. Site-ul web găzduiește, de asemenea, conținut de pe site-uri care au fost raportate ca fiind site-uri de „phishing”. Site-urile care practică phishingul îi înșală pe utilizatori pentru ca aceștia să dezvăluie informații personale sau financiare, adesea însușindu-și identitatea unor instituții de încredere, precum băncile.</translation>
-<translation id="7124398136655728606">Apăsarea tastei Esc golește întregul buffer de pre-editare</translation>
+<translation id="7124398136655728606">Apăsarea tastei Esc golește zona-tampon de pre-editare</translation>
 <translation id="3344786168130157628">Nume punct de acces:</translation>
 <translation id="8293206222192510085">Adăugați marcaj</translation>
 <translation id="2592884116796016067">O parte a acestei pagini (HTML WebWorker) a generat erori și este posibil să nu funcționeze corespunzător.</translation>
@@ -1674,7 +1685,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="8705331520020532516">Număr de serie</translation>
 <translation id="1665770420914915777">Utilizați pagina Filă nouă</translation>
 <translation id="160747070824041275">Extensie actualizată</translation>
-<translation id="1691063574428301566">Computerul dvs. va fi repornit când actualizarea este finalizată.</translation>
+<translation id="1691063574428301566">Computerul va reporni când actualizarea este finalizată.</translation>
 <translation id="1042574203789536285"><ph name="URL"/> dorește să stocheze permanent cantități mari de date pe dispozitivul dvs.</translation>
 <translation id="4697551882387947560">La încheierea sesiunii de navigare</translation>
 <translation id="7779249319235708104">Avertizare de atac de phishing</translation>
@@ -1714,7 +1725,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="6557392038994299187">Versiunea actuală</translation>
 <translation id="3918463242211429038">Aveți probleme de actualizare?</translation>
 <translation id="1120026268649657149">Cuvântul cheie trebuie să lipsească sau să fie unic</translation>
-<translation id="542318722822983047">Mutați automat cursorul la caracterul următor</translation>
+<translation id="542318722822983047">Mutați automat cursorul către următorul caracter</translation>
 <translation id="5317780077021120954">Salvați</translation>
 <translation id="8152091997436726702">Înregistrarea imprimantei a expirat. Pentru a înregistra o imprimantă, este necesar să confirmați înregistrarea pe imprimantă.</translation>
 <translation id="651942933739530207">Doriți ca aplicația <ph name="APP_NAME"/> să aibă acces la ecran și la ieșirea audio?</translation>
@@ -1725,7 +1736,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="1883255238294161206">Restrângeți lista</translation>
 <translation id="4558426062282641716">S-a solicitat permisiunea de lansare automată</translation>
 <translation id="3100472813537288234">Ascundeți verificarea ortografiei și a gramaticii</translation>
-<translation id="358344266898797651">Celtică</translation>
+<translation id="358344266898797651">Celtă</translation>
 <translation id="3625870480639975468">Resetați zoomul</translation>
 <translation id="8337399713761067085">În prezent sunteți în modul offline</translation>
 <translation id="5199729219167945352">Experimente</translation>
@@ -1743,7 +1754,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="7792012425874949788">A apărut o eroare la conectare</translation>
 <translation id="4105563239298244027">Primiți 1 TB spațiu de stocare gratuit în Google Drive</translation>
 <translation id="8889883017054825362">Citește și modifică istoricul navigării</translation>
-<translation id="7724603315864178912">Decupați</translation>
+<translation id="7724603315864178912">Tăiați</translation>
 <translation id="8456681095658380701">Nume nevalid</translation>
 <translation id="3518086201899641494">Notificări despre portaluri captive</translation>
 <translation id="1976150099241323601">Conectați-vă la dispozitivul de securitate</translation>
@@ -1770,13 +1781,13 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="8075539548641175231">Datele dvs. au fost criptate cu parola dvs. de acces pentru sincronizare la <ph name="TIME"/>. Introduceți-o mai jos.</translation>
 <translation id="2077084898869955643">Raportează automat la Google detaliile eventualelor incidente privind securitatea. <ph name="PRIVACY_PAGE_LINK"/></translation>
 <translation id="1815083418640426271">Inserați ca text simplu</translation>
-<translation id="39964277676607559">Nu se poate încărca conținutul javascript „<ph name="RELATIVE_PATH"/>” pentru scriptul de conținut.</translation>
+<translation id="39964277676607559">Nu se poate încărca conținutul JavaScript „<ph name="RELATIVE_PATH"/>” pentru scriptul de conținut.</translation>
 <translation id="979598830323579437">Măriți nivelul de zoom al lupei</translation>
 <translation id="4284105660453474798">Sigur doriți să ștergeți „$1”?</translation>
 <translation id="1600857548979126453">Accesează procesul de fundal al depanatorului de pagină</translation>
 <translation id="2862043554446264826">Se încearcă remedierea tuturor erorilor, cu excepția celor din interfața shell securizată și instrumentul de conversie PNaCl.</translation>
 <translation id="3516765099410062445">Se afișează istoricul din dispozitivele de pe care v-ați conectat. <ph name="BEGIN_LINK"/>Aflați mai multe<ph name="END_LINK"/></translation>
-<translation id="4378551569595875038">Se conectează...</translation>
+<translation id="4378551569595875038">Se stabilește conexiunea...</translation>
 <translation id="7573172247376861652">Încărcarea bateriei</translation>
 <translation id="7029809446516969842">Parole</translation>
 <translation id="3591494811171694976">Activați noua interfață pentru Traducere.</translation>
@@ -1798,25 +1809,25 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="894360074127026135">Netscape International Step-Up</translation>
 <translation id="8420060421540670057">Afișați fișierele Documente Google</translation>
 <translation id="6075731018162044558">Hopa! Sistemul nu a putut obține un indicativ de acces pe termen lung la API pentru acest dispozitiv.</translation>
-<translation id="1201402288615127009">Înainte</translation>
+<translation id="1201402288615127009">Următorul</translation>
 <translation id="1335588927966684346">Utilitar:</translation>
 <translation id="6182418440401923218">Activează testarea pentru trimiterea feedbackului de la utilizatori către serviciul de ortografiere.</translation>
 <translation id="2710582058364740604">Înlocuiește densitatea afișajului dispozitivului pentru a forța utilizarea modului cu rezoluție ridicată și a elementelor.</translation>
 <translation id="2220529011494928058">Semnalați o problemă</translation>
 <translation id="8475107630436748034">Experiment privind avertismentul legat de TLS/SSL</translation>
 <translation id="7857823885309308051">Poate dura un timp...</translation>
-<translation id="370665806235115550">Se încarcă...</translation>
+<translation id="370665806235115550">Se încarcă</translation>
 <translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS"/> <ph name="SHEETS_LABEL"/></translation>
 <translation id="3810973564298564668">Gestionați</translation>
-<translation id="254416073296957292">Setați &amp;limba...</translation>
-<translation id="6652975592920847366">Creați un suport de recuperare pentru SO</translation>
+<translation id="254416073296957292">Setări de &amp;limbă...</translation>
+<translation id="6652975592920847366">Creați un suport de recuperare pentru sistemul de operare</translation>
 <translation id="3759933321830434300">Blochează părți din paginile web</translation>
 <translation id="52912272896845572">Fișierul cu cheia privată este nevalid.</translation>
 <translation id="3232318083971127729">Valoare:</translation>
 <translation id="8807632654848257479">Stabil</translation>
 <translation id="4209092469652827314">Mare</translation>
 <translation id="8551388862522347954">Licențe</translation>
-<translation id="4222982218026733335">Certificat de server nevalabil</translation>
+<translation id="4222982218026733335">Certificat de server nevalid</translation>
 <translation id="1410616244180625362">Permiteți în continuare accesul <ph name="HOST"/> la camera dvs.</translation>
 <translation id="8494214181322051417">Nou!</translation>
 <translation id="1745087082567737511">Activați elementul de lansare 1</translation>
@@ -1839,9 +1850,9 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="6316671927443834085">Deconectarea de la „<ph name="DEVICE_NAME"/>” a eșuat.</translation>
 <translation id="1962233722219655970">Această pagină utilizează o aplicație Client nativ care nu funcționează pe computerul dvs.</translation>
 <translation id="1108685299869803282">Peste 80% dintre persoanele care văd acest avertisment revin la un site sigur în loc să riște infectarea cu programe malware. Cu toate acestea, dacă înțelegeți riscurile de securitate, puteți să <ph name="BEGIN_LINK"/>accesați acest site nesigur<ph name="END_LINK"/> înainte ca programele periculoase să fie eliminate.</translation>
-<translation id="219008588003277019">Modul client nativ: <ph name="NEXE_NAME"/></translation>
+<translation id="219008588003277019">Modul Client nativ: <ph name="NEXE_NAME"/></translation>
 <translation id="2902382079633781842">Marcaj adăugat!</translation>
-<translation id="5436510242972373446">Căutați în <ph name="SITE_NAME"/>:</translation>
+<translation id="5436510242972373446">Căutați <ph name="SITE_NAME"/>:</translation>
 <translation id="3800764353337460026">Stil simboluri</translation>
 <translation id="1278049586634282054">Inspectați afișările:</translation>
 <translation id="3254434849914415189">Alegeți aplicația prestabilită pentru fișierele <ph name="FILE_TYPE"/>:</translation>
@@ -1893,7 +1904,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="148466539719134488">Elvețiană</translation>
 <translation id="8022523925619404071">Activați actualizarea automată</translation>
 <translation id="6315493146179903667">Toate în față</translation>
-<translation id="1000498691615767391">Selectați un folder pentru a-l deschide</translation>
+<translation id="1000498691615767391">Selectați un dosar pentru a-l deschide</translation>
 <translation id="3831486154586836914">S-a trecut în modul de prezentare a ferestrei</translation>
 <translation id="3593152357631900254">Activați modul Pinyin simplificat</translation>
 <translation id="2462911512468050799">Puteți găsi informații suplimentare la</translation>
@@ -1915,17 +1926,17 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="2148756636027685713">Formatarea a fost finalizată</translation>
 <translation id="5451285724299252438">casetă text interval pagini</translation>
 <translation id="4112917766894695549">Aceste setări sunt impuse de administrator.</translation>
-<translation id="5669267381087807207">Activare</translation>
+<translation id="5669267381087807207">Se activează</translation>
 <translation id="8825366169884721447">Această extensie nu a putut modifica antetul de solicitare „<ph name="HEADER_NAME"/>” al unei solicitări din rețea, deoarece modificarea era în conflict cu o altă extensie (<ph name="EXTENSION_NAME"/>).</translation>
 <translation id="1707463636381878959">Permiteți accesul la această rețea altor utilizatori</translation>
 <translation id="7971930306777004076">Vechea versiune</translation>
 <translation id="2084978867795361905">MS-IME</translation>
 <translation id="7701625482249298476">Activați butonul de căutare în caseta polivalentă</translation>
 <translation id="1818196664359151069">Rezoluție:</translation>
-<translation id="3481915276125965083">Următoarele ferestre de tip pop-up au fost blocate pe această pagină:</translation>
+<translation id="3481915276125965083">Următoarele ferestre pop-up au fost blocate pe această pagină:</translation>
 <translation id="2030481566774242610">Ați dorit să scrieți <ph name="LINK"/>?</translation>
 <translation id="3090871774332213558">„<ph name="DEVICE_NAME"/>” conectată</translation>
-<translation id="7705276765467986571">Modelul marcajului nu a putut fi încărcat.</translation>
+<translation id="7705276765467986571">Nu se poate încărca modelul de marcaj.</translation>
 <translation id="750413812607578381">Trebuie să reporniți <ph name="PRODUCT_NAME"/> acum.</translation>
 <translation id="2638286699381354126">Actualizați...</translation>
 <translation id="1196338895211115272">Exportul cheii private nu a reușit.</translation>
@@ -1939,14 +1950,14 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="7238196028794870999">Continuați permiterea pluginurilor scoase din mediul de testare</translation>
 <translation id="7252661675567922360">Nu încărcați</translation>
 <translation id="1983959805486816857">După ce creați un utilizator monitorizat, puteți gestiona setările oricând și de pe orice dispozitiv, de la <ph name="MANAGEMENT_URL"/>.</translation>
-<translation id="2815382244540487333">Următoarele module cookie au fost blocate:</translation>
+<translation id="2815382244540487333">Următoarele cookie-uri au fost blocate:</translation>
 <translation id="1084538181352409184">Verificați setările de proxy sau contactați administratorul de rețea
           pentru a vă asigura că serverul proxy funcționează.
           <ph name="PLATFORM_TEXT"/></translation>
 <translation id="374530189620960299">Certificatul de securitate al site-ului nu este de încredere!</translation>
 <translation id="4924638091161556692">Remediată</translation>
 <translation id="8893928184421379330">Ne pare rău, dispozitivul <ph name="DEVICE_LABEL"/> nu a putut fi recunoscut.</translation>
-<translation id="5647283451836752568">Rulați toate pluginurile de această dată</translation>
+<translation id="5647283451836752568">Rulați toate pluginurile de data aceasta</translation>
 <translation id="5972017421290582825">Gestionați setările MIDI...</translation>
 <translation id="8642947597466641025">Măriți textul</translation>
 <translation id="2633212996805280240">Eliminați „<ph name="EXTENSION_NAME"/>”?</translation>
@@ -1965,7 +1976,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="8852742364582744935">Au fost adăugate următoarele aplicații și extensii:</translation>
 <translation id="2916073183900451334">Apăsarea tastei Tab când vă aflați pe o pagină evidențiază linkurile și câmpurile formularelor</translation>
 <translation id="7772127298218883077">Despre <ph name="PRODUCT_NAME"/></translation>
-<translation id="2090876986345970080">Setare securitate sistem</translation>
+<translation id="2090876986345970080">Setare de securitate a sistemului</translation>
 <translation id="3728067901555601989">OTP:</translation>
 <translation id="3475447146579922140">Foaie de calcul Google</translation>
 <translation id="6856526171412069413">Activați redimensionarea prin ciupire.</translation>
@@ -1974,23 +1985,23 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="6655458902729017087">Ascundeți conturile</translation>
 <translation id="5545687460454274870">Dezactivează funcția de descoperire a dispozitivelor în rețeaua locală.</translation>
 <translation id="6975147921678461939">Încărcarea bateriei: <ph name="PRECENTAGE"/> %</translation>
-<translation id="5453632173748266363">Chirilică</translation>
+<translation id="5453632173748266363">Chirilic</translation>
 <translation id="2482202334236329090">În această pagină, a fost inserat conținut de la <ph name="ELEMENTS_HOST_NAME"/>, un distribuitor cunoscut de programe malware. Dacă accesați acum pagina, este foarte probabil să vă infectați computerul cu programe malware.</translation>
 <translation id="1008557486741366299">Nu acum</translation>
 <translation id="7726501603143023652">Dezactivează opțiunea Ignoră autocomplete='off' pentru formularele cu parole în managerul de parole.</translation>
 <translation id="6437213622978068772">Reîncărcați (Ctrl + R)</translation>
 <translation id="5350480486488078311">API pentru socketuri NaCl.</translation>
 <translation id="8551406349318936106">Hopa! Se pare că a apărut o problemă cu datele de conectare. Asigurați-vă că ați introdus corect datele și încercați din nou.</translation>
-<translation id="5329858601952122676">Ș&amp;tergeți</translation>
+<translation id="5329858601952122676">&amp;Ștergeți</translation>
 <translation id="6100736666660498114">Meniul Start</translation>
 <translation id="6370021412472292592">Manifestul nu a putut fi încărcat.</translation>
 <translation id="3994878504415702912">&amp;Zoom</translation>
 <translation id="9009369504041480176">Se încarcă (<ph name="PROGRESS_PERCENT"/>%)...</translation>
 <translation id="5486561344817861625">Simulați repornirea browserului</translation>
 <translation id="2367972762794486313">Afișați aplicații</translation>
-<translation id="5602600725402519729">&amp;Reîncărcați</translation>
-<translation id="6955446738988643816">Fereastră de tip pop-up de inspectare</translation>
-<translation id="172612876728038702">TPM este în curs de configurare. Vă rugăm să aveți răbdare, procesul poate dura câteva minute.</translation>
+<translation id="5602600725402519729">Re&amp;încărcați</translation>
+<translation id="6955446738988643816">Fereastră pop-up de inspectare</translation>
+<translation id="172612876728038702">TPM se configurează. Aveți răbdare; acest lucru poate dura câteva minute.</translation>
 <translation id="6748140994595080445">Schimbați modul în care <ph name="APP_NAME"/> gestionează și afișează limbile.</translation>
 <translation id="2836635946302913370">Conectarea cu acest nume de utilizator a fost dezactivată de către administratorul dvs.</translation>
 <translation id="3512307528596687562">Pagina web de la <ph name="URL"/> a avut
@@ -2007,9 +2018,9 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="3012890944909934180">Relansați Chrome pe desktop</translation>
 <translation id="7053983685419859001">Blocați</translation>
 <translation id="7912024687060120840">În dosarul:</translation>
-<translation id="2485056306054380289">Certificat AC server:</translation>
+<translation id="2485056306054380289">Certificat CA server:</translation>
 <translation id="5631861698741076898">Hopa, nu v-am putut conecta. Conectarea a eșuat, deoarece a fost configurată pentru a folosi o adresă URL nesecurizată (<ph name="BLOCKED_URL"/>).</translation>
-<translation id="2727712005121231835">Dimensiunea reală</translation>
+<translation id="2727712005121231835">Dimensiunea actuală</translation>
 <translation id="1377600615067678409">Ignorați deocamdată</translation>
 <translation id="5581211282705227543">Nu există pluginuri instalate</translation>
 <translation id="3330206034087160972">Ieșiți din modul de prezentare</translation>
@@ -2017,15 +2028,15 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
           prea multe redirecționări. Problema ar putea fi remediată prin ștergerea cookie-urilor pentru acest site sau prin acceptarea cookie-urilor terță parte.
           În caz contrar, vă puteți confrunta cu o problemă de server, nu cu o problemă
           privind computerul dvs.</translation>
-<translation id="5488468185303821006">Permiteți în modul incognito</translation>
+<translation id="5488468185303821006">Permiteți în incognito</translation>
 <translation id="1546703252838446285">În contul dvs. <ph name="ACCOUNT_EMAIL"/>, poate:</translation>
-<translation id="6556866813142980365">Refaceți</translation>
+<translation id="6556866813142980365">Repetați</translation>
 <translation id="8824701697284169214">Adăugați pa&amp;gina...</translation>
 <translation id="7063129466199351735">Se procesează comenzile rapide...</translation>
 <translation id="6466988389784393586">&amp;Deschideți toate marcajele</translation>
 <translation id="9193357432624119544">Cod de eroare: <ph name="ERROR_NAME"/></translation>
 <translation id="5288678174502918605">R&amp;edeschideți fila închisă</translation>
-<translation id="7238461040709361198">Parola Contului dvs. Google s-a schimbat de la ultima conectare de pe acest computer.</translation>
+<translation id="7238461040709361198">Parola contului dvs. Google s-a modificat de la ultima conectare pe acest computer.</translation>
 <translation id="1956050014111002555">Fișierul conținea certificate multiple și niciunul dintre acestea nu a fost importat:</translation>
 <translation id="302620147503052030">Afișați butonul</translation>
 <translation id="1895658205118569222">Închideți</translation>
@@ -2043,17 +2054,17 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="4147376274874979956">Fișierul nu poate fi accesat.</translation>
 <translation id="1507246803636407672">&amp;Renunțați</translation>
 <translation id="2320435940785160168">Serverul necesită un certificat pentru autentificare și nu l-a acceptat pe cel trimis de
-        browser. Este posibil ca certificatul dvs. să fi expirat sau este posibil ca emitentul să nu fie configurat drept unul de încredere pe server.
-        Puteți încerca din nou cu un alt certificat, dacă aveți unul, sau poate fi necesar să
+        browser. Este posibil ca certificatul dvs. să fi expirat sau este posibil ca serverul să nu aibă încredere în emitentul certificatului.
+        Puteți încerca din nou cu alt certificat, dacă aveți unul, sau poate fi necesar să
         obțineți un certificat valid din altă parte.</translation>
-<translation id="6295228342562451544">Când vă conectați la un site Web sigur, serverul care găzduiește acel site prezintă browser-ului dvs. un „certificat” pentru a-i confirma identitatea. Acest certificat conține informații despre identitate, cum ar fi adresa site-ului Web, care sunt verificate de o terță parte de încredere pentru computerul dvs. Verificând dacă adresa din certificat se potrivește cu adresa site-ului Web, puteți confirma comunicarea dvs. cu site-ul pe care ați intenționat să-l accesați și nu cu o terță parte (cum ar fi un atacator din rețeaua dvs.).</translation>
-<translation id="6342069812937806050">Tocmai s-a finalizat</translation>
+<translation id="6295228342562451544">Când vă conectați la un site sigur, serverul care găzduiește acel site prezintă browserului dvs. un „certificat” pentru a-i confirma identitatea. Acest certificat conține informații despre identitate, cum ar fi adresa site-ului, care sunt verificate de o terță parte de încredere pentru computerul dvs. Verificând dacă adresa din certificat se potrivește cu adresa site-ului, puteți confirma comunicarea dvs. cu site-ul pe care ați intenționat să-l accesați și nu cu o terță parte (cum ar fi un atacator din rețeaua dvs.).</translation>
+<translation id="6342069812937806050">Adineauri</translation>
 <translation id="544083962418256601">Creați comenzi rapide...</translation>
 <translation id="6143186082490678276">Primiți ajutor</translation>
 <translation id="8457625695411745683">bună</translation>
 <translation id="8335587457941836791">Anulați fixarea din raft</translation>
 <translation id="2222641695352322289">Singura modalitate de anulare este să reinstalați <ph name="IDS_SHORT_PRODUCT_OS_NAME"/>.</translation>
-<translation id="5605716740717446121">Cartela SIM va fi dezactivată definitiv dacă nu veți putea introduce cheia corectă de deblocare a codului PIN. Încercări rămase: <ph name="TRIES_COUNT"/></translation>
+<translation id="5605716740717446121">Cardul SIM va fi dezactivat definitiv dacă nu veți introduce cheia corectă de deblocare a codului PIN. Încercări rămase: <ph name="TRIES_COUNT"/></translation>
 <translation id="5502500733115278303">Importate din Firefox</translation>
 <translation id="569109051430110155">Detectare automată</translation>
 <translation id="4408599188496843485">&amp;Ajutor</translation>
@@ -2070,21 +2081,24 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="7816949580378764503">Identitatea a fost verificată</translation>
 <translation id="1521442365706402292">Gestionați certificatele</translation>
 <translation id="1679068421605151609">Instrumente pentru dezvoltatori</translation>
-<translation id="7014051144917845222">Încercarea <ph name="PRODUCT_NAME"/> de conectare la <ph name="HOST_NAME"/> a fost respinsă. Este posibil ca site-ul să nu funcționeze sau rețeaua dvs. să nu fie configurată corect.</translation>
+<translation id="7014051144917845222">Încercarea <ph name="PRODUCT_NAME"/>
+        de conectare la
+        <ph name="HOST_NAME"/> a fost respinsă. Este posibil ca site-ul să nu
+        funcționeze sau rețeaua dvs. să nu fie configurată corect.</translation>
 <translation id="2097372108957554726">Pentru a înregistra dispozitive noi, este necesar să vă conectați la Chrome</translation>
 <translation id="4332213577120623185">Pentru finalizarea acestei achiziții sunt necesare mai multe informații.</translation>
 <translation id="9201305942933582053">Google Now pentru Chrome!</translation>
 <translation id="1708338024780164500">(Inactivă)</translation>
 <translation id="6896758677409633944">Copiați</translation>
 <translation id="8986362086234534611">Ștergeți</translation>
-<translation id="5260508466980570042">Ne pare rău, adresa dvs. de e-mail sau parola nu au putut fi verificate. Încercați din nou.</translation>
-<translation id="7887998671651498201">Următorul plug-in este inactiv: <ph name="PLUGIN_NAME"/>Doriți să îl opriți?</translation>
-<translation id="4212108296677106246">Doriți să acordați încredere pentru „<ph name="CERTIFICATE_NAME"/>” ca Autoritate de certificare?</translation>
+<translation id="5260508466980570042">Ne pare rău, adresa de e-mail sau parola nu au putut fi verificate. Încercați din nou.</translation>
+<translation id="7887998671651498201">Următorul plugin este inactiv: <ph name="PLUGIN_NAME"/>Doriți să îl opriți?</translation>
+<translation id="4212108296677106246">Aveți încredere în „<ph name="CERTIFICATE_NAME"/>” ca autoritate de certificare?</translation>
 <translation id="4320833726226688924">În acest caz, certificatul de server sau un certificat CA intermediar furnizat browserului dvs. este semnat utilizând un algoritm de semnare slab, cum ar fi RSA-MD2. Studiile recente ale cercetătorilor din domeniul IT au demonstrat că algoritmul de semnare este mai slab decât se estimase anterior, iar algoritmul de semnare este utilizat rar în prezent de site-urile web de încredere. Acest certificat poate fi falsificat.</translation>
 <translation id="2861941300086904918">Manager de securitate Client nativ</translation>
 <translation id="5650203097176527467">Se încarcă detaliile plății</translation>
 <translation id="5581700288664681403">Se încarcă <ph name="CLOUD_PRINT_NAME"/></translation>
-<translation id="6991443949605114807">&lt;p&gt;Când rulați <ph name="PRODUCT_NAME"/> într-un mediu de desktop acceptat, vor fi utilizate setările proxy ale sistemului. Cu toate acestea, fie sistemul dvs. nu este acceptat, fie a existat o problemă la lansarea configurației sistemului dvs.&lt;/p&gt;
+<translation id="6991443949605114807">.&lt;p&gt;Când rulați <ph name="PRODUCT_NAME"/> într-un mediu de desktop acceptat, vor fi utilizate setările de proxy ale sistemului. Cu toate acestea, fie sistemul dvs. nu este acceptat, fie a existat o problemă la lansarea configurației sistemului dvs.&lt;/p&gt;
 
         &lt;p&gt;Puteți totuși să configurați prin linia de comandă. Accesați &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME"/>&lt;/code&gt; pentru mai multe informații despre semnalizatori și variabile de mediu.&lt;/p&gt;</translation>
 <translation id="389589731200570180">Permiteți accesul invitaților</translation>
@@ -2095,7 +2109,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="1223853788495130632">Administratorul dvs. recomandă o valoare specifică pentru această setare.</translation>
 <translation id="313407085116013672">Deoarece <ph name="IDS_SHORT_PRODUCT_OS_NAME"/> criptează în siguranță toate datele dvs. locale, este necesar să introduceți acum vechea parolă pentru a debloca respectivele date.</translation>
 <translation id="3551320343578183772">Închideți fila</translation>
-<translation id="3345886924813989455">Nu s-a găsit niciun browser acceptat</translation>
+<translation id="3345886924813989455">Nu a fost găsit niciun browser acceptat</translation>
 <translation id="3712897371525859903">Salvați pagina c&amp;a...</translation>
 <translation id="4572659312570518089">Autentificarea a fost anulată în timpul conectării la „<ph name="DEVICE_NAME"/>”.</translation>
 <translation id="4925542575807923399">Administratorul acestui cont solicită ca acest cont să fie primul conectat într-o sesiune de conectare multiplă.</translation>
@@ -2103,7 +2117,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="1406500794671479665">Se verifică...</translation>
 <translation id="2726841397172503890">Permite compatibilitatea cu Selectarea prin glisare pentru tastatura virtuală. Această opțiune nu va avea efect decât dacă tastatura virtuală este activată.</translation>
 <translation id="6199801702437275229">Se așteaptă informațiile despre spațiu...</translation>
-<translation id="2767649238005085901">Apăsați pe Enter pentru a înainta, pe tasta pentru meniu contextual pentru a afișa istoricul</translation>
+<translation id="2767649238005085901">Apăsați pe Enter pentru a naviga înainte, pe tasta pentru meniul contextual pentru a afișa istoricul</translation>
 <translation id="8580634710208701824">Reîncărcați cadrul</translation>
 <translation id="7606992457248886637">Autorități</translation>
 <translation id="4197674956721858839">Arhivați fișierele selectate</translation>
@@ -2112,9 +2126,9 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="2007404777272201486">Raportați o problemă...</translation>
 <translation id="4366509400410520531">Permis de dvs.</translation>
 <translation id="2218947405056773815">Hopa! <ph name="API_NAME"/> are o mică problemă.</translation>
-<translation id="1783075131180517613">Actualizați expresia dvs. de acces. pentru sincronizare.</translation>
+<translation id="1783075131180517613">Actualizați expresia de acces pentru sincronizare.</translation>
 <translation id="1601560923496285236">Aplicați</translation>
-<translation id="2390045462562521613">Nu doresc să se memoreze această rețea</translation>
+<translation id="2390045462562521613">Ștergeți această rețea</translation>
 <translation id="1450927657625573300">Dezactivează o optimizare al cărei scop este să îmbunătățească răspunsul la derularea prin atingere. Forțează evenimentele tactile să acceseze firul principal din Blink pentru a căuta handlere, în loc să facă potențial trecerea direct de la firul instrumentului de compunere.</translation>
 <translation id="3348038390189153836">S-a detectat un dispozitiv amovibil</translation>
 <translation id="1663298465081438178">Avantaje, fără probleme.</translation>
@@ -2138,9 +2152,9 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="4833609837088121721">Activați experimentele cu Instrumentele pentru dezvoltatori.</translation>
 <translation id="7516762545367001961">Site-urile web de phishing sunt concepute pentru a vă păcăli să dezvăluiți datele de conectare, parola sau alte informații sensibile, deghizându-se ca alte site-uri în care ați putea avea încredere.</translation>
 <translation id="7469894403370665791">Conectați-vă automat la această rețea</translation>
-<translation id="4807098396393229769">Numele de pe cartea de credit</translation>
+<translation id="4807098396393229769">Numele de pe card</translation>
 <translation id="4131410914670010031">Alb-negru</translation>
-<translation id="3800503346337426623">Săriți peste conectare și răsfoiți în calitate de invitat</translation>
+<translation id="3800503346337426623">Omiteți conectarea și navigați ca invitat</translation>
 <translation id="2615413226240911668">Totuși, această pagină include alte resurse care nu sunt securizate. Aceste resurse sunt vizibile pentru alți utilizatori în cursul transferului și pot fi modificate de un atacator pentru a schimba aspectul paginii.</translation>
 <translation id="1416136326154112077">Istoricul de navigare și setările acestui utilizator monitorizat pot fi în continuare vizibile pentru administrator la <ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/>.</translation>
 <translation id="197288927597451399">Păstrați</translation>
@@ -2148,7 +2162,7 @@ După ce creați un utilizator monitorizat, puteți gestiona setările oricând
 <translation id="5495466433285976480">Această acțiune va elimina utilizatorii, fișierele, datele și alte setări locale după următoarea repornire. Va fi necesar ca toți utilizatorii să se conecteze din nou.</translation>
 <translation id="7842346819602959665">Cea mai recentă versiune a extensiei „<ph name="EXTENSION_NAME"/>” necesită permisiuni suplimentare, astfel că a fost dezactivată.</translation>
 <translation id="3776667127601582921">În acest caz, certificatul serverului sau un certificat intermediar CA prezentat browserului dvs. este nevalid. Acest lucru poate însemna că certificatul este deteriorat, conține câmpuri nevalide sau nu este acceptat.</translation>
-<translation id="2412835451908901523">Introduceți cheia de deblocare a codului PIN, formată din 8 cifre, furnizată de <ph name="CARRIER_ID"/>.</translation>
+<translation id="2412835451908901523">Introduceți cheia de deblocare a codului PIN, formată din 8 cifre, oferită de <ph name="CARRIER_ID"/>.</translation>
 <translation id="25770266525034120">Adresa URL a extensiei</translation>
 <translation id="7548916768233393626">Forțați utilizarea modului cu rezoluție ridicată</translation>
 <translation id="33562952999632466">DevTools solicită acces complet la <ph name="FOLDER_PATH"/>.
@@ -2168,7 +2182,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2282872951544483773">Experimente indisponibile</translation>
 <translation id="2562685439590298522">Documente</translation>
 <translation id="8673383193459449849">Problemă de server</translation>
-<translation id="4060383410180771901">Site-ul web nu poate gestiona solicitarea pentru <ph name="URL"/>.</translation>
+<translation id="4060383410180771901">Site-ul nu poate gestiona solicitarea pentru <ph name="URL"/>.</translation>
 <translation id="6710213216561001401">Înapoi</translation>
 <translation id="1108600514891325577">&amp;Opriți</translation>
 <translation id="9032819711736828884">Algoritm semnătură</translation>
@@ -2184,12 +2198,12 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4810984886082414856">Memorie cache simplă pentru HTTP.</translation>
 <translation id="1548132948283577726">Site-urile care nu salvează niciodată parole vor apărea aici.</translation>
 <translation id="583281660410589416">Necunoscut</translation>
-<translation id="3774278775728862009">Metoda de introducere pentru thai (tastatură TIS-820.2538)</translation>
+<translation id="3774278775728862009">Metoda de introducere a textului în thai (tastatură TIS-820.2538)</translation>
 <translation id="9115675100829699941">&amp;Marcaje</translation>
 <translation id="2485422356828889247">Dezinstalați</translation>
 <translation id="1731589410171062430">Total: <ph name="NUMBER_OF_SHEETS"/> <ph name="SHEETS_LABEL"/> (<ph name="NUMBER_OF_PAGES"/> <ph name="PAGE_OR_PAGES_LABEL"/>)</translation>
 <translation id="7461924472993315131">Fixați</translation>
-<translation id="7279701417129455881">Gestionați blocarea modulelor cookie...</translation>
+<translation id="7279701417129455881">Gestionați blocarea cookie-urilor...</translation>
 <translation id="665061930738760572">Deschideți într-o &amp;fereastră nouă</translation>
 <translation id="4876895919560854374">Blochează și deblochează ecranul</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -2197,7 +2211,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5528368756083817449">Manager de marcaje</translation>
 <translation id="8345300166402955056">Reduceți consumarea datelor încărcând pagini web optimizate prin intermediul serverelor proxy Google.</translation>
 <translation id="2826760142808435982">Conexiunea este criptată și autentificată utilizând <ph name="CIPHER"/> și folosește <ph name="KX"/> ca mecanism de schimb al cheii.</translation>
-<translation id="215753907730220065">Ieșiți din ecran complet</translation>
+<translation id="215753907730220065">Ieșiți din ecranul complet</translation>
 <translation id="7849264908733290972">Deschideți &amp;imaginea într-o filă nouă</translation>
 <translation id="1560991001553749272">Marcajul a fost adăugat!</translation>
 <translation id="3966072572894326936">Alegeți alt dosar...</translation>
@@ -2208,8 +2222,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7786207843293321886">Ieșiți din sesiunea pentru invitați</translation>
 <translation id="3359256513598016054">Limitări ale politicii pentru certificate</translation>
 <translation id="4433914671537236274">Creați un suport de recuperare</translation>
-<translation id="4509345063551561634">Locația:</translation>
-<translation id="7434509671034404296">Programator</translation>
+<translation id="4509345063551561634">Locație:</translation>
+<translation id="7434509671034404296">Dezvoltator</translation>
 <translation id="3830343776986833103">Afișați centrul pentru mesaje</translation>
 <translation id="7668654391829183341">Dispozitiv necunoscut</translation>
 <translation id="1790550373387225389">Intrați în modul de prezentare</translation>
@@ -2232,8 +2246,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6597017209724497268">Eșantioane</translation>
 <translation id="8183644773978894558">O descărcare incognito este în desfășurare. Doriți să ieșiți din modul incognito și să anulați descărcarea?</translation>
 <translation id="8767072502252310690">Utilizatori</translation>
-<translation id="683526731807555621">Motor de căutare nou
-</translation>
+<translation id="683526731807555621">Adăugați un motor de căutare nou</translation>
 <translation id="6871644448911473373">Respondent OCSP: <ph name="LOCATION"/></translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT"/> (de) dosare selectate</translation>
 <translation id="8281886186245836920">Omiteți</translation>
@@ -2242,7 +2255,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7629827748548208700">Fila: <ph name="TAB_NAME"/></translation>
 <translation id="3456874833152462816">Rularea unui plugin scos din mediul de testare a fost blocată pe această pagină.</translation>
 <translation id="4233778200880751280">Pagina informativă „<ph name="ABOUT_PAGE"/>” nu s-a putut încărca.</translation>
-<translation id="388442998277590542">Pagina cu opțiuni „<ph name="OPTIONS_PAGE"/>” nu a putut fi încărcată.</translation>
+<translation id="388442998277590542">Nu se poate încărca pagina cu opțiuni „<ph name="OPTIONS_PAGE"/>”.</translation>
 <translation id="8449008133205184768">Inserați și potriviți stilul</translation>
 <translation id="5258266922137542658">PPAPI (în proces)</translation>
 <translation id="5127881134400491887">Gestionează conexiunile de rețea</translation>
@@ -2252,14 +2265,14 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4710257996998566163">Ultima actualizare:</translation>
 <translation id="5299682071747318445">Toate datele sunt criptate cu parola dvs. de acces pentru sincronizare</translation>
 <translation id="7556242789364317684">Din păcate, <ph name="SHORT_PRODUCT_NAME"/> nu vă poate recupera setările. Pentru a remedia eroarea, este necesar ca <ph name="SHORT_PRODUCT_NAME"/> să reseteze dispozitivul utilizând Powerwash.</translation>
-<translation id="1383876407941801731">Căutare</translation>
+<translation id="1383876407941801731">Căutați</translation>
 <translation id="23362385947277794">Culori și imagini de fundal</translation>
 <translation id="409579654357498729">Adăugați la Cloud Print</translation>
 <translation id="2120316813730635488">Numărul de instalări ale unei extensii</translation>
-<translation id="8398877366907290961">Accesați oricum</translation>
-<translation id="5063180925553000800">Noul cod PIN:</translation>
+<translation id="8398877366907290961">Continuați oricum</translation>
+<translation id="5063180925553000800">Cod PIN nou:</translation>
 <translation id="4883178195103750615">Exportați marcajele într-un fișier HTML...</translation>
-<translation id="2496540304887968742">Dispozitivul trebuie să aibă o capacitate de cel puțin 4 GO.</translation>
+<translation id="2496540304887968742">Dispozitivul trebuie să aibă o capacitate de cel puțin 4 GB.</translation>
 <translation id="6974053822202609517">De la dreapta la stânga</translation>
 <translation id="3752673729237782832">Dispozitivele mele</translation>
 <translation id="1552752544932680961">Gestionați extensia</translation>
@@ -2268,7 +2281,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5463856536939868464">Meniu conținând marcajele ascunse</translation>
 <translation id="8286227656784970313">Utilizați dicționarul sistemului</translation>
 <translation id="1493263392339817010">Personalizați fonturile...</translation>
-<translation id="5352033265844765294">Scriere marcaj de timp</translation>
+<translation id="5352033265844765294">Marcare temporală</translation>
 <translation id="1493892686965953381">Se așteaptă <ph name="LOAD_STATE_PARAMETER"/>...</translation>
 <translation id="3901991538546252627">Se conectează la <ph name="NAME"/></translation>
 <translation id="4744335556946062993">Activați promoțiile de înregistrare în previzualizarea printării</translation>
@@ -2283,11 +2296,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7939997691108949385">Managerul va putea să configureze restricții și setări pentru acest utilizator monitorizat la <ph name="MANAGEMENT_URL"/>.</translation>
 <translation id="2322193970951063277">Anteturi și subsoluri</translation>
 <translation id="6436164536244065364">Vizualizați în Magazinul web Chrome</translation>
-<translation id="9137013805542155359">Afișați originalul</translation>
+<translation id="9137013805542155359">Afișați varianta originală</translation>
 <translation id="6423731501149634044">Utilizați Adobe Reader ca vizualizator prestabilit pentru fișierele PDF?</translation>
 <translation id="1965328510789761112">Memorie privată</translation>
 <translation id="7312441861087971374">Pluginul <ph name="PLUGIN_NAME"/> este învechit.</translation>
-<translation id="5790085346892983794">Succes</translation>
+<translation id="5790085346892983794">Ați reușit</translation>
 <translation id="7639178625568735185">Am înțeles!</translation>
 <translation id="1901769927849168791">A fost detectat un card SD</translation>
 <translation id="818454486170715660"><ph name="NAME"/> – Proprietar</translation>
@@ -2300,7 +2313,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6231782223312638214">Sugestii</translation>
 <translation id="8302838426652833913">Accesați
           <ph name="BEGIN_BOLD"/>
-          Applications (Aplicații) &gt; System Preferences (Preferințe de sistem) &gt; Network (Rețea) &gt; Assist me (Doresc asistență)
+          Aplicații &gt; Preferințe de sistem &gt; Rețea &gt; Doresc asistență
           <ph name="END_BOLD"/>
           pentru a testa conexiunea.</translation>
 <translation id="8664389313780386848">&amp;Vedeți sursa paginii</translation>
@@ -2315,7 +2328,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8264718194193514834">„<ph name="EXTENSION_NAME"/>” a activat modul Ecran complet.</translation>
 <translation id="6223447490656896591">Imagine personalizată:</translation>
 <translation id="6362853299801475928">&amp;Raportați o problemă...</translation>
-<translation id="5527463195266282916">S-a încercat trecerea extensiei la o versiune inferioară.</translation>
+<translation id="5527463195266282916">S-a încercat downgrade-ul extensiei.</translation>
 <translation id="3289566588497100676">Introducere ușoară a simbolurilor</translation>
 <translation id="6507969014813375884">Chineză simplificată</translation>
 <translation id="7341982465543599097">extrem de scurtă</translation>
@@ -2327,14 +2340,14 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="542872847390508405">Navigați ca invitat</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN"/> este acum în modul ecran complet și dorește să dezactiveze cursorul mouse-ului dvs.</translation>
 <translation id="1497522201463361063">Nu s-a putut redenumi „<ph name="FILE_NAME"/>”. <ph name="ERROR_MESSAGE"/></translation>
-<translation id="8226742006292257240">Mai jos se află parola TPM generată în mod aleatoriu care a fost asociată computerului dvs.</translation>
+<translation id="8226742006292257240">Mai jos se află parola TPM generată aleatoriu, care a fost atribuită computerului dvs.:</translation>
 <translation id="5010043101506446253">Autoritate de certificare</translation>
 <translation id="5452005759330179535">Notifică-mă dacă un site vrea să afișeze notificări pe desktop (recomandat)</translation>
 <translation id="5287425679749926365">Conturile dvs.</translation>
 <translation id="4249373718504745892">Accesul acestei pagini la camera și microfonul dvs. a fost blocat.</translation>
 <translation id="8487693399751278191">Importați acum marcajele...</translation>
 <translation id="7615602087246926389">Aveți deja date criptate utilizând o versiune diferită a parolei pentru Contul dvs. Google. Introduceți-o mai jos.</translation>
-<translation id="7484580869648358686">Avertisment: ceva nu este în regulă aici!</translation>
+<translation id="7484580869648358686">Avertisment: ceva nu este bine aici!</translation>
 <translation id="8300259894948942413">Tragerea și plasarea prin atingere poate fi inițiată prin apăsarea lungă a unui element care poate fi tras.</translation>
 <translation id="1240892293903523606">Inspector DOM</translation>
 <translation id="5249624017678798539">Browserul s-a blocat înainte de finalizarea descărcării.</translation>
@@ -2344,15 +2357,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5197680270886368025">Sincronizarea este finalizată.</translation>
 <translation id="7551643184018910560">Fixați în raft</translation>
 <translation id="5521348028713515143">Adăugați o comandă rapidă pe desktop</translation>
-<translation id="5646376287012673985">Locația</translation>
+<translation id="5646376287012673985">Locație</translation>
 <translation id="3337069537196930048">Pluginul <ph name="PLUGIN_NAME"/> a fost blocat deoarece este învechit.</translation>
-<translation id="539755880180803351">Adnotează formularele web cu predicțiile de introducere din câmpul Completare automată ca text substituent.</translation>
+<translation id="539755880180803351">Adnotează formularele web cu predicțiile de introducere din câmpul de completare automată ca text substituent.</translation>
 <translation id="3450157232394774192">Procentaj de ocupare în starea inactivă</translation>
 <translation id="1110155001042129815">Așteptați</translation>
 <translation id="2607101320794533334">Informații privind cheia publică a subiectului</translation>
-<translation id="7071586181848220801">Plug-in necunoscut</translation>
+<translation id="7071586181848220801">Plugin necunoscut</translation>
 <translation id="89720367119469899">Tasta Esc</translation>
-<translation id="4419409365248380979">Permiteți întotdeauna <ph name="HOST"/> să seteze module cookie</translation>
+<translation id="4419409365248380979">Permiteți întotdeauna <ph name="HOST"/> să seteze cookie-uri</translation>
 <translation id="813582937903338561">Ultima zi</translation>
 <translation id="5337771866151525739">Instalată de o terță parte.</translation>
 <translation id="7563991800558061108">Pentru recuperarea după această eroare, trebuie să vă conectați la Contul Google
@@ -2375,41 +2388,41 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5238369540257804368">Domenii</translation>
 <translation id="9040421302519041149">Accesul la această rețea este protejat.</translation>
 <translation id="3786301125658655746">Sunteți offline</translation>
-<translation id="5659593005791499971">E-mail</translation>
+<translation id="5659593005791499971">Adresă de e-mail</translation>
 <translation id="6584878029876017575">Semnare Microsoft pe durata de viață</translation>
 <translation id="562901740552630300">Accesați
           <ph name="BEGIN_BOLD"/>
-          Start &gt; Control Panel (Panou de control) &gt; Network and Internet (Rețea și Internet) &gt; Network and Sharing Center (Centru rețea și partajare) &gt; Troubleshoot Problems (Depanare probleme) (în partea de jos) &gt; Internet Connections (Conexiuni Internet).
+          Start &gt; Panou de control &gt; Rețea și Internet &gt; Centru rețea și partajare &gt; Depanare probleme (în partea de jos) &gt; Conexiuni Internet.
           <ph name="END_BOLD"/></translation>
 <translation id="6602090339694176254">Activează serviciul de sugestii experimental din Chrome.</translation>
 <translation id="2143915448548023856">Setări de afișare</translation>
 <translation id="724691107663265825">Site-ul pe care urmează să îl accesați conține programe malware</translation>
 <translation id="1084824384139382525">Copiați adresa linkului</translation>
 <translation id="2803306138276472711">Navigarea sigură Google <ph name="BEGIN_LINK"/>a detectat recent programe malware<ph name="END_LINK"/> pe <ph name="SITE"/>. Site-urile care sunt de obicei sigure sunt uneori infectate cu programe malware.</translation>
-<translation id="1221462285898798023">Porniți <ph name="PRODUCT_NAME"/> ca utilizator normal. Pentru a rula ca root, trebuie să specificați un alt director-date-utilizator pentru stocarea informațiilor de profil.</translation>
-<translation id="3220586366024592812">Procesul conectorului <ph name="CLOUD_PRINT_NAME"/> s-a oprit cu eroare. Reporniți?</translation>
+<translation id="1221462285898798023">Porniți <ph name="PRODUCT_NAME"/> ca utilizator normal. Pentru a rula cu privilegii de utilizator root, trebuie să specificați alt director --user-data-dir pentru stocarea informațiilor de profil.</translation>
+<translation id="3220586366024592812">Procesul conectorului <ph name="CLOUD_PRINT_NAME"/> s-a blocat. Reporniți?</translation>
 <translation id="2379281330731083556">Printați utilizând caseta de dialog a sistemului... <ph name="SHORTCUT_KEY"/></translation>
 <translation id="918765022965757994">Conectați-vă la acest site ca: <ph name="EMAIL_ADDRESS"/></translation>
 <translation id="8216278935161109887">Deconectați-vă, apoi conectați-vă din nou</translation>
-<translation id="6254503684448816922">Compromis cheie</translation>
+<translation id="6254503684448816922">Compromitere cheie</translation>
 <translation id="6555432686520421228">Eliminați toate conturile de utilizator și resetați gadgetul <ph name="IDS_SHORT_PRODUCT_NAME"/> la valorile din fabrică.</translation>
 <translation id="1346748346194534595">Dreapta</translation>
 <translation id="7756363132985736290">Certificatul există deja.</translation>
-<translation id="1181037720776840403">Eliminaţi</translation>
+<translation id="1181037720776840403">Eliminați</translation>
 <translation id="5261073535210137151">Acest dosar conține <ph name="COUNT"/> (de) marcaje. Sigur doriți să-l ștergeți?</translation>
-<translation id="59174027418879706">Activată</translation>
+<translation id="59174027418879706">Activat</translation>
 <translation id="4194415033234465088">Dachen 26</translation>
 <translation id="8800004011501252845">Se afişează destinaţii pentru</translation>
 <translation id="3554751249011484566"><ph name="SITE"/> va avea acces la următoarele detalii</translation>
 <translation id="872537912056138402">Croată</translation>
 <translation id="6639554308659482635">Memorie SQLite</translation>
-<translation id="7231224339346098802">Utilizați un număr pentru a preciza în câte exemplare să se efectueze printarea (1 sau mai multe).</translation>
+<translation id="7231224339346098802">Precizați un număr de exemplare pentru printare (1 sau mai multe).</translation>
 <translation id="7650701856438921772"><ph name="PRODUCT_NAME"/> este afișat în această limbă</translation>
-<translation id="740624631517654988">Fereastră de tip pop-up blocată</translation>
+<translation id="740624631517654988">Fereastră pop-up blocată</translation>
 <translation id="3738924763801731196"><ph name="OID"/>:</translation>
 <translation id="533433379391851622">Versiunea așteptată era „<ph name="EXPECTED_VERSION"/>”, dar versiunea a fost „<ph name="NEW_ID"/>”.</translation>
 <translation id="8870318296973696995">Pagina de pornire</translation>
-<translation id="6659594942844771486">Tab</translation>
+<translation id="6659594942844771486">Filă</translation>
 <translation id="8283475148136688298">Codul de autentificare a fost respins în timpul conectării la „<ph name="DEVICE_NAME"/>”.</translation>
 <translation id="6194025908252121648">Extensia cu codul \83„<ph name="IMPORT_ID"/>” nu poate fi importată deoarece nu este un modul la care se permite accesul.</translation>
 <translation id="3491170932824591984">Identitatea acestui site a fost verificată de <ph name="ISSUER"/>, dar verificarea înregistrărilor de auditare publică nu a reușit.</translation>
@@ -2445,9 +2458,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2090060788959967905">Pericol: avertizare de programe malware!</translation>
 <translation id="2563185590376525700">Broască</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME"/> nu s-a putut conecta la <ph name="NETWORK_ID"/>. Selectați altă rețea sau încercați din nou.</translation>
-<translation id="2086712242472027775">Contul dvs. nu funcționează pe <ph name="PRODUCT_NAME"/>. Contactați administratorul domeniului dvs. sau utilizați un Cont Google obișnuit pentru a vă conecta.</translation>
+<translation id="2086712242472027775">Contul dvs. nu funcționează pe <ph name="PRODUCT_NAME"/>. Contactați administratorul de domeniu sau folosiți un Cont Google obișnuit pentru a vă conecta.</translation>
 <translation id="1970103697564110434">Google Wallet vă protejează cardul</translation>
-<translation id="7222232353993864120">Adresă de e-mail</translation>
+<translation id="7222232353993864120">Adresa de e-mail</translation>
 <translation id="2128531968068887769">Client nativ</translation>
 <translation id="7175353351958621980">Încărcată de la:</translation>
 <translation id="3489785055052024984">Citește și modifică istoricul de navigare pe toate dispozitivele conectate</translation>
@@ -2465,8 +2478,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1529968269513889022">ultima săptămână</translation>
 <translation id="5542132724887566711">Profil</translation>
 <translation id="7912145082919339430">După ce instalarea pluginului <ph name="PLUGIN_NAME"/> s-a finalizat, reîncărcați pagina pentru a-l activa.</translation>
-<translation id="5196117515621749903">Reîncărcați ignorând memoria cache</translation>
-<translation id="5552632479093547648">Au fost detectate programe malware și phishing!</translation>
+<translation id="5196117515621749903">Reîncarcă ignorând memoria cache</translation>
+<translation id="5552632479093547648">S-au detectat programe malware și phishing!</translation>
 <translation id="2527591341887670429">Utilizarea bateriei: <ph name="PRECENTAGE"/> %</translation>
 <translation id="2435248616906486374">Rețea deconectată</translation>
 <translation id="960987915827980018">A mai rămas aproape 1 oră</translation>
@@ -2486,7 +2499,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6546686722964485737">Conectați-vă la rețeaua WiMAX</translation>
 <translation id="266983583785200437">Evenimente legate de blocări și de erori ale <ph name="SHORT_PRODUCT_NAME"/></translation>
 <translation id="5785746630574083988">Repornirea în modul Windows 8 va închide și relansa aplicațiile Chrome.</translation>
-<translation id="9118804773997839291">Mai jos puteți găsi o listă cu toate elementele nesigure ale paginii. Faceți clic pe linkul Diagnostic pentru a obține informații suplimentare cu privire la firul de execuție pentru un anumit element.</translation>
+<translation id="9118804773997839291">Mai jos este o listă cu toate elementele nesigure ale paginii. Dați clic pe linkul de diagnosticare pentru mai multe informații cu privire la firul unui element specific.</translation>
 <translation id="6287852322318138013">Selectați o aplicație pentru deschiderea acestui fișier</translation>
 <translation id="1313065465616456728">Emis la</translation>
 <translation id="895586998699996576">Imagine $1</translation>
@@ -2496,7 +2509,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7754704193130578113">Întreabă-mă unde se salvează fiecare fișier înainte de a-l descărca</translation>
 <translation id="222949136907494149"><ph name="URL"/> dorește să utilizeze locația computerului dvs.</translation>
 <translation id="7654941827281939388">Acest cont este deja utilizat pe acest computer.</translation>
-<translation id="204914487372604757">Creaţi o comandă rapidă</translation>
+<translation id="204914487372604757">Creați o comandă rapidă</translation>
 <translation id="696036063053180184">3 Set (No shift)</translation>
 <translation id="452785312504541111">Engleză de lățime completă</translation>
 <translation id="7589461650300748890">Ușurel. Fiți atent(ă).</translation>
@@ -2510,7 +2523,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4690246192099372265">Suedeză</translation>
 <translation id="1682548588986054654">Fereastră nouă &amp;incognito</translation>
 <translation id="6833901631330113163">Europa de Sud</translation>
-<translation id="6065289257230303064">Atribute director subiect certificat</translation>
+<translation id="6065289257230303064">Atribute director pentru subiectul certificatului</translation>
 <translation id="4087148366934348322">Încărcătorul este actualizat.</translation>
 <translation id="1270699273812232624">Permiteți aceste elemente</translation>
 <translation id="4018133169783460046">Afișați <ph name="PRODUCT_NAME"/> în această limbă</translation>
@@ -2522,7 +2535,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4569155249847375786">Verificate</translation>
 <translation id="5094721898978802975">Comunicarea cu aplicațiile native cooperante</translation>
 <translation id="1077946062898560804">Configurați actualizările automate pentru toți utilizatorii</translation>
-<translation id="3122496702278727796">Crearea directorului de date a eșuat</translation>
+<translation id="3122496702278727796">Nu s-a reușit crearea directorului de date</translation>
 <translation id="6690751852586194791">Alegeți un utilizator monitorizat pe care să îl adăugați la dispozitiv.</translation>
 <translation id="8572981282494768930">Nu permite site-urilor să acceseze camera și microfonul</translation>
 <translation id="6990081529015358884">Nu aveți spațiu suficient</translation>
@@ -2543,7 +2556,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2127166530420714525">Modificarea stării de alimentare a adaptorului Bluetooth a eșuat.</translation>
 <translation id="2765718175690078089">Activați aplicațiile găzduite experimentale eficientizate.</translation>
 <translation id="2824775600643448204">Bara de adrese și de căutare</translation>
-<translation id="7716781361494605745">Adresă URL a politicii Autorității de certificare Netscape</translation>
+<translation id="7716781361494605745">Adresă URL a politicii privind autoritatea de certificare Netscape</translation>
 <translation id="9148058034647219655">Ieșiți</translation>
 <translation id="4349014955187289426">Activează SPDY/4, care este standardul pentru HTTP/2. Experimental momentan.</translation>
 <translation id="2881966438216424900">Ultima accesare:</translation>
@@ -2551,7 +2564,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6935521024859866267">Răsturnat</translation>
 <translation id="4647090755847581616">&amp;Închideți fila</translation>
 <translation id="2649204054376361687"><ph name="CITY"/>, <ph name="COUNTRY"/></translation>
-<translation id="7886758531743562066">Site-ul web de la <ph name="HOST_NAME"/> conține elemente de pe site-uri care par a găzdui programe malware (software care poate dăuna computerului sau care poate funcționa fără consimțământul dvs.). Computerul poate fi infectat prin simpla accesare a unui site care conține programe malware.</translation>
+<translation id="7886758531743562066">Site-ul de la <ph name="HOST_NAME"/> conține elemente de pe site-uri care par a găzdui programe malware (software care poate dăuna computerului sau care poate funcționa fără consimțământul dvs.). Computerul poate fi infectat prin simpla accesare a unui site care conține programe malware.</translation>
 <translation id="4012185032967847512">Hopa, se pare că <ph name="NAME"/> trebuie să vă acorde permisiunea de a accesa această pagină.</translation>
 <translation id="7915857946435842056">Activează funcțiile experimentale pentru afișările din IME pentru metoda de introducere a textului.</translation>
 <translation id="6593868448848741421">cea mai bună</translation>
@@ -2588,7 +2601,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3736520371357197498">Dacă înțelegeți riscurile de securitate, puteți să <ph name="BEGIN_LINK"/>accesați acest site nesigur<ph name="END_LINK"/> înainte ca programele periculoase să fie eliminate.</translation>
 <translation id="4165738236481494247">Rulați acest plugin</translation>
 <translation id="1386387014181100145">Bună ziua.</translation>
-<translation id="4890284164788142455">Thailandeză</translation>
+<translation id="4890284164788142455">Thai</translation>
 <translation id="6049065490165456785">Fotografii de pe camera foto internă</translation>
 <translation id="4312207540304900419">Activați următoarea filă</translation>
 <translation id="7648048654005891115">Stil hartă taste</translation>
@@ -2608,7 +2621,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5148652308299789060">Dezactivați software-ul de rasterizare 3D</translation>
 <translation id="9205143043463108573">Poziționează Lansatorul de aplicații în aspectul peisaj, în centrul ecranului.</translation>
 <translation id="1414648216875402825">Faceți actualizarea la o versiune <ph name="PRODUCT_NAME"/> instabilă. Aceasta conține funcții nefinalizate. Vor apărea blocări și erori neașteptate. Continuați cu atenție.</translation>
-<translation id="8382913212082956454">Copiați adresa &amp;e-mail</translation>
+<translation id="8382913212082956454">Copiați adresa de &amp;e-mail</translation>
 <translation id="7447930227192971403">Activați fila 3</translation>
 <translation id="3427342743765426898">&amp;Repetați editarea</translation>
 <translation id="4157188838832721931">Dezactivează solicitarea adresată utilizatorului privind parola pentru sistemul de operare înainte de afișarea parolelor în pagina cu parole.</translation>
@@ -2626,12 +2639,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
         <ph name="PRODUCT_NAME"/>
         salvează temporar fișierele descărcate pe disc. Când
         <ph name="PRODUCT_NAME"/>
-        nu este închis în mod corespunzător, aceste fișiere se pot deteriora, rezultatul fiind
-        această eroare. Reîncărcarea paginii ar trebui să rezolve această problemă, iar
-        închiderea corespunzătoare ar trebui să prevină apariția acestei probleme pe viitor.
+        nu este închis în mod corespunzător, aceste fișiere se pot deteriora
+        rezultatul fiind această eroare. Reîncărcarea paginii ar trebui să rezolve această problemă,
+        iar închiderea corespunzătoare ar trebui să prevină apariția acestei probleme pe viitor.
         <ph name="LINE_BREAK"/>
-        Dacă problema persistă, încercați să goliți memoria cache. În unele cazuri, această eroare
-        poate indica faptul că unitățile hardware încep să nu mai funcționeze corect.</translation>
+        Dacă problema persistă, încercați să goliți memoria cache. În unele cazuri, această eroare poate indica faptul că unitățile hardware încep să nu mai funcționeze corect.</translation>
 <translation id="5154176924561037127">F8</translation>
 <translation id="5298219193514155779">Temă creată de</translation>
 <translation id="6307722552931206656">Servere de nume Google – <ph name="BEGIN_LINK"/>Aflați mai multe<ph name="END_LINK"/></translation>
@@ -2716,7 +2728,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2930644991850369934">A apărut o problemă în timpul descărcării imaginii de recuperare. Conexiunea la rețea a fost pierdută.</translation>
 <translation id="6891622577412956611">Vizualizare mozaic</translation>
 <translation id="8150722005171944719">Fișierul de la <ph name="URL"/> nu poate fi citit.  Este posibil să fi fost eliminat ori mutat sau ca permisiunile pentru fișiere să împiedice accesarea acestuia.</translation>
-<translation id="2316129865977710310">Nu, mulţumesc</translation>
+<translation id="2316129865977710310">Nu, mulțumesc</translation>
 <translation id="994901932508062332">Luna trecută</translation>
 <translation id="1720318856472900922">Autentificare server TLS WWW</translation>
 <translation id="62243461820985415">Chrome nu poate descărca această imagine de fundal.</translation>
@@ -2728,13 +2740,13 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7117247127439884114">Conectați-vă din nou...</translation>
 <translation id="2932960728421974162">Nu se poate efectua conexiunea la site-ul <ph name="SITE"/> autentic</translation>
 <translation id="509429900233858213">A apărut o eroare.</translation>
-<translation id="7227780179130368205">A fost detectat malware!</translation>
+<translation id="7227780179130368205">S-au detectat programe malware!</translation>
 <translation id="2489428929217601177">ultima zi</translation>
-<translation id="4278390842282768270">Permise</translation>
+<translation id="4278390842282768270">Permisă</translation>
 <translation id="2074527029802029717">Anulați fixarea filei</translation>
 <translation id="1533897085022183721">Mai puțin de <ph name="MINUTES"/>.</translation>
 <translation id="7382160026931194400">|Setările de conținut| și #motoarele de căutare# salvate nu vor fi șterse și este posibil să reflecte obiceiurile dvs. de navigare.</translation>
-<translation id="7503821294401948377">Nu se poate încărca pictograma „<ph name="ICON"/>” pentru respectiva acțiune a browserului.</translation>
+<translation id="7503821294401948377">Nu se poate încărca pictograma „<ph name="ICON"/>” pentru acțiunea browserului.</translation>
 <translation id="4809190954660909198">Detalii de facturare noi...</translation>
 <translation id="3942946088478181888">Ajută-mă să înțeleg</translation>
 <translation id="3722396466546931176">Adăugați limbi și ordonați-le prin tragere, în funcție de preferințele dvs.</translation>
@@ -2747,7 +2759,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8652139471850419555">Rețele preferate</translation>
 <translation id="7893393459573308604"><ph name="ENGINE_NAME"/> (Prestabilit)</translation>
 <translation id="5392544185395226057">Activați compatibilitatea pentru Clientul nativ.</translation>
-<translation id="5400640815024374115">Chipul Trusted Platform Module (TPM) este dezactivat sau lipsește.</translation>
+<translation id="5400640815024374115">Chipul Trusted Platform Module (TPM) este dezactivat sau absent.</translation>
 <translation id="2025623846716345241">Confirmați reîncărcarea</translation>
 <translation id="2151576029659734873">A fost introdus un index nevalid al filelor.</translation>
 <translation id="496546018524231664">Irlanda</translation>
@@ -2781,14 +2793,21 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1951615167417147110">Derulați o pagină în sus</translation>
 <translation id="6203231073485539293">Verificați conexiunea la internet</translation>
 <translation id="488726935215981469">Datele dvs. sunt criptate cu parola dvs. de acces pentru sincronizare. Introduceți-o mai jos.</translation>
-<translation id="6147020289383635445">Previzualizarea înainte de printare a eșuat.</translation>
+<translation id="6147020289383635445">Previzualizarea înainte de printare nu a reușit.</translation>
 <translation id="7650511557061837441">„<ph name="TRIGGERING_EXTENSION_NAME"/>” dorește să elimine „<ph name="EXTENSION_NAME"/>”.</translation>
-<translation id="4154664944169082762">Amprente</translation>
+<translation id="4154664944169082762">Amprente digitale</translation>
 <translation id="4193297030838143153">Adresă de facturare nouă...</translation>
 <translation id="3202578601642193415">Cele mai noi</translation>
 <translation id="1398853756734560583">Maximizați</translation>
 <translation id="1829129547161959350">Pinguin</translation>
-<translation id="8988255471271407508">Pagina web nu a fost găsită în memoria cache. Anumite resurse pot fi încărcate în siguranță numai din memoria cache, cum ar fi paginile generate din datele trimise. <ph name="LINE_BREAK"/> Această eroare poate fi, de asemenea, cauzată de deteriorarea memoriei cache din cauza unei închideri necorespunzătoare. <ph name="LINE_BREAK"/> Dacă problema persistă, încercați să goliți memoria cache.</translation>
+<translation id="8988255471271407508">Pagina web nu a fost găsită în memoria cache. Anumite resurse
+        pot fi încărcate în siguranță numai din memoria cache, cum ar fi paginile generate
+        din datele trimise.
+        <ph name="LINE_BREAK"/>
+        Această eroare poate fi, de asemenea, cauzată de
+        deteriorarea memoriei cache din cauza unei închideri necorespunzătoare.
+        <ph name="LINE_BREAK"/>
+        Dacă problema persistă, încercați să goliți memoria cache.</translation>
 <translation id="1653828314016431939">OK - Reporniți acum</translation>
 <translation id="7364796246159120393">Alegeți fișierul</translation>
 <translation id="6585283250473596934">Se pornește sesiunea publică.</translation>
@@ -2818,14 +2837,14 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="166222140726737248">Dacă ați achiziționat un Chromebook HP 11 înainte de 1 decembrie 2013, vă vom trimite prin poștă un încărcător gratuit de schimb. Pentru a returna încărcătorul original, veți primi și un pachet de expediere preplătit, pentru a-l putea scoate din uz în mod corespunzător.</translation>
 <translation id="5829401023154985950">Gestionați...</translation>
 <translation id="6832874810062085277">solicitați confirmarea</translation>
-<translation id="8401363965527883709">Casetă de selectare debifată</translation>
+<translation id="8401363965527883709">Casetă de selectare nebifată</translation>
 <translation id="7771452384635174008">Aspect</translation>
 <translation id="5852454633281115663">Hangouts Google+</translation>
 <translation id="6188939051578398125">Introduceți nume sau adrese.</translation>
 <translation id="8151638057146502721">Configurați</translation>
 <translation id="8443621894987748190">Alegeți fotografia pentru contul dvs.</translation>
 <translation id="7374461526650987610">Handlere pentru protocoale</translation>
-<translation id="2192505247865591433">Din:</translation>
+<translation id="2192505247865591433">De la:</translation>
 <translation id="4634771451598206121">Conectați-vă din nou...</translation>
 <translation id="1035590878859356651">Marcați această pagină...</translation>
 <translation id="5630205793128597629">Dezactivați DirectWrite</translation>
@@ -2833,10 +2852,10 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="942954117721265519">Nu există imagini în acest director.</translation>
 <translation id="671928215901716392">Blocați ecranul</translation>
 <translation id="2241468422635044128">Permis de extensie</translation>
-<translation id="3727187387656390258">Inspectați fereastra de tip pop-up</translation>
+<translation id="3727187387656390258">Fereastră pop-up de inspectare</translation>
 <translation id="361106536627977100">Date Flash</translation>
 <translation id="569068482611873351">Importați...</translation>
-<translation id="6571070086367343653">Editați cartea de credit</translation>
+<translation id="6571070086367343653">Editați cardul de credit</translation>
 <translation id="1204242529756846967">Această limbă este utilizată pentru verificarea ortografică</translation>
 <translation id="3981760180856053153">A fost introdus un tip de salvare nevalid.</translation>
 <translation id="8865709004086313039">Între timp, puteți să consultați <ph name="BEGIN_LINK"/>Întrebările frecvente<ph name="END_LINK"/> și să folosiți în continuare Chromebookul HP 11 cu orice alt încărcător micro-USB certificat, de exemplu, cu unul de la o tabletă sau un smartphone. Ne cerem încă o dată scuze pentru inconveniențe. Siguranța dvs. este o prioritate de vârf.</translation>
@@ -2849,7 +2868,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="790040513076446191">Manipulează setările privind confidențialitatea</translation>
 <translation id="7260002739296185724">Activează folosirea platformei AV Foundation pentru înregistrarea video și monitorizarea dispozitivului video în OS X 10.7 și versiunile ulterioare. În celelalte cazuri, se va folosi QTKit.</translation>
 <translation id="1463985642028688653">blocați</translation>
-<translation id="1715941336038158809">Nume de utilizator sau parolă nevalidă.</translation>
+<translation id="1715941336038158809">Nume de utilizator sau parolă nevalide.</translation>
 <translation id="1901303067676059328">Select&amp;ați tot</translation>
 <translation id="8846141544112579928">Se caută tastatura...</translation>
 <translation id="674375294223700098">Eroare de certificat de server necunoscută.</translation>
@@ -2862,7 +2881,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3480892288821151001">Andocați fereastra la stânga</translation>
 <translation id="252219247728877310">Componenta nu este actualizată</translation>
 <translation id="3031417829280473749">Agenta X</translation>
-<translation id="2893168226686371498">Browser prestabilit</translation>
+<translation id="2893168226686371498">Browserul prestabilit</translation>
 <translation id="6840444547062817500">Această extensie s-a reîncărcat automat prea frecvent.</translation>
 <translation id="1895934970388272448">Pentru a finaliza acest proces, este necesar să confirmați înregistrarea de pe imprimantă. Verificați acum.</translation>
 <translation id="7839580021124293374">3</translation>
@@ -2873,7 +2892,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
           <ph name="PRODUCT_NAME"/>
           nu se poate conecta la acesta.</translation>
 <translation id="7687314205250676044">Modificați înapoi la „<ph name="FROM_LOCALE"/>” (este necesară deconectarea)</translation>
-<translation id="1899708097738826574"><ph name="OPTIONS_TITLE"/> - <ph name="SUBPAGE_TITLE"/></translation>
+<translation id="1899708097738826574"><ph name="OPTIONS_TITLE"/>  <ph name="SUBPAGE_TITLE"/></translation>
 <translation id="6862635236584086457">Pentru toate fișierele salvate în acest dosar se creează copii de rezervă online în mod automat</translation>
 <translation id="5854912040170951372">Feliuță</translation>
 <translation id="4027804175521224372">(Iată ce ratați – <ph name="IDS_SYNC_PROMO_NOT_SIGNED_IN_STATUS_LINK"/>)</translation>
@@ -2892,15 +2911,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8190193592390505034">Se conectează la <ph name="PROVIDER_NAME"/></translation>
 <translation id="2433452467737464329">Pentru actualizarea automată a paginii: chrome://network/?refresh=&lt;sec&gt;, adăugați un parametru de interogare în adresa URL</translation>
 <translation id="8712637175834984815">Am înțeles</translation>
-<translation id="6144890426075165477"><ph name="PRODUCT_NAME"/> nu este în prezent browserul dvs. prestabilit.</translation>
+<translation id="6144890426075165477"><ph name="PRODUCT_NAME"/> nu este în prezent browserul prestabilit.</translation>
 <translation id="4068506536726151626">Această pagină conține elemente din următoarele site-uri care urmăresc locația dvs.:</translation>
 <translation id="3656059567098593256"><ph name="APP_NAME"/> dorește să trimită conținut de pe ecran către <ph name="TARGET_NAME"/>. Alegeți ce doriți să trimiteți.</translation>
-<translation id="4220128509585149162">Erori</translation>
+<translation id="4220128509585149162">Blocări</translation>
 <translation id="8798099450830957504">Prestabilit</translation>
-<translation id="1640283014264083726">PKCS #1 MD4 cu criptare RSA</translation>
+<translation id="1640283014264083726">PKCS # 1 MD4 cu criptare RSA</translation>
 <translation id="7805768142964895445">Stare</translation>
 <translation id="872451400847464257">Editați motorul de căutare</translation>
-<translation id="5512653252560939721">Certificatul de utilizator trebuie să fie susținut de hardware.</translation>
+<translation id="5512653252560939721">Certificat de utilizator trebuie să fie susținut de hardware.</translation>
 <translation id="5372529912055771682">Modul de înscriere furnizat nu este acceptat de această versiune a sistemului de operare. Asigurați-vă că rulați cea mai recentă versiune și încercați din nou.</translation>
 <translation id="3288047731229977326">Extensiile care rulează în modul pentru dezvoltatori pot afecta computerul. Dacă nu sunteți dezvoltator, se recomandă să dezactivați aceste extensii, pentru siguranță.</translation>
 <translation id="474031007102415700">Verificați cablurile și reporniți routerele, modemurile sau alte
@@ -2917,17 +2936,17 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3378503599595235699">Păstrează datele locale numai până când închid browserul</translation>
 <translation id="8047248493720652249">Această extensie nu a reușit să denumească fișierul descărcat „<ph name="ATTEMPTED_FILENAME"/>”, deoarece altă extensie (<ph name="EXTENSION_NAME"/>) a stabilit alt nume de fișier, „<ph name="ACTUAL_FILENAME"/>”.</translation>
 <translation id="5605830556594064952">S.U.A. Dvorak</translation>
-<translation id="7347751611463936647">Pentru a utiliza această extensie, introduceți „<ph name="EXTENSION_KEYWORD"/>”, apoi TAB și comanda sau interogarea.</translation>
+<translation id="7347751611463936647">Pentru a utiliza această extensie, introduceți „<ph name="EXTENSION_KEYWORD"/>”, apoi apăsați pe TAB și folosiți comanda sau căutarea.</translation>
 <translation id="878431691778285679">Se pare că gestionați deja un utilizator cu acel nume.<ph name="LINE_BREAK"/>Doriți să <ph name="BEGIN_LINK"/>importați <ph name="PROFILE_NAME"/> pe acest dispozitiv.<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> dorește să utilizeze microfonul.</translation>
-<translation id="2805756323405976993">Google Apps</translation>
+<translation id="2805756323405976993">Aplicații</translation>
 <translation id="5151511998946489774">Identitatea acestui site a fost verificată de <ph name="ISSUER"/> și poate fi auditată public.</translation>
 <translation id="1608626060424371292">Eliminați acest utilizator</translation>
 <translation id="2779552785085366231">Această pagină poate fi adăugată în Lansatorul de aplicații</translation>
 <translation id="3075239840551149663">Utilizatorul monitorizat <ph name="NEW_PROFILE_NAME"/> a fost creat!</translation>
-<translation id="3651020361689274926">Resursa solicitată nu mai există și nu apare nicio adresă de redirecționare. Se pare că această stare este permanentă.</translation>
+<translation id="3651020361689274926">Resursa solicitată nu mai există și nu apare nicio adresă de redirecționare. Se pare că această stare este definitivă.</translation>
 <translation id="6003284010415283671">Adăugați aplicații</translation>
-<translation id="2989786307324390836">Certificat unic, codificat DER</translation>
+<translation id="2989786307324390836">Certificat unic, sub formă de fișier binar cu codificarea DER</translation>
 <translation id="3827774300009121996">&amp;Ecran complet</translation>
 <translation id="7982083145464587921">Reporniți dispozitivul, pentru ca eroarea să fie remediată.</translation>
 <translation id="3771294271822695279">Fișiere video</translation>
@@ -2967,7 +2986,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4742746985488890273">Fixați în raft</translation>
 <translation id="8074984796671539016">Activați butonul pentru încărcarea versiunii offline vechi</translation>
 <translation id="1113869188872983271">&amp;Anulați reordonarea</translation>
-<translation id="16620462294541761">Ne pare rău, parola dvs. nu a putut fi verificată. Încercați din nou.</translation>
+<translation id="16620462294541761">Ne pare rău, parola nu a putut fi verificată. Încercați din nou.</translation>
 <translation id="7199577450002167685"><ph name="SITE"/> utilizează o cheie publică Diffie-Hellman efemeră slabă și prin urmare Chrome nu poate verifica identitatea serverului.</translation>
 <translation id="5680545064257783621">Oferă un comutator de oprire pentru experimentul cu marcaje îmbunătățite</translation>
 <translation id="9065010339377966858">SHA-256</translation>
@@ -2982,7 +3001,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1358735829858566124">Fișierul sau directorul nu este utilizabil.</translation>
 <translation id="175772926354468439">Activați tema</translation>
 <translation id="3144135466825225871">Înlocuirea fișierului crx a eșuat. Verificați dacă fișierul este în uz.</translation>
-<translation id="2744221223678373668">Publice</translation>
+<translation id="2744221223678373668">Comune</translation>
 <translation id="9064142312330104323">Fotografie de profil Google (se încarcă)</translation>
 <translation id="3930617119570072742">Aveți încredere în extensie pentru a efectua aceste acțiuni?</translation>
 <translation id="4708849949179781599">Închideți <ph name="PRODUCT_NAME"/></translation>
@@ -2991,12 +3010,12 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2505402373176859469"><ph name="RECEIVED_AMOUNT"/> din <ph name="TOTAL_SIZE"/></translation>
 <translation id="9127762771585363996">Răsturnați pe orizontală imaginea camerei</translation>
 <translation id="4724450788351008910">Afilierea a fost schimbată</translation>
-<translation id="2249605167705922988">de ex., 1 – 5, 8, 11 – 13</translation>
+<translation id="2249605167705922988">de ex., 1-5, 8, 11-13</translation>
 <translation id="1520505881707245707">Această semnalizare poate fi folosită pentru a activa verificarea conform căreia conținutul fișierelor de pe disc pentru extensii din magazinul web se potrivește cu cel așteptat. Aceasta poate fi folosită pentru a activa această funcție, dacă altfel nu ar fi fost activată, dar nu poate fi folosită pentru a o dezactiva (deoarece această setare poate fi modificată de programe malware).</translation>
 <translation id="8572510699242209592">Gigaocteți</translation>
-<translation id="8691686986795184760">(Activată prin politica de întreprindere)</translation>
+<translation id="8691686986795184760">(Activat de politica întreprinderii)</translation>
 <translation id="878763818693997570">Numele este prea lung</translation>
-<translation id="1976323404609382849">Sunt blocate modulele cookie de la mai multe site-uri.</translation>
+<translation id="1976323404609382849">Sunt blocate cookie-urile de la mai multe site-uri.</translation>
 <translation id="6775200426306143288">Conectați-vă cu numele de utilizator primit din partea organizației pentru a vă înscrie dispozitivul în sistemul de gestionare al companiei.</translation>
 <translation id="7913678092679498828">OK, am înțeles!</translation>
 <translation id="3655670868607891010">Dacă această pagină se afișează în mod frecvent, încercați <ph name="HELP_LINK"/>.</translation>
@@ -3013,7 +3032,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2707024448553392710">Componenta se descarcă</translation>
 <translation id="3972425373133383637">Rămâneți conectat(ă) la informațiile de care aveți nevoie, pe toate dispozitivele.</translation>
 <translation id="8493236660459102203">Microfon:</translation>
-<translation id="4788968718241181184">Metoda de introducere pentru vietnameză (TCVN6064)</translation>
+<translation id="4788968718241181184">Metoda de introducere a textului în vietnameză (TCVN6064)</translation>
 <translation id="3254409185687681395">Marcați această pagină</translation>
 <translation id="5694501201003948907">Se arhivează $1 elemente...</translation>
 <translation id="2677924368525077324">Activați editarea textului prin atingere</translation>
@@ -3022,7 +3041,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7581279002575751816">Pluginurile NPAPI nu sunt acceptate.</translation>
 <translation id="1800035677272595847">Phishing</translation>
 <translation id="7225807090967870017">Cod versiune</translation>
-<translation id="402759845255257575">Nu permiteți niciunui site să ruleze JavaScript</translation>
+<translation id="402759845255257575">Nu permite niciunui site să ruleze JavaScript</translation>
 <translation id="4610637590575890427">Ați vrut să accesați <ph name="SITE"/>?</translation>
 <translation id="5141240743006678641">Criptează parolele sincronizate cu datele de conectare Google</translation>
 <translation id="5866389191145427800">Specifică setarea de calitate pentru imaginile capturate, în cazul în care se mărește calitatea.</translation>
@@ -3042,7 +3061,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="857779305329188634">Activați compatibilitatea cu protocolul experimental QUIC.</translation>
 <translation id="7208899522964477531">Căutați <ph name="SEARCH_TERMS"/> pe <ph name="SITE_NAME"/></translation>
 <translation id="4031910098617850788">F5</translation>
-<translation id="8960795431111723921">În prezent cercetăm această problemă.</translation>
+<translation id="8960795431111723921">În prezent investigăm această problemă.</translation>
 <translation id="862727964348362408">Suspendat</translation>
 <translation id="2482878487686419369">Notificări</translation>
 <translation id="8004582292198964060">Browser</translation>
@@ -3074,15 +3093,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7974087985088771286">Activați fila 6</translation>
 <translation id="2857421400871862029">Notifică-mă dacă un site încearcă să dezactiveze cursorul mouse-ului (recomandat)</translation>
 <translation id="1910721550319506122">Bun venit!</translation>
-<translation id="4035758313003622889">&amp;Administrare activități</translation>
+<translation id="4035758313003622889">&amp;Manager de activități</translation>
 <translation id="6356936121715252359">Setări privind stocarea Adobe Flash Player...</translation>
 <translation id="8874184842967597500">Neconectat</translation>
-<translation id="7313804056609272439">Metoda de introducere pentru vietnameză (VNI)</translation>
+<translation id="7313804056609272439">Metoda de introducere a textului în vietnameză (VNI)</translation>
 <translation id="8599675288025166194">Activați aplicațiile efemere experimentale care pot fi accesate prin link.</translation>
 <translation id="5026754133087629784">Afișare web: <ph name="WEBVIEW_TAG_NAME"/></translation>
 <translation id="5677503058916217575">Limba paginii:</translation>
 <translation id="6739254200873843030">Cardul a expirat. Verificați data sau introduceți un card nou.</translation>
-<translation id="8106211421800660735">Număr carte de credit</translation>
+<translation id="8106211421800660735">Numărul cardului de credit</translation>
 <translation id="9159562891634783594">Activează înregistrarea imprimantelor din cloud neînregistrate din previzualizarea printării.</translation>
 <translation id="8843709518995654957"><ph name="LINK_START"/>Creați un utilizator monitorizat<ph name="LINK_END"/> pentru acest dispozitiv.</translation>
 <translation id="2872961005593481000">Închideți</translation>
@@ -3102,27 +3121,27 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="881799181680267069">Ascundeți-le pe celelalte</translation>
 <translation id="3267726687589094446">Permiteți în continuare descărcarea automată a mai multor fișiere</translation>
 <translation id="1812631533912615985">Anulați fixarea filelor</translation>
-<translation id="6042308850641462728">Mai mult</translation>
+<translation id="6042308850641462728">Mai multe</translation>
 <translation id="8318945219881683434">Verificarea revocării nu a reușit.</translation>
 <translation id="4719197194005159666">Împiedică Chrome să se închidă când sunt deschise aplicații Chrome.</translation>
 <translation id="4676187981481349427">Site-ul <ph name="SITE"/> utilizează în mod obișnuit criptarea pentru a vă proteja informațiile. Când Chrome a încercat să se conecteze la <ph name="SITE"/> de această dată, site-ul a returnat date de conectare neobișnuite și incorecte. Acest lucru s-a întâmplat fie pentru că un atacator încearcă să falsifice site-ul <ph name="SITE"/>, fie pentru că un ecran de conectare Wi-Fi a întrerupt conexiunea. Securitatea informațiilor dvs. nu a fost afectată, deoarece Chrome a oprit conexiunea înainte ca datele să fie transferate.</translation>
 <translation id="1408789165795197664">Avansat...</translation>
-<translation id="1650709179466243265">Adăugați www. și .com și deschideți o adresă</translation>
+<translation id="1650709179466243265">Adăugați www. și .com și deschideți adresa</translation>
 <translation id="3700834376805760154">Identitatea companiei <ph name="ORGANIZATION"/> din <ph name="LOCALITY"/> a fost verificată de <ph name="ISSUER"/> și poate fi auditată public.</translation>
 <translation id="436701661737309601">În cazul unui certificat care nu a expirat, emitentul certificatului respectiv este responsabil pentru păstrarea unei „liste de revocări”. Dacă un certificat este compromis la un moment dat, emitentul îl poate revoca adăugându-l la lista de revocări, iar acest certificat nu va mai fi de încredere pentru browserul dvs. Nu este necesar ca starea de revocare să fie menținută pentru certificate expirate. Prin urmare, deși acest certificat era valid pentru site-ul web pe care îl accesați, în acest moment nu se poate stabili dacă acesta a fost compromis și în consecință, revocat sau dacă este în continuare sigur. Astfel, nu este posibil să se stabilească dacă dvs. comunicați cu site-ul web legitim sau dacă certificatul a fost compromis și acum se află în posesia unui atacator cu care comunicați.</translation>
 <translation id="4342311272543222243">Hopa! A apărut o eroare TPM.</translation>
 <translation id="3727884750434605207">Activează injectarea scripturilor în loc de accesibilitatea nativă din Android.</translation>
 <translation id="1285484354230578868">Stocați datele în contul Google Drive</translation>
 <translation id="7106346894903675391">Cumpărați mai mult spațiu de stocare...</translation>
-<translation id="994289308992179865">&amp;Repetați</translation>
+<translation id="994289308992179865">&amp;Redați în buclă</translation>
 <translation id="7596831438341298034">Ok, importați</translation>
 <translation id="8141520032636997963">Deschideți în Adobe Reader</translation>
 <translation id="8887090188469175989">ZGPY</translation>
 <translation id="4287502004382794929">Nu dețineți suficiente licențe de software pentru a înscrie acest dispozitiv. Contactați departamentul de vânzări pentru a achiziționa licențe suplimentare. În cazul în care considerați că acest mesaj este afișat din greșeală, contactați serviciul de asistență.</translation>
 <translation id="8112754292007745564">Activați API-ul Web MIDI</translation>
-<translation id="3302709122321372472">Nu am putut încărca fișierul CSS „<ph name="RELATIVE_PATH"/>” pentru scriptul de conținut.</translation>
+<translation id="3302709122321372472">Nu se poate încărca fișierul CSS „<ph name="RELATIVE_PATH"/>” pentru scriptul de conținut.</translation>
 <translation id="305803244554250778">Creați comenzi rapide pentru aplicație în următoarele locații:</translation>
-<translation id="574392208103952083">Mediu</translation>
+<translation id="574392208103952083">Medie</translation>
 <translation id="8877448029301136595">[directorul părinte]</translation>
 <translation id="3816844797124379499">Aplicația nu a putut fi adăugată, deoarece este în conflict cu „<ph name="APP_NAME"/>”.</translation>
 <translation id="7301360164412453905">Taste de selecție tastatură Hsu</translation>
@@ -3160,15 +3179,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
         pentru mai multe informații, inclusiv cum puteți să dezactivați această funcție.</translation>
 <translation id="5411769601840150972">Data și ora sunt setate automat.</translation>
 <translation id="1747687775439512873">Dezactivați WiMAX</translation>
-<translation id="6691936601825168937">&amp;Redirecționați</translation>
+<translation id="6691936601825168937">&amp;Înainte</translation>
 <translation id="6566142449942033617">Nu se poate încărca „<ph name="PLUGIN_PATH"/>” pentru plugin.</translation>
 <translation id="7299337219131431707">Activați navigarea ca invitat</translation>
 <translation id="2312980885338881851">Hopa! Se pare că nu aveți utilizatori monitorizați existenți, pe care să îi importați. Creați unul sau mai mulți utilizatori monitorizați de pe alt dispozitiv, pe care îi puteți importa apoi pe acesta.</translation>
 <translation id="6823506025919456619">Pentru a vedea dispozitivele, este necesar să vă conectați la Chrome</translation>
 <translation id="7065534935986314333">Despre sistem</translation>
 <translation id="4691088804026137116">Nu sincronizați nimic</translation>
-<translation id="6454421252317455908">Metoda de introducere pentru chineză (rapidă)</translation>
-<translation id="368789413795732264">A avut loc o eroare la încercarea de scriere a fișierului: <ph name="ERROR_TEXT"/>.</translation>
+<translation id="6454421252317455908">Metoda de introducere a textului în chineză (rapidă)</translation>
+<translation id="368789413795732264">A apărut o eroare la încercarea de scriere a fișierului: <ph name="ERROR_TEXT"/>.</translation>
 <translation id="1173894706177603556">Redenumiți</translation>
 <translation id="2128691215891724419">Eroare de sincronizare: actualizați expresia de acces pentru sincronizare...</translation>
 <translation id="2148716181193084225">Astăzi</translation>
@@ -3176,17 +3195,17 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7816975051619137001">Corectează automat greșelile de ortografie</translation>
 <translation id="4608500690299898628">&amp;Găsiți...</translation>
 <translation id="7068997575282883954">Salvați și protejați-vă detaliile cu Google Wallet.</translation>
-<translation id="7582582252461552277">Preferați această rețea</translation>
+<translation id="7582582252461552277">Prefer această rețea</translation>
 <translation id="3574305903863751447"><ph name="CITY"/>, <ph name="STATE"/> <ph name="COUNTRY"/></translation>
 <translation id="8724859055372736596">&amp;Afișați în dosar</translation>
 <translation id="5990198433782424697">Extensii pentru adresele URL chrome://</translation>
 <translation id="7456142309650173560">dezvoltatori</translation>
-<translation id="4605399136610325267">Fără conexiune la internet</translation>
+<translation id="4605399136610325267">Nu v-ați conectat la internet</translation>
 <translation id="6797493596609571643">Hopa! A apărut o eroare.</translation>
 <translation id="2251861737500412684">Derulare suplimentară pentru tastatura virtuală</translation>
 <translation id="978407797571588532">Accesați
           <ph name="BEGIN_BOLD"/>
-          Start &gt; Control Panel (Panou de control) &gt; Network Connections (Conexiuni în rețea) &gt; New Connection Wizard (Expert conexiune nouă)
+          Start &gt; Panou de control &gt; Conexiuni în rețea &gt; Expert conexiune nouă
           <ph name="END_BOLD"/>
           pentru a testa conexiunea dvs.</translation>
 <translation id="5554489410841842733">Această pictogramă va deveni vizibilă când extensia va putea acționa pe pagina curentă.</translation>
@@ -3202,7 +3221,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1146673768181266552">ID blocare <ph name="CRASH_ID"/> (<ph name="CRASH_LOCAL_ID"/>)</translation>
 <translation id="5488640658880603382">Sigur doriți să ștergeți de pe acest computer profilul „<ph name="PROFILE_NAME"/>” și toate datele asociate acestuia? Acțiunea nu poate fi anulată!</translation>
 <translation id="8044899503464538266">Lent</translation>
-<translation id="3789841737615482174">Instalaţi</translation>
+<translation id="3789841737615482174">Instalați</translation>
 <translation id="4320697033624943677">Adăugați utilizatori</translation>
 <translation id="1283379245075810567">Începeți oglindirea</translation>
 <translation id="9153934054460603056">Salvați identitatea și parola</translation>
@@ -3210,7 +3229,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4594403342090139922">&amp;Anulați ștergerea</translation>
 <translation id="7908378463497120834">Ne pare rău, cel puțin o partiție de pe dispozitivul de stocare externă nu a putut fi montată.</translation>
 <translation id="2520481907516975884">Comutați între modurile chineză/engleză</translation>
-<translation id="4056561919922437609"><ph name="TAB_COUNT"/> file</translation>
+<translation id="4056561919922437609"><ph name="TAB_COUNT"/> (de) file</translation>
 <translation id="3612628222817739505">(<ph name="ACCELERATOR"/>)</translation>
 <translation id="6358450015545214790">Ce înseamnă acestea?</translation>
 <translation id="1156185823432343624">Volum: sunet dezactivat</translation>
@@ -3221,10 +3240,10 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6615455863669487791">Afișați</translation>
 <translation id="3543393733900874979">Actualizarea nu a reușit (eroare: <ph name="ERROR_NUMBER"/>)</translation>
 <translation id="991969738502325513">Ce ar trebui să faceți?</translation>
-<translation id="1017280919048282932">&amp;Adăugați în dicționar</translation>
+<translation id="1017280919048282932">&amp;Adăugați la dicționar</translation>
 <translation id="3534879087479077042">Ce este un utilizator monitorizat?</translation>
 <translation id="7211828883345145708">Activează comenzi rapide de la tastatură suplimentare, utile pentru depanarea Chromium.</translation>
-<translation id="8319414634934645341">Utilizare extinsă a cheii</translation>
+<translation id="8319414634934645341">Utilizare cheie extinsă</translation>
 <translation id="6056710589053485679">Reîncărcați normal</translation>
 <translation id="4563210852471260509">Limba inițială de introducere este chineza</translation>
 <translation id="2888807692577297075">Nu există elemente care să corespundă cu &lt;b&gt;„<ph name="SEARCH_STRING"/>”&lt;/b&gt;</translation>
@@ -3245,14 +3264,14 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5649823029736413118">Este necesar ca <ph name="URL"/> să identifice în mod unic dispozitivul dvs. pentru a putea reda conținut premium.</translation>
 <translation id="8899285681604219177">Extensiile necompatibile au fost dezactivate</translation>
 <translation id="889901481107108152">Ne pare rău, acest experiment nu este disponibil pe platforma dvs.</translation>
-<translation id="8238191901674777266">Statele Unite</translation>
-<translation id="1873879463550486830">Mediu de testare SUID</translation>
+<translation id="8238191901674777266">Statele Unite ale Americii</translation>
+<translation id="1873879463550486830">Mediu de testare securizat SUID</translation>
 <translation id="8118860139461251237">Gestionează descărcările</translation>
 <translation id="5111852801054039429">Dezactivați WebRTC</translation>
 <translation id="2190355936436201913">(gol)</translation>
 <translation id="8515737884867295000">Autentificarea pe bază de certificat nu a reușit</translation>
 <translation id="5818003990515275822">Coreeană</translation>
-<translation id="4182252350869425879">Avertisment: Site suspectat de phishing!</translation>
+<translation id="4182252350869425879">Avertisment: site suspectat de phishing!</translation>
 <translation id="2453021845418314664">Setări avansate de sincronizare</translation>
 <translation id="14720830734893704">Activați compatibilitatea cu tastatura virtuală.</translation>
 <translation id="5458214261780477893">Dvorak</translation>
@@ -3272,7 +3291,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6003177993629630467">Este posibil ca <ph name="PRODUCT_NAME"/> să nu se poată menține la zi.</translation>
 <translation id="8923542159871018393"><ph name="EXTENSION_NAME"/> rulează pe această pagină.</translation>
 <translation id="580886651983547002"><ph name="PRODUCT_NAME"/>
-        nu poate accesa site-ul web. Acest fapt este cauzat în mod normal de probleme de rețea,
+        nu poate accesa site-ul Acest fapt este cauzat în mod normal de probleme de rețea,
         dar poate fi rezultatul unei configurări greșite a unui program firewall sau a unui server proxy.</translation>
 <translation id="4387554346626014084">Activează sincronizarea Lansatorului de aplicații. Activează și Dosarele, după caz (non-OSX).</translation>
 <translation id="4104400246019119780">Vă mulțumim!</translation>
@@ -3283,7 +3302,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5325811048571015442">În contul dvs. <ph name="ACCOUNT_EMAIL"/>, acum poate:</translation>
 <translation id="529172024324796256">Nume de utilizator:</translation>
 <translation id="8232829399891359332">Restabiliri ale sesiunii</translation>
-<translation id="3308116878371095290">Această pagină a fost împiedicată să stocheze module cookie.</translation>
+<translation id="3308116878371095290">Această pagină a fost împiedicată să stocheze cookie-uri.</translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="1545786162090505744">Adresă URL cu %s în loc de interogare</translation>
 <translation id="7219179957768738017">Conexiunea utilizează <ph name="SSL_VERSION"/>.</translation>
@@ -3301,7 +3320,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2805646850212350655">Sistem Microsoft de criptare a fișierelor</translation>
 <translation id="2643698698624765890">Gestionați extensiile făcând clic pe Extensii în meniul Window (Fereastră).</translation>
 <translation id="4846680374085650406">Urmați recomandarea administratorului pentru această setare.</translation>
-<translation id="1974060860693918893">Avansate</translation>
+<translation id="1974060860693918893">Avansat</translation>
 <translation id="4509017836361568632">Renunțați la fotografie</translation>
 <translation id="1244303850296295656">Eroare privind extensiile</translation>
 <translation id="3541661933757219855">Apăsați pe Ctrl+Alt+/ sau pe Escape pentru a ascunde</translation>
@@ -3335,7 +3354,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8895908457475309889">Informațiile dvs. vor fi eliminate după deconectare.</translation>
 <translation id="3740601730372300467">Actualizările manuale sunt dezactivate de administrator. Sunt activate actualizările automate.</translation>
 <translation id="6820686453637990663">CVC</translation>
-<translation id="2371076942591664043">Deschide când s-a &amp;descărcat</translation>
+<translation id="2371076942591664043">Deschideți când s-a &amp;descărcat</translation>
 <translation id="3920504717067627103">Politici de certificat</translation>
 <translation id="7418949474175272990">Această opțiune dezactivează în WebRTC compatibilitatea pentru codificarea fluxurilor video utilizând hardware-ul platformei.</translation>
 <translation id="2344028582131185878">Descărcări automate</translation>
@@ -3352,13 +3371,13 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5857090052475505287">Dosar nou</translation>
 <translation id="7450732239874446337">I/O de rețea suspendat.</translation>
 <translation id="4003393903129308792">Activați rasterizerul copie unu</translation>
-<translation id="5178667623289523808">Găsiți elementul anterior</translation>
+<translation id="5178667623289523808">Găsiți anteriorul</translation>
 <translation id="1510785804673676069">Dacă utilizați un server proxy, verificați setările de proxy sau
     contactați administratorul de rețea pentru a verifica dacă
     serverul proxy funcționează. Dacă nu credeți că ar trebui să
     utilizați un server proxy, modificați <ph name="LINK_START"/>setările de proxy<ph name="LINK_END"/>.</translation>
 <translation id="3136551860576779817">Coduri hash pentru chei publice: <ph name="HASHES"/></translation>
-<translation id="8687485617085920635">Următoarea fereastră</translation>
+<translation id="8687485617085920635">Fereastra următoare</translation>
 <translation id="2610780100389066815">Semnarea listei de încredere Microsoft</translation>
 <translation id="4535353504827549990">Schimbați intervalul de timp</translation>
 <translation id="7959074893852789871">Fișierul a conținut mai multe certificate, unele dintre acestea nefiind importate:</translation>
@@ -3366,7 +3385,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3414758901256308084">Dezinstalări</translation>
 <translation id="7791536208663663346">Dezactivează decodarea videoclipurilor cu accelerare hardware atunci când aceasta este disponibilă.</translation>
 <translation id="87377425248837826">Activați panourile</translation>
-<translation id="2805707493867224476">Permiteți tuturor site-urilor să afișeze ferestre de tip pop-up</translation>
+<translation id="2805707493867224476">Permite tuturor site-urilor să afișeze ferestre pop-up</translation>
 <translation id="3561217442734750519">Valoarea introdusă pentru cheia privată trebuie să fie o cale validă.</translation>
 <translation id="3582930987043644930">Adăugați un nume</translation>
 <translation id="2984337792991268709">Astăzi, la <ph name="TODAY_DAYTIME"/></translation>
@@ -3380,9 +3399,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6503077044568424649">Cele mai vizitate</translation>
 <translation id="9016164105820007189">Se conectează la „<ph name="DEVICE_NAME"/>”.</translation>
 <translation id="7168109975831002660">Dimensiunea minimă a fontului</translation>
-<translation id="7070804685954057874">Introducere directă</translation>
+<translation id="7070804685954057874">Introducere directă de text</translation>
 <translation id="2631006050119455616">Modificări salvate</translation>
-<translation id="5175870427301879686"><ph name="URL"/> vrea să stocheze în mod permanent date pe computerul dvs. local.</translation>
+<translation id="5175870427301879686"><ph name="URL"/> vrea să stocheze permanent date pe computerul dvs. local.</translation>
 <translation id="6103681770816982672">Avertisment: comutați la canalul pentru dezvoltatori</translation>
 <translation id="3265459715026181080">Închideți fereastra</translation>
 <translation id="2756781634892530465">Activați XPS în Google Cloud Print</translation>
@@ -3406,12 +3425,12 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3578594933904494462">La conținutul acestei file se permite accesul.</translation>
 <translation id="295942452804818007">Afișați meniul de stare</translation>
 <translation id="4243835228168841140"><ph name="FULLSCREEN_ORIGIN"/> dorește să dezactiveze cursorul mouse-ului dvs.</translation>
-<translation id="1040471547130882189">Plug-in inactiv</translation>
+<translation id="1040471547130882189">Plugin inactiv</translation>
 <translation id="5473075389972733037">IBM</translation>
 <translation id="7807711621188256451">Permiteți întotdeauna accesul <ph name="HOST"/> la camera dvs.</translation>
 <translation id="7140928199327930795">Nu există alte dispozitive disponibile.</translation>
 <translation id="790025292736025802">Adresa <ph name="URL"/> nu a fost găsită</translation>
-<translation id="895347679606913382">Începem...</translation>
+<translation id="895347679606913382">Se începe...</translation>
 <translation id="3319048459796106952">Fereastră nouă &amp;incognito</translation>
 <translation id="656398493051028875">Se șterge „<ph name="FILENAME"/>”...</translation>
 <translation id="7517786267097410259">Creați o parolă –</translation>
@@ -3439,8 +3458,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5851868085455377790">Emitent</translation>
 <translation id="3549797760399244642">Accesați drive.google.com...</translation>
 <translation id="1704148620735921991">După instalare, această extensie ar putea folosi aceste privilegii pentru a influența negativ experiența de navigare. Sigur doriți să instalați această extensie?</translation>
-<translation id="1470719357688513792">Noile setări pentru modulele cookie se vor aplica după reîncărcarea paginii.</translation>
-<translation id="5578327870501192725">Conexiunea dvs. la <ph name="DOMAIN"/> este criptată cu criptarea de <ph name="BIT_COUNT"/> biți.</translation>
+<translation id="1470719357688513792">Noile setări pentru cookie-uri se vor aplica după reîncărcarea paginii.</translation>
+<translation id="5578327870501192725">Conexiunea la <ph name="DOMAIN"/> este criptată printr-o criptare pe <ph name="BIT_COUNT"/> biți.</translation>
 <translation id="699220179437400583">Raportează automat la Google detaliile eventualelor incidente privind securitatea</translation>
 <translation id="4336032328163998280">Operația de copiere nu a reușit. <ph name="ERROR_MESSAGE"/></translation>
 <translation id="351486934407749662">foarte lungă</translation>
@@ -3460,7 +3479,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
         Dacă acest dispozitiv nu aparține organizației, ci este dispozitivul dvs. personal, puteți să apăsați acum pe Ctrl+Alt+E pentru a anula înscrierea dispozitivului și a reveni la ecranul de conectare.</translation>
 <translation id="2890624088306605051">Preluați numai setările și datele sincronizate</translation>
 <translation id="5675225387922096989">Dezactivați caseta de dialog cu informații despre aplicație.</translation>
-<translation id="4779083564647765204">Măriți</translation>
+<translation id="4779083564647765204">Zoom</translation>
 <translation id="6397363302884558537">Opriți-vă din vorbit</translation>
 <translation id="6957703620025723294">Activați funcțiile experimentale ale obiectului Canvas.</translation>
 <translation id="8151185429379586178">Instrumente dezvoltator</translation>
@@ -3474,7 +3493,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2554553592469060349">Fișierul selectat este prea mare (dimensiune maximă: 3 MB).</translation>
 <translation id="3494444535872870968">Salvați &amp;cadrul ca...</translation>
 <translation id="5196716972587102051">2</translation>
-<translation id="2356070529366658676">Doresc să fiu întrebat(ă)</translation>
+<translation id="2356070529366658676">Întreabă-mă</translation>
 <translation id="5731247495086897348">In&amp;serați și accesați</translation>
 <translation id="6426993025560594914">Toate experimentele sunt disponibile pe platforma dvs.!</translation>
 <translation id="1834560242799653253">Orientare:</translation>
@@ -3489,16 +3508,16 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6874681241562738119">Eroare de conectare</translation>
 <translation id="5135533361271311778">Elementul de marcaj nu a putut fi creat.</translation>
 <translation id="4477219268485577442">Bulgară fonetică</translation>
-<translation id="5271247532544265821">Comutați între modurile de introducere chineză simplificată și chineză tradițională</translation>
-<translation id="2052610617971448509">Nu sunteți integrat corect în mediul de testare!</translation>
+<translation id="5271247532544265821">Comutați între modurile de introducere a textului în chineză simplificată și chineză tradițională</translation>
+<translation id="2052610617971448509">Mediul de testare securizat nu este integrat corect!</translation>
 <translation id="6417515091412812850">Nu se poate verifica dacă certificatul a fost revocat.</translation>
 <translation id="1403926504581035498">Activați SPDY/4</translation>
 <translation id="2809586584051668049">și încă <ph name="NUMBER_ADDITIONAL_DISABLED"/></translation>
 <translation id="7347702518873971555">Achiziționați un plan</translation>
-<translation id="5285267187067365830">Instalați plug-in-ul...</translation>
+<translation id="5285267187067365830">Instalați pluginul...</translation>
 <translation id="2680208403056680091">Conexiunea la internet este controlată</translation>
 <translation id="8662978096466608964">Chrome nu poate seta imaginea de fundal.</translation>
-<translation id="5334844597069022743">Afișați sursa</translation>
+<translation id="5334844597069022743">Vedeți sursa</translation>
 <translation id="5534520101572674276">Se calculează dimensiunea</translation>
 <translation id="9024127637873500333">&amp;Deschideți într-o filă nouă</translation>
 <translation id="1145509906569575332">Deschideți desktopul Ash</translation>
@@ -3511,7 +3530,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4270393598798225102">Versiunea <ph name="NUMBER"/></translation>
 <translation id="479536056609751218">Pagină web, numai HTML</translation>
 <translation id="8822808012507380471">Utilizarea combinată a memoriei private pentru toate procesele legate de <ph name="SHORT_PRODUCT_NAME"/></translation>
-<translation id="534916491091036097">Parant. stângă</translation>
+<translation id="534916491091036097">Parant. desch.</translation>
 <translation id="4157869833395312646">Criptografie Microsoft bazată pe server</translation>
 <translation id="5685236799358487266">Adău&amp;gați ca motor de căutare...</translation>
 <translation id="8903921497873541725">Măriți</translation>
@@ -3529,7 +3548,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1199232041627643649">Pentru a ieși, țineți apăsată tasta <ph name="KEY_EQUIVALENT"/>.</translation>
 <translation id="5428562714029661924">Ascundeți acest plugin</translation>
 <translation id="3777806571986431400">Extensie activată</translation>
-<translation id="2568774940984945469">Recipient bară de informații</translation>
+<translation id="2568774940984945469">Container bară de informații</translation>
 <translation id="8971063699422889582">Certificatul serverului a expirat.</translation>
 <translation id="3672681487849735243">A fost detectată o eroare de fabricație</translation>
 <translation id="5120068803556741301">Metodă de introducere a textului terță parte</translation>
@@ -3543,7 +3562,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5011233892417813670">Chromebook</translation>
 <translation id="4618518823426718711">Despre NaCl</translation>
 <translation id="3084771660770137092">Fie Chrome nu are suficientă memorie, fie procesarea paginii web a fost întreruptă dintr-un alt motiv. Pentru a continua, reîncărcați sau accesați altă pagină.</translation>
-<translation id="1114901192629963971">Parola dvs. nu poate fi confirmată în rețeaua curentă. Selectați o altă rețea.</translation>
+<translation id="1114901192629963971">Parola nu poate fi confirmată în rețeaua actuală. Selectați altă rețea.</translation>
 <translation id="6430814529589430811">ASCII codificat Base64, certificat unic</translation>
 <translation id="3305661444342691068">Deschideți PDF în Previzualizare</translation>
 <translation id="329650768420594634">Avertisment privind pachetul pentru extensie</translation>
@@ -3566,11 +3585,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5793220536715630615">C&amp;opiați adresa URL a videoclipului</translation>
 <translation id="523397668577733901">Doriți <ph name="BEGIN_LINK"/>să răsfoiți galeria<ph name="END_LINK"/>?</translation>
 <translation id="2922350208395188000">Certificatul serverului nu poate fi verificat.</translation>
-<translation id="3778740492972734840">&amp;Instrumente pentru dezvoltatori</translation>
+<translation id="3778740492972734840">Instrumente pentru &amp;dezvoltatori</translation>
 <translation id="8335971947739877923">Exportați...</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN"/> este acum în modul ecran complet și a dezactivat cursorul mouse-ului dvs.</translation>
 <translation id="38275787300541712">Apăsați pe Enter când ați terminat</translation>
-<translation id="6004539838376062211">&amp;Opțiuni verificator ortografic</translation>
+<translation id="6004539838376062211">Opțiuni &amp;verificator ortografic</translation>
 <translation id="7934393528562489945">Când vă conectați la un site web securizat, serverul care găzduiește site-ul respectiv prezintă browserului dvs. ceea ce numim un „certificat”, pentru a confirma identitatea acestuia. Certificatul conține informații privind identitatea, cum ar fi adresa site-ului web, acestea fiind confirmate de o terță parte în care dispozitivul are încredere. Verificând dacă adresa din certificat se potrivește cu adresa site-ului web, vă puteți asigura că dvs. comunicați în mod securizat cu site-ul web dorit, nu cu o terță parte (cum ar fi un atacator din rețea).</translation>
 <translation id="4058793769387728514">Verificați acum documentul</translation>
 <translation id="8101987792947961127">Este necesară lansarea Powerwash la următoarea repornire</translation>
@@ -3597,7 +3616,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1688000535217925742">Sugestie pentru parolă</translation>
 <translation id="2028997212275086731">Arhivă RAR</translation>
 <translation id="7627790789328695202">Hopa, <ph name="FILE_NAME"/> există deja. Redenumiți și încercați din nou.</translation>
-<translation id="7887334752153342268">Duplicați</translation>
+<translation id="7887334752153342268">Dublură</translation>
 <translation id="9207194316435230304">ATOK</translation>
 <translation id="7788668840732459509">Poziție:</translation>
 <translation id="8663099077749055505">Blocați întotdeauna descărcarea automată a mai multor fișiere pentru <ph name="HOST"/></translation>
@@ -3606,7 +3625,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3212792897911394068">Dezactivați versiunea experimentală a Extensiilor pentru conținut media criptat pentru elementele video și audio.</translation>
 <translation id="6199775032047436064">Reîncărcați pagina actuală</translation>
 <translation id="6981982820502123353">Accesibilitate</translation>
-<translation id="7210998213739223319">Nume utilizator.</translation>
+<translation id="7210998213739223319">Nume de utilizator.</translation>
 <translation id="4523336217659634227">A apărut o eroare (<ph name="ERROR"/>) la descărcarea pluginului.</translation>
 <translation id="4478664379124702289">Salvați lin&amp;kul ca...</translation>
 <translation id="8725066075913043281">Încercați din nou</translation>
@@ -3614,26 +3633,26 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8590375307970699841">Configurați actualizările automate</translation>
 <translation id="265390580714150011">Valoarea câmpului</translation>
 <translation id="3869917919960562512">Index greșit.</translation>
-<translation id="7031962166228839643">TPM este în curs de pregătire. Așteptați (aceasta poate dura câteva minute)...</translation>
+<translation id="7031962166228839643">Se pregătește TPM. Așteptați (poate dura câteva minute)...</translation>
 <translation id="769312636793844336">Pentru a salva acest fișier pentru utilizare offline, reveniți online și&lt;br&gt;bifați caseta de selectare <ph name="OFFLINE_CHECKBOX_NAME"/> corespunzătoare acestui fișier.</translation>
 <translation id="715118844758971915">Imprimante clasice</translation>
 <translation id="5242724311594467048">Activați extensia „<ph name="EXTENSION_NAME"/>”?</translation>
 <translation id="7877451762676714207">Eroare de server necunoscută. Încercați din nou sau contactați administratorul serverului.</translation>
 <translation id="5085162214018721575">Se caută actualizări</translation>
 <translation id="5264252276333215551">Conectați-vă la internet pentru a lansa aplicația în modul chioșc.</translation>
-<translation id="7180865173735832675">Personalizaţi</translation>
+<translation id="7180865173735832675">Personalizați</translation>
 <translation id="7054808953701320293">Am înțeles, nu mai afișa acest mesaj.</translation>
 <translation id="144932861331386147">Conectați-vă la internet pentru a vă actualiza Chromebookul.</translation>
 <translation id="2938685643439809023">Mongolă</translation>
-<translation id="5737306429639033676">Anticipează acțiunile rețelei pentru a îmbunătăți performanța de încărcare a paginii</translation>
+<translation id="5737306429639033676">Anticipează acțiunile în rețea pentru a îmbunătăți performanța de încărcare a paginii</translation>
 <translation id="4530494379350999373">Origine</translation>
-<translation id="2070909990982335904">Numele care încep cu punct sunt rezervate pentru sistem. Alegeți un alt nume.</translation>
+<translation id="2070909990982335904">Numele care încep cu punct sunt rezervate pentru sistem. Alegeți alt nume.</translation>
 <translation id="3707020109030358290">Nu este o Autoritate de certificare.</translation>
 <translation id="5293659407874396561"><ph name="SUBJECT"/> (<ph name="ISSUER"/>)</translation>
 <translation id="2115926821277323019">Trebuie să fie o adresă URL valabilă</translation>
 <translation id="3464726836683998962">Dezactivați roamingul de date mobile</translation>
 <translation id="5321676762462132688">Dacă este activat, Setările vor fi afișate într-o fereastră separată, și nu într-o filă a browserului.</translation>
-<translation id="8986494364107987395">Trimite automat statisticile de utilizare și rapoartele de avarie la Google</translation>
+<translation id="8986494364107987395">Trimite automat statisticile de utilizare și rapoartele de blocare la Google</translation>
 <translation id="2377619091472055321">Resetați setările <ph name="IDS_SHORT_PRODUCT_NAME"/> modificate</translation>
 <translation id="4062251648694601778">Bucurați-vă de dispozitivul dvs. <ph name="SHORT_PRODUCT_NAME"/>. Aveți întrebări? Puteți primi oricând ajutor dând clic pe „?” în bara de stare.</translation>
 <translation id="6701535245008341853">Profilul nu a putut fi preluat.</translation>
@@ -3670,15 +3689,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6374100501221763867">Dezactivați decodarea videoclipurilor cu accelerare hardware.</translation>
 <translation id="9101691533782776290">Lansați aplicația</translation>
 <translation id="4057896668975954729">Vedeți în magazin</translation>
-<translation id="7477347901712410606">Dacă ați uitat expresia dvs. de acces, opriți și resetați sincronizarea utilizând <ph name="BEGIN_LINK"/>Tabloul de bord Google<ph name="END_LINK"/>.</translation>
+<translation id="7477347901712410606">Dacă ați uitat expresia de acces, opriți și resetați sincronizarea utilizând <ph name="BEGIN_LINK"/>Tabloul de bord Google<ph name="END_LINK"/>.</translation>
 <translation id="4677772697204437347">Memorie GPU</translation>
 <translation id="3085235303151103497">Activați depanarea pentru aplicațiile din pachet.</translation>
-<translation id="2645575947416143543">Totuși, dacă lucrați într-o organizație care își generează propriile certificate și încercați să vă conectați la un site web intern al respectivei organizații utilizând un astfel de certificat, puteți rezolva această problemă în mod securizat. Puteți să importați certificatul rădăcină al organizației ca „certificat rădăcină”, iar apoi certificatele emise sau confirmate de organizația dvs. vor fi de încredere și nu veți mai vedea această eroare la următoarea încercare de a vă conecta la un site intern. Pentru asistență la adăugarea unui nou certificat rădăcină pe computer, contactați personalul de ajutor al organizației.</translation>
+<translation id="2645575947416143543">Totuși, dacă lucrați într-o organizație care își generează propriile certificate și încercați să vă conectați la un site intern al respectivei organizații utilizând un astfel de certificat, puteți rezolva această problemă securizat. Puteți să importați certificatul rădăcină al organizației ca „certificat rădăcină”, iar apoi certificatele emise sau confirmate de organizația dvs. vor fi de încredere și nu veți mai vedea această eroare la următoarea încercare de a vă conecta la un site intern. Pentru asistență la adăugarea unui nou certificat rădăcină pe computer, contactați personalul de ajutor al organizației.</translation>
 <translation id="2433728760128592593">Apăsați pe Alt + Shift pentru a comuta între metodele de introducere.</translation>
 <translation id="1056898198331236512">Avertisment</translation>
 <translation id="5934281776477898549">Nicio actualizare</translation>
 <translation id="537813040452600081">Paginile pe care le accesați în această fereastră nu vor apărea în istoricul browserului și nu vor lăsa alte urme pe computer (de ex., cookie-uri) după ce vă deconectați. Fișierele pe care le descărcați și marcajele pe care le creați nu se vor păstra.</translation>
-<translation id="2608770217409477136">Utilizați setările standard</translation>
+<translation id="2608770217409477136">Utilizați setările prestabilite</translation>
 <translation id="3157931365184549694">Restabiliți</translation>
 <translation id="996250603853062861">Se stabilește conexiunea securizată...</translation>
 <translation id="7529471622666797993"><ph name="BEGIN_LINK"/>Setări avansate pentru fonturi<ph name="END_LINK"/> (necesită o extensie)</translation>
@@ -3698,9 +3717,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="834106456999819211">Comanda se procesează</translation>
 <translation id="133014027510889724">Activați monitorizarea performanței</translation>
 <translation id="3627320433825461852">A mai rămas mai puțin de 1 minut</translation>
-<translation id="3031433885594348982">Conexiunea dvs. spre <ph name="DOMAIN"/> este criptată cu o criptare slabă.</translation>
+<translation id="3031433885594348982">Conexiunea dvs. la <ph name="DOMAIN"/> este criptată cu o criptare slabă.</translation>
 <translation id="8494662214792926846">Încărcați scriptul nesigur</translation>
-<translation id="4047345532928475040">Indisponibil</translation>
+<translation id="4047345532928475040">N/A</translation>
 <translation id="5604324414379907186">Afișați mereu bara de marcaje</translation>
 <translation id="3220630151624181591">Activați fila 2</translation>
 <translation id="249113932447298600">Ne pare rău, dispozitivul <ph name="DEVICE_LABEL"/> nu este acceptat în prezent.</translation>
@@ -3735,12 +3754,12 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6228691855869374890">Acest site are control complet asupra dispozitivelor MIDI.</translation>
 <translation id="5120421890733714118">Aveți încredere în acest certificat pentru identificarea site-urilor web.</translation>
 <translation id="166278006618318542">Algoritm cu cheie publică pentru subiect</translation>
-<translation id="5759272020525228995">Site-ul web a întâmpinat o eroare când a preluat <ph name="URL"/>.
+<translation id="5759272020525228995">Site-ul a întâmpinat o eroare când a preluat <ph name="URL"/>.
         Aceasta poate fi dezactivată pentru lucrări de întreținere sau poate fi configurată incorect.</translation>
 <translation id="4450472573074061292">Activați operațiile cu directoare pentru Syncfs.</translation>
 <translation id="2946119680249604491">Adăugați o conexiune</translation>
-<translation id="641480858134062906">Încărcarea adresei <ph name="URL"/> a eșuat</translation>
-<translation id="3693415264595406141">Parola:</translation>
+<translation id="641480858134062906">Adresa <ph name="URL"/> nu s-a încărcat</translation>
+<translation id="3693415264595406141">Parolă:</translation>
 <translation id="8671210955687109937">Poate face comentarii</translation>
 <translation id="2784949926578158345">Conexiunea a fost resetată.</translation>
 <translation id="6663792236418322902">Parola pe care o alegeți va fi solicitată ulterior pentru a restabili fișierul. Notați-o într-o locație sigură.</translation>
@@ -3753,7 +3772,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3412265149091626468">Accesați selecția</translation>
 <translation id="3764800135428056022">Oferă salvarea parolelor web.</translation>
 <translation id="5358016106459232452">Timpul necesar pentru a porni complet <ph name="SHORT_PRODUCT_NAME"/> într-un mediu de testare</translation>
-<translation id="7509179828847922845">Conexiunea la <ph name="HOST_NAME"/> a fost întreruptă.</translation>
+<translation id="7509179828847922845">Conexiunea la
+        <ph name="HOST_NAME"/>
+        a fost întreruptă.</translation>
 <translation id="2911372483530471524">Valori namespace PID</translation>
 <translation id="1833548837672884324">Configurați...</translation>
 <translation id="6030886059850316251">Doresc să mi se trimită un încărcător nou</translation>
@@ -3763,11 +3784,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8439506636278576865">Oferă-te să traduci paginile în această limbă</translation>
 <translation id="5189060859917252173">Certificatul „<ph name="CERTIFICATE_NAME"/>” reprezintă o Autoritate de certificare.</translation>
 <translation id="3785852283863272759">Trimiteți prin e-mail locația paginii</translation>
-<translation id="2255317897038918278">Plasarea marcajelor de timp Microsoft</translation>
+<translation id="2255317897038918278">Marcare temporală Microsoft</translation>
 <translation id="3493881266323043047">Validitate</translation>
-<translation id="5979421442488174909">&amp;Traduceți în <ph name="LANGUAGE"/></translation>
+<translation id="5979421442488174909">&amp;Tradu în <ph name="LANGUAGE"/></translation>
 <translation id="1503394326855300303">Acest cont de proprietar trebuie să fie primul conectat într-o sesiune de conectare multiplă.</translation>
-<translation id="2662876636500006917">Chrome Web Store</translation>
+<translation id="2662876636500006917">Magazinul web Chrome</translation>
 <translation id="676881925959847033">Dezactivați în mod prestabilit fereastra pop-up din bara de informații la accesarea identificatorului media protejat.</translation>
 <translation id="952992212772159698">Neactivat</translation>
 <translation id="443464694732789311">Continuați</translation>
@@ -3795,13 +3816,13 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8569682776816196752">Nu au fost găsite destinații</translation>
 <translation id="1618661679583408047">Certificatul de securitate al site-ului nu este încă valabil!</translation>
 <translation id="5396704340251753095">Activați compatibilitatea MTP în Managerul de fișiere.</translation>
-<translation id="7039912931802252762">Conectare Microsoft cu cartelă inteligentă</translation>
+<translation id="7039912931802252762">Conectare Microsoft cu card inteligent</translation>
 <translation id="5436430103864390185">Ferestrele cu formă personalizată nu sunt acceptate.</translation>
 <translation id="1529798832346767951">Încercați noul <ph name="BEGIN_LINK"/>Instrument pentru dezvoltatorii de aplicații și extensii Chrome<ph name="END_LINK"/>.</translation>
 <translation id="3915280005470252504">Căutare vocală</translation>
 <translation id="3752582316358263300">OK...</translation>
 <translation id="6224481128663248237">Formatarea a fost finalizată!</translation>
-<translation id="3065140616557457172">Tastați pentru a căuta sau introduceți o adresă URL pentru a naviga - orice variantă funcționează.</translation>
+<translation id="3065140616557457172">Tastați pentru a căuta sau introduceți o adresă URL pentru a naviga. Orice variantă funcționează.</translation>
 <translation id="3643454140968246241">Se sincronizează <ph name="COUNT"/> (de) fișiere...</translation>
 <translation id="5801379388827258083">Se descarcă dicționarul pentru verificarea ortografiei...</translation>
 <translation id="5509693895992845810">Salvați c&amp;a...</translation>
@@ -3820,7 +3841,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6787839852456839824">Comenzi rapide de la tastatură</translation>
 <translation id="1327297493974051953">Dezactivați întârzierea clicului.</translation>
 <translation id="6791443592650989371">Stare de activare:</translation>
-<translation id="4801257000660565496">Creați comenzi rapide pentru aplicații</translation>
+<translation id="4801257000660565496">Creați comenzi rapide pentru aplicație</translation>
 <translation id="8154790740888707867">Niciun fișier</translation>
 <translation id="2498826285048723189">Extensia „<ph name="EXTENSION_NAME"/>” a fost eliminată în mod automat.</translation>
 <translation id="6175314957787328458">GUID domeniu Microsoft</translation>
@@ -3830,7 +3851,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6422329785618833949">Fotografia a fost răsturnată</translation>
 <translation id="691321796646552019">Încetează!</translation>
 <translation id="8026964361287906498">(Gestionat de politica întreprinderii)</translation>
-<translation id="8261506727792406068">Ștergeţi</translation>
+<translation id="8261506727792406068">Ștergeți</translation>
 <translation id="7800518121066352902">Rotiți în sens &amp;invers acelor de ceasornic</translation>
 <translation id="345693547134384690">Deschideți &amp;imaginea într-o filă nouă</translation>
 <translation id="7422192691352527311">Preferințe...</translation>
@@ -3840,9 +3861,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3077195744811823826">Google Now pe desktop</translation>
 <translation id="354211537509721945">Actualizările sunt dezactivate de administrator</translation>
 <translation id="1375198122581997741">Despre versiune</translation>
-<translation id="642282551015776456">Acest nume nu poate fi utilizat ca nume de fișier sau de dosar</translation>
+<translation id="642282551015776456">Acest nume nu poate fi folosit ca nume de fișier sau de dosar</translation>
 <translation id="6915804003454593391">Utilizator:</translation>
-<translation id="7915471803647590281">Informați-ne despre ce se întâmplă înainte de a ne trimite feedbackul.</translation>
+<translation id="7915471803647590281">Informați-ne ce se întâmplă înainte de a trimite feedback.</translation>
 <translation id="5725124651280963564">Conectați-vă la <ph name="TOKEN_NAME"/> pentru a genera o cheie pentru <ph name="HOST_NAME"/>.</translation>
 <translation id="3206175707080061730">Un fișier numit „$1” există deja. Doriți să-l înlocuiți?</translation>
 <translation id="5976160379964388480">Altele</translation>
@@ -3853,13 +3874,13 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3665842570601375360">Securitate:</translation>
 <translation id="5699533844376998780">Extensia „<ph name="EXTENSION_NAME"/>” a fost adăugată.</translation>
 <translation id="1430915738399379752">Printați</translation>
-<translation id="7999087758969799248">Metoda de introducere standard</translation>
+<translation id="7999087758969799248">Metoda standard de introducere a textului</translation>
 <translation id="8958084571232797708">Utilizați o adresă URL de autoconfigurare</translation>
 <translation id="2635276683026132559">Semnare</translation>
 <translation id="4835836146030131423">Eroare la accesarea contului.</translation>
 <translation id="2475982808118771221">A apărut o eroare</translation>
 <translation id="3324684065575061611">(Dezactivat de politica întreprinderii)</translation>
-<translation id="7385854874724088939">A intervenit o eroare la imprimare. Verificați imprimanta și încercați din nou.</translation>
+<translation id="7385854874724088939">A apărut o eroare la printare. Verificați imprimanta și încercați din nou.</translation>
 <translation id="770015031906360009">Greacă</translation>
 <translation id="7455133967321480974">Utilizați setarea prestabilită la nivel global (Blocați)</translation>
 <translation id="8463215747450521436">Este posibil ca acest utilizator monitorizat să fi fost șters sau dezactivat de către administrator. Dacă doriți să vă conectați în continuare cu datele acestui utilizator monitorizat, contactați administratorul.</translation>
@@ -3903,7 +3924,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="940425055435005472">Dimensiune font:</translation>
 <translation id="494286511941020793">Ajutor de configurare pentru proxy</translation>
 <translation id="2765217105034171413">Mic</translation>
-<translation id="9154176715500758432">Rămâneți pe această pagină</translation>
+<translation id="9154176715500758432">Rămâneți pe pagină</translation>
 <translation id="7938594894617528435">Offline în prezent</translation>
 <translation id="6825883775269213504">Rusă</translation>
 <translation id="9150045010208374699">Utilizează camera foto</translation>
@@ -3911,8 +3932,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6898440773573063262">Acum, aplicațiile de tip chioșc pot fi configurate pentru a se lansa automat pe acest dispozitiv.</translation>
 <translation id="1813278315230285598">Servicii</translation>
 <translation id="88986195241502842">O pagină mai jos</translation>
-<translation id="6860097299815761905">Setările proxy...</translation>
-<translation id="3672159315667503033"><ph name="URL"/> vrea să stocheze în mod permanent un volum mare de date pe computerul dvs. local.</translation>
+<translation id="6860097299815761905">Setări proxy...</translation>
+<translation id="3672159315667503033"><ph name="URL"/> dorește să stocheze permanent cantități mari de date pe computerul local.</translation>
 <translation id="373572798843615002">O filă</translation>
 <translation id="4806065163318322702">Comutați introducerea prin vorbire</translation>
 <translation id="6190185222845843088">Utilizați serverele mediului de testare securizat Wallet</translation>
@@ -3938,7 +3959,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6970856801391541997">Printați anumite pagini</translation>
 <translation id="7828106701649804503">Specificați lățimea prestabilită a panourilor.</translation>
 <translation id="2440604414813129000">Vedeți s&amp;ursa</translation>
-<translation id="816095449251911490"><ph name="SPEED"/> - <ph name="RECEIVED_AMOUNT"/>, <ph name="TIME_REMAINING"/></translation>
+<translation id="816095449251911490"><ph name="SPEED"/>  <ph name="RECEIVED_AMOUNT"/>, <ph name="TIME_REMAINING"/></translation>
 <translation id="1084300930170237385">Informații transparență</translation>
 <translation id="774465434535803574">Eroare privind pachetul pentru extensie</translation>
 <translation id="8200772114523450471">Reluați</translation>
@@ -3951,7 +3972,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1029595648591494741">Încercați „<ph name="EXTENSION_NAME"/>”?</translation>
 <translation id="5423849171846380976">Activat</translation>
 <translation id="4080955692611561961">Dezactivați Google Wallet</translation>
-<translation id="7077872827894353012">Programe de gestionare a protocoalelor ignorate</translation>
+<translation id="7077872827894353012">Handlere de protocol ignorate</translation>
 <translation id="3158564748719736353">Dacă este activat, notificarea este afișată când dispozitivul este conectat la o rețea din spatele unui portal captiv.</translation>
 <translation id="5397794290049113714">Dvs.</translation>
 <translation id="40620511550370010">Introduceți parola</translation>
@@ -3967,18 +3988,19 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6460601847208524483">Găsiți următorul</translation>
 <translation id="397703832102027365">Se finalizează...</translation>
 <translation id="8146177459103116374">Dacă v-ați înregistrat deja pe acest dispozitiv, puteți să vă <ph name="LINK2_START"/>conectați ca utilizator existent<ph name="LINK2_END"/>.</translation>
-<translation id="4856478137399998590">Serviciul dvs. de date mobile este activat și gata de utilizare</translation>
+<translation id="5072836811783999860">Vezi marcajele gestionate</translation>
+<translation id="4856478137399998590">Serviciul de date mobile este activat și gata de utilizare</translation>
 <translation id="3305389145870741612">Procesul de formatare poate dura câteva secunde. Așteptați.</translation>
 <translation id="3648607100222897006">Aceste funcții experimentale pot oricând să se schimbe, să nu mai funcționeze sau să dispară. Nu oferim absolut nicio garanție cu privire la efectele activării acestor experimente. Se poate chiar ca browserul dvs. să sufere o combustie spontană. Lăsând gluma la o parte, browserul dvs. poate să vă șteargă toate datele sau securitatea și confidențialitatea datelor se pot compromite într-un mod neașteptat. Toate experimentele pe care le activați vor fi activate pentru toți utilizatorii acestui browser. Continuați cu prudență.</translation>
-<translation id="3937640725563832867">Nume alternativ al emitentului certificatului</translation>
+<translation id="3937640725563832867">Nume alternativ al emitentului de certificat</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1"/> <ph name="SENTENCE2"/></translation>
 <translation id="1163931534039071049">&amp;Vedeți sursa cadrului</translation>
-<translation id="8770196827482281187">Metoda de introducere pentru persană (dispunere ISIRI 2901)</translation>
+<translation id="8770196827482281187">Metoda de introducere a textului în persană (aspect ISIRI 2901)</translation>
 <translation id="6423239382391657905">OpenVPN</translation>
 <translation id="5642953011762033339">Deconectați contul</translation>
 <translation id="7564847347806291057">Opriți procesul</translation>
 <translation id="7847212883280406910">Apăsați combinația Ctrl + Alt + S pentru a comuta la <ph name="IDS_SHORT_PRODUCT_OS_NAME"/></translation>
-<translation id="1607220950420093847">Este posibil să vi se fi șters sau dezactivat contul. Deconectați-vă.</translation>
+<translation id="1607220950420093847">Contul dvs. a fost probabil șters sau dezactivat. Deconectați-vă.</translation>
 <translation id="5613695965848159202">Identitate anonimă:</translation>
 <translation id="4331990704689932958"><ph name="PRODUCT_NAME"/> se actualizează automat, astfel încât să aveți întotdeauna cea mai recentă versiune.</translation>
 <translation id="5159383109919732130"><ph name="BEGIN_BOLD"/>Nu scoateți încă dispozitivul!<ph name="END_BOLD"/>
@@ -3997,11 +4019,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8260864402787962391">Mouse</translation>
 <translation id="1775135663370355363">Se afișează istoricul de pe dispozitiv. <ph name="BEGIN_LINK"/>Aflați mai multe<ph name="END_LINK"/></translation>
 <translation id="8276560076771292512">Goliți memoria cache și reîncărcați forțat</translation>
-<translation id="9076523132036239772">Adresa de e-mail sau parola dvs. nu au putut fi confirmate. Încercați să vă conectați mai întâi la o rețea.</translation>
+<translation id="9076523132036239772">Din păcate, adresa de e-mail sau parola nu au putut fi verificate. Încercați să vă conectați mai întâi la o rețea.</translation>
 <translation id="4260442535208228602">Adăugați în Lansatorul de aplicații</translation>
 <translation id="6965978654500191972">Dispozitiv</translation>
 <translation id="5295309862264981122">Confirmați navigarea</translation>
-<translation id="718827667662449283">Regatul Unit (United Kingdom)</translation>
+<translation id="718827667662449283">Regatul Unit</translation>
 <translation id="358796204584394954">Pentru a conecta, introduceți acest cod pe „<ph name="DEVICE_NAME"/>”:</translation>
 <translation id="6102988872254107946">Chiar dacă ați accesat anterior acest site, acum nu este sigur. Navigarea sigură Google <ph name="BEGIN_LINK"/>a detectat recent programe malware<ph name="END_LINK"/> pe <ph name="SITE"/>. Site-urile care sunt de obicei sigure sunt uneori infectate cu programe malware.</translation>
 <translation id="2908999529399859069">Anulați</translation>
@@ -4023,7 +4045,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1104054824888299003">lungă</translation>
 <translation id="637062427944097960">Acest fișier a fost deschis pe alt desktop. Pentru a-l vedea, treceți la <ph name="USER_NAME"/> (<ph name="MAIL_ADDRESS"/>).</translation>
 <translation id="7479479221494776793">Dacă nu faceți nimic, veți fi deconectat(ă) în <ph name="LOGOUT_TIME_LEFT"/>.</translation>
-<translation id="1465619815762735808">Faceți clic pentru redare</translation>
+<translation id="1465619815762735808">Dați clic pentru redare</translation>
 <translation id="6941937518557314510">Conectați-vă pe <ph name="TOKEN_NAME"/> pentru a vă autentifica pe <ph name="HOST_NAME"/> cu certificatul dvs.</translation>
 <translation id="5850516540536751549">Acest tip de fișier nu este acceptat. Accesați <ph name="BEGIN_LINK"/>Magazinul web Chrome<ph name="END_LINK"/> pentru a găsi o aplicație care poate deschide acest tip de fișier.
     <ph name="BEGIN_LINK_HELP"/>Aflați mai multe<ph name="END_LINK_HELP"/></translation>
@@ -4035,15 +4057,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 
   Doriți să porniți <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="9027603907212475920">Configurați sincronizarea...</translation>
-<translation id="6873213799448839504">Furnizați automat un șir</translation>
-<translation id="7238585580608191973">Amprentă SHA-256</translation>
+<translation id="6873213799448839504">Trimiteți automat un șir</translation>
+<translation id="7238585580608191973">Amprentă digitală SHA-256</translation>
 <translation id="2501278716633472235">Înapoi</translation>
 <translation id="3588662957555259973">* fotografie de profil Google</translation>
-<translation id="131461803491198646">Rețea de domiciliu, fără roaming</translation>
+<translation id="131461803491198646">Rețeaua de domiciliu, nu de roaming</translation>
 <translation id="7377249249140280793"><ph name="RELATIVE_DATE"/> - <ph name="FULL_DATE"/></translation>
-<translation id="1285320974508926690">Nu doresc să se traducă niciodată acest site</translation>
+<translation id="1285320974508926690">Nu traduce niciodată acest site</translation>
 <translation id="3613422051106148727">&amp;Deschideți într-o filă nouă</translation>
-<translation id="8954894007019320973">(Cont.)</translation>
+<translation id="8954894007019320973">(Continuare)</translation>
 <translation id="4441124369922430666">Doriți ca această aplicație să fie lansată automat la pornirea dispozitivului?</translation>
 <translation id="3748412725338508953">Au fost prea multe redirecționări.</translation>
 <translation id="7741303706372017829">Nu doresc să înlocuiesc încărcătorul rechemat de pe piață</translation>
@@ -4053,7 +4075,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3758760622021964394">Această pagină dorește să dezactiveze cursorul mouse-ului dvs.</translation>
 <translation id="8341840687457896278">Această extensie nu a putut furniza datele de conectare pentru o solicitare din rețea, deoarece o altă extensie (<ph name="EXTENSION_NAME"/>) a furnizat alte date de conectare.</translation>
 <translation id="5627523580512561598">extensie <ph name="EXTENSION_NAME"/></translation>
-<translation id="8831104962952173133">A fost detectată o tentativă de phishing!</translation>
+<translation id="8831104962952173133">Phishing detectat!</translation>
 <translation id="5633230395929474992">Activați sau dezactivați ChromeVox (feedback rostit)</translation>
 <translation id="4106164762195622179">Paginile pe care le accesați în filele incognito nu vor fi înregistrate în istoricul browserului, nu vor stoca cookie-uri și nu vor rămâne în istoricul de căutare după ce închideți <ph name="BEGIN_BOLD"/>toate<ph name="END_BOLD"/> filele incognito. Fișierele descărcate și marcajele create vor fi păstrate.</translation>
 <translation id="1209796539517632982">Servere de nume automate</translation>
@@ -4061,11 +4083,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8392451568018454956">Meniu cu opțiuni pentru <ph name="USER_EMAIL_ADDRESS"/></translation>
 <translation id="6452181791372256707">Respingeți</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE"/> (Incognito)</translation>
-<translation id="6681668084120808868">Faceți o fotografie</translation>
+<translation id="6681668084120808868">Fotografiați</translation>
 <translation id="1368265273904755308">Semnalați o problemă</translation>
 <translation id="780301667611848630">Nu, mulțumesc</translation>
 <translation id="8209677645716428427">Un utilizator monitorizat poate naviga pe web sub îndrumarea dvs. În calitate de manager al unui utilizator monitorizat în Chrome, puteți să:</translation>
-<translation id="2812989263793994277">Nu afișați nicio imagine</translation>
+<translation id="2812989263793994277">Nu afișa nicio imagine</translation>
 <translation id="722363467515709460">Activați lupa de ecran</translation>
 <translation id="7190251665563814471">Permiteți întotdeauna aceste pluginuri pe <ph name="HOST"/></translation>
 <translation id="2043684166640445160"><ph name="PRODUCT_NAME"/>
@@ -4084,7 +4106,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8925458182817574960">&amp;Setări</translation>
 <translation id="6361850914223837199">Detalii eroare:</translation>
 <translation id="8948393169621400698">Permiteți întotdeauna pluginuri pe <ph name="HOST"/></translation>
-<translation id="6527303717912515753">Distribuiți</translation>
+<translation id="6527303717912515753">Trimiteți</translation>
 <translation id="8211154138148153396">Notificări privind descoperirea dispozitivelor în rețeaua locală.</translation>
 <translation id="3893536212201235195">Citește și modifică setările de accesibilitate</translation>
 <translation id="5039512255859636053">$1 TB</translation>
@@ -4099,9 +4121,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4436068767502531396">Momentan, Google Drive nu a putut sincroniza „<ph name="FILENAME"/>”. Încercați din nou mai târziu.</translation>
 <translation id="7225179976675429563">Lipsește tipul de rețea</translation>
 <translation id="5436492226391861498">Se așteaptă tunelul proxy...</translation>
-<translation id="3803991353670408298">Adăugați o altă metodă de introducere înainte de a o elimina pe aceasta.</translation>
+<translation id="3803991353670408298">Adăugați altă metodă de introducere a textului, înainte de a o elimina pe aceasta.</translation>
 <translation id="4209267054566995313">Nu a fost detectat un mouse sau un touchpad.</translation>
-<translation id="3369521687965833290">Extensia nu poate fi dezarhivată. Pentru a dezarhiva extensia în siguranță, trebuie să existe o cale către directorul dvs. de profiluri care să înceapă cu o literă de unitate și care să nu conțină o joncțiune, un punct de montare sau un link simbolic. Pentru profilul dvs. nu există nicio astfel de cale.</translation>
+<translation id="3369521687965833290">Nu se poate despacheta extensia. Pentru a despacheta în siguranță o extensie, trebuie să existe o cale către directorul dvs. de profil, care începe cu o literă de unitate și nu conține o joncțiune, un punct de montare, sau un link simbolic. Nu există o astfel de cale pentru profilul dvs.</translation>
 <translation id="337920581046691015"><ph name="PRODUCT_NAME"/> va fi instalat.</translation>
 <translation id="5636996382092289526">Pentru a utiliza <ph name="NETWORK_ID"/> ar putea fi necesar să <ph name="LINK_START"/>accesați mai întâi pagina de conectare a rețelei<ph name="LINK_END"/>, care se va deschide automat în câteva secunde. Dacă acest lucru nu se întâmplă, rețeaua nu poate fi utilizată.</translation>
 <translation id="8579896762084163417">Dezactivați clientul nativ portabil.</translation>
@@ -4115,31 +4137,31 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="641105183165925463">$1 MB</translation>
 <translation id="4533259260976001693">Restrângeți/Extindeți</translation>
 <translation id="7867718029373300695">Activați/Dezactivați funcția HUD pentru proiecție tactilă</translation>
-<translation id="6391538222494443604">Trebuie să existe un director de introducere.</translation>
+<translation id="6391538222494443604">Directorul de intrare trebuie să existe.</translation>
 <translation id="7088615885725309056">Mai vechi</translation>
 <translation id="8962198349065195967">Această rețea este configurată de către administrator.</translation>
 <translation id="357479282490346887">Lituaniană</translation>
-<translation id="2143778271340628265">Configurare manuală a serverului proxy</translation>
+<translation id="2143778271340628265">Configurare proxy manuală</translation>
 <translation id="440150639010863291">Utilizați Google Wallet</translation>
 <translation id="8888432776533519951">Culoare:</translation>
-<translation id="5294529402252479912">Actualizați acum Adobe Reader</translation>
+<translation id="5294529402252479912">Actualizați Adobe Reader acum</translation>
 <translation id="641087317769093025">Extensia nu a putut fi dezarhivată</translation>
 <translation id="7461850476009326849">Dezactivați pluginuri individuale...</translation>
 <translation id="2231990265377706070">Semnul exclamării</translation>
 <translation id="7199540622786492483"><ph name="PRODUCT_NAME"/> este neactualizat, deoarece nu a fost repornit în ultimul timp. O actualizare este disponibilă și se va aplica după repornire.</translation>
 <translation id="2171101176734966184">Ați încercat să accesați <ph name="DOMAIN"/>, dar serverul a furnizat un certificat semnat utilizând un algoritm de semnare slab. Aceasta însemnă că este posibil ca acreditările de securitate furnizate de server să fie falsificate, iar serverul să nu fie cel așteptat (este posibil să comunicați cu un atacator).</translation>
-<translation id="3726527440140411893">Când ați afișat această pagină au fost setate următoarele module cookie:</translation>
+<translation id="3726527440140411893">Când ați afișat această pagină au fost setate următoarele cookie-uri:</translation>
 <translation id="6989763994942163495">Afișați setările avansate...</translation>
 <translation id="3320859581025497771">operatorul dvs.</translation>
 <translation id="2233502537820838181">&amp;Mai multe informații</translation>
 <translation id="7691122742290396436">Folosește noul player audio experimental în locul celui în versiune stabilă.</translation>
-<translation id="8562413501751825163">Închideți Firefox înainte de a face importul</translation>
+<translation id="8562413501751825163">Închideți Firefox înainte de a importa</translation>
 <translation id="8686213429977032554">La acest fișier din Drive nu s-a permis încă accesul</translation>
 <translation id="2448046586580826824">Proxy HTTP securizat</translation>
-<translation id="4032534284272647190">Accesul la <ph name="URL"/> a fost refuzat.</translation>
+<translation id="4032534284272647190">Accesul la <ph name="URL"/> nu este permis.</translation>
 <translation id="5958529069007801266">Utilizator monitorizat</translation>
 <translation id="3129173833825111527">Margine la stânga</translation>
-<translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/> KO (<ph name="NUM_KILOBYTES_LIVE"/> KO live)</translation>
+<translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/> KB (<ph name="NUM_KILOBYTES_LIVE"/> KB live)</translation>
 <translation id="5554573843028719904">Altă rețea Wi-Fi...</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED"/>, <ph name="TIME_LEFT"/></translation>
 <translation id="7013485839273047434">Descărcați mai multe extensii</translation>
@@ -4148,7 +4170,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7709152031285164251">Nu a reușit – <ph name="INTERRUPT_REASON"/></translation>
 <translation id="3838486795898716504">Mai multe <ph name="PAGE_TITLE"/></translation>
 <translation id="7003339318920871147">Baze de date web</translation>
-<translation id="8885905466771744233">Există deja o cheie privată pentru extensia specificată. Reutilizați cheia sau mai întâi ștergeți-o.</translation>
+<translation id="8885905466771744233">Există deja o cheie privată pentru extensia specificată. Reutilizați-o sau ștergeți-o mai întâi.</translation>
 <translation id="7583419135027754249">Trimite întotdeauna evenimente de clic după o atingere, chiar și atunci când aceasta face parte dintr-un gest de atingere dublă. Opțiunea accelerează navigarea și alte acțiuni declanșate prin atingere cu 300 ms în majoritatea paginilor, dar presupune să evitați linkurile și butoanele când atingeți de două ori pentru a mări sau micșora.</translation>
 <translation id="4100843820583867709">Solicitare de permitere a accesului la ecranul Google Talk</translation>
 <translation id="2406941037785138796">Dezactivări</translation>
@@ -4162,14 +4184,14 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4761104368405085019">Utilizează microfonul</translation>
 <translation id="4287167099933143704">Introduceți cheia de deblocare a codului PIN</translation>
 <translation id="3936418843437416078">Instalări</translation>
-<translation id="3129140854689651517">Găsiți text</translation>
+<translation id="3129140854689651517">Găsiți un text</translation>
 <translation id="2473195200299095979">Traduceți această pagină</translation>
-<translation id="5558129378926964177">&amp;Măriți</translation>
+<translation id="5558129378926964177">Măr&amp;iți</translation>
 <translation id="7667447388810597359">Activați elementul de lansare 2</translation>
 <translation id="3549761410225185768">Încă <ph name="NUM_TABS_MORE"/>...</translation>
 <translation id="7108668606237948702">enter</translation>
 <translation id="3087329981864897625">Dacă este activat, firele de rasterizare scriu direct în memoria GPU asociată sectoarelor.</translation>
-<translation id="6451458296329894277">Confirmați retrimitere formular</translation>
+<translation id="6451458296329894277">Confirmați retrimiterea formularului</translation>
 <translation id="4326952458285403282">Dezactivează utilizarea sistemului experimental DirectWrite de afișare a fonturilor.</translation>
 <translation id="2576842806987913196">Există deja un fișier CRX cu acest nume.</translation>
 <translation id="7015226785571892184">Dacă acceptați această solicitare, va fi lansată următoarea aplicație: <ph name="APPLICATION"/></translation>
@@ -4179,11 +4201,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4009293373538135798">Închideri incorecte</translation>
 <translation id="7017219178341817193">Adăugați o pagină nouă</translation>
 <translation id="1038168778161626396">Numai cifrare</translation>
-<translation id="8765985713192161328">Gestionați programele asociate...</translation>
-<translation id="7179921470347911571">Reporniți acum</translation>
-<translation id="9065203028668620118">Modificare</translation>
+<translation id="8765985713192161328">Gestionați handlerele...</translation>
+<translation id="7179921470347911571">Relansați acum</translation>
+<translation id="9065203028668620118">Editați</translation>
 <translation id="2251218783371366160">Deschideți cu Utilitarul de vizualizare al sistemului</translation>
-<translation id="1177863135347784049">Personalizat</translation>
+<translation id="1177863135347784049">Personalizați</translation>
 <translation id="4881695831933465202">Deschideți</translation>
 <translation id="3968103409306279789">Dacă pagina Filă nouă din stilul nou este activată sau nu.</translation>
 <translation id="6225378837831321064"><ph name="DEVICE_NAME"/>: se conectează...</translation>
@@ -4195,12 +4217,12 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="7293654927214385623">Activează QUIC utilizând un canal criptat autentificat (poate să înlocuiască tranzacțiile HTTPS). Fără acest marcaj, numai solicitările HTTP sunt acceptate prin QUIC. Această acțiune are efect numai dacă este activat protocolul QUIC.</translation>
 <translation id="8435379444928791035">Cookie-urile și alte date privind site-urile și pluginurile sunt șterse când mă deconectez</translation>
 <translation id="6723661294526996303">Importați marcajele și setările...</translation>
-<translation id="1782924894173027610">Serverul de sincronizare este ocupat. Încercați din nou mai târziu.</translation>
+<translation id="1782924894173027610">Serverul de sincronizare este ocupat, încercați din nou mai târziu.</translation>
 <translation id="6512448926095770873">Părăsiți această pagină</translation>
 <translation id="2867768963760577682">Deschideți ca filă fixată</translation>
 <translation id="8631032106121706562">Petale</translation>
 <translation id="1639239467298939599">Se încarcă</translation>
-<translation id="5457599981699367932">Răsfoiți în calitate de invitat</translation>
+<translation id="5457599981699367932">Navigați ca invitat</translation>
 <translation id="8525428584879632762">Activat în paginile cu rezultate de căutare sau când se introduce text</translation>
 <translation id="2487656424763972284">Deblocare ușoară</translation>
 <translation id="7047998246166230966">Cursor</translation>
@@ -4208,10 +4230,10 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3252266817569339921">Franceză</translation>
 <translation id="2665717534925640469">Această pagină este acum pe ecran complet și a dezactivat cursorul mouse-ului.</translation>
 <translation id="3414952576877147120">Dimensiune:</translation>
-<translation id="7009102566764819240">Mai jos puteți găsi o listă cu toate elementele nesigure ale paginii. Faceți clic pe linkul Diagnostic pentru a obține informații suplimentare cu privire la firul de execuție al programului malware pentru o anumită resursă. Dacă știți că o resursă a fost raportată în mod incorect ca practicând phishingul, faceți clic pe linkul „Raportați eroarea”.</translation>
+<translation id="7009102566764819240">Mai jos puteți găsi o listă cu toate elementele nesigure ale paginii. Dați clic pe linkul Diagnostic pentru a obține informații suplimentare cu privire la firul de execuție al programului malware pentru o anumită resursă. Dacă știți că o resursă a fost raportată în mod incorect ca practicând phishingul, dați clic pe linkul „Raportați eroarea”.</translation>
 <translation id="3592260987370335752">&amp;Aflați mai multe</translation>
 <translation id="3631337165634322335">Excepțiile de mai jos se aplică numai sesiunii actuale incognito.</translation>
-<translation id="676327646545845024">Doresc să nu se mai afișeze niciodată caseta de dialog pentru linkurile de acest tip.</translation>
+<translation id="676327646545845024">Nu afișați din nou caseta de dialog pentru linkurile de acest tip.</translation>
 <translation id="1485146213770915382">Inserați <ph name="SEARCH_TERMS_LITERAL"/> în adresa URL unde ar trebui să apară termenii de căutare.</translation>
 <translation id="8141725884565838206">Gestionați parolele</translation>
 <translation id="4839303808932127586">Sal&amp;vați videoclipul ca...</translation>
@@ -4222,29 +4244,29 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8616352574453019203">Modulul folosit în comun, cu ID-ul „<ph name="IMPORT_ID"/>”, nu poate fi importat, deoarece nu apare în lista albă.</translation>
 <translation id="5626134646977739690">Nume:</translation>
 <translation id="4899837262951879307">Mod de derulare tactilă.</translation>
-<translation id="5854409662653665676">În cazul în care întâmpinați probleme frecvente, puteți încerca următoarele soluții pentru a rezolva problema cu acest modul:</translation>
+<translation id="5854409662653665676">Dacă vă confruntați cu probleme frecvente, ați putea încerca următoarele pentru a rezolva problema cu acest modul:</translation>
 <translation id="3776796446459804932">Această extensie încalcă politica Magazinului web Chrome.</translation>
 <translation id="3681007416295224113">Informații despre certificat</translation>
 <translation id="3046084099139788433">Activați fila 7</translation>
 <translation id="8230421197304563332">Atacatorii de pe <ph name="BEGIN_BOLD"/><ph name="SITE"/><ph name="END_BOLD"/> pot încerca să instaleze programe periculoase pe computerul dvs., care să vă fure sau să vă șteargă informațiile (de exemplu, fotografiile, parolele, mesajele sau informațiile despre cardurile de credit).</translation>
 <translation id="189358972401248634">Alte limbi</translation>
-<translation id="721197778055552897"><ph name="BEGIN_LINK"/>Aflați mai multe<ph name="END_LINK"/> despre această problemă</translation>
+<translation id="721197778055552897"><ph name="BEGIN_LINK"/>Aflați mai multe<ph name="END_LINK"/> despre această problemă.</translation>
 <translation id="1699395855685456105">Versiune hardware:</translation>
 <translation id="4699172675775169585">Imaginile și fișierele memorate în cache</translation>
 <translation id="6680028776254050810">Comutați la alt utilizator</translation>
 <translation id="2908789530129661844">Micșorează ecranul</translation>
-<translation id="212464871579942993">Site-ul web de la <ph name="HOST_NAME"/> conține elemente de pe site-uri care par a găzdui programe malware (software care poate dăuna computerului sau care poate funcționa fără consimțământul dvs.). Computerul poate fi infectat prin simpla accesare a unui site care găzduiește programe malware. Site-ul web găzduiește, de asemenea, conținut de pe site-uri care au fost raportate ca fiind site-uri de „phishing”. Site-urile care practică phishingul îi înșală pe utilizatori pentru ca aceștia să dezvăluie informații personale sau financiare, adesea însușindu-și identitatea unor instituții de încredere, precum băncile.</translation>
+<translation id="212464871579942993">Site-ul de la <ph name="HOST_NAME"/> conține elemente de pe site-uri care par a găzdui programe malware (software care poate dăuna computerului sau care poate funcționa fără consimțământul dvs.). Computerul poate fi infectat prin simpla accesare a unui site care găzduiește programe malware. Site-ul găzduiește, de asemenea, conținut de pe site-uri care au fost raportate ca fiind site-uri de „phishing”. Site-urile care practică phishingul îi înșală pe utilizatori pentru ca aceștia să dezvăluie informații personale sau financiare, adesea însușindu-și identitatea unor instituții de încredere, precum băncile.</translation>
 <translation id="2673135533890720193">Citește istoricul de navigare</translation>
 <translation id="6860427144121307915">Deschideți într-o filă</translation>
 <translation id="887692350334376364">Excepții pentru dispozitivele media</translation>
 <translation id="8156020606310233796">Vizualizare listă</translation>
-<translation id="146000042969587795">Acest cadru a fost blocat, deoarece are și conținut nesigur.</translation>
-<translation id="3258924582848461629">Metoda de introducere cu scriere de mână pentru japoneză</translation>
+<translation id="146000042969587795">Acest cadru a fost blocat, deoarece are conținut nesigur.</translation>
+<translation id="3258924582848461629">Metoda de introducere a textului cu scriere de mână în japoneză</translation>
 <translation id="8426564434439698958">&amp;Căutați imaginea cu <ph name="SEARCH_ENGINE"/></translation>
 <translation id="4375035964737468845">Deschide fișierele descărcate</translation>
 <translation id="3968739731834770921">Kana</translation>
 <translation id="7387829944233909572">Caseta de dialog „Ștergeți datele de navigare”</translation>
-<translation id="8023801379949507775">Actualizați extensiile imediat</translation>
+<translation id="8023801379949507775">Actualizați extensiile acum</translation>
 <translation id="5963453369025043595"><ph name="NUM_HANDLES"/> (maximum <ph name="NUM_KILOBYTES_LIVE"/>)</translation>
 <translation id="2524800364695118482">Permisiunile aplicației:</translation>
 <translation id="6782622603507084740">Activați API-ul EmbeddedSearch</translation>
@@ -4253,8 +4275,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2202898655984161076">A apărut o problemă la listarea imprimantelor. Este posibil ca unele dintre imprimantele dvs. să nu fi fost înregistrate la <ph name="CLOUD_PRINT_NAME"/>.</translation>
 <translation id="6154697846084421647">Conectat în prezent</translation>
 <translation id="1454188386658974462">Reintroducând parola veți putea să vă conectați când sunteți offline.</translation>
-<translation id="8241707690549784388">Pagina pe care o căutați a utilizat informațiile pe care le-ați introdus. Întoarcerea la acea pagină ar putea duce la repetarea oricărei acțiuni pe care ați realizat-o. Doriți să continuați?</translation>
-<translation id="5359419173856026110">Afișează rata de redare curentă a unei pagini, în cadre pe secundă, atunci când accelerarea hardware este activă.</translation>
+<translation id="8241707690549784388">Pagina pe care o căutați a utilizat informațiile pe care le-ați introdus. Întoarcerea la acea pagină ar putea face ca orice acțiune pe care ați efectuat-o să fie repetată. Doriți să continuați?</translation>
+<translation id="5359419173856026110">Afișează frecvența actuală de cadre a unei pagini, în cadre pe secundă, atunci când este activă accelerarea hardware.</translation>
 <translation id="3462200631372590220">Ascundeți detaliile avansate</translation>
 <translation id="4104163789986725820">E&amp;xportați...</translation>
 <translation id="9022026332614591902">Ferestre pop-up blocate (<ph name="POP_UP_COUNT"/>)</translation>
@@ -4274,7 +4296,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2587203970400270934">Cod operator:</translation>
 <translation id="3355936511340229503">Eroare de conexiune</translation>
 <translation id="736108944194701898">Viteză mouse:</translation>
-<translation id="4350711002179453268">Imposibil de realizat o conexiune sigură la server. Poate fi vorba de o problemă a serverului sau poate fi necesar un certificat de autentificare a clientului pe care nu-l aveți.</translation>
+<translation id="4350711002179453268">Nu se poate realiza o conexiune sigură la server. Poate fi vorba de o problemă a serverului sau poate fi necesar un certificat de autentificare a clientului pe care nu-l aveți.</translation>
 <translation id="750509436279396091">Deschideți dosarul de descărcări</translation>
 <translation id="5963026469094486319">Descărcați teme</translation>
 <translation id="7586312264284919041">Doriți traducerea acestei pagini?</translation>
@@ -4297,33 +4319,33 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4543778593405494224">Manager de certificate</translation>
 <translation id="8116972784401310538">&amp;Manager de marcaje</translation>
 <translation id="3737514536860147030">Aflați mai multe despre navigarea incognito</translation>
-<translation id="621638399744152264"><ph name="VALUE"/> %</translation>
+<translation id="621638399744152264"><ph name="VALUE"/>%</translation>
 <translation id="3082520371031013475">Setări pentru touchpad și mouse</translation>
-<translation id="4927301649992043040">Creați un pachet pentru extensie</translation>
+<translation id="4927301649992043040">Împachetați extensia</translation>
 <translation id="5939518447894949180">Resetați</translation>
 <translation id="8679658258416378906">Activați fila 5</translation>
-<translation id="9049835026521739061">Mod Litere coreene</translation>
-<translation id="4763816722366148126">Selectați metoda anterioară de introducere a datelor</translation>
+<translation id="9049835026521739061">Mod Hangul</translation>
+<translation id="4763816722366148126">Selectați metoda anterioară de introducere a textului</translation>
 <translation id="6458308652667395253">Gestionați blocarea JavaScript...</translation>
 <translation id="8435334418765210033">Rețele memorate</translation>
 <translation id="512608082539554821">Dacă este activat, tranzițiile din timpul tutorialului redat la prima rulare sunt animate.</translation>
 <translation id="8632275030377321303">Setările de proxy nu pot fi modificate de utilizator.</translation>
 <translation id="6449285849137521213">Aplicația „<ph name="EXTENSION_NAME"/>” a fost adăugată.</translation>
-<translation id="6516193643535292276">Nu se poate realiza conexiunea la internet</translation>
+<translation id="6516193643535292276">Nu se poate conecta la internet</translation>
 <translation id="5125751979347152379">Adresă URL nevalidă.</translation>
 <translation id="9045796838688435193">Linkurile <ph name="PROTOCOL"/> în loc de <ph name="REPLACED_HANDLER_TITLE"/></translation>
 <translation id="4467801982834340084">Identitatea companiei <ph name="ORGANIZATION"/> din <ph name="LOCALITY"/> a fost verificată de <ph name="ISSUER"/>, dar nu are înregistrări de auditare publică.</translation>
 <translation id="8206354486702514201">Această setare este impusă de administratorul dvs.</translation>
 <translation id="6040143037577758943">Închideți</translation>
-<translation id="5787146423283493983">Acord cheie</translation>
-<translation id="4265682251887479829">Nu găsiți ce căutați?</translation>
+<translation id="5787146423283493983">Acord privind cheia</translation>
+<translation id="4265682251887479829">Nu găsiți ceea ce căutați?</translation>
 <translation id="216169395504480358">Adăugați o rețea Wi-Fi...</translation>
-<translation id="1804251416207250805">Dezactivați trimiterea de comenzi ping de verificare a hyperlinkurilor.</translation>
+<translation id="1804251416207250805">Dezactivează trimiterea de comenzi ping de verificare a hyperlinkurilor.</translation>
 <translation id="5116628073786783676">Sal&amp;vați conținutul audio ca...</translation>
 <translation id="6172346010137455972">Totul este în regulă.</translation>
 <translation id="9166510596677678112">Trimiteți un e-mail acestei persoane</translation>
 <translation id="2557899542277210112">Pentru acces rapid, plasați marcajele aici, în bara de marcaje.</translation>
-<translation id="2749881179542288782">Doresc verificarea gramaticală și ortografică</translation>
+<translation id="2749881179542288782">Verificare gramaticală și ortografică</translation>
 <translation id="5105855035535475848">Fixați file</translation>
 <translation id="5707604204219538797">Cuvântul următor</translation>
 <translation id="5896465938181668686">Opriți pluginul</translation>
@@ -4351,16 +4373,16 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="8140778357236808512">Importați un utilizator monitorizat existent</translation>
 <translation id="6953992620120116713">HTTPS prin protocolul experimental QUIC.</translation>
 <translation id="8737260648576902897">Instalați Adobe Reader</translation>
-<translation id="7876243839304621966">Eliminați-le pe toate</translation>
+<translation id="7876243839304621966">Eliminați tot</translation>
 <translation id="5663459693447872156">Comutați automat la lățimea pe jumătate</translation>
 <translation id="8900820606136623064">Maghiară</translation>
 <translation id="495931528404527476">În Chrome</translation>
 <translation id="4593021220803146968">&amp;Accesați <ph name="URL"/></translation>
-<translation id="1128987120443782698">Dispozitivul de stocare are o capacitate de <ph name="DEVICE_CAPACITY"/>. Introduceți un card SD sau un stick de memorie USB cu o capacitate de minimum 4 GO.</translation>
+<translation id="1128987120443782698">Dispozitivul de stocare are o capacitate de <ph name="DEVICE_CAPACITY"/>. Introduceți un card SD sau un stick de memorie USB cu o capacitate de minimum 4 GB.</translation>
 <translation id="869257642790614972">Redeschideți ultima filă închisă</translation>
-<translation id="3978267865113951599">(Închis cu eroare)</translation>
+<translation id="3978267865113951599">(Blocată)</translation>
 <translation id="1049926623896334335">Document Word</translation>
-<translation id="8412145213513410671">Opriri cu eroare (<ph name="CRASH_COUNT"/>)</translation>
+<translation id="8412145213513410671">Blocări (<ph name="CRASH_COUNT"/>)</translation>
 <translation id="7003257528951459794">Frecvență:</translation>
 <translation id="1248269069727746712"><ph name="PRODUCT_NAME"/> utilizează setările proxy de sistem ale dispozitivului pentru a se conecta la rețea.</translation>
 <translation id="3467267818798281173">Solicitați sugestii de la Google</translation>
@@ -4379,8 +4401,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5129662217315786329">Poloneză</translation>
 <translation id="8513974249124254369">ChromeVox (feedbackul rostit) este activat. Apăsați pe Ctrl+Alt+Z pentru dezactivare.</translation>
 <translation id="117624967391683467">Se copiază <ph name="FILE_NAME"/>...</translation>
-<translation id="3095995014811312755">versiunea</translation>
-<translation id="7052500709156631672">Serverul gateway sau proxy a primit un răspuns nevalid de la un server ascendent.</translation>
+<translation id="3095995014811312755">versiune</translation>
+<translation id="7052500709156631672">Serverul gateway sau proxy a primit un răspuns nevalid de la un server ierarhic superior.</translation>
 <translation id="281133045296806353">În sesiunea de browser existentă a fost creată o fereastră nouă.</translation>
 <translation id="3605780360466892872">Om de afaceri</translation>
 <translation id="4709423352780499397">Date stocate local</translation>
@@ -4396,7 +4418,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="9086302186042011942">Se sincronizează</translation>
 <translation id="6869402422344886127">Casetă de validare bifată</translation>
 <translation id="3428010780253032925">Dezactivați identificarea bazată pe dreptunghiuri în vizualizări</translation>
-<translation id="5637380810526272785">Metodă de introducere</translation>
+<translation id="5637380810526272785">Metoda de introducere a textului</translation>
+<translation id="3613134908380545408">Vezi <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">A fost necesar să se încerce din nou realizarea conexiunii, utilizând o versiune mai veche a protocolului TSL sau SSL. În mod obișnuit, acest lucru înseamnă că serverul utilizează un software foarte vechi și că poate avea și alte probleme de securitate.</translation>
 <translation id="404928562651467259">AVERTISMENT</translation>
 <translation id="4289300219472526559">Începeți să vorbiți</translation>
@@ -4405,7 +4428,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="497490572025913070">Marginile stratului compus afișat</translation>
 <translation id="4712556365486669579">Recuperați programul malware?</translation>
 <translation id="9002707937526687073">P&amp;rintați...</translation>
-<translation id="3851140433852960970">Niciun plugin disponibil pentru a afișa acest conținut.</translation>
+<translation id="3851140433852960970">Nu există niciun plugin disponibil pentru afișarea acestui conținut.</translation>
 <translation id="6583070985841601920">Sunteți conectat(ă) ca <ph name="USER_EMAIL_ADDRESS"/>. Sincronizarea este dezactivată de administrator.</translation>
 <translation id="8942416694471994740">Accesul la microfon este controlat de administratorul dvs.</translation>
 <translation id="5556459405103347317">Reîncărcați</translation>
@@ -4426,7 +4449,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1227507814927581609">Autentificarea nu a reușit în timpul conectării la „<ph name="DEVICE_NAME"/>”.</translation>
 <translation id="7136694880210472378">Setați ca prestabilit</translation>
 <translation id="3274763671541996799">Ați intrat în modul ecran complet.</translation>
-<translation id="7681202901521675750">Cartela SIM este blocată, introduceți codul PIN. Încercări rămase: <ph name="TRIES_COUNT"/></translation>
+<translation id="7681202901521675750">Cardul SIM este blocat, introduceți codul PIN. Încercări rămase: <ph name="TRIES_COUNT"/></translation>
 <translation id="2489918096470125693">Adăugați un &amp;dosar...</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME"/> necesită permisiuni noi</translation>
 <translation id="5582414689677315220">Dacă dați clic pe Continuați, sunteți de acord cu <ph name="LEGAL_DOC_LINK_TEXT_1"/>, <ph name="LEGAL_DOC_LINK_TEXT_2"/> și <ph name="LEGAL_DOC_LINK_TEXT_3"/>.</translation>
@@ -4436,10 +4459,10 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1731346223650886555">Punct și virgulă</translation>
 <translation id="4450974146388585462">Diagnosticați</translation>
 <translation id="7339763383339757376">PKCS #7, certificat unic</translation>
-<translation id="7587108133605326224">Baltică</translation>
+<translation id="7587108133605326224">Baltic</translation>
 <translation id="3340978935015468852">setări</translation>
 <translation id="3581912141526548234">Impunere (se încearcă obținerea codurilor hash și se impun dacă acțiunea reușește)</translation>
-<translation id="3991936620356087075">Ați introdus cheia incorectă de deblocare a codului PIN de prea multe ori. Cartela SIM este definitiv dezactivată.</translation>
+<translation id="3991936620356087075">Ați introdus incorect codul PIN de deblocare de prea multe ori. Cardul SIM este dezactivat definitiv.</translation>
 <translation id="6757994640088602342">Experiment privind avertismentul de programe malware</translation>
 <translation id="5367091008316207019">Se citește fișierul...</translation>
 <translation id="936801553271523408">Date de diagnosticare a sistemului</translation>
@@ -4449,7 +4472,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="186612162884103683">Extensia „<ph name="EXTENSION"/>” poate citi și scrie imagini, videoclipuri și fișiere audio în locațiile indicate.</translation>
 <translation id="3021678814754966447">&amp;Vedeți sursa cadrului</translation>
 <translation id="8601206103050338563">Autentificare client TLS WWW</translation>
-<translation id="1692799361700686467">Se permit module cookie de la mai multe site-uri.</translation>
+<translation id="1692799361700686467">Se permit cookie-uri de la mai multe site-uri.</translation>
 <translation id="7945967575565699145">Protocol experimental QUIC.</translation>
 <translation id="5187295959347858724">Acum sunteți conectat(ă) la <ph name="SHORT_PRODUCT_NAME"/>. Marcajele dvs., istoricul și alte setări sunt sincronizate cu Contul dvs. Google.</translation>
 <translation id="2421956571193030337">Folosiți această funcție numai cu conturile de încredere.</translation>
@@ -4462,7 +4485,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4784330909746505604">Prezentare PowerPoint</translation>
 <translation id="4345587454538109430">Configurați...</translation>
 <translation id="3255228561559750854">Căutați sau rostiți „Ok Google”</translation>
-<translation id="8148264977957212129">Metoda de introducere pentru Pinyin</translation>
+<translation id="8148264977957212129">Metoda de introducere a textului Pinyin</translation>
 <translation id="2288278176040912387">Picup</translation>
 <translation id="7772032839648071052">Confirmați expresia de acces</translation>
 <translation id="3676582787770338561">Activați Deblocarea ușoară pentru acest <ph name="DEVICE_TYPE"/>.</translation>
@@ -4472,7 +4495,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6509122719576673235">Norvegiană</translation>
 <translation id="7673697353781729403">Ore</translation>
 <translation id="7372527722222052179">Activați rasterizerul copie zero</translation>
-<translation id="6929555043669117778">Continuați blocarea ferestrelor de tip pop-up</translation>
+<translation id="6929555043669117778">Continuați blocarea ferestrelor pop-up</translation>
 <translation id="3508920295779105875">Alegeți alt dosar...</translation>
 <translation id="2159915644201199628">Imaginea nu a putut fi decodificată: „<ph name="IMAGE_NAME"/>”</translation>
 <translation id="904451693890288097">Introduceți codul PIN pentru „<ph name="DEVICE_NAME"/>&quot;:</translation>
@@ -4487,7 +4510,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3296763833017966289">Georgiană</translation>
 <translation id="2242687258748107519">Informații fișier</translation>
 <translation id="1152775729948968688">Totuși, această pagină include alte resurse care nu sunt securizate. Aceste resurse sunt vizibile pentru alți utilizatori în cursul transferului și pot fi modificate de un atacator pentru a schimba comportamentul paginii.</translation>
-<translation id="604124094241169006">Automată</translation>
+<translation id="604124094241169006">Automat</translation>
 <translation id="862542460444371744">&amp;Extensii</translation>
 <translation id="6807906590218483700">Ați încercat să accesați <ph name="DOMAIN"/>, dar ați accesat de fapt un server care se identifică drept <ph name="DOMAIN2"/>. Acest lucru poate fi cauzat de o eroare de configurare de pe server sau poate fi ceva mai serios. Un atacator din rețeaua dvs. poate încerca să vă determine să accesați o versiune falsă (și potențial dăunătoare) a <ph name="DOMAIN3"/>.</translation>
 <translation id="2539110682392681234">Setările serverului proxy sunt aplicate de administrator.</translation>
@@ -4515,7 +4538,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2616111483551232963">Am observat că ați comandat un încărcător de schimb.</translation>
 <translation id="1693754753824026215">Pagina de la <ph name="SITE"/> afișează mesajul:</translation>
 <translation id="1495486559005647033">Încă <ph name="NUM_PRINTERS"/> dispozitive disponibile.</translation>
-<translation id="7148804936871729015">Serverul pentru<ph name="URL"/> a răspuns prea târziu. Este posibil să fie supraîncărcat.</translation>
+<translation id="7148804936871729015">Serverul pentru <ph name="URL"/> a răspuns prea târziu. Este posibil să fie supraîncărcat.</translation>
 <translation id="3082780749197361769">Această filă utilizează camera foto sau microfonul dvs.</translation>
 <translation id="7278870042769914968">Utilizați tema GTK+</translation>
 <translation id="4501530680793980440">Confirmați eliminarea</translation>
@@ -4529,8 +4552,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6904344821472985372">Revocați accesul la fișiere</translation>
 <translation id="8678648549315280022">Gestionați setările pentru descărcare...</translation>
 <translation id="1290223615328246825">Conectarea automată nu a reușit</translation>
-<translation id="5550431144454300634">Doresc să se corecteze automat datele introduse</translation>
-<translation id="3308006649705061278">Unitate organizatorică (OU)</translation>
+<translation id="5550431144454300634">Corectați automat textul introdus</translation>
+<translation id="3308006649705061278">Unitate organizațională (OU)</translation>
 <translation id="4839847978919684242"><ph name="SELCTED_FILES_COUNT"/> (de) elemente selectate</translation>
 <translation id="4443536555189480885">&amp;Ajutor</translation>
 <translation id="5067867186035333991">Întreabă dacă <ph name="HOST"/> solicită acces la microfon</translation>
@@ -4550,7 +4573,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2649911884196340328">Certificatul de securitate al serverului are erori!</translation>
 <translation id="1698647588772720278">Dezactivați Extensiile pentru conținut media criptat cu prefix.</translation>
 <translation id="2286454467119466181">Simplă</translation>
-<translation id="6666647326143344290">utilizând Contul Google</translation>
+<translation id="6666647326143344290">cu Contul dvs. Google</translation>
 <translation id="4564097437843356814">A apărut o problemă legată de contul dvs. Google Wallet.</translation>
 <translation id="4547992677060857254">Dosarul pe care l-ați selectat conține fișiere cu informații delicate. Sigur doriți să permiteți accesul de scriere permanent pentru „$1” la acest dosar?</translation>
 <translation id="4980112683975062744">S-au primit anteturi duplicat de la server</translation>
@@ -4562,15 +4585,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3163460631729938959">Vedeți permisiunile</translation>
 <translation id="169515659049020177">Shift</translation>
 <translation id="3551117997325569860">Pentru a modifica proxy-ul, activați setarea „<ph name="USE_SHARED_PROXIES"/>”.</translation>
-<translation id="8906421963862390172">&amp;Opțiunile verificatorului ortografic</translation>
+<translation id="8906421963862390172">&amp;Opțiuni verificator ortografic</translation>
 <translation id="193971656137910869">Citește și modifică marcajele dvs.</translation>
 <translation id="6268747994388690914">Importați marcaje dintr-un fișier HTML...</translation>
 <translation id="6096047740730590436">Deschideți aplicația maximizată</translation>
 <translation id="3924145049010392604">Meta</translation>
-<translation id="5365539031341696497">Metoda de introducere pentru thai (tastatură Kesmanee)</translation>
+<translation id="5365539031341696497">Metoda de introducere a textului în thai (tastatură Kesmanee)</translation>
 <translation id="5157635116769074044">Fixați această pagină pe ecranul de pornire...</translation>
 <translation id="2403091441537561402">Gateway:</translation>
-<translation id="668171684555832681">Altul...</translation>
+<translation id="668171684555832681">Altele...</translation>
 <translation id="7540972813190816353">A avut loc o eroare la verificarea existenței unor actualizări: <ph name="ERROR"/></translation>
 <translation id="7029415434450801489">Plasează un buton de căutare în caseta polivalentă.</translation>
 <translation id="7664620655576155379">Dispozitiv Bluetooth neacceptat: „<ph name="DEVICE_NAME"/>”.</translation>
@@ -4597,7 +4620,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="751288520640551775">Creați un utilizator</translation>
 <translation id="6262654738522632143">Cu sincronizarea în fundal a instrumentului ServiceWorker, funcțiile ServiceWorkers pot trimite mesaje și pot actualiza resursele chiar și când pagina este în fundal.</translation>
 <translation id="8698171900303917290">Probleme cu instalarea?</translation>
-<translation id="2440443888409942524">Metoda de introducere Pinyin (pentru tastatura S.U.A. Dvorak)</translation>
+<translation id="2440443888409942524">Metoda de introducere a textului Pinyin (pentru tastatura S.U.A. Dvorak)</translation>
 <translation id="830868413617744215">Beta</translation>
 <translation id="2501797496290880632">Tastați o comandă rapidă</translation>
 <translation id="388542564839923133">SHA-512</translation>
@@ -4616,11 +4639,11 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5521010850848859697">Server 2</translation>
 <translation id="9053020327624825007">Acest dispozitiv a fost asociat pentru gestionarea în companie de <ph name="MANAGEMENT_DOMAIN"/>.</translation>
 <translation id="6769712124046837540">Se adaugă imprimanta...</translation>
-<translation id="2552545117464357659">Mai no</translation>
+<translation id="2552545117464357659">Mai noi</translation>
 <translation id="7269802741830436641">Această pagină web are o buclă de redirecționare</translation>
 <translation id="4180788401304023883">Ștergeți certificatul CA „<ph name="CERTIFICATE_NAME"/>”?</translation>
 <translation id="5869522115854928033">Parole salvate</translation>
-<translation id="2089090684895656482">Mai puțin</translation>
+<translation id="2089090684895656482">Mai puține</translation>
 <translation id="6656103420185847513">Modificați dosarul</translation>
 <translation id="4918241738772068049">Acțiune necesară pentru conectare</translation>
 <translation id="1949433054743893124">Trecerea în modul incognito nu ascunde activitatea dvs. de navigare față de angajator, de furnizorul de servicii de internet sau de site-urile pe care le accesați.</translation>
@@ -4630,9 +4653,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="5509914365760201064">Emitent: <ph name="CERTIFICATE_AUTHORITY"/></translation>
 <translation id="4941246025622441835">Utilizați această solicitare pentru dispozitiv la înscrierea dispozitivului pentru gestionarea la nivel de întreprindere:</translation>
 <translation id="5449588825071916739">Marcați toate filele</translation>
-<translation id="7073385929680664879">Treceți prin metodele de introducere</translation>
+<translation id="7073385929680664879">Treceți prin metodele de introducere a textului</translation>
 <translation id="7842062217214609161">Nicio comandă rapidă</translation>
-<translation id="6898699227549475383">Organizație (O)</translation>
+<translation id="6898699227549475383">Organizația (O)</translation>
 <translation id="4333854382783149454">PKCS #1 SHA-1 cu criptare RSA</translation>
 <translation id="3050713738637020986">Chiar dacă, în trecut, ați accesat în siguranță acest site web, dacă îl accesați acum, este foarte probabil să vă infectați computerul Mac cu programe malware.</translation>
 <translation id="8615618338313291042">Aplicație incognito: <ph name="APP_NAME"/></translation>
@@ -4648,7 +4671,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1543152709146436555">Dezactivați reglarea atingerii.</translation>
 <translation id="2394296868155622118">Gestionați detaliile de facturare...</translation>
 <translation id="1327074568633507428">Imprimantă în Google Cloud Print</translation>
-<translation id="4631110328717267096">Actualizarea sistemului a eșuat.</translation>
+<translation id="4631110328717267096">Actualizarea sistemului nu a reușit.</translation>
 <translation id="3695919544155087829">Introduceți parola care a fost utilizată pentru a cripta acest fișier certificat.</translation>
 <translation id="2230051135190148440">CHAP</translation>
 <translation id="2509857212037838238">Instalați <ph name="PLUGIN_NAME"/></translation>
@@ -4656,16 +4679,16 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="3790146417033334899"><ph name="PLUGIN_NAME"/> funcționează doar pe desktop.</translation>
 <translation id="5117930984404104619">Monitorizarea comportamentului altor extensii, inclusiv al adreselor URL accesate</translation>
 <translation id="33022249435934718">Ghidaje GDI</translation>
-<translation id="6308937455967653460">Salvați lin&amp;k-ul ca...</translation>
+<translation id="6308937455967653460">Salvați lin&amp;kul ca...</translation>
 <translation id="741689768643916402">Din păcate, Google Wallet poate fi utilizat la acest comerciant numai de cumpărătorii care au o adresă în S.U.A. Dacă sunteți rezident S.U.A., |modificați adresa domiciliului în Google Wallet| sau plătiți fără să utilizați Google Wallet.</translation>
-<translation id="5828633471261496623">În curs de printare...</translation>
+<translation id="5828633471261496623">Se printează...</translation>
 <translation id="2420698750843121542">Activați Extensiile pentru conținut media criptat pentru elementele video și audio. Această opțiune activează cea mai recentă versiune a Extensiilor pentru conținut media criptat.</translation>
 <translation id="5421136146218899937">Ștergeți datele de navigare...</translation>
 <translation id="5441100684135434593">Rețea cu fir</translation>
 <translation id="3285322247471302225">Filă &amp;nouă</translation>
 <translation id="3943582379552582368">&amp;Înapoi</translation>
 <translation id="1519264250979466059">Dată versiune:</translation>
-<translation id="7607002721634913082">Oprită temporar</translation>
+<translation id="7607002721634913082">Întreruptă</translation>
 <translation id="7928710562641958568">Scoateți dispozitivul</translation>
 <translation id="8729518820755801792">Chrome nu desc. URL.</translation>
 <translation id="480990236307250886">Deschideți pagina de pornire</translation>
@@ -4711,14 +4734,14 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="4189406272289638749">O extensie, &lt;b&gt;<ph name="EXTENSION_NAME"/>&lt;/b&gt;, controlează această setare.</translation>
 <translation id="803771048473350947">Fișier</translation>
 <translation id="6206311232642889873">Cop&amp;iați imaginea</translation>
-<translation id="5158983316805876233">Utilizați același server proxy pentru toate protocoalele.</translation>
+<translation id="5158983316805876233">Utilizați același server proxy pentru toate protocoalele</translation>
 <translation id="7108338896283013870">Ascundeți</translation>
 <translation id="3366404380928138336">Solicitare de protocol extern</translation>
 <translation id="5300589172476337783">Afișați</translation>
 <translation id="3160041952246459240">Aveți stocate certificate care identifică aceste servere:</translation>
 <translation id="5806573568064269889">Confirm că folosesc un încărcător care are un abțibild verde pe el.</translation>
 <translation id="566920818739465183">Ați accesat prima dată acest site pe <ph name="VISIT_DATE"/>.</translation>
-<translation id="2961695502793809356">Clic pentru a merge înainte, țineți apăsat pentru a vedea istoricul</translation>
+<translation id="2961695502793809356">Dați clic pentru a naviga înainte, țineți apăsat pentru a vedea istoricul</translation>
 <translation id="4092878864607680421">Cea mai recentă versiune a aplicației „<ph name="APP_NAME"/>” necesită permisiuni suplimentare, astfel că a fost dezactivată.</translation>
 <translation id="5828228029189342317">Ați ales să deschideți automat anumite tipuri de fișiere după descărcare.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
@@ -4728,14 +4751,15 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="6934265752871836553">Folosește cod de ultimă generație pentru a face Chrome să deseneze conținutul mai rapid. Este foarte posibil ca modificările
         din spatele acestei metode să deterioreze conținutul în mare măsură.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Deschide întotdeauna în Adobe Reader</translation>
 <translation id="8274359292107649245">Deschideți Chrome pe desktop</translation>
 <translation id="1571119610742640910">Compunere pentru fundaluri cu elemente rădăcină fixe.</translation>
 <translation id="6514565641373682518">Această pagină a dezactivat cursorul mouse-ului dvs.</translation>
-<translation id="5308689395849655368">Raportarea opririlor cu eroare este dezactivată.</translation>
+<translation id="5308689395849655368">Raportarea blocărilor este dezactivată.</translation>
 <translation id="7592362899630581445">Certificatul serverului încalcă limitările privind numele.</translation>
 <translation id="9003647077635673607">Permiteți pe toate site-urile</translation>
 <translation id="6837930996380214191">Permisiuni actuale</translation>
-<translation id="8689341121182997459">Expiră:</translation>
+<translation id="8689341121182997459">Expiră în:</translation>
 <translation id="899403249577094719">Adresă URL de bază pentru certificat Netscape</translation>
 <translation id="2737363922397526254">Restrângeți...</translation>
 <translation id="8605428685123651449">Memorie SQLite</translation>
@@ -4779,7 +4803,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="988159990683914416">Versiune de programare</translation>
 <translation id="1097658378307015415">Înainte de a vă conecta, începeți o sesiune pentru invitați pentru activarea rețelei <ph name="NETWORK_ID"/></translation>
 <translation id="5170477580121653719">Spațiu disponibil pe Disc Google: <ph name="SPACE_AVAILABLE"/>.</translation>
-<translation id="4114470632216071239">Blocați cartela SIM (este necesar un cod PIN pentru a utiliza datele mobile)</translation>
+<translation id="4114470632216071239">Blocați cardul SIM (este necesar un cod PIN pentru a utiliza datele mobile)</translation>
 <translation id="6581162200855843583">Link Disc Google</translation>
 <translation id="5783221160790377646">Din cauza unei erori, nu a fost creat un utilizator monitorizat. Încercați din nou mai târziu.</translation>
 <translation id="340771324714262530">Opriți oglindirea</translation>
@@ -4804,9 +4828,9 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="1952456732281820252">Adăugați comanda rapidă?</translation>
 <translation id="2470702053775288986">Extensiile necompatibile au fost dezactivate</translation>
 <translation id="5461512418490148136">Rămâneți cu noi, vă preluăm fișierele.</translation>
-<translation id="4268574628540273656">Adresa URL:</translation>
+<translation id="4268574628540273656">Adresă URL:</translation>
 <translation id="2766585356456507052">Identitatea companiei <ph name="ORGANIZATION"/> din <ph name="LOCALITY"/> a fost verificată de <ph name="ISSUER"/>, pretinde că are înregistrări de auditare publică, dar înregistrările nu pot fi verificate.</translation>
-<translation id="7481312909269577407">Redirecționați</translation>
+<translation id="7481312909269577407">Înainte</translation>
 <translation id="5972826969634861500">Porniți <ph name="PRODUCT_NAME"/></translation>
 <translation id="8056430285089645882">Am înțeles, nu mai afișa acest mesaj.</translation>
 <translation id="383652340667548381">Sârbă</translation>
@@ -4816,7 +4840,7 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="815491593104042026">Hopa! Autentificarea nu a reușit, deoarece era configurată să folosească o adresă URL nesecurizată (<ph name="BLOCKED_URL"/>). Contactați administratorul.</translation>
 <translation id="5852112051279473187">Hopa! A apărut o eroare gravă la înregistrarea dispozitivului. Încercați din nou sau contactați reprezentantul de asistență.</translation>
 <translation id="7547449991467640000">Reîncărcați ap&amp;licația</translation>
-<translation id="6894066781028910720">Deschideţi Managerul de fişiere</translation>
+<translation id="6894066781028910720">Deschideți Managerul de fișiere</translation>
 <translation id="7943837619101191061">Adăugați o locație...</translation>
 <translation id="1936717151811561466">Finlandeză</translation>
 <translation id="7088418943933034707">Gestionați certificatele...</translation>
@@ -4825,8 +4849,8 @@ Asigurați-vă că nu expuneți informații confidențiale.</translation>
 <translation id="2453576648990281505">Fișierul există deja</translation>
 <translation id="6972929256216826630">Permiteți tuturor site-urilor să descarce automat mai multe fișiere</translation>
 <translation id="3127589841327267804">PYJJ</translation>
-<translation id="3668823961463113931">Programe asociate</translation>
-<translation id="8808478386290700967">Web Store</translation>
+<translation id="3668823961463113931">Handlere</translation>
+<translation id="8808478386290700967">Magazin web</translation>
 <translation id="1732215134274276513">Anulați fixarea filelor</translation>
 <translation id="4785040501822872973">Acest computer se va reseta în <ph name="LOGOUT_TIME_LEFT"/> (de) secunde.
 Apăsați pe orice tastă pentru a continua explorarea.</translation>
@@ -4838,9 +4862,9 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="2603463522847370204">Deschideți într-o &amp;fereastră incognito</translation>
 <translation id="2951236788251446349">Meduză</translation>
 <translation id="1035094536595558507">Vizualizare slide-uri</translation>
-<translation id="4381091992796011497">Nume utilizator:</translation>
+<translation id="4381091992796011497">Nume de utilizator:</translation>
 <translation id="5830720307094128296">Salvați pagina c&amp;a...</translation>
-<translation id="2448312741937722512">Tip</translation>
+<translation id="2448312741937722512">Tipul</translation>
 <translation id="2568958845983666692">Kiloocteți</translation>
 <translation id="5209320130288484488">Nu s-a găsit niciun dispozitiv</translation>
 <translation id="473221644739519769">Dacă adăugați imprimantele dvs. la Google Cloud Print, puteți printa de
@@ -4860,7 +4884,7 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="1580652505892042215">Context</translation>
 <translation id="3942974664341190312">2 Set</translation>
 <translation id="8477241577829954800">Depășit</translation>
-<translation id="6735304988756581115">Afișați module cookie și alte date privind site-ul...</translation>
+<translation id="6735304988756581115">Afișați cookie-uri și alte date privind site-ul...</translation>
 <translation id="5996258716334177896">Profilul dvs. nu a putut fi deschis corect. Este posibil ca unele funcții să nu fie disponibile. Verificați dacă profilul există și dacă aveți permisiunea de scriere și de citire a conținutului său.</translation>
 <translation id="7040138676081995583">Deschideți cu...</translation>
 <translation id="7953739707111622108">Acest dispozitiv nu poate fi deschis deoarece sistemul său de fișiere nu a fost recunoscut.</translation>
@@ -4897,14 +4921,14 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="4124987746317609294">Interval de timp</translation>
 <translation id="1981905533439890161">Confirmați noua aplicație</translation>
 <translation id="7717014941119698257">Se descarcă: <ph name="STATUS"/></translation>
-<translation id="2785530881066938471">Fișierul „<ph name="RELATIVE_PATH"/>” nu a putut fi încărcat pentru scriptul de conținut. Fișierul nu are codificare UTF-8.</translation>
+<translation id="2785530881066938471">Nu se poate încărca fișierul „<ph name="RELATIVE_PATH"/>” pentru scriptul de conținut. Fișierul nu are codificare UTF-8.</translation>
 <translation id="8744525654891896746">Selectați un avatar pentru utilizatorul monitorizat</translation>
 <translation id="3807747707162121253">&amp;Anulați</translation>
 <translation id="202352106777823113">Descărcarea a durat prea mult și a fost oprită de rețea.</translation>
 <translation id="6155817405098385604">Nu se apelează la un software de rasterizare 3D când nu poate fi utilizat GPU.</translation>
 <translation id="3306897190788753224">Dezactivați temporar personalizarea conversiei, sugestiile bazate pe istoric și dicționarul utilizatorului</translation>
 <translation id="8941882480823041320">Cuvântul anterior</translation>
-<translation id="2489435327075806094">Viteza indicatorului:</translation>
+<translation id="2489435327075806094">Viteza cursorului:</translation>
 <translation id="2574102660421949343">Se permit cookie-urile de la <ph name="DOMAIN"/>.</translation>
 <translation id="2773948261276885771">Setați paginile</translation>
 <translation id="3688526734140524629">Schimbați canalul</translation>
@@ -4920,12 +4944,13 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="1177437665183591855">Eroare de certificat de server necunoscută</translation>
 <translation id="3394150261239285340"><ph name="HOST"/> dorește să utilizeze camera foto și microfonul.</translation>
 <translation id="1842969606798536927">Plătiți</translation>
-<translation id="8467473010914675605">Metoda de introducere pentru coreeană</translation>
+<translation id="8467473010914675605">Metoda de introducere a textului în coreeană</translation>
 <translation id="8759408218731716181">Nu se poate configura conectarea multiplă</translation>
 <translation id="8102535138653976669"><ph name="PRODUCT_NAME"/> sincronizează securizat datele cu Contul Google. Păstrați opțiunea de sincronizare integrală sau personalizați tipurile de date de sincronizat și setările de criptare.</translation>
 <translation id="824543159844843373">Activați elementul de lansare 3</translation>
 <translation id="3819800052061700452">&amp;Ecran complet</translation>
 <translation id="48607902311828362">Mod Avion</translation>
+<translation id="711840821796638741">Vezi marcajele gestionate</translation>
 <translation id="3360297538363969800">Printarea a eșuat. Verificați imprimanta și încercați din nou.</translation>
 <translation id="680572642341004180">Activați urmărirea RLZ pentru <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Vă rugăm să nu mai folosiți încărcătorul rechemat de pe piață.</translation>
@@ -4933,7 +4958,7 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="8142699993796781067">Rețea privată</translation>
 <translation id="3517839692979918726"><ph name="APP_NAME"/> dorește să trimită conținut de pe ecran. Alegeți ce doriți să trimiteți.</translation>
 <translation id="1374468813861204354">sugestii</translation>
-<translation id="5906065664303289925">Adresa hardware:</translation>
+<translation id="5906065664303289925">Adresă hardware:</translation>
 <translation id="2498436043474441766">Adăugați imprimante</translation>
 <translation id="1190144681599273207">Preluarea acestui fișier va utiliza aproximativ <ph name="FILE_SIZE"/> din datele mobile.</translation>
 <translation id="3537613974805087699">Fără sugestii</translation>
@@ -4943,7 +4968,7 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="4618990963915449444">Toate fișierele de pe <ph name="DEVICE_NAME"/> vor fi șterse.</translation>
 <translation id="5011739343823725107">Nu s-a putut porni procesul de fundal pentru sincronizare</translation>
 <translation id="8726206820263995930">Eroare la preluarea setărilor politicii de pe server: <ph name="CLIENT_ERROR"/>.</translation>
-<translation id="614998064310228828">Model dispozitiv:</translation>
+<translation id="614998064310228828">Modelul dispozitivului:</translation>
 <translation id="8708671767545720562">&amp;Mai multe informații</translation>
 <translation id="2101797668776986011">Pepper 3D</translation>
 <translation id="1581962803218266616">Afișați în Finder</translation>
@@ -4954,7 +4979,7 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="1405126334425076373">Cursorul mouse-ului</translation>
 <translation id="2796424461616874739">A expirat timpul limită pentru autentificare în timpul conectării la „<ph name="DEVICE_NAME"/>”.</translation>
 <translation id="6096326118418049043">Nume X.500</translation>
-<translation id="923467487918828349">Afișați toate ferestrele</translation>
+<translation id="923467487918828349">Afișați-le pe toate</translation>
 <translation id="8180786512391440389">Extensia „<ph name="EXTENSION"/>” poate să citească și să șteargă fișiere imagine, video și audio din locațiile selectate.</translation>
 <translation id="8054517699425078995">Acest tip de fișier poate dăuna dispozitivului. Doriți totuși să păstrați fișierul <ph name="FILE_NAME"/>?</translation>
 <translation id="3093189737735839308">Sigur doriți să instalați pluginul <ph name="PLUGIN_NAME"/>? Trebuie să instalați numai pluginuri în care aveți încredere.</translation>
@@ -4963,14 +4988,14 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="3582792037806681688">Conectarea multiplă a fost interzisă pentru un utilizator din această sesiune</translation>
 <translation id="3488065109653206955">Activat parțial</translation>
 <translation id="3683524264665795342">Solicitare de accesare a ecranului pentru aplicația <ph name="APP_NAME"/></translation>
-<translation id="1481244281142949601">Sunteți integrat corect în mediul de testare.</translation>
+<translation id="1481244281142949601">Mediul de testare securizat este integrat corect.</translation>
 <translation id="4849517651082200438">Nu instalați</translation>
 <translation id="4614787993721978672">Îi permite utilizatorului să comute între operatorii de telefonie mobilă din interfața de utilizare. Avertisment: operatorul Sprint va funcționa NUMAI pentru utilizatorii care au deja un plan Sprint.</translation>
 <translation id="4331044381666269113">Schimbă comportamentul evenimentului tactil la derulare. Chrome a folosit anterior modul „touchcancel”, iar „async-touchmove” este noul mod preferat.</translation>
 <translation id="799923393800005025">Poate vedea</translation>
 <translation id="146220085323579959">Internet deconectat. Verificați conexiunea la internet și încercați din nou.</translation>
 <translation id="6263284346895336537">Non-critic</translation>
-<translation id="6409731863280057959">Ferestre de tip pop-up</translation>
+<translation id="6409731863280057959">Ferestre pop-up</translation>
 <translation id="8217399928341212914">Blocați în continuare descărcarea automată a mai multor fișiere</translation>
 <translation id="3459774175445953971">Ultima modificare:</translation>
 <translation id="2569850583200847032">Activați generarea parolelor.</translation>
@@ -5001,20 +5026,20 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="5075306601479391924">Dezactivați necesitatea utilizării gesturilor pentru redarea elementelor media. Activarea acestei opțiuni va permite funcționarea redării automate.</translation>
 <translation id="9112748030372401671">Schimbați imaginea de fundal</translation>
 <translation id="8938356204940892126">Renunț</translation>
-<translation id="2670965183549957348">Metoda de introducere Chewing</translation>
+<translation id="2670965183549957348">Metoda de introducere a textului Chewing</translation>
 <translation id="7839804798877833423">Preluarea acestor fișiere va utiliza aproximativ <ph name="FILE_SIZE"/> din datele mobile.</translation>
 <translation id="3268451620468152448">File deschise</translation>
 <translation id="4918086044614829423">Accept</translation>
-<translation id="4085298594534903246">JavaScript a fost blocat pe această pagină.</translation>
+<translation id="4085298594534903246">Scripturile JavaScript au fost blocate pe această pagină.</translation>
 <translation id="7825543042214876779">Blocat de politică</translation>
-<translation id="4341977339441987045">Blocați stocarea de date efectuată de site-uri</translation>
+<translation id="4341977339441987045">Blochează stocarea de date efectuată de site-uri</translation>
 <translation id="806812017500012252">Reordonați după titlu</translation>
 <translation id="6518133107902771759">Confirmați</translation>
 <translation id="1807938677607439181">Toate fișierele</translation>
 <translation id="4830663533476372654">Se revine la o actualizare <ph name="IDS_SHORT_PRODUCT_NAME"/> anterioară.</translation>
 <translation id="8575286330460702756">Date semnătură</translation>
 <translation id="6812841287760418429">Păstrați modificările</translation>
-<translation id="3835522725882634757">O, nu! Acest server trimite date pe care <ph name="PRODUCT_NAME"/> nu le poate înțelege. <ph name="BEGIN_LINK"/>Semnalați o eroare<ph name="END_LINK"/> și includeți <ph name="BEGIN2_LINK"/>afișarea datelor neprelucrate<ph name="END2_LINK"/>.</translation>
+<translation id="3835522725882634757">Oh, nu! Acest server trimite date pe care <ph name="PRODUCT_NAME"/> nu le poate înțelege. <ph name="BEGIN_LINK"/>Raportați o eroare<ph name="END_LINK"/> și includeți <ph name="BEGIN2_LINK"/>afișarea datelor neprelucrate<ph name="END2_LINK"/>.</translation>
 <translation id="2989474696604907455">neconectat</translation>
 <translation id="6612358246767739896">Conținut protejat</translation>
 <translation id="1593594475886691512">Se formatează...</translation>
@@ -5026,7 +5051,7 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="4361745360460842907">Deschideți ca filă</translation>
 <translation id="5238278114306905396">Aplicația „<ph name="EXTENSION_NAME"/>” a fost eliminată automat.</translation>
 <translation id="4538792345715658285">Instalată pe baza politicii întreprinderii.</translation>
-<translation id="2988488679308982380">Pachetul nu a putut fi instalat: „<ph name="ERROR_CODE"/>”</translation>
+<translation id="2988488679308982380">Nu s-a putut instala pachetul: „<ph name="ERROR_CODE"/>”</translation>
 <translation id="2396249848217231973">&amp;Anulați ștergerea</translation>
 <translation id="55815574178531051">Certificatul primit de Chrome în timpul acestei încercări de conectare a fost revocat.</translation>
 <translation id="6129953537138746214">Spațiu</translation>
@@ -5044,7 +5069,7 @@ Apăsați pe orice tastă pentru a continua explorarea.</translation>
 <translation id="6845038076637626672">Deschideți aplicația maximizată</translation>
 <translation id="3184560914950696195">Fișierele nu pot fi salvate în $1. Imaginile editate vor fi salvate în dosarul Descărcări.</translation>
 <translation id="8366396658833131068">Conexiunea la rețea a fost restabilită. Selectați altă rețea sau apăsați mai jos pe butonul „Continuați” pentru a lansa aplicația chioșc.</translation>
-<translation id="4664482161435122549">Eroare de export PKCS #12</translation>
+<translation id="4664482161435122549">PKCS # 12 Eroare de export</translation>
 <translation id="2445081178310039857">Este necesar directorul rădăcină pentru extensie.</translation>
 <translation id="146187176629751223">Un participant din acest hangout s-a oferit să vă ajute prin preluarea controlului asupra computerului dvs. Dacă acceptați:
 
@@ -5077,7 +5102,7 @@ Acceptați?</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="421182450098841253">&amp;Afișați bara de marcaje</translation>
 <translation id="2948083400971632585">Puteți să dezactivați serverele proxy configurate pentru o conexiune din pagina de setări.</translation>
-<translation id="4481249487722541506">Încărcați extensiile neîmpachetate...</translation>
+<translation id="4481249487722541506">Încărcați extensia neîmpachetată...</translation>
 <translation id="356512994079769807">Setări de instalare pentru sistem</translation>
 <translation id="8180239481735238521">pagină</translation>
 <translation id="7532099961752278950">Setate de aplicația:</translation>
@@ -5088,26 +5113,26 @@ Acceptați?</translation>
 <translation id="9124229546822826599">Omite solicitarea parolelor și salvează parolele automat.</translation>
 <translation id="1007233996198401083">Nu se poate realiza conectarea.</translation>
 <translation id="2149973817440762519">Editați marcajul</translation>
-<translation id="5431318178759467895">Culoare</translation>
+<translation id="5431318178759467895">Color</translation>
 <translation id="4454939697743986778">Acest certificat a fost instalat de administratorul de sistem.</translation>
 <translation id="249303669840926644">Înregistrarea nu s-a putut finaliza</translation>
 <translation id="2784407158394623927">Activarea serviciilor de date mobile</translation>
 <translation id="4393744079468921084">Da, ieșiți din modul incognito</translation>
 <translation id="6920989436227028121">Deschideți ca filă obișnuită</translation>
 <translation id="8907632694946431747">Afișați aplicațiile Drive lângă aplicațiile Chrome în Lansatorul de aplicații.</translation>
-<translation id="4057041477816018958"><ph name="SPEED"/> - <ph name="RECEIVED_AMOUNT"/></translation>
+<translation id="4057041477816018958"><ph name="SPEED"/>  <ph name="RECEIVED_AMOUNT"/></translation>
 <translation id="2050339315714019657">Portret</translation>
 <translation id="6991128190741664836">Mai târziu</translation>
 <translation id="8261490674758214762">Acestea pot să:</translation>
 <translation id="8647750283161643317">Resetați-le pe toate la valorile prestabilite</translation>
-<translation id="5112577000029535889">&amp;Instrumente pentru programatori</translation>
+<translation id="5112577000029535889">&amp;Instrumente pentru dezvoltatori</translation>
 <translation id="2301382460326681002">Directorul rădăcină pentru extensie este nevalid.</translation>
 <translation id="4912643508233590958">Ieșiri din modul inactiv</translation>
 <translation id="7839192898639727867">ID cheie pentru subiectul certificatului</translation>
 <translation id="4759238208242260848">Descărcări</translation>
-<translation id="2879560882721503072">Stocarea certificatului de client emis de <ph name="ISSUER"/> a reușit.</translation>
+<translation id="2879560882721503072">Certificatul de client emis de <ph name="ISSUER"/> a fost stocat.</translation>
 <translation id="1275718070701477396">Selectat</translation>
-<translation id="1178581264944972037">Pauză</translation>
+<translation id="1178581264944972037">Întrerupeți</translation>
 <translation id="3948633535993872459">Linkurile <ph name="PROTOCOL"/></translation>
 <translation id="6492313032770352219">Dimensiune pe disc:</translation>
 <translation id="3225919329040284222">Serverul a prezentat un certificat care nu se potrivește cu așteptările încorporate. Aceste așteptări sunt incluse pentru anumite site-uri web, cu un grad sporit de securitate, pentru a vă proteja.</translation>
@@ -5125,7 +5150,7 @@ Acceptați?</translation>
 <translation id="1146498888431277930">Eroare de conexiune SSL</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT"/>)</translation>
 <translation id="6394627529324717982">Virgulă</translation>
-<translation id="253434972992662860">&amp;Pauză</translation>
+<translation id="253434972992662860">&amp;Întrerupeți</translation>
 <translation id="335985608243443814">Răsfoiți...</translation>
 <translation id="1200154159504823132">512</translation>
 <translation id="2727794866043914351">Excepții pentru accesul pluginurilor în afara mediului de testare securizat</translation>
@@ -5139,7 +5164,7 @@ Acceptați?</translation>
 <translation id="4034042927394659004">Reduceți luminozitatea tastelor</translation>
 <translation id="5898154795085152510">Serverul a afișat un certificat client nevalid. Eroare <ph name="ERROR_NUMBER"/> (<ph name="ERROR_NAME"/>).</translation>
 <translation id="2704184184447774363">Semnare Microsoft a documentelor</translation>
-<translation id="5677928146339483299">Blocate</translation>
+<translation id="5677928146339483299">Blocat</translation>
 <translation id="4645676300727003670">&amp;Păstrați</translation>
 <translation id="3225579507836276307">O extensie terță parte a blocat accesul la această pagină web.</translation>
 <translation id="6815551780062710681">editați</translation>
@@ -5177,7 +5202,7 @@ Acceptați?</translation>
 <translation id="1718559768876751602">Creați acum un Cont Google</translation>
 <translation id="7408287099496324465">Dacă este activat, API-ul EmbeddedSearch va fi folosit pentru a trimite interogări de căutare în pagina cu rezultatele căutării.</translation>
 <translation id="2731710757838467317">Se creează utilizatorul monitorizat. Poate dura câteva momente.</translation>
-<translation id="1884319566525838835">Starea mediului de testare</translation>
+<translation id="1884319566525838835">Starea mediului de testare securizat</translation>
 <translation id="2770465223704140727">Eliminați din listă</translation>
 <translation id="8314013494437618358">Compunere cu fire de execuție</translation>
 <translation id="2525250408503682495">Kryptonit! Procesul cryptohome pentru aplicația de tip chioșc nu a putut fi montat.</translation>
@@ -5189,7 +5214,7 @@ Acceptați?</translation>
 <translation id="1979280758666859181">Treceți la un canal cu o versiune <ph name="PRODUCT_NAME"/> mai veche. Schimbarea canalului se va aplica atunci când versiunea canalului va corespunde cu versiunea instalată în prezent pe dispozitiv.</translation>
 <translation id="304009983491258911">Modificați codul PIN al cardului SIM</translation>
 <translation id="8636666366616799973">Pachetul nu este valid. Detalii: „<ph name="ERROR_MESSAGE"/>”.</translation>
-<translation id="2045969484888636535">Doresc să fie blocate în continuare modulele cookie</translation>
+<translation id="2045969484888636535">Continuați blocarea cookie-urilor</translation>
 <translation id="8131740175452115882">Confirmați</translation>
 <translation id="7353601530677266744">Linie de comandă</translation>
 <translation id="2766006623206032690">In&amp;serați și accesați</translation>
@@ -5197,7 +5222,7 @@ Acceptați?</translation>
 <translation id="4682551433947286597">Imaginile de fundal apar pe ecranul de conectare.</translation>
 <translation id="4394049700291259645">Dezactivați</translation>
 <translation id="5284518706373932381">Vă recomandăm să reveniți pe acest site peste câteva ore. Navigarea sigură Google <ph name="BEGIN_LINK"/>a detectat recent programe malware<ph name="END_LINK"/> pe <ph name="SITE"/>. Site-urile care sunt de obicei sigure sunt uneori infectate cu programe malware.</translation>
-<translation id="969892804517981540">Creat oficial</translation>
+<translation id="969892804517981540">Versiune oficială</translation>
 <translation id="1691608011302982743">Ați scos gadgetul prea devreme!</translation>
 <translation id="445923051607553918">Asociați-vă la rețeaua Wi-Fi</translation>
 <translation id="1898137169133852367">Utilizarea funcției Powerwash vă resetează dispozitivul <ph name="IDS_SHORT_PRODUCT_NAME"/> la configurația din fabrică. În plus, dispozitivul va reveni la o actualizare <ph name="IDS_SHORT_PRODUCT_NAME"/> anterioară.</translation>
@@ -5206,7 +5231,7 @@ Acceptați?</translation>
 <translation id="9169496697824289689">Vedeți comenzile rapide de la tastatură</translation>
 <translation id="420676372321767680">Activați decodificarea fără compunere.</translation>
 <translation id="2925966894897775835">Foi de calcul</translation>
-<translation id="3349155901412833452">Utilizați tastele , și . pentru a pagina o listă de candidați</translation>
+<translation id="3349155901412833452">Utilizați tastele , și . pentru a pagina o listă de sugestii</translation>
 <translation id="1524152555482653726">Film</translation>
 <translation id="7336748286991450492"><ph name="SIGN_IN_LINK"/> pentru a accesa marcajele oriunde mergeți.</translation>
 <translation id="8487700953926739672">Disponibil offline</translation>
@@ -5217,7 +5242,7 @@ Acceptați?</translation>
 <translation id="2742870351467570537">Eliminați elementele selectate</translation>
 <translation id="7561196759112975576">Întotdeauna</translation>
 <translation id="2116673936380190819">ultima oră</translation>
-<translation id="5765491088802881382">Nu sunt disponibile rețele</translation>
+<translation id="5765491088802881382">Nu există rețele disponibile</translation>
 <translation id="4119705021348785607">Nu sunteți <ph name="PROFILE_DISPLAY_NAME"/>?</translation>
 <translation id="6941427089482296743">Eliminați-le pe cele afișate</translation>
 <translation id="6510391806634703461">Utilizator nou</translation>
@@ -5238,7 +5263,7 @@ Păstrați fișierul cu cheia într-o locație sigură. Acesta va fi necesar la
 <translation id="4641635164232599739"><ph name="FILE_NAME"/> nu este descărcat de obicei și ar putea fi periculos.</translation>
 <translation id="6059652578941944813">Ierarhie de certificate</translation>
 <translation id="3153094071447713741">Funcții experimentale pentru afișările pentru metoda de introducere a textului.</translation>
-<translation id="5729712731028706266">&amp;Afișați</translation>
+<translation id="5729712731028706266">&amp;Vedeți</translation>
 <translation id="9170884462774788842">Un alt program de pe computerul dvs. a adăugat o temă care poate schimba modul în care funcționează Chrome.</translation>
 <translation id="8571108619753148184">Server 4</translation>
 <translation id="4508765956121923607">Vedeți s&amp;ursa</translation>
@@ -5248,8 +5273,8 @@ Păstrați fișierul cu cheia într-o locație sigură. Acesta va fi necesar la
 <translation id="3331321258768829690">(<ph name="UTCOFFSET"/>) <ph name="LONGTZNAME"/> (<ph name="EXEMPLARCITY"/>)</translation>
 <translation id="2813137708069460534">Statistici legate de modul în care <ph name="SHORT_PRODUCT_NAME"/> utilizează rețeaua</translation>
 <translation id="7250799832286185545">Ani</translation>
-<translation id="5849869942539715694">Creați un pachet pentru extensie...</translation>
-<translation id="7339785458027436441">Doresc verificarea ortografiei pe măsură ce se introduce text</translation>
+<translation id="5849869942539715694">Împachetați extensia...</translation>
+<translation id="7339785458027436441">Verificați ortografia pe măsură ce se introduce text</translation>
 <translation id="5233736638227740678">&amp;Inserați</translation>
 <translation id="1828901632669367785">Printați utilizând caseta de dialog a sistemului...</translation>
 <translation id="1801298019027379214">Cod PIN incorect, încercați din nou. Încercări rămase: <ph name="TRIES_COUNT"/></translation>
@@ -5260,7 +5285,7 @@ Păstrați fișierul cu cheia într-o locație sigură. Acesta va fi necesar la
 <translation id="7127980134843952133">Istoricul descărcărilor</translation>
 <translation id="4998873842614926205">Confirmați modificările</translation>
 <translation id="6596325263575161958">Opțiuni de criptare</translation>
-<translation id="1559528461873125649">Nu există acest fișier sau director</translation>
+<translation id="1559528461873125649">Nu există un astfel de fișier sau director</translation>
 <translation id="3857773447683694438">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</translation>
 <translation id="1533920822694388968">Alinierea televizorului</translation>
 <translation id="6109534693970294947">Permiteți ca <ph name="ORIGIN"/> să comunice cu extensia „<ph name="EXTENSION_NAME"/>”?</translation>
index d7662d3..130825b 100644 (file)
@@ -71,7 +71,7 @@
 <translation id="368260109873638734">Подробнее о проблемах</translation>
 <translation id="7409233648990234464">Перезапустить и включить Powerwash</translation>
 <translation id="7428534988046001922">Установлены следующие приложения:</translation>
-<translation id="787386463582943251">Добавить адрес электронной почты</translation>
+<translation id="787386463582943251">Добавьте адрес эл. почты</translation>
 <translation id="2833791489321462313">Требовать пароль при выходе из спящего режима</translation>
 <translation id="8208216423136871611">Не сохранять</translation>
 <translation id="4405141258442788789">Тайм-аут операции.</translation>
 <translation id="9033857511263905942">&amp;Вставить</translation>
 <translation id="1028690605877243613">Использовать другую схему хранилища.</translation>
 <translation id="6736045498964449756">Пароли не совпадают!</translation>
-<translation id="4558985768677321342">РазÑ\80еÑ\88иÑ\82Ñ\8c Ñ\80азблокиÑ\80ование Ñ\81 Ñ\82елеÑ\84она</translation>
+<translation id="4558985768677321342">Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ð¿Ñ\80оÑ\81Ñ\82Ñ\83Ñ\8e Ñ\80азблокиÑ\80овкÑ\83</translation>
 <translation id="1221825588892235038">Только выбранные</translation>
 <translation id="2227939492629426903">Включает новое меню аватара. В сочетании с новой системой управления профилями показывает только меню аватара этой новой системы. В противном случае показывает обновленное меню аватара с прежними функциями, а также подсказку вверху с предложением попробовать новый интерфейс управления профилями.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> заблокировал доступ к <ph name="HOST_NAME"/>. По нашим данным, этот сайт является фишинговым.</translation>
 <translation id="8569764466147087991">Выберите файл</translation>
 <translation id="9131487537093447019">Обмен сообщениями с устройствами Bluetooth.</translation>
 <translation id="3010279545267083280">Пароль удален</translation>
-<translation id="4275663329226226506">Ð\9cÑ\83лÑ\8cÑ\82имедиа</translation>
+<translation id="4275663329226226506">Ð\9aамеÑ\80а Ð¸ Ð¼Ð¸ÐºÑ\80оÑ\84он </translation>
 <translation id="3629630062892748850">Релевантные URL и результаты поиска Google.com</translation>
 <translation id="5649768706273821470">Прослушать</translation>
 <translation id="4096508467498758490">Отключение расширений в режиме разработчика</translation>
 <translation id="87377425248837826">Включение панелей</translation>
 <translation id="2805707493867224476">Разрешить открытие всплывающих окон на всех сайтах</translation>
 <translation id="3561217442734750519">Входное значение закрытого ключа должно предоставлять собой допустимый путь.</translation>
-<translation id="3582930987043644930">Укажите имя</translation>
+<translation id="3582930987043644930">Ð\94обавÑ\8cте имя</translation>
 <translation id="2984337792991268709">Сегодня, <ph name="TODAY_DAYTIME"/></translation>
 <translation id="5227808808023563348">Найти предыдущий текст</translation>
 <translation id="4561162271279554092">Отключить нумерацию устройств средствами WebRTC.</translation>
 <translation id="6460601847208524483">Найти след.</translation>
 <translation id="397703832102027365">Завершение…</translation>
 <translation id="8146177459103116374">Вы уже зарегистрированы на этом устройстве и можете <ph name="LINK2_START"/>войти, используя свои регистрационные данные<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Показать управляемые закладки</translation>
 <translation id="4856478137399998590">Служба передачи данных в мобильных сетях активирована и готова к использованию</translation>
 <translation id="3305389145870741612">Форматирование займет несколько секунд. Подождите.</translation>
 <translation id="3648607100222897006">Эти экспериментальные функции в любой момент могут измениться, прекратить работу или исчезнуть. Мы не предоставляем никаких гарантий относительно возможных последствий их активации, кроме того, они могут привести к сбою браузера. Браузер может удалить все ваши данные, безопасность и конфиденциальность данных могут быть нарушены неожиданных образом. Экспериментальные функции, выбранные одним пользователем, включаются для всех пользователей браузера на компьютере. Соблюдайте осторожность.</translation>
 <translation id="7179921470347911571">Перезапустить</translation>
 <translation id="9065203028668620118">Изменить</translation>
 <translation id="2251218783371366160">Открыть в программе просмотра по умолчанию</translation>
-<translation id="1177863135347784049">Ð\9fеÑ\80Ñ\81онализиÑ\80ованнÑ\8bй</translation>
+<translation id="1177863135347784049">Ð\9fеÑ\80Ñ\81онализиÑ\80ованнÑ\8bе</translation>
 <translation id="4881695831933465202">Открыть</translation>
 <translation id="3968103409306279789">Использовать новый стиль страницы при открытии новых вкладок.</translation>
 <translation id="6225378837831321064"><ph name="DEVICE_NAME"/>: Подключение...</translation>
 <translation id="212464871579942993">Веб-сайт <ph name="HOST_NAME"/> содержит элементы с сайтов, на которых, судя по всему, размещено вредоносное ПО – программы, которые могут нанести вред вашему компьютеру или выполнять действия без вашего согласия. Даже простое посещение сайта, на котором размещено вредоносное ПО, может привести к заражению вашего компьютера. На этом веб-сайте также размещены материалы с сайтов, которые, по нашим данным, являются фишинговыми. Фишинговые сайты обманом получают от пользователей личную или финансовую информацию, выдавая себя за сайты доверенных учреждений, например банков.</translation>
 <translation id="2673135533890720193">Чтение истории просмотров</translation>
 <translation id="6860427144121307915">Открыть в новой вкладке</translation>
-<translation id="887692350334376364">Ð\98Ñ\81клÑ\8eÑ\87ениÑ\8f Ð´Ð»Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8bваÑ\8eÑ\89иÑ\85 Ñ\83Ñ\81Ñ\82Ñ\80ойÑ\81Ñ\82в</translation>
+<translation id="887692350334376364">Ð\98Ñ\81клÑ\8eÑ\87ениÑ\8f Ð´Ð»Ñ\8f ÐºÐ°Ð¼ÐµÑ\80Ñ\8b Ð¸ Ð¼Ð¸ÐºÑ\80оÑ\84она</translation>
 <translation id="8156020606310233796">Список</translation>
 <translation id="146000042969587795">Этот фрейм заблокирован, поскольку он содержит небезопасные элементы.</translation>
 <translation id="3258924582848461629">Японский рукописный ввод</translation>
 <translation id="6869402422344886127">Установленный флажок</translation>
 <translation id="3428010780253032925">Отключить прямоугольную область касания</translation>
 <translation id="5637380810526272785">Раскладка клавиатуры</translation>
+<translation id="3613134908380545408">Показать папку &quot;<ph name="FOLDER_NAME"/>&quot;</translation>
 <translation id="2837049386027881519">Необходимо снова установить соединение, используя более старую версию протокола TLS или SSL. Обычно это говорит о том, что ПО на сервере давно не обновлялось. Возможно возникновение и других проблем с безопасностью.</translation>
 <translation id="404928562651467259">Внимание!</translation>
 <translation id="4289300219472526559">Начать голосовой ввод</translation>
 <translation id="6934265752871836553">Использовать все последние обновления, чтобы Chrome отображал контент быстрее.
         Эта функция постоянно изменяется, поэтому вероятно появление ошибок.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Всегда открывать в Adobe Reader</translation>
 <translation id="8274359292107649245">Открыть Chrome в режиме рабочего стола</translation>
 <translation id="1571119610742640910">Объединение фиксированных фоновых изображений.</translation>
 <translation id="6514565641373682518">Эта страница скрыла указатель мыши.</translation>
 <translation id="824543159844843373">Активировать элемент 3 панели запуска</translation>
 <translation id="3819800052061700452">Полно&amp;экранный режим</translation>
 <translation id="48607902311828362">Режим &quot;В полете&quot;</translation>
+<translation id="711840821796638741">Показать управляемые закладки</translation>
 <translation id="3360297538363969800">Не удалось распечатать документ. Проверьте, всё ли в порядке с принтером, и повторите попытку.</translation>
 <translation id="680572642341004180">Включить отслеживание RLZ-идентификатора для <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Не используйте зарядное устройство, подлежащее замене.</translation>
index 13e2492..c575c3a 100644 (file)
@@ -48,7 +48,7 @@
 <translation id="6985276906761169321">ID:</translation>
 <translation id="859285277496340001">V certifikáte nie je uvedené, akým spôsobom sa má skontrolovať, či certifikát nebol odmietnutý.</translation>
 <translation id="4711638718396952945">Obnoviť nastavenia</translation>
-<translation id="6610610633807698299">Zadajte adresu URL...</translation>
+<translation id="6610610633807698299">Zadajte webovú adresu...</translation>
 <translation id="4168015872538332605">Používateľ <ph name="PRIMARY_EMAIL"/> s vami zdieľa niektoré svoje nastavenia. Tieto nastavenia váš účet ovplyvnia iba počas používania viacnásobného prihlásenia.</translation>
 <translation id="7900476766547206086">Pre prihlásených používateľov sa vyžaduje heslo, pretože jeden alebo viacero používateľov zaplo toto nastavenie.</translation>
 <translation id="8870272765758621889">Toto je kontrolovaný používateľ, ktorého spravuje používateľ <ph name="CUSTODIAN_EMAIL"/>.
@@ -121,7 +121,7 @@ Prihlasovacie podrobnosti vášho účtu sú zastarané.</translation>
 <translation id="3648460724479383440">Vybratý prepínač</translation>
 <translation id="512903556749061217">pripojené</translation>
 <translation id="4654488276758583406">Veľmi malé</translation>
-<translation id="6647228709620733774">Adresa URL pre odvolanie certifikačnej autority služby Netscape</translation>
+<translation id="6647228709620733774">Webová adresa pre odvolanie certifikačnej autority služby Netscape</translation>
 <translation id="546411240573627095">Štýl číselnej klávesnice</translation>
 <translation id="2310216585920710503">Nastavenie jednoduchého odomknutia</translation>
 <translation id="8425213833346101688">Zmeniť</translation>
@@ -227,7 +227,7 @@ s ostatnými, a to všetko na jednom mieste.<ph name="MARKUP_9"/></translation>
 <translation id="9105212490906037469">F2</translation>
 <translation id="4920887663447894854">Tieto webové stránky majú zablokované sledovanie vašej polohy na tejto stránke:</translation>
 <translation id="8133676275609324831">&amp;Zobraziť v priečinku</translation>
-<translation id="302014277942214887">Zadajte ID aplikácie alebo adresu URL webového obchodu.</translation>
+<translation id="302014277942214887">Zadajte ID aplikácie alebo webovú adresu webového obchodu.</translation>
 <translation id="26224892172169984">Nepovoliť žiadnym stránkam obsluhovať protokoly</translation>
 <translation id="645705751491738698">Pokračovať v blokovaní jazyka JavaScript</translation>
 <translation id="9177556055091995297">Spravovať kreditné karty</translation>
@@ -257,7 +257,7 @@ s ostatnými, a to všetko na jednom mieste.<ph name="MARKUP_9"/></translation>
 <translation id="1657406563541664238">Pomôžte zlepšiť aplikáciu <ph name="PRODUCT_NAME"/> aktivovaním automatického odosielania štatistických údajov o používaní prehliadača a správ o chybách spoločnosti Google.</translation>
 <translation id="8339012082103782726">Nepovoliť stránkam používať váš mikrofón</translation>
 <translation id="7982789257301363584">Sieť</translation>
-<translation id="2271281383664374369">Žiadosti rozšírenia na túto adresu URL boli dočasne pozastavené.</translation>
+<translation id="2271281383664374369">Žiadosti rozšírenia na túto webovú adresu boli dočasne pozastavené.</translation>
 <translation id="8528962588711550376">Prebieha prihlásenie.</translation>
 <translation id="2336228925368920074">Všetky karty uložiť ako záložky...</translation>
 <translation id="8774934320277480003">Horný okraj</translation>
@@ -493,7 +493,7 @@ s ostatnými, a to všetko na jednom mieste.<ph name="MARKUP_9"/></translation>
 <translation id="5355351445385646029">Stlačením klávesu Space vyberiete kandidáta</translation>
 <translation id="5453029940327926427">Zavrieť karty</translation>
 <translation id="949088605431823851">Kde ste si kúpili toto zariadenie HP Chromebook 11?</translation>
-<translation id="9087353528325876418">Adresa URL automatického zisťovania webového servera proxy</translation>
+<translation id="9087353528325876418">Webová adresa automatického zisťovania webového servera proxy</translation>
 <translation id="4801956050125744859">Ponechať obidve</translation>
 <translation id="3878840326289104869">Prebieha vytváranie kontrolovaného používateľa</translation>
 <translation id="406070391919917862">Aplikácie na pozadí</translation>
@@ -519,12 +519,12 @@ s ostatnými, a to všetko na jednom mieste.<ph name="MARKUP_9"/></translation>
 <translation id="2713008223070811050">Spravovať displeje</translation>
 <translation id="5145331109270917438">Dátum úpravy</translation>
 <translation id="6596816719288285829">Adresa IP</translation>
-<translation id="7603461642606849762">Ladiť iba v prípade, že sa adresa URL manifestu končí reťazcom debug.nmf.</translation>
+<translation id="7603461642606849762">Ladiť iba v prípade, že sa webová adresa manifestu končí reťazcom debug.nmf.</translation>
 <translation id="8656768832129462377">Nekontrolovať</translation>
 <translation id="413121957363593859">Komponenty</translation>
 <translation id="715487527529576698">Úvodný režim čínštiny: zjednodušená čínština</translation>
 <translation id="6522350652862471760">Povoliť meno profilu a ikonu zo služby Google</translation>
-<translation id="6181259999130430430">Povoliť na tomto zariadení funkciu Jednoduché odomknutie.</translation>
+<translation id="6181259999130430430">Povoliť na tomto zariadení jednoduché odomknutie</translation>
 <translation id="8703575177326907206">Vaše pripojenie k doméne <ph name="DOMAIN"/> sa nešifruje.</translation>
 <translation id="6135622770221372891">ID kanála</translation>
 <translation id="8472623782143987204">hardvérová záloha</translation>
@@ -571,7 +571,7 @@ s ostatnými, a to všetko na jednom mieste.<ph name="MARKUP_9"/></translation>
 <translation id="7096082900368329802">Chcete objaviť viac skvelých funkcií?</translation>
 <translation id="3528171143076753409">Certifikát servera nie je dôveryhodný.</translation>
 <translation id="276969039800130567">Prihlásený/-á ako <ph name="USER_EMAIL_ADDRESS"/>.</translation>
-<translation id="2238534515869120675">Umožňuje kvalitnejší spôsob vytvárania aplikácií pomocou adresy URL. V prípade, že nie je zapnutá možnosť Streamlined Hosted Apps (Zjednodušené hostené aplikácie), nevykoná nič.</translation>
+<translation id="2238534515869120675">Umožňuje kvalitnejší spôsob vytvárania aplikácií pomocou webovej adresy. V prípade, že nie je zapnutá možnosť Streamlined Hosted Apps (Zjednodušené hostené aplikácie), nevykoná nič.</translation>
 <translation id="6518014396551869914">&amp;Kopírovať obrázok</translation>
 <translation id="3236997602556743698">Súprava 3 (390)</translation>
 <translation id="6315723398663634808">Certifikát servera obsahuje slabý kryptografický kľúč.</translation>
@@ -626,7 +626,7 @@ s ostatnými, a to všetko na jednom mieste.<ph name="MARKUP_9"/></translation>
 <translation id="8390449457866780408">Server je nedostupný.</translation>
 <translation id="5098629044894065541">Hebrejské</translation>
 <translation id="2609896558069604090">Vytvoriť odkazy...</translation>
-<translation id="85957690655669315">Iba súvisiace adresy URL</translation>
+<translation id="85957690655669315">Iba súvisiace webové adresy</translation>
 <translation id="6485352695865682479">Stav pripojenia:</translation>
 <translation id="4847468520816441019">Metriky na zobrazenie</translation>
 <translation id="5098647635849512368">Absolútnu cestu k adresáru na zbalenie nie je možné nájsť.</translation>
@@ -668,7 +668,7 @@ Všetci používatelia sa musia odhlásiť a až potom môžu pokračovať.</tra
 <translation id="3530751398950974194">Aktualizovať prístupovú frázu synchronizácie</translation>
 <translation id="5979681173469464041">Prejsť na ďalší panel</translation>
 <translation id="4735819417216076266">Štýl vstupu medzery</translation>
-<translation id="220138918934036434">Tlačidlo Skryť</translation>
+<translation id="220138918934036434">Skryť tlačidlo</translation>
 <translation id="1491151370853475546">Znova načítať stránku</translation>
 <translation id="5374359983950678924">Zmeniť obrázok</translation>
 <translation id="2859738163554174612">Nikdy neponúkať prihlásenie</translation>
@@ -851,7 +851,7 @@ Všetci používatelia sa musia odhlásiť a až potom môžu pokračovať.</tra
 <translation id="7392915005464253525">Znovu o&amp;tvoriť zatvorené okno</translation>
 <translation id="3433621910545056227">Hops! Systému sa nepodarilo nastaviť zámku pre inštaláciu atribútov v zariadení.</translation>
 <translation id="6677037229676347494">Očakávané ID bolo „<ph name="EXPECTED_ID"/>“. Skutočné ID bolo „<ph name="NEW_ID"/>“.</translation>
-<translation id="7400418766976504921">Adresa URL</translation>
+<translation id="7400418766976504921">Webová adresa</translation>
 <translation id="7456847797759667638">Otvoriť umiestnenie...</translation>
 <translation id="5622017037336776003">Otvoriť súbor PDF v nástroji Reader</translation>
 <translation id="7378627244592794276">Nie</translation>
@@ -948,7 +948,7 @@ Všetci používatelia sa musia odhlásiť a až potom môžu pokračovať.</tra
 <translation id="4138267921960073861">Zobraziť používateľské mená a fotografie na prihlasovacej obrazovke</translation>
 <translation id="3045551944631926023">Automaticky znova načítavať iba viditeľné karty</translation>
 <translation id="6921598660714597024">Bajty</translation>
-<translation id="7465778193084373987">Netscape – adresa URL pre zrušenie certifikátu</translation>
+<translation id="7465778193084373987">Netscape – webová adresa pre zrušenie certifikátu</translation>
 <translation id="6321917430147971392">Skontrolujte nastavenia DNS</translation>
 <translation id="5609231933459083978">Aplikácia je pravdepodobne neplatná.</translation>
 <translation id="3441653493275994384">Obrazovka</translation>
@@ -1000,7 +1000,7 @@ Všetci používatelia sa musia odhlásiť a až potom môžu pokračovať.</tra
 <translation id="4287689875748136217">Webovú stránku nie je možné načítať, pretože server neodoslal žiadne údaje.</translation>
 <translation id="1634788685286903402">Dôverovať tomuto certifikátu na identifikáciu e-mailových používateľov.</translation>
 <translation id="1856715684130786728">Pridať umiestnenie...</translation>
-<translation id="7219357088166514551">Zadajte dopyt pre vyhľadávací nástroj <ph name="ENGINE"/> alebo adresu URL</translation>
+<translation id="7219357088166514551">Zadajte dopyt pre vyhľadávací nástroj <ph name="ENGINE"/> alebo webovú adresu</translation>
 <translation id="4684427112815847243">Synchronizovať všetko</translation>
 <translation id="4699357559218762027">(automaticky spustené)</translation>
 <translation id="4037463823853863991">Povoliť prepínač kariet zjednodušeného ovládania v systéme Android.</translation>
@@ -1076,7 +1076,7 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="4583537898417244378">Neplatný alebo poškodený súbor.</translation>
 <translation id="5230160809118287008">Počet teleportovaných kôz</translation>
 <translation id="212862741129535676">Percento obsadenia priestoru údajmi stavu frekvencie</translation>
-<translation id="7761701407923456692">Certifikát servera sa nezhoduje s adresou URL.</translation>
+<translation id="7761701407923456692">Certifikát servera sa nezhoduje s webovou adresou.</translation>
 <translation id="4495419450179050807">Nezobrazovať na tejto stránke</translation>
 <translation id="8818152613617627612">Fakturačné údaje</translation>
 <translation id="1104652314727136854">Povolí integráciu priradení súborov pre aplikácie Chrome do operačného systému.</translation>
@@ -1124,7 +1124,7 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="4871210892959306034">$1 kB</translation>
 <translation id="932327136139879170">Domov</translation>
 <translation id="3561204836318837461">BSSID:</translation>
-<translation id="2560794850818211873">K&amp;opírovať adresu URL videa</translation>
+<translation id="2560794850818211873">K&amp;opírovať webovú adresu videa</translation>
 <translation id="2981113813906970160">Zobraziť veľký kurzor myši</translation>
 <translation id="412730574613779332">Spandex</translation>
 <translation id="5302048478445481009">Jazyk</translation>
@@ -1296,7 +1296,7 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="9033857511263905942">&amp;Vložiť</translation>
 <translation id="1028690605877243613">Použiť alternatívne rozloženie poličky.</translation>
 <translation id="6736045498964449756">Hops, heslá sa nezhodujú.</translation>
-<translation id="4558985768677321342">Povolenie funkcie jednoduchého odomknutia.</translation>
+<translation id="4558985768677321342">Povoliť jednoduché odomknutie</translation>
 <translation id="1221825588892235038">Len výber</translation>
 <translation id="2227939492629426903">Aktivuje novú ponuku avatarov. V kombinácii s novou správou profilov zobrazuje ponuku avatarov novej správy profilov. V opačnom prípade zobrazuje ponuku avatarov s novým vzhľadom a starými funkciami a tiež kartu v hornej časti obrazovky, ktorá používateľovi ponúka vyskúšanie nového rozhrania správy profilov.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> zablokoval prístup ku stránkam <ph name="HOST_NAME"/>. Tieto webové stránky boli nahlásené ako stránky, ktoré neoprávnene získavajú údaje.</translation>
@@ -1371,7 +1371,7 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="9131487537093447019">Posielať správy zariadeniam Bluetooth a prijímať správy zo zariadení Bluetooth.</translation>
 <translation id="3010279545267083280">Heslo bolo odstránené</translation>
 <translation id="4275663329226226506">Médiá</translation>
-<translation id="3629630062892748850">Súvisiace adresy URL a vyhľadávania v doméne Google.com</translation>
+<translation id="3629630062892748850">Súvisiace webové adresy a vyhľadávania v doméne Google.com</translation>
 <translation id="5649768706273821470">Počúvať</translation>
 <translation id="4096508467498758490">Zakázanie rozšírení spustených v režime vývojára</translation>
 <translation id="9064939804718829769">Prevádza sa...</translation>
@@ -1383,10 +1383,10 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="6424403873117573177">Ak však pracujete v organizácii, ktorá generuje vlastné certifikáty, a pomocou takéhoto certifikátu sa snažíte pripojiť k interným webovým stránkam organizácie, môžete tento problém vyriešiť bezpečne. Stačí importovať koreňový certifikát organizácie ako „koreňový certifikát“. Následne budú certifikáty vydané či verifikované vašou organizáciou považované za dôveryhodné a táto chyba sa vám pri ďalšom pokuse o pripojenie k interným webovým stránkam nezobrazí. Ak potrebujete pomoc s pridaním nového koreňového certifikátu do svojho zariadenia, kontaktujte zamestnancov podpory vo vašej organizácii.</translation>
 <translation id="2450531422290975480">Ak si uvedomujete bezpečnostné riziko, môžete <ph name="BEGIN_LINK"/>tieto nebezpečné stránky navštíviť<ph name="END_LINK"/> (neodporúčané) ešte skôr, ako budú nebezpečné programy odstránené.</translation>
 <translation id="1721937473331968728">Do služby <ph name="CLOUD_PRINT_NAME"/> môžete pridať klasické tlačiarne pripojené k vášmu počítaču.</translation>
-<translation id="3341703758641437857">Povoliť prístup k adresám URL súboru</translation>
+<translation id="3341703758641437857">Povoliť prístup k webovým adresám súboru</translation>
 <translation id="6948142510520900350">Prístup na túto webovú stránku zablokoval váš &lt;strong&gt;správca systému&lt;/strong&gt;.</translation>
 <translation id="5702898740348134351">Upraviť vyhľadávaci&amp;e nástroje...</translation>
-<translation id="3687701603889589626">Povoľuje spúšťanie rozšírení na adresách URL typu chrome://, kde rozšírenia explicitne vyžadujú toto povolenie.</translation>
+<translation id="3687701603889589626">Povoľuje spúšťanie rozšírení na webových adresách typu chrome://, kde rozšírenia explicitne vyžadujú toto povolenie.</translation>
 <translation id="1756681705074952506">Metóda vstupu</translation>
 <translation id="8545211332741562162">Povolí webovým stránkam používať experimentálne funkcie jazyka JavaScript.</translation>
 <translation id="734303607351427494">Spravovať vyhľadávače...</translation>
@@ -1416,7 +1416,7 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="2113921862428609753">Prístup k informáciám certifikačnej autority</translation>
 <translation id="9190063653747922532">L2TP/IPSec + predzdieľaný kľúč</translation>
 <translation id="5227536357203429560">Pridať súkromnú sieť...</translation>
-<translation id="732677191631732447">K&amp;opírovať adresu URL zvuku</translation>
+<translation id="732677191631732447">K&amp;opírovať webovú adresu zvuku</translation>
 <translation id="7224023051066864079">Maska podsiete:</translation>
 <translation id="2401813394437822086">Nemáte prístup k svojmu účtu?</translation>
 <translation id="4906679076183257864">Obnoviť na predvolené hodnoty</translation>
@@ -1429,7 +1429,7 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="8297222119869486204">Povoliť prvok window-controls</translation>
 <translation id="9145357542626308749">Bezpečnostný certifikát týchto webových stránok je podpísaný pomocou slabého podpisového algoritmu!</translation>
 <translation id="8502803898357295528">Vaše heslo bolo zmenené</translation>
-<translation id="5171045022955879922">Vyhľadajte alebo zadajte adresu URL</translation>
+<translation id="5171045022955879922">Vyhľadajte alebo zadajte webovú adresu</translation>
 <translation id="6830600606572693159">Webová stránka na adrese <ph name="URL"/> momentálne nie je k dispozícii. Môže byť preťažená alebo na nej prebieha údržba.</translation>
 <translation id="4623525071606576283">Stránky, ktoré sa nepodarí načítať, keď je prehliadač v režime offline, sa automaticky opäť načítajú, keď bude prehliadač znova v režime online.</translation>
 <translation id="6853388645642883916">Služba Updater je v režime spánku</translation>
@@ -1476,7 +1476,7 @@ Nabudúce by sa vám mohol hodiť režim inkognito (<ph name="SHORTCUT_KEY"/>).<
 <translation id="5637940320504994319">Nedostatok miesta v službe Disk Google</translation>
 <translation id="8194797478851900357">&amp;Vrátiť späť presunutie</translation>
 <translation id="2266011376676382776">Stránka/-y nereaguje</translation>
-<translation id="2907619724991574506">Adresy URL pri spustení</translation>
+<translation id="2907619724991574506">Webové adresy pri spustení</translation>
 <translation id="6780476430578694241">Spúšťač aplikácií</translation>
 <translation id="5328285148748012771">Z tohto praktického spúšťača môžete pristupovať do všetkých aplikácií. Hrajte sa hry, uskutočňujte videohovory, počúvajte hudbu, upravujte dokumenty alebo získajte ďalšie aplikácie z Internetového obchodu Chrome.</translation>
 <translation id="2739191690716947896">Ladiť</translation>
@@ -1616,7 +1616,7 @@ Po vytvorení nového kontrolovaného používateľa môžete kedykoľvek spravo
 <translation id="6423064450797205562">Metriky súvisiace s rýchlosťou, s akou prehliadač <ph name="SHORT_PRODUCT_NAME"/> vykonáva požadované akcie</translation>
 <translation id="3690673539902120157">Naozaj chcete nainštalovať toto rozšírenie, aj keď vyžaduje tieto oprávnenia?</translation>
 <translation id="4091434297613116013">listy/listov papiera</translation>
-<translation id="7475671414023905704">Netscape – adresa URL pre zabudnuté heslo</translation>
+<translation id="7475671414023905704">Netscape – webová adresa pre zabudnuté heslo</translation>
 <translation id="3335947283844343239">Znova otvoriť zatvorenú kartu</translation>
 <translation id="5848934677402291689">Prebieha ukladanie do súboru PDF</translation>
 <translation id="2480626392695177423">Prepnúť do režimu interpunkcie s plnou alebo polovičnou šírkou</translation>
@@ -1678,7 +1678,7 @@ Po vytvorení nového kontrolovaného používateľa môžete kedykoľvek spravo
 <translation id="4697551882387947560">Pri ukončení relácie prehliadania</translation>
 <translation id="7779249319235708104">Na nasledovných stránkach hrozí útok s neoprávneným získavaním údajov</translation>
 <translation id="5900302528761731119">Fotografia profilu Google</translation>
-<translation id="3512810056947640266">Adresa URL (voliteľné):</translation>
+<translation id="3512810056947640266">Webová adresa (voliteľné):</translation>
 <translation id="131364520783682672">Caps Lock</translation>
 <translation id="2335122562899522968">Táto stránka nastavila súbory cookie.</translation>
 <translation id="4628757576491864469">Zariadenia</translation>
@@ -2004,7 +2004,7 @@ Po vytvorení nového kontrolovaného používateľa môžete kedykoľvek spravo
 <translation id="7053983685419859001">Blokovať</translation>
 <translation id="7912024687060120840">V priečinku:</translation>
 <translation id="2485056306054380289">Certifikát CA servera:</translation>
-<translation id="5631861698741076898">Hops, prihlásenie sa nepodarilo. Prihlásenie zlyhalo, pretože bola použitá nezabezpečená adresa URL (<ph name="BLOCKED_URL"/>).</translation>
+<translation id="5631861698741076898">Hops, prihlásenie sa nepodarilo. Prihlásenie zlyhalo, pretože bola použitá nezabezpečená webová adresa (<ph name="BLOCKED_URL"/>).</translation>
 <translation id="2727712005121231835">Skutočná veľkosť</translation>
 <translation id="1377600615067678409">Zatiaľ preskočiť</translation>
 <translation id="5581211282705227543">Nie sú nainštalované žiadne doplnky</translation>
@@ -2020,7 +2020,7 @@ Po vytvorení nového kontrolovaného používateľa môžete kedykoľvek spravo
 <translation id="5288678174502918605">Znova o&amp;tvoriť zatvorenú kartu</translation>
 <translation id="7238461040709361198">Od vášho posledného prihlásenia z tohto počítača došlo k zmene hesla vášho účtu Google.</translation>
 <translation id="1956050014111002555">Súbor obsahoval viacero certifikátov a žiadny z nich nebol importovaný:</translation>
-<translation id="302620147503052030">Tlačidlo Zobraziť</translation>
+<translation id="302620147503052030">Zobraziť tlačidlo</translation>
 <translation id="1895658205118569222">Vypnúť</translation>
 <translation id="4432480718657344517">Načítané bajty</translation>
 <translation id="8358685469073206162">Obnoviť stránky?</translation>
@@ -2142,7 +2142,7 @@ Po vytvorení nového kontrolovaného používateľa môžete kedykoľvek spravo
 <translation id="7842346819602959665">Najnovšia verzia rozšírenia „<ph name="EXTENSION_NAME"/>“ požaduje viac povolení, a preto bola zakázaná.</translation>
 <translation id="3776667127601582921">V tomto prípade je certifikát servera alebo certifikát CA prostredníka predložený vášmu prehliadaču neplatný. Môže to znamenať, že certifikát je poškodený, obsahuje neplatné polia alebo nie je podporovaný.</translation>
 <translation id="2412835451908901523">Zadajte 8-ciferný kľúč na odomknutie kódu PIN poskytnutý operátorom <ph name="CARRIER_ID"/>.</translation>
-<translation id="25770266525034120">Adresa URL rozšírenia</translation>
+<translation id="25770266525034120">Webová adresa rozšírenia</translation>
 <translation id="7548916768233393626">Vynútenie režimu vysokej hodnoty DPI</translation>
 <translation id="33562952999632466">Nástroje DevTools vyžadujú úplný prístup k položke <ph name="FOLDER_PATH"/>.
 Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
@@ -2408,7 +2408,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="6575134580692778371">Nenakonfigurované</translation>
 <translation id="4624768044135598934">Úspech!</translation>
 <translation id="7518150891539970662">Denníky WebRTC (<ph name="WEBRTC_LOG_COUNT"/>)</translation>
-<translation id="9067401056540256169">Tento príznak spôsobí, že prehliadač Chrome nebude bezpečný. Použite ho iba v prípade, že viete, čo robí. Upozorňujeme, že tento príznak môže byť odstránený bez akéhokoľvek upozornenia. Ak je povolený, rámce so zdrojom https môžu používať protokoly WebSocket s nezabezpečenou adresou URL (ws://).</translation>
+<translation id="9067401056540256169">Tento príznak spôsobí, že prehliadač Chrome nebude bezpečný. Použite ho iba v prípade, že viete, čo robí. Upozorňujeme, že tento príznak môže byť odstránený bez akéhokoľvek upozornenia. Ak je povolený, rámce so zdrojom https môžu používať protokoly WebSocket s nezabezpečenou webovou adresou (ws://).</translation>
 <translation id="8299319456683969623">Momentálne ste v režime offline.</translation>
 <translation id="419914107014680585">Ďakujeme vám za pomoc.</translation>
 <translation id="8035295275776379143">Mesiace</translation>
@@ -2441,7 +2441,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="347785443197175480">Aj naďalej povoliť stránkam <ph name="HOST"/> prístup ku kamere a mikrofónu</translation>
 <translation id="6052976518993719690">Certifikačná autorita SSL</translation>
 <translation id="1175364870820465910">&amp;Tlačiť...</translation>
-<translation id="3502662168994969388">Obmedzuje v aplikácii Native Client ladenie založené na nástroji GDB podľa adresy URL súboru manifestu. Aby táto možnosť fungovala, musí byť povolené ladenie aplikácie Native Client založené na nástroji GDB.</translation>
+<translation id="3502662168994969388">Obmedzuje v aplikácii Native Client ladenie založené na nástroji GDB podľa webovej adresy súboru manifestu. Aby táto možnosť fungovala, musí byť povolené ladenie aplikácie Native Client založené na nástroji GDB.</translation>
 <translation id="588258955323874662">Celá obrazovka</translation>
 <translation id="6800914069727136216">V balíku s obsahom</translation>
 <translation id="8661104342181683507">Má trvalý prístup k <ph name="NUMBER_OF_FILES"/> súboru.</translation>
@@ -2463,7 +2463,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="382518646247711829">Ak používate server proxy...</translation>
 <translation id="1923342640370224680">Posledná hodina</translation>
 <translation id="6432458268957186486">Tlačiť pomocou dialógového okna služby <ph name="CLOUD_PRINT_NAME"/>...</translation>
-<translation id="2382694417386844779">Skryje adresu URL vo všeobecnom poli a namiesto nej zobrazí názov hostiteľa v čipe, na ktorý je možné kliknúť.</translation>
+<translation id="2382694417386844779">Skryje webovú adresu vo všeobecnom poli a namiesto nej zobrazí názov hostiteľa v čipe, na ktorý je možné kliknúť.</translation>
 <translation id="2950186680359523359">Server ukončil pripojenie bez odoslania údajov.</translation>
 <translation id="4269099019648381197">Umožňuje v ponuke nastavení možnosť vyžiadania stránok pre tablety.</translation>
 <translation id="1645250822384430568">Dostali sme vaše informácie a spracovávame vašu žiadosť.</translation>
@@ -2523,13 +2523,13 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="6731320427842222405">Môže to trvať niekoľko minút</translation>
 <translation id="7503191893372251637">Netscape – typ certifikátu </translation>
 <translation id="4135450933899346655">Vaše certifikáty</translation>
-<translation id="971774202801778802">Adresa URL záložky</translation>
+<translation id="971774202801778802">Webová adresa záložky</translation>
 <translation id="3979395879372752341">Bolo pridané nové rozšírenie (<ph name="EXTENSION_NAME"/>)</translation>
 <translation id="2609632851001447353">Variácie</translation>
 <translation id="2127166530420714525">Nepodarilo sa zmeniť stav napájania adaptéra Bluetooth.</translation>
 <translation id="2765718175690078089">Povoliť experimentálne a prehľadnejšie hostené aplikácie.</translation>
 <translation id="2824775600643448204">Panel s adresou a vyhľadávací panel</translation>
-<translation id="7716781361494605745">Adresa URL pre pravidlá certifikačnej autority služby Netscape</translation>
+<translation id="7716781361494605745">Webová adresa pre pravidlá certifikačnej autority služby Netscape</translation>
 <translation id="9148058034647219655">Ukončiť</translation>
 <translation id="4349014955187289426">Aktivovať protokol SPDY/4, ktorý je štandardom protokolu HTTP/2. Táto funkcia je v súčasnosti experimentálna.</translation>
 <translation id="2881966438216424900">Dátum posledného prístupu:</translation>
@@ -2874,7 +2874,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="7984180109798553540">Kvôli vyššej miere zabezpečenia budú dáta v prehliadači <ph name="PRODUCT_NAME"/> šifrované.</translation>
 <translation id="5036662165765606524">Nepovoliť žiadnym stránkam automaticky sťahovať viacero súborov súčasne</translation>
 <translation id="8190193592390505034">Prebieha pripájanie na stránku <ph name="PROVIDER_NAME"/></translation>
-<translation id="2433452467737464329">Pridajte parameter dopytu do adresy URL na automatické obnovenie stránky: chrome://network/?refresh=&lt;sec&gt;</translation>
+<translation id="2433452467737464329">Pridajte parameter dopytu do webovej adresy na automatické obnovenie stránky: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="8712637175834984815">Rozumiem</translation>
 <translation id="6144890426075165477"><ph name="PRODUCT_NAME"/> nie je momentálne váš predvolený prehliadač.</translation>
 <translation id="4068506536726151626">Táto stránka obsahuje prvky z nasledujúcich webových stránok, ktoré sledujú vašu polohu:</translation>
@@ -3036,7 +3036,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="1934636348456381428">Povoliť implementáciu experimentálnych prekryvných posúvačov. Aby sa dali posúvače animovať, musíte tiež povoliť vláknovú kompozíciu.</translation>
 <translation id="8666678546361132282">angličtina</translation>
 <translation id="326999365752735949">Súbor diff sa sťahuje</translation>
-<translation id="2088987319443758674">Povolenie postupu vytvorenia aplikácií pomocou adresy URL.</translation>
+<translation id="2088987319443758674">Povolenie postupu vytvorenia aplikácií pomocou webovej adresy.</translation>
 <translation id="2224551243087462610">Upraviť názov priečinka</translation>
 <translation id="7222245588540287464">Určuje, či je alebo nie je povolené kontextové vyhľadávanie.</translation>
 <translation id="1358741672408003399">Pravopis a gramatika</translation>
@@ -3138,7 +3138,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="3685121001045880436">Server, ktorý hostí webovú stránku, bol pravdepodobne preťažený alebo sa na ňom vyskytla chyba.
        Z dôvodu zabránenia rozšíreniam vo zvyšovaní návštevnosti a v spôsobovaní ďalších ťažkostí aplikácia
         <ph name="PRODUCT_NAME"/>
-       dočasne zastavila žiadosti rozšírení na danú adresu URL.
+       dočasne zastavila žiadosti rozšírení na danú webovú adresu.
         <ph name="LINE_BREAK"/>
         Ak sa domnievate, že je toto správanie nežiaduce, napríklad pri ladení vlastných webových stránok, navštívte
         adresu <ph name="URL_FOR_MORE_INFO"/>,
@@ -3164,7 +3164,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="7582582252461552277">Preferovať túto sieť</translation>
 <translation id="3574305903863751447"><ph name="CITY"/>, <ph name="STATE"/> <ph name="COUNTRY"/></translation>
 <translation id="8724859055372736596">&amp;Zobraziť v priečinku</translation>
-<translation id="5990198433782424697">Rozšírenia na adresách URL typu chrome://</translation>
+<translation id="5990198433782424697">Rozšírenia na webových adresách typu chrome://</translation>
 <translation id="7456142309650173560">dev</translation>
 <translation id="4605399136610325267">Pripojenie na Internet nie je k dispozícii</translation>
 <translation id="6797493596609571643">Hops, niečo sa pokazilo.</translation>
@@ -3325,7 +3325,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="7418949474175272990">Táto možnosť zakáže v rozhraní WebRTC podporu kódovania streamov videa pomocou hardvéru platformy.</translation>
 <translation id="2344028582131185878">Automatické stiahnutia</translation>
 <translation id="155865706765934889">Touchpad</translation>
-<translation id="3308134619352333507">Tlačidlo Skryť</translation>
+<translation id="3308134619352333507">Skryť tlačidlo</translation>
 <translation id="7701040980221191251">Žiadne</translation>
 <translation id="1062407476771304334">Nahradiť</translation>
 <translation id="2266168284394154563">Obnoviť veľkosť obrazovky</translation>
@@ -3333,7 +3333,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="5917011688104426363">Zamerať adresovú lištu pri vyhľadávaní</translation>
 <translation id="3269101346657272573">Zadajte kód PIN.</translation>
 <translation id="2822854841007275488">Arabské</translation>
-<translation id="6559948977408379772">Táto ikona sa zobrazí, keď ste blízko k telefónu a je k dispozícii funkcia Jednoduché odomknutie. Na vstúpenie stačí kliknúť, nie je potrebné zadávať heslo.</translation>
+<translation id="6559948977408379772">Táto ikona sa zobrazí, keď ste s telefónom nablízku a je k dispozícii funkcia jednoduchého odomknutia. Na vstúpenie stačí kliknúť, nie je potrebné zadávať heslo.</translation>
 <translation id="5857090052475505287">Nový priečinok</translation>
 <translation id="7450732239874446337">Vstupné a výstupné funkcie siete boli pozastavené.</translation>
 <translation id="4003393903129308792">Povolenie nástroja na rastrovanie jednej kópie</translation>
@@ -3358,7 +3358,7 @@ Uistite sa, že neodhaľujete žiadne citlivé informácie.</translation>
 <translation id="5227808808023563348">Nájsť predchádzajúci text</translation>
 <translation id="4561162271279554092">Zakázať enumeráciu zariadenia WebRTC.</translation>
 <translation id="3012917896646559015">Okamžite kontaktujte výrobcu hardvéru, aby počítač poslal na opravu.</translation>
-<translation id="3694678678240097321">Vyžaduje súhlas používateľa pre rozšírenie vykonávajúce skript na stránke v prípade, že toto rozšírenie žiada o povolenie spustiť skript na všetkých adresách URL.</translation>
+<translation id="3694678678240097321">Vyžaduje súhlas používateľa pre rozšírenie vykonávajúce skript na stránke v prípade, že toto rozšírenie žiada o povolenie spustiť skript na všetkých webových adresách.</translation>
 <translation id="902638246363752736">Nastavenia klávesnice</translation>
 <translation id="7925686952655276919">Nepoužívať mobilné dátové prenosy na synchronizáciu</translation>
 <translation id="8014914694548037591">Toto rozšírenie môže čítať a zmeniť vaše informácie na všetkých webových stránkach vrátane stránok Google, Facebook, Yahoo atď.</translation>
@@ -3453,10 +3453,10 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="1526560967942511387">Dokument bez názvu</translation>
 <translation id="3979748722126423326">Povoliť <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA alebo RSN)</translation>
-<translation id="7561031016893995297">Zariadenia používané s funkciou Jednoduché odomknutie môžete spravovať v nastaveniach účtu.</translation>
+<translation id="7561031016893995297">Zariadenia na jednoduché odomknutie môžete spravovať v nastaveniach účtu.</translation>
 <translation id="2238379619048995541">Údaje stavu frekvencie</translation>
-<translation id="4367133129601245178">K&amp;opírovať adresu URL obrázka</translation>
-<translation id="6326175484149238433">Odstrániť z prehliadača Chrome</translation>
+<translation id="4367133129601245178">K&amp;opírovať webovú adresu obrázka</translation>
+<translation id="6326175484149238433">Odstrániť z prehliadača</translation>
 <translation id="2554553592469060349">Vybratý súbor je príliš veľký (maximálna veľkosť: 3 MB).</translation>
 <translation id="3494444535872870968">Uložiť &amp;rámec ako...</translation>
 <translation id="5196716972587102051">2</translation>
@@ -3549,7 +3549,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="3788401245189148511">Mohli by:</translation>
 <translation id="8926518602592448999">Zakázanie rozšírení spustených v režime vývojára</translation>
 <translation id="2902734494705624966">Americká klávesnica s rozšíreným rozložením klávesov</translation>
-<translation id="5793220536715630615">K&amp;opírovať adresu URL videa</translation>
+<translation id="5793220536715630615">K&amp;opírovať webovú adresu videa</translation>
 <translation id="523397668577733901">Chcete namiesto toho <ph name="BEGIN_LINK"/>prehliadať galériu<ph name="END_LINK"/>?</translation>
 <translation id="2922350208395188000">Certifikát servera sa nedá overiť.</translation>
 <translation id="3778740492972734840">&amp;Nástroje pre vývojárov</translation>
@@ -3616,7 +3616,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="2070909990982335904">Názvy začínajúce bodkou sú vyhradené pre systém. Vyberte iný názov.</translation>
 <translation id="3707020109030358290">Vybratá položka nie je certifikačnou autoritou.</translation>
 <translation id="5293659407874396561"><ph name="SUBJECT"/> ( <ph name="ISSUER"/> )</translation>
-<translation id="2115926821277323019">Musíte zadať platnú adresu URL</translation>
+<translation id="2115926821277323019">Musíte zadať platnú webovú adresu</translation>
 <translation id="3464726836683998962">Zakázať roaming pre mobilné dátové prenosy</translation>
 <translation id="5321676762462132688">Ak je táto funkcia povolená, nebudú sa Nastavenia zobrazovať na karte prehliadača, ale v samostatnom okne.</translation>
 <translation id="8986494364107987395">Automaticky odosielať štatistiky o používaní a správy o zlyhaní spoločnosti Google</translation>
@@ -3789,7 +3789,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="3915280005470252504">Vyhľadávanie podľa hlasu</translation>
 <translation id="3752582316358263300">OK...</translation>
 <translation id="6224481128663248237">Formátovanie bolo úspešne dokončené.</translation>
-<translation id="3065140616557457172">Zadajte text na vyhľadávanie alebo adresu URL – funguje všetko.</translation>
+<translation id="3065140616557457172">Zadajte text na vyhľadávanie alebo webovú adresu – funguje všetko.</translation>
 <translation id="3643454140968246241">Prebieha synchronizácia <ph name="COUNT"/> súborov...</translation>
 <translation id="5801379388827258083">Sťahovanie slovníka na kontrolu pravopisu...</translation>
 <translation id="5509693895992845810">Uložiť &amp;ako...</translation>
@@ -3842,7 +3842,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="5699533844376998780">Rozšírenie <ph name="EXTENSION_NAME"/> bolo pridané.</translation>
 <translation id="1430915738399379752">Tlačiť</translation>
 <translation id="7999087758969799248">Štandardná metóda vstupu</translation>
-<translation id="8958084571232797708">Použiť adresu URL automatickej konfigurácie</translation>
+<translation id="8958084571232797708">Použiť webovú adresu automatickej konfigurácie</translation>
 <translation id="2635276683026132559">Podpísanie</translation>
 <translation id="4835836146030131423">Chyba prihlásenia.</translation>
 <translation id="2475982808118771221">Vyskytla sa chyba</translation>
@@ -3922,7 +3922,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="6105366316359454748">Server proxy je server, ktorý pôsobí ako sprostredkovateľ medzi zariadením a inými servermi. Váš systém je momentálne nakonfigurovaný tak, aby používal server proxy, ale prehliadač
           <ph name="PRODUCT_NAME"/>
           sa k nemu nemôže pripojiť.</translation>
-<translation id="8535005006684281994">Netscape – adresa URL pre obnovenie certifikátu</translation>
+<translation id="8535005006684281994">Netscape – webová adresa pre obnovenie certifikátu</translation>
 <translation id="6970856801391541997">Vytlačiť konkrétne stránky</translation>
 <translation id="7828106701649804503">Zadajte predvolenú hodnotu šírky dlaždice.</translation>
 <translation id="2440604414813129000">&amp;Zobraziť zdrojový kód</translation>
@@ -3955,6 +3955,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="6460601847208524483">Nájsť ďalšie</translation>
 <translation id="397703832102027365">Prebieha dokončovanie...</translation>
 <translation id="8146177459103116374">Ak ste sa na tomto zariadení už zaregistrovali, môžete sa <ph name="LINK2_START"/>prihlásiť ako existujúci používateľ<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Zobraziť spravované záložky</translation>
 <translation id="4856478137399998590">Vaša mobilná dátová služba je aktivovaná a pripravená na použitie</translation>
 <translation id="3305389145870741612">Proces formátovania môže trvať niekoľko sekúnd. Čakajte prosím.</translation>
 <translation id="3648607100222897006">Tieto experimentálne funkcie sa môžu kedykoľvek zmeniť, pokaziť alebo zmiznúť. Za dôsledky používania týchto experimentov neručíme. Váš prehliadač sa môže samovoľne vznietiť. Ale teraz vážne. Prehliadač môže odstrániť všetky vaše dáta alebo nečakanými spôsobmi narušiť zabezpečenie či ochranu osobných údajov. Experimenty, ktoré povolíte, budú k dispozícii všetkým používateľom tohto prehliadača. Buďte preto opatrní.</translation>
@@ -4201,7 +4202,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="3592260987370335752">&amp;Viac informácií</translation>
 <translation id="3631337165634322335">Výnimky uvedené nižšie platia len pre aktuálnu reláciu režimu inkognito.</translation>
 <translation id="676327646545845024">Pri odkazoch tohto typu dialógové okno už nikdy nezobrazovať.</translation>
-<translation id="1485146213770915382">Vložiť <ph name="SEARCH_TERMS_LITERAL"/> do adresy URL, kde by sa mali zobraziť hľadané slová.</translation>
+<translation id="1485146213770915382">Vložiť <ph name="SEARCH_TERMS_LITERAL"/> do webovej adresy, kde by sa mali zobraziť hľadané slová.</translation>
 <translation id="8141725884565838206">Správa hesiel</translation>
 <translation id="4839303808932127586">Uložiť &amp;video ako...</translation>
 <translation id="317583078218509884">Nové nastavenia povolení webových stránok sa prejavia po opätovnom načítaní stránky.</translation>
@@ -4238,7 +4239,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="2524800364695118482">Povolené:</translation>
 <translation id="6782622603507084740">Povoliť rozhranie EmbeddedSearch API</translation>
 <translation id="4348766275249686434">Zhromažďovanie chýb</translation>
-<translation id="3298789223962368867">Zadali ste neplatnú adresu URL.</translation>
+<translation id="3298789223962368867">Zadali ste neplatnú webovú adresu.</translation>
 <translation id="2202898655984161076">Pri vytváraní zoznamu tlačiarní sa vyskytol problém. Niektoré z vašich tlačiarní možno nie sú v službe <ph name="CLOUD_PRINT_NAME"/> registrované.</translation>
 <translation id="6154697846084421647">Používateľ prihlásený</translation>
 <translation id="1454188386658974462">Opätovné zadanie hesla vám umožní prihlásiť sa v režime offline.</translation>
@@ -4299,7 +4300,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="8632275030377321303">Používateľ nemôže meniť server proxy.</translation>
 <translation id="6449285849137521213">Aplikácia <ph name="EXTENSION_NAME"/> je pridaná.</translation>
 <translation id="6516193643535292276">Nepodarilo sa pripojiť do siete Internet</translation>
-<translation id="5125751979347152379">Neplatná adresa URL.</translation>
+<translation id="5125751979347152379">Neplatná webová adresa.</translation>
 <translation id="9045796838688435193">odkazy <ph name="PROTOCOL"/> namiesto <ph name="REPLACED_HANDLER_TITLE"/></translation>
 <translation id="4467801982834340084">Identita spoločnosti <ph name="ORGANIZATION"/> na adrese <ph name="LOCALITY"/> bola overená vydavateľom <ph name="ISSUER"/>, avšak neobsahuje žiadne verejné záznamy auditu.</translation>
 <translation id="8206354486702514201">Toto nastavenie je vynútené správcom.</translation>
@@ -4386,6 +4387,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="6869402422344886127">Vybraté začiarkavacie políčko</translation>
 <translation id="3428010780253032925">Zakázať zacielenie prostredníctvom plochy v tvare obdĺžnika v zobrazeniach</translation>
 <translation id="5637380810526272785">Metóda vstupu</translation>
+<translation id="3613134908380545408">Zobraziť priečinok <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Pokus o pripojenie pomocou staršej verzie protokolu TLS alebo SSL musel prebehnúť opakovane. Obvykle to znamená, že server používa zastaraný softvér a môže mať iné problémy so zabezpečením.</translation>
 <translation id="404928562651467259">UPOZORNENIE</translation>
 <translation id="4289300219472526559">Začať hovoriť</translation>
@@ -4410,7 +4412,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="7792486981525357145">Pridajte si tlačiareň do služby Google Cloud Print, aby ste mohli tlačiť odkiaľkoľvek.</translation>
 <translation id="4557136421275541763">Upozornenie:</translation>
 <translation id="3872687746103784075">Ladenie aplikácie Native Client založené na nástroji GDB</translation>
-<translation id="4467798014533545464">Zobraziť adresu URL</translation>
+<translation id="4467798014533545464">Zobraziť webovú adresu</translation>
 <translation id="5923417893962158855">Prebieha niekoľko sťahovaní inkognito</translation>
 <translation id="1227507814927581609">Overenie totožnosti počas pripájania k zariadeniu <ph name="DEVICE_NAME"/> zlyhalo.</translation>
 <translation id="7136694880210472378">Nastaviť ako predvolený</translation>
@@ -4454,7 +4456,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="8148264977957212129">Metóda vstupu Pinyin</translation>
 <translation id="2288278176040912387">Gramofón</translation>
 <translation id="7772032839648071052">Potvrďte prístupovú frázu</translation>
-<translation id="3676582787770338561">Povoliť na tomto zariadení <ph name="DEVICE_TYPE"/> funkciu Jednoduché odomknutie.</translation>
+<translation id="3676582787770338561">Povoliť na tomto zariadení <ph name="DEVICE_TYPE"/> funkciu jednoduchého odomknutia.</translation>
 <translation id="2871813825302180988">Tento účet sa už v tomto zariadení používa.</translation>
 <translation id="1642505962779453775">Posledný štvrťrok</translation>
 <translation id="3323235640813116393">Povolí ukladanie stránok iba vo formáte MHTML, t. j. do jedného textového súboru s kódom HTML a so všetkými čiastkovými zdrojmi.</translation>
@@ -4577,7 +4579,7 @@ Do úplného nabitia zostáva: <ph name="HOUR"/>:<ph name="MINUTE"/></translatio
 <translation id="1986281090560408715">Povolí zobrazenie Heads-Up Display (HUD) v ľavom hornom rohu obrazovky, na ktorej sú uvedené informácie o dotykových bodoch na obrazovke.</translation>
 <translation id="1547964879613821194">Kanadská anglická klávesnica</translation>
 <translation id="2986010903908656993">Tejto stránke bola zablokovaná úplná kontrola nad zariadeniami MIDI.</translation>
-<translation id="8323167517179506834">Zadajte adresu URL</translation>
+<translation id="8323167517179506834">Zadajte webovú adresu</translation>
 <translation id="4264549073314009907">Restrict Native Client GDB-based debugging by pattern</translation>
 <translation id="4786993863723020412">Chyba pri čítaní vyrovnávacej pamäte</translation>
 <translation id="6630452975878488444">Skratka výberu</translation>
@@ -4644,7 +4646,7 @@ Prebieha výpočet času do úplného nabitia</translation>
 <translation id="2509857212037838238">Nainštalovať doplnok <ph name="PLUGIN_NAME"/></translation>
 <translation id="2943400156390503548">Prezentácie</translation>
 <translation id="3790146417033334899">Doplnok <ph name="PLUGIN_NAME"/> funguje iba v režime plochy.</translation>
-<translation id="5117930984404104619">Sledovať správanie ďalších rozšírení vrátane navštívených adries URL</translation>
+<translation id="5117930984404104619">Sledovať správanie ďalších rozšírení vrátane navštívených webových adries</translation>
 <translation id="33022249435934718">GDI – popisovače</translation>
 <translation id="6308937455967653460">Uložiť &amp;odkaz ako...</translation>
 <translation id="741689768643916402">U tohto obchodníka môžu Peňaženku Google používať iba kupujúci s adresou v Spojených štátoch. Ak bývate v Spojených štátoch, zmeňte si v službe Peňaženka svoju adresu bydliska alebo zaplaťte bez použitia Peňaženky Google.</translation>
@@ -4718,6 +4720,7 @@ Prebieha výpočet času do úplného nabitia</translation>
 <translation id="6934265752871836553">Použije kód pre presahujúce okraje, aby prehliadač Chrome vykreslil obsah rýchlejšie. Zmeny
         v tejto ceste pravdepodobne spôsobia, že sa množstvo obsahu nezobrazí správne.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Vždy otvoriť v programe Adobe Reader</translation>
 <translation id="8274359292107649245">Otvoriť prehliadač Chrome na počítači</translation>
 <translation id="1571119610742640910">Skladanie pre pevne fixované pozadia na koreňovej úrovni.</translation>
 <translation id="6514565641373682518">Táto stránka zakázala kurzor myši.</translation>
@@ -4726,7 +4729,7 @@ Prebieha výpočet času do úplného nabitia</translation>
 <translation id="9003647077635673607">Povoliť na všetkých webových stránkach</translation>
 <translation id="6837930996380214191">Aktuálne povolenia</translation>
 <translation id="8689341121182997459">Koniec platnosti:</translation>
-<translation id="899403249577094719">Netscape – základná adresa URL certifikátu</translation>
+<translation id="899403249577094719">Netscape – základná webová adresa certifikátu</translation>
 <translation id="2737363922397526254">Zbaliť...</translation>
 <translation id="8605428685123651449">Pamäť nástroja SQLite</translation>
 <translation id="7498566414244653415">Zakáže objekt MediaSource. Tento objekt umožňuje jazyku JavaScript odosielať údaje médií priamo do prvku videa.</translation>
@@ -4794,7 +4797,7 @@ Prebieha výpočet času do úplného nabitia</translation>
 <translation id="1952456732281820252">Chcete pridať odkaz?</translation>
 <translation id="2470702053775288986">Nepodporovaný typ rozšírenia bol zakázaný</translation>
 <translation id="5461512418490148136">Chvíľku vydržte. Vaše súbory práve načítavame.</translation>
-<translation id="4268574628540273656">Adresa URL:</translation>
+<translation id="4268574628540273656">Webová adresa:</translation>
 <translation id="2766585356456507052">Identita spoločnosti <ph name="ORGANIZATION"/> na adrese <ph name="LOCALITY"/> bola overená vydavateľom <ph name="ISSUER"/>, avšak verejné záznamy auditu uvedené spoločnosťou nie je možné overiť.</translation>
 <translation id="7481312909269577407">Dopredu</translation>
 <translation id="5972826969634861500">Spustiť <ph name="PRODUCT_NAME"/></translation>
@@ -4803,7 +4806,7 @@ Prebieha výpočet času do úplného nabitia</translation>
 <translation id="6522797484310591766">Prihlásiť sa</translation>
 <translation id="878069093594050299">Tento certifikát bol overený pre nasledujúce typy použitia:</translation>
 <translation id="7334320624316649418">&amp;Znova zmeniť poradie</translation>
-<translation id="815491593104042026">Hops! Overenie zlyhalo, pretože bolo nakonfigurované tak, aby použilo nezabezpečenú adresu URL (<ph name="BLOCKED_URL"/>). Kontaktuje svojho správcu.</translation>
+<translation id="815491593104042026">Hops! Overenie zlyhalo, pretože bolo nakonfigurované tak, aby použilo nezabezpečenú webovú adresu (<ph name="BLOCKED_URL"/>). Kontaktuje svojho správcu.</translation>
 <translation id="5852112051279473187">Hops! Pri registrácii tohto zariadenia sa vyskytla závažná chyba. Skúste to znova alebo kontaktujte svojho zástupcu podpory.</translation>
 <translation id="7547449991467640000">Znova načítať ap&amp;likáciu</translation>
 <translation id="6894066781028910720">Otvoriť správcu súborov</translation>
@@ -4918,6 +4921,7 @@ Ak chcete pokračovať v práci, stlačte ľubovoľný kláves.</translation>
 <translation id="824543159844843373">Aktivovať položku spúšťača č. 3</translation>
 <translation id="3819800052061700452">&amp;Celá obrazovka</translation>
 <translation id="48607902311828362">Režim V lietadle</translation>
+<translation id="711840821796638741">Zobraziť spravované záložky</translation>
 <translation id="3360297538363969800">Tlač zlyhala. Skontrolujte tlačiareň a skúste to znova.</translation>
 <translation id="680572642341004180">Povoliť v aplikácii <ph name="SHORT_PRODUCT_OS_NAME"/> sledovanie RLZ.</translation>
 <translation id="688797901999351107">Prestaňte používať model nabíjačky stiahnutý z trhu.</translation>
@@ -4951,7 +4955,7 @@ Ak chcete pokračovať v práci, stlačte ľubovoľný kláves.</translation>
 <translation id="8054517699425078995">Tento typ súboru môže poškodiť vaše zariadenie. Chcete súbor <ph name="FILE_NAME"/> aj napriek tomu zachovať?</translation>
 <translation id="3093189737735839308">Naozaj chcete nainštalovať doplnok <ph name="PLUGIN_NAME"/>? Mali by ste inštalovať iba doplnky, ktorým dôverujete.</translation>
 <translation id="1928696683969751773">Aktualizácie</translation>
-<translation id="6545834809683560467">Používať službu predpokladaných dopytov, ktorá pomáha dokončovať hľadané výrazy a adresy URL zadávané do panela s adresou alebo do vyhľadávacieho poľa spúšťača aplikácií</translation>
+<translation id="6545834809683560467">Používať službu predpokladaných dopytov, ktorá pomáha dokončovať hľadané výrazy a webové adresy zadávané do panela s adresou alebo do vyhľadávacieho poľa spúšťača aplikácií</translation>
 <translation id="3582792037806681688">Pre používateľa v tejto relácii bolo viacnásobné prihlásenie zakázané</translation>
 <translation id="3488065109653206955">Čiastočne aktivované</translation>
 <translation id="3683524264665795342">Žiadosť o zdieľanie obrazovky s aplikáciou <ph name="APP_NAME"/></translation>
@@ -5064,7 +5068,7 @@ Ak chcete využívať túto funkciu, musíte sa prihlásiť.</translation>
 <translation id="4093955363990068916">Miestny súbor:</translation>
 <translation id="1918141783557917887">&amp;Menší</translation>
 <translation id="6996550240668667907">Zobraziť prekryvnú vrstvu klávesnice</translation>
-<translation id="4065006016613364460">K&amp;opírovať adresu URL obrázka</translation>
+<translation id="4065006016613364460">K&amp;opírovať webovú adresu obrázka</translation>
 <translation id="7793784423225723647">Ukončiť ukážku</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="421182450098841253">&amp;Zobraziť panel so záložkami</translation>
@@ -5146,7 +5150,7 @@ Ak chcete využívať túto funkciu, musíte sa prihlásiť.</translation>
 <translation id="7167486101654761064">&amp;Vždy otvoriť súbory tohto typu</translation>
 <translation id="6218364611373262432">Obnoviť stav inštalácie Spúšťača aplikácií pri každom reštartovaní. Keď je tento príznak nastavený, prehliadač Chrome zabudne pri každom spustení, že spúšťač bol nainštalovaný. Táto možnosť sa používa na testovanie inštalačného postupu spúšťača aplikácií.</translation>
 <translation id="4396124683129237657">Nová kreditná karta...</translation>
-<translation id="4103763322291513355">Na stránke &lt;strong&gt;chrome://policy&lt;/strong&gt; nájdete zoznam zakázaných adries URL a ďalšie pravidlá vynútené vaším správcom systému.</translation>
+<translation id="4103763322291513355">Na stránke &lt;strong&gt;chrome://policy&lt;/strong&gt; nájdete zoznam zakázaných webových adries a ďalšie pravidlá vynútené vaším správcom systému.</translation>
 <translation id="8799314737325793817">Zobraziť viac...</translation>
 <translation id="5826507051599432481">Bežný názov (CN)</translation>
 <translation id="8914326144705007149">Veľmi veľké</translation>
@@ -5235,7 +5239,7 @@ Súbor kľúča uložte na bezpečné miesto. Budete ho potrebovať na vytvoreni
 <translation id="8571108619753148184">Server 4</translation>
 <translation id="4508765956121923607">&amp;Zobraziť zdrojový kód</translation>
 <translation id="5975083100439434680">Oddialiť</translation>
-<translation id="8080048886850452639">K&amp;opírovať adresu URL zvuku</translation>
+<translation id="8080048886850452639">K&amp;opírovať webovú adresu zvuku</translation>
 <translation id="2817109084437064140">Importovať a spojiť so zariadením...</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET"/>) <ph name="LONGTZNAME"/> (<ph name="EXEMPLARCITY"/>)</translation>
 <translation id="2813137708069460534">Metriky súvisiace s využitím siete prehliadačom <ph name="SHORT_PRODUCT_NAME"/></translation>
index 6133fe3..03d6752 100644 (file)
@@ -71,7 +71,7 @@
 <translation id="368260109873638734">Podrobnosti o težavah na tem spletnem mestu</translation>
 <translation id="7409233648990234464">Znova zaženi in izvedi funkcijo Powerwash</translation>
 <translation id="7428534988046001922">Nameščeni so ti programi:</translation>
-<translation id="787386463582943251">Dodaj e-poštni naslov</translation>
+<translation id="787386463582943251">Dodajte e-poštni naslov</translation>
 <translation id="2833791489321462313">Zahtevaj geslo za prehod iz stanja pripravljenosti</translation>
 <translation id="8208216423136871611">Ne shrani</translation>
 <translation id="4405141258442788789">Časovna omejitev operacije je potekla.</translation>
 <translation id="2437838871182492352">Dogodki, ko je bila razširitev omogočena</translation>
 <translation id="9050666287014529139">Geslo</translation>
 <translation id="5197255632782567636">Internet</translation>
-<translation id="8787254343425541995">Dovoli proxyije za omrežja v skupni rabi</translation>
+<translation id="8787254343425541995">Dovoli proxyje za omrežja v skupni rabi</translation>
 <translation id="4755860829306298968">Upravljanje blokiranja vtičnikov ...</translation>
 <translation id="8879284080359814990">&amp;Pokaži kot zavihek</translation>
 <translation id="4314714876846249089"><ph name="PRODUCT_NAME"/>
 <translation id="6508261954199872201">Program: <ph name="APP_NAME"/></translation>
 <translation id="3700528541715530410">Videti je, da nimate pravice za dostop do te strani.</translation>
 <translation id="2713008223070811050">Upravljanje zaslonov</translation>
-<translation id="5145331109270917438">Po datumu spremembe</translation>
+<translation id="5145331109270917438">Datum spremembe</translation>
 <translation id="6596816719288285829">Naslov IP</translation>
 <translation id="7603461642606849762">Išči napake samo, če se URL manifesta konča z debug.nmf.</translation>
 <translation id="8656768832129462377">Ne preverjaj</translation>
 <translation id="3984921062031549150">Zmrznjen upodabljalnik</translation>
 <translation id="7925285046818567682">Čakam <ph name="HOST_NAME"/> ...</translation>
 <translation id="1079766198702302550">Vedno prepreči dostop do kamere</translation>
-<translation id="2964845078799970531">Funkcija Easy Unlock vam omogoča odklepanje Chromebooka, ko je v bližini vašega telefona.</translation>
+<translation id="2964845078799970531">Funkcija Preprosto odklepanje vam omogoča odklepanje Chromebooka, ko je v bližini vašega telefona.</translation>
 <translation id="5053803681436838483">Nov naslov za pošiljanje ...</translation>
 <translation id="5952256601775839173">Omogoči klik s tremi prsti na sledilni ploščici.</translation>
 <translation id="3280237271814976245">Shrani &amp;kot ...</translation>
@@ -1055,7 +1055,7 @@ Pst! Naslednjič vam lahko pride prav bližnjica <ph name="SHORTCUT_KEY"/> za na
 <translation id="409504436206021213">Ne naloži znova</translation>
 <translation id="3785308913036335955">Pokaži bližnjico do aplikacij</translation>
 <translation id="8795916974678578410">Novo okno</translation>
-<translation id="2733275712367076659">Imate potrdila teh organizacij, ki vas določajo:</translation>
+<translation id="2733275712367076659">Imate potrdila teh organizacij, ki vas identificirajo:</translation>
 <translation id="230927227160767054">Ta stran želi namestiti rutino za obravnavo storitev.</translation>
 <translation id="5334142896108694079">Predpomnilnik za skripte</translation>
 <translation id="4801512016965057443">Dovoli mobilno podatkovno gostovanje</translation>
@@ -1297,7 +1297,7 @@ Pst! Naslednjič vam lahko pride prav bližnjica <ph name="SHORTCUT_KEY"/> za na
 <translation id="9033857511263905942">&amp;Prilepi</translation>
 <translation id="1028690605877243613">Uporabi nadomestno postavitev polic.</translation>
 <translation id="6736045498964449756">Ojoj, gesli se ne ujemata!</translation>
-<translation id="4558985768677321342">Omogoči funkcijo Easy Unlock.</translation>
+<translation id="4558985768677321342">Omogoči preprosto odklepanje.</translation>
 <translation id="1221825588892235038">Samo izbor</translation>
 <translation id="2227939492629426903">Omogoči novi meni za avatar. Pri upravljanju novega profila se prikaže meni za avatar. V nasprotnem primeru se prikaže preurejeni meni za avatar z enakimi funkcijami, kot jih je imel prejšnji, in z dodatno kartico z vadnico na vrhu, ki uporabnika poziva k preskusu novega uporabniškega vmesnika za upravljanje profila.</translation>
 <translation id="5582883434676861778">Storitev <ph name="PRODUCT_NAME"/> je blokirala dostop do <ph name="HOST_NAME"/>. Sporočili so nam, da je to spletno mesto z lažnim predstavljanjem.</translation>
@@ -1609,7 +1609,7 @@ Ko ustvarite novega zaščitenega uporabnika, lahko na www.chrome.com/manage kad
 <translation id="8418240940464873056">Način Hanja</translation>
 <translation id="4263757076580287579">Registracija tiskalnika je bila preklicana.</translation>
 <translation id="5788367137662787332">Vsaj ene particije v napravi <ph name="DEVICE_LABEL"/> ni bilo mogoče vpeti.</translation>
-<translation id="392089482157167418">Omogoči ChromeVox (izgovorjava povratnih informacij)</translation>
+<translation id="392089482157167418">Omogoči ChromeVox (izgovarjava povratnih informacij)</translation>
 <translation id="1886996562706621347">Dovoli spletnim mestom, da zahtevajo, da postanejo privzete rutine za obravnavo protokolov (priporočeno)</translation>
 <translation id="6736329909263487977"><ph name="ISSUED_BY"/> [<ph name="ISSUED_TO"/>]</translation>
 <translation id="8899388739470541164">Vietnamščina</translation>
@@ -3964,6 +3964,7 @@ Poskrbite, da ne boste razkrili morebitnih občutljivih podatkov.</translation>
 <translation id="6460601847208524483">Poišči naslednje</translation>
 <translation id="397703832102027365">Dokončanje ...</translation>
 <translation id="8146177459103116374">Če ste se v tej napravi že registrirali, se lahko <ph name="LINK2_START"/>prijavite kot obstoječi uporabnik<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Prikaz upravljanih zaznamkov</translation>
 <translation id="4856478137399998590">Mobilna podatkovna storitev je aktivirana in pripravljena za uporabo</translation>
 <translation id="3305389145870741612">Formatiranje lahko traja nekaj sekund. Počakajte.</translation>
 <translation id="3648607100222897006">Te poskusne funkcije se lahko kadar koli spremenijo, odpovedo ali izginejo. Ne dajemo nikakršnih jamstev o tem, kaj se lahko zgodi, če omogočite katerega od teh poskusov, vaš brskalnik pa lahko celo spontano zagori. Šalo na stran, vaš brskalnik lahko izbriše vse vaše podatke ali pa sta lahko varnost in zasebnost ogrožena na nepričakovane načine. Vsi poskusi, ki jih omogočite vi, bodo omogočeni za vse uporabnike tega brskalnika. Nadaljujte previdno.</translation>
@@ -3988,7 +3989,7 @@ Poskrbite, da ne boste razkrili morebitnih občutljivih podatkov.</translation>
 <translation id="8698464937041809063">Googlova risba</translation>
 <translation id="1539714775460645859">Omogočanje preskusnega zaganjalnika aplikacij.</translation>
 <translation id="7255935316994522020">Prijava</translation>
-<translation id="142758023928848008">Omogočanje zaklepanja tip (za vnos bližnjičnih tipk z zaporednim tipkanjem)</translation>
+<translation id="142758023928848008">Omogočanje zaklepanja tipk (za vnos bližnjičnih tipk z zaporednim tipkanjem)</translation>
 <translation id="2836802726677668254">Nova različica</translation>
 <translation id="5233930340889611108">WebKit</translation>
 <translation id="8260864402787962391">Miška</translation>
@@ -4185,7 +4186,7 @@ Poskrbite, da ne boste razkrili morebitnih občutljivih podatkov.</translation>
 <translation id="3968103409306279789">Ali je omogočen novi slog strani »Nov zavihek«.</translation>
 <translation id="6225378837831321064"><ph name="DEVICE_NAME"/>: Povezovanje ...</translation>
 <translation id="3593965109698325041">Omejitve imena potrdila</translation>
-<translation id="4358697938732213860">Dodaj naslov</translation>
+<translation id="4358697938732213860">Dodajanje naslova </translation>
 <translation id="8396532978067103567">Napačno geslo.</translation>
 <translation id="5981759340456370804">Statistika za piflarje</translation>
 <translation id="9035022520814077154">Varnostna napaka</translation>
@@ -4367,8 +4368,7 @@ Poskrbite, da ne boste razkrili morebitnih občutljivih podatkov.</translation>
 <translation id="716640248772308851">Razširitev »<ph name="EXTENSION"/>« lahko prebere slike ter videodatoteke in zvočne datoteke na označenih lokacijah.</translation>
 <translation id="7887864092952184874">Miška Bluetooth je seznanjena</translation>
 <translation id="7649070708921625228">Pomoč</translation>
-<translation id="858637041960032120">Dodaj tel. št.
-</translation>
+<translation id="858637041960032120">Dodajte tel. št. </translation>
 <translation id="3210492393564338011">Izbriši uporabnika</translation>
 <translation id="6637478299472506933">Prenos ni uspel</translation>
 <translation id="3242118113727675434">Prikaži opozorilni zaslon za točke dotika</translation>
@@ -4395,6 +4395,7 @@ Poskrbite, da ne boste razkrili morebitnih občutljivih podatkov.</translation>
 <translation id="6869402422344886127">Potrjeno potrditveno polje</translation>
 <translation id="3428010780253032925">Onemogoči ciljanje na podlagi pravokotnika v pogledih</translation>
 <translation id="5637380810526272785">Vnosna metoda</translation>
+<translation id="3613134908380545408">Pokaži <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Potrebna je bila vnovična povezava s starejšo različico protokola TLS ali SSL. To navadno pomeni, da strežnik uporablja zastarelo programsko opremo ali ima druge varnostne težave.</translation>
 <translation id="404928562651467259">OPOZORILO</translation>
 <translation id="4289300219472526559">Start Speaking</translation>
@@ -4578,7 +4579,7 @@ Poskrbite, da ne boste razkrili morebitnih občutljivih podatkov.</translation>
 <translation id="1932098463447129402">Ne pred</translation>
 <translation id="5409029099497331039">Preseneti me</translation>
 <translation id="7845920762538502375"><ph name="PRODUCT_NAME"/> ni mogel sinhronizirati podatkov, ker se ni mogel povezati v strežnik za sinhronizacijo. Vnovični poskus ...</translation>
-<translation id="3819415294190923087">Izbira omrežja</translation>
+<translation id="3819415294190923087">Izberite omrežje:</translation>
 <translation id="7325437708553334317">Visokokontrastna razširitev</translation>
 <translation id="9203394577866137354">Stanje preverjanja</translation>
 <translation id="4076313158939304412">Zaščitite plačilo z Google Denarnico.</translation>
@@ -4728,6 +4729,7 @@ izračun časa do napolnjenosti</translation>
 <translation id="6934265752871836553">Uporaba najnaprednejše kode, da bo Chrome hitreje upodabljal vsebino. Spremembe,
         uporabljene pri tem, bodo zelo verjetno povzročile nedelovanje številne vsebine.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Vedno odpri v Adobe Readerju</translation>
 <translation id="8274359292107649245">Odpri Chrome na namizju</translation>
 <translation id="1571119610742640910">Sestavljanje za ozadja s fiksnim korenom.</translation>
 <translation id="6514565641373682518">Ta stran je onemogočila miškin kazalec.</translation>
@@ -4806,7 +4808,7 @@ izračun časa do napolnjenosti</translation>
 <translation id="5461512418490148136">Ostanite z nami. Vaše datoteke se prenašajo.</translation>
 <translation id="4268574628540273656">URL:</translation>
 <translation id="2766585356456507052">Identiteto organizacije <ph name="ORGANIZATION"/> na lokaciji <ph name="LOCALITY"/> je preveril izdajatelj <ph name="ISSUER"/>, vendar javnih revizijskih zapisov, ki naj bi obstajali, ni mogoče preveriti.</translation>
-<translation id="7481312909269577407">Posreduj</translation>
+<translation id="7481312909269577407">Naprej</translation>
 <translation id="5972826969634861500">Zaženi <ph name="PRODUCT_NAME"/></translation>
 <translation id="8056430285089645882">Razumem. Tega sporočila ne kaži več.</translation>
 <translation id="383652340667548381">srbščina</translation>
@@ -4928,6 +4930,7 @@ Pritisnite katero koli tipko, če želite še naprej raziskovati.</translation>
 <translation id="824543159844843373">Aktiviranje elementa 3 zaganjalnika</translation>
 <translation id="3819800052061700452">&amp;Celozaslonsko</translation>
 <translation id="48607902311828362">Način za letalo</translation>
+<translation id="711840821796638741">Prikaz upravljanih zaznamkov</translation>
 <translation id="3360297538363969800">Tiskanje ni uspelo. Preverite tiskalnik in poskusite znova.</translation>
 <translation id="680572642341004180">Omogoči sledenje RLZ v izdelku <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Nehajte uporabljati odpoklicani polnilnik.</translation>
index aaa650f..1567066 100644 (file)
 <translation id="4654488276758583406">Веома мала</translation>
 <translation id="6647228709620733774">URL адреса за опозив ауторитета за издавање Netscape сертификата</translation>
 <translation id="546411240573627095">Стил нумеричке тастатуре</translation>
-<translation id="2310216585920710503">Ð\9fодеÑ\81и Ð\88едноÑ\81Ñ\82авно откључавање</translation>
+<translation id="2310216585920710503">Ð\9fодеÑ\81и Ð\9bако откључавање</translation>
 <translation id="8425213833346101688">Промени</translation>
 <translation id="2972581237482394796">&amp;Понови радњу</translation>
 <translation id="5895138241574237353">Покрени поново</translation>
 <translation id="2566124945717127842">Powerwash ресетује <ph name="IDS_SHORT_PRODUCT_NAME"/> уређај да би био као нов.</translation>
 <translation id="3609785682760573515">Синхронизовање...</translation>
 <translation id="1383861834909034572">Отварање кад се доврши</translation>
-<translation id="5727728807527375859">Додаци, апликације и теме могу да оштете рачунар. Желите ли заиста да наставите?</translation>
+<translation id="5727728807527375859">Додаци, апликације и теме могу да оштете рачунар. Желите ли стварно да наставите?</translation>
 <translation id="3857272004253733895">Дупла пинјин шема</translation>
 <translation id="3559661023937741623">Из безбедносних разлога верификујте детаље о картици.</translation>
 <translation id="1830550083491357902">Нисте пријављени</translation>
 <translation id="413121957363593859">Компоненте</translation>
 <translation id="715487527529576698">Почетни кинески режим је поједностављени кинески</translation>
 <translation id="6522350652862471760">Омогући име и икону Google профила</translation>
-<translation id="6181259999130430430">Ð\9eмогÑ\83Ñ\9bи Ð\88едноÑ\81Ñ\82авно откључавање за овај уређај.</translation>
+<translation id="6181259999130430430">Ð\9eмогÑ\83Ñ\9bи Ð\9bако откључавање за овај уређај.</translation>
 <translation id="8703575177326907206">Ваша веза са доменом <ph name="DOMAIN"/> није шифрована.</translation>
 <translation id="6135622770221372891">ИД-ови канала</translation>
 <translation id="8472623782143987204">хардверски подржан</translation>
 <translation id="8772559521634908780">Потврда новог додатка</translation>
 <translation id="4022426551683927403">&amp;Додај у речник</translation>
 <translation id="5639549361331209298">Поново учитајте ову страницу, задржите да бисте видели више опција</translation>
-<translation id="2897878306272793870">Желите ли заиста да отворите <ph name="TAB_COUNT"/> картицa?</translation>
+<translation id="2897878306272793870">Желите ли стварно да отворите <ph name="TAB_COUNT"/> картицa?</translation>
 <translation id="312759608736432009">Произвођач уређаја:</translation>
 <translation id="4814834690657896884">„<ph name="CLIENT_NAME"/>“ отклања грешке са ове картице.</translation>
 <translation id="1225177025209879837">Обрада захтева...</translation>
 <translation id="2801702994096586034">3. сервер</translation>
 <translation id="1598604884989842103">Омогући кориснички интерфејс за TouchView увећање ради тестирања</translation>
 <translation id="7109201843684542153">Промените начин дељења ових датотека.</translation>
-<translation id="4580526846085481512">Да ли заиста желите да избришете $1 ставке(и)?</translation>
+<translation id="4580526846085481512">Да ли стварно желите да избришете $1 ставке(и)?</translation>
 <translation id="5292890015345653304">Уметните SD картицу или USB меморијски уређај</translation>
 <translation id="5583370583559395927">Преостало време: <ph name="TIME_REMAINING"/></translation>
 <translation id="6219717821796422795">Ханју</translation>
 <translation id="220136339105966669">Затвори Ash радну површину</translation>
 <translation id="6589706261477377614">Повећавање осветљености тастера</translation>
 <translation id="1367951781824006909">Изабери датотеку</translation>
-<translation id="8311778656528046050">Да ли заиста желите да поново учитате ову страницу?</translation>
+<translation id="8311778656528046050">Да ли стварно желите да поново учитате ову страницу?</translation>
 <translation id="1425127764082410430">&amp;Претражи „<ph name="SEARCH_TERMS"/>“ на <ph name="SEARCH_ENGINE"/> претраживачу</translation>
 <translation id="1187722533808055681">Буђења из стања мировања</translation>
 <translation id="2027538664690697700">Ажурирај додатну компоненту...</translation>
 <translation id="1815083418640426271">Налепи као чисти текст</translation>
 <translation id="39964277676607559">Није могуће учитати javascript „<ph name="RELATIVE_PATH"/>“ за скрипту садржаја.</translation>
 <translation id="979598830323579437">Увећање зума лупе</translation>
-<translation id="4284105660453474798">Да ли заиста желите да избришете „$1“?</translation>
+<translation id="4284105660453474798">Да ли стварно желите да избришете „$1“?</translation>
 <translation id="1600857548979126453">Приступ позадинском механизму програма за отклањање грешака на страници</translation>
 <translation id="2862043554446264826">Отклони грешке на свему осим безбедног окружења и PNaCl преводиоца.</translation>
 <translation id="3516765099410062445">Приказујемо историју са уређаја на које сте пријављени. <ph name="BEGIN_LINK"/>Сазнајте више<ph name="END_LINK"/></translation>
 <translation id="7347751611463936647">Да бисте користили овај додатак, унесите „<ph name="EXTENSION_KEYWORD"/>“ и притисните тастер TAB, а затим унесите команду или обавите претрагу.</translation>
 <translation id="878431691778285679">Изгледа да већ управљате корисником са тим именом.<ph name="LINE_BREAK"/>Да ли сте желели да <ph name="BEGIN_LINK"/>увезете корисника <ph name="PROFILE_NAME"/> на овај уређај<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> жели да користи микрофон.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Апликације</translation>
 <translation id="5151511998946489774">Идентитет овог веб-сајта је верификовао/ла <ph name="ISSUER"/> и он може јавно да се провери.</translation>
 <translation id="1608626060424371292">Уклони овог корисника</translation>
 <translation id="2779552785085366231">Ову страницу можете да додате у Покретач апликација</translation>
 <translation id="5917011688104426363">Фокусирај траку адресе у реж. претраге</translation>
 <translation id="3269101346657272573">Унесите PIN.</translation>
 <translation id="2822854841007275488">арапски</translation>
-<translation id="6559948977408379772">Ð\9eва Ð¸ÐºÐ¾Ð½Ð° Ñ\81е Ð¿Ð¾Ñ\98авÑ\99Ñ\83Ñ\98е ÐºÐ°Ð´Ð° Ñ\81Ñ\82е Ð²Ð¸ Ð¸ Ñ\82елеÑ\84он Ñ\83 Ð¾ÐºÐ¾Ð»Ð¸Ð½Ð¸ Ð¸ Ð\88едноÑ\81Ñ\82авно Ð¾Ñ\82кÑ\99Ñ\83Ñ\87аваÑ\9aе Ñ\98е Ð´Ð¾Ñ\81Ñ\82Ñ\83пно. Ð¡Ð°Ð¼Ð¾ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е Ð·Ð° Ñ\83лазак; није потребна никаква лозинка.</translation>
+<translation id="6559948977408379772">Ð\9eва Ð¸ÐºÐ¾Ð½Ð° Ñ\81е Ð¿Ð¾Ñ\98авÑ\99Ñ\83Ñ\98е ÐºÐ°Ð´Ð° Ñ\81Ñ\82е Ð²Ð¸ Ð¸ Ñ\82елеÑ\84он Ñ\83 Ð¾ÐºÐ¾Ð»Ð¸Ð½Ð¸ Ð¸ Ð´Ð¾Ñ\81Ñ\82Ñ\83пно Ñ\98е Ð\9bако Ð¾Ñ\82кÑ\99Ñ\83Ñ\87аваÑ\9aе. Ð¡Ð°Ð¼Ð¾ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е Ð·Ð° Ñ\83лазак - није потребна никаква лозинка.</translation>
 <translation id="5857090052475505287">Нови директоријум</translation>
 <translation id="7450732239874446337">IO мреже је обустављен.</translation>
 <translation id="4003393903129308792">Омогући алатку за растеризацију за једну копију</translation>
 <translation id="1526560967942511387">Ненасловљени документ</translation>
 <translation id="3979748722126423326">Омогући <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA или RSN)</translation>
-<translation id="7561031016893995297">УпÑ\80авÑ\99аÑ\98Ñ\82е Ñ\83Ñ\80еÑ\92аÑ\98има Ñ\81а Ð\88едноÑ\81Ñ\82авним откључавањем у подешавањима налога.</translation>
+<translation id="7561031016893995297">УпÑ\80авÑ\99аÑ\98Ñ\82е Ñ\83Ñ\80еÑ\92аÑ\98има Ñ\81а Ð\9bаким откључавањем у подешавањима налога.</translation>
 <translation id="2238379619048995541">Подаци о стању фреквенције</translation>
 <translation id="4367133129601245178">К&amp;опирај URL адресу слике</translation>
 <translation id="6326175484149238433">Уклони из Chrome-а</translation>
 <translation id="6460601847208524483">Пронађи следеће</translation>
 <translation id="397703832102027365">Довршавање...</translation>
 <translation id="8146177459103116374">Ако сте се већ регистровали на овом уређају, можете да <ph name="LINK2_START"/>се пријавите као постојећи корисник<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Прикажи управљане обележиваче</translation>
 <translation id="4856478137399998590">Услуга мобилног преноса података је активирана и спремна за употребу</translation>
 <translation id="3305389145870741612">Процес форматирања може да потраје неколико секунди. Сачекајте.</translation>
 <translation id="3648607100222897006">Ове експерименталне функције у сваком тренутку могу да се промене, нестану или престану да функционишу. Не дајемо никакве гаранције у вези са тим шта може да се деси ако укључите неки од ових експеримената и прегледач вам спонтано експлодира. Шалу на страну, прегледач може да вам избрише све податке и безбедност и приватност може да буде угрожена на неочекиване начине. Сви експерименти које омогућите биће омогућени за све кориснике прегледача. Будите опрезни.</translation>
 <translation id="1639239467298939599">Учитавање</translation>
 <translation id="5457599981699367932">Прегледај као гост</translation>
 <translation id="8525428584879632762">Омогућено је на страницама са резултатима претраге или када је унос у току</translation>
-<translation id="2487656424763972284">Ð\88едноÑ\81Ñ\82авно откључавање</translation>
+<translation id="2487656424763972284">Ð\9bако откључавање</translation>
 <translation id="7047998246166230966">Показивач</translation>
 <translation id="743268637741709136">Онемогућите гласовну претрагу у Покретачу апликација. Ако је онемогућите, корисник неће моћи да претражује помоћу говора.</translation>
 <translation id="3252266817569339921">француска</translation>
 <translation id="6869402422344886127">Потврђено поље за потврду</translation>
 <translation id="3428010780253032925">Онемогући циљање у приказима засновано на правоугаоним површинама</translation>
 <translation id="5637380810526272785">Метод уноса</translation>
+<translation id="3613134908380545408">Прикажи <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Успостављање везе је морало да буде поновљено помоћу старије верзије TLS или SSL протокола. Ово обично значи да сервер користи веома стар софтвер и може да има других безбедносних проблема.</translation>
 <translation id="404928562651467259">УПОЗОРЕЊЕ</translation>
 <translation id="4289300219472526559">Почните да говорите</translation>
 <translation id="8148264977957212129">Пинјин метод уноса</translation>
 <translation id="2288278176040912387">Грамофон</translation>
 <translation id="7772032839648071052">Потврди приступну фразу</translation>
-<translation id="3676582787770338561">Ð\9eмогÑ\83Ñ\9bи Ð\88едноÑ\81Ñ\82авно откључавање за овај <ph name="DEVICE_TYPE"/>.</translation>
+<translation id="3676582787770338561">Ð\9eмогÑ\83Ñ\9bи Ð\9bако откључавање за овај <ph name="DEVICE_TYPE"/>.</translation>
 <translation id="2871813825302180988">Овај налог се већ користи на овом уређају.</translation>
 <translation id="1642505962779453775">Претходни квартал</translation>
 <translation id="3323235640813116393">Омогућава чување страница у MHTML формату: једној текстуалној датотеци која садржи HTML и све подресурсе.</translation>
 <translation id="2859369953631715804">Избор мобилне мреже</translation>
 <translation id="6934265752871836553">Користите најсавременији кôд да би Chrome брже цртао садржај. Промене у основи ове путање ће врло вероватно поделити пуно садржаја.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Увек отвори у Adobe Reader-у</translation>
 <translation id="8274359292107649245">Отвори Chrome на радној површини</translation>
 <translation id="1571119610742640910">Компоновање за фиксне основне позадине.</translation>
 <translation id="6514565641373682518">Ова страница је онемогућила курсор.</translation>
 <translation id="824543159844843373">Активирање 3. ставке покретача</translation>
 <translation id="3819800052061700452">&amp;Пун екран</translation>
 <translation id="48607902311828362">Режим рада у авиону</translation>
+<translation id="711840821796638741">Прикажи управљане обележиваче</translation>
 <translation id="3360297538363969800">Штампање није успело. Проверите штампач и покушајте поново.</translation>
 <translation id="680572642341004180">Омогући RLZ праћење у производу <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Престаните да користите повучени пуњач.</translation>
index 1bbf664..ecee364 100644 (file)
@@ -1076,7 +1076,7 @@ Psst! Nästa gång kanske inkognitoläget <ph name="SHORTCUT_KEY"/> kan vara nå
 <translation id="8744641000906923997">Romaji</translation>
 <translation id="5451561500892538488">Dölj aviseringsikonen</translation>
 <translation id="8784626084144195648">Fackmedelvärde</translation>
-<translation id="348620396154188443">Tillåt alla webbplatser att visa popup-fönster</translation>
+<translation id="348620396154188443">Tillåt alla webbplatser att visa aviseringar på skrivbordet</translation>
 <translation id="7375125077091615385">Typ:</translation>
 <translation id="8214489666383623925">Öppna fil...</translation>
 <translation id="4583537898417244378">Ogiltig eller skadad fil.</translation>
@@ -1131,7 +1131,7 @@ Psst! Nästa gång kanske inkognitoläget <ph name="SHORTCUT_KEY"/> kan vara nå
 <translation id="932327136139879170">Startsida</translation>
 <translation id="3561204836318837461">BSSID:</translation>
 <translation id="2560794850818211873">K&amp;opiera videons webbadress</translation>
-<translation id="2981113813906970160">Visa en stor pekare</translation>
+<translation id="2981113813906970160">Visa stor muspekare</translation>
 <translation id="412730574613779332">Superhjälte</translation>
 <translation id="5302048478445481009">Språk</translation>
 <translation id="1395730723686586365">Uppdateringstjänsten startades</translation>
@@ -1734,7 +1734,7 @@ När du har skapat en kontrollerad användare kan du hantera inställningarna n
 <translation id="8337399713761067085">Du är för närvarande offline.</translation>
 <translation id="5199729219167945352">Experiment</translation>
 <translation id="3730227913294943590">Aktiverade funktioner för Google Cloud Devices</translation>
-<translation id="6499143127267478107">Löser värd i proxyskript ...</translation>
+<translation id="6499143127267478107">Slår upp adress i proxyscript</translation>
 <translation id="8069615408251337349">Google Cloud Print</translation>
 <translation id="5055518462594137986">Kom ihåg mitt val för alla länkar av samma typ.</translation>
 <translation id="246059062092993255">Plugin-program är blockerade på den här sidan.</translation>
@@ -2495,7 +2495,7 @@ Lämna inte ut känsliga uppgifter.</translation>
 <translation id="452785312504541111">Engelska - helbredd</translation>
 <translation id="7589461650300748890">Ta det försiktigt.</translation>
 <translation id="3966388904776714213">Ljudspelare</translation>
-<translation id="4722735886719213187">Tv-justering:</translation>
+<translation id="4722735886719213187">TV-justering:</translation>
 <translation id="1526925867532626635">Bekräfta synkroniseringsinställningarna</translation>
 <translation id="6185696379715117369">Uppåt en sida</translation>
 <translation id="6702639462873609204">&amp;Redigera ...</translation>
@@ -2912,7 +2912,7 @@ Lämna inte ut känsliga uppgifter.</translation>
 <translation id="7347751611463936647">Om du vill använda det här tillägget skriver du ”<ph name="EXTENSION_KEYWORD"/>”, trycker på tabbtangenten och anger kommandot eller sökningen.</translation>
 <translation id="878431691778285679">Det ser ut som om du redan hanterar en användare med det namnet.<ph name="LINE_BREAK"/>Ville du <ph name="BEGIN_LINK"/>importera <ph name="PROFILE_NAME"/> till den här enheten<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> försöker använda din mikrofon.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Appar</translation>
 <translation id="5151511998946489774">Webbplatsens identitet har verifierats av <ph name="ISSUER"/> och kan granskas offentligt.</translation>
 <translation id="1608626060424371292">Ta bort den här användaren</translation>
 <translation id="2779552785085366231">Den här sidan kan läggas till i startprogrammet för appar</translation>
@@ -3287,7 +3287,7 @@ och felaktiga uppgifter. Antingen utger sig en angripare för att vara <ph name=
 <translation id="4384652540891215547">Aktivera tillägget</translation>
 <translation id="9133055936679483811">Komprimeringen misslyckades. <ph name="ERROR_MESSAGE"/></translation>
 <translation id="2718998670920917754">Antivirusprogrammet har identifierat ett virus.</translation>
-<translation id="3199127022143353223">Servrar:</translation>
+<translation id="3199127022143353223">Servrar</translation>
 <translation id="408898940369358887">Aktivera experimentell Javascript</translation>
 <translation id="7489605380874780575">Kontrollera behörighet</translation>
 <translation id="6607831829715835317">Fler verkt&amp;yg</translation>
@@ -3472,7 +3472,7 @@ och felaktiga uppgifter. Antingen utger sig en angripare för att vara <ph name=
 <translation id="2356070529366658676">Fråga</translation>
 <translation id="5731247495086897348">Kl&amp;istra in och öppna</translation>
 <translation id="6426993025560594914">Alla experiment finns på din plattform!</translation>
-<translation id="1834560242799653253">Orientering</translation>
+<translation id="1834560242799653253">Orientering:</translation>
 <translation id="6440616190620341629">Aktiverar icke-sammansatt avkodning i MediaDrm som standard för krypterade medietillägg.</translation>
 <translation id="7185025270390719314">Läsa och ändra all din data på datorn och på de webbplatser du besöker</translation>
 <translation id="8353683614194668312">Appen eller tillägget kan:</translation>
@@ -3966,6 +3966,7 @@ hanteraren
 <translation id="6460601847208524483">Sök nästa</translation>
 <translation id="397703832102027365">Slutför ...</translation>
 <translation id="8146177459103116374">Om du redan är registrerad på den här enheten kan du <ph name="LINK2_START"/>logga in som en befintlig användare<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Visa hanterade bokmärken</translation>
 <translation id="4856478137399998590">Datatjänsten har aktiverats och är klar att användas</translation>
 <translation id="3305389145870741612">Formateringen kan ta ett par sekunder. Vänta.</translation>
 <translation id="3648607100222897006">Dessa experimentella funktioner kan ändras, avbrytas eller försvinna när som helst. Vi lämnar inga som helst garantier om vad som kan ske om du aktiverar något av dessa experiment. Webbläsaren kanske t.o.m. går upp i rök. Skämt åsido, alla data i webbläsaren kan raderas och säkerheten och sekretessen kan äventyras på oväntade sätt. Experiment som du aktiverar kommer att aktiveras för alla som använder webbläsaren. Var försiktig.</translation>
@@ -4395,6 +4396,7 @@ hanteraren
 <translation id="6869402422344886127">Markerad kryssruta</translation>
 <translation id="3428010780253032925">Inaktivera rektangelbaserad inriktning i visningar</translation>
 <translation id="5637380810526272785">Inmatningsmetod</translation>
+<translation id="3613134908380545408">Visa <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Anslutningen var tvungen att återupprättas via en äldre version av TLS- eller SSL-protokollet. Detta innebär vanligtvis att servern använder mycket gammal programvara och kanske har andra säkerhetsproblem.</translation>
 <translation id="404928562651467259">VARNING</translation>
 <translation id="4289300219472526559">Börja tala</translation>
@@ -4727,6 +4729,7 @@ hanteraren
 <translation id="6934265752871836553">Låt Chrome rita upp innehåll snabbare med den allra senaste koden. Risken är stor
         att ändringarna bakom sökvägen leder till att innehåll slutar fungera.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Öppna alltid i Adobe Reader</translation>
 <translation id="8274359292107649245">Öppna Chrome på datorn</translation>
 <translation id="1571119610742640910">Sammansättning för fasta rotbakgrunder.</translation>
 <translation id="6514565641373682518">Muspekaren har inaktiverats av sidan.</translation>
@@ -4927,6 +4930,7 @@ Tryck på någon tangent om du vill fortsätta utforska.</translation>
 <translation id="824543159844843373">Aktivera startprogramsobjekt 3</translation>
 <translation id="3819800052061700452">&amp;Helskärm</translation>
 <translation id="48607902311828362">Flygplansläge</translation>
+<translation id="711840821796638741">Visa hanterade bokmärken</translation>
 <translation id="3360297538363969800">Utskriften misslyckades. Kontrollera skrivaren och försök igen.</translation>
 <translation id="680572642341004180">Aktivera RLZ-spårning på <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Använd inte den återkallade laddaren mer.</translation>
@@ -5263,7 +5267,7 @@ Spara nyckelfilen på ett säkert ställe. Den behövs om du ska skapa nya versi
 <translation id="6596325263575161958">Krypteringsalternativ</translation>
 <translation id="1559528461873125649">Filen eller katalogen finns inte</translation>
 <translation id="3857773447683694438">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</translation>
-<translation id="1533920822694388968">Tv-justering</translation>
+<translation id="1533920822694388968">TV-justering</translation>
 <translation id="6109534693970294947">Vill du tillåta att <ph name="ORIGIN"/> kommunicerar med tillägget <ph name="EXTENSION_NAME"/>?</translation>
 <translation id="1729533290416704613">Det styr också vilken sida som visas när du söker i adressfältet.</translation>
 <translation id="2650446666397867134">Åtkomst till filen nekades</translation>
index 22b0f88..7dc7aef 100644 (file)
@@ -123,7 +123,7 @@ Maelezo yako ya kuingia katika akaunti yamepitwa na wakati.</translation>
 <translation id="4654488276758583406">Ndogo Sana</translation>
 <translation id="6647228709620733774">URL ya Kupinga Mamlaka ya Uidhinishaji wa Netscape</translation>
 <translation id="546411240573627095">mtindo wa Numpad</translation>
-<translation id="2310216585920710503">Sanidi Fungua kwa Urahisi</translation>
+<translation id="2310216585920710503">Sanidi kipengele cha Kufungua kwa Urahisi</translation>
 <translation id="8425213833346101688">Badilisha</translation>
 <translation id="2972581237482394796">&amp;Rudia</translation>
 <translation id="5895138241574237353">Zzima na uwashe</translation>
@@ -527,7 +527,7 @@ Maelezo yako ya kuingia katika akaunti yamepitwa na wakati.</translation>
 <translation id="413121957363593859">Vipengele</translation>
 <translation id="715487527529576698">Modi ya Kwanza ya Kichina ni Kichina Kilichorahisishwa</translation>
 <translation id="6522350652862471760">Washa jina na ikoni ya wasifu wa Google</translation>
-<translation id="6181259999130430430">Washa Kufungua kwa Urahisi kwenye kifaa hiki.</translation>
+<translation id="6181259999130430430">Washa kipengele cha Kufungua kwa Urahisi kwenye kifaa hiki.</translation>
 <translation id="8703575177326907206">Muunganisho wako kwa <ph name="DOMAIN"/> haujasimbwa.</translation>
 <translation id="6135622770221372891">Vitambulisho vya Kituo</translation>
 <translation id="8472623782143987204">maunzi-imechelezwa</translation>
@@ -718,7 +718,7 @@ Maelezo yako ya kuingia katika akaunti yamepitwa na wakati.</translation>
 <translation id="3984921062031549150">Kionyeshi Kinalemaza</translation>
 <translation id="7925285046818567682">Inasubiri <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Zuia ufikiaji wa kamera kila wakati</translation>
-<translation id="2964845078799970531">Ufunguaji Rahisi hukuruhusu kufungua Chromebook yako ukiwa karibu na simu yako.</translation>
+<translation id="2964845078799970531">Kipengele cha kufungua kwa Urahisi hukuruhusu kufungua Chromebook yako wakati iko karibu na simu yako.</translation>
 <translation id="5053803681436838483">Anwani mpya ya usafirishaji...</translation>
 <translation id="5952256601775839173">Wezesha mbofyo wa vidole vitatu wa padimguso.</translation>
 <translation id="3280237271814976245">Hifadhi k&amp;ama...</translation>
@@ -900,7 +900,7 @@ Maelezo yako ya kuingia katika akaunti yamepitwa na wakati.</translation>
 <translation id="2849936225196189499">Muhimu</translation>
 <translation id="9001035236599590379">Aina ya MIME</translation>
 <translation id="7238207184783103780">Google Wallet haipatikani kwa sasa.</translation>
-<translation id="3451859089869683931">Nambari batili ya simu. Tafadhali angalia na ujaribu tena.</translation>
+<translation id="3451859089869683931">Nambari ya simu si sahihi. Tafadhali angalia na ujaribu tena.</translation>
 <translation id="3464868340187708956">Ongeza Mtumiaji Mpya</translation>
 <translation id="7986039047000333986">Usasishaji maalum wa usalama kwa <ph name="PRODUCT_NAME"/> umetekelezwa hivi karibuni; unastahili kuanzisha upya sasa ili uanze kufanya kazi (tutarejesha upya vichupo vyako).</translation>
 <translation id="2787591391657537328">Ruhusu vipakuliwa ambavyo vimekatizwa kuendelea au kuanzishwa tena, kwa kutumia kipengee cha menyu ya maudhui cha Endelea.</translation>
@@ -1296,7 +1296,7 @@ Inakokotoa muda unaosalia</translation>
 <translation id="9033857511263905942">&amp;Bandika</translation>
 <translation id="1028690605877243613">Tumia mpangilio mbadala wa rafu.</translation>
 <translation id="6736045498964449756">Lo! Manenosiri hayalingani!</translation>
-<translation id="4558985768677321342">Washa Ufunguaji Rahisi.</translation>
+<translation id="4558985768677321342">Washa kipengele cha Kufungua kwa Urahisi.</translation>
 <translation id="1221825588892235038">Kuchagua pekee</translation>
 <translation id="2227939492629426903">Huwasha menyu mpya ya ishara. Inapochanganywa na usimamizi mpya wa wasifu, huonyesha menyu mpya ya ishara ya usimamizi wa wasifu. Vinginevyo huonyesha menyu ya ishara iliyoundwa upya yenye utendaji unaofanana na ule wa zamani, pamoja na kadi ya mafunzo iliyo juu inayomwagiza mtumiaji kujaribu kiolesura kipya cha usimamizi wa wasifu.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> imezuia ufikivu wa <ph name="HOST_NAME"/> . Tovuti hii imeripotiwa kuwa tovuti ya kuhadaa.</translation>
@@ -1562,7 +1562,7 @@ Inakokotoa muda unaosalia</translation>
 <translation id="8121385576314601440">Mipangilio ya Hangul ya uingizaji</translation>
 <translation id="2347476388323331511">Haikuweza kulinganisha</translation>
 <translation id="6986605181115043220">Lo, Ulinganishaji umekoma kufanya kazi. <ph name="BEGIN_LINK"/>Pata Maelezo Zaidi<ph name="END_LINK"/></translation>
-<translation id="8595751131238115030">Ingiza anwani yako ya barua pepe.</translation>
+<translation id="8595751131238115030">Weka anwani yako ya barua pepe.</translation>
 <translation id="5379268888377976432">Tendua Kufuta</translation>
 <translation id="7416362041876611053">Hitilafu ya mtandao isiyojulikana.</translation>
 <translation id="4250680216510889253">La</translation>
@@ -1699,7 +1699,7 @@ Baada ya kuunda mtumiaji mpya anayesimamiwa, unaweza kusimamia mipangilio yake w
 <translation id="4343792725927556911">Mipangilio mipya ya kamera na maikrofoni itaanza kufanya kazi baada ya kupakia upya ukurasa.</translation>
 <translation id="3847089579761895589">Unapewa usaidizi. Je, unataka kuendelea?</translation>
 <translation id="5634367113401639867">Lo! Kuna kitu kimeharibika wakati wa kusajili kiotomatiki kifaa hiki. Tafadhali jaribu tena kutoka kwenye skrini ya kuingia katika akaunti ukitumia vitufe vya Ctrl-Alt-E kwa pamoja, ua wasiliana na mhudumu wako wa usaidizi.</translation>
-<translation id="8452588990572106089">Nambari batili ya kadi. Tafadhali angalia na ujaribu tena.</translation>
+<translation id="8452588990572106089">Nambari ya kadi si sahihi. Tafadhali angalia na ujaribu tena.</translation>
 <translation id="7701869757853594372">Mishiko ya MTUMIAJI</translation>
 <translation id="5714678912774000384">Amilisha kichupo cha mwisho</translation>
 <translation id="7654972694106903394">Zima upangaji wa chapa kwa kujaribu ugongaji.</translation>
@@ -3336,7 +3336,7 @@ Baada ya kuunda mtumiaji mpya anayesimamiwa, unaweza kusimamia mipangilio yake w
 <translation id="5917011688104426363">Lenga upau anwani kwenye modi ya utafutaji</translation>
 <translation id="3269101346657272573">Tafadhali ingiza PIN.</translation>
 <translation id="2822854841007275488">Kiarabu</translation>
-<translation id="6559948977408379772">Ikoni hii huonekana wakati wewe na simu yako mko karibu huku Fungua kwa Urahisi ikiwa inapatikana. Bofya tu ili uingie, nenosiri halihitajiki.</translation>
+<translation id="6559948977408379772">Aikoni hii huonekana wakati wewe na simu yako mko karibu na kipengele cha Kufungua kwa Urahisi kinapatikana. Bofya ili uingie, hauhitaji nenosiri.</translation>
 <translation id="5857090052475505287">Folda Mpya</translation>
 <translation id="7450732239874446337">Mtandao wa IO umesitishwa.</translation>
 <translation id="4003393903129308792">Washa kiweka safu za picha kwenye nakala moja</translation>
@@ -3377,7 +3377,7 @@ Baada ya kuunda mtumiaji mpya anayesimamiwa, unaweza kusimamia mipangilio yake w
 <translation id="7317938878466090505"><ph name="PROFILE_NAME"/> (sasa)</translation>
 <translation id="6774230405643443657">Inawezesha usimbaji wa picha zinazotofautiana.</translation>
 <translation id="2148999191776934271">Inachaji
-<ph name="HOUR"/>:<ph name="MINUTE"/> hadi ijae</translation>
+Imebakisha <ph name="HOUR"/>:<ph name="MINUTE"/> ijae</translation>
 <translation id="6007237601604674381">Kusogezwa kumeshindika. <ph name="ERROR_MESSAGE"/></translation>
 <translation id="907841381057066561">Imeshindwa kuunda faili ya muda ya zip wakati wa kufungasha.</translation>
 <translation id="1064912851688322329">Tenganisha Akaunti yako ya Google</translation>
@@ -3453,7 +3453,7 @@ Baada ya kuunda mtumiaji mpya anayesimamiwa, unaweza kusimamia mipangilio yake w
 <translation id="1526560967942511387">Andiko lisilo na kichwa</translation>
 <translation id="3979748722126423326">Washa <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA au RSN)</translation>
-<translation id="7561031016893995297">Simamia vifaa vya Fungua kwa Urahisi kwenye mipangilio ya akaunti yako.</translation>
+<translation id="7561031016893995297">Dhibiti vifaa vyenye kipengele cha Kufungua kwa Urahisi kwenye mipangilio ya akaunti yako.</translation>
 <translation id="2238379619048995541">Data ya Hali ya Masafa</translation>
 <translation id="4367133129601245178">&amp;Nakili URL ya Picha</translation>
 <translation id="6326175484149238433">Ondoa kwenye Chrome</translation>
@@ -3955,6 +3955,7 @@ Baada ya kuunda mtumiaji mpya anayesimamiwa, unaweza kusimamia mipangilio yake w
 <translation id="6460601847208524483">Pata Ifuatayo</translation>
 <translation id="397703832102027365">Inahitimisha</translation>
 <translation id="8146177459103116374">Ikiwa tayari umeingia kwenye kifaa hiki, unaweza <ph name="LINK2_START"/> kuingia kama mtumiaji aliyepo<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Onyesha alamisho zinazosimamiwa</translation>
 <translation id="4856478137399998590">Huduma yako ya data ya simu ya mkononi imeamilishwa na iko tayari kutumia</translation>
 <translation id="3305389145870741612">Mchakato wa uumbizaji unaweza kuchukua sekunde kadhaa. Tafadhali subiri.</translation>
 <translation id="3648607100222897006">Hivi vipengele vya jaribio vinaweza kubadilika, kuvunjika, au kutoweka wakati wowote. Hatuhakikishi kabisa kuhusu kile kinachoweza kutokea ikiwa utawasha mojawapo ya majaribio haya, na hata kivinjari chako kinaweza kuchoma kighafla. Bila utani, kivinjari kinaweza kufuta data yako yote, au usalama na faragha yako inaweza kuathirika katika njia isiyotarajiwa. Majaribio yote unayoyawezesha yatawezeshwa kwa watumiaji wote wa kivinjari hiki. Tafadhali endelea kwa tahadhari.</translation>
@@ -4387,6 +4388,7 @@ Ungependa kuanza <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="6869402422344886127">Kikasha kaguzi kilichokaguliwa</translation>
 <translation id="3428010780253032925">Zima kulenga kwa mstatili katika mandhari</translation>
 <translation id="5637380810526272785">Mbinu ya Uingizaji</translation>
+<translation id="3613134908380545408">Onyesha <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Muunganisho ulihitajika kujaribiwa upya kwa kutumia toleo la zamani la itifaki ya TSL au SSL. Hii kwa kawaida inamaanisha kuwa seva inatumia programu ya zamani zaidi na huenda ikawa na masuala mengine ya usalama.</translation>
 <translation id="404928562651467259">ONYO</translation>
 <translation id="4289300219472526559">Anza Kuzungumza</translation>
@@ -4455,7 +4457,7 @@ Ungependa kuanza <ph name="CONTROL_PANEL_APPLET_NAME"/>?</translation>
 <translation id="8148264977957212129">Mbinu ingizo ya Pinyin</translation>
 <translation id="2288278176040912387">Kicheza rekodi</translation>
 <translation id="7772032839648071052">Thibitisha kaulisiri</translation>
-<translation id="3676582787770338561">Washa Kufungua kwa Urahisi kwenye kifaa hiki <ph name="DEVICE_TYPE"/>.</translation>
+<translation id="3676582787770338561">Washa kipengele cha Kufungua kwa Urahisi kwenye kifaa hiki cha <ph name="DEVICE_TYPE"/>.</translation>
 <translation id="2871813825302180988">Akaunti hii tayari inatumika kwenye kifaa hiki.</translation>
 <translation id="1642505962779453775">Robo ya Mwisho</translation>
 <translation id="3323235640813116393">Huwasha kuhifadhi kurasa kama MHTML: faili moja ya maandishi iliyo na HTML na rasilimali zote ndogo.</translation>
@@ -4718,6 +4720,7 @@ Inakokotoa muda wa kujaa</translation>
 <translation id="2859369953631715804">Chagua mtandao wa simu ya mkononi</translation>
 <translation id="6934265752871836553">Tumia msimbo wa bleeding-edge ili kufanya maudhui ya uchoraji ya Chrome yawe na kasi. Mabadiliko yaliyo nyuma ya njia hii huenda yakapangua maudhui mengi.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Fungua katika Adobe Reader wakati wowote</translation>
 <translation id="8274359292107649245">Fungua Chrome kwenye eneo-kazi</translation>
 <translation id="1571119610742640910">Inaunganisha kwa mandhari ya kipeo kisichobadilika.</translation>
 <translation id="6514565641373682518">Ukurasa huu umekilemza kishale chako cha kipanya.</translation>
@@ -4917,6 +4920,7 @@ Bonyeza kitufe chochote ili kuendelea kuchunguza.</translation>
 <translation id="824543159844843373">Amilisha kipengee 3 cha kuanzisha</translation>
 <translation id="3819800052061700452">&amp;Skrini kamili</translation>
 <translation id="48607902311828362">Hali ya ndege</translation>
+<translation id="711840821796638741">Onyesha Alamisho Zinazosimamiwa</translation>
 <translation id="3360297538363969800">Uchapishaji umeshindwa. Tafadhali angalia printa yako na ujaribu tena.</translation>
 <translation id="680572642341004180">Washa ufuatiliaji wa RLZ kwenye <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Tafadhali acha kutumia chaja inayotakiwa kurejeshwa kwa muuzaji.</translation>
index 23cc488..3fa98b7 100644 (file)
 <translation id="6460601847208524483">அடுத்ததைக் கண்டுபிடி</translation>
 <translation id="397703832102027365">இறுதிபடுத்துகிறது...</translation>
 <translation id="8146177459103116374">இந்த சாதனத்தில் ஏற்கனவே பதிவுசெய்திருந்தால், <ph name="LINK2_START"/>நடப்புப் பயனராக உள்நுழையலாம்<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">நிர்வகிக்கப்பட்ட புக்மார்க்குகளைக் காட்டு</translation>
 <translation id="4856478137399998590">உங்கள் மொபைல் தரவு சேவை செயல்படுத்தப்பட்டது மற்றும் பயன்படுத்தத் தயாராக உள்ளது</translation>
 <translation id="3305389145870741612">வடிவமைப்பு செயலாக்கத்திற்கு சில வினாடிகள் ஆகும். காத்திருக்கவும்.</translation>
 <translation id="3648607100222897006">இந்தச் சோதனை அம்சங்கள், எப்போது வேண்டுமானாலும் மாறலாம், துண்டிக்கப்படலாம் அல்லது மறைந்து விடலாம். இந்த அம்சங்களில் ஏதேனும் ஒன்றை நீங்கள் இயக்குவதால் ஏற்படும் நிகழ்வுகளுக்கு நாங்கள் எவ்வகையிலும் எந்தவித உத்தரவாதமும் அளிக்கவில்லை. மேலும் உங்கள் உலாவியானது திடீரென்று செயலிழந்து விடக்கூடும். உண்மையில் உங்கள் உலாவியின் தரவு அனைத்தையும் நீக்கவிடலாம் அல்லது உங்கள் பாதுகாப்பு, தனியுரிமையானது எதிர்பாராத வழிகளில் மாற்றியமைக்கப்படலாம். நீங்கள் செயல்படுத்தும் எந்த சோதனைகளும் இந்த உலாவியின் எல்லா பயனர்களுக்கும் செயல்படுத்தப்படும். எச்சரிக்கையாகத் தொடர்க.</translation>
 <translation id="6869402422344886127">தேர்ந்தெடுக்கப்பட்ட தேர்வுப்பெட்டி</translation>
 <translation id="3428010780253032925">காட்சிகளில் உள்ள செவ்வக அடிப்படையிலான இலக்கிடலை முடக்கு</translation>
 <translation id="5637380810526272785">உள்ளீட்டு முறை</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> ஐக் காட்டு</translation>
 <translation id="2837049386027881519">TLS அல்லது SSL நெறிமுறையின் பழைய பதிப்பினைப் பயன்படுத்தி, இணைப்பை மீண்டும் முயற்சிக்க வேண்டும். இது பொதுவாக, சேவையகம் மிகப்பழைய மென்பொருளைப் பயன்படுத்துகிறது மற்றும் பிற பாதுகாப்புச் சிக்கல்கள் இருக்கலாமென்று பொருளாகும்.</translation>
 <translation id="404928562651467259">எச்சரிக்கை</translation>
 <translation id="4289300219472526559">பேச்சைத் தொடங்கு</translation>
 <translation id="6934265752871836553">Chrome உள்ளடக்கத்தை வேகமாக வழங்குவதற்கு பிளிடிங்-எட்ஜ் குறியீட்டைப் பயன்படுத்தவும். இதில் செய்யப்படும்
         மாற்றங்கள் உள்ளடக்கத்தை அதிகமாகப் பிரிக்கலாம்.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">எப்போதும் Adobe Reader இல் திற</translation>
 <translation id="8274359292107649245">டெஸ்க்டாப்பில் Chrome ஐத் திற</translation>
 <translation id="1571119610742640910">நிலையான மூல பின்னணிகளுக்கான தொகுத்தல்.</translation>
 <translation id="6514565641373682518">இந்தப் பக்கம் உங்களுடைய இடஞ்சுட்டியை முடக்கியுள்ளது.</translation>
 <translation id="824543159844843373">துவக்க உருப்படி 3 ஐச் செயல்படுத்த</translation>
 <translation id="3819800052061700452">&amp;முழுத்திரை</translation>
 <translation id="48607902311828362">விமான பயன்முறை</translation>
+<translation id="711840821796638741">நிர்வகிக்கப்பட்ட புக்மார்க்குகளைக் காட்டு</translation>
 <translation id="3360297538363969800">அச்சிடுவதில் தோல்வி. உங்கள் பிரிண்டரைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> இல் RLZ கண்காணிப்பை இயக்கு.</translation>
 <translation id="688797901999351107">திரும்பக் கேட்கப்பட்ட சார்ஜரைப் பயன்படுத்துவதை நிறுத்தவும்.</translation>
index cab8998..f4f6594 100644 (file)
 <translation id="7002454948392136538">ఈ పర్యవేక్షించబడే వినియోగదారు కోసం నిర్వాహకుని ఎంచుకోండి</translation>
 <translation id="4640525840053037973">మీ Google ఖాతాతో సైన్ ఇన్ అవ్వండి</translation>
 <translation id="4923279099980110923">అవును, నేను సహాయం అందించాలనుకుంటున్నాను</translation>
-<translation id="5255315797444241226">à°®à±\80à°°à±\81 à°\8eà°\82à°\9fà°°à±\8d à°\9aà±\87సిన à°ªà°¾à°¸à±\8dâ\80\8cà°«à±\8dà°°à±\87à°\9cà±\8d à°¤à°ªà±\8dà°ªà±\88నది.</translation>
+<translation id="5255315797444241226">à°®à±\80à°°à±\81 à°¨à°®à±\8bà°¦à±\81 à°\9aà±\87సిన à°ªà°¾à°¸à±\8dâ\80\8cà°«à±\8dà°°à±\87à°\9cà±\8d à°\9aà±\86à°²à±\8dలదà±\81.</translation>
 <translation id="521582610500777512">ఫోటో విస్మరించబడింది</translation>
 <translation id="762917759028004464">ప్రస్తుతం డిఫాల్ట్ బ్రౌజర్ <ph name="BROWSER_NAME"/>.</translation>
 <translation id="7740287852186792672">శోధన ఫలితాలు</translation>
 <translation id="5661272705528507004">ఈ SIM కార్డ్ నిలిపివెయ్యబడింది మరియు ఉపయోగించకూడనిది. దయచేసి తిరిగి భర్తీ చెయ్యడం కోసం మీ సేవ ప్రొవైడర్‌ను సంప్రదించండి.</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
 <translation id="3583413473134066075">వెళ్తోంది.. వెళ్తోంది... వెళ్లింది.</translation>
-<translation id="6585234750898046415">à°®à±\80 à°\96ాతా à°\95à±\8bà°¸à°\82 à°¸à±\88à°¨à±\8d-à°\87à°¨à±\8d à°¤à±\86à°° à°µà°¦à±\8dà°¦ à°ªà±\8dరదరà±\8dశిà°\82à°\9aడానికి ఒక చిత్రాన్ని ఎంచుకోండి.</translation>
+<translation id="6585234750898046415">à°®à±\80 à°\96ాతా à°\95à±\8bà°¸à°\82 à°¸à±\88à°¨à±\8d-à°\87à°¨à±\8d à°¸à±\8dà°\95à±\8dà°°à±\80à°¨à±\8dâ\80\8cà°²à±\8b à°\9aà±\82à°ªడానికి ఒక చిత్రాన్ని ఎంచుకోండి.</translation>
 <translation id="7957054228628133943">పాప్-అప్‌ను నిరోధించడాన్ని నిర్వహించు...</translation>
 <translation id="179767530217573436">గత 4 వారాలు</translation>
 <translation id="2279770628980885996">అభ్యర్థనను పూర్తి చెయ్యడానికి ప్రయత్నించడంలో సర్వర్ అనుకోని స్థితిని ఎదుర్కొంది.</translation>
     <ph name="BEGIN_LINK_HELP"/>మరింత తెలుసుకోండి<ph name="END_LINK_HELP"/></translation>
 <translation id="6980956047710795611">క్రొత్త పాస్‌వర్డ్‌కు మొత్తం Chrome OS డేటాను తరలించు (మునుపటి పాస్‌వర్డ్‌లు అవసరం)</translation>
 <translation id="8652487083013326477">పేజీ పరిధి రేడియో బటన్</translation>
-<translation id="5204967432542742771">పాసà±\8dâ\80\8cవరà±\8dà°¡à±\8dâ\80\8cని à°\8eà°\82à°\9fà°°à±\8d à°\9aà±\86à°¯à±\8dయండి</translation>
+<translation id="5204967432542742771">పాసà±\8dâ\80\8cవరà±\8dà°¡à±\8dâ\80\8cని à°¨à°®à±\8bà°¦à±\81 à°\9aà±\87యండి</translation>
 <translation id="6686817083349815241">మీ పాస్‌వర్డ్‌ను సేవ్ చేయండి</translation>
 <translation id="9025098623496448965">సరే, నన్ను తిరిగి సైన్-ఇన్ స్క్రీన్‌కు తీసుకువెళ్లు</translation>
 <translation id="589737135092634133">మీ ప్రాక్సీ సెట్టింగ్‌లను తనిఖీ చేసి లేదా మీ నెట్‌వర్క్ నిర్వాహకుని సంప్రదించి
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN"/> మీ మౌస్ కర్సర్‌ను ఆపివేసింది.</translation>
 <translation id="6404451368029478467"><ph name="PRODUCT_NAME"/> స్వయంచాలకంగా నవీకరించబడుతుంది కాబట్టి మీకు ఎల్లప్పుడూ సరిక్రొత్త సంస్కరణ ఉంటుంది. ఈ డౌన్‌లోడ్ పూర్తయినప్పుడు, <ph name="PRODUCT_NAME"/> పునఃప్రారంభించబడుతుంది మరియు మీరు మీ పనిని కొనసాగించవచ్చు.</translation>
 <translation id="3367237600478196733">పేజీ లోడ్‌లు</translation>
-<translation id="2454247629720664989">à°\95à±\80వరà±\8dà°¡à±\8d</translation>
+<translation id="2454247629720664989">à°\95à±\80à°²à°\95పదà°\82</translation>
 <translation id="3950820424414687140">సైన్ ఇన్</translation>
 <translation id="4626106357471783850">నవీకరణను వర్తింప చేయడానికి <ph name="PRODUCT_NAME"/>ని పునరుద్ధరించాలి.</translation>
 <translation id="5369927996833026114">Chrome అనువర్తన లాంచర్‌ను కనుగొనండి</translation>
 <translation id="8401363965527883709">చెక్ బాక్స్ ఎంపిక తొలగించబడింది</translation>
 <translation id="7771452384635174008">లేఅవుట్</translation>
 <translation id="5852454633281115663">Google+ Hangouts</translation>
-<translation id="6188939051578398125">à°ªà±\87à°°à±\8dà°²à±\81 à°²à±\87దా à°\9aà°¿à°°à±\81నామాలనà±\81 à°\8eà°\82à°\9fà°°à±\8d à°\9aà±\86à°¯à±\8dయండి.</translation>
+<translation id="6188939051578398125">à°ªà±\87à°°à±\8dà°²à±\81 à°²à±\87దా à°\9aà°¿à°°à±\81నామాలనà±\81 à°¨à°®à±\8bà°¦à±\81 à°\9aయండి.</translation>
 <translation id="8151638057146502721">కాన్ఫిగర్ చేయి</translation>
 <translation id="8443621894987748190">మీ ఖాతా చిత్రాన్ని ఎంచుకోండి</translation>
 <translation id="7374461526650987610">ప్రోటోకాల్ నిర్వాహకులు</translation>
 <translation id="7347751611463936647">ఈ పొడిగింపును ఉపయోగించడానికి, &quot;<ph name="EXTENSION_KEYWORD"/>&quot; టైప్ చేసి, ఆపై టాబ్ చేసి, ఆపై మీ ఆదేశం లేదా శోధనను టైప్ చెయ్యండి.</translation>
 <translation id="878431691778285679">మీరు ఇప్పటికే ఆ పేరుతో ఒక వినియోగదారుని నిర్వహిస్తున్నట్లు కనిపిస్తోంది.<ph name="LINE_BREAK"/>మీరు <ph name="BEGIN_LINK"/><ph name="PROFILE_NAME"/>ని ఈ పరికరానికి దిగుమతి చేయాలనుకుంటున్నారా<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> మీ మైక్రోఫోన్‌ను ఉపయోగించాలని ఆశిస్తుంది.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">యాప్స్</translation>
 <translation id="5151511998946489774">ఈ వెబ్‌సైట్ యొక్క గుర్తింపు <ph name="ISSUER"/> ద్వారా ధృవీకరించబడింది మరియు బహిరంగంగా పరిశీలించవచ్చు.</translation>
 <translation id="1608626060424371292">ఈ వినియోగదారుని తీసివేయండి</translation>
 <translation id="2779552785085366231">ఈ పేజీని అనువర్తన లాంచర్‌కి జోడించవచ్చు</translation>
 <translation id="8044899503464538266">నెమ్మదిగా</translation>
 <translation id="3789841737615482174">వ్యవస్థాపించు</translation>
 <translation id="4320697033624943677">వినియోగదారులను జోడించు</translation>
-<translation id="1283379245075810567">దరà±\8dపణానà±\8dని ప్రారంభించు</translation>
+<translation id="1283379245075810567">మిరà±\8dà°°à°°à°¿à°\82à°\97à±\8d ప్రారంభించు</translation>
 <translation id="9153934054460603056">గుర్తింపు మరియు పాస్‌వర్డ్‌ సేవ్ చెయ్యి</translation>
 <translation id="33870491292291061"><ph name="NETWORK_ID"/>ని ఉపయోగించడానికి మీరు నెట్‌వర్క్ లాగిన్ పేజీని సందర్శించాల్సి ఉంటుంది. లాగిన్ పేజీకి వెళ్లడానికి క్లిక్ చేయండి.</translation>
 <translation id="4594403342090139922">&amp;తొలగించడాన్ని రద్దు చేయి</translation>
 <translation id="6374100501221763867">హార్డ్‌వేర్-వేగవంతం చేసే వీడియో డీకోడ్‌ను నిలిపివేయండి.</translation>
 <translation id="9101691533782776290">అనువర్తనాన్ని ప్రారంభించు</translation>
 <translation id="4057896668975954729">స్టోర్‌లో వీక్షించండి</translation>
-<translation id="7477347901712410606">మీరు మీ పాస్‌ఫ్రేస్‌ను మరచిపోయినట్లయితే, <ph name="BEGIN_LINK"/>Google Dashboard<ph name="END_LINK"/> ద్వారా సమకాలీకరణను నిలిపివేయండి మరియు రీసెట్ చేయండి.</translation>
+<translation id="7477347901712410606">మీరు మీ పాస్‌ఫ్రేస్‌ను మరచిపోయినట్లయితే, <ph name="BEGIN_LINK"/>Google డాష్‌బోర్డ్<ph name="END_LINK"/> ద్వారా సమకాలీకరణను నిలిపివేయండి మరియు రీసెట్ చేయండి.</translation>
 <translation id="4677772697204437347">GPU మెమరీ</translation>
 <translation id="3085235303151103497">ప్యాక్ చేసిన అనువర్తనాల కోసం డీబగ్గింగ్‌ను ప్రారంభించండి.</translation>
 <translation id="2645575947416143543">మీరు స్వంత సర్టిఫికేట్లు సృష్టించే సంస్థలో పని చేస్తుంటే మరియు అలాంటి ఒక సర్టిఫికేట్ ఉపయోగించి ఆ సంస్థ యొక్క ఒక అంతర్గత వెబ్‌సైట్‌కు కనెక్ట్ అవ్వడానికి మీరు ప్రయత్నిస్తుంటే, ఈ సమస్యను మీరు సురక్షితంగా పరిష్కరించవచ్చు. మీరు “మూలం సర్టిఫికేట్”గా మీ సంస్థ యొక్క మూలం సర్టిఫికేట్‌ను దిగుమతి చేయండి, ఆపై మీ సంస్థ జారీ చేసిన లేదా నిర్ధారించిన సర్టిఫికేట్లు విశ్వసించబడతాయి మరియు తర్వాత మీరు ఒక అంతర్గత వెబ్‌సైట్‌కు కనెక్ట్ చేయడానికి ప్రయత్నించినప్పుడు ఈ లోపాన్ని చూడరు. మీ కంప్యూటర్‌కు ఒక క్రొత్త మూలం సర్టిఫికేట్‌ను జోడించడంలో సహాయం కోసం మీ సంస్థ యొక్క సహాయ సిబ్బందిని సంప్రదించండి.</translation>
 <translation id="6460601847208524483">తదుపరిది కనుగొను</translation>
 <translation id="397703832102027365">పూర్తి చేస్తోంది...</translation>
 <translation id="8146177459103116374">మీరు ఇప్పటికే ఈ పరికరంలో నమోదు చేసి ఉంటే, మీరు <ph name="LINK2_START"/>ఇప్పటికే ఉన్న వినియోగదారు వలే సైన్ ఇన్ చేయవచ్చు<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">నిర్వహించబడే బుక్‌మార్క్‌లను చూపు</translation>
 <translation id="4856478137399998590">మీ మొబైల్ డేటా సేవ సక్రియం చెయ్యబడింది మరియు ఉపయోగించడానికి సిద్ధంగా ఉంది</translation>
 <translation id="3305389145870741612">ఆకృతీకరణ విధానాన్ని కొన్ని సెకెన్ల సమయం పడుతుంది. దయచేసి వేచి ఉండండి.</translation>
 <translation id="3648607100222897006">ఈ ప్రయోగాత్మక లక్షణాలు ఏ సమయంలోనైనా మారవచ్చు, విభజించబడవచ్చు లేదా అదృశ్యం కావచ్చు. మీరు ఈ ప్రయోగాలలో ఒకదాన్ని ఆన్‌ చేస్తే జరిగే దానికి మేము ఖచ్చితంగా హామీలు ఇవ్వలేము మరియు మీ బ్రౌజర్ ఆకస్మికంగా మూసుకునిపోవచ్చు. హాస్యాన్ని ప్రక్కన పెడితే, మీ బ్రౌజర్ మీ మొత్తం  డేటా తొలగించవచ్చు లేదా అనుకోని విధంగా మీ భద్రతా మరియు గోప్యత రాజీపడవచ్చు. మీరు ప్రారంభించిన ఏవేని ప్రయోగాలు ఈ బ్రౌజర్ యొక్క వినియోగదారులందరికి ప్రారంభించబడతాయి. దయచేసి జాగ్రత్తగా కొనసాగండి.</translation>
 <translation id="3748412725338508953">అక్కడ చాలా ఎక్కువ మళ్ళింపులు ఉన్నాయి.</translation>
 <translation id="7741303706372017829">నేను నా రీకాల్ చేసిన ఛార్జర్‌ను భర్తీ చేయాలని కోరడం లేదు</translation>
 <translation id="2543440242089979510">Google Cloud ముద్రణను తెరువు</translation>
-<translation id="5833726373896279253">à°\88 à°¸à±\86à°\9fà±\8dà°\9fà°¿à°\82à°\97à±\8dâ\80\8cà°²à±\81 à°®à±\80 à°¯à°\9cమాని à°¦à±\8dవారా à°®à°¾à°¤à±\8dà°°à°®à±\87 à°¸à°µà°°à°¿à°\82à°\9aపబతాయి:</translation>
+<translation id="5833726373896279253">à°\88 à°¸à±\86à°\9fà±\8dà°\9fà°¿à°\82à°\97à±\8dâ\80\8cà°²à±\81 à°®à±\80 à°¯à°\9cమాని à°¦à±\8dవారా à°®à°¾à°¤à±\8dà°°à°®à±\87 à°¸à°µà°°à°¿à°\82à°\9aబడతాయి:</translation>
 <translation id="9203962528777363226">ఈ పరికరం యొక్క నిర్వాహకుడు క్రొత్త వినియోగదారులను జోడించడం నిలిపివేసారు</translation>
 <translation id="3758760622021964394">ఈ పేజీ మీ మౌస్ కర్సర్‌ను ఆపివేయలనుకుంటోంది.</translation>
 <translation id="8341840687457896278">వేరొక పొడిగింపు (<ph name="EXTENSION_NAME"/>) వేరే ఆధారాలను అందించినందున ఈ పొడిగింపు నెట్‌వర్క్ అభ్యర్థనకు ఆధారాలను అందించడంలో విఫలమైంది.</translation>
 <translation id="6869402422344886127">తనిఖీ చెయ్యబడిన చెక్ బాక్స్</translation>
 <translation id="3428010780253032925">వీక్షణల్లో దీర్ఘచతురస్ర-ఆధారిత లక్ష్య విధానాన్ని నిలిపివేయండి</translation>
 <translation id="5637380810526272785">ఇన్‌పుట్ విధానం</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/>ని చూపు</translation>
 <translation id="2837049386027881519">కనెక్షన్‌ను TLS లేదా SSL ప్రోటోకాల్ యొక్క పాత సంస్కరణను ఉపయోగించి మళ్లీ ప్రయత్నించండి. సర్వర్ చాలా పాత సాఫ్ట్‌వేర్‌ను ఉపయోగిస్తోందని మరియు ఇతర భద్రతా సమస్యలు ఉండవచ్చని సాధారణంగా దీని అర్థం.</translation>
 <translation id="404928562651467259">హెచ్చరిక</translation>
 <translation id="4289300219472526559">మాట్లాడటాన్ని ప్రారంభించు</translation>
 <translation id="6934265752871836553">Chrome కంటెంట్‌ను వేగంగా పొందేలా చేయడానికి అధునాతన కోడ్‌ను ఉపయోగించండి. ఈ పథం
         నేపథ్యంలోని మార్పుల కారణంగా అధిక పరిమాణంలోని కంటెంట్ ఎక్కువగా విచ్ఛిన్నం చేయబడుతుంది.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">ఎల్లప్పుడూ Adobe Readerలో తెరువు</translation>
 <translation id="8274359292107649245">డెస్క్‌టాప్‌లో Chromeని తెరువు</translation>
 <translation id="1571119610742640910">స్థిర మూల నేపథ్యాల కోసం కూర్పు చేయడం.</translation>
 <translation id="6514565641373682518">ఈ పేజీ మీ మౌస్ కర్సర్‌ను ఆపివేసింది.</translation>
 <translation id="824543159844843373">ప్రారంభించిన అంశం 3ని సక్రియం చేయి</translation>
 <translation id="3819800052061700452">&amp;పూర్తి స్క్రీన్</translation>
 <translation id="48607902311828362">ఎయిర్‌ప్లైన్ మోడ్</translation>
+<translation id="711840821796638741">నిర్వహించబడే బుక్‌మార్క్‌లను చూపు</translation>
 <translation id="3360297538363969800">ముద్రణ విఫలమైంది. దయచేసి మీ ప్రింటర్‌ను తనిఖీ చేసి మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/>లో RLZ ట్రాకింగ్‌ను ప్రారంభించు.</translation>
 <translation id="688797901999351107">దయచేసి రీకాల్ చేసిన ఛార్జర్‌ను ఉపయోగించడాన్ని ఆపివేయండి.</translation>
index 746f164..903e812 100644 (file)
@@ -42,7 +42,7 @@
 <translation id="3581034179710640788">ใบรับรองความปลอดภัยของเว็บไซต์หมดอายุ!</translation>
 <translation id="2825758591930162672">คีย์สาธารณะของหัวเรื่อง</translation>
 <translation id="6370351608045086850">เปิดใช้การสนับสนุนการเลื่อนไปจนสุดสำหรับแป้นพิมพ์เสมือน</translation>
-<translation id="5137501176474113045">à¸\99ำออà¸\81รายการนี้</translation>
+<translation id="5137501176474113045">ลà¸\9aรายการนี้</translation>
 <translation id="8275038454117074363">การนำเข้า</translation>
 <translation id="8418445294933751433">แ&amp;สดงเป็นแถบ</translation>
 <translation id="6985276906761169321">รหัส:</translation>
 <translation id="687588960939994211">ล้างประวัติการเข้าชม บุ๊กมาร์ก การตั้งค่า และข้อมูลอื่นๆ ของ Chrome ที่เก็บไว้ในอุปกรณ์นี้ด้วย</translation>
 <translation id="4581823559337371475">บริการลงชื่อเข้าใช้ด้านล่างนี้โฮสต์โดย <ph name="SAML_DOMAIN"/> ลงชื่อเข้าใช้เพื่อดำเนินการต่อ</translation>
 <translation id="6322279351188361895">ไม่สามารถอ่านคีย์ส่วนตัว</translation>
-<translation id="7401543881546089382">à¸\99ำออà¸\81ทางลัด</translation>
+<translation id="7401543881546089382">ลà¸\9aทางลัด</translation>
 <translation id="3781072658385678636">หน้าเว็บนี้ปิดกั้นปลั๊กอินต่อไปนี้:</translation>
 <translation id="2597852038534460976">Chrome ไม่สามารถเข้าถึงวอลเปเปอร์ โปรดเชื่อมต่อกับเครือข่าย</translation>
 <translation id="3648460724479383440">ปุ่มตัวเลือกที่เลือก</translation>
 <translation id="620329680124578183">ไม่โหลด (แนะนำ)</translation>
 <translation id="6300924177400055566">คุณมีพื้นที่ใน Google ไดรฟ์ไม่เพียงพอสำหรับบันทึก &quot;<ph name="FILE_NAME"/>&quot; โปรดนำไฟล์ออกหรือ<ph name="BEGIN_LINK"/>ซื้อพื้นที่จัดเก็บข้อมูลเพิ่มเติม<ph name="END_LINK"/></translation>
 <translation id="9074739597929991885">บลูทูธ</translation>
-<translation id="2653266418988778031">หาà¸\81à¸\84ุà¸\93à¸\99ำออà¸\81ใบรับรองของผู้ออกใบรับรอง (CA) เบราว์เซอร์ของคุณจะไม่เชื่อถือใบรับรองใดที่ออกโดย CA นั้นอีกต่อไป</translation>
+<translation id="2653266418988778031">หาà¸\81à¸\84ุà¸\93ลà¸\9aใบรับรองของผู้ออกใบรับรอง (CA) เบราว์เซอร์ของคุณจะไม่เชื่อถือใบรับรองใดที่ออกโดย CA นั้นอีกต่อไป</translation>
 <translation id="4237357878101553356">เราไม่สามารถยืนยันข้อมูลบัญชีของคุณ |แก้ไขปัญหานี้|</translation>
 <translation id="2217501013957346740">สร้างชื่อ -</translation>
 <translation id="5177479852722101802">บล็อกการเข้าถึงกล้องถ่ายรูปและไมโครโฟนต่อไป</translation>
 <translation id="551752069230578406">กำลังเพิ่มเครื่องพิมพ์ไปยังบัญชีของคุณ อาจใช้เวลาสักครู่...</translation>
 <translation id="2108058520826444209">คำเตือน: คุณไม่ได้เชื่อมต่อกับเซิร์ฟเวอร์ Wallet ในสภาพแวดล้อมการใช้งานจริง บัตรที่ออกจะไม่ถูกต้อง</translation>
 <translation id="4858913220355269194">ฟริทซ์</translation>
-<translation id="2231238007119540260">หาà¸\81à¸\84ุà¸\93à¸\99ำออà¸\81ใบรับรองเซิร์ฟเวอร์ คุณจะเรียกคืนการตรวจสอบความปลอดภัยตามปกติสำหรับเซิร์ฟเวอร์นั้น และกำหนดให้เซิร์ฟเวอร์ใช้ใบรับรองที่ถูกต้อง</translation>
+<translation id="2231238007119540260">หาà¸\81à¸\84ุà¸\93ลà¸\9aใบรับรองเซิร์ฟเวอร์ คุณจะเรียกคืนการตรวจสอบความปลอดภัยตามปกติสำหรับเซิร์ฟเวอร์นั้น และกำหนดให้เซิร์ฟเวอร์ใช้ใบรับรองที่ถูกต้อง</translation>
 <translation id="6489433341782457580">สำหรับนักพัฒนาซอฟต์แวร์ ให้ใช้บริการแซนด์บ็อกซ์สำหรับ Wallet API เรียก requestAutocomplete()</translation>
 <translation id="8186609076106987817">เซิร์ฟเวอร์ไม่พบไฟล์</translation>
 <translation id="2846816712032308263">ช่วยให้ปิดแท็บ/หน้าต่างได้อย่างรวดเร็ว - เรียกใช้เครื่องจัดการ onunload js ของแท็บอย่างเป็นอิสระจาก GUI</translation>
 <translation id="1528372117901087631">การเชื่อมต่ออินเทอร์เน็ต</translation>
 <translation id="1788636309517085411">ใช้ค่าเริ่มต้น</translation>
 <translation id="4159435316791146348">Google และ HP กำลังเรียกคืนที่ชาร์จเดิมของ HP Chromebook 11 ตามคำแนะนำและการอนุมัติจาก CPSC และองค์กรกำกับดูแลอื่นๆ</translation>
-<translation id="2716483787622029543">à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\81ละà¸\99ำออà¸\81รูปภาพ เพลง และสื่ออื่นๆ จากคอมพิวเตอร์ของคุณ</translation>
+<translation id="2716483787622029543">à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\81ละลà¸\9aรูปภาพ เพลง และสื่ออื่นๆ จากคอมพิวเตอร์ของคุณ</translation>
 <translation id="7659660321065362272">การอัปเดตที่สำคัญใน HP Chromebook 11</translation>
 <translation id="5965661248935608907">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณคลิกปุ่ม &quot;หน้าแรก&quot; หรือทำการค้นหาจากแถบอเนกประสงค์</translation>
 <translation id="9177499212658576372">ขณะนี้คุณเชื่อมต่อกับเครือข่าย <ph name="NETWORK_TYPE"/></translation>
 <translation id="1965624977906726414">ไม่มีสิทธิ์พิเศษใดๆ</translation>
 <translation id="2452539774207938933">เปลี่ยนไปเป็นผู้ใช้: <ph name="PROFILE_NAME"/></translation>
 <translation id="4700157086864140907">Google Chrome สามารถให้บริการตรวจสอบการสะกดที่ชาญฉลาดมากขึ้นโดยการส่งสิ่งที่คุณพิมพ์ในเบราว์เซอร์ไปยังเซิร์ฟเวอร์ของ Google ซึ่งจะช่วยให้คุณสามารถใช้เทคโนโลยีตรวจสอบการสะกดแบบเดียวกันกับที่การค้นหาของ Google ใช้</translation>
-<translation id="1880905663253319515">à¸\99ำออà¸\81ใบรับรอง &quot;<ph name="CERTIFICATE_NAME"/>&quot; หรือไม่</translation>
+<translation id="1880905663253319515">ลà¸\9aใบรับรอง &quot;<ph name="CERTIFICATE_NAME"/>&quot; หรือไม่</translation>
 <translation id="8546306075665861288">แคชของภาพ</translation>
 <translation id="5904093760909470684">การกำหนดค่าพร็อกซี</translation>
 <translation id="5706551819490830015">จัดการที่อยู่สำหรับการเรียกเก็บเงิน...</translation>
 <translation id="2012766523151663935">การแก้ไขเฟิร์มแวร์:</translation>
 <translation id="6060685159320643512">ระวัง การทดลองนี้อาจเป็นอันตราย</translation>
 <translation id="4755351698505571593">เจ้าของเท่านั้นที่สามารถปรับการตั้งค่านี้ได้</translation>
-<translation id="4607068441094952239">à¸\99ำออà¸\81ผู้ใช้นี้</translation>
+<translation id="4607068441094952239">ลà¸\9aผู้ใช้นี้</translation>
 <translation id="8757640015637159332">เข้าสู่การเข้าชมแบบสาธารณะ</translation>
 <translation id="5829990587040054282">ล็อกหน้าจอหรือปิดการทำงาน</translation>
 <translation id="7800304661137206267">การเชื่อมต่อถูกเข้ารหัสโดยใช้ <ph name="CIPHER"/> โดยใช้ <ph name="MAC"/> สำหรับตรวจสอบสิทธิ์ข้อความและ <ph name="KX"/> เป็นกลไลการแลกเปลี่ยนกุญแจ</translation>
 <translation id="1363055550067308502">สลับระหว่างโหมดเต็มความกว้าง/ครึ่งความกว้าง</translation>
 <translation id="5933265534405972182">เปิดใช้งานไคลเอ็นต์ DNS แบบอะซิงโครนัสรุ่นทดลอง</translation>
 <translation id="3108967419958202225">เลือก...</translation>
-<translation id="6451650035642342749">à¸\99ำออà¸\81การตั้งค่าเปิดอัตโนมัติ</translation>
+<translation id="6451650035642342749">ลà¸\9aการตั้งค่าเปิดอัตโนมัติ</translation>
 <translation id="5948544841277865110">เพิ่มเครือข่ายส่วนบุคคล</translation>
 <translation id="7088434364990739311">การเริ่มต้นการตรวจสอบการอัปเดตล้มเหลว (รหัสข้อผิดพลาด <ph name="ERROR"/>)</translation>
 <translation id="7113536735712968774">แสดงน้อยลง...</translation>
 <translation id="5701101281789450335">การตั้งค่าภาษาและการป้อนข้อมูล...</translation>
 <translation id="5483838506518938965">คุณพร้อมแล้ว</translation>
 <translation id="6431347207794742960"><ph name="PRODUCT_NAME"/> จะติดตั้งการอัปเดตอัตโนมัติสำหรับผู้ใช้ทั้งหมดที่ใช้เครื่องคอมพิวเตอร์นี้</translation>
-<translation id="4973698491777102067">à¸\99ำออà¸\81รายการต่อไปนี้จาก:</translation>
+<translation id="4973698491777102067">ลà¸\9aรายการต่อไปนี้จาก:</translation>
 <translation id="9021662811137657072">ตรวจพบไวรัส</translation>
 <translation id="4241404202385006548">ปิดส่วนขยายแล้วโหลดหน้าเว็บนี้ซ้ำ</translation>
 <translation id="6074963268421707432">ไม่อนุญาตให้ไซต์ใดๆ แสดงการแจ้งเตือนของเดสก์ท็อป</translation>
 <translation id="7221155467930685510">$1 GB</translation>
 <translation id="2624142942574147739">หน้าเว็บนี้กำลังเข้าถึงกล้องถ่ายรูปและไมโครโฟนของคุณ</translation>
 <translation id="7658239707568436148">ยกเลิก</translation>
-<translation id="557722062034137776">à¸\81ารรีà¹\80à¸\8bà¹\87à¸\95อุà¸\9bà¸\81รà¸\93à¹\8cà¸\82อà¸\87à¸\84ุà¸\93à¸\88ะà¹\84มà¹\88สà¹\88à¸\87à¸\9cลà¸\95à¹\88อà¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93หรือà¸\82à¹\89อมูลà¹\83à¸\94à¹\86 à¸\97ีà¹\88à¸\8bิà¸\87à¸\84à¹\8cà¸\81ัà¸\9aà¸\9aัà¸\8dà¸\8aีà¹\80หลà¹\88าà¸\99ีà¹\89 à¸­à¸¢à¹\88าà¸\87à¹\84รà¸\81à¹\87à¸\95าม à¹\84à¸\9fลà¹\8cà¸\97ัà¹\89à¸\87หมà¸\94à¸\97ีà¹\88à¸\9aัà¸\99à¸\97ึà¸\81อยูà¹\88ภายà¹\83à¸\99อุà¸\9bà¸\81รà¸\93à¹\8cà¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81</translation>
+<translation id="557722062034137776">à¸\81ารรีà¹\80à¸\8bà¹\87à¸\95อุà¸\9bà¸\81รà¸\93à¹\8cà¸\82อà¸\87à¸\84ุà¸\93à¸\88ะà¹\84มà¹\88สà¹\88à¸\87à¸\9cลà¸\95à¹\88อà¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93หรือà¸\82à¹\89อมูลà¹\83à¸\94à¹\86 à¸\97ีà¹\88à¸\8bิà¸\87à¸\84à¹\8cà¸\81ัà¸\9aà¸\9aัà¸\8dà¸\8aีà¹\80หลà¹\88าà¸\99ีà¹\89 à¸­à¸¢à¹\88าà¸\87à¹\84รà¸\81à¹\87à¸\95าม à¹\84à¸\9fลà¹\8cà¸\97ัà¹\89à¸\87หมà¸\94à¸\97ีà¹\88à¸\9aัà¸\99à¸\97ึà¸\81อยูà¹\88ภายà¹\83à¸\99อุà¸\9bà¸\81รà¸\93à¹\8cà¸\88ะà¸\96ูà¸\81ลà¸\9a</translation>
 <translation id="8695825812785969222">เปิด&amp;ตำแหน่ง...</translation>
-<translation id="4538417792467843292">à¸\99ำออà¸\81คำ</translation>
+<translation id="4538417792467843292">ลà¸\9aคำ</translation>
 <translation id="7309257895202129721">แสดงปุ่ม&amp;ควบคุม</translation>
 <translation id="8412392972487953978">คุณต้องป้อนข้อความรหัสผ่านที่เหมือนกันสองครั้ง</translation>
 <translation id="9121814364785106365">เปิดเป็นแท็บที่ปักหมุดไว้</translation>
 <translation id="6686490380836145850">ปิดแท็บทางด้านขวา</translation>
 <translation id="8366694425498033255">คีย์การเลือก</translation>
 <translation id="6011503819411930212">การใช้ CPU รวมของกระบวนการทั้งหมดที่เกี่ยวข้องกับ <ph name="SHORT_PRODUCT_NAME"/></translation>
-<translation id="420665587194630159">(สà¹\88วà¸\99à¸\82ยายà¸\99ีà¹\89à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\94à¸\81ารà¹\81ลà¹\89วà¹\81ละà¹\84มà¹\88สามารà¸\96à¸\99ำออà¸\81หรือปิดใช้งานได้)</translation>
+<translation id="420665587194630159">(สà¹\88วà¸\99à¸\82ยายà¸\99ีà¹\89à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\94à¸\81ารà¹\81ลà¹\89วà¹\81ละà¹\84มà¹\88สามารà¸\96ลà¸\9aหรือปิดใช้งานได้)</translation>
 <translation id="6535758682390046055">การดาวน์โหลด <ph name="PLUGIN_NAME"/> ถูกยกเลิก</translation>
 <translation id="2809346626032021864">การอ่าน</translation>
 <translation id="9156814239012955406">MD5</translation>
 <translation id="4684427112815847243">ซิงค์ทุกอย่าง</translation>
 <translation id="4699357559218762027">(เรียกใช้อัตโนมัติ)</translation>
 <translation id="4037463823853863991">เปิดใช้ตัวสลับแท็บความสามารถในการเข้าถึงสำหรับ Android </translation>
-<translation id="7394102162464064926">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¸\99ำออà¸\81หน้าเว็บเหล่านี้จากประวัติการเข้าชมของคุณ
+<translation id="7394102162464064926">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารลà¸\9aหน้าเว็บเหล่านี้จากประวัติการเข้าชมของคุณ
 
 รู้มั้ย! <ph name="SHORTCUT_KEY"/> ของโหมดไม่ระบุตัวตนอาจมีประโยชน์ต่อการใช้งานในครั้งถัดไป</translation>
 <translation id="1125520545229165057">Dvorak (Hsu)</translation>
 <translation id="7968982339740310781">ดูรายละเอียด</translation>
 <translation id="2726934403674109201">(ทั้งหมด <ph name="COUNT"/> รายการ)</translation>
 <translation id="6204994989617056362">ส่วนขยาย SSL Renegotiation ขาดหายไปจากแฮนด์เชคที่ปลอดภัย สำหรับบางไซต์ ซึ่งทราบกันดีว่าสนับสนุนส่วนขยาย Renegotiation ทาง Chrome จะกำหนดให้แฮนด์เชคที่ปลอดภัยยิ่งขึ้นจะต้องป้องกันประเภทการโจมตีที่เป็นที่รู้จัก การละเลยส่วนขยายนี้แสดงว่า การเชื่อมต่อของคุณได้ถูกดักข้อมูลและถูกควบคุมในระหว่างทาง</translation>
-<translation id="5800020978570554460">à¹\84à¸\9fลà¹\8cà¸\9bลายà¸\97าà¸\87à¹\84มà¹\88สมà¸\9aูรà¸\93à¹\8cหรือà¸\96ูà¸\81à¸\99ำออà¸\81ไปตั้งแต่การดาวน์โหลดครั้งล่าสุด</translation>
+<translation id="5800020978570554460">à¹\84à¸\9fลà¹\8cà¸\9bลายà¸\97าà¸\87à¹\84มà¹\88สมà¸\9aูรà¸\93à¹\8cหรือà¸\96ูà¸\81ลà¸\9aไปตั้งแต่การดาวน์โหลดครั้งล่าสุด</translation>
 <translation id="4887424188275796356">เปิดด้วยเครื่องมือดูระบบ</translation>
 <translation id="5823933238730612365">PPAPI (ไม่ใช่แซนด์บ็อกซ์)</translation>
 <translation id="5301751748813680278">เข้าสู่ระบบในฐานะผู้มาเยือน</translation>
 <translation id="2801702994096586034">เซิร์ฟเวอร์ 3</translation>
 <translation id="1598604884989842103">เปิดใช้ UI การขยาย TouchView สำหรับการทดสอบ</translation>
 <translation id="7109201843684542153">เปลี่ยนวิธีการแชร์ไฟล์เหล่านี้</translation>
-<translation id="4580526846085481512">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¸\99ำออà¸\81 $1 รายการ</translation>
+<translation id="4580526846085481512">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารลà¸\9a $1 รายการ</translation>
 <translation id="5292890015345653304">เสียบการ์ด SD หรืออุปกรณ์หน่วยความจำ USB</translation>
 <translation id="5583370583559395927">เวลาที่เหลือ: <ph name="TIME_REMAINING"/></translation>
 <translation id="6219717821796422795">Hanyu</translation>
 <translation id="5228309736894624122">ข้อผิดพลาดของโปรโตคอล SSL</translation>
 <translation id="8008356846765065031">อินเทอร์เน็ตถูกตัด โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ต</translation>
 <translation id="8216170236829567922">วิธีป้อนข้อมูลภาษาไทย (แป้นพิมพ์ปัตตะโชติ)</translation>
-<translation id="799547531016638432">à¸\99ำออà¸\81ทางลัด</translation>
+<translation id="799547531016638432">ลà¸\9aทางลัด</translation>
 <translation id="8464132254133862871">บัญชีผู้ใช้นี้ไม่ได้รับสิทธิ์สำหรับบริการนี้</translation>
 <translation id="6812349420832218321">ไม่สามารถเรียกใช้ <ph name="PRODUCT_NAME"/> ในฐานะผู้ใช้ระดับราก</translation>
 <translation id="8442065444327205563">เอกสารของคุณพร้อมดูแล้ว</translation>
 <translation id="6880587130513028875">หน้าเว็บนี้บล็อกการแสดงภาพ</translation>
 <translation id="6964308487066031935">ต้องการเพิ่มโฟลเดอร์ลงใน &quot;<ph name="EXTENSION"/>&quot; ใช่ไหม</translation>
 <translation id="851263357009351303">อนุญาตให้ <ph name="HOST"/> แสดงภาพเสมอ</translation>
-<translation id="7852934890287130200">สรà¹\89าà¸\87 à¹\80à¸\9bลีà¹\88ยà¸\99 à¸«à¸£à¸·à¸­à¸\99ำออà¸\81โปรไฟล์</translation>
+<translation id="7852934890287130200">สรà¹\89าà¸\87 à¹\80à¸\9bลีà¹\88ยà¸\99 à¸«à¸£à¸·à¸­à¸¥à¸\9aโปรไฟล์</translation>
 <translation id="3511307672085573050">คัดลอกที่อยู่&amp;ลิงก์</translation>
 <translation id="751507702149411736">เบลารุส</translation>
 <translation id="6655190889273724601">โหมดนักพัฒนาซอฟต์แวร์</translation>
 <translation id="4514542542275172126">ตั้งค่าผู้ใช้ภายใต้การดูแลใหม่</translation>
 <translation id="4279490309300973883">กำลังแสดงผล</translation>
 <translation id="2869742291459757746">อนุญาตให้ผู้ใช้ให้ Chrome สร้างรหัสผ่านเมื่อตรวจพบหน้าเว็บการสร้างบัญชี</translation>
-<translation id="7079038783243627996">&quot;<ph name="EXTENSION"/>&quot; à¸\88ะสามารà¸\96อà¹\88าà¸\99à¹\81ละà¸\99ำออà¸\81ไฟล์รูปภาพ วิดีโอ และเสียงในโฟลเดอร์ที่เลือกไว้</translation>
+<translation id="7079038783243627996">&quot;<ph name="EXTENSION"/>&quot; à¸\88ะสามารà¸\96อà¹\88าà¸\99à¹\81ละลà¸\9aไฟล์รูปภาพ วิดีโอ และเสียงในโฟลเดอร์ที่เลือกไว้</translation>
 <translation id="1737968601308870607">ข้อบกพร่องของไฟล์</translation>
 <translation id="8437238597147034694">&amp;เลิกทำการย้าย</translation>
 <translation id="1389297115360905376">ต้องเพิ่มจาก <ph name="CHROME_WEB_STORE"/> เท่านั้น</translation>
 <translation id="3368922792935385530">เชื่อมต่อแล้ว</translation>
 <translation id="5431473096922271583">เราขอให้คุณตรวจสอบว่าคุณกำลังใช้ที่ชาร์จเดิมอยู่ไหม</translation>
 <translation id="3478477114335130296">อาจมีการเปลี่ยนแปลงการตั้งค่าบางส่วนของคุณโดยที่คุณไม่ทราบ</translation>
-<translation id="3866443872548686097">สืà¹\88อà¸\81ารà¸\81ูà¹\89à¸\84ืà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¸\9eรà¹\89อมà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\81ลà¹\89ว à¸\84ุà¸\93สามารà¸\96à¸\99ำออà¸\81จากระบบของคุณได้</translation>
+<translation id="3866443872548686097">สืà¹\88อà¸\81ารà¸\81ูà¹\89à¸\84ืà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¸\9eรà¹\89อมà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\81ลà¹\89ว à¸\84ุà¸\93สามารà¸\96ลà¸\9aจากระบบของคุณได้</translation>
 <translation id="5525677322972469346">สร้างผู้ใช้ภายใต้การดูแลใหม่</translation>
 <translation id="6824564591481349393">คัดลอก&amp;ที่อยู่อีเมล</translation>
 <translation id="907148966137935206">ไม่อนุญาตให้ไซต์ใดๆ แสดงป๊อปอัป (แนะนำ)</translation>
 <translation id="7791543448312431591">เพิ่ม</translation>
 <translation id="8569764466147087991">เลือกไฟล์เพื่อเปิด</translation>
 <translation id="9131487537093447019">ส่งข้อความถึงและรับข้อความจากอุปกรณ์บลูทูธ</translation>
-<translation id="3010279545267083280">à¸\99ำออà¸\81รหัสผ่านแล้ว</translation>
+<translation id="3010279545267083280">ลà¸\9aรหัสผ่านแล้ว</translation>
 <translation id="4275663329226226506">สื่อ</translation>
 <translation id="3629630062892748850">URL ที่เกี่ยวข้องและการค้นหาใน Google.com</translation>
 <translation id="5649768706273821470">ฟัง</translation>
 <translation id="7187885785158279764">เพิกถอนการเข้าถึงไฟล์</translation>
 <translation id="3574210789297084292">ลงชื่อเข้าใช้</translation>
 <translation id="5254480569305195883">เปิดใช้การสนับสนุนกิจกรรมการซิงค์พื้นหลังของ ServiceWorker</translation>
-<translation id="2134149231879627725">à¹\83หà¹\89 Google à¸\8aà¹\88วยà¸\84ุà¸\93à¹\83à¸\99à¸\81ารลà¹\87อà¸\81 à¸\99ำออà¸\81 และค้นหาอุปกรณ์จากระยะไกล</translation>
+<translation id="2134149231879627725">à¹\83หà¹\89 Google à¸\8aà¹\88วยà¸\84ุà¸\93à¹\83à¸\99à¸\81ารลà¹\87อà¸\81 à¸¥à¸\9a และค้นหาอุปกรณ์จากระยะไกล</translation>
 <translation id="1146204723345436916">นำเข้าบุ๊กมาร์กจากไฟล์ HTML...</translation>
 <translation id="2113921862428609753">การเข้าถึงข้อมูลผู้ออกใบรับรอง</translation>
 <translation id="9190063653747922532">L2TP/IPsec + คีย์ที่แชร์ล่วงหน้า</translation>
 <translation id="1171000732235946541">วิธีการป้อนข้อมูลนี้อาจสามารถรวบรวมข้อความทั้งหมดที่คุณพิมพ์ ซึ่งรวมถึงข้อมูลส่วนตัว เช่น รหัสผ่านและหมายเลขบัตรเครดิต วิธีการป้อนข้อมูลนี้มาจากส่วนขยาย &quot;<ph name="EXTENSION_NAME"/>&quot; ต้องการใช้วิธีการป้อนข้อมูลนี้ไหม</translation>
 <translation id="7788080748068240085">หากต้องการบันทึก &quot;<ph name="FILE_NAME"/>&quot; เป็นแบบออฟไลน์ คุณจะต้องเพิ่มพื้นที่ว่างอีก <ph name="TOTAL_FILE_SIZE"/> โดยทำดังนี้:<ph name="MARKUP_1"/>
     <ph name="MARKUP_2"/>เลิกตรึงไฟล์ที่คุณไม่ต้องการเข้าถึงแบบออฟไลน์อีกต่อไป<ph name="MARKUP_3"/>
-    <ph name="MARKUP_4"/>à¸\99ำออà¸\81ไฟล์จากโฟลเดอร์ &quot;ดาวน์โหลด&quot;<ph name="MARKUP_5"/></translation>
+    <ph name="MARKUP_4"/>ลà¸\9aไฟล์จากโฟลเดอร์ &quot;ดาวน์โหลด&quot;<ph name="MARKUP_5"/></translation>
 <translation id="2995880258819891653">เปิดใช้งานรายการตัวเรียกใช้งานล่าสุด</translation>
 <translation id="6913830198853875055">เมื่อเปิดใช้ การเรียกใช้โฆษณาจะแสดงตัวอย่างผลการค้นหาและสลับกับหน้าดั้งเดิมเมื่อมีการดาวน์โหลดและแสดงผล</translation>
 <translation id="6561442619165486567">เปลี่ยนวิธีการแชร์ไฟล์นี้</translation>
           <ph name="END_BOLD"/></translation>
 <translation id="123578888592755962">ดิสก์เต็ม</translation>
 <translation id="5496587651328244253">จัดระเบียบ</translation>
-<translation id="5967867314010545767">à¸\99ำออà¸\81จากประวัติการเข้าชม</translation>
+<translation id="5967867314010545767">ลà¸\9aจากประวัติการเข้าชม</translation>
 <translation id="5984222099446776634">เข้าชมล่าสุด</translation>
 <translation id="4821086771593057290">คุณได้เปลี่ยนรหัสผ่านของคุณแล้ว โปรดลองอีกครั้งโดยใช้รหัสผ่านใหม่ของคุณ</translation>
 <translation id="6080696365213338172">คุณเข้าถึงเนื้อหาโดยใช้ใบรับรองที่ผู้ดูแลระบบออกให้ ข้อมูลที่คุณให้กับ <ph name="DOMAIN"/> อาจถูกสกัดกั้นโดยผู้ดูแลระบบ</translation>
 <translation id="4181898366589410653">ไม่พบกระบวนการเพิกถอนในใบรับรองของเซิร์ฟเวอร์</translation>
 <translation id="1515163294334130951">เริ่มต้น</translation>
 <translation id="6914291514448387591"><ph name="PLUGIN_NAME"/> ต้องได้รับอนุญาตจากคุณก่อนจึงจะทำงานได้</translation>
-<translation id="1123316951456119629">หาà¸\81ยà¸\81à¹\80ลิà¸\81à¸\81ารà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อà¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93à¸\88าà¸\81 <ph name="PRODUCT_NAME"/> à¸\82à¹\89อมูลà¸\82อà¸\87à¸\84ุà¸\93à¸\88ะยัà¸\87à¸\84à¸\87อยูà¹\88à¹\83à¸\99à¸\84อมà¸\9eิวà¹\80à¸\95อรà¹\8cà¸\99ีà¹\89à¹\81à¸\95à¹\88à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ีà¹\88à¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¸\88ะà¹\84มà¹\88à¸\96ูà¸\81à¸\8bิà¸\87à¸\84à¹\8cà¹\84à¸\9bà¸\97ีà¹\88à¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93อีà¸\81à¸\95à¹\88อà¹\84à¸\9b à¸\82à¹\89อมูลà¸\97ีà¹\88à¸\96ูà¸\81à¸\88ัà¸\94à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99à¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93à¹\80รียà¸\9aรà¹\89อยà¹\81ลà¹\89วà¸\88ะยัà¸\87à¸\84à¸\87อยูà¹\88à¹\83à¸\99à¸\9aัà¸\8dà¸\8aีà¹\80หมือà¸\99à¹\80à¸\94ิมà¸\88à¸\99à¸\81วà¹\88าà¸\84ุà¸\93à¸\88ะà¸\99ำออà¸\81ไปโดยใช้ <ph name="BEGIN_LINK"/>Google แดชบอร์ด<ph name="END_LINK"/></translation>
+<translation id="1123316951456119629">หาà¸\81ยà¸\81à¹\80ลิà¸\81à¸\81ารà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อà¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93à¸\88าà¸\81 <ph name="PRODUCT_NAME"/> à¸\82à¹\89อมูลà¸\82อà¸\87à¸\84ุà¸\93à¸\88ะยัà¸\87à¸\84à¸\87อยูà¹\88à¹\83à¸\99à¸\84อมà¸\9eิวà¹\80à¸\95อรà¹\8cà¸\99ีà¹\89à¹\81à¸\95à¹\88à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ีà¹\88à¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¸\88ะà¹\84มà¹\88à¸\96ูà¸\81à¸\8bิà¸\87à¸\84à¹\8cà¹\84à¸\9bà¸\97ีà¹\88à¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93อีà¸\81à¸\95à¹\88อà¹\84à¸\9b à¸\82à¹\89อมูลà¸\97ีà¹\88à¸\96ูà¸\81à¸\88ัà¸\94à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99à¸\9aัà¸\8dà¸\8aี Google à¸\82อà¸\87à¸\84ุà¸\93à¹\80รียà¸\9aรà¹\89อยà¹\81ลà¹\89วà¸\88ะยัà¸\87à¸\84à¸\87อยูà¹\88à¹\83à¸\99à¸\9aัà¸\8dà¸\8aีà¹\80หมือà¸\99à¹\80à¸\94ิมà¸\88à¸\99à¸\81วà¹\88าà¸\84ุà¸\93à¸\88ะลà¸\9aไปโดยใช้ <ph name="BEGIN_LINK"/>Google แดชบอร์ด<ph name="END_LINK"/></translation>
 <translation id="8705331520020532516">หมายเลขซีเรียล</translation>
 <translation id="1665770420914915777">ใช้หน้าในแท็บใหม่</translation>
 <translation id="160747070824041275">ส่วนขยายที่อัปเดต</translation>
 <translation id="4707934200082538898">โปรดตรวจสอบอีเมลของคุณที่ <ph name="BEGIN_BOLD"/><ph name="MANAGER_EMAIL"/><ph name="END_BOLD"/> สำหรับคำแนะนำเพิ่มเติม</translation>
 <translation id="8680544835056685300">เรากำลังหาวิธีที่จะทำให้การท่องเว็บของคุณปลอดภัยยิ่งขึ้นอย่างต่อเนื่อง ก่อนหน้านี้ทุกเว็บไซต์สามารถพรอมต์ให้คุณเพิ่มส่วนขยายในเบราว์เซอร์ของคุณ แต่ใน Google Chrome เวอร์ชันล่าสุด คุณต้องแจ้งให้ Chrome ทราบอย่างชัดเจนว่าคุณต้องการติดตั้งส่วนขยายเหล่านี้ โดยการเพิ่มส่วนขยายผ่านหน้า &quot;ส่วนขยาย&quot; <ph name="BEGIN_LINK"/>เรียนรู้เพิ่มเติม<ph name="END_LINK"/></translation>
 <translation id="4089521618207933045">มีเมนูย่อย</translation>
-<translation id="3470442499439619530">à¸\99ำออà¸\81ผู้ใช้รายนี้</translation>
+<translation id="3470442499439619530">ลà¸\9aผู้ใช้รายนี้</translation>
 <translation id="1936157145127842922">แสดงในโฟลเดอร์</translation>
 <translation id="1613703494520735460">ทำนายตำแหน่งนิ้วมือในอนาคตในระหว่างการเลื่อนโดยให้มีเวลาในการแสดงผลเฟรมก่อนที่นิ้วจะเลื่อนไปที่นั่น</translation>
 <translation id="7977590112176369853">&lt;ป้อนคำค้นหา&gt;</translation>
 <translation id="4988526792673242964">หน้า</translation>
 <translation id="3222030446634788083">การตอบสนองของ OCSP</translation>
 <translation id="3302340765592941254">การแจ้งเตือนการดาวน์โหลดเสร็จสิ้น</translation>
-<translation id="425573743389990240">อัà¸\95ราà¸\81ารà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\95à¹\80à¸\95อรีà¹\88à¹\80à¸\9bà¹\87à¸\99วัà¸\95à¸\95à¹\8c (à¸\84à¹\88าà¸\99ำออà¸\81หมายถึงแบตเตอรี่กำลังชาร์จ)</translation>
+<translation id="425573743389990240">อัà¸\95ราà¸\81ารà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\95à¹\80à¸\95อรีà¹\88à¹\80à¸\9bà¹\87à¸\99วัà¸\95à¸\95à¹\8c (à¸\84à¹\88าลà¸\9aหมายถึงแบตเตอรี่กำลังชาร์จ)</translation>
 <translation id="5520895355616214066">เปิดใช้แอปไดรฟ์ในเครื่องเรียกใช้งานแอป</translation>
 <translation id="2175607476662778685">แถบเปิดใช้งานด่วน</translation>
 <translation id="9085376357433234031">หากต้องการบันทึกไฟล์เหล่านี้สำหรับการใช้งานแบบออฟไลน์ ให้กลับไปออนไลน์และ&lt;br&gt;เลือกช่องทำเครื่องหมาย <ph name="OFFLINE_CHECKBOX_NAME"/> สำหรับไฟล์เหล่านี้</translation>
 <translation id="1815083418640426271">วางเป็นข้อความธรรมดา</translation>
 <translation id="39964277676607559">ไม่สามารถโหลด javascript &quot;<ph name="RELATIVE_PATH"/>&quot; สำหรับสคริปต์เนื้อหา</translation>
 <translation id="979598830323579437">แว่นขยายเพิ่มการซูม</translation>
-<translation id="4284105660453474798">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¸\99ำออà¸\81 &quot;$1&quot;</translation>
+<translation id="4284105660453474798">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารลà¸\9a &quot;$1&quot;</translation>
 <translation id="1600857548979126453">เข้าถึงแบ็คเอนด์เครื่องซ่อมแซมหน้าเว็บ</translation>
 <translation id="2862043554446264826">แก้ไขข้อบกพร่องทุกอย่างยกเว้น Secure Shell และนักแปล PNaCl</translation>
 <translation id="3516765099410062445">กำลังแสดงประวัติจากอุปกรณ์ที่คุณลงชื่อเข้าใช้ <ph name="BEGIN_LINK"/>เรียนรู้เพิ่มเติม<ph name="END_LINK"/></translation>
 <translation id="6437213622978068772">โหลดซ้ำ (Ctrl+R)</translation>
 <translation id="5350480486488078311">API สำหรับ NaCl Socket</translation>
 <translation id="8551406349318936106">อ๊ะ! ดูเหมือนว่ามีปัญหาเกี่ยวกับข้อมูลรับรองของคุณ โปรดตรวจสอบว่าคุณลงชื่อเข้าใช้อย่างถูกต้องแล้วและลองอีกครั้ง</translation>
-<translation id="5329858601952122676">&amp;à¸\99ำออà¸\81</translation>
+<translation id="5329858601952122676">&amp;ลà¸\9a</translation>
 <translation id="6100736666660498114">เมนูเริ่มต้น</translation>
 <translation id="6370021412472292592">ไม่สามารถโหลดไฟล์ Manifest</translation>
 <translation id="3994878504415702912">ซู&amp;ม</translation>
 <translation id="3816846830151612068">คุณไว้วางใจให้ส่วนขยายนี้ใช้สิทธิพิเศษเหล่านี้อย่างปลอดภัยไหม</translation>
 <translation id="7885253890047913815">ปลายทางล่าสุด</translation>
 <translation id="3646789916214779970">รีเซ็ตเป็นธีมค่าเริ่มต้น</translation>
-<translation id="9220525904950070496">à¸\99ำออà¸\81บัญชี</translation>
+<translation id="9220525904950070496">ลà¸\9aบัญชี</translation>
 <translation id="151922265591345427">1024</translation>
 <translation id="3039828483675273919">กำลังย้าย $1 รายการ...</translation>
 <translation id="7816949580378764503">ข้อมูลประจำตัวได้รับการยืนยัน</translation>
 <translation id="1416136326154112077">การตั้งค่าสำหรับผู้ใช้ภายใต้การดูแลนี้อาจจะยังคงมองเห็นได้โดยผู้จัดการที่ <ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/></translation>
 <translation id="197288927597451399">เก็บไว้</translation>
 <translation id="5880867612172997051">ระงับการเข้าถึงเครือข่ายชั่วคราว</translation>
-<translation id="5495466433285976480">à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\99ีà¹\89à¸\88ะà¸\99ำออà¸\81ผู้ใช้ท้องถิ่น ไฟล์ ข้อมูล และการตั้งค่าอื่นๆ ทั้งหมดหลังจากการรีสตาร์ทครั้งถัดไปของคุณ ผู้ใช้ทุกคนจะต้องลงชื่อเข้าใช้อีกครั้ง</translation>
+<translation id="5495466433285976480">à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\99ีà¹\89à¸\88ะลà¸\9aผู้ใช้ท้องถิ่น ไฟล์ ข้อมูล และการตั้งค่าอื่นๆ ทั้งหมดหลังจากการรีสตาร์ทครั้งถัดไปของคุณ ผู้ใช้ทุกคนจะต้องลงชื่อเข้าใช้อีกครั้ง</translation>
 <translation id="7842346819602959665">ส่วนขยายเวอร์ชันใหม่ล่าสุด &quot;<ph name="EXTENSION_NAME"/>&quot; จำเป็นต้องได้รับการอนุญาตที่มากกว่าเดิม ดังนั้นจึงถูกปิดการใช้งานไว้</translation>
 <translation id="3776667127601582921">ในกรณีนี้ ใบรับรองเซิร์ฟเวอร์หรือใบรับรอง CA ระดับกลางที่แสดงต่อเบราว์เซอร์ของคุณไม่ถูกต้อง ซึ่งอาจหมายถึงว่าใบรับรองผิดรูปแบบ มีฟิลด์ที่ไม่ถูกต้อง หรือไม่ได้รับการสนับสนุน</translation>
 <translation id="2412835451908901523">โปรดป้อนคีย์การปลดล็อก PIN 8 หลักที่ <ph name="CARRIER_ID"/> ให้มา</translation>
 <translation id="57646104491463491">วันที่แก้ไข</translation>
 <translation id="3941357410013254652">รหัสช่อง</translation>
 <translation id="7266345500930177944">คลิกเพื่อเรียกใช้ <ph name="PLUGIN_NAME"/></translation>
-<translation id="1355542767438520308">à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94 à¸\9aาà¸\87รายà¸\81ารอาà¸\88à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\99ำออà¸\81</translation>
+<translation id="1355542767438520308">à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94 à¸\9aาà¸\87รายà¸\81ารอาà¸\88à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81ลà¸\9a</translation>
 <translation id="8264718194193514834">&quot;<ph name="EXTENSION_NAME"/>&quot; เรียกใช้หน้าจอแบบเต็ม</translation>
 <translation id="6223447490656896591">ภาพที่กำหนดเอง:</translation>
 <translation id="6362853299801475928">&amp;รายงานปัญหา...</translation>
 <translation id="918765022965757994">ลงชื่อเข้าใช้ไซต์นี้ด้วย: <ph name="EMAIL_ADDRESS"/></translation>
 <translation id="8216278935161109887">ออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้ง</translation>
 <translation id="6254503684448816922">คีย์ไม่สมบูรณ์</translation>
-<translation id="6555432686520421228">à¸\99ำออà¸\81บัญชีผู้ใช้ทั้งหมดและรีเซ็ตอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME"/> ของคุณให้เหมือนใหม่</translation>
+<translation id="6555432686520421228">ลà¸\9aบัญชีผู้ใช้ทั้งหมดและรีเซ็ตอุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME"/> ของคุณให้เหมือนใหม่</translation>
 <translation id="1346748346194534595">ขวา</translation>
 <translation id="7756363132985736290">มีใบรับรองนี้อยู่แล้ว</translation>
-<translation id="1181037720776840403">à¸\99ำออà¸\81</translation>
-<translation id="5261073535210137151">à¹\82à¸\9fลà¹\80à¸\94อรà¹\8cà¸\99ีà¹\89มีà¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 <ph name="COUNT"/> à¸£à¸²à¸¢à¸\81าร à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¸\99ำออà¸\81</translation>
+<translation id="1181037720776840403">ลà¸\9a</translation>
+<translation id="5261073535210137151">à¹\82à¸\9fลà¹\80à¸\94อรà¹\8cà¸\99ีà¹\89มีà¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 <ph name="COUNT"/> à¸£à¸²à¸¢à¸\81าร à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารลà¸\9a</translation>
 <translation id="59174027418879706">เปิดใช้งานแล้ว</translation>
 <translation id="4194415033234465088">Dachen 26</translation>
 <translation id="8800004011501252845">แสดงปลายทางสำหรับ</translation>
 <translation id="960987915827980018">เหลือเวลาอีกประมาณ 1 ชั่วโมง</translation>
 <translation id="3112378005171663295">ยุบ</translation>
 <translation id="8428213095426709021">การตั้งค่า</translation>
-<translation id="7211994749225247711">à¸\99ำออà¸\81...</translation>
+<translation id="7211994749225247711">ลà¸\9a...</translation>
 <translation id="2819994928625218237">ไม่&amp;มีข้อเสนอแนะการสะกดคำ</translation>
 <translation id="382518646247711829">หากคุณใช้พร็อกซีเซิร์ฟเวอร์...</translation>
 <translation id="1923342640370224680">ชั่วโมงล่าสุด</translation>
 <translation id="8004512796067398576">การเพิ่ม</translation>
 <translation id="2930644991850369934">เกิดปัญหาขณะดาวน์โหลดอิมเมจการกู้คืน การเชื่อมต่อเครือข่ายขาดหาย</translation>
 <translation id="6891622577412956611">มุมมองภาพโมเสค</translation>
-<translation id="8150722005171944719">à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88 <ph name="URL"/> à¹\84มà¹\88สามารà¸\96อà¹\88าà¸\99à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81อาà¸\88à¸\96ูà¸\81à¸\99ำออà¸\81 ย้ายไปแล้ว หรือการอนุญาตของไฟล์อาจป้องกันการเข้าถึง</translation>
+<translation id="8150722005171944719">à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88 <ph name="URL"/> à¹\84มà¹\88สามารà¸\96อà¹\88าà¸\99à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81อาà¸\88à¸\96ูà¸\81ลà¸\9a ย้ายไปแล้ว หรือการอนุญาตของไฟล์อาจป้องกันการเข้าถึง</translation>
 <translation id="2316129865977710310">ไม่ ขอบคุณ</translation>
 <translation id="994901932508062332">เดือนล่าสุด</translation>
 <translation id="1720318856472900922">การตรวจสอบสิทธิ์เซิร์ฟเวอร์ TLS WWW </translation>
 <translation id="2025623846716345241">ยืนยันการโหลดซ้ำ</translation>
 <translation id="2151576029659734873">ดัชนีแท็บที่ป้อนไม่ถูกต้อง</translation>
 <translation id="496546018524231664">ไอร์แลนด์</translation>
-<translation id="1815861158988915678"><ph name="BEGIN_BOLD"/>à¸\82à¹\89อà¸\84วรระวัà¸\87:<ph name="END_BOLD"/> à¹\84à¸\9fลà¹\8cà¹\80หลà¹\88าà¸\99ีà¹\89à¹\83à¸\8aà¹\89à¸\8aัà¹\88วà¸\84ราวà¹\81ละอาà¸\88à¸\96ูà¸\81à¸\99ำออà¸\81โดยอัตโนมัติเพื่อเพิ่มพื้นที่ว่างในดิสก์ <ph name="BEGIN_LINK"/>เรียนรู้เพิ่มเติม<ph name="END_LINK"/></translation>
+<translation id="1815861158988915678"><ph name="BEGIN_BOLD"/>à¸\82à¹\89อà¸\84วรระวัà¸\87:<ph name="END_BOLD"/> à¹\84à¸\9fลà¹\8cà¹\80หลà¹\88าà¸\99ีà¹\89à¹\83à¸\8aà¹\89à¸\8aัà¹\88วà¸\84ราวà¹\81ละอาà¸\88à¸\96ูà¸\81ลà¸\9aโดยอัตโนมัติเพื่อเพิ่มพื้นที่ว่างในดิสก์ <ph name="BEGIN_LINK"/>เรียนรู้เพิ่มเติม<ph name="END_LINK"/></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME"/> กำลังแชร์หน้าจอของคุณ</translation>
 <translation id="5150254825601720210">ใบรับรองชื่อเซิร์ฟเวอร์ SSL ของ Netscape</translation>
 <translation id="7199158086730159431">รั&amp;บความช่วยเหลือ</translation>
 <translation id="2400837204278978822">ไม่รู้จักประเภทไฟล์</translation>
 <translation id="8987927404178983737">เดือน</translation>
 <translation id="2814100462326464815">พลิกรูปภาพกลับแล้ว</translation>
-<translation id="1436784010935106834">à¸\99ำออà¸\81ออกแล้ว</translation>
+<translation id="1436784010935106834">ลà¸\9aออกแล้ว</translation>
 <translation id="3730639321086573427">ปลายทางในท้องถิ่น</translation>
 <translation id="4103674824110719308">กำลังเข้าสู่การสาธิต</translation>
 <translation id="2734167549439405382">เว็บไซต์นี้ได้รับการยืนยันตัวตนโดย <ph name="ISSUER"/> แต่ไม่มีระเบียนการตรวจสอบแบบสาธารณะ</translation>
 <translation id="6203231073485539293">ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต</translation>
 <translation id="488726935215981469">ข้อมูลของคุณถูกเข้ารหัสด้วยข้อความรหัสผ่านการซิงค์ของคุณ โปรดป้อนด้านล่าง</translation>
 <translation id="6147020289383635445">หน้าตัวอย่างก่อนพิมพ์ล้มเหลว</translation>
-<translation id="7650511557061837441">&quot;<ph name="TRIGGERING_EXTENSION_NAME"/>&quot; à¸\95à¹\89อà¸\87à¸\81ารà¸\99ำออà¸\81 &quot;<ph name="EXTENSION_NAME"/>&quot;</translation>
+<translation id="7650511557061837441">&quot;<ph name="TRIGGERING_EXTENSION_NAME"/>&quot; à¸\95à¹\89อà¸\87à¸\81ารลà¸\9a &quot;<ph name="EXTENSION_NAME"/>&quot;</translation>
 <translation id="4154664944169082762">ลายนิ้วมือ</translation>
 <translation id="4193297030838143153">ที่อยู่สำหรับการเรียกเก็บเงินใหม่...</translation>
 <translation id="3202578601642193415">ใหม่ที่สุด</translation>
 <translation id="5507756662695126555">การป้องกันการปฏิเสธความรับผิดชอบต่อข้อมูล</translation>
 <translation id="3678156199662914018">ส่วนขยาย: <ph name="EXTENSION_NAME"/></translation>
 <translation id="2620090360073999360">ไม่สามารถเข้าถึง Google ไดรฟ์ได้ในเวลานี้</translation>
-<translation id="725387188884494207">à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\99ำออà¸\81ผู้ใช้รายนี้และข้อมูลทั้งหมดที่เกี่ยวข้องออกจากคอมพิวเตอร์เครื่องนี้ไหม เมื่อดำเนินการแล้วจะไม่สามารถยกเลิกได้!</translation>
+<translation id="725387188884494207">à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารลà¸\9aผู้ใช้รายนี้และข้อมูลทั้งหมดที่เกี่ยวข้องออกจากคอมพิวเตอร์เครื่องนี้ไหม เมื่อดำเนินการแล้วจะไม่สามารถยกเลิกได้!</translation>
 <translation id="3531250013160506608">ช่องข้อความรหัสผ่าน</translation>
 <translation id="2169062631698640254">ลงชื่อเข้าใช้ต่อไป</translation>
 <translation id="506228266759207354">ปิดใช้งานเมนูหน้าแท็บใหม่สำหรับการเข้าถึงแท็บบนอุปกรณ์อื่นๆ</translation>
 <translation id="7347751611463936647">ในการใช้ส่วนขยายนี้ ให้พิมพ์ &quot;<ph name="EXTENSION_KEYWORD"/>&quot; แล้วกด TAB ตามด้วยคำสั่งหรือการค้นหาของคุณ</translation>
 <translation id="878431691778285679">ดูเหมือนว่าคุณกำลังจัดการผู้ใช้ที่ชื่อนั้นอยู่แล้ว<ph name="LINE_BREAK"/>คุณต้องการ <ph name="BEGIN_LINK"/>นำเข้า <ph name="PROFILE_NAME"/> มายังอุปกรณ์นี้<ph name="END_LINK"/>ไหม</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> ต้องการใช้ไมโครโฟนของคุณ</translation>
-<translation id="2805756323405976993">แอปพลิเคชัน</translation>
+<translation id="2805756323405976993">แอป</translation>
 <translation id="5151511998946489774">เว็บไซต์นี้ได้รับการยืนยันตัวตนโดย <ph name="ISSUER"/> และสามารถตรวจสอบได้แบบสาธารณะ</translation>
-<translation id="1608626060424371292">à¸\99ำออà¸\81ผู้ใช้รายนี้</translation>
+<translation id="1608626060424371292">ลà¸\9aผู้ใช้รายนี้</translation>
 <translation id="2779552785085366231">สามารถเพิ่มหน้านี้ลงในเครื่องเรียกใช้งานแอป</translation>
 <translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME"/> ถูกสร้างขึ้นเป็นผู้ใช้ภายใต้การดูแล!</translation>
 <translation id="3651020361689274926">ทรัพยากรที่ร้องขอไม่มีอยู่แล้วและไม่พบที่อยู่ในการส่งต่อ ปัญหานี้ไม่ใช่ข้อผิดพลาดที่เกิดขึ้นชั่วคราว</translation>
 <translation id="8193362611902704788">เปิดใช้เครื่องเรียกใช้งานแอป การเปิดใช้จะสร้างทางลัดสำหรับระบบปฏิบัติการในเครื่องเรียกใช้งานแอป</translation>
 <translation id="5121130586824819730">ฮาร์ดดิสก์ของคุณเต็ม โปรดบันทึกลงในตำแหน่งอื่นหรือเพิ่มเนื้อที่ว่างในฮาร์ดดิสก์</translation>
 <translation id="1875987452136482705">ตัวเลือกนี้จะปิดใช้การสนับสนุนใน WebRTC สำหรับการถอดรหัสสตรีมวิดีโอโดยใช้ฮาร์ดแวร์แพลตฟอร์ม</translation>
-<translation id="6164005077879661055">à¹\84à¸\9fลà¹\8cà¹\81ละà¸\82à¹\89อมูลà¹\83à¸\99à¸\95ัวà¹\80à¸\84รืà¹\88อà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89ภายà¹\83à¸\95à¹\89à¸\81ารà¸\94ูà¹\81ลà¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81ออà¸\81อยà¹\88าà¸\87à¸\96าวรà¹\80มืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89ภายà¹\83à¸\95à¹\89à¸\81ารà¸\94ูà¹\81ลà¸\99ีà¹\89à¸\96ูà¸\81à¸\99ำออà¸\81 เว็บไซต์ที่เข้าชมและการตั้งค่าสำหรับผู้ใช้ภายใต้การดูแลนี้อาจจะยังคงมองเห็นได้โดยผู้จัดการที่ <ph name="MANAGEMENT_URL"/></translation>
+<translation id="6164005077879661055">à¹\84à¸\9fลà¹\8cà¹\81ละà¸\82à¹\89อมูลà¹\83à¸\99à¸\95ัวà¹\80à¸\84รืà¹\88อà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89ภายà¹\83à¸\95à¹\89à¸\81ารà¸\94ูà¹\81ลà¸\88ะà¸\96ูà¸\81ลà¸\9aออà¸\81อยà¹\88าà¸\87à¸\96าวรà¹\80มืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89ภายà¹\83à¸\95à¹\89à¸\81ารà¸\94ูà¹\81ลà¸\99ีà¹\89à¸\96ูà¸\81ลà¸\9a เว็บไซต์ที่เข้าชมและการตั้งค่าสำหรับผู้ใช้ภายใต้การดูแลนี้อาจจะยังคงมองเห็นได้โดยผู้จัดการที่ <ph name="MANAGEMENT_URL"/></translation>
 <translation id="6723839937902243910">พลังงาน</translation>
 <translation id="1031460590482534116">พบข้อผิดพลาดขณะพยายามจัดเก็บใบรับรองไคลเอ็นต์ ข้อผิดพลาด <ph name="ERROR_NUMBER"/> (<ph name="ERROR_NAME"/>)</translation>
 <translation id="8221511411222784897">Chrome ตรวจพบว่าการตั้งค่าเบราว์เซอร์ของคุณบางส่วนได้รับความเสียหายจากโปรแกรมอื่น และรีเซ็ตการตั้งค่าเป็นค่าเริ่มต้นเดิม</translation>
 <translation id="7248671827512403053">แอปพลิเคชัน</translation>
 <translation id="247500748408468353">โปรดติดต่อผู้ดูแลระบบของคุณหรือลองอีกครั้ง</translation>
 <translation id="450070808725753129">หากมีอยู่ในรายการเป็นโปรแกรมที่ได้รับอนุญาตให้เข้าถึงเครือข่ายอยู่แล้ว ให้ลอง
-        à¸\99ำออà¸\81จากรายการและเพิ่มกลับเข้าไปอีกครั้ง</translation>
+        à¸¥à¸\9aจากรายการและเพิ่มกลับเข้าไปอีกครั้ง</translation>
 <translation id="778627899913883287">ตรวจสอบว่าสิทธิพิเศษเหล่านี้เหมาะกับสิ่งที่คุณคิดว่าส่วนขยายจะต้องทำ หากไม่เป็นเช่นนั้น ให้คลิก &quot;ยกเลิก&quot;</translation>
 <translation id="4742746985488890273">ตรึงที่ชั้นวาง</translation>
 <translation id="8074984796671539016">เปิดใช้ปุ่ม &quot;โหลดสำเนาที่ไม่มีการอัปเดตแบบออฟไลน์&quot;</translation>
 <translation id="4240511609794012987">หน่วยความจำที่ใช้ร่วมกัน</translation>
 <translation id="4756388243121344051">&amp;ประวัติการเข้าชม</translation>
 <translation id="1146673768181266552">รหัสข้อขัดข้อง <ph name="CRASH_ID"/> (<ph name="CRASH_LOCAL_ID"/>)</translation>
-<translation id="5488640658880603382">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารà¸\99ำออà¸\81 &quot;<ph name="PROFILE_NAME"/>&quot; และข้อมูลทั้งหมดที่เกี่ยวข้องออกจากคอมพิวเตอร์นี้ เมื่อดำเนินการแล้วจะไม่สามารถยกเลิกได้!</translation>
+<translation id="5488640658880603382">à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรือà¹\84มà¹\88วà¹\88าà¸\95à¹\89อà¸\87à¸\81ารลà¸\9a &quot;<ph name="PROFILE_NAME"/>&quot; และข้อมูลทั้งหมดที่เกี่ยวข้องออกจากคอมพิวเตอร์นี้ เมื่อดำเนินการแล้วจะไม่สามารถยกเลิกได้!</translation>
 <translation id="8044899503464538266">ช้า</translation>
 <translation id="3789841737615482174">ติดตั้ง</translation>
 <translation id="4320697033624943677">เพิ่มผู้ใช้</translation>
 <translation id="8669855045727723110">ดาวน์โหลดโดย <ph name="EXTENSION"/></translation>
 <translation id="3057592184182562878">แสดงอุปกรณ์ MTP เป็นพื้นที่จัดเก็บไฟล์ในตัวจัดการไฟล์</translation>
 <translation id="54401264925851789">ข้อมูลเกี่ยวกับการรักษาความปลอดภัยของหน้าเว็บ</translation>
-<translation id="8895908457475309889">à¸\82à¹\89อมูลà¸\82อà¸\87à¸\84ุà¸\93à¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81เมื่อคุณออกจากระบบ</translation>
+<translation id="8895908457475309889">à¸\82à¹\89อมูลà¸\82อà¸\87à¸\84ุà¸\93à¸\88ะà¸\96ูà¸\81ลà¸\9aเมื่อคุณออกจากระบบ</translation>
 <translation id="3740601730372300467">การอัปเดตด้วยตนเองถูกปิดใช้งานโดยผู้ดูแลระบบ การอัปเดตอัตโนมัติถูกเปิดใช้งาน</translation>
 <translation id="6820686453637990663">CVC</translation>
 <translation id="2371076942591664043">เปิดเมื่อเ&amp;สร็จ</translation>
 <translation id="790025292736025802">ไม่พบ <ph name="URL"/></translation>
 <translation id="895347679606913382">กำลังเริ่มต้น...</translation>
 <translation id="3319048459796106952">หน้าต่างใหม่และไม่ระบุตัวตน</translation>
-<translation id="656398493051028875">à¸\81ำลัà¸\87à¸\99ำออà¸\81 &quot;<ph name="FILENAME"/>&quot;...</translation>
+<translation id="656398493051028875">à¸\81ำลัà¸\87ลà¸\9a &quot;<ph name="FILENAME"/>&quot;...</translation>
 <translation id="7517786267097410259">สร้างรหัสผ่าน -</translation>
 <translation id="5832669303303483065">เพิ่มที่อยู่ใหม่...</translation>
 <translation id="5837112309980178195">Powerwash อุปกรณ์ <ph name="IDS_SHORT_PRODUCT_NAME"/> และเปลี่ยนกลับไปใช้การอัปเดตก่อนหน้า</translation>
 <translation id="7561031016893995297">จัดการอุปกรณ์การปลดล็อกอย่างง่ายในการตั้งค่าบัญชีของคุณ</translation>
 <translation id="2238379619048995541">ข้อมูลสถานะความถี่</translation>
 <translation id="4367133129601245178">คั&amp;ดลอก URL รูปภาพ</translation>
-<translation id="6326175484149238433">à¸\99ำออà¸\81จาก Chrome</translation>
+<translation id="6326175484149238433">ลà¸\9aจาก Chrome</translation>
 <translation id="2554553592469060349">ไฟล์ที่เลือกมีขนาดใหญ่เกินไป (ขนาดสูงสุด: 3 MB)</translation>
 <translation id="3494444535872870968">บันทึกเ&amp;ฟรมเป็น...</translation>
 <translation id="5196716972587102051">2</translation>
 <translation id="6440616190620341629">เปิดใช้การถอดรหัสแบบไม่ประมวลผลภาพใน MediaDrm โดยค่าเริ่มต้นสำหรับส่วนขยายสื่อที่เข้ารหัส</translation>
 <translation id="7185025270390719314">อ่านและแก้ไขข้อมูลทั้งหมดของคุณบนคอมพิวเตอร์และเว็บไซต์ที่คุณเข้าชม</translation>
 <translation id="8353683614194668312">ส่วนขยายหรือแอปพลิเคชันสามารถ:</translation>
-<translation id="1047956942837015229">à¸\81ำลัà¸\87à¸\99ำออà¸\81 <ph name="COUNT"/> รายการ...</translation>
+<translation id="1047956942837015229">à¸\81ำลัà¸\87ลà¸\9a <ph name="COUNT"/> รายการ...</translation>
 <translation id="1531961661616401172">เปิดใช้งานการแจ้งเตือนที่ซิงค์ข้อมูลแบบทดลอง</translation>
 <translation id="7361039089383199231">$1 ไบต์</translation>
 <translation id="191688485499383649">เกิดข้อผิดพลาดที่ไม่รู้จักขณะพยายามเชื่อมต่อกับ &quot;<ph name="DEVICE_NAME"/>&quot;</translation>
 <translation id="5765780083710877561">คำอธิบาย:</translation>
 <translation id="1740044382983372319">ส่วนขยายที่ติดตั้ง</translation>
 <translation id="338583716107319301">ตัวแยก</translation>
-<translation id="2079053412993822885">หาà¸\81à¸\84ุà¸\93à¸\99ำออà¸\81ใบรับรองใบใดของคุณ คุณจะใช้ใบรับรองนั้นเพื่อระบุตัวตนของคุณไม่ได้อีก</translation>
+<translation id="2079053412993822885">หาà¸\81à¸\84ุà¸\93ลà¸\9aใบรับรองใบใดของคุณ คุณจะใช้ใบรับรองนั้นเพื่อระบุตัวตนของคุณไม่ได้อีก</translation>
 <translation id="7221869452894271364">โหลดหน้านี้ใหม่</translation>
 <translation id="8446884382197647889">เรียนรู้เพิ่มเติม</translation>
 <translation id="9006533633560719845">การยินยอมจากผู้ใช้สำหรับสคริปต์ของส่วนขยาย</translation>
 <translation id="6791443592650989371">สถานะการเปิดใช้งาน:</translation>
 <translation id="4801257000660565496">สร้างทางลัดไปยังแอปพลิเคชัน</translation>
 <translation id="8154790740888707867">ไม่มีไฟล์</translation>
-<translation id="2498826285048723189">สà¹\88วà¸\99à¸\82ยาย &quot;<ph name="EXTENSION_NAME"/>&quot; à¸\96ูà¸\81à¸\99ำออà¸\81โดยอัตโนมัติแล้ว</translation>
+<translation id="2498826285048723189">สà¹\88วà¸\99à¸\82ยาย &quot;<ph name="EXTENSION_NAME"/>&quot; à¸\96ูà¸\81ลà¸\9aโดยอัตโนมัติแล้ว</translation>
 <translation id="6175314957787328458">โดเมน GUID ของ Microsoft</translation>
 <translation id="6883209331334683549">ความช่วยเหลือของ <ph name="PRODUCT_NAME"/></translation>
 <translation id="6970480684834282392">ประเภทการเริ่มต้น</translation>
 <translation id="7385854874724088939">พบปัญหาขณะสั่งพิมพ์ กรุณาตรวจสอบเครื่องพิมพ์และลองใหม่อีกครั้ง</translation>
 <translation id="770015031906360009">กรีก</translation>
 <translation id="7455133967321480974">ใช้ค่าเริ่มต้นสากล (บล็อก)</translation>
-<translation id="8463215747450521436">à¸\9cูà¹\89à¹\83à¸\8aà¹\89ภายà¹\83à¸\95à¹\89à¸\81ารà¸\94ูà¹\81ลรายà¸\99ีà¹\89อาà¸\88à¸\96ูà¸\81à¸\99ำออà¸\81หรือปิดใช้งานโดยผู้จัดการ โปรดติดต่อผู้จัดการหากคุณต้องการที่จะดำเนินการการลงชื่อเข้าใช้ในฐานะผู้ใช้รายนี้ต่อไป</translation>
+<translation id="8463215747450521436">à¸\9cูà¹\89à¹\83à¸\8aà¹\89ภายà¹\83à¸\95à¹\89à¸\81ารà¸\94ูà¹\81ลรายà¸\99ีà¹\89อาà¸\88à¸\96ูà¸\81ลà¸\9aหรือปิดใช้งานโดยผู้จัดการ โปรดติดต่อผู้จัดการหากคุณต้องการที่จะดำเนินการการลงชื่อเข้าใช้ในฐานะผู้ใช้รายนี้ต่อไป</translation>
 <translation id="3454157711543303649">การเปิดใช้งานเสร็จสมบูรณ์</translation>
 <translation id="3895034729709274924">เปิดใช้งานการแก้ไขข้อบกพร่องแบบเงียบ</translation>
 <translation id="884923133447025588">ไม่พบกระบวนการเพิกถอน</translation>
 <translation id="2440604414813129000">ดูโ&amp;ค้ดต้นฉบับ</translation>
 <translation id="816095449251911490"><ph name="SPEED"/> - <ph name="RECEIVED_AMOUNT"/>, <ph name="TIME_REMAINING"/></translation>
 <translation id="1084300930170237385">ข้อมูลเพื่อความโปร่งใส</translation>
-<translation id="774465434535803574">ข้อผิดพลาดเกี่ยวกับส่วนขยายของ Pack</translation>
+<translation id="774465434535803574">ข้อผิดพลาดเกี่ยวกับส่วนขยายของแพค</translation>
 <translation id="8200772114523450471">ทำต่อ</translation>
 <translation id="5750676294091770309">บล็อกโดยส่วนขยาย</translation>
 <translation id="1302191857856401062">เปิดการสลับระหว่างผู้ใช้อย่างรวดเร็วในเมนูอวาตาร์</translation>
 <translation id="6460601847208524483">ค้นหาถัดไป</translation>
 <translation id="397703832102027365">กำลังสิ้นสุดการทำงาน...</translation>
 <translation id="8146177459103116374">หากคุณได้ลงทะเบียนในอุปกรณ์นี้แล้ว คุณสามารถ<ph name="LINK2_START"/>ลงชื่อเข้าใช้ในฐานะผู้ใช้ที่มีอยู่แล้ว<ph name="LINK2_END"/>ได้</translation>
+<translation id="5072836811783999860">แสดงบุ๊กมาร์กที่มีการจัดการ</translation>
 <translation id="4856478137399998590">บริการดาต้าบนมือถือของคุณเปิดใช้งานและพร้อมทำงานแล้ว</translation>
 <translation id="3305389145870741612">กระบวนการฟอร์แมตอาจใช้เวลาสองสามวินาที โปรดรอสักครู่</translation>
-<translation id="3648607100222897006">à¸\84ุà¸\93ลัà¸\81ษà¸\93ะà¸\97à¸\94ลอà¸\87à¹\80หลà¹\88าà¸\99ีà¹\89อาà¸\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87 à¹\80สียหาย à¸«à¸£à¸·à¸­à¸¢à¸\81à¹\80ลิà¸\81à¹\84à¸\9bà¹\84à¸\94à¹\89à¸\95ลอà¸\94à¹\80วลา à¹\80ราà¹\84มà¹\88รัà¸\9aà¸\9bระà¸\81ัà¸\99à¹\83à¸\94à¹\86 à¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aสิà¹\88à¸\87à¸\97ีà¹\88อาà¸\88à¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¸\97ัà¹\89à¸\87สิà¹\89à¸\99หาà¸\81à¸\84ุà¸\93à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\81ารà¸\97à¸\94ลอà¸\87รายà¸\81ารà¹\83à¸\94รายà¸\81ารหà¸\99ึà¹\88à¸\87à¸\99ีà¹\89 à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cà¸\82อà¸\87à¸\84ุà¸\93อาà¸\88à¸\9eัà¸\87à¹\82à¸\94ยà¹\84มà¹\88มีสัà¸\8dà¸\8dาà¸\93à¹\80à¸\95ือà¸\99 à¸¢à¸´à¹\88à¸\87à¹\84à¸\9bà¸\81วà¹\88าà¸\99ัà¹\89à¸\99 à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cอาà¸\88à¸\99ำออà¸\81ข้อมูลทั้งหมดของคุณได้ หรือการรักษาความปลอดภัยและความเป็นส่วนตัวของคุณอาจโดนคุกคามโดยไม่คาดคิด การทดลองใดๆ ที่คุณเปิดใช้งานจะเปิดใช้สำหรับผู้ใช้ทุกคนที่ใช้เบราว์เซอร์นี้ด้วย โปรดดำเนินการด้วยความระมัดระวัง</translation>
+<translation id="3648607100222897006">à¸\84ุà¸\93ลัà¸\81ษà¸\93ะà¸\97à¸\94ลอà¸\87à¹\80หลà¹\88าà¸\99ีà¹\89อาà¸\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87 à¹\80สียหาย à¸«à¸£à¸·à¸­à¸¢à¸\81à¹\80ลิà¸\81à¹\84à¸\9bà¹\84à¸\94à¹\89à¸\95ลอà¸\94à¹\80วลา à¹\80ราà¹\84มà¹\88รัà¸\9aà¸\9bระà¸\81ัà¸\99à¹\83à¸\94à¹\86 à¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aสิà¹\88à¸\87à¸\97ีà¹\88อาà¸\88à¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¸\97ัà¹\89à¸\87สิà¹\89à¸\99หาà¸\81à¸\84ุà¸\93à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\81ารà¸\97à¸\94ลอà¸\87รายà¸\81ารà¹\83à¸\94รายà¸\81ารหà¸\99ึà¹\88à¸\87à¸\99ีà¹\89 à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cà¸\82อà¸\87à¸\84ุà¸\93อาà¸\88à¸\9eัà¸\87à¹\82à¸\94ยà¹\84มà¹\88มีสัà¸\8dà¸\8dาà¸\93à¹\80à¸\95ือà¸\99 à¸¢à¸´à¹\88à¸\87à¹\84à¸\9bà¸\81วà¹\88าà¸\99ัà¹\89à¸\99 à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bอรà¹\8cอาà¸\88ลà¸\9aข้อมูลทั้งหมดของคุณได้ หรือการรักษาความปลอดภัยและความเป็นส่วนตัวของคุณอาจโดนคุกคามโดยไม่คาดคิด การทดลองใดๆ ที่คุณเปิดใช้งานจะเปิดใช้สำหรับผู้ใช้ทุกคนที่ใช้เบราว์เซอร์นี้ด้วย โปรดดำเนินการด้วยความระมัดระวัง</translation>
 <translation id="3937640725563832867">ชื่อสำรองของผู้ออกใบรับรอง</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1"/> <ph name="SENTENCE2"/></translation>
 <translation id="1163931534039071049">&amp;ดูรหัสต้นฉบับของเฟรม</translation>
 <translation id="5642953011762033339">หยุดการเชื่อมต่อบัญชี</translation>
 <translation id="7564847347806291057">สิ้นสุดกระบวนการ</translation>
 <translation id="7847212883280406910">กด Ctrl + Alt + S เพื่อสลับไปยัง <ph name="IDS_SHORT_PRODUCT_OS_NAME"/></translation>
-<translation id="1607220950420093847">à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93อาà¸\88à¸\96ูà¸\81à¸\99ำออà¸\81หรือปิดการใช้งานไปแล้ว โปรดออกจากระบบ</translation>
+<translation id="1607220950420093847">à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93อาà¸\88à¸\96ูà¸\81ลà¸\9aหรือปิดการใช้งานไปแล้ว โปรดออกจากระบบ</translation>
 <translation id="5613695965848159202">ข้อมูลประจำตัวที่ไม่ระบุตัวตน:</translation>
 <translation id="4331990704689932958"><ph name="PRODUCT_NAME"/> ทำการอัปเดตโดยอัตโนมัติเพื่อให้คุณมีรุ่นใหม่ล่าสุดเสมอ</translation>
 <translation id="5159383109919732130"><ph name="BEGIN_BOLD"/>อย่าเพิ่งนำอุปกรณ์ออก!<ph name="END_BOLD"/>
 <translation id="1973491249112991739">การดาวน์โหลด <ph name="PLUGIN_NAME"/> ล้มเหลว</translation>
 <translation id="5527474464531963247">คุณสามารถเลือกเครือข่ายอื่นได้ด้วย</translation>
 <translation id="5546865291508181392">ค้นหา</translation>
-<translation id="6418481728190846787">à¸\99ำออà¸\81การเข้าถึงของแอปทั้งหมดออกอย่างถาวร</translation>
+<translation id="6418481728190846787">ลà¸\9aการเข้าถึงของแอปทั้งหมดออกอย่างถาวร</translation>
 <translation id="1999115740519098545">เริ่มต้น</translation>
 <translation id="6120205520491252677">ตรึงหน้าเว็บนี้ไว้ที่หน้าจอเริ่ม...</translation>
 <translation id="4190120546241260780">เปิดใช้งานรายการตัวเลือกใช้งาน 5</translation>
     <ph name="BEGIN_LINK_HELP"/>เรียนรู้เพิ่มเติม<ph name="END_LINK_HELP"/></translation>
 <translation id="7361824946268431273">คอมพิวเตอร์ที่ทำงานได้เร็วขึ้น ง่ายขึ้น และปลอดภัยมากยิ่งขึ้น</translation>
 <translation id="1313705515580255288">บุ๊กมาร์ก ประวัติการเข้าชม และการตั้งค่าอื่นๆ ของคุณจะได้รับการซิงค์ไปยังบัญชี Google ของคุณ</translation>
-<translation id="2099686503067610784">à¸\99ำออà¸\81ใบรับรองของเซิร์ฟเวอร์ &quot;<ph name="CERTIFICATE_NAME"/>&quot; หรือไม่</translation>
+<translation id="2099686503067610784">ลà¸\9aใบรับรองของเซิร์ฟเวอร์ &quot;<ph name="CERTIFICATE_NAME"/>&quot; หรือไม่</translation>
 <translation id="3941565636838060942">หากต้องการซ่อนการเข้าถึงโปรแกรมนี้ คุณต้องถอนการติดตั้งโปรแกรมโดยใช้
   <ph name="CONTROL_PANEL_APPLET_NAME"/> ในแผงควบคุม
 
 <translation id="4436068767502531396">Google ไดรฟ์ไม่สามารถซิงค์ &quot;<ph name="FILENAME"/>&quot; ได้ในขณะนี้ โปรดลองอีกครั้งในภายหลัง</translation>
 <translation id="7225179976675429563">ไม่มีประเภทเครือข่าย</translation>
 <translation id="5436492226391861498">กำลังรอช่องทางการเชื่อมต่อพร็อกซี...</translation>
-<translation id="3803991353670408298">à¹\82à¸\9bรà¸\94à¹\80à¸\9eิà¹\88มวิà¸\98ีà¸\9bà¹\89อà¸\99à¸\82à¹\89อมูลอืà¹\88à¸\99à¸\81à¹\88อà¸\99à¸\99ำออà¸\81วิธีนี้</translation>
+<translation id="3803991353670408298">à¹\82à¸\9bรà¸\94à¹\80à¸\9eิà¹\88มวิà¸\98ีà¸\9bà¹\89อà¸\99à¸\82à¹\89อมูลอืà¹\88à¸\99à¸\81à¹\88อà¸\99ลà¸\9aวิธีนี้</translation>
 <translation id="4209267054566995313">ตรวจไม่พบเมาส์หรือทัชแพด</translation>
 <translation id="3369521687965833290">ไม่สามารถแยกส่วนขยายได้ หากต้องการแยกส่วนขยายอย่างปลอดภัย คุณต้องมีเส้นทางไปยังไดเรกทอรีโปรไฟล์ของคุณซึ่งขึ้นต้นด้วยตัวอักษรของไดรฟ์และจะต้องไม่มีจังก์ชัน จุดต่อเชื่อม หรือลิงก์สัญลักษณ์ ไม่มีเส้นทางในรูปแบบดังกล่าวสำหรับโปรไฟล์ของคุณ</translation>
 <translation id="337920581046691015"><ph name="PRODUCT_NAME"/> จะถูกติดตั้ง</translation>
 <translation id="7709152031285164251">ล้มเหลว - <ph name="INTERRUPT_REASON"/></translation>
 <translation id="3838486795898716504"><ph name="PAGE_TITLE"/> เพิ่มเติม</translation>
 <translation id="7003339318920871147">ฐานข้อมูลเว็บ</translation>
-<translation id="8885905466771744233">à¸\84ียà¹\8cสà¹\88วà¸\99à¸\95ัวà¸\82อà¸\87สà¹\88วà¸\99à¸\82ยายà¸\97ีà¹\88ระà¸\9aุมีอยูà¹\88à¹\81ลà¹\89ว à¸\99ำà¸\84ียà¹\8cà¸\99ัà¹\89à¸\99มาà¹\83à¸\8aà¹\89à¸\8bà¹\89ำหรือà¸\99ำออà¸\81คีย์ออกก่อน</translation>
+<translation id="8885905466771744233">à¸\84ียà¹\8cสà¹\88วà¸\99à¸\95ัวà¸\82อà¸\87สà¹\88วà¸\99à¸\82ยายà¸\97ีà¹\88ระà¸\9aุมีอยูà¹\88à¹\81ลà¹\89ว à¸\99ำà¸\84ียà¹\8cà¸\99ัà¹\89à¸\99มาà¹\83à¸\8aà¹\89à¸\8bà¹\89ำหรือลà¸\9aคีย์ออกก่อน</translation>
 <translation id="7583419135027754249">ส่งกิจกรรมการคลิกทันทีเสมอเมื่อมีการแตะ แม้ในกรณีที่การแตะเป็นส่วนหนึ่งของท่าทางสัมผัสแตะสองครั้ง  การดำเนินการนี้ทำให้การนำทางและการทำงานการแตะอื่นๆ เร็วขึ้น 300 มิลลิวินาทีในหน้าเว็บส่วนใหญ่ แต่หมายความว่าต้องหลีกเลี่ยงลิงก์และปุ่มเมื่อแตะสองครั้งเพื่อซูม</translation>
 <translation id="4100843820583867709">คำขอแชร์หน้าจอของ Google Talk</translation>
 <translation id="2406941037785138796">การปิดการใช้งาน</translation>
 <translation id="8140778357236808512">นำเข้าผู้ใช้ภายใต้การดูแลที่มีอยู่</translation>
 <translation id="6953992620120116713">HTTPS ผ่านทางโปรโตคอล QUIC ทดลองใช้</translation>
 <translation id="8737260648576902897">ติดตั้ง Adobe Reader</translation>
-<translation id="7876243839304621966">à¸\99ำออà¸\81ทั้งหมด</translation>
+<translation id="7876243839304621966">ลà¸\9aทั้งหมด</translation>
 <translation id="5663459693447872156">สลับไปเป็นแบบครึ่งความกว้างโดยอัตโนมัติ</translation>
 <translation id="8900820606136623064">ฮังการี</translation>
 <translation id="495931528404527476">ใน Chrome</translation>
 <translation id="7649070708921625228">ช่วยเหลือ</translation>
 <translation id="858637041960032120">เพิ่มเบอร์โทร
 </translation>
-<translation id="3210492393564338011">à¸\99ำออà¸\81ผู้ใช้</translation>
+<translation id="3210492393564338011">ลà¸\9aผู้ใช้</translation>
 <translation id="6637478299472506933">การดาวน์โหลดล้มเหลว</translation>
 <translation id="3242118113727675434">แสดง HUD สำหรับจุดแตะ</translation>
 <translation id="8308179586020895837">ถามว่า <ph name="HOST"/> ต้องการเข้าถึงกล้องของคุณไหม</translation>
 <translation id="6869402422344886127">ช่องทำเครื่องหมายที่เลือก</translation>
 <translation id="3428010780253032925">ปิดการกำหนดเป้าหมายแบบรูปสี่เหลี่ยมผืนผ้าในมุมมองต่างๆ</translation>
 <translation id="5637380810526272785">วิธีป้อนข้อมูล</translation>
+<translation id="3613134908380545408">แสดง <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">การเชื่อมต่อจำเป็นต้องลองใหม่ด้วยการใช้โปรโตคอล TLS หรือ SSL รุ่นเก่ากว่านี้ ซึ่งโดยทั่วไปหมายความว่าเซิร์ฟเวอร์นี้กำลังใช้ซอฟต์แวร์รุ่นเก่ามากและอาจมีปัญหาด้านความปลอดภัยอื่นๆ</translation>
 <translation id="404928562651467259">คำเตือน</translation>
 <translation id="4289300219472526559">เริ่มพูด</translation>
 <translation id="6807906590218483700">คุณพยายามเข้าถึง <ph name="DOMAIN"/> แต่ที่จริงคุณเข้ามาที่เซิร์ฟเวอร์ซึ่งระบุว่าตนเองคือ <ph name="DOMAIN2"/> นี่อาจเกิดจากการกำหนดค่าที่ไม่ถูกต้องในเซิร์ฟเวอร์หรือสาเหตุอื่นที่ร้ายแรงกว่า ผู้โจมตีบนเครือข่ายของคุณอาจพยายามพาคุณไปยังหน้าปลอม (และอาจจะเป็นอันตราย) ของ <ph name="DOMAIN3"/></translation>
 <translation id="2539110682392681234">ผู้ดูแลระบบของคุณบังคับใช้พร็อกซี</translation>
 <translation id="4977942889532008999">ยืนยันการเข้าถึง</translation>
-<translation id="7781335840981796660">à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ัà¹\89à¸\87หมà¸\94à¹\81ละà¸\82à¹\89อมูลà¹\83à¸\99à¹\80à¸\84รืà¹\88อà¸\87à¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81</translation>
+<translation id="7781335840981796660">à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ัà¹\89à¸\87หมà¸\94à¹\81ละà¸\82à¹\89อมูลà¹\83à¸\99à¹\80à¸\84รืà¹\88อà¸\87à¸\88ะà¸\96ูà¸\81ลà¸\9a</translation>
 <translation id="2383066183457571563">โปรดยืนยันว่านี่ไม่ใช่อุปกรณ์ขององค์กร การลงทะเบียนองค์กรจะถูกยกเลิก</translation>
 <translation id="8045462269890919536">โรมาเนีย</translation>
 <translation id="4973307593867026061">เพิ่มเครื่องพิมพ์</translation>
 <translation id="6769712124046837540">กำลังเพิ่มเครื่องพิมพ์...</translation>
 <translation id="2552545117464357659">ใหม่กว่า</translation>
 <translation id="7269802741830436641">หน้าเว็บนี้มีการวนรอบเมื่อเปลี่ยนเส้นทาง</translation>
-<translation id="4180788401304023883">à¸\99ำออà¸\81ใบรับรองของผู้ออกใบรับรอง &quot;<ph name="CERTIFICATE_NAME"/>&quot; หรือไม่</translation>
+<translation id="4180788401304023883">ลà¸\9aใบรับรองของผู้ออกใบรับรอง &quot;<ph name="CERTIFICATE_NAME"/>&quot; หรือไม่</translation>
 <translation id="5869522115854928033">รหัสผ่านที่บันทึกไว้</translation>
 <translation id="2089090684895656482">น้อยลง</translation>
 <translation id="6656103420185847513">แก้ไขโฟลเดอร์</translation>
 <translation id="6934265752871836553">ใช้รหัส Bleeding-edge เพื่อทำให้ Chrome แสดงเนื้อหาได้เร็วขึ้น การเปลี่ยนแปลง
         ที่อยู่เบื้องหลังเส้นทางนี้มีแนวโน้มอย่างมากที่จะทำให้เนื้อหาเสียหาย</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">เปิดใน Adobe Reader ทุกครั้ง</translation>
 <translation id="8274359292107649245">เปิด Chrome บนเดสก์ท็อป</translation>
 <translation id="1571119610742640910">การประกอบรวมสำหรับพื้นหลังของรากแบบคงที่</translation>
 <translation id="6514565641373682518">หน้าเว็บนี้ได้ปิดใช้งานเคอร์เซอร์เมาส์แล้ว</translation>
 <translation id="249819058197909513">ไม่ต้องเตือนอีกสำหรับแอปนี้</translation>
 <translation id="8997135628821231"><ph name="ISSUED_BY"/> [<ph name="ISSUED_TO"/>] (<ph name="DEVICE"/>)</translation>
 <translation id="4088536322074090758">เปิดใช้งาน NTP ใหม่</translation>
-<translation id="3414856743105198592">à¸\81ารà¸\9fอรà¹\8cà¹\81มà¸\95อุà¸\9bà¸\81รà¸\93à¹\8cà¹\81à¸\9aà¸\9aà¸\96อà¸\94à¹\84à¸\94à¹\89à¸\88ะà¸\97ำà¹\83หà¹\89à¸\82à¹\89อมูลà¸\97ัà¹\89à¸\87หมà¸\94à¸\96ูà¸\81à¸\99ำออà¸\81ออก คุณต้องการดำเนินการต่อหรือไม่</translation>
+<translation id="3414856743105198592">à¸\81ารà¸\9fอรà¹\8cà¹\81มà¸\95อุà¸\9bà¸\81รà¸\93à¹\8cà¹\81à¸\9aà¸\9aà¸\96อà¸\94à¹\84à¸\94à¹\89à¸\88ะà¸\97ำà¹\83หà¹\89à¸\82à¹\89อมูลà¸\97ัà¹\89à¸\87หมà¸\94à¸\96ูà¸\81ลà¸\9aออก คุณต้องการดำเนินการต่อหรือไม่</translation>
 <translation id="5338503421962489998">พื้นที่จัดเก็บในตัวเครื่อง</translation>
 <translation id="5627086634964711283">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณคลิกปุ่ม &quot;หน้าแรก&quot;</translation>
 <translation id="1702534956030472451">ยุโรป</translation>
 <translation id="2453576648990281505">มีไฟล์นี้อยู่แล้ว</translation>
 <translation id="6972929256216826630">อนุญาตให้ทุกไซต์ดาวน์โหลดไฟล์หลายๆ ไฟล์โดยอัตโนมัติ</translation>
 <translation id="3127589841327267804">PYJJ</translation>
-<translation id="3668823961463113931">à¸\95ัวจัดการ</translation>
+<translation id="3668823961463113931">à¹\80à¸\84รืà¹\88อà¸\87จัดการ</translation>
 <translation id="8808478386290700967">ร้านค้าบนเว็บ</translation>
 <translation id="1732215134274276513">เลิกตรึงแท็บ</translation>
 <translation id="4785040501822872973">คอมพิวเตอร์นี้จะรีเซ็ตภายใน <ph name="LOGOUT_TIME_LEFT"/> วินาที
 <translation id="5062930723426326933">การลงชื่อเข้าใช้ล้มเหลว โปรดเชื่อมต่ออินเทอร์เน็ตแล้วลองอีกครั้ง</translation>
 <translation id="5316716239522500219">แสดงผลบนหน้าจอ</translation>
 <translation id="9112614144067920641">โปรดเลือก PIN ใหม่</translation>
-<translation id="1338950911836659113">à¸\81ำลัà¸\87à¸\99ำออà¸\81...</translation>
+<translation id="1338950911836659113">à¸\81ำลัà¸\87ลà¸\9a...</translation>
 <translation id="7109926893210135223">อยู่ระหว่างการดาวน์โหลดหนึ่งรายการ</translation>
 <translation id="2061855250933714566"><ph name="ENCODING_CATEGORY"/> (<ph name="ENCODING_NAME"/>)</translation>
 <translation id="8379970328220427967">เหลืออยู่ <ph name="SPACE_AVAILABLE"/></translation>
 <translation id="824543159844843373">เปิดใช้งานรายการตัวเลือกใช้งาน 3</translation>
 <translation id="3819800052061700452">เ&amp;ต็มหน้าจอ</translation>
 <translation id="48607902311828362">โหมดใช้งานบนเครื่องบิน</translation>
+<translation id="711840821796638741">แสดงบุ๊กมาร์กที่มีการจัดการ</translation>
 <translation id="3360297538363969800">การพิมพ์ล้มเหลว โปรดตรวจสอบเครื่องพิมพ์และลองอีกครั้ง</translation>
 <translation id="680572642341004180">เปิดใช้งานการติดตาม RLZ บน <ph name="SHORT_PRODUCT_OS_NAME"/></translation>
 <translation id="688797901999351107">โปรดหยุดใช้ที่ชาร์จที่ถูกเรียกคืน</translation>
 <translation id="2187895286714876935">ข้อผิดพลาดในการนำเข้าใบรับรองเซิร์ฟเวอร์</translation>
 <translation id="4882473678324857464">โฟกัสบุ๊กมาร์ก</translation>
 <translation id="4258348331913189841">ระบบไฟล์</translation>
-<translation id="4618990963915449444">à¹\84à¸\9fลà¹\8cà¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99 <ph name="DEVICE_NAME"/> à¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81</translation>
+<translation id="4618990963915449444">à¹\84à¸\9fลà¹\8cà¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99 <ph name="DEVICE_NAME"/> à¸\88ะà¸\96ูà¸\81ลà¸\9a</translation>
 <translation id="5011739343823725107">การเริ่มต้นแบ็กเอนด์การซิงค์ล้มเหลว</translation>
 <translation id="8726206820263995930">เกิดข้อผิดพลาดขณะดึงข้อมูลการตั้งค่านโยบายจากเซิร์ฟเวอร์: <ph name="CLIENT_ERROR"/></translation>
 <translation id="614998064310228828">รุ่นอุปกรณ์:</translation>
 <translation id="2796424461616874739">การตรวจสอบสิทธิ์หมดเวลาขณะเชื่อมต่อกับ &quot;<ph name="DEVICE_NAME"/>&quot;</translation>
 <translation id="6096326118418049043">ชื่อ X.500</translation>
 <translation id="923467487918828349">แสดงทั้งหมด</translation>
-<translation id="8180786512391440389">&quot;<ph name="EXTENSION"/>&quot; à¸ªà¸²à¸¡à¸²à¸£à¸\96อà¹\88าà¸\99à¹\81ละà¸\99ำออà¸\81รูปภาพ วิดีโอ และไฟล์เสียงในตำแหน่งที่เลือก</translation>
+<translation id="8180786512391440389">&quot;<ph name="EXTENSION"/>&quot; à¸ªà¸²à¸¡à¸²à¸£à¸\96อà¹\88าà¸\99à¹\81ละลà¸\9aรูปภาพ วิดีโอ และไฟล์เสียงในตำแหน่งที่เลือก</translation>
 <translation id="8054517699425078995">ไฟล์ประเภทนี้อาจเป็นอันตรายต่ออุปกรณ์ของคุณ คุณยังต้องการเก็บไฟล์ <ph name="FILE_NAME"/> ไว้ไหม</translation>
 <translation id="3093189737735839308">คุณแน่ใจหรือไม่ว่าต้องการติดตั้ง <ph name="PLUGIN_NAME"/> คุณควรจะติดตั้งปลั๊กอินที่คุณไว้ใจเท่านั้น</translation>
 <translation id="1928696683969751773">อัปเดต</translation>
 <translation id="1731911755844941020">กำลังส่งคำขอ...</translation>
 <translation id="7885283703487484916">สั้นมาก</translation>
 <translation id="4361745360460842907">เปิดเป็นแท็บ</translation>
-<translation id="5238278114306905396">à¹\81อà¸\9bà¸\9eลิà¹\80à¸\84à¸\8aัà¸\99 &quot;<ph name="EXTENSION_NAME"/>&quot; à¸\96ูà¸\81à¸\99ำออà¸\81โดยอัตโนมัติ</translation>
+<translation id="5238278114306905396">à¹\81อà¸\9bà¸\9eลิà¹\80à¸\84à¸\8aัà¸\99 &quot;<ph name="EXTENSION_NAME"/>&quot; à¸\96ูà¸\81ลà¸\9aโดยอัตโนมัติ</translation>
 <translation id="4538792345715658285">ติดตั้งโดยนโยบายขององค์กร</translation>
 <translation id="2988488679308982380">ไม่สามารถติดตั้งแพ็กเกจ: &quot;<ph name="ERROR_CODE"/>&quot;</translation>
 <translation id="2396249848217231973">&amp;เลิกทำการนำออก</translation>
   • คุณสามารถยุติการควบคุมนี้ได้ตลอดเวลา
 
 คุณจะยอมรับไหม</translation>
-<translation id="8251578425305135684">รูà¸\9bภาà¸\9eà¸\82à¸\99าà¸\94ยà¹\88อà¸\96ูà¸\81à¸\99ำออà¸\81แล้ว</translation>
+<translation id="8251578425305135684">รูà¸\9bภาà¸\9eà¸\82à¸\99าà¸\94ยà¹\88อà¸\96ูà¸\81ลà¸\9aแล้ว</translation>
 <translation id="6163522313638838258">ขยายทั้งหมด...</translation>
 <translation id="31454997771848827">โดเมนกลุ่ม</translation>
 <translation id="3188465121994729530">ค่าเฉลี่ยเคลื่อนที่</translation>
 <translation id="2727794866043914351">ข้อยกเว้นการเข้าถึงปลั๊กอินที่ไม่ได้แซนด์บ็อกซ์</translation>
 <translation id="2672394958563893062">เกิดข้อผิดพลาด คลิกเพื่อเริ่มใหม่ตั้งแต่ต้น</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD"/>หมายเหตุ:<ph name="END_BOLD"/> เปิดใช้งานเฉพาะเมื่อคุณทราบว่าคุณกำลังทำอะไรอยู่ หรือเมื่อคุณถูกร้องขอให้ทำเช่นนั้นเท่านั้น เนื่องจากคอลเล็กชันข้อมูลอาจลดประสิทธิภาพในการปฏิบัติงาน</translation>
-<translation id="8137331602592933310">&quot;<ph name="FILENAME"/>&quot; à¸¡à¸µà¸\81ารà¹\81à¸\8aรà¹\8cà¸\81ัà¸\9aà¸\84ุà¸\93 à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\99ำออà¸\81ออกได้เนื่องจากคุณไม่ใช่เจ้าของ</translation>
+<translation id="8137331602592933310">&quot;<ph name="FILENAME"/>&quot; à¸¡à¸µà¸\81ารà¹\81à¸\8aรà¹\8cà¸\81ัà¸\9aà¸\84ุà¸\93 à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96ลà¸\9aออกได้เนื่องจากคุณไม่ใช่เจ้าของ</translation>
 <translation id="1346690665528575959">เปิดใช้งานการสลับระหว่างผู้ให้บริการมือถือ</translation>
 <translation id="8892992092192084762">ติดตั้งธีม &quot;<ph name="THEME_NAME"/>&quot; แล้ว</translation>
 <translation id="7427348830195639090">หน้าเว็บพื้นหลัง: <ph name="BACKGROUND_PAGE_URL"/></translation>
 <translation id="7408287099496324465">หากเปิดใช้แล้ว จะมีการใช้ EmbeddedSearch API ในการส่งข้อความค้นหาในหน้าผลการค้นหา</translation>
 <translation id="2731710757838467317">กำลังสร้างผู้ใช้ภายใต้การดูแล อาจใช้เวลาสักครู่</translation>
 <translation id="1884319566525838835">สถานะการทดลองใช้ผลิตภัณฑ์</translation>
-<translation id="2770465223704140727">à¸\99ำออà¸\81จากรายการ</translation>
+<translation id="2770465223704140727">ลà¸\9aจากรายการ</translation>
 <translation id="8314013494437618358">การประกอบหน้าเว็บแบบเธร็ด</translation>
 <translation id="2525250408503682495">แย่แล้ว! ไม่สามารถต่อเชื่อม Cryptohome สำหรับแอปพลิเคชันคีออสก์ได้</translation>
 <translation id="3590587280253938212">รวดเร็ว</translation>
index ea5df24..bdda43e 100644 (file)
@@ -3969,6 +3969,7 @@ Dolması için gereken süre: <ph name="HOUR"/>:<ph name="MINUTE"/></translation
 <translation id="6460601847208524483">Sonrakini Bul</translation>
 <translation id="397703832102027365">Sonlandırılıyor...</translation>
 <translation id="8146177459103116374">Zaten bu cihazda kayıtlıysanız, <ph name="LINK2_START"/>varolan kullanıcı olarak oturum açabilirsiniz<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Yönetilen yer işaretlerini göster</translation>
 <translation id="4856478137399998590">Mobil veri hizmetiniz etkinleştirildi ve kullanıma hazır</translation>
 <translation id="3305389145870741612">Biçimlendirme işlemi birkaç saniye sürebilir. Lütfen bekleyin.</translation>
 <translation id="3648607100222897006">Bu deneysel özellikler zaman zaman değişebilir, bozulabilir veya kullanımdan kaldırılabilir. Bu deneylerden herhangi birini açtığınızda tarayıcınızın aniden yanmaya başlaması mümkün olduğundan, başınıza gelebilecekler konusunda kesinlikle hiçbir garanti vermeyiz. Şaka bir yana, tarayıcınız tüm verilerinizi silebilir ya da güvenliğiniz ve gizliliğiniz beklenmedik şekillerde riske girebilir. Etkinleştireceğiniz her deney bu tarayıcının tüm kullanıcıları için etkin hale gelecektir. Lütfen dikkatle ilerleyin.</translation>
@@ -4400,6 +4401,7 @@ Dolması için gereken süre: <ph name="HOUR"/>:<ph name="MINUTE"/></translation
 <translation id="6869402422344886127">İşaretli onay kutusu</translation>
 <translation id="3428010780253032925">Görünümlerde dikdörtgen tabanlı hedeflemeyi devre dışı bırak</translation>
 <translation id="5637380810526272785">Giriş Yöntemi</translation>
+<translation id="3613134908380545408"><ph name="FOLDER_NAME"/> Klasörünü Göster</translation>
 <translation id="2837049386027881519">Bağlantı, TLS veya SSL protokolünün eski bir sürümü kullanılarak tekrar denendi. Bu genellikle sunucunun çok eski bir yazılım kullandığı ve başka güvenlik sorunları olabileceği anlamına gelir.</translation>
 <translation id="404928562651467259">UYARI</translation>
 <translation id="4289300219472526559">Konuşmaya Başla</translation>
@@ -4733,6 +4735,7 @@ Dolana kadar geçecek süre hesaplanıyor</translation>
 <translation id="6934265752871836553">Chrome'un içeriği daha hızlı çizmesini sağlamak için yeni teknoloji kodunu kullanın. Bu yolun
         arkasındaki değişiklikler muhtemelen birçok içeriği bozar.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Her zaman Adobe Reader programında aç</translation>
 <translation id="8274359292107649245">Chrome'u masaüstünde aç</translation>
 <translation id="1571119610742640910">Sabit köklü arka planlar için birleştirme.</translation>
 <translation id="6514565641373682518">Bu sayfa fare imlecinizi devre dışı bıraktı.</translation>
@@ -4931,6 +4934,7 @@ Keşfetmeye devam etmek için herhangi bir tuşa basın.</translation>
 <translation id="824543159844843373">3. başlatıcı öğesini etkinleştir</translation>
 <translation id="3819800052061700452">Tam ek&amp;ran</translation>
 <translation id="48607902311828362">Uçak modu</translation>
+<translation id="711840821796638741">Yönetilen Yer İşaretlerini Göster</translation>
 <translation id="3360297538363969800">Yazdırma işlemi başarısız oldu. Lütfen yazıcınızı kontrol edin ve tekrar deneyin.</translation>
 <translation id="680572642341004180"><ph name="SHORT_PRODUCT_OS_NAME"/> üzerinde RLZ izlemeyi etkinleştir.</translation>
 <translation id="688797901999351107">Lütfen geri toplanmak istenen şarj cihazını artık kullanmayın.</translation>
index 5f78058..279ff48 100644 (file)
 <translation id="4278390842282768270">Дозволено</translation>
 <translation id="2074527029802029717">Відмінити закріплення вкладки</translation>
 <translation id="1533897085022183721">Менше <ph name="MINUTES"/>.</translation>
-<translation id="7382160026931194400">Збережені |налаштування вмісту| та #пошукові системи# не буде очищено, тож ви можете переглядати веб-сторінки, як зазвичай.</translation>
+<translation id="7382160026931194400">Збережені |налаштування вмісту| й #пошукові системи# не будуть очищені та можуть вплинути на роботу веб-переглядача.</translation>
 <translation id="7503821294401948377">Не вдалося завантажити піктограму &quot;<ph name="ICON"/>&quot; для роботи веб-переглядача.</translation>
 <translation id="4809190954660909198">Нові платіжні дані…</translation>
 <translation id="3942946088478181888">Підкажіть</translation>
 <translation id="6460601847208524483">Знайти наступне</translation>
 <translation id="397703832102027365">Завершення...</translation>
 <translation id="8146177459103116374">Якщо ви вже зареєструвалися на цьому пристрої, можна <ph name="LINK2_START"/>ввійти як існуючий користувач<ph name="LINK2_END"/> .</translation>
+<translation id="5072836811783999860">Показати закладки, якими керує адміністратор</translation>
 <translation id="4856478137399998590">Службу пересилання мобільних даних активовано. Нею можна користуватися</translation>
 <translation id="3305389145870741612">Процес форматування може зайняти декілька секунд. Зачекайте.</translation>
 <translation id="3648607100222897006">Ці експериментальні функції можуть будь-коли змінюватися, виходити з ладу чи зникати. Ми не даємо жодних гарантій щодо можливих наслідків увімкнення однієї з цих експериментальних функцій, а ваш веб-переглядач може навіть раптово припинити роботу. Ваш веб-переглядач може видалити всі ваші дані, а вашу безпеку та конфіденційність може бути порушено неочікуваним чином. Будь-які ввімкнені вами експериментальні функції буде ввімкнено для всіх користувачів цього веб-переглядача. Застосовуйте з обережністю.</translation>
 <translation id="6869402422344886127">Прапорець поставлено</translation>
 <translation id="3428010780253032925">Вимкнути натискання елементів із прямокутною областю дотику</translation>
 <translation id="5637380810526272785">Метод введення</translation>
+<translation id="3613134908380545408">Показати &quot;<ph name="FOLDER_NAME"/>&quot;</translation>
 <translation id="2837049386027881519">Потрібно повторити спробу з'єднання за допомогою старішої версії протоколу TLS або SSL. Переважно це означає, що сервер використовує дуже застаріле програмне забезпечення та може мати й інші проблеми безпеки.</translation>
 <translation id="404928562651467259">ЗАСТЕРЕЖЕННЯ</translation>
 <translation id="4289300219472526559">Start Speaking</translation>
 <translation id="6934265752871836553">Використати код bleeding-edge, щоб пришвидшити відображення вмісту в Chrome. Такі зміни
         шляху можуть призвести до порушення цілісності вмісту.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Завжди відкривати в Adobe Reader</translation>
 <translation id="8274359292107649245">Відкрити Chrome на робочому столі</translation>
 <translation id="1571119610742640910">Компонування для закріплених кореневих фонів.</translation>
 <translation id="6514565641373682518">Ця сторінка вимкнула курсор миші.</translation>
 <translation id="824543159844843373">Активувати елемент панелі запуску 3</translation>
 <translation id="3819800052061700452">&amp;На весь екран</translation>
 <translation id="48607902311828362">Режим польоту</translation>
+<translation id="711840821796638741">Показати закладки, якими керує адміністратор</translation>
 <translation id="3360297538363969800">Помилка друку. Перевірте принтер і повторіть спробу.</translation>
 <translation id="680572642341004180">Увімкнути відстеження RLZ в <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Припиніть використовувати відкликаний зарядний пристрій.</translation>
index ea1ed85..7028280 100644 (file)
@@ -63,7 +63,7 @@
 <translation id="6976652535392081960">Hiển thị đích cho <ph name="EMAIL"/></translation>
 <translation id="7180611975245234373">Làm mới</translation>
 <translation id="4940047036413029306">Dấu ngoặc kép</translation>
-<translation id="1497897566809397301">Cho phép thiết lập dữ liệu cục bộ (nên chọn)</translation>
+<translation id="1497897566809397301">Cho phép nhớ dữ liệu trên máy (nên chọn)</translation>
 <translation id="3275778913554317645">Mở dưới dạng cửa sổ</translation>
 <translation id="7994370417837006925">Đăng nhập nhiều tài khoản</translation>
 <translation id="1420684932347524586">Rất tiếc! Không thể tạo khóa cá nhân RSA ngẫu nhiên.</translation>
 <translation id="3484869148456018791">Nhận chứng chỉ mới</translation>
 <translation id="151501797353681931">Đã nhập Từ Safari</translation>
 <translation id="586567932979200359">Bạn đang chạy <ph name="PRODUCT_NAME"/> từ hình ảnh đĩa của nó. Cài đặt trình duyệt này trên máy tính cho phép bạn chạy trình duyệt mà không cần có hình ảnh đĩa và đảm bảo trình duyệt sẽ được cập nhật.</translation>
-<translation id="1036860914056215505">ID tiện ích mở rộng</translation>
+<translation id="1036860914056215505">ID tiện ích</translation>
 <translation id="3775432569830822555">Chứng chỉ Máy chủ SSL</translation>
 <translation id="1829192082282182671">Thu &amp;nhỏ</translation>
 <translation id="5042319201438341383">(UTC)</translation>
 <translation id="4714531393479055912"><ph name="PRODUCT_NAME"/> hiện có thể đồng bộ hóa mật khẩu của bạn.</translation>
 <translation id="6307990684951724544">Hệ thống đang bận</translation>
 <translation id="7904094684485781019">Quản trị viên của tài khoản này đã không cho phép đăng nhập nhiều tài khoản.</translation>
-<translation id="2025632980034333559"><ph name="APP_NAME"/> đã xảy ra lỗi. Nhấp vào bong bóng này để tải lại tiện ích mở rộng.</translation>
+<translation id="2025632980034333559"><ph name="APP_NAME"/> đã xảy ra lỗi. Nhấp vào bong bóng này để tải lại tiện ích.</translation>
 <translation id="687588960939994211">Đồng thời, xóa lịch sử, dấu trang, cài đặt và các dữ liệu Chrome khác của bạn được lưu trữ trên thiết bị này.</translation>
 <translation id="4581823559337371475">Dịch vụ đăng nhập dưới đây do <ph name="SAML_DOMAIN"/> lưu trữ. Đăng nhập để tiếp tục.</translation>
 <translation id="6322279351188361895">Không thể đọc khóa cá nhân.</translation>
 <translation id="2566124945717127842">Powerwash để đặt lại thiết bị <ph name="IDS_SHORT_PRODUCT_NAME"/> của bạn giống như mới.</translation>
 <translation id="3609785682760573515">Đang đồng bộ hóa...</translation>
 <translation id="1383861834909034572">Mở khi hoàn tất</translation>
-<translation id="5727728807527375859">Tiện ích mở rộng, ứng dụng và chủ đề có thể gây hại cho máy tính của bạn. Bạn có chắc chắn muốn tiếp tục không?</translation>
+<translation id="5727728807527375859">Tiện ích, ứng dụng và chủ đề có thể gây hại cho máy tính của bạn. Bạn có chắc chắn muốn tiếp tục không?</translation>
 <translation id="3857272004253733895">Giản đồ Kép Pinyin</translation>
 <translation id="3559661023937741623">Để bảo mật cho bạn, vui lòng xác minh chi tiết thẻ của bạn.</translation>
 <translation id="1830550083491357902">Chưa đăng nhập</translation>
 <translation id="1657406563541664238">Trợ giúp cải thiện <ph name="PRODUCT_NAME"/> bằng cách tự động gửi cho Google thống kê sử dụng và báo cáo sự cố</translation>
 <translation id="8339012082103782726">Không cho phép trang web truy cập vào micrô của bạn</translation>
 <translation id="7982789257301363584">Mạng</translation>
-<translation id="2271281383664374369">Yêu cầu của tiện ích mở rộng đến URL này tạm thời bị chặn.</translation>
+<translation id="2271281383664374369">Yêu cầu của tiện ích đến URL này tạm thời bị chặn.</translation>
 <translation id="8528962588711550376">Đang đăng nhập.</translation>
 <translation id="2336228925368920074">Đánh dấu trang Tất cả các Tab...</translation>
 <translation id="8774934320277480003">Lề trên</translation>
 <translation id="5078796286268621944">Mã PIN không chính xác</translation>
 <translation id="3480411814272635771">Số lần một tab không phản hồi</translation>
 <translation id="8487678622945914333">Phóng To</translation>
-<translation id="3846593650622216128">Các cài đặt này được tiện ích mở rộng thực hiện.</translation>
-<translation id="8185331656081929126">Hiển thị thông báo khi phát hiện thấy máy tin mới trên mạng</translation>
+<translation id="3846593650622216128">Các cài đặt này được tiện ích thực hiện.</translation>
+<translation id="8185331656081929126">Hiển thị thông báo khi phát hiện thấy máy in mới trên mạng</translation>
 <translation id="2972557485845626008">Chương trình cơ sở</translation>
 <translation id="735327918767574393">Đã xảy ra lỗi khi hiển thị trang web này. Để tiếp tục, hãy tải lại hoặc truy cập vào một trang khác.</translation>
 <translation id="7607274158153386860">Yêu cầu trang web máy tính bảng</translation>
 <translation id="3868718841498638222">Bạn đã chuyển sang kênh <ph name="CHANNEL_NAME"/>.</translation>
 <translation id="7931071620596053769">(Các) trang sau không hồi đáp. Bạn có thể chờ các trang trở về trạng thái hồi đáp hoặc xóa chúng.</translation>
 <translation id="7938958445268990899">Chứng chỉ của máy chủ chưa hợp lệ.</translation>
-<translation id="4569998400745857585">Menu chứa các tiện ích mở rộng bị ẩn</translation>
+<translation id="4569998400745857585">Menu chứa các tiện ích bị ẩn</translation>
 <translation id="4081383687659939437">Lưu thông tin</translation>
 <translation id="1801827354178857021">Khoảng thời gian</translation>
 <translation id="238526402387145295">Bạn không thể truy cập <ph name="SITE"/> ngay bây giờ do trang web <ph name="BEGIN_LINK"/>sử dụng HSTS<ph name="END_LINK"/>. Lỗi mạng và các cuộc tấn công mạng thường chỉ là tạm thời do đó trang này có thể sẽ hoạt động lại sau.</translation>
 <translation id="5245965967288377800">Mạng WiMAX</translation>
 <translation id="40027638859996362">Di chuyển từ</translation>
 <translation id="3522708245912499433">Tiếng Bồ Đào Nha</translation>
-<translation id="6303187936217840894">Cài đặt trình duyệt của bạn sẽ được khôi phục về mặc định ban đầu. Việc này sẽ đặt lại trang chủ, trang tab mới và công cụ tìm kiếm, tắt các tiện ích mở rộng của bạn và bỏ ghim tất cả các tab. Hành động này cũng xóa dữ liệu tạm thời và được lưu trong bộ nhớ cache khác, chẳng hạn như cookie, nội dung và dữ liệu trang web.</translation>
+<translation id="6303187936217840894">Cài đặt trình duyệt của bạn sẽ được khôi phục về mặc định ban đầu. Việc này sẽ đặt lại trang chủ, trang tab mới và công cụ tìm kiếm, tắt các tiện ích của bạn và bỏ ghim tất cả các tab. Hành động này cũng xóa dữ liệu tạm thời và được lưu trong bộ nhớ cache khác, chẳng hạn như cookie, nội dung và dữ liệu trang web.</translation>
 <translation id="6928441285542626375">Bật TCP Fast Open</translation>
 <translation id="7792388396321542707">Dừng chia sẻ</translation>
 <translation id="5463275305984126951">Chỉ mục của <ph name="LOCATION"/></translation>
 <translation id="6698381487523150993">Tạo:</translation>
 <translation id="4684748086689879921">Bỏ qua bước Nhập</translation>
 <translation id="6418443601594065950">Tắt thanh thông tin bật lên của phương tiện được bảo vệ.</translation>
-<translation id="8191230140820435481">Quản lý ứng dụng, tiện ích mở rộng và chủ đề của bạn</translation>
+<translation id="8191230140820435481">Quản lý ứng dụng, tiện ích và chủ đề của bạn</translation>
 <translation id="8279107132611114222">Yêu cầu truy cập trang web này của bạn đã được gửi tới <ph name="NAME"/>.</translation>
 <translation id="8034955203865359138">Không tìm thấy mục nhập lịch sử nào.</translation>
 <translation id="9130015405878219958">Chế độ không hợp lệ được nhập.</translation>
 <translation id="4159435316791146348">Với sự hướng dẫn và phê duyệt của CPSC và các cơ quan chức năng khác, Google và HP đang thu hồi bộ sạc gốc của HP Chromebook 11.</translation>
 <translation id="2716483787622029543">Truy cập và xóa ảnh, nhạc và phương tiện khác từ máy tính của bạn</translation>
 <translation id="7659660321065362272">Cập nhật quan trọng trên HP Chromebook 11</translation>
-<translation id="5965661248935608907">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn nhấp vào nút Trang chủ hoặc tìm kiếm từ Thanh địa chỉ.</translation>
+<translation id="5965661248935608907">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn nhấp vào nút Trang chủ hoặc tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="9177499212658576372">Bạn hiện kết nối với mạng <ph name="NETWORK_TYPE"/>.</translation>
-<translation id="8589311641140863898">API tiện ích mở rộng thử nghiệm</translation>
+<translation id="8589311641140863898">API tiện ích thử nghiệm</translation>
 <translation id="869891660844655955">Ngày hết hạn</translation>
 <translation id="8336153091935557858">Hôm qua <ph name="YESTERDAY_DAYTIME"/></translation>
 <translation id="8642171459927087831">Mã thông báo truy cập</translation>
 <translation id="1199341378292808368">Tuần vừa qua</translation>
 <translation id="8295070100601117548">Lỗi máy chủ</translation>
 <translation id="2638942478653899953">Không thể truy cập Google Drive. Vui lòng <ph name="BEGIN_LINK"/>đăng xuất<ph name="END_LINK"/> và đăng nhập lại.</translation>
-<translation id="1983450660696935749">Số lần tắt một tiện ích mở rộng</translation>
+<translation id="1983450660696935749">Số lần tắt một tiện ích</translation>
 <translation id="3084548735795614657">Thả để cài đặt</translation>
 <translation id="5661272705528507004">Thẻ SIM này bị vô hiệu hóa và không thể sử dụng. Vui lòng liên hệ nhà cung cấp dịch vụ của bạn để lấy thẻ SIM thay thế.</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
 <translation id="238039057627789696">Nếu bật, trình kết xuất sẽ ủy quyền kết hợp cho trình duyệt, sáp nhập cả hai quá trình thông qua kết hợp.</translation>
 <translation id="4792148404905252597">Bật thử nghiệm bằng cách chạy ứng dụng tạm thời từ các siêu liên kết. Ví dụ: các liên kết tới các trang chi tiết về ứng dụng Cửa hàng Chrome trực tuyến trong kết quả tìm kiếm của Google sẽ chạy ứng dụng thay vì điều hướng tới trang chi tiết.</translation>
 <translation id="3245321423178950146">Nghệ sĩ không xác định</translation>
-<translation id="2437838871182492352">Số lần bật một tiện ích mở rộng</translation>
+<translation id="2437838871182492352">Số lần bật một tiện ích</translation>
 <translation id="9050666287014529139">Cụm mật khẩu</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="8787254343425541995">Cho phép các proxy đối với mạng chia sẻ</translation>
           là đối tượng xâm nhập trên thiết bị của bạn và chặn đối tượng này kết nối Internet.</translation>
 <translation id="3873139305050062481">Kiểm tra Phầ&amp;n tử</translation>
 <translation id="7445762425076701745">Không thể xác thực đầy đủ nhận dạng của máy chủ bạn đã kết nối. Bạn đã kết nối vào máy chủ bằng một tên chỉ hợp lệ trong mạng của bạn và đó là tên mà các tổ chức phát hành chứng chỉ bên ngoài không thể xác thực được. Vì một số tổ chức phát hành chứng chỉ sẽ cấp chứng chỉ cho các tên này thay thế, nên không có cách nào đảm bảo bạn được kết nối tới trang web đã chỉ định và không phải là kẻ tấn công.</translation>
-<translation id="1556537182262721003">Không thể di chuyển thư mục tiện ích mở rộng vào tiểu sử.</translation>
+<translation id="1556537182262721003">Không thể di chuyển thư mục tiện ích vào hồ sơ.</translation>
 <translation id="2946640296642327832">Bật bluetooth</translation>
 <translation id="5866557323934807206">Xóa các cài đặt này cho những lần truy cập tiếp theo</translation>
 <translation id="126710816202626562">Ngôn ngữ dịch:</translation>
 <translation id="8656768832129462377">Không kiểm tra</translation>
 <translation id="413121957363593859">Thành phần</translation>
 <translation id="715487527529576698">Chế độ tiếng Trung ban đầu là tiếng Trung Giản thể</translation>
-<translation id="6522350652862471760">Bật tên và biểu tượng tiểu sử trên Google</translation>
+<translation id="6522350652862471760">Bật tên và biểu tượng hồ sơ trên Google</translation>
 <translation id="6181259999130430430">Bật Mở khóa dễ dàng cho thiết bị này.</translation>
 <translation id="8703575177326907206">Kết nối của bạn đến <ph name="DOMAIN"/> không được mã hóa.</translation>
 <translation id="6135622770221372891">ID kênh</translation>
 <translation id="8757640015637159332">Đăng nhập vào phiên công khai</translation>
 <translation id="5829990587040054282">Khóa màn hình hoặc tắt nguồn</translation>
 <translation id="7800304661137206267">Kết nối được mã hóa bằng <ph name="CIPHER"/>, với <ph name="MAC"/> để xác thực thư và <ph name="KX"/> là cơ chế trao đổi chính.</translation>
-<translation id="5707185214361380026">Không tải được tiện ích mở rộng từ:</translation>
+<translation id="5707185214361380026">Không tải được tiện ích từ:</translation>
 <translation id="7331786426925973633">Trình duyệt web tốc độ, đơn giản và bảo mật</translation>
 <translation id="5584537427775243893">Nhập</translation>
 <translation id="4779735050989188948">Thực hiện cài đặt kiểm soát quyền truy cập của trang web vào các cookie, JavaScript và plugin</translation>
@@ -664,7 +664,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="6431347207794742960"><ph name="PRODUCT_NAME"/> sẽ thiết lập cập nhật tự động cho tất cả người dùng của máy tính này.</translation>
 <translation id="4973698491777102067">Xóa các mục sau từ:</translation>
 <translation id="9021662811137657072">Đã phát hiện thấy vi-rút</translation>
-<translation id="4241404202385006548">Tắt tiện ích mở rộng của bạn rồi tải lại trang web này</translation>
+<translation id="4241404202385006548">Tắt tiện ích của bạn rồi tải lại trang web này</translation>
 <translation id="6074963268421707432">Không cho phép bất kỳ trang web nào hiển thị thông báo trên màn hình</translation>
 <translation id="3603385196401704894">Tiếng Pháp ở Canada</translation>
 <translation id="4869253927035988743">Bật hỗ trợ thư mục cho hệ thống tệp đồng bộ hóa.</translation>
@@ -754,13 +754,13 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="4092067639640979396">Bật hỗ trợ thu hẹp phạm vi thử nghiệm.</translation>
 <translation id="5569602728237807248">Truy cập biểu tượng của các trang web mà bạn truy cập</translation>
 <translation id="1547297114045837579">Bật tạo điểm ảnh GPU.</translation>
-<translation id="3241680850019875542">Chọn thư mục gốc của tiện ích mở rộng để đóng gói. Để cập nhật tiện ích mở rộng, bạn cũng chọn tệp khóa cá nhân để sử dụng lại.</translation>
+<translation id="3241680850019875542">Chọn thư mục gốc của tiện ích để đóng gói. Để cập nhật tiện ích, bạn cũng chọn tệp khóa cá nhân để sử dụng lại.</translation>
 <translation id="7845849068167576533">Ngay cả khi bạn đã truy cập trang web này trước đây thì bây giờ trang web cũng không an toàn. Duyệt web an toàn của Google gần đây <ph name="BEGIN_LINK"/>đã phát hiện phần mềm độc hại<ph name="END_LINK"/> trên <ph name="SITE"/>. Các trang web thường được coi là an toàn đôi khi vẫn bị nhiễm phần mềm độc hại. Nội dung độc hại xuất phát từ <ph name="SUBRESOURCE_HOST"/>, một nguồn phát tán phần mềm độc hại đã xác định.</translation>
 <translation id="2541178044065537882">Plugin bị chặn</translation>
 <translation id="2149850907588596975">Mật khẩu và biểu mẫu</translation>
 <translation id="6972069480564005577">Cửa hàng trực tuyến</translation>
 <translation id="3672928695873425336">Không cho phép giá thu nhỏ khi nhấp chuột.</translation>
-<translation id="1445572445564823378">Tiện ích mở rộng này đang làm chậm <ph name="PRODUCT_NAME"/>. Bạn phải tắt tiện ích để khôi phục hiệu suất của <ph name="PRODUCT_NAME"/>.</translation>
+<translation id="1445572445564823378">Tiện ích này đang làm chậm <ph name="PRODUCT_NAME"/>. Bạn phải tắt tiện ích để khôi phục hiệu suất của <ph name="PRODUCT_NAME"/>.</translation>
 <translation id="7528983820605922285">Trình quản lý người dùng</translation>
 <translation id="657402800789773160">&amp;Tải lại trang này</translation>
 <translation id="6163363155248589649">Thườ&amp;ng</translation>
@@ -773,7 +773,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="5524517123096967210">Không thể đọc tệp.</translation>
 <translation id="8426519927982004547">HTTPS/SSL</translation>
 <translation id="5548207786079516019">Đây là cài đặt thứ cấp của <ph name="PRODUCT_NAME"/> và không thể trở thành trình duyệt mặc định của bạn.</translation>
-<translation id="3984413272403535372">Lỗi khi ký tiện ích mở rộng.</translation>
+<translation id="3984413272403535372">Lỗi khi ký tiện ích.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="3298461240075561421">Ngay cả khi bạn đã tải xuống các tệp từ trang web này trước đây, trang web có thể đã bị tấn công. Thay vì khôi phục tệp này, bạn có thể thử tải xuống sau.</translation>
 <translation id="672609503628871915">Xem tính năng mới</translation>
@@ -781,7 +781,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="1274997165432133392">Cookie và các dữ liệu trang web khác</translation>
 <translation id="4299729908419173967">Tiếng Braxin</translation>
 <translation id="375841316537350618">Đang tải xuống tập lệnh proxy...</translation>
-<translation id="45400070127195133">Bật tùy chọn này cho phép ứng dụng web truy cập các tiện ích mở rộng WebGL vẫn đang ở trạng thái thử nghiệm.</translation>
+<translation id="45400070127195133">Bật tùy chọn này cho phép ứng dụng web truy cập các tiện ích WebGL vẫn đang ở trạng thái thử nghiệm.</translation>
 <translation id="9169664750068251925">Luôn chặn trên trang web này</translation>
 <translation id="6406303162637086258">Mô phỏng khởi động lại trình duyệt</translation>
 <translation id="7428296649065852053">Lượng thời gian tải một trang web</translation>
@@ -818,8 +818,8 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="119944043368869598">Xóa tất cả</translation>
 <translation id="3467848195100883852">Bật tự động sửa lỗi chính tả</translation>
 <translation id="1336254985736398701">Xem Thông t&amp;in Trang</translation>
-<translation id="5039440886426314758">Cài đặt các ứng dụng và tiện ích mở rộng này?</translation>
-<translation id="7839963980801867006">Chọn các IME tiện ích mở rộng sẽ khả dụng trong menu ngôn ngữ.</translation>
+<translation id="5039440886426314758">Cài đặt các ứng dụng và tiện ích này?</translation>
+<translation id="7839963980801867006">Chọn các IME tiện ích sẽ khả dụng trong menu ngôn ngữ.</translation>
 <translation id="7665369617277396874">Thêm tài khoản</translation>
 <translation id="1007408791287232274">Không thể tải các thiết bị.</translation>
 <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP"/>.html</translation>
@@ -843,7 +843,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="1202290638211552064">Cổng hoặc máy chủ proxy đã hết thời gian khi đợi phản hồi từ máy chủ luồng trên.</translation>
 <translation id="5089823027662815955">&amp;Tìm kiếm hình ảnh này trong <ph name="SEARCH_ENGINE"/></translation>
 <translation id="7765158879357617694">Di chuyển</translation>
-<translation id="2192280117622171197">Một tiện ích mở rộng đã thay đổi trang nào được hiển thị khi bạn tìm kiếm từ Thanh địa chỉ.</translation>
+<translation id="2192280117622171197">Một tiện ích đã thay đổi trang nào được hiển thị khi bạn tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="2731700343119398978">Vui lòng chờ...</translation>
 <translation id="5731751937436428514">Phương pháp nhập tiếng Việt (VIQR)</translation>
 <translation id="8412144371993786373">Đánh dấu trang trang hiện tại</translation>
@@ -868,7 +868,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="863718024604665812">Đã đóng băng trình kết xuất</translation>
 <translation id="1124772482545689468">Người dùng</translation>
 <translation id="6039651071822577588">Từ điển thuộc tính mạng có định dạng không đúng</translation>
-<translation id="8772559521634908780">Xác nhận tiá»\87n Ã­ch má»\9f rá»\99ng má»\9bi</translation>
+<translation id="8772559521634908780">Xác nhận tiện ích mới</translation>
 <translation id="4022426551683927403">&amp;Thêm vào Từ điển</translation>
 <translation id="5639549361331209298">Tải lại trang này, giữ để xem các tùy chọn khác</translation>
 <translation id="2897878306272793870">Bạn có chắc chắn muốn mở <ph name="TAB_COUNT"/> tab không?</translation>
@@ -907,11 +907,11 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="3464868340187708956">Thêm người dùng mới</translation>
 <translation id="7986039047000333986">Cập nhật bảo mật đặc biệt cho <ph name="PRODUCT_NAME"/> vừa được áp dụng; bạn phải khởi động lại ngay bây giờ để cập nhật có hiệu lực (chúng tôi sẽ khôi phục các tab của bạn).</translation>
 <translation id="2787591391657537328">Cho phép tài nguyên đã tải xuống bị gián đoạn được tiếp tục hoặc khởi động lại bằng mục menu ngữ cảnh Tiếp tục.</translation>
-<translation id="3926862159284741883">Bật tiện ích mở rộng WebGL thử nghiệm</translation>
+<translation id="3926862159284741883">Bật tiện ích WebGL thử nghiệm</translation>
 <translation id="7684540948112007255">tải xuống nhiều tệp.</translation>
 <translation id="2537271621194795300">Thời gian khởi động</translation>
 <translation id="3636096452488277381">Xin chào <ph name="USER_GIVEN_NAME"/>!</translation>
-<translation id="4911714727432509308">Không có tiện ích mở rộng nào được gán phím tắt.</translation>
+<translation id="4911714727432509308">Không có tiện ích nào được gán phím tắt.</translation>
 <translation id="5999606216064768721">Sử dụng Đường viền và Thanh Tiêu đề của Hệ thống</translation>
 <translation id="921568617530782833">Đọc và sửa đổi tất cả dữ liệu của bạn trên các trang web bạn truy cập</translation>
 <translation id="225943865679747347">Mã lỗi: <ph name="ERROR_CODE"/></translation>
@@ -941,7 +941,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="8280151743281770066">Phiên âm tiếng Armenia</translation>
 <translation id="567881659373499783">Phiên bản <ph name="PRODUCT_VERSION"/></translation>
 <translation id="344100820105975148">Bật các luồng đăng nhập dựa trên web đơn thuần</translation>
-<translation id="8261378640211443080">Tiện ích mở rộng này không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/> và có thể đã được thêm mà bạn không biết.</translation>
+<translation id="8261378640211443080">Tiện ích này không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/> và có thể đã được thêm mà bạn không biết.</translation>
 <translation id="8899851313684471736">Mở liên kết bằng cửa sổ &amp;mới</translation>
 <translation id="4110342520124362335">Đã chặn cookie từ <ph name="DOMAIN"/>.</translation>
 <translation id="2198315389084035571">Tiếng Trung giản thể</translation>
@@ -949,7 +949,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="2019718679933488176">&amp;Mở Âm thanh trong Tab Mới</translation>
 <translation id="1031362278801463162">Đang tải chế độ xem trước</translation>
 <translation id="4409697491990005945">Lề</translation>
-<translation id="3456236151053308041">Bật tiện ích mở rộng IME để cung cấp chế độ xem tùy chỉnh cho thao tác nhập của người dùng chẳng hạn như bàn phím ảo.</translation>
+<translation id="3456236151053308041">Bật tiện ích IME để cung cấp chế độ xem tùy chỉnh cho thao tác nhập của người dùng chẳng hạn như bàn phím ảo.</translation>
 <translation id="4138267921960073861">Hiển thị tên người dùng và ảnh trên màn hình đăng nhập</translation>
 <translation id="3045551944631926023">Chỉ tự động tải lại tab hiển thị</translation>
 <translation id="6921598660714597024">Byte</translation>
@@ -964,7 +964,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="7421925624202799674">&amp;Xem Nguồn Trang</translation>
 <translation id="4439244508678316632">Giấy phép nội dung</translation>
 <translation id="3940082421246752453">Máy chủ không hỗ trợ phiên bản HTTP được sử dụng trong yêu cầu này.</translation>
-<translation id="6909461304779452601">Không thể thêm các ứng dụng, tiện ích mở rộng và tập lệnh của người dùng từ trang web này.</translation>
+<translation id="6909461304779452601">Không thể thêm các ứng dụng, tiện ích và tập lệnh của người dùng từ trang web này.</translation>
 <translation id="661719348160586794">Mật khẩu đã lưu của bạn sẽ xuất hiện tại đây.</translation>
 <translation id="6874604403660855544">&amp;Làm lại thêm</translation>
 <translation id="8352772353338965963">Thêm một tài khoản để đăng nhập nhiều lần. Tất cả các tài khoản đã đăng nhập đều có thể truy cập được mà không cần mật khẩu, do đó bạn chỉ nên sử dụng tính năng này với các tài khoản đáng tin cậy.</translation>
@@ -975,7 +975,7 @@ Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
 <translation id="6686490380836145850">Đóng tab phía bên phải</translation>
 <translation id="8366694425498033255">Phím chọn</translation>
 <translation id="6011503819411930212">Mức sử dụng CPU kết hợp của tất cả các quá trình liên quan đến <ph name="SHORT_PRODUCT_NAME"/></translation>
-<translation id="420665587194630159">(Tiện ích mở rộng này đã được quản lý và không thể bị xóa hoặc tắt).</translation>
+<translation id="420665587194630159">(Tiện ích này đã được quản lý và không thể bị xóa hoặc tắt).</translation>
 <translation id="6535758682390046055">Đã hủy tải xuống <ph name="PLUGIN_NAME"/>.</translation>
 <translation id="2809346626032021864">Đọc</translation>
 <translation id="9156814239012955406">MD5</translation>
@@ -1037,7 +1037,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="3586931643579894722">Ẩn chi tiết</translation>
 <translation id="6285395082104474418">Khay trạng thái hiển thị cho bạn trạng thái hiện tại của mạng, pin và các thông tin khác.</translation>
 <translation id="3317459757438853210">Hai mặt</translation>
-<translation id="6020949471045037306">Bật hệ thống quản lý tiểu sử mới, bao gồm khóa tiểu sử và giao diện người dùng menu hình đại diện mới.</translation>
+<translation id="6020949471045037306">Bật hệ thống quản lý hồ sơ mới, bao gồm khóa hồ sơ và giao diện người dùng menu hình đại diện mới.</translation>
 <translation id="2011110593081822050">Người làm việc trên Web: <ph name="WORKER_NAME"/></translation>
 <translation id="3294437725009624529">Khách</translation>
 <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN"/> hiện ở chế độ toàn màn hình.</translation>
@@ -1090,7 +1090,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="5956585768868398362">Đây có phải là trang tìm kiếm bạn muốn không?</translation>
 <translation id="2103460544384441978">Bạn tự chịu rủi ro nếu tiếp tục</translation>
 <translation id="939736085109172342">Thư mục mới</translation>
-<translation id="5182671122927417841">Tắt tiện ích mở rộng</translation>
+<translation id="5182671122927417841">Tắt tiện ích</translation>
 <translation id="4242577469625748426">Không thể cài đặt các cài đặt chính sách trên thiết bị: <ph name="VALIDATION_ERROR"/>.</translation>
 <translation id="8165208966034452696"><ph name="PLUGIN_NAME"/></translation>
 <translation id="4933484234309072027">được nhúng trên <ph name="URL"/></translation>
@@ -1102,7 +1102,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="7690853182226561458">Thêm &amp;thư mục...</translation>
 <translation id="7968982339740310781">Xem chi tiết</translation>
 <translation id="2726934403674109201">(Tổng số <ph name="COUNT"/>)</translation>
-<translation id="6204994989617056362">Thiếu tiện ích mở rộng đàm phán lại SSL từ cái bắt tay an toàn. Đối với một số trang web, có hỗ trợ tiện ích mở rộng đàm phán lại, Chrome yêu cầu nhiều bắt tay an toàn hơn để ngăn các cuộc tấn công đã xác định. Thiếu tiện ích mở rộng này cho thấy kết nối của bạn bị chặn và bị sửa đổi khi gửi.</translation>
+<translation id="6204994989617056362">Thiếu tiện ích đàm phán lại SSL từ cái bắt tay an toàn. Đối với một số trang web, có hỗ trợ tiện ích đàm phán lại, Chrome yêu cầu nhiều bắt tay an toàn hơn để ngăn các cuộc tấn công đã xác định. Thiếu tiện ích này cho thấy kết nối của bạn bị chặn và bị sửa đổi khi gửi.</translation>
 <translation id="5800020978570554460">Tệp đích đã bị cắt bớt hoặc xóa kể từ lần tải xuống cuối cùng.</translation>
 <translation id="4887424188275796356">Mở bằng trình xem hệ thống</translation>
 <translation id="5823933238730612365">PPAPI (không có hộp cát)</translation>
@@ -1118,7 +1118,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="7051943809462976355">Đang tìm kiếm chuột...</translation>
 <translation id="6344783595350022745">Xóa văn bản</translation>
 <translation id="1426410128494586442">Có</translation>
-<translation id="2359345697448000899">Quản lý tiện ích mở rộng của bạn bằng cách nhấp vào Tiện ích mở rộng trong menu Công cụ.</translation>
+<translation id="2359345697448000899">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu Công cụ.</translation>
 <translation id="6725970970008349185">Số lượng ứng viên để hiển thị trên mỗi trang</translation>
 <translation id="6513615899227776181">Plugin: <ph name="PLUGIN_NAME"/></translation>
 <translation id="6198252989419008588">Thay đổi mã PIN</translation>
@@ -1137,9 +1137,9 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="7989023212944932320">Duyệt web an toàn của Google gần đây <ph name="BEGIN_LINK"/>đã phát hiện phần mềm độc hại<ph name="END_LINK"/> trên <ph name="SITE"/>. Các trang web thường được coi là an toàn đôi khi vẫn bị nhiễm phần mềm độc hại. Nội dung độc hại xuất phát từ <ph name="SUBRESOURCE_HOST"/>, một nguồn phát tán phần mềm độc hại đã xác định. Bạn nên quay lại sau vài giờ.</translation>
 <translation id="121201262018556460">Bạn đã cố truy cập vào <ph name="DOMAIN"/> nhưng máy chủ xuất trình chứng chỉ chứa khóa yếu. Kẻ tấn công có thể đã phá khóa cá nhân và máy chủ đó có thể không phải là máy chủ bạn mong đợi (bạn có thể đang giao tiếp với một kẻ tấn công).</translation>
 <translation id="5553089923092577885">Ánh xạ Chính sách của Chứng chỉ</translation>
-<translation id="7410744438574300812">Không hiển thị thanh thông tin khi tiện ích mở rộng đính kèm với trang thông qua API chrome.debugger. Cần phải có cờ này để gỡ lỗi trang nền tiện ích mở rộng.</translation>
+<translation id="7410744438574300812">Không hiển thị thanh thông tin khi tiện ích đính kèm với trang thông qua API chrome.debugger. Cần phải có cờ này để gỡ lỗi trang nền tiện ích.</translation>
 <translation id="1275018677838892971">Trang web tại <ph name="HOST_NAME"/> có chứa các yếu tố từ những trang web đã được báo cáo là trang web &quot;lừa đảo&quot;.  Các trang web lừa đảo lừa người dùng khai báo thông tin cá nhân hoặc thông tin tài chính, thông thường bằng cách giả làm đại diện cho những tổ chức đáng tin cậy, chẳng hạn như ngân hàng.</translation>
-<translation id="1357589289913453911">Id tiện ích mở rộng</translation>
+<translation id="1357589289913453911">Id tiện ích</translation>
 <translation id="7570477672765183">Nhấp để bắt đầu</translation>
 <translation id="8688579245973331962">Bạn không thấy tên của mình?</translation>
 <translation id="3804941997676372569">Tìm kiếm hoặc nói &quot;Ok, Google&quot;</translation>
@@ -1154,7 +1154,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="2772936498786524345">Lén lút</translation>
 <translation id="5595485650161345191">Chỉnh sửa địa chỉ</translation>
 <translation id="1849186935225320012">Trang này có quyền kiểm soát toàn bộ thiết bị MIDI.</translation>
-<translation id="7309416673261215716">Phiên bản tiện ích mở rộng</translation>
+<translation id="7309416673261215716">Phiên bản tiện ích</translation>
 <translation id="6840313690797192085">$1 PB</translation>
 <translation id="5971037678316050792">Kiểm soát ghép nối và trạng thái bộ đổi nguồn Bluetooth</translation>
 <translation id="3313590242757056087">Để đặt các trang web mà người dùng bị giám sát có thể xem, bạn có thể định cấu hình
@@ -1198,7 +1198,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="3778152852029592020">Đã hủy tải xuống.</translation>
 <translation id="1455069690867658873">Phiên bản mới và chuỗi lịch sử</translation>
 <translation id="6241530762627360640">Truy cập thông tin về thiết bị Bluetooth được ghép nối với hệ thống của bạn và khám phá các thiết bị Bluetooth lân cận.</translation>
-<translation id="7831368056091621108">để nhận tiện ích mở rộng này, lịch sử và các cài đặt Chrome khác trên tất cả thiết bị của bạn.</translation>
+<translation id="7831368056091621108">để nhận tiện ích này, lịch sử và các cài đặt Chrome khác trên tất cả thiết bị của bạn.</translation>
 <translation id="5469868506864199649">Tiếng Ý</translation>
 <translation id="7427315641433634153">MSCHAP</translation>
 <translation id="7894561412851759784">Trong trường hợp này, chứng chỉ chưa được xác minh bởi bên thứ ba mà thiết bị của bạn tin cậy. Bất cứ ai có thể tạo chứng chỉ đều có thể tự nhận là bất kỳ trang web nào mà họ chọn và đó là lý do tại sao chứng chỉ phải được bên thứ ba đáng tin cậy xác minh. Không có sự xác minh này, thông tin nhận dạng trong chứng chỉ sẽ vô nghĩa. Do đó, không thể xác minh rằng bạn đang kết nối với <ph name="DOMAIN"/> thay vì một kẻ tấn công tự tạo chứng chỉ riêng và mạo nhận là <ph name="DOMAIN2"/>. Bạn không nên tiếp tục duyệt trang web này.</translation>
@@ -1210,7 +1210,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="5053604404986157245">Mật khẩu TPM được tạo ngẫu nhiên hiện không khả dụng. Đây là hiện tượng bình thường sau khi tiến hành Powerwash.</translation>
 <translation id="6333049849394141510">Chọn loại dữ liệu để đồng bộ hoá</translation>
 <translation id="1944921356641260203">Đã tìm thấy bản cập nhật</translation>
-<translation id="5990559369517809815">Tiện ích mở rộng đã chặn yêu cầu tới máy chủ.</translation>
+<translation id="5990559369517809815">Tiện ích đã chặn yêu cầu tới máy chủ.</translation>
 <translation id="3828440302402348524">Đã đăng nhập với tên <ph name="USER_NAME"/>...</translation>
 <translation id="5222676887888702881">Đăng xuất</translation>
 <translation id="8965697826696209160">Không có đủ dung lượng.</translation>
@@ -1226,7 +1226,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="7903984238293908205">Katakana</translation>
 <translation id="268053382412112343">Lị&amp;ch sử</translation>
 <translation id="7478485216301680444">Không thể cài đặt ứng dụng kiosk.</translation>
-<translation id="7119964749269738905">Số lần gỡ cài đặt một tiện ích mở rộng</translation>
+<translation id="7119964749269738905">Số lần gỡ cài đặt một tiện ích</translation>
 <translation id="1722567105086139392">Liên kết</translation>
 <translation id="6171294113586936163">Máy in mới trên mạng của bạn</translation>
 <translation id="2620436844016719705">Hệ thống</translation>
@@ -1271,7 +1271,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="236141728043665931">Luôn chặn quyền truy cập micrô</translation>
 <translation id="2307462900900812319">Định cấu hình mạng</translation>
 <translation id="3324301154597925148">Đây có phải là Trang tìm kiếm bạn muốn không?</translation>
-<translation id="3555812735919707620">Xóa tiện ích mở rộng</translation>
+<translation id="3555812735919707620">Xóa tiện ích</translation>
 <translation id="220858061631308971">Vui lòng nhập mã PIN này trên &quot;<ph name="DEVICE_NAME"/>&quot;:</translation>
 <translation id="6263082573641595914">Phiên bản CA của Microsoft</translation>
 <translation id="7716020873543636594">Tự động nhấp chuột khi con trỏ dừng lại</translation>
@@ -1291,7 +1291,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="6880587130513028875">Hình ảnh đã bị chặn trên trang này.</translation>
 <translation id="6964308487066031935">Thêm các thư mục vào &quot;<ph name="EXTENSION"/>&quot;?</translation>
 <translation id="851263357009351303">Luôn cho phép <ph name="HOST"/> hiển thị hình ảnh</translation>
-<translation id="7852934890287130200">Tạo, thay đổi hoặc xóa tiểu sử.</translation>
+<translation id="7852934890287130200">Tạo, thay đổi hoặc xóa hồ sơ.</translation>
 <translation id="3511307672085573050">S&amp;ao chép Địa chỉ Liên kết</translation>
 <translation id="751507702149411736">Tiếng Bê-la-rút</translation>
 <translation id="6655190889273724601">Chế độ dành cho nhà phát triển</translation>
@@ -1313,7 +1313,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="2462724976360937186">ID khóa của tổ chức phát hành chứng chỉ</translation>
 <translation id="981121421437150478">Ngoại tuyến</translation>
 <translation id="2964193600955408481">Tắt Wi-Fi</translation>
-<translation id="6786747875388722282">Tiện ích mở rộng</translation>
+<translation id="6786747875388722282">Tiện ích</translation>
 <translation id="2570648609346224037">Đã xảy ra sự cố trong quá trình tải xuống hình ảnh khôi phục.</translation>
 <translation id="5372384633701027870">Xóa cookie và dữ liệu trang web khác khi bạn thoát khỏi trình duyệt của bạn</translation>
 <translation id="4781787911582943401">Phóng to màn hình</translation>
@@ -1331,7 +1331,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="7079038783243627996">&quot;<ph name="EXTENSION"/>&quot; sẽ có thể đọc và xóa hình ảnh, video cũng như các tệp âm thanh trong thư mục đã chọn.</translation>
 <translation id="1737968601308870607">Lỗi tệp</translation>
 <translation id="8437238597147034694">&amp;Hoàn tác di chuyển</translation>
-<translation id="1389297115360905376">Chỉ có thể thêm ứng dụng/tiện ích mở rộng này từ <ph name="CHROME_WEB_STORE"/>.</translation>
+<translation id="1389297115360905376">Chỉ có thể thêm ứng dụng/tiện ích này từ <ph name="CHROME_WEB_STORE"/>.</translation>
 <translation id="5474139872592516422">Khi kết thúc quá trình cập nhật <ph name="PLUGIN_NAME"/>, hãy tải lại trang để kích hoạt plugin này.</translation>
 <translation id="4012550234655138030">Thiết lập hoặc quản lý máy in trong <ph name="CLOUD_PRINT_NAME"/></translation>
 <translation id="315116470104423982">Dữ liệu di động</translation>
@@ -1366,7 +1366,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="333371639341676808">Ngăn không cho trang này tạo hộp thoại bổ sung.</translation>
 <translation id="2280486287150724112">Lề phải</translation>
 <translation id="5631017369956619646">Mức sử dụng CPU</translation>
-<translation id="7223775956298141902">Này... Bạn không có tiện ích mở rộng nào :-(</translation>
+<translation id="7223775956298141902">Này... Bạn không có tiện ích nào :-(</translation>
 <translation id="8909407620850305640">Phương pháp tổng hợp</translation>
 <translation id="3118046075435288765">Máy chủ đã bất ngờ đóng kết nối.</translation>
 <translation id="6133173853026656527">Đang di chuyển <ph name="FILE_NAME"/>...</translation>
@@ -1379,7 +1379,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="4275663329226226506">Truyền thông</translation>
 <translation id="3629630062892748850">Tìm kiếm bằng URL liên quan và Google.com</translation>
 <translation id="5649768706273821470">Nghe</translation>
-<translation id="4096508467498758490">Vô hiệu hóa tiện ích mở rộng chế độ nhà phát triển</translation>
+<translation id="4096508467498758490">Vô hiệu hóa tiện ích chế độ nhà phát triển</translation>
 <translation id="9064939804718829769">Đang chuyển...</translation>
 <translation id="48838266408104654">&amp;Trình quản lý Tác vụ</translation>
 <translation id="4378154925671717803">Điện thoại</translation>
@@ -1392,7 +1392,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="3341703758641437857">Cho phép truy cập vào các URL của tệp</translation>
 <translation id="6948142510520900350">&lt;strong&gt;Quản trị viên hệ thống&lt;/strong&gt; của bạn đã chặn quyền truy cập vào trang web này.</translation>
 <translation id="5702898740348134351">&amp;Chỉnh sửa Công cụ Tìm kiếm...</translation>
-<translation id="3687701603889589626">Cho phép chạy tiện ích mở rộng trên các URL chrome:// mà tiện ích mở rộng yêu cầu quyền này một cách rõ ràng.</translation>
+<translation id="3687701603889589626">Cho phép chạy tiện ích trên các URL chrome:// mà tiện ích yêu cầu quyền này một cách rõ ràng.</translation>
 <translation id="1756681705074952506">Phương thức nhập</translation>
 <translation id="8545211332741562162">Cho phép trang web sử dụng các tính năng JavaScript thử nghiệm.</translation>
 <translation id="734303607351427494">Quản lý công cụ tìm kiếm...</translation>
@@ -1401,7 +1401,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="2073514786687846182">Tắt hỗ trợ cho Native Client di động (PNaCl).</translation>
 <translation id="3001660530462287301">Có, cài đặt</translation>
 <translation id="7973174304586609605">Thêm người dùng mới...</translation>
-<translation id="7676077734785147678">IME tiện ích mở rộng</translation>
+<translation id="7676077734785147678">IME tiện ích</translation>
 <translation id="8326478304147373412">PKCS #7, chuỗi chứng chỉ</translation>
 <translation id="3242765319725186192">Khóa chia sẻ trước:</translation>
 <translation id="8249048954461686687">Thư mục OEM</translation>
@@ -1413,7 +1413,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="4249248555939881673">Đang chờ kết nối mạng...</translation>
 <translation id="996987097147224996">Nhấn Ctrl+dấu cách để chọn phương thức nhập trước đó.</translation>
 <translation id="4240069395079660403">Không thể hiển thị <ph name="PRODUCT_NAME"/> bằng ngôn ngữ này</translation>
-<translation id="747114903913869239">Lỗi: Không thể giải mã tiện ích mở rộng</translation>
+<translation id="747114903913869239">Lỗi: Không thể giải mã tiện ích</translation>
 <translation id="7187885785158279764">Thu hồi quyền truy cập tệp</translation>
 <translation id="3574210789297084292">đăng nhập</translation>
 <translation id="5254480569305195883">Bật hỗ trợ cho sự kiện đồng bộ hóa nền ServiceWorker.</translation>
@@ -1428,7 +1428,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="4906679076183257864">Đặt lại về mặc định</translation>
 <translation id="4747597332667805440">Bật giao diện người dùng trong bong bóng khôi phục phiên.</translation>
 <translation id="2344262275956902282">Sử dụng các phím - và = để đánh số trang danh sách tùy chọn</translation>
-<translation id="3609138628363401169">Máy chủ không hỗ trợ tiện ích mở rộng đàm phán lại TLS.</translation>
+<translation id="3609138628363401169">Máy chủ không hỗ trợ tiện ích đàm phán lại TLS.</translation>
 <translation id="4926098191708537519">RSA</translation>
 <translation id="3369624026883419694">Đang phân giải máy chủ...</translation>
 <translation id="8870413625673593573">Các tab đã Đóng gần đây</translation>
@@ -1449,7 +1449,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="7339898014177206373">Cửa sổ mới</translation>
 <translation id="8362900609631365882">Bật trình chuyển đổi tab khả năng truy cập.</translation>
 <translation id="1895215930471128025">Không bao giờ cho phép plug-in không có hộp cát trên <ph name="HOST"/></translation>
-<translation id="1171000732235946541">Phương thức nhập này có thể thu thập tất cả nội dung bạn nhập, bao gồm dữ liệu cá nhân chẳng hạn như mật khẩu và số thẻ tín dụng. Phương thức nhập này xuất phát từ tiện ích mở rộng &quot;<ph name="EXTENSION_NAME"/>&quot;. Bạn có muốn sử dụng phương thức nhập này?</translation>
+<translation id="1171000732235946541">Phương thức nhập này có thể thu thập tất cả nội dung bạn nhập, bao gồm dữ liệu cá nhân chẳng hạn như mật khẩu và số thẻ tín dụng. Phương thức nhập này xuất phát từ tiện ích &quot;<ph name="EXTENSION_NAME"/>&quot;. Bạn có muốn sử dụng phương thức nhập này?</translation>
 <translation id="7788080748068240085">Để lưu &quot;<ph name="FILE_NAME"/>&quot; ngoại tuyến, bạn phải giải phóng thêm <ph name="TOTAL_FILE_SIZE"/> dung lượng lưu trữ:<ph name="MARKUP_1"/>
     <ph name="MARKUP_2"/>bỏ ghim các tệp mà bạn không cần truy cập ngoại tuyến nữa<ph name="MARKUP_3"/>
     <ph name="MARKUP_4"/>xóa các tệp khỏi thư mục Tải xuống của bạn<ph name="MARKUP_5"/></translation>
@@ -1478,7 +1478,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="6815206662964743929">Chuyển người dùng</translation>
 <translation id="81686154743329117">ZRM</translation>
 <translation id="2150139952286079145">Tìm kiếm máy in đích</translation>
-<translation id="4713309396072794887">Cài đặt các tiện ích mở rộng này?</translation>
+<translation id="4713309396072794887">Cài đặt các tiện ích này?</translation>
 <translation id="5637940320504994319">Bạn đã hết dung lượng lưu trữ trong Google Drive</translation>
 <translation id="8194797478851900357">&amp;Hoàn tác di chuyển</translation>
 <translation id="2266011376676382776">(Các) Trang không Hồi đáp</translation>
@@ -1561,7 +1561,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="6476634420120651145">Bật tính năng tự động thay đổi kích thước văn bản nhanh chóng</translation>
 <translation id="5402367795255837559">Chữ nổi</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME"/> không thể hoàn tất cài đặt nhưng sẽ tiếp tục chạy từ hình ảnh đĩa của trình duyệt này.</translation>
-<translation id="4726710629007580002">Đã có cảnh báo khi cố cài đặt tiện ích mở rộng này:</translation>
+<translation id="4726710629007580002">Đã có cảnh báo khi cố cài đặt tiện ích này:</translation>
 <translation id="7025190659207909717">Quản lý dịch vụ dữ liệu di động</translation>
 <translation id="946810925362320585">Theo khuyến cáo</translation>
 <translation id="1685944703056982650">Ngoại lệ cho con trỏ chuột</translation>
@@ -1583,7 +1583,7 @@ Lưu ý! Chế độ ẩn danh <ph name="SHORTCUT_KEY"/> có thể hữu ích v
 <translation id="6022526133015258832">Mở chế độ toàn màn hình</translation>
 <translation id="8933960630081805351">&amp;Hiển thị trong Trình tìm kiếm</translation>
 <translation id="3009779501245596802">Cơ sở dữ liệu được lập chỉ mục</translation>
-<translation id="1404301347395550388">Bật Tiện ích mở rộng phương tiện có mã hóa.</translation>
+<translation id="1404301347395550388">Bật Tiện ích phương tiện có mã hóa.</translation>
 <translation id="3041612393474885105">Thông tin Chứng chỉ</translation>
 <translation id="5023943178135355362">Cuộn theo kiểu Úc <ph name="BEGIN_LINK"/>Tìm hiểu thêm<ph name="END_LINK"/></translation>
 <translation id="7378810950367401542">/</translation>
@@ -1621,7 +1621,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="8899388739470541164">Vietnamese</translation>
 <translation id="2053686653008575655">Bạn có thể tham khảo các <ph name="BEGIN_LINK"/>Câu hỏi thường gặp<ph name="END_LINK"/> và tiếp tục sử dụng HP Chromebook 11 của mình với bất kỳ bộ sạc micro-USB được chứng nhận nào khác, chẳng hạn như bộ sạc đi kèm với máy tính bảng hoặc điện thoại thông minh. Chúng tôi xin lỗi một lần nữa vì sự bất tiện này. Sự an toàn của bạn là ưu tiên hàng đầu.</translation>
 <translation id="6423064450797205562">Số liệu liên quan đến tốc độ mà <ph name="SHORT_PRODUCT_NAME"/> thực hiện các tác vụ được yêu cầu</translation>
-<translation id="3690673539902120157">Bạn có chắc chắn muốn cài đặt tiện ích mở rộng này dù bắt buộc phải có những đặc quyền này không?</translation>
+<translation id="3690673539902120157">Bạn có chắc chắn muốn cài đặt tiện ích này dù bắt buộc phải có những đặc quyền này không?</translation>
 <translation id="4091434297613116013">trang giấy</translation>
 <translation id="7475671414023905704">URL Mật khẩu đã Mất của Netscape</translation>
 <translation id="3335947283844343239">Mở lại Tab đã Đóng</translation>
@@ -1663,10 +1663,10 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="4411578466613447185">Trình ký mã</translation>
 <translation id="3029595853063638932">Đang tạo thẻ ảo trên Google Wallet...</translation>
 <translation id="1354868058853714482">Adobe Reader đã lỗi thời và có thể không an toàn.</translation>
-<translation id="6915711422691334155">Tiện ích mở rộng này có thể đọc và thay đổi tất cả dữ liệu trên máy tính của bạn và tất cả trang web bao gồm cả Google, Facebook, Yahoo, v.v.</translation>
+<translation id="6915711422691334155">Tiện ích này có thể đọc và thay đổi tất cả dữ liệu trên máy tính của bạn và tất cả trang web bao gồm cả Google, Facebook, Yahoo, v.v.</translation>
 <translation id="6095666334801788310">Hãy nhập lại mật khẩu của bạn</translation>
 <translation id="7360506455591495242">Trình xem Dấu thời gian chứng chỉ đã ký</translation>
-<translation id="3925083541997316308">Người dùng được giám sát không thể sửa đổi ứng dụng và tiện ích mở rộng.</translation>
+<translation id="3925083541997316308">Người dùng được giám sát không thể sửa đổi ứng dụng và tiện ích.</translation>
 <translation id="8425755597197517046">Dá&amp;n và Tìm kiếm</translation>
 <translation id="6341850831632289108">Phát hiện vị trí thực của bạn</translation>
 <translation id="3003623123441819449">Bộ nhớ cache CSS</translation>
@@ -1679,19 +1679,19 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="1123316951456119629">Bằng cách ngắt kết nối tài khoản Google khỏi <ph name="PRODUCT_NAME"/>, dữ liệu của bạn sẽ vẫn còn trên máy tính này nhưng các thay đổi sẽ không còn được đồng bộ hóa với tài khoản Google của bạn. Dữ liệu đã được lưu trữ trong tài khoản Google của bạn sẽ vẫn ở đó cho tới khi bạn xóa dữ liệu bằng <ph name="BEGIN_LINK"/>Trang tổng quan của Google<ph name="END_LINK"/>.</translation>
 <translation id="8705331520020532516">Số Sê-ri</translation>
 <translation id="1665770420914915777">Sử dụng trang Tab mới</translation>
-<translation id="160747070824041275">Đã cập nhật tiện ích mở rộng</translation>
+<translation id="160747070824041275">Đã cập nhật tiện ích</translation>
 <translation id="1691063574428301566">Máy tính của bạn sẽ khởi động lại khi cập nhật hoàn tất.</translation>
 <translation id="1042574203789536285"><ph name="URL"/> muốn lưu trữ vĩnh viễn một lượng lớn dữ liệu trên thiết bị của bạn.</translation>
 <translation id="4697551882387947560">Khi phiên duyệt kết thúc</translation>
 <translation id="7779249319235708104">Cảnh báo tấn công lừa đảo</translation>
-<translation id="5900302528761731119">Ảnh tiểu sử trên Google</translation>
+<translation id="5900302528761731119">Ảnh hồ sơ trên Google</translation>
 <translation id="3512810056947640266">URL (tùy chọn):</translation>
 <translation id="131364520783682672">Caps Lock</translation>
 <translation id="2335122562899522968">Trang này đã đặt các cookie.</translation>
 <translation id="4628757576491864469">Thiết bị</translation>
 <translation id="8461914792118322307">Proxy</translation>
 <translation id="4707934200082538898">Vui lòng kiểm tra email của bạn tại <ph name="BEGIN_BOLD"/><ph name="MANAGER_EMAIL"/><ph name="END_BOLD"/> để được hướng dẫn thêm.</translation>
-<translation id="8680544835056685300">Chúng tôi không ngừng tìm cách để giúp cho quá trình duyệt web của bạn trở nên an toàn hơn. Trước đây, bất kỳ trang web nào cũng có thể nhắc bạn thêm tiện ích mở rộng vào trình duyệt. Trong các phiên bản mới nhất của Google Chrome, bạn phải cho Chrome biết rõ rằng bạn muốn cài đặt các tiện ích mở rộng này bằng cách thêm chúng thông qua trang Tiện ích mở rộng. <ph name="BEGIN_LINK"/>Tìm hiểu thêm<ph name="END_LINK"/></translation>
+<translation id="8680544835056685300">Chúng tôi không ngừng tìm cách để giúp cho quá trình duyệt web của bạn trở nên an toàn hơn. Trước đây, bất kỳ trang web nào cũng có thể nhắc bạn thêm tiện ích vào trình duyệt. Trong các phiên bản mới nhất của Google Chrome, bạn phải cho Chrome biết rõ rằng bạn muốn cài đặt các tiện ích này bằng cách thêm chúng thông qua trang Tiện ích. <ph name="BEGIN_LINK"/>Tìm hiểu thêm<ph name="END_LINK"/></translation>
 <translation id="4089521618207933045">Có menu con</translation>
 <translation id="3470442499439619530">Xóa người dùng này</translation>
 <translation id="1936157145127842922">Hiển thị trong Thư mục</translation>
@@ -1829,14 +1829,14 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="1745087082567737511">Kích hoạt mục trình chạy 1</translation>
 <translation id="2937174152333875430">Bật đồng bộ hóa Trình chạy ứng dụng</translation>
 <translation id="2386255080630008482">Chứng chỉ của máy chủ đã bị thu hồi.</translation>
-<translation id="1586260122947707821">Tắt tiện ích mở rộng thành phần của Quickoffice</translation>
+<translation id="1586260122947707821">Tắt tiện ích thành phần của Quickoffice</translation>
 <translation id="6365411474437319296">Thêm gia đình và bạn bè</translation>
 <translation id="2135787500304447609">&amp;Tiếp tục</translation>
-<translation id="6143635259298204954">Không thể giải nén tiện ích mở rộng.  Để giải nén tiện ích mở rộng một cách an toàn, phải có đường dẫn đến thư mục tiểu sử không chứa liên kết dạng biểu tượng của bạn.  Không có đường dẫn như vậy tồn tại cho tiểu sử của bạn.</translation>
+<translation id="6143635259298204954">Không thể giải nén tiện ích.  Để giải nén tiện ích một cách an toàn, phải có đường dẫn đến thư mục hồ sơ không chứa liên kết dạng biểu tượng của bạn.  Không có đường dẫn như vậy tồn tại cho hồ sơ của bạn.</translation>
 <translation id="3326821416087822643">Đang nén <ph name="FILE_NAME"/>...</translation>
 <translation id="3081104028562135154">Tăng</translation>
 <translation id="3734816294831429815"><ph name="PRODUCT_NAME"/> sẽ khởi động lại sau <ph name="SECONDS"/> giây.</translation>
-<translation id="8732030010853991079">Sử dụng tiện ích mở rộng này bằng cách nhấp vào biểu tượng này.</translation>
+<translation id="8732030010853991079">Sử dụng tiện ích này bằng cách nhấp vào biểu tượng này.</translation>
 <translation id="32330993344203779">Thiết bị của bạn đã được đăng ký thành công cho quản lý doanh nghiệp.</translation>
 <translation id="9177483892433212068">Trình quản lý tiêu điểm nhập văn bản thử nghiệm.</translation>
 <translation id="158917669717260118">Không thể tải trang web do máy tính của bạn đã chuyển sang chế độ ngủ hoặc chế độ ngủ đông. Khi điều này xảy ra, kết nối mạng bị tắt và yêu cầu mạng mới không thành công. Tải lại trang sẽ giải quyết vấn đề này.</translation>
@@ -1877,7 +1877,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="3204741654590142272">Thay đổi kênh sẽ được áp dụng sau.</translation>
 <translation id="901974403500617787">Chỉ chủ sở hữu mới có thể đặt cờ áp dụng cho toàn hệ thống: <ph name="OWNER_EMAIL"/>.</translation>
 <translation id="201192063813189384">Lỗi đọc dữ liệu từ bộ nhớ cache.</translation>
-<translation id="9126706773198551170">Bật hệ thống quản lý tiểu sử mới</translation>
+<translation id="9126706773198551170">Bật hệ thống quản lý hồ sơ mới</translation>
 <translation id="2345303327200536445">Phiên bản mới với nền sặc sỡ</translation>
 <translation id="7441570539304949520">Ngoại lệ cho JavaScript</translation>
 <translation id="1789575671122666129">Cửa sổ bật lên</translation>
@@ -1906,7 +1906,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="5015344424288992913">Đang phân giải proxy…</translation>
 <translation id="4389091756366370506">Người dùng <ph name="VALUE"/></translation>
 <translation id="4528459871550620573">Nếu bạn đang sử dụng Bluetooth, hãy đảm bảo các thiết bị của bạn đã sẵn sàng ghép nối.</translation>
-<translation id="4620809267248568679">Cài đặt này được tiện ích mở rộng thực hiện.</translation>
+<translation id="4620809267248568679">Cài đặt này được tiện ích thực hiện.</translation>
 <translation id="2398703750948514961">Hủy</translation>
 <translation id="4724168406730866204">Eten 26</translation>
 <translation id="308268297242056490">URI</translation>
@@ -1920,7 +1920,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="5451285724299252438">hộp văn bản phạm vi trang</translation>
 <translation id="4112917766894695549">Các cài đặt này được quản trị viên của bạn thực hiện.</translation>
 <translation id="5669267381087807207">Đang kích hoạt</translation>
-<translation id="8825366169884721447">Tiện ích mở rộng này không thể sửa đổi tiêu đề yêu cầu &quot;<ph name="HEADER_NAME"/>&quot; của một yêu cầu mạng do sửa đổi đã xung đột với một tiện ích mở rộng khác (<ph name="EXTENSION_NAME"/>).</translation>
+<translation id="8825366169884721447">Tiện ích này không thể sửa đổi tiêu đề yêu cầu &quot;<ph name="HEADER_NAME"/>&quot; của một yêu cầu mạng do sửa đổi đã xung đột với một tiện ích khác (<ph name="EXTENSION_NAME"/>).</translation>
 <translation id="1707463636381878959">Chia sẻ mạng này với những người dùng khác</translation>
 <translation id="7971930306777004076">Phiên bản cũ</translation>
 <translation id="2084978867795361905">MS-IME</translation>
@@ -1933,7 +1933,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="750413812607578381">Bạn phải khởi động lại <ph name="PRODUCT_NAME"/> ngay bây giờ.</translation>
 <translation id="2638286699381354126">Cập nhật...</translation>
 <translation id="1196338895211115272">Không thể xuất khóa cá nhân.</translation>
-<translation id="1459967076783105826">Công cụ tìm kiếm được thêm bởi tiện ích mở rộng</translation>
+<translation id="1459967076783105826">Công cụ tìm kiếm được thêm bởi tiện ích</translation>
 <translation id="629730747756840877">Tài khoản</translation>
 <translation id="8525306231823319788">Toàn màn hình</translation>
 <translation id="5892507820957994680">Ghi đè danh sách kết xuất phần mềm tích hợp sẵn và cho phép tăng tốc GPU trên cấu hình hệ thống không được hỗ trợ.</translation>
@@ -1958,15 +1958,15 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="4075084141581903552">Tự động đăng nhập hiện khả dụng <ph name="EMAIL_ADDRESS"/></translation>
 <translation id="1293556467332435079">Tệp</translation>
 <translation id="2287590536030307392">Tắt tất cả các kết nối không dây.</translation>
-<translation id="8535658110233909809">Vị trí tiện ích mở rộng</translation>
+<translation id="8535658110233909809">Vị trí tiện ích</translation>
 <translation id="8116483400482790018">Từ điển chính tả tùy chỉnh</translation>
 <translation id="1343517687228689568">Bỏ ghim trang này khỏi màn hình Bắt đầu...</translation>
-<translation id="9123104177314065219">Cho phép sử dụng thông tin Google để nhập tên và biểu tượng tiểu sử vào menu hình đại diện.</translation>
+<translation id="9123104177314065219">Cho phép sử dụng thông tin Google để nhập tên và biểu tượng hồ sơ vào menu hình đại diện.</translation>
 <translation id="3188366215310983158">Đang xác thực...</translation>
 <translation id="2177950615300672361">Tab ẩn danh: <ph name="TAB_NAME"/></translation>
 <translation id="5457113250005438886">Không hợp lệ</translation>
 <translation id="5185403602014064051">Tính năng này cho phép bạn truy cập nhanh bất kỳ người dùng đã đăng nhập nào mà không cần mật khẩu.</translation>
-<translation id="8852742364582744935">Các ứng dụng và tiện ích mở rộng sau đã được thêm:</translation>
+<translation id="8852742364582744935">Các ứng dụng và tiện ích sau đã được thêm:</translation>
 <translation id="2916073183900451334">Bấm Tab trên liên kết đánh dấu của trang web, cũng như các trường biểu mẫu</translation>
 <translation id="7772127298218883077">Giới thiệu về <ph name="PRODUCT_NAME"/></translation>
 <translation id="2090876986345970080">Cài đặt bảo mật hệ thống</translation>
@@ -1974,7 +1974,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="3475447146579922140">Bảng tính Google</translation>
 <translation id="6856526171412069413">Bật thu hẹp phạm vi.</translation>
 <translation id="9219103736887031265">Hình ảnh</translation>
-<translation id="3207538738351718781">Tiện ích mở rộng này có thể đã bị hỏng do phần mềm độc hại.</translation>
+<translation id="3207538738351718781">Tiện ích này có thể đã bị hỏng do phần mềm độc hại.</translation>
 <translation id="6655458902729017087">Ẩn tài khoản</translation>
 <translation id="5545687460454274870">Tắt phát hiện thiết bị trên mạng cục bộ.</translation>
 <translation id="6975147921678461939">Đang sạc pin: <ph name="PRECENTAGE"/>%</translation>
@@ -2062,7 +2062,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="5399158067281117682">Các mã PIN không khớp!</translation>
 <translation id="6277105963844135994">Hết thời gian chờ mạng</translation>
 <translation id="6731255991101203740">Không thể tạo thư mục để giải nén: '<ph name="DIRECTORY_PATH"/>'</translation>
-<translation id="3816846830151612068">Bạn có tin tưởng tiện ích mở rộng để sử dụng những đặc quyền này một cách an toàn không?</translation>
+<translation id="3816846830151612068">Bạn có tin tưởng tiện ích để sử dụng những đặc quyền này một cách an toàn không?</translation>
 <translation id="7885253890047913815">Máy in đích gần đây</translation>
 <translation id="3646789916214779970">Đặt lại về chủ đề mặc định</translation>
 <translation id="9220525904950070496">Xóa tài khoản</translation>
@@ -2133,7 +2133,7 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="7910768399700579500">&amp;Thư mục mới</translation>
 <translation id="7472639616520044048">Loại MIME:</translation>
 <translation id="6533019874004191247">URL không được hỗ trợ.</translation>
-<translation id="1476758165362135857">Có, tôi tin tưởng tiện ích mở rộng này!</translation>
+<translation id="1476758165362135857">Có, tôi tin tưởng tiện ích này!</translation>
 <translation id="3192947282887913208">Tệp âm thanh</translation>
 <translation id="5422781158178868512">Rất tiếc, thiết bị lưu trữ bên ngoài của bạn không thể nhận dạng được.</translation>
 <translation id="6295535972717341389">Plug-in</translation>
@@ -2151,10 +2151,10 @@ Sau khi tạo người dùng được giám sát mới, bạn có thể quản l
 <translation id="197288927597451399">Giữ</translation>
 <translation id="5880867612172997051">Quyền truy cập mạng bị treo</translation>
 <translation id="5495466433285976480">Quá trình này sẽ xóa tất cả dữ liệu, tệp, người dùng cục bộ và các cài đặt khác sau khi bạn khởi động lại vào lần kế tiếp. Tất cả người dùng sẽ cần đăng nhập lại.</translation>
-<translation id="7842346819602959665">Phiên bản mới nhất của tiện ích mở rộng &quot;<ph name="EXTENSION_NAME"/>&quot; yêu cầu được cấp thêm quyền; do đó nó đã bị vô hiệu hóa.</translation>
+<translation id="7842346819602959665">Phiên bản mới nhất của tiện ích &quot;<ph name="EXTENSION_NAME"/>&quot; yêu cầu được cấp thêm quyền; do đó nó đã bị vô hiệu hóa.</translation>
 <translation id="3776667127601582921">Trong trường hợp này, chứng chỉ máy chủ hoặc một chứng chỉ CA trung gian cấp cho trình duyệt của bạn không hợp lệ. Điều này có thể nghĩa là chứng chỉ không đúng định dạng, chứa các trường không hợp lệ hoặc không được hỗ trợ.</translation>
 <translation id="2412835451908901523">Vui lòng nhập Khóa mở mã PIN gồm 8 chữ số do <ph name="CARRIER_ID"/> cung cấp.</translation>
-<translation id="25770266525034120">URL tiện ích mở rộng</translation>
+<translation id="25770266525034120">URL tiện ích</translation>
 <translation id="7548916768233393626">Buộc chế độ DPI cao</translation>
 <translation id="33562952999632466">DevTools yêu cầu toàn quyền truy cập vào <ph name="FOLDER_PATH"/>.
 Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm nào.</translation>
@@ -2162,7 +2162,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="7019805045859631636">Nhanh</translation>
 <translation id="4880520557730313061">Tự động sửa</translation>
 <translation id="6122589160611523048">Có lừa đảo trực tuyến!</translation>
-<translation id="8049913480579063185">Tên tiện ích mở rộng</translation>
+<translation id="8049913480579063185">Tên tiện ích</translation>
 <translation id="7584802760054545466">Đang kết nối đến <ph name="NETWORK_ID"/></translation>
 <translation id="9088175547465404130">Đây là người dùng được giám sát do <ph name="CUSTODIAN_EMAIL"/> quản lý.</translation>
 <translation id="7733391738235763478">(<ph name="NUMBER_VISITS"/>)</translation>
@@ -2260,14 +2260,14 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="1383876407941801731">Tìm kiếm</translation>
 <translation id="23362385947277794">Màu nền và hình nền</translation>
 <translation id="409579654357498729">Thêm vào Cloud Print</translation>
-<translation id="2120316813730635488">Số lần cài đặt một tiện ích mở rộng</translation>
+<translation id="2120316813730635488">Số lần cài đặt một tiện ích</translation>
 <translation id="8398877366907290961">Tiếp tục truy cập</translation>
 <translation id="5063180925553000800">Mã PIN mới:</translation>
 <translation id="4883178195103750615">Xuất dấu trang sang tệp  HTML...</translation>
 <translation id="2496540304887968742">Thiết bị phải có dung lượng 4 GB hoặc cao hơn.</translation>
 <translation id="6974053822202609517">Phải sang Trái</translation>
 <translation id="3752673729237782832">Thiết bị của tôi</translation>
-<translation id="1552752544932680961">Quản lý tiện ích mở rộng</translation>
+<translation id="1552752544932680961">Quản lý tiện ích</translation>
 <translation id="2370882663124746154">Bật chế độ Double-Pinyin</translation>
 <translation id="3967885517199024316">Đăng nhập để nhận dấu trang, lịch sử và cài đặt trên tất cả các thiết bị của bạn.</translation>
 <translation id="5463856536939868464">Menu chứa các dấu trang bị ẩn</translation>
@@ -2283,7 +2283,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="457386861538956877">Thêm...</translation>
 <translation id="9210991923655648139">Có thể truy cập vào tập lệnh:</translation>
 <translation id="3898521660513055167">Trạng thái mã thông báo</translation>
-<translation id="1950295184970569138">* Ảnh tiểu sử trên Google (đang tải)</translation>
+<translation id="1950295184970569138">* Ảnh hồ sơ trên Google (đang tải)</translation>
 <translation id="8063491445163840780">Kích hoạt tab 4</translation>
 <translation id="7939997691108949385">Người quản lý có thể định cấu hình các giới hạn và cài đặt cho người dùng bị giám sát này tại <ph name="MANAGEMENT_URL"/>.</translation>
 <translation id="2322193970951063277">Đầu trang và chân trang</translation>
@@ -2320,7 +2320,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8264718194193514834">&quot;<ph name="EXTENSION_NAME"/>&quot; đã kích hoạt chế độ toàn màn hình.</translation>
 <translation id="6223447490656896591">Hình tùy chỉnh:</translation>
 <translation id="6362853299801475928">&amp;Báo cáo sự cố...</translation>
-<translation id="5527463195266282916">Cố gắng hạ cấp tiện ích mở rộng.</translation>
+<translation id="5527463195266282916">Cố gắng hạ cấp tiện ích.</translation>
 <translation id="3289566588497100676">Nhập biểu tượng đơn giản</translation>
 <translation id="6507969014813375884">Chinese Simplified</translation>
 <translation id="7341982465543599097">rất ngắn</translation>
@@ -2364,7 +2364,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
     từ màn hình đăng nhập. Sau đó, bạn có thể đăng xuất khỏi tài khoản Google của mình và
     thử tạo lại người dùng được giám sát.</translation>
 <translation id="6644715561133361290">Bật hoặc tắt bằng cách sử dụng phiên bản phát triển của proxy giảm bớt dữ liệu</translation>
-<translation id="3530279468460174821">Tắt tiện ích mở rộng thành phần của Quickoffice cho mục đích thử nghiệm.</translation>
+<translation id="3530279468460174821">Tắt tiện ích thành phần của Quickoffice cho mục đích thử nghiệm.</translation>
 <translation id="3578308799074845547">Kích hoạt mục trình chạy 7</translation>
 <translation id="2956070106555335453">Tổng hợp</translation>
 <translation id="917450738466192189">Chứng chỉ của máy chủ không hợp lệ.</translation>
@@ -2416,7 +2416,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8870318296973696995">Trang chủ</translation>
 <translation id="6659594942844771486">Tab</translation>
 <translation id="8283475148136688298">Mã xác thực bị từ chối trong khi kết nối với &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
-<translation id="6194025908252121648">Không thể nhập tiện ích mở rộng có ID &quot;<ph name="IMPORT_ID"/>&quot; do tiện ích mở rộng không phải là mô-đun được chia sẻ.</translation>
+<translation id="6194025908252121648">Không thể nhập tiện ích có ID &quot;<ph name="IMPORT_ID"/>&quot; do tiện ích không phải là mô-đun được chia sẻ.</translation>
 <translation id="3491170932824591984">Danh tính của trang web này đã được xác minh bởi <ph name="ISSUER"/> nhưng xác minh hồ sơ kiểm toán công khai lại không thành công.</translation>
 <translation id="6575134580692778371">Chưa được định cấu hình</translation>
 <translation id="4624768044135598934">Thành công!</translation>
@@ -2542,7 +2542,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="7503191893372251637">Loại Chứng chỉ Netscape</translation>
 <translation id="4135450933899346655">Chứng chỉ của bạn</translation>
 <translation id="971774202801778802">URL dấu trang</translation>
-<translation id="3979395879372752341">Ä\90ã thêm tiá»\87n Ã­ch má»\9f rá»\99ng má»\9bi (<ph name="EXTENSION_NAME"/>)</translation>
+<translation id="3979395879372752341">Đã thêm tiện ích mới (<ph name="EXTENSION_NAME"/>)</translation>
 <translation id="2609632851001447353">Các biến thể</translation>
 <translation id="2127166530420714525">Không thể thay đổi trạng thái nguồn của bộ điều hợp Bluetooth.</translation>
 <translation id="2765718175690078089">Bật ứng dụng được lưu trữ hợp lý cho mục đích thử nghiệm.</translation>
@@ -2677,7 +2677,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6256412060882652702">Powerwash thiết bị <ph name="IDS_SHORT_PRODUCT_NAME"/> của bạn</translation>
 <translation id="736515969993332243">Đang quét mạng.</translation>
 <translation id="7806513705704909664">Bật Tự động điền để điền các biểu mẫu web bằng một nhấp chuột duy nhất.</translation>
-<translation id="3150994199788134383">Một tiện ích mở rộng đã chiếm quyền kiểm soát cài đặt proxy của bạn, điều đó có nghĩa là tiện ích mở rộng này có thể thay đổi, làm gián đoạn hoặc nghe trộm bất kỳ điều gì bạn thực hiện trực tuyến. Nếu bạn không chắc chắn về lý do thay đổi này diễn ra, bạn có thể không cần tiện ích mở rộng này.</translation>
+<translation id="3150994199788134383">Một tiện ích đã chiếm quyền kiểm soát cài đặt proxy của bạn, điều đó có nghĩa là tiện ích này có thể thay đổi, làm gián đoạn hoặc nghe trộm bất kỳ điều gì bạn thực hiện trực tuyến. Nếu bạn không chắc chắn về lý do thay đổi này diễn ra, bạn có thể không cần tiện ích này.</translation>
 <translation id="8026334261755873520">Xóa dữ liệu duyệt web</translation>
 <translation id="605011065011551813">Plugin (<ph name="PLUGIN_NAME"/>) hiện không phản hồi.</translation>
 <translation id="1467432559032391204">Trái</translation>
@@ -2706,11 +2706,11 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="4262113024799883061">Tiếng Trung</translation>
 <translation id="3478315065074101056">XPS bật tùy chọn nâng cao cho máy in cổ điển được kết nối với Cloud Print bằng Chrome. Máy in phải được kết nối lại sau khi thay đổi cờ này.</translation>
 <translation id="1744108098763830590">trang nền</translation>
-<translation id="5575473780076478375">Tiện ích mở rộng Ẩn danh: <ph name="EXTENSION_NAME"/></translation>
+<translation id="5575473780076478375">Tiện ích Ẩn danh: <ph name="EXTENSION_NAME"/></translation>
 <translation id="2040822234646148327">Bật tính năng Nền tảng web thử nghiệm.</translation>
 <translation id="1932240834133965471">Các cài đặt này thuộc về <ph name="OWNER_EMAIL"/>.</translation>
 <translation id="271033894570825754">Mới</translation>
-<translation id="2585116156172706706">Tiện ích mở rộng này có thể đã được thêm mà bạn không biết.</translation>
+<translation id="2585116156172706706">Tiện ích này có thể đã được thêm mà bạn không biết.</translation>
 <translation id="56907980372820799">Liên kết dữ liệu</translation>
 <translation id="2780046210906776326">Ko có TK email nào</translation>
 <translation id="2111843886872897694">Ứng dụng phải được cung cấp từ máy chủ lưu trữ mà chúng ảnh hưởng.</translation>
@@ -2728,7 +2728,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="1658424621194652532">Trang này đang truy cập micrô của bạn.</translation>
 <translation id="3355823806454867987">Thay đổi cài đặt proxy...</translation>
 <translation id="3569382839528428029">Bạn có muốn <ph name="APP_NAME"/> chia sẻ màn hình của bạn không?</translation>
-<translation id="4780374166989101364">Bật API tiện ích mở rộng thử nghiệm. Xin lưu ý rằng thư viện tiện ích mở rộng không cho phép bạn tải lên tiện ích mở rộng sử dụng API thử nghiệm.</translation>
+<translation id="4780374166989101364">Bật API tiện ích thử nghiệm. Xin lưu ý rằng thư viện tiện ích không cho phép bạn tải lên tiện ích sử dụng API thử nghiệm.</translation>
 <translation id="7117247127439884114">Đăng nhập lại...</translation>
 <translation id="2932960728421974162">Không thể kết nối với <ph name="SITE"/> thực</translation>
 <translation id="509429900233858213">Đã xảy ra lỗi.</translation>
@@ -2766,7 +2766,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="9088917181875854783">Vui lòng xác nhận mã xác nhận này được hiển thị trên &quot;<ph name="DEVICE_NAME"/>&quot;:</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="5236831943526452400">Xóa cookie và dữ liệu trang web khác khi bạn đóng trình duyệt</translation>
-<translation id="1558834950088298812">Số lần cập nhật một tiện ích mở rộng</translation>
+<translation id="1558834950088298812">Số lần cập nhật một tiện ích</translation>
 <translation id="8410619858754994443">Xác nhận mật khẩu:</translation>
 <translation id="2400837204278978822">Loại tệp không xác định.</translation>
 <translation id="8987927404178983737">Tháng</translation>
@@ -2808,7 +2808,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="7469237359338869056">Tìm lại văn bản</translation>
 <translation id="8053390638574070785">Tải lại Trang Này</translation>
 <translation id="5507756662695126555">Không tuân thủ</translation>
-<translation id="3678156199662914018">Tiện ích mở rộng: <ph name="EXTENSION_NAME"/></translation>
+<translation id="3678156199662914018">Tiện ích: <ph name="EXTENSION_NAME"/></translation>
 <translation id="2620090360073999360">Không thể kết nối với Google Drive tại thời điểm này.</translation>
 <translation id="725387188884494207">Bạn có chắc chắn muốn xóa người dùng này và tất cả dữ liệu được liên kết với người dùng đó khỏi máy tính này không? Thao tác này không thể hoàn tác!</translation>
 <translation id="3531250013160506608">Hộp văn bản nhập mật khẩu</translation>
@@ -2836,7 +2836,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3944266449990965865">Toàn màn hình</translation>
 <translation id="942954117721265519">Không có hình ảnh nào trong thư mục này.</translation>
 <translation id="671928215901716392">Khóa màn hình</translation>
-<translation id="2241468422635044128">Được cho phép bởi tiện ích mở rộng</translation>
+<translation id="2241468422635044128">Được cho phép bởi tiện ích</translation>
 <translation id="3727187387656390258">Kiểm tra cửa sổ bật lên</translation>
 <translation id="361106536627977100">Dữ liệu Flash</translation>
 <translation id="569068482611873351">Nhập...</translation>
@@ -2848,7 +2848,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="7922282834014874897"><ph name="SITE_NAME"/> muốn sử dụng:</translation>
 <translation id="6192792657125177640">Ngoại lệ</translation>
 <translation id="5622158329259661758">Vô hiệu hóa việc sử dụng GPU để thực hiện kết xuất canvas 2d, thay vào đó sử dụng kết xuất phần mềm.</translation>
-<translation id="8670869118777164560">Tiện ích mở rộng này không thể chuyển hướng yêu cầu mạng đến <ph name="ATTEMPTED_REDIRECT_DESTINATION"/> do tiện ích mở rộng khác (<ph name="EXTENSION_NAME"/>) đã chuyển hướng yêu cầu mạng này đến <ph name="ACTUAL_REDIRECT_DESTINATION"/>.</translation>
+<translation id="8670869118777164560">Tiện ích này không thể chuyển hướng yêu cầu mạng đến <ph name="ATTEMPTED_REDIRECT_DESTINATION"/> do tiện ích khác (<ph name="EXTENSION_NAME"/>) đã chuyển hướng yêu cầu mạng này đến <ph name="ACTUAL_REDIRECT_DESTINATION"/>.</translation>
 <translation id="3654092442379740616">Lỗi đồng bộ hóa:  <ph name="PRODUCT_NAME"/> đã cũ và cần được cập nhật.</translation>
 <translation id="790040513076446191">Thực hiện cài đặt liên quan đến bảo mật</translation>
 <translation id="7260002739296185724">Bật sử dụng AV Foundation để quay video và giám sát thiết bị video trên OS X &gt;= 10.7. Thay vào đó, QTKit sẽ được sử dụng.</translation>
@@ -2906,7 +2906,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="872451400847464257">Chỉnh sửa Công cụ Tìm kiếm</translation>
 <translation id="5512653252560939721">Chứng chỉ người dùng phải được phần cứng hỗ trợ.</translation>
 <translation id="5372529912055771682">Chế độ đăng ký đã cung cấp không được phiên bản hệ điều hành này hỗ trợ. Hãy đảm bảo bạn đang chạy phiên bản mới nhất và thử lại.</translation>
-<translation id="3288047731229977326">Tiện ích mở rộng chạy ở chế độ nhà phát triển có thể gây hại cho máy tính của bạn. Nếu bạn không phải là nhà phát triển, bạn nên vô hiệu hóa các tiện ích mở rộng này chạy trong chế độ nhà phát triển để giữ an toàn.</translation>
+<translation id="3288047731229977326">Tiện ích chạy ở chế độ nhà phát triển có thể gây hại cho máy tính của bạn. Nếu bạn không phải là nhà phát triển, bạn nên vô hiệu hóa các tiện ích này chạy trong chế độ nhà phát triển để giữ an toàn.</translation>
 <translation id="474031007102415700">Kiểm tra mọi cáp và khởi động lại mọi bộ định tuyến, modem hoặc các
         thiết bị mạng khác mà bạn có thể sẽ dùng.</translation>
 <translation id="5681833099441553262">Kích hoạt tab trước đó</translation>
@@ -2919,9 +2919,9 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="515594325917491223">Cờ vua</translation>
 <translation id="1594155067816010104">Tệp này sẽ làm hại máy tính của bạn.</translation>
 <translation id="3378503599595235699">Chỉ lưu dữ liệu cục bộ cho đến khi bạn thoát trình duyệt của mình</translation>
-<translation id="8047248493720652249">Tiện ích mở rộng này không thể đặt tên cho bản tải xuống &quot;<ph name="ATTEMPTED_FILENAME"/>&quot; vì một tiện ích mở rộng khác (<ph name="EXTENSION_NAME"/>) đã xác định tên tệp khác &quot;<ph name="ACTUAL_FILENAME"/>&quot;.</translation>
+<translation id="8047248493720652249">Tiện ích này không thể đặt tên cho bản tải xuống &quot;<ph name="ATTEMPTED_FILENAME"/>&quot; vì một tiện ích khác (<ph name="EXTENSION_NAME"/>) đã xác định tên tệp khác &quot;<ph name="ACTUAL_FILENAME"/>&quot;.</translation>
 <translation id="5605830556594064952">Dvorak Hoa Kỳ</translation>
-<translation id="7347751611463936647">Để sử dụng tiện ích mở rộng này, nhập &quot;<ph name="EXTENSION_KEYWORD"/>&quot;, sau đó nhấn TAB rồi câu lệnh hoặc tìm kiếm của bạn.</translation>
+<translation id="7347751611463936647">Để sử dụng tiện ích này, nhập &quot;<ph name="EXTENSION_KEYWORD"/>&quot;, sau đó nhấn TAB rồi câu lệnh hoặc tìm kiếm của bạn.</translation>
 <translation id="878431691778285679">Có vẻ như bạn đang quản lý người dùng có tên đó.<ph name="LINE_BREAK"/>Bạn có muốn <ph name="BEGIN_LINK"/>nhập<ph name="PROFILE_NAME"/> vào thiết bị này<ph name="END_LINK"/> không?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> muốn sử dụng micrô của bạn.</translation>
 <translation id="2805756323405976993">Ứng dụng</translation>
@@ -2953,10 +2953,10 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="7136984461011502314">Chào mừng bạn đến với <ph name="PRODUCT_NAME"/></translation>
 <translation id="1826516787628120939">Đang kiểm tra</translation>
 <translation id="204497730941176055">Tên Mẫu Chứng chỉ của Microsoft</translation>
-<translation id="992032470292211616">Tiện ích mở rộng, ứng dụng và chủ đề có thể gây hại cho thiết bị của bạn. Bạn có chắc chắn muốn tiếp tục không?</translation>
-<translation id="2665919335226618153">Rất tiếc! Đã xảy ra lỗi trong khi định dạng.</translation>
+<translation id="992032470292211616">Tiện ích, ứng dụng và chủ đề có thể gây hại cho thiết bị của bạn. Bạn có chắc chắn muốn tiếp tục không?</translation>
+<translation id="2665919335226618153">Ôi, hỏng! Đã xảy ra lỗi trong khi định dạng.</translation>
 <translation id="5930693802084567591">Dữ liệu của bạn đã được mã hóa với mật khẩu Google của bạn kể từ <ph name="TIME"/>. Vui lòng nhập mật khẩu đó dưới đây.</translation>
-<translation id="4087089424473531098">Đã tạo tiện ích mở rộng:
+<translation id="4087089424473531098">Đã tạo tiện ích:
 
 <ph name="EXTENSION_FILE"/></translation>
 <translation id="499165176004408815">Sử dụng chế độ tương phản cao</translation>
@@ -2967,7 +2967,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="247500748408468353">Hãy liên hệ với quản trị viên của bạn hoặc thử lại.</translation>
 <translation id="450070808725753129">Nếu chương trình đã được liệt kê là chương trình được phép truy cập mạng, hãy thử
         xóa chương trình đó khỏi danh sách và thêm chương trình một lần nữa.</translation>
-<translation id="778627899913883287">Hãy chắc chắn những đặc quyền này hợp lý với những gì bạn cho rằng tiện ích mở rộng cần làm. Nếu không, hãy nhấn Hủy.</translation>
+<translation id="778627899913883287">Hãy chắc chắn những đặc quyền này hợp lý với những gì bạn cho rằng tiện ích cần làm. Nếu không, hãy nhấn Hủy.</translation>
 <translation id="4742746985488890273">Ghim vào giá</translation>
 <translation id="8074984796671539016">Bật nút tải bản sao cũ ngoại tuyến</translation>
 <translation id="1113869188872983271">&amp;Hoàn tác sắp xếp lại</translation>
@@ -2981,14 +2981,14 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3113551216836192921">Tệp đính kèm được tải lên máy chủ Google để gỡ lỗi.</translation>
 <translation id="2498765460639677199">Rất lớn</translation>
 <translation id="4801448226354548035">Ẩn tài khoản</translation>
-<translation id="2378982052244864789">Chọn thư mục tiện ích mở rộng.</translation>
+<translation id="2378982052244864789">Chọn thư mục tiện ích.</translation>
 <translation id="7861215335140947162">&amp;Tải xuống</translation>
 <translation id="1358735829858566124">Không thể sử dụng được tệp hoặc thư mục.</translation>
 <translation id="175772926354468439">Bật chủ đề</translation>
 <translation id="3144135466825225871">Không thể thay thế tệp crx. Kiểm tra để xem tệp có đang được sử dụng hay không.</translation>
 <translation id="2744221223678373668">Được chia sẻ</translation>
-<translation id="9064142312330104323">Ảnh tiểu sử trên Google (đang tải)</translation>
-<translation id="3930617119570072742">Bạn có tin tưởng tiện ích mở rộng này để thực hiện những tác vụ này không?</translation>
+<translation id="9064142312330104323">Ảnh hồ sơ trên Google (đang tải)</translation>
+<translation id="3930617119570072742">Bạn có tin tưởng tiện ích này để thực hiện những tác vụ này không?</translation>
 <translation id="4708849949179781599">Thoát <ph name="PRODUCT_NAME"/></translation>
 <translation id="3752439026432317933">Nhập chi tiết thanh toán...</translation>
 <translation id="4103419683916926126">Mili giây</translation>
@@ -2996,7 +2996,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="9127762771585363996">Lật hình trong máy ảnh theo chiều ngang</translation>
 <translation id="4724450788351008910">Đã thay đổi Liên kết</translation>
 <translation id="2249605167705922988">ví dụ: 1-5, 8, 11-13</translation>
-<translation id="1520505881707245707">Cờ này có thể được sử dụng để xác minh rằng nội dung của tệp trên đĩa dành cho tiện ích mở rộng từ cửa hàng trực tuyến phù hợp với nội dung được mong đợi. Cờ này có thể được sử dụng để bật tính năng này nếu tính năng này chưa được bật nhưng không thể sử dụng để tắt (do cài đặt này có thể bị can thiệp bởi phần mềm độc hại).</translation>
+<translation id="1520505881707245707">Cờ này có thể được sử dụng để xác minh rằng nội dung của tệp trên đĩa dành cho tiện ích từ cửa hàng trực tuyến phù hợp với nội dung được mong đợi. Cờ này có thể được sử dụng để bật tính năng này nếu tính năng này chưa được bật nhưng không thể sử dụng để tắt (do cài đặt này có thể bị can thiệp bởi phần mềm độc hại).</translation>
 <translation id="8572510699242209592">Gigabyte</translation>
 <translation id="8691686986795184760">(Bật bởi chính sách doanh nghiệp)</translation>
 <translation id="878763818693997570">Tên này quá dài</translation>
@@ -3004,14 +3004,14 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6775200426306143288">Đăng nhập bằng tên người dùng do tổ chức cấp cho bạn để đăng ký thiết bị của bạn cho quản lý doanh nghiệp.</translation>
 <translation id="7913678092679498828">OK</translation>
 <translation id="3655670868607891010">Nếu bạn thường xuyên thấy thông báo này, hãy thử các <ph name="HELP_LINK"/> sau.</translation>
-<translation id="4504940961672722399">Sử dụng tiện ích mở rộng này bằng cách nhấp vào biểu tượng này hoặc bằng cách nhấn <ph name="EXTENSION_SHORTCUT"/>.</translation>
+<translation id="4504940961672722399">Sử dụng tiện ích này bằng cách nhấp vào biểu tượng này hoặc bằng cách nhấn <ph name="EXTENSION_SHORTCUT"/>.</translation>
 <translation id="2523966157338854187">Mở một trang cụ thể hoặc tập hợp các trang.</translation>
 <translation id="4176463684765177261">Đã bị vô hiệu</translation>
 <translation id="2483350027598201151">Megabyte</translation>
 <translation id="3880349122676857713">Truy cập bất cứ thứ gì mà bạn nhập</translation>
 <translation id="154603084978752493">Thêm làm côn&amp;g cụ tìm kiếm...</translation>
 <translation id="2079545284768500474">Hoàn tác</translation>
-<translation id="114140604515785785">Thư mục gốc của tiện ích mở rộng:</translation>
+<translation id="114140604515785785">Thư mục gốc của tiện ích:</translation>
 <translation id="3925842537050977900">Bỏ ghim khỏi giá</translation>
 <translation id="6664237456442406323">Rất tiếc, máy tính của bạn được định cấu hình bằng ID phần cứng không đúng định dạng. Điều này ngăn Chrome OS cập nhật các bản vá bảo mật mới nhất và máy tính của bạn <ph name="BEGIN_BOLD"/>có thể bị các cuộc tấn công làm hại<ph name="END_BOLD"/>.</translation>
 <translation id="2707024448553392710">Thành phần đang tải xuống</translation>
@@ -3072,7 +3072,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="761779991806306006">Không có mật khẩu nào được lưu.</translation>
 <translation id="1692602667007917253">Rất tiếc, đã xảy ra lỗi</translation>
 <translation id="3922476559105512920">Sử dụng các thiết bị nối tiếp được gắn vào máy tính của bạn</translation>
-<translation id="1415990189994829608"><ph name="EXTENSION_NAME"/> (ID tiện ích mở rộng &quot;<ph name="EXTENSION_ID"/>&quot;) không được cho phép trong loại phiên này.</translation>
+<translation id="1415990189994829608"><ph name="EXTENSION_NAME"/> (ID tiện ích &quot;<ph name="EXTENSION_ID"/>&quot;) không được cho phép trong loại phiên này.</translation>
 <translation id="7062080924541270064"><ph name="BEGIN_LINK"/>Plugin Native Client<ph name="END_LINK"/> cần được bật để sử dụng tính năng này.</translation>
 <translation id="3613796918523876348">Vẫn khôi phục</translation>
 <translation id="7974087985088771286">Kích hoạt tab 6</translation>
@@ -3141,7 +3141,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6206337697064384582">Máy chủ 1</translation>
 <translation id="8963410529089786787">Phiên bản mới với nền màu xám</translation>
 <translation id="7052633198403197513">F1</translation>
-<translation id="411319158827715214">Các sự kiện liên quan đến mọi tiện ích mở rộng được (hoặc đã được) cài đặt trong <ph name="SHORT_PRODUCT_NAME"/></translation>
+<translation id="411319158827715214">Các sự kiện liên quan đến mọi tiện ích được (hoặc đã được) cài đặt trong <ph name="SHORT_PRODUCT_NAME"/></translation>
 <translation id="7466861475611330213">Kiểu dấu chấm câu</translation>
 <translation id="2496180316473517155">Lịch sử duyệt web</translation>
 <translation id="602251597322198729">Trang web này đang cố tải xuống nhiều tệp. Bạn có muốn thực hiện việc tải xuống này không?</translation>
@@ -3156,9 +3156,9 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5411472733320185105">Không sử dụng cài đặt proxy cho các máy chủ và tên miền này:</translation>
 <translation id="7358682983403815415">Các tab đang mở, dấu trang, lịch sử và nhiều nội dung khác đang được đồng bộ hóa với tài khoản Google của bạn.</translation>
 <translation id="3685121001045880436">Có thể máy chủ lưu trữ trang web đã bị quá tải hoặc gặp lỗi.
-        Nhằm tránh để các tiện ích mở rộng chiếm quá nhiều lưu lượng truy cập và khiến tình trạng tồi tệ hơn,
+        Nhằm tránh để các tiện ích chiếm quá nhiều lưu lượng truy cập và khiến tình trạng tồi tệ hơn,
         <ph name="PRODUCT_NAME"/>
-        đã tạm thời ngừng cho phép các yêu cầu của tiện ích mở rộng tới URL này.
+        đã tạm thời ngừng cho phép các yêu cầu của tiện ích tới URL này.
         <ph name="LINE_BREAK"/>
         Nếu bạn cho rằng điều này là ngoài mong muốn, chẳng hạn như bạn đang gỡ lỗi trang web của riêng mình, vui lòng truy cập <ph name="URL_FOR_MORE_INFO"/>,
         nơi bạn có thể tìm thêm thông tin bao gồm cách tắt tính năng này.</translation>
@@ -3183,7 +3183,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="7582582252461552277">Thích mạng này</translation>
 <translation id="3574305903863751447"><ph name="CITY"/>, <ph name="STATE"/> <ph name="COUNTRY"/></translation>
 <translation id="8724859055372736596">&amp;Hiển thị trong Thư mục</translation>
-<translation id="5990198433782424697">Tiện ích mở rộng trên URL chrome://</translation>
+<translation id="5990198433782424697">Tiện ích trên URL chrome://</translation>
 <translation id="7456142309650173560">nhà phát triển</translation>
 <translation id="4605399136610325267">Chưa được kết nối Internet</translation>
 <translation id="6797493596609571643">Rất tiếc, đã xảy ra lỗi.</translation>
@@ -3193,7 +3193,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
           Bắt đầu &gt; Bảng điều khiển &gt;Kết nối mạng&gt; Trình hướng dẫn kết nối mới
           <ph name="END_BOLD"/>
           để kiểm tra kết nối của bạn.</translation>
-<translation id="5554489410841842733">Biểu tượng này sẽ hiển thị khi tiện ích mở rộng có thể hoạt động trên trang hiện tại.</translation>
+<translation id="5554489410841842733">Biểu tượng này sẽ hiển thị khi tiện ích có thể hoạt động trên trang hiện tại.</translation>
 <translation id="5317217568993504939">Hoặc, chọn một mạng mới</translation>
 <translation id="7487969577036436319">Không có thành phần nào được cài đặt</translation>
 <translation id="8249462233460427882">Tự khởi động (nhận được nội dung băm mong đợi nhưng không thực thi chúng)</translation>
@@ -3232,7 +3232,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6056710589053485679">Tải lại bình thường</translation>
 <translation id="4563210852471260509">Ngôn ngữ nhập vào ban đầu là tiếng Trung</translation>
 <translation id="2888807692577297075">Không có mục nào khớp với <ph name="SEARCH_STRING"/></translation>
-<translation id="3908501907586732282">Bật tiện ích mở rộng</translation>
+<translation id="3908501907586732282">Bật tiện ích</translation>
 <translation id="6897140037006041989">Tác nhân Người dùng</translation>
 <translation id="3413122095806433232">Nhà cung cấp CA: <ph name="LOCATION"/></translation>
 <translation id="701080569351381435">Xem Nguồn</translation>
@@ -3247,7 +3247,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="795025003224538582">Không khởi động lại</translation>
 <translation id="8680787084697685621">Chi tiết đăng nhập tài khoản đã lỗi thời.</translation>
 <translation id="5649823029736413118"><ph name="URL"/> cần nhận dạng duy nhất thiết bị của bạn để phát nội dung trả phí.</translation>
-<translation id="8899285681604219177">Tiện ích mở rộng không được hỗ trợ đã bị tắt</translation>
+<translation id="8899285681604219177">Tiện ích không được hỗ trợ đã bị tắt</translation>
 <translation id="889901481107108152">Rất tiếc, thử nghiệm này không sẵn có trên nền tảng của bạn.</translation>
 <translation id="8238191901674777266">Hoa Kỳ</translation>
 <translation id="1873879463550486830">Hộp cát SUID</translation>
@@ -3294,7 +3294,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="7006634003215061422">Lề dưới</translation>
 <translation id="7014174261166285193">Cài đặt không thành công.</translation>
 <translation id="1970746430676306437">Xem thông t&amp;in trang</translation>
-<translation id="4384652540891215547">Kích hoạt tiện ích mở rộng</translation>
+<translation id="4384652540891215547">Kích hoạt tiện ích</translation>
 <translation id="9133055936679483811">Nén không thành công. <ph name="ERROR_MESSAGE"/></translation>
 <translation id="2718998670920917754">Phần mềm chống vi-rút đã phát hiện thấy một vi-rút.</translation>
 <translation id="3199127022143353223">Máy chủ</translation>
@@ -3303,15 +3303,15 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6607831829715835317">Côn&amp;g cụ khác</translation>
 <translation id="2532589005999780174">Chế độ tương phản cao</translation>
 <translation id="2805646850212350655">Hệ thống Tệp Mã hóa của Microsoft</translation>
-<translation id="2643698698624765890">Quản lý tiện ích mở rộng của bạn bằng cách nhấp vào Tiện ích mở rộng trong menu Cửa sổ.</translation>
+<translation id="2643698698624765890">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu Cửa sổ.</translation>
 <translation id="4846680374085650406">Bạn đang theo khuyến cáo của quản trị viên về cài đặt này.</translation>
 <translation id="1974060860693918893">Nâng cao</translation>
 <translation id="4509017836361568632">Hủy ảnh</translation>
-<translation id="1244303850296295656">Lỗi tiện ích mở rộng</translation>
+<translation id="1244303850296295656">Lỗi tiện ích</translation>
 <translation id="3541661933757219855">Nhấn Ctrl+Alt+/ hoặc Escape để ẩn</translation>
 <translation id="2948300991547862301">Truy cập <ph name="PAGE_TITLE"/></translation>
 <translation id="5357579842739549440">Gỡ lỗi phím tắt</translation>
-<translation id="4284834956062510583">Đã gỡ cài đặt tiện ích mở rộng</translation>
+<translation id="4284834956062510583">Đã gỡ cài đặt tiện ích</translation>
 <translation id="3660234220361471169">Không đáng tin cậy</translation>
 <translation id="2679385451463308372">In bằng hộp thoại hệ thống...</translation>
 <translation id="959890390740139744">Tự động sửa lỗi chính tả</translation>
@@ -3329,7 +3329,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5894253024636469711">Bật chế độ xem toàn màn hình được đơn giản hóa.</translation>
 <translation id="6325191661371220117">Tắt tính năng tự động chạy</translation>
 <translation id="6817358880000653228">Đã lưu mật khẩu cho trang web này:</translation>
-<translation id="4613271546271159013">Tiện ích mở rộng đã thay đổi trang nào sẽ được hiển thị khi bạn mở một tab mới.</translation>
+<translation id="4613271546271159013">Tiện ích đã thay đổi trang nào sẽ được hiển thị khi bạn mở một tab mới.</translation>
 <translation id="351152300840026870">Phông chữ có chiều rộng cố định</translation>
 <translation id="4301786491084298653">Tắt trên <ph name="DOMAIN"/></translation>
 <translation id="5827266244928330802">Safari</translation>
@@ -3377,10 +3377,10 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5227808808023563348">Tìm văn bản trước đó</translation>
 <translation id="4561162271279554092">Tắt tính năng liệt kê thiết bị WebRTC.</translation>
 <translation id="3012917896646559015">Vui lòng liên hệ ngay với nhà sản xuất phần cứng của bạn để gửi máy tính đến cơ sở sửa chữa.</translation>
-<translation id="3694678678240097321">Yêu cầu có sự đồng ý của người dùng để tiện ích mở rộng chạy tập lệnh trên trang, nếu tiện ích mở rộng đó yêu cầu quyền chạy trên tất cả các url.</translation>
+<translation id="3694678678240097321">Yêu cầu có sự đồng ý của người dùng để tiện ích chạy tập lệnh trên trang, nếu tiện ích đó yêu cầu quyền chạy trên tất cả các url.</translation>
 <translation id="902638246363752736">Cài đặt bàn phím</translation>
 <translation id="7925686952655276919">Không sử dụng dữ liệu di động để đồng bộ hóa</translation>
-<translation id="8014914694548037591">Tiện ích mở rộng này có thể đọc và thay đổi thông tin của bạn trên tất cả trang web bao gồm cả Google, Facebook, Yahoo, v.v.</translation>
+<translation id="8014914694548037591">Tiện ích này có thể đọc và thay đổi thông tin của bạn trên tất cả trang web bao gồm cả Google, Facebook, Yahoo, v.v.</translation>
 <translation id="6503077044568424649">Truy cập nhiều nhất</translation>
 <translation id="9016164105820007189">Đang kết nối với &quot;<ph name="DEVICE_NAME"/>&quot;.</translation>
 <translation id="7168109975831002660">Kích thước phông chữ tối thiểu</translation>
@@ -3443,7 +3443,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="4916657783933881060">Điều này có nghĩa là gì?</translation>
 <translation id="5851868085455377790">Nhà cung cấp</translation>
 <translation id="3549797760399244642">Truy cập drive.google.com...</translation>
-<translation id="1704148620735921991">Sau khi cài đặt, tiện ích mở rộng này có khả năng sử dụng những đặc quyền này để thực hiện những điều gây hại đến trải nghiệm duyệt web của bạn. Bạn có chắc chắn muốn cài đặt tiện ích mở rộng này không?</translation>
+<translation id="1704148620735921991">Sau khi cài đặt, tiện ích này có khả năng sử dụng những đặc quyền này để thực hiện những điều gây hại đến trải nghiệm duyệt web của bạn. Bạn có chắc chắn muốn cài đặt tiện ích này không?</translation>
 <translation id="1470719357688513792">Cài đặt cookie mới sẽ có hiệu lực sau khi tải lại trang.</translation>
 <translation id="5578327870501192725">Kết nối của bạn đến <ph name="DOMAIN"/> được mã hóa bằng mã <ph name="BIT_COUNT"/>-bit.</translation>
 <translation id="699220179437400583">Tự động báo cáo với Google chi tiết về sự cố bảo mật có thể xảy ra</translation>
@@ -3483,9 +3483,9 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5731247495086897348">Dá&amp;n và Truy cập</translation>
 <translation id="6426993025560594914">Tất cả các thử nghiệm đều khả dụng trên nền tảng của bạn!</translation>
 <translation id="1834560242799653253">Hướng:</translation>
-<translation id="6440616190620341629">Bật giải mã không kết hợp trong MediaDrm theo mặc định cho Tiện ích mở rộng phương tiện đã mã hóa.</translation>
+<translation id="6440616190620341629">Bật giải mã không kết hợp trong MediaDrm theo mặc định cho Tiện ích phương tiện đã mã hóa.</translation>
 <translation id="7185025270390719314">Đọc và sửa đổi tất cả dữ liệu của bạn trên máy tính và các trang web bạn truy cập</translation>
-<translation id="8353683614194668312">Tiện ích mở rộng/ứng dụng có thể:</translation>
+<translation id="8353683614194668312">Tiện ích/ứng dụng có thể:</translation>
 <translation id="1047956942837015229">Đang xóa <ph name="COUNT"/> mục...</translation>
 <translation id="1531961661616401172">Bật Thông báo được đồng bộ hóa thử nghiệm.</translation>
 <translation id="7361039089383199231">$1 byte</translation>
@@ -3533,7 +3533,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6938369162930547262">Những kẻ tấn công hiện đang truy cập <ph name="BEGIN_BOLD"/><ph name="SITE"/><ph name="END_BOLD"/> có thể cố gắng cài đặt các chương trình nguy hiểm trên thiết bị của bạn. Các chương trình này sẽ đánh cắp hoặc xóa thông tin của bạn (ví dụ: ảnh, mật khẩu, thư và thẻ tín dụng).</translation>
 <translation id="1199232041627643649">Giữ <ph name="KEY_EQUIVALENT"/> để thoát.</translation>
 <translation id="5428562714029661924">Ẩn plugin này</translation>
-<translation id="3777806571986431400">Đã bật tiện ích mở rộng</translation>
+<translation id="3777806571986431400">Đã bật tiện ích</translation>
 <translation id="2568774940984945469">Bộ chứa Thanh thông tin</translation>
 <translation id="8971063699422889582">Chứng chỉ của máy chủ đã hết hạn.</translation>
 <translation id="3672681487849735243">Đã phát hiện lỗi khi xuất xưởng</translation>
@@ -3551,10 +3551,10 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="1114901192629963971">Mật khẩu của bạn không thể xác minh được trên mạng hiện tại này. Vui lòng chọn mạng khác.</translation>
 <translation id="6430814529589430811">ASCII được mã hóa base64, chứng chỉ đơn</translation>
 <translation id="3305661444342691068">Mở PDF ở chế độ xem trước</translation>
-<translation id="329650768420594634">Cảnh báo đóng gói tiện ích mở rộng</translation>
+<translation id="329650768420594634">Cảnh báo đóng gói tiện ích</translation>
 <translation id="8363095875018065315">chính thức</translation>
 <translation id="5143712164865402236">Vào Chế độ Toàn Màn hình</translation>
-<translation id="2575247648642144396">Biểu tượng này sẽ hiển thị khi tiện ích mở rộng có thể hoạt động trên trang hiện tại. Sử dụng tiện ích mở rộng này bằng cách nhấp vào biểu tượng hoặc bằng cách nhấn <ph name="EXTENSION_SHORTCUT"/>.</translation>
+<translation id="2575247648642144396">Biểu tượng này sẽ hiển thị khi tiện ích có thể hoạt động trên trang hiện tại. Sử dụng tiện ích này bằng cách nhấp vào biểu tượng hoặc bằng cách nhấn <ph name="EXTENSION_SHORTCUT"/>.</translation>
 <translation id="8434177709403049435">&amp;Mã hóa</translation>
 <translation id="8757803915342932642">Thiết bị trên Google Cloud Devices</translation>
 <translation id="1196849605089373692">Chỉ định cài đặt chất lượng cho hình ảnh được chụp nếu giảm tỷ lệ.</translation>
@@ -3562,11 +3562,11 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3810838688059735925">Video</translation>
 <translation id="2747011872211212100">Máy in mới trên mạng của bạn</translation>
 <translation id="2028531481946156667">Không thể bắt đầu quá trình định dạng.</translation>
-<translation id="7439964298085099379">Bạn đã bật chế độ Tương phản cao. Bạn có muốn cài đặt tiện ích mở rộng Tương phản cao của chúng tôi và chủ đề tối không?</translation>
+<translation id="7439964298085099379">Bạn đã bật chế độ Tương phản cao. Bạn có muốn cài đặt tiện ích Tương phản cao của chúng tôi và chủ đề tối không?</translation>
 <translation id="9012607008263791152">Tôi hiểu rằng truy cập vào trang web này có thể gây hại cho máy vi tính của mình.</translation>
 <translation id="6640442327198413730">Không tìm thấy trong bộ nhớ cache</translation>
-<translation id="3788401245189148511">Tiện ích mở rộng/ứng dụng này có thể:</translation>
-<translation id="8926518602592448999">Vô hiệu hóa tiện ích mở rộng chế độ nhà phát triển</translation>
+<translation id="3788401245189148511">Tiện ích/ứng dụng này có thể:</translation>
+<translation id="8926518602592448999">Vô hiệu hóa tiện ích chế độ nhà phát triển</translation>
 <translation id="2902734494705624966">Mở rộng của Hoa Kỳ</translation>
 <translation id="5793220536715630615">Sao &amp;chép URL video</translation>
 <translation id="523397668577733901">Bạn có muốn <ph name="BEGIN_LINK"/>duyệt qua thư viện<ph name="END_LINK"/> thay thế không?</translation>
@@ -3592,7 +3592,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5045550434625856497">Mật khẩu sai</translation>
 <translation id="6397592254427394018">Mở tất cả dấu trang trong &amp;cửa sổ ẩn danh</translation>
 <translation id="8155481074575809396">Nếu được bật, văn bản hiển thị với các trường khoảng cách được đánh dấu thay vì các mặt nạ bitmap alpha.</translation>
-<translation id="27822970480436970">Tiện ích mở rộng này không thể sửa đổi yêu cầu mạng vì việc sửa đổi xung đột với một tiện ích mở rộng khác.</translation>
+<translation id="27822970480436970">Tiện ích này không thể sửa đổi yêu cầu mạng vì việc sửa đổi xung đột với một tiện ích khác.</translation>
 <translation id="2453860139492968684">Kết thúc</translation>
 <translation id="756445078718366910">Mở Cửa sổ Trình duyệt</translation>
 <translation id="6132383530370527946">Bản in nhỏ</translation>
@@ -3608,7 +3608,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8663099077749055505">Luôn chặn nhiều bản tải xuống tự động trên <ph name="HOST"/></translation>
 <translation id="778330624322499012">Không thể tải <ph name="PLUGIN_NAME"/></translation>
 <translation id="9026731007018893674">tải xuống</translation>
-<translation id="3212792897911394068">Tắt phiên bản thử nghiệm của Tiện ích mở rộng phương tiện được mã hóa trên phần tử video và âm thanh.</translation>
+<translation id="3212792897911394068">Tắt phiên bản thử nghiệm của Tiện ích phương tiện được mã hóa trên phần tử video và âm thanh.</translation>
 <translation id="6199775032047436064">Tải lại trang hiện tại</translation>
 <translation id="6981982820502123353">Truy cập</translation>
 <translation id="7210998213739223319">Tên người dùng.</translation>
@@ -3641,7 +3641,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8986494364107987395">Tự động gửi số liệu thống kê về việc sử dụng và báo cáo sự cố cho Google</translation>
 <translation id="2377619091472055321">Đặt lại cài đặt <ph name="IDS_SHORT_PRODUCT_NAME"/> đã thay đổi?</translation>
 <translation id="4062251648694601778">Trải nghiệm thiết bị <ph name="SHORT_PRODUCT_NAME"/> của bạn. Bạn có câu hỏi? Bạn luôn có thể nhận trợ giúp bằng cách nhấp vào &quot;?&quot; trong khay trạng thái.</translation>
-<translation id="6701535245008341853">Không thể tải tiểu sử.</translation>
+<translation id="6701535245008341853">Không thể tải hồ sơ.</translation>
 <translation id="8303655282093186569">Cài đặt phương thức nhập Pinyin</translation>
 <translation id="992779717417561630">In bằng cách sử dụng hộp thoại <ph name="CLOUD_PRINT_NAME"/>... <ph name="SHORTCUT_KEY"/></translation>
 <translation id="1991402313603869273"><ph name="PLUGIN_NAME"/> không được phép.</translation>
@@ -3687,7 +3687,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="2608770217409477136">Sử dụng cài đặt mặc định</translation>
 <translation id="3157931365184549694">Khôi phục</translation>
 <translation id="996250603853062861">Thiết lập kết nối an toàn...</translation>
-<translation id="7529471622666797993"><ph name="BEGIN_LINK"/>Cài đặt phông chữ nâng cao<ph name="END_LINK"/> (yêu cầu tiện ích mở rộng)</translation>
+<translation id="7529471622666797993"><ph name="BEGIN_LINK"/>Cài đặt phông chữ nâng cao<ph name="END_LINK"/> (yêu cầu tiện ích)</translation>
 <translation id="6059232451013891645">Thư mục:</translation>
 <translation id="1233721473400465416">Ngôn ngữ</translation>
 <translation id="7042418530779813870">Dán &amp;và tìm kiếm</translation>
@@ -3700,7 +3700,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3031557471081358569">Chọn các mục cần nhập:</translation>
 <translation id="6728144975495880845">Nếu được bật, chuỗi đường quét sẽ ghi vào bộ nhớ GPU.</translation>
 <translation id="1368832886055348810">Trái sang Phải</translation>
-<translation id="8689102680909215706">Tiện ích mở rộng &quot;<ph name="EXTENSION_NAME"/>&quot; đã được cài đặt từ xa.</translation>
+<translation id="8689102680909215706">Tiện ích &quot;<ph name="EXTENSION_NAME"/>&quot; đã được cài đặt từ xa.</translation>
 <translation id="834106456999819211">Đơn đặt hàng của bạn đang được xử lý</translation>
 <translation id="133014027510889724">Bật giám sát hiệu suất</translation>
 <translation id="3627320433825461852">Còn chưa đến 1 phút</translation>
@@ -3803,7 +3803,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5396704340251753095">Bật chỗ trợ MTP trong Trình quản lý tệp.</translation>
 <translation id="7039912931802252762">Đăng nhập Thẻ Thông minh của Microsoft</translation>
 <translation id="5436430103864390185">Cửa sổ đã định hình không được hỗ trợ.</translation>
-<translation id="1529798832346767951">Dùng thử <ph name="BEGIN_LINK"/>Công cụ dành cho nhà phát triển tiện ích mở rộng và ứng dụng Chrome<ph name="END_LINK"/> mới.</translation>
+<translation id="1529798832346767951">Dùng thử <ph name="BEGIN_LINK"/>Công cụ dành cho nhà phát triển tiện ích và ứng dụng Chrome<ph name="END_LINK"/> mới.</translation>
 <translation id="3915280005470252504">Tìm kiếm bằng giọng nói</translation>
 <translation id="3752582316358263300">OK...</translation>
 <translation id="6224481128663248237">Đã hoàn tất định dạng thành công!</translation>
@@ -3815,12 +3815,12 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8581690024797204327">256</translation>
 <translation id="2491120439723279231">Chứng chỉ của máy chủ có lỗi.</translation>
 <translation id="5765780083710877561">Mô tả:</translation>
-<translation id="1740044382983372319">Đã cài đặt tiện ích mở rộng</translation>
+<translation id="1740044382983372319">Đã cài đặt tiện ích</translation>
 <translation id="338583716107319301">Dấu phân tách</translation>
 <translation id="2079053412993822885">Nếu bạn xóa một trong các chứng chỉ của mình, bạn sẽ không thể sử dụng chứng chỉ đó để nhận dạng mình nữa.</translation>
 <translation id="7221869452894271364">Tải lại trang này</translation>
 <translation id="8446884382197647889">Tìm hiểu thêm</translation>
-<translation id="9006533633560719845">Đồng ý của người dùng đối với các tập lệnh tiện ích mở rộng</translation>
+<translation id="9006533633560719845">Đồng ý của người dùng đối với các tập lệnh tiện ích</translation>
 <translation id="4555769855065597957">Bóng</translation>
 <translation id="4366837566726634418">Mức sử dụng bộ nhớ dùng chung kết hợp của tất cả các quá trình liên quan đến <ph name="SHORT_PRODUCT_NAME"/></translation>
 <translation id="6787839852456839824">Phím tắt</translation>
@@ -3828,7 +3828,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6791443592650989371">Trạng thái kích hoạt:</translation>
 <translation id="4801257000660565496">Tạo Phím tắt cho Ứng dụng</translation>
 <translation id="8154790740888707867">Không có tệp nào</translation>
-<translation id="2498826285048723189">Tiện ích mở rộng &quot;<ph name="EXTENSION_NAME"/>&quot; đã bị xóa tự động.</translation>
+<translation id="2498826285048723189">Tiện ích &quot;<ph name="EXTENSION_NAME"/>&quot; đã bị xóa tự động.</translation>
 <translation id="6175314957787328458">GUID Tên miền của Microsoft</translation>
 <translation id="6883209331334683549">Trợ giúp của <ph name="PRODUCT_NAME"/></translation>
 <translation id="6970480684834282392">Kiểu khởi động</translation>
@@ -3857,7 +3857,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3527085408025491307">Thư mục</translation>
 <translation id="2375701438512326360">Buộc hỗ trợ màn hình cảm ứng luôn được bật hoặc tắt hoặc được bật khi phát hiện màn hình cảm ứng vào lúc khởi động (Tự động, mặc định).</translation>
 <translation id="3665842570601375360">Bảo mật:</translation>
-<translation id="5699533844376998780">Đã thêm tiện ích mở rộng &quot;<ph name="EXTENSION_NAME"/>&quot;.</translation>
+<translation id="5699533844376998780">Đã thêm tiện ích &quot;<ph name="EXTENSION_NAME"/>&quot;.</translation>
 <translation id="1430915738399379752">In</translation>
 <translation id="7999087758969799248">Phương pháp nhập chuẩn</translation>
 <translation id="8958084571232797708">Sử dụng URL tự động định cấu hình</translation>
@@ -3892,7 +3892,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="4647697156028544508">Vui lòng nhập PIN cho &quot;<ph name="DEVICE_NAME"/>&quot;:</translation>
 <translation id="1062866675591297858">Quản lý người dùng được giám sát của bạn qua <ph name="BEGIN_LINK"/>Bảng điều khiển người dùng được giám sát<ph name="END_LINK"/>.</translation>
 <translation id="7671130400130574146">Sử dụng thanh tiêu đề và đường viền của hệ thống</translation>
-<translation id="9111791539553342076">Tiện ích mở rộng này không thể sửa đổi tiêu đề phản hồi &quot;<ph name="HEADER_NAME"/>&quot; của một yêu cầu mạng do sửa đổi đã xung đột với một tiện ích mở rộng khác (<ph name="EXTENSION_NAME"/>).</translation>
+<translation id="9111791539553342076">Tiện ích này không thể sửa đổi tiêu đề phản hồi &quot;<ph name="HEADER_NAME"/>&quot; của một yêu cầu mạng do sửa đổi đã xung đột với một tiện ích khác (<ph name="EXTENSION_NAME"/>).</translation>
 <translation id="9170848237812810038">H&amp;oàn tác</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME"/> (<ph name="UNICODE_NAME"/>)</translation>
 <translation id="3903912596042358459">Máy chủ từ chối hoàn thành yêu cầu.</translation>
@@ -3946,9 +3946,9 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="2440604414813129000">Xem &amp;nguồn</translation>
 <translation id="816095449251911490"><ph name="SPEED"/> - <ph name="RECEIVED_AMOUNT"/>, <ph name="TIME_REMAINING"/></translation>
 <translation id="1084300930170237385">Thông tin minh bạch</translation>
-<translation id="774465434535803574">Lỗi đóng gói tiện ích mở rộng</translation>
+<translation id="774465434535803574">Lỗi đóng gói tiện ích</translation>
 <translation id="8200772114523450471">Tiếp tục</translation>
-<translation id="5750676294091770309">Bị chặn bởi tiện ích mở rộng</translation>
+<translation id="5750676294091770309">Bị chặn bởi tiện ích</translation>
 <translation id="1302191857856401062">Bật chuyển đổi nhanh giữa những người dùng trong menu hình đại diện.</translation>
 <translation id="7865978820218947446">Chỉnh sửa người dùng</translation>
 <translation id="523299859570409035">Ngoại lệ cho thông báo</translation>
@@ -3968,11 +3968,12 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="1122988962988799712">Tắt WebGL</translation>
 <translation id="7762095352367421639">Bật thông báo được đồng bộ hóa</translation>
 <translation id="9154194610265714752">Đã cập nhật</translation>
-<translation id="1803133642364907127">Xác minh nội dung tiện ích mở rộng</translation>
+<translation id="1803133642364907127">Xác minh nội dung tiện ích</translation>
 <translation id="5438430601586617544">(Đã bung)</translation>
 <translation id="6460601847208524483">Tìm Tiếp theo</translation>
 <translation id="397703832102027365">Đang hoàn tất...</translation>
 <translation id="8146177459103116374">Nếu bạn đã đăng ký trên thiết bị này, bạn có thể <ph name="LINK2_START"/>đăng nhập với tư cách là người dùng hiện tại<ph name="LINK2_END"/>.</translation>
+<translation id="5072836811783999860">Hiển thị dấu trang được quản lý</translation>
 <translation id="4856478137399998590">Dịch vụ dữ liệu di động của bạn đã được kích hoạt và sẵn sàng để sử dụng</translation>
 <translation id="3305389145870741612">Quá trình định dạng có thể mất vài giây. Vui lòng đợi.</translation>
 <translation id="3648607100222897006">Các tính năng thử nghiệm này có thể thay đổi, hỏng hoặc biến mất bất kỳ lúc nào. Chúng tôi hoàn toàn không đảm bảo về những điều có thể xảy ra nếu bạn bật một trong các thử nghiệm này và trình duyệt của bạn thậm chí có thể tự động biến mất. Ngoài những điều đã nói, trình duyệt của bạn có thể xóa tất cả dữ liệu của bạn hoặc tính bảo mật và sự riêng tư của bạn có thể bị xâm phạm theo cách không mong đợi. Bất kỳ tính năng thử nghiệm nào mà bạn bật sẽ được bật cho tất cả người dùng của trình duyệt này. Hãy tiến hành một cách thận trọng.</translation>
@@ -3990,7 +3991,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5159383109919732130"><ph name="BEGIN_BOLD"/>Không tháo thiết bị của bạn khi chưa đến lúc!<ph name="END_BOLD"/>
    <ph name="LINE_BREAKS"/>
    Tháo thiết bị của bạn khi đang được sử dụng có thể gây mất dữ liệu. Vui lòng đợi cho đến khi thao tác kết thúc, sau đó đẩy thiết bị ra bằng ứng dụng Tệp.</translation>
-<translation id="3411172647261449857">Tiện ích mở rộng TLS</translation>
+<translation id="3411172647261449857">Tiện ích TLS</translation>
 <translation id="7253521419891527137">&amp;Tìm hiểu thêm</translation>
 <translation id="496226124210045887">Thư mục bạn đã chọn chứa các tệp nhạy cảm. Bạn có chắc chắn muốn cấp quyền truy cập đọc vĩnh viễn &quot;$1&quot; cho thư mục này không?</translation>
 <translation id="6463607988716135494">Ứng dụng &quot;<ph name="EXTENSION_NAME"/>&quot; đã được cài đặt từ xa.</translation>
@@ -4023,7 +4024,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6120205520491252677">Ghim trang này vào màn hình Bắt đầu...</translation>
 <translation id="4190120546241260780">Kích hoạt mục trình chạy 5</translation>
 <translation id="194030505837763158">Truy cập <ph name="LINK"/></translation>
-<translation id="8272443605911821513">Quản lý tiện ích mở rộng của bạn bằng cách nhấp vào Tiện ích mở rộng trong menu &quot;Công cụ khác&quot;.</translation>
+<translation id="8272443605911821513">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu &quot;Công cụ khác&quot;.</translation>
 <translation id="6905163627763043954">Dùng thử</translation>
 <translation id="3510797500218907545">WiMAX</translation>
 <translation id="1104054824888299003">lâu</translation>
@@ -4044,7 +4045,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6873213799448839504">Tự động xác nhận chuỗi</translation>
 <translation id="7238585580608191973">SHA-256 Fingerprint</translation>
 <translation id="2501278716633472235">Quay lại</translation>
-<translation id="3588662957555259973">* Ảnh tiểu sử trên Google</translation>
+<translation id="3588662957555259973">* Ảnh hồ sơ trên Google</translation>
 <translation id="131461803491198646">Mạng chủ, không chuyển vùng</translation>
 <translation id="7377249249140280793"><ph name="RELATIVE_DATE"/> - <ph name="FULL_DATE"/></translation>
 <translation id="1285320974508926690">Không bao giờ dịch trang web này</translation>
@@ -4057,8 +4058,8 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5833726373896279253">Chỉ có chủ nhân mới có thể sửa đổi các cài đặt này:</translation>
 <translation id="9203962528777363226">Quản trị viên của thiết bị này đã vô hiệu hóa thêm người dùng mới</translation>
 <translation id="3758760622021964394">Trang này muốn tắt con trỏ chuột của bạn.</translation>
-<translation id="8341840687457896278">Tiện ích mở rộng này không thể cung cấp bằng chứng xác thực cho một yêu cầu mạng do tiện ích mở rộng khác (<ph name="EXTENSION_NAME"/>) đã cung cấp các bằng chứng xác thực khác nhau.</translation>
-<translation id="5627523580512561598">tiện ích mở rộng <ph name="EXTENSION_NAME"/></translation>
+<translation id="8341840687457896278">Tiện ích này không thể cung cấp bằng chứng xác thực cho một yêu cầu mạng do tiện ích khác (<ph name="EXTENSION_NAME"/>) đã cung cấp các bằng chứng xác thực khác nhau.</translation>
+<translation id="5627523580512561598">tiện ích <ph name="EXTENSION_NAME"/></translation>
 <translation id="8831104962952173133">Phát hiện Lừa đảo trực tuyến!</translation>
 <translation id="5633230395929474992">Chuyển đổi ChromeVox (phản hồi bằng giọng nói)</translation>
 <translation id="4106164762195622179">Các trang bạn xem trong tab ẩn danh sẽ không bị lưu vào lịch sử của trình duyệt, kho cookie hoặc lịch sử tìm kiếm sau khi bạn đóng <ph name="BEGIN_BOLD"/>tất cả<ph name="END_BOLD"/> các tab ẩn danh. Mọi tệp bạn tải xuống hoặc dấu trang mà bạn tạo sẽ được giữ nguyên.</translation>
@@ -4107,7 +4108,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5436492226391861498">Chờ đường hầm proxy...</translation>
 <translation id="3803991353670408298">Vui lòng thêm phương thức nhập khác trước khi xóa phương thức này.</translation>
 <translation id="4209267054566995313">Không phát hiện thấy chuột hoặc bàn chi chuột cảm ứng.</translation>
-<translation id="3369521687965833290">Không thể giải nén tiện ích mở rộng.  Để giải nén tiện ích mở rộng một cách an toàn, phải có đường dẫn đến thư mục tiểu sử của bạn bắt đầu bằng ký tự ổ đĩa và không chứa ký tự liên kết, điểm lắp hoặc liên kết dạng biểu tượng.  Không có đường dẫn như vậy tồn tại cho tiểu sử của bạn.</translation>
+<translation id="3369521687965833290">Không thể giải nén tiện ích.  Để giải nén tiện ích một cách an toàn, phải có đường dẫn đến thư mục hồ sơ của bạn bắt đầu bằng ký tự ổ đĩa và không chứa ký tự liên kết, điểm lắp hoặc liên kết dạng biểu tượng.  Không có đường dẫn như vậy tồn tại cho hồ sơ của bạn.</translation>
 <translation id="337920581046691015"><ph name="PRODUCT_NAME"/> sẽ được cài đặt.</translation>
 <translation id="5636996382092289526">Để sử dụng <ph name="NETWORK_ID"/>, trước hết bạn cần <ph name="LINK_START"/>truy cập vào trang đăng nhập của mạng<ph name="LINK_END"/>. Trang này thường tự động mở sau vài giây. Nếu trang này không mở thì không thể sử dụng mạng này.</translation>
 <translation id="8579896762084163417">Tắt Native Client di động.</translation>
@@ -4129,7 +4130,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="440150639010863291">Sử dụng Google Wallet</translation>
 <translation id="8888432776533519951">Màu:</translation>
 <translation id="5294529402252479912">Cập nhật Adobe Reader bây giờ</translation>
-<translation id="641087317769093025">Không thể giải nén tiện ích mở rộng</translation>
+<translation id="641087317769093025">Không thể giải nén tiện ích</translation>
 <translation id="7461850476009326849">Tắt các plug-in riêng...</translation>
 <translation id="2231990265377706070">Dấu chấm than</translation>
 <translation id="7199540622786492483"><ph name="PRODUCT_NAME"/> đã lỗi thời vì sản phẩm này không được chạy lại trong một thời gian. Đã có bản cập nhật và bản cập nhật này sẽ được áp dụng ngay khi bạn chạy lại.</translation>
@@ -4148,13 +4149,13 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/>K (<ph name="NUM_KILOBYTES_LIVE"/>K hiện có)</translation>
 <translation id="5554573843028719904">Mạng Wi-Fi khác...</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED"/>, <ph name="TIME_LEFT"/></translation>
-<translation id="7013485839273047434">Tải thêm tiện ích mở rộng</translation>
+<translation id="7013485839273047434">Tải thêm tiện ích</translation>
 <translation id="2124335647227850314">Tắt hiệu chỉnh màu của màn hình ngay cả khi màn hình hỗ trợ tính năng này.</translation>
 <translation id="428565720843367874">Phần mềm chống vi-rút bị lỗi bất ngờ khi đang quét tệp này.</translation>
 <translation id="7709152031285164251">Không thành công - <ph name="INTERRUPT_REASON"/></translation>
 <translation id="3838486795898716504"><ph name="PAGE_TITLE"/> khác</translation>
 <translation id="7003339318920871147">Cơ sở dữ liệu web</translation>
-<translation id="8885905466771744233">Khoá cá nhân cho tiện ích mở rộng chỉ định đã tồn tại. Hãy sử dụng lại hoặc xóa khóa đó trước tiên.</translation>
+<translation id="8885905466771744233">Khoá cá nhân cho tiện ích chỉ định đã tồn tại. Hãy sử dụng lại hoặc xóa khóa đó trước tiên.</translation>
 <translation id="7583419135027754249">Luôn gửi các sự kiện nhấp chuột ngay sau khi nhấn, ngay cả khi đó là một phần trong cử chỉ nhấn đúp. Điều này giúp tăng tốc tác vụ điều hướng và các tác vụ nhấn khác lên 300 ms trên hầu hết các trang, nhưng có nghĩa là cần phải tránh các liên kết và các nút khi nhấn đúp để thu phóng.</translation>
 <translation id="4100843820583867709">Yêu cầu chia sẻ màn hình Google Talk</translation>
 <translation id="2406941037785138796">Số lần tắt</translation>
@@ -4229,7 +4230,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5626134646977739690">Tên:</translation>
 <translation id="4899837262951879307">Chế độ cuộn cảm ứng.</translation>
 <translation id="5854409662653665676">Nếu bạn đang gặp phải sự cố thông thường, bạn có thể thử cách sau để giải quyết sự cố với mô-đun này:</translation>
-<translation id="3776796446459804932">Tiện ích mở rộng này vi phạm chính sách của Cửa hàng Chrome trực tuyến.</translation>
+<translation id="3776796446459804932">Tiện ích này vi phạm chính sách của Cửa hàng Chrome trực tuyến.</translation>
 <translation id="3681007416295224113">Thông tin chứng chỉ</translation>
 <translation id="3046084099139788433">Kích hoạt tab 7</translation>
 <translation id="8230421197304563332">Những kẻ tấn công hiện đang truy cập <ph name="BEGIN_BOLD"/><ph name="SITE"/><ph name="END_BOLD"/> có thể cố gắng cài đặt các chương trình nguy hiểm trên máy tính của bạn. Các chương trình này sẽ đánh cắp hoặc xóa thông tin của bạn (ví dụ: ảnh, mật khẩu, thư và thẻ tín dụng).</translation>
@@ -4250,7 +4251,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="4375035964737468845">Mở các tệp đã tải xuống</translation>
 <translation id="3968739731834770921">Kana</translation>
 <translation id="7387829944233909572">Hộp thoại &quot;Xóa dữ liệu duyệt web&quot;</translation>
-<translation id="8023801379949507775">Cập nhật tiện ích mở rộng ngay bây giờ</translation>
+<translation id="8023801379949507775">Cập nhật tiện ích ngay bây giờ</translation>
 <translation id="5963453369025043595"><ph name="NUM_HANDLES"/> (tối đa <ph name="NUM_KILOBYTES_LIVE"/>)</translation>
 <translation id="2524800364695118482">Ứng dụng có thể:</translation>
 <translation id="6782622603507084740">Bật API EmbeddedSearch</translation>
@@ -4269,7 +4270,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="2113479184312716848">Mở &amp;tệp...</translation>
 <translation id="884264119367021077">Ðịa chỉ giao hàng</translation>
 <translation id="634208815998129842">Trình quản lý tác vụ</translation>
-<translation id="8475313423285172237">Một chương trình khác trên máy tính của bạn đã thêm một tiện ích mở rộng có thể thay đổi cách Chrome hoạt động.</translation>
+<translation id="8475313423285172237">Một chương trình khác trên máy tính của bạn đã thêm một tiện ích có thể thay đổi cách Chrome hoạt động.</translation>
 <translation id="4850458635498951714">Thêm thiết bị</translation>
 <translation id="3140353188828248647">Thanh địa chỉ chính</translation>
 <translation id="1371806038977523515">Các cài đặt này được kiểm soát bởi:</translation>
@@ -4285,7 +4286,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5963026469094486319">Tải chủ đề</translation>
 <translation id="7586312264284919041">Bạn có muốn dịch trang này không?</translation>
 <translation id="3855072293748278406">Truy cập plugin chưa được đặt hộp cát</translation>
-<translation id="8357224663288891423">Phím tắt cho tiện ích mở rộng và ứng dụng</translation>
+<translation id="8357224663288891423">Phím tắt cho tiện ích và ứng dụng</translation>
 <translation id="1893137424981664888">Chưa cài đặt plugin nào.</translation>
 <translation id="4919810557098212913"><ph name="HOST"/> muốn sử dụng máy ảnh của bạn.</translation>
 <translation id="5434706434408777842">F3</translation>
@@ -4305,7 +4306,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3737514536860147030">Tìm hiểu thêm về duyệt web ẩn danh</translation>
 <translation id="621638399744152264"><ph name="VALUE"/>%</translation>
 <translation id="3082520371031013475">Cài đặt bàn di chuột và chuột</translation>
-<translation id="4927301649992043040">Đóng gói tiện ích mở rộng</translation>
+<translation id="4927301649992043040">Đóng gói tiện ích</translation>
 <translation id="5939518447894949180">Đặt lại</translation>
 <translation id="8679658258416378906">Kích hoạt tab 5</translation>
 <translation id="9049835026521739061">Chế độ Hangul</translation>
@@ -4393,7 +4394,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8204484782770036444">• <ph name="PERMISSION"/></translation>
 <translation id="7144878232160441200">Thử lại</translation>
 <translation id="3570985609317741174">Nội dung web</translation>
-<translation id="3951872452847539732">Cài đặt proxy mạng của bạn hiện đang được quản lý bởi một tiện ích mở rộng.</translation>
+<translation id="3951872452847539732">Cài đặt proxy mạng của bạn hiện đang được quản lý bởi một tiện ích.</translation>
 <translation id="4720113199587244118">Thêm thiết bị</translation>
 <translation id="6442697326824312960">Bỏ gắn Tab</translation>
 <translation id="8714406895390098252">Xe đạp</translation>
@@ -4403,6 +4404,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6869402422344886127">Đã chọn hộp kiểm</translation>
 <translation id="3428010780253032925">Vô hiệu hóa nhắm mục tiêu theo hình chữ nhật trong các chế độ xem</translation>
 <translation id="5637380810526272785">Phương pháp Nhập</translation>
+<translation id="3613134908380545408">Hiển thị <ph name="FOLDER_NAME"/></translation>
 <translation id="2837049386027881519">Phải thử lại kết nối bằng phiên bản giao thức TLS hoặc SSL cũ hơn. Điều này thường có nghĩa là máy chủ đang sử dụng phần mềm rất cũ và có thể gặp các vấn đề bảo mật khác.</translation>
 <translation id="404928562651467259">CẢNH BÁO</translation>
 <translation id="4289300219472526559">Bắt đầu nói</translation>
@@ -4449,7 +4451,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6757994640088602342">Thử nghiệm cảnh báo phần mềm độc hại</translation>
 <translation id="5367091008316207019">Đang đọc tệp..</translation>
 <translation id="936801553271523408">Dữ liệu chẩn đoán hệ thống</translation>
-<translation id="820791781874064845">Trang web này bị chặn bởi tiện ích mở rộng</translation>
+<translation id="820791781874064845">Trang web này bị chặn bởi tiện ích</translation>
 <translation id="2649120831653069427">Cá cầu vồng</translation>
 <translation id="2781645665747935084">Tiếng Bỉ</translation>
 <translation id="186612162884103683">&quot;<ph name="EXTENSION"/>&quot; có thể đọc và ghi hình ảnh, video và tệp âm thanh trong các vị trí đã chọn.</translation>
@@ -4555,7 +4557,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="4253787465144837701">Chứng chỉ máy chủ chứa tên miền nằm ngoài phạm vi.</translation>
 <translation id="2649911884196340328">Chứng chỉ an toàn của máy chủ có lỗi!</translation>
-<translation id="1698647588772720278">Tắt Tiện ích mở rộng phương tiện có mã hóa được định sẵn.</translation>
+<translation id="1698647588772720278">Tắt Tiện ích phương tiện có mã hóa được định sẵn.</translation>
 <translation id="2286454467119466181">Đơn giản</translation>
 <translation id="6666647326143344290">với Tài khoản Google của bạn</translation>
 <translation id="4564097437843356814">Đã xảy ra lỗi với tài khoản Google Wallet của bạn.</translation>
@@ -4587,7 +4589,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="5409029099497331039">Khiến tôi ngạc nhiên</translation>
 <translation id="7845920762538502375"><ph name="PRODUCT_NAME"/> không thể đồng bộ hóa dữ liệu của bạn do không thể kết nối đến máy chủ đồng bộ hóa. Đang thử lại...</translation>
 <translation id="3819415294190923087">Chọn mạng</translation>
-<translation id="7325437708553334317">Tiện ích mở rộng tương phản cao</translation>
+<translation id="7325437708553334317">Tiện ích tương phản cao</translation>
 <translation id="9203394577866137354">Trạng thái xác thực</translation>
 <translation id="4076313158939304412">Bảo vệ thanh toán của bạn bằng Google Wallet.</translation>
 <translation id="6708242697268981054">Bản gốc:</translation>
@@ -4661,12 +4663,12 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="2509857212037838238">Cài đặt <ph name="PLUGIN_NAME"/></translation>
 <translation id="2943400156390503548">Trang trình bày</translation>
 <translation id="3790146417033334899"><ph name="PLUGIN_NAME"/> chỉ hoạt động trên máy tính để bàn.</translation>
-<translation id="5117930984404104619">Giám sát hoạt động của các tiện ích mở rộng khác, bao gồm cả các URL đã truy cập</translation>
+<translation id="5117930984404104619">Giám sát hoạt động của các tiện ích khác, bao gồm cả các URL đã truy cập</translation>
 <translation id="33022249435934718">Xử lý GDI</translation>
 <translation id="6308937455967653460">Lưu liên &amp;kết thành...</translation>
 <translation id="741689768643916402">Thật không may, chỉ người mua có địa chỉ ở Hoa Kỳ mới có thể sử dụng Google Wallet tại người bán này. Nếu bạn là cư dân Hoa Kỳ, vui lòng |thay đổi địa chỉ nhà riêng của bạn với Wallet| hoặc thanh toán mà không sử dụng Google Wallet.</translation>
 <translation id="5828633471261496623">Đang in...</translation>
-<translation id="2420698750843121542">Bật Tiện ích mở rộng phương tiện được mã hóa trên phần tử video hoặc âm thanh. Thao tác này sẽ bật phiên bản mới nhất của Tiện ích mở rộng phương tiện được mã hóa.</translation>
+<translation id="2420698750843121542">Bật Tiện ích phương tiện được mã hóa trên phần tử video hoặc âm thanh. Thao tác này sẽ bật phiên bản mới nhất của Tiện ích phương tiện được mã hóa.</translation>
 <translation id="5421136146218899937">Xóa dữ liệu duyệt web...</translation>
 <translation id="5441100684135434593">Mạng có dây</translation>
 <translation id="3285322247471302225">&amp;Tab Mới</translation>
@@ -4679,7 +4681,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6380143666419481200">Đồng ý và tiếp tục</translation>
 <translation id="713122686776214250">Thêm tran&amp;g...</translation>
 <translation id="4816492930507672669">Vừa với trang</translation>
-<translation id="1485015260175968628">Tiện ích mở rộng/ứng dụng giờ đây có thể:</translation>
+<translation id="1485015260175968628">Tiện ích/ứng dụng giờ đây có thể:</translation>
 <translation id="7496192982082800780">Ngày</translation>
 <translation id="1122198203221319518">&amp;Công cụ</translation>
 <translation id="5143151113947480436">Truy cập dữ liệu bạn sao chép và dán</translation>
@@ -4688,7 +4690,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="1979718561647571293">Đây có phải là trang khởi động bạn muốn không?</translation>
 <translation id="6608140561353073361">Tất cả cookie và dữ liệu trang web...</translation>
 <translation id="6485131920355264772">Không thể truy xuất thông tin dung lượng</translation>
-<translation id="6547316139431024316">Không cảnh báo lại đối với tiện ích mở rộng này</translation>
+<translation id="6547316139431024316">Không cảnh báo lại đối với tiện ích này</translation>
 <translation id="8007030362289124303">Pin Yếu</translation>
 <translation id="3790909017043401679">Nhập mã PIN của thẻ SIM</translation>
 <translation id="1135328998467923690">Gói không hợp lệ: '<ph name="ERROR_CODE"/>'.</translation>
@@ -4715,7 +4717,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8775404590947523323">Chỉnh sửa của bạn đã được lưu tự động.<ph name="BREAKS"/>Để giữ bản sao của ảnh gốc, hãy bỏ chọn &quot;Ghi đè tệp gốc&quot;</translation>
 <translation id="5208988882104884956">Nửa độ rộng</translation>
 <translation id="1507170440449692343">Trang này đã bị chặn truy cập máy ảnh của bạn.</translation>
-<translation id="4189406272289638749">Tiện ích mở rộng, &lt;b&gt;<ph name="EXTENSION_NAME"/>&lt;/b&gt;, đang kiểm soát cài đặt này.</translation>
+<translation id="4189406272289638749">Tiện ích, &lt;b&gt;<ph name="EXTENSION_NAME"/>&lt;/b&gt;, đang kiểm soát cài đặt này.</translation>
 <translation id="803771048473350947">Tệp</translation>
 <translation id="6206311232642889873">Sao ché&amp;p Hình ảnh</translation>
 <translation id="5158983316805876233">Sử dụng cùng một proxy cho tất cả các giao thức</translation>
@@ -4735,6 +4737,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6934265752871836553">Sử dụng mã hàng đầu để giúp Chrome thu hút nội dung nhanh hơn. Những thay đổi
         đằng sau đường dẫn này rất có thể sẽ phá vỡ nhiều nội dung.</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">Luôn mở trong Adobe Reader</translation>
 <translation id="8274359292107649245">Mở Chrome trên máy tính để bàn</translation>
 <translation id="1571119610742640910">Kết hợp cho nền gốc cố định.</translation>
 <translation id="6514565641373682518">Trang này đã tắt con trỏ chuột của bạn.</translation>
@@ -4755,7 +4758,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="4088536322074090758">Bật NTP mới.</translation>
 <translation id="3414856743105198592">Định dạng phương tiện di động sẽ xóa tất cả dữ liệu. Bạn có muốn tiếp tục không?</translation>
 <translation id="5338503421962489998">Bộ nhớ cục bộ</translation>
-<translation id="5627086634964711283">Tiện ích mở rộng cũng điều khiển trang nào sẽ hiển thị khi bạn nhấp vào nút Trang chủ.</translation>
+<translation id="5627086634964711283">Tiện ích cũng điều khiển trang nào sẽ hiển thị khi bạn nhấp vào nút Trang chủ.</translation>
 <translation id="1702534956030472451">Western</translation>
 <translation id="766747607778166022">Quản lý thẻ tín dụng...</translation>
 <translation id="794676567536738329">Xác nhận quyền</translation>
@@ -4779,7 +4782,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="8940081510938872932">Máy tính của bạn hiện đang thực hiện quá nhiều tác vụ.  Hãy thử lại sau.</translation>
 <translation id="8848709220963126773">Chuyển chế độ phím shift</translation>
 <translation id="6316806695097060329">Thiết bị <ph name="SHORT_PRODUCT_NAME"/> này được thiết kế nhằm cung cấp trải nghiệm web tốt nhất cho bạn.</translation>
-<translation id="49122815993216733">Lỗi tải tiện ích mở rộng</translation>
+<translation id="49122815993216733">Lỗi tải tiện ích</translation>
 <translation id="3241720467332021590">Tiếng Ai-len</translation>
 <translation id="8828933418460119530">Tên DNS</translation>
 <translation id="424546999567421758">Đã phát hiện mức sử dụng ổ đĩa cao</translation>
@@ -4790,7 +4793,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="6581162200855843583">Liên kết Google Drive</translation>
 <translation id="5783221160790377646">Do xảy ra lỗi nên không tạo được người dùng được giám sát. Vui lòng thử lại sau.</translation>
 <translation id="340771324714262530">Dừng phản chiếu</translation>
-<translation id="3303260552072730022">Một tiện ích mở rộng đã kích hoạt chế độ toàn màn hình.</translation>
+<translation id="3303260552072730022">Một tiện ích đã kích hoạt chế độ toàn màn hình.</translation>
 <translation id="7619338682741516875">Ứng dụng giúp Chrome tiếp tục kết nối.</translation>
 <translation id="5212108862377457573">Điều chỉnh chuyển đổi dựa vào nhập trước</translation>
 <translation id="3020960800108671197">Quản lý chặn plug-in không có hộp cát...</translation>
@@ -4809,7 +4812,7 @@ Hãy đảm bảo bạn không hiển thị bất kỳ thông tin nhạy cảm n
 <translation id="3705722231355495246">-</translation>
 <translation id="6251889282623539337">Điều khoản dịch vụ <ph name="DOMAIN"/></translation>
 <translation id="1952456732281820252">Thêm lối tắt?</translation>
-<translation id="2470702053775288986">Tiện ích mở rộng không được hỗ trợ đã bị tắt</translation>
+<translation id="2470702053775288986">Tiện ích không được hỗ trợ đã bị tắt</translation>
 <translation id="5461512418490148136">Vui lòng đợi. Chúng tôi đang tìm nạp tệp của bạn.</translation>
 <translation id="4268574628540273656">URL:</translation>
 <translation id="2766585356456507052">Danh tính của <ph name="ORGANIZATION"/> tại <ph name="LOCALITY"/> đã được xác minh bởi <ph name="ISSUER"/>, tổ chức khai là có hồ sơ kiểm toán công khai nhưng không thể xác minh các hồ sơ đó.</translation>
@@ -4854,10 +4857,10 @@ Nhấn phím bất kỳ để tiếp tục khám phá.</translation>
         bất kỳ đâu, ra mọi nơi. Chia sẻ máy in với bất cứ ai bạn chọn và
         in nội dung cho họ từ Chrome, điện thoại, máy tính bảng, PC hoặc bất kỳ
         thiết bị kết nối web nào khác.</translation>
-<translation id="6154080734794712683">Tiện ích mở rộng đã thay đổi trang nào sẽ hiển thị khi bạn nhập vào nút Trang chủ.</translation>
+<translation id="6154080734794712683">Tiện ích đã thay đổi trang nào sẽ hiển thị khi bạn nhập vào nút Trang chủ.</translation>
 <translation id="4668954208278016290">Đã xảy ra sự cố khi trích xuất hình ảnh vào máy.</translation>
 <translation id="5822838715583768518">Chạy Ứng dụng</translation>
-<translation id="8351419472474436977">Tiện ích mở rộng này đã chiếm quyền kiểm soát cài đặt proxy của bạn, điều đó có nghĩa là tiện ích mở rộng này có thể thay đổi, làm gián đoạn hoặc nghe trộm bất kỳ điều gì bạn thực hiện trực tuyến. Nếu bạn không chắc chắn về lý do thay đổi này diễn ra, bạn có thể không cần tiện ích mở rộng này.</translation>
+<translation id="8351419472474436977">Tiện ích này đã chiếm quyền kiểm soát cài đặt proxy của bạn, điều đó có nghĩa là tiện ích này có thể thay đổi, làm gián đoạn hoặc nghe trộm bất kỳ điều gì bạn thực hiện trực tuyến. Nếu bạn không chắc chắn về lý do thay đổi này diễn ra, bạn có thể không cần tiện ích này.</translation>
 <translation id="5914724413750400082">Mô-đun (<ph name="MODULUS_NUM_BITS"/> bit):
   <ph name="MODULUS_HEX_DUMP"/>
 
@@ -4868,16 +4871,16 @@ Nhấn phím bất kỳ để tiếp tục khám phá.</translation>
 <translation id="3942974664341190312">Bộ 2</translation>
 <translation id="8477241577829954800">Đã thay thế</translation>
 <translation id="6735304988756581115">Hiển thị cookie và dữ liệu trang web khác...</translation>
-<translation id="5996258716334177896">Không thể mở tiểu sử của bạn đúng cách.
+<translation id="5996258716334177896">Không thể mở hồ sơ của bạn đúng cách.
 
-Một số tính năng có thể không có sẵn. Hãy kiểm tra xem tiểu sử có tồn tại và bạn có quyền đọc và ghi nội dung trong tiểu sử không.</translation>
+Một số tính năng có thể không có sẵn. Hãy kiểm tra xem hồ sơ có tồn tại và bạn có quyền đọc và ghi nội dung trong hồ sơ không.</translation>
 <translation id="7040138676081995583">Mở bằng...</translation>
 <translation id="7953739707111622108">Thiết bị này không thể mở được vì hệ thống tệp của thiết bị không được nhận dạng.</translation>
 <translation id="2433507940547922241">Hình thức</translation>
 <translation id="6051354611314852653">Rất tiếc! Hệ thống không cho phép truy cập API cho thiết bị này.</translation>
 <translation id="7851716364080026749">Luôn chặn truy cập vào máy ảnh và micrô</translation>
 <translation id="839072384475670817">Tạo các &amp;Phím tắt cho Ứng dụng...</translation>
-<translation id="2176045495080708525">Các tiện ích mở rộng sau hiện đã được cài đặt:</translation>
+<translation id="2176045495080708525">Các tiện ích sau hiện đã được cài đặt:</translation>
 <translation id="3046910703532196514">Trang web, toàn bộ</translation>
 <translation id="5062930723426326933">Không đăng nhập được, vui lòng kết nối với internet và thử lại.</translation>
 <translation id="5316716239522500219">Phản chiếu màn hình</translation>
@@ -4920,7 +4923,7 @@ Nhấn phím bất kỳ để tiếp tục khám phá.</translation>
 <translation id="3270847123878663523">&amp;Hoàn tác sắp xếp lại</translation>
 <translation id="4959447747655704388">Nếu bạn hiểu các rủi ro bảo mật, bạn có thể <ph name="BEGIN_LINK"/>truy cập trang web bị nhiễm độc này<ph name="END_LINK"/>.</translation>
 <translation id="7928558495458479764">Đọc và sửa đổi tất cả dữ liệu của bạn trên thiết bị của bạn và các trang web bạn truy cập</translation>
-<translation id="4503387275462811823">Mô tả tiện ích mở rộng</translation>
+<translation id="4503387275462811823">Mô tả tiện ích</translation>
 <translation id="2157875535253991059">Trang này hiện ở chế độ toàn màn hình.</translation>
 <translation id="4888558933371567598">Tính năng này tạm thời không khả dụng.</translation>
 <translation id="4434147949468540706">Hiệu ứng kết thúc cuộn</translation>
@@ -4935,6 +4938,7 @@ Nhấn phím bất kỳ để tiếp tục khám phá.</translation>
 <translation id="824543159844843373">Kích hoạt mục trình chạy 3</translation>
 <translation id="3819800052061700452">&amp;Toàn màn hình</translation>
 <translation id="48607902311828362">Chế độ trên máy bay</translation>
+<translation id="711840821796638741">Hiển thị dấu trang được quản lý</translation>
 <translation id="3360297538363969800">Không in được. Vui lòng kiểm tra máy in và thử lại.</translation>
 <translation id="680572642341004180">Bật theo dõi RLZ trên <ph name="SHORT_PRODUCT_OS_NAME"/>.</translation>
 <translation id="688797901999351107">Hãy ngừng sử dụng bộ sạc bị thu hồi.</translation>
@@ -4995,7 +4999,7 @@ Nhấn phím bất kỳ để tiếp tục khám phá.</translation>
 <translation id="2951247061394563839">Căn giữa cửa sổ</translation>
 <translation id="3435738964857648380">Bảo mật</translation>
 <translation id="9112987648460918699">Tìm...</translation>
-<translation id="786804765947661699">Đã tắt tiện ích mở rộng</translation>
+<translation id="786804765947661699">Đã tắt tiện ích</translation>
 <translation id="8449218563485801324">Thoát tất cả ứng dụng</translation>
 <translation id="3439153939049640737">Luôn cho phép <ph name="HOST"/> truy cập micrô của bạn</translation>
 <translation id="870805141700401153">Ký Mã Cá nhân của Microsoft</translation>
@@ -5054,7 +5058,7 @@ Nhấn phím bất kỳ để tiếp tục khám phá.</translation>
 <translation id="3184560914950696195">Không thể lưu vào $1. Ảnh đã chỉnh sửa sẽ được lưu vào thư mục Tải xuống.</translation>
 <translation id="8366396658833131068">Kết nối mạng của bạn đã được khôi phục. Hãy chọn mạng khác hoặc nhấn nút 'Tiếp tục' bên dưới để khởi chạy ứng dụng kiosk của bạn.</translation>
 <translation id="4664482161435122549">Lỗi xuất PKCS #12</translation>
-<translation id="2445081178310039857">Thư mục gốc của tiện ích mở rộng là bắt buộc.</translation>
+<translation id="2445081178310039857">Thư mục gốc của tiện ích là bắt buộc.</translation>
 <translation id="146187176629751223">Một người tham gia trong Hangout này đã đề nghị giúp bạn bằng cách kiểm soát máy tính của bạn. Nếu bạn chấp nhận:
 
   • Mọi người trong Hangout này có thể nhìn thấy màn hình của bạn
@@ -5069,7 +5073,7 @@ Bạn có chấp nhận không?</translation>
 <translation id="2726231345817023827">Không có</translation>
 <translation id="2085470240340828803">Tệp có tên &quot;<ph name="FILENAME"/>&quot; đã tồn tại. Bạn muốn làm gì?</translation>
 <translation id="7088674813905715446">Thiết bị này đã được quản trị viên đặt sang trạng thái hủy cấp phép. Để cho phép đăng ký thiết bị, quản trị viên phải đặt thiết bị về trạng thái đang chờ xử lý.</translation>
-<translation id="3037605927509011580">Xin lỗi!</translation>
+<translation id="3037605927509011580">Ôi, hỏng! </translation>
 <translation id="5803531701633845775">Chọn cụm từ từ phía sau, mà không cần di chuyển con trỏ</translation>
 <translation id="1434886155212424586">Trang chủ là trang Tab mới</translation>
 <translation id="6057141540394398784">Đây là người dùng được giám sát sẽ do bạn quản lý.
@@ -5086,7 +5090,7 @@ Bạn có chấp nhận không?</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="421182450098841253">&amp;Hiển thị thanh dấu trang</translation>
 <translation id="2948083400971632585">Bạn có thể tắt mọi proxy được định cấu hình cho kết nối từ trang cài đặt.</translation>
-<translation id="4481249487722541506">Tải tiện ích mở rộng đã bung...</translation>
+<translation id="4481249487722541506">Tải tiện ích đã bung...</translation>
 <translation id="356512994079769807">Cài đặt trong cài đặt hệ thống</translation>
 <translation id="8180239481735238521">trang</translation>
 <translation id="7532099961752278950">Thiết lập theo ứng dụng:</translation>
@@ -5107,10 +5111,10 @@ Bạn có chấp nhận không?</translation>
 <translation id="4057041477816018958"><ph name="SPEED"/> - <ph name="RECEIVED_AMOUNT"/></translation>
 <translation id="2050339315714019657">Khổ dọc</translation>
 <translation id="6991128190741664836">Sau</translation>
-<translation id="8261490674758214762">Các tiện ích mở rộng/ứng dụng này có thể:</translation>
+<translation id="8261490674758214762">Các tiện ích/ứng dụng này có thể:</translation>
 <translation id="8647750283161643317">Đặt lại tất cả về mặc định</translation>
 <translation id="5112577000029535889">&amp;Công cụ dành cho Nhà phát triển</translation>
-<translation id="2301382460326681002">Thư mục gốc của tiện ích mở rộng không hợp lệ.</translation>
+<translation id="2301382460326681002">Thư mục gốc của tiện ích không hợp lệ.</translation>
 <translation id="4912643508233590958">Đánh thức khỏi chế độ rảnh</translation>
 <translation id="7839192898639727867">ID Khoá Đối tượng của Chứng chỉ</translation>
 <translation id="4759238208242260848">Tải xuống</translation>
@@ -5150,7 +5154,7 @@ Bạn có chấp nhận không?</translation>
 <translation id="2704184184447774363">Ký Tài liệu của Microsoft</translation>
 <translation id="5677928146339483299">Bị chặn</translation>
 <translation id="4645676300727003670">&amp;Giữ</translation>
-<translation id="3225579507836276307">Một tiện ích mở rộng bên thứ ba đã chặn truy cập vào trang web này.</translation>
+<translation id="3225579507836276307">Một tiện ích bên thứ ba đã chặn truy cập vào trang web này.</translation>
 <translation id="6815551780062710681">chỉnh sửa</translation>
 <translation id="6911468394164995108">Tham gia mạng khác...</translation>
 <translation id="2510708650472996893">Cấu hình màu:</translation>
@@ -5233,11 +5237,11 @@ Bạn có chấp nhận không?</translation>
 <translation id="3709244229496787112">Trình duyệt bị tắt trước khi quá trình tải xuống hoàn tất.</translation>
 <translation id="7999229196265990314">Đã tạo các tệp sau:
 
-Tiện ích mở rộng: <ph name="EXTENSION_FILE"/>
+Tiện ích: <ph name="EXTENSION_FILE"/>
 Tệp Khoá: <ph name="KEY_FILE"/>
 
-Giữ tá»\87p khóa của bạn á»\9f nÆ¡i an toàn. Bạn sẽ cần tá»\87p khóa Ä\91á»\83 tạo phiên bản tiá»\87n Ã­ch má»\9f rá»\99ng má»\9bi của mình.</translation>
-<translation id="5522156646677899028">Tiện ích mở rộng này chứa lỗ hổng bảo mật nghiêm trọng.</translation>
+Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa để tạo phiên bản tiện ích mới của mình.</translation>
+<translation id="5522156646677899028">Tiện ích này chứa lỗ hổng bảo mật nghiêm trọng.</translation>
 <translation id="1004032892340602806">Cho phép tất cả các trang web sử dụng plugin để truy cập vào máy tính của bạn</translation>
 <translation id="3813984289128269159">Ok Google</translation>
 <translation id="417475959318757854">Đặt trình chạy ứng dụng ở vị trí trung tâm.</translation>
@@ -5257,7 +5261,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
 <translation id="3331321258768829690">(<ph name="UTCOFFSET"/>) <ph name="LONGTZNAME"/> (<ph name="EXEMPLARCITY"/>)</translation>
 <translation id="2813137708069460534">Số liệu liên quan đến mức sử dụng mạng của <ph name="SHORT_PRODUCT_NAME"/></translation>
 <translation id="7250799832286185545">Năm</translation>
-<translation id="5849869942539715694">Đóng gói tiện ích mở rộng...</translation>
+<translation id="5849869942539715694">Đóng gói tiện ích...</translation>
 <translation id="7339785458027436441">Kiểm tra Chính tả Trong khi Nhập</translation>
 <translation id="5233736638227740678">&amp;Dán</translation>
 <translation id="1828901632669367785">In bằng hộp thoại hệ thống...</translation>
@@ -5272,8 +5276,8 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
 <translation id="1559528461873125649">Không có tệp hoặc thư mục nào như vậy</translation>
 <translation id="3857773447683694438">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</translation>
 <translation id="1533920822694388968">Căn chỉnh TV</translation>
-<translation id="6109534693970294947">Cho phép <ph name="ORIGIN"/> giao tiếp với tiện ích mở rộng &quot;<ph name="EXTENSION_NAME"/>&quot;?</translation>
-<translation id="1729533290416704613">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn tìm kiếm từ Thanh địa chỉ.</translation>
+<translation id="6109534693970294947">Cho phép <ph name="ORIGIN"/> giao tiếp với tiện ích &quot;<ph name="EXTENSION_NAME"/>&quot;?</translation>
+<translation id="1729533290416704613">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="2650446666397867134">Truy cập vào tệp bị từ chối</translation>
 <translation id="3568838446092468648">ECDSA</translation>
 <translation id="5832830184511718549">Sử dụng chuỗi phụ để tổng hợp trang web. Điều này cho phép cuộn dễ dàng hơn, ngay cả khi chuỗi chính không phản hồi.</translation>
index fb3d17f..065da35 100644 (file)
 <translation id="7501143156951160001">如果您没有 Google 帐户,可以立即<ph name="LINK_START"/>创建一个 Google 帐户<ph name="LINK_END"/>。</translation>
 <translation id="4950138595962845479">选项...</translation>
 <translation id="4653235815000740718">创建操作系统恢复媒体时出现问题。找不到已使用的存储设备。</translation>
-<translation id="1407489512183974736">居中裁剪</translation>
+<translation id="1407489512183974736">居中裁剪</translation>
 <translation id="6426222199977479699">SSL 错误</translation>
 <translation id="2688196195245426394">向服务器注册设备时出错:<ph name="CLIENT_ERROR"/>。</translation>
 <translation id="667115622929458276">正在进行多项隐身下载。您希望退出隐身模式并取消这些下载吗?</translation>
 <translation id="5661272705528507004">此 SIM 卡已停用,无法继续使用。请与您的服务提供商联系,以进行更换。</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
 <translation id="3583413473134066075">快了.. 快了... 到了。</translation>
-<translation id="6585234750898046415">选择要显示在您帐户的登录屏幕上的图片。</translation>
+<translation id="6585234750898046415">选择您帐户在登录屏幕上显示的图片。</translation>
 <translation id="7957054228628133943">管理弹出式窗口拦截…</translation>
 <translation id="179767530217573436">过去四周</translation>
 <translation id="2279770628980885996">服务器尝试执行请求时遇到了意外情况。</translation>
 <translation id="3855676282923585394">导入书签和设置...</translation>
 <translation id="1116694919640316211">关于</translation>
 <translation id="8381977081675353473">斯洛伐克语</translation>
-<translation id="2849866606957084126">已创建名为<ph name="NEW_PROFILE_NAME"/>的受监管用户。要设置该用户可以浏览哪些网站,您可以访问<ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/>,在其中配置相应限制和设置。如果您未更改默认设置,<ph name="NEW_PROFILE_NAME"/>将可以浏览所有网站。
+<translation id="2849866606957084126">已创建名为“<ph name="NEW_PROFILE_NAME"/>”的受监管用户。要设置该用户可以浏览哪些网站,您可以访问<ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/>,在其中配置相应限制和设置。如果您不更改默认设置,“<ph name="NEW_PROFILE_NAME"/>”将可以浏览所有网站。
 
-  有关详细说明,请查看<ph name="ACCOUNT_EMAIL"/>中的电子邮件。</translation>
+有关详细说明,请查看<ph name="ACCOUNT_EMAIL"/>中的电子邮件。</translation>
 <translation id="4422347585044846479">修改此页的书签</translation>
 <translation id="1965624977906726414">无需特殊权限。</translation>
 <translation id="2452539774207938933">切换到用户:<ph name="PROFILE_NAME"/></translation>
-<translation id="4700157086864140907">Google Chrome 浏览器可将您在浏览器中输入的内容发送到 Google 服务器,让您使用 Google 搜索所用的拼写检查技术,从而提供更智能的拼写检查功能,</translation>
+<translation id="4700157086864140907">Google Chrome会将您在浏览器中输入的内容发送到Google服务器,并使用Google搜索所用的拼写检查技术,因而可为您提供更智能的拼写检查功能。</translation>
 <translation id="1880905663253319515">要删除证书“<ph name="CERTIFICATE_NAME"/>”吗?</translation>
 <translation id="8546306075665861288">图片缓存</translation>
 <translation id="5904093760909470684">代理配置</translation>
          “<ph name="PRODUCT_NAME"/>”不会使用不安全的连接。</translation>
 <translation id="7851858861565204677">来自其他设备的同步</translation>
 <translation id="1662837784918284394">(无)</translation>
-<translation id="2573269395582837871">选择照片和名</translation>
+<translation id="2573269395582837871">选择照片和名</translation>
 <translation id="5910363049092958439">图片存储为(&amp;V)...</translation>
 <translation id="8793975580333839911">运行此插件</translation>
 <translation id="1864146862702347178">启用滚动联想查询</translation>
 <translation id="637601477428304897">虽然您以前安全地访问过该网站,但现在访问该网站很可能会导致您的计算机受到恶意软件入侵。</translation>
 <translation id="2152580633399033274">显示所有图片(推荐)</translation>
 <translation id="5618075537869101857">糟糕!无法启动该信息亭模式下的应用。</translation>
-<translation id="6196041699996825846">详细了解访客浏览</translation>
+<translation id="6196041699996825846">详细了解访客浏览功能</translation>
 <translation id="337286756654493126">读取您在该应用中打开的文件夹</translation>
 <translation id="2783661497142353826">管理信息亭模式下的应用</translation>
 <translation id="5701101281789450335">语言和输入设置...</translation>
 <translation id="4426082685552308673">平均值</translation>
 <translation id="802597130941734897">管理送货地址…</translation>
 <translation id="1029317248976101138">缩放</translation>
-<translation id="1763108912552529023">继续探索</translation>
+<translation id="1763108912552529023">继续了解</translation>
 <translation id="5455790498993699893">第 <ph name="ACTIVE_MATCH"/> 条,共 <ph name="TOTAL_MATCHCOUNT"/> 条</translation>
 <translation id="1617097702943948177">临时存储:</translation>
 <translation id="6551508934388063976">无法使用命令。请按 Ctrl+N 打开一个新窗口。</translation>
 <translation id="1357589289913453911">扩展程序 ID</translation>
 <translation id="7570477672765183">点击以开始</translation>
 <translation id="8688579245973331962">看不到您的姓名?</translation>
-<translation id="3804941997676372569">进行搜索或说“Ok, Google”</translation>
+<translation id="3804941997676372569">直接输入内容开始搜索或说“Ok Google”</translation>
 <translation id="3226128629678568754">按“重新加载”按钮,重新提交加载该网页所需的数据。</translation>
 <translation id="1384035515048721170"><ph name="LEGAL_DOC_AGREEMENT"/>为了使您免受欺诈,系统会与 Google 电子钱包共享与您的计算机相关的信息(包括计算机的位置信息)。</translation>
 <translation id="6166101525540035714">您在使用 Chrome 浏览器期间需要遵守 Chrome <ph name="BEGIN_LINK1"/>服务条款<ph name="END_LINK1"/>和<ph name="BEGIN_LINK2"/>隐私权声明<ph name="END_LINK2"/>。</translation>
 <translation id="7664333939334980398">64</translation>
 <translation id="3947376313153737208">未选择</translation>
 <translation id="1346104802985271895">越南语输入法 (TELEX)</translation>
-<translation id="2242603986093373032">无设备</translation>
+<translation id="2242603986093373032">无任何设备</translation>
 <translation id="7713873128508426081">始终允许</translation>
 <translation id="5889282057229379085">中级 CA 证书数目的上限为:<ph name="NUM_INTERMEDIATE_CA"/></translation>
 <translation id="3180365125572747493">请输入密码,用于加密该证书文件。</translation>
 <translation id="8758455334359714415">内置异步 DNS</translation>
 <translation id="5585912436068747822">格式化失败</translation>
 <translation id="8766796754185931010">Kotoeri</translation>
-<translation id="6357619544108132570">欢迎使用<ph name="SHORT_PRODUCT_NAME"/>系列产品!这款计算机有许多独到之处。</translation>
+<translation id="6357619544108132570">欢迎使用<ph name="SHORT_PRODUCT_NAME"/>系列产品!这不是一款普通的计算机。</translation>
 <translation id="7786207843293321886">退出访客模式</translation>
 <translation id="3359256513598016054">证书政策约束</translation>
 <translation id="4433914671537236274">创建恢复媒体</translation>
           开始 &gt; 控制面板 &gt; 网络和 Internet &gt; 网络和共享中心 &gt; 疑难解答(位于底部)&gt; Internet 连接。
           <ph name="END_BOLD"/></translation>
 <translation id="6602090339694176254">启用实验性Chrome建议服务。</translation>
-<translation id="2143915448548023856">显示设置</translation>
+<translation id="2143915448548023856">显示设备设置</translation>
 <translation id="724691107663265825">要访问的网站包含恶意软件</translation>
 <translation id="1084824384139382525">复制链接地址(&amp;E)</translation>
 <translation id="2803306138276472711">Google安全浏览功能最近在<ph name="SITE"/>上<ph name="BEGIN_LINK"/>检测到了恶意软件<ph name="END_LINK"/>。平常非常安全的网站有时也会感染恶意软件。</translation>
 <translation id="419914107014680585">感谢您的帮助!</translation>
 <translation id="8035295275776379143">月</translation>
 <translation id="1974043046396539880">CRL 分发点</translation>
-<translation id="3024374909719388945">使用 24 小时制时间</translation>
+<translation id="3024374909719388945">使用24小时制</translation>
 <translation id="1867780286110144690"><ph name="PRODUCT_NAME"/>已准备就绪,可以进行安装。</translation>
 <translation id="8142732521333266922">确定,同步所有内容</translation>
 <translation id="8322814362483282060">系统已阻止此网页使用您的麦克风。</translation>
 <translation id="2728812059138274132">正在查找插件...</translation>
 <translation id="7516331482824334944">停用实验性Chromecast支持功能</translation>
 <translation id="2471964272749426546">泰米尔语输入法 (Tamil99)</translation>
-<translation id="9088917181875854783">请确认这是“<ph name="DEVICE_NAME"/>”上显示的匹配密钥:</translation>
+<translation id="9088917181875854783">请确认“<ph name="DEVICE_NAME"/>”上显示有此密钥:</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="5236831943526452400">关闭浏览器时清除Cookie及其他网站数据</translation>
 <translation id="1558834950088298812">更新扩展程序时出现</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> 想要使用您的麦克风。</translation>
 <translation id="2805756323405976993">应用</translation>
 <translation id="5151511998946489774">该网站的身份已通过<ph name="ISSUER"/>的验证,并可公开审核。</translation>
-<translation id="1608626060424371292">除此用户</translation>
+<translation id="1608626060424371292">除此用户</translation>
 <translation id="2779552785085366231">您可以将此网页添加到应用启动器</translation>
 <translation id="3075239840551149663">已创建受监管用户“<ph name="NEW_PROFILE_NAME"/>”!</translation>
 <translation id="3651020361689274926">请求的资源已不存在,并且没有转接地址。这估计是永久状态。</translation>
 <translation id="4742746985488890273">固定到文件架</translation>
 <translation id="8074984796671539016">启用“离线加载过时副本”按钮</translation>
 <translation id="1113869188872983271">撤消顺序调整(&amp;U)</translation>
-<translation id="16620462294541761">æ\8a±æ­\89ï¼\8cæ\82¨ç\9a\84å¯\86ç \81æ\97 æ³\95è¿\9bè¡\8céª\8cè¯\81ï¼\8c请é\87\8dè¯\95ã\80\82</translation>
+<translation id="16620462294541761">æ\8a±æ­\89ï¼\8cæ\97 æ³\95éª\8cè¯\81æ\82¨ç\9a\84å¯\86ç \81ï¼\8c请é\87\8dè¯\95ã\80\82</translation>
 <translation id="7199577450002167685"><ph name="SITE"/> 目前使用的临时 Diffie-Hellman 公钥安全系数比较低,因此 Chrome 无法验证服务器的身份。</translation>
 <translation id="5680545064257783621">为增强型书签实验提供一个“关闭”开关</translation>
 <translation id="9065010339377966858">SHA-256</translation>
 <translation id="7913678092679498828">知道了!</translation>
 <translation id="3655670868607891010">如果您频繁遇到此问题,请尝试这些<ph name="HELP_LINK"/>。</translation>
 <translation id="4504940961672722399">点击该图标或按 <ph name="EXTENSION_SHORTCUT"/>,即可使用此扩展程序。</translation>
-<translation id="2523966157338854187">打开特定网页或一组网页</translation>
+<translation id="2523966157338854187">打开特定网页或一组网页</translation>
 <translation id="4176463684765177261">已停用</translation>
 <translation id="2483350027598201151">兆字节</translation>
 <translation id="3880349122676857713">获取您输入的任何内容</translation>
 <translation id="2680208403056680091">您的互联网连接受到控制</translation>
 <translation id="8662978096466608964">Chrome 无法设置壁纸。</translation>
 <translation id="5334844597069022743">查看源代码</translation>
-<translation id="5534520101572674276">正在计算文件或目录大小</translation>
+<translation id="5534520101572674276">正在计算大小</translation>
 <translation id="9024127637873500333">在新标签页中打开(&amp;O)</translation>
 <translation id="1145509906569575332">打开 Ash 桌面</translation>
 <translation id="2332742915001411729">重置为默认设置</translation>
 <translation id="6190185222845843088">使用电子钱包沙盒服务器</translation>
 <translation id="3574772456110518971">停用实验性Chromecast支持功能。此功能可用来在Chromecast设备上播放和控制网络视频。</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME"/>(已在此设备上使用的名称)</translation>
-<translation id="3177048931975664371">点击隐藏密码</translation>
+<translation id="3177048931975664371">点击隐藏密码</translation>
 <translation id="5852137567692933493">重新启动,然后执行 Powerwash</translation>
 <translation id="3092544800441494315">包括此屏幕截图:</translation>
 <translation id="2633199387167390344"><ph name="NAME"/>占用了<ph name="USAGE"/> MB的磁盘空间。</translation>
 <translation id="6460601847208524483">查找下一个</translation>
 <translation id="397703832102027365">正在完成...</translation>
 <translation id="8146177459103116374">如果您已在此设备上注册,就能<ph name="LINK2_START"/>以现有用户的身份登录<ph name="LINK2_END"/>。</translation>
+<translation id="5072836811783999860">显示托管书签</translation>
 <translation id="4856478137399998590">您的移动数据服务已激活,可以立即使用</translation>
 <translation id="3305389145870741612">格式化过程可能需要几秒钟的时间,请稍候。</translation>
 <translation id="3648607100222897006">这些实验性功能随时可能会更改、中止或取消。因此,我们完全无法保证您启用某项实验性功能后会发生什么情况,您的浏览器甚至可能会自动崩溃。请注意,您的浏览器可能会删除您的所有数据,您的安全和隐私也有可能受到意外伤害。您启用的所有实验性功能将用于此浏览器的所有用户。启用前,请务必三思。</translation>
 <translation id="4672657274720418656">提取页面</translation>
 <translation id="3958548648197196644">猕猴桃</translation>
 <translation id="1514298457297359873">可让应用仅出于测试 NaCl 插件的目的使用 NaCl Socket API。</translation>
-<translation id="8263231521757761563">有效的协议处理程序</translation>
+<translation id="8263231521757761563">使用中的协议处理程序</translation>
 <translation id="2749756011735116528">登录<ph name="PRODUCT_NAME"/></translation>
 <translation id="8434480141477525001">NaCl调试端口</translation>
 <translation id="2653131220478186612">这可能会产生危害。我们已经提醒过您了...</translation>
 <translation id="5958529069007801266">受监管用户</translation>
 <translation id="3129173833825111527">左侧页边距</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES"/> K(实际大小为 <ph name="NUM_KILOBYTES_LIVE"/> K)</translation>
-<translation id="5554573843028719904">其他 Wi-Fi 网络...</translation>
+<translation id="5554573843028719904">其他Wi-Fi网络...</translation>
 <translation id="340282674066624">已下载 <ph name="DOWNLOAD_RECEIVED"/>,还需 <ph name="TIME_LEFT"/></translation>
 <translation id="7013485839273047434">获取更多扩展程序</translation>
 <translation id="2124335647227850314">停用显示器颜色校准,即使显示器支持该功能。</translation>
 <translation id="1317502925920562130">这是您想要的主页吗?</translation>
 <translation id="7763146744708046348">请勿汇总数据 - 这可能会使速度变慢!</translation>
 <translation id="8616352574453019203">ID为“<ph name="IMPORT_ID"/>”的共享模块未列入白名单,无法导入。</translation>
-<translation id="5626134646977739690">名:</translation>
+<translation id="5626134646977739690">名:</translation>
 <translation id="4899837262951879307">触摸滚动模式。</translation>
 <translation id="5854409662653665676">如果您经常遇到问题,可以试着用以下方法解决此模块存在的问题:</translation>
 <translation id="3776796446459804932">此扩展程序违反了 Chrome 网上应用店政策。</translation>
 <translation id="1254117744268754948">选择文件夹</translation>
 <translation id="2168725742002792683">文件扩展名</translation>
 <translation id="7936369818837152377">恢复上一个浏览会话所需的时间</translation>
-<translation id="3974195870082915331">点击显示密码</translation>
+<translation id="3974195870082915331">点击显示密码</translation>
 <translation id="2612676031748830579">卡号</translation>
 <translation id="1753905327828125965">常去网站</translation>
 <translation id="4543778593405494224">证书管理器</translation>
 <translation id="6869402422344886127">选中的复选框</translation>
 <translation id="3428010780253032925">停用在视图中以矩形表示目标触摸区域</translation>
 <translation id="5637380810526272785">输入法</translation>
+<translation id="3613134908380545408">显示“<ph name="FOLDER_NAME"/>”</translation>
 <translation id="2837049386027881519">此连接必须使用较旧版本的 TLS 或 SSL 协议重试,这通常意味着该服务器使用的软件版本过低或者可能存在其他安全问题。</translation>
 <translation id="404928562651467259">警告</translation>
 <translation id="4289300219472526559">开始讲话</translation>
 <translation id="4613953875836890448">预编辑缓冲区内的中文字符数上限(包括正在输入的注音符号)</translation>
 <translation id="4784330909746505604">PowerPoint 演示文稿</translation>
 <translation id="4345587454538109430">配置...</translation>
-<translation id="3255228561559750854">输入搜索内容或说“Ok Google”</translation>
+<translation id="3255228561559750854">直接输入内容开始搜索或说“Ok Google”</translation>
 <translation id="8148264977957212129">拼音输入法</translation>
 <translation id="2288278176040912387">电唱机</translation>
 <translation id="7772032839648071052">确认密码</translation>
 <translation id="2225024820658613551">您不应再继续,&lt;strong&gt;尤其&lt;/strong&gt;是如果您以前从未在此网站看到这一警告信息,则更不应继续操作。</translation>
 <translation id="2049639323467105390">此设备由 <ph name="DOMAIN"/> 管理。</translation>
 <translation id="1932098463447129402">不早于</translation>
-<translation id="5409029099497331039">Surprise Me</translation>
+<translation id="5409029099497331039">随机更换</translation>
 <translation id="7845920762538502375">由于无法连接到同步服务器,“<ph name="PRODUCT_NAME"/>”无法同步您的数据。正在重试...</translation>
 <translation id="3819415294190923087">选择网络</translation>
 <translation id="7325437708553334317">“高反差”扩展程序</translation>
 <translation id="6921812972154549137">Cookie及其他网站和插件数据</translation>
 <translation id="6886871292305414135">在新标签页中打开链接(&amp;T)</translation>
 <translation id="4499634737431431434">周</translation>
-<translation id="7961015016161918242">从来没有</translation>
+<translation id="7961015016161918242">永不保存</translation>
 <translation id="3950924596163729246">无法访问网络。</translation>
 <translation id="5212461935944305924">Cookie 和网站数据例外情况</translation>
 <translation id="1543152709146436555">停用触摸调整。</translation>
 <translation id="2859369953631715804">选择移动网络</translation>
 <translation id="6934265752871836553">使用全新的代码提升Chrome提取内容的速度。在此路径之后进行的更改很可能会影响大量内容。</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">始终用Adobe Reader打开</translation>
 <translation id="8274359292107649245">打开桌面版 Chrome</translation>
 <translation id="1571119610742640910">合成固定的根背景。</translation>
 <translation id="6514565641373682518">此网页已隐藏鼠标指针。</translation>
 <translation id="5830720307094128296">将页面存储为(&amp;A)...</translation>
 <translation id="2448312741937722512">类型</translation>
 <translation id="2568958845983666692">千字节</translation>
-<translation id="5209320130288484488">æ\89¾ä¸\8då\88°设备</translation>
+<translation id="5209320130288484488">æ\9cªæ\89¾å\88°ä»»ä½\95设备</translation>
 <translation id="473221644739519769">将您的打印机添加到Google云打印可让您随时随地打印。您可以与自己选择的任何用户共享这些打印机,还可以通过Chrome、手机、平板电脑、PC或任何其他联网设备使用这些打印机进行打印。</translation>
 <translation id="6154080734794712683">某个扩展程序更改了您点击“主页”按钮后系统显示的页面。</translation>
 <translation id="4668954208278016290">将映像提取到设备上时出现问题。</translation>
 <translation id="3807747707162121253">取消(&amp;C)</translation>
 <translation id="202352106777823113">下载时间过长,网络已停止下载。</translation>
 <translation id="6155817405098385604">在无法使用 GPU 的情况下,不改用 3D 软件光栅器。</translation>
-<translation id="3306897190788753224">暂时停用个性化转化、基于历史记录的建议以及用户典。</translation>
+<translation id="3306897190788753224">暂时停用个性化转化、基于历史记录的建议以及用户典。</translation>
 <translation id="8941882480823041320">上一个字</translation>
 <translation id="2489435327075806094">指针速度:</translation>
 <translation id="2574102660421949343">允许来自 <ph name="DOMAIN"/> 的 Cookie。</translation>
 <translation id="824543159844843373">激活启动器项 3</translation>
 <translation id="3819800052061700452">全屏(&amp;F)</translation>
 <translation id="48607902311828362">飞行模式</translation>
+<translation id="711840821796638741">显示托管书签</translation>
 <translation id="3360297538363969800">打印失败。请检查您的打印机,然后重试。</translation>
 <translation id="680572642341004180">启用 <ph name="SHORT_PRODUCT_OS_NAME"/>上的 RLZ 跟踪功能。</translation>
 <translation id="688797901999351107">请停止使用要召回的充电器。</translation>
 <translation id="7885283703487484916">很短</translation>
 <translation id="4361745360460842907">作为标签页打开</translation>
 <translation id="5238278114306905396">已自动删除应用“<ph name="EXTENSION_NAME"/>”。</translation>
-<translation id="4538792345715658285">已按照企业政策安装。</translation>
+<translation id="4538792345715658285">企业政策安装。</translation>
 <translation id="2988488679308982380">无法安装程序包:“<ph name="ERROR_CODE"/>”</translation>
 <translation id="2396249848217231973">撤消删除(&amp;U)</translation>
 <translation id="55815574178531051">Chrome 在本次连接尝试期间收到的证书已被撤消。</translation>
 <translation id="4645676300727003670">保留(&amp;K)</translation>
 <translation id="3225579507836276307">某个第三方扩展程序已阻止对此网页的访问。</translation>
 <translation id="6815551780062710681">修改</translation>
-<translation id="6911468394164995108">连接其他...</translation>
+<translation id="6911468394164995108">连接其他网络...</translation>
 <translation id="2510708650472996893">颜色配置:</translation>
 <translation id="343467364461911375">有些内容服务会使用机器标识符来标识您的个人身份,以便授予您访问受保护内容的权限。</translation>
 <translation id="5061708541166515394">对比度</translation>
 <translation id="5284518706373932381">请过几个小时后再重新访问此网站。Google安全浏览功能最近在<ph name="SITE"/>上<ph name="BEGIN_LINK"/>检测到了恶意软件<ph name="END_LINK"/>。平常非常安全的网站有时也会感染恶意软件。</translation>
 <translation id="969892804517981540">正式版本</translation>
 <translation id="1691608011302982743">您过快地移除了自己的设备!</translation>
-<translation id="445923051607553918">加入 Wi-Fi 网络</translation>
+<translation id="445923051607553918">加入Wi-Fi网络</translation>
 <translation id="1898137169133852367">Powerwash会将您的<ph name="IDS_SHORT_PRODUCT_NAME"/>设备重置为初始状态。此外,您的设备还会还原到之前的<ph name="IDS_SHORT_PRODUCT_NAME"/>更新版本。</translation>
 <translation id="4215898373199266584">嘘!下次您可以使用隐身模式(快捷键为 <ph name="INCOGNITO_MODE_SHORTCUT"/>)。</translation>
 <translation id="1048597748939794622">已针对所有图层强制启用</translation>
 <translation id="7053681315773739487">“应用”文件夹</translation>
 <translation id="6444070574980481588">设置日期和时间</translation>
 <translation id="4377301101584272308">允许所有网站跟踪您所在的位置</translation>
-<translation id="2742870351467570537">除所选项</translation>
+<translation id="2742870351467570537">除所选项</translation>
 <translation id="7561196759112975576">永远</translation>
 <translation id="2116673936380190819">过去一小时</translation>
 <translation id="5765491088802881382">没有可用网络</translation>
index 393c541..892737a 100644 (file)
 <translation id="8912793549644936705">延伸</translation>
 <translation id="1464724975715666883">發生 1 個錯誤。</translation>
 <translation id="7864539943188674973">停用藍牙</translation>
-<translation id="1486096554574027028">搜尋關鍵字</translation>
+<translation id="1486096554574027028">搜尋密碼</translation>
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME"/> 偵測到瀏覽器設定可能已在您不知情的情況下遭到變更。您要將瀏覽器設定重設為其原始預設值嗎?</translation>
 <translation id="1836938920852968258">停用 NTP [其他裝置] 選單。</translation>
 <translation id="8184538546369750125">使用全域預設值 (允許)</translation>
 <translation id="2053686653008575655">您可以參閱<ph name="BEGIN_LINK"/>常見問題<ph name="END_LINK"/>,並繼續搭配使用 HP Chromebook 11 和任何其他經過認證的 micro-USB 充電器 (例如平板電腦或智慧型手機隨附的充電器)。確保您的安全是我們的第一優先要務,造成不便,敬請見諒。</translation>
 <translation id="6423064450797205562"><ph name="SHORT_PRODUCT_NAME"/> 執行要求動作的速度相關數據</translation>
 <translation id="3690673539902120157">這個擴充功能需要以下權限,您確定要安裝嗎?</translation>
-<translation id="4091434297613116013">張</translation>
+<translation id="4091434297613116013">張</translation>
 <translation id="7475671414023905704">Netscape 遺失密碼網址</translation>
 <translation id="3335947283844343239">重新開啟先前關閉的分頁</translation>
 <translation id="5848934677402291689">正在儲存為 PDF</translation>
 <translation id="3180365125572747493">請輸入對這個憑證檔案進行加密時使用的密碼。</translation>
 <translation id="8663625831674359823">注意:僅適用於開發頻道和 Canary 頻道。請在焦點處顯示的網址列中開啟建議功能,然後再輸入。</translation>
 <translation id="7386824183915085801">系統會提交您的 Chrome 和作業系統版本,
-          以及您在上方選擇一併提交的任何資訊。
-          如果您一併提交電子郵件地址,Google 可能會針對您的意見回報與您聯絡。
-          這些意見的用途是協助診斷問題及改善 Chrome,若其中含有任何個人資訊,
-          無論是您本身願意提供或是不慎加入其中,我們一律會根據隱私權政策
-          保障資訊安全。<ph name="BEGIN_BOLD"/>提交這些資訊,即表示您同意 Google 使用您所提供的意見
-          改善任何 Google 產品或服務。
-          <ph name="END_BOLD"/></translation>
+以及您在上方選擇一併提交的任何資訊。
+如果您一併提交電子郵件地址,Google 可能會針對您的意見回報與您聯絡。
+這些意見的用途是協助診斷問題及改善 Chrome,若其中含有任何個人資訊,
+無論是您本身願意提供或是不慎加入其中,我們一律會根據隱私權政策保障資訊安全。<ph name="BEGIN_BOLD"/>提交這些資訊,即表示您同意 Google 使用您所提供的意見改善任何 Google 產品或服務。
+<ph name="END_BOLD"/></translation>
 <translation id="123578888592755962">磁碟空間已滿</translation>
 <translation id="5496587651328244253">整理</translation>
 <translation id="5967867314010545767">從紀錄中移除</translation>
 <translation id="4278390842282768270">允許</translation>
 <translation id="2074527029802029717">取消分頁固定</translation>
 <translation id="1533897085022183721">電池可使用時間低於 <ph name="MINUTES"/>。</translation>
-<translation id="7382160026931194400">已儲存的|內容設定|和#搜尋引擎#資料不會被清除,而且可能會反映您的瀏覽習慣。</translation>
+<translation id="7382160026931194400">已儲存的內容設定及搜尋引擎不會遭到清除,而這可能反映您的瀏覽習慣。</translation>
 <translation id="7503821294401948377">無法載入瀏覽器動作的圖示「<ph name="ICON"/>」。</translation>
 <translation id="4809190954660909198">新增帳單詳細資訊...</translation>
 <translation id="3942946088478181888">我需要進一步資訊</translation>
 <translation id="523397668577733901">或許您想要<ph name="BEGIN_LINK"/>瀏覽擴充功能庫<ph name="END_LINK"/>?</translation>
 <translation id="2922350208395188000">無法檢查伺服器憑證。</translation>
 <translation id="3778740492972734840">開發人員工具(&amp;D)</translation>
-<translation id="8335971947739877923">匯出中...</translation>
+<translation id="8335971947739877923">匯出</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN"/> 已顯示為全螢幕,並且停用了滑鼠游標。</translation>
 <translation id="38275787300541712">完成時請按下 Enter 鍵</translation>
 <translation id="6004539838376062211">拼字檢查程式選項(&amp;S)</translation>
 <translation id="6460601847208524483">尋找下一個項目</translation>
 <translation id="397703832102027365">即將完成...</translation>
 <translation id="8146177459103116374">如果您已在這部裝置上註冊,您可以<ph name="LINK2_START"/>用現有的使用者身分登入<ph name="LINK2_END"/>。</translation>
+<translation id="5072836811783999860">顯示受管理書籤</translation>
 <translation id="4856478137399998590">您的行動數據服務已啟用,隨時可供使用</translation>
 <translation id="3305389145870741612">格式化程序可能需要幾秒鐘,請稍候。</translation>
 <translation id="3648607100222897006">這些實驗性功能隨時都有可能變動、中斷或消失。我們完全無法保證啟用這些實驗性功能會導致何種後果,您的瀏覽器說不定會突然自己燒掉。當然這只是玩笑話,不過您的瀏覽器可能真的會刪除您的所有資料,或是意外洩漏您的安全性和隱私權設定。只要您啟用了任何實驗性功能,這個瀏覽器的所有使用者都會啟用該功能。使用時請務必小心謹慎。</translation>
 <translation id="6869402422344886127">勾選的核取方塊</translation>
 <translation id="3428010780253032925">停止顯示矩形觸控目標</translation>
 <translation id="5637380810526272785">輸入法</translation>
+<translation id="3613134908380545408">顯示「<ph name="FOLDER_NAME"/>」</translation>
 <translation id="2837049386027881519">必須使用較舊版的 TLS 或 SSL 通訊協定重試連線。這通常表示伺服器所使用的軟體非常老舊,而且可能產生其他安全問題。</translation>
 <translation id="404928562651467259">警告</translation>
 <translation id="4289300219472526559">Start Speaking</translation>
 <translation id="2859369953631715804">選擇行動網路</translation>
 <translation id="6934265752871836553">使用試驗性程式碼來加快 Chrome 繪製內容的速度。這個路徑以下的變更很可能導致大量內容無法正常顯示。</translation>
 <translation id="2788135150614412178">+</translation>
+<translation id="424726838611654458">一律在 Adobe Reader 中開啟</translation>
 <translation id="8274359292107649245">以電腦模式開啟 Chrome</translation>
 <translation id="1571119610742640910">合成修正根背景。</translation>
 <translation id="6514565641373682518">這個網頁已停用滑鼠游標。</translation>
 <translation id="824543159844843373">啟用啟動器項目 3</translation>
 <translation id="3819800052061700452">全螢幕(&amp;F)</translation>
 <translation id="48607902311828362">飛航模式</translation>
+<translation id="711840821796638741">顯示受管理書籤</translation>
 <translation id="3360297538363969800">列印失敗。請檢查您的印表機,然後再試一次。</translation>
 <translation id="680572642341004180">針對 <ph name="SHORT_PRODUCT_OS_NAME"/> 啟用 RLZ  追蹤功能。</translation>
 <translation id="688797901999351107">請停止使用應回收的充電器。</translation>
index 1626521..5be64fd 100644 (file)
@@ -206,7 +206,7 @@ Sollten Sie sich trotzdem anmelden, werden die Chrome-Daten wie Lesezeichen, Ver
 <translation id="6502165024350711060">Vorschlag von Chrome</translation>
 <translation id="3047079729301751317">Wenn Sie die Verbindung zu <ph name="USERNAME"/> trennen, werden Ihr Verlauf sowie Ihre Lesezeichen, Einstellungen und sonstigen auf diesem Gerät gespeicherten Chrome-Daten gelöscht. In Ihrem Google-Konto gespeicherte Daten bleiben erhalten und können über das <ph name="GOOGLE_DASHBOARD_LINK"/>Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK"/> verwaltet werden.</translation>
 <translation id="1001534784610492198">Das Installationsarchiv ist beschädigt oder ungültig. Laden Sie Google Chrome erneut herunter.</translation>
-<translation id="2246246234298806438">Google Chrome kann ohne den integrierten PDF Viewer keine Druckvorschau anzeigen.</translation>
+<translation id="2246246234298806438">Google Chrome kann ohne den integrierten PDF-Viewer keine Druckvorschau anzeigen.</translation>
 <translation id="6626317981028933585">Leider sind Ihre Mozilla Firefox-Einstellungen nicht verfügbar, wenn dieser Browser ausgeführt wird. Um diese Einstellungen in Google Chrome zu importieren, speichern Sie Ihre Arbeit und schließen Sie alle Firefox-Fenster. Klicken Sie anschließend auf &quot;Weiter&quot;.</translation>
 <translation id="7242029209006116544">Sie melden sich mit einem verwalteten Konto an und ermöglichen dessen Administrator Zugriff auf Ihr Google Chrome-Profil. Ihre Chrome-Daten, wie Apps, Lesezeichen, Verlauf, Passwörter und andere Einstellungen, werden dauerhaft mit <ph name="USER_NAME"/> verknüpft. Sie können diese Daten über das Google Konten-Dashboard löschen, aber nicht mit einem anderen Konto verknüpfen. Wenn Sie Ihre bestehenden Chrome-Daten getrennt verwenden möchten, können Sie ein neues Profil erstellen. <ph name="LEARN_MORE"/></translation>
 <translation id="5386244825306882791">Die Erweiterung legt auch fest, welche Seite beim Start von Chrome oder bei der Suche über die Omnibox angezeigt wird.</translation>
index 29940fb..dbd9e3f 100644 (file)
@@ -198,7 +198,7 @@ Si accedes de todos modos, se fusionará la información de Google Chrome, como
 <translation id="7396375882099008034">Permite que Chrome acceda a la red en tu configuración de antivirus o de firewall.</translation>
 <translation id="9102715433345326100">Chrome bloqueó este archivo porque es malicioso.</translation>
 <translation id="3170677364322086041">Este sitio utiliza el complemento Chrome Frame discontinuado que ya no recibe actualizaciones de seguridad ni estabilidad. Debes desinstalarlo y actualizar a un navegador más reciente.</translation>
-<translation id="8205111949707227942">Opcional: Ayúdanos a mejorar Chrome SO enviando automáticamente estadísticas de uso e informes sobre fallos a Google.</translation>
+<translation id="8205111949707227942">Opcional: Ayúdanos a mejorar Chrome SO enviando estadísticas de uso e informes sobre fallos automáticamente a Google.</translation>
 <translation id="7253415505590551024">Actualmente hay descargas en curso. ¿Quieres salir de Google Chrome y cancelarlas?</translation>
 <translation id="3622797965165704966">Ahora es más sencillo utilizar Chrome con la cuenta de Google y en computadoras compartidas.</translation>
 <translation id="7196020411877309443">¿Por qué estoy viendo esto?</translation>
index e081d01..544a176 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
 <translation id="8000275528373650868">Google Chrome को Windows Vista या SP2 वाले Windows XP या इसके बाद के संस्करण की आवश्यकता है.</translation>
-<translation id="8485767968786176057">à¤\87स à¤¸à¥\8dथिति à¤®à¥\87à¤\82, à¤ªà¥\8dरमाणपतà¥\8dर à¤®à¥\87à¤\82 à¤¸à¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¤¤à¤¾ à¤\89स à¤µà¥\87बसाà¤\87à¤\9f à¤\95à¥\87 à¤ªà¤¤à¥\87 à¤¸à¥\87 à¤®à¥\87ल à¤¨à¤¹à¥\80à¤\82 à¤\96ाता à¤\9cिस à¤ªà¤° à¤\86पà¤\95à¥\87 à¤¬à¥\8dराà¤\89à¤\9c़र à¤¨à¥\87 à¤\9cानà¥\87 à¤\95ा à¤ªà¥\8dरयास à¤\95िया à¤¥à¤¾. à¤\87सà¤\95ा à¤\8fà¤\95 à¤¸à¤\82भावित à¤\95ारण à¤¯à¤¹ à¤¹à¥\88 à¤\95ि à¤\86पà¤\95à¥\87 à¤¸à¤\82वाद अन्य वेबसाइट पर प्रमाणपत्र प्रस्तुत करने वाले किसी हमलावर द्वारा बीच में रोके जा रहे हैं, जिसके कारण गलत मिलान होगा. एक अन्य संभावित कारण यह है कि सर्वर को, आपके द्वारा देखने का प्रयास की जा रही वेबसाइट सहित, एकाधिक वेबसाइटों के लिए समान प्रमाणपत्र लौटाने के लिए सेट किया गया है, चाहे वह प्रमाणपत्र उन सभी वेबसाइटों के लिए मान्य हो या नहीं. Google Chrome निश्चित रूप से यह कह सकता है कि आप &lt;strong&gt;<ph name="DOMAIN2"/>&lt;/strong&gt; पर पहुंच गए हैं, लेकिन यह सत्यापित नहीं कर सकता कि वह &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; जैसी ही साइट है जिस पर आप पहुंचना चाहते थे. यदि आप आगे बढ़ते हैं, तो Chrome अब नाम के गलत मिलानों की जांच नहीं करेगा.</translation>
+<translation id="8485767968786176057">à¤\87स à¤¸à¥\8dथिति à¤®à¥\87à¤\82, à¤ªà¥\8dरमाणपतà¥\8dर à¤®à¥\87à¤\82 à¤¸à¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¤¤à¤¾ à¤\89स à¤µà¥\87बसाà¤\87à¤\9f à¤\95à¥\87 à¤ªà¤¤à¥\87 à¤¸à¥\87 à¤®à¥\87ल à¤¨à¤¹à¥\80à¤\82 à¤\96ाता à¤\9cिस à¤ªà¤° à¤\86पà¤\95à¥\87 à¤¬à¥\8dराà¤\89à¤\9c़र à¤¨à¥\87 à¤\9cानà¥\87 à¤\95ा à¤ªà¥\8dरयास à¤\95िया à¤¥à¤¾. à¤\87सà¤\95ा à¤\8fà¤\95 à¤¸à¤\82भावित à¤\95ारण à¤¯à¤¹ à¤¹à¥\88 à¤\95ि à¤\86पà¤\95à¥\87 à¤¡à¥\89यलà¥\89à¤\97 अन्य वेबसाइट पर प्रमाणपत्र प्रस्तुत करने वाले किसी हमलावर द्वारा बीच में रोके जा रहे हैं, जिसके कारण गलत मिलान होगा. एक अन्य संभावित कारण यह है कि सर्वर को, आपके द्वारा देखने का प्रयास की जा रही वेबसाइट सहित, एकाधिक वेबसाइटों के लिए समान प्रमाणपत्र लौटाने के लिए सेट किया गया है, चाहे वह प्रमाणपत्र उन सभी वेबसाइटों के लिए मान्य हो या नहीं. Google Chrome निश्चित रूप से यह कह सकता है कि आप &lt;strong&gt;<ph name="DOMAIN2"/>&lt;/strong&gt; पर पहुंच गए हैं, लेकिन यह सत्यापित नहीं कर सकता कि वह &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; जैसी ही साइट है जिस पर आप पहुंचना चाहते थे. यदि आप आगे बढ़ते हैं, तो Chrome अब नाम के गलत मिलानों की जांच नहीं करेगा.</translation>
 <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation>
 <translation id="123620459398936149">Chrome OS आपका डेटा समन्वयित नहीं कर सका. कृपया अपना समन्वयन पासफ़्रेज़ अपडेट करें.</translation>
 <translation id="5430073640787465221">आपकी प्राथमिकताएं फ़ाइल दूषित या अमान्‍य है. Google Chrome आपकी सेटिंग पुनर्प्राप्त करने में असमर्थ है.</translation>
@@ -91,7 +91,7 @@
 <translation id="1457721931618994305">Google Chrome अपडेट हो रहा है...</translation>
 <translation id="2429317896000329049">Google Chrome आपका डेटा समन्‍वयित नहीं कर सका क्‍योंकि समन्‍वयन आपके डोमेन के लिए उपलब्‍ध नहीं है.</translation>
 <translation id="7747138024166251722">इंस्टॉलर अस्थायी निर्देशिका नहीं बना सकता. कृपया डिस्क में खाली जगह और सॉफ़्टवेयर को इंस्‍टॉल करने की अनुमति की जांच करें.</translation>
-<translation id="6557998774620459028">à¤\86पनà¥\87 &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\82à¤\9aनà¥\87 à¤\95ा à¤ªà¥\8dरयास à¤\95िया, à¤²à¥\87à¤\95िन à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤\90सà¥\80 à¤\87à¤\95ाà¤\88 à¤¦à¥\8dवारा à¤\9cारà¥\80 à¤ªà¥\8dरमाणपतà¥\8dर à¤ªà¥\8dरसà¥\8dâ\80\8dतà¥\81त à¤\95िया à¤\9cà¥\8b à¤\86पà¤\95à¥\87 à¤\95à¤\82पà¥\8dâ\80\8dयà¥\82à¤\9fर à¤\95à¥\87 à¤\91परà¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤¿à¤¸à¥\8dâ\80\8dà¤\9fम à¤¦à¥\8dवारा à¤µà¤¿à¤¶à¥\8dवसà¥\8dâ\80\8dत à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88. à¤\87सà¤\95ा à¤\85रà¥\8dथ à¤¯à¤¹ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤¸à¥\8dâ\80\8dवयà¤\82 à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\8dरà¥\87डà¥\87à¤\82शियल à¤\9cà¥\87नरà¥\87à¤\9f à¤\95र à¤²à¤¿à¤\8f à¤¹à¥\88à¤\82, à¤\9cिन à¤ªà¤° Chrome à¤¦à¥\8dवारा à¤ªà¤¹à¤\9aान à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤µà¤¿à¤¶à¥\8dवास à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता, à¤¯à¤¾ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤\95à¥\8bà¤\88 à¤¹à¤®à¤²à¤¾à¤µà¤° à¤\86पà¤\95à¥\87 à¤¸à¤\82वाद को बीच में रोकने का प्रयास कर रहा हो.</translation>
+<translation id="6557998774620459028">à¤\86पनà¥\87 &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\82à¤\9aनà¥\87 à¤\95ा à¤ªà¥\8dरयास à¤\95िया, à¤²à¥\87à¤\95िन à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤\90सà¥\80 à¤\87à¤\95ाà¤\88 à¤¦à¥\8dवारा à¤\9cारà¥\80 à¤ªà¥\8dरमाणपतà¥\8dर à¤ªà¥\8dरसà¥\8dâ\80\8dतà¥\81त à¤\95िया à¤\9cà¥\8b à¤\86पà¤\95à¥\87 à¤\95à¤\82पà¥\8dâ\80\8dयà¥\82à¤\9fर à¤\95à¥\87 à¤\91परà¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤¿à¤¸à¥\8dâ\80\8dà¤\9fम à¤¦à¥\8dवारा à¤µà¤¿à¤¶à¥\8dवसà¥\8dâ\80\8dत à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88. à¤\87सà¤\95ा à¤\85रà¥\8dथ à¤¯à¤¹ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤¸à¥\8dâ\80\8dवयà¤\82 à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\8dरà¥\87डà¥\87à¤\82शियल à¤\9cà¥\87नरà¥\87à¤\9f à¤\95र à¤²à¤¿à¤\8f à¤¹à¥\88à¤\82, à¤\9cिन à¤ªà¤° Chrome à¤¦à¥\8dवारा à¤ªà¤¹à¤\9aान à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤µà¤¿à¤¶à¥\8dवास à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता, à¤¯à¤¾ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤\95à¥\8bà¤\88 à¤¹à¤®à¤²à¤¾à¤µà¤° à¤\86पà¤\95à¥\87 à¤¡à¥\89यलà¥\89à¤\97 को बीच में रोकने का प्रयास कर रहा हो.</translation>
 <translation id="5170938038195470297">आपकी प्रोफ़ाइल का उपयोग नहीं किया जा सकता क्‍योंकि यह Google Chrome के किसी नए संस्‍करण से है.
 
 कुछ विशेषताएं अनुपलब्‍ध हो सकती हैं. कृपया कोई भिन्‍न प्रोफ़ाइल निर्देशिका निर्दिष्ट करें या Chrome के किसी नए संस्‍करण का उपयोग करें.</translation>
 <translation id="7908968924842975895">यह कंप्यूटर अब Google Chrome अपडेट प्राप्त नहीं करेगा क्योंकि इसका हार्डवेयर अब समर्थित नहीं है.</translation>
 <translation id="2748463065602559597">आप एक सुरक्षि‍त Google Chrome पृष्‍ठ देख रहे हैं.</translation>
 <translation id="7185038942300673794"><ph name="EXTENSION_NAME"/> को Chrome में जोड़ दिया गया है.</translation>
-<translation id="1786477462680638703">à¤\86पनà¥\87 &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\82à¤\9aनà¥\87 à¤\95ा à¤ªà¥\8dरयास à¤\95िया, à¤²à¥\87à¤\95िन à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤\90सà¥\80 à¤\87à¤\95ाà¤\88 à¤¦à¥\8dवारा à¤\9cारà¥\80 à¤ªà¥\8dरमाणपतà¥\8dर à¤ªà¥\8dरसà¥\8dâ\80\8dतà¥\81त à¤\95िया à¤\9cà¥\8b Google Chrome à¤¦à¥\8dवारा à¤µà¤¿à¤¶à¥\8dवसà¥\8dâ\80\8dत à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88. à¤\87सà¤\95ा à¤\85रà¥\8dथ à¤¯à¤¹ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤¸à¥\8dâ\80\8dवयà¤\82 à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\8dरà¥\87डà¥\87à¤\82शियल à¤\9cà¥\87नरà¥\87à¤\9f à¤\95र à¤²à¤¿à¤\8f à¤¹à¥\88à¤\82, à¤\9cिन à¤ªà¤° Chrome à¤¦à¥\8dवारा à¤ªà¤¹à¤\9aान à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤µà¤¿à¤¶à¥\8dवास à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता, à¤¯à¤¾ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤\95à¥\8bà¤\88 à¤¹à¤®à¤²à¤¾à¤µà¤° à¤\86पà¤\95à¥\87 à¤¸à¤\82वाद को बीच में रोकने का प्रयास कर रहा हो.</translation>
+<translation id="1786477462680638703">à¤\86पनà¥\87 &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\82à¤\9aनà¥\87 à¤\95ा à¤ªà¥\8dरयास à¤\95िया, à¤²à¥\87à¤\95िन à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤\90सà¥\80 à¤\87à¤\95ाà¤\88 à¤¦à¥\8dवारा à¤\9cारà¥\80 à¤ªà¥\8dरमाणपतà¥\8dर à¤ªà¥\8dरसà¥\8dâ\80\8dतà¥\81त à¤\95िया à¤\9cà¥\8b Google Chrome à¤¦à¥\8dवारा à¤µà¤¿à¤¶à¥\8dवसà¥\8dâ\80\8dत à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88. à¤\87सà¤\95ा à¤\85रà¥\8dथ à¤¯à¤¹ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤¸à¤°à¥\8dवर à¤¨à¥\87 à¤¸à¥\8dâ\80\8dवयà¤\82 à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\8dरà¥\87डà¥\87à¤\82शियल à¤\9cà¥\87नरà¥\87à¤\9f à¤\95र à¤²à¤¿à¤\8f à¤¹à¥\88à¤\82, à¤\9cिन à¤ªà¤° Chrome à¤¦à¥\8dवारा à¤ªà¤¹à¤\9aान à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤µà¤¿à¤¶à¥\8dवास à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता, à¤¯à¤¾ à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88 à¤\95ि à¤\95à¥\8bà¤\88 à¤¹à¤®à¤²à¤¾à¤µà¤° à¤\86पà¤\95à¥\87 à¤¡à¥\89यलà¥\89à¤\97 को बीच में रोकने का प्रयास कर रहा हो.</translation>
 <translation id="7494905215383356681">Chrome ओपन सोर्स लाइसेंस</translation>
 <translation id="2346876346033403680">इस कंप्यूटर पर किसी अन्य व्यक्ति ने <ph name="ACCOUNT_EMAIL_LAST"/> के रूप में Chrome में प्रवेश किया था. यदि वह आपका खाता नहीं है, तो अपनी जानकारी अलग रखने के लिए आप एक नया Chrome उपयोगकर्ता बना सकते हैं.
 
         <ph name="ADVANCED_TITLE"/>
         पर जाएं और &quot;<ph name="NO_PREFETCH_DESCRIPTION"/>&quot; का चयन रद्द करें.
         यदि इससे समस्या का समाधान नहीं होता, तो हम बेहतर प्रदर्शन के लिए इस
-        à¤µà¤¿à¤\95लà¥\8dप à¤\95à¥\8b à¤ªà¥\81न: à¤\9aà¥\81ननà¥\87 à¤\95à¥\80 à¤\85नà¥\81शà¤\82सा à¤\95रते हैं.</translation>
+        à¤µà¤¿à¤\95लà¥\8dप à¤\95à¥\8b à¤ªà¥\81न: à¤\9aà¥\81ननà¥\87 à¤\95à¥\80 à¤¸à¥\81à¤\9dाव à¤¦à¥\87ते हैं.</translation>
 <translation id="6235018212288296708">mDNS ट्रैफ़िक की अनुमति देने के लिए Google Chrome हेतु इनबाउंड नियम.</translation>
 <translation id="61852838583753520">&amp;Chrome OS को अपडेट करें</translation>
 <translation id="5028489144783860647">Google Chrome आपका डेटा समन्‍वयित नहीं कर सका. कृपया अपना समन्‍वयन पासफ़्रेज़ अपडेट करें.</translation>
index 34e9106..1b6386f 100644 (file)
         Chrome ಗೆ ಅನುಮತಿಸಿ.</translation>
 <translation id="9102715433345326100">ಈ ಫೈಲ್ ದೋಷಪೂರಿತವಾಗಿದೆ, ಮತ್ತು Chrome ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation>
 <translation id="3170677364322086041">ಸುರಕ್ಷತೆ ಮತ್ತು ಸ್ಥಿರತೆ ನವೀಕರಣಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ಸ್ವೀಕರಿಸದಿರುವ ನಿವೃತ್ತ Chrome ಫ್ರೇಮ್ ಪ್ಲಗ್‌-ಇನ್‌ ಅನ್ನು ಈ ಸೈಟ್‌ ಬಳಸುತ್ತಿದೆ. ಅದನ್ನು ಅಸ್ಥಾಪಿಸಿ ಮತ್ತು ಆಧುನಿಕ ಬ್ರೌಸರ್‌ಗೆ ಅಪ್‌ಗ್ರೇಡ್‌ ಮಾಡಿ.</translation>
-<translation id="8205111949707227942">ಐಚ್ಚಿಕ: Google ಗೆ ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಕ್ರ್ಯಾಷ್ ವರದಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವುದರಿಂದ Chrome OS ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ.</translation>
+<translation id="8205111949707227942">ಐಚ್ಚಿಕ: Google ಗೆ ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಕ್ರ್ಯಾಷ್ ವರದಿಯನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ Chrome OS ಅನ್ನು ಇನ್ನಷ್ಟು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ.</translation>
 <translation id="7253415505590551024">ಡೌನ್‌ಲೋಡ್‍‌ಗಳು ಪ್ರಸ್ತುತ ಪ್ರಗತಿಯಲ್ಲಿವೆ. Google Chrome ನಿಂದ ನಿರ್ಗಮಿಸಲು ಮತ್ತು ಡೌನ್‌ಲೋಡ್ ಅನ್ನು ರದ್ದುಗೊಳಿಸಲು ನೀವು ಬಯಸಿರುವಿರಾ?</translation>
 <translation id="3622797965165704966">ನಿಮ್ಮ Google ಖಾತೆಯ ಮೂಲಕ ಮತ್ತು ಹಂಚಿದ ಕಂಪ್ಯೂಟರ್‌ಗಳಲ್ಲಿ Chrome ಬಳಕೆ ಈಗ ತುಂಬಾ ಸುಲಭವಾಗಿದೆ.</translation>
 <translation id="7196020411877309443">ನಾನು ಇದನ್ನೇಕೆ ನೋಡುತ್ತಿದ್ದೇನೆ?</translation>
index 26ada23..6712743 100644 (file)
 <translation id="2346876346033403680">Noen har tidligere logget seg på Chrome på denne datamaskinen som <ph name="ACCOUNT_EMAIL_LAST"/>. Hvis det ikke er kontoen din, må du opprette en ny Chrome-bruker for å holde informasjonen din atskilt.
 
 Hvis du logger deg på allikevel, blir Chrome-informasjon som bokmerker, loggen og andre innstillinger slått sammen med <ph name="ACCOUNT_EMAIL_NEW"/>.</translation>
-<translation id="9107728822479888688"><ph name="BEGIN_BOLD"/>Advarsel:<ph name="END_BOLD"/> Google Chrome kan ikke forhindre utvidelser fra å registrere nettleserloggen din. Du kan deaktivere utvidelsen i inkognitomodus ved å oppheve merkingen av dette alternativet.</translation>
+<translation id="9107728822479888688"><ph name="BEGIN_BOLD"/>Advarsel:<ph name="END_BOLD"/> Google Chrome kan ikke forhindre utvidelser fra å lagre nettleserloggen din. Du kan deaktivere denne utvidelsen i inkognitomodus ved å oppheve merkingen av dette alternativet.</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="2664962310688259219">Åpen kildekode-lisenser for Chrome OS</translation>
 <translation id="2290014774651636340">API-nøkler for Google mangler. Noe funksjonalitet i Google Chrome blir deaktivert.</translation>
index 9a31acd..3cb7afb 100644 (file)
@@ -169,7 +169,7 @@ Se você decidir fazer login assim mesmo, as informações do Google Chrome, com
 <translation id="7161904924553537242">Bem-vindo ao Google Chrome</translation>
 <translation id="4147555960264124640">Você está fazendo login com uma conta gerenciada e concedendo ao administrador da conta o controle sobre seu perfil do Google Chrome. Seus dados do Google Chrome, como aplicativos, favoritos, histórico, senhas e outras configurações serão permanentemente vinculados a <ph name="USER_NAME"/>. Você pode excluir esses dados pelo painel das Contas do Google, mas não pode associá-los a outra conta. <ph name="LEARN_MORE"/></translation>
 <translation id="4568169453579447500">O Google Chrome não pode ser atualizado devido a configurações inconsistentes da política de grupo do Google Update. Utilize o Editor de Política de grupo para definir a substituição de política de atualização para o aplicativo dos binários do Google Chrome e tente novamente. Veja mais detalhes em http://goo.gl/uJ9gV.</translation>
-<translation id="1348153800635493797">É necessário fazer upgrade do Google Chrome para usar a Carteira virtual do Google [<ph name="ERROR_CODE"/>].</translation>
+<translation id="1348153800635493797">É necessário fazer upgrade do Google Chrome para usar a Google Wallet [<ph name="ERROR_CODE"/>].</translation>
 <translation id="8187289872471304532">Vá para
           Aplicativos &gt; Preferências do Sistema &gt; Rede &gt; Avançado &gt; Proxies
           e desmarque todos os proxies que estiverem selecionados.</translation>
@@ -200,7 +200,7 @@ Se você decidir fazer login assim mesmo, as informações do Google Chrome, com
         firewall ou antivírus.</translation>
 <translation id="9102715433345326100">Este arquivo é malicioso e foi bloqueado pelo Google Chrome.</translation>
 <translation id="3170677364322086041">Este site está usando o plug-in do Google Chrome Frame, que não recebe mais atualizações de segurança e de estabilidade. Desinstale o plug-in e faça upgrade para um navegador moderno.</translation>
-<translation id="8205111949707227942">Opcional: ajude a melhorar este sistema operacional enviando-nos estatísticas de uso e relatórios de problemas.</translation>
+<translation id="8205111949707227942">Opcional: ajude a melhorar este sistema operacional enviando-nos estatísticas de uso e relatórios de erros.</translation>
 <translation id="7253415505590551024">Há downloads em andamento. Deseja sair do Google Chrome e cancelar os downloads?</translation>
 <translation id="3622797965165704966">Agora ficou mais fácil usar o Chrome com sua Conta do Google e em computadores compartilhados.</translation>
 <translation id="7196020411877309443">Por que estou vendo este aviso?</translation>
index bfd9f9c..e9e7fe8 100644 (file)
@@ -196,7 +196,7 @@ Se, mesmo assim, iniciar sessão, as informações do Chrome, como marcadores, h
 <translation id="7396375882099008034">Permita que o Chrome aceda à rede nas definições da sua firewall ou antivírus.</translation>
 <translation id="9102715433345326100">Este ficheiro é malicioso e o Chrome bloqueou-o.</translation>
 <translation id="3170677364322086041">Este site utiliza o plug-in Google Chrome Frame descontinuado, que deixou de receber atualizações de segurança e estabilidade. Desinstale-o e atualize para um navegador moderno.</translation>
-<translation id="8205111949707227942">Opcional: Ajude a melhorar o Chrome OS enviando automaticamente estatísticas de utilização e relatórios de falhas para a Google.</translation>
+<translation id="8205111949707227942">Opcional: Ajude a melhorar o Chrome OS ao enviar automaticamente estatísticas de utilização e relatórios de falhas para a Google.</translation>
 <translation id="7253415505590551024">As transferências estão atualmente em curso. Pretende sair do Google Chrome e cancelar as transferências?</translation>
 <translation id="3622797965165704966">Agora é mais fácil utilizar o Chrome com a sua Conta Google e em computadores partilhados.</translation>
 <translation id="7196020411877309443">Por que motivo estou a ver esta caixa de diálogo?</translation>
index 6efd896..552e2a5 100644 (file)
@@ -6,7 +6,7 @@
 <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation>
 <translation id="123620459398936149">Sistemul de operare Chrome nu a putut sincroniza datele. Actualizați parola de acces pentru sincronizare.</translation>
 <translation id="5430073640787465221">Fișierul dvs. de preferințe este fie deteriorat, fie nevalid. Google Chrome nu poate recupera setările dvs.</translation>
-<translation id="6676384891291319759">Accesați Internetul</translation>
+<translation id="6676384891291319759">Accesați internetul</translation>
 <translation id="7952135150021331855">Google Chrome rulează în fundal.</translation>
 <translation id="345171907106878721">Adăugați-vă la Chrome</translation>
 <translation id="6236285698028833233">Google Chrome nu se mai actualizează și nu mai acceptă această versiune a sistemului dvs. de operare.</translation>
 <translation id="4987308747895123092">Închideți toate ferestrele Google Chrome (inclusiv pe cele în modul Windows 8) și încercați din nou.</translation>
 <translation id="568643307450491754">Găsiți marcajele în meniul Chrome sau în bara de marcaje.</translation>
 <translation id="8556340503434111824">Este disponibilă o nouă versiune de Google Chrome, iar aceasta este mai rapidă ca oricând.</translation>
-<translation id="4728575227883772061">Instalarea a eșuat din cauza unei erori necunoscute. Dacă Google Chrome rulează în acest moment, închideți-l și încercați din nou.</translation>
-<translation id="3080151273017101988">Rulează în continuare aplicații de fundal când Google Chrome este închis</translation>
+<translation id="4728575227883772061">Instalarea nu a reușit din cauza unei erori necunoscute. Dacă Google Chrome rulează în acest moment, închideți-l și încercați din nou.</translation>
+<translation id="3080151273017101988">Rulează în continuare aplicații în fundal când Google Chrome este închis</translation>
 <translation id="4149882025268051530">Programul de instalare nu a putut decomprima arhiva. Descărcați din nou Google Chrome.</translation>
 <translation id="7054640471403081847">În curând, acest computer nu va mai primi actualizări Google Chrome, deoarece hardware-ul său nu mai este acceptat.</translation>
-<translation id="6989339256997917931">Google Chrome a fost actualizat, dar nu l-ați utilizat de cel puțin 30 de zile.</translation>
+<translation id="6989339256997917931">Google Chrome a fost actualizat, dar nu l-ați folosit pentru cel puțin 30 de zile.</translation>
 <translation id="7060865993964054389">Lansatorul de aplicații Google Chrome</translation>
 <translation id="1682634494516646069">Google Chrome nu poate citi și scrie în directorul propriu de date: <ph name="USER_DATA_DIRECTORY"/></translation>
-<translation id="8227755444512189073">Google Chrome necesită lansarea unei aplicații externe pentru a gestiona link-uri <ph name="SCHEME"/>. Link-ul solicitat este <ph name="PROTOLINK"/>.</translation>
-<translation id="8290100596633877290">Hopa! Google Chrome s-a închis cu eroare. Reporniți acum?</translation>
+<translation id="8227755444512189073">Google Chrome necesită lansarea unei aplicații externe pentru a gestiona linkuri <ph name="SCHEME"/>. Linkul solicitat este <ph name="PROTOLINK"/>.</translation>
+<translation id="8290100596633877290">Hopa! Google Chrome s-a blocat. Reporniți acum?</translation>
 <translation id="1480489203462860648">Încercați-l, este deja instalat</translation>
 <translation id="5204098752394657250"><ph name="TERMS_OF_SERVICE_LINK"/>Termeni și condiții<ph name="END_TERMS_OF_SERVICE_LINK"/> Google Chrome</translation>
 <translation id="1393853151966637042">Obțineți ajutor în legătură cu utilizarea Chrome</translation>
@@ -64,7 +64,7 @@
 <translation id="3889417619312448367">Dezinstalați Google Chrome</translation>
 <translation id="1434626383986940139">Aplicații Chrome Canary</translation>
 <translation id="8551886023433311834">Actualizare aproape efectuată! Reporniți dispozitivul pentru a finaliza actualizarea.</translation>
-<translation id="6169866489629082767"><ph name="PAGE_TITLE"/> - Google Chrome</translation>
+<translation id="6169866489629082767"><ph name="PAGE_TITLE"/>  Google Chrome</translation>
 <translation id="1073391069195728457">Chrome – Notificări</translation>
 <translation id="7339898014177206373">Fereastră nouă</translation>
 <translation id="3282568296779691940">Conectați-vă la Chrome</translation>
 <translation id="4298853828775962437">http://support.google.com/chrome/?p=ib_chromeframe</translation>
 <translation id="3149510190863420837">Aplicații Chrome</translation>
 <translation id="7084448929020576097">Fișierul <ph name="FILE_NAME"/> este rău-intenționat și a fost blocat de Chrome.</translation>
-<translation id="6368958679917195344"><ph name="BEGIN_LINK_CROS_OSS"/>Software-ul open source<ph name="END_LINK_CROS_OSS"/> suplimentar a contribuit la Sistemul de operare Chrome.</translation>
+<translation id="6368958679917195344">Sistemul de operare Chrome este posibil datorită unui <ph name="BEGIN_LINK_CROS_OSS"/>software open source<ph name="END_LINK_CROS_OSS"/> suplimentar.</translation>
 <translation id="7459554271817304652">Configurați sincronizarea pentru a salva funcțiile personalizate ale browserului pe web și accesați-le din Google Chrome de pe orice computer.</translation>
-<translation id="4331809312908958774">SO Chrome</translation>
+<translation id="4331809312908958774">Sistemul de operare Chrome</translation>
 <translation id="8823341990149967727">Chrome nu este actualizat</translation>
 <translation id="473775607612524610">Actualizați</translation>
-<translation id="1195935957447623558">Google Chrome nu s-a închis corect. Pentru a redeschide paginile pe care le-ați avut deschise, faceți clic pe Restabiliți.</translation>
+<translation id="1195935957447623558">Google Chrome nu s-a închis corect. Pentru a redeschide paginile pe care le-ați avut deschise, dați clic pe Restabiliți.</translation>
 <translation id="2576431527583832481">Chrome a devenit și mai bun! Este disponibilă o nouă versiune.</translation>
 <translation id="4633000520311261472">Pentru ca browserul Chrome să fie mai sigur, am dezactivat câteva extensii care nu sunt incluse în <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/> și care este posibil să fi fost adăugate fără știrea dvs.</translation>
 <translation id="3656661827369545115">Chromium se lansează automat la pornirea computerului</translation>
 <translation id="556024056938947818">Google Chrome încearcă să afișeze parolele.</translation>
-<translation id="2580411288591421699">Nu se poate instala aceeași versiune Google Chrome care se execută în prezent. Închideți Google Chrome și încercați din nou.</translation>
+<translation id="2580411288591421699">Nu se poate instala aceeași versiune Google Chrome care rulează în prezent. Închideți Google Chrome și încercați din nou.</translation>
 <translation id="8460191995881063249">Centrul de notificări Chrome</translation>
 <translation id="1457721931618994305">Se actualizează Google Chrome...</translation>
 <translation id="2429317896000329049">Google Chrome nu a putut sincroniza datele, deoarece sincronizarea nu este disponibilă pentru domeniul dvs.</translation>
@@ -125,13 +125,13 @@ Dacă totuși vă conectați, informațiile Chrome cum ar fi marcajele, istoricu
 <translation id="8008534537613507642">Reinstalați Chrome</translation>
 <translation id="2044287590254833138">Bara de instrumente Google Chrome</translation>
 <translation id="8862326446509486874">Nu aveți drepturile adecvate pentru instalarea la nivel de sistem. Încercați să rulați din nou programul de instalare ca Administrator.</translation>
-<translation id="2874156562296220396">Google Chrome există ca urmare a proiectului open source <ph name="BEGIN_LINK_CHROMIUM"/>Chromium<ph name="END_LINK_CHROMIUM"/> și a altor <ph name="BEGIN_LINK_OSS"/>produse software open source<ph name="END_LINK_OSS"/>.</translation>
+<translation id="2874156562296220396">Google Chrome există ca urmare a proiectului open source <ph name="BEGIN_LINK_CHROMIUM"/>Chromium<ph name="END_LINK_CHROMIUM"/> și al altor <ph name="BEGIN_LINK_OSS"/>software-uri open source<ph name="END_LINK_OSS"/>.</translation>
 <translation id="3847841918622877581">Google Chrome poate utiliza servicii web pentru îmbunătățirea experienței de navigare.</translation>
 <translation id="7436949144778751379">Google Chrome necesită Windows XP sau o versiune ulterioară. Este posibil ca unele funcții să nu fie disponibile.</translation>
 <translation id="5877064549588274448">Canalul a fost schimbat. Reporniți dispozitivul pentru a aplica modificările.</translation>
 <translation id="103396972844768118">Informații importante cu privire la datele dvs. Chrome</translation>
-<translation id="6757767188268205357">Doresc să nu mai fiu deranjat</translation>
-<translation id="2290095356545025170">Sunteți sigur că doriți să dezinstalați Google Chrome?</translation>
+<translation id="6757767188268205357">Nu mă mai întreba</translation>
+<translation id="2290095356545025170">Sigur doriți să dezinstalați Google Chrome?</translation>
 <translation id="7062966102157262887">O descărcare este în desfășurare. Doriți să ieșiți din Google Chrome și să anulați descărcarea?</translation>
 <translation id="4273752058983339720">Google Chrome este configurat pentru a se lansa automat când porniți computerul.</translation>
 <translation id="1104959162601287462">Despre sistemul de operare &amp;Chrome</translation>
@@ -142,7 +142,7 @@ Dacă totuși vă conectați, informațiile Chrome cum ar fi marcajele, istoricu
 <translation id="1469002951682717133">Lansatorul de aplicații Chrome</translation>
 <translation id="8568392309447938879">Trebuie să vă conectați la Chrome pentru a folosi aplicațiile. Astfel, Chrome vă poate sincroniza aplicațiile, marcajele, istoricul, parolele și alte setări pe toate dispozitivele.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
-<translation id="4561051373932531560">Google Chrome vă permite să faceți clic pe un număr de telefon de pe web pentru a-l apela cu Skype!</translation>
+<translation id="4561051373932531560">Cu Google Chrome, puteți să dați clic pe un număr de telefon de pe web pentru a-l apela cu Skype!</translation>
 <translation id="5788838254726722945">Dezinstalați Lansatorul de aplicații Google Chrome</translation>
 <translation id="3612333635265770873">Un modul cu același nume este cunoscut ca având conflicte cu Google Chrome.</translation>
 <translation id="2665296953892887393">Contribuiți la îmbunătățirea browserului Google Chrome trimițând rapoarte de blocare și <ph name="UMA_LINK"/> la Google</translation>
@@ -179,30 +179,30 @@ Dacă totuși vă conectați, informațiile Chrome cum ar fi marcajele, istoricu
 <translation id="1587223624401073077">Google Chrome utilizează camera foto.</translation>
 <translation id="1399397803214730675">Acest computer are deja o versiune mai recentă de Google Chrome. Dacă software-ul nu funcționează, dezinstalați Google Chrome și încercați din nou.</translation>
 <translation id="576822117893741893">Afișați meniul Chrome</translation>
-<translation id="3444832043240812445">Această pagină afișează informații cu privire la recentele opriri cu eroare numai dacă <ph name="BEGIN_LINK"/>activați raportarea opririlor cu eroare<ph name="END_LINK"/>.</translation>
+<translation id="3444832043240812445">Această pagină afișează informații cu privire la recentele blocări numai dacă <ph name="BEGIN_LINK"/>activați raportarea blocărilor<ph name="END_LINK"/>.</translation>
 <translation id="8614913330719544658">Google Chrome nu mai răspunde. Îl reporniți acum?</translation>
-<translation id="2681064822612051220">A fost găsită o instalare conflictuală a Google Chrome în sistem. Dezinstalaţi-o şi încercaţi din nou.</translation>
+<translation id="2681064822612051220">A fost găsită o instalare conflictuală a Google Chrome în sistem. Dezinstalați-o și încercați din nou.</translation>
 <translation id="8209985377776300429">Previzualizați noul Chrome.</translation>
 <translation id="6126631249883707068">Doriți ca Google Chrome să vă salveze parola?</translation>
 <translation id="7773845170078702898">Doriți ca Google Chrome să salveze parola pentru acest site?</translation>
 <translation id="4251615635259297716">Vă conectați datele Chrome cu acest cont?</translation>
 <translation id="7125719106133729027">Chrome nu s-a putut actualiza automat la cea mai recentă versiune, astfel încât pierdeți noi funcții excelente și remedieri de securitate. Trebuie să reinstalați Chrome manual.</translation>
 <translation id="5940385492829620908">Experiența web personalizată, marcajele și celelalte date Chrome chiar aici.</translation>
-<translation id="8865765905101981392">Browser de Internet</translation>
+<translation id="8865765905101981392">Browser internet</translation>
 <translation id="3039245375609697729">Încercați noul mod de folosire a browserului Chrome cu Contul Google și pe computerele utilizate în comun.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="6113794647360055231">Chrome a devenit și mai bun</translation>
 <translation id="174539241580958092">Google Chrome nu a putut sincroniza datele din cauza unei erori la conectare.</translation>
 <translation id="8255190535488645436">Google Chrome utilizează camera foto și microfonul.</translation>
-<translation id="2189123953385179981">Google ChromeOS nu acceptă lansarea unei aplicații externe pentru a gestiona linkurile <ph name="SCHEME"/>. Linkul solicitat este <ph name="PROTOLINK"/>.</translation>
+<translation id="2189123953385179981">Sistemul de operare Google Chrome nu acceptă lansarea unei aplicații externe pentru a gestiona linkurile <ph name="SCHEME"/>. Linkul solicitat este <ph name="PROTOLINK"/>.</translation>
 <translation id="7396375882099008034">Permiteți browserului Chrome să acceseze rețeaua din setările pentru firewall sau
         antivirus.</translation>
 <translation id="9102715433345326100">Acest fișier este rău-intenționat și a fost blocat de Chrome.</translation>
 <translation id="3170677364322086041">Acest site utilizează pluginul Chrome Frame, care a fost retras și nu mai primește actualizări de securitate sau de stabilitate. Dezinstalați-l sau faceți upgrade la un browser modern.</translation>
-<translation id="8205111949707227942">Opțional: ajutați la îmbunătățirea SO Chrome prin trimiterea automată de statistici privind utilizarea și rapoarte de avarie la Google.</translation>
+<translation id="8205111949707227942">Opțional: ajutați-ne să îmbunătățim sistemul de operare Chrome prin trimiterea automată de statistici de utilizare și rapoarte de blocare către Google.</translation>
 <translation id="7253415505590551024">Mai multe descărcări sunt în desfășurare. Doriți să ieșiți din Google Chrome și să anulați descărcările?</translation>
 <translation id="3622797965165704966">Acum este mai ușor să folosiți Chrome cu Contul Google și pe computerele utilizate în comun.</translation>
-<translation id="7196020411877309443">De ce primesc această notificare?</translation>
+<translation id="7196020411877309443">De ce văd acest lucru?</translation>
 <translation id="2769762047821873045">Google Chrome nu este browserul dvs. prestabilit.</translation>
 <translation id="4567424176335768812">V-ați conectat ca <ph name="USER_EMAIL_ADDRESS"/>. Acum vă puteți accesa marcajele, istoricul și alte setări de pe toate dispozitivele pe care v-ați conectat.</translation>
 <translation id="6855094794438142393">Accesați
@@ -220,9 +220,9 @@ Dacă totuși vă conectați, informațiile Chrome cum ar fi marcajele, istoricu
 <translation id="4458285410772214805">Pentru ca modificarea să fie aplicată, deconectați-vă și conectați-vă din nou.</translation>
 <translation id="8679801911857917785">Stabilește și ce pagină se afișează când porniți Chrome.</translation>
 <translation id="5334545119300433702">Acest modul este cunoscut că intră în conflict cu Google Chrome.</translation>
-<translation id="4407807842708586359">Google Chrome OS</translation>
+<translation id="4407807842708586359">Sistemul de operare Google Chrome</translation>
 <translation id="6634887557811630702">Google Chrome este actualizat.</translation>
-<translation id="4120075327926916474">Doriți ca browserul Chrome să salveze informațiile privind cartea de credit pentru completarea formularelor web?</translation>
+<translation id="4120075327926916474">Doriți ca browserul Chrome să salveze informațiile privind cardul de credit pentru completarea formularelor web?</translation>
 <translation id="2084710999043359739">Adăug. în Chrome</translation>
 <translation id="3360895254066713204">Chrome Helper</translation>
 <translation id="1877026089748256423">Chrome nu este actualizat</translation>
@@ -233,7 +233,7 @@ Dacă totuși vă conectați, informațiile Chrome cum ar fi marcajele, istoricu
 <translation id="3047079729301751317">Dacă deconectați utilizatorul <ph name="USERNAME"/>, vor fi șterse istoricul, marcajele, setările și alte date Chrome salvate pe acest dispozitiv. Datele salvate în Contul Google nu vor fi șterse și pot fi gestionate din <ph name="GOOGLE_DASHBOARD_LINK"/>Tabloul de bord Google<ph name="END_GOOGLE_DASHBOARD_LINK"/>.</translation>
 <translation id="1001534784610492198">Arhiva programului de instalare este deteriorată sau nevalidă. Descărcați din nou Google Chrome.</translation>
 <translation id="2246246234298806438">Google Chrome nu poate afișa previzualizarea înainte de printare când vizualizatorul PDF încorporat lipsește.</translation>
-<translation id="6626317981028933585">Din păcate, setările dvs. Mozilla Firefox nu sunt disponibile în timp ce browser-ul respectiv rulează. Pentru a importa aceste setări în Google Chrome, salvați ceea ce lucrați și închideți toate ferestrele Firefox. Apoi faceți clic pe Continuați.</translation>
+<translation id="6626317981028933585">Din păcate, setările dvs. Mozilla Firefox nu sunt disponibile în timp ce acesta rulează. Pentru a importa aceste setări în Google Chrome, salvați lucrul și închideți toate ferestrele Firefox. Apoi dați clic pe Continuați.</translation>
 <translation id="7242029209006116544">Vă conectați cu un cont gestionat și îi permiteți administratorului acestuia controlul asupra profilului dvs. Google Chrome. Datele Chrome, cum ar fi aplicațiile, marcajele, istoricul, parolele și alte setări vor fi asociate definitiv cu <ph name="USER_NAME"/>. Veți putea să ștergeți aceste date prin intermediul Tabloului de bord pentru Conturi Google, însă nu veți putea să asociați aceste date cu alt cont. Aveți opțiunea de a crea un profil nou, pentru a păstra separat datele Chrome existente. <ph name="LEARN_MORE"/></translation>
 <translation id="5386244825306882791">Stabilește și ce pagină se afișează când porniți Chrome sau când căutați din caseta polivalentă.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
index 3ea3dab..d2efb52 100644 (file)
@@ -168,7 +168,7 @@ Ak sa chcete aj napriek tomu prihlásiť, informácie prehliadača Chrome, ako s
 <translation id="5028489144783860647">Prehliadaču Google Chrome sa nepodarilo synchronizovať vaše údaje. Aktualizujte prístupovú frázu synchronizácie.</translation>
 <translation id="9026991721384951619">Systému OS Chrome sa nepodarilo synchronizovať vaše údaje, pretože vaše prihlasovacie údaje účtu sú zastarané.</translation>
 <translation id="8547799825197623713">Spúšťač aplikácií Chrome Canary</translation>
-<translation id="6326175484149238433">Odstrániť z prehliadača Chrome</translation>
+<translation id="6326175484149238433">Odstrániť z prehliadača</translation>
 <translation id="2871893339301912279">Ste prihlásený/-á do prehliadača Chrome.</translation>
 <translation id="7890208801193284374">Ak počítač zdieľate s rodinou a priateľmi, môžu v prehliadači Chrome prehliadať oddelene a tiež si ho nastaviť podľa vlastných požiadaviek.</translation>
 <translation id="7161904924553537242">Víta vás prehľadávač Google Chrome</translation>
index 4b0c59f..e69711e 100644 (file)
@@ -139,7 +139,7 @@ Google Chrome не може да врати подешавања.</translation>
 <translation id="5877064549588274448">Канал је промењен. Покрените поново уређај да бисте применили промене.</translation>
 <translation id="103396972844768118">Важне информације у вези са Chrome подацима</translation>
 <translation id="6757767188268205357">Не досађуј</translation>
-<translation id="2290095356545025170">Да ли заиста желите да деинсталирате Google Chrome?</translation>
+<translation id="2290095356545025170">Да ли стварно желите да деинсталирате Google Chrome?</translation>
 <translation id="7062966102157262887">Преузимање је у току. Да ли желите да изађете из Google Chrome-а и откажете преузимање?</translation>
 <translation id="4273752058983339720">Google Chrome је конфигурисан тако да се аутоматски покреће када покренете рачунар.</translation>
 <translation id="1104959162601287462">О &amp;Chrome ОС-у</translation>
index 052fbdb..ebadbf9 100644 (file)
@@ -231,7 +231,7 @@ Kuingia bila kujali kutaunganisha maelezo ya Chrome kama vile alamisho, historia
 <translation id="2084710999043359739">Ongeza kwenye Chrome</translation>
 <translation id="3360895254066713204">Msaidizi wa Chrome</translation>
 <translation id="1877026089748256423">Toleo hili la Chrome limepitwa na wakati</translation>
-<translation id="7592736734348559088">Google Chrome haikuweza kusawazisha data yako kwa sababu maelezo yako ya kuingia katika akaunti yamemalizika muda.</translation>
+<translation id="7592736734348559088">Google Chrome haikuweza kusawazisha data yako kwa sababu maelezo yako ya kuingia katika akaunti yanahitaji kusasishwa.</translation>
 <translation id="6991142834212251086">Unganisha data yangu ya Chrome kwenye akaunti hii</translation>
 <translation id="3451115285585441894">Inaongeza kwenye Chrome...</translation>
 <translation id="6502165024350711060">Imependekezwa na Chrome</translation>
index 0480034..cf08e42 100644 (file)
@@ -37,7 +37,7 @@
 <translation id="6982337800632491844"><ph name="DOMAIN"/> กำหนดว่าคุณต้องอ่านและยอมรับข้อกำหนดในการให้บริการต่อไปนี้ก่อนใช้อุปกรณ์นี้ ข้อกำหนดเหล่านี้ไม่ขยาย แก้ไข หรือจำกัดข้อกำหนดของ Google Chrome OS</translation>
 <translation id="4309555186815777032">(จำเป็นต้อง<ph name="BEGIN_BUTTON"/>รีสตาร์ท<ph name="END_BUTTON"/> Chrome)</translation>
 <translation id="8030318113982266900">กำลังอัปเดตอุปกรณ์ของคุณไปยังช่อง <ph name="CHANNEL_NAME"/>...</translation>
-<translation id="8032142183999901390">à¹\80มืà¹\88อà¸\99ำออà¸\81บัญชีของคุณออกจาก Chrome แล้ว คุณต้องโหลดแท็บที่เปิดอยู่ซ้ำเพื่อให้มีผล</translation>
+<translation id="8032142183999901390">à¹\80มืà¹\88อลà¸\9aบัญชีของคุณออกจาก Chrome แล้ว คุณต้องโหลดแท็บที่เปิดอยู่ซ้ำเพื่อให้มีผล</translation>
 <translation id="5775197990071433230">คอมพิวเตอร์เครื่องนี้มีส่วนประกอบของ Google Chrome รุ่นใหม่กว่าอยู่แล้ว โปรดใช้ตัวติดตั้งรุ่นใหม่กว่า</translation>
 <translation id="4987308747895123092">โปรดปิดหน้าต่าง Google Chrome ทั้งหมด (รวมทั้งในโหมด Windows 8 ด้วย) และลองอีกครั้ง</translation>
 <translation id="568643307450491754">ค้นหาบุ๊กมาร์กของคุณในเมนู Chrome หรือในแถบบุ๊กมาร์ก</translation>
 <translation id="2664962310688259219">ใบอนุญาตโอเพนซอร์สของ Chrome OS</translation>
 <translation id="2290014774651636340">คีย์ API ของ Google หายไป การทำงานบางอย่างของ Google Chrome จะถูกปิดใช้งาน</translation>
 <translation id="4794050651896644714">บันทึกรายละเอียดใน Chrome</translation>
-<translation id="911206726377975832">à¸\99ำออà¸\81ข้อมูลการท่องเว็บด้วยหรือไม่</translation>
+<translation id="911206726377975832">ลà¸\9aข้อมูลการท่องเว็บด้วยหรือไม่</translation>
 <translation id="2036562258783619899">ดูตัวอย่าง Chrome ใหม่</translation>
 <translation id="5855036575689098185">ซอฟต์แวร์ที่ทำงานบนคอมพิวเตอร์ของคุณไม่สามารถใช้ได้กับ Google Chrome</translation>
 <translation id="7164397146364144019">คุณสามารถช่วยปรับปรุงให้ Chrome ปลอดภัยและใช้งานง่ายขึ้นโดยรายงานรายละเอียดของเหตุการณ์ความปลอดภัยที่เป็นไปได้ต่อ Google โดยอัตโนมัติ</translation>
 <translation id="5028489144783860647">Google Chrome ไม่สามารถซิงค์ข้อมูลของคุณ โปรดอัปเดตข้อความรหัสผ่านการซิงค์</translation>
 <translation id="9026991721384951619">Chrome OS ไม่สามารถซิงค์ข้อมูลของคุณเนื่องจากรายละเอียดการลงชื่อเข้าใช้บัญชีของคุณล้าสมัย</translation>
 <translation id="8547799825197623713">Chrome App Launcher Canary</translation>
-<translation id="6326175484149238433">à¸\99ำออà¸\81จาก Chrome</translation>
+<translation id="6326175484149238433">ลà¸\9aจาก Chrome</translation>
 <translation id="2871893339301912279">คุณได้ลงชื่อเข้าใช้ Chrome แล้ว!</translation>
 <translation id="7890208801193284374">ถ้าคุณให้ผู้อื่นใช้คอมพิวเตอร์ร่วมด้วย เพื่อนๆ และครอบครัวของคุณสามารถท่องเว็บแยกกันได้และตั้งค่า Chrome ได้ตามที่พวกเขาต้องการ</translation>
 <translation id="7161904924553537242">ยินดีต้อนรับสู่ Google Chrome</translation>
-<translation id="4147555960264124640">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Google Chrome à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chrome à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96à¸\99ำออà¸\81ข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น <ph name="LEARN_MORE"/></translation>
+<translation id="4147555960264124640">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Google Chrome à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chrome à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96ลà¸\9aข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น <ph name="LEARN_MORE"/></translation>
 <translation id="4568169453579447500">Google Chrome ไม่สามารถอัปเดตได้เนื่องจากการตั้งค่านโยบายกลุ่มของ Google อัปเดตไม่สอดคล้องกัน โปรดใช้ตัวแก้ไขนโยบายกลุ่มเพื่อกำหนดการลบล้างนโยบายการอัปเดตสำหรับแอปพลิเคชัน Google Chrome Binaries และลองอีกครั้ง โปรดดูรายละเอียดที่ http://goo.gl/uJ9gV</translation>
 <translation id="1348153800635493797">คุณต้องอัปเกรด Chrome เพื่อใช้ Google Wallet [<ph name="ERROR_CODE"/>]</translation>
 <translation id="8187289872471304532">ไปที่
 <translation id="1001534784610492198">การเก็บข้อมูลของโปรแกรมติดตั้งเสียหายหรือไม่ถูกต้อง โปรดดาวน์โหลด Google Chrome อีกครั้ง</translation>
 <translation id="2246246234298806438">Google Chrome ไม่สามารถแสดงหน้าตัวอย่างก่อนพิมพ์หากไม่มีโปรแกรมดู PDF ในตัว</translation>
 <translation id="6626317981028933585">ขออภัย เราไม่สามารถเรียกข้อมูลการตั้งค่าของ Mozilla Firefox ได้ขณะที่เบราว์เซอร์ยังทำงานอยู่ หากต้องการนำเข้าข้อมูลการตั้งค่ามาที่ Google Chrome โปรดบันทึกงานที่คุณทำอยู่แล้วปิดหน้าต่าง Firefox ทั้งหมด จากนั้นคลิกดำเนินการต่อ</translation>
-<translation id="7242029209006116544">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Google Chrome à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chrome à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96à¸\99ำออà¸\81ข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น คุณสามารถเลือกที่จะสร้างโปรไฟล์ใหม่เพื่อแยกเก็บข้อมูล Chrome ที่มีอยู่ของคุณ <ph name="LEARN_MORE"/></translation>
+<translation id="7242029209006116544">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88à¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89à¸\81ารà¸\84วà¸\9aà¸\84ุมระà¸\94ัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80หà¸\99ือà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Google Chrome à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chrome à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87อยà¹\88าà¸\87à¸\96าวรà¸\81ัà¸\9a <ph name="USER_NAME"/> à¸\84ุà¸\93à¸\88ะสามารà¸\96ลà¸\9aข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น คุณสามารถเลือกที่จะสร้างโปรไฟล์ใหม่เพื่อแยกเก็บข้อมูล Chrome ที่มีอยู่ของคุณ <ph name="LEARN_MORE"/></translation>
 <translation id="5386244825306882791">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณเปิด Chrome หรือทำการค้นหาจากแถบอเนกประสงค์ด้วย</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="2334084861041072223">ลิขสิทธิ์ <ph name="YEAR"/> Google Inc. สงวนลิขสิทธิ์</translation>
 <translation id="1698376642261615901">Google Chrome คือเว็บเบราว์เซอร์ที่แสดงหน้าเว็บและแอปพลิเคชันต่างๆ ได้รวดเร็วในพริบตา โดยทำงานได้เร็ว มีเสถียรภาพ และใช้งานง่าย ช่วยให้คุณเรียกดูเว็บได้อย่างปลอดภัยมากขึ้นด้วยการป้องกันมัลแวร์และฟิชชิงซึ่งมีอยู่ใน Google Chrome</translation>
-<translation id="853189717709780425">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88มีà¸\81ารà¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89อำà¸\99าà¸\88à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\83à¸\99à¸\81ารà¸\84วà¸\9aà¸\84ุมà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Google Chrome à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chrome à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¸\96ูà¸\81à¸\9cูà¸\81à¸\95ิà¸\94à¸\81ัà¸\9a <ph name="USER_NAME"/> à¸­à¸¢à¹\88าà¸\87à¸\96าวร à¸\84ุà¸\93à¸\88ะสามารà¸\96à¸\99ำออà¸\81ข้อมูลนี้ผ่านแดชบอร์ด Google Accounts ได้ แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่นได้</translation>
+<translation id="853189717709780425">à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89à¸\94à¹\89วยà¸\9aัà¸\8dà¸\8aีà¸\97ีà¹\88มีà¸\81ารà¸\88ัà¸\94à¸\81าร à¹\81ละà¹\83หà¹\89อำà¸\99าà¸\88à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\94ัà¸\87à¸\81ลà¹\88าวà¹\83à¸\99à¸\81ารà¸\84วà¸\9aà¸\84ุมà¹\82à¸\9bรà¹\84à¸\9fลà¹\8c Google Chrome à¸\82อà¸\87à¸\84ุà¸\93 à¸\82à¹\89อมูล Chrome à¹\80à¸\8aà¹\88à¸\99 à¹\81อà¸\9b à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81 à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aม à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99 à¹\81ละà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอืà¹\88à¸\99à¹\86 à¸\88ะà¸\96ูà¸\81à¸\9cูà¸\81à¸\95ิà¸\94à¸\81ัà¸\9a <ph name="USER_NAME"/> à¸­à¸¢à¹\88าà¸\87à¸\96าวร à¸\84ุà¸\93à¸\88ะสามารà¸\96ลà¸\9aข้อมูลนี้ผ่านแดชบอร์ด Google Accounts ได้ แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่นได้</translation>
 <translation id="6049075767726609708">ผู้ดูแลระบบติดตั้ง Google Chrome ในระบบนี้แล้ว และผู้ใช้ทุกคนสามารถใช้งานได้ ขณะนี้ Google Chrome ระดับระบบจะแทนที่การติดตั้งระดับผู้ใช้ของคุณ</translation>
 <translation id="1818142563254268765">Chrome ไม่สามารถอัปเดตตัวเองเป็นเวอร์ชันล่าสุดได้ คุณกำลังพลาดคุณลักษณะเจ๋งๆ และการปรับปรุงความปลอดภัย คุณจำเป็นต้องอัปเดต Chrome</translation>
 <translation id="4338032231047635328">คุณพยายามเข้าถึง &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; แต่ใบรับรองที่เซิร์ฟเวอร์แสดงมีข้อผิดพลาด Google Chrome ไม่สามารถใช้ใบรับรองที่มีข้อผิดพลาดและไม่สามารถตรวจสอบความถูกต้องของข้อมูลประจำตัวของไซต์ที่คุณพยายามเชื่อมต่อได้</translation>
index 7d364c5..f4aeafe 100644 (file)
 <translation id="6236285698028833233">Google Chrome đã ngừng cập nhật và không còn hỗ trợ phiên bản này của hệ điều hành của bạn.</translation>
 <translation id="5453904507266736060">Để Google Chrome chạy trên nền</translation>
 <translation id="3454512769850953877">Có, thoát Chrome</translation>
-<translation id="4167057906098955729">Bạn có thể thấy tất cả các thông báo từ ứng dụng, tiện ích mở rộng và trang web Chrome của bạn tại đây.</translation>
+<translation id="4167057906098955729">Bạn có thể thấy tất cả các thông báo từ ứng dụng, tiện ích và trang web Chrome của bạn tại đây.</translation>
 <translation id="2704356438731803243">Nếu bạn muốn giữ riêng biệt dữ liệu Chrome hiện có, bạn có thể tạo người dùng Chrome mới cho <ph name="USER_NAME"/>.</translation>
 <translation id="386202838227397562">Vui lòng đóng tất cả cửa sổ của Google Chrome và thử lại.</translation>
 <translation id="1225016890511909183">Chrome sẽ lưu trữ an toàn thông tin của bạn nên bạn không cần phải nhập lại thông tin nhưng sẽ vẫn phải xác minh mã bảo mật cho thẻ của bạn để thanh toán trong tương lai.</translation>
 <translation id="2770231113462710648">Thay đổi trình duyệt mặc định thành:</translation>
-<translation id="8838365799985821335">Tiện ích mở rộng đã thay đổi trang nào được hiển thị khi bạn khởi động Chrome.</translation>
+<translation id="8838365799985821335">Tiện ích đã thay đổi trang nào được hiển thị khi bạn khởi động Chrome.</translation>
 <translation id="2077129598763517140">Sử dụng chế độ tăng tốc phần cứng khi khả dụng</translation>
 <translation id="1065672644894730302">Không thể đọc tùy chọn của bạn. Một số tính năng có thể không khả dụng và các thay đổi đối với tùy chọn sẽ không được lưu.</translation>
 <translation id="7781002470561365167">Hiện đã có phiên bản mới của Google Chrome.</translation>
@@ -52,7 +52,7 @@
 
 <ph name="USER_DATA_DIRECTORY"/></translation>
 <translation id="8227755444512189073">Google Chrome cần chạy ứng dụng ngoài để xử lý các liên kết <ph name="SCHEME"/>. Liên kết được yêu cầu là <ph name="PROTOLINK"/>.</translation>
-<translation id="8290100596633877290">Rất tiếc! Google Chrome đã xảy ra lỗi. Chạy lại ngay bây giờ?</translation>
+<translation id="8290100596633877290">Chà! Google Chrome đã bị lỗi. Mở lại bây giờ không? </translation>
 <translation id="1480489203462860648">Hãy dùng thử, ứng dụng đã được cài đặt</translation>
 <translation id="5204098752394657250"><ph name="TERMS_OF_SERVICE_LINK"/>Điều khoản dịch vụ<ph name="END_TERMS_OF_SERVICE_LINK"/> của Google Chrome</translation>
 <translation id="1393853151966637042">Nhận trợ giúp sử dụng Chrome</translation>
@@ -86,7 +86,7 @@
 <translation id="473775607612524610">Cập nhật</translation>
 <translation id="1195935957447623558">GoogleChrome không tắt đúng cách. Để mở lại trang bạn đã mở, hãy nhấp vào Khôi phục.</translation>
 <translation id="2576431527583832481">Chrome được cải tiến hơn! Đã có phiên bản mới.</translation>
-<translation id="4633000520311261472">Để làm cho Chrome an toàn hơn, chúng tôi đã vô hiệu hóa một số tiện ích mở rộng không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/> và có thể đã được thêm mà bạn không biết.</translation>
+<translation id="4633000520311261472">Để làm cho Chrome an toàn hơn, chúng tôi đã vô hiệu hóa một số tiện ích không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE"/> và có thể đã được thêm mà bạn không biết.</translation>
 <translation id="3656661827369545115">Tự động khởi động Chromium khi máy tính của bạn khởi động</translation>
 <translation id="556024056938947818">Google Chrome đang cố gắng hiển thị mật khẩu.</translation>
 <translation id="2580411288591421699">Không thể cài đặt phiên bản Google Chrome giống với phiên bản hiện đang chạy. Vui lòng đóng Google Chrome và thử lại.</translation>
@@ -95,9 +95,9 @@
 <translation id="2429317896000329049">Google Chrome không thể đồng bộ hóa dữ liệu của bạn vì Đồng bộ hóa không khả dụng cho miền của bạn.</translation>
 <translation id="7747138024166251722">Trình cài đặt không thể tạo thư mục tạm thời. Vui lòng kiểm tra dung lượng ổ đĩa còn trống và quyền cài đặt phần mềm.</translation>
 <translation id="6557998774620459028">Bạn đã cố truy cập &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; nhưng máy chủ xuất trình chứng chỉ được cấp bởi một tổ chức không được hệ điều hành của máy tính tin cậy. Điều này có thể có nghĩa là máy chủ đã tạo bằng chứng xác thực bảo mật riêng mà Chrome không thể dựa vào đó để có được thông tin nhận dạng hoặc có thể kẻ tấn công đang cố chặn việc liên lạc của bạn.</translation>
-<translation id="5170938038195470297">Không thể sử dụng tiểu sử của bạn vì tiểu sử được tạo từ phiên bản Google Chrome mới hơn.
+<translation id="5170938038195470297">Không thể sử dụng hồ sơ của bạn vì hồ sơ được tạo từ phiên bản Google Chrome mới hơn.
 
-Một số tính năng có thể không khả dụng. Vui lòng chỉ định thư mục tiểu sử khác hoặc sử dụng phiên bản Chrome mới hơn.</translation>
+Một số tính năng có thể không khả dụng. Vui lòng chỉ định thư mục hồ sơ khác hoặc sử dụng phiên bản Chrome mới hơn.</translation>
 <translation id="7282192067747128786">Chrome - Thông báo (<ph name="QUANTITY"/> thông báo chưa đọc)</translation>
 <translation id="6011049234605203654">Đi tới
           menu Chrome &gt;
@@ -118,7 +118,7 @@ Một số tính năng có thể không khả dụng. Vui lòng chỉ định th
 <translation id="2346876346033403680">Ai đó trước đây đã đăng nhập vào Chrome trên máy tính này là <ph name="ACCOUNT_EMAIL_LAST"/>. Nếu đó không phải là tài khoản của bạn, hãy tạo người dùng Chrome mới để giữ riêng biệt thông tin của bạn.
 
 Đăng nhập bằng mọi cách sẽ kết hợp thông tin Chrome như dấu trang, lịch sử và các cài đặt khác vào <ph name="ACCOUNT_EMAIL_NEW"/>.</translation>
-<translation id="9107728822479888688"><ph name="BEGIN_BOLD"/>Cảnh báo:<ph name="END_BOLD"/> Google Chrome không thể ngăn các tiện ích mở rộng ghi lại lịch sử duyệt web của bạn. Để tắt tiện ích mở rộng này trong chế độ ẩn danh, hãy bỏ chọn tùy chọn này.</translation>
+<translation id="9107728822479888688"><ph name="BEGIN_BOLD"/>Cảnh báo:<ph name="END_BOLD"/> Google Chrome không thể ngăn các tiện ích ghi lại lịch sử duyệt web của bạn. Để tắt tiện ích này trong chế độ ẩn danh, hãy bỏ chọn tùy chọn này.</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="2664962310688259219">Giấy phép nguồn mở Chrome OS</translation>
 <translation id="2290014774651636340">Khóa API của Google bị thiếu. Một số chức năng của Google Chrome sẽ bị tắt.</translation>
@@ -223,7 +223,7 @@ Một số tính năng có thể không khả dụng. Vui lòng chỉ định th
 <translation id="6598387184982954187">Bạn đang sử dụng <ph name="PROFILE_EMAIL"/> để đồng bộ hóa nội dung Chrome của mình. Để cập nhật tùy chọn đồng bộ hóa hoặc sử dụng Chrome mà không cần tài khoản Google, hãy truy cập <ph name="SETTINGS_LINK"/>.</translation>
 <translation id="7825851276765848807">Không thể cài đặt do lỗi không xác định. Hãy tải xuống lại Google Chrome.</translation>
 <translation id="4458285410772214805">Vui lòng đăng xuất và đăng nhập lại để thay đổi này có hiệu lực.</translation>
-<translation id="8679801911857917785">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome.</translation>
+<translation id="8679801911857917785">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome.</translation>
 <translation id="5334545119300433702">Mô-đun này được xác định là xung đột với Google Chrome.</translation>
 <translation id="4407807842708586359">Hệ điều hành Google Chrome</translation>
 <translation id="6634887557811630702">Google Chrome đã được cập nhật.</translation>
@@ -240,17 +240,17 @@ Một số tính năng có thể không khả dụng. Vui lòng chỉ định th
 <translation id="2246246234298806438">Google Chrome không thể hiển thị xem trước bản in khi thiếu trình xem PDF được cài sẵn.</translation>
 <translation id="6626317981028933585">Thật đáng tiếc, cài đặt Mozilla Firefox của bạn không có sẵn khi trình duyệt đang chạy. Để nhập những cài đặt đó vào Google Chrome, hãy lưu công việc của bạn và đóng tất cả cửa sổ Firefox. Sau đó, nhấp Tiếp tục.</translation>
 <translation id="7242029209006116544">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát cấu hình trên Google Chrome của bạn. Dữ liệu Chrome của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn được liên kết với <ph name="USER_NAME"/>. Bạn có thể xóa dữ liệu này thông qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác. Bạn có thể tùy chọn tạo một cấu hình mới để giữ cho dữ liệu Chrome hiện có của bạn riêng biệt. <ph name="LEARN_MORE"/></translation>
-<translation id="5386244825306882791">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome hoặc tìm kiếm từ Thanh địa chỉ.</translation>
+<translation id="5386244825306882791">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome hoặc tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="2334084861041072223">Bản quyền <ph name="YEAR"/> Google Inc. Mọi quyền được bảo lưu.</translation>
 <translation id="1698376642261615901">Google Chrome là một trình duyệt web chạy các trang web và ứng dụng với tốc độ cực nhanh. Trình duyệt này nhanh, ổn định và dễ sử dụng. Duyệt web an toàn hơn với tính năng ngăn chặn phần mềm độc hại và lừa đảo được tích hợp trong Google Chrome.</translation>
-<translation id="853189717709780425">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát tiểu sử Google Chrome của bạn. Dữ liệu Chrome của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn gắn với <ph name="USER_NAME"/>. Bạn có thể xóa dữ liệu này qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác.</translation>
+<translation id="853189717709780425">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát hồ sơ Google Chrome của bạn. Dữ liệu Chrome của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn gắn với <ph name="USER_NAME"/>. Bạn có thể xóa dữ liệu này qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác.</translation>
 <translation id="6049075767726609708">Quản trị viên đã cài đặt Google Chrome trên hệ thống này và Google Chrome khả dụng cho tất cả người dùng. Ngay bây giờ, Google Chrome cấp hệ thống sẽ thay thế cài đặt cấp người dùng của bạn.</translation>
 <translation id="1818142563254268765">Chrome không thể tự cập nhật lên phiên bản mới nhất nên bạn đã bỏ lỡ các tính năng mới tuyệt vời và các bản vá bảo mật. Bạn cần cập nhật Chrome.</translation>
 <translation id="4338032231047635328">Bạn đã cố truy cập vào &lt;strong&gt;<ph name="DOMAIN"/>&lt;/strong&gt; nhưng chứng chỉ mà máy chủ xuất trình có lỗi. Google Chrome không thể sử dụng chứng chỉ có lỗi và không thể xác thực nhận diện của trang web mà bạn đã cố kết nối.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
 <translation id="3836351788193713666">Gần được cập nhật! Hãy chạy lại Google Chrome để hoàn tất cập nhật.</translation>
-<translation id="884296878221830158">Tiện ích mở rộng này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome hoặc nhấp vào nút Trang chủ.</translation>
+<translation id="884296878221830158">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome hoặc nhấp vào nút Trang chủ.</translation>
 <translation id="7106741999175697885">Trình quản lý Tác vụ - Google Chrome</translation>
 <translation id="3396977131400919238">Đã xảy ra lỗi hệ điều hành trong quá trình cài đặt. Vui lòng tải xuống lại Google Chrome.</translation>
 <translation id="8037887340639533879">Không tìm thấy bản cài đặt Google Chrome cần cập nhật.</translation>
index e72f7d6..db7d8f2 100644 (file)
 <translation id="7396375882099008034">对防火墙或防病毒软件进行设置,以允许 Chrome 访问该网络。</translation>
 <translation id="9102715433345326100">这是恶意文件,Chrome 已将其拦截。</translation>
 <translation id="3170677364322086041">该网站使用的Chrome内嵌框架插件已停止使用,并且不再接收安全性和稳定性更新。请将其卸载,然后升级到新式浏览器。</translation>
-<translation id="8205111949707227942">可选:将使用情况统计信息和崩溃报告自动发送给 Google,帮助完善 Chrome 操作系统。</translation>
+<translation id="8205111949707227942">可选:将使用情况统计信息和崩溃报告自动发送给Google,帮助完善Chrome操作系统。</translation>
 <translation id="7253415505590551024">正在进行多项下载。您希望退出 Google Chrome 浏览器并取消这些下载吗?</translation>
 <translation id="3622797965165704966">现在,无论是通过Google帐户还是在共用的计算机上,您都可以更轻松地使用Chrome。</translation>
 <translation id="7196020411877309443">为何会出现这个窗口?</translation>
index 772214b..fa8ff52 100644 (file)
       </if>
       <structure type="chrome_scaled_image" name="IDR_INFOBAR_3D_BLOCKED" file="common/infobar_3d_blocked.png" />
       <structure type="chrome_scaled_image" name="IDR_INFOBAR_ALT_NAV_URL" file="common/infobar_alt_nav_url.png" />
-      <structure type="chrome_scaled_image" name="IDR_INFOBAR_AUTOFILL" file="common/infobar_autofill.png" />
+      <structure type="chrome_scaled_image" name="IDR_INFOBAR_AUTOFILL_CC" file="common/infobar_autofill_cc.png" />
       <structure type="chrome_scaled_image" name="IDR_INFOBAR_AUTOLOGIN" file="common/infobar_autologin.png" />
       <structure type="chrome_scaled_image" name="IDR_INFOBAR_COOKIE" file="common/infobar_cookie.png" />
       <structure type="chrome_scaled_image" name="IDR_INFOBAR_DESKTOP_NOTIFICATIONS" file="common/infobar_desktop_notifications.png" />
index 0358fb0..616beb0 100644 (file)
@@ -33,6 +33,19 @@ void NewTabPagePrefs::Destroy(JNIEnv* env, jobject obj) {
 NewTabPagePrefs::~NewTabPagePrefs() {
 }
 
+jboolean NewTabPagePrefs::GetCurrentlyOpenTabsCollapsed(JNIEnv* env,
+                                                       jobject obj) {
+  PrefService* prefs = profile_->GetPrefs();
+  return prefs->GetBoolean(prefs::kNtpCollapsedCurrentlyOpenTabs);
+}
+
+void NewTabPagePrefs::SetCurrentlyOpenTabsCollapsed(JNIEnv* env,
+                                                   jobject obj,
+                                                   jboolean is_collapsed) {
+  PrefService* prefs = profile_->GetPrefs();
+  prefs->SetBoolean(prefs::kNtpCollapsedCurrentlyOpenTabs, is_collapsed);
+}
+
 jboolean NewTabPagePrefs::GetSnapshotDocumentCollapsed(JNIEnv* env,
                                                        jobject obj) {
   return profile_->GetPrefs()->GetBoolean(prefs::kNtpCollapsedSnapshotDocument);
@@ -96,6 +109,10 @@ void NewTabPagePrefs::SetForeignSessionCollapsed(JNIEnv* env,
 void NewTabPagePrefs::RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
   registry->RegisterBooleanPref(
+      prefs::kNtpCollapsedCurrentlyOpenTabs,
+      false,
+      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+  registry->RegisterBooleanPref(
       prefs::kNtpCollapsedSnapshotDocument,
       false,
       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
index 99b6a09..7d4333d 100644 (file)
@@ -14,6 +14,11 @@ class NewTabPagePrefs {
   explicit NewTabPagePrefs(Profile* profile);
   void Destroy(JNIEnv* env, jobject obj);
 
+  jboolean GetCurrentlyOpenTabsCollapsed(JNIEnv* env, jobject obj);
+  void SetCurrentlyOpenTabsCollapsed(JNIEnv* env,
+                                     jobject obj,
+                                     jboolean is_collapsed);
+
   jboolean GetSnapshotDocumentCollapsed(JNIEnv* env, jobject obj);
   void SetSnapshotDocumentCollapsed(JNIEnv* env,
                                     jobject obj,
index 3bac565..ccf61fd 100644 (file)
 DEFINE_RESOURCE_ID(0, 0)
 
 // InfoBar resources.
-DEFINE_RESOURCE_ID(IDR_INFOBAR_ALT_NAV_URL, R.drawable.infobar_didyoumean)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_AUTOFILL, R.drawable.infobar_autofill)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_AUTOLOGIN, R.drawable.infobar_autologin)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_COOKIE, R.drawable.infobar_cookie)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_DESKTOP_NOTIFICATIONS,\
-                   R.drawable.infobar_desktop_notifications)
+DEFINE_RESOURCE_ID(IDR_INFOBAR_AUTOFILL_CC, R.drawable.infobar_autofill_cc)
+DEFINE_RESOURCE_ID(IDR_INFOBAR_AUTOLOGIN,\
+                   R.drawable.infobar_savepassword_autologin)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_GEOLOCATION, R.drawable.infobar_geolocation)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_MEDIA_STREAM_CAMERA, R.drawable.infobar_camera)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_MEDIA_STREAM_MIC, R.drawable.infobar_microphone)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_MIDI, R.drawable.infobar_midi)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_MULTIPLE_DOWNLOADS,\
                    R.drawable.infobar_multiple_downloads)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_PLUGIN_CRASHED,\
-                   R.drawable.infobar_plugin_crashed)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_PLUGIN_INSTALL, R.drawable.infobar_plugin)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_PROTECTED_MEDIA_IDENTIFIER,
                    R.drawable.infobar_protected_media_identifier)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_RESTORE_SESSION, R.drawable.infobar_restore)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_SAVE_PASSWORD, R.drawable.infobar_savepassword)
+DEFINE_RESOURCE_ID(IDR_INFOBAR_SAVE_PASSWORD,\
+                   R.drawable.infobar_savepassword_autologin)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_WARNING, R.drawable.infobar_warning)
-DEFINE_RESOURCE_ID(IDR_INFOBAR_THEME, R.drawable.infobar_theme)
 DEFINE_RESOURCE_ID(IDR_INFOBAR_TRANSLATE, R.drawable.infobar_translate)
 DEFINE_RESOURCE_ID(IDR_BLOCKED_POPUPS, R.drawable.infobar_blocked_popups)
 
index 37cd951..858384c 100644 (file)
@@ -23,6 +23,7 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_manager.h"
+#include "components/signin/core/browser/signin_metrics.h"
 #include "components/signin/core/common/profile_management_switches.h"
 #include "jni/SigninManager_jni.h"
 
@@ -133,7 +134,8 @@ void SigninManagerAndroid::OnSignInCompleted(JNIEnv* env,
 }
 
 void SigninManagerAndroid::SignOut(JNIEnv* env, jobject obj) {
-  SigninManagerFactory::GetForProfile(profile_)->SignOut();
+  SigninManagerFactory::GetForProfile(profile_)->SignOut(
+      signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS);
 }
 
 base::android::ScopedJavaLocalRef<jstring>
index 90a0c89..b3d3c0a 100644 (file)
@@ -902,6 +902,15 @@ IN_PROC_BROWSER_TEST_F(WebViewTest,
              NO_TEST_SERVER);
 }
 
+IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestDisplayNoneWebviewLoad) {
+  TestHelper("testDisplayNoneWebviewLoad", "web_view/shim", NO_TEST_SERVER);
+}
+
+IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestDisplayNoneWebviewRemoveChild) {
+  TestHelper("testDisplayNoneWebviewRemoveChild",
+             "web_view/shim", NO_TEST_SERVER);
+}
+
 IN_PROC_BROWSER_TEST_F(WebViewTest,
                        Shim_TestInlineScriptFromAccessibleResources) {
   TestHelper("testInlineScriptFromAccessibleResources",
index 69fd111..988d9c5 100644 (file)
@@ -197,12 +197,9 @@ metrics::OmniboxInputType::Type AutocompleteInput::Parse(
     // handlable schemes (e.g. "javascript") may be treated as "blocked" by the
     // external protocol handler because we don't want pages to open them, but
     // users still can.
-    // Note that the protocol handler needs to be informed that omnibox input
-    // should always be considered "user gesture-triggered", lest it always
-    // return BLOCK.
     ExternalProtocolHandler::BlockState block_state =
         ExternalProtocolHandler::GetBlockState(
-            base::UTF16ToUTF8(parsed_scheme), true);
+            base::UTF16ToUTF8(parsed_scheme));
     switch (block_state) {
       case ExternalProtocolHandler::DONT_BLOCK:
         return metrics::OmniboxInputType::URL;
index 3bad774..7d13104 100644 (file)
@@ -58,7 +58,7 @@ void AutofillCCInfoBarDelegate::InfoBarDismissed() {
 }
 
 int AutofillCCInfoBarDelegate::GetIconID() const {
-  return IDR_INFOBAR_AUTOFILL;
+  return IDR_INFOBAR_AUTOFILL_CC;
 }
 
 infobars::InfoBarDelegate::Type AutofillCCInfoBarDelegate::GetInfoBarType()
index b0260a6..03c947b 100644 (file)
@@ -388,9 +388,9 @@ void RegisterComponentsForUpdate(const CommandLine& command_line) {
   RegisterRecoveryComponent(cus, g_browser_process->local_state());
   RegisterPepperFlashComponent(cus);
   RegisterSwiftShaderComponent(cus);
+  RegisterWidevineCdmComponent(cus);
   g_browser_process->pnacl_component_installer()->RegisterPnaclComponent(
       cus, command_line);
-  RegisterWidevineCdmComponent(cus);
 #endif
 
 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
index 43ef913..4c83445 100644 (file)
@@ -5,8 +5,10 @@
 #include "ui/chromeos/touch_exploration_controller.h"
 
 #include "ash/accessibility_delegate.h"
+#include "ash/ash_switches.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
+#include "base/command_line.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "ui/aura/test/event_generator.h"
@@ -23,6 +25,11 @@ class TouchExplorationTest : public InProcessBrowserTest {
   virtual ~TouchExplorationTest() {}
 
  protected:
+  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE {
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(
+        ash::switches::kAshEnableTouchExplorationMode);
+  }
+
   void SwitchTouchExplorationMode(bool on) {
     ash::AccessibilityDelegate* ad =
         ash::Shell::GetInstance()->accessibility_delegate();
index fa32096..397e55d 100644 (file)
@@ -30,6 +30,7 @@
 #include "chrome/browser/chromeos/app_mode/kiosk_mode_idle_app_name_notification.h"
 #include "chrome/browser/chromeos/boot_times_loader.h"
 #include "chrome/browser/chromeos/dbus/cros_dbus_service.h"
+#include "chrome/browser/chromeos/device/input_service_proxy.h"
 #include "chrome/browser/chromeos/events/event_rewriter.h"
 #include "chrome/browser/chromeos/events/event_rewriter_controller.h"
 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h"
@@ -769,6 +770,9 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() {
 
   g_browser_process->platform_part()->oom_priority_manager()->Stop();
 
+  // Early wake-up of HID device service.
+  InputServiceProxy::WarmUp();
+
   // Destroy the application name notifier for Kiosk mode.
   KioskModeIdleAppNameNotification::Shutdown();
 
index f065775..f07bce6 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/device/input_service_proxy.h"
 
+#include "base/bind_helpers.h"
 #include "base/task_runner_util.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -100,6 +101,14 @@ InputServiceProxy::~InputServiceProxy() {
                  base::Unretained(service_observer_.release())));
 }
 
+// static
+void InputServiceProxy::WarmUp() {
+  content::BrowserThread::PostTask(
+      content::BrowserThread::FILE,
+      FROM_HERE,
+      base::Bind(base::IgnoreResult(&InputServiceLinux::GetInstance)));
+}
+
 void InputServiceProxy::AddObserver(Observer* observer) {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (observer)
index 11ba071..e41196f 100644 (file)
@@ -37,6 +37,9 @@ class InputServiceProxy {
   InputServiceProxy();
   ~InputServiceProxy();
 
+  // Used for early init for cashing info about available HID.
+  static void WarmUp();
+
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
index 4c85304..fda0e6f 100644 (file)
@@ -19,55 +19,60 @@ namespace {
 
 // Apps/extensions explicitly whitelisted for use in public sessions.
 const char* kPublicSessionWhitelist[] = {
-  // Public sessions in general:
-  "cbkkbcmdlboombapidmoeolnmdacpkch",  // Chrome RDP
-  "djflhoibgkdhkhhcedjiklpkjnoahfmg",  // User Agent Switcher
-  "iabmpiboiopbgfabjmgeedhcmjenhbla",  // VNC Viewer
-
-  // Retail mode:
-  "ehcabepphndocfmgbdkbjibfodelmpbb",  // Angry Birds demo
-  "kgimkbnclbekdkabkpjhpakhhalfanda",  // Bejeweled demo
-  "joodangkbfjnajiiifokapkpmhfnpleo",  // Calculator
-  "fpgfohogebplgnamlafljlcidjedbdeb",  // Calendar demo
-  "hfhhnacclhffhdffklopdkcgdhifgngh",  // Camera
-  "cdjikkcakjcdjemakobkmijmikhkegcj",  // Chrome Remote Desktop demo
-  "jkoildpomkimndcphjpffmephmcmkfhn",  // Chromebook Demo App
-  "ielkookhdphmgbipcfmafkaiagademfp",  // Custom bookmarks
-  "kogjlbfgggambihdjcpijgcbmenblimd",  // Custom bookmarks
-  "ogbkmlkceflgpilgbmbcfbifckpkfacf",  // Custom bookmarks
-  "pbbbjjecobhljkkcenlakfnkmkfkfamd",  // Custom bookmarks
-  "jkbfjmnjcdmhlfpephomoiipbhcoiffb",  // Custom bookmarks
-  "dgmblbpgafgcgpkoiilhjifindhinmai",  // Custom bookmarks
-  "iggnealjakkgfofealilhkkclnbnfnmo",  // Custom bookmarks
-  "lplkobnahgbopmpkdapaihnnojkphahc",  // Custom bookmarks
-  "lejnflfhjpcannpaghnahbedlabpmhoh",  // Custom bookmarks
-  "ebkhfdfghngbimnpgelagnfacdafhaba",  // Deezer demo
-  "npnjdccdffhdndcbeappiamcehbhjibf",  // Docs.app demo
-  "iddohohhpmajlkbejjjcfednjnhlnenk",  // Evernote demo
-  "bjdhhokmhgelphffoafoejjmlfblpdha",  // Gmail demo
-  "mdhnphfgagkpdhndljccoackjjhghlif",  // Google Drive demo
-  "dondgdlndnpianbklfnehgdhkickdjck",  // Google Keep demo
-  "fgjnkhlabjcaajddbaenilcmpcidahll",  // Google+ demo
-  "ifpkhncdnjfipfjlhfidljjffdgklanh",  // Google+ Photos demo
-  "cgmlfbhkckbedohgdepgbkflommbfkep",  // Hangouts.app demo
-  "edhhaiphkklkcfcbnlbpbiepchnkgkpn",  // Helper.extension demo
-  "diehajhcjifpahdplfdkhiboknagmfii",  // Kindle demo
-  "nhpmmldpbfjofkipjaieeomhnmcgihfm",  // Menu.app demo
-  "onbhgdmifjebcabplolilidlpgeknifi",  // Music.app demo
-  "kkkbcoabfhgekpnddfkaphobhinociem",  // Netflix demo
-  "adlphlfdhhjenpgimjochcpelbijkich",  // New York Times demo
-  "cgefhjmlaifaamhhoojmpcnihlbddeki",  // Pandora demo
-  "kpjjigggmcjinapdeipapdcnmnjealll",  // Pixlr demo
-  "aleodiobpjillgfjdkblghiiaegggmcm",  // Quickoffice demo
-  "nifkmgcdokhkjghdlgflonppnefddien",  // Sheets demo
-  "hdmobeajeoanbanmdlabnbnlopepchip",  // Slides demo
-  "dgohlccohkojjgkkfholmobjjoledflp",  // Spotify demo
-  "dhmdaeekeihmajjnmichlhiffffdbpde",  // Store.app demo
-  "jeabmjjifhfcejonjjhccaeigpnnjaak",  // TweetDeck demo
-  "pbdihpaifchmclcmkfdgffnnpfbobefh",  // YouTube demo
-
-  // Testing extensions:
-  "ongnjlefhnoajpbodoldndkbkdgfomlp",  // Show Managed Storage
+    // Public sessions in general:
+    "cbkkbcmdlboombapidmoeolnmdacpkch",  // Chrome RDP
+    "djflhoibgkdhkhhcedjiklpkjnoahfmg",  // User Agent Switcher
+    "iabmpiboiopbgfabjmgeedhcmjenhbla",  // VNC Viewer
+
+    // Libraries:
+    "aclofikceldphonlfmghmimkodjdmhck",  // Ancoris login component
+    "eilbnahdgoddoedakcmfkcgfoegeloil",  // Ancoris proxy component
+    "ceehlgckkmkaoggdnjhibffkphfnphmg",  // Libdata login
+
+    // Retail mode:
+    "ehcabepphndocfmgbdkbjibfodelmpbb",  // Angry Birds demo
+    "kgimkbnclbekdkabkpjhpakhhalfanda",  // Bejeweled demo
+    "joodangkbfjnajiiifokapkpmhfnpleo",  // Calculator
+    "fpgfohogebplgnamlafljlcidjedbdeb",  // Calendar demo
+    "hfhhnacclhffhdffklopdkcgdhifgngh",  // Camera
+    "cdjikkcakjcdjemakobkmijmikhkegcj",  // Chrome Remote Desktop demo
+    "jkoildpomkimndcphjpffmephmcmkfhn",  // Chromebook Demo App
+    "ielkookhdphmgbipcfmafkaiagademfp",  // Custom bookmarks
+    "kogjlbfgggambihdjcpijgcbmenblimd",  // Custom bookmarks
+    "ogbkmlkceflgpilgbmbcfbifckpkfacf",  // Custom bookmarks
+    "pbbbjjecobhljkkcenlakfnkmkfkfamd",  // Custom bookmarks
+    "jkbfjmnjcdmhlfpephomoiipbhcoiffb",  // Custom bookmarks
+    "dgmblbpgafgcgpkoiilhjifindhinmai",  // Custom bookmarks
+    "iggnealjakkgfofealilhkkclnbnfnmo",  // Custom bookmarks
+    "lplkobnahgbopmpkdapaihnnojkphahc",  // Custom bookmarks
+    "lejnflfhjpcannpaghnahbedlabpmhoh",  // Custom bookmarks
+    "ebkhfdfghngbimnpgelagnfacdafhaba",  // Deezer demo
+    "npnjdccdffhdndcbeappiamcehbhjibf",  // Docs.app demo
+    "iddohohhpmajlkbejjjcfednjnhlnenk",  // Evernote demo
+    "bjdhhokmhgelphffoafoejjmlfblpdha",  // Gmail demo
+    "mdhnphfgagkpdhndljccoackjjhghlif",  // Google Drive demo
+    "dondgdlndnpianbklfnehgdhkickdjck",  // Google Keep demo
+    "fgjnkhlabjcaajddbaenilcmpcidahll",  // Google+ demo
+    "ifpkhncdnjfipfjlhfidljjffdgklanh",  // Google+ Photos demo
+    "cgmlfbhkckbedohgdepgbkflommbfkep",  // Hangouts.app demo
+    "edhhaiphkklkcfcbnlbpbiepchnkgkpn",  // Helper.extension demo
+    "diehajhcjifpahdplfdkhiboknagmfii",  // Kindle demo
+    "nhpmmldpbfjofkipjaieeomhnmcgihfm",  // Menu.app demo
+    "onbhgdmifjebcabplolilidlpgeknifi",  // Music.app demo
+    "kkkbcoabfhgekpnddfkaphobhinociem",  // Netflix demo
+    "adlphlfdhhjenpgimjochcpelbijkich",  // New York Times demo
+    "cgefhjmlaifaamhhoojmpcnihlbddeki",  // Pandora demo
+    "kpjjigggmcjinapdeipapdcnmnjealll",  // Pixlr demo
+    "aleodiobpjillgfjdkblghiiaegggmcm",  // Quickoffice demo
+    "nifkmgcdokhkjghdlgflonppnefddien",  // Sheets demo
+    "hdmobeajeoanbanmdlabnbnlopepchip",  // Slides demo
+    "dgohlccohkojjgkkfholmobjjoledflp",  // Spotify demo
+    "dhmdaeekeihmajjnmichlhiffffdbpde",  // Store.app demo
+    "jeabmjjifhfcejonjjhccaeigpnnjaak",  // TweetDeck demo
+    "pbdihpaifchmclcmkfdgffnnpfbobefh",  // YouTube demo
+
+    // Testing extensions:
+    "ongnjlefhnoajpbodoldndkbkdgfomlp",  // Show Managed Storage
 };
 
 }  // namespace
index f8e6c87..0179772 100644 (file)
@@ -120,15 +120,19 @@ InputMethodEngine::InputMethodEngine()
       composition_cursor_(0),
       candidate_window_(new ui::CandidateWindow()),
       window_visible_(false),
-      sent_key_event_(NULL) {}
+      sent_key_event_(NULL),
+      profile_(NULL) {
+}
 
 InputMethodEngine::~InputMethodEngine() {
   if (start_time_.ToInternalValue())
     RecordHistogram("WorkingTime", (end_time_ - start_time_).InSeconds());
-  input_method::InputMethodManager::Get()->RemoveInputMethodExtension(imm_id_);
+  input_method::InputMethodManager::Get()->RemoveInputMethodExtension(profile_,
+                                                                      imm_id_);
 }
 
 void InputMethodEngine::Initialize(
+    Profile* profile,
     scoped_ptr<InputMethodEngineInterface::Observer> observer,
     const char* engine_name,
     const char* extension_id,
@@ -139,6 +143,8 @@ void InputMethodEngine::Initialize(
     const GURL& input_view) {
   DCHECK(observer) << "Observer must not be null.";
 
+  profile_ = profile;
+
   // TODO(komatsu): It is probably better to set observer out of Initialize.
   observer_ = observer.Pass();
   engine_id_ = engine_id;
@@ -170,7 +176,7 @@ void InputMethodEngine::Initialize(
 
   // TODO(komatsu): It is probably better to call AddInputMethodExtension
   // out of Initialize.
-  manager->AddInputMethodExtension(imm_id_, this);
+  manager->AddInputMethodExtension(profile, imm_id_, this);
 }
 
 const input_method::InputMethodDescriptor& InputMethodEngine::GetDescriptor()
@@ -319,8 +325,13 @@ bool InputMethodEngine::SendKeyEvents(
                           event.code,
                           flags,
                           false /* is_char */);
-    if (!event.key.empty())
-      ui_event.set_character(base::UTF8ToUTF16(event.key)[0]);
+    // 4-bytes UTF-8 string is at least 2-characters UTF-16 string.
+    // And Key char can only be single UTF-16 character.
+    if (!event.key.empty() && event.key.size() < 4) {
+      base::string16 key_char = base::UTF8ToUTF16(event.key);
+      if (key_char.size() == 1)
+        ui_event.set_character(key_char[0]);
+    }
     base::AutoReset<const ui::KeyEvent*> reset_sent_key(&sent_key_event_,
                                                         &ui_event);
     ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&ui_event);
@@ -470,14 +481,6 @@ bool InputMethodEngine::IsActive() const {
   return active_;
 }
 
-void InputMethodEngine::KeyEventDone(input_method::KeyEventHandle* key_data,
-                                     bool handled) {
-  KeyEventDoneCallback* callback =
-      reinterpret_cast<KeyEventDoneCallback*>(key_data);
-  callback->Run(handled);
-  delete callback;
-}
-
 bool InputMethodEngine::DeleteSurroundingText(int context_id,
                                               int offset,
                                               size_t number_of_chars,
index 716d136..22a8006 100644 (file)
@@ -13,6 +13,8 @@
 #include "chromeos/ime/input_method_descriptor.h"
 #include "url/gurl.h"
 
+class Profile;
+
 namespace ui {
 class CandidateWindow;
 class KeyEvent;
@@ -38,7 +40,8 @@ class InputMethodEngine : public InputMethodEngineInterface {
 
   virtual ~InputMethodEngine();
 
-  void Initialize(scoped_ptr<InputMethodEngineInterface::Observer> observer,
+  void Initialize(Profile* profile,
+                  scoped_ptr<InputMethodEngineInterface::Observer> observer,
                   const char* engine_name,
                   const char* extension_id,
                   const char* engine_id,
@@ -77,8 +80,6 @@ class InputMethodEngine : public InputMethodEngineInterface {
   virtual bool SetMenuItems(const std::vector<MenuItem>& items) OVERRIDE;
   virtual bool UpdateMenuItems(const std::vector<MenuItem>& items) OVERRIDE;
   virtual bool IsActive() const OVERRIDE;
-  virtual void KeyEventDone(input_method::KeyEventHandle* key_data,
-                            bool handled) OVERRIDE;
   virtual bool DeleteSurroundingText(int context_id,
                                      int offset,
                                      size_t number_of_chars,
@@ -164,6 +165,9 @@ class InputMethodEngine : public InputMethodEngineInterface {
   // The start & end time of using this input method. This is for UMA.
   base::Time start_time_;
   base::Time end_time_;
+
+  // User profile that owns this method.
+  Profile* profile_;
 };
 
 }  // namespace chromeos
index f60ed45..71d4298 100644 (file)
@@ -231,10 +231,6 @@ class InputMethodEngineInterface : public IMEEngineHandlerInterface {
   // Returns true if this IME is active, false if not.
   virtual bool IsActive() const = 0;
 
-  // Inform the engine that a key event has been processed.
-  virtual void KeyEventDone(input_method::KeyEventHandle* key_data,
-                            bool handled) = 0;
-
   // Deletes |number_of_chars| unicode characters as the basis of |offset| from
   // the surrounding text. The |offset| is relative position based on current
   // caret.
index 8210b17..a5df161 100644 (file)
@@ -175,7 +175,8 @@ class InputMethodEngineTest :  public testing::Test {
     engine_.reset(new InputMethodEngine());
     observer_ = new TestObserver();
     scoped_ptr<InputMethodEngineInterface::Observer> observer_ptr(observer_);
-    engine_->Initialize(observer_ptr.Pass(),
+    engine_->Initialize(NULL /* profile */,
+                        observer_ptr.Pass(),
                         "",
                         whitelisted ? kTestExtensionId : kTestExtensionId2,
                         kTestImeEngineId,
index 33951f2..8e3a62b 100644 (file)
@@ -22,6 +22,7 @@
 #include "chrome/browser/chromeos/input_method/component_extension_ime_manager_impl.h"
 #include "chrome/browser/chromeos/input_method/input_method_engine.h"
 #include "chrome/browser/chromeos/language_preferences.h"
+#include "chrome/browser/chromeos/login/users/user_manager.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/ime/component_extension_ime_manager.h"
@@ -477,6 +478,7 @@ void InputMethodManagerImpl::ActivateInputMethodMenuItem(
 }
 
 void InputMethodManagerImpl::AddInputMethodExtension(
+    Profile* profile,
     const std::string& id,
     InputMethodEngineInterface* engine) {
   if (state_ == STATE_TERMINATING)
@@ -484,7 +486,12 @@ void InputMethodManagerImpl::AddInputMethodExtension(
 
   DCHECK(engine);
 
-  profile_engine_map_[GetProfile()][id] = engine;
+  profile_engine_map_[profile][id] = engine;
+
+  if (id == current_input_method_.id()) {
+    IMEBridge::Get()->SetCurrentEngineHandler(engine);
+    engine->Enable();
+  }
 
   if (extension_ime_util::IsComponentExtensionIME(id))
     return;
@@ -508,7 +515,8 @@ void InputMethodManagerImpl::AddInputMethodExtension(
   }
 }
 
-void InputMethodManagerImpl::RemoveInputMethodExtension(const std::string& id) {
+void InputMethodManagerImpl::RemoveInputMethodExtension(Profile* profile,
+                                                        const std::string& id) {
   if (!extension_ime_util::IsExtensionIME(id))
     DVLOG(1) << id << " is not a valid extension input method ID.";
 
@@ -518,7 +526,7 @@ void InputMethodManagerImpl::RemoveInputMethodExtension(const std::string& id) {
     active_input_method_ids_.erase(i);
   extra_input_methods_.erase(id);
 
-  EngineMap& engine_map = profile_engine_map_[GetProfile()];
+  EngineMap& engine_map = profile_engine_map_[profile];
   if (IMEBridge::Get()->GetCurrentEngineHandler() == engine_map[id])
     IMEBridge::Get()->SetCurrentEngineHandler(NULL);
   engine_map.erase(id);
index c8117dc..9da266b 100644 (file)
@@ -70,9 +70,11 @@ class InputMethodManagerImpl : public InputMethodManager,
   virtual void ChangeInputMethod(const std::string& input_method_id) OVERRIDE;
   virtual void ActivateInputMethodMenuItem(const std::string& key) OVERRIDE;
   virtual void AddInputMethodExtension(
+      Profile* profile,
       const std::string& id,
       InputMethodEngineInterface* instance) OVERRIDE;
-  virtual void RemoveInputMethodExtension(const std::string& id) OVERRIDE;
+  virtual void RemoveInputMethodExtension(Profile* profile,
+                                          const std::string& id) OVERRIDE;
   virtual void GetInputMethodExtensions(
       InputMethodDescriptors* result) OVERRIDE;
   virtual void SetEnabledExtensionImes(std::vector<std::string>* ids) OVERRIDE;
@@ -106,6 +108,8 @@ class InputMethodManagerImpl : public InputMethodManager,
       scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate);
 
  private:
+  friend class InputMethodManagerImplTest;
+
   // CandidateWindowController::Observer overrides:
   virtual void CandidateClicked(int index) OVERRIDE;
   virtual void CandidateWindowOpened() OVERRIDE;
@@ -167,6 +171,9 @@ class InputMethodManagerImpl : public InputMethodManager,
   void ReconfigureIMFramework();
 
   // Gets the current active user profile.
+  // Note: this method is deprecated as ActiveUserProfile might change
+  // during asynchronous operations that leads to strange crashes.
+  // Use with caution!
   Profile* GetProfile() const;
 
   scoped_ptr<InputMethodDelegate> delegate_;
index ba24c42..551353e 100644 (file)
@@ -58,6 +58,59 @@ std::string ImeIdFromEngineId(const std::string& id) {
   return extension_ime_util::GetInputMethodIDByEngineID(id);
 }
 
+class TestObserver : public InputMethodManager::Observer,
+                     public ash::ime::InputMethodMenuManager::Observer {
+ public:
+  TestObserver()
+      : input_method_changed_count_(0),
+        input_method_menu_item_changed_count_(0),
+        last_show_message_(false) {
+  }
+  virtual ~TestObserver() {}
+
+  virtual void InputMethodChanged(InputMethodManager* manager,
+                                  bool show_message) OVERRIDE {
+    ++input_method_changed_count_;
+    last_show_message_ = show_message;
+  }
+  virtual void InputMethodMenuItemChanged(
+      ash::ime::InputMethodMenuManager* manager) OVERRIDE {
+    ++input_method_menu_item_changed_count_;
+  }
+
+  int input_method_changed_count_;
+  int input_method_menu_item_changed_count_;
+  bool last_show_message_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestObserver);
+};
+
+class TestCandidateWindowObserver
+    : public InputMethodManager::CandidateWindowObserver {
+ public:
+  TestCandidateWindowObserver()
+      : candidate_window_opened_count_(0),
+        candidate_window_closed_count_(0) {
+  }
+
+  virtual ~TestCandidateWindowObserver() {}
+
+  virtual void CandidateWindowOpened(InputMethodManager* manager) OVERRIDE {
+    ++candidate_window_opened_count_;
+  }
+  virtual void CandidateWindowClosed(InputMethodManager* manager) OVERRIDE {
+    ++candidate_window_closed_count_;
+  }
+
+  int candidate_window_opened_count_;
+  int candidate_window_closed_count_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestCandidateWindowObserver);
+};
+}  // namespace
+
 class InputMethodManagerImplTest :  public BrowserWithTestWindowTest {
  public:
   InputMethodManagerImplTest()
@@ -108,6 +161,7 @@ class InputMethodManagerImplTest :  public BrowserWithTestWindowTest {
   }
 
  protected:
+  Profile* GetProfile() { return manager_->GetProfile(); }
   // Helper function to initialize component extension stuff for testing.
   void InitComponentExtension() {
     mock_delegate_ = new MockComponentExtIMEManagerDelegate();
@@ -117,13 +171,17 @@ class InputMethodManagerImplTest :  public BrowserWithTestWindowTest {
     // Note, for production, these SetEngineHandler are called when
     // IMEEngineHandlerInterface is initialized via
     // InitializeComponentextension.
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kNaclMozcUsId),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kNaclMozcUsId),
                                       mock_engine_handler_.get());
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kNaclMozcJpId),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kNaclMozcJpId),
                                       mock_engine_handler_.get());
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kExt2Engine1Id),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kExt2Engine1Id),
                                       mock_engine_handler_.get());
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kExt2Engine2Id),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kExt2Engine2Id),
                                       mock_engine_handler_.get());
     manager_->InitializeComponentExtensionForTesting(delegate.Pass());
   }
@@ -269,58 +327,6 @@ class InputMethodManagerImplTest :  public BrowserWithTestWindowTest {
   DISALLOW_COPY_AND_ASSIGN(InputMethodManagerImplTest);
 };
 
-class TestObserver : public InputMethodManager::Observer,
-                     public ash::ime::InputMethodMenuManager::Observer{
- public:
-  TestObserver()
-      : input_method_changed_count_(0),
-        input_method_menu_item_changed_count_(0),
-        last_show_message_(false) {
-  }
-  virtual ~TestObserver() {}
-
-  virtual void InputMethodChanged(InputMethodManager* manager,
-                                  bool show_message) OVERRIDE {
-    ++input_method_changed_count_;
-    last_show_message_ = show_message;
-  }
-  virtual void InputMethodMenuItemChanged(
-      ash::ime::InputMethodMenuManager* manager) OVERRIDE {
-    ++input_method_menu_item_changed_count_;
-  }
-
-  int input_method_changed_count_;
-  int input_method_menu_item_changed_count_;
-  bool last_show_message_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestObserver);
-};
-
-class TestCandidateWindowObserver
-    : public InputMethodManager::CandidateWindowObserver {
- public:
-  TestCandidateWindowObserver()
-      : candidate_window_opened_count_(0),
-        candidate_window_closed_count_(0) {
-  }
-  virtual ~TestCandidateWindowObserver() {}
-
-  virtual void CandidateWindowOpened(InputMethodManager* manager) OVERRIDE {
-    ++candidate_window_opened_count_;
-  }
-  virtual void CandidateWindowClosed(InputMethodManager* manager) OVERRIDE {
-    ++candidate_window_closed_count_;
-  }
-
-  int candidate_window_opened_count_;
-  int candidate_window_closed_count_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestCandidateWindowObserver);
-};
-}  // namespace
-
 TEST_F(InputMethodManagerImplTest, TestGetImeKeyboard) {
   EXPECT_TRUE(manager_->GetImeKeyboard());
   EXPECT_EQ(keyboard_, manager_->GetImeKeyboard());
@@ -1129,7 +1135,7 @@ TEST_F(InputMethodManagerImplTest, TestAddRemoveExtensionInputMethods) {
                                           GURL(),
                                           GURL());
   MockInputMethodEngine engine(descriptor1);
-  manager_->AddInputMethodExtension(ext1_id, &engine);
+  manager_->AddInputMethodExtension(GetProfile(), ext1_id, &engine);
 
   // Extension IMEs are not enabled by default.
   EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
@@ -1158,7 +1164,7 @@ TEST_F(InputMethodManagerImplTest, TestAddRemoveExtensionInputMethods) {
                                           GURL(),
                                           GURL());
   MockInputMethodEngine engine2(descriptor2);
-  manager_->AddInputMethodExtension(ext2_id, &engine2);
+  manager_->AddInputMethodExtension(GetProfile(), ext2_id, &engine2);
   EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
 
   extension_ime_ids.push_back(ext2_id);
@@ -1174,9 +1180,9 @@ TEST_F(InputMethodManagerImplTest, TestAddRemoveExtensionInputMethods) {
   }
 
   // Remove them.
-  manager_->RemoveInputMethodExtension(ext1_id);
+  manager_->RemoveInputMethodExtension(GetProfile(), ext1_id);
   EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
-  manager_->RemoveInputMethodExtension(ext2_id);
+  manager_->RemoveInputMethodExtension(GetProfile(), ext2_id);
   EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
 }
 
@@ -1210,7 +1216,7 @@ TEST_F(InputMethodManagerImplTest, TestAddExtensionInputThenLockScreen) {
                                          GURL(),
                                          GURL());
   MockInputMethodEngine engine(descriptor);
-  manager_->AddInputMethodExtension(ext_id, &engine);
+  manager_->AddInputMethodExtension(GetProfile(), ext_id, &engine);
 
   // Extension IME is not enabled by default.
   EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
index fe104e3..2c3228a 100644 (file)
@@ -90,10 +90,6 @@ bool MockInputMethodEngine::IsActive() const {
   return true;
 }
 
-void MockInputMethodEngine::KeyEventDone(input_method::KeyEventHandle* key_data,
-                                         bool handled) {
-}
-
 bool MockInputMethodEngine::DeleteSurroundingText(int context_id,
                                                   int offset,
                                                   size_t number_of_chars,
index 3dc6173..c22ac5d 100644 (file)
@@ -66,8 +66,6 @@ class MockInputMethodEngine : public InputMethodEngineInterface {
   virtual bool SetMenuItems(const std::vector<MenuItem>& items) OVERRIDE;
   virtual bool UpdateMenuItems(const std::vector<MenuItem>& items) OVERRIDE;
   virtual bool IsActive() const OVERRIDE;
-  virtual void KeyEventDone(input_method::KeyEventHandle* key_data,
-                            bool handled) OVERRIDE;
   virtual bool DeleteSurroundingText(int context_id,
                                      int offset,
                                      size_t number_of_chars,
index fa3e170..7af6d62 100644 (file)
@@ -97,11 +97,13 @@ void MockInputMethodManager::ActivateInputMethodMenuItem(
 }
 
 void MockInputMethodManager::AddInputMethodExtension(
+    Profile* profile,
     const std::string& id,
     InputMethodEngineInterface* instance) {
 }
 
-void MockInputMethodManager::RemoveInputMethodExtension(const std::string& id) {
+void MockInputMethodManager::RemoveInputMethodExtension(Profile* profile,
+                                                        const std::string& id) {
 }
 
 void MockInputMethodManager::GetInputMethodExtensions(
index 9319126..4bfd2c2 100644 (file)
@@ -47,9 +47,11 @@ class MockInputMethodManager : public InputMethodManager {
   virtual void ChangeInputMethod(const std::string& input_method_id) OVERRIDE;
   virtual void ActivateInputMethodMenuItem(const std::string& key) OVERRIDE;
   virtual void AddInputMethodExtension(
+      Profile* profile,
       const std::string& id,
       InputMethodEngineInterface* instance) OVERRIDE;
-  virtual void RemoveInputMethodExtension(const std::string& id) OVERRIDE;
+  virtual void RemoveInputMethodExtension(Profile* profile,
+                                          const std::string& id) OVERRIDE;
   virtual void GetInputMethodExtensions(
       InputMethodDescriptors* result) OVERRIDE;
   virtual void SetEnabledExtensionImes(std::vector<std::string>* ids) OVERRIDE;
index ac6546f..99cda7a 100644 (file)
 #include "chromeos/dbus/dbus_method_call_status.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/session_manager_client.h"
-#include "components/policy/core/common/cloud/enterprise_metrics.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 
 namespace chromeos {
 
-namespace {
-
-void UMA(int sample) {
-  UMA_HISTOGRAM_ENUMERATION(policy::kMetricEnrollment,
-                            sample,
-                            policy::kMetricEnrollmentSize);
-}
-
-}  // namespace
-
 EnrollmentScreen::EnrollmentScreen(
     ScreenObserver* observer,
     EnrollmentScreenActor* actor)
@@ -74,6 +63,7 @@ void EnrollmentScreen::Show() {
     actor_->ShowEnrollmentSpinnerScreen();
     actor_->FetchOAuthToken();
   } else {
+    UMA(policy::kMetricEnrollmentTriggered);
     actor_->ResetAuth(base::Bind(&EnrollmentScreen::ShowSigninScreen,
                                  weak_ptr_factory_.GetWeakPtr()));
   }
@@ -91,15 +81,18 @@ std::string EnrollmentScreen::GetName() const {
 void EnrollmentScreen::OnLoginDone(const std::string& user) {
   user_ = gaia::CanonicalizeEmail(user);
 
-  UMA(is_auto_enrollment() ? policy::kMetricEnrollmentAutoRetried
-                           : policy::kMetricEnrollmentStarted);
+  if (is_auto_enrollment())
+    UMA(policy::kMetricEnrollmentAutoRetried);
+  else if (enrollment_failed_once_)
+    UMA(policy::kMetricEnrollmentRetried);
+  else
+    UMA(policy::kMetricEnrollmentStarted);
 
   actor_->ShowEnrollmentSpinnerScreen();
   actor_->FetchOAuthToken();
 }
 
-void EnrollmentScreen::OnAuthError(
-    const GoogleServiceAuthError& error) {
+void EnrollmentScreen::OnAuthError(const GoogleServiceAuthError& error) {
   enrollment_failed_once_ = true;
   actor_->ShowAuthError(error);
 
@@ -145,7 +138,8 @@ void EnrollmentScreen::OnRetry() {
 }
 
 void EnrollmentScreen::OnCancel() {
-  if (enrollment_mode_ == EnrollmentScreenActor::ENROLLMENT_MODE_FORCED) {
+  if (enrollment_mode_ == EnrollmentScreenActor::ENROLLMENT_MODE_FORCED ||
+      enrollment_mode_ == EnrollmentScreenActor::ENROLLMENT_MODE_RECOVERY) {
     actor_->ResetAuth(
         base::Bind(&ScreenObserver::OnExit,
                    base::Unretained(get_screen_observer()),
@@ -303,7 +297,17 @@ void EnrollmentScreen::ReportEnrollmentStatus(
   UMAFailure(policy::kMetricEnrollmentOtherFailed);
 }
 
-void EnrollmentScreen::UMAFailure(int sample) {
+void EnrollmentScreen::UMA(policy::MetricEnrollment sample) {
+  if (enrollment_mode_ == EnrollmentScreenActor::ENROLLMENT_MODE_RECOVERY) {
+    UMA_HISTOGRAM_ENUMERATION(policy::kMetricEnrollmentRecovery, sample,
+                              policy::kMetricEnrollmentSize);
+  } else {
+    UMA_HISTOGRAM_ENUMERATION(policy::kMetricEnrollment, sample,
+                              policy::kMetricEnrollmentSize);
+  }
+}
+
+void EnrollmentScreen::UMAFailure(policy::MetricEnrollment sample) {
   if (is_auto_enrollment())
     sample = policy::kMetricEnrollmentAutoFailed;
   UMA(sample);
index f88384f..0002d88 100644 (file)
@@ -14,6 +14,7 @@
 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen_actor.h"
 #include "chrome/browser/chromeos/login/screens/wizard_screen.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
+#include "components/policy/core/common/cloud/enterprise_metrics.h"
 
 namespace chromeos {
 
@@ -69,10 +70,15 @@ class EnrollmentScreen
   // operations are completed.
   void ShowEnrollmentStatusOnSuccess(const policy::EnrollmentStatus& status);
 
-  // Logs a UMA event in the kMetricEnrollment histogram. If auto-enrollment is
-  // on |sample| is ignored and a kMetricEnrollmentAutoFailed sample is logged
+  // Logs an UMA event in the kMetricEnrollment or the kMetricEnrollmentRecovery
+  // histogram, depending on |enrollment_mode_|.
+  void UMA(policy::MetricEnrollment sample);
+
+  // Logs an UMA event in the kMetricEnrollment or the kMetricEnrollmentRecovery
+  // histogram, depending on |enrollment_mode_|.  If auto-enrollment is on,
+  // |sample| is ignored and a kMetricEnrollmentAutoFailed sample is logged
   // instead.
-  void UMAFailure(int sample);
+  void UMAFailure(policy::MetricEnrollment sample);
 
   // Shows the signin screen. Used as a callback to run after auth reset.
   void ShowSigninScreen();
index 84a4863..74f4ffe 100644 (file)
@@ -29,11 +29,14 @@ class EnrollmentScreenActor {
     UI_ERROR_FATAL,
   };
 
-  // Describes the enrollment mode.
+  // Describes the enrollment mode.  Must be kept in sync with
+  // |kEnrollmentModes| in enrollment_screen_handler.cc.
   enum EnrollmentMode {
-    ENROLLMENT_MODE_MANUAL,  // Manually triggered enrollment.
-    ENROLLMENT_MODE_FORCED,  // Forced enrollment, user can't skip.
-    ENROLLMENT_MODE_AUTO,    // Auto-enrollment during first sign-in.
+    ENROLLMENT_MODE_MANUAL,    // Manually triggered enrollment.
+    ENROLLMENT_MODE_FORCED,    // Forced enrollment, user can't skip.
+    ENROLLMENT_MODE_AUTO,      // Auto-enrollment during first sign-in.
+    ENROLLMENT_MODE_RECOVERY,  // Recover from "spontaneous unenrollment".
+    ENROLLMENT_MODE_COUNT      // Counter must be last. Not an enrollment mode.
   };
 
   // This defines the interface for controllers which will be called back when
index 48c32fe..592abbf 100644 (file)
@@ -52,6 +52,7 @@ void StartupUtils::RegisterPrefs(PrefRegistrySimple* registry) {
   registry->RegisterBooleanPref(prefs::kOobeComplete, false);
   registry->RegisterStringPref(prefs::kOobeScreenPending, "");
   registry->RegisterIntegerPref(prefs::kDeviceRegistered, -1);
+  registry->RegisterBooleanPref(prefs::kEnrollmentRecoveryRequired, false);
   registry->RegisterStringPref(prefs::kInitialLocale, "en-US");
 }
 
@@ -77,6 +78,9 @@ void StartupUtils::MarkOobeCompleted() {
   // side-effects.
   g_browser_process->local_state()->ClearPref(prefs::kOobeScreenPending);
   SaveBoolPreferenceForced(prefs::kOobeComplete, true);
+
+  // Successful enrollment implies that recovery is not required.
+  SaveBoolPreferenceForced(prefs::kEnrollmentRecoveryRequired, false);
 }
 
 void StartupUtils::SaveOobePendingScreen(const std::string& screen) {
@@ -154,6 +158,17 @@ void StartupUtils::MarkDeviceRegistered(const base::Closure& done_callback) {
 }
 
 // static
+bool StartupUtils::IsEnrollmentRecoveryRequired() {
+  return g_browser_process->local_state()
+      ->GetBoolean(prefs::kEnrollmentRecoveryRequired);
+}
+
+// static
+void StartupUtils::MarkEnrollmentRecoveryRequired() {
+  SaveBoolPreferenceForced(prefs::kEnrollmentRecoveryRequired, true);
+}
+
+// static
 std::string StartupUtils::GetInitialLocale() {
   std::string locale =
       g_browser_process->local_state()->GetString(prefs::kInitialLocale);
index f011117..027bb9c 100644 (file)
@@ -13,7 +13,7 @@ class PrefRegistrySimple;
 
 namespace chromeos {
 
-// Static utitliy methods used in startup time to get/change bits of device
+// Static utility methods used at startup time to get/change bits of device
 // state.
 class StartupUtils {
  public:
@@ -38,6 +38,12 @@ class StartupUtils {
   // Marks device registered. i.e. second part of OOBE is completed.
   static void MarkDeviceRegistered(const base::Closure& done_callback);
 
+  // Returns whether enrollment recovery is required.
+  static bool IsEnrollmentRecoveryRequired();
+
+  // Mark a device as requiring enrollment recovery.
+  static void MarkEnrollmentRecoveryRequired();
+
   // Returns initial locale from local settings.
   static std::string GetInitialLocale();
 
index 4df0338..9b6a891 100644 (file)
@@ -1192,11 +1192,12 @@ void ShowLoginWizard(const std::string& first_screen_name) {
 
   policy::BrowserPolicyConnectorChromeOS* connector =
       g_browser_process->platform_part()->browser_policy_connector_chromeos();
-  bool should_show_enrollment_screen =
-      first_screen_name.empty() && oobe_complete &&
-      chromeos::WizardController::ShouldAutoStartEnrollment() &&
-      !connector->IsEnterpriseManaged();
-  if (should_show_enrollment_screen) {
+  bool enrollment_screen_wanted =
+      chromeos::WizardController::ShouldRecoverEnrollment() ||
+      (chromeos::WizardController::ShouldAutoStartEnrollment() &&
+       oobe_complete &&
+       !connector->IsEnterpriseManaged());
+  if (enrollment_screen_wanted && first_screen_name.empty()) {
     // Shows networks screen instead of enrollment screen to resume the
     // interrupted auto start enrollment flow because enrollment screen does
     // not handle flaky network. See http://crbug.com/332572
index 147667a..94bad1c 100644 (file)
@@ -54,6 +54,7 @@
 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/chromeos/timezone/timezone_provider.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/options/options_util.h"
@@ -173,6 +174,7 @@ WizardController::WizardController(chromeos::LoginDisplayHost* host,
       oobe_display_(oobe_display),
       usage_statistics_reporting_(true),
       skip_update_enroll_after_eula_(false),
+      enrollment_recovery_(ShouldRecoverEnrollment()),
       login_screen_started_(false),
       user_image_screen_return_to_previous_hack_(false),
       timezone_resolved_(false),
@@ -446,13 +448,18 @@ void WizardController::ShowEnrollmentScreen() {
 
   EnrollmentScreenActor::EnrollmentMode mode =
       EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL;
-  if (is_auto_enrollment)
+  EnrollmentScreen* screen = GetEnrollmentScreen();
+  std::string enrollment_domain = GetForcedEnrollmentDomain();
+  if (is_auto_enrollment) {
     mode = EnrollmentScreenActor::ENROLLMENT_MODE_AUTO;
-  else if (ShouldAutoStartEnrollment() && !CanExitEnrollment())
+  } else if (enrollment_recovery_) {
+    mode = EnrollmentScreenActor::ENROLLMENT_MODE_RECOVERY;
+    enrollment_domain = GetEnrollmentRecoveryDomain();
+  } else if (ShouldAutoStartEnrollment() && !CanExitEnrollment()) {
     mode = EnrollmentScreenActor::ENROLLMENT_MODE_FORCED;
+  }
 
-  EnrollmentScreen* screen = GetEnrollmentScreen();
-  screen->SetParameters(mode, GetForcedEnrollmentDomain(), user);
+  screen->SetParameters(mode, enrollment_domain, user);
   SetCurrentScreen(screen);
 }
 
@@ -652,7 +659,7 @@ void WizardController::OnUserImageSkipped() {
 void WizardController::OnEnrollmentDone() {
   // Mark OOBE as completed only if enterprise enrollment was part of the
   // forced flow (i.e. app kiosk).
-  if (ShouldAutoStartEnrollment())
+  if (ShouldAutoStartEnrollment() || enrollment_recovery_)
     PerformOOBECompletedActions();
 
   // TODO(mnissler): Unify the logic for auto-login for Public Sessions and
@@ -697,7 +704,7 @@ void WizardController::OnAutoEnrollmentDone() {
 }
 
 void WizardController::OnOOBECompleted() {
-  if (ShouldAutoStartEnrollment()) {
+  if (ShouldAutoStartEnrollment() || enrollment_recovery_) {
     ShowEnrollmentScreen();
   } else {
     PerformOOBECompletedActions();
@@ -757,6 +764,9 @@ void WizardController::PerformOOBECompletedActions() {
       "HIDDetection.TimesDialogShownPerOOBECompleted",
       GetLocalState()->GetInteger(prefs::kTimesHIDDialogShown));
   GetLocalState()->ClearPref(prefs::kTimesHIDDialogShown);
+
+  if (enrollment_recovery_)
+    chrome::AttemptRestart();
 }
 
 void WizardController::SetCurrentScreen(WizardScreen* new_current) {
@@ -1012,6 +1022,21 @@ bool WizardController::ShouldAutoStartEnrollment() {
 }
 
 // static
+bool WizardController::ShouldRecoverEnrollment() {
+  policy::BrowserPolicyConnectorChromeOS* connector =
+      g_browser_process->platform_part()->browser_policy_connector_chromeos();
+  return connector->GetDeviceCloudPolicyManager()->ShouldRecoverEnrollment();
+}
+
+// static
+std::string WizardController::GetEnrollmentRecoveryDomain() {
+  policy::BrowserPolicyConnectorChromeOS* connector =
+      g_browser_process->platform_part()->browser_policy_connector_chromeos();
+  return
+      connector->GetDeviceCloudPolicyManager()->GetEnrollmentRecoveryDomain();
+}
+
+// static
 bool WizardController::CanExitEnrollment() {
   policy::BrowserPolicyConnectorChromeOS* connector =
       g_browser_process->platform_part()->browser_policy_connector_chromeos();
index ea5c83d..f230ab5 100644 (file)
@@ -94,6 +94,13 @@ class WizardController : public ScreenObserver {
   // Checks whether OOBE should start enrollment automatically.
   static bool ShouldAutoStartEnrollment();
 
+  // Checks whether OOBE should recover enrollment.  Note that this flips to
+  // false once device policy has been restored as a part of recovery.
+  static bool ShouldRecoverEnrollment();
+
+  // Obtains domain the device used to be enrolled to from install attributes.
+  static std::string GetEnrollmentRecoveryDomain();
+
   // Shows the first screen defined by |first_screen_name| or by default
   // if the parameter is empty. Takes ownership of |screen_parameters|.
   void Init(const std::string& first_screen_name,
@@ -353,6 +360,10 @@ class WizardController : public ScreenObserver {
   // EULA is accepted.
   bool skip_update_enroll_after_eula_;
 
+  // Whether enrollment will be or has been recovered in the current wizard
+  // instance.
+  bool enrollment_recovery_;
+
   // Time when the EULA was accepted. Used to measure the duration from the EULA
   // acceptance until the Sign-In screen is displayed.
   base::Time time_eula_accepted_;
index cae7f93..f707f8a 100644 (file)
@@ -75,10 +75,14 @@ class ErrorScreenStrategy : public PortalDetectorStrategy {
 class SessionStrategy : public PortalDetectorStrategy {
  public:
   static const int kFastDelayBetweenAttemptsSec = 1;
-  static const int kMaxFastAttempts = 3;
   static const int kFastAttemptTimeoutSec = 3;
+  static const int kMaxFastAttempts = 3;
 
-  static const int kSlowDelayBetweenAttemptsSec = 10;
+  static const int kNormalDelayBetweenAttemptsSec = 10;
+  static const int kNormalAttemptTimeoutSec = 5;
+  static const int kMaxNormalAttempts = 3;
+
+  static const int kSlowDelayBetweenAttemptsSec = 2 * 60;
   static const int kSlowAttemptTimeoutSec = 5;
 
   SessionStrategy() {}
@@ -90,22 +94,34 @@ class SessionStrategy : public PortalDetectorStrategy {
   virtual bool CanPerformAttemptAfterDetectionImpl() OVERRIDE { return true; }
   virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE {
     int delay;
-    if (delegate_->AttemptCount() < kMaxFastAttempts)
+    if (IsFastAttempt())
       delay = kFastDelayBetweenAttemptsSec;
+    else if (IsNormalAttempt())
+      delay = kNormalDelayBetweenAttemptsSec;
     else
       delay = kSlowDelayBetweenAttemptsSec;
     return AdjustDelay(base::TimeDelta::FromSeconds(delay));
   }
   virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE {
     int timeout;
-    if (delegate_->AttemptCount() < kMaxFastAttempts)
+    if (IsFastAttempt())
       timeout = kFastAttemptTimeoutSec;
+    else if (IsNormalAttempt())
+      timeout = kNormalAttemptTimeoutSec;
     else
       timeout = kSlowAttemptTimeoutSec;
     return base::TimeDelta::FromSeconds(timeout);
   }
 
  private:
+  bool IsFastAttempt() {
+    return delegate_->AttemptCount() < kMaxFastAttempts;
+  }
+
+  bool IsNormalAttempt() {
+    return delegate_->AttemptCount() < kMaxFastAttempts + kMaxNormalAttempts;
+  }
+
   DISALLOW_COPY_AND_ASSIGN(SessionStrategy);
 };
 
index cf08b95..0fc5bf9 100644 (file)
@@ -13,6 +13,7 @@
 #include "chrome/browser/chromeos/ownership/owner_settings_service_factory.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_source.h"
@@ -126,6 +127,11 @@ OwnerSettingsService::OwnerSettingsService(Profile* profile)
     TPMTokenLoader::Get()->AddObserver(this);
   }
 
+  if (DBusThreadManager::IsInitialized() &&
+      DBusThreadManager::Get()->GetSessionManagerClient()) {
+    DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this);
+  }
+
   registrar_.Add(this,
                  chrome::NOTIFICATION_PROFILE_CREATED,
                  content::Source<Profile>(profile_));
@@ -135,6 +141,11 @@ OwnerSettingsService::~OwnerSettingsService() {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (TPMTokenLoader::IsInitialized())
     TPMTokenLoader::Get()->RemoveObserver(this);
+
+  if (DBusThreadManager::IsInitialized() &&
+      DBusThreadManager::Get()->GetSessionManagerClient()) {
+    DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this);
+  }
 }
 
 bool OwnerSettingsService::IsOwner() {
@@ -196,6 +207,12 @@ void OwnerSettingsService::OnTPMTokenReady() {
   ReloadPrivateKey();
 }
 
+void OwnerSettingsService::OwnerKeySet(bool success) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (success)
+    ReloadPrivateKey();
+}
+
 // static
 void OwnerSettingsService::IsPrivateKeyExistAsync(
     const IsOwnerCallback& callback) {
@@ -264,7 +281,7 @@ void OwnerSettingsService::OnPrivateKeyLoaded(
 
   std::vector<IsOwnerCallback> is_owner_callbacks;
   is_owner_callbacks.swap(pending_is_owner_callbacks_);
-  const bool is_owner = private_key_.get() && private_key_->key();
+  const bool is_owner = IsOwner();
   for (std::vector<IsOwnerCallback>::iterator it(is_owner_callbacks.begin());
        it != is_owner_callbacks.end();
        ++it) {
index 23f64dd..1fd32a7 100644 (file)
@@ -13,6 +13,7 @@
 #include "base/threading/thread_checker.h"
 #include "chrome/browser/chromeos/settings/device_settings_service.h"
 #include "chrome/browser/chromeos/settings/owner_key_util.h"
+#include "chromeos/dbus/session_manager_client.h"
 #include "chromeos/tpm_token_loader.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "content/public/browser/notification_observer.h"
@@ -29,7 +30,8 @@ namespace chromeos {
 class OwnerSettingsService : public DeviceSettingsService::PrivateKeyDelegate,
                              public KeyedService,
                              public content::NotificationObserver,
-                             public TPMTokenLoader::Observer {
+                             public TPMTokenLoader::Observer,
+                             public SessionManagerClient::Observer {
  public:
   virtual ~OwnerSettingsService();
 
@@ -52,6 +54,9 @@ class OwnerSettingsService : public DeviceSettingsService::PrivateKeyDelegate,
   // TPMTokenLoader::Observer:
   virtual void OnTPMTokenReady() OVERRIDE;
 
+  // SessionManagerClient::Observer:
+  virtual void OwnerKeySet(bool success) OVERRIDE;
+
   // Checks whether NSS slots with private key are mounted or
   // not. Responds via |callback|.
   static void IsPrivateKeyExistAsync(const IsOwnerCallback& callback);
index efc50b8..51f55d6 100644 (file)
@@ -226,6 +226,22 @@ bool DeviceCloudPolicyManagerChromeOS::ShouldAutoStartEnrollment() const {
   return GetMachineFlag(chromeos::system::kOemIsEnterpriseManagedKey, false);
 }
 
+bool DeviceCloudPolicyManagerChromeOS::ShouldRecoverEnrollment() const {
+  if (install_attributes_->IsEnterpriseDevice() &&
+      chromeos::StartupUtils::IsEnrollmentRecoveryRequired()) {
+    LOG(WARNING) << "Enrollment recovery required according to pref.";
+    if (!DeviceCloudPolicyManagerChromeOS::GetMachineID().empty())
+      return true;
+    LOG(WARNING) << "Postponing recovery because machine id is missing.";
+  }
+  return false;
+}
+
+std::string
+DeviceCloudPolicyManagerChromeOS::GetEnrollmentRecoveryDomain() const {
+  return install_attributes_->GetDomain();
+}
+
 bool DeviceCloudPolicyManagerChromeOS::CanExitEnrollment() const {
   if (GetRestoreMode() == kDeviceStateRestoreModeReEnrollmentEnforced)
     return false;
@@ -326,6 +342,7 @@ void DeviceCloudPolicyManagerChromeOS::StartIfManaged() {
       local_state_ &&
       store()->is_initialized() &&
       store()->has_policy() &&
+      !device_store_->policy()->request_token().empty() &&
       !state_keys_broker_->pending() &&
       !enrollment_handler_ &&
       !service()) {
index 0520567..76f4d25 100644 (file)
@@ -83,6 +83,12 @@ class DeviceCloudPolicyManagerChromeOS : public CloudPolicyManager {
   // Checks whether enterprise enrollment should be a regular step during OOBE.
   bool ShouldAutoStartEnrollment() const;
 
+  // Checks whether enterprise enrollment recovery is required.
+  bool ShouldRecoverEnrollment() const;
+
+  // Looks up the domain from |install_attributes_|.
+  std::string GetEnrollmentRecoveryDomain() const;
+
   // Checks whether the user can cancel enrollment.
   bool CanExitEnrollment() const;
 
index 3ec816a..2136a10 100644 (file)
@@ -8,6 +8,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram.h"
 #include "base/sequenced_task_runner.h"
+#include "chrome/browser/chromeos/login/startup_utils.h"
 #include "chrome/browser/chromeos/policy/device_policy_decoder_chromeos.h"
 #include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
@@ -25,7 +26,7 @@ DeviceCloudPolicyStoreChromeOS::DeviceCloudPolicyStoreChromeOS(
     : device_settings_service_(device_settings_service),
       install_attributes_(install_attributes),
       background_task_runner_(background_task_runner),
-      uma_done_(false),
+      enrollment_validation_done_(false),
       weak_factory_(this) {
   device_settings_service_->AddObserver(this);
 }
@@ -137,24 +138,47 @@ void DeviceCloudPolicyStoreChromeOS::UpdateFromService() {
     return;
   }
 
-  // Fill UMA histogram once per session.  Skip temp validation error because it
-  // is not a definitive result (policy load will be retried).
+  // Once per session, validate internal consistency of enrollment state (DM
+  // token must be present on enrolled devices) and in case of failure set flag
+  // to indicate that recovery is required.
   const chromeos::DeviceSettingsService::Status status =
       device_settings_service_->status();
-  if (!uma_done_ &&
-      status != chromeos::DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR) {
-    uma_done_ = true;
-    const bool has_dm_token =
-        status == chromeos::DeviceSettingsService::STORE_SUCCESS &&
-        device_settings_service_->policy_data() &&
-        device_settings_service_->policy_data()->has_request_token();
-    UMA_HISTOGRAM_BOOLEAN("Enterprise.EnrolledPolicyHasDMToken", has_dm_token);
-    LOG_IF(ERROR, !has_dm_token)
-        << "Policy read on enrolled device yields no DM token! "
-        << "Status: " << status << ".";
+  switch (status) {
+    case chromeos::DeviceSettingsService::STORE_SUCCESS:
+    case chromeos::DeviceSettingsService::STORE_KEY_UNAVAILABLE:
+    case chromeos::DeviceSettingsService::STORE_NO_POLICY:
+    case chromeos::DeviceSettingsService::STORE_INVALID_POLICY:
+    case chromeos::DeviceSettingsService::STORE_VALIDATION_ERROR: {
+      if (!enrollment_validation_done_) {
+        enrollment_validation_done_ = true;
+        const bool has_dm_token =
+            status == chromeos::DeviceSettingsService::STORE_SUCCESS &&
+            device_settings_service_->policy_data() &&
+            device_settings_service_->policy_data()->has_request_token();
+
+        // At the time LoginDisplayHostImpl decides whether enrollment flow is
+        // to be started, policy hasn't been read yet.  To work around this,
+        // once the need for recovery is detected upon policy load, a flag is
+        // stored in prefs which is accessed by LoginDisplayHostImpl early
+        // during (next) boot.
+        if (!has_dm_token) {
+          LOG(ERROR) << "Device policy read on enrolled device yields "
+                     << "no DM token! Status: " << status << ".";
+          chromeos::StartupUtils::MarkEnrollmentRecoveryRequired();
+        }
+        UMA_HISTOGRAM_BOOLEAN("Enterprise.EnrolledPolicyHasDMToken",
+                              has_dm_token);
+      }
+      break;
+    }
+    case chromeos::DeviceSettingsService::STORE_POLICY_ERROR:
+    case chromeos::DeviceSettingsService::STORE_OPERATION_FAILED:
+    case chromeos::DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR:
+      // Do nothing for write errors or transient read errors.
+      break;
   }
 
-  switch (device_settings_service_->status()) {
+  switch (status) {
     case chromeos::DeviceSettingsService::STORE_SUCCESS: {
       status_ = STATUS_OK;
       policy_.reset(new em::PolicyData());
index 831d164..dea0277 100644 (file)
@@ -76,8 +76,8 @@ class DeviceCloudPolicyStoreChromeOS
 
   scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
 
-  // Ensure that UMA stats are only reported once per browser start.
-  bool uma_done_;
+  // Whether enterprise enrollment validation has yet been done.
+  bool enrollment_validation_done_;
 
   base::WeakPtrFactory<DeviceCloudPolicyStoreChromeOS> weak_factory_;
 
index 41497ee..6550baf 100644 (file)
@@ -14,6 +14,8 @@
 #include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
+#include "chrome/test/base/scoped_testing_local_state.h"
+#include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/cryptohome/cryptohome_util.h"
 #include "chromeos/dbus/fake_cryptohome_client.h"
 #include "policy/policy_constants.h"
@@ -36,7 +38,8 @@ class DeviceCloudPolicyStoreChromeOSTest
     : public chromeos::DeviceSettingsTestBase {
  protected:
   DeviceCloudPolicyStoreChromeOSTest()
-      : fake_cryptohome_client_(new chromeos::FakeCryptohomeClient()),
+      : local_state_(TestingBrowserProcess::GetGlobal()),
+        fake_cryptohome_client_(new chromeos::FakeCryptohomeClient()),
         install_attributes_(
             new EnterpriseInstallAttributes(fake_cryptohome_client_.get())),
         store_(new DeviceCloudPolicyStoreChromeOS(
@@ -108,6 +111,7 @@ class DeviceCloudPolicyStoreChromeOSTest
                                            base::MessageLoopProxy::current()));
   }
 
+  ScopedTestingLocalState local_state_;
   scoped_ptr<chromeos::FakeCryptohomeClient> fake_cryptohome_client_;
   scoped_ptr<EnterpriseInstallAttributes> install_attributes_;
 
index f7f8271..9c7eff7 100644 (file)
@@ -187,7 +187,9 @@ bool DeviceSettingsService::HasPrivateOwnerKey() {
 void DeviceSettingsService::InitOwner(
     const std::string& username,
     const base::WeakPtr<PrivateKeyDelegate>& delegate) {
-  if (!username_.empty())
+  // When InitOwner() is called twice with the same |username| it's
+  // worth to reload settings since owner key may become available.
+  if (!username_.empty() && username_ != username)
     return;
   username_ = username;
   delegate_ = delegate;
index 94ae2b3..e479c08 100644 (file)
@@ -603,8 +603,6 @@ bool CrxUpdateService::CheckForUpdates() {
             << ", time_since_last_checked="
             << time_since_last_checked.InSeconds() << " seconds";
 
-    ChangeItemState(item, CrxUpdateItem::kChecking);
-
     item->last_check = now;
     item->crx_urls.clear();
     item->crx_diffurls.clear();
@@ -622,6 +620,8 @@ bool CrxUpdateService::CheckForUpdates() {
     item->download_metrics.clear();
 
     items_to_check.push_back(item);
+
+    ChangeItemState(item, CrxUpdateItem::kChecking);
   }
 
   if (items_to_check.empty())
@@ -928,14 +928,14 @@ void CrxUpdateService::DoneInstalling(const std::string& component_id,
   }
 
   if (is_success) {
-    ChangeItemState(item, CrxUpdateItem::kUpdated);
     item->component.version = item->next_version;
     item->component.fingerprint = item->next_fp;
+    ChangeItemState(item, CrxUpdateItem::kUpdated);
   } else {
-    ChangeItemState(item, CrxUpdateItem::kNoUpdate);
     item->error_category = error_category;
     item->error_code = error;
     item->extra_code1 = extra_code;
+    ChangeItemState(item, CrxUpdateItem::kNoUpdate);
   }
 
   ping_manager_->OnUpdateComplete(item);
@@ -1006,17 +1006,23 @@ ComponentUpdateService::Status CrxUpdateService::OnDemandUpdateInternal(
   if (!uit)
     return kError;
 
-  Status service_status = GetServiceStatus(uit->status);
-  // If the item is already in the process of being updated, there is
-  // no point in this call, so return kInProgress.
-  if (service_status == kInProgress)
-    return service_status;
-
-  // Otherwise the item was already checked a while back (or it is new),
-  // set its status to kNew to give it a slightly higher priority.
-  ChangeItemState(uit, CrxUpdateItem::kNew);
   uit->on_demand = true;
 
+  // If there is an update available for this item, then continue processing
+  // the update. This is an artifact of how update checks are done: in addition
+  // to the on-demand item, the update check may include other items as well.
+  if (uit->status != CrxUpdateItem::kCanUpdate) {
+    Status service_status = GetServiceStatus(uit->status);
+    // If the item is already in the process of being updated, there is
+    // no point in this call, so return kInProgress.
+    if (service_status == kInProgress)
+      return service_status;
+
+    // Otherwise the item was already checked a while back (or it is new),
+    // set its status to kNew to give it a slightly higher priority.
+    ChangeItemState(uit, CrxUpdateItem::kNew);
+  }
+
   // In case the current delay is long, set the timer to a shorter value
   // to get the ball rolling.
   if (timer_.IsRunning()) {
index a2983c1..48cd770 100644 (file)
@@ -154,17 +154,20 @@ void DefaultComponentInstaller::StartRegistration(ComponentUpdateService* cus) {
   }
 
   if (found) {
-    current_version_ = latest_version;
-    // TODO(ddorwin): Remove these members and pass them directly to
-    // FinishRegistration().
-    base::ReadFileToString(latest_dir.AppendASCII("manifest.fingerprint"),
-                           &current_fingerprint_);
     current_manifest_ = ReadManifest(latest_dir);
-    if (!current_manifest_) {
+    if (current_manifest_) {
+      current_version_ = latest_version;
+      // TODO(ddorwin): Remove these members and pass them directly to
+      // FinishRegistration().
+      base::ReadFileToString(latest_dir.AppendASCII("manifest.fingerprint"),
+                             &current_fingerprint_);
+    } else {
+      // If the manifest can't be read, mark the directory for deletion and
+      // continue as if there were no versioned directories at all.
       DLOG(ERROR) << "Failed to read manifest for "
                   << installer_traits_->GetName() << " ("
                   << base_dir.MaybeAsASCII() << ").";
-      return;
+      older_dirs.push_back(latest_dir);
     }
   }
 
index 1445247..5dbd3b1 100644 (file)
@@ -222,7 +222,10 @@ void RegisterWidevineCdmWithChrome(const base::Version& cdm_version,
   // true = Add to beginning of list to override any existing registrations.
   PluginService::GetInstance()->RegisterInternalPlugin(
       plugin_info.ToWebPluginInfo(), true);
+  // Tell the browser to refresh the plugin list. Then tell all renderers to
+  // update their plugin list caches.
   PluginService::GetInstance()->RefreshPlugins();
+  PluginService::GetInstance()->PurgePluginListCache(NULL, false);
 }
 
 }  // namespace
index 310a035..c8f6f8d 100644 (file)
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/site_instance.h"
 
-ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate()
-    : devtools_callback_(base::Bind(
-          &ChromeDevToolsManagerDelegate::OnDevToolsStateChanged,
-          base::Unretained(this))),
-      devtools_callback_registered_(false) {
-  // This constructor is invoked from DevToolsManagerImpl constructor, so it
-  // shouldn't call DevToolsManager::GetInstance()
+ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate() {
 }
 
 ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() {
-  // This destructor is invoked from DevToolsManagerImpl destructor, so it
-  // shouldn't call DevToolsManager::GetInstance()
-}
-
-void ChromeDevToolsManagerDelegate::EnsureDevtoolsCallbackRegistered() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  if (!devtools_callback_registered_) {
-    content::DevToolsManager::GetInstance()->AddAgentStateCallback(
-        devtools_callback_);
-    devtools_callback_registered_ = true;
-  }
 }
 
 void ChromeDevToolsManagerDelegate::Inspect(
@@ -111,7 +94,6 @@ ChromeDevToolsManagerDelegate::EmulateNetworkConditions(
   if (upload_throughput < 0.0)
     upload_throughput = 0.0;
 
-  EnsureDevtoolsCallbackRegistered();
   scoped_ptr<DevToolsNetworkConditions> conditions(
       new DevToolsNetworkConditions(
           offline, latency, download_throughput, upload_throughput));
@@ -130,7 +112,7 @@ void ChromeDevToolsManagerDelegate::UpdateNetworkState(
       agent_host->GetId(), conditions.Pass());
 }
 
-void ChromeDevToolsManagerDelegate::OnDevToolsStateChanged(
+void ChromeDevToolsManagerDelegate::DevToolsAgentStateChanged(
     content::DevToolsAgentHost* agent_host,
     bool attached) {
   scoped_ptr<DevToolsNetworkConditions> conditions;
index a0c16c9..aa8b857 100644 (file)
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_DEVTOOLS_CHROME_DEVTOOLS_MANAGER_DELEGATE_H_
 #define CHROME_BROWSER_DEVTOOLS_CHROME_DEVTOOLS_MANAGER_DELEGATE_H_
 
-#include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/scoped_ptr.h"
@@ -23,15 +22,13 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
   // content::DevToolsManagerDelegate overrides:
   virtual void Inspect(content::BrowserContext* browser_context,
                        content::DevToolsAgentHost* agent_host) OVERRIDE;
+  virtual void DevToolsAgentStateChanged(content::DevToolsAgentHost* agent_host,
+                                         bool attached) OVERRIDE;
   virtual base::DictionaryValue* HandleCommand(
       content::DevToolsAgentHost* agent_host,
       base::DictionaryValue* command_dict) OVERRIDE;
 
  private:
-  base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_;
-  bool devtools_callback_registered_;
-  void EnsureDevtoolsCallbackRegistered();
-
   Profile* GetProfile(content::DevToolsAgentHost* agent_host);
 
   scoped_ptr<DevToolsProtocol::Response> EmulateNetworkConditions(
@@ -42,9 +39,6 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
       content::DevToolsAgentHost* agent_host,
       scoped_ptr<DevToolsNetworkConditions> conditions);
 
-  void OnDevToolsStateChanged(content::DevToolsAgentHost* agent_host,
-                              bool attached);
-
   DISALLOW_COPY_AND_ASSIGN(ChromeDevToolsManagerDelegate);
 };
 
index eb32924..cfcd923 100644 (file)
@@ -87,11 +87,12 @@ RenderViewHostTarget::RenderViewHostTarget(RenderViewHost* rvh, bool is_tab)
   set_last_activity_time(web_contents->GetLastActiveTime());
 
   GuestViewBase* guest = GuestViewBase::FromWebContents(web_contents);
-  if (guest) {
+  WebContents* guest_contents = guest ? guest->embedder_web_contents() : NULL;
+  RenderViewHost* guest_parent_rvh =
+      guest_contents ? guest_contents->GetRenderViewHost() : NULL;
+  if (guest_parent_rvh) {
     set_type(kTargetTypeWebView);
-    RenderViewHost* parent_rvh =
-        guest->embedder_web_contents()->GetRenderViewHost();
-    set_parent_id(DevToolsAgentHost::GetOrCreateFor(parent_rvh)->GetId());
+    set_parent_id(DevToolsAgentHost::GetOrCreateFor(guest_parent_rvh)->GetId());
     return;
   }
 
index 2a8d6c6..8e81539 100644 (file)
@@ -184,29 +184,6 @@ std::string GetMimeType(const base::FilePath& path) {
   return mime_type;
 }
 
-bool IsOpenInBrowserPreferreredForFile(const base::FilePath& path) {
-  // On Android, always prefer opening with an external app. On ChromeOS, there
-  // are no external apps so just allow all opens to be handled by the "System."
-#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && defined(ENABLE_PLUGINS)
-  // TODO(asanka): Consider other file types and MIME types.
-  // http://crbug.com/323561
-  if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".htm")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".html")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".shtm")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".shtml")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".svg")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".xht")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".xhtm")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".xhtml")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".xsl")) ||
-      path.MatchesExtension(FILE_PATH_LITERAL(".xslt"))) {
-    return true;
-  }
-#endif
-  return false;
-}
-
 }  // namespace
 
 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile)
@@ -722,3 +699,35 @@ void ChromeDownloadManagerDelegate::OnDownloadTargetDetermined(
                target_info->danger_type,
                target_info->intermediate_path);
 }
+
+bool ChromeDownloadManagerDelegate::IsOpenInBrowserPreferreredForFile(
+    const base::FilePath& path) {
+  // On Windows, PDFs should open in Acrobat Reader if the user chooses.
+#if defined(OS_WIN)
+  if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf")) &&
+      DownloadTargetDeterminer::IsAdobeReaderUpToDate()) {
+    return !download_prefs_->ShouldOpenPdfInAdobeReader();
+  }
+#endif
+
+  // On Android, always prefer opening with an external app. On ChromeOS, there
+  // are no external apps so just allow all opens to be handled by the "System."
+#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && defined(ENABLE_PLUGINS)
+  // TODO(asanka): Consider other file types and MIME types.
+  // http://crbug.com/323561
+  if (path.MatchesExtension(FILE_PATH_LITERAL(".pdf")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".htm")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".html")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".shtm")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".shtml")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".svg")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".xht")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".xhtm")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".xhtml")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".xsl")) ||
+      path.MatchesExtension(FILE_PATH_LITERAL(".xslt"))) {
+    return true;
+  }
+#endif
+  return false;
+}
index 7cf2c45..ff89300 100644 (file)
@@ -170,6 +170,9 @@ class ChromeDownloadManagerDelegate
       const content::DownloadTargetCallback& callback,
       scoped_ptr<DownloadTargetInfo> target_info);
 
+  // Returns true if |path| should open in the browser.
+  bool IsOpenInBrowserPreferreredForFile(const base::FilePath& path);
+
   Profile* profile_;
   uint32 next_download_id_;
   IdCallbackVector id_callbacks_;
index 750e11b..99abc2c 100644 (file)
@@ -22,6 +22,7 @@
 #include "chrome/browser/download/download_extensions.h"
 #include "chrome/browser/download/download_service.h"
 #include "chrome/browser/download/download_service_factory.h"
+#include "chrome/browser/download/download_target_determiner.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/browser/chromeos/file_manager/path_util.h"
 #endif
 
+#if defined(OS_WIN)
+#include "chrome/browser/ui/pdf/adobe_reader_info_win.h"
+#endif
+
 using content::BrowserContext;
 using content::BrowserThread;
 using content::DownloadManager;
@@ -91,7 +96,7 @@ class DefaultDownloadDirectory {
   DISALLOW_COPY_AND_ASSIGN(DefaultDownloadDirectory);
 };
 
-static base::LazyInstance<DefaultDownloadDirectory>
+base::LazyInstance<DefaultDownloadDirectory>
     g_default_download_directory = LAZY_INSTANCE_INITIALIZER;
 
 }  // namespace
@@ -126,6 +131,11 @@ DownloadPrefs::DownloadPrefs(Profile* profile) : profile_(profile) {
                  GetDefaultDownloadDirectoryForProfile()));
 #endif  // defined(OS_CHROMEOS)
 
+#if defined(OS_WIN)
+  should_open_pdf_in_adobe_reader_ =
+      prefs->GetBoolean(prefs::kOpenPdfDownloadInAdobeReader);
+#endif
+
   // If the download path is dangerous we forcefully reset it. But if we do
   // so we set a flag to make sure we only do it once, to avoid fighting
   // the user if he really wants it on an unsafe place such as the desktop.
@@ -194,6 +204,12 @@ void DownloadPrefs::RegisterProfilePrefs(
       prefs::kSaveFileDefaultDirectory,
       default_download_path,
       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+#if defined(OS_WIN)
+  registry->RegisterBooleanPref(
+      prefs::kOpenPdfDownloadInAdobeReader,
+      false,
+      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+#endif
 }
 
 base::FilePath DownloadPrefs::GetDefaultDownloadDirectoryForProfile() const {
@@ -268,6 +284,10 @@ bool DownloadPrefs::IsDownloadPathManaged() const {
 }
 
 bool DownloadPrefs::IsAutoOpenUsed() const {
+#if defined(OS_WIN)
+  if (ShouldOpenPdfInAdobeReader())
+    return true;
+#endif
   return !auto_open_.empty();
 }
 
@@ -278,6 +298,12 @@ bool DownloadPrefs::IsAutoOpenEnabledBasedOnExtension(
     return false;
   DCHECK(extension[0] == base::FilePath::kExtensionSeparator);
   extension.erase(0, 1);
+#if defined(OS_WIN)
+  if (extension == FILE_PATH_LITERAL("pdf") &&
+      DownloadTargetDeterminer::IsAdobeReaderUpToDate() &&
+      ShouldOpenPdfInAdobeReader())
+    return true;
+#endif
   return auto_open_.find(extension) != auto_open_.end();
 }
 
@@ -305,7 +331,24 @@ void DownloadPrefs::DisableAutoOpenBasedOnExtension(
   SaveAutoOpenState();
 }
 
+#if defined(OS_WIN)
+void DownloadPrefs::SetShouldOpenPdfInAdobeReader(bool should_open) {
+  if (should_open_pdf_in_adobe_reader_ == should_open)
+    return;
+  should_open_pdf_in_adobe_reader_ = should_open;
+  profile_->GetPrefs()->SetBoolean(prefs::kOpenPdfDownloadInAdobeReader,
+                                   should_open);
+}
+
+bool DownloadPrefs::ShouldOpenPdfInAdobeReader() const {
+  return should_open_pdf_in_adobe_reader_;
+}
+#endif
+
 void DownloadPrefs::ResetAutoOpen() {
+#if defined(OS_WIN)
+  SetShouldOpenPdfInAdobeReader(false);
+#endif
   auto_open_.clear();
   SaveAutoOpenState();
 }
index eca19d3..8d3db57 100644 (file)
@@ -73,6 +73,15 @@ class DownloadPrefs {
   // Disables auto-open based on file extension.
   void DisableAutoOpenBasedOnExtension(const base::FilePath& file_name);
 
+#if defined(OS_WIN)
+  // Store the user preference to disk. If |should_open| is true, also disable
+  // the built-in PDF plugin. If |should_open| is false, enable the PDF plugin.
+  void SetShouldOpenPdfInAdobeReader(bool should_open);
+
+  // Return whether the user prefers to open PDF downloads in Adobe Reader.
+  bool ShouldOpenPdfInAdobeReader() const;
+#endif
+
   void ResetAutoOpen();
 
  private:
@@ -94,6 +103,10 @@ class DownloadPrefs {
                    AutoOpenCompareFunctor> AutoOpenSet;
   AutoOpenSet auto_open_;
 
+#if defined(OS_WIN)
+  bool should_open_pdf_in_adobe_reader_;
+#endif
+
   DISALLOW_COPY_AND_ASSIGN(DownloadPrefs);
 };
 
index b7f0858..55704c9 100644 (file)
@@ -9,6 +9,7 @@
 #include "chrome/browser/download/download_crx_util.h"
 #include "chrome/browser/download/download_item_model.h"
 #include "chrome/browser/download/download_prefs.h"
+#include "chrome/browser/download/download_target_determiner.h"
 #include "chrome/browser/safe_browsing/download_protection_service.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/common/url_constants.h"
 #include "grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 
+#if defined(OS_WIN)
+#include "chrome/browser/ui/pdf/adobe_reader_info_win.h"
+#endif
+
 using content::DownloadItem;
-using extensions::Extension;
 
 namespace {
 
 // Returns true if downloads resumption is enabled.
 bool IsDownloadResumptionEnabled() {
-  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
-  return command_line.HasSwitch(switches::kEnableDownloadResumption);
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      switches::kEnableDownloadResumption);
 }
 
 }  // namespace
@@ -44,6 +48,14 @@ DownloadShelfContextMenu::DownloadShelfContextMenu(
       navigator_(navigator) {
   DCHECK(download_item_);
   download_item_->AddObserver(this);
+
+#if defined(OS_WIN)
+  is_pdf_reader_up_to_date_ = false;
+  if (IsDownloadPdf() && IsAdobeReaderDefaultPDFViewer()) {
+    is_pdf_reader_up_to_date_ =
+        DownloadTargetDeterminer::IsAdobeReaderUpToDate();
+  }
+#endif  // defined(OS_WIN)
 }
 
 ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() {
@@ -97,6 +109,7 @@ bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const {
     case LEARN_MORE_INTERRUPTED:
       return true;
   }
+  NOTREACHED();
   return false;
 }
 
@@ -109,6 +122,13 @@ bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const {
       return download_item_->GetOpenWhenComplete() ||
           download_crx_util::IsExtensionDownload(*download_item_);
     case ALWAYS_OPEN_TYPE:
+#if defined(OS_WIN)
+      if (CanOpenPdfInReader()) {
+        DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(
+            download_item_->GetBrowserContext());
+        return prefs->ShouldOpenPdfInAdobeReader();
+      }
+#endif
       return download_item_->ShouldOpenFileBasedOnExtension();
     case TOGGLE_PAUSE:
       return download_item_->IsPaused();
@@ -116,6 +136,16 @@ bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const {
   return false;
 }
 
+bool DownloadShelfContextMenu::IsCommandIdVisible(int command_id) const {
+  if (!download_item_)
+    return false;
+
+  if (command_id == PLATFORM_OPEN)
+    return (DownloadItemModel(download_item_).ShouldPreferOpeningInBrowser());
+
+  return true;
+}
+
 void DownloadShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
   if (!download_item_)
     return;
@@ -128,13 +158,22 @@ void DownloadShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
       download_item_->OpenDownload();
       break;
     case ALWAYS_OPEN_TYPE: {
+      bool is_checked = IsCommandIdChecked(ALWAYS_OPEN_TYPE);
       DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(
           download_item_->GetBrowserContext());
+#if defined(OS_WIN)
+      if (CanOpenPdfInReader()) {
+        prefs->SetShouldOpenPdfInAdobeReader(!is_checked);
+        DownloadItemModel(download_item_).SetShouldPreferOpeningInBrowser(
+            is_checked);
+        break;
+      }
+#endif
       base::FilePath path = download_item_->GetTargetFilePath();
-      if (!IsCommandIdChecked(ALWAYS_OPEN_TYPE))
-        prefs->EnableAutoOpenBasedOnExtension(path);
-      else
+      if (is_checked)
         prefs->DisableAutoOpenBasedOnExtension(path);
+      else
+        prefs->EnableAutoOpenBasedOnExtension(path);
       break;
     }
     case PLATFORM_OPEN:
@@ -203,7 +242,7 @@ base::string16 DownloadShelfContextMenu::GetLabelForCommandId(
         return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
       return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN);
     case ALWAYS_OPEN_TYPE:
-      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
+      return l10n_util::GetStringUTF16(GetAlwaysOpenStringId());
     case PLATFORM_OPEN:
       return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PLATFORM_OPEN);
     case CANCEL:
@@ -250,7 +289,7 @@ ui::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() {
   in_progress_download_menu_model_->AddCheckItemWithStringId(
       OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
   in_progress_download_menu_model_->AddCheckItemWithStringId(
-      ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
+      ALWAYS_OPEN_TYPE, GetAlwaysOpenStringId());
   in_progress_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
   in_progress_download_menu_model_->AddItemWithStringId(
       TOGGLE_PAUSE, IDS_DOWNLOAD_MENU_PAUSE_ITEM);
@@ -272,10 +311,9 @@ ui::SimpleMenuModel* DownloadShelfContextMenu::GetFinishedMenuModel() {
   finished_download_menu_model_->AddItemWithStringId(
       OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN);
   finished_download_menu_model_->AddCheckItemWithStringId(
-      ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
-  if (DownloadItemModel(download_item_).ShouldPreferOpeningInBrowser())
-    finished_download_menu_model_->AddItemWithStringId(
-        PLATFORM_OPEN, IDS_DOWNLOAD_MENU_PLATFORM_OPEN);
+      ALWAYS_OPEN_TYPE, GetAlwaysOpenStringId());
+  finished_download_menu_model_->AddItemWithStringId(
+      PLATFORM_OPEN, IDS_DOWNLOAD_MENU_PLATFORM_OPEN);
   finished_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
   finished_download_menu_model_->AddItemWithStringId(
       SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW);
@@ -333,8 +371,7 @@ ui::SimpleMenuModel* DownloadShelfContextMenu::GetMaybeMaliciousMenuModel() {
   return maybe_malicious_download_menu_model_.get();
 }
 
-ui::SimpleMenuModel*
-DownloadShelfContextMenu::GetMaliciousMenuModel() {
+ui::SimpleMenuModel* DownloadShelfContextMenu::GetMaliciousMenuModel() {
   if (malicious_download_menu_model_)
     return malicious_download_menu_model_.get();
 
@@ -346,3 +383,22 @@ DownloadShelfContextMenu::GetMaliciousMenuModel() {
 
   return malicious_download_menu_model_.get();
 }
+
+int DownloadShelfContextMenu::GetAlwaysOpenStringId() const {
+#if defined(OS_WIN)
+  if (CanOpenPdfInReader())
+    return IDS_DOWNLOAD_MENU_ALWAYS_OPEN_PDF_IN_READER;
+#endif
+  return IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE;
+}
+
+#if defined(OS_WIN)
+bool DownloadShelfContextMenu::IsDownloadPdf() const {
+  base::FilePath path = download_item_->GetTargetFilePath();
+  return path.MatchesExtension(FILE_PATH_LITERAL(".pdf"));
+}
+
+bool DownloadShelfContextMenu::CanOpenPdfInReader() const {
+  return (is_pdf_reader_up_to_date_ && IsDownloadPdf());
+}
+#endif
index 15b6504..a5d8a5e 100644 (file)
@@ -52,6 +52,7 @@ class DownloadShelfContextMenu : public ui::SimpleMenuModel::Delegate,
   // ui::SimpleMenuModel::Delegate:
   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
   virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
+  virtual bool IsCommandIdVisible(int command_id) const OVERRIDE;
   virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
   virtual bool GetAcceleratorForCommandId(
       int command_id,
@@ -73,6 +74,13 @@ class DownloadShelfContextMenu : public ui::SimpleMenuModel::Delegate,
   ui::SimpleMenuModel* GetMaybeMaliciousMenuModel();
   ui::SimpleMenuModel* GetMaliciousMenuModel();
 
+  int GetAlwaysOpenStringId() const;
+
+#if defined(OS_WIN)
+  bool IsDownloadPdf() const;
+  bool CanOpenPdfInReader() const;
+#endif
+
   // We show slightly different menus if the download is in progress vs. if the
   // download has finished.
   scoped_ptr<ui::SimpleMenuModel> in_progress_download_menu_model_;
@@ -87,6 +95,10 @@ class DownloadShelfContextMenu : public ui::SimpleMenuModel::Delegate,
   // Used to open tabs.
   content::PageNavigator* navigator_;
 
+#if defined(OS_WIN)
+  bool is_pdf_reader_up_to_date_;
+#endif
+
   DISALLOW_COPY_AND_ASSIGN(DownloadShelfContextMenu);
 };
 
index e7bb16d..971a904 100644 (file)
 #include "content/public/common/webplugininfo.h"
 #endif
 
+#if defined(OS_WIN)
+#include "chrome/browser/ui/pdf/adobe_reader_info_win.h"
+#endif
+
 using content::BrowserThread;
 using content::DownloadItem;
 
@@ -56,7 +60,12 @@ void VisitCountsToVisitedBefore(
       (first_visit.LocalMidnight() < base::Time::Now().LocalMidnight()));
 }
 
-} // namespace
+#if defined(OS_WIN)
+// Keeps track of whether Adobe Reader is up to date.
+bool g_is_adobe_reader_up_to_date_ = false;
+#endif
+
+}  // namespace
 
 DownloadTargetInfo::DownloadTargetInfo()
     : is_filetype_handled_safely(false) {}
@@ -131,6 +140,9 @@ void DownloadTargetDeterminer::DoLoop() {
       case STATE_DETERMINE_IF_HANDLED_SAFELY_BY_BROWSER:
         result = DoDetermineIfHandledSafely();
         break;
+      case STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE:
+        result = DoDetermineIfAdobeReaderUpToDate();
+        break;
       case STATE_CHECK_DOWNLOAD_URL:
         result = DoCheckDownloadUrl();
         break;
@@ -447,8 +459,8 @@ void IsHandledBySafePlugin(content::ResourceContext* resource_context,
       BrowserThread::UI, FROM_HERE, base::Bind(callback, is_handled_safely));
 }
 
-} // namespace
-#endif  // ENABLE_PLUGINS
+}  // namespace
+#endif  // defined(ENABLE_PLUGINS)
 
 DownloadTargetDeterminer::Result
     DownloadTargetDeterminer::DoDetermineIfHandledSafely() {
@@ -457,7 +469,7 @@ DownloadTargetDeterminer::Result
   DCHECK(!local_path_.empty());
   DCHECK(!is_filetype_handled_safely_);
 
-  next_state_ = STATE_CHECK_DOWNLOAD_URL;
+  next_state_ = STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE;
 
   if (mime_type_.empty())
     return CONTINUE;
@@ -485,14 +497,51 @@ DownloadTargetDeterminer::Result
 #endif
 }
 
+#if defined(ENABLE_PLUGINS)
 void DownloadTargetDeterminer::DetermineIfHandledSafelyDone(
     bool is_handled_safely) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   DVLOG(20) << "Is file type handled safely: " << is_filetype_handled_safely_;
-  DCHECK_EQ(STATE_CHECK_DOWNLOAD_URL, next_state_);
+  DCHECK_EQ(STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE, next_state_);
   is_filetype_handled_safely_ = is_handled_safely;
   DoLoop();
 }
+#endif
+
+DownloadTargetDeterminer::Result
+    DownloadTargetDeterminer::DoDetermineIfAdobeReaderUpToDate() {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  next_state_ = STATE_CHECK_DOWNLOAD_URL;
+
+#if defined(OS_WIN)
+  if (!local_path_.MatchesExtension(FILE_PATH_LITERAL(".pdf")))
+    return CONTINUE;
+  if (!IsAdobeReaderDefaultPDFViewer())
+    return CONTINUE;
+
+  base::PostTaskAndReplyWithResult(
+      BrowserThread::GetBlockingPool(),
+      FROM_HERE,
+      base::Bind(&::IsAdobeReaderUpToDate),
+      base::Bind(&DownloadTargetDeterminer::DetermineIfAdobeReaderUpToDateDone,
+                 weak_ptr_factory_.GetWeakPtr()));
+  return QUIT_DOLOOP;
+#else
+  return CONTINUE;
+#endif
+}
+
+#if defined(OS_WIN)
+void DownloadTargetDeterminer::DetermineIfAdobeReaderUpToDateDone(
+    bool adobe_reader_up_to_date) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  DVLOG(20) << "Is Adobe Reader Up To Date: " << adobe_reader_up_to_date;
+  DCHECK_EQ(STATE_CHECK_DOWNLOAD_URL, next_state_);
+  g_is_adobe_reader_up_to_date_ = adobe_reader_up_to_date;
+  DoLoop();
+}
+#endif
 
 DownloadTargetDeterminer::Result
     DownloadTargetDeterminer::DoCheckDownloadUrl() {
@@ -821,3 +870,10 @@ base::FilePath DownloadTargetDeterminer::GetCrDownloadPath(
     const base::FilePath& suggested_path) {
   return base::FilePath(suggested_path.value() + kCrdownloadSuffix);
 }
+
+#if defined(OS_WIN)
+// static
+bool DownloadTargetDeterminer::IsAdobeReaderUpToDate() {
+  return g_is_adobe_reader_up_to_date_;
+}
+#endif
index a244331..4f6e5c0 100644 (file)
@@ -79,6 +79,13 @@ class DownloadTargetDeterminer
   // Returns a .crdownload intermediate path for the |suggested_path|.
   static base::FilePath GetCrDownloadPath(const base::FilePath& suggested_path);
 
+#if defined(OS_WIN)
+  // Returns true if Adobe Reader is up to date. This information refreshed
+  // only when Start() gets called for a PDF and Adobe Reader is the default
+  // System PDF viewer.
+  static bool IsAdobeReaderUpToDate();
+#endif
+
  private:
   // The main workflow is controlled via a set of state transitions. Each state
   // has an associated handler. The handler for STATE_FOO is DoFoo. Each handler
@@ -93,6 +100,7 @@ class DownloadTargetDeterminer
     STATE_DETERMINE_LOCAL_PATH,
     STATE_DETERMINE_MIME_TYPE,
     STATE_DETERMINE_IF_HANDLED_SAFELY_BY_BROWSER,
+    STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE,
     STATE_CHECK_DOWNLOAD_URL,
     STATE_CHECK_VISITED_REFERRER_BEFORE,
     STATE_DETERMINE_INTERMEDIATE_PATH,
@@ -205,12 +213,26 @@ class DownloadTargetDeterminer
   // Determine if the file type can be handled safely by the browser if it were
   // to be opened via a file:// URL.
   // Next state:
-  // - STATE_CHECK_DOWNLOAD_URL.
+  // - STATE_DETERMINE_IF_ADOBE_READER_UP_TO_DATE.
   Result DoDetermineIfHandledSafely();
 
+#if defined(ENABLE_PLUGINS)
   // Callback invoked when a decision is available about whether the file type
   // can be handled safely by the browser.
   void DetermineIfHandledSafelyDone(bool is_handled_safely);
+#endif
+
+  // Determine if Adobe Reader is up to date. Only do the check on Windows for
+  // .pdf file targets.
+  // Next state:
+  // - STATE_CHECK_DOWNLOAD_URL.
+  Result DoDetermineIfAdobeReaderUpToDate();
+
+#if defined(OS_WIN)
+  // Callback invoked when a decision is available about whether Adobe Reader
+  // is up to date.
+  void DetermineIfAdobeReaderUpToDateDone(bool adobe_reader_up_to_date);
+#endif
 
   // Checks whether the downloaded URL is malicious. Invokes the
   // DownloadProtectionService via the delegate.
index c2d0cd5..779b9e8 100644 (file)
@@ -34,9 +34,6 @@ ActiveTabPermissionGranter::ActiveTabPermissionGranter(
 ActiveTabPermissionGranter::~ActiveTabPermissionGranter() {}
 
 void ActiveTabPermissionGranter::GrantIfRequested(const Extension* extension) {
-  // Active tab grant request implies there was a user gesture.
-  web_contents()->UserGestureDone();
-
   if (granted_extensions_.Contains(extension->id()))
     return;
 
index 6130d92..b24fd05 100644 (file)
@@ -158,7 +158,7 @@ bool CastSocket::ExtractPeerCert(std::string* cert) {
 }
 
 bool CastSocket::VerifyChallengeReply() {
-  return AuthenticateChallengeReply(*challenge_reply_.get(), peer_cert_);
+  return AuthenticateChallengeReply(*challenge_reply_, peer_cert_);
 }
 
 void CastSocket::Connect(const net::CompletionCallback& callback) {
@@ -532,6 +532,7 @@ void CastSocket::DoReadLoop(int result) {
         break;
       case READ_STATE_ERROR:
         rv = DoReadError(rv);
+        DCHECK_EQ(read_state_, READ_STATE_NONE);
         break;
       default:
         NOTREACHED() << "BUG in read flow. Unknown state: " << state;
@@ -539,9 +540,17 @@ void CastSocket::DoReadLoop(int result) {
     }
   } while (rv != net::ERR_IO_PENDING && read_state_ != READ_STATE_NONE);
 
-  // Read loop is done - If the result is ERR_FAILED then close with error.
-  if (rv == net::ERR_FAILED)
-    CloseWithError(error_state_);
+  if (rv == net::ERR_FAILED) {
+    if (ready_state_ == READY_STATE_CONNECTING) {
+      // Read errors during the handshake should notify the caller via
+      // the connect callback, rather than the message event delegate.
+      PostTaskToStartConnectLoop(net::ERR_FAILED);
+    } else {
+      // Connection is already established.
+      // Close and send error status via the message event delegate.
+      CloseWithError(error_state_);
+    }
+  }
 }
 
 int CastSocket::DoRead() {
@@ -551,14 +560,14 @@ int CastSocket::DoRead() {
   if (header_read_buffer_->RemainingCapacity() > 0) {
     current_read_buffer_ = header_read_buffer_;
     num_bytes_to_read = header_read_buffer_->RemainingCapacity();
-    DCHECK_LE(num_bytes_to_read, MessageHeader::header_size());
+    CHECK_LE(num_bytes_to_read, MessageHeader::header_size());
   } else {
     DCHECK_GT(current_message_size_, 0U);
     num_bytes_to_read = current_message_size_ - body_read_buffer_->offset();
     current_read_buffer_ = body_read_buffer_;
-    DCHECK_LE(num_bytes_to_read, MessageHeader::max_message_size());
+    CHECK_LE(num_bytes_to_read, MessageHeader::max_message_size());
   }
-  DCHECK_GT(num_bytes_to_read, 0U);
+  CHECK_GT(num_bytes_to_read, 0U);
 
   // Read up to num_bytes_to_read into |current_read_buffer_|.
   return socket_->Read(
@@ -580,8 +589,8 @@ int CastSocket::DoReadComplete(int result) {
   }
 
   // Some data was read.  Move the offset in the current buffer forward.
-  DCHECK_LE(current_read_buffer_->offset() + result,
-            current_read_buffer_->capacity());
+  CHECK_LE(current_read_buffer_->offset() + result,
+           current_read_buffer_->capacity());
   current_read_buffer_->set_offset(current_read_buffer_->offset() + result);
   read_state_ = READ_STATE_READ;
 
@@ -609,40 +618,38 @@ int CastSocket::DoReadComplete(int result) {
 
 int CastSocket::DoReadCallback() {
   read_state_ = READ_STATE_READ;
-  const CastMessage& message = *(current_message_.get());
-  if (IsAuthMessage(message)) {
-    // An auth message is received, check that connect flow is running.
-    if (ready_state_ == READY_STATE_CONNECTING) {
+  const CastMessage& message = *current_message_;
+  if (ready_state_ == READY_STATE_CONNECTING) {
+    if (IsAuthMessage(message)) {
       challenge_reply_.reset(new CastMessage(message));
       PostTaskToStartConnectLoop(net::OK);
+      return net::OK;
     } else {
+      // Expected an auth message, got something else instead. Handle as error.
       read_state_ = READ_STATE_ERROR;
+      return net::ERR_INVALID_RESPONSE;
     }
-  } else if (delegate_) {
-    MessageInfo message_info;
-    if (CastMessageToMessageInfo(message, &message_info))
-      delegate_->OnMessage(this, message_info);
-    else
-      read_state_ = READ_STATE_ERROR;
   }
+
+  MessageInfo message_info;
+  if (!CastMessageToMessageInfo(message, &message_info)) {
+    current_message_->Clear();
+    read_state_ = READ_STATE_ERROR;
+    return net::ERR_INVALID_RESPONSE;
+  }
+  delegate_->OnMessage(this, message_info);
   current_message_->Clear();
   return net::OK;
 }
 
 int CastSocket::DoReadError(int result) {
   DCHECK_LE(result, 0);
-  // If inside connection flow, then get back to connect loop.
-  if (ready_state_ == READY_STATE_CONNECTING) {
-    PostTaskToStartConnectLoop(result);
-    // does not try to report error also.
-    return net::OK;
-  }
   return net::ERR_FAILED;
 }
 
 bool CastSocket::ProcessHeader() {
-  DCHECK_EQ(static_cast<uint32>(header_read_buffer_->offset()),
-            MessageHeader::header_size());
+  CHECK_EQ(static_cast<uint32>(header_read_buffer_->offset()),
+           MessageHeader::header_size());
   MessageHeader header;
   MessageHeader::ReadFromIOBuffer(header_read_buffer_.get(), &header);
   if (header.message_size > MessageHeader::max_message_size())
@@ -655,8 +662,8 @@ bool CastSocket::ProcessHeader() {
 }
 
 bool CastSocket::ProcessBody() {
-  DCHECK_EQ(static_cast<uint32>(body_read_buffer_->offset()),
-            current_message_size_);
+  CHECK_EQ(static_cast<uint32>(body_read_buffer_->offset()),
+           current_message_size_);
   if (!current_message_->ParseFromArray(
       body_read_buffer_->StartOfBuffer(), current_message_size_)) {
     return false;
@@ -707,7 +714,7 @@ CastSocket::MessageHeader::MessageHeader() : message_size(0) { }
 void CastSocket::MessageHeader::SetMessageSize(size_t size) {
   DCHECK(size < static_cast<size_t>(kuint32max));
   DCHECK(size > 0);
-  message_size = static_cast<size_t>(size);
+  message_size = size;
 }
 
 // TODO(mfoltz): Investigate replacing header serialization with base::Pickle,
index d9e4aee..fb8cf41 100644 (file)
@@ -148,7 +148,8 @@ class TestCastSocket : public CastSocket {
       ip_(ip_endpoint),
       connect_index_(0),
       extract_cert_result_(true),
-      verify_challenge_result_(true) {
+      verify_challenge_result_(true),
+      verify_challenge_disallow_(false) {
   }
 
   static net::IPEndPoint CreateIPEndPoint() {
@@ -235,6 +236,8 @@ class TestCastSocket : public CastSocket {
     verify_challenge_result_ = value;
   }
 
+  void DisallowVerifyChallengeResult() { verify_challenge_disallow_ = true; }
+
  private:
   virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
     net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get();
@@ -264,6 +267,7 @@ class TestCastSocket : public CastSocket {
   }
 
   virtual bool VerifyChallengeReply() OVERRIDE {
+    EXPECT_FALSE(verify_challenge_disallow_);
     return verify_challenge_result_;
   }
 
@@ -282,6 +286,7 @@ class TestCastSocket : public CastSocket {
   bool extract_cert_result_;
   // Simulated result of verifying challenge reply.
   bool verify_challenge_result_;
+  bool verify_challenge_disallow_;
 };
 
 class CastSocketTest : public testing::Test {
@@ -298,7 +303,18 @@ class CastSocketTest : public testing::Test {
           test_messages_[i], &test_protos_[i]));
       ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i]));
     }
+  }
 
+  virtual void TearDown() OVERRIDE {
+    EXPECT_CALL(handler_, OnCloseComplete(net::OK));
+    socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
+                              base::Unretained(&handler_)));
+  }
+
+  // The caller can specify non-standard namespaces by setting "auth_namespace"
+  // (useful for negative test cases.)
+  void SetupAuthMessage(
+      const char* auth_namespace = "urn:x-cast:com.google.cast.tp.deviceauth") {
     // Create a test auth request.
     CastMessage request;
     CreateAuthChallengeMessage(&request);
@@ -306,22 +322,13 @@ class CastSocketTest : public testing::Test {
 
     // Create a test auth reply.
     MessageInfo reply;
-    CreateBinaryMessage("urn:x-cast:com.google.cast.tp.deviceauth",
-                        "sender-0",
-                        "receiver-0",
-                        "abcd",
-                        &reply);
+    CreateBinaryMessage(
+        auth_namespace, "sender-0", "receiver-0", "abcd", &reply);
     CastMessage reply_msg;
     ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg));
     ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_));
   }
 
-  virtual void TearDown() OVERRIDE {
-    EXPECT_CALL(handler_, OnCloseComplete(net::OK));
-    socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
-                              base::Unretained(&handler_)));
-  }
-
   void CreateCastSocket() {
     socket_ = TestCastSocket::Create(&mock_delegate_);
   }
@@ -366,6 +373,7 @@ class CastSocketTest : public testing::Test {
 TEST_F(CastSocketTest, TestConnectAndClose) {
   CreateCastSocket();
   ConnectHelper();
+  SetupAuthMessage();
   EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
   EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
 
@@ -381,6 +389,7 @@ TEST_F(CastSocketTest, TestConnectAndClose) {
 // - SSL connection succeeds (async)
 TEST_F(CastSocketTest, TestConnect) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->SetupTcp1Connect(net::ASYNC, net::OK);
   socket_->SetupSsl1Connect(net::ASYNC, net::OK);
   socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
@@ -402,6 +411,7 @@ TEST_F(CastSocketTest, TestConnect) {
 // - Second SSL connection succeeds (async)
 TEST_F(CastSocketTest, TestConnectTwoStep) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->SetupTcp1Connect(net::ASYNC, net::OK);
   socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
   socket_->SetupTcp2Connect(net::ASYNC, net::OK);
@@ -426,6 +436,7 @@ TEST_F(CastSocketTest, TestConnectTwoStep) {
 // - The flow should NOT be tried again
 TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->SetupTcp1Connect(net::ASYNC, net::OK);
   socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
   socket_->SetupTcp2Connect(net::ASYNC, net::OK);
@@ -451,6 +462,7 @@ TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) {
 // - Credentials are verified successfuly
 TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::ASYNC, net::OK);
   socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
@@ -472,6 +484,7 @@ TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) {
 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous.
 TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
   socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
@@ -490,9 +503,35 @@ TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) {
   EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
 }
 
+// Test that an AuthMessage with a mangled namespace triggers cancelation
+// of the connection event loop.
+TEST_F(CastSocketTest, TestConnectAuthMessageCorrupted) {
+  CreateCastSocketSecure();
+  SetupAuthMessage("bogus_namespace");
+
+  socket_->SetupTcp1Connect(net::ASYNC, net::OK);
+  socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
+  socket_->SetupTcp2Connect(net::ASYNC, net::OK);
+  socket_->SetupSsl2Connect(net::ASYNC, net::OK);
+  socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
+  socket_->AddReadResultForMessage(net::ASYNC, auth_reply_);
+  socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
+  // Guard against VerifyChallengeResult() being triggered.
+  socket_->DisallowVerifyChallengeResult();
+
+  EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
+  socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
+                              base::Unretained(&handler_)));
+  RunPendingTasks();
+
+  EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
+  EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
+}
+
 // Test connection error - TCP connect fails (async)
 TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::ASYNC, net::ERR_FAILED);
 
@@ -508,6 +547,7 @@ TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) {
 // Test connection error - TCP connect fails (sync)
 TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
 
@@ -523,6 +563,7 @@ TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) {
 // Test connection error - SSL connect fails (async)
 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
   socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
@@ -539,6 +580,7 @@ TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
 // Test connection error - SSL connect fails (async)
 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
   socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED);
@@ -555,6 +597,7 @@ TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
 // Test connection error - cert extraction error (async)
 TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->SetupTcp1Connect(net::ASYNC, net::OK);
   socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
   // Set cert extraction to fail
@@ -572,6 +615,7 @@ TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) {
 // Test connection error - cert extraction error (sync)
 TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
   socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
   // Set cert extraction to fail
@@ -589,6 +633,7 @@ TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) {
 // Test connection error - challenge send fails
 TEST_F(CastSocketTest, TestConnectChallengeSendError) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
   socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
@@ -606,6 +651,7 @@ TEST_F(CastSocketTest, TestConnectChallengeSendError) {
 // Test connection error - challenge reply receive fails
 TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
   socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
@@ -624,6 +670,7 @@ TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) {
 // Test connection error - challenge reply verification fails
 TEST_F(CastSocketTest, TestConnectChallengeVerificationFails) {
   CreateCastSocketSecure();
+  SetupAuthMessage();
 
   socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
   socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
@@ -646,6 +693,7 @@ TEST_F(CastSocketTest, TestWriteAsync) {
   CreateCastSocket();
   socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0]);
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
   socket_->SendMessage(test_messages_[0],
@@ -662,6 +710,7 @@ TEST_F(CastSocketTest, TestWriteSync) {
   CreateCastSocket();
   socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
   socket_->SendMessage(test_messages_[0],
@@ -678,6 +727,7 @@ TEST_F(CastSocketTest, TestWriteChunkedAsync) {
   CreateCastSocket();
   socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
   socket_->SendMessage(test_messages_[0],
@@ -694,6 +744,7 @@ TEST_F(CastSocketTest, TestWriteChunkedSync) {
   CreateCastSocket();
   socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
   socket_->SendMessage(test_messages_[0],
@@ -714,6 +765,7 @@ TEST_F(CastSocketTest, TestWriteManyAsync) {
     EXPECT_CALL(handler_, OnWriteComplete(msg_size));
   }
   ConnectHelper();
+  SetupAuthMessage();
 
   for (size_t i = 0; i < arraysize(test_messages_); i++) {
     socket_->SendMessage(test_messages_[i],
@@ -735,6 +787,7 @@ TEST_F(CastSocketTest, TestWriteManySync) {
     EXPECT_CALL(handler_, OnWriteComplete(msg_size));
   }
   ConnectHelper();
+  SetupAuthMessage();
 
   for (size_t i = 0; i < arraysize(test_messages_); i++) {
     socket_->SendMessage(test_messages_[i],
@@ -750,6 +803,7 @@ TEST_F(CastSocketTest, TestWriteManySync) {
 // Test write error - not connected
 TEST_F(CastSocketTest, TestWriteErrorNotConnected) {
   CreateCastSocket();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
   socket_->SendMessage(test_messages_[0],
@@ -764,6 +818,7 @@ TEST_F(CastSocketTest, TestWriteErrorNotConnected) {
 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) {
   CreateCastSocket();
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
   size_t size = CastSocket::MessageHeader::max_message_size() + 1;
@@ -783,6 +838,7 @@ TEST_F(CastSocketTest, TestWriteNetworkErrorSync) {
   CreateCastSocket();
   socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED);
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
   EXPECT_CALL(mock_delegate_,
@@ -801,6 +857,7 @@ TEST_F(CastSocketTest, TestWriteErrorAsync) {
   CreateCastSocket();
   socket_->AddWriteResult(net::ASYNC, net::ERR_FAILED);
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
   EXPECT_CALL(mock_delegate_,
@@ -819,6 +876,7 @@ TEST_F(CastSocketTest, TestWriteErrorZeroBytesWritten) {
   CreateCastSocket();
   socket_->AddWriteResult(net::SYNCHRONOUS, 0);
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
   EXPECT_CALL(mock_delegate_,
@@ -838,6 +896,7 @@ TEST_F(CastSocketTest, TestWriteErrorWithMultiplePendingWritesAsync) {
   CreateCastSocket();
   socket_->AddWriteResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
   ConnectHelper();
+  SetupAuthMessage();
 
   const int num_writes = arraysize(test_messages_);
   EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED))
@@ -862,6 +921,7 @@ TEST_F(CastSocketTest, TestReadAsync) {
   EXPECT_CALL(mock_delegate_,
               OnMessage(socket_.get(), A<const MessageInfo&>()));
   ConnectHelper();
+  SetupAuthMessage();
 
   EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
   EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
@@ -870,6 +930,7 @@ TEST_F(CastSocketTest, TestReadAsync) {
 // Test read success - single message (sync)
 TEST_F(CastSocketTest, TestReadSync) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
   EXPECT_CALL(mock_delegate_,
               OnMessage(socket_.get(), A<const MessageInfo&>()));
@@ -882,6 +943,7 @@ TEST_F(CastSocketTest, TestReadSync) {
 // Test read success - single message received in multiple chunks (async)
 TEST_F(CastSocketTest, TestReadChunkedAsync) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
   EXPECT_CALL(mock_delegate_,
               OnMessage(socket_.get(), A<const MessageInfo&>()));
@@ -894,6 +956,7 @@ TEST_F(CastSocketTest, TestReadChunkedAsync) {
 // Test read success - single message received in multiple chunks (sync)
 TEST_F(CastSocketTest, TestReadChunkedSync) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
   EXPECT_CALL(mock_delegate_,
               OnMessage(socket_.get(), A<const MessageInfo&>()));
@@ -906,6 +969,7 @@ TEST_F(CastSocketTest, TestReadChunkedSync) {
 // Test read success - multiple messages (async)
 TEST_F(CastSocketTest, TestReadManyAsync) {
   CreateCastSocket();
+  SetupAuthMessage();
   size_t num_reads = arraysize(test_proto_strs_);
   for (size_t i = 0; i < num_reads; i++)
     socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[i]);
@@ -921,6 +985,7 @@ TEST_F(CastSocketTest, TestReadManyAsync) {
 // Test read success - multiple messages (sync)
 TEST_F(CastSocketTest, TestReadManySync) {
   CreateCastSocket();
+  SetupAuthMessage();
   size_t num_reads = arraysize(test_proto_strs_);
   for (size_t i = 0; i < num_reads; i++)
     socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[i]);
@@ -936,6 +1001,7 @@ TEST_F(CastSocketTest, TestReadManySync) {
 // Test read error - network error (async)
 TEST_F(CastSocketTest, TestReadErrorAsync) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->AddReadResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
   EXPECT_CALL(mock_delegate_,
               OnError(socket_.get(),
@@ -949,6 +1015,7 @@ TEST_F(CastSocketTest, TestReadErrorAsync) {
 // Test read error - network error (sync)
 TEST_F(CastSocketTest, TestReadErrorSync) {
   CreateCastSocket();
+  SetupAuthMessage();
   socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_SOCKET_NOT_CONNECTED);
   EXPECT_CALL(mock_delegate_,
               OnError(socket_.get(),
@@ -962,6 +1029,7 @@ TEST_F(CastSocketTest, TestReadErrorSync) {
 // Test read error - header parse error
 TEST_F(CastSocketTest, TestReadHeaderParseError) {
   CreateCastSocket();
+  SetupAuthMessage();
   uint32 body_size = base::HostToNet32(
       CastSocket::MessageHeader::max_message_size() + 1);
   // TODO(munjal): Add a method to cast_message_util.h to serialize messages
@@ -981,6 +1049,7 @@ TEST_F(CastSocketTest, TestReadHeaderParseError) {
 // Test read error - body parse error
 TEST_F(CastSocketTest, TestReadBodyParseError) {
   CreateCastSocket();
+  SetupAuthMessage();
   char body[] = "some body";
   uint32 body_size = base::HostToNet32(arraysize(body));
   char header[sizeof(body_size)];
index ebbc102..f9e5ad7 100644 (file)
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/common/constants.h"
 #include "extensions/common/error_utils.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/manifest_constants.h"
+#include "extensions/common/permissions/permissions_data.h"
+#include "extensions/common/switches.h"
 #include "grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -503,6 +507,7 @@ void DebuggerFunction::FormatErrorMessage(const std::string& format) {
 }
 
 bool DebuggerFunction::InitAgentHost() {
+  const Extension* extension = GetExtension();
   if (debuggee_.tab_id) {
     WebContents* web_contents = NULL;
     bool result = ExtensionTabUtil::GetTabById(*debuggee_.tab_id,
@@ -513,12 +518,10 @@ bool DebuggerFunction::InitAgentHost() {
                                                &web_contents,
                                                NULL);
     if (result && web_contents) {
-      if (content::HasWebUIScheme(web_contents->GetURL())) {
-        error_ = ErrorUtils::FormatErrorMessage(
-            keys::kAttachToWebUIError,
-            web_contents->GetURL().scheme());
+      // TODO(rdevlin.cronin) This should definitely be GetLastCommittedURL().
+      GURL url = web_contents->GetVisibleURL();
+      if (PermissionsData::IsRestrictedUrl(url, url, extension, &error_))
         return false;
-      }
       agent_host_ = DevToolsAgentHost::GetOrCreateFor(web_contents);
     }
   } else if (debuggee_.extension_id) {
@@ -527,6 +530,12 @@ bool DebuggerFunction::InitAgentHost() {
             ->process_manager()
             ->GetBackgroundHostForExtension(*debuggee_.extension_id);
     if (extension_host) {
+      if (PermissionsData::IsRestrictedUrl(extension_host->GetURL(),
+                                           extension_host->GetURL(),
+                                           extension,
+                                           &error_)) {
+        return false;
+      }
       agent_host_ = DevToolsAgentHost::GetOrCreateFor(
           extension_host->render_view_host());
     }
@@ -588,25 +597,26 @@ bool DebuggerAttachFunction::RunAsync() {
     return false;
   }
 
+  const Extension* extension = GetExtension();
   infobars::InfoBar* infobar = NULL;
   if (!CommandLine::ForCurrentProcess()->
-       HasSwitch(switches::kSilentDebuggerExtensionAPI)) {
+       HasSwitch(::switches::kSilentDebuggerExtensionAPI)) {
     // Do not attach to the target if for any reason the infobar cannot be shown
     // for this WebContents instance.
     infobar = ExtensionDevToolsInfoBarDelegate::Create(
-        agent_host_->GetRenderViewHost(), GetExtension()->name());
+        agent_host_->GetRenderViewHost(), extension->name());
     if (!infobar) {
       error_ = ErrorUtils::FormatErrorMessage(
           keys::kSilentDebuggingRequired,
-          switches::kSilentDebuggerExtensionAPI);
+          ::switches::kSilentDebuggerExtensionAPI);
       return false;
     }
   }
 
   new ExtensionDevToolsClientHost(GetProfile(),
                                   agent_host_.get(),
-                                  GetExtension()->id(),
-                                  GetExtension()->name(),
+                                  extension->id(),
+                                  extension->name(),
                                   debuggee_,
                                   infobar);
   SendResponse(true);
index 70da45b..7ddcd82 100644 (file)
@@ -8,8 +8,6 @@ namespace debugger_api_constants {
 
 const char kAlreadyAttachedError[] =
     "Another debugger is already attached to the * with id: *.";
-const char kAttachToWebUIError[] =
-    "Can not attach to the page with the \"*://\" scheme.";
 const char kNoTargetError[] = "No * with given id *.";
 const char kInvalidTargetError[] =
     "Either tab id or extension id must be specified.";
index 0c7eaa7..f79b7b8 100644 (file)
@@ -15,7 +15,6 @@ extern const char kOnDetach[];
 
 // Errors.
 extern const char kAlreadyAttachedError[];
-extern const char kAttachToWebUIError[];
 extern const char kNoTargetError[];
 extern const char kInvalidTargetError[];
 extern const char kNotAttachedError[];
index 878135a..f50ecbb 100644 (file)
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <string>
+
 #include "base/command_line.h"
+#include "base/memory/ref_counted.h"
+#include "base/path_service.h"
+#include "base/strings/stringprintf.h"
+#include "chrome/browser/extensions/api/debugger/debugger_api.h"
 #include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/extensions/extension_function_test_utils.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "extensions/browser/extension_function.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_builder.h"
+#include "extensions/common/manifest_constants.h"
+#include "extensions/common/switches.h"
+#include "extensions/common/value_builder.h"
+
+namespace extensions {
+
+class DebuggerApiTest : public ExtensionApiTest {
+ protected:
+  virtual ~DebuggerApiTest() {}
+
+  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
+  virtual void SetUpOnMainThread() OVERRIDE;
+
+  // Run the attach function. If |expected_error| is not empty, then the
+  // function should fail with the error. Otherwise, the function is expected
+  // to succeed.
+  testing::AssertionResult RunAttachFunction(const GURL& url,
+                                             const std::string& expected_error);
+
+  const Extension* extension() const { return extension_; }
+  base::CommandLine* command_line() const { return command_line_; }
+
+ private:
+  // The command-line for the test process, preserved in order to modify
+  // mid-test.
+  base::CommandLine* command_line_;
+
+  // A basic extension with the debugger permission.
+  scoped_refptr<const Extension> extension_;
+};
+
+void DebuggerApiTest::SetUpCommandLine(base::CommandLine* command_line) {
+  ExtensionApiTest::SetUpCommandLine(command_line);
+  // We need to hold onto |command_line| in order to modify it during the test.
+  command_line_ = command_line;
+}
+
+void DebuggerApiTest::SetUpOnMainThread() {
+  ExtensionApiTest::SetUpOnMainThread();
+  extension_ =
+      ExtensionBuilder().SetManifest(
+          DictionaryBuilder().Set("name", "debugger")
+                             .Set("version", "0.1")
+                             .Set("manifest_version", 2)
+                             .Set("permissions",
+                                  ListBuilder().Append("debugger"))).Build();
+}
+
+testing::AssertionResult DebuggerApiTest::RunAttachFunction(
+    const GURL& url, const std::string& expected_error) {
+  ui_test_utils::NavigateToURL(browser(), url);
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  int tab_id = SessionID::IdForTab(web_contents);
+  scoped_refptr<DebuggerAttachFunction> attach_function =
+      new DebuggerAttachFunction();
+  attach_function->set_extension(extension_);
+  std::string args = base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id);
+
+  if (!expected_error.empty()) {
+    std::string actual_error =
+        extension_function_test_utils::RunFunctionAndReturnError(
+            attach_function, args, browser());
+    if (actual_error != expected_error) {
+      return testing::AssertionFailure() << "Did not get correct error: "
+          << "expected: " << expected_error << ", found: " << actual_error;
+    }
+  } else {
+    if (!RunFunction(attach_function,
+                     args,
+                     browser(),
+                     extension_function_test_utils::NONE)) {
+      return testing::AssertionFailure() << "Could not run function: "
+          << attach_function->GetError();
+    }
+
+    // Clean up and detach.
+    scoped_refptr<DebuggerDetachFunction> detach_function =
+        new DebuggerDetachFunction();
+    detach_function->set_extension(extension_);
+    if (!RunFunction(detach_function,
+                     base::StringPrintf("[{\"tabId\": %d}]", tab_id),
+                     browser(),
+                     extension_function_test_utils::NONE)) {
+      return testing::AssertionFailure() << "Could not detach: "
+          << detach_function->GetError();
+    }
+  }
+  return testing::AssertionSuccess();
+}
 
 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Debugger) {
   ASSERT_TRUE(RunExtensionTest("debugger")) << message_;
 }
+
+IN_PROC_BROWSER_TEST_F(DebuggerApiTest,
+                       DebuggerNotAllowedOnOtherExtensionPages) {
+  // Load another arbitrary extension with an associated resource (popup.html).
+  base::FilePath path;
+  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path));
+  path = path.AppendASCII("extensions").AppendASCII("good_unpacked");
+  const Extension* another_extension = LoadExtension(path);
+  ASSERT_TRUE(another_extension);
+
+  GURL other_ext_url =
+      GURL(base::StringPrintf("chrome-extension://%s/popup.html",
+                              another_extension->id().c_str()));
+
+  // This extension should not be able to access another extension.
+  EXPECT_TRUE(RunAttachFunction(
+      other_ext_url, manifest_errors::kCannotAccessExtensionUrl));
+
+  // This extension *should* be able to debug itself.
+  EXPECT_TRUE(RunAttachFunction(
+                  GURL(base::StringPrintf("chrome-extension://%s/foo.html",
+                                          extension()->id().c_str())),
+                  std::string()));
+
+  // Append extensions on chrome urls switch. The extension should now be able
+  // to debug any extension.
+  command_line()->AppendSwitch(switches::kExtensionsOnChromeURLs);
+  EXPECT_TRUE(RunAttachFunction(other_ext_url, std::string()));
+}
+
+}  // namespace extensions
index 753d3ff..2829a31 100644 (file)
@@ -5,12 +5,14 @@
 #include "base/command_line.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/common/chrome_switches.h"
+#include "extensions/common/switches.h"
 
 class ExtensionApiTestWithSwitch : public ExtensionApiTest {
  public:
   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
     ExtensionApiTest::SetUpCommandLine(command_line);
     command_line->AppendSwitch(switches::kSilentDebuggerExtensionAPI);
+    command_line->AppendSwitch(extensions::switches::kExtensionsOnChromeURLs);
   }
 };
 
index 998462a..216aa3e 100644 (file)
@@ -330,7 +330,7 @@ class IdentityAccountTrackerTest : public testing::Test {
   void NotifyRemoveAccount(const std::string& username) {
 #if !defined(OS_CHROMEOS)
     if (username == kPrimaryAccountKey)
-      fake_signin_manager_->SignOut();
+      fake_signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST);
     else
       account_tracker()->GoogleSignedOut(username);
 #else
index 2e2772b..a3939ad 100644 (file)
 #include "ui/keyboard/keyboard_controller.h"
 #include "ui/keyboard/keyboard_switches.h"
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/lock/screen_locker.h"
+#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
+#include "chrome/browser/chromeos/login/users/user_manager.h"
+#endif  // OS_CHROMEOS
+
 #if defined(USE_ASH)
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
@@ -168,6 +174,16 @@ bool VirtualKeyboardPrivateGetKeyboardConfigFunction::RunSync() {
 bool VirtualKeyboardPrivateOpenSettingsFunction::RunSync() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 #if defined(USE_ASH)
+#if defined(OS_CHROMEOS)
+  // Do not try to open language options page if user is not logged in or
+  // locked.
+  if (!chromeos::UserManager::Get()->IsUserLoggedIn() ||
+      chromeos::UserAddingScreen::Get()->IsRunning() ||
+      (chromeos::ScreenLocker::default_screen_locker() &&
+          chromeos::ScreenLocker::default_screen_locker()->locked()))
+    return true;
+#endif  // OS_CHROMEOS
+
   content::RecordAction(base::UserMetricsAction("OpenLanguageOptionsDialog"));
   chrome::ShowSettingsSubPageForProfile(
       ProfileManager::GetActiveUserProfile(), chrome::kLanguageOptionsSubPage);
index 2ae8213..3b4c626 100644 (file)
@@ -7,12 +7,15 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/extensions/api/input_ime.h"
 #include "chrome/common/extensions/api/input_ime/input_components_handler.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_function_registry.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/common/manifest_handlers/background_info.h"
 
 #if defined(USE_X11)
 #include "chrome/browser/chromeos/input_method/input_method_engine.h"
@@ -80,13 +83,32 @@ static void DispatchEventToExtension(Profile* profile,
       ->DispatchEventToExtension(extension_id, event.Pass());
 }
 
+void CallbackKeyEventHandle(chromeos::input_method::KeyEventHandle* key_data,
+                            bool handled) {
+  base::Callback<void(bool consumed)>* callback =
+      reinterpret_cast<base::Callback<void(bool consumed)>*>(key_data);
+  callback->Run(handled);
+  delete callback;
+}
+
 }  // namespace
 
 namespace chromeos {
 class ImeObserver : public InputMethodEngineInterface::Observer {
  public:
   ImeObserver(Profile* profile, const std::string& extension_id)
-      : profile_(profile), extension_id_(extension_id) {}
+      : profile_(profile), extension_id_(extension_id), has_background_(false) {
+    extensions::ExtensionSystem* extension_system =
+        extensions::ExtensionSystem::Get(profile_);
+    ExtensionService* extension_service = extension_system->extension_service();
+    const extensions::Extension* extension =
+        extension_service->GetExtensionById(extension_id, false);
+    DCHECK(extension);
+    extensions::BackgroundInfo* info = static_cast<extensions::BackgroundInfo*>(
+        extension->GetManifestData("background"));
+    if (info)
+      has_background_ = info->has_background_page();
+  }
 
   virtual ~ImeObserver() {}
 
@@ -163,13 +185,10 @@ class ImeObserver : public InputMethodEngineInterface::Observer {
 
     // If there is no listener for the event, no need to dispatch the event to
     // extension. Instead, releases the key event for default system behavior.
-    if (!HasKeyEventListener()) {
+    if (!ShouldForwardKeyEvent()) {
       // Continue processing the key event so that the physical keyboard can
       // still work.
-      base::Callback<void(bool consumed)>* callback =
-          reinterpret_cast<base::Callback<void(bool consumed)>*>(key_data);
-      callback->Run(false);
-      delete callback;
+      CallbackKeyEventHandle(key_data, false);
       return;
     }
 
@@ -281,14 +300,20 @@ class ImeObserver : public InputMethodEngineInterface::Observer {
   }
 
  private:
-  bool HasKeyEventListener() const {
-    return extensions::EventRouter::Get(profile_)
+  // Returns true if the extension is ready to accept key event, otherwise
+  // returns false.
+  bool ShouldForwardKeyEvent() const {
+    // Need to check the background page first since the
+    // ExtensionHasEventListner returns true if the extension does not have a
+    // background page. See crbug.com/394682.
+    return has_background_ && extensions::EventRouter::Get(profile_)
         ->ExtensionHasEventListener(extension_id_,
                                     input_ime::OnKeyEvent::kEventName);
   }
 
   Profile* profile_;
   std::string extension_id_;
+  bool has_background_;
 
   DISALLOW_COPY_AND_ASSIGN(ImeObserver);
 };
@@ -303,6 +328,7 @@ InputImeEventRouter::GetInstance() {
 }
 
 bool InputImeEventRouter::RegisterIme(
+    Profile* profile,
     const std::string& extension_id,
     const extensions::InputComponentInfo& component) {
 #if defined(USE_X11)
@@ -319,11 +345,11 @@ bool InputImeEventRouter::RegisterIme(
   // to maintain an internal map for observers which does nearly nothing
   // but just make sure they can properly deleted.
   // Making Obesrver per InputMethodEngine can make things cleaner.
-  Profile* profile = ProfileManager::GetActiveUserProfile();
   scoped_ptr<chromeos::InputMethodEngineInterface::Observer> observer(
       new chromeos::ImeObserver(profile, extension_id));
   chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine();
-  engine->Initialize(observer.Pass(),
+  engine->Initialize(profile,
+                     observer.Pass(),
                      component.name.c_str(),
                      extension_id.c_str(),
                      component.id.c_str(),
@@ -412,13 +438,7 @@ void InputImeEventRouter::OnKeyEventHandled(
   chromeos::input_method::KeyEventHandle* key_data = request->second.second;
   request_map_.erase(request);
 
-  InputMethodEngineInterface* engine = GetEngine(extension_id, engine_id);
-  if (!engine) {
-    LOG(ERROR) << "Engine does not exist: " << engine_id;
-    return;
-  }
-
-  engine->KeyEventDone(key_data, handled);
+  CallbackKeyEventHandle(key_data, handled);
 }
 
 std::string InputImeEventRouter::AddRequest(
@@ -811,14 +831,17 @@ void InputImeAPI::OnExtensionLoaded(content::BrowserContext* browser_context,
        component != input_components->end();
        ++component) {
     if (component->type == extensions::INPUT_COMPONENT_TYPE_IME) {
-      // Don't pass profile_ to register ime, instead always use
-      // GetActiveUserProfile. It is because:
-      // The original profile for login screen is called signin profile.
-      // And the active profile is the incognito profile based on signin
-      // profile. So if |profile_| is signin profile, we need to make sure
+      // If |browser_context| looks like signin profile, use the real signin
+      // profile. This is because IME extensions for signin profile are run
+      // in Off-The-Record profile, based on given static defaults.
+      // So if |profile_| is signin profile, we need to make sure
       // the router/observer runs under its incognito profile, because the
       // component extensions were installed under its incognito profile.
-      input_ime_event_router()->RegisterIme(extension->id(), *component);
+      Profile* profile = Profile::FromBrowserContext(browser_context);
+      if (chromeos::ProfileHelper::IsSigninProfile(profile))
+        profile = chromeos::ProfileHelper::GetSigninProfile();
+      input_ime_event_router()->RegisterIme(
+          profile, extension->id(), *component);
     }
   }
 }
index 773d13b..0090e5d 100644 (file)
@@ -36,7 +36,8 @@ class InputImeEventRouter {
  public:
   static InputImeEventRouter* GetInstance();
 
-  bool RegisterIme(const std::string& extension_id,
+  bool RegisterIme(Profile*,
+                   const std::string& extension_id,
                    const extensions::InputComponentInfo& component);
   void UnregisterAllImes(const std::string& extension_id);
   chromeos::InputMethodEngineInterface* GetEngine(
index 938ca29..cb192a2 100644 (file)
@@ -225,6 +225,10 @@ bool ChromeExtensionsBrowserClient::DidVersionUpdate(
   return last_version.IsOlderThan(current_version);
 }
 
+void ChromeExtensionsBrowserClient::PermitExternalProtocolHandler() {
+  ExternalProtocolHandler::PermitLaunchUrl();
+}
+
 scoped_ptr<AppSorting> ChromeExtensionsBrowserClient::CreateAppSorting() {
   return scoped_ptr<AppSorting>(new ChromeAppSorting());
 }
index 3c4a2c6..c250915 100644 (file)
@@ -83,6 +83,7 @@ class ChromeExtensionsBrowserClient : public ExtensionsBrowserClient {
   virtual scoped_ptr<ExtensionHostDelegate> CreateExtensionHostDelegate()
       OVERRIDE;
   virtual bool DidVersionUpdate(content::BrowserContext* context) OVERRIDE;
+  virtual void PermitExternalProtocolHandler() OVERRIDE;
   virtual scoped_ptr<AppSorting> CreateAppSorting() OVERRIDE;
   virtual bool IsRunningInForcedAppMode() OVERRIDE;
   virtual ApiActivityMonitor* GetApiActivityMonitor(
index e5fd06b..43fefca 100644 (file)
@@ -342,7 +342,7 @@ class ExtensionGCMAppHandlerTest : public testing::Test {
   }
 
   void SignOut() {
-    signin_manager_->SignOut();
+    signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST);
     waiter_.PumpIOLoop();
   }
 
index 074b046..97af6cb 100644 (file)
@@ -712,22 +712,18 @@ void ExtensionInstallPrompt::ShowConfirmation() {
   else
     prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
 
-  if (permissions_.get()) {
-    if (extension_) {
-      const extensions::PermissionsData* permissions_data =
-          extension_->permissions_data();
-      prompt_->SetPermissions(permissions_data->GetPermissionMessageStrings());
-      prompt_->SetPermissionsDetails(
-          permissions_data->GetPermissionMessageDetailsStrings());
-    } else {
-      const extensions::PermissionMessageProvider* message_provider =
-          extensions::PermissionMessageProvider::Get();
-      prompt_->SetPermissions(message_provider->GetWarningMessages(
-          permissions_, Manifest::TYPE_UNKNOWN));
-      prompt_->SetPermissionsDetails(
-          message_provider->GetWarningMessagesDetails(permissions_,
-                                                      Manifest::TYPE_UNKNOWN));
-    }
+  if (permissions_.get() &&
+      (!extension_ ||
+       !extensions::PermissionsData::ShouldSkipPermissionWarnings(
+           extension_->id()))) {
+    Manifest::Type type =
+        extension_ ? extension_->GetType() : Manifest::TYPE_UNKNOWN;
+    const extensions::PermissionMessageProvider* message_provider =
+        extensions::PermissionMessageProvider::Get();
+    prompt_->SetPermissions(
+        message_provider->GetWarningMessages(permissions_, type));
+    prompt_->SetPermissionsDetails(
+        message_provider->GetWarningMessagesDetails(permissions_, type));
   }
 
   switch (prompt_->type()) {
index 57ed542..59dcd6c 100644 (file)
@@ -353,6 +353,10 @@ class ExtensionInstallPrompt
   // Installation failed. This is declared virtual for testing.
   virtual void OnInstallFailure(const extensions::CrxInstallerError& error);
 
+  void set_callback_for_test(const ShowDialogCallback& show_dialog_callback) {
+    show_dialog_callback_ = show_dialog_callback;
+  }
+
  protected:
   friend class extensions::ExtensionWebstorePrivateApiTest;
   friend class WebstoreStartupInstallUnpackFailureTest;
diff --git a/src/chrome/browser/extensions/extension_install_prompt_unittest.cc b/src/chrome/browser/extensions/extension_install_prompt_unittest.cc
new file mode 100644 (file)
index 0000000..347db0f
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/memory/ref_counted.h"
+#include "base/run_loop.h"
+#include "chrome/browser/extensions/extension_install_prompt.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_builder.h"
+#include "extensions/common/permissions/api_permission.h"
+#include "extensions/common/permissions/api_permission_set.h"
+#include "extensions/common/permissions/manifest_permission_set.h"
+#include "extensions/common/permissions/permission_set.h"
+#include "extensions/common/url_pattern_set.h"
+#include "extensions/common/value_builder.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+
+void VerifyPromptPermissionsCallback(
+    const base::Closure& quit_closure,
+    const ExtensionInstallPrompt::ShowParams& params,
+    ExtensionInstallPrompt::Delegate* delegate,
+    scoped_refptr<ExtensionInstallPrompt::Prompt> install_prompt) {
+  ASSERT_TRUE(install_prompt.get());
+  EXPECT_EQ(1u, install_prompt->GetPermissionCount());
+  quit_closure.Run();
+}
+
+TEST(ExtensionInstallPromptUnittest, PromptShowsPermissionWarnings) {
+  content::TestBrowserThreadBundle thread_bundle;
+  APIPermissionSet api_permissions;
+  api_permissions.insert(APIPermission::kTab);
+  scoped_refptr<PermissionSet> permission_set =
+      new PermissionSet(api_permissions,
+                        ManifestPermissionSet(),
+                        URLPatternSet(),
+                        URLPatternSet());
+  scoped_refptr<const Extension> extension =
+      ExtensionBuilder().SetManifest(
+          DictionaryBuilder().Set("name", "foo")
+                             .Set("version", "1.0")
+                             .Set("manifest_version", 2)
+                             .Set("description", "Random Ext")).Build();
+  ExtensionInstallPrompt prompt(NULL /* no web contents in this test */);
+  base::RunLoop run_loop;
+  prompt.set_callback_for_test(base::Bind(&VerifyPromptPermissionsCallback,
+                                          run_loop.QuitClosure()));
+  prompt.ConfirmPermissions(NULL,  // no delegate
+                            extension,
+                            permission_set);
+  run_loop.Run();
+}
+
+}  // namespace extensions
index 0b46225..1f4fc4a 100644 (file)
@@ -154,7 +154,8 @@ class ExternalProviderImplTest : public ExtensionServiceTestBase {
 
 }  // namespace
 
-TEST_F(ExternalProviderImplTest, InAppPayments) {
+// flaky, disabling on branch only
+TEST_F(ExternalProviderImplTest, DISABLED_InAppPayments) {
   InitServiceWithExternalProviders();
 
   scoped_refptr<content::MessageLoopRunner> runner =
index 78334d9..f6f3c0b 100644 (file)
 
 using content::BrowserThread;
 
+// Whether we accept requests for launching external protocols. This is set to
+// false every time an external protocol is requested, and set back to true on
+// each user gesture. This variable should only be accessed from the UI thread.
+static bool g_accept_requests = true;
+
 namespace {
 
 // Functions enabling unit testing. Using a NULL delegate will use the default
@@ -44,13 +49,11 @@ ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker(
 
 ExternalProtocolHandler::BlockState GetBlockStateWithDelegate(
     const std::string& scheme,
-    ExternalProtocolHandler::Delegate* delegate,
-    bool initiated_by_user_gesture) {
+    ExternalProtocolHandler::Delegate* delegate) {
   if (!delegate)
-    return ExternalProtocolHandler::GetBlockState(scheme,
-                                                  initiated_by_user_gesture);
+    return ExternalProtocolHandler::GetBlockState(scheme);
 
-  return delegate->GetBlockState(scheme, initiated_by_user_gesture);
+  return delegate->GetBlockState(scheme);
 }
 
 void RunExternalProtocolDialogWithDelegate(
@@ -200,9 +203,9 @@ void ExternalProtocolHandler::PrepopulateDictionary(
 
 // static
 ExternalProtocolHandler::BlockState ExternalProtocolHandler::GetBlockState(
-    const std::string& scheme,
-    bool initiated_by_user_gesture) {
-  if (!initiated_by_user_gesture)
+    const std::string& scheme) {
+  // If we are being carpet bombed, block the request.
+  if (!g_accept_requests)
     return BLOCK;
 
   if (scheme.length() == 1) {
@@ -249,27 +252,26 @@ void ExternalProtocolHandler::SetBlockState(const std::string& scheme,
 }
 
 // static
-void ExternalProtocolHandler::LaunchUrlWithDelegate(
-    const GURL& url,
-    int render_process_host_id,
-    int tab_contents_id,
-    Delegate* delegate,
-    bool initiated_by_user_gesture) {
+void ExternalProtocolHandler::LaunchUrlWithDelegate(const GURL& url,
+                                                    int render_process_host_id,
+                                                    int tab_contents_id,
+                                                    Delegate* delegate) {
   DCHECK(base::MessageLoopForUI::IsCurrent());
 
   // Escape the input scheme to be sure that the command does not
   // have parameters unexpected by the external program.
   std::string escaped_url_string = net::EscapeExternalHandlerValue(url.spec());
   GURL escaped_url(escaped_url_string);
-  BlockState block_state = GetBlockStateWithDelegate(escaped_url.scheme(),
-                                                     delegate,
-                                                     initiated_by_user_gesture);
+  BlockState block_state =
+      GetBlockStateWithDelegate(escaped_url.scheme(), delegate);
   if (block_state == BLOCK) {
     if (delegate)
       delegate->BlockRequest();
     return;
   }
 
+  g_accept_requests = false;
+
   // The worker creates tasks with references to itself and puts them into
   // message loops. When no tasks are left it will delete the observer and
   // eventually be deleted itself.
@@ -306,3 +308,9 @@ void ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(
 void ExternalProtocolHandler::RegisterPrefs(PrefRegistrySimple* registry) {
   registry->RegisterDictionaryPref(prefs::kExcludedSchemes);
 }
+
+// static
+void ExternalProtocolHandler::PermitLaunchUrl() {
+  DCHECK(base::MessageLoopForUI::IsCurrent());
+  g_accept_requests = true;
+}
index 6780d10..934ce31 100644 (file)
@@ -30,8 +30,7 @@ class ExternalProtocolHandler {
     virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker(
         ShellIntegration::DefaultWebClientObserver* observer,
         const std::string& protocol) = 0;
-    virtual BlockState GetBlockState(const std::string& scheme,
-                                     bool initiated_by_user_gesture) = 0;
+    virtual BlockState GetBlockState(const std::string& scheme) = 0;
     virtual void BlockRequest() = 0;
     virtual void RunExternalProtocolDialog(const GURL& url,
                                            int render_process_host_id,
@@ -42,17 +41,30 @@ class ExternalProtocolHandler {
   };
 
   // Returns whether we should block a given scheme.
-  static BlockState GetBlockState(const std::string& scheme,
-                                  bool initiated_by_user_gesture);
+  static BlockState GetBlockState(const std::string& scheme);
 
   // Sets whether we should block a given scheme.
   static void SetBlockState(const std::string& scheme, BlockState state);
 
+  // Checks to see if the protocol is allowed, if it is whitelisted,
+  // the application associated with the protocol is launched on the io thread,
+  // if it is blacklisted, returns silently. Otherwise, an
+  // ExternalProtocolDialog is created asking the user. If the user accepts,
+  // LaunchUrlWithoutSecurityCheck is called on the io thread and the
+  // application is launched.
+  // Must run on the UI thread.
+  static void LaunchUrl(const GURL& url,
+                        int render_process_host_id,
+                        int tab_contents_id) {
+    LaunchUrlWithDelegate(url, render_process_host_id, tab_contents_id, NULL);
+  }
+
   // Version of LaunchUrl allowing use of a delegate to facilitate unit
   // testing.
-  static void LaunchUrlWithDelegate(const GURL& url, int render_process_host_id,
-                                    int tab_contents_id, Delegate* delegate,
-                                    bool initiated_by_user_gesture);
+  static void LaunchUrlWithDelegate(const GURL& url,
+                                    int render_process_host_id,
+                                    int tab_contents_id,
+                                    Delegate* delegate);
 
   // Creates and runs a External Protocol dialog box.
   // |url| - The url of the request.
@@ -87,6 +99,12 @@ class ExternalProtocolHandler {
   // preferences for them do not already exist.
   static void PrepopulateDictionary(base::DictionaryValue* win_pref);
 
+  // Allows LaunchUrl to proceed with launching an external protocol handler.
+  // This is typically triggered by a user gesture, but is also called for
+  // each extension API function. Note that each call to LaunchUrl resets
+  // the state to false (not allowed).
+  static void PermitLaunchUrl();
+
  private:
   DISALLOW_COPY_AND_ASSIGN(ExternalProtocolHandler);
 };
index 0b27465..cce6ba2 100644 (file)
@@ -51,8 +51,9 @@ class FakeExternalProtocolHandlerDelegate
   }
 
   virtual ExternalProtocolHandler::BlockState GetBlockState(
-      const std::string& scheme,
-      bool initiated_by_user_gesture) OVERRIDE { return block_state_; }
+      const std::string& scheme) OVERRIDE {
+    return block_state_;
+  }
 
   virtual void BlockRequest() OVERRIDE {
     ASSERT_TRUE(block_state_ == ExternalProtocolHandler::BLOCK ||
@@ -108,6 +109,11 @@ class ExternalProtocolHandlerTest : public testing::Test {
     file_thread_.Start();
   }
 
+  virtual void TearDown() {
+    // Ensure that g_accept_requests gets set back to true after test execution.
+    ExternalProtocolHandler::PermitLaunchUrl();
+  }
+
   void DoTest(ExternalProtocolHandler::BlockState block_state,
               ShellIntegration::DefaultWebClientState os_state,
               bool should_prompt, bool should_launch, bool should_block) {
@@ -118,7 +124,7 @@ class ExternalProtocolHandlerTest : public testing::Test {
 
     delegate_.set_block_state(block_state);
     delegate_.set_os_state(os_state);
-    ExternalProtocolHandler::LaunchUrlWithDelegate(url, 0, 0, &delegate_, true);
+    ExternalProtocolHandler::LaunchUrlWithDelegate(url, 0, 0, &delegate_);
     if (block_state != ExternalProtocolHandler::BLOCK)
       base::MessageLoop::current()->Run();
 
diff --git a/src/chrome/browser/external_protocol/external_protocol_observer.cc b/src/chrome/browser/external_protocol/external_protocol_observer.cc
new file mode 100644 (file)
index 0000000..2d3f10d
--- /dev/null
@@ -0,0 +1,22 @@
+// 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 "chrome/browser/external_protocol/external_protocol_observer.h"
+
+#include "chrome/browser/external_protocol/external_protocol_handler.h"
+
+using content::WebContents;
+
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(ExternalProtocolObserver);
+
+ExternalProtocolObserver::ExternalProtocolObserver(WebContents* web_contents)
+    : content::WebContentsObserver(web_contents) {
+}
+
+ExternalProtocolObserver::~ExternalProtocolObserver() {
+}
+
+void ExternalProtocolObserver::DidGetUserGesture() {
+  ExternalProtocolHandler::PermitLaunchUrl();
+}
diff --git a/src/chrome/browser/external_protocol/external_protocol_observer.h b/src/chrome/browser/external_protocol/external_protocol_observer.h
new file mode 100644 (file)
index 0000000..c4b7b26
--- /dev/null
@@ -0,0 +1,29 @@
+// 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 CHROME_BROWSER_EXTERNAL_PROTOCOL_EXTERNAL_PROTOCOL_OBSERVER_H_
+#define CHROME_BROWSER_EXTERNAL_PROTOCOL_EXTERNAL_PROTOCOL_OBSERVER_H_
+
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+// ExternalProtocolObserver is responsible for handling messages from
+// WebContents relating to external protocols.
+class ExternalProtocolObserver
+    : public content::WebContentsObserver,
+      public content::WebContentsUserData<ExternalProtocolObserver> {
+ public:
+  virtual ~ExternalProtocolObserver();
+
+  // content::WebContentsObserver overrides.
+  virtual void DidGetUserGesture() OVERRIDE;
+
+ private:
+  explicit ExternalProtocolObserver(content::WebContents* web_contents);
+  friend class content::WebContentsUserData<ExternalProtocolObserver>;
+
+  DISALLOW_COPY_AND_ASSIGN(ExternalProtocolObserver);
+};
+
+#endif  // CHROME_BROWSER_EXTERNAL_PROTOCOL_EXTERNAL_PROTOCOL_OBSERVER_H_
index c30c6aa..bc8a328 100644 (file)
@@ -996,14 +996,14 @@ bool HistoryBackend::GetURL(const GURL& url, history::URLRow* url_row) {
   return false;
 }
 
-HistoryBackend::QueryURLResult HistoryBackend::QueryURL(const GURL& url,
-                                                        bool want_visits) {
-  QueryURLResult result;
-  result.success = db_ && db_->GetRowForURL(url, &result.row);
+void HistoryBackend::QueryURL(const GURL& url,
+                              bool want_visits,
+                              QueryURLResult* result) {
+  DCHECK(result);
+  result->success = db_ && db_->GetRowForURL(url, &result->row);
   // Optionally query the visits.
-  if (result.success && want_visits)
-    db_->GetVisitsForURL(result.row.id(), &result.visits);
-  return result;
+  if (result->success && want_visits)
+    db_->GetVisitsForURL(result->row.id(), &result->visits);
 }
 
 TypedUrlSyncableService* HistoryBackend::GetTypedUrlSyncableService() const {
index 8ed3508..82552eb 100644 (file)
@@ -159,7 +159,9 @@ class HistoryBackend : public base::RefCountedThreadSafe<HistoryBackend>,
   void IterateURLs(
       const scoped_refptr<visitedlink::VisitedLinkDelegate::URLEnumerator>&
           enumerator);
-  QueryURLResult QueryURL(const GURL& url, bool want_visits);
+  void QueryURL(const GURL& url,
+                bool want_visits,
+                QueryURLResult* query_url_result);
   void QueryHistory(scoped_refptr<QueryHistoryRequest> request,
                     const base::string16& text_query,
                     const QueryOptions& options);
index 405b8e8..80803bb 100644 (file)
@@ -82,8 +82,8 @@ void RunWithFaviconResult(
 }
 
 void RunWithQueryURLResult(const HistoryService::QueryURLCallback& callback,
-                           const HistoryBackend::QueryURLResult& result) {
-  callback.Run(result.success, result.row, result.visits);
+                           const HistoryBackend::QueryURLResult* result) {
+  callback.Run(result->success, result->row, result->visits);
 }
 
 // Extract history::URLRows into GURLs for VisitedLinkMaster.
@@ -708,12 +708,18 @@ base::CancelableTaskTracker::TaskId HistoryService::QueryURL(
     const QueryURLCallback& callback,
     base::CancelableTaskTracker* tracker) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  return PostTaskAndReplyWithResult(
+  HistoryBackend::QueryURLResult* query_url_result =
+      new HistoryBackend::QueryURLResult();
+  return tracker->PostTaskAndReply(
       thread_->message_loop_proxy().get(),
       FROM_HERE,
+      base::Bind(&HistoryBackend::QueryURL,
+                 history_backend_.get(),
+                 url,
+                 want_visits,
+                 base::Unretained(query_url_result)),
       base::Bind(
-          &HistoryBackend::QueryURL, history_backend_.get(), url, want_visits),
-      base::Bind(&RunWithQueryURLResult, callback));
+          &RunWithQueryURLResult, callback, base::Owned(query_url_result)));
 }
 
 // Downloads -------------------------------------------------------------------
index e7f851e..01c3c00 100644 (file)
 #endif
 
 #if defined(ENABLE_MDNS)
-#include "chrome/browser/local_discovery/service_discovery_client_mdns.h"
 #include "chrome/browser/local_discovery/service_discovery_client_utility.h"
 #endif  // ENABLE_MDNS
 
 namespace {
 
 #if defined(OS_WIN)
-
-bool g_is_firewall_ready = false;
-
 void ReportFirewallStats() {
   base::FilePath exe_path;
   if (!PathService::Get(base::FILE_EXE, &exe_path))
@@ -40,9 +36,9 @@ void ReportFirewallStats() {
                                          exe_path);
   if (!manager)
     return;
-  g_is_firewall_ready = manager->CanUseLocalPorts();
+  bool is_ready = manager->CanUseLocalPorts();
   UMA_HISTOGRAM_TIMES("LocalDiscovery.FirewallAccessTime", timer.Elapsed());
-  UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", g_is_firewall_ready);
+  UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", is_ready);
 }
 #endif  // OS_WIN
 
@@ -84,13 +80,11 @@ scoped_refptr<ServiceDiscoverySharedClient>
   static bool reported =
       BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
                               base::Bind(&ReportFirewallStats));
-  // TODO(vitalybuka): Switch to |ServiceDiscoveryClientMdns| after we find what
-  // to do with firewall for user-level installs. crbug.com/366408
-  if (!g_is_firewall_ready)
-    return new ServiceDiscoveryClientUtility();
 #endif  // OS_WIN
 
-  return new ServiceDiscoveryClientMdns();
+  // TODO(vitalybuka): Switch to |ServiceDiscoveryClientMdns| after we find what
+  // to do with firewall for user-level installs. crbug.com/366408
+  return new ServiceDiscoveryClientUtility();
 #endif // OS_MACOSX
 }
 
index 05d32ec..56574a6 100644 (file)
@@ -583,20 +583,52 @@ void MediaCaptureDevicesDispatcher::
         const content::MediaStreamRequest& request,
         const content::MediaResponseCallback& callback,
         const extensions::Extension* extension) {
-  content::MediaStreamDevices devices;
-  Profile* profile =
-      Profile::FromBrowserContext(web_contents->GetBrowserContext());
 
-  if (request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE &&
+  // TODO(vrk): This code is largely duplicated in
+  // MediaStreamDevicesController::Accept(). Move this code into a shared method
+  // between the two classes.
+
+  bool audio_allowed =
+      request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE &&
       extension->permissions_data()->HasAPIPermission(
-          extensions::APIPermission::kAudioCapture)) {
-    GetDefaultDevicesForProfile(profile, true, false, &devices);
+          extensions::APIPermission::kAudioCapture);
+  bool video_allowed =
+      request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE &&
+      extension->permissions_data()->HasAPIPermission(
+          extensions::APIPermission::kVideoCapture);
+
+  bool get_default_audio_device = audio_allowed;
+  bool get_default_video_device = video_allowed;
+
+  content::MediaStreamDevices devices;
+
+  // Get the exact audio or video device if an id is specified.
+  if (audio_allowed && !request.requested_audio_device_id.empty()) {
+    const content::MediaStreamDevice* audio_device =
+        GetRequestedAudioDevice(request.requested_audio_device_id);
+    if (audio_device) {
+      devices.push_back(*audio_device);
+      get_default_audio_device = false;
+    }
+  }
+  if (video_allowed && !request.requested_video_device_id.empty()) {
+    const content::MediaStreamDevice* video_device =
+        GetRequestedVideoDevice(request.requested_video_device_id);
+    if (video_device) {
+      devices.push_back(*video_device);
+      get_default_video_device = false;
+    }
   }
 
-  if (request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE &&
-      extension->permissions_data()->HasAPIPermission(
-          extensions::APIPermission::kVideoCapture)) {
-    GetDefaultDevicesForProfile(profile, false, true, &devices);
+  // If either or both audio and video devices were requested but not
+  // specified by id, get the default devices.
+  if (get_default_audio_device || get_default_video_device) {
+    Profile* profile =
+        Profile::FromBrowserContext(web_contents->GetBrowserContext());
+    GetDefaultDevicesForProfile(profile,
+                                get_default_audio_device,
+                                get_default_video_device,
+                                &devices);
   }
 
   scoped_ptr<content::MediaStreamUI> ui;
index 3cb55cc..f22dea7 100644 (file)
@@ -23,6 +23,7 @@
 #include "chrome/common/pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_widget_host_view.h"
 #include "content/public/common/media_stream_request.h"
 #include "extensions/common/constants.h"
 #include "grit/generated_resources.h"
@@ -649,7 +650,7 @@ bool MediaStreamDevicesController::IsDeviceAudioCaptureRequestedAndAllowed()
     const {
   MediaStreamTypeSettingsMap::const_iterator it =
       request_permissions_.find(content::MEDIA_DEVICE_AUDIO_CAPTURE);
-  return (it != request_permissions_.end() &&
+  return (it != request_permissions_.end() && IsCaptureDeviceRequestAllowed() &&
           it->second.permission == MEDIA_ALLOWED);
 }
 
@@ -657,6 +658,15 @@ bool MediaStreamDevicesController::IsDeviceVideoCaptureRequestedAndAllowed()
     const {
   MediaStreamTypeSettingsMap::const_iterator it =
       request_permissions_.find(content::MEDIA_DEVICE_VIDEO_CAPTURE);
-  return (it != request_permissions_.end() &&
+  return (it != request_permissions_.end() && IsCaptureDeviceRequestAllowed() &&
           it->second.permission == MEDIA_ALLOWED);
 }
+
+bool MediaStreamDevicesController::IsCaptureDeviceRequestAllowed() const {
+#if defined(OS_ANDROID)
+  // Don't approve device requests if the tab was hidden.
+  // TODO(qinmin): Add a test for this. http://crbug.com/396869.
+  return web_contents_->GetRenderWidgetHostView()->IsShowing();
+#endif
+  return true;
+}
index c5325df..01e6849 100644 (file)
@@ -138,6 +138,10 @@ class MediaStreamDevicesController : public PermissionBubbleRequest {
   bool IsDeviceAudioCaptureRequestedAndAllowed() const;
   bool IsDeviceVideoCaptureRequestedAndAllowed() const;
 
+  // Returns true if media capture device is allowed to be used. This could
+  // return false when tab goes to background.
+  bool IsCaptureDeviceRequestAllowed() const;
+
   content::WebContents* web_contents_;
 
   // The owner of this class needs to make sure it does not outlive the profile.
index 2a180d2..f9c5f4f 100644 (file)
@@ -165,7 +165,7 @@ void ChromeMetricsServiceClient::SetClientID(const std::string& client_id) {
 }
 
 bool ChromeMetricsServiceClient::IsOffTheRecordSessionActive() {
-  return !chrome::IsOffTheRecordSessionActive();
+  return chrome::IsOffTheRecordSessionActive();
 }
 
 std::string ChromeMetricsServiceClient::GetApplicationLocale() {
index 2484160..50bbc75 100644 (file)
@@ -59,6 +59,29 @@ bool ShouldUseJavaScriptSettingForPlugin(const WebPluginInfo& plugin) {
   return false;
 }
 
+#if defined(ENABLE_PEPPER_CDMS)
+
+enum PluginAvailabilityStatusForUMA {
+  PLUGIN_NOT_REGISTERED,
+  PLUGIN_AVAILABLE,
+  PLUGIN_DISABLED,
+  PLUGIN_AVAILABILITY_STATUS_MAX
+};
+
+static void SendPluginAvailabilityUMA(const std::string& mime_type,
+                                      PluginAvailabilityStatusForUMA status) {
+#if defined(WIDEVINE_CDM_AVAILABLE)
+  // Only report results for Widevine CDM.
+  if (mime_type != kWidevineCdmPluginMimeType)
+    return;
+
+  UMA_HISTOGRAM_ENUMERATION("Plugin.AvailabilityStatus.WidevineCdm",
+                            status, PLUGIN_AVAILABILITY_STATUS_MAX);
+#endif  // defined(WIDEVINE_CDM_AVAILABLE)
+}
+
+#endif  // defined(ENABLE_PEPPER_CDMS)
+
 }  // namespace
 
 PluginInfoMessageFilter::Context::Context(int render_process_id,
@@ -94,9 +117,11 @@ bool PluginInfoMessageFilter::OnMessageReceived(const IPC::Message& message) {
   IPC_BEGIN_MESSAGE_MAP(PluginInfoMessageFilter, message)
     IPC_MESSAGE_HANDLER_DELAY_REPLY(ChromeViewHostMsg_GetPluginInfo,
                                     OnGetPluginInfo)
+#if defined(ENABLE_PEPPER_CDMS)
     IPC_MESSAGE_HANDLER(
-        ChromeViewHostMsg_IsInternalPluginRegisteredForMimeType,
-        OnIsInternalPluginRegisteredForMimeType)
+        ChromeViewHostMsg_IsInternalPluginAvailableForMimeType,
+        OnIsInternalPluginAvailableForMimeType)
+#endif
     IPC_MESSAGE_UNHANDLED(return false)
   IPC_END_MESSAGE_MAP()
   return true;
@@ -164,29 +189,43 @@ void PluginInfoMessageFilter::PluginsLoaded(
   Send(reply_msg);
 }
 
-void PluginInfoMessageFilter::OnIsInternalPluginRegisteredForMimeType(
+#if defined(ENABLE_PEPPER_CDMS)
+void PluginInfoMessageFilter::OnIsInternalPluginAvailableForMimeType(
     const std::string& mime_type,
-    bool* is_registered,
+    bool* is_available,
     std::vector<base::string16>* additional_param_names,
     std::vector<base::string16>* additional_param_values) {
   std::vector<WebPluginInfo> plugins;
   PluginService::GetInstance()->GetInternalPlugins(&plugins);
+
+  bool is_plugin_disabled = false;
   for (size_t i = 0; i < plugins.size(); ++i) {
+    const WebPluginInfo& plugin = plugins[i];
     const std::vector<content::WebPluginMimeType>& mime_types =
-        plugins[i].mime_types;
+        plugin.mime_types;
     for (size_t j = 0; j < mime_types.size(); ++j) {
       if (mime_types[j].mime_type == mime_type) {
-        *is_registered = true;
+        if (!context_.IsPluginEnabled(plugin)) {
+          is_plugin_disabled = true;
+          break;
+        }
+
+        *is_available = true;
         *additional_param_names = mime_types[j].additional_param_names;
         *additional_param_values = mime_types[j].additional_param_values;
+        SendPluginAvailabilityUMA(mime_type, PLUGIN_AVAILABLE);
         return;
       }
     }
   }
 
-  *is_registered = false;
+  *is_available = false;
+  SendPluginAvailabilityUMA(
+      mime_type, is_plugin_disabled ? PLUGIN_DISABLED : PLUGIN_NOT_REGISTERED);
 }
 
+#endif // defined(ENABLE_PEPPER_CDMS)
+
 void PluginInfoMessageFilter::Context::DecidePluginStatus(
     const GetPluginInfo_Params& params,
     const WebPluginInfo& plugin,
@@ -394,3 +433,7 @@ void PluginInfoMessageFilter::Context::MaybeGrantAccess(
   }
 }
 
+bool PluginInfoMessageFilter::Context::IsPluginEnabled(
+    const content::WebPluginInfo& plugin) const {
+  return plugin_prefs_->IsPluginEnabled(plugin);
+}
index eb8dcb9..bcedfc3 100644 (file)
@@ -63,6 +63,7 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter {
                                  bool* is_managed) const;
     void MaybeGrantAccess(const ChromeViewHostMsg_GetPluginInfo_Status& status,
                           const base::FilePath& path) const;
+    bool IsPluginEnabled(const content::WebPluginInfo& plugin) const;
 
    private:
     int render_process_id_;
@@ -99,17 +100,20 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter {
                      IPC::Message* reply_msg,
                      const std::vector<content::WebPluginInfo>& plugins);
 
-  // Returns whether any internal plugin supporting |mime_type| is registered.
-  // Does not determine whether the plugin can actually be instantiated
-  // (e.g. whether it is allowed or has all its dependencies).
-  // When the returned *|is_registered| is true, |additional_param_names| and
+#if defined(ENABLE_PEPPER_CDMS)
+  // Returns whether any internal plugin supporting |mime_type| is registered
+  // and enabled. Does not determine whether the plugin can actually be
+  // instantiated (e.g. whether it has all its dependencies).
+  // When the returned *|is_available| is true, |additional_param_names| and
   // |additional_param_values| contain the name-value pairs, if any, specified
-  // for the *first* plugin found that is registered for |mime_type|.
-  void OnIsInternalPluginRegisteredForMimeType(
+  // for the *first* non-disabled plugin found that is registered for
+  // |mime_type|.
+  void OnIsInternalPluginAvailableForMimeType(
       const std::string& mime_type,
-      bool* is_registered,
+      bool* is_available,
       std::vector<base::string16>* additional_param_names,
       std::vector<base::string16>* additional_param_values);
+#endif
 
   Context context_;
 
index b6deb41..adcaa80 100644 (file)
@@ -214,7 +214,7 @@ class ComponentCloudPolicyTest : public ExtensionBrowserTest {
     SigninManager* signin_manager =
         SigninManagerFactory::GetForProfile(browser()->profile());
     ASSERT_TRUE(signin_manager);
-    signin_manager->SignOut();
+    signin_manager->SignOut(signin_metrics::SIGNOUT_TEST);
   }
 #endif
 
index 70b6ee9..51db158 100644 (file)
@@ -87,7 +87,7 @@ class SigninManagerFake : public FakeSigninManager {
   void ForceSignOut() {
     // Allow signing out now.
     prohibit_signout_ = false;
-    SignOut();
+    SignOut(signin_metrics::SIGNOUT_TEST);
   }
 
   static KeyedService* Build(content::BrowserContext* profile) {
@@ -569,7 +569,8 @@ TEST_F(UserPolicySigninServiceSignedInTest, SignOutAfterInit) {
   EXPECT_CALL(*mock_store_, Clear());
 
   // Now sign out.
-  SigninManagerFactory::GetForProfile(profile_.get())->SignOut();
+  SigninManagerFactory::GetForProfile(profile_.get())->SignOut(
+      signin_metrics::SIGNOUT_TEST);
 
   // UserCloudPolicyManager should be shut down.
   ASSERT_FALSE(manager_->core()->service());
diff --git a/src/chrome/browser/prefs/DEPS b/src/chrome/browser/prefs/DEPS
new file mode 100644 (file)
index 0000000..10b39f7
--- /dev/null
@@ -0,0 +1,3 @@
+include_rules = [
+  "+sync/internal_api/public/base/model_type.h",
+]
index 25b9dc5..17f77a4 100644 (file)
@@ -35,6 +35,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/default_search_manager.h"
 #include "chrome/browser/search_engines/default_search_pref_migration.h"
+#include "chrome/browser/sync/glue/sync_start_util.h"
 #include "chrome/browser/ui/profile_error_dialog.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/pref_names.h"
@@ -46,6 +47,7 @@
 #include "grit/browser_resources.h"
 #include "grit/chromium_strings.h"
 #include "grit/generated_resources.h"
+#include "sync/internal_api/public/base/model_type.h"
 #include "ui/base/resource/resource_bundle.h"
 
 #if defined(ENABLE_CONFIGURATION_POLICY)
@@ -442,16 +444,28 @@ scoped_ptr<PrefServiceSyncable> CreateProfilePrefs(
     const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry,
     bool async) {
   TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs");
+
+  // A StartSyncFlare used to kick sync early in case of a reset event. This is
+  // done since sync may bring back the user's server value post-reset which
+  // could potentially cause a "settings flash" between the factory default and
+  // the re-instantiated server value. Starting sync ASAP minimizes the window
+  // before the server value is re-instantiated (this window can otherwise be
+  // as long as 10 seconds by default).
+  const base::Closure start_sync_flare_for_prefs =
+      base::Bind(sync_start_util::GetFlareForSyncableService(profile_path),
+                 syncer::PREFERENCES);
+
   PrefServiceSyncableFactory factory;
-  PrepareFactory(
-      &factory,
-      policy_service,
-      supervised_user_settings,
-      scoped_refptr<PersistentPrefStore>(
-          CreateProfilePrefStoreManager(profile_path)->CreateProfilePrefStore(
-              pref_io_task_runner, validation_delegate)),
-      extension_prefs,
-      async);
+  PrepareFactory(&factory,
+                 policy_service,
+                 supervised_user_settings,
+                 scoped_refptr<PersistentPrefStore>(
+                     CreateProfilePrefStoreManager(profile_path)
+                         ->CreateProfilePrefStore(pref_io_task_runner,
+                                                  start_sync_flare_for_prefs,
+                                                  validation_delegate)),
+                 extension_prefs,
+                 async);
   scoped_ptr<PrefServiceSyncable> pref_service =
       factory.CreateSyncable(pref_registry.get());
 
index 8bdf994..9c2a62e 100644 (file)
 PrefHashFilter::PrefHashFilter(
     scoped_ptr<PrefHashStore> pref_hash_store,
     const std::vector<TrackedPreferenceMetadata>& tracked_preferences,
+    const base::Closure& on_reset_on_load,
     TrackedPreferenceValidationDelegate* delegate,
     size_t reporting_ids_count,
     bool report_super_mac_validity)
     : pref_hash_store_(pref_hash_store.Pass()),
+      on_reset_on_load_(on_reset_on_load),
       report_super_mac_validity_(report_super_mac_validity) {
   DCHECK(pref_hash_store_);
   DCHECK_GE(reporting_ids_count, tracked_preferences.size());
@@ -185,6 +187,9 @@ void PrefHashFilter::FinalizeFilterOnLoad(
                              new base::StringValue(base::Int64ToString(
                                  base::Time::Now().ToInternalValue())));
     FilterUpdate(prefs::kPreferenceResetTime);
+
+    if (!on_reset_on_load_.is_null())
+      on_reset_on_load_.Run();
   }
 
   // TODO(gab): Remove this histogram by Feb 21 2014; after sufficient timing
index f394557..f61222b 100644 (file)
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/basictypes.h"
+#include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/containers/scoped_ptr_hash_map.h"
 #include "base/memory/scoped_ptr.h"
@@ -60,6 +61,8 @@ class PrefHashFilter : public InterceptablePrefFilter {
   // Constructs a PrefHashFilter tracking the specified |tracked_preferences|
   // using |pref_hash_store| to check/store hashes. An optional |delegate| is
   // notified of the status of each preference as it is checked.
+  // If |on_reset_on_load| is provided, it will be invoked if a reset occurs in
+  // FilterOnLoad.
   // |reporting_ids_count| is the count of all possible IDs (possibly greater
   // than |tracked_preferences.size()|). If |report_super_mac_validity| is true,
   // the state of the super MAC will be reported via UMA during
@@ -67,6 +70,7 @@ class PrefHashFilter : public InterceptablePrefFilter {
   PrefHashFilter(
       scoped_ptr<PrefHashStore> pref_hash_store,
       const std::vector<TrackedPreferenceMetadata>& tracked_preferences,
+      const base::Closure& on_reset_on_load,
       TrackedPreferenceValidationDelegate* delegate,
       size_t reporting_ids_count,
       bool report_super_mac_validity);
@@ -116,6 +120,9 @@ class PrefHashFilter : public InterceptablePrefFilter {
 
   scoped_ptr<PrefHashStore> pref_hash_store_;
 
+  // Invoked if a reset occurs in a call to FilterOnLoad.
+  const base::Closure on_reset_on_load_;
+
   TrackedPreferencesMap tracked_paths_;
 
   // The set of all paths whose value has changed since the last call to
index 3b5e821..429cd5c 100644 (file)
@@ -348,7 +348,8 @@ class PrefHashFilterTest
  public:
   PrefHashFilterTest() : mock_pref_hash_store_(NULL),
                          pref_store_contents_(new base::DictionaryValue),
-                         last_filter_on_load_modified_prefs_(false) {}
+                         last_filter_on_load_modified_prefs_(false),
+                         reset_recorded_(false) {}
 
   virtual void SetUp() OVERRIDE {
     // Construct a PrefHashFilter and MockPrefHashStore for the test.
@@ -364,16 +365,21 @@ class PrefHashFilterTest
     scoped_ptr<MockPrefHashStore> temp_mock_pref_hash_store(
         new MockPrefHashStore);
     mock_pref_hash_store_ = temp_mock_pref_hash_store.get();
-    pref_hash_filter_.reset(
-        new PrefHashFilter(temp_mock_pref_hash_store.PassAs<PrefHashStore>(),
-                           configuration,
-                           &mock_validation_delegate_,
-                           arraysize(kTestTrackedPrefs),
-                           true));
+    pref_hash_filter_.reset(new PrefHashFilter(
+        temp_mock_pref_hash_store.PassAs<PrefHashStore>(),
+        configuration,
+        base::Bind(&PrefHashFilterTest::RecordReset, base::Unretained(this)),
+        &mock_validation_delegate_,
+        arraysize(kTestTrackedPrefs),
+        true));
   }
 
-  bool RecordedReset() {
-    return pref_store_contents_->Get(prefs::kPreferenceResetTime, NULL);
+  // Verifies whether a reset was reported by the PrefHashFiler. Also verifies
+  // that kPreferenceResetTime was set (or not) accordingly.
+  void VerifyRecordedReset(bool reset_expected) {
+    EXPECT_EQ(reset_expected, reset_recorded_);
+    EXPECT_EQ(reset_expected,
+              pref_store_contents_->Get(prefs::kPreferenceResetTime, NULL));
   }
 
   // Calls FilterOnLoad() on |pref_hash_Filter_|. |pref_store_contents_| is
@@ -404,6 +410,15 @@ class PrefHashFilterTest
     EXPECT_EQ(expected_schedule_write, schedule_write);
   }
 
+  void RecordReset() {
+    // As-is |reset_recorded_| is only designed to remember a single reset, make
+    // sure none was previously recorded.
+    EXPECT_FALSE(reset_recorded_);
+    reset_recorded_ = true;
+  }
+
+  bool reset_recorded_;
+
   DISALLOW_COPY_AND_ASSIGN(PrefHashFilterTest);
 };
 
@@ -421,7 +436,7 @@ TEST_P(PrefHashFilterTest, EmptyAndUnchanged) {
                         kTestTrackedPrefs[i].name).first);
   }
   ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed());
-  ASSERT_FALSE(RecordedReset());
+  VerifyRecordedReset(false);
 
   // Delegate saw all paths, and all unchanged.
   ASSERT_EQ(arraysize(kTestTrackedPrefs),
@@ -450,7 +465,7 @@ TEST_P(PrefHashFilterTest, FilterTrackedPrefUpdate) {
   ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, stored_value.second);
 
   ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed());
-  ASSERT_FALSE(RecordedReset());
+  VerifyRecordedReset(false);
 }
 
 TEST_P(PrefHashFilterTest, FilterSplitPrefUpdate) {
@@ -474,7 +489,7 @@ TEST_P(PrefHashFilterTest, FilterSplitPrefUpdate) {
   ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, stored_value.second);
 
   ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed());
-  ASSERT_FALSE(RecordedReset());
+  VerifyRecordedReset(false);
 }
 
 TEST_P(PrefHashFilterTest, FilterUntrackedPrefUpdate) {
@@ -644,7 +659,7 @@ TEST_P(PrefHashFilterTest, InitialValueUnknown) {
     ASSERT_FALSE(pref_store_contents_->Get(kSplitPref, NULL));
     ASSERT_EQ(NULL, stored_split_value.first);
 
-    ASSERT_TRUE(RecordedReset());
+    VerifyRecordedReset(true);
   } else {
     // Otherwise the values should have remained intact and the hashes should
     // have been updated to match them.
@@ -658,7 +673,7 @@ TEST_P(PrefHashFilterTest, InitialValueUnknown) {
     ASSERT_EQ(dict_value, split_value_in_store);
     ASSERT_EQ(dict_value, stored_split_value.first);
 
-    ASSERT_FALSE(RecordedReset());
+    VerifyRecordedReset(false);
   }
 }
 
@@ -771,7 +786,7 @@ TEST_P(PrefHashFilterTest, InitialValueChanged) {
     ASSERT_TRUE(dict_value->HasKey("d"));
     ASSERT_EQ(dict_value, stored_split_value.first);
 
-    ASSERT_TRUE(RecordedReset());
+    VerifyRecordedReset(true);
   } else {
     // Otherwise the value should have remained intact and the hash should have
     // been updated to match it.
@@ -790,7 +805,7 @@ TEST_P(PrefHashFilterTest, InitialValueChanged) {
     ASSERT_TRUE(dict_value->HasKey("d"));
     ASSERT_EQ(dict_value, stored_split_value.first);
 
-    ASSERT_FALSE(RecordedReset());
+    VerifyRecordedReset(false);
   }
 }
 
@@ -873,7 +888,7 @@ TEST_P(PrefHashFilterTest, InitialValueMigrated) {
     ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref, NULL));
     ASSERT_EQ(NULL, stored_atomic_value.first);
 
-    ASSERT_TRUE(RecordedReset());
+    VerifyRecordedReset(true);
   } else {
     // Otherwise the value should have remained intact and the hash should have
     // been updated to match it.
@@ -882,7 +897,7 @@ TEST_P(PrefHashFilterTest, InitialValueMigrated) {
     ASSERT_EQ(list_value, atomic_value_in_store);
     ASSERT_EQ(list_value, stored_atomic_value.first);
 
-    ASSERT_FALSE(RecordedReset());
+    VerifyRecordedReset(false);
   }
 }
 
@@ -942,7 +957,7 @@ TEST_P(PrefHashFilterTest, InitialValueUnchangedLegacyId) {
   ASSERT_EQ(dict_value, split_value_in_store);
   ASSERT_EQ(dict_value, stored_split_value.first);
 
-  ASSERT_FALSE(RecordedReset());
+  VerifyRecordedReset(false);
 }
 
 TEST_P(PrefHashFilterTest, DontResetReportOnly) {
@@ -1005,7 +1020,7 @@ TEST_P(PrefHashFilterTest, DontResetReportOnly) {
     ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kAtomicPref).first);
     ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kAtomicPref2).first);
 
-    ASSERT_TRUE(RecordedReset());
+    VerifyRecordedReset(true);
   } else {
     const base::Value* value_in_store;
     const base::Value* value_in_store2;
@@ -1018,7 +1033,7 @@ TEST_P(PrefHashFilterTest, DontResetReportOnly) {
     ASSERT_EQ(int_value2,
               mock_pref_hash_store_->stored_value(kAtomicPref2).first);
 
-    ASSERT_FALSE(RecordedReset());
+    VerifyRecordedReset(false);
   }
 }
 
index f4264b7..f913d9a 100644 (file)
@@ -5,6 +5,7 @@
 #include "chrome/browser/prefs/profile_pref_store_manager.h"
 
 #include "base/bind.h"
+#include "base/callback.h"
 #include "base/file_util.h"
 #include "base/json/json_file_value_serializer.h"
 #include "base/logging.h"
@@ -81,6 +82,7 @@ void ProfilePrefStoreManager::ClearResetTime(PrefService* pref_service) {
 
 PersistentPrefStore* ProfilePrefStoreManager::CreateProfilePrefStore(
     const scoped_refptr<base::SequencedTaskRunner>& io_task_runner,
+    const base::Closure& on_reset_on_load,
     TrackedPreferenceValidationDelegate* validation_delegate) {
   scoped_ptr<PrefFilter> pref_filter;
   if (!kPlatformSupportsPreferenceTracking) {
@@ -111,12 +113,14 @@ PersistentPrefStore* ProfilePrefStoreManager::CreateProfilePrefStore(
   scoped_ptr<PrefHashFilter> unprotected_pref_hash_filter(
       new PrefHashFilter(GetPrefHashStore(false),
                          unprotected_configuration,
+                         base::Closure(),
                          validation_delegate,
                          reporting_ids_count_,
                          false));
   scoped_ptr<PrefHashFilter> protected_pref_hash_filter(
       new PrefHashFilter(GetPrefHashStore(true),
                          protected_configuration,
+                         on_reset_on_load,
                          validation_delegate,
                          reporting_ids_count_,
                          true));
@@ -175,6 +179,7 @@ bool ProfilePrefStoreManager::InitializePrefsFromMasterPrefs(
     to_serialize = copy.get();
     PrefHashFilter(GetPrefHashStore(false),
                    tracking_configuration_,
+                   base::Closure(),
                    NULL,
                    reporting_ids_count_,
                    false).Initialize(copy.get());
@@ -209,6 +214,7 @@ ProfilePrefStoreManager::CreateDeprecatedCombinedProfilePrefStore(
     pref_filter.reset(
         new PrefHashFilter(pref_hash_store_impl.PassAs<PrefHashStore>(),
                            tracking_configuration_,
+                           base::Closure(),
                            NULL,
                            reporting_ids_count_,
                            false));
index 806b129..759b988 100644 (file)
@@ -79,10 +79,13 @@ class ProfilePrefStoreManager {
   static void ClearResetTime(PrefService* pref_service);
 
   // Creates a PersistentPrefStore providing access to the user preferences of
-  // the managed profile. An optional |validation_delegate| will be notified
+  // the managed profile. If |on_reset| is provided, it will be invoked if a
+  // reset occurs as a result of loading the profile's prefs.
+  // An optional |validation_delegate| will be notified
   // of the status of each tracked preference as they are checked.
   PersistentPrefStore* CreateProfilePrefStore(
       const scoped_refptr<base::SequencedTaskRunner>& io_task_runner,
+      const base::Closure& on_reset_on_load,
       TrackedPreferenceValidationDelegate* validation_delegate);
 
   // Initializes the preferences for the managed profile with the preference
index c478ac4..ead5ac4 100644 (file)
@@ -92,7 +92,8 @@ class ProfilePrefStoreManagerTest : public testing::Test {
                        kConfiguration + arraysize(kConfiguration)),
         profile_pref_registry_(new user_prefs::PrefRegistrySyncable),
         registry_verifier_(profile_pref_registry_),
-        seed_("seed") {}
+        seed_("seed"),
+        reset_recorded_(false) {}
 
   virtual void SetUp() OVERRIDE {
     ProfilePrefStoreManager::RegisterPrefs(local_state_.registry());
@@ -142,17 +143,25 @@ class ProfilePrefStoreManagerTest : public testing::Test {
   virtual void TearDown() OVERRIDE { DestroyPrefStore(); }
 
  protected:
-  bool WasResetRecorded() {
+  // Verifies whether a reset was reported via the RecordReset() hook. Also
+  // verifies that GetResetTime() was set (or not) accordingly.
+  void VerifyResetRecorded(bool reset_expected) {
+    EXPECT_EQ(reset_expected, reset_recorded_);
+
     base::PrefServiceFactory pref_service_factory;
     pref_service_factory.set_user_prefs(pref_store_);
 
     scoped_ptr<PrefService> pref_service(
         pref_service_factory.Create(profile_pref_registry_));
 
-    return !ProfilePrefStoreManager::GetResetTime(pref_service.get()).is_null();
+    EXPECT_EQ(
+        reset_expected,
+        !ProfilePrefStoreManager::GetResetTime(pref_service.get()).is_null());
   }
 
   void ClearResetRecorded() {
+    reset_recorded_ = false;
+
     base::PrefServiceFactory pref_service_factory;
     pref_service_factory.set_user_prefs(pref_store_);
 
@@ -168,6 +177,8 @@ class ProfilePrefStoreManagerTest : public testing::Test {
     scoped_refptr<PersistentPrefStore> pref_store =
         manager_->CreateProfilePrefStore(
             main_message_loop_.message_loop_proxy(),
+            base::Bind(&ProfilePrefStoreManagerTest::RecordReset,
+                       base::Unretained(this)),
             &mock_validation_delegate_);
     InitializePrefStore(pref_store);
     pref_store = NULL;
@@ -214,7 +225,10 @@ class ProfilePrefStoreManagerTest : public testing::Test {
   void LoadExistingPrefs() {
     DestroyPrefStore();
     pref_store_ = manager_->CreateProfilePrefStore(
-        main_message_loop_.message_loop_proxy(), NULL);
+        main_message_loop_.message_loop_proxy(),
+        base::Bind(&ProfilePrefStoreManagerTest::RecordReset,
+                   base::Unretained(this)),
+        NULL);
     pref_store_->AddObserver(&registry_verifier_);
     pref_store_->ReadPrefs();
   }
@@ -267,6 +281,17 @@ class ProfilePrefStoreManagerTest : public testing::Test {
   scoped_refptr<PersistentPrefStore> pref_store_;
 
   std::string seed_;
+
+ private:
+  void RecordReset() {
+    // As-is |reset_recorded_| is only designed to remember a single reset, make
+    // sure none was previously recorded (or that ClearResetRecorded() was
+    // called).
+    EXPECT_FALSE(reset_recorded_);
+    reset_recorded_ = true;
+  }
+
+  bool reset_recorded_;
 };
 
 TEST_F(ProfilePrefStoreManagerTest, StoreValues) {
@@ -276,7 +301,7 @@ TEST_F(ProfilePrefStoreManagerTest, StoreValues) {
 
   ExpectStringValueEquals(kTrackedAtomic, kFoobar);
   ExpectStringValueEquals(kProtectedAtomic, kHelloWorld);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
   ExpectValidationObserved(kTrackedAtomic);
   ExpectValidationObserved(kProtectedAtomic);
 }
@@ -309,8 +334,8 @@ TEST_F(ProfilePrefStoreManagerTest, ProtectValues) {
   // will be discarded at load time, leaving this preference undefined.
   EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
             pref_store_->GetValue(kProtectedAtomic, NULL));
-  EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
-            WasResetRecorded());
+  VerifyResetRecorded(
+      ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking);
 
   ExpectValidationObserved(kTrackedAtomic);
   ExpectValidationObserved(kProtectedAtomic);
@@ -337,7 +362,7 @@ TEST_F(ProfilePrefStoreManagerTest, MigrateFromOneFile) {
 
   ExpectStringValueEquals(kTrackedAtomic, kFoobar);
   ExpectStringValueEquals(kProtectedAtomic, kHelloWorld);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 
   LoadExistingPrefs();
 
@@ -347,7 +372,7 @@ TEST_F(ProfilePrefStoreManagerTest, MigrateFromOneFile) {
 
   ExpectStringValueEquals(kTrackedAtomic, kFoobar);
   ExpectStringValueEquals(kProtectedAtomic, kHelloWorld);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 }
 
 TEST_F(ProfilePrefStoreManagerTest, MigrateWithTampering) {
@@ -380,8 +405,8 @@ TEST_F(ProfilePrefStoreManagerTest, MigrateWithTampering) {
   // will be discarded at load time, leaving this preference undefined.
   EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
             pref_store_->GetValue(kProtectedAtomic, NULL));
-  EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
-            WasResetRecorded());
+  VerifyResetRecorded(
+      ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking);
 
   LoadExistingPrefs();
 
@@ -390,7 +415,7 @@ TEST_F(ProfilePrefStoreManagerTest, MigrateWithTampering) {
       PrefServiceHashStoreContents::kProfilePreferenceHashes));
 
   ExpectStringValueEquals(kTrackedAtomic, kBarfoo);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 }
 
 TEST_F(ProfilePrefStoreManagerTest, InitializePrefsFromMasterPrefs) {
@@ -405,7 +430,7 @@ TEST_F(ProfilePrefStoreManagerTest, InitializePrefsFromMasterPrefs) {
   // necessary to authenticate these values.
   ExpectStringValueEquals(kTrackedAtomic, kFoobar);
   ExpectStringValueEquals(kProtectedAtomic, kHelloWorld);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 }
 
 TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtected) {
@@ -439,7 +464,7 @@ TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtected) {
   // Since there was a valid super MAC we were able to extend the existing trust
   // to the newly protected preference.
   ExpectStringValueEquals(kUnprotectedPref, kBarfoo);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 
   // Ensure everything is written out to disk.
   DestroyPrefStore();
@@ -450,8 +475,8 @@ TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtected) {
   LoadExistingPrefs();
   EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
             pref_store_->GetValue(kUnprotectedPref, NULL));
-  EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
-            WasResetRecorded());
+  VerifyResetRecorded(
+      ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking);
 }
 
 TEST_F(ProfilePrefStoreManagerTest, NewPrefWhenFirstProtecting) {
@@ -490,7 +515,7 @@ TEST_F(ProfilePrefStoreManagerTest, NewPrefWhenFirstProtecting) {
   // Since there was a valid super MAC we were able to extend the existing trust
   // to the newly tracked & protected preference.
   ExpectStringValueEquals(kUnprotectedPref, kFoobar);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 }
 
 TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtectedWithoutTrust) {
@@ -514,8 +539,8 @@ TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtectedWithoutTrust) {
   // discarded because new values are not accepted without a valid super MAC.
   EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
             pref_store_->GetValue(kUnprotectedPref, NULL));
-  EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking,
-            WasResetRecorded());
+  VerifyResetRecorded(
+      ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking);
 }
 
 // This test verifies that preference values are correctly maintained when a
@@ -545,7 +570,7 @@ TEST_F(ProfilePrefStoreManagerTest, ProtectedToUnprotected) {
 
   // Verify that the value was not reset.
   ExpectStringValueEquals(kProtectedAtomic, kHelloWorld);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 
   // Accessing the value of the previously protected pref didn't trigger its
   // move to the unprotected preferences file, though the loading of the pref
@@ -558,5 +583,5 @@ TEST_F(ProfilePrefStoreManagerTest, ProtectedToUnprotected) {
   pref_store_->SetValue(kProtectedAtomic, new base::StringValue(kGoodbyeWorld));
   LoadExistingPrefs();
   ExpectStringValueEquals(kProtectedAtomic, kGoodbyeWorld);
-  EXPECT_FALSE(WasResetRecorded());
+  VerifyResetRecorded(false);
 }
index 7eb2a38..d06a669 100644 (file)
@@ -984,8 +984,7 @@ class NeverRunsExternalProtocolHandlerDelegate
     return NULL;
   }
   virtual ExternalProtocolHandler::BlockState GetBlockState(
-      const std::string& scheme,
-      bool initiated_by_user_gesture) OVERRIDE {
+      const std::string& scheme) OVERRIDE {
     // Block everything and fail the test.
     ADD_FAILURE();
     return ExternalProtocolHandler::BLOCK;
index bb91052..ae618a0 100644 (file)
@@ -173,7 +173,7 @@ TEST_F(GAIAInfoUpdateServiceTest, LogOut) {
   EXPECT_FALSE(service()->GetCachedPictureURL().empty());
 
   // Log out.
-  signin_manager->SignOut();
+  signin_manager->SignOut(signin_metrics::SIGNOUT_TEST);
   // Verify that the GAIA name and picture, and picture URL are unset.
   EXPECT_TRUE(GetCache()->GetGAIANameOfProfileAtIndex(0).empty());
   EXPECT_EQ(NULL, GetCache()->GetGAIAPictureOfProfileAtIndex(0));
index 6a358ee..a6865c8 100644 (file)
@@ -9,6 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/activity_log/activity_action_constants.h"
 #include "chrome/browser/extensions/activity_log/activity_actions.h"
 #include "chrome/browser/extensions/activity_log/activity_log.h"
@@ -18,6 +19,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/extensions/api/i18n/default_locale_handler.h"
 #include "chrome/common/render_messages.h"
+#include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_process_host.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/common/constants.h"
@@ -71,9 +73,14 @@ ChromeExtensionMessageFilter::ChromeExtensionMessageFilter(
       profile_(profile),
       extension_info_map_(
           extensions::ExtensionSystem::Get(profile)->info_map()) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  notification_registrar_.Add(this,
+                              chrome::NOTIFICATION_PROFILE_DESTROYED,
+                              content::Source<Profile>(profile));
 }
 
 ChromeExtensionMessageFilter::~ChromeExtensionMessageFilter() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
 bool ChromeExtensionMessageFilter::OnMessageReceived(
@@ -115,6 +122,14 @@ void ChromeExtensionMessageFilter::OverrideThreadForMessage(
   }
 }
 
+void ChromeExtensionMessageFilter::OnDestruct() const {
+  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
+    delete this;
+  } else {
+    BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
+  }
+}
+
 void ChromeExtensionMessageFilter::OnCanTriggerClipboardRead(
     const GURL& origin, bool* allowed) {
   *allowed = extension_info_map_->SecurityOriginHasAPIPermission(
@@ -154,10 +169,17 @@ void ChromeExtensionMessageFilter::OpenChannelToExtensionOnUIThread(
     const std::string& channel_name,
     bool include_tls_channel_id) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  extensions::MessageService::Get(profile_)->OpenChannelToExtension(
-      source_process_id, source_routing_id, receiver_port_id,
-      info.source_id, info.target_id, info.source_url, channel_name,
-      include_tls_channel_id);
+  if (profile_) {
+    extensions::MessageService::Get(profile_)
+        ->OpenChannelToExtension(source_process_id,
+                                 source_routing_id,
+                                 receiver_port_id,
+                                 info.source_id,
+                                 info.target_id,
+                                 info.source_url,
+                                 channel_name,
+                                 include_tls_channel_id);
+  }
 }
 
 void ChromeExtensionMessageFilter::OnOpenChannelToNativeApp(
@@ -181,9 +203,14 @@ void ChromeExtensionMessageFilter::OpenChannelToNativeAppOnUIThread(
     const std::string& source_extension_id,
     const std::string& native_app_name) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  extensions::MessageService::Get(profile_)->OpenChannelToNativeApp(
-      render_process_id_, source_routing_id, receiver_port_id,
-      source_extension_id, native_app_name);
+  if (profile_) {
+    extensions::MessageService::Get(profile_)
+        ->OpenChannelToNativeApp(render_process_id_,
+                                 source_routing_id,
+                                 receiver_port_id,
+                                 source_extension_id,
+                                 native_app_name);
+  }
 }
 
 void ChromeExtensionMessageFilter::OnOpenChannelToTab(
@@ -206,9 +233,15 @@ void ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread(
     const std::string& extension_id,
     const std::string& channel_name) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  extensions::MessageService::Get(profile_)->OpenChannelToTab(
-      source_process_id, source_routing_id, receiver_port_id,
-      tab_id, extension_id, channel_name);
+  if (profile_) {
+    extensions::MessageService::Get(profile_)
+        ->OpenChannelToTab(source_process_id,
+                           source_routing_id,
+                           receiver_port_id,
+                           tab_id,
+                           extension_id,
+                           channel_name);
+  }
 }
 
 void ChromeExtensionMessageFilter::OnGetExtMessageBundle(
@@ -298,3 +331,11 @@ void ChromeExtensionMessageFilter::OnAddEventToExtensionActivityLog(
   }
   AddActionToExtensionActivityLog(profile_, action);
 }
+
+void ChromeExtensionMessageFilter::Observe(
+    int type,
+    const content::NotificationSource& source,
+    const content::NotificationDetails& details) {
+  DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type);
+  profile_ = NULL;
+}
index 57cd927..4a3f341 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "base/sequenced_task_runner_helpers.h"
 #include "content/public/browser/browser_message_filter.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
 
 class GURL;
 class Profile;
@@ -26,7 +28,8 @@ class InfoMap;
 
 // This class filters out incoming Chrome-specific IPC messages from the
 // extension process on the IPC thread.
-class ChromeExtensionMessageFilter : public content::BrowserMessageFilter {
+class ChromeExtensionMessageFilter : public content::BrowserMessageFilter,
+                                     public content::NotificationObserver {
  public:
   ChromeExtensionMessageFilter(int render_process_id, Profile* profile);
 
@@ -35,6 +38,7 @@ class ChromeExtensionMessageFilter : public content::BrowserMessageFilter {
   virtual void OverrideThreadForMessage(
       const IPC::Message& message,
       content::BrowserThread::ID* thread) OVERRIDE;
+  virtual void OnDestruct() const OVERRIDE;
 
  private:
   friend class content::BrowserThread;
@@ -97,14 +101,23 @@ class ChromeExtensionMessageFilter : public content::BrowserMessageFilter {
       const std::string& extension_id,
       const ExtensionHostMsg_APIActionOrEvent_Params& params);
 
+  // content::NotificationObserver implementation.
+  virtual void Observe(int type,
+                       const content::NotificationSource& source,
+                       const content::NotificationDetails& details) OVERRIDE;
+
   const int render_process_id_;
 
   // The Profile associated with our renderer process.  This should only be
-  // accessed on the UI thread!
+  // accessed on the UI thread! Furthermore since this class is refcounted it
+  // may outlive |profile_|, so make sure to NULL check if in doubt; async
+  // calls and the like.
   Profile* profile_;
 
   scoped_refptr<extensions::InfoMap> extension_info_map_;
 
+  content::NotificationRegistrar notification_registrar_;
+
   DISALLOW_COPY_AND_ASSIGN(ChromeExtensionMessageFilter);
 };
 
index a46608e..42fe09f 100644 (file)
@@ -190,8 +190,7 @@ void SendExecuteMimeTypeHandlerEvent(scoped_ptr<content::StreamHandle> stream,
       expected_content_size);
 }
 
-void LaunchURL(const GURL& url, int render_process_id, int render_view_id,
-               bool user_gesture) {
+void LaunchURL(const GURL& url, int render_process_id, int render_view_id) {
   // If there is no longer a WebContents, the request may have raced with tab
   // closing. Don't fire the external request. (It may have been a prerender.)
   content::WebContents* web_contents =
@@ -209,9 +208,10 @@ void LaunchURL(const GURL& url, int render_process_id, int render_view_id,
   }
 
   ExternalProtocolHandler::LaunchUrlWithDelegate(
-      url, render_process_id, render_view_id,
-      g_external_protocol_handler_delegate,
-      user_gesture);
+      url,
+      render_process_id,
+      render_view_id,
+      g_external_protocol_handler_delegate);
 }
 #endif  // !defined(OS_ANDROID)
 
@@ -445,8 +445,7 @@ ResourceDispatcherHostLoginDelegate*
 bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol(
     const GURL& url,
     int child_id,
-    int route_id,
-    bool initiated_by_user_gesture) {
+    int route_id) {
 #if defined(OS_ANDROID)
   // Android use a resource throttle to handle external as well as internal
   // protocols.
@@ -460,10 +459,9 @@ bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol(
     return false;
   }
 
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
-      base::Bind(&LaunchURL, url, child_id, route_id,
-                 initiated_by_user_gesture));
+  BrowserThread::PostTask(BrowserThread::UI,
+                          FROM_HERE,
+                          base::Bind(&LaunchURL, url, child_id, route_id));
   return true;
 #endif
 }
index bb1773f..9ef9150 100644 (file)
@@ -66,8 +66,7 @@ class ChromeResourceDispatcherHostDelegate
       net::AuthChallengeInfo* auth_info, net::URLRequest* request) OVERRIDE;
   virtual bool HandleExternalProtocol(const GURL& url,
                                       int child_id,
-                                      int route_id,
-                                      bool initiated_by_user_gesture) OVERRIDE;
+                                      int route_id) OVERRIDE;
   virtual bool ShouldForceDownloadResource(
       const GURL& url, const std::string& mime_type) OVERRIDE;
   virtual bool ShouldInterceptResourceAsStream(
index e300c4e..d0e7015 100644 (file)
@@ -265,8 +265,9 @@ IN_PROC_BROWSER_TEST_F(ChromeRenderProcessHostTest, ProcessPerTab) {
 
 // We don't change process priorities on Mac or Posix because the user lacks the
 // permission to raise a process' priority even after lowering it.
+// flaky, disabling on branch
 #if defined(OS_WIN) || defined(OS_LINUX)
-IN_PROC_BROWSER_TEST_F(ChromeRenderProcessHostTest, Backgrounding) {
+IN_PROC_BROWSER_TEST_F(ChromeRenderProcessHostTest, DISABLED_Backgrounding) {
   if (!base::Process::CanBackgroundProcesses()) {
     LOG(ERROR) << "Can't background processes";
     return;
index 11547a0..c3a6fe8 100644 (file)
@@ -250,6 +250,19 @@ function toggleall() {
 
 
 <div class="product">
+<span class="title">audiotest-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">autoconf-2.13</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnu.org/software/autoconf/autoconf.html">homepage</a></span>
@@ -328,25 +341,38 @@ function toggleall() {
 
 
 <div class="product">
-<span class="title">avahi-0.6.31</span>
+<span class="title">autotest-all-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://avahi.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">avahi-daemon-0.0.1</span>
+<span class="title">autotest-chrome-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">autotest-client-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
 <li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
 </ul>
 </div>
@@ -354,9 +380,9 @@ function toggleall() {
 
 
 <div class="product">
-<span class="title">avfs-1.0.1</span>
+<span class="title">autotest-deps-0.0.4</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://sourceforge.net/projects/avf">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -367,9 +393,9 @@ function toggleall() {
 
 
 <div class="product">
-<span class="title">baselayout-2.0.1</span>
+<span class="title">autotest-deps-cellular-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://src.chromium.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -380,64 +406,78 @@ function toggleall() {
 
 
 <div class="product">
-<span class="title">bash-4.2_p45</span>
+<span class="title">autotest-deps-glbench-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://tiswww.case.edu/php/chet/bash/bashtop.html">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">bigreqsproto-1.1.1</span>
+<span class="title">autotest-deps-glmark2-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<span class="homepage"><a href="https://launchpad.net/glmark2">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License bigreqsproto-1.1.1/COPYING:
+<pre></pre>
+<ul>
+<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+</ul>
+</div>
+</div>
 
-Copyright 1992, 1998  The Open Group
 
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
+<div class="product">
+<span class="title">autotest-deps-graphics-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+<div class="product">
+<span class="title">autotest-deps-ltp-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<div class="product">
+<span class="title">autotest-deps-p2p-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
 <ul>
-
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">binutils-2.22</span>
+<span class="title">autotest-deps-piglit-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://sources.redhat.com/binutils/">homepage</a></span>
+<span class="homepage"><a href="http://cgit.freedesktop.org/piglit">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 <li><a href='#LGPL-3'>Gentoo Package Stock License LGPL-3</a></li>
 </ul>
 </div>
@@ -445,9 +485,9 @@ in this Software without prior written authorization from The Open Group.
 
 
 <div class="product">
-<span class="title">binutils-config-3</span>
+<span class="title">autotest-deps-touchpad-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.gentoo.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -458,13 +498,12 @@ in this Software without prior written authorization from The Open Group.
 
 
 <div class="product">
-<span class="title">bluez-5.17</span>
+<span class="title">autotest-deps-webgl-mpd-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.bluez.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 <li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
@@ -472,12 +511,25 @@ in this Software without prior written authorization from The Open Group.
 
 
 <div class="product">
-<span class="title">bootcomplete-login-0.0.1</span>
+<span class="title">autotest-deps-webgl-perf-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">autotest-factory-install-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
 <li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
 </ul>
 </div>
@@ -485,9 +537,9 @@ in this Software without prior written authorization from The Open Group.
 
 
 <div class="product">
-<span class="title">bootstat-0.0.1</span>
+<span class="title">autotest-fakemodem-conf-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<span class="homepage"><a href="">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -498,13 +550,12 @@ in this Software without prior written authorization from The Open Group.
 
 
 <div class="product">
-<span class="title">brltty-4.5</span>
+<span class="title">autotest-private-0.2.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://mielke.cc/brltty/">homepage</a></span>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 <li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
@@ -512,236 +563,981 @@ in this Software without prior written authorization from The Open Group.
 
 
 <div class="product">
-<span class="title">bsdiff-4.3</span>
+<span class="title">autotest-private-all-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.daemonology.net/bsdiff/">homepage</a></span>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
 <div class="licence">
-<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-util/bsdiff:
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-Copyright 2003-2005 Colin Percival
-All rights reserved
 
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing 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.
+<div class="product">
+<span class="title">autotest-private-tests-echoprivate-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<div class="product">
+<span class="title">autotest-private-tests-pagecycler-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
 <ul>
-
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">bzip2-1.0.6</span>
+<span class="title">autotest-private-tests-quickoffice-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.bzip.org/">homepage</a></span>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License bzip2-1.0.6/LICENSE:
-
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
---------------------------------------------------------------------------
 
-This program, "bzip2", the associated library "libbzip2", and all
-documentation, are copyright (C) 1996-2010 Julian R Seward.  All
-rights reserved.
+<div class="product">
+<span class="title">autotest-server-tests-0.0.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-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.
+<div class="product">
+<span class="title">autotest-server-tests-bluetooth-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-2. The origin of this software must not be misrepresented; you must 
-   not claim that you wrote the original software.  If you use this 
-   software in a product, an acknowledgment in the product 
-   documentation would be appreciated but is not required.
 
-3. Altered source versions must be plainly marked as such, and must
-   not be misrepresented as being the original software.
+<div class="product">
+<span class="title">autotest-server-tests-shill-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-4. The name of the author may not be used to endorse or promote 
-   products derived from this software without specific prior written 
-   permission.
 
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+<div class="product">
+<span class="title">autotest-server-tests-telemetry-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-Julian Seward, jseward@bzip.org
-bzip2/libbzip2 version 1.0.6 of 6 September 2010
 
---------------------------------------------------------------------------
+<div class="product">
+<span class="title">autotest-tests-0.0.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Gentoo Package Stock License BZIP2:
+<div class="product">
+<span class="title">autotest-tests-audio-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-&lt;copyright notice&gt;
-All rights reserved.
 
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
+<div class="product">
+<span class="title">autotest-tests-cellular-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
 
-2. The origin of this software must not be misrepresented; you must
-   not claim that you wrote the original software.  If you use this
-   software in a product, an acknowledgment in the product
-   documentation would be appreciated but is not required.
+<div class="product">
+<span class="title">autotest-tests-cros-disks-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-3. Altered source versions must be plainly marked as such, and must
-   not be misrepresented as being the original software.
 
-4. The name of the author may not be used to endorse or promote
-   products derived from this software without specific prior written
-   permission.
+<div class="product">
+<span class="title">autotest-tests-cryptohome-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<div class="product">
+<span class="title">autotest-tests-debugd-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
 <ul>
-
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">c-ares-1.7.5</span>
+<span class="title">autotest-tests-graphics-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://c-ares.haxx.se/">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
-<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/net-dns/c-ares:
-
-Copyright 1998 by the Massachusetts Institute of Technology.
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of M.I.T. not be used in
-advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-M.I.T. makes no representations about the suitability of
-this software for any purpose.  It is provided "as is"
-without express or implied warranty.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<div class="product">
+<span class="title">autotest-tests-ltp-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
 <ul>
-
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">cairo-1.12.12</span>
+<span class="title">autotest-tests-ownershipapi-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://cairographics.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
-<pre>Gentoo Package Stock License MPL-1.1:
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-                          MOZILLA PUBLIC LICENSE
-                                Version 1.1
 
-                              ---------------
+<div class="product">
+<span class="title">autotest-tests-p2p-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-1. Definitions.
 
-     1.0.1. "Commercial Use" means distribution or otherwise making the
-     Covered Code available to a third party.
+<div class="product">
+<span class="title">autotest-tests-power-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-     1.1. "Contributor" means each entity that creates or contributes to
-     the creation of Modifications.
 
-     1.2. "Contributor Version" means the combination of the Original
-     Code, prior Modifications used by a Contributor, and the Modifications
-     made by that particular Contributor.
+<div class="product">
+<span class="title">autotest-tests-security-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-     1.3. "Covered Code" means the Original Code or Modifications or the
-     combination of the Original Code and Modifications, in each case
-     including portions thereof.
 
-     1.4. "Electronic Distribution Mechanism" means a mechanism generally
-     accepted in the software development community for the electronic
-     transfer of data.
+<div class="product">
+<span class="title">autotest-tests-shill-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-     1.5. "Executable" means Covered Code in any form other than Source
-     Code.
 
-     1.6. "Initial Developer" means the individual or entity identified
-     as the Initial Developer in the Source Code notice required by Exhibit
-     A.
+<div class="product">
+<span class="title">autotest-tests-touchpad-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-     1.7. "Larger Work" means a work which combines Covered Code or
-     portions thereof with code not governed by the terms of this License.
 
-     1.8. "License" means this document.
+<div class="product">
+<span class="title">autotest-tests-tpm-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
 
-     1.8.1. "Licensable" means having the right to grant, to the maximum
-     extent possible, whether at the time of the initial grant or
-     subsequently acquired, any and all of the rights conveyed herein.
 
-     1.9. "Modifications" means any addition to or deletion from the
-     substance or structure of either the Original Code or any previous
-     Modifications. When Covered Code is released as a series of files, a
-     Modification is:
-          A. Any addition to or deletion from the contents of a file
-          containing Original Code or previous Modifications.
+<div class="product">
+<span class="title">avahi-0.6.31</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://avahi.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+</ul>
+</div>
+</div>
 
-          B. Any new file that contains any part of the Original Code or
-          previous Modifications.
 
-     1.10. "Original Code" means Source Code of computer software code
-     which is described in the Source Code notice required by Exhibit A as
-     Original Code, and which, at the time of its release under this
-     License is not already Covered Code governed by this License.
+<div class="product">
+<span class="title">avahi-daemon-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
 
-     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+
+<div class="product">
+<span class="title">avfs-1.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://sourceforge.net/projects/avf">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">avtest_label_detect-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">baselayout-2.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">bash-4.2_p45</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://tiswww.case.edu/php/chet/bash/bashtop.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">beaker-1.5.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://beaker.groovie.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License Beaker-1.5.4/Beaker.egg-info/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: Beaker
+Version: 1.5.4
+Summary: A Session and Caching library with WSGI Middleware
+Home-page: http://beaker.groovie.org
+Author: Ben Bangert, Mike Bayer, Philip Jenvey
+Author-email: ben@groovie.org, pjenvey@groovie.org
+License: BSD
+Description: Cache and Session Library
+        +++++++++++++++++++++++++
+        
+        About
+        =====
+        
+        Beaker is a web session and general caching library that includes WSGI 
+        middleware for use in web applications.
+        
+        As a general caching library, Beaker can handle storing for various times
+        any Python object that can be pickled with optional back-ends on a 
+        fine-grained basis.
+        
+        Beaker was built largely on the code from MyghtyUtils, then refactored and
+        extended with database support.
+        
+        Beaker includes Cache and Session WSGI middleware to ease integration with
+        WSGI capable frameworks, and is automatically used by `Pylons 
+        &lt;http://pylonshq.com/&gt;`_.
+        
+        
+        Features
+        ========
+        
+        * Fast, robust performance
+        * Multiple reader/single writer lock system to avoid duplicate simultaneous 
+          cache creation
+        * Cache back-ends include dbm, file, memory, memcached, and database (Using
+          SQLAlchemy for multiple-db vendor support)
+        * Signed cookie's to prevent session hijacking/spoofing
+        * Cookie-only sessions to remove the need for a db or file backend (ideal 
+          for clustered systems)
+        * Extensible Container object to support new back-ends
+        * Cache's can be divided into namespaces (to represent templates, objects, 
+          etc.) then keyed for different copies
+        * Create functions for automatic call-backs to create new cache copies after
+          expiration
+        * Fine-grained toggling of back-ends, keys, and expiration per Cache object
+        
+        
+        Documentation
+        =============
+        
+        Documentation can be found on the `Official Beaker Docs site
+        &lt;http://beaker.groovie.org/&gt;`_.
+        
+        
+        Source
+        ======
+        
+        The latest developer version is available in a `Mercurial repository
+        &lt;http://bitbucket.org/bbangert/beaker/get/tip.gz#egg=Beaker-dev&gt;`_.
+        
+Keywords: wsgi myghty session web cache middleware
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License Beaker-1.5.4/LICENSE:
+
+Copyright (c) 2006, 2007 Ben Bangert, Mike Bayer, Philip Jenvey
+                         and contributors.
+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. The name of the author or contributors may not be used to endorse or
+   promote products derived from this software without specific prior
+   written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License Beaker-1.5.4/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: Beaker
+Version: 1.5.4
+Summary: A Session and Caching library with WSGI Middleware
+Home-page: http://beaker.groovie.org
+Author: Ben Bangert, Mike Bayer, Philip Jenvey
+Author-email: ben@groovie.org, pjenvey@groovie.org
+License: BSD
+Description: Cache and Session Library
+        +++++++++++++++++++++++++
+        
+        About
+        =====
+        
+        Beaker is a web session and general caching library that includes WSGI 
+        middleware for use in web applications.
+        
+        As a general caching library, Beaker can handle storing for various times
+        any Python object that can be pickled with optional back-ends on a 
+        fine-grained basis.
+        
+        Beaker was built largely on the code from MyghtyUtils, then refactored and
+        extended with database support.
+        
+        Beaker includes Cache and Session WSGI middleware to ease integration with
+        WSGI capable frameworks, and is automatically used by `Pylons 
+        &lt;http://pylonshq.com/&gt;`_.
+        
+        
+        Features
+        ========
+        
+        * Fast, robust performance
+        * Multiple reader/single writer lock system to avoid duplicate simultaneous 
+          cache creation
+        * Cache back-ends include dbm, file, memory, memcached, and database (Using
+          SQLAlchemy for multiple-db vendor support)
+        * Signed cookie's to prevent session hijacking/spoofing
+        * Cookie-only sessions to remove the need for a db or file backend (ideal 
+          for clustered systems)
+        * Extensible Container object to support new back-ends
+        * Cache's can be divided into namespaces (to represent templates, objects, 
+          etc.) then keyed for different copies
+        * Create functions for automatic call-backs to create new cache copies after
+          expiration
+        * Fine-grained toggling of back-ends, keys, and expiration per Cache object
+        
+        
+        Documentation
+        =============
+        
+        Documentation can be found on the `Official Beaker Docs site
+        &lt;http://beaker.groovie.org/&gt;`_.
+        
+        
+        Source
+        ======
+        
+        The latest developer version is available in a `Mercurial repository
+        &lt;http://bitbucket.org/bbangert/beaker/get/tip.gz#egg=Beaker-dev&gt;`_.
+        
+Keywords: wsgi myghty session web cache middleware
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">bigreqsproto-1.1.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License bigreqsproto-1.1.1/COPYING:
+
+Copyright 1992, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">binutils-2.22</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://sources.redhat.com/binutils/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+<li><a href='#LGPL-3'>Gentoo Package Stock License LGPL-3</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">binutils-config-3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gentoo.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">bluez-5.19</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.bluez.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">bootcomplete-login-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">bootstat-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">brltty-4.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://mielke.cc/brltty/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">bsdiff-4.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.daemonology.net/bsdiff/">homepage</a></span>
+<div class="licence">
+<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-util/bsdiff:
+
+Copyright 2003-2005 Colin Percival
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing 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 AUTHOR ``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 AUTHOR 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">btsocket-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License btsocket-0.0.1/LICENSE:
+
+// Copyright (c) 2013 The Chromium OS 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">busybox-1.21.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.busybox.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">bzip2-1.0.6</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.bzip.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License bzip2-1.0.6/LICENSE:
+
+
+--------------------------------------------------------------------------
+
+This program, "bzip2", the associated library "libbzip2", and all
+documentation, are copyright (C) 1996-2010 Julian R Seward.  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. The origin of this software must not be misrepresented; you must 
+   not claim that you wrote the original software.  If you use this 
+   software in a product, an acknowledgment in the product 
+   documentation would be appreciated but is not required.
+
+3. Altered source versions must be plainly marked as such, and must
+   not be misrepresented as being the original software.
+
+4. The name of the author may not be used to endorse or promote 
+   products derived from this software without specific prior written 
+   permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+Julian Seward, jseward@bzip.org
+bzip2/libbzip2 version 1.0.6 of 6 September 2010
+
+--------------------------------------------------------------------------
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Gentoo Package Stock License BZIP2:
+
+&lt;copyright notice&gt;
+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. The origin of this software must not be misrepresented; you must
+   not claim that you wrote the original software.  If you use this
+   software in a product, an acknowledgment in the product
+   documentation would be appreciated but is not required.
+
+3. Altered source versions must be plainly marked as such, and must
+   not be misrepresented as being the original software.
+
+4. The name of the author may not be used to endorse or promote
+   products derived from this software without specific prior written
+   permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">c-ares-1.7.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://c-ares.haxx.se/">homepage</a></span>
+<div class="licence">
+<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/net-dns/c-ares:
+
+Copyright 1998 by the Massachusetts Institute of Technology.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of M.I.T. not be used in
+advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+M.I.T. makes no representations about the suitability of
+this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">cairo-1.12.12</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://cairographics.org/">homepage</a></span>
+<div class="licence">
+<pre>Gentoo Package Stock License MPL-1.1:
+
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
      hereafter acquired, including without limitation,  method, process,
      and apparatus claims, in any patent Licensable by grantor.
 
@@ -1263,35 +2059,126 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
-<span class="title">chinese-input-1.1.0.0</span>
+<span class="title">cherrypy-3.2.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.google.com/inputtools/">homepage</a></span>
+<span class="homepage"><a href="http://www.cherrypy.org/">homepage</a></span>
 <div class="licence">
-<pre></pre>
+<pre>Scanned Source License CherryPy-3.2.2/CherryPy.egg-info/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: CherryPy
+Version: 3.2.2
+Summary: Object-Oriented HTTP framework
+Home-page: http://www.cherrypy.org
+Author: CherryPy Team
+Author-email: team@cherrypy.org
+License: BSD
+Download-URL: http://download.cherrypy.org/cherrypy/3.2.2/
+Description: CherryPy is a pythonic, object-oriented HTTP framework
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: Freely Distributable
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server
+Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License CherryPy-3.2.2/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: CherryPy
+Version: 3.2.2
+Summary: Object-Oriented HTTP framework
+Home-page: http://www.cherrypy.org
+Author: CherryPy Team
+Author-email: team@cherrypy.org
+License: BSD
+Download-URL: http://download.cherrypy.org/cherrypy/3.2.2/
+Description: CherryPy is a pythonic, object-oriented HTTP framework
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: Freely Distributable
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server
+Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License CherryPy-3.2.2/cherrypy/LICENSE.txt:
+
+Copyright (c) 2004-2011, CherryPy Team (team@cherrypy.org)
+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 the CherryPy Team 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
 <ul>
-<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
+
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">chromeos-activate-date-0.0.1</span>
+<span class="title">chinese-input-1.1.0.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="">homepage</a></span>
+<span class="homepage"><a href="http://www.google.com/inputtools/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">chromeos-assets-0.0.1</span>
+<span class="title">chromeos-activate-date-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<span class="homepage"><a href="">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -1302,7 +2189,7 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
-<span class="title">chromeos-assets-split-0.1.0</span>
+<span class="title">chromeos-assets-0.0.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
 <div class="licence">
@@ -1380,7 +2267,7 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
-<span class="title">chromeos-chrome-36.0.1985.19_rc</span>
+<span class="title">chromeos-chrome-37.0.2062.28_rc</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
@@ -1407,7 +2294,7 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
-<span class="title">chromeos-default-apps-1.1.0</span>
+<span class="title">chromeos-default-apps-1.2.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="">homepage</a></span>
 <div class="licence">
@@ -1420,7 +2307,59 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
-<span class="title">chromeos-disableecho-0.0.1</span>
+<span class="title">chromeos-dev-root-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">chromeos-factory-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">chromeos-factory-board-3.0.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">chromeos-factory-regions-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">chromeos-factoryinstall-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
@@ -1472,7 +2411,7 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
-<span class="title">chromeos-hangul-1.2.0.1</span>
+<span class="title">chromeos-hangul-1.2.0.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="https://code.google.com/p/google-input-tools/">homepage</a></span>
 <div class="licence">
@@ -1485,6 +2424,19 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
+<span class="title">chromeos-hwid-0.0.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">chromeos-imageburner-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
@@ -1511,6 +2463,19 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
+<span class="title">chromeos-initramfs-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">chromeos-installer-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
@@ -1524,6 +2489,19 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
+<span class="title">chromeos-installshim-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">chromeos-keyboards-1.1.4.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="https://code.google.com/p/google-input-tools">homepage</a></span>
@@ -1563,6 +2541,58 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
+<span class="title">chromeos-test-init-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">chromeos-test-root-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">chromeos-test-testauthkeys-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">chromite-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">chvt-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="">homepage</a></span>
@@ -1576,6 +2606,142 @@ EXHIBIT A -Mozilla Public License.
 
 
 <div class="product">
+<span class="title">ckermit-8.0.211</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.kermit-project.org/">homepage</a></span>
+<div class="licence">
+<pre>Gentoo Package Stock License Kermit:
+
+THE C-KERMIT 7.0 AND 8.0 LICENSE
+
+  Last update: Thu Feb  8 17:41:07 2002
+
+This is the new C-Kermit 7.0 and 8.0 license.  The intention is to allow
+C-Kermit to be distributed with "free" operating systems such as GNU/Linux,
+FreeBSD, NetBSD, OpenBSD, The Hurd, etc, even when the distributions
+themselves (such as Red Hat or Caldera) might be sold and/or might include
+applications that are not free, and yet still require a license to include
+C-Kermit in or with "non-free" products such as commercial OS's, commercial
+software packages, embedded systems, and hardware (other than general-purpose
+computers preloaded with "free" operating systems), since these licenses
+furnish a large portion of the Kermit Project's funding.
+
+There have been some questions about the provision in Clause (A) that:
+
+                                                                  The
+    C-Kermit source code may not be changed without the consent of the
+    Kermit Project, which will not be unreasonably withheld (this is
+    simply a matter of keeping a consistent and supportable code base).
+
+The intention of this clause is primarily to make sure that anybody who
+makes modifications sends them back to us, since we are the ones have to
+support C-Kermit, and so we can carry them through to future releases (so
+you don't have to make the same changes again and again).
+
+Secondarily it is to protect Columbia University in the unlikely event of
+modifications made with deliberate intent to offend or cause damage.
+
+Any redistributor of C-Kermit under Clause (A) below should rest assured
+there is no intention of preventing them from constructing a distribution in
+the appropriate format (RPM or whatever) for their product or from issuing
+any patches required for their products; we simply want to be informed so we
+can maintain a consistent code base and a solid, supportable software
+package.  We are happy to work with any redistributor an any issues that
+concern them.  If you have questions, send them to kermit@columbia.edu.
+
+Note: All changes to this file since 1 January 2000 (the C-Kermit 7.0
+release date) are above; the license itself has not changed, except to
+update the most recent copyright date.
+
+(Begin)
+
+Copyright (C) 1985, 2002,
+  The Trustees of Columbia University in the City of New York.
+  All rights reserved.
+
+PERMISSIONS:
+
+The C-Kermit software may be obtained directly from the Kermit Project at
+Columbia University (or from any source explicitly licensed by the Kermit
+Project or implicitly licensed by Clause (A) below) by any individual for
+his or her OWN USE, and by any company or other organization for its own
+INTERNAL DISTRIBUTION and use, including installation on servers that are
+accessed by customers or clients, WITHOUT EXPLICIT LICENSE.
+
+Conditions for REDISTRIBUTION are as follows:
+
+(A) The C-Kermit software, in source and/or binary form, may be
+    included WITHOUT EXPLICIT LICENSE in distributions of OPERATING
+    SYSTEMS that have OSI (Open Source Initiative, www.opensource.org)
+    approved licenses, even if non-Open-Source applications (but not
+    operating systems) are included in the same distribution.  Such
+    distributions include, but are not limited to, CD-ROM, FTP site,
+    Web site, or preinstalled software on a new GENERAL-PURPOSE
+    computer, as long as the primary character of the distribution is
+    an Open Source operating system with accompanying utilities.  The
+    C-Kermit source code may not be changed without the consent of the
+    Kermit Project, which will not be unreasonably withheld (this is
+    simply a matter of keeping a consistent and supportable code base).
+
+(B) Inclusion of C-Kermit software in whole or in part, in any form, in
+    or with any product not covered by Clause (A), or its distribution
+    by any commercial enterprise to its actual or potential customers
+    or clients except as in Clause (A), requires a license from the
+    Kermit Project, Columbia University; contact kermit@columbia.edu.
+
+The name of Columbia University may not be used to endorse or promote
+products derived from or including the C-Kermit software without specific
+prior written permission.
+
+DISCLAIMER:
+
+  THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
+  TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK AS TO ITS
+  FITNESS FOR ANY PURPOSE, AND WITHOUT WARRANTY BY THE TRUSTEES OF
+  COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK OF ANY KIND, EITHER
+  EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+  THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK SHALL NOT
+  BE LIABLE FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL,
+  OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR
+  IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS
+  HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  YOU SHALL
+  INDEMNIFY AND HOLD HARMLESS THE TRUSTEES OF COLUMBIA UNIVERSITY IN
+  THE CITY OF NEW YORK, ITS EMPLOYEES AND AGENTS FROM AND AGAINST ANY
+  AND ALL CLAIMS, DEMANDS, LOSS, DAMAGE OR EXPENSE (INCLUDING
+  ATTORNEYS' FEES) ARISING OUT OF YOUR USE OF THIS SOFTWARE.
+
+The above copyright notice, permissions notice, and disclaimer may not be
+removed, altered, or obscured and shall be included in all copies of the
+C-Kermit software.  The Trustees of Columbia University in the City of
+New York reserve the right to revoke this permission if any of the terms
+of use set forth above are breached.
+
+(End)
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">common-assets-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">compositeproto-0.4.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -1634,6 +2800,19 @@ PERFORMANCE OF THIS SOFTWARE.
 
 
 <div class="product">
+<span class="title">confuse-2.7</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.nongnu.org/confuse/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#ISC'>Gentoo Package Stock License ISC</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">coreboot-2013.04</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.coreboot.org/">homepage</a></span>
@@ -2321,6 +3500,383 @@ Boston, MA 02111 USA.
 
 
 <div class="product">
+<span class="title">dbus-python-0.84.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.freedesktop.org/wiki/Software/DBusBindings">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License dbus-python-0.84.0/COPYING:
+
+As of version 0.82.4, dbus-python is released under the following permissive
+non-copyleft license (the same one used for D-Bus core):
+
+       Permission is hereby granted, free of charge, to any person
+       obtaining a copy of this software and associated documentation
+       files (the "Software"), to deal in the Software without
+       restriction, including without limitation the rights to use, copy,
+       modify, merge, publish, distribute, sublicense, and/or sell copies
+       of the Software, and to permit persons to whom the Software is
+       furnished to do so, subject to the following conditions:
+
+       The above copyright notice and this permission notice shall be
+       included in all copies or substantial portions of the Software.
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+       EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+       MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+       NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+       HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+       WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+       OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+       DEALINGS IN THE SOFTWARE.
+
+Copyright holders and licensing are indicated in the source files.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">dbus-spy-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://vidner.net/martin/software/dbus-spy/">homepage</a></span>
+<div class="licence">
+<pre>Gentoo Package Stock License CC-BY-3.0:
+
+Creative Commons Legal Code
+
+Attribution 3.0 Unported
+
+    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+    LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+    REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
+    DAMAGES RESULTING FROM ITS USE.
+
+License
+
+THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+
+BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+CONDITIONS.
+
+1. Definitions
+
+ a. "Adaptation" means a work based upon the Work, or upon the Work and
+    other pre-existing works, such as a translation, adaptation,
+    derivative work, arrangement of music or other alterations of a
+    literary or artistic work, or phonogram or performance and includes
+    cinematographic adaptations or any other form in which the Work may be
+    recast, transformed, or adapted including in any form recognizably
+    derived from the original, except that a work that constitutes a
+    Collection will not be considered an Adaptation for the purpose of
+    this License. For the avoidance of doubt, where the Work is a musical
+    work, performance or phonogram, the synchronization of the Work in
+    timed-relation with a moving image ("synching") will be considered an
+    Adaptation for the purpose of this License.
+ b. "Collection" means a collection of literary or artistic works, such as
+    encyclopedias and anthologies, or performances, phonograms or
+    broadcasts, or other works or subject matter other than works listed
+    in Section 1(f) below, which, by reason of the selection and
+    arrangement of their contents, constitute intellectual creations, in
+    which the Work is included in its entirety in unmodified form along
+    with one or more other contributions, each constituting separate and
+    independent works in themselves, which together are assembled into a
+    collective whole. A work that constitutes a Collection will not be
+    considered an Adaptation (as defined above) for the purposes of this
+    License.
+ c. "Distribute" means to make available to the public the original and
+    copies of the Work or Adaptation, as appropriate, through sale or
+    other transfer of ownership.
+ d. "Licensor" means the individual, individuals, entity or entities that
+    offer(s) the Work under the terms of this License.
+ e. "Original Author" means, in the case of a literary or artistic work,
+    the individual, individuals, entity or entities who created the Work
+    or if no individual or entity can be identified, the publisher; and in
+    addition (i) in the case of a performance the actors, singers,
+    musicians, dancers, and other persons who act, sing, deliver, declaim,
+    play in, interpret or otherwise perform literary or artistic works or
+    expressions of folklore; (ii) in the case of a phonogram the producer
+    being the person or legal entity who first fixes the sounds of a
+    performance or other sounds; and, (iii) in the case of broadcasts, the
+    organization that transmits the broadcast.
+ f. "Work" means the literary and/or artistic work offered under the terms
+    of this License including without limitation any production in the
+    literary, scientific and artistic domain, whatever may be the mode or
+    form of its expression including digital form, such as a book,
+    pamphlet and other writing; a lecture, address, sermon or other work
+    of the same nature; a dramatic or dramatico-musical work; a
+    choreographic work or entertainment in dumb show; a musical
+    composition with or without words; a cinematographic work to which are
+    assimilated works expressed by a process analogous to cinematography;
+    a work of drawing, painting, architecture, sculpture, engraving or
+    lithography; a photographic work to which are assimilated works
+    expressed by a process analogous to photography; a work of applied
+    art; an illustration, map, plan, sketch or three-dimensional work
+    relative to geography, topography, architecture or science; a
+    performance; a broadcast; a phonogram; a compilation of data to the
+    extent it is protected as a copyrightable work; or a work performed by
+    a variety or circus performer to the extent it is not otherwise
+    considered a literary or artistic work.
+ g. "You" means an individual or entity exercising rights under this
+    License who has not previously violated the terms of this License with
+    respect to the Work, or who has received express permission from the
+    Licensor to exercise rights under this License despite a previous
+    violation.
+ h. "Publicly Perform" means to perform public recitations of the Work and
+    to communicate to the public those public recitations, by any means or
+    process, including by wire or wireless means or public digital
+    performances; to make available to the public Works in such a way that
+    members of the public may access these Works from a place and at a
+    place individually chosen by them; to perform the Work to the public
+    by any means or process and the communication to the public of the
+    performances of the Work, including by public digital performance; to
+    broadcast and rebroadcast the Work by any means including signs,
+    sounds or images.
+ i. "Reproduce" means to make copies of the Work by any means including
+    without limitation by sound or visual recordings and the right of
+    fixation and reproducing fixations of the Work, including storage of a
+    protected performance or phonogram in digital form or other electronic
+    medium.
+
+2. Fair Dealing Rights. Nothing in this License is intended to reduce,
+limit, or restrict any uses free from copyright or rights arising from
+limitations or exceptions that are provided for in connection with the
+copyright protection under copyright law or other applicable laws.
+
+3. License Grant. Subject to the terms and conditions of this License,
+Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+perpetual (for the duration of the applicable copyright) license to
+exercise the rights in the Work as stated below:
+
+ a. to Reproduce the Work, to incorporate the Work into one or more
+    Collections, and to Reproduce the Work as incorporated in the
+    Collections;
+ b. to create and Reproduce Adaptations provided that any such Adaptation,
+    including any translation in any medium, takes reasonable steps to
+    clearly label, demarcate or otherwise identify that changes were made
+    to the original Work. For example, a translation could be marked "The
+    original work was translated from English to Spanish," or a
+    modification could indicate "The original work has been modified.";
+ c. to Distribute and Publicly Perform the Work including as incorporated
+    in Collections; and,
+ d. to Distribute and Publicly Perform Adaptations.
+ e. For the avoidance of doubt:
+
+     i. Non-waivable Compulsory License Schemes. In those jurisdictions in
+        which the right to collect royalties through any statutory or
+        compulsory licensing scheme cannot be waived, the Licensor
+        reserves the exclusive right to collect such royalties for any
+        exercise by You of the rights granted under this License;
+    ii. Waivable Compulsory License Schemes. In those jurisdictions in
+        which the right to collect royalties through any statutory or
+        compulsory licensing scheme can be waived, the Licensor waives the
+        exclusive right to collect such royalties for any exercise by You
+        of the rights granted under this License; and,
+   iii. Voluntary License Schemes. The Licensor waives the right to
+        collect royalties, whether individually or, in the event that the
+        Licensor is a member of a collecting society that administers
+        voluntary licensing schemes, via that society, from any exercise
+        by You of the rights granted under this License.
+
+The above rights may be exercised in all media and formats whether now
+known or hereafter devised. The above rights include the right to make
+such modifications as are technically necessary to exercise the rights in
+other media and formats. Subject to Section 8(f), all rights not expressly
+granted by Licensor are hereby reserved.
+
+4. Restrictions. The license granted in Section 3 above is expressly made
+subject to and limited by the following restrictions:
+
+ a. You may Distribute or Publicly Perform the Work only under the terms
+    of this License. You must include a copy of, or the Uniform Resource
+    Identifier (URI) for, this License with every copy of the Work You
+    Distribute or Publicly Perform. You may not offer or impose any terms
+    on the Work that restrict the terms of this License or the ability of
+    the recipient of the Work to exercise the rights granted to that
+    recipient under the terms of the License. You may not sublicense the
+    Work. You must keep intact all notices that refer to this License and
+    to the disclaimer of warranties with every copy of the Work You
+    Distribute or Publicly Perform. When You Distribute or Publicly
+    Perform the Work, You may not impose any effective technological
+    measures on the Work that restrict the ability of a recipient of the
+    Work from You to exercise the rights granted to that recipient under
+    the terms of the License. This Section 4(a) applies to the Work as
+    incorporated in a Collection, but this does not require the Collection
+    apart from the Work itself to be made subject to the terms of this
+    License. If You create a Collection, upon notice from any Licensor You
+    must, to the extent practicable, remove from the Collection any credit
+    as required by Section 4(b), as requested. If You create an
+    Adaptation, upon notice from any Licensor You must, to the extent
+    practicable, remove from the Adaptation any credit as required by
+    Section 4(b), as requested.
+ b. If You Distribute, or Publicly Perform the Work or any Adaptations or
+    Collections, You must, unless a request has been made pursuant to
+    Section 4(a), keep intact all copyright notices for the Work and
+    provide, reasonable to the medium or means You are utilizing: (i) the
+    name of the Original Author (or pseudonym, if applicable) if supplied,
+    and/or if the Original Author and/or Licensor designate another party
+    or parties (e.g., a sponsor institute, publishing entity, journal) for
+    attribution ("Attribution Parties") in Licensor's copyright notice,
+    terms of service or by other reasonable means, the name of such party
+    or parties; (ii) the title of the Work if supplied; (iii) to the
+    extent reasonably practicable, the URI, if any, that Licensor
+    specifies to be associated with the Work, unless such URI does not
+    refer to the copyright notice or licensing information for the Work;
+    and (iv) , consistent with Section 3(b), in the case of an Adaptation,
+    a credit identifying the use of the Work in the Adaptation (e.g.,
+    "French translation of the Work by Original Author," or "Screenplay
+    based on original Work by Original Author"). The credit required by
+    this Section 4(b) may be implemented in any reasonable manner;
+    provided, however, that in the case of a Adaptation or Collection, at
+    a minimum such credit will appear, if a credit for all contributing
+    authors of the Adaptation or Collection appears, then as part of these
+    credits and in a manner at least as prominent as the credits for the
+    other contributing authors. For the avoidance of doubt, You may only
+    use the credit required by this Section for the purpose of attribution
+    in the manner set out above and, by exercising Your rights under this
+    License, You may not implicitly or explicitly assert or imply any
+    connection with, sponsorship or endorsement by the Original Author,
+    Licensor and/or Attribution Parties, as appropriate, of You or Your
+    use of the Work, without the separate, express prior written
+    permission of the Original Author, Licensor and/or Attribution
+    Parties.
+ c. Except as otherwise agreed in writing by the Licensor or as may be
+    otherwise permitted by applicable law, if You Reproduce, Distribute or
+    Publicly Perform the Work either by itself or as part of any
+    Adaptations or Collections, You must not distort, mutilate, modify or
+    take other derogatory action in relation to the Work which would be
+    prejudicial to the Original Author's honor or reputation. Licensor
+    agrees that in those jurisdictions (e.g. Japan), in which any exercise
+    of the right granted in Section 3(b) of this License (the right to
+    make Adaptations) would be deemed to be a distortion, mutilation,
+    modification or other derogatory action prejudicial to the Original
+    Author's honor and reputation, the Licensor will waive or not assert,
+    as appropriate, this Section, to the fullest extent permitted by the
+    applicable national law, to enable You to reasonably exercise Your
+    right under Section 3(b) of this License (right to make Adaptations)
+    but not otherwise.
+
+5. Representations, Warranties and Disclaimer
+
+UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
+OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+
+6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
+LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
+ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
+ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. Termination
+
+ a. This License and the rights granted hereunder will terminate
+    automatically upon any breach by You of the terms of this License.
+    Individuals or entities who have received Adaptations or Collections
+    from You under this License, however, will not have their licenses
+    terminated provided such individuals or entities remain in full
+    compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+    survive any termination of this License.
+ b. Subject to the above terms and conditions, the license granted here is
+    perpetual (for the duration of the applicable copyright in the Work).
+    Notwithstanding the above, Licensor reserves the right to release the
+    Work under different license terms or to stop distributing the Work at
+    any time; provided, however that any such election will not serve to
+    withdraw this License (or any other license that has been, or is
+    required to be, granted under the terms of this License), and this
+    License will continue in full force and effect unless terminated as
+    stated above.
+
+8. Miscellaneous
+
+ a. Each time You Distribute or Publicly Perform the Work or a Collection,
+    the Licensor offers to the recipient a license to the Work on the same
+    terms and conditions as the license granted to You under this License.
+ b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+    offers to the recipient a license to the original Work on the same
+    terms and conditions as the license granted to You under this License.
+ c. If any provision of this License is invalid or unenforceable under
+    applicable law, it shall not affect the validity or enforceability of
+    the remainder of the terms of this License, and without further action
+    by the parties to this agreement, such provision shall be reformed to
+    the minimum extent necessary to make such provision valid and
+    enforceable.
+ d. No term or provision of this License shall be deemed waived and no
+    breach consented to unless such waiver or consent shall be in writing
+    and signed by the party to be charged with such waiver or consent.
+ e. This License constitutes the entire agreement between the parties with
+    respect to the Work licensed here. There are no understandings,
+    agreements or representations with respect to the Work not specified
+    here. Licensor shall not be bound by any additional provisions that
+    may appear in any communication from You. This License may not be
+    modified without the mutual written agreement of the Licensor and You.
+ f. The rights granted under, and the subject matter referenced, in this
+    License were drafted utilizing the terminology of the Berne Convention
+    for the Protection of Literary and Artistic Works (as amended on
+    September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
+    Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
+    and the Universal Copyright Convention (as revised on July 24, 1971).
+    These rights and subject matter take effect in the relevant
+    jurisdiction in which the License terms are sought to be enforced
+    according to the corresponding provisions of the implementation of
+    those treaty provisions in the applicable national law. If the
+    standard suite of rights granted under applicable copyright law
+    includes additional rights not granted under this License, such
+    additional rights are deemed to be included in the License; this
+    License is not intended to restrict the license of any rights under
+    applicable law.
+
+
+Creative Commons Notice
+
+    Creative Commons is not a party to this License, and makes no warranty
+    whatsoever in connection with the Work. Creative Commons will not be
+    liable to You or any party on any legal theory for any damages
+    whatsoever, including without limitation any general, special,
+    incidental or consequential damages arising in connection to this
+    license. Notwithstanding the foregoing two (2) sentences, if Creative
+    Commons has expressly identified itself as the Licensor hereunder, it
+    shall have all rights and obligations of Licensor.
+
+    Except for the limited purpose of indicating to the public that the
+    Work is licensed under the CCPL, Creative Commons does not authorize
+    the use by either party of the trademark "Creative Commons" or any
+    related trademark or logo of Creative Commons without the prior
+    written consent of Creative Commons. Any permitted use will be in
+    compliance with Creative Commons' then-current trademark usage
+    guidelines, as may be published on its website or otherwise made
+    available upon request from time to time. For the avoidance of doubt,
+    this trademark restriction does not form part of this License.
+
+    Creative Commons may be contacted at http://creativecommons.org/.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">dejavu-2.33</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://dejavu.sourceforge.net/">homepage</a></span>
@@ -2475,6 +4031,157 @@ Copyright FAQ
 
 
 <div class="product">
+<span class="title">dhcp-4.2.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.isc.org/products/DHCP">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License dhcp-4.2.2/LICENSE:
+
+# Copyright (c) 2004-2011 by Internet Systems Consortium, Inc. ("ISC")
+# Copyright (c) 1995-2003 by Internet Software Consortium
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+#   Internet Systems Consortium, Inc.
+#   950 Charter Street
+#   Redwood City, CA 94063
+#   &lt;info@isc.org&gt;
+#   https://www.isc.org/
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License dhcp-4.2.2/bind/bind-9.8.0-P4/COPYRIGHT:
+
+Copyright (C) 2004-2011  Internet Systems Consortium, Inc. ("ISC")
+Copyright (C) 1996-2003  Internet Software Consortium.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+$Id: COPYRIGHT,v 1.17 2011-01-04 23:47:13 tbox Exp $
+
+Portions Copyright (C) 1996-2001  Nominum, Inc.
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License dhcp-4.2.2/bind/bind-9.8.0-P4/contrib/idn/idnkit-1.0-src/LICENSE.txt:
+
+Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved.
+By using this file, you agree to the terms and conditions set forth bellow.
+
+                       LICENSE TERMS AND CONDITIONS 
+
+The following License Terms and Conditions apply, unless a different
+license is obtained from Japan Network Information Center ("JPNIC"),
+a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
+Chiyoda-ku, Tokyo 101-0047, Japan.
+
+1. Use, Modification and Redistribution (including distribution of any
+   modified or derived work) in source and/or binary forms is permitted
+   under this License Terms and Conditions.
+
+2. Redistribution of source code must retain the copyright notices as they
+   appear in each source code file, this License Terms and Conditions.
+
+3. Redistribution in binary form must reproduce the Copyright Notice,
+   this License Terms and Conditions, in the documentation and/or other
+   materials provided with the distribution.  For the purposes of binary
+   distribution the "Copyright Notice" refers to the following language:
+   "Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved."
+
+4. The name of JPNIC may not be used to endorse or promote products
+   derived from this Software without specific prior written approval of
+   JPNIC.
+
+5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
+   "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 JPNIC 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 DAMAGES.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License dhcp-4.2.2/bind/bind-9.8.0-P4/contrib/zkt/LICENSE:
+
+Copyright (c) 2005 - 2008, Holger Zuleger HZnet. All rights reserved.
+
+This software is open source.
+
+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 Holger Zuleger HZnet 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 REGENTS 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+<li><a href='#as-is'>Gentoo Package Stock License as-is</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">dhcpcd-5.1.4</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://roy.marples.name/projects/dhcpcd/">homepage</a></span>
@@ -2541,6 +4248,19 @@ SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">dnsmasq-2.50</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.thekelleys.org.uk/dnsmasq/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">docbook-xml-dtd-4.1.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.docbook.org/">homepage</a></span>
@@ -2567,6 +4287,66 @@ SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">dpkt-1.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://code.google.com/p/dpkt/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License dpkt-1.8/LICENSE:
+
+  
+  Copyright (c) 2004 Dug Song &lt;dugsong@monkey.org&gt;
+  All rights reserved, all wrongs reversed.
+
+  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. The names of the authors and copyright holders may not be used to
+     endorse or promote products derived from this software without
+     specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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.
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License dpkt-1.8/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: dpkt
+Version: 1.8
+Summary: dumb packet module
+Home-page: http://dpkt.googlecode.com/
+Author: Dug Song &lt;dugsong@monkey.org&gt;
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">dri2proto-2.6</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -4437,6 +6217,19 @@ Public License instead of this License.
 
 
 <div class="product">
+<span class="title">evtest-1.29</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://cgit.freedesktop.org/evtest/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">exfat-utils-1.0.2_pre401</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://code.google.com/p/exfat/">homepage</a></span>
@@ -4489,6 +6282,65 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">fftw-3.2.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.fftw.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">file-5.15</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.darwinsys.com/file/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License file-5.15/COPYING:
+
+$File: COPYING,v 1.1 2008/02/05 19:08:11 christos Exp $
+Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992, 1994, 1995.
+Software written by Ian F. Darwin and others;
+maintained 1994- Christos Zoulas.
+
+This software is not subject to any export provision of the United States
+Department of Commerce, and may be exported to any country or planet.
+
+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 immediately at the beginning of the file, without modification,
+   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 AUTHOR 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 AUTHOR 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">findutils-4.4.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnu.org/software/findutils/">homepage</a></span>
@@ -4502,6 +6354,19 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">fio-2.1.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://brick.kernel.dk/snaps/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">fixesproto-5.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -4921,6 +6786,208 @@ authorization from The XFree86 Project Inc..
 
 
 <div class="product">
+<span class="title">freeglut-2.4.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://freeglut.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License freeglut-2.4.0/COPYING:
+
+
+  Freeglut Copyright
+  ------------------
+  
+  Freeglut code without an explicit copyright is covered by the following 
+  copyright:
+  
+  Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+  Permission is hereby granted, free of charge,  to any person obtaining a copy 
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction,  including without limitation the rights 
+  to use, copy,  modify, merge,  publish, distribute,  sublicense,  and/or sell 
+  copies or substantial portions of the Software.
+  
+  The above  copyright notice  and this permission notice  shall be included in 
+  all copies or substantial portions of the Software.
+  
+  THE SOFTWARE  IS PROVIDED "AS IS",  WITHOUT WARRANTY OF ANY KIND,  EXPRESS OR 
+  IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO THE WARRANTIES  OF MERCHANTABILITY, 
+  FITNESS  FOR  A PARTICULAR PURPOSE  AND NONINFRINGEMENT.  IN  NO EVENT  SHALL 
+  PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM,  DAMAGES OR OTHER LIABILITY, WHETHER 
+  IN  AN ACTION  OF CONTRACT,  TORT OR OTHERWISE,  ARISING FROM,  OUT OF  OR IN 
+  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+  
+  Except as contained in this notice,  the name of Pawel W. Olszta shall not be 
+  used  in advertising  or otherwise to promote the sale, use or other dealings 
+  in this Software without prior written authorization from Pawel W. Olszta.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">freeimage-3.15.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://freeimage.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre>Gentoo Package Stock License FIPL-1.0:
+
+FreeImage Public License - Version 1.0
+---------------------------------------------
+
+1. Definitions.
+
+1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications.
+
+1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.
+
+1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof.
+
+1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data.
+
+1.5. "Executable" means Covered Code in any form other than Source Code.
+
+1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A.
+
+1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.
+
+1.8. "License" means this document.
+
+1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a
+Modification is:
+
+A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.
+
+B. Any new file that contains any part of the Original Code or previous Modifications.
+
+1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License.
+
+1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control
+compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.
+
+1.12. "You" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the
+direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity.
+
+2. Source Code License.
+
+2.1. The Initial Developer Grant.
+The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:
+
+(a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and
+
+(b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell ("Utilize") the Original Code (or portions thereof), but solely to the extent that
+any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or
+combinations.
+
+2.2. Contributor Grant.
+Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:
+
+(a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and
+
+(b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that
+may be necessary to Utilize further Modifications or combinations.
+
+3. Distribution Obligations.
+
+3.1. Application of License.
+The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or
+restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.
+
+3.2. Availability of Source Code.
+Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.
+
+3.3. Description of Modifications.
+You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.
+
+3.4. Intellectual Property Matters
+
+(a) Third Party Claims.
+If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make
+available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.
+
+(b) Contributor APIs.
+If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file.
+
+3.5. Required Notices.
+You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its
+structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or
+liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of
+warranty, support, indemnity or liability terms You offer.
+
+3.6. Distribution of Executable Versions.
+You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You
+describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License,
+provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
+
+3.7. Larger Works.
+You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.
+
+5. Application of this License.
+
+This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code.
+
+6. Versions of the License.
+
+6.1. New Versions.
+Floris van den Berg may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.
+
+6.2. Effect of New Versions.
+Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Floris van den Berg
+No one other than Floris van den Berg has the right to modify the terms applicable to Covered Code created under this License.
+
+6.3. Derivative Works.
+If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases "FreeImage", `FreeImage Public License", "FIPL", or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the FreeImage Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+
+9. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
+
+11. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by Dutch law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the The Netherlands: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Almelo, The Netherlands; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the court of Almelo, The Netherlands with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based
+on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute
+responsibility on an equitable basis.
+
+EXHIBIT A.
+
+"The contents of this file are subject to the FreeImage Public License Version 1.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://home.wxs.nl/~flvdberg/freeimage-license.txt
+
+Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. 
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">freetype-2.5.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.freetype.org/">homepage</a></span>
@@ -5377,6 +7444,20 @@ to permit their use in free software.
 
 
 <div class="product">
+<span class="title">gdb-7.7.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://sourceware.org/gdb/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">gdbm-1.9.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnu.org/software/gdbm/">homepage</a></span>
@@ -5528,6 +7609,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">glmark2-285</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://launchpad.net/glmark2">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">glog-0.3.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://code.google.com/p/google-glog/">homepage</a></span>
@@ -5663,6 +7757,32 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">glu-9.0.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://cgit.freedesktop.org/mesa/glu/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#SGI-B-2.0'>Gentoo Package Stock License SGI-B-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">gmerge-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">gmock-1.6.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://code.google.com/p/googlemock/">homepage</a></span>
@@ -6079,7 +8199,7 @@ Scanned Source License gmock-1.6.0/scripts/generator/COPYING:
 
 
 <div class="product">
-<span class="title">GoogleKeyboardInput-keyboards-1.3.2.1</span>
+<span class="title">GoogleKeyboardInput-keyboards-1.3.2.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="https://code.google.com/p/google-input-tools">homepage</a></span>
 <div class="licence">
@@ -6092,7 +8212,7 @@ Scanned Source License gmock-1.6.0/scripts/generator/COPYING:
 
 
 <div class="product">
-<span class="title">GoogleKeyboardInput-xkb-1.0.3.1</span>
+<span class="title">GoogleKeyboardInput-xkb-1.1.2.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.google.com/inputtools">homepage</a></span>
 <div class="licence">
@@ -6105,6 +8225,61 @@ Scanned Source License gmock-1.6.0/scripts/generator/COPYING:
 
 
 <div class="product">
+<span class="title">gpsd-3.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://catb.org/gpsd/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License gpsd-3.4/COPYING:
+
+                       COPYRIGHTS
+
+Compilation copyright is held by the GPSD project.  All rights reserved.
+
+GPSD project copyrights are assigned to the project lead, currently
+Eric S. Raymond. Other portions of the GPSD code are Copyright (c)
+1997, 1998, 1999, 2000, 2001, 2002 by Remco Treffkorn, and others
+Copyright (c) 2005 by Eric S. Raymond.  For other copyrights, see
+individual files.
+
+                       BSD LICENSE
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:&lt;P&gt;
+
+Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.&lt;P&gt;
+
+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.&lt;P&gt;
+
+Neither name of the GPSD project 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 REGENTS 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">grep-2.14</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnu.org/software/grep/">homepage</a></span>
@@ -6118,6 +8293,58 @@ Scanned Source License gmock-1.6.0/scripts/generator/COPYING:
 
 
 <div class="product">
+<span class="title">gsm-1.0.13</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://packages.qa.debian.org/libg/libgsm.html">homepage</a></span>
+<div class="licence">
+<pre>Gentoo Package Stock License gsm:
+
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener
+Carsten Bormann
+
+                                 oOo
+
+Since the original terms of 15 years ago maybe do not make our
+intentions completely clear given today's refined usage of the legal
+terms, we append this additional permission:
+
+      Permission to use, copy, modify, and distribute this software
+      for any purpose with or without fee is hereby granted,
+      provided that this notice is not removed and that neither
+      the authors nor the Technische Universitaet Berlin are
+      deemed to have made any representations as to the suitability
+      of this software for any purpose nor are held responsible
+      for any defects of this software.  THERE IS ABSOLUTELY NO
+      WARRANTY FOR THIS SOFTWARE.
+
+Berkeley/Bremen, 05.04.2009
+Jutta Degener
+Carsten Bormann
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">gtalk-62219080</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.google.com">homepage</a></span>
@@ -6176,6 +8403,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">gtk+-2.20.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gtk.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">gtk-doc-am-1.18</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gtk.org/gtk-doc/">homepage</a></span>
@@ -6943,6 +9183,19 @@ All trademarks and registered trademarks mentioned herein are the property of th
 
 
 <div class="product">
+<span class="title">hdctools-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">hdparm-9.39</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://sourceforge.net/projects/hdparm/">homepage</a></span>
@@ -6991,6 +9244,45 @@ On Debian systems, the complete text of the BSD License can be found in
 
 
 <div class="product">
+<span class="title">hostapd-2.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://hostap.epitest.fi">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">htmltidy-20090325</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://tidy.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">htpdate-1.0.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.clevervest.com/htp/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">hwids-20130915.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="https://github.com/gentoo/hwids">homepage</a></span>
@@ -7005,6 +9297,32 @@ On Debian systems, the complete text of the BSD License can be found in
 
 
 <div class="product">
+<span class="title">i2c-tools-3.0.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.lm-sensors.org/wiki/I2CTools">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">i7z-0.27</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://code.google.com/p/i7z/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">ibus-1.4.99.20120314</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://code.google.com/p/ibus/">homepage</a></span>
@@ -7018,6 +9336,126 @@ On Debian systems, the complete text of the BSD License can be found in
 
 
 <div class="product">
+<span class="title">imagemagick-6.7.8.7</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.imagemagick.org/">homepage</a></span>
+<div class="licence">
+<pre>Gentoo Package Stock License imagemagick:
+
+Before we get to the text of the license, lets just review what the license says in simple terms:
+
+It allows you to:
+
+  * freely download and use ImageMagick software, in whole or in part, for personal, company internal, or commercial purposes;
+  * use ImageMagick software in packages or distributions that you create;
+  * link against a library under a different license;
+  * link code under a different license against a library under this license;
+  * merge code into a work under a different license;
+  * extend patent grants to any code using code under this license;
+  * and extend patent protection.
+
+It forbids you to:
+
+  * redistribute any piece of ImageMagick-originated software without proper attribution;
+  * use any marks owned by ImageMagick Studio LLC in any way that might state or imply that ImageMagick Studio LLC endorses your distribution;
+  * use any marks owned by ImageMagick Studio LLC in any way that might state or imply that you created the ImageMagick software in question.
+
+It requires you to:
+
+  * include a copy of the license in any redistribution you may make that includes ImageMagick software;
+  * provide clear attribution to ImageMagick Studio LLC for any distributions that include ImageMagick software.
+
+It does not require you to:
+
+  * include the source of the ImageMagick software itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it;
+  * submit changes that you make to the software back to the ImageMagick Studio LLC (though such feedback is encouraged).
+
+A few other clarifications include:
+
+  * ImageMagick is freely available without charge;
+  * you may include ImageMagick on a DVD as long as you comply with the terms of the license;
+  * you can give modified code away for free or sell it under the terms of the ImageMagick license or distribute the result under a different license, but you need to acknowledge the use of the ImageMagick software;
+  * the license is compatible with the GPL V3.
+  * when exporting the ImageMagick software, review its export classification.
+
+Terms and Conditions for Use, Reproduction, and Distribution
+
+The legally binding and authoritative terms and conditions for use, reproduction, and distribution of ImageMagick follow:
+
+Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization dedicated to making software imaging solutions freely available.
+
+1. Definitions.
+
+License shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+Legal Entity shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, control means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+You (or Your) shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+Source form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+Object form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+Work shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+Derivative Works shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+Contribution shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as Not a Contribution.
+
+Contributor shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+  * You must give any other recipients of the Work or Derivative Works a copy of this License; and
+  * You must cause any modified files to carry prominent notices stating that You changed the files; and
+  * You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+  * If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
+You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+How to Apply the License to your Work
+
+To apply the ImageMagick License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information (don't include the brackets). The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the ImageMagick License (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.imagemagick.org/script/license.php
+
+   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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">iniparser-3.0b</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://ndevilla.free.fr/iniparser/">homepage</a></span>
@@ -7056,7 +9494,7 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
-<span class="title">input-tools-4.1.2.7</span>
+<span class="title">input-tools-4.3.2.5</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.google.com/inputtools">homepage</a></span>
 <div class="licence">
@@ -7162,6 +9600,131 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">intel-gpu-tools-1.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License intel-gpu-tools-1.3/COPYING:
+
+Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Copyright 2003,2006 Tungsten Graphics, Inc., Cedar Park, Texas.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Copyright © 2006-2011 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+Copyright © 2010 Red Hat, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+Copyright © 2011 Daniel Vetter
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">intltool-0.50.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="https://launchpad.net/intltool/">homepage</a></span>
@@ -7188,6 +9751,76 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">iperf-2.0.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://iperf.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License iperf-2.0.4/COPYING:
+
+Copyright (c) 1999-2007, The Board of Trustees of the University of Illinois
+All Rights Reserved.
+
+Iperf performance test
+Mark Gates
+Ajay Tirumala
+Jim Ferguson
+Jon Dugan
+Feng Qin
+Kevin Gibbs
+John Estabrook
+National Laboratory for Applied Network Research 
+National Center for Supercomputing Applications 
+University of Illinois at Urbana-Champaign 
+http://www.ncsa.uiuc.edu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software (Iperf) and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+
+Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimers.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimers in the documentation and/or
+other materials provided with the distribution.
+
+Neither the names of the University of Illinois, NCSA, nor the names of its
+contributors may be used to endorse or promote products derived from this
+Software without specific prior written permission.  THE SOFTWARE IS PROVIDED
+"AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+<li><a href='#as-is'>Gentoo Package Stock License as-is</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">iproute2-3.8.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">iptables-1.4.16.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.iptables.org/">homepage</a></span>
@@ -7277,6 +9910,32 @@ SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">japanese-input-1.0.0.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://code.google.com/p/mozc">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">joystick-1.4.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://sourceforge.net/projects/linuxconsole/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">jsoncpp-0.6.0_rc2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://jsoncpp.sourceforge.net/">homepage</a></span>
@@ -7290,6 +9949,19 @@ SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">jsonrpclib-0_pre20110820</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://github.com/joshmarshall/jsonrpclib">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">kbd-1.15.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://freshmeat.net/projects/kbd/">homepage</a></span>
@@ -7369,7 +10041,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
 <div class="product">
-<span class="title">kmod-15</span>
+<span class="title">kmod-17</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://git.kernel.org/?p=utils/kernel/kmod/kmod.git">homepage</a></span>
 <div class="licence">
@@ -7501,6 +10173,19 @@ DEALINGS IN THE FONT SOFTWARE.
 
 
 <div class="product">
+<span class="title">ktop-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://chromium.googlesource.com/chromiumos/third_party/ktop">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">ladspa-sdk-1.13</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.ladspa.org/">homepage</a></span>
@@ -7527,6 +10212,19 @@ DEALINGS IN THE FONT SOFTWARE.
 
 
 <div class="product">
+<span class="title">less-457</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.greenwoodsoftware.com/less/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">leveldb-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://code.google.com/p/leveldb/">homepage</a></span>
@@ -7571,6 +10269,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">libaio-0.3.109</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.kernel.org/pub/linux/kernel/people/andrea/libaio/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">libatomic_ops-7.2d</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.hpl.hp.com/research/linux/atomic_ops/">homepage</a></span>
@@ -8358,6 +11069,46 @@ modified is included with the above copyright notice.
 
 
 <div class="product">
+<span class="title">libc-bench-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.etalabs.net/libc-bench.html">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License libc-bench-0.0.1/COPYRIGHT:
+
+libc-bench, a performance and memory usage benchmark for comparing
+libc implementations
+
+Copyright © 2011 Rich Felker
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">libcap-2.17</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.friedhoff.org/posixfilecaps.html">homepage</a></span>
@@ -8462,20 +11213,20 @@ DAMAGE.
 
 
 <div class="product">
-<span class="title">libchrome-242728</span>
+<span class="title">libcap-ng-0.6.6</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://dev.chromium.org/chromium-os/packages/libchrome">homepage</a></span>
+<span class="homepage"><a href="http://people.redhat.com/sgrubb/libcap-ng/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">libchrome_crypto-242728</span>
+<span class="title">libchrome-271506</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://dev.chromium.org/chromium-os/packages/libchrome">homepage</a></span>
 <div class="licence">
@@ -8488,64 +11239,72 @@ DAMAGE.
 
 
 <div class="product">
-<span class="title">libdaemon-0.14</span>
+<span class="title">libchrome_crypto-271506</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://0pointer.de/lennart/projects/libdaemon/">homepage</a></span>
+<span class="homepage"><a href="http://dev.chromium.org/chromium-os/packages/libchrome">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">libdivsufsort-2.0.1</span>
+<span class="title">libchromeos-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://code.google.com/p/libdivsufsort/">homepage</a></span>
+<span class="homepage"><a href="http://dev.chromium.org/chromium-os/platform">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License libdivsufsort-2.0.1/COPYING:
-
-The libdivsufsort copyright is as follows:
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
 
-Copyright (c) 2003-2008 Yuta Mori All Rights Reserved.
 
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
+<div class="product">
+<span class="title">libchromeos-use-flags-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
 
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
+<div class="product">
+<span class="title">libdaemon-0.14</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://0pointer.de/lennart/projects/libdaemon/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+</ul>
+</div>
+</div>
 
-See also the libdivsufsort web site:
-  http://libdivsufsort.googlecode.com/ for more information.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<div class="product">
+<span class="title">libdrm-2.4.54</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://dri.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
 <ul>
-
+<li><a href='#X'>Custom License X</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">libdrm-2.4.52</span>
+<span class="title">libdrm-tests-2.4.54</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://dri.freedesktop.org/">homepage</a></span>
 <div class="licence">
@@ -8686,6 +11445,19 @@ THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">libftdi-1.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.intra2net.com/en/developer/libftdi/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">libgcrypt-1.4.6</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnupg.org/">homepage</a></span>
@@ -8699,6 +11471,19 @@ THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">libglade-2.6.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gnome.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">libgpg-error-1.10</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnupg.org/related_software/libgpg-error">homepage</a></span>
@@ -8713,26 +11498,187 @@ THE SOFTWARE.
 
 
 <div class="product">
-<span class="title">libmbim-1.9.0</span>
+<span class="title">libICE-1.0.7</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://cgit.freedesktop.org/libmbim/">homepage</a></span>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
 <div class="licence">
-<pre></pre>
+<pre>Scanned Source License libICE-1.0.7/COPYING:
+
+Copyright 1993, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Author: Ralph Mor, X Consortium
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
 <ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">libmnl-1.0.3</span>
+<span class="title">libjpeg-turbo-1.2.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://netfilter.org/projects/libmnl">homepage</a></span>
+<span class="homepage"><a href="http://libjpeg-turbo.virtualgl.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License debian/copyright:
+
+This is Debian's prepackaged version of the `jpeg library' by the Independent
+JPEG Group.
+
+This package was created by Mark Mickan &lt;mmickan@debian.org&gt; from sources
+which can be found at ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
+
+It is partly based on the libjpeg6a package originally put together by
+Andy Guy &lt;awpguy@acs.ucalgary.ca&gt; and later maintained by Mark Mickan.
+
+Current Debian maintainer is Bill Allombert &lt;ballombe@debian.org&gt;.
+
+LEGAL ISSUES [ from README supplied with source - MM ]
+============
+
+In plain English:
+
+1. We don't promise that this software works.  (But if you find any bugs,
+   please let us know!)
+2. You can use this software for whatever you want.  You don't have to pay us.
+3. You may not pretend that you wrote this software.  If you use it in a
+   program, you must acknowledge somewhere in your documentation that
+   you've used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose.  This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library.  If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it.  This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it.  (See the file
+ansi2knr.c for full details.)  However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltmain.sh).  Another support script, install-sh, is copyright by X Consortium
+but is also freely distributable.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support has
+been removed altogether, and the GIF writer has been simplified to produce
+"uncompressed GIFs".  This technique does not use the LZW algorithm; the
+resulting GIF files are larger than usual, but are readable by all standard
+GIF decoders.
+
+We are required to state that
+    "The Graphics Interchange Format(c) is the Copyright property of
+    CompuServe Incorporated.  GIF(sm) is a Service Mark property of
+    CompuServe Incorporated."
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License libjpeg-turbo-1.2.0/release/License.rtf:
+
+{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}}
+{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
+\margl1440\margr1440\vieww9820\viewh8480\viewkind0
+\deftab720
+\pard\pardeftab720
+
+\f0\fs24 \cf0 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\
+\
+\pard\tx220\tx720\pardeftab720\li720\fi-720
+\ls1\ilvl0\cf0 {\listtext      \'95    }Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\
+{\listtext     \'95    }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.\
+{\listtext     \'95    }Neither the name of the libjpeg-turbo Project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\
+\pard\pardeftab720\qc
+\cf0 \
+\pard\pardeftab720
+\cf0 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 HOLDERS 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.\
+}
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License libjpeg-turbo-1.2.0/release/copyright:
+
+libjpeg-turbo is released under a BSD-style license (see README and README-turbo.txt)
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">libmbim-1.9.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://cgit.freedesktop.org/libmbim/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
@@ -8804,7 +11750,7 @@ THE SOFTWARE.
 
 
 <div class="product">
-<span class="title">libnl-3.2.14</span>
+<span class="title">libnl-3.2.24</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.infradead.org/~tgr/libnl/">homepage</a></span>
 <div class="licence">
@@ -8830,11 +11776,11 @@ THE SOFTWARE.
 
 
 <div class="product">
-<span class="title">libpcap-1.5.2</span>
+<span class="title">libpcap-1.5.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.tcpdump.org/">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License libpcap-1.5.2/LICENSE:
+<pre>Scanned Source License libpcap-1.5.3/LICENSE:
 
 License: BSD
  
@@ -9675,6 +12621,65 @@ authorization from the authors.
 
 
 <div class="product">
+<span class="title">libSM-1.2.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License libSM-1.2.0/COPYING:
+
+Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+Copyright 1993, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">libtool-2.4.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnu.org/software/libtool/">homepage</a></span>
@@ -9688,22 +12693,35 @@ authorization from the authors.
 
 
 <div class="product">
-<span class="title">libusb-0.1.12</span>
+<span class="title">libusb-1.0.18</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://libusb.sourceforge.net/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">libusb-compat-0.1.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://libusb.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">libusb-1.0.9</span>
+<span class="title">libv4l-0.8.8</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://libusb.org/">homepage</a></span>
+<span class="homepage"><a href="http://git.linuxtv.org/v4l-utils.git">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -9714,11 +12732,11 @@ authorization from the authors.
 
 
 <div class="product">
-<span class="title">libva-1.2.1</span>
+<span class="title">libva-1.3.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.freedesktop.org/wiki/Software/vaapi">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License libva-1.2.1/COPYING:
+<pre>Scanned Source License libva-1.3.1/COPYING:
 
     Permission is hereby granted, free of charge, to any person obtaining a
     copy of this software and associated documentation files (the
@@ -9742,7 +12760,7 @@ authorization from the authors.
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Scanned Source License libva-1.2.1/debian.upstream/copyright:
+Scanned Source License libva-1.3.1/debian.upstream/copyright:
 
 This package was debianized by Waldo Bastian &lt;waldo.bastian@intel.com&gt; on
 Mon, 18 Jun 2007 21:35:31 -0700.
@@ -9799,11 +12817,11 @@ is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
 
 
 <div class="product">
-<span class="title">libva-intel-driver-1.2.2</span>
+<span class="title">libva-intel-driver-1.3.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.freedesktop.org/wiki/Software/vaapi">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License libva-intel-driver-1.2.2/COPYING:
+<pre>Scanned Source License libva-intel-driver-1.3.1/COPYING:
 
     Permission is hereby granted, free of charge, to any person obtaining a
     copy of this software and associated documentation files (the
@@ -9827,7 +12845,7 @@ is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Scanned Source License libva-intel-driver-1.2.2/debian.upstream/copyright:
+Scanned Source License libva-intel-driver-1.3.1/debian.upstream/copyright:
 
 This package is maintained by:
 Gwenole Beauchesne &lt;gwenole.beauchesne@intel.com&gt;
@@ -12050,6 +15068,220 @@ THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">libXmu-1.1.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License libXmu-1.1.0/COPYING:
+
+Copyright 1989, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+-----------
+
+Xmu/StrToBmap.c and Xmu/GrayPixmap.c also have:
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+-----------
+
+And Xmu/Clip.c has:
+
+Copyright (c) 1998 by The XFree86 Project, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+Except as contained in this notice, the name of the XFree86 Project shall
+not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from the
+XFree86 Project.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">libXpm-3.5.9</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License libXpm-3.5.9/COPYING:
+
+Copyright (C) 1989-95 GROUPE BULL
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of GROUPE BULL shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from GROUPE BULL.
+
+Copyright (C) 1998 Arnaud LE HORS
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+Arnaud LE HORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Arnaud LE HORS shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from Arnaud LE HORS.
+
+Copyright (C) 19896 Lorens Younes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+Lorens Younes BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Lorens Younes shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from Lorens Younes.
+
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License libXpm-3.5.9/COPYRIGHT:
+
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+Arnaud LE HORS      BULL Research FRANCE -- Koala Project 
+                    (XPM - X PixMap format version 2 &amp; 3)
+    Internet:       lehors@sophia.inria.fr
+Surface Mail:       Arnaud LE HORS, INRIA - Sophia Antipolis, 
+                    2004, route des Lucioles, 06565 Valbonne Cedex -- FRANCE
+ Voice phone:       (33) 93.65.77.71, Fax: (33) 93 65 77 66, Telex: 97 00 50 F
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">libXrandr-1.4.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -12158,49 +15390,111 @@ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 PERFORMANCE OF THIS SOFTWARE.
 
-Copyright © 2000 SuSE, Inc.
+Copyright © 2000 SuSE, Inc.
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of SuSE not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  SuSE makes no representations about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">libXt-1.1.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License libXt-1.1.4/COPYING:
+
+
+Copyright © 2001,2003 Keith Packard
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of Keith Packard not be used in
+advertising or publicity pertaining to distribution of the software without
+specific, written prior permission.  Keith Packard makes no
+representations about the suitability of this software for any purpose.  It
+is provided "as is" without express or implied warranty.
+
+KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+Copyright (c) 1993, 2011, Oracle and/or its affiliates. All rights reserved.
 
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of SuSE not be used in advertising or
-publicity pertaining to distribution of the software without specific,
-written prior permission.  SuSE makes no representations about the
-suitability of this software for any purpose.  It is provided "as is"
-without express or implied warranty.
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
 
-SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
-BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
-<ul>
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
 
-</ul>
-</div>
-</div>
 
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
 
-<div class="product">
-<span class="title">libXScrnSaver-1.2.1</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
-<div class="licence">
-<pre>Scanned Source License libXScrnSaver-1.2.1/COPYING:
+                        All Rights Reserved
 
-Copyright (c) 1992  X Consortium
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+Copyright 1987, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
 
 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.
@@ -12208,40 +15502,39 @@ all copies or substantial portions of the Software.
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-Except as contained in this notice, the name of the X Consortium shall not be
+Except as contained in this notice, the name of The Open Group shall not be
 used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
+in this Software without prior written authorization from The Open Group.
 
 
-Copyright (C) 2003 The XFree86 Project, Inc.  All Rights Reserved.
+Copyright (c) 1993, 1994  X Consortium
 
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software furnished to do so, subject to the following conditions:
 
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES
-OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
 
-Except as contained in this notice, the name of the XFree86 Project
-shall not be used in advertising or otherwise to promote the sale, use
-or other dealings in this Software without prior written authorization
-from the XFree86 Project.
+Except as contained in this notice, the name of the X Consortium shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealing in this Software without prior written authorization from the
+X Consortium.
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
@@ -12710,6 +16003,19 @@ WITH THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">lmbench-3.0_alpha9</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.bitmover.com/lmbench/whatis_lmbench.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">lohitfonts-cros-2.5.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://fedorahosted.org/lohit">homepage</a></span>
@@ -12822,6 +16128,19 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
 
 
 <div class="product">
+<span class="title">lrzsz-0.12.20</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.ohse.de/uwe/software/lrzsz.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">lsof-4.81</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/">homepage</a></span>
@@ -13031,6 +16350,293 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
 
 
 <div class="product">
+<span class="title">mako-0.7.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.makotemplates.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License Mako-0.7.0/LICENSE:
+
+This is the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+Copyright (C) 2006-2012 the Mako authors and contributors &lt;see AUTHORS file&gt;.
+Mako is a trademark of Michael Bayer.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License Mako-0.7.0/Mako.egg-info/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: Mako
+Version: 0.7.0
+Summary: A super-fast templating language that borrows the  best ideas from the existing templating languages.
+Home-page: http://www.makotemplates.org/
+Author: Mike Bayer
+Author-email: mike@zzzcomputing.com
+License: MIT
+Description: README.rst
+Keywords: wsgi myghty mako
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License Mako-0.7.0/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: Mako
+Version: 0.7.0
+Summary: A super-fast templating language that borrows the  best ideas from the existing templating languages.
+Home-page: http://www.makotemplates.org/
+Author: Mike Bayer
+Author-email: mike@zzzcomputing.com
+License: MIT
+Description: README.rst
+Keywords: wsgi myghty mako
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">markupsafe-0.18</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://pypi.python.org/pypi/MarkupSafe">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License MarkupSafe-0.18/LICENSE:
+
+Copyright (c) 2010 by Armin Ronacher and contributors.  See AUTHORS
+for more details.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms of the software as well
+as documentation, 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.
+
+* The names of the contributors may not be used to endorse or
+  promote products derived from this software without specific
+  prior written permission.
+
+THIS SOFTWARE AND DOCUMENTATION 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License MarkupSafe-0.18/MarkupSafe.egg-info/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: MarkupSafe
+Version: 0.18
+Summary: Implements a XML/HTML/XHTML Markup safe string for Python
+Home-page: http://github.com/mitsuhiko/markupsafe
+Author: Armin Ronacher
+Author-email: armin.ronacher@active-4.com
+License: BSD
+Description: MarkupSafe
+        ==========
+        
+        Implements a unicode subclass that supports HTML strings:
+        
+        &gt;&gt;&gt; from markupsafe import Markup, escape
+        &gt;&gt;&gt; escape("&lt;script&gt;alert(document.cookie);&lt;/script&gt;")
+        Markup(u'&amp;lt;script&amp;gt;alert(document.cookie);&amp;lt;/script&amp;gt;')
+        &gt;&gt;&gt; tmpl = Markup("&lt;em&gt;%s&lt;/em&gt;")
+        &gt;&gt;&gt; tmpl % "Peter &gt; Lustig"
+        Markup(u'&lt;em&gt;Peter &amp;gt; Lustig&lt;/em&gt;')
+        
+        If you want to make an object unicode that is not yet unicode
+        but don't want to lose the taint information, you can use the
+        `soft_unicode` function.  (On Python 3 you can also use `soft_str` which
+        is a different name for the same function).
+        
+        &gt;&gt;&gt; from markupsafe import soft_unicode
+        &gt;&gt;&gt; soft_unicode(42)
+        u'42'
+        &gt;&gt;&gt; soft_unicode(Markup('foo'))
+        Markup(u'foo')
+        
+        Objects can customize their HTML markup equivalent by overriding
+        the `__html__` function:
+        
+        &gt;&gt;&gt; class Foo(object):
+        ...  def __html__(self):
+        ...   return '&lt;strong&gt;Nice&lt;/strong&gt;'
+        ...
+        &gt;&gt;&gt; escape(Foo())
+        Markup(u'&lt;strong&gt;Nice&lt;/strong&gt;')
+        &gt;&gt;&gt; Markup(Foo())
+        Markup(u'&lt;strong&gt;Nice&lt;/strong&gt;')
+        
+        Since MarkupSafe 0.10 there is now also a separate escape function
+        called `escape_silent` that returns an empty string for `None` for
+        consistency with other systems that return empty strings for `None`
+        when escaping (for instance Pylons' webhelpers).
+        
+        If you also want to use this for the escape method of the Markup
+        object, you can create your own subclass that does that::
+        
+            from markupsafe import Markup, escape_silent as escape
+        
+            class SilentMarkup(Markup):
+                __slots__ = ()
+        
+                @classmethod
+                def escape(cls, s):
+                    return cls(escape(s))
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing :: Markup :: HTML
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License MarkupSafe-0.18/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: MarkupSafe
+Version: 0.18
+Summary: Implements a XML/HTML/XHTML Markup safe string for Python
+Home-page: http://github.com/mitsuhiko/markupsafe
+Author: Armin Ronacher
+Author-email: armin.ronacher@active-4.com
+License: BSD
+Description: MarkupSafe
+        ==========
+        
+        Implements a unicode subclass that supports HTML strings:
+        
+        &gt;&gt;&gt; from markupsafe import Markup, escape
+        &gt;&gt;&gt; escape("&lt;script&gt;alert(document.cookie);&lt;/script&gt;")
+        Markup(u'&amp;lt;script&amp;gt;alert(document.cookie);&amp;lt;/script&amp;gt;')
+        &gt;&gt;&gt; tmpl = Markup("&lt;em&gt;%s&lt;/em&gt;")
+        &gt;&gt;&gt; tmpl % "Peter &gt; Lustig"
+        Markup(u'&lt;em&gt;Peter &amp;gt; Lustig&lt;/em&gt;')
+        
+        If you want to make an object unicode that is not yet unicode
+        but don't want to lose the taint information, you can use the
+        `soft_unicode` function.  (On Python 3 you can also use `soft_str` which
+        is a different name for the same function).
+        
+        &gt;&gt;&gt; from markupsafe import soft_unicode
+        &gt;&gt;&gt; soft_unicode(42)
+        u'42'
+        &gt;&gt;&gt; soft_unicode(Markup('foo'))
+        Markup(u'foo')
+        
+        Objects can customize their HTML markup equivalent by overriding
+        the `__html__` function:
+        
+        &gt;&gt;&gt; class Foo(object):
+        ...  def __html__(self):
+        ...   return '&lt;strong&gt;Nice&lt;/strong&gt;'
+        ...
+        &gt;&gt;&gt; escape(Foo())
+        Markup(u'&lt;strong&gt;Nice&lt;/strong&gt;')
+        &gt;&gt;&gt; Markup(Foo())
+        Markup(u'&lt;strong&gt;Nice&lt;/strong&gt;')
+        
+        Since MarkupSafe 0.10 there is now also a separate escape function
+        called `escape_silent` that returns an empty string for `None` for
+        consistency with other systems that return empty strings for `None`
+        when escaping (for instance Pylons' webhelpers).
+        
+        If you also want to use this for the escape method of the Markup
+        object, you can create your own subclass that does that::
+        
+            from markupsafe import Markup, escape_silent as escape
+        
+            class SilentMarkup(Markup):
+                __slots__ = ()
+        
+                @classmethod
+                def escape(cls, s):
+                    return cls(escape(s))
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing :: Markup :: HTML
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">marvell_sd8787-14.64.2.47</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.marvell.com/">homepage</a></span>
@@ -13069,6 +16675,32 @@ Redistribution and use in its original form are permitted.
 
 
 <div class="product">
+<span class="title">mem-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">memento_softwareupdate-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">memtester-4.2.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://pyropus.ca/software/memtester/">homepage</a></span>
@@ -13082,11 +16714,11 @@ Redistribution and use in its original form are permitted.
 
 
 <div class="product">
-<span class="title">mesa-10.1</span>
+<span class="title">mesa-10.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://mesa3d.sourceforge.net/">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License Mesa-10.1/docs/COPYING:
+<pre>Scanned Source License Mesa-10.3/docs/COPYING:
 
 
 Some parts of Mesa are copyrighted under the GNU LGPL.  See the
@@ -13581,7 +17213,7 @@ That's all there is to it!
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Scanned Source License Mesa-10.1/docs/license.html:
+Scanned Source License Mesa-10.3/docs/license.html:
 
 &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
 &lt;html lang="en"&gt;
@@ -13688,6 +17320,9 @@ Device drivers    src/mesa/drivers/*     MIT, generally
 
 Ext headers       include/GL/glext.h     Khronos
                   include/GL/glxext.h
+
+C11 thread        include/c11/threads*.h Boost (permissive)
+emulation
 &lt;/pre&gt;
 
 &lt;p&gt;
@@ -13709,6 +17344,19 @@ In general, consult the source files for license terms.
 
 
 <div class="product">
+<span class="title">mesa-progs-8.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://mesa3d.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">mime-types-9</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gentoo.org/">homepage</a></span>
@@ -13722,6 +17370,32 @@ In general, consult the source files for license terms.
 
 
 <div class="product">
+<span class="title">minicom-2.7</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://alioth.debian.org/projects/minicom">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">minifakedns-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://code.activestate.com/recipes/491264-mini-fake-dns-server/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#PSF-2'>Gentoo Package Stock License PSF-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">mkfontdir-1.0.6</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -13908,44 +17582,13 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
 
 
 <div class="product">
-<span class="title">mobile-providers-0.0.1</span>
+<span class="title">modem-diagnostics-0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://live.gnome.org/NetworkManager/MobileBroadband/ServiceProviders">homepage</a></span>
+<span class="homepage"><a href="">homepage</a></span>
 <div class="licence">
-<pre>Gentoo Package Stock License CC-PD:
-
-THIS WORK IS IN PUBLIC DOMAIN:
-The person or persons who have associated work with this document
-(the "Dedicator" or "Certifier") hereby either (a) certifies that, to the best
-of his knowledge, the work of authorship identified is in the public domain of
-the country from which the work is published, or (b) hereby dedicates whatever
-copyright the dedicators holds in the work of authorship identified below
-(the "Work") to the public domain. A certifier, moreover, dedicates any
-copyright interest he may have in the associated work, and for these purposes,
-is described as a "dedicator" below.
-
-A certifier has taken reasonable steps to verify the copyright status of this
-work. Certifier recognizes that his good faith efforts may not shield him from
-liability if in fact the work certified is not in the public domain.
-
-Dedicator makes this dedication for the benefit of the public at large and to
-the detriment of the Dedicator's heirs and successors. Dedicator intends this
-dedication to be an overt act of relinquishment in perpetuity of all present
-and future rights under copyright law, whether vested or contingent, in the
-Work. Dedicator understands that such relinquishment of all rights includes the
-relinquishment of all rights to enforce (by lawsuit or otherwise) those
-copyrights in the Work.
-
-Dedicator recognizes that, once placed in the public domain, the Work may be
-freely reproduced, distributed, transmitted, used, modified, built upon, or
-otherwise exploited by anyone for any purpose, commercial or non-commercial,
-and in any way, including by methods that have not yet been invented or
-conceived.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<pre></pre>
 <ul>
-
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
 </ul>
 </div>
 </div>
@@ -14070,22 +17713,22 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
-<span class="title">my-padauk-2.50</span>
+<span class="title">mtplot-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;id=padauk">homepage</a></span>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#OFL-1.1'>Gentoo Package Stock License OFL-1.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">nacl-mozc-1.14.1639.104</span>
+<span class="title">mttools-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://code.google.com/p/mozc">homepage</a></span>
+<span class="homepage"><a href="">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -14096,6 +17739,19 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">my-padauk-2.50</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;id=padauk">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#OFL-1.1'>Gentoo Package Stock License OFL-1.1</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">ncurses-5.9</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnu.org/software/ncurses/">homepage</a></span>
@@ -14165,86 +17821,542 @@ Licence: other-BSD
     `make' implicit rules from creating a file called install from it
     when there is no Makefile.
 
-    This script is compatible with the BSD install script, but was written
-    from scratch.  It can only install one file at a time, a restriction
-    shared with many OS's install programs.
+    This script is compatible with the BSD install script, but was written
+    from scratch.  It can only install one file at a time, a restriction
+    shared with many OS's install programs.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in '/usr/share/common-licenses/GPL-2'
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License ncurses-5.9/test/package/debian/copyright:
+
+Upstream source http://invisible-island.net/ncurses/ncurses-examples.html
+
+Current ncurses maintainer: Thomas Dickey &lt;dickey@invisible-island.net&gt;
+
+-------------------------------------------------------------------------------
+    Copyright (c) 1998-2010,2011 Free Software Foundation, Inc.
+
+    Permission is hereby granted, free of charge, to any person obtaining a
+    copy of this software and associated documentation files (the
+    "Software"), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, distribute with modifications, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+    IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+    THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name(s) of the above copyright
+    holders shall not be used in advertising or otherwise to promote the
+    sale, use or other dealings in this Software without prior written
+    authorization.
+-------------------------------------------------------------------------------
+
+Files: install-sh
+Copyright:  1994 X Consortium
+Licence: other-BSD
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to
+    deal in the Software without restriction, including without limitation the
+    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+    sell copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+    FSF changes to this file are in the public domain.
+
+    Calling this script install-sh is preferred over install.sh, to prevent
+    `make' implicit rules from creating a file called install from it
+    when there is no Makefile.
+
+    This script is compatible with the BSD install script, but was written
+    from scratch.  It can only install one file at a time, a restriction
+    shared with many OS's install programs.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in '/usr/share/common-licenses/GPL-2'
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">net-tools-1.60_p20120127084908</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://net-tools.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">netflix-helper-2.0.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#Google-TOS'>Gentoo Package Stock License Google-TOS</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">netifaces-0.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://alastairs-place.net/netifaces/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License netifaces-0.8/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: netifaces
+Version: 0.8
+Summary: Portable network interface information.
+Home-page: http://alastairs-place.net/netifaces
+Author: Alastair Houghton
+Author-email: alastair@alastairs-place.net
+License: MIT License
+Description: netifaces provides a (hopefully portable-ish) way for Python programmers to
+        get access to a list of the network interfaces on the local machine, and to
+        obtain the addresses of those network interfaces.
+        
+        The package has been tested on Mac OS X, Windows XP, Windows Vista, Linux
+        and Solaris.
+        
+        It should work on other UNIX-like systems provided they implement
+        either getifaddrs() or support the SIOCGIFxxx socket options, although the
+        data provided by the socket options is normally less complete.
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Topic :: System :: Networking
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License netifaces-0.8/netifaces.egg-info/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: netifaces
+Version: 0.8
+Summary: Portable network interface information.
+Home-page: http://alastairs-place.net/netifaces
+Author: Alastair Houghton
+Author-email: alastair@alastairs-place.net
+License: MIT License
+Description: netifaces provides a (hopefully portable-ish) way for Python programmers to
+        get access to a list of the network interfaces on the local machine, and to
+        obtain the addresses of those network interfaces.
+        
+        The package has been tested on Mac OS X, Windows XP, Windows Vista, Linux
+        and Solaris.
+        
+        It should work on other UNIX-like systems provided they implement
+        either getifaddrs() or support the SIOCGIFxxx socket options, although the
+        data provided by the socket options is normally less complete.
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Topic :: System :: Networking
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">netperf-2.4.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.netperf.org/">homepage</a></span>
+<div class="licence">
+<pre>Gentoo Package Stock License netperf:
+
+
+              Copyright (C) 1993 Hewlett-Packard Company
+                         ALL RIGHTS RESERVED.
+  The enclosed software and documentation includes copyrighted works
+  of Hewlett-Packard Co. For as long as you comply with the following
+  limitations, you are hereby authorized to (i) use, reproduce, and
+  modify the software and documentation, and to (ii) distribute the
+  software and documentation, including modifications, for
+  non-commercial purposes only.
+      
+  1.  The enclosed software and documentation is made available at no
+      charge in order to advance the general development of
+      high-performance networking products.
+  2.  You may not delete any copyright notices contained in the
+      software or documentation. All hard copies, and copies in
+      source code or object code form, of the software or
+      documentation (including modifications) must contain at least
+      one of the copyright notices.
+  3.  The enclosed software and documentation has not been subjected
+      to testing and quality control and is not a Hewlett-Packard Co.
+      product. At a future time, Hewlett-Packard Co. may or may not
+      offer a version of the software and documentation as a product.
+  
+  4.  THE SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS".
+      HEWLETT-PACKARD COMPANY DOES NOT WARRANT THAT THE USE,
+      REPRODUCTION, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
+      DOCUMENTATION WILL NOT INFRINGE A THIRD PARTY'S INTELLECTUAL
+      PROPERTY RIGHTS. HP DOES NOT WARRANT THAT THE SOFTWARE OR
+      DOCUMENTATION IS ERROR FREE. HP DISCLAIMS ALL WARRANTIES,
+      EXPRESS AND IMPLIED, WITH REGARD TO THE SOFTWARE AND THE
+      DOCUMENTATION. HP SPECIFICALLY DISCLAIMS ALL WARRANTIES OF
+      MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+  
+  5.  HEWLETT-PACKARD COMPANY WILL NOT IN ANY EVENT BE LIABLE FOR ANY
+      DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+      (INCLUDING LOST PROFITS) RELATED TO ANY USE, REPRODUCTION,
+      MODIFICATION, OR DISTRIBUTION OF THE SOFTWARE OR DOCUMENTATION.
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">notofonts-20140130</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">nspr-4.10.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.mozilla.org/projects/nspr/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#MPL-2.0'>Gentoo Package Stock License MPL-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">nss-3.16</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.mozilla.org/projects/security/pki/nss/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#MPL-2.0'>Gentoo Package Stock License MPL-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">nss-3.16</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.mozilla.org/projects/security/pki/nss/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#MPL-2.0'>Gentoo Package Stock License MPL-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">ntfs3g-2012.1.15</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.tuxera.com/community/ntfs-3g-download/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">numpy-1.7.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://numpy.scipy.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License numpy-1.7.1/LICENSE.txt:
+
+Copyright (c) 2005-2011, NumPy Developers.
+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 the NumPy Developers nor the names of any
+       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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License numpy-1.7.1/PKG-INFO:
+
+Metadata-Version: 1.1
+Name: numpy
+Version: 1.7.1
+Summary: NumPy: array processing for numbers, strings, records, and objects.
+Home-page: http://www.numpy.org
+Author: NumPy Developers
+Author-email: numpy-discussion@scipy.org
+License: BSD
+Download-URL: http://sourceforge.net/projects/numpy/files/NumPy/
+Description: NumPy is a general-purpose array-processing package designed to
+        efficiently manipulate large multi-dimensional arrays of arbitrary
+        records without sacrificing too much speed for small multi-dimensional
+        arrays.  NumPy is built on the Numeric code base and adds features
+        introduced by numarray as well as an extended C-API and the ability to
+        create arrays of arbitrary type which also makes NumPy suitable for
+        interfacing with general-purpose data-base applications.
+        
+        There are also basic facilities for discrete fourier transform,
+        basic linear algebra and random number generation.
+        
+Platform: Windows
+Platform: Linux
+Platform: Solaris
+Platform: Mac OS-X
+Platform: Unix
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Science/Research
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved
+Classifier: Programming Language :: C
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Software Development
+Classifier: Topic :: Scientific/Engineering
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: Unix
+Classifier: Operating System :: MacOS
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License numpy-1.7.1/doc/source/license.rst:
+
+*************
+Numpy License
+*************
+
+Copyright (c) 2005, NumPy Developers
+
+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 the NumPy Developers nor the names of any
+  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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License numpy-1.7.1/doc/sphinxext/LICENSE.txt:
+
+-------------------------------------------------------------------------------
+    The files
+    - numpydoc.py
+    - docscrape.py
+    - docscrape_sphinx.py
+    - phantom_import.py
+    have the following license:
+
+Copyright (C) 2008 Stefan van der Walt &lt;stefan@mentat.za.net&gt;, Pauli Virtanen &lt;pav@iki.fi&gt;
+
+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 AUTHOR ``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 AUTHOR 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.
+
+-------------------------------------------------------------------------------
+    The files
+    - compiler_unparse.py
+    - comment_eater.py
+    - traitsdoc.py
+    have the following license:
 
-On Debian systems, the complete text of the GNU General
-Public License can be found in '/usr/share/common-licenses/GPL-2'
+This software is OSI Certified Open Source Software.
+OSI Certified is a certification mark of the Open Source Initiative.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+Copyright (c) 2006, Enthought, Inc.
+All rights reserved.
 
-Scanned Source License ncurses-5.9/test/package/debian/copyright:
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
 
-Upstream source http://invisible-island.net/ncurses/ncurses-examples.html
+ * 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 Enthought, 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.
 
-Current ncurses maintainer: Thomas Dickey &lt;dickey@invisible-island.net&gt;
 
 -------------------------------------------------------------------------------
-    Copyright (c) 1998-2010,2011 Free Software Foundation, Inc.
-
-    Permission is hereby granted, free of charge, to any person obtaining a
-    copy of this software and associated documentation files (the
-    "Software"), to deal in the Software without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, distribute with modifications, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included
-    in all copies or substantial portions of the Software.
+    The file
+    - plot_directive.py
+    originates from Matplotlib (http://matplotlib.sf.net/) which has
+    the following license:
 
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-    IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved.
 
-    Except as contained in this notice, the name(s) of the above copyright
-    holders shall not be used in advertising or otherwise to promote the
-    sale, use or other dealings in this Software without prior written
-    authorization.
--------------------------------------------------------------------------------
+1. This LICENSE AGREEMENT is between John D. Hunter (“JDH”), and the Individual or Organization (“Licensee”) accessing and otherwise using matplotlib software in source or binary form and its associated documentation.
 
-Files: install-sh
-Copyright:  1994 X Consortium
-Licence: other-BSD
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to
-    deal in the Software without restriction, including without limitation the
-    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-    sell copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
+2. Subject to the terms and conditions of this License Agreement, JDH hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use matplotlib 0.98.3 alone or in any derivative version, provided, however, that JDH’s License Agreement and JDH’s notice of copyright, i.e., “Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved” are retained in matplotlib 0.98.3 alone or in any derivative version prepared by Licensee.
 
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
+3. In the event Licensee prepares a derivative work that is based on or incorporates matplotlib 0.98.3 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to matplotlib 0.98.3.
 
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+4. JDH is making matplotlib 0.98.3 available to Licensee on an “AS IS” basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 0.98.3 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
 
-    Except as contained in this notice, the name of the X Consortium shall not
-    be used in advertising or otherwise to promote the sale, use or other deal-
-    ings in this Software without prior written authorization from the X Consor-
-    tium.
+5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB 0.98.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING MATPLOTLIB 0.98.3, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
-    FSF changes to this file are in the public domain.
+6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
 
-    Calling this script install-sh is preferred over install.sh, to prevent
-    `make' implicit rules from creating a file called install from it
-    when there is no Makefile.
+7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between JDH and Licensee. This License Agreement does not grant permission to use JDH trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party.
 
-    This script is compatible with the BSD install script, but was written
-    from scratch.  It can only install one file at a time, a restriction
-    shared with many OS's install programs.
+8. By copying, installing or otherwise using matplotlib 0.98.3, Licensee agrees to be bound by the terms and conditions of this License Agreement.
 
-On Debian systems, the complete text of the GNU General
-Public License can be found in '/usr/share/common-licenses/GPL-2'
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
@@ -14256,95 +18368,429 @@ Public License can be found in '/usr/share/common-licenses/GPL-2'
 
 
 <div class="product">
-<span class="title">net-tools-1.60_p20120127084908</span>
+<span class="title">oem-customization-0.0.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://net-tools.sourceforge.net/">homepage</a></span>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">netflix-helper-2.0.0</span>
+<span class="title">opencryptoki-2.2.8</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="">homepage</a></span>
+<span class="homepage"><a href="http://sourceforge.net/projects/opencryptoki">homepage</a></span>
 <div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#Google-TOS'>Gentoo Package Stock License Google-TOS</a></li>
-</ul>
-</div>
-</div>
+<pre>Gentoo Package Stock License CPL-0.5:
 
 
-<div class="product">
-<span class="title">notofonts-20140130</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
-</ul>
-</div>
-</div>
+Common Public License Version 0.5
 
+   THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON
+   PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+   THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
 
-<div class="product">
-<span class="title">nspr-4.10.2</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.mozilla.org/projects/nspr/">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
-<li><a href='#MPL-2.0'>Gentoo Package Stock License MPL-2.0</a></li>
-</ul>
-</div>
-</div>
+   1. DEFINITIONS
 
+   "Contribution" means:
 
-<div class="product">
-<span class="title">nss-3.15.4</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.mozilla.org/projects/security/pki/nss/">homepage</a></span>
-<div class="licence">
-<pre></pre>
+     a) in the case of the initial Contributor, the initial code and
+     documentation distributed under this Agreement, and
+
+     b) in the case of each subsequent Contributor:
+
+     i) changes to the Program, and
+
+     ii) additions to the Program;
+
+     where such changes and/or additions to the Program originate from
+     and are distributed by that particular Contributor. A Contribution
+     'originates' from a Contributor if it was added to the Program by
+     such Contributor itself or anyone acting on such Contributor's
+     behalf. Contributions do not include additions to the Program
+     which: (i) are separate modules of software distributed in
+     conjunction with the Program under their own license agreement, and
+     (ii) are not derivative works of the Program.
+
+   "Contributor" means any person or entity that distributes the Program.
+
+   "Licensed Patents " mean patent claims licensable by a Contributor
+   which are necessarily infringed by the use or sale of its Contribution
+   alone or when combined with the Program.
+
+   "Program" means the Contributions distributed in accordance with this
+   Agreement.
+
+   "Recipient" means anyone who receives the Program under this
+   Agreement, including all Contributors.
+
+   2. GRANT OF RIGHTS
+
+     a) Subject to the terms of this Agreement, each Contributor hereby
+     grants Recipient a non-exclusive, worldwide, royalty-free copyright
+     license to reproduce, prepare derivative works of, publicly
+     display, publicly perform, distribute and sublicense the
+     Contribution of such Contributor, if any, and such derivative
+     works, in source code and object code form.
+
+     b) Subject to the terms of this Agreement, each Contributor hereby
+     grants Recipient a non-exclusive, worldwide, royalty-free patent
+     license under Licensed Patents to make, use, sell, offer to sell,
+     import and otherwise transfer the Contribution of such Contributor,
+     if any, in source code and object code form. This patent license
+     shall apply to the combination of the Contribution and the Program
+     if, at the time the Contribution is added by the Contributor, such
+     addition of the Contribution causes such combination to be covered
+     by the Licensed Patents. The patent license shall not apply to any
+     other combinations which include the Contribution. No hardware per
+     se is licensed hereunder.
+
+     c) Recipient understands that although each Contributor grants the
+     licenses to its Contributions set forth herein, no assurances are
+     provided by any Contributor that the Program does not infringe the
+     patent or other intellectual property rights of any other entity.
+     Each Contributor disclaims any liability to Recipient for claims
+     brought by any other entity based on infringement of intellectual
+     property rights or otherwise. As a condition to exercising the
+     rights and licenses granted hereunder, each Recipient hereby
+     assumes sole responsibility to secure any other intellectual
+     property rights needed, if any. For example, if a third party
+     patent license is required to allow Recipient to distribute the
+     Program, it is Recipient's responsibility to acquire that license
+     before distributing the Program.
+
+     d) Each Contributor represents that to its knowledge it has
+     sufficient copyright rights in its Contribution, if any, to grant
+     the copyright license set forth in this Agreement.
+
+   3. REQUIREMENTS
+
+   A Contributor may choose to distribute the Program in object code form
+   under its own license agreement, provided that:
+
+     a) it complies with the terms and conditions of this Agreement; and
+
+     b) its license agreement:
+
+     i) effectively disclaims on behalf of all Contributors all
+     warranties and conditions, express and implied, including
+     warranties or conditions of title and non-infringement, and implied
+     warranties or conditions of merchantability and fitness for a
+     particular purpose;
+
+     ii) effectively excludes on behalf of all Contributors all
+     liability for damages, including direct, indirect, special,
+     incidental and consequential damages, such as lost profits;
+
+     iii) states that any provisions which differ from this Agreement
+     are offered by that Contributor alone and not by any other party;
+     and
+
+     iv) states that source code for the Program is available from such
+     Contributor, and informs licensees how to obtain it in a reasonable
+     manner on or through a medium customarily used for software
+     exchange.
+
+   When the Program is made available in source code form:
+
+     a) it must be made available under this Agreement; and
+
+     b) a copy of this Agreement must be included with each copy of the
+     Program.
+
+   Contributors may not remove or alter any copyright notices contained
+   within the Program.
+
+   Each Contributor must identify itself as the originator of its
+   Contribution, if any, in a manner that reasonably allows subsequent
+   Recipients to identify the originator of the Contribution.
+
+   4. COMMERCIAL DISTRIBUTION
+
+   Commercial distributors of software may accept certain
+   responsibilities with respect to end users, business partners and the
+   like. While this license is intended to facilitate the commercial use
+   of the Program, the Contributor who includes the Program in a
+   commercial product offering should do so in a manner which does not
+   create potential liability for other Contributors. Therefore, if a
+   Contributor includes the Program in a commercial product offering,
+   such Contributor ("Commercial Contributor") hereby agrees to defend
+   and indemnify every other Contributor ("Indemnified Contributor")
+   against any losses, damages and costs (collectively "Losses") arising
+   from claims, lawsuits and other legal actions brought by a third party
+   against the Indemnified Contributor to the extent caused by the acts
+   or omissions of such Commercial Contributor in connection with its
+   distribution of the Program in a commercial product offering. The
+   obligations in this section do not apply to any claims or Losses
+   relating to any actual or alleged intellectual property infringement.
+   In order to qualify, an Indemnified Contributor must: a) promptly
+   notify the Commercial Contributor in writing of such claim, and b)
+   allow the Commercial Contributor to control, and cooperate with the
+   Commercial Contributor in, the defense and any related settlement
+   negotiations. The Indemnified Contributor may participate in any such
+   claim at its own expense.
+
+   For example, a Contributor might include the Program in a commercial
+   product offering, Product X. That Contributor is then a Commercial
+   Contributor. If that Commercial Contributor then makes performance
+   claims, or offers warranties related to Product X, those performance
+   claims and warranties are such Commercial Contributor's responsibility
+   alone. Under this section, the Commercial Contributor would have to
+   defend claims against the other Contributors related to those
+   performance claims and warranties, and if a court requires any other
+   Contributor to pay any damages as a result, the Commercial Contributor
+   must pay those damages.
+
+   5. NO WARRANTY
+
+   EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+   PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+   WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+   OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+   responsible for determining the appropriateness of using and
+   distributing the Program and assumes all risks associated with its
+   exercise of rights under this Agreement, including but not limited to
+   the risks and costs of program errors, compliance with applicable
+   laws, damage to or loss of data, programs or equipment, and
+   unavailability or interruption of operations.
+
+   6. DISCLAIMER OF LIABILITY
+
+   EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+   ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+   WITHOUT LIMITATION LOST PROFITS), 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 OR
+   DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+   HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+   7. GENERAL
+
+   If any provision of this Agreement is invalid or unenforceable under
+   applicable law, it shall not affect the validity or enforceability of
+   the remainder of the terms of this Agreement, and without further
+   action by the parties hereto, such provision shall be reformed to the
+   minimum extent necessary to make such provision valid and enforceable.
+
+   If Recipient institutes patent litigation against a Contributor with
+   respect to a patent applicable to software (including a cross-claim or
+   counterclaim in a lawsuit), then any patent licenses granted by that
+   Contributor to such Recipient under this Agreement shall terminate as
+   of the date such litigation is filed. In addition, If Recipient
+   institutes patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Program
+   itself (excluding combinations of the Program with other software or
+   hardware) infringes such Recipient's patent(s), then such Recipient's
+   rights granted under Section 2(b) shall terminate as of the date such
+   litigation is filed.
+
+   All Recipient's rights under this Agreement shall terminate if it
+   fails to comply with any of the material terms or conditions of this
+   Agreement and does not cure such failure in a reasonable period of
+   time after becoming aware of such noncompliance. If all Recipient's
+   rights under this Agreement terminate, Recipient agrees to cease use
+   and distribution of the Program as soon as reasonably practicable.
+   However, Recipient's obligations under this Agreement and any licenses
+   granted by Recipient relating to the Program shall continue and
+   survive.
+
+   Everyone is permitted to copy and distribute copies of this Agreement,
+   but in order to avoid inconsistency the Agreement is copyrighted and
+   may only be modified in the following manner. The Agreement Steward
+   reserves the right to publish new versions (including revisions) of
+   this Agreement from time to time. No one other than the Agreement
+   Steward has the right to modify this Agreement. IBM is the initial
+   Agreement Steward. IBM may assign the responsibility to serve as the
+   Agreement Steward to a suitable separate entity. Each new version of
+   the Agreement will be given a distinguishing version number. The
+   Program (including Contributions) may always be distributed subject to
+   the version of the Agreement under which it was received. In addition,
+   after a new version of the Agreement is published, Contributor may
+   elect to distribute the Program (including its Contributions) under
+   the new version. Except as expressly stated in Sections 2(a) and 2(b)
+   above, Recipient receives no rights or licenses to the intellectual
+   property of any Contributor under this Agreement, whether expressly,
+   by implication, estoppel or otherwise. All rights in the Program not
+   expressly granted under this Agreement are reserved.
+
+   This Agreement is governed by the laws of the State of New York and
+   the intellectual property laws of the United States of America. No
+   party to this Agreement will bring a legal action under this Agreement
+   more than one year after the cause of action arose. Each party waives
+   its rights to a jury trial in any resulting litigation.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
 <ul>
-<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
-<li><a href='#MPL-2.0'>Gentoo Package Stock License MPL-2.0</a></li>
+
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">ntfs3g-2012.1.15</span>
+<span class="title">opencv-2.3.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.tuxera.com/community/ntfs-3g-download/">homepage</a></span>
+<span class="homepage"><a href="http://opencv.willowgarage.com">homepage</a></span>
 <div class="licence">
-<pre></pre>
+<pre>Scanned Source License OpenCV-2.3.0/3rdparty/ilmimf/LICENSE:
+
+Copyright (c) 2004, Industrial Light &amp; Magic, a division of Lucasfilm
+Entertainment Company Ltd.  Portions contributed and copyright held by
+others as indicated.  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 Industrial Light &amp; Magic nor the names of
+      any other contributors to this software 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.
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License OpenCV-2.3.0/3rdparty/libjasper/LICENSE:
+
+JasPer License Version 2.0
+
+Copyright (c) 2001-2006 Michael David Adams
+Copyright (c) 1999-2000 Image Power, Inc.
+Copyright (c) 1999-2000 The University of British Columbia
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person (the
+"User") obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge,
+publish, distribute, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the
+following conditions:
+
+1.  The above copyright notices and this permission notice (which
+includes the disclaimer below) shall be included in all copies or
+substantial portions of the Software.
+
+2.  The name of a copyright holder shall not be used to endorse or
+promote products derived from the Software without specific prior
+written permission.
+
+THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
+LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
+THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
+"AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
+PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
+THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
+EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
+BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
+PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
+GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
+ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
+IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
+SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
+AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
+SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
+THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
+PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
+RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
+EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License OpenCV-2.3.0/doc/license.txt:
+
+IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 
+
+ By downloading, copying, installing or using the software you agree to this license.
+ If you do not agree to this license, do not download, install,
+ copy or use the software.
+
+
+                          License Agreement
+               For Open Source Computer Vision Library
+
+Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
+Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved.
+Third party copyrights are property of their respective owners.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+  * Redistribution's of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.
+
+  * Redistribution's 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.
+
+  * The name of the copyright holders may not 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 Intel Corporation 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
 <ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">oem-customization-0.0.2</span>
+<span class="title">opensc-0.12.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<span class="homepage"><a href="http://www.opensc-project.org/opensc/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 </ul>
 </div>
 </div>
@@ -14708,7 +19154,20 @@ $OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
 
 
 <div class="product">
-<span class="title">openssl-1.0.1g</span>
+<span class="title">openssh-server-init-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">openssl-1.0.1h</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.openssl.org/">homepage</a></span>
 <div class="licence">
@@ -14845,16 +19304,338 @@ $OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
 <ul>
-
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">openvpn-2.3.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://openvpn.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">p2p-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pam-1.1.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://fedorahosted.org/linux-pam/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pam_pwdfile-0.99</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://cpbotha.net/pam_pwdfile.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pambase-20101024</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gentoo.org/proj/en/base/pam/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pango-1.32.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.pango.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2+'>Gentoo Package Stock License LGPL-2+</a></li>
+<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
+<li><a href='#FTL'>Gentoo Package Stock License FTL</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">parted-3.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gnu.org/software/parted">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">patch-2.6.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gnu.org/software/patch/patch.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pax-utils-0.8.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://hardened.gentoo.org/pax-utils.xml">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pciutils-3.1.10</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://mj.ucw.cz/sw/pciutils/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pepper-flash-14.0.0.145</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://git-scm.com/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#Google-TOS'>Gentoo Package Stock License Google-TOS</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">perceptualdiff-1.1.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://pdiff.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">perf-3.14</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://perf.wiki.kernel.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">permission_broker-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pexpect-2.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://pexpect.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License pexpect-2.4/LICENSE:
+
+Free, open source, and all that good stuff.
+Pexpect Copyright (c) 2008 Noah Spurrier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License pexpect-2.4/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: pexpect
+Version: 2.4
+Summary: Pexpect is a pure Python Expect. It allows easy control of other applications.
+Home-page: http://pexpect.sourceforge.net/
+Author: Noah Spurrier
+Author-email: noah@noah.org
+License: MIT license
+Description: UNKNOWN
+Platform: UNIX
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pixman-0.28.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License pixman-0.28.2/COPYING:
+
+The following is the MIT license, agreed upon by most contributors.
+Copyright holders of new code should use this license statement where
+possible. They may also add themselves to the list below.
+
+/*
+ * Copyright 1987, 1988, 1989, 1998  The Open Group
+ * Copyright 1987, 1988, 1989 Digital Equipment Corporation
+ * Copyright 1999, 2004, 2008 Keith Packard
+ * Copyright 2000 SuSE, Inc.
+ * Copyright 2000 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright 2004, 2005, 2007, 2008, 2009, 2010 Red Hat, Inc.
+ * Copyright 2004 Nicholas Miell
+ * Copyright 2005 Lars Knoll &amp; Zack Rusin, Trolltech
+ * Copyright 2005 Trolltech AS
+ * Copyright 2007 Luca Barbato
+ * Copyright 2008 Aaron Plattner, NVIDIA Corporation
+ * Copyright 2008 Rodrigo Kumpera
+ * Copyright 2008 André Tupinambá
+ * Copyright 2008 Mozilla Corporation
+ * Copyright 2008 Frederic Plourde
+ * Copyright 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2009, 2010 Nokia Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">pkcs11-helper-1.07</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.opensc-project.org/pkcs11-helper">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">platform2-0.0.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">openvpn-2.3.2</span>
+<span class="title">ply-image-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://openvpn.net/">homepage</a></span>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -14865,22 +19646,48 @@ $OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
 
 
 <div class="product">
-<span class="title">p2p-0.0.1</span>
+<span class="title">popt-1.16</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<span class="homepage"><a href="http://rpm5.org/">homepage</a></span>
 <div class="licence">
-<pre></pre>
+<pre>Scanned Source License popt-1.16/COPYING:
+
+Copyright (c) 1998  Red Hat Software
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
 <ul>
-<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">pam-1.1.5</span>
+<span class="title">portage-2.1.11.50</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="https://fedorahosted.org/linux-pam/">homepage</a></span>
+<span class="homepage"><a href="http://www.gentoo.org/proj/en/portage/index.xml">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -14891,9 +19698,9 @@ $OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
 
 
 <div class="product">
-<span class="title">pam_pwdfile-0.99</span>
+<span class="title">portage-utils-0.53</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://cpbotha.net/pam_pwdfile.html">homepage</a></span>
+<span class="homepage"><a href="http://www.gentoo.org/doc/en/portage-utils.xml">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -14904,9 +19711,9 @@ $OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
 
 
 <div class="product">
-<span class="title">pambase-20101024</span>
+<span class="title">powertop-2.5</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.gentoo.org/proj/en/base/pam/">homepage</a></span>
+<span class="homepage"><a href="https://01.org/powertop/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -14917,63 +19724,524 @@ $OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
 
 
 <div class="product">
-<span class="title">pango-1.32.5</span>
+<span class="title">ppp-2.4.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.samba.org/ppp">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License dhcp/COPYING:
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+       Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    &lt;one line to give the program's name and a brief idea of what it does.&gt;
+    Copyright (C) 19yy  &lt;name of author&gt;
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  &lt;signature of Ty Coon&gt;, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License ppp-2.4.5/pppd/plugins/pppoatm/COPYING:
+
+The files ans.c, atm.h, atmres.h, atmsap.h, misc.c, text2atm.c  and
+text2qos.c are taken from the linux-atm libraries.  These are 
+Copyright 1995-2000 EPFL-LRC/ICA, and are licensed under the GNU Lesser
+General Public License.
+
+The file pppoatm.c contains its own copyright notice, and is licensed
+under the GPL.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License ppp-2.4.5/pppd/plugins/radius/COPYRIGHT:
+
+See the respective source files to find out which copyrights apply.
+
+------------------------------------------------------------------------------
+Copyright (C) 2002 Roaring Penguin Software Inc.
+
+Permission to use, copy, modify, and distribute this software for any
+purpose and without fee is hereby granted, provided that this
+copyright and permission notice appear on all copies and supporting
+documentation, the name of Roaring Penguin Software Inc. not be used
+in advertising or publicity pertaining to distribution of the program
+without specific prior permission, and notice be given in supporting
+documentation that copying and distribution is by permission of
+Roaring Penguin Software Inc..
+
+Roaring Penguin Software Inc. makes no representations about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+------------------------------------------------------------------------------
+Copyright (C) 1995,1996,1997,1998 Lars Fenneberg &lt;lf@elemental.net&gt;
+
+Permission to use, copy, modify, and distribute this software for any
+purpose and without fee is hereby granted, provided that this copyright and
+permission notice appear on all copies and supporting documentation, the
+name of Lars Fenneberg not be used in advertising or publicity pertaining to
+distribution of the program without specific prior permission, and notice be
+given in supporting documentation that copying and distribution is by
+permission of Lars Fenneberg.
+
+Lars Fenneberg makes no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or implied
+warranty.
+
+------------------------------------------------------------------------------
+Copyright 1992 Livingston Enterprises, Inc.
+Livingston Enterprises, Inc. 6920 Koll Center Parkway Pleasanton, CA  94566
+
+Permission to use, copy, modify, and distribute this software for any
+purpose and without fee is hereby granted, provided that this copyright
+and permission notice appear on all copies and supporting documentation,
+the name of Livingston Enterprises, Inc. not be used in advertising or
+publicity pertaining to distribution of the program without specific
+prior permission, and notice be given in supporting documentation that
+copying and distribution is by permission of Livingston Enterprises, Inc.
+
+Livingston Enterprises, Inc. makes no representations about the suitability
+of this software for any purpose.  It is provided "as is" without express
+or implied warranty.
+------------------------------------------------------------------------------
+[C] The Regents of the University of Michigan and Merit Network, Inc. 1992,
+1993, 1994, 1995 All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the above copyright notice and this permission notice appear in all
+copies of the software and derivative works or modified versions thereof,
+and that both the copyright notice and this permission and disclaimer
+notice appear in supporting documentation.
+
+THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE REGENTS OF THE
+UNIVERSITY OF MICHIGAN AND MERIT NETWORK, INC. DO NOT WARRANT THAT THE
+FUNCTIONS CONTAINED IN THE SOFTWARE WILL MEET LICENSEE'S REQUIREMENTS OR
+THAT OPERATION WILL BE UNINTERRUPTED OR ERROR FREE.  The Regents of the
+University of Michigan and Merit Network, Inc. shall not be liable for any
+special, indirect, incidental or consequential damages with respect to any
+claim by Licensee or any third party arising from use of the software.
+------------------------------------------------------------------------------
+Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991.
+All rights reserved.
+
+License to copy and use this software is granted provided that it
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+Algorithm" in all material mentioning or referencing this software
+or this function.
+
+License is also granted to make and use derivative works provided
+that such works are identified as "derived from the RSA Data
+Security, Inc. MD5 Message-Digest Algorithm" in all material
+mentioning or referencing the derived work.
+
+RSA Data Security, Inc. makes no representations concerning either
+the merchantability of this software or the suitability of this
+software for any particular purpose. It is provided "as is"
+without express or implied warranty of any kind.
+
+These notices must be retained in any copies of any part of this
+documentation and/or software.
+------------------------------------------------------------------------------
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">procps-3.3.4</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.pango.org/">homepage</a></span>
+<span class="homepage"><a href="http://procps.sourceforge.net/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#LGPL-2+'>Gentoo Package Stock License LGPL-2+</a></li>
-<li><a href='#LGPL-2'>Gentoo Package Stock License LGPL-2</a></li>
-<li><a href='#FTL'>Gentoo Package Stock License FTL</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">parted-3.1</span>
+<span class="title">protobuf-2.3.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.gnu.org/software/parted">homepage</a></span>
+<span class="homepage"><a href="http://code.google.com/p/protobuf/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">patch-2.6.1</span>
+<span class="title">protobuf-python-2.3.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.gnu.org/software/patch/patch.html">homepage</a></span>
+<span class="homepage"><a href="http://code.google.com/p/protobuf/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">pax-utils-0.8.1</span>
+<span class="title">protofiles-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://hardened.gentoo.org/pax-utils.xml">homepage</a></span>
+<span class="homepage"><a href="http://chromium.org">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">pciutils-3.1.10</span>
+<span class="title">psmisc-22.20</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://mj.ucw.cz/sw/pciutils/">homepage</a></span>
+<span class="homepage"><a href="http://psmisc.sourceforge.net/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
@@ -14984,93 +20252,226 @@ $OpenBSD: LICENCE,v 1.19 2004/08/30 09:18:08 markus Exp $
 
 
 <div class="product">
-<span class="title">pepper-flash-14.0.0.95</span>
+<span class="title">punybench-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://git-scm.com/">homepage</a></span>
+<span class="homepage"><a href="https://chromium.googlesource.com/chromiumos/platform/punybench">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#Google-TOS'>Gentoo Package Stock License Google-TOS</a></li>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">perf-3.14</span>
+<span class="title">pv-1.3.4</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://perf.wiki.kernel.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.ivarch.com/programs/pv.shtml">homepage</a></span>
 <div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
-</ul>
-</div>
-</div>
+<pre>Gentoo Package Stock License Artistic-2:
 
+                      The Artistic License 2.0
 
-<div class="product">
-<span class="title">permission_broker-0.0.1</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
-</ul>
-</div>
-</div>
+           Copyright (c) 2000-2006, The Perl Foundation.
 
+     Everyone is permitted to copy and distribute verbatim copies
+      of this license document, but changing it is not allowed.
 
-<div class="product">
-<span class="title">pixman-0.28.2</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
-<div class="licence">
-<pre>Scanned Source License pixman-0.28.2/COPYING:
+Preamble
 
-The following is the MIT license, agreed upon by most contributors.
-Copyright holders of new code should use this license statement where
-possible. They may also add themselves to the list below.
+This license establishes the terms under which a given free software
+Package may be copied, modified, distributed, and/or redistributed.
+The intent is that the Copyright Holder maintains some artistic
+control over the development of that Package while still keeping the
+Package available as open source and free software.
 
-/*
- * Copyright 1987, 1988, 1989, 1998  The Open Group
- * Copyright 1987, 1988, 1989 Digital Equipment Corporation
- * Copyright 1999, 2004, 2008 Keith Packard
- * Copyright 2000 SuSE, Inc.
- * Copyright 2000 Keith Packard, member of The XFree86 Project, Inc.
- * Copyright 2004, 2005, 2007, 2008, 2009, 2010 Red Hat, Inc.
- * Copyright 2004 Nicholas Miell
- * Copyright 2005 Lars Knoll &amp; Zack Rusin, Trolltech
- * Copyright 2005 Trolltech AS
- * Copyright 2007 Luca Barbato
- * Copyright 2008 Aaron Plattner, NVIDIA Corporation
- * Copyright 2008 Rodrigo Kumpera
- * Copyright 2008 André Tupinambá
- * Copyright 2008 Mozilla Corporation
- * Copyright 2008 Frederic Plourde
- * Copyright 2009, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2009, 2010 Nokia Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
+You are always permitted to make arrangements wholly outside of this
+license directly with the Copyright Holder of a given Package.  If the
+terms of this license do not permit the full use that you propose to
+make of the Package, you should contact the Copyright Holder and seek
+a different licensing arrangement. 
+
+Definitions
+
+    "Copyright Holder" means the individual(s) or organization(s)
+    named in the copyright notice for the entire Package.
+
+    "Contributor" means any party that has contributed code or other
+    material to the Package, in accordance with the Copyright Holder's
+    procedures.
+
+    "You" and "your" means any person who would like to copy,
+    distribute, or modify the Package.
+
+    "Package" means the collection of files distributed by the
+    Copyright Holder, and derivatives of that collection and/or of
+    those files. A given Package may consist of either the Standard
+    Version, or a Modified Version.
+
+    "Distribute" means providing a copy of the Package or making it
+    accessible to anyone else, or in the case of a company or
+    organization, to others outside of your company or organization.
+
+    "Distributor Fee" means any fee that you charge for Distributing
+    this Package or providing support for this Package to another
+    party.  It does not mean licensing fees.
+
+    "Standard Version" refers to the Package if it has not been
+    modified, or has been modified only in ways explicitly requested
+    by the Copyright Holder.
+
+    "Modified Version" means the Package, if it has been changed, and
+    such changes were not explicitly requested by the Copyright
+    Holder. 
+
+    "Original License" means this Artistic License as Distributed with
+    the Standard Version of the Package, in its current version or as
+    it may be modified by The Perl Foundation in the future.
+
+    "Source" form means the source code, documentation source, and
+    configuration files for the Package.
+
+    "Compiled" form means the compiled bytecode, object code, binary,
+    or any other form resulting from mechanical transformation or
+    translation of the Source form.
+
+
+Permission for Use and Modification Without Distribution
+
+(1)  You are permitted to use the Standard Version and create and use
+Modified Versions for any purpose without restriction, provided that
+you do not Distribute the Modified Version.
+
+
+Permissions for Redistribution of the Standard Version
+
+(2)  You may Distribute verbatim copies of the Source form of the
+Standard Version of this Package in any medium without restriction,
+either gratis or for a Distributor Fee, provided that you duplicate
+all of the original copyright notices and associated disclaimers.  At
+your discretion, such verbatim copies may or may not include a
+Compiled form of the Package.
+
+(3)  You may apply any bug fixes, portability changes, and other
+modifications made available from the Copyright Holder.  The resulting
+Package will still be considered the Standard Version, and as such
+will be subject to the Original License.
+
+
+Distribution of Modified Versions of the Package as Source 
+
+(4)  You may Distribute your Modified Version as Source (either gratis
+or for a Distributor Fee, and with or without a Compiled form of the
+Modified Version) provided that you clearly document how it differs
+from the Standard Version, including, but not limited to, documenting
+any non-standard features, executables, or modules, and provided that
+you do at least ONE of the following:
+
+    (a)  make the Modified Version available to the Copyright Holder
+    of the Standard Version, under the Original License, so that the
+    Copyright Holder may include your modifications in the Standard
+    Version.
+
+    (b)  ensure that installation of your Modified Version does not
+    prevent the user installing or running the Standard Version. In
+    addition, the Modified Version must bear a name that is different
+    from the name of the Standard Version.
+
+    (c)  allow anyone who receives a copy of the Modified Version to
+    make the Source form of the Modified Version available to others
+    under
+               
+       (i)  the Original License or
+
+       (ii)  a license that permits the licensee to freely copy,
+       modify and redistribute the Modified Version using the same
+       licensing terms that apply to the copy that the licensee
+       received, and requires that the Source form of the Modified
+       Version, and of any works derived from it, be made freely
+       available in that license fees are prohibited but Distributor
+       Fees are allowed.
+
+
+Distribution of Compiled Forms of the Standard Version 
+or Modified Versions without the Source
+
+(5)  You may Distribute Compiled forms of the Standard Version without
+the Source, provided that you include complete instructions on how to
+get the Source of the Standard Version.  Such instructions must be
+valid at the time of your distribution.  If these instructions, at any
+time while you are carrying out such distribution, become invalid, you
+must provide new instructions on demand or cease further distribution.
+If you provide valid instructions or cease distribution within thirty
+days after you become aware that the instructions are invalid, then
+you do not forfeit any of your rights under this license.
+
+(6)  You may Distribute a Modified Version in Compiled form without
+the Source, provided that you comply with Section 4 with respect to
+the Source of the Modified Version.
+
+
+Aggregating or Linking the Package 
+
+(7)  You may aggregate the Package (either the Standard Version or
+Modified Version) with other packages and Distribute the resulting
+aggregation provided that you do not charge a licensing fee for the
+Package.  Distributor Fees are permitted, and licensing fees for other
+components in the aggregation are permitted. The terms of this license
+apply to the use and Distribution of the Standard or Modified Versions
+as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with
+other works, to embed the Package in a larger work of your own, or to
+build stand-alone binary or bytecode versions of applications that
+include the Package, and Distribute the result without restriction,
+provided the result does not expose a direct interface to the Package.
+
+
+Items That are Not Considered Part of a Modified Version 
+
+(9) Works (including, but not limited to, modules and scripts) that
+merely extend or make use of the Package, do not, by themselves, cause
+the Package to be a Modified Version.  In addition, such works are not
+considered parts of the Package itself, and are not subject to the
+terms of this license.
+
+
+General Provisions
+
+(10)  Any use, modification, and distribution of the Standard or
+Modified Versions is governed by this Artistic License. By using,
+modifying or distributing the Package, you accept this license. Do not
+use, modify, or distribute the Package, if you do not accept this
+license.
+
+(11)  If your Modified Version has been derived from a Modified
+Version made by someone other than you, you are nevertheless required
+to ensure that your Modified Version complies with the requirements of
+this license.
+
+(12)  This license does not grant you the right to use any trademark,
+service mark, tradename, or logo of the Copyright Holder.
+
+(13)  This license includes the non-exclusive, worldwide,
+free-of-charge patent license to make, have made, use, offer to sell,
+sell, import and otherwise transfer the Package with respect to any
+patent claims licensable by the Copyright Holder that are necessarily
+infringed by the Package. If you institute patent litigation
+(including a cross-claim or counterclaim) against any party alleging
+that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the
+date that such litigation is filed.
+
+(14)  Disclaimer of Warranty:
+THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
+LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
@@ -15082,2273 +20483,2596 @@ possible. They may also add themselves to the list below.
 
 
 <div class="product">
-<span class="title">pkcs11-helper-1.07</span>
+<span class="title">pycairo-1.10.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.opensc-project.org/pkcs11-helper">homepage</a></span>
+<span class="homepage"><a href="http://cairographics.org/pycairo/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+<li><a href='#LGPL-3'>Gentoo Package Stock License LGPL-3</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">platform2-0.0.1</span>
+<span class="title">pygobject-2.18.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.pygtk.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">ply-image-0.0.1</span>
+<span class="title">pygtk-2.14.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<span class="homepage"><a href="http://www.pygtk.org/">homepage</a></span>
 <div class="licence">
 <pre></pre>
 <ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">popt-1.16</span>
+<span class="title">pyserial-2.5_rc2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://rpm5.org/">homepage</a></span>
+<span class="homepage"><a href="http://pyserial.sourceforge.net/">homepage</a></span>
 <div class="licence">
-<pre>Scanned Source License popt-1.16/COPYING:
+<pre>Gentoo Package Stock License PYTHON:
 
-Copyright (c) 1998  Red Hat Software
+HISTORY OF THE SOFTWARE
+=======================
 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI) in the Netherlands as a successor of a
+language called ABC.  Guido is Python's principal author, although it
+includes many contributions from others.  The last version released
+from CWI was Python 1.2.  In 1995, Guido continued his work on Python
+at the Corporation for National Research Initiatives (CNRI) in Reston,
+Virginia where he released several versions of the software.  Python
+1.6 was the last of the versions released by CNRI.  In 2000, Guido and
+the Python core developement team moved to BeOpen.com to form the
+BeOpen PythonLabs team (www.pythonlabs.com).  Python 2.0 is the first
+release from PythonLabs.  Thanks to the many outside volunteers who
+have worked under Guido's direction to make this release possible.
 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
+BEOPEN.COM TERMS AND CONDITIONS FOR PYTHON 2.0
+==============================================
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
-<ul>
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+-----------------------------------------------------
 
-</ul>
-</div>
-</div>
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
 
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
 
-<div class="product">
-<span class="title">portage-2.1.11.50</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.gentoo.org/proj/en/portage/index.xml">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
-</ul>
-</div>
-</div>
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
 
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
-<div class="product">
-<span class="title">portage-utils-0.53</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.gentoo.org/doc/en/portage-utils.xml">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
-</ul>
-</div>
-</div>
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
 
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions.  Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee.  This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party.  As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
 
-<div class="product">
-<span class="title">ppp-2.4.5</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.samba.org/ppp">homepage</a></span>
-<div class="licence">
-<pre>Scanned Source License dhcp/COPYING:
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
 
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
 
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                          675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
+CNRI OPEN SOURCE LICENSE AGREEMENT
+----------------------------------
 
-                           Preamble
+Python 1.6 CNRI OPEN SOURCE LICENSE AGREEMENT
 
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
+IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY. BY CLICKING
+ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING, INSTALLING OR
+OTHERWISE USING PYTHON 1.6 SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO
+THE TERMS AND CONDITIONS OF THIS LICENSE AGREEMENT.
 
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6 software in
+source or binary form and its associated documentation, as released at
+the www.python.org Internet site on September 5, 2000 ("Python 1.6").
 
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2000 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6 alone or in any derivative
+version prepared by
+
+Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee
+may substitute the following text (omitting the quotes): "Python 1.6
+is made available subject to the terms and conditions in CNRI's
+License Agreement. This Agreement together with Python 1.6 may be
+located on the Internet using the following unique, persistent
+identifier (known as a handle): 1895.22/1012. This Agreement may also
+be obtained from a proxy server on the Internet using the following
+URL: http://hdl.handle.net/1895.22/1012".
 
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6 or any part thereof, and wants to make the
+derivative work available to others as provided herein, then Licensee
+hereby agrees to include in any such work a brief summary of the
+changes made to Python 1.6.
+
+4. CNRI is making Python 1.6 available to Licensee on an "AS IS"
+basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
 
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A
+RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6, OR
+ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
 
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
+7. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of Virginia, excluding conflict of
+law provisions. Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between CNRI and Licensee. This License Agreement does not grant
+permission to use CNRI trademarks or trade name in a trademark sense
+to endorse or promote products or services of Licensee, or any third
+party.
 
-  The precise terms and conditions for copying, distribution and
-modification follow.
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6, Licensee agrees to be bound
+by the terms and conditions of this License Agreement.
 
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+ACCEPT
 
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
 
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
+CWI PERMISSIONS STATEMENT AND DISCLAIMER
+----------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands.  All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">python-2.7.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.python.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License Python-2.7.3/Doc/license.rst:
+
+.. highlightlang:: none
 
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
+.. _history-and-license:
 
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
+*******************
+History and License
+*******************
 
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
 
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
+History of the software
+=======================
 
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl/) in the Netherlands as a
+successor of a language called ABC.  Guido remains Python's principal author,
+although it includes many contributions from others.
 
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
+In 1995, Guido continued his work on Python at the Corporation for National
+Research Initiatives (CNRI, see http://www.cnri.reston.va.us/) in Reston,
+Virginia where he released several versions of the software.
 
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
+In May 2000, Guido and the Python core development team moved to BeOpen.com to
+form the BeOpen PythonLabs team.  In October of the same year, the PythonLabs
+team moved to Digital Creations (now Zope Corporation; see
+http://www.zope.com/).  In 2001, the Python Software Foundation (PSF, see
+http://www.python.org/psf/) was formed, a non-profit organization created
+specifically to own Python-related Intellectual Property.  Zope Corporation is a
+sponsoring member of the PSF.
 
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
+All Python releases are Open Source (see http://www.opensource.org/ for the Open
+Source Definition). Historically, most, but not all, Python releases have also
+been GPL-compatible; the table below summarizes the various releases.
 
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
++----------------+--------------+-----------+------------+-----------------+
+| Release        | Derived from | Year      | Owner      | GPL compatible? |
++================+==============+===========+============+=================+
+| 0.9.0 thru 1.2 | n/a          | 1991-1995 | CWI        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 1.3 thru 1.5.2 | 1.2          | 1995-1999 | CNRI       | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 1.6            | 1.5.2        | 2000      | CNRI       | no              |
++----------------+--------------+-----------+------------+-----------------+
+| 2.0            | 1.6          | 2000      | BeOpen.com | no              |
++----------------+--------------+-----------+------------+-----------------+
+| 1.6.1          | 1.6          | 2001      | CNRI       | no              |
++----------------+--------------+-----------+------------+-----------------+
+| 2.1            | 2.0+1.6.1    | 2001      | PSF        | no              |
++----------------+--------------+-----------+------------+-----------------+
+| 2.0.1          | 2.0+1.6.1    | 2001      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.1.1          | 2.1+2.0.1    | 2001      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.2            | 2.1.1        | 2001      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.1.2          | 2.1.1        | 2002      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.1.3          | 2.1.2        | 2002      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.2.1          | 2.2          | 2002      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.2.2          | 2.2.1        | 2002      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.2.3          | 2.2.2        | 2002-2003 | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.3            | 2.2.2        | 2002-2003 | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.3.1          | 2.3          | 2002-2003 | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.3.2          | 2.3.1        | 2003      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.3.3          | 2.3.2        | 2003      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.3.4          | 2.3.3        | 2004      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.3.5          | 2.3.4        | 2005      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.4            | 2.3          | 2004      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.4.1          | 2.4          | 2005      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.4.2          | 2.4.1        | 2005      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.4.3          | 2.4.2        | 2006      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.4.4          | 2.4.3        | 2006      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.5            | 2.4          | 2006      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.5.1          | 2.5          | 2007      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.5.2          | 2.5.1        | 2008      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.5.3          | 2.5.2        | 2008      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.6            | 2.5          | 2008      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.6.1          | 2.6          | 2008      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.6.2          | 2.6.1        | 2009      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.6.3          | 2.6.2        | 2009      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.6.4          | 2.6.3        | 2010      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
+| 2.7            | 2.6          | 2010      | PSF        | yes             |
++----------------+--------------+-----------+------------+-----------------+
 
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
+.. note::
 
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
+   GPL-compatible doesn't mean that we're distributing Python under the GPL.  All
+   Python licenses, unlike the GPL, let you distribute a modified version without
+   making your changes open source. The GPL-compatible licenses make it possible to
+   combine Python with other software that is released under the GPL; the others
+   don't.
 
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
+Thanks to the many outside volunteers who have worked under Guido's direction to
+make these releases possible.
 
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
 
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
+Terms and conditions for accessing or otherwise using Python
+============================================================
 
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
 
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
+.. centered:: PSF LICENSE AGREEMENT FOR PYTHON |release|
 
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
+#. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and
+   the Individual or Organization ("Licensee") accessing and otherwise using Python
+   |release| software in source or binary form and its associated documentation.
 
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
+#. Subject to the terms and conditions of this License Agreement, PSF hereby
+   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+   analyze, test, perform and/or display publicly, prepare derivative works,
+   distribute, and otherwise use Python |release| alone or in any derivative
+   version, provided, however, that PSF's License Agreement and PSF's notice of
+   copyright, i.e., "Copyright © 2001-2012 Python Software Foundation; All Rights
+   Reserved" are retained in Python |release| alone or in any derivative version
+   prepared by Licensee.
 
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
+#. In the event Licensee prepares a derivative work that is based on or
+   incorporates Python |release| or any part thereof, and wants to make the
+   derivative work available to others as provided herein, then Licensee hereby
+   agrees to include in any such work a brief summary of the changes made to Python
+   |release|.
 
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
+#. PSF is making Python |release| available to Licensee on an "AS IS" basis.
+   PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
+   EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
+   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+   USE OF PYTHON |release| WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
 
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
+#. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON |release|
+   FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
+   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON |release|, OR ANY DERIVATIVE
+   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
+#. This License Agreement will automatically terminate upon a material breach of
+   its terms and conditions.
 
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
+#. Nothing in this License Agreement shall be deemed to create any relationship
+   of agency, partnership, or joint venture between PSF and Licensee.  This License
+   Agreement does not grant permission to use PSF trademarks or trade name in a
+   trademark sense to endorse or promote products or services of Licensee, or any
+   third party.
 
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
+#. By copying, installing or otherwise using Python |release|, Licensee agrees
+   to be bound by the terms and conditions of this License Agreement.
 
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
 
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
+.. centered:: BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
 
-                           NO WARRANTY
 
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
+.. centered:: BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
 
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
+#. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at
+   160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization
+   ("Licensee") accessing and otherwise using this software in source or binary
+   form and its associated documentation ("the Software").
 
-                    END OF TERMS AND CONDITIONS
+#. Subject to the terms and conditions of this BeOpen Python License Agreement,
+   BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license
+   to reproduce, analyze, test, perform and/or display publicly, prepare derivative
+   works, distribute, and otherwise use the Software alone or in any derivative
+   version, provided, however, that the BeOpen Python License is retained in the
+   Software, alone or in any derivative version prepared by Licensee.
 
-       Appendix: How to Apply These Terms to Your New Programs
+#. BeOpen is making the Software available to Licensee on an "AS IS" basis.
+   BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
+   EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
+   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+   USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
 
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
+#. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR
+   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING,
+   MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF
+   ADVISED OF THE POSSIBILITY THEREOF.
 
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
+#. This License Agreement will automatically terminate upon a material breach of
+   its terms and conditions.
 
-    &lt;one line to give the program's name and a brief idea of what it does.&gt;
-    Copyright (C) 19yy  &lt;name of author&gt;
+#. This License Agreement shall be governed by and interpreted in all respects
+   by the law of the State of California, excluding conflict of law provisions.
+   Nothing in this License Agreement shall be deemed to create any relationship of
+   agency, partnership, or joint venture between BeOpen and Licensee.  This License
+   Agreement does not grant permission to use BeOpen trademarks or trade names in a
+   trademark sense to endorse or promote products or services of Licensee, or any
+   third party.  As an exception, the "BeOpen Python" logos available at
+   http://www.pythonlabs.com/logos.html may be used according to the permissions
+   granted on that web page.
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+#. By copying, installing or otherwise using the software, Licensee agrees to be
+   bound by the terms and conditions of this License Agreement.
 
-    This program 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 General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+.. centered:: CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
 
-Also add information on how to contact you by electronic and paper mail.
+#. This LICENSE AGREEMENT is between the Corporation for National Research
+   Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191
+   ("CNRI"), and the Individual or Organization ("Licensee") accessing and
+   otherwise using Python 1.6.1 software in source or binary form and its
+   associated documentation.
 
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
+#. Subject to the terms and conditions of this License Agreement, CNRI hereby
+   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+   analyze, test, perform and/or display publicly, prepare derivative works,
+   distribute, and otherwise use Python 1.6.1 alone or in any derivative version,
+   provided, however, that CNRI's License Agreement and CNRI's notice of copyright,
+   i.e., "Copyright © 1995-2001 Corporation for National Research Initiatives; All
+   Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version
+   prepared by Licensee.  Alternately, in lieu of CNRI's License Agreement,
+   Licensee may substitute the following text (omitting the quotes): "Python 1.6.1
+   is made available subject to the terms and conditions in CNRI's License
+   Agreement.  This Agreement together with Python 1.6.1 may be located on the
+   Internet using the following unique, persistent identifier (known as a handle):
+   1895.22/1013.  This Agreement may also be obtained from a proxy server on the
+   Internet using the following URL: http://hdl.handle.net/1895.22/1013."
 
-    Gnomovision version 69, Copyright (C) 19yy name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
+#. In the event Licensee prepares a derivative work that is based on or
+   incorporates Python 1.6.1 or any part thereof, and wants to make the derivative
+   work available to others as provided herein, then Licensee hereby agrees to
+   include in any such work a brief summary of the changes made to Python 1.6.1.
 
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
+#. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis.  CNRI
+   MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF EXAMPLE,
+   BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY
+   OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
+   PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
 
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
+#. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR
+   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
+   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE
+   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+#. This License Agreement will automatically terminate upon a material breach of
+   its terms and conditions.
 
-  &lt;signature of Ty Coon&gt;, 1 April 1989
-  Ty Coon, President of Vice
+#. This License Agreement shall be governed by the federal intellectual property
+   law of the United States, including without limitation the federal copyright
+   law, and, to the extent such U.S. federal law does not apply, by the law of the
+   Commonwealth of Virginia, excluding Virginia's conflict of law provisions.
+   Notwithstanding the foregoing, with regard to derivative works based on Python
+   1.6.1 that incorporate non-separable material that was previously distributed
+   under the GNU General Public License (GPL), the law of the Commonwealth of
+   Virginia shall govern this License Agreement only as to issues arising under or
+   with respect to Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in
+   this License Agreement shall be deemed to create any relationship of agency,
+   partnership, or joint venture between CNRI and Licensee.  This License Agreement
+   does not grant permission to use CNRI trademarks or trade name in a trademark
+   sense to endorse or promote products or services of Licensee, or any third
+   party.
 
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+#. By clicking on the "ACCEPT" button where indicated, or by copying, installing
+   or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and
+   conditions of this License Agreement.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Scanned Source License ppp-2.4.5/pppd/plugins/pppoatm/COPYING:
+.. centered:: ACCEPT
 
-The files ans.c, atm.h, atmres.h, atmsap.h, misc.c, text2atm.c  and
-text2qos.c are taken from the linux-atm libraries.  These are 
-Copyright 1995-2000 EPFL-LRC/ICA, and are licensed under the GNU Lesser
-General Public License.
 
-The file pppoatm.c contains its own copyright notice, and is licensed
-under the GPL.
+.. centered:: CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+Copyright © 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The
+Netherlands.  All rights reserved.
 
-Scanned Source License ppp-2.4.5/pppd/plugins/radius/COPYRIGHT:
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and that
+the name of Stichting Mathematisch Centrum or CWI not be used in advertising or
+publicity pertaining to distribution of the software without specific, written
+prior permission.
 
-See the respective source files to find out which copyrights apply.
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT
+OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
 
-------------------------------------------------------------------------------
-Copyright (C) 2002 Roaring Penguin Software Inc.
 
-Permission to use, copy, modify, and distribute this software for any
-purpose and without fee is hereby granted, provided that this
-copyright and permission notice appear on all copies and supporting
-documentation, the name of Roaring Penguin Software Inc. not be used
-in advertising or publicity pertaining to distribution of the program
-without specific prior permission, and notice be given in supporting
-documentation that copying and distribution is by permission of
-Roaring Penguin Software Inc..
+Licenses and Acknowledgements for Incorporated Software
+=======================================================
 
-Roaring Penguin Software Inc. makes no representations about the
-suitability of this software for any purpose.  It is provided "as is"
-without express or implied warranty.
+This section is an incomplete, but growing list of licenses and acknowledgements
+for third-party software incorporated in the Python distribution.
 
-------------------------------------------------------------------------------
-Copyright (C) 1995,1996,1997,1998 Lars Fenneberg &lt;lf@elemental.net&gt;
 
-Permission to use, copy, modify, and distribute this software for any
-purpose and without fee is hereby granted, provided that this copyright and
-permission notice appear on all copies and supporting documentation, the
-name of Lars Fenneberg not be used in advertising or publicity pertaining to
-distribution of the program without specific prior permission, and notice be
-given in supporting documentation that copying and distribution is by
-permission of Lars Fenneberg.
+Mersenne Twister
+----------------
 
-Lars Fenneberg makes no representations about the suitability of this
-software for any purpose.  It is provided "as is" without express or implied
-warranty.
+The :mod:`_random` module includes code based on a download from
+http://www.math.keio.ac.jp/ matumoto/MT2002/emt19937ar.html. The following are
+the verbatim comments from the original code::
 
-------------------------------------------------------------------------------
-Copyright 1992 Livingston Enterprises, Inc.
-Livingston Enterprises, Inc. 6920 Koll Center Parkway Pleasanton, CA  94566
+   A C-program for MT19937, with initialization improved 2002/1/26.
+   Coded by Takuji Nishimura and Makoto Matsumoto.
 
-Permission to use, copy, modify, and distribute this software for any
-purpose and without fee is hereby granted, provided that this copyright
-and permission notice appear on all copies and supporting documentation,
-the name of Livingston Enterprises, Inc. not be used in advertising or
-publicity pertaining to distribution of the program without specific
-prior permission, and notice be given in supporting documentation that
-copying and distribution is by permission of Livingston Enterprises, Inc.
+   Before using, initialize the state by using init_genrand(seed)
+   or init_by_array(init_key, key_length).
 
-Livingston Enterprises, Inc. makes no representations about the suitability
-of this software for any purpose.  It is provided "as is" without express
-or implied warranty.
-------------------------------------------------------------------------------
-[C] The Regents of the University of Michigan and Merit Network, Inc. 1992,
-1993, 1994, 1995 All Rights Reserved
+   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+   All rights reserved.
 
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted, provided
-that the above copyright notice and this permission notice appear in all
-copies of the software and derivative works or modified versions thereof,
-and that both the copyright notice and this permission and disclaimer
-notice appear in supporting documentation.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
 
-THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE REGENTS OF THE
-UNIVERSITY OF MICHIGAN AND MERIT NETWORK, INC. DO NOT WARRANT THAT THE
-FUNCTIONS CONTAINED IN THE SOFTWARE WILL MEET LICENSEE'S REQUIREMENTS OR
-THAT OPERATION WILL BE UNINTERRUPTED OR ERROR FREE.  The Regents of the
-University of Michigan and Merit Network, Inc. shall not be liable for any
-special, indirect, incidental or consequential damages with respect to any
-claim by Licensee or any third party arising from use of the software.
-------------------------------------------------------------------------------
-Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991.
-All rights reserved.
+    1. Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
 
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
+    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.
 
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
+    3. The names of its contributors may not be used to endorse or promote
+       products derived from this software without specific prior written
+       permission.
 
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
+   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.
 
-These notices must be retained in any copies of any part of this
-documentation and/or software.
-------------------------------------------------------------------------------
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
-<ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
-</ul>
-</div>
-</div>
+   Any feedback is very welcome.
+   http://www.math.keio.ac.jp/matumoto/emt.html
+   email: matumoto@math.keio.ac.jp
 
 
-<div class="product">
-<span class="title">procps-3.3.4</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://procps.sourceforge.net/">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
-</ul>
-</div>
-</div>
+Sockets
+-------
 
+The :mod:`socket` module uses the functions, :func:`getaddrinfo`, and
+:func:`getnameinfo`, which are coded in separate source files from the WIDE
+Project, http://www.wide.ad.jp/. ::
 
-<div class="product">
-<span class="title">protobuf-2.3.0</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://code.google.com/p/protobuf/">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
-</ul>
-</div>
-</div>
+   Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+   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 the project nor the names of its contributors
+      may be used to endorse or promote products derived from this software
+      without specific prior written permission.
 
-<div class="product">
-<span class="title">protofiles-0.0.1</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://chromium.org">homepage</a></span>
-<div class="licence">
-<pre></pre>
-<ul>
-<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
-</ul>
-</div>
-</div>
+   THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+   GAI_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 PROJECT OR CONTRIBUTORS BE LIABLE
+   FOR GAI_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 GAI_ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN GAI_ANY WAY
+   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+   SUCH DAMAGE.
 
 
-<div class="product">
-<span class="title">pv-1.3.4</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.ivarch.com/programs/pv.shtml">homepage</a></span>
-<div class="licence">
-<pre>Gentoo Package Stock License Artistic-2:
+Floating point exception control
+--------------------------------
 
-                      The Artistic License 2.0
+The source for the :mod:`fpectl` module includes the following notice::
 
-           Copyright (c) 2000-2006, The Perl Foundation.
+     ---------------------------------------------------------------------
+    /                       Copyright (c) 1996.                           \
+   |          The Regents of the University of California.                 |
+   |                        All rights reserved.                           |
+   |                                                                       |
+   |   Permission to use, copy, modify, and distribute this software for   |
+   |   any purpose without fee is hereby granted, provided that this en-   |
+   |   tire notice is included in all copies of any software which is or   |
+   |   includes  a  copy  or  modification  of  this software and in all   |
+   |   copies of the supporting documentation for such software.           |
+   |                                                                       |
+   |   This  work was produced at the University of California, Lawrence   |
+   |   Livermore National Laboratory under  contract  no.  W-7405-ENG-48   |
+   |   between  the  U.S.  Department  of  Energy and The Regents of the   |
+   |   University of California for the operation of UC LLNL.              |
+   |                                                                       |
+   |                              DISCLAIMER                               |
+   |                                                                       |
+   |   This  software was prepared as an account of work sponsored by an   |
+   |   agency of the United States Government. Neither the United States   |
+   |   Government  nor the University of California nor any of their em-   |
+   |   ployees, makes any warranty, express or implied, or  assumes  any   |
+   |   liability  or  responsibility  for the accuracy, completeness, or   |
+   |   usefulness of any information,  apparatus,  product,  or  process   |
+   |   disclosed,   or  represents  that  its  use  would  not  infringe   |
+   |   privately-owned rights. Reference herein to any specific  commer-   |
+   |   cial  products,  process,  or  service  by trade name, trademark,   |
+   |   manufacturer, or otherwise, does not  necessarily  constitute  or   |
+   |   imply  its endorsement, recommendation, or favoring by the United   |
+   |   States Government or the University of California. The views  and   |
+   |   opinions  of authors expressed herein do not necessarily state or   |
+   |   reflect those of the United States Government or  the  University   |
+   |   of  California,  and shall not be used for advertising or product   |
+    \  endorsement purposes.                                              /
+     ---------------------------------------------------------------------
 
-     Everyone is permitted to copy and distribute verbatim copies
-      of this license document, but changing it is not allowed.
 
-Preamble
+MD5 message digest algorithm
+----------------------------
 
-This license establishes the terms under which a given free software
-Package may be copied, modified, distributed, and/or redistributed.
-The intent is that the Copyright Holder maintains some artistic
-control over the development of that Package while still keeping the
-Package available as open source and free software.
+The source code for the :mod:`md5` module contains the following notice::
 
-You are always permitted to make arrangements wholly outside of this
-license directly with the Copyright Holder of a given Package.  If the
-terms of this license do not permit the full use that you propose to
-make of the Package, you should contact the Copyright Holder and seek
-a different licensing arrangement. 
+     Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
 
-Definitions
+     This software is provided 'as-is', without any express or implied
+     warranty.  In no event will the authors be held liable for any damages
+     arising from the use of this software.
 
-    "Copyright Holder" means the individual(s) or organization(s)
-    named in the copyright notice for the entire Package.
+     Permission is granted to anyone to use this software for any purpose,
+     including commercial applications, and to alter it and redistribute it
+     freely, subject to the following restrictions:
 
-    "Contributor" means any party that has contributed code or other
-    material to the Package, in accordance with the Copyright Holder's
-    procedures.
+     1. The origin of this software must not be misrepresented; you must not
+        claim that you wrote the original software. If you use this software
+        in a product, an acknowledgment in the product documentation would be
+        appreciated but is not required.
+     2. Altered source versions must be plainly marked as such, and must not be
+        misrepresented as being the original software.
+     3. This notice may not be removed or altered from any source distribution.
 
-    "You" and "your" means any person who would like to copy,
-    distribute, or modify the Package.
+     L. Peter Deutsch
+     ghost@aladdin.com
 
-    "Package" means the collection of files distributed by the
-    Copyright Holder, and derivatives of that collection and/or of
-    those files. A given Package may consist of either the Standard
-    Version, or a Modified Version.
+     Independent implementation of MD5 (RFC 1321).
 
-    "Distribute" means providing a copy of the Package or making it
-    accessible to anyone else, or in the case of a company or
-    organization, to others outside of your company or organization.
+     This code implements the MD5 Algorithm defined in RFC 1321, whose
+     text is available at
+           http://www.ietf.org/rfc/rfc1321.txt
+     The code is derived from the text of the RFC, including the test suite
+     (section A.5) but excluding the rest of Appendix A.  It does not include
+     any code or documentation that is identified in the RFC as being
+     copyrighted.
 
-    "Distributor Fee" means any fee that you charge for Distributing
-    this Package or providing support for this Package to another
-    party.  It does not mean licensing fees.
+     The original and principal author of md5.h is L. Peter Deutsch
+     &lt;ghost@aladdin.com&gt;.  Other authors are noted in the change history
+     that follows (in reverse chronological order):
 
-    "Standard Version" refers to the Package if it has not been
-    modified, or has been modified only in ways explicitly requested
-    by the Copyright Holder.
+     2002-04-13 lpd Removed support for non-ANSI compilers; removed
+           references to Ghostscript; clarified derivation from RFC 1321;
+           now handles byte order either statically or dynamically.
+     1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
+     1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
+           added conditionalization for C++ compilation from Martin
+           Purschke &lt;purschke@bnl.gov&gt;.
+     1999-05-03 lpd Original version.
 
-    "Modified Version" means the Package, if it has been changed, and
-    such changes were not explicitly requested by the Copyright
-    Holder. 
 
-    "Original License" means this Artistic License as Distributed with
-    the Standard Version of the Package, in its current version or as
-    it may be modified by The Perl Foundation in the future.
+Asynchronous socket services
+----------------------------
 
-    "Source" form means the source code, documentation source, and
-    configuration files for the Package.
+The :mod:`asynchat` and :mod:`asyncore` modules contain the following notice::
 
-    "Compiled" form means the compiled bytecode, object code, binary,
-    or any other form resulting from mechanical transformation or
-    translation of the Source form.
+   Copyright 1996 by Sam Rushing
 
+                           All Rights Reserved
 
-Permission for Use and Modification Without Distribution
+   Permission to use, copy, modify, and distribute this software and
+   its documentation for any purpose and without fee is hereby
+   granted, provided that the above copyright notice appear in all
+   copies and that both that copyright notice and this permission
+   notice appear in supporting documentation, and that the name of Sam
+   Rushing not be used in advertising or publicity pertaining to
+   distribution of the software without specific, written prior
+   permission.
 
-(1)  You are permitted to use the Standard Version and create and use
-Modified Versions for any purpose without restriction, provided that
-you do not Distribute the Modified Version.
+   SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+   INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+   NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+   CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+   OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+   NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Permissions for Redistribution of the Standard Version
+Cookie management
+-----------------
 
-(2)  You may Distribute verbatim copies of the Source form of the
-Standard Version of this Package in any medium without restriction,
-either gratis or for a Distributor Fee, provided that you duplicate
-all of the original copyright notices and associated disclaimers.  At
-your discretion, such verbatim copies may or may not include a
-Compiled form of the Package.
+The :mod:`Cookie` module contains the following notice::
 
-(3)  You may apply any bug fixes, portability changes, and other
-modifications made available from the Copyright Holder.  The resulting
-Package will still be considered the Standard Version, and as such
-will be subject to the Original License.
+   Copyright 2000 by Timothy O'Malley &lt;timo@alum.mit.edu&gt;
 
+                  All Rights Reserved
 
-Distribution of Modified Versions of the Package as Source 
+   Permission to use, copy, modify, and distribute this software
+   and its documentation for any purpose and without fee is hereby
+   granted, provided that the above copyright notice appear in all
+   copies and that both that copyright notice and this permission
+   notice appear in supporting documentation, and that the name of
+   Timothy O'Malley  not be used in advertising or publicity
+   pertaining to distribution of the software without specific, written
+   prior permission.
 
-(4)  You may Distribute your Modified Version as Source (either gratis
-or for a Distributor Fee, and with or without a Compiled form of the
-Modified Version) provided that you clearly document how it differs
-from the Standard Version, including, but not limited to, documenting
-any non-standard features, executables, or modules, and provided that
-you do at least ONE of the following:
+   Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+   SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+   AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
+   ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+   WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+   ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+   PERFORMANCE OF THIS SOFTWARE.
 
-    (a)  make the Modified Version available to the Copyright Holder
-    of the Standard Version, under the Original License, so that the
-    Copyright Holder may include your modifications in the Standard
-    Version.
 
-    (b)  ensure that installation of your Modified Version does not
-    prevent the user installing or running the Standard Version. In
-    addition, the Modified Version must bear a name that is different
-    from the name of the Standard Version.
+Execution tracing
+-----------------
 
-    (c)  allow anyone who receives a copy of the Modified Version to
-    make the Source form of the Modified Version available to others
-    under
-               
-       (i)  the Original License or
+The :mod:`trace` module contains the following notice::
 
-       (ii)  a license that permits the licensee to freely copy,
-       modify and redistribute the Modified Version using the same
-       licensing terms that apply to the copy that the licensee
-       received, and requires that the Source form of the Modified
-       Version, and of any works derived from it, be made freely
-       available in that license fees are prohibited but Distributor
-       Fees are allowed.
+   portions copyright 2001, Autonomous Zones Industries, Inc., all rights...
+   err...  reserved and offered to the public under the terms of the
+   Python 2.2 license.
+   Author: Zooko O'Whielacronx
+   http://zooko.com/
+   mailto:zooko@zooko.com
 
+   Copyright 2000, Mojam Media, Inc., all rights reserved.
+   Author: Skip Montanaro
 
-Distribution of Compiled Forms of the Standard Version 
-or Modified Versions without the Source
+   Copyright 1999, Bioreason, Inc., all rights reserved.
+   Author: Andrew Dalke
 
-(5)  You may Distribute Compiled forms of the Standard Version without
-the Source, provided that you include complete instructions on how to
-get the Source of the Standard Version.  Such instructions must be
-valid at the time of your distribution.  If these instructions, at any
-time while you are carrying out such distribution, become invalid, you
-must provide new instructions on demand or cease further distribution.
-If you provide valid instructions or cease distribution within thirty
-days after you become aware that the instructions are invalid, then
-you do not forfeit any of your rights under this license.
+   Copyright 1995-1997, Automatrix, Inc., all rights reserved.
+   Author: Skip Montanaro
 
-(6)  You may Distribute a Modified Version in Compiled form without
-the Source, provided that you comply with Section 4 with respect to
-the Source of the Modified Version.
+   Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved.
 
 
-Aggregating or Linking the Package 
+   Permission to use, copy, modify, and distribute this Python software and
+   its associated documentation for any purpose without fee is hereby
+   granted, provided that the above copyright notice appears in all copies,
+   and that both that copyright notice and this permission notice appear in
+   supporting documentation, and that the name of neither Automatrix,
+   Bioreason or Mojam Media be used in advertising or publicity pertaining to
+   distribution of the software without specific, written prior permission.
 
-(7)  You may aggregate the Package (either the Standard Version or
-Modified Version) with other packages and Distribute the resulting
-aggregation provided that you do not charge a licensing fee for the
-Package.  Distributor Fees are permitted, and licensing fees for other
-components in the aggregation are permitted. The terms of this license
-apply to the use and Distribution of the Standard or Modified Versions
-as included in the aggregation.
 
-(8) You are permitted to link Modified and Standard Versions with
-other works, to embed the Package in a larger work of your own, or to
-build stand-alone binary or bytecode versions of applications that
-include the Package, and Distribute the result without restriction,
-provided the result does not expose a direct interface to the Package.
+UUencode and UUdecode functions
+-------------------------------
 
+The :mod:`uu` module contains the following notice::
 
-Items That are Not Considered Part of a Modified Version 
+   Copyright 1994 by Lance Ellinghouse
+   Cathedral City, California Republic, United States of America.
+                          All Rights Reserved
+   Permission to use, copy, modify, and distribute this software and its
+   documentation for any purpose and without fee is hereby granted,
+   provided that the above copyright notice appear in all copies and that
+   both that copyright notice and this permission notice appear in
+   supporting documentation, and that the name of Lance Ellinghouse
+   not be used in advertising or publicity pertaining to distribution
+   of the software without specific, written prior permission.
+   LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
+   THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+   FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
+   FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+   OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-(9) Works (including, but not limited to, modules and scripts) that
-merely extend or make use of the Package, do not, by themselves, cause
-the Package to be a Modified Version.  In addition, such works are not
-considered parts of the Package itself, and are not subject to the
-terms of this license.
+   Modified by Jack Jansen, CWI, July 1995:
+   - Use binascii module to do the actual line-by-line conversion
+     between ascii and binary. This results in a 1000-fold speedup. The C
+     version is still 5 times faster, though.
+   - Arguments more compliant with Python standard
 
 
-General Provisions
+XML Remote Procedure Calls
+--------------------------
 
-(10)  Any use, modification, and distribution of the Standard or
-Modified Versions is governed by this Artistic License. By using,
-modifying or distributing the Package, you accept this license. Do not
-use, modify, or distribute the Package, if you do not accept this
-license.
+The :mod:`xmlrpclib` module contains the following notice::
 
-(11)  If your Modified Version has been derived from a Modified
-Version made by someone other than you, you are nevertheless required
-to ensure that your Modified Version complies with the requirements of
-this license.
+       The XML-RPC client interface is
 
-(12)  This license does not grant you the right to use any trademark,
-service mark, tradename, or logo of the Copyright Holder.
+   Copyright (c) 1999-2002 by Secret Labs AB
+   Copyright (c) 1999-2002 by Fredrik Lundh
 
-(13)  This license includes the non-exclusive, worldwide,
-free-of-charge patent license to make, have made, use, offer to sell,
-sell, import and otherwise transfer the Package with respect to any
-patent claims licensable by the Copyright Holder that are necessarily
-infringed by the Package. If you institute patent litigation
-(including a cross-claim or counterclaim) against any party alleging
-that the Package constitutes direct or contributory patent
-infringement, then this Artistic License to you shall terminate on the
-date that such litigation is filed.
+   By obtaining, using, and/or copying this software and/or its
+   associated documentation, you agree that you have read, understood,
+   and will comply with the following terms and conditions:
 
-(14)  Disclaimer of Warranty:
-THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
-IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
-NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
-LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+   Permission to use, copy, modify, and distribute this software and
+   its associated documentation for any purpose and without fee is
+   hereby granted, provided that the above copyright notice appears in
+   all copies, and that both that copyright notice and this permission
+   notice appear in supporting documentation, and that the name of
+   Secret Labs AB or the author not be used in advertising or publicity
+   pertaining to distribution of the software without specific, written
+   prior permission.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
-<ul>
+   SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
+   TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
+   ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
+   BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+   WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+   ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+   OF THIS SOFTWARE.
 
-</ul>
-</div>
-</div>
 
+test_epoll
+----------
 
-<div class="product">
-<span class="title">python-2.7.3</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://www.python.org/">homepage</a></span>
-<div class="licence">
-<pre>Scanned Source License Python-2.7.3/Doc/license.rst:
+The :mod:`test_epoll` contains the following notice::
 
-.. highlightlang:: none
+  Copyright (c) 2001-2006 Twisted Matrix Laboratories.
 
-.. _history-and-license:
+  Permission is hereby granted, free of charge, to any person obtaining
+  a copy of this software and associated documentation files (the
+  "Software"), to deal in the Software without restriction, including
+  without limitation the rights to use, copy, modify, merge, publish,
+  distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to
+  the following conditions:
 
-*******************
-History and License
-*******************
+  The above copyright notice and this permission notice shall be
+  included in all copies or substantial portions of the Software.
 
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-History of the software
-=======================
+Select kqueue
+-------------
 
-Python was created in the early 1990s by Guido van Rossum at Stichting
-Mathematisch Centrum (CWI, see http://www.cwi.nl/) in the Netherlands as a
-successor of a language called ABC.  Guido remains Python's principal author,
-although it includes many contributions from others.
+The :mod:`select` and contains the following notice for the kqueue interface::
 
-In 1995, Guido continued his work on Python at the Corporation for National
-Research Initiatives (CNRI, see http://www.cnri.reston.va.us/) in Reston,
-Virginia where he released several versions of the software.
+  Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
+  All rights reserved.
 
-In May 2000, Guido and the Python core development team moved to BeOpen.com to
-form the BeOpen PythonLabs team.  In October of the same year, the PythonLabs
-team moved to Digital Creations (now Zope Corporation; see
-http://www.zope.com/).  In 2001, the Python Software Foundation (PSF, see
-http://www.python.org/psf/) was formed, a non-profit organization created
-specifically to own Python-related Intellectual Property.  Zope Corporation is a
-sponsoring member of the PSF.
+  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.
 
-All Python releases are Open Source (see http://www.opensource.org/ for the Open
-Source Definition). Historically, most, but not all, Python releases have also
-been GPL-compatible; the table below summarizes the various releases.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
 
-+----------------+--------------+-----------+------------+-----------------+
-| Release        | Derived from | Year      | Owner      | GPL compatible? |
-+================+==============+===========+============+=================+
-| 0.9.0 thru 1.2 | n/a          | 1991-1995 | CWI        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 1.3 thru 1.5.2 | 1.2          | 1995-1999 | CNRI       | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 1.6            | 1.5.2        | 2000      | CNRI       | no              |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.0            | 1.6          | 2000      | BeOpen.com | no              |
-+----------------+--------------+-----------+------------+-----------------+
-| 1.6.1          | 1.6          | 2001      | CNRI       | no              |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.1            | 2.0+1.6.1    | 2001      | PSF        | no              |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.0.1          | 2.0+1.6.1    | 2001      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.1.1          | 2.1+2.0.1    | 2001      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.2            | 2.1.1        | 2001      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.1.2          | 2.1.1        | 2002      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.1.3          | 2.1.2        | 2002      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.2.1          | 2.2          | 2002      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.2.2          | 2.2.1        | 2002      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.2.3          | 2.2.2        | 2002-2003 | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.3            | 2.2.2        | 2002-2003 | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.3.1          | 2.3          | 2002-2003 | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.3.2          | 2.3.1        | 2003      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.3.3          | 2.3.2        | 2003      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.3.4          | 2.3.3        | 2004      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.3.5          | 2.3.4        | 2005      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.4            | 2.3          | 2004      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.4.1          | 2.4          | 2005      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.4.2          | 2.4.1        | 2005      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.4.3          | 2.4.2        | 2006      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.4.4          | 2.4.3        | 2006      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.5            | 2.4          | 2006      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.5.1          | 2.5          | 2007      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.5.2          | 2.5.1        | 2008      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.5.3          | 2.5.2        | 2008      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.6            | 2.5          | 2008      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.6.1          | 2.6          | 2008      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.6.2          | 2.6.1        | 2009      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.6.3          | 2.6.2        | 2009      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.6.4          | 2.6.3        | 2010      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
-| 2.7            | 2.6          | 2010      | PSF        | yes             |
-+----------------+--------------+-----------+------------+-----------------+
 
-.. note::
+strtod and dtoa
+---------------
 
-   GPL-compatible doesn't mean that we're distributing Python under the GPL.  All
-   Python licenses, unlike the GPL, let you distribute a modified version without
-   making your changes open source. The GPL-compatible licenses make it possible to
-   combine Python with other software that is released under the GPL; the others
-   don't.
+The file :file:`Python/dtoa.c`, which supplies C functions dtoa and
+strtod for conversion of C doubles to and from strings, is derived
+from the file of the same name by David M. Gay, currently available
+from http://www.netlib.org/fp/.  The original file, as retrieved on
+March 16, 2009, contains the following copyright and licensing
+notice::
 
-Thanks to the many outside volunteers who have worked under Guido's direction to
-make these releases possible.
+   /****************************************************************
+    *
+    * The author of this software is David M. Gay.
+    *
+    * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
+    *
+    * Permission to use, copy, modify, and distribute this software for any
+    * purpose without fee is hereby granted, provided that this entire notice
+    * is included in all copies of any software which is or includes a copy
+    * or modification of this software and in all copies of the supporting
+    * documentation for such software.
+    *
+    * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+    * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
+    * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+    * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+    *
+    ***************************************************************/
 
 
-Terms and conditions for accessing or otherwise using Python
-============================================================
+OpenSSL
+-------
 
+The modules :mod:`hashlib`, :mod:`posix`, :mod:`ssl`, :mod:`crypt` use
+the OpenSSL library for added performance if made available by the
+operating system. Additionally, the Windows installers for Python
+include a copy of the OpenSSL libraries, so we include a copy of the
+OpenSSL license here::
 
-.. centered:: PSF LICENSE AGREEMENT FOR PYTHON |release|
 
-#. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and
-   the Individual or Organization ("Licensee") accessing and otherwise using Python
-   |release| software in source or binary form and its associated documentation.
+  LICENSE ISSUES
+  ==============
 
-#. Subject to the terms and conditions of this License Agreement, PSF hereby
-   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
-   analyze, test, perform and/or display publicly, prepare derivative works,
-   distribute, and otherwise use Python |release| alone or in any derivative
-   version, provided, however, that PSF's License Agreement and PSF's notice of
-   copyright, i.e., "Copyright © 2001-2012 Python Software Foundation; All Rights
-   Reserved" are retained in Python |release| alone or in any derivative version
-   prepared by Licensee.
+  The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+  the OpenSSL License and the original SSLeay license apply to the toolkit.
+  See below for the actual license texts. Actually both licenses are BSD-style
+  Open Source licenses. In case of any license issues related to OpenSSL
+  please contact openssl-core@openssl.org.
 
-#. In the event Licensee prepares a derivative work that is based on or
-   incorporates Python |release| or any part thereof, and wants to make the
-   derivative work available to others as provided herein, then Licensee hereby
-   agrees to include in any such work a brief summary of the changes made to Python
-   |release|.
+  OpenSSL License
+  ---------------
 
-#. PSF is making Python |release| available to Licensee on an "AS IS" basis.
-   PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
-   EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
-   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
-   USE OF PYTHON |release| WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+    /* ====================================================================
+     * Copyright (c) 1998-2008 The OpenSSL Project.  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. All advertising materials mentioning features or use of this
+     *    software must display the following acknowledgment:
+     *    "This product includes software developed by the OpenSSL Project
+     *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+     *
+     * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+     *    endorse or promote products derived from this software without
+     *    prior written permission. For written permission, please contact
+     *    openssl-core@openssl.org.
+     *
+     * 5. Products derived from this software may not be called "OpenSSL"
+     *    nor may "OpenSSL" appear in their names without prior written
+     *    permission of the OpenSSL Project.
+     *
+     * 6. Redistributions of any form whatsoever must retain the following
+     *    acknowledgment:
+     *    "This product includes software developed by the OpenSSL Project
+     *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+     *
+     * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+     * EXPRESSED 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 OpenSSL PROJECT 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 product includes cryptographic software written by Eric Young
+     * (eay@cryptsoft.com).  This product includes software written by Tim
+     * Hudson (tjh@cryptsoft.com).
+     *
+     */
 
-#. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON |release|
-   FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
-   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON |release|, OR ANY DERIVATIVE
-   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+ Original SSLeay License
+ -----------------------
 
-#. This License Agreement will automatically terminate upon a material breach of
-   its terms and conditions.
+    /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+     * All rights reserved.
+     *
+     * This package is an SSL implementation written
+     * by Eric Young (eay@cryptsoft.com).
+     * The implementation was written so as to conform with Netscapes SSL.
+     *
+     * This library is free for commercial and non-commercial use as long as
+     * the following conditions are aheared to.  The following conditions
+     * apply to all code found in this distribution, be it the RC4, RSA,
+     * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+     * included with this distribution is covered by the same copyright terms
+     * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+     *
+     * Copyright remains Eric Young's, and as such any Copyright notices in
+     * the code are not to be removed.
+     * If this package is used in a product, Eric Young should be given attribution
+     * as the author of the parts of the library used.
+     * This can be in the form of a textual message at program startup or
+     * in documentation (online or textual) provided with the package.
+     *
+     * 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 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. All advertising materials mentioning features or use of this software
+     *    must display the following acknowledgement:
+     *    "This product includes cryptographic software written by
+     *     Eric Young (eay@cryptsoft.com)"
+     *    The word 'cryptographic' can be left out if the rouines from the library
+     *    being used are not cryptographic related :-).
+     * 4. If you include any Windows specific code (or a derivative thereof) from
+     *    the apps directory (application code) you must include an acknowledgement:
+     *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+     *
+     * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
+     *
+     * The licence and distribution terms for any publically available version or
+     * derivative of this code cannot be changed.  i.e. this code cannot simply be
+     * copied and put under another distribution licence
+     * [including the GNU Public Licence.]
+     */
 
-#. Nothing in this License Agreement shall be deemed to create any relationship
-   of agency, partnership, or joint venture between PSF and Licensee.  This License
-   Agreement does not grant permission to use PSF trademarks or trade name in a
-   trademark sense to endorse or promote products or services of Licensee, or any
-   third party.
 
-#. By copying, installing or otherwise using Python |release|, Licensee agrees
-   to be bound by the terms and conditions of this License Agreement.
+expat
+-----
 
+The :mod:`pyexpat` extension is built using an included copy of the expat
+sources unless the build is configured ``--with-system-expat``::
 
-.. centered:: BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+  Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+                                 and Clark Cooper
 
+  Permission is hereby granted, free of charge, to any person obtaining
+  a copy of this software and associated documentation files (the
+  "Software"), to deal in the Software without restriction, including
+  without limitation the rights to use, copy, modify, merge, publish,
+  distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to
+  the following conditions:
 
-.. centered:: BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+  The above copyright notice and this permission notice shall be included
+  in all copies or substantial portions of the Software.
 
-#. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at
-   160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization
-   ("Licensee") accessing and otherwise using this software in source or binary
-   form and its associated documentation ("the Software").
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-#. Subject to the terms and conditions of this BeOpen Python License Agreement,
-   BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license
-   to reproduce, analyze, test, perform and/or display publicly, prepare derivative
-   works, distribute, and otherwise use the Software alone or in any derivative
-   version, provided, however, that the BeOpen Python License is retained in the
-   Software, alone or in any derivative version prepared by Licensee.
 
-#. BeOpen is making the Software available to Licensee on an "AS IS" basis.
-   BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
-   EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
-   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
-   USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+libffi
+------
 
-#. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR
-   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING,
-   MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF
-   ADVISED OF THE POSSIBILITY THEREOF.
+The :mod:`_ctypes` extension is built using an included copy of the libffi
+sources unless the build is configured ``--with-system-libffi``::
 
-#. This License Agreement will automatically terminate upon a material breach of
-   its terms and conditions.
+   Copyright (c) 1996-2008  Red Hat, Inc and others.
 
-#. This License Agreement shall be governed by and interpreted in all respects
-   by the law of the State of California, excluding conflict of law provisions.
-   Nothing in this License Agreement shall be deemed to create any relationship of
-   agency, partnership, or joint venture between BeOpen and Licensee.  This License
-   Agreement does not grant permission to use BeOpen trademarks or trade names in a
-   trademark sense to endorse or promote products or services of Licensee, or any
-   third party.  As an exception, the "BeOpen Python" logos available at
-   http://www.pythonlabs.com/logos.html may be used according to the permissions
-   granted on that web page.
+   Permission is hereby granted, free of charge, to any person obtaining
+   a copy of this software and associated documentation files (the
+   ``Software''), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
 
-#. By copying, installing or otherwise using the software, Licensee agrees to be
-   bound by the terms and conditions of this License Agreement.
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
 
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   DEALINGS IN THE SOFTWARE.
 
-.. centered:: CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
 
-#. This LICENSE AGREEMENT is between the Corporation for National Research
-   Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191
-   ("CNRI"), and the Individual or Organization ("Licensee") accessing and
-   otherwise using Python 1.6.1 software in source or binary form and its
-   associated documentation.
+zlib
+----
 
-#. Subject to the terms and conditions of this License Agreement, CNRI hereby
-   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
-   analyze, test, perform and/or display publicly, prepare derivative works,
-   distribute, and otherwise use Python 1.6.1 alone or in any derivative version,
-   provided, however, that CNRI's License Agreement and CNRI's notice of copyright,
-   i.e., "Copyright © 1995-2001 Corporation for National Research Initiatives; All
-   Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version
-   prepared by Licensee.  Alternately, in lieu of CNRI's License Agreement,
-   Licensee may substitute the following text (omitting the quotes): "Python 1.6.1
-   is made available subject to the terms and conditions in CNRI's License
-   Agreement.  This Agreement together with Python 1.6.1 may be located on the
-   Internet using the following unique, persistent identifier (known as a handle):
-   1895.22/1013.  This Agreement may also be obtained from a proxy server on the
-   Internet using the following URL: http://hdl.handle.net/1895.22/1013."
+The :mod:`zlib` extension is built using an included copy of the zlib
+sources if the zlib version found on the system is too old to be
+used for the build::
 
-#. In the event Licensee prepares a derivative work that is based on or
-   incorporates Python 1.6.1 or any part thereof, and wants to make the derivative
-   work available to others as provided herein, then Licensee hereby agrees to
-   include in any such work a brief summary of the changes made to Python 1.6.1.
+  Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
 
-#. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis.  CNRI
-   MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF EXAMPLE,
-   BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY
-   OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
-   PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
 
-#. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR
-   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
-   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE
-   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
 
-#. This License Agreement will automatically terminate upon a material breach of
-   its terms and conditions.
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
 
-#. This License Agreement shall be governed by the federal intellectual property
-   law of the United States, including without limitation the federal copyright
-   law, and, to the extent such U.S. federal law does not apply, by the law of the
-   Commonwealth of Virginia, excluding Virginia's conflict of law provisions.
-   Notwithstanding the foregoing, with regard to derivative works based on Python
-   1.6.1 that incorporate non-separable material that was previously distributed
-   under the GNU General Public License (GPL), the law of the Commonwealth of
-   Virginia shall govern this License Agreement only as to issues arising under or
-   with respect to Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in
-   this License Agreement shall be deemed to create any relationship of agency,
-   partnership, or joint venture between CNRI and Licensee.  This License Agreement
-   does not grant permission to use CNRI trademarks or trade name in a trademark
-   sense to endorse or promote products or services of Licensee, or any third
-   party.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
 
-#. By clicking on the "ACCEPT" button where indicated, or by copying, installing
-   or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and
-   conditions of this License Agreement.
+  3. This notice may not be removed or altered from any source distribution.
 
+  Jean-loup Gailly        Mark Adler
+  jloup@gzip.org          madler@alumni.caltech.edu
 
-.. centered:: ACCEPT
 
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-.. centered:: CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+Scanned Source License Python-2.7.3/LICENSE:
 
-Copyright © 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The
-Netherlands.  All rights reserved.
+A. HISTORY OF THE SOFTWARE
+==========================
 
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted, provided that
-the above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation, and that
-the name of Stichting Mathematisch Centrum or CWI not be used in advertising or
-publicity pertaining to distribution of the software without specific, written
-prior permission.
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC.  Guido remains Python's
+principal author, although it includes many contributions from others.
 
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT
-OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
 
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
+year, the PythonLabs team moved to Digital Creations (now Zope
+Corporation, see http://www.zope.com).  In 2001, the Python Software
+Foundation (PSF, see http://www.python.org/psf/) was formed, a
+non-profit organization created specifically to own Python-related
+Intellectual Property.  Zope Corporation is a sponsoring member of
+the PSF.
 
-Licenses and Acknowledgements for Incorporated Software
-=======================================================
+All Python releases are Open Source (see http://www.opensource.org for
+the Open Source Definition).  Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
 
-This section is an incomplete, but growing list of licenses and acknowledgements
-for third-party software incorporated in the Python distribution.
+    Release         Derived     Year        Owner       GPL-
+                    from                                compatible? (1)
 
+    0.9.0 thru 1.2              1991-1995   CWI         yes
+    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
+    1.6             1.5.2       2000        CNRI        no
+    2.0             1.6         2000        BeOpen.com  no
+    1.6.1           1.6         2001        CNRI        yes (2)
+    2.1             2.0+1.6.1   2001        PSF         no
+    2.0.1           2.0+1.6.1   2001        PSF         yes
+    2.1.1           2.1+2.0.1   2001        PSF         yes
+    2.2             2.1.1       2001        PSF         yes
+    2.1.2           2.1.1       2002        PSF         yes
+    2.1.3           2.1.2       2002        PSF         yes
+    2.2.1           2.2         2002        PSF         yes
+    2.2.2           2.2.1       2002        PSF         yes
+    2.2.3           2.2.2       2003        PSF         yes
+    2.3             2.2.2       2002-2003   PSF         yes
+    2.3.1           2.3         2002-2003   PSF         yes
+    2.3.2           2.3.1       2002-2003   PSF         yes
+    2.3.3           2.3.2       2002-2003   PSF         yes
+    2.3.4           2.3.3       2004        PSF         yes
+    2.3.5           2.3.4       2005        PSF         yes
+    2.4             2.3         2004        PSF         yes
+    2.4.1           2.4         2005        PSF         yes
+    2.4.2           2.4.1       2005        PSF         yes
+    2.4.3           2.4.2       2006        PSF         yes
+    2.4.4           2.4.3       2006        PSF         yes
+    2.5             2.4         2006        PSF         yes
+    2.5.1           2.5         2007        PSF         yes
+    2.5.2           2.5.1       2008        PSF         yes
+    2.5.3           2.5.2       2008        PSF         yes
+    2.6             2.5         2008        PSF         yes
+    2.6.1           2.6         2008        PSF         yes
+    2.6.2           2.6.1       2009        PSF         yes
+    2.6.3           2.6.2       2009        PSF         yes
+    2.6.4           2.6.3       2009        PSF         yes
+    2.6.5           2.6.4       2010        PSF         yes
+    2.7             2.6         2010        PSF         yes
 
-Mersenne Twister
-----------------
+Footnotes:
 
-The :mod:`_random` module includes code based on a download from
-http://www.math.keio.ac.jp/ matumoto/MT2002/emt19937ar.html. The following are
-the verbatim comments from the original code::
+(1) GPL-compatible doesn't mean that we're distributing Python under
+    the GPL.  All Python licenses, unlike the GPL, let you distribute
+    a modified version without making your changes open source.  The
+    GPL-compatible licenses make it possible to combine Python with
+    other software that is released under the GPL; the others don't.
 
-   A C-program for MT19937, with initialization improved 2002/1/26.
-   Coded by Takuji Nishimura and Makoto Matsumoto.
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+    because its license has a choice of law clause.  According to
+    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+    is "not incompatible" with the GPL.
 
-   Before using, initialize the state by using init_genrand(seed)
-   or init_by_array(init_key, key_length).
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
 
-   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
-   All rights reserved.
 
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions
-   are met:
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
 
-    1. Redistributions of source code must retain the above copyright
-       notice, this list of conditions and the following disclaimer.
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
 
-    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.
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
 
-    3. The names of its contributors may not be used to endorse or promote
-       products derived from this software without specific prior written
-       permission.
+2. Subject to the terms and conditions of this License Agreement, PSF hereby
+grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+analyze, test, perform and/or display publicly, prepare derivative works,
+distribute, and otherwise use Python alone or in any derivative version,
+provided, however, that PSF's License Agreement and PSF's notice of copyright,
+i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python
+alone or in any derivative version prepared by Licensee.
 
-   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.
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
 
+4. PSF is making Python available to Licensee on an "AS IS"
+basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
 
-   Any feedback is very welcome.
-   http://www.math.keio.ac.jp/matumoto/emt.html
-   email: matumoto@math.keio.ac.jp
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
 
-Sockets
--------
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee.  This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
 
-The :mod:`socket` module uses the functions, :func:`getaddrinfo`, and
-:func:`getnameinfo`, which are coded in separate source files from the WIDE
-Project, http://www.wide.ad.jp/. ::
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
 
-   Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
-   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 the project nor the names of its contributors
-      may be used to endorse or promote products derived from this software
-      without specific prior written permission.
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
 
-   THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-   GAI_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 PROJECT OR CONTRIBUTORS BE LIABLE
-   FOR GAI_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 GAI_ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN GAI_ANY WAY
-   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-   SUCH DAMAGE.
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
 
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
 
-Floating point exception control
---------------------------------
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
 
-The source for the :mod:`fpectl` module includes the following notice::
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
 
-     ---------------------------------------------------------------------
-    /                       Copyright (c) 1996.                           \
-   |          The Regents of the University of California.                 |
-   |                        All rights reserved.                           |
-   |                                                                       |
-   |   Permission to use, copy, modify, and distribute this software for   |
-   |   any purpose without fee is hereby granted, provided that this en-   |
-   |   tire notice is included in all copies of any software which is or   |
-   |   includes  a  copy  or  modification  of  this software and in all   |
-   |   copies of the supporting documentation for such software.           |
-   |                                                                       |
-   |   This  work was produced at the University of California, Lawrence   |
-   |   Livermore National Laboratory under  contract  no.  W-7405-ENG-48   |
-   |   between  the  U.S.  Department  of  Energy and The Regents of the   |
-   |   University of California for the operation of UC LLNL.              |
-   |                                                                       |
-   |                              DISCLAIMER                               |
-   |                                                                       |
-   |   This  software was prepared as an account of work sponsored by an   |
-   |   agency of the United States Government. Neither the United States   |
-   |   Government  nor the University of California nor any of their em-   |
-   |   ployees, makes any warranty, express or implied, or  assumes  any   |
-   |   liability  or  responsibility  for the accuracy, completeness, or   |
-   |   usefulness of any information,  apparatus,  product,  or  process   |
-   |   disclosed,   or  represents  that  its  use  would  not  infringe   |
-   |   privately-owned rights. Reference herein to any specific  commer-   |
-   |   cial  products,  process,  or  service  by trade name, trademark,   |
-   |   manufacturer, or otherwise, does not  necessarily  constitute  or   |
-   |   imply  its endorsement, recommendation, or favoring by the United   |
-   |   States Government or the University of California. The views  and   |
-   |   opinions  of authors expressed herein do not necessarily state or   |
-   |   reflect those of the United States Government or  the  University   |
-   |   of  California,  and shall not be used for advertising or product   |
-    \  endorsement purposes.                                              /
-     ---------------------------------------------------------------------
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
 
-MD5 message digest algorithm
-----------------------------
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions.  Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee.  This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party.  As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
 
-The source code for the :mod:`md5` module contains the following notice::
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
 
-     Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
 
-     This software is provided 'as-is', without any express or implied
-     warranty.  In no event will the authors be held liable for any damages
-     arising from the use of this software.
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
 
-     Permission is granted to anyone to use this software for any purpose,
-     including commercial applications, and to alter it and redistribute it
-     freely, subject to the following restrictions:
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
 
-     1. The origin of this software must not be misrepresented; you must not
-        claim that you wrote the original software. If you use this software
-        in a product, an acknowledgment in the product documentation would be
-        appreciated but is not required.
-     2. Altered source versions must be plainly marked as such, and must not be
-        misrepresented as being the original software.
-     3. This notice may not be removed or altered from any source distribution.
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee.  Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement.  This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013.  This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
 
-     L. Peter Deutsch
-     ghost@aladdin.com
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
 
-     Independent implementation of MD5 (RFC 1321).
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
 
-     This code implements the MD5 Algorithm defined in RFC 1321, whose
-     text is available at
-           http://www.ietf.org/rfc/rfc1321.txt
-     The code is derived from the text of the RFC, including the test suite
-     (section A.5) but excluding the rest of Appendix A.  It does not include
-     any code or documentation that is identified in the RFC as being
-     copyrighted.
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 
-     The original and principal author of md5.h is L. Peter Deutsch
-     &lt;ghost@aladdin.com&gt;.  Other authors are noted in the change history
-     that follows (in reverse chronological order):
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
 
-     2002-04-13 lpd Removed support for non-ANSI compilers; removed
-           references to Ghostscript; clarified derivation from RFC 1321;
-           now handles byte order either statically or dynamically.
-     1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
-     1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
-           added conditionalization for C++ compilation from Martin
-           Purschke &lt;purschke@bnl.gov&gt;.
-     1999-05-03 lpd Original version.
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee.  This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
 
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
 
-Asynchronous socket services
-----------------------------
+        ACCEPT
 
-The :mod:`asynchat` and :mod:`asyncore` modules contain the following notice::
 
-   Copyright 1996 by Sam Rushing
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
 
-                           All Rights Reserved
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands.  All rights reserved.
 
-   Permission to use, copy, modify, and distribute this software and
-   its documentation for any purpose and without fee is hereby
-   granted, provided that the above copyright notice appear in all
-   copies and that both that copyright notice and this permission
-   notice appear in supporting documentation, and that the name of Sam
-   Rushing not be used in advertising or publicity pertaining to
-   distribution of the software without specific, written prior
-   permission.
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
 
-   SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-   INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-   NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-   CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-   OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-   NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Cookie management
------------------
+Scanned Source License Python-2.7.3/Modules/_ctypes/darwin/LICENSE:
 
-The :mod:`Cookie` module contains the following notice::
+Copyright (c) 2002 Jorge Acereda  &lt;jacereda@users.sourceforge.net&gt; &amp;
+                   Peter O'Gorman &lt;ogorman@users.sourceforge.net&gt;
+                   
+Portions may be copyright others, see the AUTHORS file included with this
+distribution.
 
-   Copyright 2000 by Timothy O'Malley &lt;timo@alum.mit.edu&gt;
+Maintained by Peter O'Gorman &lt;ogorman@users.sourceforge.net&gt;
 
-                  All Rights Reserved
+Bug Reports and other queries should go to &lt;ogorman@users.sourceforge.net&gt;
 
-   Permission to use, copy, modify, and distribute this software
-   and its documentation for any purpose and without fee is hereby
-   granted, provided that the above copyright notice appear in all
-   copies and that both that copyright notice and this permission
-   notice appear in supporting documentation, and that the name of
-   Timothy O'Malley  not be used in advertising or publicity
-   pertaining to distribution of the software without specific, written
-   prior permission.
 
-   Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-   SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-   AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
-   ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-   WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-   ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-   PERFORMANCE OF THIS SOFTWARE.
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
 
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
 
-Execution tracing
------------------
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-The :mod:`trace` module contains the following notice::
 
-   portions copyright 2001, Autonomous Zones Industries, Inc., all rights...
-   err...  reserved and offered to the public under the terms of the
-   Python 2.2 license.
-   Author: Zooko O'Whielacronx
-   http://zooko.com/
-   mailto:zooko@zooko.com
 
-   Copyright 2000, Mojam Media, Inc., all rights reserved.
-   Author: Skip Montanaro
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-   Copyright 1999, Bioreason, Inc., all rights reserved.
-   Author: Andrew Dalke
+Scanned Source License Python-2.7.3/Modules/_ctypes/libffi/LICENSE:
 
-   Copyright 1995-1997, Automatrix, Inc., all rights reserved.
-   Author: Skip Montanaro
+libffi - Copyright (c) 1996-2009  Anthony Green, Red Hat, Inc and others.  
+See source files for details.
 
-   Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
 
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
 
-   Permission to use, copy, modify, and distribute this Python software and
-   its associated documentation for any purpose without fee is hereby
-   granted, provided that the above copyright notice appears in all copies,
-   and that both that copyright notice and this permission notice appear in
-   supporting documentation, and that the name of neither Automatrix,
-   Bioreason or Mojam Media be used in advertising or publicity pertaining to
-   distribution of the software without specific, written prior permission.
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-UUencode and UUdecode functions
--------------------------------
+Scanned Source License Python-2.7.3/Modules/_ctypes/libffi_msvc/LICENSE:
 
-The :mod:`uu` module contains the following notice::
+libffi - Copyright (c) 1996-2003  Red Hat, Inc.
 
-   Copyright 1994 by Lance Ellinghouse
-   Cathedral City, California Republic, United States of America.
-                          All Rights Reserved
-   Permission to use, copy, modify, and distribute this software and its
-   documentation for any purpose and without fee is hereby granted,
-   provided that the above copyright notice appear in all copies and that
-   both that copyright notice and this permission notice appear in
-   supporting documentation, and that the name of Lance Ellinghouse
-   not be used in advertising or publicity pertaining to distribution
-   of the software without specific, written prior permission.
-   LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
-   THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-   FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
-   FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-   OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
 
-   Modified by Jack Jansen, CWI, July 1995:
-   - Use binascii module to do the actual line-by-line conversion
-     between ascii and binary. This results in a 1000-fold speedup. The C
-     version is still 5 times faster, though.
-   - Arguments more compliant with Python standard
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
 
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
 
-XML Remote Procedure Calls
---------------------------
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-The :mod:`xmlrpclib` module contains the following notice::
+Scanned Source License Python-2.7.3/Modules/_ctypes/libffi_osx/LICENSE:
 
-       The XML-RPC client interface is
+libffi - Copyright (c) 1996-2003  Red Hat, Inc.
 
-   Copyright (c) 1999-2002 by Secret Labs AB
-   Copyright (c) 1999-2002 by Fredrik Lundh
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
 
-   By obtaining, using, and/or copying this software and/or its
-   associated documentation, you agree that you have read, understood,
-   and will comply with the following terms and conditions:
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
 
-   Permission to use, copy, modify, and distribute this software and
-   its associated documentation for any purpose and without fee is
-   hereby granted, provided that the above copyright notice appears in
-   all copies, and that both that copyright notice and this permission
-   notice appear in supporting documentation, and that the name of
-   Secret Labs AB or the author not be used in advertising or publicity
-   pertaining to distribution of the software without specific, written
-   prior permission.
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
 
-   SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
-   TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
-   ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
-   BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
-   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-   WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-   ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-   OF THIS SOFTWARE.
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
+Scanned Source License Python-2.7.3/Modules/expat/COPYING:
 
-test_epoll
-----------
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+                               and Clark Cooper
 
-The :mod:`test_epoll` contains the following notice::
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
 
-  Copyright (c) 2001-2006 Twisted Matrix Laboratories.
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
 
-  Permission is hereby granted, free of charge, to any person obtaining
-  a copy of this software and associated documentation files (the
-  "Software"), to deal in the Software without restriction, including
-  without limitation the rights to use, copy, modify, merge, publish,
-  distribute, sublicense, and/or sell copies of the Software, and to
-  permit persons to whom the Software is furnished to do so, subject to
-  the following conditions:
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-  The above copyright notice and this permission notice shall be
-  included in all copies or substantial portions of the Software.
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+Scanned Source License Python-2.7.3/Tools/pybench/LICENSE:
 
-Select kqueue
--------------
+pybench License
+---------------
 
-The :mod:`select` and contains the following notice for the kqueue interface::
+This copyright notice and license applies to all files in the pybench
+directory of the pybench distribution.
 
-  Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
-  All rights reserved.
+Copyright (c), 1997-2006, Marc-Andre Lemburg (mal@lemburg.com)
+Copyright (c), 2000-2006, eGenix.com Software GmbH (info@egenix.com)
 
-  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.
+                   All Rights Reserved.
 
-  THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee or royalty is hereby
+granted, provided that the above copyright notice appear in all copies
+and that both that copyright notice and this permission notice appear
+in supporting documentation or portions thereof, including
+modifications, that you make.
 
+THE AUTHOR MARC-ANDRE LEMBURG DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
+INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE !
 
-strtod and dtoa
----------------
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+<li><a href='#PSF-2'>Gentoo Package Stock License PSF-2</a></li>
+</ul>
+</div>
+</div>
 
-The file :file:`Python/dtoa.c`, which supplies C functions dtoa and
-strtod for conversion of C doubles to and from strings, is derived
-from the file of the same name by David M. Gay, currently available
-from http://www.netlib.org/fp/.  The original file, as retrieved on
-March 16, 2009, contains the following copyright and licensing
-notice::
 
-   /****************************************************************
-    *
-    * The author of this software is David M. Gay.
-    *
-    * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
-    *
-    * Permission to use, copy, modify, and distribute this software for any
-    * purpose without fee is hereby granted, provided that this entire notice
-    * is included in all copies of any software which is or includes a copy
-    * or modification of this software and in all copies of the supporting
-    * documentation for such software.
-    *
-    * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
-    * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
-    * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
-    * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
-    *
-    ***************************************************************/
+<div class="product">
+<span class="title">python-evdev-0.3.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://gvalkov.github.com/python-evdev/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License python-evdev-0.3.1/LICENSE:
 
+Copyright (c) 2012 Georgi Valkov. All rights reserved.
 
-OpenSSL
--------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
 
-The modules :mod:`hashlib`, :mod:`posix`, :mod:`ssl`, :mod:`crypt` use
-the OpenSSL library for added performance if made available by the
-operating system. Additionally, the Windows installers for Python
-include a copy of the OpenSSL libraries, so we include a copy of the
-OpenSSL license here::
+  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 author 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 GEORGI VALKOV 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.
 
-  LICENSE ISSUES
-  ==============
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
 
-  The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
-  the OpenSSL License and the original SSLeay license apply to the toolkit.
-  See below for the actual license texts. Actually both licenses are BSD-style
-  Open Source licenses. In case of any license issues related to OpenSSL
-  please contact openssl-core@openssl.org.
+</ul>
+</div>
+</div>
 
-  OpenSSL License
-  ---------------
 
-    /* ====================================================================
-     * Copyright (c) 1998-2008 The OpenSSL Project.  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. All advertising materials mentioning features or use of this
-     *    software must display the following acknowledgment:
-     *    "This product includes software developed by the OpenSSL Project
-     *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
-     *
-     * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
-     *    endorse or promote products derived from this software without
-     *    prior written permission. For written permission, please contact
-     *    openssl-core@openssl.org.
-     *
-     * 5. Products derived from this software may not be called "OpenSSL"
-     *    nor may "OpenSSL" appear in their names without prior written
-     *    permission of the OpenSSL Project.
-     *
-     * 6. Redistributions of any form whatsoever must retain the following
-     *    acknowledgment:
-     *    "This product includes software developed by the OpenSSL Project
-     *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
-     *
-     * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
-     * EXPRESSED 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 OpenSSL PROJECT 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 product includes cryptographic software written by Eric Young
-     * (eay@cryptsoft.com).  This product includes software written by Tim
-     * Hudson (tjh@cryptsoft.com).
-     *
-     */
+<div class="product">
+<span class="title">python-exec-0.3.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<div class="licence">
+<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-lang/python-exec:
 
- Original SSLeay License
- -----------------------
+Copyright 2012 Michał Górny
+All rights reserved
 
-    /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-     * All rights reserved.
-     *
-     * This package is an SSL implementation written
-     * by Eric Young (eay@cryptsoft.com).
-     * The implementation was written so as to conform with Netscapes SSL.
-     *
-     * This library is free for commercial and non-commercial use as long as
-     * the following conditions are aheared to.  The following conditions
-     * apply to all code found in this distribution, be it the RC4, RSA,
-     * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
-     * included with this distribution is covered by the same copyright terms
-     * except that the holder is Tim Hudson (tjh@cryptsoft.com).
-     *
-     * Copyright remains Eric Young's, and as such any Copyright notices in
-     * the code are not to be removed.
-     * If this package is used in a product, Eric Young should be given attribution
-     * as the author of the parts of the library used.
-     * This can be in the form of a textual message at program startup or
-     * in documentation (online or textual) provided with the package.
-     *
-     * 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 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. All advertising materials mentioning features or use of this software
-     *    must display the following acknowledgement:
-     *    "This product includes cryptographic software written by
-     *     Eric Young (eay@cryptsoft.com)"
-     *    The word 'cryptographic' can be left out if the rouines from the library
-     *    being used are not cryptographic related :-).
-     * 4. If you include any Windows specific code (or a derivative thereof) from
-     *    the apps directory (application code) you must include an acknowledgement:
-     *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
-     *
-     * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
-     *
-     * The licence and distribution terms for any publically available version or
-     * derivative of this code cannot be changed.  i.e. this code cannot simply be
-     * copied and put under another distribution licence
-     * [including the GNU Public Licence.]
-     */
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing 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 AUTHOR ``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 AUTHOR 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.
 
-expat
------
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
 
-The :mod:`pyexpat` extension is built using an included copy of the expat
-sources unless the build is configured ``--with-system-expat``::
+</ul>
+</div>
+</div>
 
-  Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
-                                 and Clark Cooper
 
-  Permission is hereby granted, free of charge, to any person obtaining
-  a copy of this software and associated documentation files (the
-  "Software"), to deal in the Software without restriction, including
-  without limitation the rights to use, copy, modify, merge, publish,
-  distribute, sublicense, and/or sell copies of the Software, and to
-  permit persons to whom the Software is furnished to do so, subject to
-  the following conditions:
+<div class="product">
+<span class="title">python-exec-10000.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<div class="licence">
+<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-python/python-exec:
 
-  The above copyright notice and this permission notice shall be included
-  in all copies or substantial portions of the Software.
+Copyright 2012 Michał Górny
+All rights reserved
 
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing 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 AUTHOR ``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 AUTHOR 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.
 
-libffi
-------
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
 
-The :mod:`_ctypes` extension is built using an included copy of the libffi
-sources unless the build is configured ``--with-system-libffi``::
+</ul>
+</div>
+</div>
 
-   Copyright (c) 1996-2008  Red Hat, Inc and others.
 
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
+<div class="product">
+<span class="title">python-exec-10000.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<div class="licence">
+<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-python/python-exec:
 
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
+Copyright 2012 Michał Górny
+All rights reserved
 
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing 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 AUTHOR ``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 AUTHOR 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.
 
-zlib
-----
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
 
-The :mod:`zlib` extension is built using an included copy of the zlib
-sources if the zlib version found on the system is too old to be
-used for the build::
+</ul>
+</div>
+</div>
 
-  Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
 
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
+<div class="product">
+<span class="title">python-exec-2.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<div class="licence">
+<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-lang/python-exec:
 
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
+Copyright 2012 Michał Górny
+All rights reserved
 
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing 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.
 
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
 
-  3. This notice may not be removed or altered from any source distribution.
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
 
-  Jean-loup Gailly        Mark Adler
-  jloup@gzip.org          madler@alumni.caltech.edu
+</ul>
+</div>
+</div>
 
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+<div class="product">
+<span class="title">pyudev-0.12</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://packages.python.org/pyudev/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License pyudev-0.12/COPYING:
 
-Scanned Source License Python-2.7.3/LICENSE:
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
 
-A. HISTORY OF THE SOFTWARE
-==========================
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
 
-Python was created in the early 1990s by Guido van Rossum at Stichting
-Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
-as a successor of a language called ABC.  Guido remains Python's
-principal author, although it includes many contributions from others.
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
 
-In 1995, Guido continued his work on Python at the Corporation for
-National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
-in Reston, Virginia where he released several versions of the
-software.
+                           Preamble
 
-In May 2000, Guido and the Python core development team moved to
-BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
-year, the PythonLabs team moved to Digital Creations (now Zope
-Corporation, see http://www.zope.com).  In 2001, the Python Software
-Foundation (PSF, see http://www.python.org/psf/) was formed, a
-non-profit organization created specifically to own Python-related
-Intellectual Property.  Zope Corporation is a sponsoring member of
-the PSF.
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
 
-All Python releases are Open Source (see http://www.opensource.org for
-the Open Source Definition).  Historically, most, but not all, Python
-releases have also been GPL-compatible; the table below summarizes
-the various releases.
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
 
-    Release         Derived     Year        Owner       GPL-
-                    from                                compatible? (1)
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
 
-    0.9.0 thru 1.2              1991-1995   CWI         yes
-    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
-    1.6             1.5.2       2000        CNRI        no
-    2.0             1.6         2000        BeOpen.com  no
-    1.6.1           1.6         2001        CNRI        yes (2)
-    2.1             2.0+1.6.1   2001        PSF         no
-    2.0.1           2.0+1.6.1   2001        PSF         yes
-    2.1.1           2.1+2.0.1   2001        PSF         yes
-    2.2             2.1.1       2001        PSF         yes
-    2.1.2           2.1.1       2002        PSF         yes
-    2.1.3           2.1.2       2002        PSF         yes
-    2.2.1           2.2         2002        PSF         yes
-    2.2.2           2.2.1       2002        PSF         yes
-    2.2.3           2.2.2       2003        PSF         yes
-    2.3             2.2.2       2002-2003   PSF         yes
-    2.3.1           2.3         2002-2003   PSF         yes
-    2.3.2           2.3.1       2002-2003   PSF         yes
-    2.3.3           2.3.2       2002-2003   PSF         yes
-    2.3.4           2.3.3       2004        PSF         yes
-    2.3.5           2.3.4       2005        PSF         yes
-    2.4             2.3         2004        PSF         yes
-    2.4.1           2.4         2005        PSF         yes
-    2.4.2           2.4.1       2005        PSF         yes
-    2.4.3           2.4.2       2006        PSF         yes
-    2.4.4           2.4.3       2006        PSF         yes
-    2.5             2.4         2006        PSF         yes
-    2.5.1           2.5         2007        PSF         yes
-    2.5.2           2.5.1       2008        PSF         yes
-    2.5.3           2.5.2       2008        PSF         yes
-    2.6             2.5         2008        PSF         yes
-    2.6.1           2.6         2008        PSF         yes
-    2.6.2           2.6.1       2009        PSF         yes
-    2.6.3           2.6.2       2009        PSF         yes
-    2.6.4           2.6.3       2009        PSF         yes
-    2.6.5           2.6.4       2010        PSF         yes
-    2.7             2.6         2010        PSF         yes
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
 
-Footnotes:
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
 
-(1) GPL-compatible doesn't mean that we're distributing Python under
-    the GPL.  All Python licenses, unlike the GPL, let you distribute
-    a modified version without making your changes open source.  The
-    GPL-compatible licenses make it possible to combine Python with
-    other software that is released under the GPL; the others don't.
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
 
-(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
-    because its license has a choice of law clause.  According to
-    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
-    is "not incompatible" with the GPL.
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
 
-Thanks to the many outside volunteers who have worked under Guido's
-direction to make these releases possible.
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
 
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
 
-B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
-===============================================================
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
 
-PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
---------------------------------------------
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
 
-1. This LICENSE AGREEMENT is between the Python Software Foundation
-("PSF"), and the Individual or Organization ("Licensee") accessing and
-otherwise using this software ("Python") in source or binary form and
-its associated documentation.
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
 
-2. Subject to the terms and conditions of this License Agreement, PSF hereby
-grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
-analyze, test, perform and/or display publicly, prepare derivative works,
-distribute, and otherwise use Python alone or in any derivative version,
-provided, however, that PSF's License Agreement and PSF's notice of copyright,
-i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python
-alone or in any derivative version prepared by Licensee.
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
 
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python.
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
 
-4. PSF is making Python available to Licensee on an "AS IS"
-basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
 
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
 
-7. Nothing in this License Agreement shall be deemed to create any
-relationship of agency, partnership, or joint venture between PSF and
-Licensee.  This License Agreement does not grant permission to use PSF
-trademarks or trade name in a trademark sense to endorse or promote
-products or services of Licensee, or any third party.
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
 
-8. By copying, installing or otherwise using Python, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
 
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
 
-BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
--------------------------------------------
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
 
-BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
 
-1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
-office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
-Individual or Organization ("Licensee") accessing and otherwise using
-this software in source or binary form and its associated
-documentation ("the Software").
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
 
-2. Subject to the terms and conditions of this BeOpen Python License
-Agreement, BeOpen hereby grants Licensee a non-exclusive,
-royalty-free, world-wide license to reproduce, analyze, test, perform
-and/or display publicly, prepare derivative works, distribute, and
-otherwise use the Software alone or in any derivative version,
-provided, however, that the BeOpen Python License is retained in the
-Software, alone or in any derivative version prepared by Licensee.
+    a) The modified work must itself be a software library.
 
-3. BeOpen is making the Software available to Licensee on an "AS IS"
-basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
 
-4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
-SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
-AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
-DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
 
-5. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
 
-6. This License Agreement shall be governed by and interpreted in all
-respects by the law of the State of California, excluding conflict of
-law provisions.  Nothing in this License Agreement shall be deemed to
-create any relationship of agency, partnership, or joint venture
-between BeOpen and Licensee.  This License Agreement does not grant
-permission to use BeOpen trademarks or trade names in a trademark
-sense to endorse or promote products or services of Licensee, or any
-third party.  As an exception, the "BeOpen Python" logos available at
-http://www.pythonlabs.com/logos.html may be used according to the
-permissions granted on that web page.
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
 
-7. By copying, installing or otherwise using the software, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
 
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
 
-CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
----------------------------------------
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
 
-1. This LICENSE AGREEMENT is between the Corporation for National
-Research Initiatives, having an office at 1895 Preston White Drive,
-Reston, VA 20191 ("CNRI"), and the Individual or Organization
-("Licensee") accessing and otherwise using Python 1.6.1 software in
-source or binary form and its associated documentation.
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
 
-2. Subject to the terms and conditions of this License Agreement, CNRI
-hereby grants Licensee a nonexclusive, royalty-free, world-wide
-license to reproduce, analyze, test, perform and/or display publicly,
-prepare derivative works, distribute, and otherwise use Python 1.6.1
-alone or in any derivative version, provided, however, that CNRI's
-License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
-1995-2001 Corporation for National Research Initiatives; All Rights
-Reserved" are retained in Python 1.6.1 alone or in any derivative
-version prepared by Licensee.  Alternately, in lieu of CNRI's License
-Agreement, Licensee may substitute the following text (omitting the
-quotes): "Python 1.6.1 is made available subject to the terms and
-conditions in CNRI's License Agreement.  This Agreement together with
-Python 1.6.1 may be located on the Internet using the following
-unique, persistent identifier (known as a handle): 1895.22/1013.  This
-Agreement may also be obtained from a proxy server on the Internet
-using the following URL: http://hdl.handle.net/1895.22/1013".
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
 
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python 1.6.1 or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python 1.6.1.
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
 
-4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
-basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
 
-5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
 
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
 
-7. This License Agreement shall be governed by the federal
-intellectual property law of the United States, including without
-limitation the federal copyright law, and, to the extent such
-U.S. federal law does not apply, by the law of the Commonwealth of
-Virginia, excluding Virginia's conflict of law provisions.
-Notwithstanding the foregoing, with regard to derivative works based
-on Python 1.6.1 that incorporate non-separable material that was
-previously distributed under the GNU General Public License (GPL), the
-law of the Commonwealth of Virginia shall govern this License
-Agreement only as to issues arising under or with respect to
-Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
-License Agreement shall be deemed to create any relationship of
-agency, partnership, or joint venture between CNRI and Licensee.  This
-License Agreement does not grant permission to use CNRI trademarks or
-trade name in a trademark sense to endorse or promote products or
-services of Licensee, or any third party.
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
 
-8. By clicking on the "ACCEPT" button where indicated, or by copying,
-installing or otherwise using Python 1.6.1, Licensee agrees to be
-bound by the terms and conditions of this License Agreement.
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
 
-        ACCEPT
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
 
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
 
-CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
---------------------------------------------------
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
 
-Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
-The Netherlands.  All rights reserved.
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
 
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
 
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
 
-Scanned Source License Python-2.7.3/Modules/_ctypes/darwin/LICENSE:
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
 
-Copyright (c) 2002 Jorge Acereda  &lt;jacereda@users.sourceforge.net&gt; &amp;
-                   Peter O'Gorman &lt;ogorman@users.sourceforge.net&gt;
-                   
-Portions may be copyright others, see the AUTHORS file included with this
-distribution.
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
 
-Maintained by Peter O'Gorman &lt;ogorman@users.sourceforge.net&gt;
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
 
-Bug Reports and other queries should go to &lt;ogorman@users.sourceforge.net&gt;
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
 
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
 
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
 
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
 
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
 
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
 
-Scanned Source License Python-2.7.3/Modules/_ctypes/libffi/LICENSE:
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
 
-libffi - Copyright (c) 1996-2009  Anthony Green, Red Hat, Inc and others.  
-See source files for details.
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
 
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
 
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
 
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
 
-Scanned Source License Python-2.7.3/Modules/_ctypes/libffi_msvc/LICENSE:
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
 
-libffi - Copyright (c) 1996-2003  Red Hat, Inc.
+                           NO WARRANTY
 
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
 
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
+                    END OF TERMS AND CONDITIONS
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+           How to Apply These Terms to Your New Libraries
 
-Scanned Source License Python-2.7.3/Modules/_ctypes/libffi_osx/LICENSE:
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
 
-libffi - Copyright (c) 1996-2003  Red Hat, Inc.
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
 
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
+    &lt;one line to give the library's name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
 
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
 
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
+    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
+    Lesser General Public License for more details.
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-Scanned Source License Python-2.7.3/Modules/expat/COPYING:
+Also add information on how to contact you by electronic and paper mail.
 
-Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
-                               and Clark Cooper
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
 
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
 
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
+  &lt;signature of Ty Coon&gt;, 1 April 1990
+  Ty Coon, President of Vice
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+That's all there is to it!
 
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Scanned Source License Python-2.7.3/Tools/pybench/LICENSE:
 
-pybench License
----------------
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-This copyright notice and license applies to all files in the pybench
-directory of the pybench distribution.
+Scanned Source License pyudev-0.12/PKG-INFO:
 
-Copyright (c), 1997-2006, Marc-Andre Lemburg (mal@lemburg.com)
-Copyright (c), 2000-2006, eGenix.com Software GmbH (info@egenix.com)
+Metadata-Version: 1.0
+Name: pyudev
+Version: 0.12
+Summary: A libudev binding
+Home-page: http://packages.python.org/pyudev
+Author: Sebastian Wiesner
+Author-email: lunaryorn@googlemail.com
+License: MIT/X11
+Description: ######
+        pyudev
+        ######
+        
+        http://packages.python.org/pyudev
+        
+        pyudev is a Python_ binding for libudev_, available under the terms fo the
+        `GNU LGPL 2.1`_ (see ``COPYING``).
+        
+        Refer to the website_ for detailed information and API documentation.
+        
+        
+        Installation
+        ============
+        
+        The basic binding is implemented in pure Python atop of ctypes_.  The only
+        dependencies are udev_ and Python.pyudev supports CPython_ 2.6 or newer
+        (including 3.x) and PyPy_ 1.5 or newer, and is tested against udev_ 151 and
+        newer.  Older versions of older versions of udev_ may or may not work.
+        
+        The toolkit integration modules in ``pyudev.pyqt4``, ``pyudev.pyside`` and
+        ``pyudev.glib`` require some libraries from the corresponding toolkit.
+        Refer to the documentation of these modules for a more precise description.
+        
+        Installation is rather simple, just run::
+        
+           python setup.py install
+        
+        
+        Issues and Feedback
+        ===================
+        
+        There is a mailing list at pyudev@librelist.com for user questions and
+        development discussions around pyudev.  To subscribe to this list, just send
+        a mail to pyudev@librelist.com and reply to the configuration mail.  The
+        original mail is ditched.
+        
+        Issues or enhancement proposals should be reported to the `issue tracker`_.
+        Thank you.
+        
+        
+        Development
+        ===========
+        
+        Development happens on GitHub_.  The complete source code is available in a
+        git_ repository::
+        
+           git clone --recursive git://github.com/lunaryorn/pyudev.git
+        
+        Feel free to fork the repository.  Pull requests and patches are welcome!
+        
+        .. _GNU LGPL 2.1: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+        .. _Python: http://www.python.org/
+        .. _CPython: http://www.python.org/
+        .. _PyPy: http://codespeak.net/pypy/
+        .. _PyQt4: http://www.riverbankcomputing.co.uk/software/pyqt/intro/
+        .. _udev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
+        .. _libudev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
+        .. _website: http://packages.python.org/pyudev
+        .. _ctypes: http://docs.python.org/library/ctypes.html
+        .. _issue tracker: http://github.com/lunaryorn/pyudev/issues
+        .. _GitHub: http://github.com/lunaryorn/pyudev
+        .. _git: http://www.git-scm.com/
+        
+Platform: Linux
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: System :: Hardware
+Classifier: Topic :: System :: Operating System Kernels :: Linux
 
-                   All Rights Reserved.
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee or royalty is hereby
-granted, provided that the above copyright notice appear in all copies
-and that both that copyright notice and this permission notice appear
-in supporting documentation or portions thereof, including
-modifications, that you make.
+Scanned Source License pyudev-0.12/pyudev.egg-info/PKG-INFO:
 
-THE AUTHOR MARC-ANDRE LEMBURG DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
-INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
-FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-WITH THE USE OR PERFORMANCE OF THIS SOFTWARE !
+Metadata-Version: 1.0
+Name: pyudev
+Version: 0.12
+Summary: A libudev binding
+Home-page: http://packages.python.org/pyudev
+Author: Sebastian Wiesner
+Author-email: lunaryorn@googlemail.com
+License: MIT/X11
+Description: ######
+        pyudev
+        ######
+        
+        http://packages.python.org/pyudev
+        
+        pyudev is a Python_ binding for libudev_, available under the terms fo the
+        `GNU LGPL 2.1`_ (see ``COPYING``).
+        
+        Refer to the website_ for detailed information and API documentation.
+        
+        
+        Installation
+        ============
+        
+        The basic binding is implemented in pure Python atop of ctypes_.  The only
+        dependencies are udev_ and Python.pyudev supports CPython_ 2.6 or newer
+        (including 3.x) and PyPy_ 1.5 or newer, and is tested against udev_ 151 and
+        newer.  Older versions of older versions of udev_ may or may not work.
+        
+        The toolkit integration modules in ``pyudev.pyqt4``, ``pyudev.pyside`` and
+        ``pyudev.glib`` require some libraries from the corresponding toolkit.
+        Refer to the documentation of these modules for a more precise description.
+        
+        Installation is rather simple, just run::
+        
+           python setup.py install
+        
+        
+        Issues and Feedback
+        ===================
+        
+        There is a mailing list at pyudev@librelist.com for user questions and
+        development discussions around pyudev.  To subscribe to this list, just send
+        a mail to pyudev@librelist.com and reply to the configuration mail.  The
+        original mail is ditched.
+        
+        Issues or enhancement proposals should be reported to the `issue tracker`_.
+        Thank you.
+        
+        
+        Development
+        ===========
+        
+        Development happens on GitHub_.  The complete source code is available in a
+        git_ repository::
+        
+           git clone --recursive git://github.com/lunaryorn/pyudev.git
+        
+        Feel free to fork the repository.  Pull requests and patches are welcome!
+        
+        .. _GNU LGPL 2.1: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+        .. _Python: http://www.python.org/
+        .. _CPython: http://www.python.org/
+        .. _PyPy: http://codespeak.net/pypy/
+        .. _PyQt4: http://www.riverbankcomputing.co.uk/software/pyqt/intro/
+        .. _udev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
+        .. _libudev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
+        .. _website: http://packages.python.org/pyudev
+        .. _ctypes: http://docs.python.org/library/ctypes.html
+        .. _issue tracker: http://github.com/lunaryorn/pyudev/issues
+        .. _GitHub: http://github.com/lunaryorn/pyudev
+        .. _git: http://www.git-scm.com/
+        
+Platform: Linux
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: System :: Hardware
+Classifier: Topic :: System :: Operating System Kernels :: Linux
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
 <ul>
-<li><a href='#PSF-2'>Gentoo Package Stock License PSF-2</a></li>
+
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">python-exec-0.3.1</span>
+<span class="title">pyusb-1.0.0_beta1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<span class="homepage"><a href="http://pyusb.sourceforge.net/">homepage</a></span>
 <div class="licence">
-<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-lang/python-exec:
+<pre>Scanned Source License pyusb-1.0.0b1/LICENSE:
 
-Copyright 2012 Michał Górny
-All rights reserved
+Copyright (C) 2009-2011 Wander Lairson Costa. All Rights Reserved.
 
 Redistribution and use in source and binary forms, with or without
-modification, are permitted providing that the following conditions·
+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 AUTHOR ``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 AUTHOR 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.
+3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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.
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License pyusb-1.0.0b1/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: pyusb
+Version: 1.0.0b1
+Summary: Python USB access module
+Home-page: http://pyusb.sourceforge.net
+Author: Wander Lairson Costa
+Author-email: wander.lairson@gmail.com
+License: BSD
+Description: 
+        PyUSB offers easy USB devices communication in Python.
+        It should work without additional code in any environment with
+        Python &gt;= 2.4, ctypes and an pre-built usb backend library
+        (currently, libusb 0.1.x, libusb 1.x, and OpenUSB).
+        
+Platform: UNKNOWN
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
@@ -17360,35 +23084,72 @@ POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
-<span class="title">python-exec-10000.1</span>
+<span class="title">pyyaml-3.09</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<span class="homepage"><a href="http://pyyaml.org/wiki/PyYAML">homepage</a></span>
 <div class="licence">
-<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-python/python-exec:
+<pre>Scanned Source License PyYAML-3.09/LICENSE:
 
-Copyright 2012 Michał Górny
-All rights reserved
+Copyright (c) 2006 Kirill Simonov
 
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing 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.
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
 
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License PyYAML-3.09/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: PyYAML
+Version: 3.09
+Summary: YAML parser and emitter for Python
+Home-page: http://pyyaml.org/wiki/PyYAML
+Author: Kirill Simonov
+Author-email: xi@resolvent.net
+License: MIT
+Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.09.tar.gz
+Description: YAML is a data serialization format designed for human readability
+        and interaction with scripting languages.  PyYAML is a YAML parser
+        and emitter for Python.
+        
+        PyYAML features a complete YAML 1.1 parser, Unicode support, pickle
+        support, capable extension API, and sensible error messages.  PyYAML
+        supports standard YAML tags and provides Python-specific tags that
+        allow to represent an arbitrary Python object.
+        
+        PyYAML is applicable for a broad range of tasks from complex
+        configuration files to object serialization and persistance.
+Platform: Any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.3
+Classifier: Programming Language :: Python :: 2.4
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.0
+Classifier: Programming Language :: Python :: 3.1
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing :: Markup
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
@@ -17400,75 +23161,62 @@ POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
-<span class="title">python-exec-10000.2</span>
+<span class="title">qemacs-0.4.0_pre20090420</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<span class="homepage"><a href="http://savannah.nongnu.org/projects/qemacs">homepage</a></span>
 <div class="licence">
-<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-python/python-exec:
-
-Copyright 2012 Michał Górny
-All rights reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing 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 AUTHOR ``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 AUTHOR 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.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<pre></pre>
 <ul>
-
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
 </ul>
 </div>
 </div>
 
 
 <div class="product">
-<span class="title">python-exec-2.0.1</span>
+<span class="title">radvd-1.9.8</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="https://bitbucket.org/mgorny/python-exec/">homepage</a></span>
+<span class="homepage"><a href="http://v6web.litech.org/radvd/">homepage</a></span>
 <div class="licence">
-<pre>Copyright Attribution License chromiumos-overlay/licenses/copyright-attribution/dev-lang/python-exec:
+<pre>Scanned Source License radvd-1.9.8/COPYRIGHT:
 
-Copyright 2012 Michał Górny
-All rights reserved
+  The author(s) grant permission for redistribution and use in source and
+binary forms, with or without modification, of the software and documentation
+provided that the following conditions are met:
 
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing 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
+0. If you receive a version of the software that is specifically labelled
+   as not being for redistribution (check the version message and/or README),
+   you are not permitted to redistribute that version of the software in any
+   way or form.
+1. All terms of all other applicable copyrights and licenses must be
+   followed.
+2. Redistributions of source code must retain the authors' copyright
+   notice(s), this list of conditions, and the following disclaimer.
+3. Redistributions in binary form must reproduce the authors' copyright
+   notice(s), this list of conditions, and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
+4. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement with the name(s) of the
+   authors as specified in the copyright notice(s) substituted where
+   indicated:
 
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 product includes software developed by the authors which are 
+       mentioned at the start of the source files and other contributors.
+
+5. Neither the name(s) of the author(s) 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 ITS AUTHORS 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 AUTHORS 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.
 
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 </pre>
@@ -17519,6 +23267,19 @@ OF THIS SOFTWARE.
 
 
 <div class="product">
+<span class="title">read-edid-1.4.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.polypux.org/projects/read-edid/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">readline-6.2_p1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html">homepage</a></span>
@@ -17622,6 +23383,19 @@ OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
 <div class="product">
+<span class="title">recover-duts-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">renderproto-0.11.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -17698,67 +23472,6 @@ in this Software without prior written authorization from the XFree86 Project.
 
 
 <div class="product">
-<span class="title">rgb-1.0.4</span>
-<a class="show" href="#" onclick="return toggle(this);">show license text</a>
-<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
-<div class="licence">
-<pre>Scanned Source License rgb-1.0.4/COPYING:
-
-Copyright 1985, 1989, 1998  The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-Copyright (c) 1994, 2008, Oracle and/or its affiliates. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
-<ul>
-
-</ul>
-</div>
-</div>
-
-
-<div class="product">
 <span class="title">root-certificates-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
@@ -17813,6 +23526,19 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">rxvt-unicode-9.10</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://software.schmorp.de/pkg/rxvt-unicode.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">salsa-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
@@ -17908,6 +23634,19 @@ Platform: UNKNOWN
 
 
 <div class="product">
+<span class="title">screen-4.0.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gnu.org/software/screen/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">scrnsaverproto-1.2.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -17962,6 +23701,331 @@ Author:  Keith Packard, MIT X Consortium
 
 
 <div class="product">
+<span class="title">selenium-2.29.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://pypi.python.org/pypi/selenium/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">setproctitle-1.1.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://code.google.com/p/py-setproctitle/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License setproctitle-1.1.8/COPYRIGHT:
+
+Copyright (c) 2009-2012, Daniele Varrazzo &lt;daniele.varrazzo@gmail.com&gt;
+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.
+* The name of Daniele Varrazzo may not 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 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License setproctitle-1.1.8/PKG-INFO:
+
+Metadata-Version: 1.1
+Name: setproctitle
+Version: 1.1.8
+Summary: A library to allow customization of the process title.
+Home-page: http://code.google.com/p/py-setproctitle/
+Author: Daniele Varrazzo
+Author-email: daniele.varrazzo@gmail.com
+License: BSD
+Download-URL: http://pypi.python.org/pypi/setproctitle/
+Description: A ``setproctitle`` implementation for Python
+        ============================================
+        
+        :author: Daniele Varrazzo
+        
+        The library allows a process to change its title (as displayed by system tools
+        such as ``ps`` and ``top``).
+        
+        Changing the title is mostly useful in multi-process systems, for example
+        when a master process is forked: changing the children's title allows to
+        identify the task each process is busy with.  The technique is used by
+        PostgreSQL_ and the `OpenSSH Server`_ for example.
+        
+        The procedure is hardly portable across different systems.  PostgreSQL provides
+        a good `multi-platform implementation`__:  this module is a Python wrapper
+        around PostgreSQL code.
+        
+        - `Homepage &lt;http://code.google.com/p/py-setproctitle/&gt;`__
+        - `Download &lt;http://pypi.python.org/pypi/setproctitle/&gt;`__
+        - `Source repository &lt;https://github.com/dvarrazzo/py-setproctitle&gt;`__
+        - `Bug tracker &lt;http://code.google.com/p/py-setproctitle/issues/list&gt;`__
+        
+        
+        .. _PostgreSQL: http://www.postgresql.org
+        .. _OpenSSH Server: http://www.openssh.com/
+        .. __: http://doxygen.postgresql.org/ps__status_8c_source.html
+        
+        
+        Installation
+        ------------
+        
+        You can use ``easy_install`` to install the module: to perform a system-wide
+        installation use::
+        
+            sudo easy_install setproctitle
+        
+        If you are an unprivileged user or you want to limit installation to a local
+        environment, you can use the command::
+        
+            easy_install -d /target/path setproctitle
+        
+        Note that ``easy_install`` requires ``/target/path`` to be in your
+        ``PYTHONPATH``.
+        
+        
+        Python 3 support
+        ~~~~~~~~~~~~~~~~
+        
+        As of version 1.1 the module works with Python 3.  In order to install the
+        module, you can use the `distribute`_ replacemente for ``easy_install``.
+        
+        In order to build and test the module under Python 3, the ``Makefile``
+        contains some helper targets.
+        
+        .. _distribute: http://pypi.python.org/pypi/distribute
+        
+        
+        Usage
+        -----
+        
+        The ``setproctitle`` module exports the following functions:
+        
+        ``setproctitle(title)``
+            Set *title* as the title for the current process.
+        
+        ``getproctitle()``
+            Return the current process title.
+        
+        
+        Environment variables
+        ~~~~~~~~~~~~~~~~~~~~~
+        
+        A few environment variables can be used to customize the module behavior:
+        
+        ``SPT_NOENV``
+            Avoid clobbering ``/proc/PID/environ``.
+        
+            On many platforms, setting the process title will clobber the
+            ``environ`` memory area. ``os.environ`` will work as expected from within
+            the Python process, but the content of the file ``/proc/PID/environ`` will
+            be overwritten.  If you require this file not to be broken you can set the
+            ``SPT_NOENV`` environment variable to any non-empty value: in this case
+            the maximum length for the title will be limited to the length of the
+            command line.
+        
+        ``SPT_DEBUG``
+            Print debug information on ``stderr``.
+        
+            If the module doesn't work as expected you can set this variable to a
+            non-empty value to generate information useful for debugging.  Note that
+            the most useful information is printed when the module is imported, not
+            when the functions are called.
+        
+        
+        Module status
+        -------------
+        
+        The module can be currently compiled and effectively used on the following
+        platforms:
+        
+        - GNU/Linux
+        - BSD
+        - MacOS X
+        - Windows
+        
+        Note that on Windows there is no way to change the process string:
+        what the module does is to create a *Named Object* whose value can be read
+        using a tool such as `Process Explorer`_ (contribution of a more useful tool
+        to be used together with ``setproctitle`` would be well accepted).
+        
+        The module can probably work on HP-UX, but I haven't found any to test with.
+        It is unlikely that it can work on Solaris instead.
+        
+        .. _Process Explorer: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
+        
+        
+        Other known implementations and discussions
+        -------------------------------------------
+        
+        - `procname`_: a module exposing the same functionality, but less portable 
+          and not well packaged.
+        - `Issue 5672`_: where the introduction of such functionality into the stdlib
+          is being discussed.
+        
+        .. _procname: http://code.google.com/p/procname/
+        .. _Issue 5672: http://bugs.python.org/issue5672
+        
+        
+        ..
+            vim: set filetype=rst:
+        
+        
+        Releases history
+        ----------------
+        
+        Version 1.1.8
+        ~~~~~~~~~~~~~
+        
+        - Added support for Python "diehard" 2.4.
+        - Fixed build on Mac OS X 10.9 Maverick (issue #27).
+        
+        
+        Version 1.1.7
+        ~~~~~~~~~~~~~
+        
+        - Added PyPy support, courtesy of Ozan Turksever (http://www.logsign.net).
+        
+        
+        Version 1.1.6
+        ~~~~~~~~~~~~~
+        
+        - The module can be compiled again on Windows (issue #21).
+        
+        
+        Version 1.1.5
+        ~~~~~~~~~~~~~
+        
+        - No module bug, but a packaging issue: files ``README`` and ``HISTORY``
+          added back into the distribution.
+        
+        
+        Version 1.1.4
+        ~~~~~~~~~~~~~
+        
+        - The module works correctly in embedded Python.
+        - ``setproctitle()`` accepts a keyword argument.
+        - Debug output support always compiled in: the variable ``SPT_DEBUG`` can be
+          used to emit debug log.
+        
+        
+        Version 1.1.3
+        ~~~~~~~~~~~~~
+        
+        - Don't clobber environ if the variable ``SPT_NOENV`` is set (issue #16).
+        
+        
+        Version 1.1.2
+        ~~~~~~~~~~~~~
+        
+        - Find the setproctitle include file on OpenBSD (issue #11).
+        - Skip test with unicode if the file system encoding wouldn't make it pass
+          (issue #13).
+        
+        
+        Version 1.1.1
+        ~~~~~~~~~~~~~
+        
+        - Fixed segfault when the module is imported under mod_wsgi (issue #9).
+        
+        
+        Version 1.1
+        ~~~~~~~~~~~
+        
+        - The module works correctly with Python 3.
+        
+        
+        Version 1.0.1
+        ~~~~~~~~~~~~~
+        
+        - ``setproctitle()`` works even when Python messes up with argv, e.g. when run
+          with the -m option (issue #8).
+        
+        
+        Version 1.0
+        ~~~~~~~~~~~
+        
+        No major change since the previous version.  The module has been heavily used
+        in production environment without any problem reported, so it's time to declare
+        it stable.
+        
+        
+        Version 0.4
+        ~~~~~~~~~~~
+        
+        - Module works on BSD (tested on FreeBSD 7.2).
+        
+        - Module works on Windows. Many thanks to `Develer`_ for providing a neat `GCC
+          package for Windows with Python integration`__ that made the Windows porting
+          painless.
+        
+          .. _Develer: http://www.develer.com/
+          .. __: http://www.develer.com/oss/GccWinBinaries
+        
+        
+        Version 0.3
+        ~~~~~~~~~~~
+        
+        - Module works on Mac OS X 10.2. Reported working on OS X 10.6 too.
+        
+        
+        Version 0.2
+        ~~~~~~~~~~~
+        
+        - Added ``prctl()`` call on Linux &gt;= 2.6.9 to update ``/proc/self/status``.
+        
+        
+        Version 0.1
+        ~~~~~~~~~~~
+        
+        - Initial public release.
+        
+Platform: GNU/Linux
+Platform: BSD
+Platform: MacOS X
+Platform: Windows
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: C
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Operating System :: POSIX :: BSD
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Topic :: Software Development
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">setuptools-0.8</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://pypi.python.org/pypi/setuptools">homepage</a></span>
@@ -20262,6 +26326,19 @@ MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 
 
 <div class="product">
+<span class="title">shill-test-scripts-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://src.chromium.org">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">sil-abyssinica-1.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://scripts.sil.org/AbyssinicaSIL">homepage</a></span>
@@ -20378,6 +26455,80 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
 
 
 <div class="product">
+<span class="title">simplejson-2.5.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://undefined.org/python/#simplejson">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License simplejson-2.5.0/LICENSE.txt:
+
+Copyright (c) 2006 Bob Ippolito
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License simplejson-2.5.0/PKG-INFO:
+
+Metadata-Version: 1.0
+Name: simplejson
+Version: 2.5.0
+Summary: Simple, fast, extensible JSON encoder/decoder for Python
+Home-page: http://github.com/simplejson/simplejson
+Author: Bob Ippolito
+Author-email: bob@redivi.com
+License: MIT License
+Description: simplejson is a simple, fast, complete, correct and extensible
+        JSON &lt;http://json.org&gt; encoder and decoder for Python 2.5+.  It is
+        pure Python code with no dependencies, but includes an optional C
+        extension for a serious speed boost.
+        
+        The latest documentation for simplejson can be read online here:
+        http://simplejson.readthedocs.org/
+        
+        simplejson is the externally maintained development version of the
+        json library included with Python 2.6 and Python 3.0, but maintains
+        backwards compatibility with Python 2.5.
+        
+        The encoder may be subclassed to provide serialization in any kind of
+        situation, without any special support by the objects to be serialized
+        (somewhat like pickle).
+        
+        The decoder can handle incoming JSON strings of any specified encoding
+        (UTF-8 by default).
+        
+        
+Platform: any
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">smartmontools-5.42</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://smartmontools.sourceforge.net/">homepage</a></span>
@@ -20391,6 +26542,32 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
 
 
 <div class="product">
+<span class="title">socat-1.7.2.3</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.dest-unreach.org/socat/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">sox-14.3.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://sox.sourceforge.net">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">speex-1.2_rc1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.speex.org">homepage</a></span>
@@ -20456,6 +26633,122 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">sshfs-fuse-2.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://fuse.sourceforge.net/sshfs.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">strace-4.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://sourceforge.net/projects/strace/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License strace-4.8/COPYING:
+
+Copyright (c) 1991, 1992 Paul Kranenburg &lt;pk@cs.few.eur.nl&gt;
+Copyright (c) 1993 Branko Lankester &lt;branko@hacktic.nl&gt;
+Copyright (c) 1993 Ulrich Pegelow &lt;pegelow@moorea.uni-muenster.de&gt;
+Copyright (c) 1995, 1996 Michael Elizabeth Chastain &lt;mec@duracef.shout.net&gt;
+Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey &lt;jrs@world.std.com&gt;
+Copyright (C) 1998-2001 Wichert Akkerman &lt;wakkerma@deephackmode.org&gt;
+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. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Scanned Source License strace-4.8/debian/copyright:
+
+This is the Debian packaged version of strace. For a complete list of
+changes from the upstream version please see the changelog.
+
+The upstream sources can be found at http://sourceforge.net/projects/strace/
+
+This is the copyright as found in the upstream sources:
+
+Copyright (c) 1991, 1992 Paul Kranenburg &lt;pk@cs.few.eur.nl&gt;
+Copyright (c) 1993 Branko Lankester &lt;branko@hacktic.nl&gt;
+Copyright (c) 1993 Ulrich Pegelow &lt;pegelow@moorea.uni-muenster.de&gt;
+Copyright (c) 1995, 1996 Michael Elizabeth Chastain &lt;mec@duracef.shout.net&gt;
+Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey &lt;jrs@world.std.com&gt;
+Copyright (C) 1998-2003 Wichert Akkerman &lt;wakkerma@deephackmode.org&gt;
+Copyright (c) 2002-2008 Roland McGrath  &lt;roland@redhat.com&gt;
+Copyright (c) 2003-2008 Dmitry V. Levin &lt;ldv@altlinux.org&gt;
+Copyright (c) 2007-2008 Jan Kratochvil  &lt;jan.kratochvil@redhat.com&gt;
+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. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">stressapptest-1.0.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://code.google.com/p/stressapptest/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#Apache-2.0'>Gentoo Package Stock License Apache-2.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">strongswan-5.0.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.strongswan.org/">homepage</a></span>
@@ -21394,6 +27687,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">sysstat-10.2.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://pagesperso-orange.fr/sebastien.godard/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">system_api-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">tar-1.26</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.gnu.org/software/tar/">homepage</a></span>
@@ -21407,6 +27726,55 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">tcpdump-4.5.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.tcpdump.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License tcpdump-4.5.1/LICENSE:
+
+License: BSD
+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. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">telemetry-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">tibt-jomolhari-0.0.3c</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="https://sites.google.com/site/chrisfynn2/home/fonts/jomolhari">homepage</a></span>
@@ -21420,7 +27788,58 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 <div class="product">
-<span class="title">timezone-data-2013g</span>
+<span class="title">tiff-4.0.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.remotesensing.org/libtiff/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License tiff-4.0.0/COPYRIGHT:
+
+Copyright (c) 1988-1997 Sam Leffler
+Copyright (c) 1991-1997 Silicon Graphics, Inc.
+
+Permission to use, copy, modify, distribute, and sell this software and 
+its documentation for any purpose is hereby granted without fee, provided
+that (i) the above copyright notices and this permission notice appear in
+all copies of the software and related documentation, and (ii) the names of
+Sam Leffler and Silicon Graphics may not be used in any advertising or
+publicity relating to the software without the specific, prior written
+permission of Sam Leffler and Silicon Graphics.
+
+THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+
+IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+OF THIS SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+<li><a href='#as-is'>Gentoo Package Stock License as-is</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">time-1.7</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.gnu.org/directory/time.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">timezone-data-2014e</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.iana.org/time-zones">homepage</a></span>
 <div class="licence">
@@ -21519,6 +27938,19 @@ know:
 
 
 <div class="product">
+<span class="title">tmux-1.9a</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://tmux.sourceforge.net">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#ISC'>Gentoo Package Stock License ISC</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">touch_noise_filter-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
@@ -21532,6 +27964,45 @@ know:
 
 
 <div class="product">
+<span class="title">touchbot-1.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">touchpad-tests-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">tpm-tools-1.3.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://trousers.sourceforge.net">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#CPL-1.0'>Gentoo Package Stock License CPL-1.0</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">trapproto-3.4.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -21571,99 +28042,9 @@ SOFTWARE.
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://trousers.sf.net">homepage</a></span>
 <div class="licence">
-<pre>Gentoo Package Stock License CPL-1.0:
-
-Common Public License Version 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-</pre>
+<pre></pre>
 <ul>
-
+<li><a href='#CPL-1.0'>Gentoo Package Stock License CPL-1.0</a></li>
 </ul>
 </div>
 </div>
@@ -21683,6 +28064,19 @@ This Agreement is governed by the laws of the State of New York and the intellec
 
 
 <div class="product">
+<span class="title">turbostat-3.8.11</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://www.kernel.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">u-boot-2013.06</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.denx.de/wiki/U-Boot">homepage</a></span>
@@ -21768,7 +28162,20 @@ This Agreement is governed by the laws of the State of New York and the intellec
 
 
 <div class="product">
-<span class="title">update_engine-0.0.1</span>
+<span class="title">update-policy-chromeos-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#BSD-Google'>Custom License BSD-Google</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">update_engine-0.0.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
 <div class="licence">
@@ -22355,6 +28762,19 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">utouch-evemu-1.0.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://bitmath.org/code/evemu/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-3'>Gentoo Package Stock License GPL-3</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">vboot_reference-1.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="">homepage</a></span>
@@ -22819,6 +29239,32 @@ This address is expected to be valid for a long time.
 
 
 <div class="product">
+<span class="title">wireless-tools-29</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">wireless_automation-0.0.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">workarounds-0.0.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
@@ -22845,6 +29291,49 @@ This address is expected to be valid for a long time.
 
 
 <div class="product">
+<span class="title">ws4py-0.3.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="https://github.com/Lawouach/WebSocket-for-Python">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License ws4py-0.3.2/LICENSE:
+
+Copyright (c) 2011-2013, Sylvain Hellegouarch 
+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 ws4py 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">X.Org-1.9.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.x.org/">homepage</a></span>
@@ -22858,6 +29347,19 @@ This address is expected to be valid for a long time.
 
 
 <div class="product">
+<span class="title">x11vnc-0.9.13</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.karlrunge.com/x11vnc/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xbitmaps-1.1.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -22976,6 +29478,71 @@ authors.
 
 
 <div class="product">
+<span class="title">xcb-util-0.3.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xcb.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#X'>Custom License X</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xcb-util-image-0.3.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xcb.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#X'>Custom License X</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xcb-util-keysyms-0.3.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xcb.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#X'>Custom License X</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xcb-util-renderutil-0.3.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xcb.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#X'>Custom License X</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xcb-util-wm-0.3.8</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xcb.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#X'>Custom License X</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xcmiscproto-1.2.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -23014,6 +29581,165 @@ in this Software without prior written authorization from The Open Group.
 
 
 <div class="product">
+<span class="title">xdotool-2.20110530.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.semicomplete.com/projects/xdotool/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xdotool-2.20110530.1/COPYRIGHT:
+
+Copyright (c) 2007, 2008, 2009: Jordan Sissel.
+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 the Jordan Sissel 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 JORDAN SISSEL ``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 JORDAN SISSEL 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.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+<li><a href='#as-is'>Gentoo Package Stock License as-is</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xdpyinfo-1.3.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xdpyinfo-1.3.0/COPYING:
+
+Copyright 1988, 1998  The Open Group
+Copyright 2005 Hitachi, Ltd.
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xdriinfo-1.0.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xdriinfo-1.0.4/COPYING:
+
+Client application for querying drivers' configuration information
+Copyright (C) 2003 Felix Kuehling
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xev-1.2.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xev-1.2.0/COPYING:
+
+Copyright (c) 1988  X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xextproto-7.2.0</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -23835,6 +30561,75 @@ from Kaleb S. KEITHLEY
 
 
 <div class="product">
+<span class="title">xhost-1.0.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xhost-1.0.4/COPYING:
+
+Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+Copyright 1985, 1986, 1987, 1998  The Open Group
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+X Window System is a trademark of The Open Group.
+
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xineramaproto-1.2.1</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -23955,6 +30750,64 @@ DEALINGS IN THE SOFTWARE.
 
 
 <div class="product">
+<span class="title">xinput_calibrator-0.7.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://www.freedesktop.org/wiki/Software/xinput_calibrator">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xinput_calibrator-0.7.5/COPYING:
+
+Copyright (c) 2010 Tias Guns &lt;tias@ulyssis.org&gt; and others
+See the respective files for detailed copyright information.
+
+
+Source code: MIT/X11 License
+------------
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+
+Icon xinput_calibrator.svg: CC by-sa
+---------------------------
+(c) Tias Guns &lt;tias@ulyssis.org&gt;
+
+The screen and triangle are from the Tango Desktop Project,
+which is in the Public Domain.
+
+The hand is from Ubuntu's human-icon-theme, which is CC by-sa
+(c) Jeff Waugh &lt;jdub@perkypants.org&gt;
+(c) Daniel Holbach &lt;daniel.holbach@ubuntu.com&gt;
+(c) Martin Pitt &lt;martin.pitt@ubuntu.com&gt;
+Creative Commons Attribution-ShareAlike 3.0 License Agreement
+http://creativecommons.org/licenses/by-sa/3.0/
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xkbcomp-1.2.3</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -24282,6 +31135,164 @@ This file is distributed without any expressed or implied warranty.
 
 
 <div class="product">
+<span class="title">xlsatoms-1.1.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xlsatoms-1.1.0/COPYING:
+
+Copyright 1989, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xlsclients-1.1.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xlsclients-1.1.2/COPYING:
+
+Copyright 1989, 1991, 1994, 1998  The Open Group
+Copyright 2009  Open Text Corporation
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright (c) 2009 Apple Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xmodmap-1.0.5</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xmodmap-1.0.5/COPYING:
+
+Copyright (c) 1987, 2010, Oracle and/or its affiliates. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+Copyright 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xorg-conf-0.0.6</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.chromium.org/">homepage</a></span>
@@ -26147,6 +33158,67 @@ SUCH DAMAGE.
 
 
 <div class="product">
+<span class="title">xprop-1.2.1</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xprop-1.2.1/COPYING:
+
+Copyright 1990, 1998  The Open Group
+Copyright (c) 2000  The XFree86 Project, Inc.
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+  
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+Copyright 2007 Kim woelders
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and
+that the name of the copyright holders not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  The copyright holders make no representations
+about the suitability of this software for any purpose.  It is provided "as
+is" without express or implied warranty.
+
+THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xproto-7.0.23</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -26310,6 +33382,44 @@ OF THIS SOFTWARE.
 
 
 <div class="product">
+<span class="title">xset-1.2.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xset-1.2.2/COPYING:
+
+Copyright 1985, 1988, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xset-mini-1.2.2</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -26323,6 +33433,19 @@ OF THIS SOFTWARE.
 
 
 <div class="product">
+<span class="title">xtrace-1.3.0</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xtrace.alioth.debian.org/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xtrans-1.2.6</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
@@ -26461,6 +33584,164 @@ PERFORMANCE OF THIS SOFTWARE.
 
 
 <div class="product">
+<span class="title">xwd-1.0.4</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xwd-1.0.4/COPYING:
+
+Copyright 1987, 1988, 1993, 1994, 1996, 1998  The Open Group
+Copyright 1994 Hewlett-Packard Co.
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+Copyright 2007 Kim woelders
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and
+that the name of the copyright holders not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  The copyright holders make no representations
+about the suitability of this software for any purpose.  It is provided "as
+is" without express or implied warranty.
+
+THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xwininfo-1.1.2</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://xorg.freedesktop.org/">homepage</a></span>
+<div class="licence">
+<pre>Scanned Source License xwininfo-1.1.2/COPYING:
+
+Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+Copyright 1987, 1993, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+Copyright 2007 Kim woelders
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and
+that the name of the copyright holders not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  The copyright holders make no representations
+about the suitability of this software for any purpose.  It is provided "as
+is" without express or implied warranty.
+
+THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+</pre>
+<ul>
+
+</ul>
+</div>
+</div>
+
+
+<div class="product">
+<span class="title">xxd-1.10</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://ftp.uni-erlangen.de/pub/utilities/etc/?order=s">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#GPL-2'>Gentoo Package Stock License GPL-2</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">xz-utils-5.0.5</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://tukaani.org/xz/">homepage</a></span>
@@ -26482,6 +33763,19 @@ See LGPL-2.1 or LGPL-3 for the full text of these licenses.
 
 
 <div class="product">
+<span class="title">zbar-0.10</span>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<span class="homepage"><a href="http://zbar.sourceforge.net/">homepage</a></span>
+<div class="licence">
+<pre></pre>
+<ul>
+<li><a href='#LGPL-2.1'>Gentoo Package Stock License LGPL-2.1</a></li>
+</ul>
+</div>
+</div>
+
+
+<div class="product">
 <span class="title">zlib-1.2.8</span>
 <a class="show" href="#" onclick="return toggle(this);">show license text</a>
 <span class="homepage"><a href="http://www.zlib.net/">homepage</a></span>
@@ -26791,7 +34085,7 @@ Used by these packages: dev-libs/dbus-glib-0.100.2 sys-apps/dbus-1.6.8-r5
 
 </pre>
 <div class="license-packages">
-Used by these packages: app-i18n/keyboard-input-1.0.0.0-r2 app-i18n/chinese-input-1.1.0.0-r2 media-fonts/droidfonts-cros-20121206 media-fonts/crosextrafonts-20130214 media-fonts/croscorefonts-1.23.0 media-fonts/notofonts-20140130-r1 app-admin/rsyslog-5.8.11 app-i18n/chromeos-hangul-1.2.0.1-r1 app-i18n/chromeos-keyboards-1.1.4.0-r6 dev-libs/protobuf-2.3.0-r5
+Used by these packages: app-i18n/keyboard-input-1.0.0.0-r2 dev-util/stressapptest-1.0.4 dev-python/jsonrpclib-0_pre20110820-r1 dev-libs/protobuf-python-2.3.0-r1 app-i18n/chromeos-hangul-1.2.0.3-r1 app-i18n/chinese-input-1.1.0.0-r2 app-admin/rsyslog-5.8.11-r1 media-fonts/droidfonts-cros-20121206 media-fonts/crosextrafonts-20130214 app-i18n/japanese-input-1.0.0.0-r1 media-fonts/croscorefonts-1.23.0 media-fonts/notofonts-20140130-r1 dev-python/selenium-2.29.0 app-i18n/chromeos-keyboards-1.1.4.0-r6 dev-libs/protobuf-2.3.0-r5
 </div>
 </div>
 </div>
@@ -26837,7 +34131,7 @@ The information in this license about licenses is presented "as is". :-P
 
 </pre>
 <div class="license-packages">
-Used by these packages: net-wireless/crda-1.1.1-r5 x11-base/xorg-drivers-1.12 dev-db/sqlite-3.6.22-r3 app-text/docbook-xml-dtd-4.1.2-r6 dev-lang/swig-2.0.4-r1 media-libs/libpng-1.2.49-r2
+Used by these packages: x11-base/xorg-drivers-1.12 dev-db/sqlite-3.6.22-r3 net-misc/iperf-2.0.4-r1 net-misc/dhcp-4.2.2-r1 x11-misc/xdotool-2.20110530.1 media-libs/tiff-4.0.0-r1 app-text/docbook-xml-dtd-4.1.2-r6 dev-lang/swig-2.0.4-r1 media-libs/libpng-1.2.49-r2 net-wireless/crda-1.1.1-r5
 </div>
 </div>
 </div>
@@ -26910,7 +34204,106 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 </pre>
 <div class="license-packages">
-Used by these packages: chromeos-base/inputcontrol-0.0.1-r92 chromeos-base/chromeos-bsp-alex-0.0.1-r12 chromeos-base/gobi3k-sdk-1.0.1-r22 chromeos-base/vpd-0.0.1-r75 chromeos-base/cros_boot_mode-0.0.1-r25 chromeos-base/chromeos-chrome-36.0.1985.19_rc-r1 chromeos-base/verity-0.0.1-r79 chromeos-base/gobi-cromo-plugin-1.0.1-r70 chromeos-base/chromeos-activate-date-0.0.1-r1 chromeos-base/google-breakpad-1303-r82 chromeos-base/xorg-conf-0.0.6-r98 chromeos-base/protofiles-0.0.1-r18 chromeos-base/mtpd-0.0.1-r89 chromeos-base/chromeos-init-0.0.25-r805 media-sound/adhd-0.0.1-r757 chromeos-base/chromeos-ca-certificates-0.0.1-r2 sys-apps/mosys-1.2.03-r225 net-dns/avahi-daemon-0.0.1 sys-apps/rootdev-0.0.1-r22 chromeos-base/chromeos-bsp-x86-alex-0.0.2-r2 chromeos-base/chromeos-minijail-0.0.1-r113 chromeos-base/tty-0.0.1-r4 chromeos-base/chromeos-auth-config-0.0.1-r3 chromeos-base/libchrome-242728-r12 chromeos-base/chromeos-firmware-alex-0.0.1-r123 app-i18n/nacl-mozc-1.14.1639.104-r4 chromeos-base/swap-init-0.0.1-r1 chromeos-base/bootcomplete-login-0.0.1-r1 chromeos-base/userfeedback-0.0.1-r104 chromeos-base/workarounds-0.0.1-r76 chromeos-base/platform2-0.0.1-r473 chromeos-base/crosh-0.0.1-r157 chromeos-base/p2p-0.0.1-r42 chromeos-base/chromeos-assets-split-0.1.0-r319 chromeos-base/chromeos-firewall-init-0.0.1-r1 chromeos-base/chromeos-installer-0.0.1-r332 chromeos-base/libchrome_crypto-242728-r2 chromeos-base/update_engine-0.0.1-r565 chromeos-base/chromeos-login-0.0.5-r736 chromeos-base/salsa-0.0.1-r16 chromeos-base/dev-install-0.0.1-r673 chromeos-base/gobi3k-lib-0.0.1-r25 chromeos-base/chromeos-imageburner-0.0.1-r45 chromeos-base/chromeos-disableecho-0.0.1 chromeos-base/audioconfig-0.0.1-r1 chromeos-base/bootstat-0.0.1-r32 chromeos-base/oem-customization-0.0.2-r7 app-i18n/input-tools-4.1.2.7-r1 chromeos-base/touch_noise_filter-0.0.1-r17 chromeos-base/libscrypt-1.1.6-r11 chromeos-base/gestures-0.0.1-r494 chromeos-base/chromeos-cryptohome-0.0.1-r470 chromeos-base/chromeos-base-0-r113 chromeos-base/libevdev-0.0.1-r58 sys-apps/flashmap-0.3-r18 chromeos-base/chromeos-assets-0.0.1-r489 chromeos-base/permission_broker-0.0.1-r22 chromeos-base/vboot_reference-1.0-r921 chromeos-base/modem-utilities-0.0.1-r36
+Used by these packages: chromeos-base/chromeos-test-testauthkeys-0.0.1-r2 chromeos-base/chromeos-bsp-alex-0.0.1-r12 chromeos-base/gobi3k-sdk-1.0.1-r22 chromeos-base/vpd-0.0.1-r76 chromeos-base/cros_boot_mode-0.0.1-r27 chromeos-base/chromeos-dev-root-0.0.1-r1 chromeos-base/verity-0.0.1-r79 chromeos-base/chromeos-imageburner-0.0.1-r48 chromeos-base/gobi-cromo-plugin-1.0.1-r73 chromeos-base/chromeos-login-0.0.5-r768 chromeos-base/chromeos-test-init-0.0.1-r276 chromeos-base/autotest-client-0.0.1-r1 chromeos-base/salsa-0.0.1-r17 chromeos-base/chromeos-activate-date-0.0.1-r1 chromeos-base/chromeos-test-root-0.0.1-r1 chromeos-base/chromeos-ca-certificates-0.0.1-r2 dev-util/hdctools-0.0.1-r343 sys-apps/rootdev-0.0.1-r22 chromeos-base/libchrome-271506-r4 chromeos-base/modem-utilities-0.0.1-r36 chromeos-base/chromeos-bsp-x86-alex-0.0.2-r2 chromeos-base/chromeos-minijail-0.0.1-r118 chromeos-base/chromeos-factory-0.0.1-r1284 chromeos-base/bootcomplete-login-0.0.1-r1 chromeos-base/avtest_label_detect-0.0.1-r4 chromeos-base/tty-0.0.1-r4 chromeos-base/workarounds-0.0.1-r76 chromeos-base/chromeos-auth-config-0.0.1-r5 chromeos-base/chromeos-firmware-alex-0.0.1-r129 chromeos-base/gestures-0.0.1-r496 chromeos-base/swap-init-0.0.1-r1 chromeos-base/chromeos-base-0-r116 chromeos-base/inputcontrol-0.0.1-r98 chromeos-base/chromeos-factory-board-3.0.0-r1 chromeos-base/openssh-server-init-0.0.1-r22 chromeos-base/audiotest-0.0.1-r8 chromeos-base/userfeedback-0.0.1-r105 net-dns/avahi-daemon-0.0.1 chromeos-base/memento_softwareupdate-0.0.1-r55 sys-apps/mosys-1.2.03-r232 chromeos-base/crosh-0.0.1-r158 chromeos-base/chromite-0.0.1-r988 chromeos-base/chromeos-factory-regions-0.0.1-r156 chromeos-base/chromeos-firewall-init-0.0.1-r1 chromeos-base/vboot_reference-1.0-r937 dev-util/mem-0.0.1-r2 chromeos-base/chromeos-installer-0.0.1-r336 chromeos-base/shill-test-scripts-0.0.1-r464 chromeos-base/libchromeos-use-flags-0.0.1-r1 media-sound/adhd-0.0.1-r795 chromeos-base/libchrome_crypto-271506-r1 chromeos-base/google-breakpad-1303-r82 chromeos-base/platform2-0.0.3-r554 chromeos-base/dev-install-0.0.1-r676 chromeos-base/chromeos-assets-0.0.2-r7 chromeos-base/gobi3k-lib-0.0.1-r25 chromeos-base/libchromeos-0.0.1-r7 chromeos-base/p2p-0.0.1-r44 chromeos-base/audioconfig-0.0.1-r1 chromeos-base/bootstat-0.0.1-r32 chromeos-base/oem-customization-0.0.2-r7 chromeos-base/xorg-conf-0.0.6-r110 chromeos-base/mttools-0.0.1-r87 chromeos-base/touch_noise_filter-0.0.1-r18 chromeos-base/libscrypt-1.1.6-r11 chromeos-base/chromeos-factoryinstall-0.0.1-r138 chromeos-base/modem-diagnostics-0.1-r7 chromeos-base/chromeos-cryptohome-0.0.1-r486 x11-drivers/touchpad-tests-0.0.1-r125 chromeos-base/update-policy-chromeos-0.0.1-r2 chromeos-base/protofiles-0.0.1-r20 chromeos-base/chromeos-chrome-37.0.2062.28_rc-r1 chromeos-base/libevdev-0.0.1-r58 sys-apps/flashmap-0.3-r18 chromeos-base/autotest-factory-install-0.0.1-r3 chromeos-base/common-assets-0.0.1-r1 chromeos-base/permission_broker-0.0.1-r24 chromeos-base/autotest-fakemodem-conf-0.0.1-r1 chromeos-base/update_engine-0.0.2-r589 chromeos-base/system_api-0.0.1-r369 chromeos-base/mtpd-0.0.1-r92 chromeos-base/chromeos-init-0.0.25-r818 app-i18n/input-tools-4.3.2.5-r1
+</div>
+</div>
+</div>
+
+<div class="product">
+<a name="CPL-1.0" class="title">Gentoo Package Stock License CPL-1.0</a>
+<a class="show" href="#" onclick="return toggle(this);">show license text</a>
+<div class="licence">
+<pre>
+Common Public License Version 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+</pre>
+<div class="license-packages">
+Used by these packages: app-crypt/tpm-tools-1.3.5-r2 app-crypt/trousers-0.3.3-r43
 </div>
 </div>
 </div>
@@ -27081,7 +34474,7 @@ Legal Terms
 
 </pre>
 <div class="license-packages">
-Used by these packages: x11-libs/pango-1.32.5-r1 media-libs/freetype-2.5.0.1-r3
+Used by these packages: media-libs/freetype-2.5.0.1-r3 x11-libs/pango-1.32.5-r1
 </div>
 </div>
 </div>
@@ -27396,7 +34789,7 @@ References
 
 </pre>
 <div class="license-packages">
-Used by these packages: chromeos-base/gobi-sdk-0.1-r34 chromeos-base/chromeos-chrome-36.0.1985.19_rc-r1 chromeos-base/gtalk-62219080-r7 app-i18n/GoogleChineseInput-pinyin-2.0.0.0-r1 app-i18n/GoogleChineseInput-zhuyin-2.0.0.0-r1 chromeos-base/chromeos-default-apps-1.1.0 chromeos-base/gobi-firmware-1.0.61-r5 chromeos-base/genius-app-oem-0.0.6-r1 app-i18n/GoogleKeyboardInput-keyboards-1.3.2.1-r1 app-i18n/GoogleKeyboardInput-xkb-1.0.3.1-r1 chromeos-base/ja-motoyafonts-1.0.0 chromeos-base/madison-cromo-plugin-0.1-r49 chromeos-base/netflix-helper-2.0.0-r3 chromeos-base/ascender_to_license-20130111 chromeos-base/pepper-flash-14.0.0.95-r1 app-i18n/GoogleChineseInput-cangjie-2.0.0.0-r1
+Used by these packages: chromeos-base/gobi-sdk-0.1-r34 chromeos-base/madison-cromo-plugin-0.1-r50 chromeos-base/gtalk-62219080-r7 app-i18n/GoogleChineseInput-pinyin-2.0.0.0-r1 app-i18n/GoogleChineseInput-zhuyin-2.0.0.0-r1 app-i18n/GoogleKeyboardInput-keyboards-1.3.2.3-r1 chromeos-base/gobi-firmware-1.0.61-r5 chromeos-base/genius-app-oem-0.0.6-r1 chromeos-base/pepper-flash-14.0.0.145-r1 chromeos-base/ja-motoyafonts-1.0.0 app-i18n/GoogleKeyboardInput-xkb-1.1.2.0-r1 chromeos-base/chromeos-default-apps-1.2.0 chromeos-base/chromeos-chrome-37.0.2062.28_rc-r1 chromeos-base/netflix-helper-2.0.0-r3 chromeos-base/ascender_to_license-20130111 app-i18n/GoogleChineseInput-cangjie-2.0.0.0-r1
 </div>
 </div>
 </div>
@@ -27749,7 +35142,7 @@ Public License instead of this License.
 
 </pre>
 <div class="license-packages">
-Used by these packages: sys-apps/dtc-1.4.0 net-wireless/bluez-5.17-r2 sys-kernel/linux-headers-3.12 sys-apps/findutils-4.4.2-r1 net-libs/libmbim-1.9.0-r19 media-plugins/alsa-plugins-1.0.25-r1 sys-boot/syslinux-3.83-r5 sys-apps/iotools-1.5 sys-apps/mmc-utils-0.0.1-r5 sys-apps/keyutils-1.1 sys-fs/ecryptfs-utils-101 app-laptop/laptop-mode-tools-1.59-r21 dev-vcs/git-1.8.3.2-r1 sys-libs/libnih-1.0.3 sys-apps/baselayout-2.0.1-r232 dev-util/gtk-doc-am-1.18 sys-fs/fuse-2.8.6-r3 sys-devel/autoconf-2.13 dev-libs/libgpg-error-1.10-r1 sys-apps/smartmontools-5.42 net-dialup/ppp-2.4.5-r4 app-misc/mime-types-9 net-libs/libnfnetlink-1.0.1 sys-devel/automake-wrapper-9 sys-fs/ntfs3g-2012.1.15-r4 media-libs/sbc-1.0 sys-auth/pam_pwdfile-0.99-r1 net-libs/libnetfilter_queue-1.0.1 sys-apps/hwids-20130915.1 net-misc/openvpn-2.3.2-r2 sys-fs/e2fsprogs-1.42 dev-libs/nss-3.15.4-r1 x11-misc/shared-mime-info-1.0 app-accessibility/brltty-4.5-r9 sys-apps/usbutils-007 dev-util/intltool-0.50.2-r1 sys-apps/flashrom-0.9.4-r315 app-text/sgml-common-0.6.3-r5 net-misc/strongswan-5.0.2-r14 dev-libs/lzo-2.06 media-gfx/ply-image-0.0.1-r46 sys-process/procps-3.3.4 sys-apps/daisydog-0.0.1-r15 sys-apps/pciutils-3.1.10 dev-libs/pkcs11-helper-1.07 chromeos-base/root-certificates-0.0.1-r3 sys-kernel/Linux-2.6 dev-libs/libatomic_ops-7.2d app-admin/eselect-opengl-1.2.4-r1 sys-apps/portage-2.1.11.50-r6 app-portage/portage-utils-0.53 app-arch/xz-utils-5.0.5-r1 sys-apps/mawk-1.3.4_p20100625 app-admin/eselect-python-20100321 sys-apps/util-linux-2.24 sys-apps/hdparm-9.39 sys-fs/avfs-1.0.1-r2 sys-apps/ureadahead-0.100.0-r3 chromeos-base/autotest-0.0.2-r5100 net-dialup/xl2tpd-1.3.0-r2 sys-apps/ethtool-3.12.1 app-misc/pax-utils-0.8.1 dev-libs/dbus-glib-0.100.2 net-wireless/wpa_supplicant-0.7.2-r154 chromeos-base/chromeos-fonts-0.0.1-r15 sys-apps/chvt-0.0.1-r1 media-libs/freetype-2.5.0.1-r3 sys-devel/automake-1.11.1 dev-util/perf-3.14-r1 sys-auth/pambase-20101024-r2 sys-libs/pam-1.1.5 sys-devel/patch-2.6.1 sys-apps/diffutils-3.2 sys-apps/net-tools-1.60_p20120127084908 sys-apps/dmidecode-2.11-r1 media-sound/alsa-utils-1.0.27.1-r1 sys-devel/binutils-config-3-r3 sys-apps/shadow-4.1.2.2-r4 sys-fs/udev-171-r6 sys-apps/sandbox-2.6-r1 sys-fs/lvm2-2.02.97-r1 sys-apps/kbd-1.15.3 net-firewall/iptables-1.4.16.3 sys-apps/upstart-1.2-r7 net-misc/openssh-6.4_p1-r1 sys-devel/autoconf-wrapper-13 sys-apps/dbus-1.6.8-r5 dev-libs/nspr-4.10.2 sys-devel/libtool-2.4.2 sys-boot/coreboot-2013.04 sys-libs/libcap-2.17 sys-libs/e2fsprogs-libs-1.42 sys-apps/memtester-4.2.2
+Used by these packages: sys-apps/dtc-1.4.0 chromeos-base/autotest-tests-0.0.3-r5349 sys-apps/findutils-4.4.2-r1 chromeos-base/autotest-deps-ltp-0.0.1-r10 chromeos-base/autotest-tests-debugd-0.0.1-r30 media-plugins/alsa-plugins-1.0.25-r1 app-benchmarks/lmbench-3.0_alpha9-r1 sys-apps/iotools-1.5 media-libs/freetype-2.5.0.1-r3 chromeos-base/autotest-deps-glbench-0.0.1-r4926 chromeos-base/gmerge-0.0.1-r815 sys-apps/mmc-utils-0.0.1-r5 sys-apps/baselayout-2.0.1-r232 sys-apps/keyutils-1.1 sys-fs/ecryptfs-utils-101 app-text/htmltidy-20090325 app-laptop/laptop-mode-tools-1.59-r21 sys-process/ktop-0.0.1-r25 sys-apps/mawk-1.3.4_p20100625 sys-libs/libnih-1.0.3 dev-util/gtk-doc-am-1.18 sys-auth/pambase-20101024-r2 net-dialup/minicom-2.7 sys-apps/hdparm-9.39 sys-fs/fuse-2.8.6-r3 sys-devel/autoconf-2.13 sys-devel/gdb-7.7.1-r1 chromeos-base/autotest-all-0.0.1-r26 chromeos-base/autotest-private-0.2.1-r242 chromeos-base/chromeos-installshim-0.0.1-r8 dev-libs/libgpg-error-1.10-r1 app-misc/screen-4.0.3-r6 x11-misc/read-edid-1.4.2 sys-power/powertop-2.5 net-wireless/bluez-5.19-r6 chromeos-base/autotest-deps-webgl-perf-0.0.1-r419 app-admin/sysstat-10.2.0 chromeos-base/autotest-tests-tpm-0.0.1-r30 net-dialup/ppp-2.4.5-r4 dev-util/turbostat-3.8.11-r499 app-misc/mime-types-9 chromeos-base/autotest-private-tests-echoprivate-0.0.1-r39 net-libs/libnfnetlink-1.0.1 chromeos-base/autotest-private-tests-quickoffice-0.0.1-r70 chromeos-base/autotest-deps-piglit-0.0.1-r4680 sys-process/procps-3.3.4 sys-devel/automake-wrapper-9 net-dns/dnsmasq-2.50 chromeos-base/telemetry-0.0.1-r3 sys-fs/ntfs3g-2012.1.15-r4 media-libs/sbc-1.0 chromeos-base/autotest-deps-p2p-0.0.1-r30 sys-auth/pam_pwdfile-0.99-r1 chromeos-base/autotest-tests-cros-disks-0.0.1-r30 sys-boot/syslinux-3.83-r5 sys-apps/iproute2-3.8.0 dev-libs/nss-3.16-r1 media-libs/freeimage-3.15.3-r2 dev-util/xxd-1.10-r3 net-libs/libnetfilter_queue-1.0.1 sys-apps/hwids-20130915.1 chromeos-base/autotest-private-tests-pagecycler-0.0.1-r69 chromeos-base/chromeos-hwid-0.0.2-r291 net-misc/openvpn-2.3.2-r2 sys-fs/e2fsprogs-1.42 chromeos-base/autotest-tests-p2p-0.0.1-r30 sys-apps/daisydog-0.0.1-r16 x11-apps/mtplot-0.0.1-r35 chromeos-base/autotest-private-all-0.0.1-r74 app-benchmarks/i7z-0.27-r1 net-wireless/wireless-tools-29 sys-apps/usbutils-007 chromeos-base/autotest-tests-touchpad-0.0.1-r1039 chromeos-base/chromeos-initramfs-0.0.1-r162 dev-util/intltool-0.50.2-r2 sys-fs/sshfs-fuse-2.4 sys-apps/flashrom-0.9.4-r317 chromeos-base/autotest-tests-ltp-0.0.1-r3589 app-text/sgml-common-0.6.3-r5 app-benchmarks/punybench-0.0.1-r56 net-misc/strongswan-5.0.2-r14 chromeos-base/autotest-tests-ownershipapi-0.0.1-r4742 chromeos-base/autotest-deps-cellular-0.0.1-r66 dev-libs/lzo-2.06 media-gfx/ply-image-0.0.1-r46 sys-apps/pciutils-3.1.10 dev-libs/pkcs11-helper-1.07 chromeos-base/autotest-server-tests-bluetooth-0.0.1-r21 chromeos-base/root-certificates-0.0.1-r3 chromeos-base/touchbot-1.0-r86 app-admin/eselect-opengl-1.2.4-r1 sys-apps/portage-2.1.11.50-r6 x11-misc/x11vnc-0.9.13-r1 app-portage/portage-utils-0.53 net-misc/socat-1.7.2.3 sys-apps/dmidecode-2.11-r2 app-arch/xz-utils-5.0.5-r1 dev-vcs/git-1.8.3.2-r1 app-crypt/nss-3.16-r1 app-admin/eselect-python-20100321 chromeos-base/autotest-deps-touchpad-0.0.1-r1039 sys-apps/util-linux-2.24 sys-apps/ethtool-3.12.1 sys-fs/avfs-1.0.1-r2 sys-apps/i2c-tools-3.0.2 x11-misc/xtrace-1.3.0 chromeos-base/autotest-tests-cellular-0.0.1-r66 sys-apps/ureadahead-0.100.0-r3 net-dialup/xl2tpd-1.3.0-r2 x11-terms/rxvt-unicode-9.10 app-misc/pax-utils-0.8.1 dev-libs/dbus-glib-0.100.2 net-wireless/wpa_supplicant-0.7.2-r154 chromeos-base/recover-duts-0.0.1-r168 chromeos-base/chromeos-fonts-0.0.1-r15 sys-apps/chvt-0.0.1-r1 sys-process/psmisc-22.20 net-wireless/hostapd-2.1-r3 sys-devel/automake-1.11.1 dev-util/perf-3.14-r2 sys-process/time-1.7-r1 net-libs/libmbim-1.9.0-r20 chromeos-base/autotest-server-tests-shill-0.0.1-r21 games-util/joystick-1.4.2 sys-libs/pam-1.1.5 sci-libs/fftw-3.2.2 sys-apps/smartmontools-5.42 sys-devel/patch-2.6.1 sys-apps/diffutils-3.2 sys-apps/net-tools-1.60_p20120127084908 dev-libs/libatomic_ops-7.2d media-sound/alsa-utils-1.0.27.1-r1 sys-kernel/Linux-2.6 sys-devel/binutils-config-3-r3 sys-apps/shadow-4.1.2.2-r4 chromeos-base/autotest-server-tests-telemetry-0.0.1-r21 x11-misc/shared-mime-info-1.0-r1 chromeos-base/autotest-tests-cryptohome-0.0.1-r30 app-misc/evtest-1.29 sys-fs/udev-171-r6 chromeos-base/autotest-tests-power-0.0.1-r30 sys-apps/busybox-1.21.0-r5 sys-apps/sandbox-2.6-r1 net-dialup/lrzsz-0.12.20-r2 sys-fs/lvm2-2.02.97-r1 chromeos-base/autotest-tests-audio-0.0.1-r30 sys-apps/kbd-1.15.3 sys-kernel/linux-headers-3.12 net-firewall/iptables-1.4.16.3 sys-apps/upstart-1.2-r7 net-misc/openssh-6.4_p1-r1 chromeos-base/autotest-tests-security-0.0.1-r30 app-accessibility/brltty-4.5-r10 net-misc/htpdate-1.0.4-r6 chromeos-base/autotest-deps-graphics-0.0.1-r419 sys-devel/autoconf-wrapper-13 chromeos-base/autotest-deps-0.0.4-r5256 sys-apps/dbus-1.6.8-r5 sys-block/fio-2.1.8-r1 dev-libs/nspr-4.10.4 chromeos-base/autotest-chrome-0.0.1-r3840 chromeos-base/autotest-0.0.2-r5244 sys-devel/libtool-2.4.2 chromeos-base/autotest-server-tests-0.0.2-r149 chromeos-base/autotest-tests-graphics-0.0.1-r30 chromeos-base/autotest-tests-shill-0.0.1-r30 media-gfx/perceptualdiff-1.1.1-r1 sys-boot/coreboot-2013.04 sys-libs/libcap-2.17 chromeos-base/wireless_automation-0.0.1-r7 sys-libs/e2fsprogs-libs-1.42 chromeos-base/autotest-deps-webgl-mpd-0.0.1-r590 sys-apps/memtester-4.2.2
 </div>
 </div>
 </div>
@@ -27764,7 +35157,7 @@ See GPL-2 or GPL-3 for the full text of these licenses.
 
 </pre>
 <div class="license-packages">
-Used by these packages: dev-libs/libatomic_ops-7.2d app-arch/xz-utils-5.0.5-r1 media-libs/freetype-2.5.0.1-r3 sys-boot/u-boot-2013.06
+Used by these packages: media-libs/freetype-2.5.0.1-r3 app-arch/xz-utils-5.0.5-r1 sys-boot/u-boot-2013.06 dev-libs/libatomic_ops-7.2d
 </div>
 </div>
 </div>
@@ -28451,7 +35844,7 @@ Public License instead of this License.  But first, please read
 
 </pre>
 <div class="license-packages">
-Used by these packages: net-misc/wget-1.14 app-arch/gzip-1.5 app-arch/cpio-2.11-r1 sys-devel/autoconf-2.69 sys-fs/fuse-exfat-1.0.2_pre401 app-arch/tar-1.26-r1 sys-devel/binutils-2.22-r23 sys-devel/make-3.82-r4 net-misc/rsync-3.0.9-r3 sys-block/parted-3.1-r1 sys-libs/readline-6.2_p1 sys-libs/gcc-libs-4.8.2-r11 sys-fs/mtools-4.0.15 sys-fs/dosfstools-3.0.26 sys-apps/util-linux-2.24 sys-apps/grep-2.14 app-shells/bash-4.2_p45 sys-apps/sed-4.2.1-r1 sys-fs/exfat-utils-1.0.2_pre401 sys-devel/m4-1.4.16 sys-apps/coreutils-8.22 dev-lang/swig-2.0.4-r1 sys-libs/gdbm-1.9.1-r2 app-admin/rsyslog-5.8.11 app-arch/sharutils-4.7 sys-apps/which-2.20
+Used by these packages: app-misc/utouch-evemu-1.0.5-r10 app-arch/gzip-1.5 app-arch/cpio-2.11-r1 sys-fs/fuse-exfat-1.0.2_pre401 app-arch/tar-1.26-r1 sys-devel/binutils-2.22-r27 sys-devel/make-3.82-r4 net-misc/wget-1.14 sys-devel/m4-1.4.16 app-benchmarks/glmark2-285-r2 net-misc/rsync-3.0.9-r3 sys-block/parted-3.1-r1 sys-apps/less-457 app-admin/rsyslog-5.8.11-r1 sys-libs/readline-6.2_p1 sys-libs/gcc-libs-4.8.2-r11 chromeos-base/autotest-deps-glmark2-0.0.1-r438 sys-fs/mtools-4.0.15 sys-fs/dosfstools-3.0.26 sys-apps/util-linux-2.24 sys-devel/autoconf-2.69 sys-apps/grep-2.14 sys-apps/sed-4.2.1-r1 sys-fs/exfat-utils-1.0.2_pre401 sys-apps/coreutils-8.22 app-shells/bash-4.2_p45-r1 dev-lang/swig-2.0.4-r1 sys-libs/gdbm-1.9.1-r2 app-arch/sharutils-4.7 sys-apps/which-2.20
 </div>
 </div>
 </div>
@@ -28477,7 +35870,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 </pre>
 <div class="license-packages">
-Used by these packages: app-admin/sudo-1.8.6_p7 media-libs/harfbuzz-0.9.27-r2 net-wireless/iw-3.10 net-wireless/wireless-regdb-20131127-r3
+Used by these packages: app-misc/tmux-1.9a media-libs/harfbuzz-0.9.27-r2 dev-libs/confuse-2.7 net-wireless/iw-3.10 app-admin/sudo-1.8.6_p7 net-wireless/wireless-regdb-20131127-r3
 </div>
 </div>
 </div>
@@ -28972,7 +36365,7 @@ That's all there is to it!
 
 </pre>
 <div class="license-packages">
-Used by these packages: x11-libs/pango-1.32.5-r1 dev-libs/libusb-0.1.12-r7 dev-libs/glib-2.34.3-r1 dev-libs/atk-1.32.0-r1 dev-libs/dbus-c++-0.0.2-r51 sys-apps/kmod-15
+Used by these packages: sys-devel/gdb-7.7.1-r1 x11-libs/pango-1.32.5-r1 dev-libs/libaio-0.3.109-r3 dev-libs/dbus-c++-0.0.2-r51 dev-embedded/libftdi-1.0-r3 x11-apps/mesa-progs-8.0.1 dev-libs/glib-2.34.3-r2 dev-libs/atk-1.32.0-r1 x11-libs/gtk+-2.20.1 gnome-base/libglade-2.6.4 sys-apps/kmod-17
 </div>
 </div>
 </div>
@@ -28987,7 +36380,7 @@ See LGPL-2, LGPL-2.1, or LGPL-3 for the full text of these licenses.
 
 </pre>
 <div class="license-packages">
-Used by these packages: x11-libs/pango-1.32.5-r1 dev-libs/glib-2.34.3-r1
+Used by these packages: x11-libs/pango-1.32.5-r1 dev-libs/glib-2.34.3-r2
 </div>
 </div>
 </div>
@@ -29504,7 +36897,7 @@ That's all there is to it!
 
 </pre>
 <div class="license-packages">
-Used by these packages: dev-util/shflags-1.0.3-r1 net-wireless/bluez-5.17-r2 media-libs/ladspa-sdk-1.13-r1 media-plugins/alsa-plugins-1.0.25-r1 net-dns/avahi-0.6.31-r4 dev-libs/libusb-1.0.9 x11-libs/cairo-1.12.12 sys-apps/keyutils-1.1 dev-libs/libgpg-error-1.10-r1 dev-libs/libp11-0.2.8-r1 media-libs/sbc-1.0 dev-libs/nss-3.15.4-r1 media-libs/alsa-lib-1.0.27.2 app-accessibility/brltty-4.5-r9 dev-libs/libgcrypt-1.4.6 net-libs/libmnl-1.0.3-r1 media-libs/libmtp-0.0.1-r18 dev-libs/libdaemon-0.14-r1 dev-libs/libnl-3.2.14 sys-apps/util-linux-2.24 net-misc/modemmanager-classic-interfaces-0.0.1 sys-apps/acl-2.2.51 sys-apps/attr-2.4.46-r2 dev-libs/libnl-1.1-r1 dev-libs/engine_pkcs11-0.1.8 dev-libs/nspr-4.10.2 net-misc/modemmanager-next-1.3.0-r230 app-i18n/ibus-1.4.99.20120314-r5
+Used by these packages: dev-util/shflags-1.0.3-r1 media-libs/ladspa-sdk-1.13-r1 media-plugins/alsa-plugins-1.0.25-r1 net-dns/avahi-0.6.31-r4 x11-libs/cairo-1.12.12 sys-apps/keyutils-1.1 dev-libs/libusb-compat-0.1.5-r3 dev-libs/libgpg-error-1.10-r1 dev-libs/engine_pkcs11-0.1.8 net-wireless/bluez-5.19-r6 dev-libs/libp11-0.2.8-r1 dev-libs/libusb-1.0.18 media-libs/sbc-1.0 dev-libs/nss-3.16-r1 media-libs/alsa-lib-1.0.27.2 media-gfx/zbar-0.10-r4 dev-libs/libgcrypt-1.4.6 dev-python/pygtk-2.14.1-r5 media-libs/libmtp-0.0.1-r18 sys-libs/libcap-ng-0.6.6 dev-libs/libdaemon-0.14-r1 app-crypt/nss-3.16-r1 sys-apps/util-linux-2.24 dev-python/pygobject-2.18.0-r5 media-libs/libv4l-0.8.8 dev-libs/libnl-3.2.24 net-misc/modemmanager-classic-interfaces-0.0.1 sys-apps/acl-2.2.51 dev-python/pycairo-1.10.0-r4 sys-apps/attr-2.4.46-r2 app-editors/qemacs-0.4.0_pre20090420 dev-libs/opensc-0.12.2-r1 dev-libs/libnl-1.1-r1 app-accessibility/brltty-4.5-r10 dev-libs/nspr-4.10.4 media-sound/sox-14.3.2-r1 net-misc/modemmanager-next-1.3.0-r239 app-i18n/ibus-1.4.99.20120314-r5
 </div>
 </div>
 </div>
@@ -29682,7 +37075,7 @@ Library.
 
 </pre>
 <div class="license-packages">
-Used by these packages: sys-devel/binutils-2.22-r23 sys-libs/gcc-libs-4.8.2-r11 app-admin/rsyslog-5.8.11 media-libs/mesa-10.1-r2 dev-libs/gmp-5.0.2_p1
+Used by these packages: sys-devel/binutils-2.22-r27 chromeos-base/autotest-deps-piglit-0.0.1-r4680 app-admin/rsyslog-5.8.11-r1 sys-libs/gcc-libs-4.8.2-r11 media-libs/mesa-10.3-r3 dev-python/pycairo-1.10.0-r4 dev-libs/gmp-5.0.2_p1
 </div>
 </div>
 </div>
@@ -30069,7 +37462,7 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice
 
 </pre>
 <div class="license-packages">
-Used by these packages: dev-libs/nss-3.15.4-r1 dev-libs/nspr-4.10.2
+Used by these packages: dev-libs/nss-3.16-r1 app-crypt/nss-3.16-r1 dev-libs/nspr-4.10.4
 </div>
 </div>
 </div>
@@ -30173,7 +37566,7 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
 
 </pre>
 <div class="license-packages">
-Used by these packages: media-fonts/my-padauk-2.50 media-fonts/ml-anjalioldlipi-0.740 media-fonts/crosextrafonts-carlito-20130920 media-fonts/tibt-jomolhari-0.0.3c media-fonts/ko-nanumfonts-3.10.0 media-fonts/lohitfonts-cros-2.5.0-r1
+Used by these packages: media-fonts/my-padauk-2.50 media-fonts/crosextrafonts-carlito-20130920 media-fonts/ml-anjalioldlipi-0.740 media-fonts/tibt-jomolhari-0.0.3c media-fonts/ko-nanumfonts-3.10.0 media-fonts/lohitfonts-cros-2.5.0-r1
 </div>
 </div>
 </div>
@@ -30232,7 +37625,7 @@ Agreement.
 
 </pre>
 <div class="license-packages">
-Used by these packages: dev-python/setuptools-0.8-r1 dev-lang/python-2.7.3-r7
+Used by these packages: dev-python/setuptools-0.8-r1 dev-lang/python-2.7.3-r7 chromeos-base/minifakedns-0.0.1-r13
 </div>
 </div>
 </div>
@@ -30246,7 +37639,7 @@ Software is in the public domain.
 
 </pre>
 <div class="license-packages">
-Used by these packages: sys-apps/hwids-20130915.1 app-arch/xz-utils-5.0.5-r1 sys-apps/util-linux-2.24 sys-libs/timezone-data-2013g dev-libs/jsoncpp-0.6.0_rc2
+Used by these packages: sys-apps/hwids-20130915.1 app-arch/xz-utils-5.0.5-r1 sys-libs/timezone-data-2014e sys-apps/util-linux-2.24 dev-libs/jsoncpp-0.6.0_rc2
 </div>
 </div>
 </div>
@@ -30286,7 +37679,7 @@ Graphics, Inc.
 
 </pre>
 <div class="license-packages">
-Used by these packages: x11-proto/glproto-1.4.14-r1 media-libs/mesa-10.1-r2
+Used by these packages: media-libs/glu-9.0.0 media-libs/mesa-10.3-r3 x11-proto/glproto-1.4.14-r1
 </div>
 </div>
 </div>
@@ -32142,7 +39535,7 @@ SUCH DAMAGE.
 
 </pre>
 <div class="license-packages">
-Used by these packages: x11-libs/libdrm-2.4.52-r1 x11-base/X.Org-1.9.3 x11-apps/xset-mini-1.2.2-r3
+Used by these packages: x11-libs/libdrm-2.4.54 x11-libs/xcb-util-wm-0.3.8 x11-libs/xcb-util-renderutil-0.3.8 x11-libs/xcb-util-image-0.3.8 x11-libs/xcb-util-0.3.8 x11-libs/xcb-util-keysyms-0.3.8 x11-base/X.Org-1.9.3 x11-apps/xset-mini-1.2.2-r3 x11-libs/libdrm-tests-2.4.54
 </div>
 </div>
 </div>
index be7ed8f..15b742c 100644 (file)
 <translation id="7524657397100003338">edtxt</translation>
 <translation id="900114243503212879">file</translation>
 <translation id="8561322612995434619">ብቅ-ባይ አለው</translation>
-<translation id="8344569602005188545">á\88°á\8b\93á\89³á\89µ</translation>
+<translation id="8344569602005188545">á\88°á\8b\93á\89¶á\89½</translation>
 <translation id="5291783959063340370">ነገር</translation>
 <translation id="296951647852255825">{COUNT,plural, =1{ትር}one{# ትሮች}other{# ትሮች}}</translation>
 <translation id="6142308968191113180">ርዕስ 4</translation>
index 736c689..8b89dac 100644 (file)
@@ -99,7 +99,7 @@
 <translation id="2811204574343810641">Zeile</translation>
 <translation id="2844995807198708617">Kontextmenü</translation>
 <translation id="3897092660631435901">Menü</translation>
-<translation id="7181697990050180700">Passen Sie die Tastaturkürzel für häufig verwendete Befehle an, indem Sie sie unten in die entsprechenden Felder eingeben.</translation>
+<translation id="7181697990050180700">Passen Sie die Tastenkombinationen für häufig verwendete Befehle an, indem Sie sie unten in die entsprechenden Felder eingeben.</translation>
 <translation id="3084806535845658316">Kein Eingabeecho</translation>
 <translation id="421884353938374759">color picker</translation>
 <translation id="3716845769494773620">Mehrzeilig</translation>
 <translation id="8065607967589909823">Ausgewählt ist</translation>
 <translation id="4615592953348396470">Nächster Tastenanschlag wird ignoriert.</translation>
 <translation id="338583716107319301">Trennzeichen</translation>
-<translation id="6787839852456839824">Tastaturkürzel</translation>
+<translation id="6787839852456839824">Tastenkombinationen</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="2644542693584024604">misspelled</translation>
 <translation id="8747966237988593539">Geordnete Liste</translation>
index 656b180..6f56091 100644 (file)
@@ -67,7 +67,7 @@
 <translation id="6633350132811819843">कोई अगली तालिका नहीं.</translation>
 <translation id="8382679411218029383">स्वत: पूर्णता इनलाइन और सूची</translation>
 <translation id="6734854816611871228"><ph name="VALUE"/>, कॉम्‍बो बॉक्‍स</translation>
-<translation id="3793710123303304873">सà¤\82वाद से बाहर हो गए हैं.</translation>
+<translation id="3793710123303304873">डà¥\89यलà¥\89à¤\97 से बाहर हो गए हैं.</translation>
 <translation id="4004802134384979325">चेक किया गया</translation>
 <translation id="4973717656530883744">न्‍यूनतम <ph name="X"/></translation>
 <translation id="3312997241656799641">बाद में देखा गया लिंक</translation>
 <translation id="5080758118274074384">डबल क्लिक किया गया</translation>
 <translation id="6281876499889881039">अगला समान तत्व.</translation>
 <translation id="8767968232364267681">अगले स्‍तर 4 का शीर्षक</translation>
-<translation id="5042770794184672516">वाà¤\95à¥\8d वॉल्‍यूम बढ़ाएं</translation>
+<translation id="5042770794184672516">बà¥\8bलà¥\80 वॉल्‍यूम बढ़ाएं</translation>
 <translation id="3865806312596179194">mnu itm</translation>
 <translation id="3149472044574196936">अगली पंक्ति</translation>
 <translation id="5866042630553435010">आंशिक रूप से चेक किया गया</translation>
 <translation id="6364795331201459219">h6</translation>
 <translation id="1156132699680778945">1 लिंक</translation>
 <translation id="3629895152177651589">hd</translation>
-<translation id="5876817486144482042">वाà¤\95à¥\8d वॉल्‍यूम घटाएं</translation>
+<translation id="5876817486144482042">बà¥\8bलà¥\80 वॉल्‍यूम घटाएं</translation>
 <translation id="5608798115546226984">स्वतः पूर्णता इनलाइन</translation>
 <translation id="5963413905009737549">अनुभाग</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{रिक्ति}one{# रिक्तियां}other{# रिक्तियां}}</translation>
 <translation id="962913030769097253">अगले स्तर 1 का शीर्षक</translation>
 <translation id="3616113530831147358">ऑडियो</translation>
 <translation id="3406283310380167331">फ़ॉर्म सूची दिखाएं</translation>
-<translation id="225732394367814946">वाà¤\95à¥\8d की दर बढ़ाएं</translation>
+<translation id="225732394367814946">बà¥\8bलà¥\80 की दर बढ़ाएं</translation>
 <translation id="3093176084511590672">अगला स्थानचिह्न</translation>
 <translation id="5402367795255837559">ब्रेल</translation>
 <translation id="1452236308086741652"><ph name="VALUE"/>, पासवर्ड पाठ बॉक्‍स</translation>
 <translation id="7037042857287298941">पिछली सूची</translation>
 <translation id="3687295507293856493">वर्तमान सेल के स्‍तंभ शीर्ष लेख पर कोई अनुमान लगाएं</translation>
 <translation id="6307969636681130414">दबाया गया</translation>
-<translation id="5956928062748260866">सà¤\82वाद</translation>
+<translation id="5956928062748260866">डà¥\89यलà¥\89à¤\97</translation>
 <translation id="1546370775711804143">स्क्रॉल बार</translation>
 <translation id="4253168017788158739">नोट</translation>
 <translation id="4877261390094455813">खोज क्वेरी डालें.</translation>
 <translation id="1653266918374749391">पिछले स्‍तर 3 का शीर्षक</translation>
 <translation id="3493915602752813531">कोई अगला एंकर नहीं.</translation>
 <translation id="5919442531159595654">प्रतिलिपि बनाएं.</translation>
-<translation id="3712520970944678024">वाà¤\95à¥\8d नियंत्रित करना</translation>
+<translation id="3712520970944678024">बà¥\8bलà¥\80 नियंत्रित करना</translation>
 <translation id="3392045790598181549"><ph name="NAME"/>, मेनू आइटम</translation>
 <translation id="5851548754964597211">टैब सूची</translation>
 <translation id="5054047268577924192">पिछला सूची आइटम</translation>
 <translation id="207477615537953741">शब्दार्थ विज्ञान बंद</translation>
 <translation id="2045490512405922022">चेक नहीं किया गया</translation>
 <translation id="2972078295414139404">पहले देखा गया कोई लिंक नहीं.</translation>
-<translation id="7492049978501397201">डाला à¤\97या à¤¸à¤\82वाद</translation>
+<translation id="7492049978501397201">डाला à¤\97या à¤¡à¥\89यलà¥\89à¤\97</translation>
 <translation id="6186305613600865047">पृष्ठ में नीचे जाएं</translation>
 <translation id="2740779364947153571">frm</translation>
 <translation id="8066678206530322333">बैनर</translation>
 <translation id="7693840228159394336">पिछला रेडियो बटन</translation>
 <translation id="844681116543532394">कोई पिछला चेकबॉक्स नहीं.</translation>
 <translation id="3030432017085518523">मेनू आइटम रेडियो बटन</translation>
-<translation id="4372705107434148843">वाà¤\95à¥\8d रोकें</translation>
+<translation id="4372705107434148843">बà¥\8bलà¥\80 रोकें</translation>
 <translation id="2100350898815792233">सभी विराम चिह्न</translation>
 <translation id="7226216518520804442">lst</translation>
 <translation id="4206289001967551965">तालिका के अंदर</translation>
 <translation id="78826985582142166">sldr</translation>
 <translation id="81960742267269908">काटें.</translation>
 <translation id="2149594028072271924">x</translation>
-<translation id="2911433807131383493">ChromeVox à¤\9fà¥\8dयà¥\82à¤\9fà¥\8bरियल खोलें</translation>
-<translation id="6444046323172968959">सà¥\82à¤\9aना à¤¸à¤\82वाद</translation>
+<translation id="2911433807131383493">ChromeVox à¤¨à¤¿à¤°à¥\8dदà¥\87श खोलें</translation>
+<translation id="6444046323172968959">सà¥\82à¤\9aना à¤¡à¥\89यलà¥\89à¤\97</translation>
 <translation id="8931936695772494138">रिक्त शीर्षलेख</translation>
 <translation id="6697092096875747123">पिछला कॉम्बो बॉक्स</translation>
 <translation id="8428603554127842284">स्तर <ph name="DEPTH"/></translation>
 <translation id="7609342235116740824">वर्तमान पृष्ठ का URL प्रदर्शित करें</translation>
 <translation id="5102981729317424850">टूल बार</translation>
 <translation id="1810107444790159527">सूची बॉक्स</translation>
-<translation id="948171205378458592">वाà¤\95à¥\8d की दर घटाएं</translation>
+<translation id="948171205378458592">बà¥\8bलà¥\80 की दर घटाएं</translation>
 <translation id="4842108708071771135">कोई अगला ब्लॉककोट नहीं.</translation>
 <translation id="3286390186030710347">स्लाइडर</translation>
 <translation id="7041173719775863268">चयन समाप्त करें</translation>
index bd5ac57..e33cc29 100644 (file)
@@ -26,7 +26,7 @@
 <translation id="4688873778442829762">grilă</translation>
 <translation id="4047216625641135770">Marcaj</translation>
 <translation id="2223693656926968778">Acționați asupra elementului curent</translation>
-<translation id="528468243742722775">End (La sfârșit)</translation>
+<translation id="528468243742722775">Sfârșit</translation>
 <translation id="158493514907962286">Decembrie</translation>
 <translation id="6438968337250688271"><ph name="NAME"/>, meniu</translation>
 <translation id="8540054775867439484">Încadrare sus</translation>
 <translation id="5310788376443009632">eliminate:</translation>
 <translation id="1905379170753160525">Afișați lista de titluri</translation>
 <translation id="5748623122140342504">Titlul de nivel 5 anterior</translation>
-<translation id="7434509671034404296">Programator</translation>
+<translation id="7434509671034404296">Dezvoltator</translation>
 <translation id="7332592614823088566">Rândul <ph name="ROWINDEX"/> din <ph name="ROWTOTAL"/>, coloana <ph name="COLINDEX"/> din <ph name="COLTOTAL"/></translation>
 <translation id="794091007957014205">{COUNT,plural, =1{arond}few{# aronduri}other{# de aronduri}}</translation>
 <translation id="1107942983112791593">text derulant</translation>
-<translation id="1383876407941801731">Căutare</translation>
+<translation id="1383876407941801731">Căutați</translation>
 <translation id="9065283790526219006">+fereastră pop-up</translation>
 <translation id="5203930734796605961"><ph name="KEY"/> este deja atribuită pentru o comandă.</translation>
 <translation id="3486232535569802404">De la <ph name="V1"/> la <ph name="V2"/></translation>
 <translation id="4532633738839459153">{COUNT,plural, =1{bară oblică spre dreapta}few{# bare oblice spre dreapta}other{# de bare oblice spre dreapta}}</translation>
 <translation id="4099274309791143834">cu submeniu</translation>
 <translation id="1346748346194534595">Dreapta</translation>
-<translation id="6659594942844771486">Tab</translation>
+<translation id="6659594942844771486">Filă</translation>
 <translation id="2777845298774924149">S-a ieșit</translation>
 <translation id="3389259863310851658">Câmpul anterior din formular</translation>
 <translation id="1321576897702511272">Ascundeți ajutorul pentru ChromeVox</translation>
 <translation id="7819187121850078213">fila ferestrei <ph name="TITLE"/></translation>
 <translation id="2121067395472282800">tastă de acces: <ph name="KEY"/></translation>
 <translation id="6193330012414963395">a.m. p.m.</translation>
-<translation id="1177863135347784049">Personalizat</translation>
+<translation id="1177863135347784049">Personalizați</translation>
 <translation id="1722716240000795234">buton radio</translation>
 <translation id="1613476421962910979">Semnalele audio sunt activate</translation>
 <translation id="2089387485033699258">ro</translation>
index 1b7385e..a270b61 100644 (file)
 <translation id="7819187121850078213">Окно с вкладкой <ph name="TITLE"/>.</translation>
 <translation id="2121067395472282800">access key:<ph name="KEY"/></translation>
 <translation id="6193330012414963395">AM/PM</translation>
-<translation id="1177863135347784049">Ð\9fеÑ\80Ñ\81онализиÑ\80ованнÑ\8bй</translation>
+<translation id="1177863135347784049">Ð\9fеÑ\80Ñ\81онализиÑ\80ованнÑ\8bе</translation>
 <translation id="1722716240000795234">rd btn</translation>
 <translation id="1613476421962910979">Звуковые сигналы включены.</translation>
 <translation id="2089387485033699258">ru</translation>
index 187c60d..1674b4e 100644 (file)
 <translation id="6368143427468974988">Predchádzajúci nadpis</translation>
 <translation id="858513932009919906">automatické dopĺňanie – zoznam</translation>
 <translation id="9061915073547935367">Prepnúť miniaplikáciu vyhľadávania</translation>
-<translation id="7005146664810010831">Nenašla sa žiadna adresa URL</translation>
+<translation id="7005146664810010831">Nenašla sa žiadna webová adresa</translation>
 <translation id="3659787053479271466">upozornenie</translation>
 <translation id="4668929960204016307">,</translation>
 <translation id="7217912842225915592">+<ph name="NUM"/></translation>
 <translation id="4982773647088557172"><ph name="VALUE"/>, <ph name="NAME"/>, pole zoznamu</translation>
 <translation id="2864481629947106776">Predchádzajúci odkaz</translation>
 <translation id="2751010054435611913">pole s tel. číslom</translation>
-<translation id="7609342235116740824">Oznámiť adresu URL aktuálnej stránky</translation>
+<translation id="7609342235116740824">Oznámiť webovú adresu aktuálnej stránky</translation>
 <translation id="5102981729317424850">Panel s nástrojmi</translation>
 <translation id="1810107444790159527">Pole s ponukou</translation>
 <translation id="948171205378458592">Znížiť rýchlosť reči</translation>
 <translation id="2099611462826130688">oddeľovač</translation>
 <translation id="8283603667300770666">Ďalšie pole formulára</translation>
 <translation id="1082209053475788238">Žiadny predchádzajúci nadpis 6. úrovne</translation>
-<translation id="4300318234632215983">Oznámiť adresu URL za odkazom</translation>
+<translation id="4300318234632215983">Oznámiť webovú adresu za odkazom</translation>
 <translation id="4043348641337972076">Žiadny predchádzajúci orientačný bod ARIA</translation>
 <translation id="1157782847298808853">Pomocník pre klávesnicu</translation>
 <translation id="9040132695316389094">Nadpis 1</translation>
 <translation id="6129953537138746214">Medzera</translation>
 <translation id="667999046851023355">Dokument</translation>
 <translation id="3241052487511142956">Predchádzajúci navštívený odkaz</translation>
-<translation id="7684431668231950609">Upraviť text, vstup adresy URL</translation>
+<translation id="7684431668231950609">Upraviť text, vstup webovej adresy</translation>
 <translation id="6355910664415701303">Žiadna predchádzajúca položka zoznamu</translation>
 <translation id="423334822609210999">Vľavo nie je žiadna bunka</translation>
 <translation id="1275718070701477396">Vybraté</translation>
index 617f79f..11548ed 100644 (file)
 <translation id="4006140876663370126">รูปภาพ</translation>
 <translation id="8914429597676860578">เติมข้อความอัตโนมัติ</translation>
 <translation id="1539527321543337398">พื้นที่ข้อความ</translation>
-<translation id="5310788376443009632">à¸\99ำออà¸\81ออกแล้ว:</translation>
+<translation id="5310788376443009632">ลà¸\9aออกแล้ว:</translation>
 <translation id="1905379170753160525">แสดงรายการส่วนหัว</translation>
 <translation id="5748623122140342504">ส่วนหัวระดับ 5 ก่อนหน้า</translation>
 <translation id="7434509671034404296">นักพัฒนา</translation>
 <translation id="7336596009609913925">มีป๊อปอัป</translation>
 <translation id="4554899522007042510">ความสว่าง <ph name="BRIGHTNESS"/> เปอร์เซ็นต์</translation>
 <translation id="4107807507418787238">ไม่มีเซลล์ด้านล่าง</translation>
-<translation id="9077213568694924680">à¸\99ำออà¸\81ออกจากการเลือกแล้ว</translation>
+<translation id="9077213568694924680">ลà¸\9aออกจากการเลือกแล้ว</translation>
 <translation id="1025074108959230262">ปิดโหมดติดหนึบแล้ว</translation>
 <translation id="3599054940393788245">ไม่ได้อยู่ในคณิตศาสตร์</translation>
 <translation id="739763518212184081">บรรทัดก่อนหน้า</translation>
 <translation id="1157843803349774103">ช่องตัวเลือกรวม <ph name="NAME"/> <ph name="VALUE"/></translation>
 <translation id="3819376190738087562">ไม่มีการข้าม</translation>
 <translation id="1334095593597963605">พูดอักขระและคำ</translation>
-<translation id="6910211073230771657">à¸\99ำออà¸\81แล้ว</translation>
+<translation id="6910211073230771657">ลà¸\9aแล้ว</translation>
 <translation id="3762198587642264450">ไปที่ด้านล่างของแถวปัจจุบัน</translation>
 <translation id="4997282455736854877">ปุ่มตัวเลือก <ph name="NAME"/> ที่เลือกไว้</translation>
 <translation id="5750633686117194034">ไม่มีการกดคีย์ตัวปรับแต่ง โปรดกดคีย์ตัวปรับแต่งอย่างน้อยหนึ่งคีย์ค้างไว้ ยกนิ้วขึ้นเมื่อเสร็จสิ้นและคุณจะได้ยินเสียงการตั้งคีย์ แตะเพื่อออก</translation>
index 4e4da07..ba150cd 100644 (file)
 }
 
 #hid-detection #hid-prerequisite-msg {
-  padding: 10px 0 30px;
+  padding: 10px 0 20px;
 }
 
 #hid-keyboard-block,
 #hid-mouse-block {
-  padding: 20px 0;
+  padding: 10px 0;
+}
+
+#hid-keyboard-block {
+  padding-bottom: 30px;
 }
 
 #hid-keyboard-icon,
@@ -42,6 +46,7 @@
 
 #hid-mouse-label,
 #hid-keyboard-label {
+  -webkit-padding-start: 10px;
   display: inline;
 }
 
@@ -63,7 +68,9 @@
 }
 
 #hid-detection #hid-keyboard-pincode {
-  padding: 10px 0 20px 40px;
+  -webkit-padding-start: 40px;
+  padding-bottom: 15px;
+  padding-top: 15px;
 }
 
 .searching #hid-keyboard-label-searching,
@@ -89,6 +96,4 @@
 
 .pairing #hid-keyboard-pincode {
   display: block;
-  margin-left: 40px;
-  padding: 15px 0;
 }
index 1a60f6a..38c464e 100644 (file)
@@ -77,7 +77,8 @@
 }
 
 #oauth-enrollment.mode-manual #oauth-enroll-learn-more-link,
-#oauth-enrollment.mode-forced #oauth-enroll-learn-more-link {
+#oauth-enrollment.mode-forced #oauth-enroll-learn-more-link,
+#oauth-enrollment.mode-recovery #oauth-enroll-learn-more-link {
   display: inline;
 }
 
 }
 
 .oauth-enroll-state-signin.mode-manual #oauth-enroll-cancel-button,
-.oauth-enroll-state-working.mode-manual #oauth-enroll-cancel-button,
 .oauth-enroll-state-signin.mode-forced #oauth-enroll-back-button,
+.oauth-enroll-state-signin.mode-recovery #oauth-enroll-back-button,
+.oauth-enroll-state-working.mode-manual #oauth-enroll-cancel-button,
 .oauth-enroll-state-working.mode-forced #oauth-enroll-back-button,
+.oauth-enroll-state-working.mode-recovery #oauth-enroll-back-button,
 .oauth-enroll-state-error.mode-manual #oauth-enroll-cancel-button,
 .oauth-enroll-state-error.mode-auto #oauth-enroll-retry-button,
 .oauth-enroll-state-error.mode-forced #oauth-enroll-back-button,
+.oauth-enroll-state-error.mode-recovery #oauth-enroll-back-button,
 .oauth-enroll-state-explain #oauth-enroll-explain-retry-button,
 .oauth-enroll-state-success #oauth-enroll-done-button {
   display: inline;
index 7106203..3cbe93e 100644 (file)
@@ -271,6 +271,3 @@ chrome.storage.onChanged.addListener(function(changes, namespace) {
   }
 });
 
-chrome.alarms.onAlarm.addListener(function() {
-  SurpriseWallpaper.getInstance().next();
-});
index de5e9c6..b7dfded 100644 (file)
@@ -47,7 +47,8 @@
                 </span>
                 <span>
                   - <span i18n-content="componentVersion"></span>
-                    <span dir="ltr" jscontent="version"></span>
+                    <span dir="ltr" jscontent="version"
+                        jsvalues=".id: 'version-' + id"></span>
                 </span>
               </div>
             </div>
index 036fe5b..64b6e3a 100644 (file)
@@ -86,6 +86,9 @@ function onComponentEvent(eventArgs) {
     var id = eventArgs['id'];
     $('status-' + id).textContent = eventArgs['event'];
   }
+  if (eventArgs['version']) {
+    $('version-' + id).textContent = eventArgs['version'];
+  }
 }
 
 /**
index 51606a8..a6f5918 100644 (file)
@@ -38,6 +38,7 @@ var whitelistedExtensionIds = [
   'icljpnebmoleodmchaaajbkpoipfoahp', // Play Movies Nightly
   'mjekoljodoiapgkggnlmbecndfpbbcch', // Play Movies Beta
   'gdijeikdkaembjbdobgfkoidjkpbmlkd', // Play Movies Stable
+  'knipolnnllmklapflnccelgolnpehhpl', // Hangouts Extension
 ];
 
 /**
index afde3e0..e99c942 100644 (file)
@@ -203,8 +203,8 @@ define('main', [
   }
 
   /**
-   * @param {Object} autocompleteSuggestion the particular autocomplete
-   *     suggestion we're in the process of displaying.
+   * @param {AutocompleteMatchMojo} autocompleteSuggestion the particular
+   *     autocomplete suggestion we're in the process of displaying.
    * @param {string} propertyName the particular property of the autocomplete
    *     suggestion that should go in this cell.
    * @return {HTMLTableCellElement} that contains the value within this
@@ -382,7 +382,8 @@ define('main', [
       // Javascript?  In any case, we want to display them.)
       if (inDetailedMode) {
         for (var key in autocompleteSuggestion) {
-          if (!displayedProperties[key]) {
+          if (!displayedProperties[key] &&
+              typeof autocompleteSuggestion[key] != 'function') {
             var cell = document.createElement('td');
             cell.textContent = key + '=' + autocompleteSuggestion[key];
             row.appendChild(cell);
index 3c849a9..b93849e 100644 (file)
 .bluetooth-keyboard-button {
   -webkit-padding-end: 15px;
   -webkit-padding-start: 15px;
-  background-image: linear-gradient(to bottom,
-                                    #e9e9e9,
-                                    #f5f5f5);
   border: 1px solid #ccc;
   border-radius: 4px;
-  box-shadow: 0 0 0 1px #888,
-              inset 0 1px 1px 1px #fff,
-              inset 0 -1px 1px 1px #eee;
+  box-shadow: 0 0 0 1px #222;
   color: #222;
   display: inline-block;
-  font-size: 14px;
-  font-weight: 600;
+  font-size: 16px;
   height: 38px;
   line-height: 38px;
   margin: 0 10px 0 0;
 }
 
 .bluetooth-keyboard-button.key-next {
-  background-image: -webkit-linear-gradient(top,
-                                            rgb(77, 144, 254),
-                                            rgb(71, 135, 237));
-  border: 1px solid rgb(77, 144, 254);
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.07),
-            inset 0 1px 1px 1px #fff,
-            inset 0 -1px 1px 1px rgb(77, 144, 254);
+  background: rgb(77, 144, 254);
+  background-image: none;
+  border: 2px solid rgb(77, 144, 254);
+  box-shadow: none;
   color: #fff;
 }
 
 .bluetooth-keyboard-button.key-untyped {
   border: 1px solid #d4d4d4;
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.07),
-              inset 0 1px 1px 1px #fff,
-              inset 0 -1px 1px 1px #ddd;
+  box-shadow: 0 0 0 1px #888;
   color: #666;
 }
index cd72ba5..5d65f7c 100644 (file)
@@ -269,10 +269,12 @@ cr.define('options', function() {
       // Cleanup the search query string.
       text = SearchPage.canonicalizeQuery(text);
 
-      // Set the hash on the current page, and the enclosing uber page
+      // Set the hash on the current page, and the enclosing uber page. Only do
+      // this if the page is not current. See https://crbug.com/401004.
       var hash = text ? '#' + encodeURIComponent(text) : '';
       var path = text ? this.name : '';
-      uber.pushState({}, path + hash);
+      if (location.hash != hash || location.pathname != '/' + path)
+        uber.pushState({}, path + hash);
 
       // Toggle the search page if necessary.
       if (text) {
index 84f7b56..1e12713 100644 (file)
@@ -85,6 +85,10 @@ h2 {
   width: 72px;
 }
 
+input[type=checkbox] {
+  visibility: hidden;
+}
+
 .interstitial-wrapper {
   box-sizing: border-box;
   font-size: 1em;
@@ -114,11 +118,8 @@ h2 {
   -webkit-margin-start: 32px;
 }
 
-.safe-browsing a,
-.safe-browsing #details,
-.safe-browsing #details-button,
-.safe-browsing h1,
-.safe-browsing h2 {
+.safe-browsing :-webkit-any(
+    a, #details, #details-button, h1, h2, p, .small-link) {
   color: white;
 }
 
index ef96235..a6498d3 100644 (file)
@@ -4,13 +4,94 @@
 
 #include "chrome/browser/safe_browsing/environment_data_collection_win.h"
 
+#include <windows.h>
+#include <set>
+
+#include "base/i18n/case_conversion.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/install_verification/win/module_info.h"
+#include "chrome/browser/install_verification/win/module_verification_common.h"
+#include "chrome/browser/net/service_providers_win.h"
+#include "chrome/browser/safe_browsing/path_sanitizer.h"
 #include "chrome/common/safe_browsing/csd.pb.h"
 
 namespace safe_browsing {
 
+namespace {
+
+// Helper function for expanding all environment variables in |path|.
+std::wstring ExpandEnvironmentVariables(const std::wstring& path) {
+  static const DWORD kMaxBuffer = 32 * 1024;  // Max according to MSDN.
+  std::wstring path_expanded;
+  DWORD path_len = MAX_PATH;
+  do {
+    DWORD result = ExpandEnvironmentStrings(
+        path.c_str(), WriteInto(&path_expanded, path_len), path_len);
+    if (!result) {
+      // Failed to expand variables. Return the original string.
+      DPLOG(ERROR) << path;
+      break;
+    }
+    if (result <= path_len)
+      return path_expanded.substr(0, result - 1);
+    path_len = result;
+  } while (path_len < kMaxBuffer);
+
+  return path;
+}
+
+}  // namespace
+
+bool CollectDlls(ClientIncidentReport_EnvironmentData_Process* process) {
+  // Retrieve the module list.
+  std::set<ModuleInfo> loaded_modules;
+  if (!GetLoadedModules(&loaded_modules))
+    return false;
+
+  // Sanitize path of each module and add it to the incident report.
+  PathSanitizer path_sanitizer;
+  for (std::set<ModuleInfo>::const_iterator it = loaded_modules.begin();
+       it != loaded_modules.end();
+       ++it) {
+    base::FilePath dll_path(it->name);
+    path_sanitizer.StripHomeDirectory(&dll_path);
+
+    ClientIncidentReport_EnvironmentData_Process_Dll* dll = process->add_dll();
+    dll->set_path(base::WideToUTF8(base::i18n::ToLower(dll_path.value())));
+    dll->set_base_address(it->base_address);
+    dll->set_length(it->size);
+  }
+
+  return true;
+}
+
+void RecordLspFeature(ClientIncidentReport_EnvironmentData_Process* process) {
+  WinsockLayeredServiceProviderList lsp_list;
+  GetWinsockLayeredServiceProviders(&lsp_list);
+
+  // For each LSP, we extract and sanitize the path.
+  PathSanitizer path_sanitizer;
+  std::set<std::wstring> lsp_paths;
+  for (size_t i = 0; i < lsp_list.size(); ++i) {
+    base::FilePath lsp_path(ExpandEnvironmentVariables(lsp_list[i].path));
+    path_sanitizer.StripHomeDirectory(&lsp_path);
+    lsp_paths.insert(base::i18n::ToLower(lsp_path.value()));
+  }
+
+  // Look for a match between LSPs and loaded dlls.
+  for (int i = 0; i < process->dll_size(); ++i) {
+    if (lsp_paths.count(base::UTF8ToWide(process->dll(i).path()))) {
+      process->mutable_dll(i)
+          ->add_feature(ClientIncidentReport_EnvironmentData_Process_Dll::LSP);
+    }
+  }
+}
+
 void CollectPlatformProcessData(
     ClientIncidentReport_EnvironmentData_Process* process) {
-  // TODO(pmonette): collect dlls and lsps.
+  CollectDlls(process);
+  RecordLspFeature(process);
 }
 
 }  // namespace safe_browsing
index 8dcbcc6..f32bc83 100644 (file)
@@ -7,7 +7,16 @@
 
 namespace safe_browsing {
 
-// TODO(pmonette): put DLL and LSP collection declarations here.
+class ClientIncidentReport_EnvironmentData_Process;
+
+// Collects then populates |process| with the sanitized paths of all DLLs
+// loaded in the current process. Return false if an error occurred while
+// querying for the loaded dlls.
+bool CollectDlls(ClientIncidentReport_EnvironmentData_Process* process);
+
+// For each of the dlls in this already populated incident report,
+// check one of them is a registered LSP.
+void RecordLspFeature(ClientIncidentReport_EnvironmentData_Process* process);
 
 }  // namespace safe_browsing
 
diff --git a/src/chrome/browser/safe_browsing/environment_data_collection_win_unittest.cc b/src/chrome/browser/safe_browsing/environment_data_collection_win_unittest.cc
new file mode 100644 (file)
index 0000000..7b8729e
--- /dev/null
@@ -0,0 +1,117 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/safe_browsing/environment_data_collection_win.h"
+
+#include <string>
+
+#include "base/files/file_path.h"
+#include "base/scoped_native_library.h"
+#include "chrome/common/safe_browsing/csd.pb.h"
+#include "net/base/winsock_init.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+// Helper function that returns true if a dll with filename |dll_name| is
+// found in |process_report|.
+bool ProcessReportContainsDll(
+    const safe_browsing::ClientIncidentReport_EnvironmentData_Process&
+        process_report,
+    const base::FilePath& dll_name) {
+  for (int i = 0; i < process_report.dll_size(); ++i) {
+    base::FilePath current_dll =
+        base::FilePath::FromUTF8Unsafe(process_report.dll(i).path());
+
+    if (current_dll.BaseName() == dll_name)
+      return true;
+  }
+
+  return false;
+}
+
+}  // namespace
+
+TEST(SafeBrowsingEnvironmentDataCollectionWinTest, CollectDlls) {
+  // This test will check if the CollectDlls method works by loading
+  // a dll and then checking if we can find it within the process report.
+  // Pick msvidc32.dll as it is present from WinXP to Win8 and yet rarely used.
+  // msvidc32.dll exists in both 32 and 64 bit versions.
+  base::FilePath msvdc32_dll(L"msvidc32.dll");
+
+  safe_browsing::ClientIncidentReport_EnvironmentData_Process process_report;
+  safe_browsing::CollectDlls(&process_report);
+
+  ASSERT_FALSE(ProcessReportContainsDll(process_report, msvdc32_dll));
+
+  // Redo the same verification after loading a new dll.
+  base::ScopedNativeLibrary library(msvdc32_dll);
+
+  process_report.clear_dll();
+  safe_browsing::CollectDlls(&process_report);
+
+  ASSERT_TRUE(ProcessReportContainsDll(process_report, msvdc32_dll));
+}
+
+TEST(SafeBrowsingEnvironmentDataCollectionWinTest, RecordLspFeature) {
+  net::EnsureWinsockInit();
+
+  // Populate our incident report with loaded modules.
+  safe_browsing::ClientIncidentReport_EnvironmentData_Process process_report;
+  safe_browsing::CollectDlls(&process_report);
+
+  // We'll test RecordLspFeatures against a real dll registered as a LSP. All
+  // dll paths are expected to be lowercase in the process report.
+  std::string lsp_path = "c:\\windows\\system32\\mswsock.dll";
+  int base_address = 0x77770000;
+  int length = 0x180000;
+
+  // Look for dlls that are registered as a LSP.
+  safe_browsing::RecordLspFeature(&process_report);
+
+  // Look through dll entries and check that none contains the LSP feature.
+  bool lsp_feature_found = false;
+  for (int i = 0; i < process_report.dll_size(); ++i) {
+    if (process_report.dll(i).path() == lsp_path) {
+      // Look for ClientIncidentReport_EnvironmentData_Process_DLL_Feature_LSP
+      // through the features of each dll.
+      for (int j = 0; j < process_report.dll(i).feature_size(); ++j) {
+        if (process_report.dll(i).feature(j) ==
+            safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll::
+                LSP)
+          lsp_feature_found = true;
+      }
+    }
+  }
+
+  ASSERT_FALSE(lsp_feature_found);
+
+  // Manually add an entry to the process report that will get marked as a LSP.
+  safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll* dll =
+      process_report.add_dll();
+  dll->set_path(lsp_path);
+  dll->set_base_address(base_address);
+  dll->set_length(length);
+
+  // Look for dlls that are registered as a LSP.
+  safe_browsing::RecordLspFeature(&process_report);
+
+  // Look through dll entries and check if the one we added contains the LSP
+  // feature.
+  lsp_feature_found = false;
+  for (int i = 0; i < process_report.dll_size(); ++i) {
+    if (process_report.dll(i).path() == lsp_path) {
+      // Look for ClientIncidentReport_EnvironmentData_Process_DLL_Feature_LSP
+      // through the features of each dll.
+      for (int j = 0; j < process_report.dll(i).feature_size(); ++j) {
+        if (process_report.dll(i).feature(j) ==
+            safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll::
+                LSP)
+          lsp_feature_found = true;
+      }
+    }
+  }
+
+  ASSERT_TRUE(lsp_feature_found);
+}
index 05e7c42..d0e1c2f 100644 (file)
@@ -145,6 +145,14 @@ void LastDownloadFinder::SearchInProfile(Profile* profile) {
     return;
   }
 
+  // Exit early if already processing this profile. This could happen if, for
+  // example, NOTIFICATION_PROFILE_ADDED arrives after construction while
+  // waiting for NOTIFICATION_HISTORY_LOADED.
+  if (std::find(profiles_.begin(), profiles_.end(), profile) !=
+      profiles_.end()) {
+    return;
+  }
+
   HistoryService* history_service =
       HistoryServiceFactory::GetForProfile(profile, Profile::IMPLICIT_ACCESS);
   // No history service is returned for profiles that do not save history.
diff --git a/src/chrome/browser/safe_browsing/path_sanitizer.cc b/src/chrome/browser/safe_browsing/path_sanitizer.cc
new file mode 100644 (file)
index 0000000..d4b00f5
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/safe_browsing/path_sanitizer.h"
+
+#include "base/logging.h"
+#include "base/path_service.h"
+
+namespace safe_browsing {
+
+PathSanitizer::PathSanitizer() {
+  // Get the home directory path.
+  if (!PathService::Get(base::DIR_HOME, &home_path_))
+    NOTREACHED();
+}
+
+const base::FilePath& PathSanitizer::GetHomeDirectory() const {
+  return home_path_;
+}
+
+void PathSanitizer::StripHomeDirectory(base::FilePath* file_path) const {
+  base::FilePath sanitized_path(FILE_PATH_LITERAL("~"));
+
+  // The |file_path| is overwritten only if a relative path is found.
+  if (home_path_.AppendRelativePath(*file_path, &sanitized_path))
+    *file_path = sanitized_path;
+}
+
+}  // namespace safe_browsing
diff --git a/src/chrome/browser/safe_browsing/path_sanitizer.h b/src/chrome/browser/safe_browsing/path_sanitizer.h
new file mode 100644 (file)
index 0000000..19d59fc
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SAFE_BROWSING_PATH_SANITIZER_H_
+#define CHROME_BROWSER_SAFE_BROWSING_PATH_SANITIZER_H_
+
+#include "base/files/file_path.h"
+#include "base/macros.h"
+
+namespace safe_browsing {
+
+// A helper class to sanitize any number of file paths by replacing the portion
+// that represents the current user's home directory with "~".
+class PathSanitizer {
+ public:
+  PathSanitizer();
+
+  const base::FilePath& GetHomeDirectory() const;
+
+  void StripHomeDirectory(base::FilePath* file_path) const;
+
+ private:
+  base::FilePath home_path_;
+
+  DISALLOW_COPY_AND_ASSIGN(PathSanitizer);
+};
+
+}  // namespace safe_browsing
+
+#endif  // CHROME_BROWSER_SAFE_BROWSING_PATH_SANITIZER_H_
diff --git a/src/chrome/browser/safe_browsing/path_sanitizer_unittest.cc b/src/chrome/browser/safe_browsing/path_sanitizer_unittest.cc
new file mode 100644 (file)
index 0000000..a23ae6b
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/safe_browsing/path_sanitizer.h"
+
+#include <vector>
+
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+// Returns the root directory with a trailing separator. Works on all platforms.
+base::FilePath GetRootDirectory() {
+  base::FilePath dir_temp;
+  if (!PathService::Get(base::DIR_TEMP, &dir_temp))
+    NOTREACHED();
+
+  std::vector<base::FilePath::StringType> components;
+  dir_temp.GetComponents(&components);
+
+  return base::FilePath(components[0]).AsEndingWithSeparator();
+}
+
+}  // namespace
+
+TEST(SafeBrowsingPathSanitizerTest, HomeDirectoryIsNotEmpty) {
+  safe_browsing::PathSanitizer path_sanitizer;
+
+  ASSERT_FALSE(path_sanitizer.GetHomeDirectory().empty());
+}
+
+TEST(SafeBrowsingPathSanitizerTest, DontStripHomeDirectoryTest) {
+  // Test with path not in home directory.
+  base::FilePath path =
+      GetRootDirectory().Append(FILE_PATH_LITERAL("not_in_home_directory.ext"));
+  base::FilePath path_expected = path;
+
+  safe_browsing::PathSanitizer path_sanitizer;
+  path_sanitizer.StripHomeDirectory(&path);
+
+  ASSERT_EQ(path.value(), path_expected.value());
+}
+
+TEST(SafeBrowsingPathSanitizerTest, DoStripHomeDirectoryTest) {
+  // Test with path in home directory.
+  safe_browsing::PathSanitizer path_sanitizer;
+
+  base::FilePath path = path_sanitizer.GetHomeDirectory().Append(
+      FILE_PATH_LITERAL("in_home_directory.ext"));
+  base::FilePath path_expected = base::FilePath(FILE_PATH_LITERAL("~")).Append(
+      FILE_PATH_LITERAL("in_home_directory.ext"));
+
+  path_sanitizer.StripHomeDirectory(&path);
+
+  ASSERT_EQ(path.value(), path_expected.value());
+}
index 967c0b9..d4b0920 100644 (file)
@@ -41,7 +41,8 @@ void FakeSigninManager::SignIn(const std::string& username) {
                     GoogleSigninSucceeded(username, std::string()));
 }
 
-void FakeSigninManager::SignOut() {
+void FakeSigninManager::SignOut(
+    signin_metrics::ProfileSignout signout_source_metric) {
   const std::string username = GetAuthenticatedUsername();
   clear_authenticated_username();
   profile_->GetPrefs()->ClearPref(prefs::kGoogleServicesUsername);
index fc39509..c081800 100644 (file)
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "components/signin/core/browser/signin_metrics.h"
 
 #if defined(OS_CHROMEOS)
 #include "components/signin/core/browser/signin_manager_base.h"
@@ -36,9 +37,10 @@ class FakeSigninManager : public SigninManager {
 
   void SignIn(const std::string& username);
 #if defined(OS_CHROMEOS)
-  void SignOut();
+  void SignOut(signin_metrics::ProfileSignout signout_source_metric);
 #else
-  virtual void SignOut() OVERRIDE;
+  virtual void SignOut(signin_metrics::ProfileSignout signout_source_metric)
+      OVERRIDE;
 #endif
 
   static KeyedService* Build(content::BrowserContext* context);
index 1961d16..8b4907e 100644 (file)
@@ -224,7 +224,7 @@ TEST_F(AccountReconcilorTest, SigninManagerRegistration) {
 
   EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
 
-  signin_manager()->SignOut();
+  signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST);
   ASSERT_FALSE(reconcilor->IsRegisteredWithTokenService());
 }
 
index cb2dea7..d7cee77 100644 (file)
@@ -368,6 +368,14 @@ void AndroidProfileOAuth2TokenService::RevokeAllCredentials() {
        it != accounts.end(); it++) {
     FireRefreshTokenRevoked(*it);
   }
+
+  // Clear everything on the Java side as well.
+  std::vector<std::string> empty;
+  JNIEnv* env = AttachCurrentThread();
+  ScopedJavaLocalRef<jobjectArray> java_accounts(
+      base::android::ToJavaArrayOfStrings(env, empty));
+  Java_OAuth2TokenService_saveStoredAccounts(
+      env, base::android::GetApplicationContext(), java_accounts.obj());
 }
 
 // Called from Java when fetching of an OAuth2 token is finished. The
index 28c8899..68decb9 100644 (file)
@@ -95,7 +95,8 @@ void FakeSigninManager::FailSignin(const GoogleServiceAuthError& error) {
   FOR_EACH_OBSERVER(Observer, observer_list_, GoogleSigninFailed(error));
 }
 
-void FakeSigninManager::SignOut() {
+void FakeSigninManager::SignOut(
+    signin_metrics::ProfileSignout signout_source_metric) {
   if (IsSignoutProhibited())
     return;
   set_auth_in_progress(std::string());
index f547391..f491ac9 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "base/compiler_specific.h"
 #include "components/signin/core/browser/signin_manager.h"
+#include "components/signin/core/browser/signin_metrics.h"
 
 namespace content {
 class BrowserContext;
@@ -59,7 +60,8 @@ class FakeSigninManager : public SigninManager {
       const std::string& password,
       const OAuthTokenFetchedCallback& oauth_fetched_callback) OVERRIDE;
 
-  virtual void SignOut() OVERRIDE;
+  virtual void SignOut(signin_metrics::ProfileSignout signout_source_metric)
+      OVERRIDE;
 
   virtual void CompletePendingSignin() OVERRIDE;
 
index c49673a..623a9e4 100644 (file)
@@ -230,7 +230,7 @@ TEST_F(SigninManagerTest, SignOut) {
       "user@gmail.com",
       "password",
       SigninManager::OAuthTokenFetchedCallback());
-  manager_->SignOut();
+  manager_->SignOut(signin_metrics::SIGNOUT_TEST);
   EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty());
   // Should not be persisted anymore
   ShutDownManager();
@@ -245,10 +245,10 @@ TEST_F(SigninManagerTest, SignOutWhileProhibited) {
 
   manager_->SetAuthenticatedUsername("user@gmail.com");
   manager_->ProhibitSignout(true);
-  manager_->SignOut();
+  manager_->SignOut(signin_metrics::SIGNOUT_TEST);
   EXPECT_FALSE(manager_->GetAuthenticatedUsername().empty());
   manager_->ProhibitSignout(false);
-  manager_->SignOut();
+  manager_->SignOut(signin_metrics::SIGNOUT_TEST);
   EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty());
 }
 
index 1b3e2a0..ba88ebb 100644 (file)
@@ -91,7 +91,7 @@ TEST_F(SigninNamesOnIOThreadTest, Signin) {
 TEST_F(SigninNamesOnIOThreadTest, Signout) {
   const base::string16 email = base::UTF8ToUTF16("foo@gmail.com");
   SimulateSignin(email);
-  signin_manager_->SignOut();
+  signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST);
 
   const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails();
   ASSERT_EQ(0u, emails.size());
index 789eac3..3c47074 100644 (file)
@@ -54,6 +54,10 @@ void TtsMessageFilter::OnChannelClosing() {
       base::Bind(&TtsMessageFilter::OnChannelClosingInUIThread, this));
 }
 
+void TtsMessageFilter::OnDestruct() const {
+  BrowserThread::DeleteOnUIThread::Destruct(this);
+}
+
 void TtsMessageFilter::OnInitializeVoiceList() {
   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   TtsController* tts_controller = TtsController::GetInstance();
@@ -159,4 +163,6 @@ void TtsMessageFilter::OnChannelClosingInUIThread() {
 }
 
 TtsMessageFilter::~TtsMessageFilter() {
+  CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  TtsController::GetInstance()->RemoveVoicesChangedDelegate(this);
 }
index 629745c..154f482 100644 (file)
@@ -26,6 +26,7 @@ class TtsMessageFilter
       content::BrowserThread::ID* thread) OVERRIDE;
   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
   virtual void OnChannelClosing() OVERRIDE;
+  virtual void OnDestruct() const OVERRIDE;
 
   // UtteranceEventDelegate implementation.
   virtual void OnTtsEvent(Utterance* utterance,
@@ -37,6 +38,9 @@ class TtsMessageFilter
   virtual void OnVoicesChanged() OVERRIDE;
 
  private:
+  friend class content::BrowserThread;
+  friend class base::DeleteHelper<TtsMessageFilter>;
+
   virtual ~TtsMessageFilter();
 
   void OnInitializeVoiceList();
index c7018e3..5a727bb 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/message_loop/message_loop.h"
+#include "base/metrics/field_trial.h"
 #include "chrome/browser/sync/managed_user_signin_manager_wrapper.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/sync_driver/sync_prefs.h"
@@ -15,6 +16,10 @@ namespace browser_sync {
 #if defined(ENABLE_PRE_SYNC_BACKUP)
 // Number of rollback attempts to try before giving up.
 static const int kRollbackLimits = 3;
+
+// Finch experiment name and group.
+static char kSyncBackupFinchName[] = "SyncBackup";
+static char kSyncBackupFinchDisabled[] = "disabled";
 #endif
 
 BackupRollbackController::BackupRollbackController(
@@ -33,11 +38,8 @@ BackupRollbackController::~BackupRollbackController() {
 }
 
 void BackupRollbackController::Start(base::TimeDelta delay) {
-#if defined(ENABLE_PRE_SYNC_BACKUP)
-  if (CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kSyncDisableBackup)) {
+  if (!IsBackupEnabled())
     return;
-  }
 
   if (!CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kSyncEnableRollback)) {
@@ -53,7 +55,6 @@ void BackupRollbackController::Start(base::TimeDelta delay) {
                    weak_ptr_factory_.GetWeakPtr()),
         delay);
   }
-#endif
 }
 
 void BackupRollbackController::OnRollbackReceived() {
@@ -85,4 +86,21 @@ void BackupRollbackController::TryStart() {
   }
 }
 
+// static
+bool BackupRollbackController::IsBackupEnabled() {
+#if defined(ENABLE_PRE_SYNC_BACKUP)
+  const std::string group_name =
+      base::FieldTrialList::FindFullName(kSyncBackupFinchName);
+
+  if (CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kSyncDisableBackup) ||
+      group_name == kSyncBackupFinchDisabled)  {
+    return false;
+  }
+  return true;
+#else
+  return false;
+#endif
+}
+
 }  // namespace browser_sync
index 5a3cd5e..923d37a 100644 (file)
@@ -38,6 +38,9 @@ class BackupRollbackController {
   // Update rollback preference to indicate rollback is finished.
   void OnRollbackDone();
 
+  // Return true if platform supports backup and backup is enabled.
+  static bool IsBackupEnabled();
+
  private:
   // Check signin status and rollback preference and start backup/rollback
   // accordingly.
index b8f967d..1ddbf04 100644 (file)
@@ -29,6 +29,11 @@ SearchEngineDataTypeController::SearchEngineDataTypeController(
       profile_(profile) {
 }
 
+TemplateURLService::Subscription*
+SearchEngineDataTypeController::GetSubscriptionForTesting() {
+  return template_url_subscription_.get();
+}
+
 SearchEngineDataTypeController::~SearchEngineDataTypeController() {}
 
 // We want to start the TemplateURLService before we begin associating.
@@ -52,6 +57,10 @@ bool SearchEngineDataTypeController::StartModels() {
   return false;  // Don't continue Start.
 }
 
+void SearchEngineDataTypeController::StopModels() {
+  template_url_subscription_.reset();
+}
+
 void SearchEngineDataTypeController::OnTemplateURLServiceLoaded() {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   DCHECK_EQ(state_, MODEL_STARTING);
index e89f4fb..45a8a2f 100644 (file)
@@ -26,11 +26,14 @@ class SearchEngineDataTypeController : public UIDataTypeController {
       Profile* profile,
       const DisableTypeCallback& disable_callback);
 
+  TemplateURLService::Subscription* GetSubscriptionForTesting();
+
  private:
   virtual ~SearchEngineDataTypeController();
 
   // FrontendDataTypeController implementations.
   virtual bool StartModels() OVERRIDE;
+  virtual void StopModels() OVERRIDE;
 
   void OnTemplateURLServiceLoaded();
 
index 58b580a..dfb6b29 100644 (file)
@@ -109,11 +109,13 @@ TEST_F(SyncSearchEngineDataTypeControllerTest, StartURLServiceNotReady) {
   search_engine_dtc_->LoadModels(
       base::Bind(&ModelLoadCallbackMock::Run,
                  base::Unretained(&model_load_callback_)));
+  EXPECT_TRUE(search_engine_dtc_->GetSubscriptionForTesting());
   EXPECT_EQ(DataTypeController::MODEL_STARTING, search_engine_dtc_->state());
   EXPECT_FALSE(syncable_service_.syncing());
 
   // Send the notification that the TemplateURLService has started.
   PreloadTemplateURLService();
+  EXPECT_EQ(NULL, search_engine_dtc_->GetSubscriptionForTesting());
   EXPECT_EQ(DataTypeController::MODEL_LOADED, search_engine_dtc_->state());
 
   // Wait until WebDB is loaded before we shut it down.
@@ -154,5 +156,20 @@ TEST_F(SyncSearchEngineDataTypeControllerTest, Stop) {
   EXPECT_FALSE(syncable_service_.syncing());
 }
 
+TEST_F(SyncSearchEngineDataTypeControllerTest, StopBeforeLoaded) {
+  EXPECT_CALL(model_load_callback_, Run(_, _));
+  EXPECT_FALSE(syncable_service_.syncing());
+  search_engine_dtc_->LoadModels(
+      base::Bind(&ModelLoadCallbackMock::Run,
+                 base::Unretained(&model_load_callback_)));
+  EXPECT_TRUE(search_engine_dtc_->GetSubscriptionForTesting());
+  EXPECT_EQ(DataTypeController::MODEL_STARTING, search_engine_dtc_->state());
+  EXPECT_FALSE(syncable_service_.syncing());
+  search_engine_dtc_->Stop();
+  EXPECT_EQ(NULL, search_engine_dtc_->GetSubscriptionForTesting());
+  EXPECT_EQ(DataTypeController::NOT_RUNNING, search_engine_dtc_->state());
+  EXPECT_FALSE(syncable_service_.syncing());
+}
+
 }  // namespace
 }  // namespace browser_sync
index e0c7108..0214f75 100644 (file)
@@ -32,6 +32,7 @@
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h"
 #include "chrome/browser/net/chrome_cookie_notification_details.h"
+#include "chrome/browser/prefs/chrome_pref_service_factory.h"
 #include "chrome/browser/prefs/pref_service_syncable.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/services/gcm/gcm_profile_service.h"
@@ -69,6 +70,7 @@
 #include "components/signin/core/browser/about_signin_internals.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_manager.h"
+#include "components/signin/core/browser/signin_metrics.h"
 #include "components/sync_driver/change_processor.h"
 #include "components/sync_driver/data_type_controller.h"
 #include "components/sync_driver/pref_names.h"
@@ -309,19 +311,19 @@ void ProfileSyncService::Initialize() {
   startup_controller_.Reset(GetRegisteredDataTypes());
   startup_controller_.TryStart();
 
-  backup_rollback_controller_.Start(backup_start_delay_);
 
+  if (browser_sync::BackupRollbackController::IsBackupEnabled()) {
+    backup_rollback_controller_.Start(backup_start_delay_);
+  } else {
 #if defined(ENABLE_PRE_SYNC_BACKUP)
-  if (CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kSyncDisableBackup)) {
     profile_->GetIOTaskRunner()->PostDelayedTask(
         FROM_HERE,
         base::Bind(base::IgnoreResult(base::DeleteFile),
                    profile_->GetPath().Append(kSyncBackupDataFolderName),
                    true),
         backup_start_delay_);
-  }
 #endif
+  }
 }
 
 void ProfileSyncService::TrySyncDatatypePrefRecovery() {
@@ -520,11 +522,20 @@ bool ProfileSyncService::ShouldDeleteSyncFolder() {
   if (backend_mode_ == SYNC)
     return !HasSyncSetupCompleted();
 
-  // Start fresh if it's the first time backup after user stopped syncing.
-  // This is needed because backup DB may contain items deleted by user during
-  // sync period and can cause back-from-dead issues.
-  if (backend_mode_ == BACKUP && !sync_prefs_.GetFirstSyncTime().is_null())
-    return true;
+  if (backend_mode_ == BACKUP) {
+    base::Time reset_time = chrome_prefs::GetResetTime(profile_);
+
+    // Start fresh if:
+    // * It's the first time backup after user stopped syncing because backup
+    //   DB may contain items deleted by user during sync period and can cause
+    //   back-from-dead issues if user didn't choose rollback.
+    // * Settings are reset during startup because of tampering to avoid
+    //   restoring settings from backup.
+    if (!sync_prefs_.GetFirstSyncTime().is_null() ||
+        (!reset_time.is_null() && profile_->GetStartTime() <= reset_time)) {
+      return true;
+    }
+  }
 
   return false;
 }
@@ -1416,8 +1427,10 @@ void ProfileSyncService::OnActionableError(const SyncProtocolError& error) {
 #if !defined(OS_CHROMEOS)
       // On desktop Chrome, sign out the user after a dashboard clear.
       // Skip sign out on ChromeOS/Android.
-      if (!startup_controller_.auto_start_enabled())
-        SigninManagerFactory::GetForProfile(profile_)->SignOut();
+      if (!startup_controller_.auto_start_enabled()) {
+        SigninManagerFactory::GetForProfile(profile_)->SignOut(
+            signin_metrics::SERVER_FORCED_DISABLE);
+      }
 #endif
       break;
     case syncer::ROLLBACK_DONE:
@@ -2575,3 +2588,10 @@ GURL ProfileSyncService::GetSyncServiceURL(
   }
   return result;
 }
+
+void ProfileSyncService::StartStopBackupForTesting() {
+  if (backend_mode_ == BACKUP)
+    ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD);
+  else
+    backup_rollback_controller_.Start(base::TimeDelta());
+}
index 0325d0d..417582a 100644 (file)
@@ -780,6 +780,8 @@ class ProfileSyncService : public ProfileSyncServiceBase,
   // Return the base URL of the Sync Server.
   static GURL GetSyncServiceURL(const base::CommandLine& command_line);
 
+  void StartStopBackupForTesting();
+
  protected:
   // Helper to configure the priority data types.
   void ConfigurePriorityDataTypes();
index 8b5fa2a..c9224e8 100644 (file)
@@ -7,6 +7,7 @@
 #include "base/compiler_specific.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/invalidation/fake_invalidation_service.h"
@@ -207,7 +208,8 @@ class ProfileSyncServiceTest : public ::testing::Test {
 #if defined(OS_WIN) || defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
   void CreateServiceWithoutSignIn() {
     CreateService(browser_sync::MANUAL_START);
-    SigninManagerFactory::GetForProfile(profile())->SignOut();
+    SigninManagerFactory::GetForProfile(profile())->SignOut(
+        signin_metrics::SIGNOUT_TEST);
     service()->SetBackupStartDelayForTest(
         base::TimeDelta::FromMilliseconds(100));
   }
@@ -429,7 +431,8 @@ TEST_F(ProfileSyncServiceTest, EnableSyncAndSignOutDesktop) {
       sync_driver::prefs::kSyncSuppressStart));
   EXPECT_EQ(ProfileSyncService::SYNC, service()->backend_mode());
 
-  SigninManagerFactory::GetForProfile(profile())->SignOut();
+  SigninManagerFactory::GetForProfile(profile())->SignOut(
+      signin_metrics::SIGNOUT_TEST);
   EXPECT_TRUE(service()->sync_initialized());
   EXPECT_EQ(ProfileSyncService::BACKUP, service()->backend_mode());
 }
@@ -445,7 +448,8 @@ TEST_F(ProfileSyncServiceTest, EnableSyncAndSignOut) {
   EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(
       sync_driver::prefs::kSyncSuppressStart));
 
-  SigninManagerFactory::GetForProfile(profile())->SignOut();
+  SigninManagerFactory::GetForProfile(profile())->SignOut(
+      signin_metrics::SIGNOUT_TEST);
   EXPECT_FALSE(service()->sync_initialized());
 }
 #endif  // !defined(OS_CHROMEOS)
@@ -488,10 +492,6 @@ TEST_F(ProfileSyncServiceTest, GetSyncTokenStatus) {
 }
 
 #if defined(ENABLE_PRE_SYNC_BACKUP)
-void QuitLoop() {
-  base::MessageLoop::current()->Quit();
-}
-
 TEST_F(ProfileSyncServiceTest, StartBackup) {
   CreateServiceWithoutSignIn();
   ExpectDataTypeManagerCreation(1);
@@ -499,10 +499,11 @@ TEST_F(ProfileSyncServiceTest, StartBackup) {
   ExpectSyncBackendHostCreationCollectDeleteDir(1, &delete_dir_param);
   Initialize();
   EXPECT_EQ(ProfileSyncService::IDLE, service()->backend_mode());
+  base::RunLoop run_loop;
   base::MessageLoop::current()->PostDelayedTask(
-      FROM_HERE,  base::Bind(&QuitLoop),
+      FROM_HERE, run_loop.QuitClosure(),
       base::TimeDelta::FromMilliseconds(100));
-  base::MessageLoop::current()->Run();
+  run_loop.Run();
   EXPECT_EQ(ProfileSyncService::BACKUP, service()->backend_mode());
 
   EXPECT_EQ(1u, delete_dir_param.size());
@@ -517,7 +518,6 @@ TEST_F(ProfileSyncServiceTest, BackupAfterSyncDisabled) {
   ExpectSyncBackendHostCreationCollectDeleteDir(2, &delete_dir_param);
   IssueTestTokens();
   Initialize();
-  base::MessageLoop::current()->PostTask(FROM_HERE,  base::Bind(&QuitLoop));
   EXPECT_TRUE(service()->sync_initialized());
   EXPECT_EQ(ProfileSyncService::SYNC, service()->backend_mode());
 
@@ -552,7 +552,6 @@ TEST_F(ProfileSyncServiceTest, RollbackThenBackup) {
   ExpectSyncBackendHostCreationCollectDeleteDir(3, &delete_dir_param);
   IssueTestTokens();
   Initialize();
-  base::MessageLoop::current()->PostTask(FROM_HERE,  base::Bind(&QuitLoop));
   EXPECT_TRUE(service()->sync_initialized());
   EXPECT_EQ(ProfileSyncService::SYNC, service()->backend_mode());
 
@@ -583,6 +582,32 @@ TEST_F(ProfileSyncServiceTest, RollbackThenBackup) {
   EXPECT_FALSE(delete_dir_param[1]);
   EXPECT_TRUE(delete_dir_param[2]);
 }
+
+TEST_F(ProfileSyncServiceTest, StartNewBackupDbOnSettingsReset) {
+  CreateServiceWithoutSignIn();
+  ExpectDataTypeManagerCreation(1);
+  std::vector<bool> delete_dir_param;
+  ExpectSyncBackendHostCreationCollectDeleteDir(1, &delete_dir_param);
+  Initialize();
+  EXPECT_EQ(ProfileSyncService::IDLE, service()->backend_mode());
+
+  // Set reset time to pretend settings reset happened.
+  profile()->GetPrefs()->SetString(
+      prefs::kPreferenceResetTime,
+      base::Int64ToString(base::Time::Now().ToInternalValue()));
+
+  base::RunLoop run_loop;
+  base::MessageLoop::current()->PostDelayedTask(
+      FROM_HERE, run_loop.QuitClosure(),
+      base::TimeDelta::FromMilliseconds(100));
+  run_loop.Run();
+
+  EXPECT_EQ(ProfileSyncService::BACKUP, service()->backend_mode());
+
+  EXPECT_EQ(1u, delete_dir_param.size());
+  EXPECT_TRUE(delete_dir_param[0]);
+}
+
 #endif
 
 TEST_F(ProfileSyncServiceTest, GetSyncServiceURL) {
index 5dec3a1..bf74892 100644 (file)
@@ -4,12 +4,15 @@
 
 #include "base/command_line.h"
 #include "base/message_loop/message_loop.h"
+#include "base/prefs/pref_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/profile_sync_service.h"
 #include "chrome/browser/sync/test/integration/bookmarks_helper.h"
+#include "chrome/browser/sync/test/integration/preferences_helper.h"
 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/pref_names.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "sync/test/fake_server/fake_server_verifier.h"
 
@@ -21,15 +24,25 @@ using bookmarks_helper::Move;
 using bookmarks_helper::Remove;
 using sync_integration_test_util::AwaitCommitActivityCompletion;
 
+namespace {
+const char kUrl1[] = "http://www.google.com";
+const char kUrl2[] = "http://map.google.com";
+const char kUrl3[] = "http://plus.google.com";
+}  // anonymous namespace
+
 class SingleClientBackupRollbackTest : public SyncTest {
  public:
   SingleClientBackupRollbackTest() : SyncTest(SINGLE_CLIENT) {}
   virtual ~SingleClientBackupRollbackTest() {}
 
-  virtual void SetUp() OVERRIDE {
+  void DisableBackup() {
+    CommandLine::ForCurrentProcess()->AppendSwitch(
+          switches::kSyncDisableBackup);
+  }
+
+  void EnableRollback() {
     CommandLine::ForCurrentProcess()->AppendSwitch(
           switches::kSyncEnableRollback);
-    SyncTest::SetUp();
   }
 
  private:
@@ -41,9 +54,10 @@ class BackupModeChecker {
   explicit BackupModeChecker(ProfileSyncService* service,
                              base::TimeDelta timeout)
       : pss_(service),
-        expiration_(base::TimeTicks::Now() + timeout) {}
+        timeout_(timeout) {}
 
   bool Wait() {
+    expiration_ = base::TimeTicks::Now() + timeout_;
     base::MessageLoop::current()->PostDelayedTask(
         FROM_HERE,
         base::Bind(&BackupModeChecker::PeriodicCheck, base::Unretained(this)),
@@ -70,6 +84,7 @@ class BackupModeChecker {
   }
 
   ProfileSyncService* pss_;
+  base::TimeDelta timeout_;
   base::TimeTicks expiration_;
 };
 
@@ -80,6 +95,7 @@ class BackupModeChecker {
 #endif
 IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
                        MAYBE_TestBackupRollback) {
+  EnableRollback();
   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
 
   // Starting state:
@@ -131,3 +147,126 @@ IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
   const BookmarkNode* url2 = tier1_b->GetChild(0);
   ASSERT_EQ(GURL("http://www.nhl.com"), url2->url());
 }
+
+#if defined(ENABLE_PRE_SYNC_BACKUP)
+#define MAYBE_TestPrefBackupRollback TestPrefBackupRollback
+#else
+#define MAYBE_TestPrefBackupRollback DISABLED_TestPrefBackupRollback
+#endif
+// Verify local preferences are not affected by preferences in backup DB under
+// backup mode.
+IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
+                       MAYBE_TestPrefBackupRollback) {
+  EnableRollback();
+
+  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
+
+  preferences_helper::ChangeStringPref(0, prefs::kHomePage, kUrl1);
+
+  BackupModeChecker checker(GetSyncService(0),
+                            base::TimeDelta::FromSeconds(15));
+  ASSERT_TRUE(checker.Wait());
+
+  // Shut down backup, then change preference.
+  GetSyncService(0)->StartStopBackupForTesting();
+  preferences_helper::ChangeStringPref(0, prefs::kHomePage, kUrl2);
+
+  // Restart backup. Preference shouldn't change after backup starts.
+  GetSyncService(0)->StartStopBackupForTesting();
+  ASSERT_TRUE(checker.Wait());
+  ASSERT_EQ(kUrl2,
+            preferences_helper::GetPrefs(0)->GetString(prefs::kHomePage));
+
+  // Start sync and change preference.
+  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
+  preferences_helper::ChangeStringPref(0, prefs::kHomePage, kUrl3);
+  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
+  ASSERT_TRUE(ModelMatchesVerifier(0));
+
+  // Let server return rollback command on next sync request.
+  GetFakeServer()->TriggerError(sync_pb::SyncEnums::USER_ROLLBACK);
+
+  // Make another change to trigger downloading of rollback command.
+  preferences_helper::ChangeStringPref(0, prefs::kHomePage, "");
+
+  // Wait for sync to switch to backup mode after finishing rollback.
+  ASSERT_TRUE(checker.Wait());
+
+  // Verify preference is restored.
+  ASSERT_EQ(kUrl2,
+            preferences_helper::GetPrefs(0)->GetString(prefs::kHomePage));
+}
+
+#if defined(ENABLE_PRE_SYNC_BACKUP)
+#define MAYBE_RollbackNoBackup RollbackNoBackup
+#else
+#define MAYBE_RollbackNoBackup DISABLED_RollbackNoBackup
+#endif
+IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
+                       MAYBE_RollbackNoBackup) {
+  EnableRollback();
+
+  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
+
+  // Setup sync, wait for its completion, and make sure changes were synced.
+  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
+
+  // Starting state:
+  // other_node
+  //    -> http://mail.google.com  "url0"
+  //    -> http://www.nhl.com "url1"
+  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 0, "url0",
+                     GURL("http://mail.google.com")));
+  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 1, "url1",
+                     GURL("http://www.nhl.com")));
+
+  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
+  ASSERT_TRUE(ModelMatchesVerifier(0));
+
+  // Let server to return rollback command on next sync request.
+  GetFakeServer()->TriggerError(sync_pb::SyncEnums::USER_ROLLBACK);
+
+  // Make another change to trigger downloading of rollback command.
+  Remove(0, GetOtherNode(0), 0);
+
+  // Wait for sync to switch to backup mode after finishing rollback.
+  BackupModeChecker checker(GetSyncService(0),
+                            base::TimeDelta::FromSeconds(15));
+  ASSERT_TRUE(checker.Wait());
+
+  // Without backup DB, bookmarks added during sync shouldn't be removed.
+  ASSERT_EQ(1, GetOtherNode(0)->child_count());
+  ASSERT_EQ(GURL("http://www.nhl.com"),
+            GetOtherNode(0)->GetChild(0)->url());
+}
+
+#if defined(ENABLE_PRE_SYNC_BACKUP)
+#define MAYBE_DontChangeBookmarkOrdering DontChangeBookmarkOrdering
+#else
+#define MAYBE_DontChangeBookmarkOrdering DISABLED_DontChangeBookmarkOrdering
+#endif
+IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
+                       MAYBE_DontChangeBookmarkOrdering) {
+  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
+
+  const BookmarkNode* sub_folder = AddFolder(0, GetOtherNode(0), 0, "test");
+  ASSERT_TRUE(AddURL(0, sub_folder, 0, "", GURL(kUrl1)));
+  ASSERT_TRUE(AddURL(0, sub_folder, 1, "", GURL(kUrl2)));
+  ASSERT_TRUE(AddURL(0, sub_folder, 2, "", GURL(kUrl3)));
+
+  BackupModeChecker checker(GetSyncService(0),
+                            base::TimeDelta::FromSeconds(15));
+  ASSERT_TRUE(checker.Wait());
+
+  // Restart backup.
+  GetSyncService(0)->StartStopBackupForTesting();
+  GetSyncService(0)->StartStopBackupForTesting();
+  ASSERT_TRUE(checker.Wait());
+
+  // Verify bookmarks are unchanged.
+  ASSERT_EQ(3, sub_folder->child_count());
+  ASSERT_EQ(GURL(kUrl1), sub_folder->GetChild(0)->url());
+  ASSERT_EQ(GURL(kUrl2), sub_folder->GetChild(1)->url());
+  ASSERT_EQ(GURL(kUrl3), sub_folder->GetChild(2)->url());
+}
+
index 77477b9..21c28ce 100644 (file)
@@ -123,7 +123,6 @@ class AppListControllerSearchResultsBrowserTest
 // Test showing search results, and uninstalling one of them while displayed.
 IN_PROC_BROWSER_TEST_F(AppListControllerSearchResultsBrowserTest,
                        UninstallSearchResult) {
-  test::SigninProfile(browser()->profile());
   base::FilePath test_extension_path;
   ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_extension_path));
   test_extension_path = test_extension_path.AppendASCII("extensions")
index 03e5a9f..d0b35e2 100644 (file)
@@ -91,8 +91,6 @@ IN_PROC_BROWSER_TEST_F(AppListServiceInteractiveTest, MAYBE_ShowAndDismiss) {
 IN_PROC_BROWSER_TEST_F(AppListServiceInteractiveTest,
                        MAYBE_SwitchAppListProfiles) {
   InitSecondProfile();
-  test::SigninProfile(browser()->profile());
-  test::SigninProfile(profile2_);
 
   AppListService* service = test::GetAppListService();
   ASSERT_TRUE(service);
@@ -127,8 +125,6 @@ IN_PROC_BROWSER_TEST_F(AppListServiceInteractiveTest,
 IN_PROC_BROWSER_TEST_F(AppListServiceInteractiveTest,
                        MAYBE_SwitchAppListProfilesDuringSearch) {
   InitSecondProfile();
-  test::SigninProfile(browser()->profile());
-  test::SigninProfile(profile2_);
 
   AppListService* service = test::GetAppListService();
   ASSERT_TRUE(service);
index 19e9d94..48a443a 100644 (file)
@@ -74,7 +74,6 @@ class AppListControllerAppInfoDialogBrowserTest : public ExtensionBrowserTest {
 IN_PROC_BROWSER_TEST_F(AppListControllerAppInfoDialogBrowserTest,
                        DISABLED_DoShowAppInfoFlow) {
   // Install an extension to open the dialog for.
-  test::SigninProfile(browser()->profile());
   base::FilePath test_extension_path;
   ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_extension_path));
   test_extension_path = test_extension_path.AppendASCII("extensions")
index d0d5961..fd5ca88 100644 (file)
@@ -14,6 +14,7 @@
 #include "chrome/browser/ui/app_list/extension_app_model_builder.h"
 #include "chrome/browser/ui/host_desktop.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/extensions/extension_constants.h"
 #include "content/public/browser/notification_source.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_system.h"
 #include "ui/app_list/app_list_switches.h"
 #include "ui/base/l10n/l10n_util.h"
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/file_manager/app_id.h"
+#include "chrome/browser/chromeos/genius_app/app_id.h"
+#endif
+
 using syncer::SyncChange;
 
 namespace app_list {
@@ -98,6 +104,17 @@ bool AppIsDefault(ExtensionService* service, const std::string& id) {
                         ->WasInstalledByDefault(id);
 }
 
+bool IsUnRemovableDefaultApp(const std::string& id) {
+  if (id == extension_misc::kChromeAppId ||
+      id == extension_misc::kWebStoreAppId)
+    return true;
+#if defined(OS_CHROMEOS)
+  if (id == file_manager::kFileManagerAppId || id == genius_app::kGeniusAppId)
+    return true;
+#endif
+  return false;
+}
+
 void UninstallExtension(ExtensionService* service, const std::string& id) {
   if (service && service->GetInstalledExtension(id))
     service->UninstallExtension(id, false, NULL);
@@ -192,7 +209,8 @@ AppListSyncableService::AppListSyncableService(
     extensions::ExtensionSystem* extension_system)
     : profile_(profile),
       extension_system_(extension_system),
-      model_(new AppListModel) {
+      model_(new AppListModel),
+      first_app_list_sync_(true) {
   if (!extension_system) {
     LOG(ERROR) << "AppListSyncableService created with no ExtensionSystem";
     return;
@@ -287,13 +305,14 @@ void AppListSyncableService::AddItem(scoped_ptr<AppListItem> app_item) {
   if (app_list::switches::IsFolderUIEnabled()) {
     if (AppIsOem(app_item->id())) {
       folder_id = FindOrCreateOemFolder();
-      VLOG(2) << this << ": AddItem to OEM folder: " << sync_item->ToString();
+      VLOG_IF(2, !folder_id.empty())
+          << this << ": AddItem to OEM folder: " << sync_item->ToString();
     } else {
       folder_id = sync_item->parent_id;
     }
   }
   VLOG(2) << this << ": AddItem: " << sync_item->ToString()
-          << "Folder: '" << folder_id << "'";
+          << " Folder: '" << folder_id << "'";
   model_->AddItemToFolder(app_item.Pass(), folder_id);
 }
 
@@ -336,6 +355,11 @@ AppListSyncableService::CreateSyncItemFromAppItem(AppListItem* app_item) {
 }
 
 void AppListSyncableService::AddOrUpdateFromSyncItem(AppListItem* app_item) {
+  // Do not create a sync item for the OEM folder here, do that in
+  // ResolveFolderPositions once the position has been resolved.
+  if (app_item->id() == kOemFolderId)
+    return;
+
   SyncItem* sync_item = FindSyncItem(app_item->id());
   if (sync_item) {
     UpdateAppItemFromSyncItem(sync_item, app_item);
@@ -441,10 +465,11 @@ void AppListSyncableService::RemoveSyncItem(const std::string& id) {
   DeleteSyncItem(sync_item);
 }
 
-void AppListSyncableService::ResolveFolderPositions(bool move_oem_to_end) {
+void AppListSyncableService::ResolveFolderPositions() {
   if (!app_list::switches::IsFolderUIEnabled())
     return;
 
+  VLOG(1) << "ResolveFolderPositions.";
   for (SyncItemMap::iterator iter = sync_items_.begin();
        iter != sync_items_.end(); ++iter) {
     SyncItem* sync_item = iter->second;
@@ -453,12 +478,17 @@ void AppListSyncableService::ResolveFolderPositions(bool move_oem_to_end) {
     AppListItem* app_item = model_->FindItem(sync_item->item_id);
     if (!app_item)
       continue;
-    if (move_oem_to_end && app_item->id() == kOemFolderId) {
-      // Move the OEM folder to the end.
-      model_->SetItemPosition(app_item, syncer::StringOrdinal());
-    }
     UpdateAppItemFromSyncItem(sync_item, app_item);
   }
+
+  // Move the OEM folder if one exists and we have not synced its position.
+  AppListFolderItem* oem_folder = model_->FindFolderItem(kOemFolderId);
+  if (oem_folder && !FindSyncItem(kOemFolderId)) {
+    model_->SetItemPosition(oem_folder, GetOemFolderPos());
+    VLOG(1) << "Creating new OEM folder sync item: "
+            << oem_folder->position().ToDebugString();
+    CreateSyncItemFromAppItem(oem_folder);
+  }
 }
 
 void AppListSyncableService::PruneEmptySyncFolders() {
@@ -510,21 +540,26 @@ syncer::SyncMergeResult AppListSyncableService::MergeDataAndStartSyncing(
 
   // Create SyncItem entries for initial_sync_data.
   size_t new_items = 0, updated_items = 0;
-  bool oem_folder_is_synced = false;
   for (syncer::SyncDataList::const_iterator iter = initial_sync_data.begin();
        iter != initial_sync_data.end(); ++iter) {
     const syncer::SyncData& data = *iter;
     const std::string& item_id = data.GetSpecifics().app_list().item_id();
+    const sync_pb::AppListSpecifics& specifics = data.GetSpecifics().app_list();
     DVLOG(2) << this << "  Initial Sync Item: " << item_id
-             << " Type: " << data.GetSpecifics().app_list().item_type();
+             << " Type: " << specifics.item_type();
     DCHECK_EQ(syncer::APP_LIST, data.GetDataType());
-    if (ProcessSyncItemSpecifics(data.GetSpecifics().app_list()))
+    if (ProcessSyncItemSpecifics(specifics))
       ++new_items;
     else
       ++updated_items;
+    if (specifics.item_type() != sync_pb::AppListSpecifics::TYPE_FOLDER &&
+        !IsUnRemovableDefaultApp(item_id) &&
+        !AppIsOem(item_id) &&
+        !AppIsDefault(extension_system_->extension_service(), item_id)) {
+      VLOG(2) << "Syncing non-default item: " << item_id;
+      first_app_list_sync_ = false;
+    }
     unsynced_items.erase(item_id);
-    if (item_id == kOemFolderId)
-      oem_folder_is_synced = true;
   }
 
   result.set_num_items_after_association(sync_items_.size());
@@ -537,6 +572,10 @@ syncer::SyncMergeResult AppListSyncableService::MergeDataAndStartSyncing(
   for (std::set<std::string>::iterator iter = unsynced_items.begin();
        iter != unsynced_items.end(); ++iter) {
     SyncItem* sync_item = FindSyncItem(*iter);
+    // Sync can cause an item to change folders, causing an unsynced folder
+    // item to be removed.
+    if (!sync_item)
+      continue;
     VLOG(2) << this << " -> SYNC ADD: " << sync_item->ToString();
     change_list.push_back(SyncChange(FROM_HERE,  SyncChange::ACTION_ADD,
                                      GetSyncDataFromSyncItem(sync_item)));
@@ -545,9 +584,7 @@ syncer::SyncMergeResult AppListSyncableService::MergeDataAndStartSyncing(
 
   // Adding items may have created folders without setting their positions
   // since we haven't started observing the item list yet. Resolve those.
-  // Also ensure the OEM folder is at the end if its position hasn't been set.
-  bool move_oem_to_end = !oem_folder_is_synced;
-  ResolveFolderPositions(move_oem_to_end);
+  ResolveFolderPositions();
 
   // Start observing app list model changes.
   model_observer_.reset(new ModelObserver(this));
@@ -701,7 +738,7 @@ void AppListSyncableService::ProcessExistingSyncItem(SyncItem* sync_item) {
   if (app_list::switches::IsFolderUIEnabled() &&
       app_item->folder_id() != sync_item->parent_id &&
       !AppIsOem(app_item->id())) {
-    DVLOG(2) << " Moving Item To Folder: " << sync_item->parent_id;
+    VLOG(2) << " Moving Item To Folder: " << sync_item->parent_id;
     model_->MoveItemToFolder(app_item, sync_item->parent_id);
   }
   UpdateAppItemFromSyncItem(sync_item, app_item);
@@ -710,7 +747,7 @@ void AppListSyncableService::ProcessExistingSyncItem(SyncItem* sync_item) {
 void AppListSyncableService::UpdateAppItemFromSyncItem(
     const AppListSyncableService::SyncItem* sync_item,
     AppListItem* app_item) {
-  VLOG(2) << this << "UpdateAppItemFromSyncItem: " << sync_item->ToString();
+  VLOG(2) << this << " UpdateAppItemFromSyncItem: " << sync_item->ToString();
   if (!app_item->position().Equals(sync_item->item_ordinal))
     model_->SetItemPosition(app_item, sync_item->item_ordinal);
   // Only update the item name if it is a Folder or the name is empty.
@@ -798,11 +835,62 @@ std::string AppListSyncableService::FindOrCreateOemFolder() {
         kOemFolderId, AppListFolderItem::FOLDER_TYPE_OEM));
     oem_folder = static_cast<AppListFolderItem*>(
         model_->AddItem(new_folder.PassAs<app_list::AppListItem>()));
+    SyncItem* oem_sync_item = FindSyncItem(kOemFolderId);
+    if (oem_sync_item) {
+      VLOG(1) << "Creating OEM folder from existing sync item: "
+               << oem_sync_item->item_ordinal.ToDebugString();
+      model_->SetItemPosition(oem_folder, oem_sync_item->item_ordinal);
+    } else {
+      model_->SetItemPosition(oem_folder, GetOemFolderPos());
+      // Do not create a sync item for the OEM folder here, do it in
+      // ResolveFolderPositions() when the item position is finalized.
+    }
   }
   model_->SetItemName(oem_folder, oem_folder_name_);
   return oem_folder->id();
 }
 
+syncer::StringOrdinal AppListSyncableService::GetOemFolderPos() {
+  VLOG(1) << "GetOemFolderPos: " << first_app_list_sync_;
+  if (!first_app_list_sync_) {
+    VLOG(1) << "Sync items exist, placing OEM folder at end.";
+    syncer::StringOrdinal last;
+    for (SyncItemMap::iterator iter = sync_items_.begin();
+         iter != sync_items_.end(); ++iter) {
+      SyncItem* sync_item = iter->second;
+      if (!last.IsValid() || sync_item->item_ordinal.GreaterThan(last))
+        last = sync_item->item_ordinal;
+    }
+    return last.CreateAfter();
+  }
+
+  // Place the OEM folder just after the web store, which should always be
+  // followed by a pre-installed app (e.g. Search), so the poosition should be
+  // stable. TODO(stevenjb): consider explicitly setting the OEM folder location
+  // along with the name in ServicesCustomizationDocument::SetOemFolderName().
+  AppListItemList* item_list = model_->top_level_item_list();
+  if (item_list->item_count() == 0)
+    return syncer::StringOrdinal();
+
+  size_t oem_index = 0;
+  for (; oem_index < item_list->item_count() - 1; ++oem_index) {
+    AppListItem* cur_item = item_list->item_at(oem_index);
+    if (cur_item->id() == extension_misc::kWebStoreAppId)
+      break;
+  }
+  syncer::StringOrdinal oem_ordinal;
+  AppListItem* prev = item_list->item_at(oem_index);
+  if (oem_index + 1 < item_list->item_count()) {
+    AppListItem* next = item_list->item_at(oem_index + 1);
+    oem_ordinal = prev->position().CreateBetween(next->position());
+  } else {
+    oem_ordinal = prev->position().CreateAfter();
+  }
+  VLOG(1) << "Placing OEM Folder at: " << oem_index
+          << " position: " << oem_ordinal.ToDebugString();
+  return oem_ordinal;
+}
+
 bool AppListSyncableService::AppIsOem(const std::string& id) {
   if (!extension_system_->extension_service())
     return false;
index 7ea8e1f..d609214 100644 (file)
@@ -142,9 +142,8 @@ class AppListSyncableService : public syncer::SyncableService,
   // Removes sync item matching |id|.
   void RemoveSyncItem(const std::string& id);
 
-  // Updates folder items that may get created during initial sync. If
-  // oem_at_end is true then move any OEM folder to the end of the list.
-  void ResolveFolderPositions(bool move_oem_to_end);
+  // Updates folder items that may get created during initial sync.
+  void ResolveFolderPositions();
 
   // Removes any empty SyncItem folders and deletes them from sync. Called
   // after a sync item is removed (which may result in an empty folder).
@@ -184,6 +183,10 @@ class AppListSyncableService : public syncer::SyncableService,
   // folder id.
   std::string FindOrCreateOemFolder();
 
+  // Gets the location for the OEM folder. Called when the folder is first
+  // created.
+  syncer::StringOrdinal GetOemFolderPos();
+
   // Returns true if an extension matching |id| exists and was installed by
   // an OEM (extension->was_installed_by_oem() is true).
   bool AppIsOem(const std::string& id);
@@ -198,6 +201,7 @@ class AppListSyncableService : public syncer::SyncableService,
   scoped_ptr<syncer::SyncErrorFactory> sync_error_handler_;
   SyncItemMap sync_items_;
   syncer::SyncableService::StartSyncFlare flare_;
+  bool first_app_list_sync_;
   std::string oem_folder_name_;
 
   // Provides integration with Drive apps.
index a67672b..960f117 100644 (file)
@@ -30,6 +30,7 @@
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/url_constants.h"
+#include "components/signin/core/browser/signin_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/page_navigator.h"
 #include "content/public/browser/user_metrics.h"
@@ -103,10 +104,30 @@ void PopulateUsers(const ProfileInfoCache& profile_info,
 
 AppListViewDelegate::AppListViewDelegate(Profile* profile,
                                          AppListControllerDelegate* controller)
-    : controller_(controller), profile_(profile), model_(NULL) {
+    : controller_(controller),
+      profile_(profile),
+      model_(NULL),
+      scoped_observer_(this) {
   CHECK(controller_);
+  // The SigninManagerFactor and the SigninManagers are observed to keep the
+  // profile switcher menu up to date, with the correct list of profiles and the
+  // correct email address (or none for signed out users) for each.
+  SigninManagerFactory::GetInstance()->AddObserver(this);
 
+  // Start observing all already-created SigninManagers.
   ProfileManager* profile_manager = g_browser_process->profile_manager();
+  std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles();
+  for (std::vector<Profile*>::iterator i = profiles.begin();
+       i != profiles.end();
+       ++i) {
+    SigninManagerBase* manager =
+        SigninManagerFactory::GetForProfileIfExists(*i);
+    if (manager) {
+      DCHECK(!scoped_observer_.IsObserving(manager));
+      scoped_observer_.Add(manager);
+    }
+  }
+
   profile_manager->GetProfileInfoCache().AddObserver(this);
 
   app_list::StartPageService* service =
@@ -133,6 +154,10 @@ AppListViewDelegate::~AppListViewDelegate() {
   g_browser_process->
       profile_manager()->GetProfileInfoCache().RemoveObserver(this);
 
+  SigninManagerFactory* factory = SigninManagerFactory::GetInstance();
+  if (factory)
+    factory->RemoveObserver(this);
+
   // Ensure search controller is released prior to speech_ui_.
   search_controller_.reset();
 }
@@ -155,6 +180,29 @@ void AppListViewDelegate::OnHotwordRecognized() {
   ToggleSpeechRecognition();
 }
 
+void AppListViewDelegate::SigninManagerCreated(SigninManagerBase* manager) {
+  scoped_observer_.Add(manager);
+}
+
+void AppListViewDelegate::SigninManagerShutdown(SigninManagerBase* manager) {
+  if (scoped_observer_.IsObserving(manager))
+    scoped_observer_.Remove(manager);
+}
+
+void AppListViewDelegate::GoogleSigninFailed(
+    const GoogleServiceAuthError& error) {
+  OnProfileChanged();
+}
+
+void AppListViewDelegate::GoogleSigninSucceeded(const std::string& username,
+                                                const std::string& password) {
+  OnProfileChanged();
+}
+
+void AppListViewDelegate::GoogleSignedOut(const std::string& username) {
+  OnProfileChanged();
+}
+
 void AppListViewDelegate::OnProfileChanged() {
   model_ = app_list::AppListSyncableServiceFactory::GetForProfile(
       profile_)->model();
index 33fb0d5..b6df54d 100644 (file)
 #include "base/compiler_specific.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/observer_list.h"
+#include "base/scoped_observer.h"
 #include "chrome/browser/profiles/profile_info_cache_observer.h"
 #include "chrome/browser/search/hotword_client.h"
+#include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/browser/ui/app_list/start_page_observer.h"
+#include "components/signin/core/browser/signin_manager_base.h"
 #include "ui/app_list/app_list_view_delegate.h"
 
 class AppListControllerDelegate;
@@ -40,7 +43,9 @@ class AppSyncUIStateWatcher;
 class AppListViewDelegate : public app_list::AppListViewDelegate,
                             public app_list::StartPageObserver,
                             public HotwordClient,
-                            public ProfileInfoCacheObserver {
+                            public ProfileInfoCacheObserver,
+                            public SigninManagerBase::Observer,
+                            public SigninManagerFactory::Observer {
  public:
   AppListViewDelegate(Profile* profile,
                       AppListControllerDelegate* controller);
@@ -100,6 +105,16 @@ class AppListViewDelegate : public app_list::AppListViewDelegate,
   virtual void OnHotwordStateChanged(bool started) OVERRIDE;
   virtual void OnHotwordRecognized() OVERRIDE;
 
+  // Overridden from SigninManagerFactory::Observer:
+  virtual void SigninManagerCreated(SigninManagerBase* manager) OVERRIDE;
+  virtual void SigninManagerShutdown(SigninManagerBase* manager) OVERRIDE;
+
+  // Overridden from SigninManagerBase::Observer:
+  virtual void GoogleSigninFailed(const GoogleServiceAuthError& error) OVERRIDE;
+  virtual void GoogleSigninSucceeded(const std::string& username,
+                                     const std::string& password) OVERRIDE;
+  virtual void GoogleSignedOut(const std::string& username) OVERRIDE;
+
   // Overridden from ProfileInfoCacheObserver:
   virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE;
   virtual void OnProfileWasRemoved(const base::FilePath& profile_path,
@@ -130,6 +145,10 @@ class AppListViewDelegate : public app_list::AppListViewDelegate,
 
   ObserverList<app_list::AppListViewDelegateObserver> observers_;
 
+  // Used to track the SigninManagers that this instance is observing so that
+  // this instance can be removed as an observer on its destruction.
+  ScopedObserver<SigninManagerBase, AppListViewDelegate> scoped_observer_;
+
   DISALLOW_COPY_AND_ASSIGN(AppListViewDelegate);
 };
 
index 95157f2..34f6f83 100644 (file)
@@ -4,11 +4,9 @@
 
 #include "chrome/browser/ui/app_list/test/chrome_app_list_test_support.h"
 
-#include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/browser/ui/app_list/app_list_service.h"
 #include "chrome/browser/ui/app_list/app_list_syncable_service.h"
 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
-#include "components/signin/core/browser/signin_manager.h"
 
 namespace test {
 
@@ -22,9 +20,4 @@ AppListService* GetAppListService() {
   return AppListService::Get(chrome::GetActiveDesktop());
 }
 
-void SigninProfile(Profile* profile) {
-  SigninManagerFactory::GetForProfile(profile)->
-      SetAuthenticatedUsername("user@example.com");
-}
-
 }  // namespace test
index f8b4988..fe79605 100644 (file)
@@ -10,7 +10,6 @@ class AppListModel;
 }
 
 class AppListService;
-class Profile;
 
 namespace test {
 
@@ -20,9 +19,6 @@ app_list::AppListModel* GetAppListModel(AppListService* service);
 // Gets the app list service for the desktop type currently being tested.
 AppListService* GetAppListService();
 
-// Simulate a Chrome sign-in for the given |profile|.
-void SigninProfile(Profile* profile);
-
 }  // namespace test
 
 #endif  // CHROME_BROWSER_UI_APP_LIST_TEST_CHROME_APP_LIST_TEST_SUPPORT_H_
index a382c49..126a469 100644 (file)
@@ -15,6 +15,7 @@
 #include "ash/shell_delegate.h"
 #include "ash/shell_window_ids.h"
 #include "ash/system/tray/system_tray_notifier.h"
+#include "ash/wm/maximize_mode/maximize_mode_controller.h"
 #include "ash/wm/window_state.h"
 #include "base/auto_reset.h"
 #include "base/message_loop/message_loop.h"
@@ -692,6 +693,13 @@ void MultiUserWindowManagerChromeOS::SetWindowVisible(
     aura::Window* window,
     bool visible,
     int animation_time_in_ms) {
+  // The MaximizeModeWindowManager will not handle invisible windows since they
+  // are not user activatable. Since invisible windows are not being tracked,
+  // we tell it to maximize / track this window now before it gets shown, to
+  // reduce animation jank from multiple resizes.
+  if (visible)
+    ash::Shell::GetInstance()->maximize_mode_controller()->AddWindow(window);
+
   AnimationSetter animation_setter(
       window,
       GetAdjustedAnimationTimeInMS(animation_time_in_ms));
index f425e0b..4f3ef97 100644 (file)
@@ -8,6 +8,8 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/test/test_session_state_delegate.h"
 #include "ash/test/test_shell_delegate.h"
+#include "ash/wm/maximize_mode/maximize_mode_controller.h"
+#include "ash/wm/maximize_mode/maximize_mode_window_manager.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/wm_event.h"
 #include "base/command_line.h"
@@ -130,6 +132,19 @@ class MultiUserWindowManagerChromeOSTest : public AshTestBase {
         window);
   }
 
+  // Create a maximize mode window manager.
+  ash::MaximizeModeWindowManager* CreateMaximizeModeWindowManager() {
+    EXPECT_FALSE(maximize_mode_window_manager());
+    Shell::GetInstance()->maximize_mode_controller()->
+        EnableMaximizeModeWindowManager(true);
+    return maximize_mode_window_manager();
+  }
+
+  ash::MaximizeModeWindowManager* maximize_mode_window_manager() {
+    return Shell::GetInstance()->maximize_mode_controller()->
+        maximize_mode_window_manager_.get();
+  }
+
  private:
   // These get created for each session.
   std::vector<aura::Window*> window_;
@@ -140,6 +155,9 @@ class MultiUserWindowManagerChromeOSTest : public AshTestBase {
   // The session state delegate.
   ash::test::TestSessionStateDelegate* session_state_delegate_;
 
+  // The maximized window manager (if enabled).
+  scoped_ptr<MaximizeModeWindowManager> maximize_mode_window_manager_;
+
   DISALLOW_COPY_AND_ASSIGN(MultiUserWindowManagerChromeOSTest);
 };
 
@@ -638,6 +656,30 @@ TEST_F(MultiUserWindowManagerChromeOSTest, PreserveInitialVisibility) {
   EXPECT_EQ("H[A,B], H[A,B], S[B,A], H[B,A]", GetStatus());
 }
 
+// Test that in case of an activated maximize mode, windows from other users get
+// maximized after a user switch.
+TEST_F(MultiUserWindowManagerChromeOSTest, MaximizeModeInteraction) {
+  SetUpForThisManyWindows(2);
+
+  multi_user_window_manager()->SetWindowOwner(window(0), "A");
+  multi_user_window_manager()->SetWindowOwner(window(1), "B");
+
+  EXPECT_FALSE(wm::GetWindowState(window(0))->IsMaximized());
+  EXPECT_FALSE(wm::GetWindowState(window(1))->IsMaximized());
+
+  ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
+  ASSERT_TRUE(manager);
+
+  EXPECT_TRUE(wm::GetWindowState(window(0))->IsMaximized());
+  EXPECT_FALSE(wm::GetWindowState(window(1))->IsMaximized());
+
+  // After we start switching to B, the windows of user B should maximize.
+  StartUserTransitionAnimation("B");
+
+  EXPECT_TRUE(wm::GetWindowState(window(0))->IsMaximized());
+  EXPECT_TRUE(wm::GetWindowState(window(1))->IsMaximized());
+}
+
 // Test that a system modal dialog will switch to the desktop of the owning
 // user.
 TEST_F(MultiUserWindowManagerChromeOSTest, SwitchUsersUponModalityChange) {
index abe591c..c5af58f 100644 (file)
@@ -122,8 +122,12 @@ content::WebContents* AddRestoredTab(
     // location calculations to be incorrect even after a new layout with
     // proper view dimensions. TabStripModel::AddWebContents() contains similar
     // logic.
-    apps::ResizeWebContents(web_contents,
-                            browser->window()->GetRestoredBounds().size());
+    gfx::Size size = browser->window()->GetBounds().size();
+    // Fallback to the restore bounds if it's empty as the window is not shown
+    // yet and the bounds may not be available on all platforms.
+    if (size.IsEmpty())
+      size = browser->window()->GetRestoredBounds().size();
+    apps::ResizeWebContents(web_contents, size);
     web_contents->WasHidden();
   }
   SessionService* session_service =
index cea4db8..c896571 100644 (file)
@@ -135,6 +135,7 @@ class NativeAppWindowCocoa : public apps::NativeAppWindow,
   virtual SkColor ActiveFrameColor() const OVERRIDE;
   virtual SkColor InactiveFrameColor() const OVERRIDE;
   virtual gfx::Insets GetFrameInsets() const OVERRIDE;
+  virtual bool CanHaveAlphaEnabled() const OVERRIDE;
 
   // These are used to simulate Mac-style hide/show. Since windows can be hidden
   // and shown using the app.window API, this sets is_hidden_with_app_ to
index 9b45321..e3bdc70 100644 (file)
@@ -799,6 +799,10 @@ gfx::Insets NativeAppWindowCocoa::GetFrameInsets() const {
   return frame_rect.InsetsFrom(content_rect);
 }
 
+bool NativeAppWindowCocoa::CanHaveAlphaEnabled() const {
+  return false;
+}
+
 gfx::NativeView NativeAppWindowCocoa::GetHostView() const {
   NOTIMPLEMENTED();
   return NULL;
index bddbc41..94d0dca 100644 (file)
@@ -214,20 +214,17 @@ class DevtoolsNotificationBridge : public content::NotificationObserver {
         modalDialogManager->IsDialogActive()) {
       return;
     }
-    // We must shutdown host_ immediately, and it will notify RendererProcess
-    // right away. We can't wait to do it in
-    // -[ExtensionPopController windowWillClose:...]
-    if (host_->view())
-      host_->view()->set_container(NULL);
-    host_.reset();
   }
   [super close];
 }
 
-- (void)windowWillClose:(NSNotification*)notification {
+- (void)windowWillClose:(NSNotification *)notification {
   [super windowWillClose:notification];
   if (gPopup == self)
     gPopup = nil;
+  if (host_->view())
+    host_->view()->set_container(NULL);
+  host_.reset();
 }
 
 - (void)windowDidResignKey:(NSNotification*)notification {
@@ -283,11 +280,6 @@ class DevtoolsNotificationBridge : public content::NotificationObserver {
   if (!host)
     return nil;
 
-  // Since we only close without releasing(see bug:351278), we need to shutdown
-  // host_ in -[ExtensionPopupController close] immediately. If not, host_ might
-  // not be released even when new ExtensionPopupController is ready. And
-  // this causes bug:376511.
-  // See above -[ExtensionPopupController close].
   [gPopup close];
 
   // Takes ownership of |host|. Also will autorelease itself when the popup is
@@ -392,13 +384,13 @@ class DevtoolsNotificationBridge : public content::NotificationObserver {
 
 - (void)windowDidResize:(NSNotification*)notification {
   // Let the extension view know, so that it can tell plugins.
-  if (host_ && host_->view())
+  if (host_->view())
     host_->view()->WindowFrameChanged();
 }
 
 - (void)windowDidMove:(NSNotification*)notification {
   // Let the extension view know, so that it can tell plugins.
-  if (host_ && host_->view())
+  if (host_->view())
     host_->view()->WindowFrameChanged();
 }
 
index 4f9fec3..6b14bfe 100644 (file)
@@ -125,24 +125,33 @@ void ContentSettingBlockedImageModel::UpdateFromWebContents(
   int explanation_id = GetIdForContentType(
       kBlockedExplanatoryTextIDs, arraysize(kBlockedExplanatoryTextIDs), type);
 
+  // For plugins, don't show the animated explanation unless the plugin was
+  // blocked despite the user's content settings being set to allow it (e.g.
+  // due to auto-blocking NPAPI plugins).
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents->GetBrowserContext());
+  HostContentSettingsMap* map = profile->GetHostContentSettingsMap();
+  if (type == CONTENT_SETTINGS_TYPE_PLUGINS) {
+    GURL url = web_contents->GetURL();
+    if (map->GetContentSetting(url, url, type, std::string()) !=
+        CONTENT_SETTING_ALLOW)
+      explanation_id = 0;
+  }
+
   // If a content type is blocked by default and was accessed, display the
-  // accessed icon.
+  // content blocked page action.
   TabSpecificContentSettings* content_settings =
       TabSpecificContentSettings::FromWebContents(web_contents);
   if (!content_settings)
     return;
-  Profile* profile =
-      Profile::FromBrowserContext(web_contents->GetBrowserContext());
-  if (!content_settings->IsContentBlocked(get_content_settings_type())) {
-    if (!content_settings->IsContentAllowed(get_content_settings_type()))
+  if (!content_settings->IsContentBlocked(type)) {
+    if (!content_settings->IsContentAllowed(type))
       return;
 
-    // For cookies, only show the accessed bubble if cookies are blocked by
-    // default.
-    if (get_content_settings_type() == CONTENT_SETTINGS_TYPE_COOKIES &&
-        (profile->GetHostContentSettingsMap()->
-            GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_COOKIES, NULL) !=
-                CONTENT_SETTING_BLOCK))
+    // For cookies, only show the cookie blocked page action if cookies are
+    // blocked by default.
+    if (type == CONTENT_SETTINGS_TYPE_COOKIES &&
+        (map->GetDefaultContentSetting(type, NULL) != CONTENT_SETTING_BLOCK))
       return;
 
     static const ContentSettingsTypeIdEntry kAccessedIconIDs[] = {
diff --git a/src/chrome/browser/ui/pdf/adobe_reader_info_win.h b/src/chrome/browser/ui/pdf/adobe_reader_info_win.h
new file mode 100644 (file)
index 0000000..9666d8b
--- /dev/null
@@ -0,0 +1,48 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_PDF_ADOBE_READER_INFO_WIN_H_
+#define CHROME_BROWSER_UI_PDF_ADOBE_READER_INFO_WIN_H_
+
+#include "base/basictypes.h"
+#include "base/callback_forward.h"
+#include "content/public/common/webplugininfo.h"
+
+class Profile;
+
+struct AdobeReaderPluginInfo {
+  bool is_installed;
+  bool is_enabled;    // Only valid in the context of a given Profile.
+  bool is_secure;     // Whether the plugin is up to date.
+  content::WebPluginInfo plugin_info;
+};
+
+typedef base::Callback<void(const AdobeReaderPluginInfo&)>
+    GetAdobeReaderPluginInfoCallback;
+
+// Fetches information about the Adobe Reader plugin asynchronously.
+// If |profile| is NULL, then the plugin's enable status cannot be
+// determined.
+void GetAdobeReaderPluginInfoAsync(
+    Profile* profile,
+    const GetAdobeReaderPluginInfoCallback& callback);
+
+// Fetches information about the Adobe Reader plugin synchronously.
+// Returns true if the plugin info is not stale.
+// If |profile| is NULL, then the plugin's enable status cannot be
+// determined.
+bool GetAdobeReaderPluginInfo(Profile* profile,
+                              AdobeReaderPluginInfo* reader_info);
+
+// Returns true if Adobe Reader or Adobe Acrobat is the default viewer for the
+// .pdf extension.
+bool IsAdobeReaderDefaultPDFViewer();
+
+// If Adobe Reader or Adobe Acrobat is program associated with the .pdf viewer,
+// return true if the executable is up to date.
+// If Reader/Acrobat is not the default .pdf handler, return false.
+// This function does blocking I/O, since it needs to read from the disk.
+bool IsAdobeReaderUpToDate();
+
+#endif  // CHROME_BROWSER_UI_PDF_ADOBE_READER_INFO_WIN_H_
index c4f04a6..ae83110 100644 (file)
@@ -283,7 +283,8 @@ IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_Scroll) {
 // TODO(thestig): http://crbug.com/79837, http://crbug.com/329912
 #define MAYBE_FindAndCopy DISABLED_FindAndCopy
 #endif
-IN_PROC_BROWSER_TEST_F(PDFBrowserTest, MAYBE_FindAndCopy) {
+// flaky, disabling on branch
+IN_PROC_BROWSER_TEST_F(PDFBrowserTest, DISABLED_FindAndCopy) {
   ASSERT_NO_FATAL_FAILURE(Load());
   // Verifies that find in page works.
   ASSERT_EQ(3, ui_test_utils::FindInPage(
index 6252408..4ae28c0 100644 (file)
@@ -6,13 +6,9 @@
 
 #include "base/bind.h"
 #include "base/memory/scoped_ptr.h"
-#include "base/prefs/pref_service.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "base/version.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/plugins/chrome_plugin_service_filter.h"
-#include "chrome/browser/plugins/plugin_finder.h"
 #include "chrome/browser/plugins/plugin_metadata.h"
 #include "chrome/browser/plugins/plugin_prefs.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/pdf/open_pdf_in_reader_prompt_delegate.h"
 #include "chrome/browser/ui/pdf/pdf_tab_helper.h"
 #include "chrome/common/chrome_content_client.h"
-#include "chrome/common/pref_names.h"
 #include "content/public/browser/interstitial_page.h"
 #include "content/public/browser/interstitial_page_delegate.h"
 #include "content/public/browser/navigation_details.h"
 #include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/plugin_service.h"
+#include "content/public/browser/page_navigator.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/user_metrics.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/common/page_transition_types.h"
 #include "grit/browser_resources.h"
 #include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/webui/jstemplate_builder.h"
-#include "ui/gfx/image/image.h"
 
 #if defined(OS_WIN)
 #include "base/win/metro.h"
+#include "chrome/browser/ui/pdf/adobe_reader_info_win.h"
 #endif
 
 using base::UserMetricsAction;
 using content::InterstitialPage;
 using content::OpenURLParams;
-using content::PluginService;
 using content::Referrer;
 using content::WebContents;
 using content::WebPluginInfo;
 
+#if defined(OS_WIN)
 namespace {
 
 const char kAdobeReaderUpdateUrl[] = "http://www.adobe.com/go/getreader_chrome";
 
-#if defined(OS_WIN) && defined(ENABLE_PLUGIN_INSTALLATION)
-const char kAdobeReaderIdentifier[] = "adobe-reader";
-#endif
-
 // The prompt delegate used to ask the user if they want to use Adobe Reader
 // by default.
 class PDFEnableAdobeReaderPromptDelegate
@@ -244,10 +233,9 @@ class PDFUnsupportedFeatureInterstitial
 class PDFUnsupportedFeaturePromptDelegate
     : public OpenPDFInReaderPromptDelegate {
  public:
-  // |reader| is NULL if Adobe Reader isn't installed.
-  PDFUnsupportedFeaturePromptDelegate(WebContents* web_contents,
-                                      const content::WebPluginInfo* reader,
-                                      PluginFinder* plugin_finder);
+  PDFUnsupportedFeaturePromptDelegate(
+      WebContents* web_contents,
+      const AdobeReaderPluginInfo& reader_info);
   virtual ~PDFUnsupportedFeaturePromptDelegate();
 
   // OpenPDFInReaderPromptDelegate:
@@ -261,38 +249,19 @@ class PDFUnsupportedFeaturePromptDelegate
 
  private:
   WebContents* web_contents_;
-  bool reader_installed_;
-  bool reader_vulnerable_;
-  WebPluginInfo reader_webplugininfo_;
+  const AdobeReaderPluginInfo reader_info_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(PDFUnsupportedFeaturePromptDelegate);
 };
 
 PDFUnsupportedFeaturePromptDelegate::PDFUnsupportedFeaturePromptDelegate(
     WebContents* web_contents,
-    const content::WebPluginInfo* reader,
-    PluginFinder* plugin_finder)
+    const AdobeReaderPluginInfo& reader_info)
     : web_contents_(web_contents),
-      reader_installed_(!!reader),
-      reader_vulnerable_(false) {
-  if (!reader_installed_) {
-    content::RecordAction(
-        UserMetricsAction("PDF_InstallReaderInfoBarShown"));
-    return;
-  }
-
-  content::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarShown"));
-  reader_webplugininfo_ = *reader;
-
-#if defined(ENABLE_PLUGIN_INSTALLATION)
-  scoped_ptr<PluginMetadata> plugin_metadata(
-      plugin_finder->GetPluginMetadata(reader_webplugininfo_));
-
-  reader_vulnerable_ = plugin_metadata->GetSecurityStatus(*reader) !=
-                       PluginMetadata::SECURITY_STATUS_UP_TO_DATE;
-#else
-  NOTREACHED();
-#endif
+      reader_info_(reader_info) {
+  content::RecordAction(reader_info_.is_installed ?
+                        UserMetricsAction("PDF_UseReaderInfoBarShown") :
+                        UserMetricsAction("PDF_InstallReaderInfoBarShown"));
 }
 
 PDFUnsupportedFeaturePromptDelegate::~PDFUnsupportedFeaturePromptDelegate() {
@@ -304,15 +273,12 @@ base::string16 PDFUnsupportedFeaturePromptDelegate::GetMessageText() const {
 
 base::string16 PDFUnsupportedFeaturePromptDelegate::GetAcceptButtonText()
     const {
-#if defined(OS_WIN)
   if (base::win::IsMetroProcess())
     return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_METRO_MODE_LINK);
-#endif
 
-  if (reader_installed_)
-    return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_OPEN_IN_READER_LINK);
-
-  return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_INSTALL_READER_LINK);
+  return l10n_util::GetStringUTF16(
+      reader_info_.is_installed ? IDS_PDF_BUBBLE_OPEN_IN_READER_LINK
+                                : IDS_PDF_BUBBLE_INSTALL_READER_LINK);
 }
 
 base::string16 PDFUnsupportedFeaturePromptDelegate::GetCancelButtonText()
@@ -326,14 +292,12 @@ bool PDFUnsupportedFeaturePromptDelegate::ShouldExpire(
 }
 
 void PDFUnsupportedFeaturePromptDelegate::Accept() {
-#if defined(OS_WIN)
   if (base::win::IsMetroProcess()) {
     chrome::AttemptRestartWithModeSwitch();
     return;
   }
-#endif
 
-  if (!reader_installed_) {
+  if (!reader_info_.is_installed) {
     content::RecordAction(UserMetricsAction("PDF_InstallReaderInfoBarOK"));
     OpenReaderUpdateURL(web_contents_);
     return;
@@ -341,8 +305,9 @@ void PDFUnsupportedFeaturePromptDelegate::Accept() {
 
   content::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarOK"));
 
-  if (reader_vulnerable_) {
-    new PDFUnsupportedFeatureInterstitial(web_contents_, reader_webplugininfo_);
+  if (!reader_info_.is_secure) {
+    new PDFUnsupportedFeatureInterstitial(web_contents_,
+                                          reader_info_.plugin_info);
     return;
   }
 
@@ -351,61 +316,54 @@ void PDFUnsupportedFeaturePromptDelegate::Accept() {
   OpenPDFInReaderPromptDelegate* delegate =
       new PDFEnableAdobeReaderPromptDelegate(profile);
 
-  OpenUsingReader(web_contents_, reader_webplugininfo_, delegate);
+  OpenUsingReader(web_contents_, reader_info_.plugin_info, delegate);
 }
 
 void PDFUnsupportedFeaturePromptDelegate::Cancel() {
-  content::RecordAction(reader_installed_ ?
+  content::RecordAction(reader_info_.is_installed ?
                         UserMetricsAction("PDF_UseReaderInfoBarCancel") :
                         UserMetricsAction("PDF_InstallReaderInfoBarCancel"));
 }
 
-#if defined(OS_WIN) && defined(ENABLE_PLUGIN_INSTALLATION)
-void GotPluginsCallback(int process_id,
-                        int routing_id,
-                        const std::vector<content::WebPluginInfo>& plugins) {
-  WebContents* web_contents =
-      tab_util::GetWebContentsByID(process_id, routing_id);
-  if (!web_contents)
+void MaybeShowOpenPDFInReaderPrompt(WebContents* web_contents,
+                                    const AdobeReaderPluginInfo& reader_info) {
+  // If the Reader plugin is disabled by policy, don't prompt them.
+  if (!reader_info.is_installed || !reader_info.is_enabled)
     return;
 
-  const content::WebPluginInfo* reader = NULL;
-  PluginFinder* plugin_finder = PluginFinder::GetInstance();
-  for (size_t i = 0; i < plugins.size(); ++i) {
-    scoped_ptr<PluginMetadata> plugin_metadata(
-        plugin_finder->GetPluginMetadata(plugins[i]));
-    if (plugin_metadata->identifier() != kAdobeReaderIdentifier)
-      continue;
-
-    DCHECK(!reader);
-    reader = &plugins[i];
-    // If the Reader plugin is disabled by policy, don't prompt them.
-    Profile* profile =
-        Profile::FromBrowserContext(web_contents->GetBrowserContext());
-    PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile);
-    if (plugin_prefs->PolicyStatusForPlugin(plugin_metadata->name()) ==
-        PluginPrefs::POLICY_DISABLED) {
-      return;
-    }
-    break;
-  }
-
   scoped_ptr<OpenPDFInReaderPromptDelegate> prompt(
-      new PDFUnsupportedFeaturePromptDelegate(
-          web_contents, reader, plugin_finder));
+      new PDFUnsupportedFeaturePromptDelegate(web_contents, reader_info));
   PDFTabHelper* pdf_tab_helper = PDFTabHelper::FromWebContents(web_contents);
   pdf_tab_helper->ShowOpenInReaderPrompt(prompt.Pass());
 }
-#endif  // defined(OS_WIN) && defined(ENABLE_PLUGIN_INSTALLATION)
+
+void GotPluginsCallback(int process_id,
+                        int routing_id,
+                        const AdobeReaderPluginInfo& reader_info) {
+  WebContents* web_contents =
+      tab_util::GetWebContentsByID(process_id, routing_id);
+  if (web_contents)
+    MaybeShowOpenPDFInReaderPrompt(web_contents, reader_info);
+}
 
 }  // namespace
+#endif  // defined(OS_WIN)
 
-void PDFHasUnsupportedFeature(content::WebContents* web_contents) {
-#if defined(OS_WIN) && defined(ENABLE_PLUGIN_INSTALLATION)
+void PDFHasUnsupportedFeature(WebContents* web_contents) {
+#if defined(OS_WIN)
   // Only works for Windows for now.  For Mac, we'll have to launch the file
   // externally since Adobe Reader doesn't work inside Chrome.
-  PluginService::GetInstance()->GetPlugins(base::Bind(&GotPluginsCallback,
-      web_contents->GetRenderProcessHost()->GetID(),
-      web_contents->GetRenderViewHost()->GetRoutingID()));
-#endif
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents->GetBrowserContext());
+  AdobeReaderPluginInfo reader_info;
+  if (GetAdobeReaderPluginInfo(profile, &reader_info)) {
+    MaybeShowOpenPDFInReaderPrompt(web_contents, reader_info);
+    return;
+  }
+  GetAdobeReaderPluginInfoAsync(
+      profile,
+      base::Bind(&GotPluginsCallback,
+                 web_contents->GetRenderProcessHost()->GetID(),
+                 web_contents->GetRenderViewHost()->GetRoutingID()));
+#endif  // defined(OS_WIN)
 }
index 0dc07c9..dd3b244 100644 (file)
@@ -444,9 +444,12 @@ std::vector<GURL> StartupBrowserCreator::GetURLsFromCommandLine(
       if (policy->IsWebSafeScheme(url.scheme()) ||
           url.SchemeIs(url::kFileScheme) ||
 #if defined(OS_CHROMEOS)
-          // In ChromeOS, allow a settings page to be specified on the
-          // command line. See ExistingUserController::OnLoginSuccess.
+          // In ChromeOS, allow any settings page to be specified on the command
+          // line. See ExistingUserController::OnLoginSuccess.
           (url.spec().find(chrome::kChromeUISettingsURL) == 0) ||
+#else
+          ((url.spec().find(std::string(chrome::kChromeUISettingsURL) +
+                            chrome::kResetProfileSettingsSubPage) == 0)) ||
 #endif
           (url.spec().compare(url::kAboutBlankURL) == 0)) {
         urls.push_back(url);
index 2353921..d1f4e79 100644 (file)
@@ -38,6 +38,7 @@
 #include "chrome/browser/ui/webui/signin/profile_signin_confirmation_dialog.h"
 #include "chrome/common/url_constants.h"
 #include "components/signin/core/browser/signin_manager.h"
+#include "components/signin/core/browser/signin_metrics.h"
 #include "components/signin/core/common/profile_management_switches.h"
 #include "components/sync_driver/sync_prefs.h"
 #include "grit/chromium_strings.h"
@@ -279,7 +280,7 @@ void OneClickSigninSyncStarter::CompleteInitForNewProfile(
       // the signin for the original profile was cancelled (must do this after
       // we have called Initialize() with the new profile, as otherwise this
       // object will get freed when the signin on the old profile is cancelled.
-      old_signin_manager->SignOut();
+      old_signin_manager->SignOut(signin_metrics::TRANSFER_CREDENTIALS);
 
       // Load policy for the just-created profile - once policy has finished
       // loading the signin process will complete.
@@ -306,7 +307,8 @@ void OneClickSigninSyncStarter::CompleteInitForNewProfile(
 #endif
 
 void OneClickSigninSyncStarter::CancelSigninAndDelete() {
-  SigninManagerFactory::GetForProfile(profile_)->SignOut();
+  SigninManagerFactory::GetForProfile(profile_)->SignOut(
+      signin_metrics::ABORT_SIGNIN);
   // The statement above results in a call to SigninFailed() which will free
   // this object, so do not refer to the OneClickSigninSyncStarter object
   // after this point.
index 811f959..d727843 100644 (file)
@@ -40,6 +40,7 @@
 #else
 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
+#include "chrome/browser/external_protocol/external_protocol_observer.h"
 #include "chrome/browser/net/predictor_tab_helper.h"
 #include "chrome/browser/plugins/plugin_observer.h"
 #include "chrome/browser/safe_browsing/safe_browsing_tab_observer.h"
@@ -151,6 +152,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
   extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
       web_contents);
   extensions::WebNavigationTabObserver::CreateForWebContents(web_contents);
+  ExternalProtocolObserver::CreateForWebContents(web_contents);
   HungPluginTabHelper::CreateForWebContents(web_contents);
   ManagePasswordsUIController::CreateForWebContents(web_contents);
   PDFTabHelper::CreateForWebContents(web_contents);
index a786474..a6d245b 100644 (file)
@@ -154,10 +154,6 @@ ui::ModalType AppListDialogContentsView::GetModalType() const {
   return ui::MODAL_TYPE_WINDOW;
 }
 
-ui::AXRole AppListDialogContentsView::GetAccessibleWindowRole() const {
-  return ui::AX_ROLE_DIALOG;
-}
-
 void AppListDialogContentsView::WindowClosing() {
   app_list_controller_delegate_->OnCloseChildDialog();
 }
index 51654d4..375af85 100644 (file)
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_APP_LIST_APP_LIST_DIALOG_CONTENTS_VIEW_H_
 
 #include "ui/views/controls/button/button.h"
-#include "ui/views/widget/widget_delegate.h"
+#include "ui/views/window/dialog_delegate.h"
 
 class AppListControllerDelegate;
 
@@ -17,7 +17,7 @@ class Widget;
 
 // The contents view for an App List Dialog, which covers the entire app list
 // and adds a close button.
-class AppListDialogContentsView : public views::WidgetDelegateView,
+class AppListDialogContentsView : public views::DialogDelegateView,
                                   public views::ButtonListener {
  public:
   AppListDialogContentsView(
@@ -48,7 +48,6 @@ class AppListDialogContentsView : public views::WidgetDelegateView,
  protected:
   // Overridden from views::WidgetDelegate:
   virtual ui::ModalType GetModalType() const OVERRIDE;
-  virtual ui::AXRole GetAccessibleWindowRole() const OVERRIDE;
   virtual void WindowClosing() OVERRIDE;
 
  private:
index 1590a85..f6a8139 100644 (file)
@@ -33,16 +33,22 @@ bool AppWindowDesktopWindowTreeHostWin::GetClientAreaInsets(
   if (!app_window_->glass_frame_view())
     return false;
 
-  // This tells Windows that the whole of the window is a client area, meaning
-  // Chrome will draw it. Windows still fills in the glass bits because of the
+  // This tells Windows that most of the window is a client area, meaning Chrome
+  // will draw it. Windows still fills in the glass bits because of the
   // DwmExtendFrameIntoClientArea call in |UpdateDWMFrame|.
-  insets->Set(0, 0, 0, 0);
+  // The 1 pixel edge is left on the sides and bottom as without this
+  //   * windows paint in a more standard way, and
+  //   * get weird black bars at the top when maximized in multiple monitor
+  //     configurations.
+  int border_thickness = 1;
+  insets->Set(0, border_thickness, border_thickness, border_thickness);
   return true;
 }
 
 void AppWindowDesktopWindowTreeHostWin::HandleFrameChanged() {
   // We need to update the glass region on or off before the base class adjusts
   // the window region.
+  app_window_->OnCanHaveAlphaEnabledChanged();
   UpdateDWMFrame();
   DesktopWindowTreeHostWin::HandleFrameChanged();
 }
index dd2dfc4..39764f0 100644 (file)
@@ -98,6 +98,10 @@ bool BookmarkContextMenu::IsCommandEnabled(int command_id) const {
   return controller_->IsCommandIdEnabled(command_id);
 }
 
+bool BookmarkContextMenu::IsCommandVisible(int command_id) const {
+  return controller_->IsCommandIdVisible(command_id);
+}
+
 bool BookmarkContextMenu::ShouldCloseAllMenusOnExecute(int id) {
   return (id != IDC_BOOKMARK_BAR_REMOVE) || close_on_remove_;
 }
index 7fd36ee..d0af168 100644 (file)
@@ -61,6 +61,7 @@ class BookmarkContextMenu : public BookmarkContextMenuControllerDelegate,
   virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
   virtual bool IsItemChecked(int command_id) const OVERRIDE;
   virtual bool IsCommandEnabled(int command_id) const OVERRIDE;
+  virtual bool IsCommandVisible(int command_id) const OVERRIDE;
   virtual bool ShouldCloseAllMenusOnExecute(int id) OVERRIDE;
 
   // Overridden from BookmarkContextMenuControllerDelegate:
index c01e35f..77b4e27 100644 (file)
@@ -9,12 +9,17 @@
 
 #include "base/compiler_specific.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/prefs/pref_service.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/sequenced_worker_pool.h"
+#include "base/values.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/bookmarks/chrome_bookmark_client.h"
+#include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/bookmarks/bookmark_utils.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
@@ -24,6 +29,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/clipboard/clipboard.h"
 #include "ui/events/platform/platform_event_source.h"
+#include "ui/views/controls/menu/menu_item_view.h"
 
 #if defined(OS_WIN)
 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
@@ -333,3 +339,51 @@ TEST_F(BookmarkContextMenuTest, CutCopyPasteNode) {
   ASSERT_TRUE(bb_node->GetChild(1)->is_folder());
   ASSERT_EQ(old_count, bb_node->child_count());
 }
+
+// Tests that the "Show managed bookmarks" option in the context menu is only
+// visible if the policy is set.
+TEST_F(BookmarkContextMenuTest, ShowManagedBookmarks) {
+  // Create a BookmarkContextMenu for the bookmarks bar.
+  const BookmarkNode* bb_node = model_->bookmark_bar_node();
+  std::vector<const BookmarkNode*> nodes;
+  nodes.push_back(bb_node->GetChild(0));
+  scoped_ptr<BookmarkContextMenu> controller(new BookmarkContextMenu(
+      NULL, NULL, profile_.get(), NULL, nodes[0]->parent(), nodes, false));
+
+  // Verify that there are no managed nodes yet.
+  ChromeBookmarkClient* client = ChromeBookmarkClientFactory::GetForProfile(
+      profile_.get());
+  EXPECT_TRUE(client->managed_node()->empty());
+
+  // The context menu should not show the option to "Show managed bookmarks".
+  EXPECT_FALSE(
+      controller->IsCommandVisible(IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS));
+  views::MenuItemView* menu = controller->menu();
+  EXPECT_FALSE(menu->GetMenuItemByID(IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS)
+                   ->visible());
+
+  // Other options are not affected.
+  EXPECT_TRUE(controller->IsCommandVisible(IDC_BOOKMARK_BAR_NEW_FOLDER));
+  EXPECT_TRUE(menu->GetMenuItemByID(IDC_BOOKMARK_BAR_NEW_FOLDER)->visible());
+
+  // Now set the managed bookmarks policy.
+  base::DictionaryValue* dict = new base::DictionaryValue;
+  dict->SetString("name", "Google");
+  dict->SetString("url", "http://google.com");
+  base::ListValue list;
+  list.Append(dict);
+  EXPECT_TRUE(client->managed_node()->empty());
+  profile_->GetPrefs()->Set(prefs::kManagedBookmarks, list);
+  EXPECT_FALSE(client->managed_node()->empty());
+
+  // New context menus now show the "Show managed bookmarks" option.
+  controller.reset(new BookmarkContextMenu(
+      NULL, NULL, profile_.get(), NULL, nodes[0]->parent(), nodes, false));
+  EXPECT_TRUE(controller->IsCommandVisible(IDC_BOOKMARK_BAR_NEW_FOLDER));
+  EXPECT_TRUE(
+      controller->IsCommandVisible(IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS));
+  menu = controller->menu();
+  EXPECT_TRUE(menu->GetMenuItemByID(IDC_BOOKMARK_BAR_NEW_FOLDER)->visible());
+  EXPECT_TRUE(menu->GetMenuItemByID(IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS)
+                  ->visible());
+}
index 592ae10..ae9cf1b 100644 (file)
@@ -40,7 +40,6 @@
 #include "ui/gfx/path.h"
 #include "ui/gfx/rect_conversions.h"
 #include "ui/gfx/skia_util.h"
-#include "ui/gfx/text_elider.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/label.h"
@@ -53,9 +52,9 @@ namespace {
 
 // Padding around the "content" of a tab, occupied by the tab border graphics.
 const int kLeftPadding = 22;
-const int kTopPadding = 7;
+const int kTopPadding = 4;
 const int kRightPadding = 17;
-const int kBottomPadding = 5;
+const int kBottomPadding = 2;
 
 // Height of the shadow at the top of the tab image assets.
 const int kDropShadowHeight = 4;
@@ -68,18 +67,8 @@ static const int kTouchWidth = 120;
 
 static const int kToolbarOverlap = 1;
 static const int kFaviconTitleSpacing = 4;
-// Additional vertical offset for title text relative to top of tab.
-// Ash text rendering may be different than Windows.
-static const int kTitleTextOffsetYAsh = 1;
-static const int kTitleTextOffsetY = 0;
-static const int kTitleCloseButtonSpacing = 3;
+static const int kViewSpacing = 3;
 static const int kStandardTitleWidth = 175;
-// Additional vertical offset for close button relative to top of tab.
-// Ash needs this to match the text vertical position.
-static const int kCloseButtonVertFuzzAsh = 1;
-static const int kCloseButtonVertFuzz = 0;
-// Additional horizontal offset for close button relative to title text.
-static const int kCloseButtonHorzFuzz = 3;
 
 // When a non-mini-tab becomes a mini-tab the width of the tab animates. If
 // the width of a mini-tab is >= kMiniTabRendererAsNormalTabWidth then the tab
@@ -185,6 +174,13 @@ chrome::HostDesktopType GetHostDesktopType(views::View* view) {
       widget ? widget->GetNativeView() : NULL);
 }
 
+// Stop()s |animation| and then deletes it. We do this rather than just deleting
+// so that the delegate is notified before the destruction.
+void StopAndDeleteAnimation(scoped_ptr<gfx::Animation> animation) {
+  if (animation)
+    animation->Stop();
+}
+
 }  // namespace
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -481,10 +477,8 @@ void Tab::SetData(const TabRendererData& data) {
   }
 
   if (old.mini != data_.mini) {
-    if (tab_animation_.get() && tab_animation_->is_animating()) {
-      tab_animation_->Stop();
-      tab_animation_.reset(NULL);
-    }
+    StopAndDeleteAnimation(
+        mini_title_change_animation_.PassAs<gfx::Animation>());
   }
 
   DataChanged(old);
@@ -507,27 +501,21 @@ void Tab::UpdateLoadingAnimation(TabRendererData::NetworkState state) {
 }
 
 void Tab::StartPulse() {
-  gfx::ThrobAnimation* animation = new gfx::ThrobAnimation(this);
-  animation->SetSlideDuration(kPulseDurationMs);
-  if (animation_container_.get())
-    animation->SetContainer(animation_container_.get());
-  animation->StartThrobbing(std::numeric_limits<int>::max());
-  tab_animation_.reset(animation);
+  pulse_animation_.reset(new gfx::ThrobAnimation(this));
+  pulse_animation_->SetSlideDuration(kPulseDurationMs);
+  if (animation_container_)
+    pulse_animation_->SetContainer(animation_container_.get());
+  pulse_animation_->StartThrobbing(std::numeric_limits<int>::max());
 }
 
 void Tab::StopPulse() {
-  if (!tab_animation_.get())
-    return;
-  tab_animation_->Stop();
-  tab_animation_.reset(NULL);
+  StopAndDeleteAnimation(pulse_animation_.PassAs<gfx::Animation>());
 }
 
 void Tab::StartMiniTabTitleAnimation() {
-  // We can only do this animation if the tab is mini because we will
-  // upcast tab_animation back to MultiAnimation when we draw.
   if (!data().mini)
     return;
-  if (!tab_animation_.get()) {
+  if (!mini_title_change_animation_) {
     gfx::MultiAnimation::Parts parts;
     parts.push_back(
         gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration1MS,
@@ -544,20 +532,16 @@ void Tab::StartMiniTabTitleAnimation() {
     parts[2].end_time_ms = kMiniTitleChangeAnimationEnd3MS;
     base::TimeDelta timeout =
         base::TimeDelta::FromMilliseconds(kMiniTitleChangeAnimationIntervalMS);
-    gfx::MultiAnimation* animation = new gfx::MultiAnimation(parts, timeout);
-    if (animation_container_.get())
-      animation->SetContainer(animation_container_.get());
-    animation->set_delegate(this);
-    tab_animation_.reset(animation);
+    mini_title_change_animation_.reset(new gfx::MultiAnimation(parts, timeout));
+    if (animation_container_)
+      mini_title_change_animation_->SetContainer(animation_container_.get());
+    mini_title_change_animation_->set_delegate(this);
   }
-  tab_animation_->Start();
+  mini_title_change_animation_->Start();
 }
 
 void Tab::StopMiniTabTitleAnimation() {
-  if (!tab_animation_.get())
-    return;
-  tab_animation_->Stop();
-  tab_animation_.reset(NULL);
+  StopAndDeleteAnimation(mini_title_change_animation_.PassAs<gfx::Animation>());
 }
 
 // static
@@ -613,7 +597,7 @@ int Tab::GetImmersiveHeight() {
 void Tab::AnimationProgressed(const gfx::Animation* animation) {
   // Ignore if the pulse animation is being performed on active tab because
   // it repaints the same image. See |Tab::PaintTabBackground()|.
-  if (animation == tab_animation_.get() && IsActive())
+  if (animation == pulse_animation_.get() && IsActive())
     return;
   SchedulePaint();
 }
@@ -682,41 +666,20 @@ void Tab::OnPaint(gfx::Canvas* canvas) {
 
 void Tab::Layout() {
   gfx::Rect lb = GetContentsBounds();
+  lb.Inset(kLeftPadding, kTopPadding, kRightPadding, kBottomPadding);
   if (lb.IsEmpty())
     return;
-  lb.Inset(kLeftPadding, kTopPadding, kRightPadding, kBottomPadding);
 
-  // The height of the content of the Tab is the largest of the favicon,
-  // the title text and the close button graphic.
-  const int kTabIconSize = gfx::kFaviconSize;
-  const int font_height = title_->font_list().GetHeight();
-  int content_height = std::max(kTabIconSize, font_height);
-  close_button_->SetBorder(views::Border::NullBorder());
-  gfx::Size close_button_size(close_button_->GetPreferredSize());
-  content_height = std::max(content_height, close_button_size.height());
-
-  // Size the Favicon.
   showing_icon_ = ShouldShowIcon();
+  favicon_bounds_.SetRect(lb.x(), lb.y(), 0, 0);
   if (showing_icon_) {
-    // Use the size of the favicon as apps use a bigger favicon size.
-    int favicon_top = kTopPadding + content_height / 2 - kTabIconSize / 2;
-    int favicon_left = lb.x();
-    favicon_bounds_.SetRect(favicon_left, favicon_top,
-                            kTabIconSize, kTabIconSize);
+    favicon_bounds_.set_size(gfx::Size(gfx::kFaviconSize, gfx::kFaviconSize));
+    favicon_bounds_.set_y(lb.y() + (lb.height() - gfx::kFaviconSize + 1) / 2);
     MaybeAdjustLeftForMiniTab(&favicon_bounds_);
-  } else {
-    favicon_bounds_.SetRect(lb.x(), lb.y(), 0, 0);
   }
 
-  // Size the Close button.
   showing_close_button_ = ShouldShowCloseBox();
-  const bool is_host_desktop_type_ash =
-      GetHostDesktopType(this) == chrome::HOST_DESKTOP_TYPE_ASH;
   if (showing_close_button_) {
-    const int close_button_vert_fuzz = is_host_desktop_type_ash ?
-        kCloseButtonVertFuzzAsh : kCloseButtonVertFuzz;
-    int close_button_top = kTopPadding + close_button_vert_fuzz +
-        (content_height - close_button_size.height()) / 2;
     // If the ratio of the close button size to tab width exceeds the maximum.
     // The close button should be as large as possible so that there is a larger
     // hit-target for touch events. So the close button bounds extends to the
@@ -725,74 +688,52 @@ void Tab::Layout() {
     // So a border is added to the button with necessary padding. The close
     // button (BaseTab::TabCloseButton) makes sure the padding is a hit-target
     // only for touch events.
-    int top_border = close_button_top;
-    int bottom_border = height() - (close_button_size.height() + top_border);
-    int left_border = kCloseButtonHorzFuzz;
-    int right_border = width() - (lb.width() + close_button_size.width() +
-        left_border);
-    close_button_->SetBorder(views::Border::CreateEmptyBorder(
-        top_border, left_border, bottom_border, right_border));
+    close_button_->SetBorder(views::Border::NullBorder());
+    const gfx::Size close_button_size(close_button_->GetPreferredSize());
+    const int top = lb.y() + (lb.height() - close_button_size.height() + 1) / 2;
+    const int bottom = height() - (close_button_size.height() + top);
+    const int left = kViewSpacing;
+    const int right = width() - (lb.width() + close_button_size.width() + left);
+    close_button_->SetBorder(
+        views::Border::CreateEmptyBorder(top, left, bottom, right));
     close_button_->SetPosition(gfx::Point(lb.width(), 0));
     close_button_->SizeToPreferredSize();
-    close_button_->SetVisible(true);
-  } else {
-    close_button_->SetBounds(0, 0, 0, 0);
-    close_button_->SetVisible(false);
   }
+  close_button_->SetVisible(showing_close_button_);
 
   showing_media_indicator_ = ShouldShowMediaIndicator();
+  media_indicator_bounds_.SetRect(lb.x(), lb.y(), 0, 0);
   if (showing_media_indicator_) {
     const gfx::Image& media_indicator_image =
         chrome::GetTabMediaIndicatorImage(animating_media_state_);
     media_indicator_bounds_.set_width(media_indicator_image.Width());
     media_indicator_bounds_.set_height(media_indicator_image.Height());
     media_indicator_bounds_.set_y(
-        kTopPadding +
-            (content_height - media_indicator_bounds_.height()) / 2);
+        lb.y() + (lb.height() - media_indicator_bounds_.height() + 1) / 2);
     const int right = showing_close_button_ ?
         close_button_->x() + close_button_->GetInsets().left() : lb.right();
     media_indicator_bounds_.set_x(
         std::max(lb.x(), right - media_indicator_bounds_.width()));
     MaybeAdjustLeftForMiniTab(&media_indicator_bounds_);
-  } else {
-    media_indicator_bounds_.SetRect(lb.x(), lb.y(), 0, 0);
   }
 
-  const int title_text_offset = is_host_desktop_type_ash ?
-      kTitleTextOffsetYAsh : kTitleTextOffsetY;
-  int title_left = favicon_bounds_.right() + kFaviconTitleSpacing;
-  int title_top = kTopPadding + title_text_offset +
-      (content_height - font_height) / 2;
-  gfx::Rect title_bounds(title_left, title_top, 0, 0);
-  // Size the Title text to fill the remaining space.
-  if (!data().mini || width() >= kMiniTabRendererAsNormalTabWidth) {
-    // If the user has big fonts, the title will appear rendered too far down
-    // on the y-axis if we use the regular top padding, so we need to adjust it
-    // so that the text appears centered.
-    gfx::Size minimum_size = GetMinimumUnselectedSize();
-    int text_height = title_top + font_height + kBottomPadding;
-    if (text_height > minimum_size.height())
-      title_top -= (text_height - minimum_size.height()) / 2;
-
-    int title_width;
+  // Size the title to fill the remaining width and use all available height.
+  bool show_title = !data().mini || width() >= kMiniTabRendererAsNormalTabWidth;
+  if (show_title) {
+    int title_left = favicon_bounds_.right() + kFaviconTitleSpacing;
+    int title_width = lb.width() - title_left;
     if (showing_media_indicator_) {
-      title_width = media_indicator_bounds_.x() - kTitleCloseButtonSpacing -
-          title_left;
+      title_width = media_indicator_bounds_.x() - kViewSpacing - title_left;
     } else if (close_button_->visible()) {
-      // The close button has an empty border with some padding (see details
-      // above where the close-button's bounds is set). Allow the title to
-      // overlap the empty padding.
+      // Allow the title to overlay the close button's empty border padding.
       title_width = close_button_->x() + close_button_->GetInsets().left() -
-          kTitleCloseButtonSpacing - title_left;
-    } else {
-      title_width = lb.width() - title_left;
+          kViewSpacing - title_left;
     }
-    title_width = std::max(title_width, 0);
-    title_bounds.SetRect(title_left, title_top, title_width, font_height);
+    gfx::Rect rect(title_left, lb.y(), std::max(title_width, 0), lb.height());
+    rect.set_x(GetMirroredXForRect(rect));
+    title_->SetBoundsRect(rect);
   }
-
-  title_bounds.set_x(GetMirroredXForRect(title_bounds));
-  title_->SetBoundsRect(title_bounds);
+  title_->SetVisible(show_title);
 }
 
 void Tab::OnThemeChanged() {
@@ -1043,10 +984,8 @@ void Tab::PaintTab(gfx::Canvas* canvas) {
 void Tab::PaintImmersiveTab(gfx::Canvas* canvas) {
   // Use transparency for the draw-attention animation.
   int alpha = 255;
-  if (tab_animation_ &&
-      tab_animation_->is_animating() &&
-      !data().mini) {
-    alpha = tab_animation_->CurrentValueBetween(
+  if (pulse_animation_ && pulse_animation_->is_animating() && !data().mini) {
+    alpha = pulse_animation_->CurrentValueBetween(
         255, static_cast<int>(255 * kImmersiveTabMinThrobOpacity));
   }
 
@@ -1090,12 +1029,9 @@ void Tab::PaintTabBackground(gfx::Canvas* canvas) {
   if (IsActive()) {
     PaintActiveTabBackground(canvas);
   } else {
-    if (tab_animation_.get() &&
-        tab_animation_->is_animating() &&
-        data().mini) {
-      gfx::MultiAnimation* animation =
-          static_cast<gfx::MultiAnimation*>(tab_animation_.get());
-      PaintInactiveTabBackgroundWithTitleChange(canvas, animation);
+    if (mini_title_change_animation_ &&
+        mini_title_change_animation_->is_animating()) {
+      PaintInactiveTabBackgroundWithTitleChange(canvas);
     } else {
       PaintInactiveTabBackground(canvas);
     }
@@ -1110,9 +1046,7 @@ void Tab::PaintTabBackground(gfx::Canvas* canvas) {
   }
 }
 
-void Tab::PaintInactiveTabBackgroundWithTitleChange(
-    gfx::Canvas* canvas,
-    gfx::MultiAnimation* animation) {
+void Tab::PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas) {
   // Render the inactive tab background. We'll use this for clipping.
   gfx::Canvas background_canvas(size(), canvas->image_scale(), false);
   PaintInactiveTabBackground(&background_canvas);
@@ -1126,12 +1060,12 @@ void Tab::PaintInactiveTabBackgroundWithTitleChange(
   int x1 = radius;
   int x2 = -radius;
   int x;
-  if (animation->current_part_index() == 0) {
-    x = animation->CurrentValueBetween(x0, x1);
-  } else if (animation->current_part_index() == 1) {
+  if (mini_title_change_animation_->current_part_index() == 0) {
+    x = mini_title_change_animation_->CurrentValueBetween(x0, x1);
+  } else if (mini_title_change_animation_->current_part_index() == 1) {
     x = x1;
   } else {
-    x = animation->CurrentValueBetween(x1, x2);
+    x = mini_title_change_animation_->CurrentValueBetween(x1, x2);
   }
   SkPoint center_point;
   center_point.iset(x, 0);
@@ -1154,8 +1088,8 @@ void Tab::PaintInactiveTabBackgroundWithTitleChange(
   canvas->DrawImageInt(background_image, 0, 0);
 
   // And then the gradient on top of that.
-  if (animation->current_part_index() == 2) {
-    uint8 alpha = animation->CurrentValueBetween(255, 0);
+  if (mini_title_change_animation_->current_part_index() == 2) {
+    uint8 alpha = mini_title_change_animation_->CurrentValueBetween(255, 0);
     canvas->DrawImageInt(hover_image, 0, 0, alpha);
   } else {
     canvas->DrawImageInt(hover_image, 0, 0);
@@ -1468,13 +1402,16 @@ bool Tab::ShouldShowCloseBox() const {
 }
 
 double Tab::GetThrobValue() {
-  bool is_selected = IsSelected();
-  double min = is_selected ? kSelectedTabOpacity : 0;
-  double scale = is_selected ? kSelectedTabThrobScale : 1;
-
-  if (!data().mini) {
-    if (tab_animation_.get() && tab_animation_->is_animating())
-      return tab_animation_->GetCurrentValue() * kHoverOpacity * scale + min;
+  const bool is_selected = IsSelected();
+  const double min = is_selected ? kSelectedTabOpacity : 0;
+  const double scale = is_selected ? kSelectedTabThrobScale : 1;
+
+  // Showing both the pulse and title change animation at the same time is too
+  // much.
+  if (pulse_animation_ && pulse_animation_->is_animating() &&
+      (!mini_title_change_animation_ ||
+       !mini_title_change_animation_->is_animating())) {
+    return pulse_animation_->GetCurrentValue() * kHoverOpacity * scale + min;
   }
 
   if (hover_controller_.ShouldDraw()) {
index 8d4f6e1..1275619 100644 (file)
@@ -26,6 +26,7 @@ class Animation;
 class AnimationContainer;
 class LinearAnimation;
 class MultiAnimation;
+class ThrobAnimation;
 }
 namespace views {
 class ImageButton;
@@ -216,9 +217,7 @@ class Tab : public gfx::AnimationDelegate,
 
   // Paint various portions of the Tab
   void PaintTabBackground(gfx::Canvas* canvas);
-  void PaintInactiveTabBackgroundWithTitleChange(
-      gfx::Canvas* canvas,
-      gfx::MultiAnimation* animation);
+  void PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas);
   void PaintInactiveTabBackground(gfx::Canvas* canvas);
   void PaintInactiveTabBackgroundUsingResourceId(gfx::Canvas* canvas,
                                                  int tab_id);
@@ -327,7 +326,9 @@ class Tab : public gfx::AnimationDelegate,
   bool should_display_crashed_favicon_;
 
   // Whole-tab throbbing "pulse" animation.
-  scoped_ptr<gfx::Animation> tab_animation_;
+  scoped_ptr<gfx::ThrobAnimation> pulse_animation_;
+
+  scoped_ptr<gfx::MultiAnimation> mini_title_change_animation_;
 
   // Crash icon animation (in place of favicon).
   scoped_ptr<gfx::LinearAnimation> crash_icon_animation_;
index d16820f..2cd8f88 100644 (file)
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/compiler_specific.h"
+#include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
@@ -44,22 +45,12 @@ const char kEnrollmentStepSignin[] = "signin";
 const char kEnrollmentStepSuccess[] = "success";
 
 // Enrollment mode strings.
-const char kEnrollmentModeManual[] = "manual";
-const char kEnrollmentModeForced[] = "forced";
-const char kEnrollmentModeAuto[] = "auto";
+const char* const kModeStrings[EnrollmentScreenActor::ENROLLMENT_MODE_COUNT] =
+    { "manual", "forced", "auto", "recovery" };
 
 std::string EnrollmentModeToString(EnrollmentScreenActor::EnrollmentMode mode) {
-  switch (mode) {
-    case EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL:
-      return kEnrollmentModeManual;
-    case EnrollmentScreenActor::ENROLLMENT_MODE_FORCED:
-      return kEnrollmentModeForced;
-    case EnrollmentScreenActor::ENROLLMENT_MODE_AUTO:
-      return kEnrollmentModeAuto;
-  }
-
-  NOTREACHED() << "Bad enrollment mode " << mode;
-  return kEnrollmentModeManual;
+  CHECK(0 <= mode && mode < EnrollmentScreenActor::ENROLLMENT_MODE_COUNT);
+  return kModeStrings[mode];
 }
 
 // A helper class that takes care of asynchronously revoking a given token.
index 93925ae..a1eab10 100644 (file)
@@ -71,13 +71,16 @@ HIDDetectionScreenHandler::HIDDetectionScreenHandler(
       core_oobe_actor_(core_oobe_actor),
       show_on_init_(false),
       mouse_is_pairing_(false),
+      pointing_device_connect_type_(InputDeviceInfo::TYPE_UNKNOWN),
       keyboard_is_pairing_(false),
+      keyboard_device_connect_type_(InputDeviceInfo::TYPE_UNKNOWN),
       switch_on_adapter_when_ready_(false),
       first_time_screen_show_(true),
       weak_ptr_factory_(this) {
 }
 
 HIDDetectionScreenHandler::~HIDDetectionScreenHandler() {
+  adapter_initially_powered_.reset();
   if (adapter_.get())
     adapter_->RemoveObserver(this);
   input_service_proxy_.RemoveObserver(this);
@@ -96,6 +99,10 @@ void HIDDetectionScreenHandler::SetPoweredError() {
   LOG(ERROR) << "Failed to power BT adapter";
 }
 
+void HIDDetectionScreenHandler::SetPoweredOffError() {
+  LOG(ERROR) << "Failed to power off BT adapter";
+}
+
 void HIDDetectionScreenHandler::FindDevicesError() {
   VLOG(1) << "Failed to start Bluetooth discovery.";
 }
@@ -177,6 +184,20 @@ void HIDDetectionScreenHandler::HandleOnContinue() {
         scenario_type,
         CONTINUE_SCENARIO_TYPE_SIZE);
   }
+  // Switch off BT adapter if it was off before the screen and no BT device
+  // connected.
+  if (adapter_ && adapter_->IsPresent() && adapter_->IsPowered() &&
+      !(pointing_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH ||
+        keyboard_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) &&
+      adapter_initially_powered_ && !(*adapter_initially_powered_)) {
+    VLOG(1) << "Switching off BT adapter after HID OOBE screen as unused.";
+    adapter_->SetPowered(
+        false,
+        base::Bind(&base::DoNothing),
+        base::Bind(&HIDDetectionScreenHandler::SetPoweredOffError,
+                   weak_ptr_factory_.GetWeakPtr()));
+  }
+
   core_oobe_actor_->StopDemoModeDetection();
   if (delegate_)
     delegate_->OnExit();
@@ -267,6 +288,8 @@ void HIDDetectionScreenHandler::AuthorizePairing(
 void HIDDetectionScreenHandler::AdapterPresentChanged(
     device::BluetoothAdapter* adapter, bool present) {
   if (present && switch_on_adapter_when_ready_) {
+    VLOG(1) << "Switching on BT adapter on HID OOBE screen.";
+    adapter_initially_powered_.reset(new bool(adapter_->IsPowered()));
     adapter_->SetPowered(
         true,
         base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession,
@@ -415,6 +438,8 @@ void HIDDetectionScreenHandler::TryInitiateBTDevicesUpdate() {
       // Switch on BT adapter later when it's available.
       switch_on_adapter_when_ready_ = true;
     } else if (!adapter_->IsPowered()) {
+      VLOG(1) << "Switching on BT adapter on HID OOBE screen.";
+      adapter_initially_powered_.reset(new bool(false));
       adapter_->SetPowered(
           true,
           base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession,
index f990745..5aff3bb 100644 (file)
@@ -170,6 +170,10 @@ class HIDDetectionScreenHandler
   // all necessary devices (mouse and keyboard) already connected.
   void GetDevicesFirstTime();
 
+  // Called by device::BluetoothAdapter in response to a failure to
+  // power off BT adapter.
+  void SetPoweredOffError();
+
   // Called for revision of active devices. If current-placement is available
   // for mouse or keyboard device, sets one of active devices as current or
   // tries to connect some BT device if no appropriate devices are connected.
@@ -214,6 +218,9 @@ class HIDDetectionScreenHandler
 
   bool first_time_screen_show_;
 
+  // State of BT adapter before screen-initiated changes.
+  scoped_ptr<bool> adapter_initially_powered_;
+
   base::WeakPtrFactory<HIDDetectionScreenHandler> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(HIDDetectionScreenHandler);
index c439f73..705a755 100644 (file)
@@ -241,7 +241,15 @@ base::string16 ComponentsUI::ServiceStatusToString(
 void ComponentsUI::OnEvent(Events event, const std::string& id) {
   base::DictionaryValue parameters;
   parameters.SetString("event", ComponentEventToString(event));
-  if (!id.empty())
+  if (!id.empty()) {
+    using component_updater::ComponentUpdateService;
+    if (event == ComponentUpdateService::Observer::COMPONENT_UPDATED) {
+      ComponentUpdateService* cus = g_browser_process->component_updater();
+      component_updater::CrxUpdateItem item;
+      if (cus->GetComponentDetails(id, &item))
+        parameters.SetString("version", item.component.version.GetString());
+    }
     parameters.SetString("id", id);
+  }
   web_ui()->CallJavascriptFunction("onComponentEvent", parameters);
 }
index 0836aad..1534958 100644 (file)
@@ -42,6 +42,7 @@
 #include "components/google/core/browser/google_util.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_error_controller.h"
+#include "components/signin/core/browser/signin_metrics.h"
 #include "components/signin/core/common/profile_management_switches.h"
 #include "components/sync_driver/sync_prefs.h"
 #include "content/public/browser/render_view_host.h"
@@ -805,7 +806,8 @@ void SyncSetupHandler::HandleStartSignin(const base::ListValue* args) {
 void SyncSetupHandler::HandleStopSyncing(const base::ListValue* args) {
   if (GetSyncService())
     ProfileSyncService::SyncEvent(ProfileSyncService::STOP_FROM_OPTIONS);
-  SigninManagerFactory::GetForProfile(GetProfile())->SignOut();
+  SigninManagerFactory::GetForProfile(GetProfile())->SignOut(
+      signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS);
 
   bool delete_profile = false;
   if (args->GetBoolean(0, &delete_profile) && delete_profile) {
@@ -849,8 +851,10 @@ void SyncSetupHandler::CloseSyncSetup() {
           // Sign out the user on desktop Chrome if they click cancel during
           // initial setup.
           // TODO(rsimha): Revisit this for M30. See http://crbug.com/252049.
-          if (sync_service->FirstSetupInProgress())
-            SigninManagerFactory::GetForProfile(GetProfile())->SignOut();
+          if (sync_service->FirstSetupInProgress()) {
+            SigninManagerFactory::GetForProfile(GetProfile())->SignOut(
+                signin_metrics::ABORT_SIGNIN);
+          }
   #endif
         }
       }
index dc79472..8fc18c8 100644 (file)
@@ -405,7 +405,7 @@ TEST_F(SyncSetupHandlerFirstSigninTest, DisplayBasicLogin) {
       .WillRepeatedly(Return(false));
   // Ensure that the user is not signed in before calling |HandleStartSignin()|.
   SigninManager* manager = static_cast<SigninManager*>(mock_signin_);
-  manager->SignOut();
+  manager->SignOut(signin_metrics::SIGNOUT_TEST);
   handler_->HandleStartSignin(NULL);
 
   // Sync setup hands off control to the gaia login tab.
index dbf5571..c653e5e 100644 (file)
         'browser/extensions/token_cache/token_cache_service_factory.h',
         'browser/external_protocol/external_protocol_handler.cc',
         'browser/external_protocol/external_protocol_handler.h',
+        'browser/external_protocol/external_protocol_observer.cc',
+        'browser/external_protocol/external_protocol_observer.h',
         'browser/favicon/chrome_favicon_client.cc',
         'browser/favicon/chrome_favicon_client.h',
         'browser/favicon/favicon_changed_details.cc',
         'browser/safe_browsing/malware_details_cache.h',
         'browser/safe_browsing/malware_details_history.cc',
         'browser/safe_browsing/malware_details_history.h',
+        'browser/safe_browsing/path_sanitizer.cc',
+        'browser/safe_browsing/path_sanitizer.h',
         'browser/safe_browsing/pe_image_reader_win.cc',
         'browser/safe_browsing/pe_image_reader_win.h',
         'browser/safe_browsing/ping_manager.cc',
             'browser/download/download_shelf.cc',
             'browser/download/download_shelf_context_menu.cc',
             'browser/drive/drive_switches.cc',
+            'browser/external_protocol/external_protocol_observer.cc',
             'browser/gpu/chrome_gpu_util.cc',
             'browser/idle_android.cc',
             'browser/idle.cc',
index 80f33ce..86921f7 100644 (file)
         'browser/ui/passwords/password_manager_presenter.cc',
         'browser/ui/passwords/password_manager_presenter.h',
         'browser/ui/passwords/password_ui_view.h',
+        'browser/ui/pdf/adobe_reader_info_win.cc',
+        'browser/ui/pdf/adobe_reader_info_win.h',
         'browser/ui/pdf/open_pdf_in_reader_prompt_delegate.h',
         'browser/ui/pdf/pdf_tab_helper.cc',
         'browser/ui/pdf/pdf_tab_helper.h',
index 8ea9ed1..bdfcec7 100644 (file)
         'browser/extensions/extension_garbage_collector_chromeos_unittest.cc',
         'browser/extensions/extension_gcm_app_handler_unittest.cc',
         'browser/extensions/extension_icon_manager_unittest.cc',
+        'browser/extensions/extension_install_prompt_unittest.cc',
         'browser/extensions/extension_message_bubble_controller_unittest.cc',
         'browser/extensions/extension_prefs_unittest.cc',
         'browser/extensions/extension_prefs_unittest.h',
         'browser/safe_browsing/download_feedback_service_unittest.cc',
         'browser/safe_browsing/download_feedback_unittest.cc',
         'browser/safe_browsing/download_protection_service_unittest.cc',
+        'browser/safe_browsing/environment_data_collection_win_unittest.cc',
         'browser/safe_browsing/incident_report_uploader_impl_unittest.cc',
         'browser/safe_browsing/incident_reporting_service_unittest.cc',
         'browser/safe_browsing/last_download_finder_unittest.cc',
         'browser/safe_browsing/local_two_phase_testserver.cc',
         'browser/safe_browsing/malware_details_unittest.cc',
+        'browser/safe_browsing/path_sanitizer_unittest.cc',
         'browser/safe_browsing/pe_image_reader_win_unittest.cc',
         'browser/safe_browsing/ping_manager_unittest.cc',
         'browser/safe_browsing/preference_validation_delegate_unittest.cc',
index 71623f4..0d89f62 100644 (file)
         "3F596D221126DCDFD115CFAA2E5A3141806358AD",  // http://crbug.com/286542
         "F7FA7ABC1ECB89BA8EE6656847EFABBF43BB9BCA",  // http://crbug.com/320952
         "4B1D0E19C6C43C008C44A8278C8B5BFE15ABEB3C",  // http://crbug.com/320952
-        "4FE45FA56EF6A25FDE8C302C44045CA9CE8A605A"   // http://crbug.com/320952
+        "4FE45FA56EF6A25FDE8C302C44045CA9CE8A605A",  // http://crbug.com/320952
+        "3D14248405B8A59043420AAC160077C99E7788A9",  // http://crbug.com/398585
+        "A6C87307BBE5886CC5F1393025000E2FE8060BF2",  // http://crbug.com/398585
+        "3407516021EA3669C0EC8E65E6B9837E5A521B9C"   // http://crbug.com/398585
       ]
     }
   ],
     "whitelist": [
       "4B1D0E19C6C43C008C44A8278C8B5BFE15ABEB3C",
       "F7FA7ABC1ECB89BA8EE6656847EFABBF43BB9BCA",
-      "4FE45FA56EF6A25FDE8C302C44045CA9CE8A605A"
+      "4FE45FA56EF6A25FDE8C302C44045CA9CE8A605A",
+      "3D14248405B8A59043420AAC160077C99E7788A9",
+      "A6C87307BBE5886CC5F1393025000E2FE8060BF2",
+      "3407516021EA3669C0EC8E65E6B9837E5A521B9C"
     ]
   },
   "mediaPlayerPrivate": {
       "4B1D0E19C6C43C008C44A8278C8B5BFE15ABEB3C", // Music Manager
       "B8F61FD1B25DE03706DBB8906A73261E4DBB992A", // Test
       "F7FA7ABC1ECB89BA8EE6656847EFABBF43BB9BCA",
-      "4FE45FA56EF6A25FDE8C302C44045CA9CE8A605A"
+      "4FE45FA56EF6A25FDE8C302C44045CA9CE8A605A",
+      "3D14248405B8A59043420AAC160077C99E7788A9",
+      "A6C87307BBE5886CC5F1393025000E2FE8060BF2",
+      "3407516021EA3669C0EC8E65E6B9837E5A521B9C"
     ]
   },
   "nativeMessaging": {
index a8a1cd5..890e75b 100644 (file)
@@ -61,6 +61,7 @@
     static void onMinimized();
     static void onMaximized();
     static void onRestored();
+    static void onAlphaEnabledChanged();
     // Only sent in tests.
     static void onWindowShownForTests();
   };
index b08037b..26922d7 100644 (file)
@@ -351,6 +351,10 @@ namespace app.window {
     // <code>"alwaysOnTopWindows"</code> permission.
     static void setAlwaysOnTop(boolean alwaysOnTop);
 
+    // Can the window use alpha transparency?
+    // TODO(jackhou): Document this properly before going to stable.
+    [nodoc] static boolean alphaEnabled();
+
     // The JavaScript 'window' object for the created child.
     [instanceOf=Window] object contentWindow;
 
@@ -433,6 +437,9 @@ namespace app.window {
     // Fired when the window is restored from being minimized or maximized.
     [nocompile] static void onRestored();
 
+    // Fired when the window's ability to use alpha transparency changes.
+    [nocompile, nodoc] static void onAlphaEnabledChanged();
+
     // Event for testing. Lets tests wait until a window has been shown.
     [nocompile, nodoc] static void onWindowFirstShown();
   };
index 3781f90..40d16c6 100644 (file)
@@ -1529,6 +1529,12 @@ const char kDownloadDefaultDirectory[] = "download.default_directory";
 // upgrade a unsafe location to a safe location.
 const char kDownloadDirUpgraded[] = "download.directory_upgrade";
 
+#if defined(OS_WIN)
+// Whether downloaded PDFs should be opened in Adobe Acrobat Reader.
+const char kOpenPdfDownloadInAdobeReader[] =
+    "download.open_pdf_in_adobe_reader";
+#endif
+
 // String which specifies where to save html files to by default.
 const char kSaveFileDefaultDirectory[] = "savefile.default_directory";
 
@@ -1643,6 +1649,9 @@ const char kDisablePluginFinder[] = "plugins.disable_plugin_finder";
 // Customized app page names that appear on the New Tab Page.
 const char kNtpAppPageNames[] = "ntp.app_page_names";
 
+// Keeps track of currently open tabs collapsed state in the Other Devices menu.
+const char kNtpCollapsedCurrentlyOpenTabs[] = "ntp.collapsed_open_tabs";
+
 // Keeps track of which sessions are collapsed in the Other Devices menu.
 const char kNtpCollapsedForeignSessions[] = "ntp.collapsed_foreign_sessions";
 
@@ -1992,6 +2001,10 @@ const char kOobeScreenPending[] = "OobeScreenPending";
 // A boolean pref of the device registered flag (second part after first login).
 const char kDeviceRegistered[] = "DeviceRegistered";
 
+// Boolean pref to signal corrupted enrollment to force the device through
+// enrollment recovery flow upon next boot.
+const char kEnrollmentRecoveryRequired[] = "EnrollmentRecoveryRequired";
+
 // List of usernames that used certificates pushed by policy before.
 // This is used to prevent these users from joining multiprofile sessions.
 const char kUsedPolicyCertificates[] = "policy.used_policy_certificates";
index bed422f..57f8f05 100644 (file)
@@ -495,6 +495,9 @@ extern const char kMemoryCacheSize[];
 extern const char kDownloadDefaultDirectory[];
 extern const char kDownloadExtensionsToOpen[];
 extern const char kDownloadDirUpgraded[];
+#if defined(OS_WIN)
+extern const char kOpenPdfDownloadInAdobeReader[];
+#endif
 
 extern const char kSaveFileDefaultDirectory[];
 extern const char kSaveFileType[];
@@ -542,6 +545,7 @@ extern const char kDisableExtensions[];
 extern const char kDisablePluginFinder[];
 
 extern const char kNtpAppPageNames[];
+extern const char kNtpCollapsedCurrentlyOpenTabs[];
 extern const char kNtpCollapsedForeignSessions[];
 extern const char kNtpCollapsedRecentlyClosedTabs[];
 extern const char kNtpCollapsedSnapshotDocument[];
@@ -693,6 +697,7 @@ extern const char kInitialLocale[];
 extern const char kOobeComplete[];
 extern const char kOobeScreenPending[];
 extern const char kDeviceRegistered[];
+extern const char kEnrollmentRecoveryRequired[];
 extern const char kUsedPolicyCertificates[];
 extern const char kServerBackedDeviceState[];
 extern const char kCustomizationDefaultWallpaperURL[];
index 2f58fd2..76133a8 100644 (file)
@@ -444,16 +444,16 @@ IPC_SYNC_MESSAGE_CONTROL4_1(ChromeViewHostMsg_GetPluginInfo,
                             std::string /* mime_type */,
                             ChromeViewHostMsg_GetPluginInfo_Output /* output */)
 
-// Returns whether any internal plugin supporting |mime_type| is registered
-// Does not determine whether the plugin can actually be instantiated
-// (e.g. whether it is allowed or has all its dependencies).
-// When the returned *|is_registered| is true, |additional_param_names| and
+// Returns whether any internal plugin supporting |mime_type| is registered and
+// enabled. Does not determine whether the plugin can actually be instantiated
+// (e.g. whether it has all its dependencies).
+// When the returned *|is_available| is true, |additional_param_names| and
 // |additional_param_values| contain the name-value pairs, if any, specified
-// for the *first* plugin found that is registered for |mime_type|.
+// for the *first* non-disabled plugin found that is registered for |mime_type|.
 IPC_SYNC_MESSAGE_CONTROL1_3(
-    ChromeViewHostMsg_IsInternalPluginRegisteredForMimeType,
+    ChromeViewHostMsg_IsInternalPluginAvailableForMimeType,
     std::string /* mime_type */,
-    bool /* registered */,
+    bool /* is_available */,
     std::vector<base::string16> /* additional_param_names */,
     std::vector<base::string16> /* additional_param_values */)
 
index 5d0afc3..284ec45 100644 (file)
@@ -110,7 +110,7 @@ message ClientMalwareRequest {
     required string url = 2;
     optional string method = 3;
     optional string referrer = 4;
-    // Resource type, the int value is a direct cast from the Type enum 
+    // Resource type, the int value is a direct cast from the Type enum
     // of ResourceType class defined in //src/webkit/commom/resource_type.h
     optional int32 resource_type = 5;
   }
@@ -380,7 +380,7 @@ message ClientIncidentReport {
     optional Machine machine = 2;
     message Process {
       optional string version = 1;
-      repeated string dlls = 2;
+      repeated string OBSOLETE_dlls = 2;
       message Patch {
         optional string function = 1;
         optional string target_dll = 2;
@@ -399,6 +399,17 @@ message ClientIncidentReport {
       optional int64 uptime_msec = 6;
       optional bool metrics_consent = 7;
       optional bool extended_consent = 8;
+      message Dll {
+        enum Feature {
+          UNKNOWN = 0;
+          LSP = 1;
+        }
+        optional string path = 1;
+        optional uint64 base_address = 2;
+        optional uint32 length = 3;
+        repeated Feature feature = 4;
+      }
+      repeated Dll dll = 9;
     }
     optional Process process = 3;
   }
index 8556201..49fd44b 100644 (file)
@@ -655,6 +655,7 @@ const size_t kNumberOfChromeHostURLs = arraysize(kChromeHostURLs);
 
 const char* const kChromeDebugURLs[] = {
   content::kChromeUICrashURL,
+  content::kChromeUIDumpURL,
   content::kChromeUIKillURL,
   content::kChromeUIHangURL,
   content::kChromeUIShorthangURL,
index d629044..6fc6246 100644 (file)
                        <real>50</real>
                </dict>
        </dict>
+       <key>rules2</key>
+       <dict>
+               <key>^PkgInfo$</key>
+               <true/>
+               <key>^MacOS/</key>
+               <true/>
+               <key>^Resources/</key>
+               <true/>
+               <key>^Versions/</key>
+               <dict>
+                       <key>omit</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>10</real>
+               </dict>
+               <key>^Versions/@VERSION_REGEX@/</key>
+               <dict>
+                       <key>nested</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>20</real>
+               </dict>
+               <key>^Resources/.+\.lproj/</key>
+               <dict>
+                       <key>optional</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>30</real>
+               </dict>
+               <key>/\.DS_Store$</key>
+               <dict>
+                       <key>omit</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>50</real>
+               </dict>
+       </dict>
 </dict>
 </plist>
index 4738ed7..326cb35 100644 (file)
@@ -45,6 +45,17 @@ helper_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper.app"
 helper_eh_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper EH.app"
 helper_np_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper NP.app"
 
+# libplugin_carbon_interpose.dylib was removed in r280670, but it's still
+# present on the 37.0.2062 branch (and earlier). Accounting for it here makes
+# it easier to merge the fix for http://crbug.com/399276 to other branches.
+#
+# TODO(mark): Remove this plugin_carbon_interpose code on the trunk as soon
+# as it lands.
+plugin_carbon_interpose="${versioned_dir}/libplugin_carbon_interpose.dylib"
+if [[ ! -e "${plugin_carbon_interpose}" ]]; then
+  plugin_carbon_interpose=
+fi
+
 requirement_string="\
 designated => \
 (identifier \"com.google.Chrome\" or identifier \"com.google.Chrome.canary\") \
@@ -62,3 +73,7 @@ codesign -v "${helper_app}"
 codesign -v "${helper_eh_app}"
 codesign -v "${helper_np_app}"
 codesign -v "${browser_app}"
+
+if [[ -n "${plugin_carbon_interpose}" ]]; then
+  codesign -v "${plugin_carbon_interpose}"
+fi
index eb3ffb0..beddbe2 100644 (file)
@@ -45,6 +45,17 @@ helper_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper.app"
 helper_eh_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper EH.app"
 helper_np_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper NP.app"
 
+# libplugin_carbon_interpose.dylib was removed in r280670, but it's still
+# present on the 37.0.2062 branch (and earlier). Accounting for it here makes
+# it easier to merge the fix for http://crbug.com/399276 to other branches.
+#
+# TODO(mark): Remove this plugin_carbon_interpose code on the trunk as soon
+# as it lands.
+plugin_carbon_interpose="${versioned_dir}/libplugin_carbon_interpose.dylib"
+if [[ ! -e "${plugin_carbon_interpose}" ]]; then
+  plugin_carbon_interpose=
+fi
+
 requirement_suffix="\
 and certificate leaf = H\"85cee8254216185620ddc8851c7a9fc4dfe120ef\"\
 "
@@ -64,8 +75,21 @@ codesign -s "${codesign_id}" --keychain "${codesign_keychain}" \
     -r="designated => identifier \"com.google.Chrome.helper.NP\" \
 ${requirement_suffix}"
 
+if [[ -n "${plugin_carbon_interpose}" ]]; then
+  plugin_carbon_interpose_identifier="com.google.Chrome.plugin_carbon_interpose"
+  codesign -s "${codesign_id}" --keychain "${codesign_keychain}" \
+      "${plugin_carbon_interpose}" \
+      -i "${plugin_carbon_interpose_identifier}" \
+      -r="designated => identifier \"${plugin_carbon_interpose_identifier}\" \
+${requirement_suffix}"
+fi
+
 # Verify everything.
 codesign -v "${framework}"
 codesign -v "${helper_app}"
 codesign -v "${helper_eh_app}"
 codesign -v "${helper_np_app}"
+
+if [[ -n "${plugin_carbon_interpose}" ]]; then
+  codesign -v "${plugin_carbon_interpose}"
+fi
index e8099fb..c15d493 100644 (file)
@@ -32,19 +32,19 @@ using content::KeySystemInfo;
 using content::SupportedCodecs;
 
 #if defined(ENABLE_PEPPER_CDMS)
-static bool IsPepperCdmRegistered(
+static bool IsPepperCdmAvailable(
     const std::string& pepper_type,
     std::vector<base::string16>* additional_param_names,
     std::vector<base::string16>* additional_param_values) {
-  bool is_registered = false;
+  bool is_available = false;
   content::RenderThread::Get()->Send(
-      new ChromeViewHostMsg_IsInternalPluginRegisteredForMimeType(
+      new ChromeViewHostMsg_IsInternalPluginAvailableForMimeType(
           pepper_type,
-          &is_registered,
+          &is_available,
           additional_param_names,
           additional_param_values));
 
-  return is_registered;
+  return is_available;
 }
 
 // External Clear Key (used for testing).
@@ -65,9 +65,9 @@ static void AddExternalClearKey(
 
   std::vector<base::string16> additional_param_names;
   std::vector<base::string16> additional_param_values;
-  if (!IsPepperCdmRegistered(kExternalClearKeyPepperType,
-                             &additional_param_names,
-                             &additional_param_values)) {
+  if (!IsPepperCdmAvailable(kExternalClearKeyPepperType,
+                            &additional_param_names,
+                            &additional_param_values)) {
     return;
   }
 
@@ -141,9 +141,9 @@ static void AddPepperBasedWidevine(
 
   std::vector<base::string16> additional_param_names;
   std::vector<base::string16> additional_param_values;
-  if (!IsPepperCdmRegistered(kWidevineCdmPluginMimeType,
-                             &additional_param_names,
-                             &additional_param_values)) {
+  if (!IsPepperCdmAvailable(kWidevineCdmPluginMimeType,
+                            &additional_param_names,
+                            &additional_param_values)) {
     DVLOG(1) << "Widevine CDM is not currently available.";
     return;
   }
index 99ca8bc..c666d32 100644 (file)
@@ -241,6 +241,9 @@ appWindow.registerCustomHook(function(bindingsAPI) {
     AppWindow.prototype.isAlwaysOnTop = function() {
       return appWindowData.alwaysOnTop;
     };
+    AppWindow.prototype.alphaEnabled = function() {
+      return appWindowData.alphaEnabled;
+    }
     AppWindow.prototype.handleWindowFirstShownForTests = function(callback) {
       // This allows test apps to get have their callback run even if they
       // call this after the first show has happened.
@@ -301,7 +304,8 @@ appWindow.registerCustomHook(function(bindingsAPI) {
       alwaysOnTop: params.alwaysOnTop,
       hasFrameColor: params.hasFrameColor,
       activeFrameColor: params.activeFrameColor,
-      inactiveFrameColor: params.inactiveFrameColor
+      inactiveFrameColor: params.inactiveFrameColor,
+      alphaEnabled: params.alphaEnabled
     };
     currentAppWindow = new AppWindow;
   });
@@ -348,6 +352,9 @@ function updateAppWindowProperties(update) {
       (oldData.minimized && !update.minimized) ||
       (oldData.maximized && !update.maximized))
     dispatchEventIfExists(currentWindow, "onRestored");
+
+  if (oldData.alphaEnabled !== update.alphaEnabled)
+    dispatchEventIfExists(currentWindow, "onAlphaEnabledChanged");
 };
 
 function onAppWindowShownForTests() {
index 81b5d3f..ad90bfc 100644 (file)
@@ -19,6 +19,8 @@ var WEB_VIEW_ATTRIBUTE_MINHEIGHT = 'minheight';
 var WEB_VIEW_ATTRIBUTE_MINWIDTH = 'minwidth';
 var WEB_VIEW_ATTRIBUTE_PARTITION = 'partition';
 
+var PLUGIN_METHOD_ATTACH = '-internal-attach';
+
 var ERROR_MSG_ALREADY_NAVIGATED =
     'The object has already navigated, so its partition cannot be changed.';
 var ERROR_MSG_INVALID_PARTITION_ATTRIBUTE = 'Invalid partition attribute.';
@@ -87,6 +89,11 @@ function WebViewInternal(webviewNode) {
 
   this.beforeFirstNavigation = true;
   this.validPartitionId = true;
+  // Used to save some state upon deferred attachment.
+  // If <object> bindings is not available, we defer attachment.
+  // This state contains whether or not the attachment request was for
+  // newwindow.
+  this.deferredAttachState = null;
 
   // on* Event handlers.
   this.on = {};
@@ -494,7 +501,25 @@ WebViewInternal.prototype.handleWebviewAttributeMutation =
  * @private
  */
 WebViewInternal.prototype.handleBrowserPluginAttributeMutation =
-    function(name, newValue) {
+    function(name, oldValue, newValue) {
+  if (name == 'internalbindings' && !oldValue && newValue) {
+    this.browserPluginNode.removeAttribute('internalbindings');
+
+    if (this.deferredAttachState) {
+      var self = this;
+      // A setTimeout is necessary for the binding to be initialized properly.
+      window.setTimeout(function() {
+        if (self.hasBindings()) {
+          var params = self.buildAttachParams(
+              self.deferredAttachState.isNewWindow);
+          self.browserPluginNode[PLUGIN_METHOD_ATTACH](self.instanceId, params);
+          self.deferredAttachState = null;
+        }
+      }, 0);
+    }
+    return;
+  }
+
   // This observer monitors mutations to attributes of the BrowserPlugin and
   // updates the <webview> attributes accordingly.
   // |newValue| is null if the attribute |name| has been removed.
@@ -570,6 +595,12 @@ WebViewInternal.prototype.onSizeChanged = function(newWidth, newHeight) {
   }
 };
 
+// Returns true if Browser Plugin bindings is available.
+// Bindings are unavailable if <object> is not in the render tree.
+WebViewInternal.prototype.hasBindings = function() {
+  return 'function' == typeof this.browserPluginNode[PLUGIN_METHOD_ATTACH];
+};
+
 WebViewInternal.prototype.hasNavigated = function() {
   return !this.beforeFirstNavigation;
 };
@@ -616,10 +647,9 @@ WebViewInternal.prototype.allocateInstanceId = function() {
   var self = this;
   GuestViewInternal.allocateInstanceId(
       function(instanceId) {
-        self.instanceId = instanceId;
         // TODO(lazyboy): Make sure this.autoNavigate_ stuff correctly updated
         // |self.src| at this point.
-        self.attachWindowAndSetUpEvents(self.instanceId, self.src);
+        self.attachWindow(instanceId, false);
       });
 };
 
@@ -704,25 +734,34 @@ WebViewInternal.prototype.setUserAgentOverride = function(userAgentOverride) {
   WebView.overrideUserAgent(this.instanceId, userAgentOverride);
 };
 
-/** @private */
-WebViewInternal.prototype.attachWindowAndSetUpEvents = function(
-    instanceId, opt_src, opt_partitionId) {
-  this.instanceId = instanceId;
-  // If we have a partition from the opener, use that instead.
-  var storagePartitionId =
-      opt_partitionId ||
-      this.webviewNode.getAttribute(WEB_VIEW_ATTRIBUTE_PARTITION) ||
-      this.webviewNode[WEB_VIEW_ATTRIBUTE_PARTITION];
+WebViewInternal.prototype.buildAttachParams = function(isNewWindow) {
   var params = {
     'api': 'webview',
     'instanceId': this.viewInstanceId,
     'name': this.name,
-    'src': opt_src,
-    'storagePartitionId': storagePartitionId,
+    // We don't need to navigate new window from here.
+    'src': isNewWindow ? undefined : this.src,
+    // If we have a partition from the opener, that will also be already
+    // set via this.onAttach().
+    'storagePartitionId': this.partition.toAttribute(),
     'userAgentOverride': this.userAgentOverride
   };
+  return params;
+};
+
+WebViewInternal.prototype.attachWindow = function(instanceId, isNewWindow) {
+  this.instanceId = instanceId;
+  var params = this.buildAttachParams(isNewWindow);
+
+  if (!this.hasBindings()) {
+    // No bindings means that the plugin isn't there (display: none), we defer
+    // attachWindow in this case.
+    this.deferredAttachState = {isNewWindow: isNewWindow};
+    return false;
+  }
 
-  return this.browserPluginNode['-internal-attach'](this.instanceId, params);
+  this.deferredAttachState = null;
+  return this.browserPluginNode[PLUGIN_METHOD_ATTACH](this.instanceId, params);
 };
 
 // Registers browser plugin <object> custom element.
@@ -741,7 +780,7 @@ function registerBrowserPluginElement() {
     if (!internal) {
       return;
     }
-    internal.handleBrowserPluginAttributeMutation(name, newValue);
+    internal.handleBrowserPluginAttributeMutation(name, oldValue, newValue);
   };
 
   proto.attachedCallback = function() {
index 441e623..ed56dfa 100644 (file)
@@ -427,13 +427,12 @@ WebViewEvents.prototype.handleNewWindowEvent = function(event, webViewEvent) {
       // asynchronously.
       setTimeout(function() {
         var webViewInternal = privates(webview).internal;
+        // Update the partition.
         if (event.storagePartitionId) {
           webViewInternal.onAttach(event.storagePartitionId);
         }
 
-        var attached =
-            webViewInternal.attachWindowAndSetUpEvents(
-                event.windowId, undefined, event.storagePartitionId);
+        var attached = webViewInternal.attachWindow(event.windowId, true);
 
         if (!attached) {
           window.console.error(ERROR_MSG_NEWWINDOW_UNABLE_TO_ATTACH);
index 9e40a65..ca239cd 100644 (file)
@@ -6,7 +6,6 @@
 
 #include "base/path_service.h"
 #include "base/process/process_handle.h"
-#include "base/metrics/stats_table.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/common/chrome_content_client.h"
@@ -98,12 +97,6 @@ void ChromeUnitTestSuite::Initialize() {
   InitializeProviders();
   RegisterInProcessThreads();
 
-  // Create an anonymous stats table since we don't need to share between
-  // processes.
-  stats_table_.reset(
-      new base::StatsTable(base::StatsTable::TableIdentifier(), 20, 200));
-  base::StatsTable::set_current(stats_table_.get());
-
   ChromeTestSuite::Initialize();
 
   // This needs to run after ChromeTestSuite::Initialize which calls content's
@@ -113,10 +106,6 @@ void ChromeUnitTestSuite::Initialize() {
 
 void ChromeUnitTestSuite::Shutdown() {
   ResourceBundle::CleanupSharedInstance();
-
-  base::StatsTable::set_current(NULL);
-  stats_table_.reset();
-
   ChromeTestSuite::Shutdown();
 }
 
index 0ac9eb4..1c1ddbd 100644 (file)
 #include "base/files/file_path.h"
 #include "chrome/test/base/chrome_test_suite.h"
 
-namespace base {
-class StatsTable;
-}
-
 // Test suite for unit tests. Creates additional stub services that are not
 // needed for browser tests (e.g. a TestingBrowserProcess).
 class ChromeUnitTestSuite : public ChromeTestSuite {
@@ -32,7 +28,6 @@ class ChromeUnitTestSuite : public ChromeTestSuite {
   static void InitializeResourceBundle();
 
  private:
-  scoped_ptr<base::StatsTable> stats_table_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeUnitTestSuite);
 };
index a6e2e8d..b902f86 100644 (file)
@@ -108,7 +108,7 @@ chrome.test.runTests([
     chrome.tabs.create({url:"chrome://version"}, function(tab) {
       var debuggee = {tabId: tab.id};
       chrome.debugger.attach(debuggee, protocolVersion,
-          fail("Can not attach to the page with the \"chrome://\" scheme."));
+          fail("Cannot access a chrome:// URL"));
       chrome.tabs.remove(tab.id);
     });
   },
index eabcada..79d521d 100644 (file)
@@ -340,6 +340,58 @@ function testChromeExtensionRelativePath() {
   document.body.appendChild(webview);
 }
 
+// Tests that a <webview> that starts with "display: none" style loads
+// properly.
+function testDisplayNoneWebviewLoad() {
+  var webview = document.createElement('webview');
+  var visible = false;
+  webview.style.display = 'none';
+  // foobar is a privileged partition according to the manifest file.
+  webview.partition = 'foobar';
+  webview.addEventListener('loadabort', function(e) {
+    embedder.test.fail();
+  });
+  webview.addEventListener('loadstop', function(e) {
+    embedder.test.assertTrue(visible);
+    embedder.test.succeed();
+  });
+  // Set the .src while we are "display: none".
+  webview.setAttribute('src', 'about:blank');
+  document.body.appendChild(webview);
+
+  setTimeout(function() {
+    visible = true;
+    // This should trigger loadstop.
+    webview.style.display = '';
+  }, 0);
+}
+
+function testDisplayNoneWebviewRemoveChild() {
+  var webview = document.createElement('webview');
+  var visibleAndInDOM = false;
+  webview.style.display = 'none';
+  // foobar is a privileged partition according to the manifest file.
+  webview.partition = 'foobar';
+  webview.addEventListener('loadabort', function(e) {
+    embedder.test.fail();
+  });
+  webview.addEventListener('loadstop', function(e) {
+    embedder.test.assertTrue(visibleAndInDOM);
+    embedder.test.succeed();
+  });
+  // Set the .src while we are "display: none".
+  webview.setAttribute('src', 'about:blank');
+  document.body.appendChild(webview);
+
+  setTimeout(function() {
+    webview.parentNode.removeChild(webview);
+    webview.style.display = '';
+    visibleAndInDOM = true;
+    // This should trigger loadstop.
+    document.body.appendChild(webview);
+  }, 0);
+}
+
 // Makes sure inline scripts works inside guest that was loaded from
 // accessible_resources.
 function testInlineScriptFromAccessibleResources() {
@@ -1685,6 +1737,8 @@ embedder.test.testList = {
   'testAPIMethodExistence': testAPIMethodExistence,
   'testChromeExtensionURL': testChromeExtensionURL,
   'testChromeExtensionRelativePath': testChromeExtensionRelativePath,
+  'testDisplayNoneWebviewLoad': testDisplayNoneWebviewLoad,
+  'testDisplayNoneWebviewRemoveChild': testDisplayNoneWebviewRemoveChild,
   'testInlineScriptFromAccessibleResources':
       testInlineScriptFromAccessibleResources,
   'testInvalidChromeExtensionURL': testInvalidChromeExtensionURL,
index eeb3d8e..264ddb9 100644 (file)
@@ -367,10 +367,12 @@ FILES = [
   {
     'filename': 'libEGL.dll',
     'buildtype': ['dev', 'official'],
+    'filegroup': ['default', 'symsrc'],
   },
   {
     'filename': 'libGLESv2.dll',
     'buildtype': ['dev', 'official'],
+    'filegroup': ['default', 'symsrc'],
   },
   # XInput files:
   {
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/D3DCompiler_42.dll b/src/chrome/tools/test/reference_build/chrome_linux/D3DCompiler_42.dll
deleted file mode 100644 (file)
index 2a0aa66..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/D3DCompiler_42.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/First Run b/src/chrome/tools/test/reference_build/chrome_linux/First Run
deleted file mode 100755 (executable)
index 852ad16..0000000
+++ /dev/null
@@ -1 +0,0 @@
-krome \r
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/PepperFlash/libpepflashplayer.so b/src/chrome/tools/test/reference_build/chrome_linux/PepperFlash/libpepflashplayer.so
new file mode 100755 (executable)
index 0000000..80a37f3
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/PepperFlash/libpepflashplayer.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/PepperFlash/manifest.json b/src/chrome/tools/test/reference_build/chrome_linux/PepperFlash/manifest.json
new file mode 100644 (file)
index 0000000..8316477
--- /dev/null
@@ -0,0 +1,50 @@
+{
+    "description": "Pepper Flash Player", 
+    "name": "Flapper", 
+    "version": "13.0.0.214", 
+    "x-flapper-revision": "1261496", 
+    "x-ppapi-arch": "x64", 
+    "x-ppapi-os": "linux", 
+    "x-ppapi-required-interfaces": [
+        "PPB_AudioConfig;1.1|PPB_AudioConfig;1.0", 
+        "PPB_AudioInput(Dev);0.4|PPB_AudioInput(Dev);0.3", 
+        "PPB_Audio;1.0", 
+        "PPB_BrowserFont_Trusted;1.0", 
+        "PPB_Buffer(Dev);0.4", 
+        "PPB_CharSet(Dev);0.4", 
+        "PPB_Core;1.0", 
+        "PPB_Crypto(Dev);0.1", 
+        "PPB_CursorControl(Dev);0.4", 
+        "PPB_FileChooser(Dev);0.6|PPB_FileChooser(Dev);0.5", 
+        "PPB_FileChooserTrusted;0.6|PPB_FileChooserTrusted;0.5", 
+        "PPB_FileRef;1.0", 
+        "PPB_Flash_Clipboard;5.0|PPB_Flash_Clipboard;4.0", 
+        "PPB_Flash_File_FileRef;2", 
+        "PPB_Flash_File_ModuleLocal;3", 
+        "PPB_Flash_FontFile;0.1|PPB_PDF;1", 
+        "PPB_FlashFullscreen;1.0|PPB_FlashFullscreen;0.1", 
+        "PPB_Flash;13.0|PPB_Flash;12.6|PPB_Flash;12.5|PPB_Flash;12.4", 
+        "PPB_Flash_Menu;0.2", 
+        "PPB_Graphics2D;1.0", 
+        "PPB_Graphics3D;1.0", 
+        "PPB_ImageData;1.0", 
+        "PPB_IMEInputEvent(Dev);0.2|PPB_IMEInputEvent(Dev);0.1", 
+        "PPB_InputEvent;1.0", 
+        "PPB_Instance;1.0", 
+        "PPB_Memory(Dev);0.1", 
+        "PPB_NetAddress_Private;1.1|PPB_NetAddress_Private;1.0|PPB_NetAddress_Private;0.1", 
+        "PPB_OpenGLES2ChromiumMapSub;1.0|PPB_OpenGLES2ChromiumMapSub(Dev);1.0|PPB_GLESChromiumTextureMapping(Dev);0.1", 
+        "PPB_OpenGLES2;1.0", 
+        "PPB_TCPSocket_Private;0.4|PPB_TCPSocket_Private;0.3", 
+        "PPB_TextInput(Dev);0.2|PPB_TextInput(Dev);0.1", 
+        "PPB_UDPSocket_Private;0.4|PPB_UDPSocket_Private;0.3", 
+        "PPB_URLLoader;1.0", 
+        "PPB_URLLoaderTrusted;0.3", 
+        "PPB_URLRequestInfo;1.0", 
+        "PPB_URLResponseInfo;1.0", 
+        "PPB_URLUtil(Dev);0.7|PPB_URLUtil(Dev);0.6", 
+        "PPB_Var;1.1|PPB_Var;1.0", 
+        "PPB_VideoCapture(Dev);0.3", 
+        "PPB_View;1.0"
+    ]
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/avcodec-52.dll b/src/chrome/tools/test/reference_build/chrome_linux/avcodec-52.dll
deleted file mode 100755 (executable)
index 433efbe..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/avcodec-52.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/avformat-52.dll b/src/chrome/tools/test/reference_build/chrome_linux/avformat-52.dll
deleted file mode 100755 (executable)
index fa2e000..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/avformat-52.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/avutil-50.dll b/src/chrome/tools/test/reference_build/chrome_linux/avutil-50.dll
deleted file mode 100755 (executable)
index f01f3f3..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/avutil-50.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome b/src/chrome/tools/test/reference_build/chrome_linux/chrome
new file mode 100755 (executable)
index 0000000..927bc87
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/chrome differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome-wrapper b/src/chrome/tools/test/reference_build/chrome_linux/chrome-wrapper
new file mode 100755 (executable)
index 0000000..31025de
--- /dev/null
@@ -0,0 +1,163 @@
+#!/bin/bash
+
+# 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.
+
+# Running Chromium via this script makes it possible to set Chromium as the
+# default browser directly out of a compile, without needing to package it.
+
+DESKTOP="chromium-devel"
+TITLE="Chromium"
+
+usage() {
+  echo "$0 [--gdb] [--help] [--man-page] [--] [chrome-options]"
+  echo
+  echo "        --gdb                   Start within gdb"
+  echo "        --help                  This help screen"
+  echo "        --man-page              Open the man page in the tree"
+}
+
+# Check to see if there is a desktop file of the given name.
+exists_desktop_file() {
+    # Build a search list from $XDG_DATA_HOME and $XDG_DATA_DIRS, the latter
+    # of which can itself be a colon-separated list of directories to search.
+    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" -a -d "$dir/applications" ] || continue
+        [ -r "$dir/applications/$DESKTOP.desktop" ] && return
+    done
+    # Didn't find it in the search path.
+    return 1
+}
+
+# Checks a file to see if it's a 32 or 64-bit.
+check_executable() {
+    out=$(file $(readlink -f $1) 2> /dev/null)
+    echo $out | grep -qs "ELF 32-bit LSB"
+    if [ $? = 0 ]; then
+        echo 32
+        return
+    fi
+    echo $out | grep -qs "ELF 64-bit LSB"
+    if [ $? = 0 ]; then
+        echo 64
+        return
+    fi
+    echo neither
+}
+
+# Generate a desktop file that will run this script.
+generate_desktop_file() {
+    apps="${XDG_DATA_HOME:-$HOME/.local/share}/applications"
+    mkdir -p "$apps"
+    cat > "$apps/$DESKTOP.desktop" << EOF
+[Desktop Entry]
+Version=1.0
+Encoding=UTF-8
+Name=$TITLE
+Exec=$CHROME_WRAPPER %U
+Terminal=false
+Icon=$HERE/product_logo_48.png
+Type=Application
+Categories=Application;Network;WebBrowser;
+MimeType=text/html;text/xml;application/xhtml_xml;
+EOF
+}
+
+# Let the wrapped binary know that it has been run through the wrapper.
+export CHROME_WRAPPER="`readlink -f "$0"`"
+export CHROME_DESKTOP="$DESKTOP.desktop"
+
+HERE="`dirname "$CHROME_WRAPPER"`"
+
+# We include some xdg utilities next to the binary, and we want to prefer them
+# over the system versions when we know the system versions are very old. We
+# detect whether the system xdg utilities are sufficiently new to be likely to
+# work for us by looking for xdg-settings. If we find it, we leave $PATH alone,
+# so that the system xdg utilities (including any distro patches) will be used.
+if ! which xdg-settings &> /dev/null; then
+  # Old xdg utilities. Prepend $HERE to $PATH to use ours instead.
+  export PATH="$HERE:$PATH"
+else
+  # Use system xdg utilities. But first create mimeapps.list if it doesn't
+  # exist; some systems have bugs in xdg-mime that make it fail without it.
+  xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}"
+  mkdir -p "$xdg_app_dir"
+  [ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list"
+fi
+
+# Always use our ffmpeg and other shared libs.
+export LD_LIBRARY_PATH="$HERE:$HERE/lib:$HERE/lib.target${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
+
+MISSING_LIBS=$(ldd "$HERE/chrome" 2> /dev/null |grep "not found$" | cut -d" " -f 1|sed 's/\t//')
+CHROME_ARCH=$(check_executable "$HERE/chrome")
+uname -m | grep -qs x86_64
+if [ $? = 1 ]; then
+    LIBDIRS="/lib /lib32 /usr/lib /usr/lib32"
+else
+    LIBDIRS="/lib64 /lib /usr/lib64 /usr/lib"
+fi
+
+echo $MISSING_LIBS | grep -qs libbz2.so.1.0
+if [ $? = 0 ]; then
+    for dir in $LIBDIRS
+    do
+        if [ -e "$dir/libbz2.so.1" ]; then
+            LIB_ARCH=$(check_executable "$dir/libbz2.so.1")
+            if [ "$CHROME_ARCH" = "$LIB_ARCH" ]; then
+                ln -snf "$dir/libbz2.so.1" "$HERE/libbz2.so.1.0"
+                break;
+            fi
+        fi
+    done
+fi
+
+for lib in libnspr4.so.0d libnss3.so.1d libnssutil3.so.1d libplc4.so.0d libplds4.so.0d libsmime3.so.1d libssl3.so.1d
+do
+    echo $MISSING_LIBS | grep -qs $lib
+    if [ $? = 0 ]; then
+        reallib=$(echo $lib | sed 's/\.[01]d$//')
+        for dir in $LIBDIRS
+        do
+            if [ -e "$dir/$reallib" ]; then
+                LIB_ARCH=$(check_executable "$dir/$reallib")
+                if [ "$CHROME_ARCH" = "$LIB_ARCH" ]; then
+                    ln -snf "$dir/$reallib" "$HERE/$lib"
+                    break;
+                fi
+            fi
+        done
+    fi
+done
+
+# Custom version string for this release. This can be used to add a downstream
+# vendor string or release channel information.
+export CHROME_VERSION_EXTRA="custom"
+
+exists_desktop_file || generate_desktop_file
+
+CMD_PREFIX=
+ARGS=()
+while [ "$#" -gt 0 ]; do
+    case "$1" in
+    "--")
+        shift
+        break ;;
+    "--gdb")
+        CMD_PREFIX="gdb --args" ;;
+    "--help")
+        usage
+        exit 0 ;;
+    "--man-page")
+        exec man "$HERE/../../chrome/app/resources/manpage.1.in" ;;
+    *)
+        ARGS=( "${ARGS[@]}" "$1" ) ;;
+    esac
+    shift
+done
+set -- "${ARGS[@]}" "$@"
+
+exec $CMD_PREFIX "$HERE/chrome" "$@"
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome.1 b/src/chrome/tools/test/reference_build/chrome_linux/chrome.1
new file mode 100644 (file)
index 0000000..9989321
--- /dev/null
@@ -0,0 +1,166 @@
+." This file is processed by chrome.gyp to generate manpages in the
+." build diretory.
+.TH google-chrome 1 "" "" "USER COMMANDS"
+
+.SH NAME
+google-chrome \- the web browser from Google
+
+.SH SYNOPSIS
+.B google-chrome
+[\fIOPTION\fR] [\fIPATH\fR|\fIURL\fR]
+
+.SH DESCRIPTION
+See the Google Chrome help center for help on using the browser.
+.IP
+<http://www.google.com/support/chrome/>
+.PP
+This manpage only describes invocation, environment, and arguments.
+
+.SH OPTIONS
+Google Chrome has hundreds of undocumented command-line flags that are added
+and removed at the whim of the developers.  Here, we document relatively
+stable flags.
+.TP
+\fB\-\-user\-data\-dir\fR=\fIDIR\fR
+Specifies the directory that user data (your "profile") is kept in.
+Defaults to
+.I ~/.config/google-chrome .
+Separate instances of Google Chrome must use separate user data directories;
+repeated invocations of google-chrome will reuse an existing process for
+a given user data directory.
+
+.TP
+\fB\-\-app\fR=\fIURL\fR
+Runs
+.I URL
+in "app mode": with no browser toolbars.
+
+.TP
+\fB\-\-incognito\fR
+Open in incognito mode.
+
+.TP
+\fB\-\-proxy-server\fR=\fIhost:port\fR
+Specify the HTTP/SOCKS4/SOCKS5 proxy server to use for requests.  This
+overrides any environment variables or settings picked via the options dialog.
+An individual proxy server is specified using the format:
+
+  [<proxy-scheme>://]<proxy-host>[:<proxy-port>]
+
+Where <proxy-scheme> is the protocol of the proxy server, and is one of:
+
+  "http", "socks", "socks4", "socks5".
+
+If the <proxy-scheme> is omitted, it defaults to "http". Also note that
+"socks" is equivalent to "socks5".
+
+Examples:
+
+  --proxy-server="foopy:99"
+      Use the HTTP proxy "foopy:99" to load all URLs.
+
+  --proxy-server="socks://foobar:1080"
+      Use the SOCKS v5 proxy "foobar:1080" to load all URLs.
+
+  --proxy-server="socks4://foobar:1080"
+      Use the SOCKS v4 proxy "foobar:1080" to load all URLs.
+
+  --proxy-server="socks5://foobar:66"
+      Use the SOCKS v5 proxy "foobar:66" to load all URLs.
+
+It is also possible to specify a separate proxy server for different URL types,
+by prefixing the proxy server specifier with a URL specifier:
+
+Example:
+
+  --proxy-server="https=proxy1:80;http=socks4://baz:1080"
+      Load https://* URLs using the HTTP proxy "proxy1:80". And load http://*
+      URLs using the SOCKS v4 proxy "baz:1080".
+
+.TP
+\fB\-\-no-proxy-server\fR
+Disables the proxy server.  Overrides any environment variables or
+settings picked via the options dialog.
+
+.TP
+\fB\-\-proxy-auto-detect\fR
+Autodetect proxy configuration.  Overrides any environment variables
+or settings picked via the options dialog.
+
+.TP
+\fB\-\-proxy-pac-url\fR=\fIURL\fR
+Specify proxy autoconfiguration URL.  Overrides any environment variables
+or settings picked via the options dialog.
+
+.TP
+\fB\-\-password-store\fR=<\fIbasic\fR|\fIgnome\fR|\fIkwallet\fR>
+Set the password store to use.  The default is to automatically detect based
+on the desktop environment.  \fIbasic\fR selects the built in, unencrypted
+password store.  \fIgnome\fR selects Gnome keyring.  \fIkwallet\fR selects
+(KDE) KWallet.  (Note that KWallet may not work reliably outside KDE.)
+
+.TP
+\fB\-\-version\fR
+Show version information.
+
+.PP
+As a GTK+ app, Google Chrome also obeys GTK+ command-line flags, such
+as
+.BR \-\-display .
+See the GTK documentation for more:
+.IP
+<http://library.gnome.org/devel/gtk/stable/gtk-running.html>
+<http://library.gnome.org/devel/gtk/stable/gtk-x11.html>
+
+.SH ENVIRONMENT
+Google Chrome obeys the following environment variables:
+
+.TP
+.B all_proxy
+Shorthand for specifying all of
+.B http_proxy, https_proxy, ftp_proxy
+
+.TP
+.B http_proxy, https_proxy, ftp_proxy
+The proxy servers used for HTTP, HTTPS, and FTP.
+.I Note:
+because Gnome/KDE proxy settings may propagate into these variables
+in some terminals, this variable is ignored (in preference for actual
+system proxy settings) when running under Gnome or KDE.  Use the
+command-line flags to set these when you want to force their values.
+
+.TP
+.B auto_proxy
+Specify proxy autoconfiguration.  Defined and empty autodetects; otherwise,
+it should be an autoconfig URL.  But see above note about Gnome/KDE.
+
+.TP
+.B SOCKS_SERVER
+SOCKS proxy server (defaults to SOCKS v4, also set
+.B SOCKS_VERSION=5
+to use SOCKS v5).
+
+.TP
+.B no_proxy
+Comma separated list of hosts or patterns to bypass proxying.
+
+.SH FILES
+.TP
+.I ~/.config/google-chrome
+Default directory for configuration data.
+
+.TP
+.I ~/.cache/google-chrome
+Default directory for cache data.  (Why?  See
+<http://standards.freedesktop.org/basedir-spec/latest/> .)
+
+.SH BUGS
+Bug tracker:
+.IP
+http://code.google.com/p/chromium/issues/list
+.PP
+Be sure to do your search within "All Issues" before reporting bugs,
+and be sure to pick the "Defect on Linux" template when filing a new one.
+
+.SH AUTHOR
+The Chromium team \- <http://www.chromium.org>
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome.dll b/src/chrome/tools/test/reference_build/chrome_linux/chrome.dll
deleted file mode 100755 (executable)
index cf880bb..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/chrome.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome.exe b/src/chrome/tools/test/reference_build/chrome_linux/chrome.exe
deleted file mode 100755 (executable)
index 86f6165..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/chrome.exe and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome_100_percent.pak b/src/chrome/tools/test/reference_build/chrome_linux/chrome_100_percent.pak
new file mode 100644 (file)
index 0000000..4cbfbcc
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/chrome_100_percent.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome_dll.pdb b/src/chrome/tools/test/reference_build/chrome_linux/chrome_dll.pdb
deleted file mode 100755 (executable)
index 9275d9b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/chrome_dll.pdb and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome_exe.pdb b/src/chrome/tools/test/reference_build/chrome_linux/chrome_exe.pdb
deleted file mode 100755 (executable)
index ec8beff..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/chrome_exe.pdb and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/chrome_sandbox b/src/chrome/tools/test/reference_build/chrome_linux/chrome_sandbox
new file mode 100755 (executable)
index 0000000..5f50979
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/chrome_sandbox differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/crash_service.exe b/src/chrome/tools/test/reference_build/chrome_linux/crash_service.exe
deleted file mode 100755 (executable)
index 82276db..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/crash_service.exe and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/d3dx9_42.dll b/src/chrome/tools/test/reference_build/chrome_linux/d3dx9_42.dll
deleted file mode 100644 (file)
index bf446db..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/d3dx9_42.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/gears.dll b/src/chrome/tools/test/reference_build/chrome_linux/gears.dll
deleted file mode 100755 (executable)
index 83bccd5..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/gears.dll and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
similarity index 60%
rename from src/chrome/tools/test/reference_build/chrome_linux/icudt42.dll
rename to src/chrome/tools/test/reference_build/chrome_linux/icudtl.dat
index d61ac0b..43f1f6c
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/icudt42.dll and b/src/chrome/tools/test/reference_build/chrome_linux/icudtl.dat differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/apt.include b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/apt.include
new file mode 100644 (file)
index 0000000..50f1b6d
--- /dev/null
@@ -0,0 +1,200 @@
+@@include@@variables.include
+
+APT_GET="`which apt-get 2> /dev/null`"
+APT_CONFIG="`which apt-config 2> /dev/null`"
+
+SOURCES_PREAMBLE="### THIS FILE IS AUTOMATICALLY CONFIGURED ###
+# You may comment out this entry, but any other modifications may be lost.\n"
+
+# Parse apt configuration and return requested variable value.
+apt_config_val() {
+  APTVAR="$1"
+  if [ -x "$APT_CONFIG" ]; then
+    "$APT_CONFIG" dump | sed -e "/^$APTVAR /"'!d' -e "s/^$APTVAR \"\(.*\)\".*/\1/"
+  fi
+}
+
+# Install the repository signing key (see also:
+# http://www.google.com/linuxrepositories/aboutkey.html)
+install_key() {
+  APT_KEY="`which apt-key 2> /dev/null`"
+  if [ -x "$APT_KEY" ]; then
+    "$APT_KEY" add - >/dev/null 2>&1 <<KEYDATA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2.2 (GNU/Linux)
+
+mQGiBEXwb0YRBADQva2NLpYXxgjNkbuP0LnPoEXruGmvi3XMIxjEUFuGNCP4Rj/a
+kv2E5VixBP1vcQFDRJ+p1puh8NU0XERlhpyZrVMzzS/RdWdyXf7E5S8oqNXsoD1z
+fvmI+i9b2EhHAA19Kgw7ifV8vMa4tkwslEmcTiwiw8lyUl28Wh4Et8SxzwCggDcA
+feGqtn3PP5YAdD0km4S4XeMEAJjlrqPoPv2Gf//tfznY2UyS9PUqFCPLHgFLe80u
+QhI2U5jt6jUKN4fHauvR6z3seSAsh1YyzyZCKxJFEKXCCqnrFSoh4WSJsbFNc4PN
+b0V0SqiTCkWADZyLT5wll8sWuQ5ylTf3z1ENoHf+G3um3/wk/+xmEHvj9HCTBEXP
+78X0A/0Tqlhc2RBnEf+AqxWvM8sk8LzJI/XGjwBvKfXe+l3rnSR2kEAvGzj5Sg0X
+4XmfTg4Jl8BNjWyvm2Wmjfet41LPmYJKsux3g0b8yzQxeOA4pQKKAU3Z4+rgzGmf
+HdwCG5MNT2A5XxD/eDd+L4fRx0HbFkIQoAi1J3YWQSiTk15fw7RMR29vZ2xlLCBJ
+bmMuIExpbnV4IFBhY2thZ2UgU2lnbmluZyBLZXkgPGxpbnV4LXBhY2thZ2VzLWtl
+eW1hc3RlckBnb29nbGUuY29tPohjBBMRAgAjAhsDBgsJCAcDAgQVAggDBBYCAwEC
+HgECF4AFAkYVdn8CGQEACgkQoECDD3+sWZHKSgCfdq3HtNYJLv+XZleb6HN4zOcF
+AJEAniSFbuv8V5FSHxeRimHx25671az+uQINBEXwb0sQCACuA8HT2nr+FM5y/kzI
+A51ZcC46KFtIDgjQJ31Q3OrkYP8LbxOpKMRIzvOZrsjOlFmDVqitiVc7qj3lYp6U
+rgNVaFv6Qu4bo2/ctjNHDDBdv6nufmusJUWq/9TwieepM/cwnXd+HMxu1XBKRVk9
+XyAZ9SvfcW4EtxVgysI+XlptKFa5JCqFM3qJllVohMmr7lMwO8+sxTWTXqxsptJo
+pZeKz+UBEEqPyw7CUIVYGC9ENEtIMFvAvPqnhj1GS96REMpry+5s9WKuLEaclWpd
+K3krttbDlY1NaeQUCRvBYZ8iAG9YSLHUHMTuI2oea07Rh4dtIAqPwAX8xn36JAYG
+2vgLAAMFB/wKqaycjWAZwIe98Yt0qHsdkpmIbarD9fGiA6kfkK/UxjL/k7tmS4Vm
+CljrrDZkPSQ/19mpdRcGXtb0NI9+nyM5trweTvtPw+HPkDiJlTaiCcx+izg79Fj9
+KcofuNb3lPdXZb9tzf5oDnmm/B+4vkeTuEZJ//IFty8cmvCpzvY+DAz1Vo9rA+Zn
+cpWY1n6z6oSS9AsyT/IFlWWBZZ17SpMHu+h4Bxy62+AbPHKGSujEGQhWq8ZRoJAT
+G0KSObnmZ7FwFWu1e9XFoUCt0bSjiJWTIyaObMrWu/LvJ3e9I87HseSJStfw6fki
+5og9qFEkMrIrBCp3QGuQWBq/rTdMuwNFiEkEGBECAAkFAkXwb0sCGwwACgkQoECD
+D3+sWZF/WACfeNAu1/1hwZtUo1bR+MWiCjpvHtwAnA1R3IHqFLQ2X3xJ40XPuAyY
+/FJG
+=Quqp
+-----END PGP PUBLIC KEY BLOCK-----
+KEYDATA
+  fi
+}
+
+# Set variables for the locations of the apt sources lists.
+find_apt_sources() {
+  APTDIR=$(apt_config_val Dir)
+  APTETC=$(apt_config_val 'Dir::Etc')
+  APT_SOURCES="$APTDIR$APTETC$(apt_config_val 'Dir::Etc::sourcelist')"
+  APT_SOURCESDIR="$APTDIR$APTETC$(apt_config_val 'Dir::Etc::sourceparts')"
+}
+
+# Update the Google repository if it's not set correctly.
+# Note: this doesn't necessarily enable the repository, it just makes sure the
+# correct settings are available in the sources list.
+# Returns:
+# 0 - no update necessary
+# 2 - error
+update_bad_sources() {
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  find_apt_sources
+
+  SOURCELIST="$APT_SOURCESDIR/@@PACKAGE@@.list"
+  # Don't do anything if the file isn't there, since that probably means the
+  # user disabled it.
+  if [ ! -r "$SOURCELIST" ]; then
+    return 0
+  fi
+
+  # Basic check for active configurations (non-blank, non-comment lines).
+  ACTIVECONFIGS=$(grep -v "^[[:space:]]*\(#.*\)\?$" "$SOURCELIST" 2>/dev/null)
+
+  # Check if the correct repository configuration is in there.
+  REPOMATCH=$(grep "^[[:space:]#]*\b$REPOCONFIG\b" "$SOURCELIST" \
+    2>/dev/null)
+
+  # Check if the correct repository is disabled.
+  MATCH_DISABLED=$(echo "$REPOMATCH" | grep "^[[:space:]]*#" 2>/dev/null)
+
+  # Now figure out if we need to fix things.
+  BADCONFIG=1
+  if [ "$REPOMATCH" ]; then
+    # If it's there and active, that's ideal, so nothing to do.
+    if [ ! "$MATCH_DISABLED" ]; then
+      BADCONFIG=0
+    else
+      # If it's not active, but neither is anything else, that's fine too.
+      if [ ! "$ACTIVECONFIGS" ]; then
+        BADCONFIG=0
+      fi
+    fi
+  fi
+
+  if [ $BADCONFIG -eq 0 ]; then
+    return 0
+  fi
+
+  # At this point, either the correct configuration is completely missing, or
+  # the wrong configuration is active. In that case, just abandon the mess and
+  # recreate the file with the correct configuration. If there were no active
+  # configurations before, create the new configuration disabled.
+  DISABLE=""
+  if [ ! "$ACTIVECONFIGS" ]; then
+    DISABLE="#"
+  fi
+  printf "$SOURCES_PREAMBLE" > "$SOURCELIST"
+  printf "$DISABLE$REPOCONFIG\n" >> "$SOURCELIST"
+  if [ $? -eq 0 ]; then
+    return 0
+  fi
+  return 2
+}
+
+# Add the Google repository to the apt sources.
+# Returns:
+# 0 - sources list was created
+# 2 - error
+create_sources_lists() {
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  find_apt_sources
+
+  SOURCELIST="$APT_SOURCESDIR/@@PACKAGE@@.list"
+  if [ -d "$APT_SOURCESDIR" ]; then
+    printf "$SOURCES_PREAMBLE" > "$SOURCELIST"
+    printf "$REPOCONFIG\n" >> "$SOURCELIST"
+    if [ $? -eq 0 ]; then
+      return 0
+    fi
+  fi
+  return 2
+}
+
+# Remove our custom sources list file.
+# Returns:
+# 0 - successfully removed, or not configured
+# !0 - failed to remove
+clean_sources_lists() {
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  find_apt_sources
+
+  rm -f "$APT_SOURCESDIR/@@PACKAGE@@.list" \
+        "$APT_SOURCESDIR/@@PACKAGE@@-@@CHANNEL@@.list"
+}
+
+# Detect if the repo config was disabled by distro upgrade and enable if
+# necessary.
+handle_distro_upgrade() {
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  find_apt_sources
+  SOURCELIST="$APT_SOURCESDIR/@@PACKAGE@@.list"
+  if [ -r "$SOURCELIST" ]; then
+    REPOLINE=$(grep -E "^[[:space:]]*#[[:space:]]*$REPOCONFIG[[:space:]]*# disabled on upgrade to .*" "$SOURCELIST")
+    if [ $? -eq 0 ]; then
+      sed -i -e "s,^[[:space:]]*#[[:space:]]*\($REPOCONFIG\)[[:space:]]*# disabled on upgrade to .*,\1," \
+        "$SOURCELIST"
+      LOGGER=$(which logger 2> /dev/null)
+      if [ "$LOGGER" ]; then
+        "$LOGGER" -t "$0" "Reverted repository modification: $REPOLINE."
+      fi
+    fi
+  fi
+}
+
+DEFAULT_ARCH="@@ARCHITECTURE@@"
+
+get_lib_dir() {
+  if [ "$DEFAULT_ARCH" = "i386" ]; then
+    LIBDIR=lib/i386-linux-gnu
+  elif [ "$DEFAULT_ARCH" = "amd64" ]; then
+    LIBDIR=lib/x86_64-linux-gnu
+  else
+    echo Unknown CPU Architecture: "$DEFAULT_ARCH"
+    exit 1
+  fi
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/default-app-block.template b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/default-app-block.template
new file mode 100644 (file)
index 0000000..6c5a7bf
--- /dev/null
@@ -0,0 +1,10 @@
+    <web-browser>
+      <name>@@MENUNAME@@</name>
+      <executable>@@INSTALLDIR@@/@@PACKAGE@@</executable>
+      <command>@@INSTALLDIR@@/@@PACKAGE@@ %s</command>
+      <icon-name>@@PACKAGE@@</icon-name>
+      <run-in-terminal>false</run-in-terminal>
+      <netscape-remote>true</netscape-remote>
+      <tab-command>@@INSTALLDIR@@/@@PACKAGE@@ %s</tab-command>
+      <win-command>@@INSTALLDIR@@/@@PACKAGE@@ --new-window %s</win-command>
+    </web-browser>
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/default-app.template b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/default-app.template
new file mode 100644 (file)
index 0000000..d3aeb34
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE default-apps SYSTEM "gnome-da-list.dtd">
+<!-- This file should be put in /usr/share/gnome-control-center/default-apps,
+     or, if that directory does not exist, its web-browser tag patched into
+     /usr/share/gnome-control-center/gnome-default-applications.xml -->
+<default-apps>
+  <web-browsers>
+    <web-browser>
+      <name>@@MENUNAME@@</name>
+      <executable>@@INSTALLDIR@@/@@PACKAGE@@</executable>
+      <command>@@INSTALLDIR@@/@@PACKAGE@@ %s</command>
+      <icon-name>@@PACKAGE@@</icon-name>
+      <run-in-terminal>false</run-in-terminal>
+      <netscape-remote>true</netscape-remote>
+      <tab-command>@@INSTALLDIR@@/@@PACKAGE@@ %s</tab-command>
+      <win-command>@@INSTALLDIR@@/@@PACKAGE@@ --new-window %s</win-command>
+    </web-browser>
+  </web-browsers>
+</default-apps>
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/desktop.template b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/desktop.template
new file mode 100644 (file)
index 0000000..ec802f2
--- /dev/null
@@ -0,0 +1,222 @@
+[Desktop Entry]
+Version=1.0
+Name=@@MENUNAME@@
+# Only KDE 4 seems to use GenericName, so we reuse the KDE strings.
+# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413.
+GenericName=Web Browser
+GenericName[ar]=متصفح الشبكة
+GenericName[bg]=Уеб браузър
+GenericName[ca]=Navegador web
+GenericName[cs]=WWW prohlížeč
+GenericName[da]=Browser
+GenericName[de]=Web-Browser
+GenericName[el]=Περιηγητής ιστού
+GenericName[en_GB]=Web Browser
+GenericName[es]=Navegador web
+GenericName[et]=Veebibrauser
+GenericName[fi]=WWW-selain
+GenericName[fr]=Navigateur Web
+GenericName[gu]=વેબ બ્રાઉઝર
+GenericName[he]=דפדפן אינטרנט
+GenericName[hi]=वेब ब्राउज़र
+GenericName[hu]=Webböngésző
+GenericName[it]=Browser Web
+GenericName[ja]=ウェブブラウザ
+GenericName[kn]=ಜಾಲ ವೀಕ್ಷಕ
+GenericName[ko]=웹 브라우저
+GenericName[lt]=Žiniatinklio naršyklė
+GenericName[lv]=Tīmekļa pārlūks
+GenericName[ml]=വെബ് ബ്രൌസര്‍
+GenericName[mr]=वेब ब्राऊजर
+GenericName[nb]=Nettleser
+GenericName[nl]=Webbrowser
+GenericName[pl]=Przeglądarka WWW
+GenericName[pt]=Navegador Web
+GenericName[pt_BR]=Navegador da Internet
+GenericName[ro]=Navigator de Internet
+GenericName[ru]=Веб-браузер
+GenericName[sl]=Spletni brskalnik
+GenericName[sv]=Webbläsare
+GenericName[ta]=இணைய உலாவி
+GenericName[th]=เว็บเบราว์เซอร์
+GenericName[tr]=Web Tarayıcı
+GenericName[uk]=Навігатор Тенет
+GenericName[zh_CN]=网页浏览器
+GenericName[zh_HK]=網頁瀏覽器
+GenericName[zh_TW]=網頁瀏覽器
+# Not translated in KDE, from Epiphany 2.26.1-0ubuntu1.
+GenericName[bn]=ওয়েব ব্রাউজার
+GenericName[fil]=Web Browser
+GenericName[hr]=Web preglednik
+GenericName[id]=Browser Web
+GenericName[or]=ଓ୍ବେବ ବ୍ରାଉଜର
+GenericName[sk]=WWW prehliadač
+GenericName[sr]=Интернет прегледник
+GenericName[te]=మహాతల అన్వేషి
+GenericName[vi]=Bộ duyệt Web
+# Gnome and KDE 3 uses Comment.
+Comment=Access the Internet
+Comment[ar]=الدخول إلى الإنترنت
+Comment[bg]=Достъп до интернет
+Comment[bn]=ইন্টারনেটটি অ্যাক্সেস করুন
+Comment[ca]=Accedeix a Internet
+Comment[cs]=Přístup k internetu
+Comment[da]=Få adgang til internettet
+Comment[de]=Internetzugriff
+Comment[el]=Πρόσβαση στο Διαδίκτυο
+Comment[en_GB]=Access the Internet
+Comment[es]=Accede a Internet.
+Comment[et]=Pääs Internetti
+Comment[fi]=Käytä internetiä
+Comment[fil]=I-access ang Internet
+Comment[fr]=Accéder à Internet
+Comment[gu]=ઇંટરનેટ ઍક્સેસ કરો
+Comment[he]=גישה אל האינטרנט
+Comment[hi]=इंटरनेट तक पहुंच स्थापित करें
+Comment[hr]=Pristup Internetu
+Comment[hu]=Internetelérés
+Comment[id]=Akses Internet
+Comment[it]=Accesso a Internet
+Comment[ja]=インターネットにアクセス
+Comment[kn]=ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ
+Comment[ko]=인터넷 연결
+Comment[lt]=Interneto prieiga
+Comment[lv]=Piekļūt internetam
+Comment[ml]=ഇന്റര്‍‌നെറ്റ് ആക്‌സസ് ചെയ്യുക
+Comment[mr]=इंटरनेटमध्ये प्रवेश करा
+Comment[nb]=Gå til Internett
+Comment[nl]=Verbinding maken met internet
+Comment[or]=ଇଣ୍ଟର୍ନେଟ୍ ପ୍ରବେଶ କରନ୍ତୁ
+Comment[pl]=Skorzystaj z internetu
+Comment[pt]=Aceder à Internet
+Comment[pt_BR]=Acessar a internet
+Comment[ro]=Accesaţi Internetul
+Comment[ru]=Доступ в Интернет
+Comment[sk]=Prístup do siete Internet
+Comment[sl]=Dostop do interneta
+Comment[sr]=Приступите Интернету
+Comment[sv]=Gå ut på Internet
+Comment[ta]=இணையத்தை அணுகுதல்
+Comment[te]=ఇంటర్నెట్‌ను ఆక్సెస్ చెయ్యండి
+Comment[th]=เข้าถึงอินเทอร์เน็ต
+Comment[tr]=İnternet'e erişin
+Comment[uk]=Доступ до Інтернету
+Comment[vi]=Truy cập Internet
+Comment[zh_CN]=访问互联网
+Comment[zh_HK]=連線到網際網路
+Comment[zh_TW]=連線到網際網路
+Exec=/usr/bin/@@USR_BIN_SYMLINK_NAME@@ %U
+Terminal=false
+Icon=@@PACKAGE@@
+Type=Application
+Categories=Network;WebBrowser;
+MimeType=text/html;text/xml;application/xhtml_xml;image/webp;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
+X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito
+
+[NewWindow Shortcut Group]
+Name=New Window
+Name[am]=አዲስ መስኮት
+Name[ar]=نافذة جديدة
+Name[bg]=Нов прозорец
+Name[bn]=নতুন উইন্ডো
+Name[ca]=Finestra nova
+Name[cs]=Nové okno
+Name[da]=Nyt vindue
+Name[de]=Neues Fenster
+Name[el]=Νέο Παράθυρο
+Name[en_GB]=New Window
+Name[es]=Nueva ventana
+Name[et]=Uus aken
+Name[fa]=پنجره جدید
+Name[fi]=Uusi ikkuna
+Name[fil]=New Window
+Name[fr]=Nouvelle fenêtre
+Name[gu]=નવી વિંડો
+Name[hi]=नई विंडो
+Name[hr]=Novi prozor
+Name[hu]=Új ablak
+Name[id]=Jendela Baru
+Name[it]=Nuova finestra
+Name[iw]=חלון חדש
+Name[ja]=新規ウインドウ
+Name[kn]=ಹೊಸ ವಿಂಡೊ
+Name[ko]=새 창
+Name[lt]=Naujas langas
+Name[lv]=Jauns logs
+Name[ml]=പുതിയ വിന്‍ഡോ
+Name[mr]=नवीन विंडो
+Name[nl]=Nieuw venster
+Name[no]=Nytt vindu
+Name[pl]=Nowe okno
+Name[pt]=Nova janela
+Name[pt_BR]=Nova janela
+Name[ro]=Fereastră nouă
+Name[ru]=Новое окно
+Name[sk]=Nové okno
+Name[sl]=Novo okno
+Name[sr]=Нови прозор
+Name[sv]=Nytt fönster
+Name[sw]=Dirisha Jipya
+Name[ta]=புதிய சாளரம்
+Name[te]=క్రొత్త విండో
+Name[th]=หน้าต่างใหม่
+Name[tr]=Yeni Pencere
+Name[uk]=Нове вікно
+Name[vi]=Cửa sổ Mới
+Name[zh_CN]=新建窗口
+Name[zh_TW]=開新視窗
+Exec=/usr/bin/@@USR_BIN_SYMLINK_NAME@@
+TargetEnvironment=Unity
+
+[NewIncognito Shortcut Group]
+Name=New Incognito Window
+Name[ar]=نافذة جديدة للتصفح المتخفي
+Name[bg]=Нов прозорец „инкогнито“
+Name[bn]=নতুন ছদ্মবেশী উইন্ডো
+Name[ca]=Finestra d'incògnit nova
+Name[cs]=Nové anonymní okno
+Name[da]=Nyt inkognitovindue
+Name[de]=Neues Inkognito-Fenster
+Name[el]=Νέο παράθυρο για ανώνυμη περιήγηση
+Name[en_GB]=New Incognito window
+Name[es]=Nueva ventana de incógnito
+Name[et]=Uus inkognito aken
+Name[fa]=پنجره جدید حالت ناشناس
+Name[fi]=Uusi incognito-ikkuna
+Name[fil]=Bagong Incognito window
+Name[fr]=Nouvelle fenêtre de navigation privée
+Name[gu]=નવી છુપી વિંડો
+Name[hi]=नई गुप्त विंडो
+Name[hr]=Novi anoniman prozor
+Name[hu]=Új Inkognitóablak
+Name[id]=Jendela Penyamaran baru
+Name[it]=Nuova finestra di navigazione in incognito
+Name[iw]=חלון חדש לגלישה בסתר
+Name[ja]=新しいシークレット ウィンドウ
+Name[kn]=ಹೊಸ ಅಜ್ಞಾತ ವಿಂಡೋ
+Name[ko]=새 시크릿 창
+Name[lt]=Naujas inkognito langas
+Name[lv]=Jauns inkognito režīma logs
+Name[ml]=പുതിയ വേഷ പ്രച്ഛന്ന വിന്‍ഡോ
+Name[mr]=नवीन गुप्त विंडो
+Name[nl]=Nieuw incognitovenster
+Name[no]=Nytt inkognitovindu
+Name[pl]=Nowe okno incognito
+Name[pt]=Nova janela de navegação anónima
+Name[pt_BR]=Nova janela anônima
+Name[ro]=Fereastră nouă incognito
+Name[ru]=Новое окно в режиме инкогнито
+Name[sk]=Nové okno inkognito
+Name[sl]=Novo okno brez beleženja zgodovine
+Name[sr]=Нови прозор за прегледање без архивирања
+Name[sv]=Nytt inkognitofönster
+Name[ta]=புதிய மறைநிலைச் சாளரம்
+Name[te]=క్రొత్త అజ్ఞాత విండో
+Name[th]=หน้าต่างใหม่ที่ไม่ระบุตัวตน
+Name[tr]=Yeni Gizli pencere
+Name[uk]=Нове вікно в режимі анонімного перегляду
+Name[vi]=Cửa sổ ẩn danh mới
+Name[zh_CN]=新建隐身窗口
+Name[zh_TW]=新增無痕式視窗
+Exec=/usr/bin/@@USR_BIN_SYMLINK_NAME@@ --incognito
+TargetEnvironment=Unity
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/eu-strip b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/eu-strip
new file mode 100755 (executable)
index 0000000..34f5175
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/eu-strip differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/google-chrome.info b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/google-chrome.info
new file mode 100644 (file)
index 0000000..414efde
--- /dev/null
@@ -0,0 +1,30 @@
+# Copyright (c) 2009 The Chromium 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 provides common configuration information for building
+# google-chrome packages for various platforms.
+
+# Base name of the package.
+PACKAGE="google-chrome"
+
+# Filename of the main executable (for generating launcher scripts, etc.)
+PROGNAME=chrome
+
+# Base directory for package installation.
+INSTALLDIR=/opt/google/chrome
+
+# Display string for desktop menu/icon.
+MENUNAME="Google Chrome"
+
+# Brief package description.
+SHORTDESC="The web browser from Google"
+
+# Detailed package description.
+FULLDESC="Google Chrome is a browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier."
+
+# Package maintainer information.
+# TODO(mmoss) Setup a mailbox for this address
+MAINTNAME="Chrome Linux Team"
+MAINTMAIL="chromium-dev@chromium.org"
+PRODUCTURL="http://chrome.google.com/"
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/installer.include b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/installer.include
new file mode 100644 (file)
index 0000000..a316906
--- /dev/null
@@ -0,0 +1,250 @@
+# Recursively replace @@include@@ template variables with the referenced file,
+# and write the resulting text to stdout.
+process_template_includes() {
+  INCSTACK+="$1->"
+  # Includes are relative to the file that does the include.
+  INCDIR=$(dirname $1)
+  # Clear IFS so 'read' doesn't trim whitespace
+  local OLDIFS="$IFS"
+  IFS=''
+  while read -r LINE
+  do
+    INCLINE=$(sed -e '/^[[:space:]]*@@include@@/!d' <<<$LINE)
+    if [ -n "$INCLINE" ]; then
+      INCFILE=$(echo $INCLINE | sed -e "s#@@include@@\(.*\)#\1#")
+      # Simple filename match to detect cyclic includes.
+      CYCLE=$(sed -e "\#$INCFILE#"'!d' <<<$INCSTACK)
+      if [ "$CYCLE" ]; then
+        echo "ERROR: Possible cyclic include detected." 1>&2
+        echo "$INCSTACK$INCFILE" 1>&2
+        exit 1
+      fi
+      if [ ! -r "$INCDIR/$INCFILE" ]; then
+        echo "ERROR: Couldn't read include file: $INCDIR/$INCFILE" 1>&2
+        exit 1
+      fi
+      process_template_includes "$INCDIR/$INCFILE"
+    else
+      echo "$LINE"
+    fi
+  done < "$1"
+  IFS="$OLDIFS"
+  INCSTACK=${INCSTACK%"$1->"}
+}
+
+# Replace template variables (@@VARNAME@@) in the given template file. If a
+# second argument is given, save the processed text to that filename, otherwise
+# modify the template file in place.
+process_template() (
+  # Don't worry if some of these substitution variables aren't set.
+  # Note that this function is run in a sub-shell so we don't leak this
+  # setting, since we still want unbound variables to be an error elsewhere.
+  set +u
+
+  local TMPLIN="$1"
+  if [ -z "$2" ]; then
+    local TMPLOUT="$TMPLIN"
+  else
+    local TMPLOUT="$2"
+  fi
+  # Process includes first so included text also gets substitutions.
+  TMPLINCL="$(process_template_includes "$TMPLIN")"
+  sed \
+    -e "s#@@PACKAGE@@#${PACKAGE}#g" \
+    -e "s#@@PACKAGE_FILENAME@@#${PACKAGE_FILENAME}#g" \
+    -e "s#@@PROGNAME@@#${PROGNAME}#g" \
+    -e "s#@@CHANNEL@@#${CHANNEL}#g" \
+    -e "s#@@COMPANY_FULLNAME@@#${COMPANY_FULLNAME}#g" \
+    -e "s#@@VERSION@@#${VERSION}#g" \
+    -e "s#@@PACKAGE_RELEASE@@#${PACKAGE_RELEASE}#g" \
+    -e "s#@@VERSIONFULL@@#${VERSIONFULL}#g" \
+    -e "s#@@INSTALLDIR@@#${INSTALLDIR}#g" \
+    -e "s#@@BUILDDIR@@#${BUILDDIR}#g" \
+    -e "s#@@STAGEDIR@@#${STAGEDIR}#g" \
+    -e "s#@@SCRIPTDIR@@#${SCRIPTDIR}#g" \
+    -e "s#@@MENUNAME@@#${MENUNAME}#g" \
+    -e "s#@@PRODUCTURL@@#${PRODUCTURL}#g" \
+    -e "s#@@PREDEPENDS@@#${PREDEPENDS}#g" \
+    -e "s#@@DEPENDS@@#${DEPENDS}#g" \
+    -e "s#@@PROVIDES@@#${PROVIDES}#g" \
+    -e "s#@@REPLACES@@#${REPLACES}#g" \
+    -e "s#@@CONFLICTS@@#${CONFLICTS}#g" \
+    -e "s#@@ARCHITECTURE@@#${ARCHITECTURE}#g" \
+    -e "s#@@MAINTNAME@@#${MAINTNAME}#g" \
+    -e "s#@@MAINTMAIL@@#${MAINTMAIL}#g" \
+    -e "s#@@REPOCONFIG@@#${REPOCONFIG}#g" \
+    -e "s#@@SHORTDESC@@#${SHORTDESC}#g" \
+    -e "s#@@FULLDESC@@#${FULLDESC}#g" \
+    -e "s#@@DEFAULT_FLAGS@@#${DEFAULT_FLAGS:-}#g" \
+    -e "s#@@SXS_USER_DATA_DIR@@#${SXS_USER_DATA_DIR:-}#g" \
+    -e "s#@@USR_BIN_SYMLINK_NAME@@#${USR_BIN_SYMLINK_NAME:-}#g" \
+    > "$TMPLOUT" <<< "$TMPLINCL"
+)
+
+# Setup the installation directory hierachy in the package staging area.
+prep_staging_common() {
+  install -m 755 -d "${STAGEDIR}/${INSTALLDIR}" \
+    "${STAGEDIR}/usr/bin" \
+    "${STAGEDIR}/usr/share/applications" \
+    "${STAGEDIR}/usr/share/gnome-control-center/default-apps" \
+    "${STAGEDIR}/usr/share/man/man1"
+}
+
+get_version_info() {
+  source "${BUILDDIR}/installer/version.txt"
+  VERSION="${MAJOR}.${MINOR}.${BUILD}.${PATCH}"
+  # TODO(phajdan.jr): Provide a mechanism to pass a different package
+  # release number if needed. The meaning of it is to bump it for
+  # packaging-only changes while the underlying software has the same version.
+  # This corresponds to the Release field in RPM spec files and debian_revision
+  # component of the Version field for DEB control file.
+  # Generally with Chrome's fast release cycle it'd be more hassle to try
+  # to bump this number between releases.
+  PACKAGE_RELEASE="1"
+}
+
+stage_install_common() {
+  echo "Staging common install files in '${STAGEDIR}'..."
+
+  # TODO(mmoss) This assumes we built the static binaries. To support shared
+  # builds, we probably want an install target in scons so it can give us all
+  # the right files. See also:
+  # http://code.google.com/p/chromium/issues/detail?id=4451
+  #
+  # app
+  # We need to add the debug link so gdb knows to look for the symbols.
+  DEBUGFILE="${BUILDDIR}/${PROGNAME}.debug"
+  STRIPPEDFILE="${BUILDDIR}/${PROGNAME}.stripped"
+  "${BUILDDIR}/installer/common/eu-strip" -o "${STRIPPEDFILE}" -f "${DEBUGFILE}" "${BUILDDIR}/${PROGNAME}"
+  install -m 755 "${STRIPPEDFILE}" "${STAGEDIR}/${INSTALLDIR}/${PROGNAME}"
+  rm "${DEBUGFILE}" "${STRIPPEDFILE}"
+
+  # resources
+  install -m 644 "${BUILDDIR}/resources.pak" "${STAGEDIR}/${INSTALLDIR}/"
+  # TODO(mmoss): This has broken a couple times on adding new .pak files. Maybe
+  # we should flag all installer files in FILES.cfg and get them from there, so
+  # there's only one place people need to keep track of such things (and in
+  # only the public repository).
+  if [ -r "${BUILDDIR}/chrome_100_percent.pak" ]; then
+    install -m 644 "${BUILDDIR}/chrome_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/"
+  else
+    install -m 644 "${BUILDDIR}/theme_resources_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/"
+    install -m 644 "${BUILDDIR}/ui_resources_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/"
+  fi
+
+  # ICU data file; only necessary when icu_use_data_file_flag is set to 1
+  # in build/common.gypi.
+  install -m 644 "${BUILDDIR}/icudtl.dat" "${STAGEDIR}/${INSTALLDIR}/"
+
+  # sandbox
+  # Rename sandbox binary with hyphen instead of underscore because that's what
+  # the code looks for, but the build targets can't use hyphens (scons bug?)
+  install -m 4755 -s "${BUILDDIR}/${PROGNAME}_sandbox" \
+    "${STAGEDIR}/${INSTALLDIR}/${PROGNAME}-sandbox"
+
+  # l10n paks
+  cp -a "${BUILDDIR}/locales" "${STAGEDIR}/${INSTALLDIR}/"
+  find "${STAGEDIR}/${INSTALLDIR}/locales" -type f -exec chmod 644 '{}' \;
+  find "${STAGEDIR}/${INSTALLDIR}/locales" -type d -exec chmod 755 '{}' \;
+
+  # ffmpeg libs
+  install -m 644 -s "${BUILDDIR}/libffmpegsumo.so" "${STAGEDIR}/${INSTALLDIR}/"
+
+  # Widevine CDM.
+  if [ -f "${BUILDDIR}/libwidevinecdmadapter.so" ]; then
+    install -m 644 -s "${BUILDDIR}/libwidevinecdmadapter.so" "${STAGEDIR}/${INSTALLDIR}/"
+    install -m 644 "${BUILDDIR}/libwidevinecdm.so" "${STAGEDIR}/${INSTALLDIR}/"
+  fi
+
+  # Pepper Flash.
+  PEPPERFLASH_SRCDIR="${BUILDDIR}/PepperFlash"
+  PEPPERFLASH_DESTDIR="${STAGEDIR}/${INSTALLDIR}/PepperFlash"
+  install -m 755 -d "${PEPPERFLASH_DESTDIR}"
+  install -m 644 -s "${PEPPERFLASH_SRCDIR}/libpepflashplayer.so" \
+    "${PEPPERFLASH_DESTDIR}/"
+  install -m 644 "${PEPPERFLASH_SRCDIR}/manifest.json" \
+    "${PEPPERFLASH_DESTDIR}/"
+
+  # pdf plugin
+  if [ -f "${BUILDDIR}/libpdf.so" ]; then
+    install -m 644 -s "${BUILDDIR}/libpdf.so" "${STAGEDIR}/${INSTALLDIR}/"
+  fi
+
+  # peerconnection shared library
+  if [ -f "${BUILDDIR}/lib/libpeerconnection.so" ]; then
+    install -m 755 -d "${STAGEDIR}/${INSTALLDIR}/lib/"
+
+    install -m 644 -s "${BUILDDIR}/lib/libpeerconnection.so" "${STAGEDIR}/${INSTALLDIR}/lib/"
+  fi
+
+  # nacl pepper plugin
+  if [ -f "${BUILDDIR}/libppGoogleNaClPluginChrome.so" ]; then
+    install -m 644 -s "${BUILDDIR}/libppGoogleNaClPluginChrome.so" "${STAGEDIR}/${INSTALLDIR}/"
+  fi
+
+  # nacl_helper and nacl_helper_bootstrap
+  # Don't use "-s" (strip) because this runs binutils "strip", which
+  # mangles the special ELF program headers of nacl_helper_bootstrap.
+  # Explicitly use eu-strip instead, because it doesn't have that problem.
+  for file in nacl_helper nacl_helper_bootstrap; do
+    buildfile="${BUILDDIR}/${file}"
+    if [ -f "${buildfile}" ]; then
+      strippedfile="${buildfile}.stripped"
+      debugfile="${buildfile}.debug"
+      "${BUILDDIR}/installer/common/eu-strip" -o "${strippedfile}" -f "${debugfile}" "${buildfile}"
+      install -m 755 "${strippedfile}" "${STAGEDIR}/${INSTALLDIR}/${file}"
+    fi
+  done
+  # Don't use "-s" (strip) because this would use the Linux toolchain to
+  # strip the NaCl binary, which has the potential to break it.  It
+  # certainly resets the OSABI and ABIVERSION fields to non-NaCl values,
+  # although the NaCl IRT loader doesn't care about these fields.  In any
+  # case, the IRT binaries are already stripped by NaCl's build process.
+  for filename in ${BUILDDIR}/nacl_irt_*.nexe; do
+    # Re-check the filename in case globbing matched nothing.
+    if [ -f "$filename" ]; then
+      install -m 644 "$filename" "${STAGEDIR}/${INSTALLDIR}/`basename "$filename"`"
+    fi
+  done
+
+  # default apps
+  if [ -d "${BUILDDIR}/default_apps" ]; then
+    cp -a "${BUILDDIR}/default_apps" "${STAGEDIR}/${INSTALLDIR}/"
+    find "${STAGEDIR}/${INSTALLDIR}/default_apps" -type d -exec chmod 755 '{}' \;
+    find "${STAGEDIR}/${INSTALLDIR}/default_apps" -type f -exec chmod 644 '{}' \;
+  fi
+
+  # launcher script and symlink
+  process_template "${BUILDDIR}/installer/common/wrapper" \
+    "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}"
+  chmod 755 "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}"
+  if [ ! -f "${STAGEDIR}/${INSTALLDIR}/google-chrome" ]; then
+    ln -sn "${INSTALLDIR}/${PACKAGE}" \
+      "${STAGEDIR}/${INSTALLDIR}/google-chrome"
+  fi
+  ln -snf "${INSTALLDIR}/${PACKAGE}" \
+    "${STAGEDIR}/usr/bin/${USR_BIN_SYMLINK_NAME}"
+
+  # app icons
+  install -m 644 \
+    "${BUILDDIR}/installer/theme/product_logo_"*.png \
+    "${BUILDDIR}/installer/theme/product_logo_32.xpm" \
+    "${STAGEDIR}/${INSTALLDIR}/"
+
+  # desktop integration
+  install -m 755 "${BUILDDIR}/xdg-mime" "${STAGEDIR}${INSTALLDIR}/"
+  install -m 755 "${BUILDDIR}/xdg-settings" "${STAGEDIR}${INSTALLDIR}/"
+  process_template "${BUILDDIR}/installer/common/desktop.template" \
+    "${STAGEDIR}/usr/share/applications/${PACKAGE}.desktop"
+  chmod 644 "${STAGEDIR}/usr/share/applications/${PACKAGE}.desktop"
+  process_template "${BUILDDIR}/installer/common/default-app.template" \
+    "${STAGEDIR}/usr/share/gnome-control-center/default-apps/${PACKAGE}.xml"
+  chmod 644 "${STAGEDIR}/usr/share/gnome-control-center/default-apps/${PACKAGE}.xml"
+  process_template "${BUILDDIR}/installer/common/default-app-block.template" \
+    "${STAGEDIR}${INSTALLDIR}/default-app-block"
+  chmod 644 "${STAGEDIR}${INSTALLDIR}/default-app-block"
+
+  # documentation
+  install -m 755 "${BUILDDIR}/${PROGNAME}.1" \
+    "${STAGEDIR}/usr/share/man/man1/${PACKAGE}.1"
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/postinst.include b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/postinst.include
new file mode 100644 (file)
index 0000000..194e9a4
--- /dev/null
@@ -0,0 +1,78 @@
+# Add icons to the system icons
+XDG_ICON_RESOURCE="`which xdg-icon-resource 2> /dev/null || true`"
+if [ ! -x "$XDG_ICON_RESOURCE" ]; then
+  echo "Error: Could not find xdg-icon-resource" >&2
+  exit 1
+fi
+for icon in "@@INSTALLDIR@@/product_logo_"*.png; do
+  size="${icon##*/product_logo_}"
+  "$XDG_ICON_RESOURCE" install --size "${size%.png}" "$icon" "@@PACKAGE@@"
+done
+
+UPDATE_MENUS="`which update-menus 2> /dev/null || true`"
+if [ -x "$UPDATE_MENUS" ]; then
+  update-menus
+fi
+
+# Update cache of .desktop file MIME types. Non-fatal since it's just a cache.
+update-desktop-database > /dev/null 2>&1 || true
+
+# Updates defaults.list file if present.
+update_defaults_list() {
+  # $1: name of the .desktop file
+
+  local DEFAULTS_FILE="/usr/share/applications/defaults.list"
+
+  if [ ! -f "${DEFAULTS_FILE}" ]; then
+    return
+  fi
+
+  # Split key-value pair out of MimeType= line from the .desktop file,
+  # then split semicolon-separated list of mime types (they should not contain
+  # spaces).
+  mime_types="$(grep MimeType= /usr/share/applications/${1} |
+                cut -d '=' -f 2- |
+                tr ';' ' ')"
+  for mime_type in ${mime_types}; do
+    if egrep -q "^${mime_type}=" "${DEFAULTS_FILE}"; then
+      if ! egrep -q "^${mime_type}=.*${1}" "${DEFAULTS_FILE}"; then
+        default_apps="$(grep ${mime_type}= "${DEFAULTS_FILE}" |
+                        cut -d '=' -f 2-)"
+        egrep -v "^${mime_type}=" "${DEFAULTS_FILE}" > "${DEFAULTS_FILE}.new"
+        echo "${mime_type}=${default_apps};${1}" >> "${DEFAULTS_FILE}.new"
+        mv "${DEFAULTS_FILE}.new" "${DEFAULTS_FILE}"
+      fi
+    else
+      # If there's no mention of the mime type in the file, add it.
+      echo "${mime_type}=${1};" >> "${DEFAULTS_FILE}"
+    fi
+  done
+}
+
+update_defaults_list "@@PACKAGE@@.desktop"
+
+# This function uses sed to insert the contents of one file into another file,
+# after the first line matching a given regular expression. If there is no
+# matching line, then the file is unchanged.
+insert_after_first_match() {
+  # $1: file to update
+  # $2: regular expression
+  # $3: file to insert
+  sed -i -e "1,/$2/ {
+    /$2/ r $3
+    }" "$1"
+}
+
+# If /usr/share/gnome-control-center/gnome-default-applications.xml exists, it
+# may need to be updated to add ourselves to the default applications list. If
+# we find the file and it does not seem to contain our patch already (the patch
+# is safe to leave even after uninstall), update it.
+GNOME_DFL_APPS=/usr/share/gnome-control-center/gnome-default-applications.xml
+if [ -f "$GNOME_DFL_APPS" ]; then
+# Conditionally insert the contents of the file "default-app-block" after the
+# first "<web-browsers>" line we find in gnome-default-applications.xml
+  fgrep -q "@@MENUNAME@@" "$GNOME_DFL_APPS" || insert_after_first_match \
+    "$GNOME_DFL_APPS" \
+    "^[        ]*<web-browsers>[       ]*$" \
+    "@@INSTALLDIR@@/default-app-block"
+fi
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/prerm.include b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/prerm.include
new file mode 100644 (file)
index 0000000..5bb2c40
--- /dev/null
@@ -0,0 +1,18 @@
+# Remove icons from the system icons
+XDG_ICON_RESOURCE="`which xdg-icon-resource 2> /dev/null || true`"
+if [ ! -x "$XDG_ICON_RESOURCE" ]; then
+  echo "Error: Could not find xdg-icon-resource" >&2
+  exit 1
+fi
+for icon in "@@INSTALLDIR@@/product_logo_"*.png; do
+  size="${icon##*/product_logo_}"
+  "$XDG_ICON_RESOURCE" uninstall --size "${size%.png}" "@@PACKAGE@@"
+done
+
+UPDATE_MENUS="`which update-menus 2> /dev/null || true`"
+if [ -x "$UPDATE_MENUS" ]; then
+  update-menus
+fi
+
+# Update cache of .desktop file MIME types. Non-fatal since it's just a cache.
+update-desktop-database > /dev/null 2>&1 || true
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/repo.cron b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/repo.cron
new file mode 100755 (executable)
index 0000000..fbb3e74
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 The Chromium 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 script is part of the @@PACKAGE@@ package.
+#
+# It creates the repository configuration file for package updates, and it
+# monitors that config to see if it has been disabled by the overly aggressive
+# distro upgrade process (e.g.  intrepid -> jaunty). When this situation is
+# detected, the respository will be re-enabled. If the respository is disabled
+# for any other reason, this won't re-enable it.
+#
+# This functionality can be controlled by creating the $DEFAULTS_FILE and
+# setting "repo_add_once" and/or "repo_reenable_on_distupgrade" to "true" or
+# "false" as desired. An empty $DEFAULTS_FILE is the same as setting both values
+# to "false".
+
+@@include@@apt.include
+
+## MAIN ##
+DEFAULTS_FILE="/etc/default/@@PACKAGE@@"
+if [ -r "$DEFAULTS_FILE" ]; then
+  . "$DEFAULTS_FILE"
+fi
+
+if [ "$repo_add_once" = "true" ]; then
+  install_key
+  create_sources_lists
+  RES=$?
+  # Sources creation succeeded, so stop trying.
+  if [ $RES -ne 2 ]; then
+    sed -i -e 's/[[:space:]]*repo_add_once=.*/repo_add_once="false"/' "$DEFAULTS_FILE"
+  fi
+else
+  update_bad_sources
+fi
+
+if [ "$repo_reenable_on_distupgrade" = "true" ]; then
+  handle_distro_upgrade
+fi
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/rpm.include b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/rpm.include
new file mode 100644 (file)
index 0000000..91b4459
--- /dev/null
@@ -0,0 +1,318 @@
+@@include@@variables.include
+
+# Install the repository signing key (see also:
+# http://www.google.com/linuxrepositories/aboutkey.html)
+install_rpm_key() {
+  # Check to see if key already exists.
+  rpm -q gpg-pubkey-7fac5991-4615767f > /dev/null 2>&1
+  if [ "$?" -eq "0" ]; then
+    # Key already exists
+    return 0
+  fi
+  # This is to work around a bug in RPM 4.7.0. (see http://crbug.com/22312)
+  rpm -q gpg-pubkey-7fac5991-45f06f46 > /dev/null 2>&1
+  if [ "$?" -eq "0" ]; then
+    # Key already exists
+    return 0
+  fi
+
+  # RPM on Mandriva 2009 is dumb and does not understand "rpm --import -"
+  TMPKEY=$(mktemp /tmp/google.sig.XXXXXX)
+  if [ -n "$TMPKEY" ]; then
+    cat > "$TMPKEY" <<KEYDATA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2.2 (GNU/Linux)
+
+mQGiBEXwb0YRBADQva2NLpYXxgjNkbuP0LnPoEXruGmvi3XMIxjEUFuGNCP4Rj/a
+kv2E5VixBP1vcQFDRJ+p1puh8NU0XERlhpyZrVMzzS/RdWdyXf7E5S8oqNXsoD1z
+fvmI+i9b2EhHAA19Kgw7ifV8vMa4tkwslEmcTiwiw8lyUl28Wh4Et8SxzwCggDcA
+feGqtn3PP5YAdD0km4S4XeMEAJjlrqPoPv2Gf//tfznY2UyS9PUqFCPLHgFLe80u
+QhI2U5jt6jUKN4fHauvR6z3seSAsh1YyzyZCKxJFEKXCCqnrFSoh4WSJsbFNc4PN
+b0V0SqiTCkWADZyLT5wll8sWuQ5ylTf3z1ENoHf+G3um3/wk/+xmEHvj9HCTBEXP
+78X0A/0Tqlhc2RBnEf+AqxWvM8sk8LzJI/XGjwBvKfXe+l3rnSR2kEAvGzj5Sg0X
+4XmfTg4Jl8BNjWyvm2Wmjfet41LPmYJKsux3g0b8yzQxeOA4pQKKAU3Z4+rgzGmf
+HdwCG5MNT2A5XxD/eDd+L4fRx0HbFkIQoAi1J3YWQSiTk15fw7RMR29vZ2xlLCBJ
+bmMuIExpbnV4IFBhY2thZ2UgU2lnbmluZyBLZXkgPGxpbnV4LXBhY2thZ2VzLWtl
+eW1hc3RlckBnb29nbGUuY29tPohjBBMRAgAjAhsDBgsJCAcDAgQVAggDBBYCAwEC
+HgECF4AFAkYVdn8CGQEACgkQoECDD3+sWZHKSgCfdq3HtNYJLv+XZleb6HN4zOcF
+AJEAniSFbuv8V5FSHxeRimHx25671az+uQINBEXwb0sQCACuA8HT2nr+FM5y/kzI
+A51ZcC46KFtIDgjQJ31Q3OrkYP8LbxOpKMRIzvOZrsjOlFmDVqitiVc7qj3lYp6U
+rgNVaFv6Qu4bo2/ctjNHDDBdv6nufmusJUWq/9TwieepM/cwnXd+HMxu1XBKRVk9
+XyAZ9SvfcW4EtxVgysI+XlptKFa5JCqFM3qJllVohMmr7lMwO8+sxTWTXqxsptJo
+pZeKz+UBEEqPyw7CUIVYGC9ENEtIMFvAvPqnhj1GS96REMpry+5s9WKuLEaclWpd
+K3krttbDlY1NaeQUCRvBYZ8iAG9YSLHUHMTuI2oea07Rh4dtIAqPwAX8xn36JAYG
+2vgLAAMFB/wKqaycjWAZwIe98Yt0qHsdkpmIbarD9fGiA6kfkK/UxjL/k7tmS4Vm
+CljrrDZkPSQ/19mpdRcGXtb0NI9+nyM5trweTvtPw+HPkDiJlTaiCcx+izg79Fj9
+KcofuNb3lPdXZb9tzf5oDnmm/B+4vkeTuEZJ//IFty8cmvCpzvY+DAz1Vo9rA+Zn
+cpWY1n6z6oSS9AsyT/IFlWWBZZ17SpMHu+h4Bxy62+AbPHKGSujEGQhWq8ZRoJAT
+G0KSObnmZ7FwFWu1e9XFoUCt0bSjiJWTIyaObMrWu/LvJ3e9I87HseSJStfw6fki
+5og9qFEkMrIrBCp3QGuQWBq/rTdMuwNFiEkEGBECAAkFAkXwb0sCGwwACgkQoECD
+D3+sWZF/WACfeNAu1/1hwZtUo1bR+MWiCjpvHtwAnA1R3IHqFLQ2X3xJ40XPuAyY
+/FJG
+=Quqp
+-----END PGP PUBLIC KEY BLOCK-----
+KEYDATA
+    rpm --import "$TMPKEY"
+    rc=$?
+    rm -f "$TMPKEY"
+    if [ "$rc" -eq "0" ]; then
+      return 0
+    fi
+  fi
+  return 1
+}
+
+determine_rpm_package_manager() {
+  local RELEASE
+  LSB_RELEASE="$(which lsb_release 2> /dev/null)"
+  if [ -x "$LSB_RELEASE" ]; then
+    RELEASE=$(lsb_release -i 2> /dev/null | sed 's/:\t/:/' | cut -d ':' -f 2-)
+    case $RELEASE in
+    "Fedora")
+      PACKAGEMANAGER=yum
+      ;;
+    "MandrivaLinux")
+      PACKAGEMANAGER=urpmi
+      ;;
+    "SUSE LINUX")
+      PACKAGEMANAGER=yast
+      ;;
+    esac
+  fi
+
+  if [ "$PACKAGEMANAGER" ]; then
+    return
+  fi
+
+  # Fallback methods that are probably unnecessary on modern systems.
+  if [ -f "/etc/lsb-release" ]; then
+    # file missing on Fedora, does not contain DISTRIB_ID on OpenSUSE.
+    eval $(sed -e '/DISTRIB_ID/!d' /etc/lsb-release)
+    case $DISTRIB_ID in
+    MandrivaLinux)
+      PACKAGEMANAGER=urpmi
+      ;;
+    esac
+  fi
+
+  if [ "$PACKAGEMANAGER" ]; then
+    return
+  fi
+
+  if [ -f "/etc/fedora-release" ] || [ -f "/etc/redhat-release" ]; then
+    PACKAGEMANAGER=yum
+  elif [ -f "/etc/SuSE-release" ]; then
+    PACKAGEMANAGER=yast
+  elif [ -f "/etc/mandriva-release" ]; then
+    PACKAGEMANAGER=urpmi
+  fi
+}
+
+DEFAULT_ARCH="@@ARCHITECTURE@@"
+YUM_REPO_FILE="/etc/yum.repos.d/@@PACKAGE@@.repo"
+ZYPPER_REPO_FILE="/etc/zypp/repos.d/@@PACKAGE@@.repo"
+URPMI_REPO_FILE="/etc/urpmi/urpmi.cfg"
+
+install_yum() {
+  install_rpm_key
+
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  if [ -d "/etc/yum.repos.d" ]; then
+cat > "$YUM_REPO_FILE" << REPOCONTENT
+[@@PACKAGE@@]
+name=@@PACKAGE@@
+baseurl=$REPOCONFIG/$DEFAULT_ARCH
+enabled=1
+gpgcheck=1
+REPOCONTENT
+  fi
+}
+
+# This is called by the cron job, rather than in the RPM postinstall.
+# We cannot do this during the install when urpmi is running due to
+# database locking. We also need to enable the repository, and we can
+# only do that while we are online.
+# see: https://qa.mandriva.com/show_bug.cgi?id=31893
+configure_urpmi() {
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  urpmq --list-media | grep -q -s "^@@PACKAGE@@$"
+  if [ "$?" -eq "0" ]; then
+    # Repository already configured
+    return 0
+  fi
+  urpmi.addmedia --update \
+    "@@PACKAGE@@" "$REPOCONFIG/$DEFAULT_ARCH"
+}
+
+install_urpmi() {
+  # urpmi not smart enough to pull media_info/pubkey from the repository?
+  install_rpm_key
+
+  # Defer urpmi.addmedia to configure_urpmi() in the cron job.
+  # See comment there.
+  #
+  # urpmi.addmedia --update \
+  #   "@@PACKAGE@@" "$REPOCONFIG/$DEFAULT_ARCH"
+}
+
+install_yast() {
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  # We defer adding the key to later. See comment in the cron job.
+
+  # Ideally, we would run: zypper addrepo -t YUM -f \
+  # "$REPOCONFIG/$DEFAULT_ARCH" "@@PACKAGE@@"
+  # but that does not work when zypper is running.
+  if [ -d "/etc/zypp/repos.d" ]; then
+cat > "$ZYPPER_REPO_FILE" << REPOCONTENT
+[@@PACKAGE@@]
+name=@@PACKAGE@@
+enabled=1
+autorefresh=1
+baseurl=$REPOCONFIG/$DEFAULT_ARCH
+type=rpm-md
+keeppackages=0
+REPOCONTENT
+  fi
+}
+
+# Check if the automatic repository configuration is done, so we know when to
+# stop trying.
+verify_install() {
+  # It's probably enough to see that the repo configs have been created. If they
+  # aren't configured properly, update_bad_repo should catch that when it's run.
+  case $1 in
+  "yum")
+    [ -f "$YUM_REPO_FILE" ]
+    ;;
+  "yast")
+    [ -f "$ZYPPER_REPO_FILE" ]
+    ;;
+  "urpmi")
+    urpmq --list-url | grep -q -s "\b@@PACKAGE@@\b"
+    ;;
+  esac
+}
+
+# Update the Google repository if it's not set correctly.
+update_bad_repo() {
+  if [ ! "$REPOCONFIG" ]; then
+    return 0
+  fi
+
+  determine_rpm_package_manager
+
+  case $PACKAGEMANAGER in
+  "yum")
+    update_repo_file "$YUM_REPO_FILE"
+    ;;
+  "yast")
+    update_repo_file "$ZYPPER_REPO_FILE"
+    ;;
+  "urpmi")
+    update_urpmi_cfg
+    ;;
+  esac
+}
+
+update_repo_file() {
+  REPO_FILE="$1"
+
+  # Don't do anything if the file isn't there, since that probably means the
+  # user disabled it.
+  if [ ! -r "$REPO_FILE" ]; then
+    return 0
+  fi
+
+  # Check if the correct repository configuration is in there.
+  REPOMATCH=$(grep "^baseurl=$REPOCONFIG/$DEFAULT_ARCH" "$REPO_FILE" \
+    2>/dev/null)
+  # If it's there, nothing to do
+  if [ "$REPOMATCH" ]; then
+    return 0
+  fi
+
+  # Check if it's there but disabled by commenting out (as opposed to using the
+  # 'enabled' setting).
+  MATCH_DISABLED=$(grep "^[[:space:]]*#.*baseurl=$REPOCONFIG/$DEFAULT_ARCH" \
+    "$REPO_FILE" 2>/dev/null)
+  if [ "$MATCH_DISABLED" ]; then
+    # It's OK for it to be disabled, as long as nothing bogus is enabled in its
+    # place.
+    ACTIVECONFIGS=$(grep "^baseurl=.*" "$REPO_FILE" 2>/dev/null)
+    if [ ! "$ACTIVECONFIGS" ]; then
+      return 0
+    fi
+  fi
+
+  # If we get here, the correct repository wasn't found, or something else is
+  # active, so fix it. This assumes there is a 'baseurl' setting, but if not,
+  # then that's just another way of disabling, so we won't try to add it.
+  sed -i -e "s,^baseurl=.*,baseurl=$REPOCONFIG/$DEFAULT_ARCH," "$REPO_FILE"
+}
+
+update_urpmi_cfg() {
+  REPOCFG=$(urpmq --list-url | grep "\b@@PACKAGE@@\b")
+  if [ ! "$REPOCFG" ]; then
+    # Don't do anything if the repo isn't there, since that probably means the
+    # user deleted it.
+    return 0
+  fi
+
+  # See if it's the right repo URL
+  REPOMATCH=$(echo "$REPOCFG" | grep "\b$REPOCONFIG/$DEFAULT_ARCH\b")
+  # If so, nothing to do
+  if [ "$REPOMATCH" ]; then
+    return 0
+  fi
+
+  # Looks like it's the wrong URL, so recreate it.
+  urpmi.removemedia "@@PACKAGE@@" && \
+    urpmi.addmedia --update "@@PACKAGE@@" "$REPOCONFIG/$DEFAULT_ARCH"
+}
+
+# We only remove the repository configuration during a purge. Since RPM has
+# no equivalent to dpkg --purge, the code below is actually never used. We
+# keep it only for reference purposes, should we ever need it.
+#
+#remove_yum() {
+#  rm -f "$YUM_REPO_FILE"
+#}
+#
+#remove_urpmi() {
+#  # Ideally, we would run: urpmi.removemedia "@@PACKAGE@@"
+#  # but that does not work when urpmi is running.
+#  # Sentinel comment text does not work either because urpmi.update removes
+#  # all comments. So we just delete the entry that matches what we originally
+#  # inserted. If such an entry was added manually, that's tough luck.
+#  if [ -f "$URPMI_REPO_FILE" ]; then
+#    sed -i '\_^@@PACKAGE@@ $REPOCONFIG/$DEFAULT_ARCH {$_,/^}$/d' "$URPMI_REPO_FILE"
+#  fi
+#}
+#
+#remove_yast() {
+#  # Ideally, we would run: zypper removerepo "@@PACKAGE@@"
+#  # but that does not work when zypper is running.
+#  rm -f /etc/zypp/repos.d/@@PACKAGE@@.repo
+#}
+
+DEFAULT_ARCH="@@ARCHITECTURE@@"
+
+get_lib_dir() {
+  if [ "$DEFAULT_ARCH" = "i386" ]; then
+    LIBDIR=lib
+  elif [ "$DEFAULT_ARCH" = "x86_64" ]; then
+    LIBDIR=lib64
+  else
+    echo Unknown CPU Architecture: "$DEFAULT_ARCH"
+    exit 1
+  fi
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/rpmrepo.cron b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/rpmrepo.cron
new file mode 100755 (executable)
index 0000000..1e6a3a6
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 The Chromium 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 script is part of the @@PACKAGE@@ package.
+#
+# It creates the repository configuration file for package updates, since
+# we cannot do this during the @@PACKAGE@@ installation since the repository
+# is locked.
+#
+# This functionality can be controlled by creating the $DEFAULTS_FILE and
+# setting "repo_add_once" to "true" or "false" as desired. An empty
+# $DEFAULTS_FILE is the same as setting the value to "false".
+
+@@include@@rpm.include
+
+## MAIN ##
+DEFAULTS_FILE="/etc/default/@@PACKAGE@@"
+if [ -r "$DEFAULTS_FILE" ]; then
+  . "$DEFAULTS_FILE"
+fi
+
+if [ "$repo_add_once" = "true" ]; then
+  determine_rpm_package_manager
+
+  # The initial install happens in the post-install scripts, but there have been
+  # reports of configuration problems, so just verify that everything looks
+  # good, and if not, try to install again.
+  verify_install $PACKAGEMANAGER
+  if [ $? -ne 0 ]; then
+    install_${PACKAGEMANAGER}
+  fi
+
+  # Now do any extra configuration that couldn't be done by post-install.
+  case $PACKAGEMANAGER in
+  "urpmi")
+    # We need to configure urpmi after the install has finished.
+    # See configure_urpmi() for details.
+    configure_urpmi
+    ;;
+  "yast")
+    # It looks as though yast/zypper has a lock on the RPM DB during
+    # postinstall, so we cannot add the signing key with install_rpm_key().
+    # Instead, we attempt to do this here. If the user attempt to update before
+    # the cron job imports the key, Yast will grab the key from our server and
+    # prompt the user to accept the key.
+    install_rpm_key
+    ;;
+  esac
+
+  if [ $? -eq 0 ]; then
+    # Before we quit auto-configuration, check that everything looks sane, since
+    # part of this happened during package install and we don't have the return
+    # value of that process.
+    verify_install $PACKAGEMANAGER
+    if [ $? -eq 0 ]; then
+      sed -i -e 's/[[:space:]]*repo_add_once=.*/repo_add_once="false"/' \
+        "$DEFAULTS_FILE"
+    fi
+  fi
+else
+  update_bad_repo
+fi
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/symlinks.include b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/symlinks.include
new file mode 100644 (file)
index 0000000..7bad92e
--- /dev/null
@@ -0,0 +1,51 @@
+NSS_FILES="libnspr4.so.0d libplds4.so.0d libplc4.so.0d libssl3.so.1d \
+    libnss3.so.1d libsmime3.so.1d libnssutil3.so.1d"
+
+add_nss_symlinks() {
+  get_lib_dir
+  for f in $NSS_FILES
+  do
+    target=$(echo $f | sed 's/\.[01]d$//')
+    if [ -f "/$LIBDIR/$target" ]; then
+      ln -snf "/$LIBDIR/$target" "@@INSTALLDIR@@/$f"
+    elif [ -f "/usr/$LIBDIR/$target" ]; then
+      ln -snf "/usr/$LIBDIR/$target" "@@INSTALLDIR@@/$f"
+    else
+      echo $f not found in "/$LIBDIR/$target" or "/usr/$LIBDIR/$target".
+      exit 1
+    fi
+  done
+}
+
+remove_nss_symlinks() {
+  for f in $NSS_FILES
+  do
+    rm -rf "@@INSTALLDIR@@/$f"
+  done
+}
+
+# Fedora 18 now has libudev.so.1. http://crbug.com/145160
+# Same for Ubuntu 13.04. http://crbug.com/226002
+LIBUDEV_0=libudev.so.0
+LIBUDEV_1=libudev.so.1
+
+add_udev_symlinks() {
+  get_lib_dir
+  if [ -f "/$LIBDIR/$LIBUDEV_0" -o -f "/usr/$LIBDIR/$LIBUDEV_0" -o -f "/lib/$LIBUDEV_0" ]; then
+    return 0
+  fi
+
+  if [ -f "/$LIBDIR/$LIBUDEV_1" ]; then
+    ln -snf "/$LIBDIR/$LIBUDEV_1" "@@INSTALLDIR@@/$LIBUDEV_0"
+  elif [ -f "/usr/$LIBDIR/$LIBUDEV_1" ];
+  then
+    ln -snf "/usr/$LIBDIR/$LIBUDEV_1" "@@INSTALLDIR@@/$LIBUDEV_0"
+  else
+    echo "$LIBUDEV_1" not found in "$LIBDIR" or "/usr/$LIBDIR".
+    exit 1
+  fi
+}
+
+remove_udev_symlinks() {
+  rm -rf "@@INSTALLDIR@@/$LIBUDEV_0"
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/variables.include b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/variables.include
new file mode 100644 (file)
index 0000000..f3a17cd
--- /dev/null
@@ -0,0 +1,5 @@
+# System-wide package configuration.
+DEFAULTS_FILE="/etc/default/@@PACKAGE@@"
+
+# sources.list setting for @@PACKAGE@@ updates.
+REPOCONFIG="@@REPOCONFIG@@"
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/common/wrapper b/src/chrome/tools/test/reference_build/chrome_linux/installer/common/wrapper
new file mode 100755 (executable)
index 0000000..22d642f
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/bash
+#
+# 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.
+
+# Let the wrapped binary know that it has been run through the wrapper.
+export CHROME_WRAPPER="`readlink -f "$0"`"
+
+HERE="`dirname "$CHROME_WRAPPER"`"
+
+# We include some xdg utilities next to the binary, and we want to prefer them
+# over the system versions when we know the system versions are very old. We
+# detect whether the system xdg utilities are sufficiently new to be likely to
+# work for us by looking for xdg-settings. If we find it, we leave $PATH alone,
+# so that the system xdg utilities (including any distro patches) will be used.
+if ! which xdg-settings &> /dev/null; then
+  # Old xdg utilities. Prepend $HERE to $PATH to use ours instead.
+  export PATH="$HERE:$PATH"
+else
+  # Use system xdg utilities. But first create mimeapps.list if it doesn't
+  # exist; some systems have bugs in xdg-mime that make it fail without it.
+  xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}"
+  mkdir -p "$xdg_app_dir"
+  [ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list"
+fi
+
+# Always use our versions of ffmpeg libs.
+# This also makes RPMs find the compatibly-named library symlinks.
+if [[ -n "$LD_LIBRARY_PATH" ]]; then
+  LD_LIBRARY_PATH="$HERE:$HERE/lib:$LD_LIBRARY_PATH"
+else
+  LD_LIBRARY_PATH="$HERE:$HERE/lib"
+fi
+export LD_LIBRARY_PATH
+
+export CHROME_VERSION_EXTRA="@@CHANNEL@@"
+
+# We don't want bug-buddy intercepting our crashes. http://crbug.com/24120
+export GNOME_DISABLE_CRASH_DIALOG=SET_BY_GOOGLE_CHROME
+
+# Automagically migrate user data directory.
+# TODO(phajdan.jr): Remove along with migration code in the browser for M33.
+if [[ -n "@@SXS_USER_DATA_DIR@@" ]]; then
+  if [[ ! -d "@@SXS_USER_DATA_DIR@@" ]]; then
+    "$HERE/@@PROGNAME@@" "--migrate-data-dir-for-sxs=@@SXS_USER_DATA_DIR@@" \
+      --enable-logging=stderr --log-level=0
+  fi
+fi
+
+# Note: exec -a below is a bashism.
+exec -a "$0" "$HERE/@@PROGNAME@@" @@DEFAULT_FLAGS@@ "$@"
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/build.sh b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/build.sh
new file mode 100755 (executable)
index 0000000..b25a757
--- /dev/null
@@ -0,0 +1,331 @@
+#!/bin/bash
+#
+# 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.
+
+# TODO(mmoss) This currently only works with official builds, since non-official
+# builds don't add the "${BUILDDIR}/installer/" files needed for packaging.
+
+set -e
+if [ "$VERBOSE" ]; then
+  set -x
+fi
+set -u
+
+# Create the Debian changelog file needed by dpkg-gencontrol. This just adds a
+# placeholder change, indicating it is the result of an automatic build.
+# TODO(mmoss) Release packages should create something meaningful for a
+# changelog, but simply grabbing the actual 'svn log' is way too verbose. Do we
+# have any type of "significant/visible changes" log that we could use for this?
+gen_changelog() {
+  rm -f "${DEB_CHANGELOG}"
+  process_template "${SCRIPTDIR}/changelog.template" "${DEB_CHANGELOG}"
+  debchange -a --nomultimaint -m --changelog "${DEB_CHANGELOG}" \
+    "Release Notes: ${RELEASENOTES}"
+  GZLOG="${STAGEDIR}/usr/share/doc/${PACKAGE}-${CHANNEL}/changelog.gz"
+  mkdir -p "$(dirname "${GZLOG}")"
+  gzip -9 -c "${DEB_CHANGELOG}" > "${GZLOG}"
+  chmod 644 "${GZLOG}"
+}
+
+# Create the Debian control file needed by dpkg-deb.
+gen_control() {
+  dpkg-gencontrol -v"${VERSIONFULL}" -c"${DEB_CONTROL}" -l"${DEB_CHANGELOG}" \
+  -f"${DEB_FILES}" -p"${PACKAGE}-${CHANNEL}" -P"${STAGEDIR}" \
+  -O > "${STAGEDIR}/DEBIAN/control"
+  rm -f "${DEB_CONTROL}"
+}
+
+# Setup the installation directory hierachy in the package staging area.
+prep_staging_debian() {
+  prep_staging_common
+  install -m 755 -d "${STAGEDIR}/DEBIAN" \
+    "${STAGEDIR}/etc/cron.daily" \
+    "${STAGEDIR}/usr/share/menu" \
+    "${STAGEDIR}/usr/share/doc/${PACKAGE}"
+}
+
+# Put the package contents in the staging area.
+stage_install_debian() {
+  # Always use a different name for /usr/bin symlink depending on channel.
+  # First, to avoid file collisions. Second, to make it possible to
+  # use update-alternatives for /usr/bin/google-chrome.
+  local USR_BIN_SYMLINK_NAME="${PACKAGE}-${CHANNEL}"
+
+  if [ "$CHANNEL" != "stable" ]; then
+    # This would ideally be compiled into the app, but that's a bit too
+    # intrusive of a change for these limited use channels, so we'll just hack
+    # it into the wrapper script. The user can still override since it seems to
+    # work to specify --user-data-dir multiple times on the command line, with
+    # the last occurrence winning.
+    local SXS_USER_DATA_DIR="\${XDG_CONFIG_HOME:-\${HOME}/.config}/${PACKAGE}-${CHANNEL}"
+    local DEFAULT_FLAGS="--user-data-dir=\"${SXS_USER_DATA_DIR}\""
+
+    # Avoid file collisions between channels.
+    local INSTALLDIR="${INSTALLDIR}-${CHANNEL}"
+
+    local PACKAGE="${PACKAGE}-${CHANNEL}"
+
+    # Make it possible to distinguish between menu entries
+    # for different channels.
+    local MENUNAME="${MENUNAME} (${CHANNEL})"
+  fi
+  prep_staging_debian
+  stage_install_common
+  echo "Staging Debian install files in '${STAGEDIR}'..."
+  install -m 755 -d "${STAGEDIR}/${INSTALLDIR}/cron"
+  process_template "${BUILDDIR}/installer/common/repo.cron" \
+      "${STAGEDIR}/${INSTALLDIR}/cron/${PACKAGE}"
+  chmod 755 "${STAGEDIR}/${INSTALLDIR}/cron/${PACKAGE}"
+  pushd "${STAGEDIR}/etc/cron.daily/"
+  ln -snf "${INSTALLDIR}/cron/${PACKAGE}" "${PACKAGE}"
+  popd
+  process_template "${BUILDDIR}/installer/debian/debian.menu" \
+    "${STAGEDIR}/usr/share/menu/${PACKAGE}.menu"
+  chmod 644 "${STAGEDIR}/usr/share/menu/${PACKAGE}.menu"
+  process_template "${BUILDDIR}/installer/debian/postinst" \
+    "${STAGEDIR}/DEBIAN/postinst"
+  chmod 755 "${STAGEDIR}/DEBIAN/postinst"
+  process_template "${BUILDDIR}/installer/debian/prerm" \
+    "${STAGEDIR}/DEBIAN/prerm"
+  chmod 755 "${STAGEDIR}/DEBIAN/prerm"
+  process_template "${BUILDDIR}/installer/debian/postrm" \
+    "${STAGEDIR}/DEBIAN/postrm"
+  chmod 755 "${STAGEDIR}/DEBIAN/postrm"
+}
+
+# Actually generate the package file.
+do_package() {
+  echo "Packaging ${ARCHITECTURE}..."
+  PREDEPENDS="$COMMON_PREDEPS"
+  DEPENDS="${COMMON_DEPS}"
+  REPLACES=""
+  CONFLICTS=""
+  PROVIDES="www-browser"
+  gen_changelog
+  process_template "${SCRIPTDIR}/control.template" "${DEB_CONTROL}"
+  export DEB_HOST_ARCH="${ARCHITECTURE}"
+  if [ -f "${DEB_CONTROL}" ]; then
+    gen_control
+  fi
+  fakeroot dpkg-deb -Zlzma -b "${STAGEDIR}" .
+}
+
+# Remove temporary files and unwanted packaging output.
+cleanup() {
+  echo "Cleaning..."
+  rm -rf "${STAGEDIR}"
+  rm -rf "${TMPFILEDIR}"
+}
+
+usage() {
+  echo "usage: $(basename $0) [-c channel] [-a target_arch] [-o 'dir'] "
+  echo "                      [-b 'dir']"
+  echo "-c channel the package channel (trunk, asan, unstable, beta, stable)"
+  echo "-a arch    package architecture (ia32 or x64)"
+  echo "-o dir     package output directory [${OUTPUTDIR}]"
+  echo "-b dir     build input directory    [${BUILDDIR}]"
+  echo "-h         this help message"
+}
+
+# Check that the channel name is one of the allowable ones.
+verify_channel() {
+  case $CHANNEL in
+    stable )
+      CHANNEL=stable
+      RELEASENOTES="http://googlechromereleases.blogspot.com/search/label/Stable%20updates"
+      ;;
+    unstable|dev|alpha )
+      CHANNEL=unstable
+      RELEASENOTES="http://googlechromereleases.blogspot.com/search/label/Dev%20updates"
+      ;;
+    testing|beta )
+      CHANNEL=beta
+      RELEASENOTES="http://googlechromereleases.blogspot.com/search/label/Beta%20updates"
+      ;;
+    trunk|asan )
+      # Setting this to empty will prevent it from updating any existing configs
+      # from release packages.
+      REPOCONFIG=""
+      RELEASENOTES="http://googlechromereleases.blogspot.com/"
+      ;;
+    * )
+      echo
+      echo "ERROR: '$CHANNEL' is not a valid channel type."
+      echo
+      exit 1
+      ;;
+  esac
+}
+
+process_opts() {
+  while getopts ":o:b:c:a:h" OPTNAME
+  do
+    case $OPTNAME in
+      o )
+        OUTPUTDIR=$(readlink -f "${OPTARG}")
+        mkdir -p "${OUTPUTDIR}"
+        ;;
+      b )
+        BUILDDIR=$(readlink -f "${OPTARG}")
+        ;;
+      c )
+        CHANNEL="$OPTARG"
+        ;;
+      a )
+        TARGETARCH="$OPTARG"
+        ;;
+      h )
+        usage
+        exit 0
+        ;;
+      \: )
+        echo "'-$OPTARG' needs an argument."
+        usage
+        exit 1
+        ;;
+      * )
+        echo "invalid command-line option: $OPTARG"
+        usage
+        exit 1
+        ;;
+    esac
+  done
+}
+
+#=========
+# MAIN
+#=========
+
+SCRIPTDIR=$(readlink -f "$(dirname "$0")")
+OUTPUTDIR="${PWD}"
+STAGEDIR=$(mktemp -d -t deb.build.XXXXXX) || exit 1
+TMPFILEDIR=$(mktemp -d -t deb.tmp.XXXXXX) || exit 1
+DEB_CHANGELOG="${TMPFILEDIR}/changelog"
+DEB_FILES="${TMPFILEDIR}/files"
+DEB_CONTROL="${TMPFILEDIR}/control"
+CHANNEL="trunk"
+# Default target architecture to same as build host.
+if [ "$(uname -m)" = "x86_64" ]; then
+  TARGETARCH="x64"
+else
+  TARGETARCH="ia32"
+fi
+
+# call cleanup() on exit
+trap cleanup 0
+process_opts "$@"
+if [ ! "$BUILDDIR" ]; then
+  BUILDDIR=$(readlink -f "${SCRIPTDIR}/../../../../../out/Release")
+fi
+
+source ${BUILDDIR}/installer/common/installer.include
+
+get_version_info
+VERSIONFULL="${VERSION}-${PACKAGE_RELEASE}"
+
+if [ "$CHROMIUM_BUILD" = "_google_chrome" ]; then
+  source "${BUILDDIR}/installer/common/google-chrome.info"
+else
+  source "${BUILDDIR}/installer/common/chromium-browser.info"
+fi
+eval $(sed -e "s/^\([^=]\+\)=\(.*\)$/export \1='\2'/" \
+  "${BUILDDIR}/installer/theme/BRANDING")
+
+REPOCONFIG="deb http://dl.google.com/linux/chrome/deb/ stable main"
+verify_channel
+
+# Some Debian packaging tools want these set.
+export DEBFULLNAME="${MAINTNAME}"
+export DEBEMAIL="${MAINTMAIL}"
+
+# We'd like to eliminate more of these deps by relying on the 'lsb' package, but
+# that brings in tons of unnecessary stuff, like an mta and rpm. Until that full
+# 'lsb' package is installed by default on DEB distros, we'll have to stick with
+# the LSB sub-packages, to avoid pulling in all that stuff that's not installed
+# by default.
+
+# Need a dummy debian/control file for dpkg-shlibdeps.
+DUMMY_STAGING_DIR="${TMPFILEDIR}/dummy_staging"
+mkdir "$DUMMY_STAGING_DIR"
+cd "$DUMMY_STAGING_DIR"
+mkdir debian
+touch debian/control
+
+# Generate the dependencies,
+# TODO(mmoss): This is a workaround for a problem where dpkg-shlibdeps was
+# resolving deps using some of our build output shlibs (i.e.
+# out/Release/lib.target/libfreetype.so.6), and was then failing with:
+#   dpkg-shlibdeps: error: no dependency information found for ...
+# It's not clear if we ever want to look in LD_LIBRARY_PATH to resolve deps,
+# but it seems that we don't currently, so this is the most expediant fix.
+SAVE_LDLP=${LD_LIBRARY_PATH:-}
+unset LD_LIBRARY_PATH
+DPKG_SHLIB_DEPS=$(dpkg-shlibdeps -O "$BUILDDIR/chrome" 2> /dev/null | \
+  sed 's/^shlibs:Depends=//')
+if [ -n "$SAVE_LDLP" ]; then
+  LD_LIBRARY_PATH=$SAVE_LDLP
+fi
+
+# Format it nicely and save it for comparison.
+# The grep -v is for a duplicate libc6 dep caused by Lucid glibc silliness.
+echo "$DPKG_SHLIB_DEPS" | sed 's/, /\n/g' | \
+  grep -v '^libc6 (>= 2.3.6-6~)$' > actual
+
+# Compare the expected dependency list to the generate list.
+BAD_DIFF=0
+diff "$SCRIPTDIR/expected_deps" actual || BAD_DIFF=1
+if [ $BAD_DIFF -ne 0 ] && [ -z "${IGNORE_DEPS_CHANGES:-}" ]; then
+  echo
+  echo "ERROR: Shared library dependencies changed!"
+  echo "If this is intentional, please update:"
+  echo "chrome/installer/linux/debian/expected_deps"
+  echo
+  exit $BAD_DIFF
+fi
+rm -rf "$DUMMY_STAGING_DIR"
+
+# Additional dependencies not in the dpkg-shlibdeps output.
+# Pull a more recent version of NSS than required by runtime linking, for
+# security and stability updates in NSS.
+ADDITION_DEPS="ca-certificates, libcurl3, libnss3 (>= 3.14.3), \
+  lsb-base (>=3.2), xdg-utils (>= 1.0.2), wget"
+
+# Fix-up libnspr dependency due to renaming in Ubuntu (the old package still
+# exists, but it was moved to "universe" repository, which isn't installed by
+# default).
+DPKG_SHLIB_DEPS=$(sed \
+    's/\(libnspr4-0d ([^)]*)\), /\1 | libnspr4 (>= 4.9.5-0ubuntu0), /g' \
+    <<< $DPKG_SHLIB_DEPS)
+
+# Fix-up libudev dependency because Ubuntu 13.04 has libudev1 instead of
+# libudev0.
+DPKG_SHLIB_DEPS=$(sed 's/\(libudev0 ([^)]*)\), /\1 | libudev1 (>= 198), /g' \
+                  <<< $DPKG_SHLIB_DEPS)
+
+COMMON_DEPS="${DPKG_SHLIB_DEPS}, ${ADDITION_DEPS}"
+COMMON_PREDEPS="dpkg (>= 1.14.0)"
+
+
+# Make everything happen in the OUTPUTDIR.
+cd "${OUTPUTDIR}"
+
+case "$TARGETARCH" in
+  ia32 )
+    export ARCHITECTURE="i386"
+    stage_install_debian
+    ;;
+  x64 )
+    export ARCHITECTURE="amd64"
+    stage_install_debian
+    ;;
+  * )
+    echo
+    echo "ERROR: Don't know how to build DEBs for '$TARGETARCH'."
+    echo
+    exit 1
+    ;;
+esac
+
+do_package
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/changelog.template b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/changelog.template
new file mode 100644 (file)
index 0000000..fa2d1dd
--- /dev/null
@@ -0,0 +1,5 @@
+@@PACKAGE@@-@@CHANNEL@@ (@@VERSIONFULL@@) @@CHANNEL@@; urgency=low
+
+  * Build spec: http://src.chromium.org/viewvc/chrome/releases/@@VERSION@@/
+
+ -- @@MAINTNAME@@ <@@MAINTMAIL@@>  Tue, 03 Feb 2009 14:54:35 -0800
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/control.template b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/control.template
new file mode 100644 (file)
index 0000000..9b185bb
--- /dev/null
@@ -0,0 +1,16 @@
+Source: @@PACKAGE@@-@@CHANNEL@@
+Section: web
+Priority: optional
+Maintainer: @@MAINTNAME@@ <@@MAINTMAIL@@>
+Build-Depends: dpkg-dev, devscripts, fakeroot, lzma
+Standards-Version: 3.8.0
+
+Package: @@PACKAGE@@-@@CHANNEL@@
+Provides: @@PROVIDES@@
+Replaces: @@REPLACES@@
+Conflicts: @@CONFLICTS@@
+Pre-Depends: @@PREDEPENDS@@
+Depends: @@DEPENDS@@
+Architecture: @@ARCHITECTURE@@
+Description: @@SHORTDESC@@
+ @@FULLDESC@@
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/debian.menu b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/debian.menu
new file mode 100644 (file)
index 0000000..96a99c2
--- /dev/null
@@ -0,0 +1,6 @@
+?package(@@PACKAGE@@):needs="x11" \
+  section="Applications/Network/Web Browsing" \
+  hints="Web browsers" \
+  title="@@MENUNAME@@" \
+  icon="@@INSTALLDIR@@/product_logo_32.xpm" \
+  command="@@INSTALLDIR@@/@@PACKAGE@@"
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/expected_deps b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/expected_deps
new file mode 100644 (file)
index 0000000..a0a49c9
--- /dev/null
@@ -0,0 +1,32 @@
+gconf-service
+libasound2 (>= 1.0.23)
+libc6 (>= 2.11)
+libcairo2 (>= 1.6.0)
+libcap2 (>= 2.10)
+libcups2 (>= 1.4.0)
+libdbus-1-3 (>= 1.2.14)
+libexpat1 (>= 1.95.8)
+libfontconfig1 (>= 2.8.0)
+libfreetype6 (>= 2.3.9)
+libgcc1 (>= 1:4.1.1)
+libgconf-2-4 (>= 2.31.1)
+libgcrypt11 (>= 1.4.5)
+libgdk-pixbuf2.0-0 (>= 2.22.0)
+libglib2.0-0 (>= 2.26.0)
+libgtk2.0-0 (>= 2.24.0)
+libnspr4 (>= 1.8.0.10)
+libnss3 (>= 3.14.3)
+libpango1.0-0 (>= 1.22.0)
+libstdc++6 (>= 4.6)
+libudev0 (>= 147)
+libx11-6 (>= 2:1.4.99.1)
+libxcomposite1 (>= 1:0.3-1)
+libxcursor1 (>> 1.1.2)
+libxdamage1 (>= 1:1.1)
+libxext6
+libxfixes3
+libxi6 (>= 2:1.2.99.4)
+libxrandr2 (>= 2:1.2.99.2)
+libxrender1
+libxss1
+libxtst6
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/postinst b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/postinst
new file mode 100755 (executable)
index 0000000..da5e6b1
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -e
+
+@@include@@../common/postinst.include
+
+# Add to the alternatives system
+#
+# On Ubuntu 12.04, we have the following priorities
+# (which can be obtain be installing browsers and running
+# update-alternatives --query x-www-browser):
+#
+# /usr/bin/epiphany-browser  85
+# /usr/bin/firefox           40
+# /usr/bin/konqueror         30
+#
+# While we would expect these values to be keyed off the most popular
+# browser (Firefox), in practice, we treat Epiphany as the lower bound,
+# resulting in the following scheme:
+
+CHANNEL=@@CHANNEL@@
+case $CHANNEL in
+  stable )
+    # Good enough to be the default.
+    PRIORITY=200
+    ;;
+  beta )
+    # Almost good enough to be the default. (Firefox stable should arguably be
+    # higher than this, but since that's below the "Epiphany threshold", we're
+    # not setting our priority below it. Anyone want to poke Firefox to raise
+    # their priority?)
+    PRIORITY=150
+    ;;
+  unstable )
+    # Unstable, give it the "lowest" priority.
+    PRIORITY=120
+    ;;
+  * )
+    PRIORITY=0
+    ;;
+esac
+
+update-alternatives --install /usr/bin/x-www-browser x-www-browser \
+  /usr/bin/@@USR_BIN_SYMLINK_NAME@@ $PRIORITY
+update-alternatives --install /usr/bin/gnome-www-browser gnome-www-browser \
+  /usr/bin/@@USR_BIN_SYMLINK_NAME@@ $PRIORITY
+
+update-alternatives --install /usr/bin/google-chrome google-chrome \
+  /usr/bin/@@USR_BIN_SYMLINK_NAME@@ $PRIORITY
+
+@@include@@../common/apt.include
+
+@@include@@../common/symlinks.include
+
+remove_udev_symlinks
+add_udev_symlinks
+
+## MAIN ##
+if [ ! -e "$DEFAULTS_FILE" ]; then
+  echo 'repo_add_once="true"' > "$DEFAULTS_FILE"
+  echo 'repo_reenable_on_distupgrade="true"' >> "$DEFAULTS_FILE"
+fi
+
+# Run the cron job immediately to perform repository configuration.
+nohup sh /etc/cron.daily/@@PACKAGE@@ > /dev/null 2>&1 &
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/postrm b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/postrm
new file mode 100755 (executable)
index 0000000..85b9961
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -e
+
+action="$1"
+
+# Only do complete clean-up on purge.
+if [ "$action" != "purge" ] ; then
+  exit 0
+fi
+
+@@include@@../common/apt.include
+
+@@include@@../common/symlinks.include
+
+remove_udev_symlinks
+
+# Only remove the defaults file if it is not empty. An empty file was probably
+# put there by the sysadmin to disable automatic repository configuration, as
+# per the instructions on the package download page.
+if [ -s "$DEFAULTS_FILE" ]; then
+  # Make sure the package defaults are removed before the repository config,
+  # otherwise it could result in the repository config being removed, but the
+  # package defaults remain and are set to not recreate the repository config.
+  # In that case, future installs won't recreate it and won't get auto-updated.
+  rm "$DEFAULTS_FILE" || exit 1
+fi
+# Remove any Google repository added by the package.
+clean_sources_lists
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/prerm b/src/chrome/tools/test/reference_build/chrome_linux/installer/debian/prerm
new file mode 100755 (executable)
index 0000000..c2870d2
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -e
+
+action="$1"
+if [ "$2" = "in-favour" ]; then
+  # Treat conflict remove as an upgrade.
+  action="upgrade"
+fi
+# Don't clean-up just for an upgrade.`
+if [ "$action" = "upgrade" ] ; then
+  exit 0
+fi
+
+@@include@@../common/prerm.include
+
+# Remove from the alternatives system
+update-alternatives --remove x-www-browser /usr/bin/@@USR_BIN_SYMLINK_NAME@@
+update-alternatives --remove gnome-www-browser /usr/bin/@@USR_BIN_SYMLINK_NAME@@
+
+update-alternatives --remove google-chrome /usr/bin/@@USR_BIN_SYMLINK_NAME@@
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/build.sh b/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/build.sh
new file mode 100755 (executable)
index 0000000..a312f5e
--- /dev/null
@@ -0,0 +1,314 @@
+#!/bin/bash
+#
+# 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.
+
+# TODO(mmoss) This currently only works with official builds, since non-official
+# builds don't add the "${BUILDDIR}/installer/" files needed for packaging.
+
+set -e
+if [ "$VERBOSE" ]; then
+  set -x
+fi
+set -u
+
+gen_spec() {
+  rm -f "${SPEC}"
+  # Trunk packages need to install to a custom path so they don't conflict with
+  # release channel packages.
+  local PACKAGE_FILENAME="${PACKAGE}"
+  if [ "$CHANNEL" = "trunk" ] || [ "$CHANNEL" = "asan" ]; then
+    local INSTALLDIR="${INSTALLDIR}-${CHANNEL}"
+    PACKAGE_FILENAME="${PACKAGE}-${CHANNEL}"
+    local MENUNAME="${MENUNAME} (${CHANNEL})"
+  fi
+  process_template "${SCRIPTDIR}/chrome.spec.template" "${SPEC}"
+}
+
+# Setup the installation directory hierachy in the package staging area.
+prep_staging_rpm() {
+  prep_staging_common
+  install -m 755 -d "${STAGEDIR}/etc/cron.daily"
+}
+
+# Put the package contents in the staging area.
+stage_install_rpm() {
+  # TODO(phajdan.jr): Deduplicate this and debian/build.sh .
+  # For now duplication is going to help us avoid merge conflicts
+  # as changes are frequently merged to older branches related to SxS effort.
+  if [ "$CHANNEL" != "stable" ]; then
+    # This would ideally be compiled into the app, but that's a bit too
+    # intrusive of a change for these limited use channels, so we'll just hack
+    # it into the wrapper script. The user can still override since it seems to
+    # work to specify --user-data-dir multiple times on the command line, with
+    # the last occurrence winning.
+    local SXS_USER_DATA_DIR="\${XDG_CONFIG_HOME:-\${HOME}/.config}/${PACKAGE}-${CHANNEL}"
+    local DEFAULT_FLAGS="--user-data-dir=\"${SXS_USER_DATA_DIR}\""
+
+    # Avoid file collisions between channels.
+    # TODO(phajdan.jr): Do that for all packages for SxS,
+    # http://crbug.com/38598 .
+    # We can't do this for now for all packages because of
+    # http://crbug.com/295103 , and ultimately http://crbug.com/22703 .
+    # Also see https://groups.google.com/a/chromium.org/d/msg/chromium-dev/DBEqOORaRiw/pE0bNI6h0kcJ .
+    if [ "$CHANNEL" = "trunk" ] || [ "$CHANNEL" = "asan" ]; then
+      local PACKAGE="${PACKAGE}-${CHANNEL}"
+      local INSTALLDIR="${INSTALLDIR}-${CHANNEL}"
+    fi
+
+    # Make it possible to distinguish between menu entries
+    # for different channels.
+    local MENUNAME="${MENUNAME} (${CHANNEL})"
+  fi
+  prep_staging_rpm
+  stage_install_common
+  echo "Staging RPM install files in '${STAGEDIR}'..."
+  process_template "${BUILDDIR}/installer/common/rpmrepo.cron" \
+    "${STAGEDIR}/etc/cron.daily/${PACKAGE}"
+  chmod 755 "${STAGEDIR}/etc/cron.daily/${PACKAGE}"
+}
+
+# Actually generate the package file.
+do_package() {
+  echo "Packaging ${ARCHITECTURE}..."
+  PROVIDES="${PACKAGE}"
+  local REPS="$REPLACES"
+  REPLACES=""
+  for rep in $REPS; do
+    if [ -z "$REPLACES" ]; then
+      REPLACES="$PACKAGE-$rep"
+    else
+      REPLACES="$REPLACES $PACKAGE-$rep"
+    fi
+  done
+
+  # The symbols in libX11.so are not versioned, so when a newer version has new
+  # symbols like _XGetRequest, RPM's find-requires tool does not detect it, and
+  # there is no way to specify a libX11.so version number to prevent
+  # installation on affected distros like OpenSUSE 12.1 and Fedora 16.
+  # Thus there has to be distro-specific conflict here.
+  # TODO(thestig) Remove these in the future when other requirements prevent
+  # installation on affected distros.
+  ADDITIONAL_CONFLICTS="xorg-x11-libX11 < 7.6_1 libX11 < 1.4.99"
+  REPLACES="$REPLACES $ADDITIONAL_CONFLICTS"
+
+  # If we specify a dependecy of foo.so below, we would depend on both the
+  # 32 and 64-bit versions on a 64-bit machine. The current version of RPM
+  # we use is too old and doesn't provide %{_isa}, so we do this manually.
+  if [ "$ARCHITECTURE" = "x86_64" ] ; then
+    local EMPTY_VERSION="()"
+    local PKG_ARCH="(64bit)"
+  elif [ "$ARCHITECTURE" = "i386" ] ; then
+    local EMPTY_VERSION=""
+    local PKG_ARCH=""
+  fi
+
+  # Use find-requires script to make sure the dependencies are complete
+  # (especially libc and libstdc++ versions).
+  # - Filter out udev to avoid libudev.so.0 vs. libudev.so.1 mismatches.
+  DETECTED_DEPENDS="$(echo "${BUILDDIR}/chrome" | /usr/lib/rpm/find-requires |
+      grep -v udev)"
+
+  # Compare the expected dependency list to the generated list.
+  BAD_DIFF=0
+  diff "$SCRIPTDIR/expected_deps_$ARCHITECTURE" \
+      <(echo "${DETECTED_DEPENDS}") || BAD_DIFF=1
+  if [ $BAD_DIFF -ne 0 ] && [ -z "${IGNORE_DEPS_CHANGES:-}" ]; then
+    echo
+    echo "ERROR: Shared library dependencies changed!"
+    echo "If this is intentional, please update:"
+    echo "chrome/installer/linux/rpm/expected_deps_i386"
+    echo "chrome/installer/linux/rpm/expected_deps_x86_64"
+    echo
+    exit $BAD_DIFF
+  fi
+
+  # libgdk_pixbuf is added in LSB 3.2 and no longer explicitly required.
+  # libcairo, libpangocairo, libasound are in LSB 4. and no longer explicitly
+  # required.
+  # xdg-utils is still optional in LSB 4.0.
+  # nss (bundled) is optional in LSB 4.0.
+  #
+  # We want to depend on the system SSL certs so wget can upload crash reports
+  # securely, but there's no common capability between the distros. Bugs filed:
+  # https://qa.mandriva.com/show_bug.cgi?id=55714
+  # https://bugzilla.redhat.com/show_bug.cgi?id=538158
+  # https://bugzilla.novell.com/show_bug.cgi?id=556248
+  DEPENDS="lsb >= 4.0, \
+  libcurl.so.4${EMPTY_VERSION}${PKG_ARCH}, \
+  libnss3.so(NSS_3.14.3)${PKG_ARCH}, \
+  wget, \
+  xdg-utils, \
+  zlib, \
+  $(echo "${DETECTED_DEPENDS}" | tr '\n' ',')"
+  gen_spec
+
+  # Create temporary rpmbuild dirs.
+  RPMBUILD_DIR=$(mktemp -d -t rpmbuild.XXXXXX) || exit 1
+  mkdir -p "$RPMBUILD_DIR/BUILD"
+  mkdir -p "$RPMBUILD_DIR/RPMS"
+
+  # '__os_install_post ${nil}' disables a bunch of automatic post-processing
+  # (brp-compress, etc.), which by default appears to only be enabled on 32-bit,
+  # and which doesn't gain us anything since we already explicitly do all the
+  # compression, symbol stripping, etc. that we want.
+  fakeroot rpmbuild -bb --target="$ARCHITECTURE" --rmspec \
+    --define "_topdir $RPMBUILD_DIR" \
+    --define "_binary_payload w9.bzdio" \
+    --define "__os_install_post  %{nil}" \
+    "${SPEC}"
+  PKGNAME="${PACKAGE}-${CHANNEL}-${VERSION}-${PACKAGE_RELEASE}"
+  mv "$RPMBUILD_DIR/RPMS/$ARCHITECTURE/${PKGNAME}.${ARCHITECTURE}.rpm" \
+     "${OUTPUTDIR}"
+  # Make sure the package is world-readable, otherwise it causes problems when
+  # copied to share drive.
+  chmod a+r "${OUTPUTDIR}/${PKGNAME}.$ARCHITECTURE.rpm"
+  rm -rf "$RPMBUILD_DIR"
+}
+
+# Remove temporary files and unwanted packaging output.
+cleanup() {
+  rm -rf "${STAGEDIR}"
+  rm -rf "${TMPFILEDIR}"
+}
+
+usage() {
+  echo "usage: $(basename $0) [-c channel] [-a target_arch] [-o 'dir']"
+  echo "                      [-b 'dir']"
+  echo "-c channel the package channel (trunk, asan, unstable, beta, stable)"
+  echo "-a arch    package architecture (ia32 or x64)"
+  echo "-o dir     package output directory [${OUTPUTDIR}]"
+  echo "-b dir     build input directory    [${BUILDDIR}]"
+  echo "-h         this help message"
+}
+
+# Check that the channel name is one of the allowable ones.
+verify_channel() {
+  case $CHANNEL in
+    stable )
+      CHANNEL=stable
+      REPLACES="unstable beta"
+      ;;
+    unstable|dev|alpha )
+      CHANNEL=unstable
+      REPLACES="stable beta"
+      ;;
+    testing|beta )
+      CHANNEL=beta
+      REPLACES="unstable stable"
+      ;;
+    trunk|asan )
+      # This is a special package, mostly for development testing, so don't make
+      # it replace any installed release packages.
+      REPLACES="dummy"
+      # Setting this to empty will prevent it from updating any existing configs
+      # from release packages.
+      REPOCONFIG=""
+      ;;
+    * )
+      echo
+      echo "ERROR: '$CHANNEL' is not a valid channel type."
+      echo
+      exit 1
+      ;;
+  esac
+}
+
+process_opts() {
+  while getopts ":o:b:c:a:h" OPTNAME
+  do
+    case $OPTNAME in
+      o )
+        OUTPUTDIR=$(readlink -f "${OPTARG}")
+        mkdir -p "${OUTPUTDIR}"
+        ;;
+      b )
+        BUILDDIR=$(readlink -f "${OPTARG}")
+        ;;
+      c )
+        CHANNEL="$OPTARG"
+        verify_channel
+        ;;
+      a )
+        TARGETARCH="$OPTARG"
+        ;;
+      h )
+        usage
+        exit 0
+        ;;
+      \: )
+        echo "'-$OPTARG' needs an argument."
+        usage
+        exit 1
+        ;;
+      * )
+        echo "invalid command-line option: $OPTARG"
+        usage
+        exit 1
+        ;;
+    esac
+  done
+}
+
+#=========
+# MAIN
+#=========
+
+SCRIPTDIR=$(readlink -f "$(dirname "$0")")
+OUTPUTDIR="${PWD}"
+STAGEDIR=$(mktemp -d -t rpm.build.XXXXXX) || exit 1
+TMPFILEDIR=$(mktemp -d -t rpm.tmp.XXXXXX) || exit 1
+CHANNEL="trunk"
+# Default target architecture to same as build host.
+if [ "$(uname -m)" = "x86_64" ]; then
+  TARGETARCH="x64"
+else
+  TARGETARCH="ia32"
+fi
+SPEC="${TMPFILEDIR}/chrome.spec"
+
+# call cleanup() on exit
+trap cleanup 0
+process_opts "$@"
+if [ ! "$BUILDDIR" ]; then
+  BUILDDIR=$(readlink -f "${SCRIPTDIR}/../../../../../out/Release")
+fi
+
+source ${BUILDDIR}/installer/common/installer.include
+
+get_version_info
+
+if [ "$CHROMIUM_BUILD" = "_google_chrome" ]; then
+  source "${BUILDDIR}/installer/common/google-chrome.info"
+else
+  source "${BUILDDIR}/installer/common/chromium-browser.info"
+fi
+eval $(sed -e "s/^\([^=]\+\)=\(.*\)$/export \1='\2'/" \
+  "${BUILDDIR}/installer/theme/BRANDING")
+
+REPOCONFIG="http://dl.google.com/linux/${PACKAGE#google-}/rpm/stable"
+verify_channel
+export USR_BIN_SYMLINK_NAME="${PACKAGE}-${CHANNEL}"
+
+# Make everything happen in the OUTPUTDIR.
+cd "${OUTPUTDIR}"
+
+case "$TARGETARCH" in
+  ia32 )
+    export ARCHITECTURE="i386"
+    stage_install_rpm
+    ;;
+  x64 )
+    export ARCHITECTURE="x86_64"
+    stage_install_rpm
+    ;;
+  * )
+    echo
+    echo "ERROR: Don't know how to build RPMs for '$TARGETARCH'."
+    echo
+    exit 1
+    ;;
+esac
+
+do_package
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/chrome.spec.template b/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/chrome.spec.template
new file mode 100644 (file)
index 0000000..e93f02f
--- /dev/null
@@ -0,0 +1,231 @@
+#------------------------------------------------------------------------------
+#   chrome.spec
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+#   Prologue information
+#------------------------------------------------------------------------------
+Summary         : @@MENUNAME@@
+License         : Multiple, see @@PRODUCTURL@@
+Name            : @@PACKAGE@@-@@CHANNEL@@
+Version         : @@VERSION@@
+Release         : @@PACKAGE_RELEASE@@
+Group           : Applications/Internet
+Vendor          : @@COMPANY_FULLNAME@@
+Url             : @@PRODUCTURL@@
+Packager        : @@MAINTNAME@@ <@@MAINTMAIL@@>
+
+Provides        : @@PROVIDES@@ = %{version}
+Requires        : @@DEPENDS@@
+Requires(post)  : %{_sbindir}/update-alternatives
+Requires(preun) : %{_sbindir}/update-alternatives
+Autoreqprov     : No
+Conflicts       : @@REPLACES@@
+
+BuildRoot       : %{_tmppath}/%{name}-%{version}-root
+
+# The prefix is pretty important; RPM uses this to figure out
+# how to make a package relocatable
+prefix          : /opt
+
+#------------------------------------------------------------------------------
+#   Description
+#------------------------------------------------------------------------------
+%Description
+@@SHORTDESC@@
+
+@@FULLDESC@@
+
+#------------------------------------------------------------------------------
+#   Build rule - How to make the package
+#------------------------------------------------------------------------------
+%build
+
+#------------------------------------------------------------------------------
+#       Installation rule - how to install it (note that it
+#   gets installed into a temp directory given by $RPM_BUILD_ROOT)
+#------------------------------------------------------------------------------
+%install
+rm -rf "$RPM_BUILD_ROOT"
+
+if [ -z "@@STAGEDIR@@" -o ! -d "@@STAGEDIR@@" ] ; then
+    echo "@@STAGEDIR@@ appears to be incorrectly set - aborting"
+    exit 1
+fi
+
+if [ -z "@@INSTALLDIR@@" -o ! -d "@@STAGEDIR@@/@@INSTALLDIR@@" ] ; then
+    echo "@@INSTALLDIR@@ appears to be incorrectly set - aborting"
+    exit 1
+fi
+
+install -m 755 -d \
+  "$RPM_BUILD_ROOT/etc" \
+  "$RPM_BUILD_ROOT/opt" \
+  "$RPM_BUILD_ROOT/usr"
+# This is hard coded for now
+cp -a "@@STAGEDIR@@/etc/" "$RPM_BUILD_ROOT/"
+cp -a "@@STAGEDIR@@/opt/" "$RPM_BUILD_ROOT/"
+cp -a "@@STAGEDIR@@/usr/" "$RPM_BUILD_ROOT/"
+
+#------------------------------------------------------------------------------
+#   Rule to clean up a build
+#------------------------------------------------------------------------------
+%clean
+rm -rf "$RPM_BUILD_ROOT"
+
+#------------------------------------------------------------------------------
+#   Files listing.
+#------------------------------------------------------------------------------
+%files
+%defattr(-,root,root)
+#%doc README
+
+# We cheat and just let RPM figure it out for us; everything we install
+# should go under this prefix anyways.
+@@INSTALLDIR@@
+
+# Be explicit about the files we scatter throughout the system we don't
+# accidentally "own" stuff that's not ours (crbug.com/123990).
+/etc/cron.daily/@@PACKAGE_FILENAME@@
+%ghost %attr(755,root,root) /usr/bin/google-chrome
+/usr/bin/@@USR_BIN_SYMLINK_NAME@@
+/usr/share/applications/@@PACKAGE_FILENAME@@.desktop
+/usr/share/gnome-control-center/default-apps/@@PACKAGE_FILENAME@@.xml
+%docdir /usr/share/man/man1
+/usr/share/man/man1/@@PACKAGE_FILENAME@@.1
+
+#------------------------------------------------------------------------------
+#   Pre install script
+#------------------------------------------------------------------------------
+%pre
+
+exit 0
+
+
+
+
+#------------------------------------------------------------------------------
+#   Post install script
+#------------------------------------------------------------------------------
+%post
+
+@@include@@../common/postinst.include
+
+@@include@@../common/rpm.include
+
+@@include@@../common/symlinks.include
+
+remove_nss_symlinks
+add_nss_symlinks
+
+remove_udev_symlinks
+add_udev_symlinks
+
+DEFAULTS_FILE="/etc/default/@@PACKAGE@@"
+if [ ! -e "$DEFAULTS_FILE" ]; then
+  echo 'repo_add_once="true"' > "$DEFAULTS_FILE"
+fi
+
+. "$DEFAULTS_FILE"
+
+if [ "$repo_add_once" = "true" ]; then
+  determine_rpm_package_manager
+
+  case $PACKAGEMANAGER in
+  "yum")
+    install_yum
+    ;;
+  "urpmi")
+    install_urpmi
+    ;;
+  "yast")
+    install_yast
+    ;;
+  esac
+fi
+
+# Some package managers have locks that prevent everything from being
+# configured at install time, so wait a bit then kick the cron job to do
+# whatever is left. Probably the db will be unlocked by then, but if not, the
+# cron job will keep retrying.
+# Do this with 'at' instead of a backgrounded shell because zypper waits on all
+# sub-shells to finish before it finishes, which is exactly the opposite of
+# what we want here. Also preemptively start atd because for some reason it's
+# not always running, which kind of defeats the purpose of having 'at' as a
+# required LSB command.
+service atd start
+echo "sh /etc/cron.daily/@@PACKAGE@@" | at now + 2 minute > /dev/null 2>&1
+
+CHANNEL=@@CHANNEL@@
+case $CHANNEL in
+  stable )
+    PRIORITY=200
+    ;;
+  beta )
+    PRIORITY=150
+    ;;
+  unstable )
+    PRIORITY=120
+    ;;
+  * )
+    PRIORITY=0
+    ;;
+esac
+
+%{_sbindir}/update-alternatives --install /usr/bin/google-chrome google-chrome \
+  /usr/bin/@@USR_BIN_SYMLINK_NAME@@ $PRIORITY
+
+exit 0
+
+
+#------------------------------------------------------------------------------
+#   Pre uninstallation script
+#------------------------------------------------------------------------------
+%preun
+
+if [ "$1" -eq "0" ]; then
+  mode="uninstall"
+elif [ "$1" -eq "1" ]; then
+  mode="upgrade"
+fi
+
+@@include@@../common/rpm.include
+
+@@include@@../common/symlinks.include
+
+# Only remove menu items and symlinks on uninstall. When upgrading,
+# old_pkg's %preun runs after new_pkg's %post.
+if [ "$mode" = "uninstall" ]; then
+@@include@@../common/prerm.include
+  remove_nss_symlinks
+  remove_udev_symlinks
+
+  %{_sbindir}/update-alternatives --remove google-chrome \
+    /usr/bin/@@USR_BIN_SYMLINK_NAME@@
+fi
+
+# On Debian we only remove when we purge. However, RPM has no equivalent to
+# dpkg --purge, so this is all disabled.
+#
+#determine_rpm_package_manager
+#
+#case $PACKAGEMANAGER in
+#"yum")
+#  remove_yum
+#  ;;
+#"urpmi")
+#  remove_urpmi
+#  ;;
+#"yast")
+#  remove_yast
+#  ;;
+#esac
+
+exit 0
+
+#------------------------------------------------------------------------------
+#   Post uninstallation script
+#------------------------------------------------------------------------------
+%postun
+
+exit 0
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/expected_deps_i386 b/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/expected_deps_i386
new file mode 100644 (file)
index 0000000..52fd504
--- /dev/null
@@ -0,0 +1,78 @@
+ld-linux.so.2
+ld-linux.so.2(GLIBC_2.1)
+ld-linux.so.2(GLIBC_2.3)
+libasound.so.2
+libcairo.so.2
+libcap.so.2
+libc.so.6
+libc.so.6(GLIBC_2.0)
+libc.so.6(GLIBC_2.1)
+libc.so.6(GLIBC_2.11)
+libc.so.6(GLIBC_2.1.3)
+libc.so.6(GLIBC_2.2)
+libc.so.6(GLIBC_2.2.3)
+libc.so.6(GLIBC_2.3)
+libc.so.6(GLIBC_2.3.2)
+libc.so.6(GLIBC_2.3.4)
+libc.so.6(GLIBC_2.4)
+libc.so.6(GLIBC_2.6)
+libc.so.6(GLIBC_2.7)
+libc.so.6(GLIBC_2.8)
+libc.so.6(GLIBC_2.9)
+libcups.so.2
+libdbus-1.so.3
+libdl.so.2
+libdl.so.2(GLIBC_2.0)
+libdl.so.2(GLIBC_2.1)
+libexpat.so.1
+libfontconfig.so.1
+libfreetype.so.6
+libgcc_s.so.1
+libgcc_s.so.1(GCC_3.4)
+libgcc_s.so.1(GCC_4.0.0)
+libgcc_s.so.1(GLIBC_2.0)
+libgconf-2.so.4
+libgcrypt.so.11
+libgdk_pixbuf-2.0.so.0
+libgdk-x11-2.0.so.0
+libgio-2.0.so.0
+libglib-2.0.so.0
+libgobject-2.0.so.0
+libgtk-x11-2.0.so.0
+libm.so.6
+libm.so.6(GLIBC_2.0)
+libm.so.6(GLIBC_2.1)
+libnspr4.so
+libnss3.so
+libnssutil3.so
+libpango-1.0.so.0
+libpangocairo-1.0.so.0
+libplc4.so
+libpthread.so.0
+libpthread.so.0(GLIBC_2.0)
+libpthread.so.0(GLIBC_2.1)
+libpthread.so.0(GLIBC_2.2)
+libpthread.so.0(GLIBC_2.2.3)
+libpthread.so.0(GLIBC_2.3.2)
+libpthread.so.0(GLIBC_2.3.3)
+librt.so.1
+librt.so.1(GLIBC_2.2)
+libsmime3.so
+libstdc++.so.6
+libstdc++.so.6(GLIBCXX_3.4)
+libstdc++.so.6(GLIBCXX_3.4.10)
+libstdc++.so.6(GLIBCXX_3.4.11)
+libstdc++.so.6(GLIBCXX_3.4.15)
+libstdc++.so.6(GLIBCXX_3.4.5)
+libstdc++.so.6(GLIBCXX_3.4.9)
+libX11.so.6
+libXcomposite.so.1
+libXcursor.so.1
+libXdamage.so.1
+libXext.so.6
+libXfixes.so.3
+libXi.so.6
+libXrandr.so.2
+libXrender.so.1
+libXss.so.1
+libXtst.so.6
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/expected_deps_x86_64 b/src/chrome/tools/test/reference_build/chrome_linux/installer/rpm/expected_deps_x86_64
new file mode 100644 (file)
index 0000000..1435e39
--- /dev/null
@@ -0,0 +1,68 @@
+ld-linux-x86-64.so.2()(64bit)
+ld-linux-x86-64.so.2(GLIBC_2.2.5)(64bit)
+ld-linux-x86-64.so.2(GLIBC_2.3)(64bit)
+libasound.so.2()(64bit)
+libcairo.so.2()(64bit)
+libcap.so.2()(64bit)
+libc.so.6()(64bit)
+libc.so.6(GLIBC_2.11)(64bit)
+libc.so.6(GLIBC_2.2.5)(64bit)
+libc.so.6(GLIBC_2.3.2)(64bit)
+libc.so.6(GLIBC_2.3.4)(64bit)
+libc.so.6(GLIBC_2.3)(64bit)
+libc.so.6(GLIBC_2.4)(64bit)
+libc.so.6(GLIBC_2.6)(64bit)
+libc.so.6(GLIBC_2.7)(64bit)
+libc.so.6(GLIBC_2.8)(64bit)
+libc.so.6(GLIBC_2.9)(64bit)
+libcups.so.2()(64bit)
+libdbus-1.so.3()(64bit)
+libdl.so.2()(64bit)
+libdl.so.2(GLIBC_2.2.5)(64bit)
+libexpat.so.1()(64bit)
+libfontconfig.so.1()(64bit)
+libfreetype.so.6()(64bit)
+libgcc_s.so.1()(64bit)
+libgcc_s.so.1(GCC_3.4)(64bit)
+libgcc_s.so.1(GCC_4.0.0)(64bit)
+libgconf-2.so.4()(64bit)
+libgcrypt.so.11()(64bit)
+libgdk_pixbuf-2.0.so.0()(64bit)
+libgdk-x11-2.0.so.0()(64bit)
+libgio-2.0.so.0()(64bit)
+libglib-2.0.so.0()(64bit)
+libgobject-2.0.so.0()(64bit)
+libgtk-x11-2.0.so.0()(64bit)
+libm.so.6()(64bit)
+libm.so.6(GLIBC_2.2.5)(64bit)
+libnspr4.so()(64bit)
+libnss3.so()(64bit)
+libnssutil3.so()(64bit)
+libpango-1.0.so.0()(64bit)
+libpangocairo-1.0.so.0()(64bit)
+libplc4.so()(64bit)
+libpthread.so.0()(64bit)
+libpthread.so.0(GLIBC_2.2.5)(64bit)
+libpthread.so.0(GLIBC_2.3.2)(64bit)
+libpthread.so.0(GLIBC_2.3.3)(64bit)
+librt.so.1()(64bit)
+librt.so.1(GLIBC_2.2.5)(64bit)
+libsmime3.so()(64bit)
+libstdc++.so.6()(64bit)
+libstdc++.so.6(GLIBCXX_3.4.10)(64bit)
+libstdc++.so.6(GLIBCXX_3.4.11)(64bit)
+libstdc++.so.6(GLIBCXX_3.4.15)(64bit)
+libstdc++.so.6(GLIBCXX_3.4.5)(64bit)
+libstdc++.so.6(GLIBCXX_3.4)(64bit)
+libstdc++.so.6(GLIBCXX_3.4.9)(64bit)
+libX11.so.6()(64bit)
+libXcomposite.so.1()(64bit)
+libXcursor.so.1()(64bit)
+libXdamage.so.1()(64bit)
+libXext.so.6()(64bit)
+libXfixes.so.3()(64bit)
+libXi.so.6()(64bit)
+libXrandr.so.2()(64bit)
+libXrender.so.1()(64bit)
+libXss.so.1()(64bit)
+libXtst.so.6()(64bit)
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/BRANDING b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/BRANDING
new file mode 100644 (file)
index 0000000..801f6d7
--- /dev/null
@@ -0,0 +1,8 @@
+COMPANY_FULLNAME=Google Inc.
+COMPANY_SHORTNAME=Google
+PRODUCT_FULLNAME=Google Chrome
+PRODUCT_SHORTNAME=Chrome
+PRODUCT_INSTALLER_FULLNAME=Google Chrome Installer
+PRODUCT_INSTALLER_SHORTNAME=Chrome Installer
+CEEE_PRODUCT_FULLNAME=Google Toolbar
+COPYRIGHT=Copyright 2012 Google Inc. All rights reserved.
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_128.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_128.png
new file mode 100644 (file)
index 0000000..ec0b2e5
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_128.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_16.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_16.png
new file mode 100644 (file)
index 0000000..385f75f
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_16.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_22.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_22.png
new file mode 100644 (file)
index 0000000..d9927a3
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_22.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_24.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_24.png
new file mode 100644 (file)
index 0000000..8d80cb8
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_24.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_256.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_256.png
new file mode 100644 (file)
index 0000000..dc2cf07
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_256.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_32.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_32.png
new file mode 100644 (file)
index 0000000..564ba76
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_32.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_32.xpm b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_32.xpm
new file mode 100644 (file)
index 0000000..5a4ee01
--- /dev/null
@@ -0,0 +1,196 @@
+/* XPM */
+static char *product_logo___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 158 2",
+"   c #725F2C",
+".  c #597230",
+"X  c #98261A",
+"o  c #B5251F",
+"O  c #C0171B",
+"+  c #CA1A1E",
+"@  c #CE1C20",
+"#  c #C72422",
+"$  c #D72124",
+"%  c #DD2226",
+"&  c #DF2428",
+"*  c #E02629",
+"=  c #E12C2D",
+"-  c #E2302F",
+";  c #E33532",
+":  c #E53B36",
+">  c #E53F38",
+",  c #89572D",
+"<  c #A6462B",
+"1  c #E04725",
+"2  c #E24823",
+"3  c #E04929",
+"4  c #E45121",
+"5  c #E7443D",
+"6  c #E8483F",
+"7  c #C53E40",
+"8  c #936552",
+"9  c #C0484B",
+"0  c #E14343",
+"q  c #E94C42",
+"w  c #E15241",
+"e  c #EA5246",
+"r  c #EB5649",
+"t  c #EC5B4D",
+"y  c #E15857",
+"u  c #E15858",
+"i  c #EE6454",
+"p  c #EF6957",
+"a  c #F06B59",
+"s  c #E16063",
+"d  c #E16B6F",
+"f  c #5B983F",
+"g  c #6D833A",
+"h  c #6E9E3B",
+"j  c #6FA834",
+"k  c #358740",
+"l  c #368941",
+"z  c #398D42",
+"x  c #3D9243",
+"c  c #419744",
+"v  c #439A45",
+"b  c #529F40",
+"n  c #45A246",
+"m  c #48A747",
+"M  c #46A946",
+"N  c #49AA46",
+"B  c #4AAE48",
+"V  c #58AC41",
+"C  c #4AB147",
+"Z  c #4BB449",
+"A  c #4DB849",
+"S  c #69A960",
+"D  c #66B666",
+"F  c #6CC369",
+"G  c #76C473",
+"H  c #B9BA1B",
+"J  c #BA9B2C",
+"K  c #94B62B",
+"L  c #B8B427",
+"P  c #EBBC16",
+"I  c #E6B41B",
+"U  c #E9B61E",
+"Y  c #EEBC1B",
+"T  c #D69D28",
+"R  c #D89F28",
+"E  c #DCA426",
+"W  c #DFA825",
+"Q  c #E2AC24",
+"!  c #E5B221",
+"~  c #D7C514",
+"^  c #EDCC0D",
+"/  c #F5CA0D",
+"(  c #F9CD0E",
+")  c #FCD20A",
+"_  c #EDC213",
+"`  c #F3C514",
+"'  c #F6C911",
+"]  c #F8CB10",
+"[  c #F0C018",
+"{  c #F9D734",
+"}  c #FDDA37",
+"|  c #87B673",
+" . c #E1BD5C",
+".. c #81CB7F",
+"X. c #FADB44",
+"o. c #F5D750",
+"O. c #F8DB51",
+"+. c #E9CC64",
+"@. c #1C649F",
+"#. c #1D64A0",
+"$. c #216EAD",
+"%. c #2370AF",
+"&. c #2D74AD",
+"*. c #3774A9",
+"=. c #2A76B6",
+"-. c #2C77B8",
+";. c #2E79BA",
+":. c #327DBE",
+">. c #367FC1",
+",. c #4184BB",
+"<. c #4C8ABE",
+"1. c #3780C2",
+"2. c #3A81C3",
+"3. c #4385C6",
+"4. c #4788C8",
+"5. c #4D8CCA",
+"6. c #518FCB",
+"7. c #5692CD",
+"8. c #5A95CE",
+"9. c #5F98D1",
+"0. c #649CD3",
+"q. c #689ED3",
+"w. c #67A0D5",
+"e. c #6BA2D6",
+"r. c #6EA5D9",
+"t. c #78A7D4",
+"y. c #7CAAD6",
+"u. c #70A6D9",
+"i. c #75AADB",
+"p. c #7BAFDE",
+"a. c #85CE82",
+"s. c #BBE3B9",
+"d. c #D8D585",
+"f. c #8EAFC9",
+"g. c #8CB6DD",
+"h. c #B3CFE7",
+"j. c #C6D3DF",
+"k. c #CCD4DF",
+"l. c #D0D5DD",
+"z. c #E2C8C8",
+"x. c #E2DACA",
+"c. c #E9D2D3",
+"v. c #DBE7DC",
+"b. c #DAE8DB",
+"n. c #EFEAD1",
+"m. c #F2EDD4",
+"M. c #C7D5E0",
+"N. c #CAD6E2",
+"B. c #CDDAE5",
+"V. c #C4D7E8",
+"C. c #CDDEEF",
+"Z. c #D1DCE6",
+"A. c #D8DBE1",
+"S. c #D0DFEB",
+"D. c #D4E1ED",
+"F. c #D8E6F2",
+"G. c #E9F6E8",
+"H. c None",
+/* pixels */
+"H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.H.H.H.H.i p a a a p i t H.H.H.H.H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.H.e r t i i i i i i t t r q 6 H.H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.6 q q r t t t t t t r e q q 6 : H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.: : > 6 q q q e e e e e q 6 5 5 > : ; = H.H.H.H.H.H.",
+"H.H.H.H.H.= ; ; : > 5 5 q 6 q 6 q 6 6 5 : : : ; - = * H.H.H.H.H.",
+"H.H.H.H.H.= = = ; ; ; : > > > 5 > : : : ; ; = = = * & H.H.H.H.H.",
+"H.H.H.H.g % * * = - ; ; ; ; ; ; ; ; ; - - = & & * & * % H.H.H.H.",
+"H.H.H.A Z < $ * * * * = = = 0 u y w 3 3 3 1 1 1 2 2 2 2 4 H.H.H.",
+"H.H.H.A A b # $ % * * * s z.k.N.k.A.x. .I I P P P ` _ / ( H.H.H.",
+"H.H.H.A A A , @ % % % d B.g.i.p.p.p.g.B.+.P ` / / ( ) ) ) H.H.H.",
+"H.H.Z A A A b o + % s B.q.q.r.r.u.e.w.e.B.o.) ) ) ) ) ) ) ) H.H.",
+"H.H.C Z A A A   O + c.i.8.9.0.w.w.0.9.8.y.n.) ) ) ) ) ) ) ( H.H.",
+"H.H.C A A A A N X : V.4.5.7.8.8.8.7.7.7.5.D.{ ) ) ) ) ) ) ( H.H.",
+"H.H.C Z A A A A . 9 h.2.4.4.5.5.6.5.5.4.3.D.X.) ) ) ) ) ) ] H.H.",
+"H.H.B Z A A A A A 8 h.1.2.2.3.2.3.4.2.2.1.V.X.) ) ) ) ) ) ' H.H.",
+"H.H.B Z A A A A A S F.;.>.1.1.1.1.1.>.>.:.B.} ) ) ) ) ) ) ' H.H.",
+"H.H.m B Z A A A A A G.,.=.;.>.;.;.;.;.=.<.m.) ) ) ) ) ) ] ` H.H.",
+"H.H.n B Z A A A A A a.D.=.#.%.#.%.%.%.&.N.O.) ) ) ) ) ) ' [ H.H.",
+"H.H.H.m C Z A A A A A s.M.*.#.#.@.@.*.j.d.) ) ) ) ) ) ] ` H.H.H.",
+"H.H.H.n m C A A A A A A a.v.M.f.f.j.b.| ^ ) ) ) ) ( ] ` Y H.H.H.",
+"H.H.H.v n m C A A A A A A A F G G D n H ) ) ) ) ) ] ' Y ! H.H.H.",
+"H.H.H.H.v m m B A A A A A A A A Z M j / ) ) ) ) ] ` [ ! H.H.H.H.",
+"H.H.H.H.H.v n m B Z A A A A A A Z B ~ ) ) ( ] ] ` ! ! H.H.H.H.H.",
+"H.H.H.H.H.x c n m B B C Z A Z C B K ( ( ] ] ` ` Y ! Q H.H.H.H.H.",
+"H.H.H.H.H.H.z x v m m B B B C B V _ ' ` ` [ ! ! ! E H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.z x v v n m B n L [ [ [ ! ! Q E H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.H.k z x x v v h ! ! Q Q E E T H.H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.H.H.H.H.k l l J R R T T H.H.H.H.H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.",
+"H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H."
+};
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_48.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_48.png
new file mode 100644 (file)
index 0000000..79bf8a9
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_48.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_64.png b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_64.png
new file mode 100644 (file)
index 0000000..95fdae1
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/installer/theme/product_logo_64.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/installer/version.txt b/src/chrome/tools/test/reference_build/chrome_linux/installer/version.txt
new file mode 100644 (file)
index 0000000..4443bd2
--- /dev/null
@@ -0,0 +1,6 @@
+MAJOR=35
+MINOR=0
+BUILD=1916
+PATCH=114
+LASTCHANGE=270117
+OFFICIAL_BUILD=1
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/lib/libpeerconnection.so b/src/chrome/tools/test/reference_build/chrome_linux/lib/libpeerconnection.so
new file mode 100755 (executable)
index 0000000..9fce834
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/lib/libpeerconnection.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libEGL.dll b/src/chrome/tools/test/reference_build/chrome_linux/libEGL.dll
deleted file mode 100644 (file)
index 55c74f8..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/libEGL.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libGLESv2.dll b/src/chrome/tools/test/reference_build/chrome_linux/libGLESv2.dll
deleted file mode 100644 (file)
index 60ad765..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/libGLESv2.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdm.so b/src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdm.so
new file mode 100755 (executable)
index 0000000..0bd3f28
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdm.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdmadapter.so b/src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdmadapter.so
new file mode 100755 (executable)
index 0000000..ce19959
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/libclearkeycdmadapter.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libffmpegsumo.so b/src/chrome/tools/test/reference_build/chrome_linux/libffmpegsumo.so
new file mode 100755 (executable)
index 0000000..84dc8cb
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/libffmpegsumo.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libpdf.so b/src/chrome/tools/test/reference_build/chrome_linux/libpdf.so
new file mode 100755 (executable)
index 0000000..7c756eb
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/libpdf.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libppGoogleNaClPluginChrome.so b/src/chrome/tools/test/reference_build/chrome_linux/libppGoogleNaClPluginChrome.so
new file mode 100755 (executable)
index 0000000..9c4268f
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/libppGoogleNaClPluginChrome.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdm.so b/src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdm.so
new file mode 100644 (file)
index 0000000..5398392
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdm.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdmadapter.so b/src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdmadapter.so
new file mode 100755 (executable)
index 0000000..fa090f6
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/libwidevinecdmadapter.so differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/am.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/am.pak
new file mode 100644 (file)
index 0000000..56ff0ed
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/am.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ar.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ar.dll
deleted file mode 100755 (executable)
index 2546471..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ar.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ar.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ar.pak
new file mode 100644 (file)
index 0000000..72cf014
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ar.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/bg.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/bg.dll
deleted file mode 100755 (executable)
index 0d641c4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/bg.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/bg.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/bg.pak
new file mode 100644 (file)
index 0000000..f873fcd
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/bg.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/bn.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/bn.dll
deleted file mode 100755 (executable)
index bd05a7a..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/bn.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/bn.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/bn.pak
new file mode 100644 (file)
index 0000000..2ef4554
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/bn.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ca.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ca.dll
deleted file mode 100755 (executable)
index a6f26b8..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ca.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ca.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ca.pak
new file mode 100644 (file)
index 0000000..a3ffa51
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ca.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/cs.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/cs.dll
deleted file mode 100755 (executable)
index 3e72c15..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/cs.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/cs.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/cs.pak
new file mode 100644 (file)
index 0000000..47d78ce
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/cs.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/da.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/da.dll
deleted file mode 100755 (executable)
index 6ee145d..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/da.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/da.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/da.pak
new file mode 100644 (file)
index 0000000..43c2857
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/da.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/de.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/de.dll
deleted file mode 100755 (executable)
index fa30441..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/de.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/de.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/de.pak
new file mode 100644 (file)
index 0000000..189dad5
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/de.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/el.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/el.dll
deleted file mode 100755 (executable)
index 98a83d2..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/el.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/el.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/el.pak
new file mode 100644 (file)
index 0000000..2ab0689
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/el.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.dll
deleted file mode 100755 (executable)
index 26b546b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.pak
new file mode 100644 (file)
index 0000000..6af0d84
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/en-GB.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.dll
deleted file mode 100755 (executable)
index 7efe78b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.pak
new file mode 100644 (file)
index 0000000..41d9a11
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/en-US.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.dll
deleted file mode 100755 (executable)
index cc0254b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.pak
new file mode 100644 (file)
index 0000000..8d287c3
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/es-419.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/es.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/es.dll
deleted file mode 100755 (executable)
index b877b11..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/es.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/es.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/es.pak
new file mode 100644 (file)
index 0000000..9bd7cfd
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/es.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/et.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/et.dll
deleted file mode 100755 (executable)
index c442529..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/et.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/et.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/et.pak
new file mode 100644 (file)
index 0000000..c40f285
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/et.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/fa.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/fa.pak
new file mode 100644 (file)
index 0000000..1b3cd68
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/fa.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/fi.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/fi.dll
deleted file mode 100755 (executable)
index c5ddf09..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/fi.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/fi.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/fi.pak
new file mode 100644 (file)
index 0000000..9d91bf8
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/fi.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/fil.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/fil.dll
deleted file mode 100755 (executable)
index 47cd0a9..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/fil.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/fil.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/fil.pak
new file mode 100644 (file)
index 0000000..801b1d9
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/fil.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/fr.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/fr.dll
deleted file mode 100755 (executable)
index 9547b0d..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/fr.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/fr.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/fr.pak
new file mode 100644 (file)
index 0000000..fa4afff
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/fr.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/gu.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/gu.dll
deleted file mode 100755 (executable)
index e88c5fc..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/gu.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/gu.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/gu.pak
new file mode 100644 (file)
index 0000000..63df984
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/gu.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/he.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/he.dll
deleted file mode 100755 (executable)
index 5c55563..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/he.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/he.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/he.pak
new file mode 100644 (file)
index 0000000..5d50f30
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/he.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/hi.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/hi.dll
deleted file mode 100755 (executable)
index f3a7442..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/hi.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/hi.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/hi.pak
new file mode 100644 (file)
index 0000000..a72c22d
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/hi.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/hr.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/hr.dll
deleted file mode 100755 (executable)
index 799859c..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/hr.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/hr.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/hr.pak
new file mode 100644 (file)
index 0000000..ed518ed
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/hr.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/hu.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/hu.dll
deleted file mode 100755 (executable)
index f4bea86..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/hu.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/hu.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/hu.pak
new file mode 100644 (file)
index 0000000..ef31d55
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/hu.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/id.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/id.dll
deleted file mode 100755 (executable)
index 46f90a4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/id.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/id.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/id.pak
new file mode 100644 (file)
index 0000000..accd517
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/id.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/it.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/it.dll
deleted file mode 100755 (executable)
index 03aa118..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/it.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/it.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/it.pak
new file mode 100644 (file)
index 0000000..bffc3f5
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/it.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ja.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ja.dll
deleted file mode 100755 (executable)
index 2baae6a..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ja.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ja.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ja.pak
new file mode 100644 (file)
index 0000000..b663557
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ja.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/kn.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/kn.dll
deleted file mode 100755 (executable)
index 240982c..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/kn.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/kn.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/kn.pak
new file mode 100644 (file)
index 0000000..4d37ee6
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/kn.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ko.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ko.dll
deleted file mode 100755 (executable)
index 7f8032d..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ko.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ko.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ko.pak
new file mode 100644 (file)
index 0000000..db1e2ca
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ko.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/lt.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/lt.dll
deleted file mode 100755 (executable)
index e842a84..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/lt.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/lt.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/lt.pak
new file mode 100644 (file)
index 0000000..744b513
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/lt.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/lv.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/lv.dll
deleted file mode 100755 (executable)
index 777d8d5..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/lv.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/lv.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/lv.pak
new file mode 100644 (file)
index 0000000..8f5b242
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/lv.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ml.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ml.dll
deleted file mode 100755 (executable)
index f0db4e6..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ml.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ml.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ml.pak
new file mode 100644 (file)
index 0000000..1fdca15
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ml.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/mr.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/mr.dll
deleted file mode 100755 (executable)
index a5059c2..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/mr.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/mr.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/mr.pak
new file mode 100644 (file)
index 0000000..d84e126
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/mr.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ms.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ms.pak
new file mode 100644 (file)
index 0000000..a85e29e
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ms.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/nb.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/nb.dll
deleted file mode 100755 (executable)
index 6cfd043..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/nb.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/nb.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/nb.pak
new file mode 100644 (file)
index 0000000..ea39a23
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/nb.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/nl.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/nl.dll
deleted file mode 100755 (executable)
index ce0544f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/nl.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/nl.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/nl.pak
new file mode 100644 (file)
index 0000000..3674f57
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/nl.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/pl.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/pl.dll
deleted file mode 100755 (executable)
index 678c97e..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/pl.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/pl.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/pl.pak
new file mode 100644 (file)
index 0000000..30a1c65
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/pl.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.dll
deleted file mode 100755 (executable)
index aae7aa3..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.pak
new file mode 100644 (file)
index 0000000..4a8e30e
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-BR.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.dll
deleted file mode 100755 (executable)
index bbfb7e2..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.pak
new file mode 100644 (file)
index 0000000..10e54cb
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/pt-PT.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ro.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ro.dll
deleted file mode 100755 (executable)
index 2385f69..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ro.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ro.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ro.pak
new file mode 100644 (file)
index 0000000..22dda46
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ro.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ru.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ru.dll
deleted file mode 100755 (executable)
index 4d95922..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ru.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ru.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ru.pak
new file mode 100644 (file)
index 0000000..fd2719e
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ru.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sk.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/sk.dll
deleted file mode 100755 (executable)
index 4fdfd3e..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/sk.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sk.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/sk.pak
new file mode 100644 (file)
index 0000000..ca0055f
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/sk.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sl.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/sl.dll
deleted file mode 100755 (executable)
index a44a10f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/sl.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sl.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/sl.pak
new file mode 100644 (file)
index 0000000..c586496
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/sl.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sr.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/sr.dll
deleted file mode 100755 (executable)
index 718c9bb..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/sr.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sr.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/sr.pak
new file mode 100644 (file)
index 0000000..5e2a281
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/sr.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sv.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/sv.dll
deleted file mode 100755 (executable)
index abfa60b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/sv.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sv.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/sv.pak
new file mode 100644 (file)
index 0000000..8fe86f5
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/sv.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/sw.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/sw.pak
new file mode 100644 (file)
index 0000000..6a9972d
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/sw.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ta.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/ta.dll
deleted file mode 100755 (executable)
index cc6581f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/ta.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/ta.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/ta.pak
new file mode 100644 (file)
index 0000000..4949e00
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/ta.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/te.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/te.dll
deleted file mode 100755 (executable)
index a25685f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/te.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/te.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/te.pak
new file mode 100644 (file)
index 0000000..db8cbd9
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/te.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/th.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/th.dll
deleted file mode 100755 (executable)
index 4fed1f6..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/th.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/th.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/th.pak
new file mode 100644 (file)
index 0000000..f17d3a5
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/th.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/tr.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/tr.dll
deleted file mode 100755 (executable)
index d301437..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/tr.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/tr.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/tr.pak
new file mode 100644 (file)
index 0000000..609fe39
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/tr.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/uk.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/uk.dll
deleted file mode 100755 (executable)
index 1daa6ee..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/uk.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/uk.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/uk.pak
new file mode 100644 (file)
index 0000000..9ad9804
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/uk.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/vi.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/vi.dll
deleted file mode 100755 (executable)
index eb7e914..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/vi.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/vi.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/vi.pak
new file mode 100644 (file)
index 0000000..c2731dd
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/vi.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.dll
deleted file mode 100755 (executable)
index 59c9568..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.pak
new file mode 100644 (file)
index 0000000..2806bf5
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-CN.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.dll b/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.dll
deleted file mode 100755 (executable)
index 7fcfee8..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.pak b/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.pak
new file mode 100644 (file)
index 0000000..05b923a
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/locales/zh-TW.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/mini_installer.pdb b/src/chrome/tools/test/reference_build/chrome_linux/mini_installer.pdb
deleted file mode 100755 (executable)
index 7e9e156..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/mini_installer.pdb and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/nacl64.dll b/src/chrome/tools/test/reference_build/chrome_linux/nacl64.dll
deleted file mode 100644 (file)
index dbbde07..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/nacl64.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/nacl64.exe b/src/chrome/tools/test/reference_build/chrome_linux/nacl64.exe
deleted file mode 100644 (file)
index 9f3c8e6..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/nacl64.exe and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/nacl_helper b/src/chrome/tools/test/reference_build/chrome_linux/nacl_helper
new file mode 100755 (executable)
index 0000000..357219b
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/nacl_helper differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/nacl_helper_bootstrap b/src/chrome/tools/test/reference_build/chrome_linux/nacl_helper_bootstrap
new file mode 100755 (executable)
index 0000000..c6f8d5a
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/nacl_helper_bootstrap differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/nacl_irt_x86_64.nexe b/src/chrome/tools/test/reference_build/chrome_linux/nacl_irt_x86_64.nexe
new file mode 100755 (executable)
index 0000000..25ca528
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/nacl_irt_x86_64.nexe differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/product_logo_48.png b/src/chrome/tools/test/reference_build/chrome_linux/product_logo_48.png
new file mode 100644 (file)
index 0000000..79bf8a9
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/product_logo_48.png differ
index a2b27e4..9ba2810 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources.pak and b/src/chrome/tools/test/reference_build/chrome_linux/resources.pak differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/extension/demo/library.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/extension/demo/library.js
new file mode 100644 (file)
index 0000000..9e89995
--- /dev/null
@@ -0,0 +1,5 @@
+// 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.
+
+var demo = {};
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/AuditsPanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/AuditsPanel.js
new file mode 100644 (file)
index 0000000..9417a8d
--- /dev/null
@@ -0,0 +1,483 @@
+WebInspector.AuditsPanel=function()
+{WebInspector.PanelWithSidebarTree.call(this,"audits");this.registerRequiredCSS("panelEnablerView.css");this.registerRequiredCSS("auditsPanel.css");this.auditsTreeElement=new WebInspector.SidebarSectionTreeElement("",{},true);this.sidebarTree.appendChild(this.auditsTreeElement);this.auditsTreeElement.listItemElement.classList.add("hidden");this.auditsItemTreeElement=new WebInspector.AuditsSidebarTreeElement(this);this.auditsTreeElement.appendChild(this.auditsItemTreeElement);this.auditResultsTreeElement=new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESULTS"),{},true);this.sidebarTree.appendChild(this.auditResultsTreeElement);this.auditResultsTreeElement.expand();this._constructCategories();this._auditController=new WebInspector.AuditController(this);this._launcherView=new WebInspector.AuditLauncherView(this._auditController);for(var id in this.categoriesById)
+this._launcherView.addCategory(this.categoriesById[id]);}
+WebInspector.AuditsPanel.prototype={canSearch:function()
+{return false;},get categoriesById()
+{return this._auditCategoriesById;},addCategory:function(category)
+{this.categoriesById[category.id]=category;this._launcherView.addCategory(category);},getCategory:function(id)
+{return this.categoriesById[id];},_constructCategories:function()
+{this._auditCategoriesById={};for(var categoryCtorID in WebInspector.AuditCategories){var auditCategory=new WebInspector.AuditCategories[categoryCtorID]();auditCategory._id=categoryCtorID;this.categoriesById[categoryCtorID]=auditCategory;}},auditFinishedCallback:function(mainResourceURL,results)
+{var children=this.auditResultsTreeElement.children;var ordinal=1;for(var i=0;i<children.length;++i){if(children[i].mainResourceURL===mainResourceURL)
+ordinal++;}
+var resultTreeElement=new WebInspector.AuditResultSidebarTreeElement(this,results,mainResourceURL,ordinal);this.auditResultsTreeElement.appendChild(resultTreeElement);resultTreeElement.revealAndSelect();},showResults:function(categoryResults)
+{if(!categoryResults._resultView)
+categoryResults._resultView=new WebInspector.AuditResultView(categoryResults);this.visibleView=categoryResults._resultView;},showLauncherView:function()
+{this.visibleView=this._launcherView;},get visibleView()
+{return this._visibleView;},set visibleView(x)
+{if(this._visibleView===x)
+return;if(this._visibleView)
+this._visibleView.detach();this._visibleView=x;if(x)
+x.show(this.mainElement());},wasShown:function()
+{WebInspector.Panel.prototype.wasShown.call(this);if(!this._visibleView)
+this.auditsItemTreeElement.select();},clearResults:function()
+{this.auditsItemTreeElement.revealAndSelect();this.auditResultsTreeElement.removeChildren();},__proto__:WebInspector.PanelWithSidebarTree.prototype}
+WebInspector.AuditCategoryImpl=function(displayName)
+{this._displayName=displayName;this._rules=[];}
+WebInspector.AuditCategoryImpl.prototype={get id()
+{return this._id;},get displayName()
+{return this._displayName;},addRule:function(rule,severity)
+{rule.severity=severity;this._rules.push(rule);},run:function(requests,ruleResultCallback,categoryDoneCallback,progress)
+{this._ensureInitialized();var remainingRulesCount=this._rules.length;progress.setTotalWork(remainingRulesCount);function callbackWrapper(result)
+{ruleResultCallback(result);progress.worked();if(!--remainingRulesCount)
+categoryDoneCallback();}
+for(var i=0;i<this._rules.length;++i)
+this._rules[i].run(requests,callbackWrapper,progress);},_ensureInitialized:function()
+{if(!this._initialized){if("initialize"in this)
+this.initialize();this._initialized=true;}}}
+WebInspector.AuditRule=function(id,displayName)
+{this._id=id;this._displayName=displayName;}
+WebInspector.AuditRule.Severity={Info:"info",Warning:"warning",Severe:"severe"}
+WebInspector.AuditRule.SeverityOrder={"info":3,"warning":2,"severe":1}
+WebInspector.AuditRule.prototype={get id()
+{return this._id;},get displayName()
+{return this._displayName;},set severity(severity)
+{this._severity=severity;},run:function(requests,callback,progress)
+{if(progress.isCanceled())
+return;var result=new WebInspector.AuditRuleResult(this.displayName);result.severity=this._severity;this.doRun(requests,result,callback,progress);},doRun:function(requests,result,callback,progress)
+{throw new Error("doRun() not implemented");}}
+WebInspector.AuditCategoryResult=function(category)
+{this.title=category.displayName;this.ruleResults=[];}
+WebInspector.AuditCategoryResult.prototype={addRuleResult:function(ruleResult)
+{this.ruleResults.push(ruleResult);}}
+WebInspector.AuditRuleResult=function(value,expanded,className)
+{this.value=value;this.className=className;this.expanded=expanded;this.violationCount=0;this._formatters={r:WebInspector.AuditRuleResult.linkifyDisplayName};var standardFormatters=Object.keys(String.standardFormatters);for(var i=0;i<standardFormatters.length;++i)
+this._formatters[standardFormatters[i]]=String.standardFormatters[standardFormatters[i]];}
+WebInspector.AuditRuleResult.linkifyDisplayName=function(url)
+{return WebInspector.linkifyURLAsNode(url,WebInspector.displayNameForURL(url));}
+WebInspector.AuditRuleResult.resourceDomain=function(domain)
+{return domain||WebInspector.UIString("[empty domain]");}
+WebInspector.AuditRuleResult.prototype={addChild:function(value,expanded,className)
+{if(!this.children)
+this.children=[];var entry=new WebInspector.AuditRuleResult(value,expanded,className);this.children.push(entry);return entry;},addURL:function(url)
+{this.addChild(WebInspector.AuditRuleResult.linkifyDisplayName(url));},addURLs:function(urls)
+{for(var i=0;i<urls.length;++i)
+this.addURL(urls[i]);},addSnippet:function(snippet)
+{this.addChild(snippet,false,"source-code");},addFormatted:function(format,vararg)
+{var substitutions=Array.prototype.slice.call(arguments,1);var fragment=document.createDocumentFragment();function append(a,b)
+{if(!(b instanceof Node))
+b=document.createTextNode(b);a.appendChild(b);return a;}
+var formattedResult=String.format(format,substitutions,this._formatters,fragment,append).formattedResult;if(formattedResult instanceof Node)
+formattedResult.normalize();return this.addChild(formattedResult);}}
+WebInspector.AuditsSidebarTreeElement=function(panel)
+{this._panel=panel;this.small=false;WebInspector.SidebarTreeElement.call(this,"audits-sidebar-tree-item",WebInspector.UIString("Audits"),"",null,false);}
+WebInspector.AuditsSidebarTreeElement.prototype={onattach:function()
+{WebInspector.SidebarTreeElement.prototype.onattach.call(this);},onselect:function()
+{this._panel.showLauncherView();},get selectable()
+{return true;},refresh:function()
+{this.refreshTitles();},__proto__:WebInspector.SidebarTreeElement.prototype}
+WebInspector.AuditResultSidebarTreeElement=function(panel,results,mainResourceURL,ordinal)
+{this._panel=panel;this.results=results;this.mainResourceURL=mainResourceURL;WebInspector.SidebarTreeElement.call(this,"audit-result-sidebar-tree-item",String.sprintf("%s (%d)",mainResourceURL,ordinal),"",{},false);}
+WebInspector.AuditResultSidebarTreeElement.prototype={onselect:function()
+{this._panel.showResults(this.results);},get selectable()
+{return true;},__proto__:WebInspector.SidebarTreeElement.prototype}
+WebInspector.AuditRules={};WebInspector.AuditCategories={};WebInspector.AuditCategory=function()
+{}
+WebInspector.AuditCategory.prototype={get id()
+{},get displayName()
+{},run:function(requests,ruleResultCallback,categoryDoneCallback,progress)
+{}};WebInspector.AuditCategories.PagePerformance=function(){WebInspector.AuditCategoryImpl.call(this,WebInspector.AuditCategories.PagePerformance.AuditCategoryName);}
+WebInspector.AuditCategories.PagePerformance.AuditCategoryName=WebInspector.UIString("Web Page Performance");WebInspector.AuditCategories.PagePerformance.prototype={initialize:function()
+{this.addRule(new WebInspector.AuditRules.UnusedCssRule(),WebInspector.AuditRule.Severity.Warning);this.addRule(new WebInspector.AuditRules.CssInHeadRule(),WebInspector.AuditRule.Severity.Severe);this.addRule(new WebInspector.AuditRules.StylesScriptsOrderRule(),WebInspector.AuditRule.Severity.Severe);this.addRule(new WebInspector.AuditRules.VendorPrefixedCSSProperties(),WebInspector.AuditRule.Severity.Warning);},__proto__:WebInspector.AuditCategoryImpl.prototype}
+WebInspector.AuditCategories.NetworkUtilization=function(){WebInspector.AuditCategoryImpl.call(this,WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName);}
+WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName=WebInspector.UIString("Network Utilization");WebInspector.AuditCategories.NetworkUtilization.prototype={initialize:function()
+{this.addRule(new WebInspector.AuditRules.GzipRule(),WebInspector.AuditRule.Severity.Severe);this.addRule(new WebInspector.AuditRules.ImageDimensionsRule(),WebInspector.AuditRule.Severity.Warning);this.addRule(new WebInspector.AuditRules.CookieSizeRule(400),WebInspector.AuditRule.Severity.Warning);this.addRule(new WebInspector.AuditRules.StaticCookielessRule(5),WebInspector.AuditRule.Severity.Warning);this.addRule(new WebInspector.AuditRules.CombineJsResourcesRule(2),WebInspector.AuditRule.Severity.Severe);this.addRule(new WebInspector.AuditRules.CombineCssResourcesRule(2),WebInspector.AuditRule.Severity.Severe);this.addRule(new WebInspector.AuditRules.MinimizeDnsLookupsRule(4),WebInspector.AuditRule.Severity.Warning);this.addRule(new WebInspector.AuditRules.ParallelizeDownloadRule(4,10,0.5),WebInspector.AuditRule.Severity.Warning);this.addRule(new WebInspector.AuditRules.BrowserCacheControlRule(),WebInspector.AuditRule.Severity.Severe);this.addRule(new WebInspector.AuditRules.ProxyCacheControlRule(),WebInspector.AuditRule.Severity.Warning);},__proto__:WebInspector.AuditCategoryImpl.prototype};WebInspector.AuditController=function(auditsPanel)
+{this._auditsPanel=auditsPanel;WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._didMainResourceLoad,this);}
+WebInspector.AuditController.prototype={_executeAudit:function(categories,resultCallback)
+{this._progress.setTitle(WebInspector.UIString("Running audit"));function ruleResultReadyCallback(categoryResult,ruleResult)
+{if(ruleResult&&ruleResult.children)
+categoryResult.addRuleResult(ruleResult);if(this._progress.isCanceled())
+this._progress.done();}
+var results=[];var mainResourceURL=WebInspector.resourceTreeModel.inspectedPageURL();var categoriesDone=0;function categoryDoneCallback()
+{if(++categoriesDone!==categories.length)
+return;this._progress.done();resultCallback(mainResourceURL,results)}
+var requests=WebInspector.networkLog.requests.slice();var compositeProgress=new WebInspector.CompositeProgress(this._progress);var subprogresses=[];for(var i=0;i<categories.length;++i)
+subprogresses.push(compositeProgress.createSubProgress());for(var i=0;i<categories.length;++i){var category=categories[i];var result=new WebInspector.AuditCategoryResult(category);results.push(result);category.run(requests,ruleResultReadyCallback.bind(this,result),categoryDoneCallback.bind(this),subprogresses[i]);}},_auditFinishedCallback:function(launcherCallback,mainResourceURL,results)
+{this._auditsPanel.auditFinishedCallback(mainResourceURL,results);if(!this._progress.isCanceled())
+launcherCallback();},initiateAudit:function(categoryIds,progress,runImmediately,startedCallback,finishedCallback)
+{if(!categoryIds||!categoryIds.length)
+return;this._progress=progress;var categories=[];for(var i=0;i<categoryIds.length;++i)
+categories.push(this._auditsPanel.categoriesById[categoryIds[i]]);function startAuditWhenResourcesReady()
+{startedCallback();this._executeAudit(categories,this._auditFinishedCallback.bind(this,finishedCallback));}
+if(runImmediately)
+startAuditWhenResourcesReady.call(this);else
+this._reloadResources(startAuditWhenResourcesReady.bind(this));WebInspector.userMetrics.AuditsStarted.record();},_reloadResources:function(callback)
+{this._pageReloadCallback=callback;WebInspector.resourceTreeModel.reloadPage();},_didMainResourceLoad:function()
+{if(this._pageReloadCallback){var callback=this._pageReloadCallback;delete this._pageReloadCallback;callback();}},clearResults:function()
+{this._auditsPanel.clearResults();}};WebInspector.AuditFormatters=function()
+{}
+WebInspector.AuditFormatters.Registry={text:function(text)
+{return document.createTextNode(text);},snippet:function(snippetText)
+{var div=document.createElement("div");div.textContent=snippetText;div.className="source-code";return div;},concat:function()
+{var parent=document.createElement("span");for(var arg=0;arg<arguments.length;++arg)
+parent.appendChild(WebInspector.auditFormatters.apply(arguments[arg]));return parent;},url:function(url,displayText,allowExternalNavigation)
+{var a=document.createElement("a");a.href=sanitizeHref(url);a.title=url;a.textContent=displayText||url;if(allowExternalNavigation)
+a.target="_blank";return a;},resourceLink:function(url,line)
+{return WebInspector.linkifyResourceAsNode(url,line,"console-message-url webkit-html-resource-link");}};WebInspector.AuditFormatters.prototype={apply:function(value)
+{var formatter;var type=typeof value;var args;switch(type){case"string":case"boolean":case"number":formatter=WebInspector.AuditFormatters.Registry.text;args=[value.toString()];break;case"object":if(value instanceof Node)
+return value;if(value instanceof Array){formatter=WebInspector.AuditFormatters.Registry.concat;args=value;}else if(value.type&&value.arguments){formatter=WebInspector.AuditFormatters.Registry[value.type];args=value.arguments;}}
+if(!formatter)
+throw"Invalid value or formatter: "+type+JSON.stringify(value);return formatter.apply(null,args);},partiallyApply:function(formatters,thisArgument,value)
+{if(value instanceof Array)
+return value.map(this.partiallyApply.bind(this,formatters,thisArgument));if(typeof value==="object"&&typeof formatters[value.type]==="function"&&value.arguments)
+return formatters[value.type].apply(thisArgument,value.arguments);return value;}}
+WebInspector.auditFormatters=new WebInspector.AuditFormatters();;WebInspector.AuditLauncherView=function(auditController)
+{WebInspector.VBox.call(this);this.setMinimumSize(100,25);this._auditController=auditController;this._categoryIdPrefix="audit-category-item-";this._auditRunning=false;this.element.classList.add("audit-launcher-view");this.element.classList.add("panel-enabler-view");this._contentElement=document.createElement("div");this._contentElement.className="audit-launcher-view-content";this.element.appendChild(this._contentElement);this._boundCategoryClickListener=this._categoryClicked.bind(this);this._resetResourceCount();this._sortedCategories=[];this._headerElement=document.createElement("h1");this._headerElement.className="no-audits";this._headerElement.textContent=WebInspector.UIString("No audits to run");this._contentElement.appendChild(this._headerElement);WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted,this._onRequestStarted,this);WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished,this._onRequestFinished,this);var defaultSelectedAuditCategory={};defaultSelectedAuditCategory[WebInspector.AuditLauncherView.AllCategoriesKey]=true;this._selectedCategoriesSetting=WebInspector.settings.createSetting("selectedAuditCategories",defaultSelectedAuditCategory);}
+WebInspector.AuditLauncherView.AllCategoriesKey="__AllCategories";WebInspector.AuditLauncherView.prototype={_resetResourceCount:function()
+{this._loadedResources=0;this._totalResources=0;},_onRequestStarted:function(event)
+{var request=(event.data);if(request.type===WebInspector.resourceTypes.WebSocket)
+return;++this._totalResources;this._updateResourceProgress();},_onRequestFinished:function(event)
+{var request=(event.data);if(request.type===WebInspector.resourceTypes.WebSocket)
+return;++this._loadedResources;this._updateResourceProgress();},addCategory:function(category)
+{if(!this._sortedCategories.length)
+this._createLauncherUI();var selectedCategories=this._selectedCategoriesSetting.get();var categoryElement=this._createCategoryElement(category.displayName,category.id);category._checkboxElement=categoryElement.firstChild;if(this._selectAllCheckboxElement.checked||selectedCategories[category.displayName]){category._checkboxElement.checked=true;++this._currentCategoriesCount;}
+function compareCategories(a,b)
+{var aTitle=a.displayName||"";var bTitle=b.displayName||"";return aTitle.localeCompare(bTitle);}
+var insertBefore=insertionIndexForObjectInListSortedByFunction(category,this._sortedCategories,compareCategories);this._categoriesElement.insertBefore(categoryElement,this._categoriesElement.children[insertBefore]);this._sortedCategories.splice(insertBefore,0,category);this._selectedCategoriesUpdated();},_setAuditRunning:function(auditRunning)
+{if(this._auditRunning===auditRunning)
+return;this._auditRunning=auditRunning;this._updateButton();this._toggleUIComponents(this._auditRunning);if(this._auditRunning)
+this._startAudit();else
+this._stopAudit();},_startAudit:function()
+{var catIds=[];for(var category=0;category<this._sortedCategories.length;++category){if(this._sortedCategories[category]._checkboxElement.checked)
+catIds.push(this._sortedCategories[category].id);}
+this._resetResourceCount();this._progressIndicator=new WebInspector.ProgressIndicator();this._buttonContainerElement.appendChild(this._progressIndicator.element);this._displayResourceLoadingProgress=true;function onAuditStarted()
+{this._displayResourceLoadingProgress=false;}
+this._auditController.initiateAudit(catIds,this._progressIndicator,this._auditPresentStateElement.checked,onAuditStarted.bind(this),this._setAuditRunning.bind(this,false));},_stopAudit:function()
+{this._displayResourceLoadingProgress=false;this._progressIndicator.cancel();this._progressIndicator.done();delete this._progressIndicator;},_toggleUIComponents:function(disable)
+{this._selectAllCheckboxElement.disabled=disable;this._categoriesElement.disabled=disable;this._auditPresentStateElement.disabled=disable;this._auditReloadedStateElement.disabled=disable;},_launchButtonClicked:function(event)
+{this._setAuditRunning(!this._auditRunning);},_clearButtonClicked:function()
+{this._auditController.clearResults();},_selectAllClicked:function(checkCategories,userGesture)
+{var childNodes=this._categoriesElement.childNodes;for(var i=0,length=childNodes.length;i<length;++i)
+childNodes[i].firstChild.checked=checkCategories;this._currentCategoriesCount=checkCategories?this._sortedCategories.length:0;this._selectedCategoriesUpdated(userGesture);},_categoryClicked:function(event)
+{this._currentCategoriesCount+=event.target.checked?1:-1;this._selectAllCheckboxElement.checked=this._currentCategoriesCount===this._sortedCategories.length;this._selectedCategoriesUpdated(true);},_createCategoryElement:function(title,id)
+{var labelElement=document.createElement("label");labelElement.id=this._categoryIdPrefix+id;var element=document.createElement("input");element.type="checkbox";if(id!=="")
+element.addEventListener("click",this._boundCategoryClickListener,false);labelElement.appendChild(element);labelElement.appendChild(document.createTextNode(title));labelElement.__displayName=title;return labelElement;},_createLauncherUI:function()
+{this._headerElement=document.createElement("h1");this._headerElement.textContent=WebInspector.UIString("Select audits to run");for(var child=0;child<this._contentElement.children.length;++child)
+this._contentElement.removeChild(this._contentElement.children[child]);this._contentElement.appendChild(this._headerElement);function handleSelectAllClick(event)
+{this._selectAllClicked(event.target.checked,true);}
+var categoryElement=this._createCategoryElement(WebInspector.UIString("Select All"),"");categoryElement.id="audit-launcher-selectall";this._selectAllCheckboxElement=categoryElement.firstChild;this._selectAllCheckboxElement.checked=this._selectedCategoriesSetting.get()[WebInspector.AuditLauncherView.AllCategoriesKey];this._selectAllCheckboxElement.addEventListener("click",handleSelectAllClick.bind(this),false);this._contentElement.appendChild(categoryElement);this._categoriesElement=this._contentElement.createChild("fieldset","audit-categories-container");this._currentCategoriesCount=0;this._contentElement.createChild("div","flexible-space");this._buttonContainerElement=this._contentElement.createChild("div","button-container");var labelElement=this._buttonContainerElement.createChild("label");this._auditPresentStateElement=labelElement.createChild("input");this._auditPresentStateElement.name="audit-mode";this._auditPresentStateElement.type="radio";this._auditPresentStateElement.checked=true;this._auditPresentStateLabelElement=document.createTextNode(WebInspector.UIString("Audit Present State"));labelElement.appendChild(this._auditPresentStateLabelElement);labelElement=this._buttonContainerElement.createChild("label");this._auditReloadedStateElement=labelElement.createChild("input");this._auditReloadedStateElement.name="audit-mode";this._auditReloadedStateElement.type="radio";labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load"));this._launchButton=this._buttonContainerElement.createChild("button");this._launchButton.textContent=WebInspector.UIString("Run");this._launchButton.addEventListener("click",this._launchButtonClicked.bind(this),false);this._clearButton=this._buttonContainerElement.createChild("button");this._clearButton.textContent=WebInspector.UIString("Clear");this._clearButton.addEventListener("click",this._clearButtonClicked.bind(this),false);this._selectAllClicked(this._selectAllCheckboxElement.checked);},_updateResourceProgress:function()
+{if(this._displayResourceLoadingProgress)
+this._progressIndicator.setTitle(WebInspector.UIString("Loading (%d of %d)",this._loadedResources,this._totalResources));},_selectedCategoriesUpdated:function(userGesture)
+{var selectedCategories=userGesture?{}:this._selectedCategoriesSetting.get();var childNodes=this._categoriesElement.childNodes;for(var i=0,length=childNodes.length;i<length;++i)
+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._currentCategoriesCount;},__proto__:WebInspector.VBox.prototype};WebInspector.AuditResultView=function(categoryResults)
+{WebInspector.SidebarPaneStack.call(this);this.setMinimumSize(100,25);this.element.classList.add("audit-result-view","fill");function categorySorter(a,b){return(a.title||"").localeCompare(b.title||"");}
+categoryResults.sort(categorySorter);for(var i=0;i<categoryResults.length;++i)
+this.addPane(new WebInspector.AuditCategoryResultPane(categoryResults[i]));}
+WebInspector.AuditResultView.prototype={__proto__:WebInspector.SidebarPaneStack.prototype}
+WebInspector.AuditCategoryResultPane=function(categoryResult)
+{WebInspector.SidebarPane.call(this,categoryResult.title);var treeOutlineElement=document.createElement("ol");this.bodyElement.classList.add("audit-result-tree");this.bodyElement.appendChild(treeOutlineElement);this._treeOutline=new TreeOutline(treeOutlineElement);this._treeOutline.expandTreeElementsWhenArrowing=true;function ruleSorter(a,b)
+{var result=WebInspector.AuditRule.SeverityOrder[a.severity||0]-WebInspector.AuditRule.SeverityOrder[b.severity||0];if(!result)
+result=(a.value||"").localeCompare(b.value||"");return result;}
+categoryResult.ruleResults.sort(ruleSorter);for(var i=0;i<categoryResult.ruleResults.length;++i){var ruleResult=categoryResult.ruleResults[i];var treeElement=this._appendResult(this._treeOutline,ruleResult,ruleResult.severity);treeElement.listItemElement.classList.add("audit-result");}
+this.expand();}
+WebInspector.AuditCategoryResultPane.prototype={_appendResult:function(parentTreeElement,result,severity)
+{var title="";if(typeof result.value==="string"){title=result.value;if(result.violationCount)
+title=String.sprintf("%s (%d)",title,result.violationCount);}
+var titleFragment=document.createDocumentFragment();if(severity){var severityElement=document.createElement("div");severityElement.className="severity-"+severity;titleFragment.appendChild(severityElement);}
+titleFragment.appendChild(document.createTextNode(title));var treeElement=new TreeElement(titleFragment,null,!!result.children);parentTreeElement.appendChild(treeElement);if(result.className)
+treeElement.listItemElement.classList.add(result.className);if(typeof result.value!=="string")
+treeElement.listItemElement.appendChild(WebInspector.auditFormatters.apply(result.value));if(result.children){for(var i=0;i<result.children.length;++i)
+this._appendResult(treeElement,result.children[i]);}
+if(result.expanded){treeElement.listItemElement.classList.remove("parent");treeElement.listItemElement.classList.add("parent-expanded");treeElement.expand();}
+return treeElement;},__proto__:WebInspector.SidebarPane.prototype};WebInspector.AuditRules.IPAddressRegexp=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;WebInspector.AuditRules.CacheableResponseCodes={200:true,203:true,206:true,300:true,301:true,410:true,304:true}
+WebInspector.AuditRules.getDomainToResourcesMap=function(requests,types,needFullResources)
+{var domainToResourcesMap={};for(var i=0,size=requests.length;i<size;++i){var request=requests[i];if(types&&types.indexOf(request.type)===-1)
+continue;var parsedURL=request.url.asParsedURL();if(!parsedURL)
+continue;var domain=parsedURL.host;var domainResources=domainToResourcesMap[domain];if(domainResources===undefined){domainResources=[];domainToResourcesMap[domain]=domainResources;}
+domainResources.push(needFullResources?request:request.url);}
+return domainToResourcesMap;}
+WebInspector.AuditRules.GzipRule=function()
+{WebInspector.AuditRule.call(this,"network-gzip",WebInspector.UIString("Enable gzip compression"));}
+WebInspector.AuditRules.GzipRule.prototype={doRun:function(requests,result,callback,progress)
+{var totalSavings=0;var compressedSize=0;var candidateSize=0;var summary=result.addChild("",true);for(var i=0,length=requests.length;i<length;++i){var request=requests[i];if(request.cached||request.statusCode===304)
+continue;if(this._shouldCompress(request)){var size=request.resourceSize;candidateSize+=size;if(this._isCompressed(request)){compressedSize+=size;continue;}
+var savings=2*size/3;totalSavings+=savings;summary.addFormatted("%r could save ~%s",request.url,Number.bytesToString(savings));result.violationCount++;}}
+if(!totalSavings){callback(null);return;}
+summary.value=WebInspector.UIString("Compressing the following resources with gzip could reduce their transfer size by about two thirds (~%s):",Number.bytesToString(totalSavings));callback(result);},_isCompressed:function(request)
+{var encodingHeader=request.responseHeaderValue("Content-Encoding");if(!encodingHeader)
+return false;return/\b(?:gzip|deflate)\b/.test(encodingHeader);},_shouldCompress:function(request)
+{return request.type.isTextType()&&request.parsedURL.host&&request.resourceSize!==undefined&&request.resourceSize>150;},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.CombineExternalResourcesRule=function(id,name,type,resourceTypeName,allowedPerDomain)
+{WebInspector.AuditRule.call(this,id,name);this._type=type;this._resourceTypeName=resourceTypeName;this._allowedPerDomain=allowedPerDomain;}
+WebInspector.AuditRules.CombineExternalResourcesRule.prototype={doRun:function(requests,result,callback,progress)
+{var domainToResourcesMap=WebInspector.AuditRules.getDomainToResourcesMap(requests,[this._type],false);var penalizedResourceCount=0;var summary=result.addChild("",true);for(var domain in domainToResourcesMap){var domainResources=domainToResourcesMap[domain];var extraResourceCount=domainResources.length-this._allowedPerDomain;if(extraResourceCount<=0)
+continue;penalizedResourceCount+=extraResourceCount-1;summary.addChild(WebInspector.UIString("%d %s resources served from %s.",domainResources.length,this._resourceTypeName,WebInspector.AuditRuleResult.resourceDomain(domain)));result.violationCount+=domainResources.length;}
+if(!penalizedResourceCount){callback(null);return;}
+summary.value=WebInspector.UIString("There are multiple resources served from same domain. Consider combining them into as few files as possible.");callback(result);},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.CombineJsResourcesRule=function(allowedPerDomain){WebInspector.AuditRules.CombineExternalResourcesRule.call(this,"page-externaljs",WebInspector.UIString("Combine external JavaScript"),WebInspector.resourceTypes.Script,"JavaScript",allowedPerDomain);}
+WebInspector.AuditRules.CombineJsResourcesRule.prototype={__proto__:WebInspector.AuditRules.CombineExternalResourcesRule.prototype}
+WebInspector.AuditRules.CombineCssResourcesRule=function(allowedPerDomain){WebInspector.AuditRules.CombineExternalResourcesRule.call(this,"page-externalcss",WebInspector.UIString("Combine external CSS"),WebInspector.resourceTypes.Stylesheet,"CSS",allowedPerDomain);}
+WebInspector.AuditRules.CombineCssResourcesRule.prototype={__proto__:WebInspector.AuditRules.CombineExternalResourcesRule.prototype}
+WebInspector.AuditRules.MinimizeDnsLookupsRule=function(hostCountThreshold){WebInspector.AuditRule.call(this,"network-minimizelookups",WebInspector.UIString("Minimize DNS lookups"));this._hostCountThreshold=hostCountThreshold;}
+WebInspector.AuditRules.MinimizeDnsLookupsRule.prototype={doRun:function(requests,result,callback,progress)
+{var summary=result.addChild("");var domainToResourcesMap=WebInspector.AuditRules.getDomainToResourcesMap(requests,null,false);for(var domain in domainToResourcesMap){if(domainToResourcesMap[domain].length>1)
+continue;var parsedURL=domain.asParsedURL();if(!parsedURL)
+continue;if(!parsedURL.host.search(WebInspector.AuditRules.IPAddressRegexp))
+continue;summary.addSnippet(domain);result.violationCount++;}
+if(!summary.children||summary.children.length<=this._hostCountThreshold){callback(null);return;}
+summary.value=WebInspector.UIString("The following domains only serve one resource each. If possible, avoid the extra DNS lookups by serving these resources from existing domains.");callback(result);},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.ParallelizeDownloadRule=function(optimalHostnameCount,minRequestThreshold,minBalanceThreshold)
+{WebInspector.AuditRule.call(this,"network-parallelizehosts",WebInspector.UIString("Parallelize downloads across hostnames"));this._optimalHostnameCount=optimalHostnameCount;this._minRequestThreshold=minRequestThreshold;this._minBalanceThreshold=minBalanceThreshold;}
+WebInspector.AuditRules.ParallelizeDownloadRule.prototype={doRun:function(requests,result,callback,progress)
+{function hostSorter(a,b)
+{var aCount=domainToResourcesMap[a].length;var bCount=domainToResourcesMap[b].length;return(aCount<bCount)?1:(aCount===bCount)?0:-1;}
+var domainToResourcesMap=WebInspector.AuditRules.getDomainToResourcesMap(requests,[WebInspector.resourceTypes.Stylesheet,WebInspector.resourceTypes.Image],true);var hosts=[];for(var url in domainToResourcesMap)
+hosts.push(url);if(!hosts.length){callback(null);return;}
+hosts.sort(hostSorter);var optimalHostnameCount=this._optimalHostnameCount;if(hosts.length>optimalHostnameCount)
+hosts.splice(optimalHostnameCount);var busiestHostResourceCount=domainToResourcesMap[hosts[0]].length;var requestCountAboveThreshold=busiestHostResourceCount-this._minRequestThreshold;if(requestCountAboveThreshold<=0){callback(null);return;}
+var avgResourcesPerHost=0;for(var i=0,size=hosts.length;i<size;++i)
+avgResourcesPerHost+=domainToResourcesMap[hosts[i]].length;avgResourcesPerHost/=optimalHostnameCount;avgResourcesPerHost=Math.max(avgResourcesPerHost,1);var pctAboveAvg=(requestCountAboveThreshold/avgResourcesPerHost)-1.0;var minBalanceThreshold=this._minBalanceThreshold;if(pctAboveAvg<minBalanceThreshold){callback(null);return;}
+var requestsOnBusiestHost=domainToResourcesMap[hosts[0]];var entry=result.addChild(WebInspector.UIString("This page makes %d parallelizable requests to %s. Increase download parallelization by distributing the following requests across multiple hostnames.",busiestHostResourceCount,hosts[0]),true);for(var i=0;i<requestsOnBusiestHost.length;++i)
+entry.addURL(requestsOnBusiestHost[i].url);result.violationCount=requestsOnBusiestHost.length;callback(result);},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.UnusedCssRule=function()
+{WebInspector.AuditRule.call(this,"page-unusedcss",WebInspector.UIString("Remove unused CSS rules"));}
+WebInspector.AuditRules.UnusedCssRule.prototype={doRun:function(requests,result,callback,progress)
+{function evalCallback(styleSheets){if(!styleSheets.length)
+return callback(null);var selectors=[];var testedSelectors={};for(var i=0;i<styleSheets.length;++i){var styleSheet=styleSheets[i];for(var curRule=0;curRule<styleSheet.rules.length;++curRule){var selectorText=styleSheet.rules[curRule].selectorText;if(testedSelectors[selectorText])
+continue;selectors.push(selectorText);testedSelectors[selectorText]=1;}}
+var foundSelectors={};function selectorsCallback(styleSheets)
+{if(progress.isCanceled())
+return;var inlineBlockOrdinal=0;var totalStylesheetSize=0;var totalUnusedStylesheetSize=0;var summary;for(var i=0;i<styleSheets.length;++i){var styleSheet=styleSheets[i];var unusedRules=[];for(var curRule=0;curRule<styleSheet.rules.length;++curRule){var rule=styleSheet.rules[curRule];if(!testedSelectors[rule.selectorText]||foundSelectors[rule.selectorText])
+continue;unusedRules.push(rule.selectorText);}
+totalStylesheetSize+=styleSheet.rules.length;totalUnusedStylesheetSize+=unusedRules.length;if(!unusedRules.length)
+continue;var resource=WebInspector.resourceForURL(styleSheet.sourceURL);var isInlineBlock=resource&&resource.request&&resource.request.type===WebInspector.resourceTypes.Document;var url=!isInlineBlock?WebInspector.AuditRuleResult.linkifyDisplayName(styleSheet.sourceURL):WebInspector.UIString("Inline block #%d",++inlineBlockOrdinal);var pctUnused=Math.round(100*unusedRules.length/styleSheet.rules.length);if(!summary)
+summary=result.addChild("",true);var entry=summary.addFormatted("%s: %d% is not used by the current page.",url,pctUnused);for(var j=0;j<unusedRules.length;++j)
+entry.addSnippet(unusedRules[j]);result.violationCount+=unusedRules.length;}
+if(!totalUnusedStylesheetSize)
+return callback(null);var totalUnusedPercent=Math.round(100*totalUnusedStylesheetSize/totalStylesheetSize);summary.value=WebInspector.UIString("%s rules (%d%) of CSS not used by the current page.",totalUnusedStylesheetSize,totalUnusedPercent);callback(result);}
+function queryCallback(boundSelectorsCallback,selector,nodeId)
+{if(nodeId)
+foundSelectors[selector]=true;if(boundSelectorsCallback)
+boundSelectorsCallback();}
+function documentLoaded(selectors,document){var pseudoSelectorRegexp=/::?(?:[\w-]+)(?:\(.*?\))?/g;if(!selectors.length){selectorsCallback([]);return;}
+for(var i=0;i<selectors.length;++i){if(progress.isCanceled())
+return;var effectiveSelector=selectors[i].replace(pseudoSelectorRegexp,"");WebInspector.domModel.querySelector(document.id,effectiveSelector,queryCallback.bind(null,i===selectors.length-1?selectorsCallback.bind(null,styleSheets):null,selectors[i]));}}
+WebInspector.domModel.requestDocument(documentLoaded.bind(null,selectors));}
+var styleSheetInfos=WebInspector.cssModel.allStyleSheets();if(!styleSheetInfos||!styleSheetInfos.length){evalCallback([]);return;}
+var styleSheetProcessor=new WebInspector.AuditRules.StyleSheetProcessor(styleSheetInfos,progress,evalCallback);styleSheetProcessor.run();},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.ParsedStyleSheet;WebInspector.AuditRules.StyleSheetProcessor=function(styleSheetHeaders,progress,styleSheetsParsedCallback)
+{this._styleSheetHeaders=styleSheetHeaders;this._progress=progress;this._styleSheets=[];this._styleSheetsParsedCallback=styleSheetsParsedCallback;}
+WebInspector.AuditRules.StyleSheetProcessor.prototype={run:function()
+{this._parser=new WebInspector.CSSParser();this._processNextStyleSheet();},_terminateWorker:function()
+{if(this._parser){this._parser.dispose();delete this._parser;}},_finish:function()
+{this._terminateWorker();this._styleSheetsParsedCallback(this._styleSheets);},_processNextStyleSheet:function()
+{if(!this._styleSheetHeaders.length){this._finish();return;}
+this._currentStyleSheetHeader=this._styleSheetHeaders.shift();this._parser.fetchAndParse(this._currentStyleSheetHeader,this._onStyleSheetParsed.bind(this));},_onStyleSheetParsed:function(rules)
+{if(this._progress.isCanceled()){this._terminateWorker();return;}
+var styleRules=[];for(var i=0;i<rules.length;++i){var rule=rules[i];if(rule.selectorText)
+styleRules.push(rule);}
+this._styleSheets.push({sourceURL:this._currentStyleSheetHeader.sourceURL,rules:styleRules});this._processNextStyleSheet();},}
+WebInspector.AuditRules.CacheControlRule=function(id,name)
+{WebInspector.AuditRule.call(this,id,name);}
+WebInspector.AuditRules.CacheControlRule.MillisPerMonth=1000*60*60*24*30;WebInspector.AuditRules.CacheControlRule.prototype={doRun:function(requests,result,callback,progress)
+{var cacheableAndNonCacheableResources=this._cacheableAndNonCacheableResources(requests);if(cacheableAndNonCacheableResources[0].length)
+this.runChecks(cacheableAndNonCacheableResources[0],result);this.handleNonCacheableResources(cacheableAndNonCacheableResources[1],result);callback(result);},handleNonCacheableResources:function(requests,result)
+{},_cacheableAndNonCacheableResources:function(requests)
+{var processedResources=[[],[]];for(var i=0;i<requests.length;++i){var request=requests[i];if(!this.isCacheableResource(request))
+continue;if(this._isExplicitlyNonCacheable(request))
+processedResources[1].push(request);else
+processedResources[0].push(request);}
+return processedResources;},execCheck:function(messageText,requestCheckFunction,requests,result)
+{var requestCount=requests.length;var urls=[];for(var i=0;i<requestCount;++i){if(requestCheckFunction.call(this,requests[i]))
+urls.push(requests[i].url);}
+if(urls.length){var entry=result.addChild(messageText,true);entry.addURLs(urls);result.violationCount+=urls.length;}},freshnessLifetimeGreaterThan:function(request,timeMs)
+{var dateHeader=this.responseHeader(request,"Date");if(!dateHeader)
+return false;var dateHeaderMs=Date.parse(dateHeader);if(isNaN(dateHeaderMs))
+return false;var freshnessLifetimeMs;var maxAgeMatch=this.responseHeaderMatch(request,"Cache-Control","max-age=(\\d+)");if(maxAgeMatch)
+freshnessLifetimeMs=(maxAgeMatch[1])?1000*maxAgeMatch[1]:0;else{var expiresHeader=this.responseHeader(request,"Expires");if(expiresHeader){var expDate=Date.parse(expiresHeader);if(!isNaN(expDate))
+freshnessLifetimeMs=expDate-dateHeaderMs;}}
+return(isNaN(freshnessLifetimeMs))?false:freshnessLifetimeMs>timeMs;},responseHeader:function(request,header)
+{return request.responseHeaderValue(header);},hasResponseHeader:function(request,header)
+{return request.responseHeaderValue(header)!==undefined;},isCompressible:function(request)
+{return request.type.isTextType();},isPubliclyCacheable:function(request)
+{if(this._isExplicitlyNonCacheable(request))
+return false;if(this.responseHeaderMatch(request,"Cache-Control","public"))
+return true;return request.url.indexOf("?")===-1&&!this.responseHeaderMatch(request,"Cache-Control","private");},responseHeaderMatch:function(request,header,regexp)
+{return request.responseHeaderValue(header)?request.responseHeaderValue(header).match(new RegExp(regexp,"im")):null;},hasExplicitExpiration:function(request)
+{return this.hasResponseHeader(request,"Date")&&(this.hasResponseHeader(request,"Expires")||!!this.responseHeaderMatch(request,"Cache-Control","max-age"));},_isExplicitlyNonCacheable:function(request)
+{var hasExplicitExp=this.hasExplicitExpiration(request);return!!this.responseHeaderMatch(request,"Cache-Control","(no-cache|no-store|must-revalidate)")||!!this.responseHeaderMatch(request,"Pragma","no-cache")||(hasExplicitExp&&!this.freshnessLifetimeGreaterThan(request,0))||(!hasExplicitExp&&!!request.url&&request.url.indexOf("?")>=0)||(!hasExplicitExp&&!this.isCacheableResource(request));},isCacheableResource:function(request)
+{return request.statusCode!==undefined&&WebInspector.AuditRules.CacheableResponseCodes[request.statusCode];},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.BrowserCacheControlRule=function()
+{WebInspector.AuditRules.CacheControlRule.call(this,"http-browsercache",WebInspector.UIString("Leverage browser caching"));}
+WebInspector.AuditRules.BrowserCacheControlRule.prototype={handleNonCacheableResources:function(requests,result)
+{if(requests.length){var entry=result.addChild(WebInspector.UIString("The following resources are explicitly non-cacheable. Consider making them cacheable if possible:"),true);result.violationCount+=requests.length;for(var i=0;i<requests.length;++i)
+entry.addURL(requests[i].url);}},runChecks:function(requests,result,callback)
+{this.execCheck(WebInspector.UIString("The following resources are missing a cache expiration. Resources that do not specify an expiration may not be cached by browsers:"),this._missingExpirationCheck,requests,result);this.execCheck(WebInspector.UIString("The following resources specify a \"Vary\" header that disables caching in most versions of Internet Explorer:"),this._varyCheck,requests,result);this.execCheck(WebInspector.UIString("The following cacheable resources have a short freshness lifetime:"),this._oneMonthExpirationCheck,requests,result);this.execCheck(WebInspector.UIString("To further improve cache hit rate, specify an expiration one year in the future for the following cacheable resources:"),this._oneYearExpirationCheck,requests,result);},_missingExpirationCheck:function(request)
+{return this.isCacheableResource(request)&&!this.hasResponseHeader(request,"Set-Cookie")&&!this.hasExplicitExpiration(request);},_varyCheck:function(request)
+{var varyHeader=this.responseHeader(request,"Vary");if(varyHeader){varyHeader=varyHeader.replace(/User-Agent/gi,"");varyHeader=varyHeader.replace(/Accept-Encoding/gi,"");varyHeader=varyHeader.replace(/[, ]*/g,"");}
+return varyHeader&&varyHeader.length&&this.isCacheableResource(request)&&this.freshnessLifetimeGreaterThan(request,0);},_oneMonthExpirationCheck:function(request)
+{return this.isCacheableResource(request)&&!this.hasResponseHeader(request,"Set-Cookie")&&!this.freshnessLifetimeGreaterThan(request,WebInspector.AuditRules.CacheControlRule.MillisPerMonth)&&this.freshnessLifetimeGreaterThan(request,0);},_oneYearExpirationCheck:function(request)
+{return this.isCacheableResource(request)&&!this.hasResponseHeader(request,"Set-Cookie")&&!this.freshnessLifetimeGreaterThan(request,11*WebInspector.AuditRules.CacheControlRule.MillisPerMonth)&&this.freshnessLifetimeGreaterThan(request,WebInspector.AuditRules.CacheControlRule.MillisPerMonth);},__proto__:WebInspector.AuditRules.CacheControlRule.prototype}
+WebInspector.AuditRules.ProxyCacheControlRule=function(){WebInspector.AuditRules.CacheControlRule.call(this,"http-proxycache",WebInspector.UIString("Leverage proxy caching"));}
+WebInspector.AuditRules.ProxyCacheControlRule.prototype={runChecks:function(requests,result,callback)
+{this.execCheck(WebInspector.UIString("Resources with a \"?\" in the URL are not cached by most proxy caching servers:"),this._questionMarkCheck,requests,result);this.execCheck(WebInspector.UIString("Consider adding a \"Cache-Control: public\" header to the following resources:"),this._publicCachingCheck,requests,result);this.execCheck(WebInspector.UIString("The following publicly cacheable resources contain a Set-Cookie header. This security vulnerability can cause cookies to be shared by multiple users."),this._setCookieCacheableCheck,requests,result);},_questionMarkCheck:function(request)
+{return request.url.indexOf("?")>=0&&!this.hasResponseHeader(request,"Set-Cookie")&&this.isPubliclyCacheable(request);},_publicCachingCheck:function(request)
+{return this.isCacheableResource(request)&&!this.isCompressible(request)&&!this.responseHeaderMatch(request,"Cache-Control","public")&&!this.hasResponseHeader(request,"Set-Cookie");},_setCookieCacheableCheck:function(request)
+{return this.hasResponseHeader(request,"Set-Cookie")&&this.isPubliclyCacheable(request);},__proto__:WebInspector.AuditRules.CacheControlRule.prototype}
+WebInspector.AuditRules.ImageDimensionsRule=function()
+{WebInspector.AuditRule.call(this,"page-imagedims",WebInspector.UIString("Specify image dimensions"));}
+WebInspector.AuditRules.ImageDimensionsRule.prototype={doRun:function(requests,result,callback,progress)
+{var urlToNoDimensionCount={};function doneCallback()
+{for(var url in urlToNoDimensionCount){var entry=entry||result.addChild(WebInspector.UIString("A width and height should be specified for all images in order to speed up page display. The following image(s) are missing a width and/or height:"),true);var format="%r";if(urlToNoDimensionCount[url]>1)
+format+=" (%d uses)";entry.addFormatted(format,url,urlToNoDimensionCount[url]);result.violationCount++;}
+callback(entry?result:null);}
+function imageStylesReady(imageId,styles,isLastStyle,computedStyle)
+{if(progress.isCanceled())
+return;const node=WebInspector.domModel.nodeForId(imageId);var src=node.getAttribute("src");if(!src.asParsedURL()){for(var frameOwnerCandidate=node;frameOwnerCandidate;frameOwnerCandidate=frameOwnerCandidate.parentNode){if(frameOwnerCandidate.baseURL){var completeSrc=WebInspector.ParsedURL.completeURL(frameOwnerCandidate.baseURL,src);break;}}}
+if(completeSrc)
+src=completeSrc;if(computedStyle.getPropertyValue("position")==="absolute"){if(isLastStyle)
+doneCallback();return;}
+if(styles.attributesStyle){var widthFound=!!styles.attributesStyle.getLiveProperty("width");var heightFound=!!styles.attributesStyle.getLiveProperty("height");}
+var inlineStyle=styles.inlineStyle;if(inlineStyle){if(inlineStyle.getPropertyValue("width")!=="")
+widthFound=true;if(inlineStyle.getPropertyValue("height")!=="")
+heightFound=true;}
+for(var i=styles.matchedCSSRules.length-1;i>=0&&!(widthFound&&heightFound);--i){var style=styles.matchedCSSRules[i].style;if(style.getPropertyValue("width")!=="")
+widthFound=true;if(style.getPropertyValue("height")!=="")
+heightFound=true;}
+if(!widthFound||!heightFound){if(src in urlToNoDimensionCount)
+++urlToNoDimensionCount[src];else
+urlToNoDimensionCount[src]=1;}
+if(isLastStyle)
+doneCallback();}
+function getStyles(nodeIds)
+{if(progress.isCanceled())
+return;var targetResult={};function inlineCallback(inlineStyle,attributesStyle)
+{targetResult.inlineStyle=inlineStyle;targetResult.attributesStyle=attributesStyle;}
+function matchedCallback(result)
+{if(result)
+targetResult.matchedCSSRules=result.matchedCSSRules;}
+if(!nodeIds||!nodeIds.length)
+doneCallback();for(var i=0;nodeIds&&i<nodeIds.length;++i){WebInspector.cssModel.getMatchedStylesAsync(nodeIds[i],false,false,matchedCallback);WebInspector.cssModel.getInlineStylesAsync(nodeIds[i],inlineCallback);WebInspector.cssModel.getComputedStyleAsync(nodeIds[i],imageStylesReady.bind(null,nodeIds[i],targetResult,i===nodeIds.length-1));}}
+function onDocumentAvailable(root)
+{if(progress.isCanceled())
+return;WebInspector.domModel.querySelectorAll(root.id,"img[src]",getStyles);}
+if(progress.isCanceled())
+return;WebInspector.domModel.requestDocument(onDocumentAvailable);},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.CssInHeadRule=function()
+{WebInspector.AuditRule.call(this,"page-cssinhead",WebInspector.UIString("Put CSS in the document head"));}
+WebInspector.AuditRules.CssInHeadRule.prototype={doRun:function(requests,result,callback,progress)
+{function evalCallback(evalResult)
+{if(progress.isCanceled())
+return;if(!evalResult)
+return callback(null);var summary=result.addChild("");var outputMessages=[];for(var url in evalResult){var urlViolations=evalResult[url];if(urlViolations[0]){result.addFormatted("%s style block(s) in the %r body should be moved to the document head.",urlViolations[0],url);result.violationCount+=urlViolations[0];}
+for(var i=0;i<urlViolations[1].length;++i)
+result.addFormatted("Link node %r should be moved to the document head in %r",urlViolations[1][i],url);result.violationCount+=urlViolations[1].length;}
+summary.value=WebInspector.UIString("CSS in the document body adversely impacts rendering performance.");callback(result);}
+function externalStylesheetsReceived(root,inlineStyleNodeIds,nodeIds)
+{if(progress.isCanceled())
+return;if(!nodeIds)
+return;var externalStylesheetNodeIds=nodeIds;var result=null;if(inlineStyleNodeIds.length||externalStylesheetNodeIds.length){var urlToViolationsArray={};var externalStylesheetHrefs=[];for(var j=0;j<externalStylesheetNodeIds.length;++j){var linkNode=WebInspector.domModel.nodeForId(externalStylesheetNodeIds[j]);var completeHref=WebInspector.ParsedURL.completeURL(linkNode.ownerDocument.baseURL,linkNode.getAttribute("href"));externalStylesheetHrefs.push(completeHref||"<empty>");}
+urlToViolationsArray[root.documentURL]=[inlineStyleNodeIds.length,externalStylesheetHrefs];result=urlToViolationsArray;}
+evalCallback(result);}
+function inlineStylesReceived(root,nodeIds)
+{if(progress.isCanceled())
+return;if(!nodeIds)
+return;WebInspector.domModel.querySelectorAll(root.id,"body link[rel~='stylesheet'][href]",externalStylesheetsReceived.bind(null,root,nodeIds));}
+function onDocumentAvailable(root)
+{if(progress.isCanceled())
+return;WebInspector.domModel.querySelectorAll(root.id,"body style",inlineStylesReceived.bind(null,root));}
+WebInspector.domModel.requestDocument(onDocumentAvailable);},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.StylesScriptsOrderRule=function()
+{WebInspector.AuditRule.call(this,"page-stylescriptorder",WebInspector.UIString("Optimize the order of styles and scripts"));}
+WebInspector.AuditRules.StylesScriptsOrderRule.prototype={doRun:function(requests,result,callback,progress)
+{function evalCallback(resultValue)
+{if(progress.isCanceled())
+return;if(!resultValue)
+return callback(null);var lateCssUrls=resultValue[0];var cssBeforeInlineCount=resultValue[1];if(lateCssUrls.length){var entry=result.addChild(WebInspector.UIString("The following external CSS files were included after an external JavaScript file in the document head. To ensure CSS files are downloaded in parallel, always include external CSS before external JavaScript."),true);entry.addURLs(lateCssUrls);result.violationCount+=lateCssUrls.length;}
+if(cssBeforeInlineCount){result.addChild(WebInspector.UIString(" %d inline script block%s found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.",cssBeforeInlineCount,cssBeforeInlineCount>1?"s were":" was"));result.violationCount+=cssBeforeInlineCount;}
+callback(result);}
+function cssBeforeInlineReceived(lateStyleIds,nodeIds)
+{if(progress.isCanceled())
+return;if(!nodeIds)
+return;var cssBeforeInlineCount=nodeIds.length;var result=null;if(lateStyleIds.length||cssBeforeInlineCount){var lateStyleUrls=[];for(var i=0;i<lateStyleIds.length;++i){var lateStyleNode=WebInspector.domModel.nodeForId(lateStyleIds[i]);var completeHref=WebInspector.ParsedURL.completeURL(lateStyleNode.ownerDocument.baseURL,lateStyleNode.getAttribute("href"));lateStyleUrls.push(completeHref||"<empty>");}
+result=[lateStyleUrls,cssBeforeInlineCount];}
+evalCallback(result);}
+function lateStylesReceived(root,nodeIds)
+{if(progress.isCanceled())
+return;if(!nodeIds)
+return;WebInspector.domModel.querySelectorAll(root.id,"head link[rel~='stylesheet'][href] ~ script:not([src])",cssBeforeInlineReceived.bind(null,nodeIds));}
+function onDocumentAvailable(root)
+{if(progress.isCanceled())
+return;WebInspector.domModel.querySelectorAll(root.id,"head script[src] ~ link[rel~='stylesheet'][href]",lateStylesReceived.bind(null,root));}
+WebInspector.domModel.requestDocument(onDocumentAvailable);},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.CSSRuleBase=function(id,name)
+{WebInspector.AuditRule.call(this,id,name);}
+WebInspector.AuditRules.CSSRuleBase.prototype={doRun:function(requests,result,callback,progress)
+{var headers=WebInspector.cssModel.allStyleSheets();if(!headers.length){callback(null);return;}
+var activeHeaders=[]
+for(var i=0;i<headers.length;++i){if(!headers[i].disabled)
+activeHeaders.push(headers[i]);}
+var styleSheetProcessor=new WebInspector.AuditRules.StyleSheetProcessor(activeHeaders,progress,this._styleSheetsLoaded.bind(this,result,callback,progress));styleSheetProcessor.run();},_styleSheetsLoaded:function(result,callback,progress,styleSheets)
+{for(var i=0;i<styleSheets.length;++i)
+this._visitStyleSheet(styleSheets[i],result);callback(result);},_visitStyleSheet:function(styleSheet,result)
+{this.visitStyleSheet(styleSheet,result);for(var i=0;i<styleSheet.rules.length;++i)
+this._visitRule(styleSheet,styleSheet.rules[i],result);this.didVisitStyleSheet(styleSheet,result);},_visitRule:function(styleSheet,rule,result)
+{this.visitRule(styleSheet,rule,result);var allProperties=rule.properties;for(var i=0;i<allProperties.length;++i)
+this.visitProperty(styleSheet,rule,allProperties[i],result);this.didVisitRule(styleSheet,rule,result);},visitStyleSheet:function(styleSheet,result)
+{},didVisitStyleSheet:function(styleSheet,result)
+{},visitRule:function(styleSheet,rule,result)
+{},didVisitRule:function(styleSheet,rule,result)
+{},visitProperty:function(styleSheet,rule,property,result)
+{},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.VendorPrefixedCSSProperties=function()
+{WebInspector.AuditRules.CSSRuleBase.call(this,"page-vendorprefixedcss",WebInspector.UIString("Use normal CSS property names instead of vendor-prefixed ones"));this._webkitPrefix="-webkit-";}
+WebInspector.AuditRules.VendorPrefixedCSSProperties.supportedProperties=["background-clip","background-origin","background-size","border-radius","border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","box-shadow","box-sizing","opacity","text-shadow"].keySet();WebInspector.AuditRules.VendorPrefixedCSSProperties.prototype={didVisitStyleSheet:function(styleSheet)
+{delete this._styleSheetResult;},visitRule:function(rule)
+{this._mentionedProperties={};},didVisitRule:function()
+{delete this._ruleResult;delete this._mentionedProperties;},visitProperty:function(styleSheet,rule,property,result)
+{if(!property.name.startsWith(this._webkitPrefix))
+return;var normalPropertyName=property.name.substring(this._webkitPrefix.length).toLowerCase();if(WebInspector.AuditRules.VendorPrefixedCSSProperties.supportedProperties[normalPropertyName]&&!this._mentionedProperties[normalPropertyName]){this._mentionedProperties[normalPropertyName]=true;if(!this._styleSheetResult)
+this._styleSheetResult=result.addChild(styleSheet.sourceURL?WebInspector.linkifyResourceAsNode(styleSheet.sourceURL):WebInspector.UIString("<unknown>"));if(!this._ruleResult){var anchor=WebInspector.linkifyURLAsNode(styleSheet.sourceURL,rule.selectorText);anchor.lineNumber=rule.lineNumber;this._ruleResult=this._styleSheetResult.addChild(anchor);}
+++result.violationCount;this._ruleResult.addSnippet(WebInspector.UIString("\"%s%s\" is used, but \"%s\" is supported.",this._webkitPrefix,normalPropertyName,normalPropertyName));}},__proto__:WebInspector.AuditRules.CSSRuleBase.prototype}
+WebInspector.AuditRules.CookieRuleBase=function(id,name)
+{WebInspector.AuditRule.call(this,id,name);}
+WebInspector.AuditRules.CookieRuleBase.prototype={doRun:function(requests,result,callback,progress)
+{var self=this;function resultCallback(receivedCookies){if(progress.isCanceled())
+return;self.processCookies(receivedCookies,requests,result);callback(result);}
+WebInspector.Cookies.getCookiesAsync(resultCallback);},mapResourceCookies:function(requestsByDomain,allCookies,callback)
+{for(var i=0;i<allCookies.length;++i){for(var requestDomain in requestsByDomain){if(WebInspector.Cookies.cookieDomainMatchesResourceDomain(allCookies[i].domain(),requestDomain))
+this._callbackForResourceCookiePairs(requestsByDomain[requestDomain],allCookies[i],callback);}}},_callbackForResourceCookiePairs:function(requests,cookie,callback)
+{if(!requests)
+return;for(var i=0;i<requests.length;++i){if(WebInspector.Cookies.cookieMatchesResourceURL(cookie,requests[i].url))
+callback(requests[i],cookie);}},__proto__:WebInspector.AuditRule.prototype}
+WebInspector.AuditRules.CookieSizeRule=function(avgBytesThreshold)
+{WebInspector.AuditRules.CookieRuleBase.call(this,"http-cookiesize",WebInspector.UIString("Minimize cookie size"));this._avgBytesThreshold=avgBytesThreshold;this._maxBytesThreshold=1000;}
+WebInspector.AuditRules.CookieSizeRule.prototype={_average:function(cookieArray)
+{var total=0;for(var i=0;i<cookieArray.length;++i)
+total+=cookieArray[i].size();return cookieArray.length?Math.round(total/cookieArray.length):0;},_max:function(cookieArray)
+{var result=0;for(var i=0;i<cookieArray.length;++i)
+result=Math.max(cookieArray[i].size(),result);return result;},processCookies:function(allCookies,requests,result)
+{function maxSizeSorter(a,b)
+{return b.maxCookieSize-a.maxCookieSize;}
+function avgSizeSorter(a,b)
+{return b.avgCookieSize-a.avgCookieSize;}
+var cookiesPerResourceDomain={};function collectorCallback(request,cookie)
+{var cookies=cookiesPerResourceDomain[request.parsedURL.host];if(!cookies){cookies=[];cookiesPerResourceDomain[request.parsedURL.host]=cookies;}
+cookies.push(cookie);}
+if(!allCookies.length)
+return;var sortedCookieSizes=[];var domainToResourcesMap=WebInspector.AuditRules.getDomainToResourcesMap(requests,null,true);var matchingResourceData={};this.mapResourceCookies(domainToResourcesMap,allCookies,collectorCallback);for(var requestDomain in cookiesPerResourceDomain){var cookies=cookiesPerResourceDomain[requestDomain];sortedCookieSizes.push({domain:requestDomain,avgCookieSize:this._average(cookies),maxCookieSize:this._max(cookies)});}
+var avgAllCookiesSize=this._average(allCookies);var hugeCookieDomains=[];sortedCookieSizes.sort(maxSizeSorter);for(var i=0,len=sortedCookieSizes.length;i<len;++i){var maxCookieSize=sortedCookieSizes[i].maxCookieSize;if(maxCookieSize>this._maxBytesThreshold)
+hugeCookieDomains.push(WebInspector.AuditRuleResult.resourceDomain(sortedCookieSizes[i].domain)+": "+Number.bytesToString(maxCookieSize));}
+var bigAvgCookieDomains=[];sortedCookieSizes.sort(avgSizeSorter);for(var i=0,len=sortedCookieSizes.length;i<len;++i){var domain=sortedCookieSizes[i].domain;var avgCookieSize=sortedCookieSizes[i].avgCookieSize;if(avgCookieSize>this._avgBytesThreshold&&avgCookieSize<this._maxBytesThreshold)
+bigAvgCookieDomains.push(WebInspector.AuditRuleResult.resourceDomain(domain)+": "+Number.bytesToString(avgCookieSize));}
+result.addChild(WebInspector.UIString("The average cookie size for all requests on this page is %s",Number.bytesToString(avgAllCookiesSize)));var message;if(hugeCookieDomains.length){var entry=result.addChild(WebInspector.UIString("The following domains have a cookie size in excess of 1KB. This is harmful because requests with cookies larger than 1KB typically cannot fit into a single network packet."),true);entry.addURLs(hugeCookieDomains);result.violationCount+=hugeCookieDomains.length;}
+if(bigAvgCookieDomains.length){var entry=result.addChild(WebInspector.UIString("The following domains have an average cookie size in excess of %d bytes. Reducing the size of cookies for these domains can reduce the time it takes to send requests.",this._avgBytesThreshold),true);entry.addURLs(bigAvgCookieDomains);result.violationCount+=bigAvgCookieDomains.length;}},__proto__:WebInspector.AuditRules.CookieRuleBase.prototype}
+WebInspector.AuditRules.StaticCookielessRule=function(minResources)
+{WebInspector.AuditRules.CookieRuleBase.call(this,"http-staticcookieless",WebInspector.UIString("Serve static content from a cookieless domain"));this._minResources=minResources;}
+WebInspector.AuditRules.StaticCookielessRule.prototype={processCookies:function(allCookies,requests,result)
+{var domainToResourcesMap=WebInspector.AuditRules.getDomainToResourcesMap(requests,[WebInspector.resourceTypes.Stylesheet,WebInspector.resourceTypes.Image],true);var totalStaticResources=0;for(var domain in domainToResourcesMap)
+totalStaticResources+=domainToResourcesMap[domain].length;if(totalStaticResources<this._minResources)
+return;var matchingResourceData={};this.mapResourceCookies(domainToResourcesMap,allCookies,this._collectorCallback.bind(this,matchingResourceData));var badUrls=[];var cookieBytes=0;for(var url in matchingResourceData){badUrls.push(url);cookieBytes+=matchingResourceData[url]}
+if(badUrls.length<this._minResources)
+return;var entry=result.addChild(WebInspector.UIString("%s of cookies were sent with the following static resources. Serve these static resources from a domain that does not set cookies:",Number.bytesToString(cookieBytes)),true);entry.addURLs(badUrls);result.violationCount=badUrls.length;},_collectorCallback:function(matchingResourceData,request,cookie)
+{matchingResourceData[request.url]=(matchingResourceData[request.url]||0)+cookie.size();},__proto__:WebInspector.AuditRules.CookieRuleBase.prototype};
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/CodeMirrorTextEditor.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/CodeMirrorTextEditor.js
new file mode 100644 (file)
index 0000000..00e7fdb
--- /dev/null
@@ -0,0 +1,1487 @@
+window.CodeMirror=(function(){"use strict";var gecko=/gecko\/\d/i.test(navigator.userAgent);var old_ie=/MSIE \d/.test(navigator.userAgent);var ie_lt8=old_ie&&(document.documentMode==null||document.documentMode<8);var ie_lt9=old_ie&&(document.documentMode==null||document.documentMode<9);var ie_gt10=/Trident\/([7-9]|\d{2,})\./.test(navigator.userAgent);var ie=old_ie||ie_gt10;var webkit=/WebKit\//.test(navigator.userAgent);var qtwebkit=webkit&&/Qt\/\d+\.\d+/.test(navigator.userAgent);var chrome=/Chrome\//.test(navigator.userAgent);var opera=/Opera\//.test(navigator.userAgent);var safari=/Apple Computer/.test(navigator.vendor);var khtml=/KHTML\//.test(navigator.userAgent);var mac_geLion=/Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);var mac_geMountainLion=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);var phantom=/PhantomJS/.test(navigator.userAgent);var ios=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent);var mobile=ios||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);var mac=ios||/Mac/.test(navigator.platform);var windows=/win/i.test(navigator.platform);var opera_version=opera&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);if(opera_version)opera_version=Number(opera_version[1]);if(opera_version&&opera_version>=15){opera=false;webkit=true;}
+var flipCtrlCmd=mac&&(qtwebkit||opera&&(opera_version==null||opera_version<12.11));var captureMiddleClick=gecko||(old_ie&&!ie_lt9);var sawReadOnlySpans=false,sawCollapsedSpans=false;function CodeMirror(place,options){if(!(this instanceof CodeMirror))return new CodeMirror(place,options);this.options=options=options||{};for(var opt in defaults)if(!options.hasOwnProperty(opt)&&defaults.hasOwnProperty(opt))
+options[opt]=defaults[opt];setGuttersForLineNumbers(options);var docStart=typeof options.value=="string"?0:options.value.first;var display=this.display=makeDisplay(place,docStart);display.wrapper.CodeMirror=this;updateGutters(this);if(options.autofocus&&!mobile)focusInput(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:false,focused:false,suppressEdits:false,pasteIncoming:false,cutIncoming:false,draggingText:false,highlight:new Delayed()};themeChanged(this);if(options.lineWrapping)
+this.display.wrapper.className+=" CodeMirror-wrap";var doc=options.value;if(typeof doc=="string")doc=new Doc(options.value,options.mode);operation(this,attachDoc)(this,doc);if(old_ie)setTimeout(bind(resetInput,this,true),20);registerEventHandlers(this);var hasFocus;try{hasFocus=(document.activeElement==display.input);}catch(e){}
+if(hasFocus||(options.autofocus&&!mobile))setTimeout(bind(onFocus,this),20);else onBlur(this);operation(this,function(){for(var opt in optionHandlers)
+if(optionHandlers.propertyIsEnumerable(opt))
+optionHandlers[opt](this,options[opt],Init);for(var i=0;i<initHooks.length;++i)initHooks[i](this);})();}
+function makeDisplay(place,docStart){var d={};var input=d.input=elt("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none; font-size: 4px;");if(webkit)input.style.width="1000px";else input.setAttribute("wrap","off");if(ios)input.style.border="1px solid black";input.setAttribute("autocorrect","off");input.setAttribute("autocapitalize","off");input.setAttribute("spellcheck","false");d.inputDiv=elt("div",[input],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");d.scrollbarH=elt("div",[elt("div",null,null,"height: 1px")],"CodeMirror-hscrollbar");d.scrollbarV=elt("div",[elt("div",null,null,"width: 1px")],"CodeMirror-vscrollbar");d.scrollbarFiller=elt("div",null,"CodeMirror-scrollbar-filler");d.gutterFiller=elt("div",null,"CodeMirror-gutter-filler");d.lineDiv=elt("div",null,"CodeMirror-code");d.selectionDiv=elt("div",null,null,"position: relative; z-index: 1");d.cursor=elt("div","\u00a0","CodeMirror-cursor");d.otherCursor=elt("div","\u00a0","CodeMirror-cursor CodeMirror-secondarycursor");d.measure=elt("div",null,"CodeMirror-measure");d.lineSpace=elt("div",[d.measure,d.selectionDiv,d.lineDiv,d.cursor,d.otherCursor],null,"position: relative; outline: none");d.mover=elt("div",[elt("div",[d.lineSpace],"CodeMirror-lines")],null,"position: relative");d.sizer=elt("div",[d.mover],"CodeMirror-sizer");d.heightForcer=elt("div",null,null,"position: absolute; height: "+scrollerCutOff+"px; width: 1px;");d.gutters=elt("div",null,"CodeMirror-gutters");d.lineGutter=null;d.scroller=elt("div",[d.sizer,d.heightForcer,d.gutters],"CodeMirror-scroll");d.scroller.setAttribute("tabIndex","-1");d.wrapper=elt("div",[d.inputDiv,d.scrollbarH,d.scrollbarV,d.scrollbarFiller,d.gutterFiller,d.scroller],"CodeMirror");if(ie_lt8){d.gutters.style.zIndex=-1;d.scroller.style.paddingRight=0;}
+if(place.appendChild)place.appendChild(d.wrapper);else place(d.wrapper);if(ios)input.style.width="0px";if(!webkit)d.scroller.draggable=true;if(khtml){d.inputDiv.style.height="1px";d.inputDiv.style.position="absolute";}
+else if(ie_lt8)d.scrollbarH.style.minWidth=d.scrollbarV.style.minWidth="18px";d.viewOffset=d.lastSizeC=0;d.showingFrom=d.showingTo=docStart;d.lineNumWidth=d.lineNumInnerWidth=d.lineNumChars=null;d.prevInput="";d.alignWidgets=false;d.pollingFast=false;d.poll=new Delayed();d.cachedCharWidth=d.cachedTextHeight=null;d.measureLineCache=[];d.measureLineCachePos=0;d.inaccurateSelection=false;d.maxLine=null;d.maxLineLength=0;d.maxLineChanged=false;d.wheelDX=d.wheelDY=d.wheelStartX=d.wheelStartY=null;return d;}
+function loadMode(cm){cm.doc.mode=CodeMirror.getMode(cm.options,cm.doc.modeOption);resetModeState(cm);}
+function resetModeState(cm){cm.doc.iter(function(line){if(line.stateAfter)line.stateAfter=null;if(line.styles)line.styles=null;});cm.doc.frontier=cm.doc.first;startWorker(cm,100);cm.state.modeGen++;if(cm.curOp)regChange(cm);}
+function wrappingChanged(cm){if(cm.options.lineWrapping){cm.display.wrapper.className+=" CodeMirror-wrap";cm.display.sizer.style.minWidth="";}else{cm.display.wrapper.className=cm.display.wrapper.className.replace(" CodeMirror-wrap","");computeMaxLength(cm);}
+estimateLineHeights(cm);regChange(cm);clearCaches(cm);setTimeout(function(){updateScrollbars(cm);},100);}
+function estimateHeight(cm){var th=textHeight(cm.display),wrapping=cm.options.lineWrapping;var perLine=wrapping&&Math.max(5,cm.display.scroller.clientWidth/charWidth(cm.display)-3);return function(line){if(lineIsHidden(cm.doc,line))
+return 0;else if(wrapping)
+return(Math.ceil(line.text.length/perLine)||1)*th;else
+return th;};}
+function estimateLineHeights(cm){var doc=cm.doc,est=estimateHeight(cm);doc.iter(function(line){var estHeight=est(line);if(estHeight!=line.height)updateLineHeight(line,estHeight);});}
+function keyMapChanged(cm){var map=keyMap[cm.options.keyMap],style=map.style;cm.display.wrapper.className=cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g,"")+
+(style?" cm-keymap-"+style:"");}
+function themeChanged(cm){cm.display.wrapper.className=cm.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+
+cm.options.theme.replace(/(^|\s)\s*/g," cm-s-");clearCaches(cm);}
+function guttersChanged(cm){updateGutters(cm);regChange(cm);setTimeout(function(){alignHorizontally(cm);},20);}
+function updateGutters(cm){var gutters=cm.display.gutters,specs=cm.options.gutters;removeChildren(gutters);for(var i=0;i<specs.length;++i){var gutterClass=specs[i];var gElt=gutters.appendChild(elt("div",null,"CodeMirror-gutter "+gutterClass));if(gutterClass=="CodeMirror-linenumbers"){cm.display.lineGutter=gElt;gElt.style.width=(cm.display.lineNumWidth||1)+"px";}}
+gutters.style.display=i?"":"none";}
+function lineLength(doc,line){if(line.height==0)return 0;var len=line.text.length,merged,cur=line;while(merged=collapsedSpanAtStart(cur)){var found=merged.find();cur=getLine(doc,found.from.line);len+=found.from.ch-found.to.ch;}
+cur=line;while(merged=collapsedSpanAtEnd(cur)){var found=merged.find();len-=cur.text.length-found.from.ch;cur=getLine(doc,found.to.line);len+=cur.text.length-found.to.ch;}
+return len;}
+function computeMaxLength(cm){var d=cm.display,doc=cm.doc;d.maxLine=getLine(doc,doc.first);d.maxLineLength=lineLength(doc,d.maxLine);d.maxLineChanged=true;doc.iter(function(line){var len=lineLength(doc,line);if(len>d.maxLineLength){d.maxLineLength=len;d.maxLine=line;}});}
+function setGuttersForLineNumbers(options){var found=indexOf(options.gutters,"CodeMirror-linenumbers");if(found==-1&&options.lineNumbers){options.gutters=options.gutters.concat(["CodeMirror-linenumbers"]);}else if(found>-1&&!options.lineNumbers){options.gutters=options.gutters.slice(0);options.gutters.splice(found,1);}}
+function updateScrollbars(cm){var d=cm.display,docHeight=cm.doc.height;var totalHeight=docHeight+paddingVert(d);d.sizer.style.minHeight=d.heightForcer.style.top=totalHeight+"px";d.gutters.style.height=Math.max(totalHeight,d.scroller.clientHeight-scrollerCutOff)+"px";var scrollHeight=Math.max(totalHeight,d.scroller.scrollHeight);var needsH=d.scroller.scrollWidth>(d.scroller.clientWidth+1);var needsV=scrollHeight>(d.scroller.clientHeight+1);if(needsV){d.scrollbarV.style.display="block";d.scrollbarV.style.bottom=needsH?scrollbarWidth(d.measure)+"px":"0";d.scrollbarV.firstChild.style.height=Math.max(0,scrollHeight-d.scroller.clientHeight+d.scrollbarV.clientHeight)+"px";}else{d.scrollbarV.style.display="";d.scrollbarV.firstChild.style.height="0";}
+if(needsH){d.scrollbarH.style.display="block";d.scrollbarH.style.right=needsV?scrollbarWidth(d.measure)+"px":"0";d.scrollbarH.firstChild.style.width=(d.scroller.scrollWidth-d.scroller.clientWidth+d.scrollbarH.clientWidth)+"px";}else{d.scrollbarH.style.display="";d.scrollbarH.firstChild.style.width="0";}
+if(needsH&&needsV){d.scrollbarFiller.style.display="block";d.scrollbarFiller.style.height=d.scrollbarFiller.style.width=scrollbarWidth(d.measure)+"px";}else d.scrollbarFiller.style.display="";if(needsH&&cm.options.coverGutterNextToScrollbar&&cm.options.fixedGutter){d.gutterFiller.style.display="block";d.gutterFiller.style.height=scrollbarWidth(d.measure)+"px";d.gutterFiller.style.width=d.gutters.offsetWidth+"px";}else d.gutterFiller.style.display="";if(mac_geLion&&scrollbarWidth(d.measure)===0){d.scrollbarV.style.minWidth=d.scrollbarH.style.minHeight=mac_geMountainLion?"18px":"12px";d.scrollbarV.style.pointerEvents=d.scrollbarH.style.pointerEvents="none";}}
+function visibleLines(display,doc,viewPort){var top=display.scroller.scrollTop,height=display.wrapper.clientHeight;if(typeof viewPort=="number")top=viewPort;else if(viewPort){top=viewPort.top;height=viewPort.bottom-viewPort.top;}
+top=Math.floor(top-paddingTop(display));var bottom=Math.ceil(top+height);return{from:lineAtHeight(doc,top),to:lineAtHeight(doc,bottom)};}
+function alignHorizontally(cm){var display=cm.display;if(!display.alignWidgets&&(!display.gutters.firstChild||!cm.options.fixedGutter))return;var comp=compensateForHScroll(display)-display.scroller.scrollLeft+cm.doc.scrollLeft;var gutterW=display.gutters.offsetWidth,l=comp+"px";for(var n=display.lineDiv.firstChild;n;n=n.nextSibling)if(n.alignable){for(var i=0,a=n.alignable;i<a.length;++i)a[i].style.left=l;}
+if(cm.options.fixedGutter)
+display.gutters.style.left=(comp+gutterW)+"px";}
+function maybeUpdateLineNumberWidth(cm){if(!cm.options.lineNumbers)return false;var doc=cm.doc,last=lineNumberFor(cm.options,doc.first+doc.size-1),display=cm.display;if(last.length!=display.lineNumChars){var test=display.measure.appendChild(elt("div",[elt("div",last)],"CodeMirror-linenumber CodeMirror-gutter-elt"));var innerW=test.firstChild.offsetWidth,padding=test.offsetWidth-innerW;display.lineGutter.style.width="";display.lineNumInnerWidth=Math.max(innerW,display.lineGutter.offsetWidth-padding);display.lineNumWidth=display.lineNumInnerWidth+padding;display.lineNumChars=display.lineNumInnerWidth?last.length:-1;display.lineGutter.style.width=display.lineNumWidth+"px";return true;}
+return false;}
+function lineNumberFor(options,i){return String(options.lineNumberFormatter(i+options.firstLineNumber));}
+function compensateForHScroll(display){return getRect(display.scroller).left-getRect(display.sizer).left;}
+function updateDisplay(cm,changes,viewPort,forced){var oldFrom=cm.display.showingFrom,oldTo=cm.display.showingTo,updated;var visible=visibleLines(cm.display,cm.doc,viewPort);for(var first=true;;first=false){var oldWidth=cm.display.scroller.clientWidth;if(!updateDisplayInner(cm,changes,visible,forced))break;updated=true;changes=[];updateSelection(cm);updateScrollbars(cm);if(first&&cm.options.lineWrapping&&oldWidth!=cm.display.scroller.clientWidth){forced=true;continue;}
+forced=false;if(viewPort)
+viewPort=Math.min(cm.display.scroller.scrollHeight-cm.display.scroller.clientHeight,typeof viewPort=="number"?viewPort:viewPort.top);visible=visibleLines(cm.display,cm.doc,viewPort);if(visible.from>=cm.display.showingFrom&&visible.to<=cm.display.showingTo)
+break;}
+if(updated){signalLater(cm,"update",cm);if(cm.display.showingFrom!=oldFrom||cm.display.showingTo!=oldTo)
+signalLater(cm,"viewportChange",cm,cm.display.showingFrom,cm.display.showingTo);}
+return updated;}
+function updateDisplayInner(cm,changes,visible,forced){var display=cm.display,doc=cm.doc;if(!display.wrapper.offsetWidth){display.showingFrom=display.showingTo=doc.first;display.viewOffset=0;return;}
+if(!forced&&changes.length==0&&visible.from>display.showingFrom&&visible.to<display.showingTo)
+return;if(maybeUpdateLineNumberWidth(cm))
+changes=[{from:doc.first,to:doc.first+doc.size}];var gutterW=display.sizer.style.marginLeft=display.gutters.offsetWidth+"px";display.scrollbarH.style.left=cm.options.fixedGutter?gutterW:"0";var positionsChangedFrom=Infinity;if(cm.options.lineNumbers)
+for(var i=0;i<changes.length;++i)
+if(changes[i].diff&&changes[i].from<positionsChangedFrom){positionsChangedFrom=changes[i].from;}
+var end=doc.first+doc.size;var from=Math.max(visible.from-cm.options.viewportMargin,doc.first);var to=Math.min(end,visible.to+cm.options.viewportMargin);if(display.showingFrom<from&&from-display.showingFrom<20)from=Math.max(doc.first,display.showingFrom);if(display.showingTo>to&&display.showingTo-to<20)to=Math.min(end,display.showingTo);if(sawCollapsedSpans){from=lineNo(visualLine(doc,getLine(doc,from)));while(to<end&&lineIsHidden(doc,getLine(doc,to)))++to;}
+var intact=[{from:Math.max(display.showingFrom,doc.first),to:Math.min(display.showingTo,end)}];if(intact[0].from>=intact[0].to)intact=[];else intact=computeIntact(intact,changes);if(sawCollapsedSpans)
+for(var i=0;i<intact.length;++i){var range=intact[i],merged;while(merged=collapsedSpanAtEnd(getLine(doc,range.to-1))){var newTo=merged.find().from.line;if(newTo>range.from)range.to=newTo;else{intact.splice(i--,1);break;}}}
+var intactLines=0;for(var i=0;i<intact.length;++i){var range=intact[i];if(range.from<from)range.from=from;if(range.to>to)range.to=to;if(range.from>=range.to)intact.splice(i--,1);else intactLines+=range.to-range.from;}
+if(!forced&&intactLines==to-from&&from==display.showingFrom&&to==display.showingTo){updateViewOffset(cm);return;}
+intact.sort(function(a,b){return a.from-b.from;});try{var focused=document.activeElement;}catch(e){}
+if(intactLines<(to-from)*.7)display.lineDiv.style.display="none";patchDisplay(cm,from,to,intact,positionsChangedFrom);display.lineDiv.style.display="";if(focused&&document.activeElement!=focused&&focused.offsetHeight)focused.focus();var different=from!=display.showingFrom||to!=display.showingTo||display.lastSizeC!=display.wrapper.clientHeight;if(different){display.lastSizeC=display.wrapper.clientHeight;startWorker(cm,400);}
+display.showingFrom=from;display.showingTo=to;display.gutters.style.height="";updateHeightsInViewport(cm);updateViewOffset(cm);return true;}
+function updateHeightsInViewport(cm){var display=cm.display;var prevBottom=display.lineDiv.offsetTop;for(var node=display.lineDiv.firstChild,height;node;node=node.nextSibling)if(node.lineObj){if(ie_lt8){var bot=node.offsetTop+node.offsetHeight;height=bot-prevBottom;prevBottom=bot;}else{var box=getRect(node);height=box.bottom-box.top;}
+var diff=node.lineObj.height-height;if(height<2)height=textHeight(display);if(diff>.001||diff<-.001){updateLineHeight(node.lineObj,height);var widgets=node.lineObj.widgets;if(widgets)for(var i=0;i<widgets.length;++i)
+widgets[i].height=widgets[i].node.offsetHeight;}}}
+function updateViewOffset(cm){var off=cm.display.viewOffset=heightAtLine(cm,getLine(cm.doc,cm.display.showingFrom));cm.display.mover.style.top=off+"px";}
+function computeIntact(intact,changes){for(var i=0,l=changes.length||0;i<l;++i){var change=changes[i],intact2=[],diff=change.diff||0;for(var j=0,l2=intact.length;j<l2;++j){var range=intact[j];if(change.to<=range.from&&change.diff){intact2.push({from:range.from+diff,to:range.to+diff});}else if(change.to<=range.from||change.from>=range.to){intact2.push(range);}else{if(change.from>range.from)
+intact2.push({from:range.from,to:change.from});if(change.to<range.to)
+intact2.push({from:change.to+diff,to:range.to+diff});}}
+intact=intact2;}
+return intact;}
+function getDimensions(cm){var d=cm.display,left={},width={};for(var n=d.gutters.firstChild,i=0;n;n=n.nextSibling,++i){left[cm.options.gutters[i]]=n.offsetLeft;width[cm.options.gutters[i]]=n.offsetWidth;}
+return{fixedPos:compensateForHScroll(d),gutterTotalWidth:d.gutters.offsetWidth,gutterLeft:left,gutterWidth:width,wrapperWidth:d.wrapper.clientWidth};}
+function patchDisplay(cm,from,to,intact,updateNumbersFrom){var dims=getDimensions(cm);var display=cm.display,lineNumbers=cm.options.lineNumbers;if(!intact.length&&(!webkit||!cm.display.currentWheelTarget))
+removeChildren(display.lineDiv);var container=display.lineDiv,cur=container.firstChild;function rm(node){var next=node.nextSibling;if(webkit&&mac&&cm.display.currentWheelTarget==node){node.style.display="none";node.lineObj=null;}else{node.parentNode.removeChild(node);}
+return next;}
+var nextIntact=intact.shift(),lineN=from;cm.doc.iter(from,to,function(line){if(nextIntact&&nextIntact.to==lineN)nextIntact=intact.shift();if(lineIsHidden(cm.doc,line)){if(line.height!=0)updateLineHeight(line,0);if(line.widgets&&cur&&cur.previousSibling)for(var i=0;i<line.widgets.length;++i){var w=line.widgets[i];if(w.showIfHidden){var prev=cur.previousSibling;if(/pre/i.test(prev.nodeName)){var wrap=elt("div",null,null,"position: relative");prev.parentNode.replaceChild(wrap,prev);wrap.appendChild(prev);prev=wrap;}
+var wnode=prev.appendChild(elt("div",[w.node],"CodeMirror-linewidget"));if(!w.handleMouseEvents)wnode.ignoreEvents=true;positionLineWidget(w,wnode,prev,dims);}}}else if(nextIntact&&nextIntact.from<=lineN&&nextIntact.to>lineN){while(cur.lineObj!=line)cur=rm(cur);if(lineNumbers&&updateNumbersFrom<=lineN&&cur.lineNumber)
+setTextContent(cur.lineNumber,lineNumberFor(cm.options,lineN));cur=cur.nextSibling;}else{if(line.widgets)for(var j=0,search=cur,reuse;search&&j<20;++j,search=search.nextSibling)
+if(search.lineObj==line&&/div/i.test(search.nodeName)){reuse=search;break;}
+var lineNode=buildLineElement(cm,line,lineN,dims,reuse);if(lineNode!=reuse){container.insertBefore(lineNode,cur);}else{while(cur!=reuse)cur=rm(cur);cur=cur.nextSibling;}
+lineNode.lineObj=line;}
+++lineN;});while(cur)cur=rm(cur);}
+function buildLineElement(cm,line,lineNo,dims,reuse){var built=buildLineContent(cm,line),lineElement=built.pre;var markers=line.gutterMarkers,display=cm.display,wrap;var bgClass=built.bgClass?built.bgClass+" "+(line.bgClass||""):line.bgClass;if(!cm.options.lineNumbers&&!markers&&!bgClass&&!line.wrapClass&&!line.widgets)
+return lineElement;if(reuse){reuse.alignable=null;var isOk=true,widgetsSeen=0,insertBefore=null;for(var n=reuse.firstChild,next;n;n=next){next=n.nextSibling;if(!/\bCodeMirror-linewidget\b/.test(n.className)){reuse.removeChild(n);}else{for(var i=0;i<line.widgets.length;++i){var widget=line.widgets[i];if(widget.node==n.firstChild){if(!widget.above&&!insertBefore)insertBefore=n;positionLineWidget(widget,n,reuse,dims);++widgetsSeen;break;}}
+if(i==line.widgets.length){isOk=false;break;}}}
+reuse.insertBefore(lineElement,insertBefore);if(isOk&&widgetsSeen==line.widgets.length){wrap=reuse;reuse.className=line.wrapClass||"";}}
+if(!wrap){wrap=elt("div",null,line.wrapClass,"position: relative");wrap.appendChild(lineElement);}
+if(bgClass)
+wrap.insertBefore(elt("div",null,bgClass+" CodeMirror-linebackground"),wrap.firstChild);if(cm.options.lineNumbers||markers){var gutterWrap=wrap.insertBefore(elt("div",null,"CodeMirror-gutter-wrapper","position: absolute; left: "+
+(cm.options.fixedGutter?dims.fixedPos:-dims.gutterTotalWidth)+"px"),lineElement);if(cm.options.fixedGutter)(wrap.alignable||(wrap.alignable=[])).push(gutterWrap);if(cm.options.lineNumbers&&(!markers||!markers["CodeMirror-linenumbers"]))
+wrap.lineNumber=gutterWrap.appendChild(elt("div",lineNumberFor(cm.options,lineNo),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+dims.gutterLeft["CodeMirror-linenumbers"]+"px; width: "
++display.lineNumInnerWidth+"px"));if(markers)
+for(var k=0;k<cm.options.gutters.length;++k){var id=cm.options.gutters[k],found=markers.hasOwnProperty(id)&&markers[id];if(found)
+gutterWrap.appendChild(elt("div",[found],"CodeMirror-gutter-elt","left: "+
+dims.gutterLeft[id]+"px; width: "+dims.gutterWidth[id]+"px"));}}
+if(ie_lt8)wrap.style.zIndex=2;if(line.widgets&&wrap!=reuse)for(var i=0,ws=line.widgets;i<ws.length;++i){var widget=ws[i],node=elt("div",[widget.node],"CodeMirror-linewidget");if(!widget.handleMouseEvents)node.ignoreEvents=true;positionLineWidget(widget,node,wrap,dims);if(widget.above)
+wrap.insertBefore(node,cm.options.lineNumbers&&line.height!=0?gutterWrap:lineElement);else
+wrap.appendChild(node);signalLater(widget,"redraw");}
+return wrap;}
+function positionLineWidget(widget,node,wrap,dims){if(widget.noHScroll){(wrap.alignable||(wrap.alignable=[])).push(node);var width=dims.wrapperWidth;node.style.left=dims.fixedPos+"px";if(!widget.coverGutter){width-=dims.gutterTotalWidth;node.style.paddingLeft=dims.gutterTotalWidth+"px";}
+node.style.width=width+"px";}
+if(widget.coverGutter){node.style.zIndex=5;node.style.position="relative";if(!widget.noHScroll)node.style.marginLeft=-dims.gutterTotalWidth+"px";}}
+function updateSelection(cm){var display=cm.display;var collapsed=posEq(cm.doc.sel.from,cm.doc.sel.to);if(collapsed||cm.options.showCursorWhenSelecting)
+updateSelectionCursor(cm);else
+display.cursor.style.display=display.otherCursor.style.display="none";if(!collapsed)
+updateSelectionRange(cm);else
+display.selectionDiv.style.display="none";if(cm.options.moveInputWithCursor){var headPos=cursorCoords(cm,cm.doc.sel.head,"div");var wrapOff=getRect(display.wrapper),lineOff=getRect(display.lineDiv);display.inputDiv.style.top=Math.max(0,Math.min(display.wrapper.clientHeight-10,headPos.top+lineOff.top-wrapOff.top))+"px";display.inputDiv.style.left=Math.max(0,Math.min(display.wrapper.clientWidth-10,headPos.left+lineOff.left-wrapOff.left))+"px";}}
+function updateSelectionCursor(cm){var display=cm.display,pos=cursorCoords(cm,cm.doc.sel.head,"div");display.cursor.style.left=pos.left+"px";display.cursor.style.top=pos.top+"px";display.cursor.style.height=Math.max(0,pos.bottom-pos.top)*cm.options.cursorHeight+"px";display.cursor.style.display="";if(pos.other){display.otherCursor.style.display="";display.otherCursor.style.left=pos.other.left+"px";display.otherCursor.style.top=pos.other.top+"px";display.otherCursor.style.height=(pos.other.bottom-pos.other.top)*.85+"px";}else{display.otherCursor.style.display="none";}}
+function updateSelectionRange(cm){var display=cm.display,doc=cm.doc,sel=cm.doc.sel;var fragment=document.createDocumentFragment();var clientWidth=display.lineSpace.offsetWidth,pl=paddingLeft(cm.display);function add(left,top,width,bottom){if(top<0)top=0;fragment.appendChild(elt("div",null,"CodeMirror-selected","position: absolute; left: "+left+"px; top: "+top+"px; width: "+(width==null?clientWidth-left:width)+"px; height: "+(bottom-top)+"px"));}
+function drawForLine(line,fromArg,toArg){var lineObj=getLine(doc,line);var lineLen=lineObj.text.length;var start,end;function coords(ch,bias){return charCoords(cm,Pos(line,ch),"div",lineObj,bias);}
+iterateBidiSections(getOrder(lineObj),fromArg||0,toArg==null?lineLen:toArg,function(from,to,dir){var leftPos=coords(from,"left"),rightPos,left,right;if(from==to){rightPos=leftPos;left=right=leftPos.left;}else{rightPos=coords(to-1,"right");if(dir=="rtl"){var tmp=leftPos;leftPos=rightPos;rightPos=tmp;}
+left=leftPos.left;right=rightPos.right;}
+if(fromArg==null&&from==0)left=pl;if(rightPos.top-leftPos.top>3){add(left,leftPos.top,null,leftPos.bottom);left=pl;if(leftPos.bottom<rightPos.top)add(left,leftPos.bottom,null,rightPos.top);}
+if(toArg==null&&to==lineLen)right=clientWidth;if(!start||leftPos.top<start.top||leftPos.top==start.top&&leftPos.left<start.left)
+start=leftPos;if(!end||rightPos.bottom>end.bottom||rightPos.bottom==end.bottom&&rightPos.right>end.right)
+end=rightPos;if(left<pl+1)left=pl;add(left,rightPos.top,right-left,rightPos.bottom);});return{start:start,end:end};}
+if(sel.from.line==sel.to.line){drawForLine(sel.from.line,sel.from.ch,sel.to.ch);}else{var fromLine=getLine(doc,sel.from.line),toLine=getLine(doc,sel.to.line);var singleVLine=visualLine(doc,fromLine)==visualLine(doc,toLine);var leftEnd=drawForLine(sel.from.line,sel.from.ch,singleVLine?fromLine.text.length:null).end;var rightStart=drawForLine(sel.to.line,singleVLine?0:null,sel.to.ch).start;if(singleVLine){if(leftEnd.top<rightStart.top-2){add(leftEnd.right,leftEnd.top,null,leftEnd.bottom);add(pl,rightStart.top,rightStart.left,rightStart.bottom);}else{add(leftEnd.right,leftEnd.top,rightStart.left-leftEnd.right,leftEnd.bottom);}}
+if(leftEnd.bottom<rightStart.top)
+add(pl,leftEnd.bottom,null,rightStart.top);}
+removeChildrenAndAdd(display.selectionDiv,fragment);display.selectionDiv.style.display="";}
+function restartBlink(cm){if(!cm.state.focused)return;var display=cm.display;clearInterval(display.blinker);var on=true;display.cursor.style.visibility=display.otherCursor.style.visibility="";if(cm.options.cursorBlinkRate>0)
+display.blinker=setInterval(function(){display.cursor.style.visibility=display.otherCursor.style.visibility=(on=!on)?"":"hidden";},cm.options.cursorBlinkRate);}
+function startWorker(cm,time){if(cm.doc.mode.startState&&cm.doc.frontier<cm.display.showingTo)
+cm.state.highlight.set(time,bind(highlightWorker,cm));}
+function highlightWorker(cm){var doc=cm.doc;if(doc.frontier<doc.first)doc.frontier=doc.first;if(doc.frontier>=cm.display.showingTo)return;var end=+new Date+cm.options.workTime;var state=copyState(doc.mode,getStateBefore(cm,doc.frontier));var changed=[],prevChange;doc.iter(doc.frontier,Math.min(doc.first+doc.size,cm.display.showingTo+500),function(line){if(doc.frontier>=cm.display.showingFrom){var oldStyles=line.styles;line.styles=highlightLine(cm,line,state,true);var ischange=!oldStyles||oldStyles.length!=line.styles.length;for(var i=0;!ischange&&i<oldStyles.length;++i)ischange=oldStyles[i]!=line.styles[i];if(ischange){if(prevChange&&prevChange.end==doc.frontier)prevChange.end++;else changed.push(prevChange={start:doc.frontier,end:doc.frontier+1});}
+line.stateAfter=copyState(doc.mode,state);}else{processLine(cm,line.text,state);line.stateAfter=doc.frontier%5==0?copyState(doc.mode,state):null;}
+++doc.frontier;if(+new Date>end){startWorker(cm,cm.options.workDelay);return true;}});if(changed.length)
+operation(cm,function(){for(var i=0;i<changed.length;++i)
+regChange(this,changed[i].start,changed[i].end);})();}
+function findStartLine(cm,n,precise){var minindent,minline,doc=cm.doc;var lim=precise?-1:n-(cm.doc.mode.innerMode?1000:100);for(var search=n;search>lim;--search){if(search<=doc.first)return doc.first;var line=getLine(doc,search-1);if(line.stateAfter&&(!precise||search<=doc.frontier))return search;var indented=countColumn(line.text,null,cm.options.tabSize);if(minline==null||minindent>indented){minline=search-1;minindent=indented;}}
+return minline;}
+function getStateBefore(cm,n,precise){var doc=cm.doc,display=cm.display;if(!doc.mode.startState)return true;var pos=findStartLine(cm,n,precise),state=pos>doc.first&&getLine(doc,pos-1).stateAfter;if(!state)state=startState(doc.mode);else state=copyState(doc.mode,state);doc.iter(pos,n,function(line){processLine(cm,line.text,state);var save=pos==n-1||pos%5==0||pos>=display.showingFrom&&pos<display.showingTo;line.stateAfter=save?copyState(doc.mode,state):null;++pos;});if(precise)doc.frontier=pos;return state;}
+function paddingTop(display){return display.lineSpace.offsetTop;}
+function paddingVert(display){return display.mover.offsetHeight-display.lineSpace.offsetHeight;}
+function paddingLeft(display){var e=removeChildrenAndAdd(display.measure,elt("pre",null,null,"text-align: left")).appendChild(elt("span","x"));return e.offsetLeft;}
+function measureChar(cm,line,ch,data,bias){var dir=-1;data=data||measureLine(cm,line);if(data.crude){var left=data.left+ch*data.width;return{left:left,right:left+data.width,top:data.top,bottom:data.bottom};}
+for(var pos=ch;;pos+=dir){var r=data[pos];if(r)break;if(dir<0&&pos==0)dir=1;}
+bias=pos>ch?"left":pos<ch?"right":bias;if(bias=="left"&&r.leftSide)r=r.leftSide;else if(bias=="right"&&r.rightSide)r=r.rightSide;return{left:pos<ch?r.right:r.left,right:pos>ch?r.left:r.right,top:r.top,bottom:r.bottom};}
+function findCachedMeasurement(cm,line){var cache=cm.display.measureLineCache;for(var i=0;i<cache.length;++i){var memo=cache[i];if(memo.text==line.text&&memo.markedSpans==line.markedSpans&&cm.display.scroller.clientWidth==memo.width&&memo.classes==line.textClass+"|"+line.wrapClass)
+return memo;}}
+function clearCachedMeasurement(cm,line){var exists=findCachedMeasurement(cm,line);if(exists)exists.text=exists.measure=exists.markedSpans=null;}
+function measureLine(cm,line){var cached=findCachedMeasurement(cm,line);if(cached)return cached.measure;var measure=measureLineInner(cm,line);var cache=cm.display.measureLineCache;var memo={text:line.text,width:cm.display.scroller.clientWidth,markedSpans:line.markedSpans,measure:measure,classes:line.textClass+"|"+line.wrapClass};if(cache.length==16)cache[++cm.display.measureLineCachePos%16]=memo;else cache.push(memo);return measure;}
+function measureLineInner(cm,line){if(!cm.options.lineWrapping&&line.text.length>=cm.options.crudeMeasuringFrom)
+return crudelyMeasureLine(cm,line);var display=cm.display,measure=emptyArray(line.text.length);var pre=buildLineContent(cm,line,measure,true).pre;if(old_ie&&!ie_lt8&&!cm.options.lineWrapping&&pre.childNodes.length>100){var fragment=document.createDocumentFragment();var chunk=10,n=pre.childNodes.length;for(var i=0,chunks=Math.ceil(n/chunk);i<chunks;++i){var wrap=elt("div",null,null,"display: inline-block");for(var j=0;j<chunk&&n;++j){wrap.appendChild(pre.firstChild);--n;}
+fragment.appendChild(wrap);}
+pre.appendChild(fragment);}
+removeChildrenAndAdd(display.measure,pre);var outer=getRect(display.lineDiv);var vranges=[],data=emptyArray(line.text.length),maxBot=pre.offsetHeight;if(ie_lt9&&display.measure.first!=pre)
+removeChildrenAndAdd(display.measure,pre);function measureRect(rect){var top=rect.top-outer.top,bot=rect.bottom-outer.top;if(bot>maxBot)bot=maxBot;if(top<0)top=0;for(var i=vranges.length-2;i>=0;i-=2){var rtop=vranges[i],rbot=vranges[i+1];if(rtop>bot||rbot<top)continue;if(rtop<=top&&rbot>=bot||top<=rtop&&bot>=rbot||Math.min(bot,rbot)-Math.max(top,rtop)>=(bot-top)>>1){vranges[i]=Math.min(top,rtop);vranges[i+1]=Math.max(bot,rbot);break;}}
+if(i<0){i=vranges.length;vranges.push(top,bot);}
+return{left:rect.left-outer.left,right:rect.right-outer.left,top:i,bottom:null};}
+function finishRect(rect){rect.bottom=vranges[rect.top+1];rect.top=vranges[rect.top];}
+for(var i=0,cur;i<measure.length;++i)if(cur=measure[i]){var node=cur,rect=null;if(/\bCodeMirror-widget\b/.test(cur.className)&&cur.getClientRects){if(cur.firstChild.nodeType==1)node=cur.firstChild;var rects=node.getClientRects();if(rects.length>1){rect=data[i]=measureRect(rects[0]);rect.rightSide=measureRect(rects[rects.length-1]);}}
+if(!rect)rect=data[i]=measureRect(getRect(node));if(cur.measureRight)rect.right=getRect(cur.measureRight).left-outer.left;if(cur.leftSide)rect.leftSide=measureRect(getRect(cur.leftSide));}
+removeChildren(cm.display.measure);for(var i=0,cur;i<data.length;++i)if(cur=data[i]){finishRect(cur);if(cur.leftSide)finishRect(cur.leftSide);if(cur.rightSide)finishRect(cur.rightSide);}
+return data;}
+function crudelyMeasureLine(cm,line){var copy=new Line(line.text.slice(0,100),null);if(line.textClass)copy.textClass=line.textClass;var measure=measureLineInner(cm,copy);var left=measureChar(cm,copy,0,measure,"left");var right=measureChar(cm,copy,99,measure,"right");return{crude:true,top:left.top,left:left.left,bottom:left.bottom,width:(right.right-left.left)/100};}
+function measureLineWidth(cm,line){var hasBadSpan=false;if(line.markedSpans)for(var i=0;i<line.markedSpans;++i){var sp=line.markedSpans[i];if(sp.collapsed&&(sp.to==null||sp.to==line.text.length))hasBadSpan=true;}
+var cached=!hasBadSpan&&findCachedMeasurement(cm,line);if(cached||line.text.length>=cm.options.crudeMeasuringFrom)
+return measureChar(cm,line,line.text.length,cached&&cached.measure,"right").right;var pre=buildLineContent(cm,line,null,true).pre;var end=pre.appendChild(zeroWidthElement(cm.display.measure));removeChildrenAndAdd(cm.display.measure,pre);return getRect(end).right-getRect(cm.display.lineDiv).left;}
+function clearCaches(cm){cm.display.measureLineCache.length=cm.display.measureLineCachePos=0;cm.display.cachedCharWidth=cm.display.cachedTextHeight=null;if(!cm.options.lineWrapping)cm.display.maxLineChanged=true;cm.display.lineNumChars=null;}
+function pageScrollX(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft;}
+function pageScrollY(){return window.pageYOffset||(document.documentElement||document.body).scrollTop;}
+function intoCoordSystem(cm,lineObj,rect,context){if(lineObj.widgets)for(var i=0;i<lineObj.widgets.length;++i)if(lineObj.widgets[i].above){var size=widgetHeight(lineObj.widgets[i]);rect.top+=size;rect.bottom+=size;}
+if(context=="line")return rect;if(!context)context="local";var yOff=heightAtLine(cm,lineObj);if(context=="local")yOff+=paddingTop(cm.display);else yOff-=cm.display.viewOffset;if(context=="page"||context=="window"){var lOff=getRect(cm.display.lineSpace);yOff+=lOff.top+(context=="window"?0:pageScrollY());var xOff=lOff.left+(context=="window"?0:pageScrollX());rect.left+=xOff;rect.right+=xOff;}
+rect.top+=yOff;rect.bottom+=yOff;return rect;}
+function fromCoordSystem(cm,coords,context){if(context=="div")return coords;var left=coords.left,top=coords.top;if(context=="page"){left-=pageScrollX();top-=pageScrollY();}else if(context=="local"||!context){var localBox=getRect(cm.display.sizer);left+=localBox.left;top+=localBox.top;}
+var lineSpaceBox=getRect(cm.display.lineSpace);return{left:left-lineSpaceBox.left,top:top-lineSpaceBox.top};}
+function charCoords(cm,pos,context,lineObj,bias){if(!lineObj)lineObj=getLine(cm.doc,pos.line);return intoCoordSystem(cm,lineObj,measureChar(cm,lineObj,pos.ch,null,bias),context);}
+function cursorCoords(cm,pos,context,lineObj,measurement){lineObj=lineObj||getLine(cm.doc,pos.line);if(!measurement)measurement=measureLine(cm,lineObj);function get(ch,right){var m=measureChar(cm,lineObj,ch,measurement,right?"right":"left");if(right)m.left=m.right;else m.right=m.left;return intoCoordSystem(cm,lineObj,m,context);}
+function getBidi(ch,partPos){var part=order[partPos],right=part.level%2;if(ch==bidiLeft(part)&&partPos&&part.level<order[partPos-1].level){part=order[--partPos];ch=bidiRight(part)-(part.level%2?0:1);right=true;}else if(ch==bidiRight(part)&&partPos<order.length-1&&part.level<order[partPos+1].level){part=order[++partPos];ch=bidiLeft(part)-part.level%2;right=false;}
+if(right&&ch==part.to&&ch>part.from)return get(ch-1);return get(ch,right);}
+var order=getOrder(lineObj),ch=pos.ch;if(!order)return get(ch);var partPos=getBidiPartAt(order,ch);var val=getBidi(ch,partPos);if(bidiOther!=null)val.other=getBidi(ch,bidiOther);return val;}
+function PosWithInfo(line,ch,outside,xRel){var pos=new Pos(line,ch);pos.xRel=xRel;if(outside)pos.outside=true;return pos;}
+function coordsChar(cm,x,y){var doc=cm.doc;y+=cm.display.viewOffset;if(y<0)return PosWithInfo(doc.first,0,true,-1);var lineNo=lineAtHeight(doc,y),last=doc.first+doc.size-1;if(lineNo>last)
+return PosWithInfo(doc.first+doc.size-1,getLine(doc,last).text.length,true,1);if(x<0)x=0;for(;;){var lineObj=getLine(doc,lineNo);var found=coordsCharInner(cm,lineObj,lineNo,x,y);var merged=collapsedSpanAtEnd(lineObj);var mergedPos=merged&&merged.find();if(merged&&(found.ch>mergedPos.from.ch||found.ch==mergedPos.from.ch&&found.xRel>0))
+lineNo=mergedPos.to.line;else
+return found;}}
+function coordsCharInner(cm,lineObj,lineNo,x,y){var innerOff=y-heightAtLine(cm,lineObj);var wrongLine=false,adjust=2*cm.display.wrapper.clientWidth;var measurement=measureLine(cm,lineObj);function getX(ch){var sp=cursorCoords(cm,Pos(lineNo,ch),"line",lineObj,measurement);wrongLine=true;if(innerOff>sp.bottom)return sp.left-adjust;else if(innerOff<sp.top)return sp.left+adjust;else wrongLine=false;return sp.left;}
+var bidi=getOrder(lineObj),dist=lineObj.text.length;var from=lineLeft(lineObj),to=lineRight(lineObj);var fromX=getX(from),fromOutside=wrongLine,toX=getX(to),toOutside=wrongLine;if(x>toX)return PosWithInfo(lineNo,to,toOutside,1);for(;;){if(bidi?to==from||to==moveVisually(lineObj,from,1):to-from<=1){var ch=x<fromX||x-fromX<=toX-x?from:to;var xDiff=x-(ch==from?fromX:toX);while(isExtendingChar(lineObj.text.charAt(ch)))++ch;var pos=PosWithInfo(lineNo,ch,ch==from?fromOutside:toOutside,xDiff<0?-1:xDiff?1:0);return pos;}
+var step=Math.ceil(dist/2),middle=from+step;if(bidi){middle=from;for(var i=0;i<step;++i)middle=moveVisually(lineObj,middle,1);}
+var middleX=getX(middle);if(middleX>x){to=middle;toX=middleX;if(toOutside=wrongLine)toX+=1000;dist=step;}
+else{from=middle;fromX=middleX;fromOutside=wrongLine;dist-=step;}}}
+var measureText;function textHeight(display){if(display.cachedTextHeight!=null)return display.cachedTextHeight;if(measureText==null){measureText=elt("pre");for(var i=0;i<49;++i){measureText.appendChild(document.createTextNode("x"));measureText.appendChild(elt("br"));}
+measureText.appendChild(document.createTextNode("x"));}
+removeChildrenAndAdd(display.measure,measureText);var height=measureText.offsetHeight/50;if(height>3)display.cachedTextHeight=height;removeChildren(display.measure);return height||1;}
+function charWidth(display){if(display.cachedCharWidth!=null)return display.cachedCharWidth;var anchor=elt("span","x");var pre=elt("pre",[anchor]);removeChildrenAndAdd(display.measure,pre);var width=anchor.offsetWidth;if(width>2)display.cachedCharWidth=width;return width||10;}
+var nextOpId=0;function startOperation(cm){cm.curOp={changes:[],forceUpdate:false,updateInput:null,userSelChange:null,textChanged:null,selectionChanged:false,cursorActivity:false,updateMaxLine:false,updateScrollPos:false,id:++nextOpId};if(!delayedCallbackDepth++)delayedCallbacks=[];}
+function endOperation(cm){var op=cm.curOp,doc=cm.doc,display=cm.display;cm.curOp=null;if(op.updateMaxLine)computeMaxLength(cm);if(display.maxLineChanged&&!cm.options.lineWrapping&&display.maxLine){var width=measureLineWidth(cm,display.maxLine);display.sizer.style.minWidth=Math.max(0,width+3+scrollerCutOff)+"px";display.maxLineChanged=false;var maxScrollLeft=Math.max(0,display.sizer.offsetLeft+display.sizer.offsetWidth-display.scroller.clientWidth);if(maxScrollLeft<doc.scrollLeft&&!op.updateScrollPos)
+setScrollLeft(cm,Math.min(display.scroller.scrollLeft,maxScrollLeft),true);}
+var newScrollPos,updated;if(op.updateScrollPos){newScrollPos=op.updateScrollPos;}else if(op.selectionChanged&&display.scroller.clientHeight){var coords=cursorCoords(cm,doc.sel.head);newScrollPos=calculateScrollPos(cm,coords.left,coords.top,coords.left,coords.bottom);}
+if(op.changes.length||op.forceUpdate||newScrollPos&&newScrollPos.scrollTop!=null){updated=updateDisplay(cm,op.changes,newScrollPos&&newScrollPos.scrollTop,op.forceUpdate);if(cm.display.scroller.offsetHeight)cm.doc.scrollTop=cm.display.scroller.scrollTop;}
+if(!updated&&op.selectionChanged)updateSelection(cm);if(op.updateScrollPos){var top=Math.max(0,Math.min(display.scroller.scrollHeight-display.scroller.clientHeight,newScrollPos.scrollTop));var left=Math.max(0,Math.min(display.scroller.scrollWidth-display.scroller.clientWidth,newScrollPos.scrollLeft));display.scroller.scrollTop=display.scrollbarV.scrollTop=doc.scrollTop=top;display.scroller.scrollLeft=display.scrollbarH.scrollLeft=doc.scrollLeft=left;alignHorizontally(cm);if(op.scrollToPos)
+scrollPosIntoView(cm,clipPos(cm.doc,op.scrollToPos.from),clipPos(cm.doc,op.scrollToPos.to),op.scrollToPos.margin);}else if(newScrollPos){scrollCursorIntoView(cm);}
+if(op.selectionChanged)restartBlink(cm);if(cm.state.focused&&op.updateInput)
+resetInput(cm,op.userSelChange);var hidden=op.maybeHiddenMarkers,unhidden=op.maybeUnhiddenMarkers;if(hidden)for(var i=0;i<hidden.length;++i)
+if(!hidden[i].lines.length)signal(hidden[i],"hide");if(unhidden)for(var i=0;i<unhidden.length;++i)
+if(unhidden[i].lines.length)signal(unhidden[i],"unhide");var delayed;if(!--delayedCallbackDepth){delayed=delayedCallbacks;delayedCallbacks=null;}
+if(op.textChanged)
+signal(cm,"change",cm,op.textChanged);if(op.cursorActivity)signal(cm,"cursorActivity",cm);if(delayed)for(var i=0;i<delayed.length;++i)delayed[i]();}
+function operation(cm1,f){return function(){var cm=cm1||this,withOp=!cm.curOp;if(withOp)startOperation(cm);try{var result=f.apply(cm,arguments);}
+finally{if(withOp)endOperation(cm);}
+return result;};}
+function docOperation(f){return function(){var withOp=this.cm&&!this.cm.curOp,result;if(withOp)startOperation(this.cm);try{result=f.apply(this,arguments);}
+finally{if(withOp)endOperation(this.cm);}
+return result;};}
+function runInOp(cm,f){var withOp=!cm.curOp,result;if(withOp)startOperation(cm);try{result=f();}
+finally{if(withOp)endOperation(cm);}
+return result;}
+function regChange(cm,from,to,lendiff){if(from==null)from=cm.doc.first;if(to==null)to=cm.doc.first+cm.doc.size;cm.curOp.changes.push({from:from,to:to,diff:lendiff});}
+function slowPoll(cm){if(cm.display.pollingFast)return;cm.display.poll.set(cm.options.pollInterval,function(){readInput(cm);if(cm.state.focused)slowPoll(cm);});}
+function fastPoll(cm){var missed=false;cm.display.pollingFast=true;function p(){var changed=readInput(cm);if(!changed&&!missed){missed=true;cm.display.poll.set(60,p);}
+else{cm.display.pollingFast=false;slowPoll(cm);}}
+cm.display.poll.set(20,p);}
+function readInput(cm){var input=cm.display.input,prevInput=cm.display.prevInput,doc=cm.doc,sel=doc.sel;if(!cm.state.focused||hasSelection(input)||isReadOnly(cm)||cm.options.disableInput)return false;if(cm.state.pasteIncoming&&cm.state.fakedLastChar){input.value=input.value.substring(0,input.value.length-1);cm.state.fakedLastChar=false;}
+var text=input.value;if(text==prevInput&&posEq(sel.from,sel.to))return false;if(ie&&!ie_lt9&&cm.display.inputHasSelection===text){resetInput(cm,true);return false;}
+var withOp=!cm.curOp;if(withOp)startOperation(cm);sel.shift=false;var same=0,l=Math.min(prevInput.length,text.length);while(same<l&&prevInput.charCodeAt(same)==text.charCodeAt(same))++same;var from=sel.from,to=sel.to;var inserted=text.slice(same);if(same<prevInput.length)
+from=Pos(from.line,from.ch-(prevInput.length-same));else if(cm.state.overwrite&&posEq(from,to)&&!cm.state.pasteIncoming)
+to=Pos(to.line,Math.min(getLine(doc,to.line).text.length,to.ch+inserted.length));var updateInput=cm.curOp.updateInput;var changeEvent={from:from,to:to,text:splitLines(inserted),origin:cm.state.pasteIncoming?"paste":cm.state.cutIncoming?"cut":"+input"};makeChange(cm.doc,changeEvent,"end");cm.curOp.updateInput=updateInput;signalLater(cm,"inputRead",cm,changeEvent);if(inserted&&!cm.state.pasteIncoming&&cm.options.electricChars&&cm.options.smartIndent&&sel.head.ch<100){var electric=cm.getModeAt(sel.head).electricChars;if(electric)for(var i=0;i<electric.length;i++)
+if(inserted.indexOf(electric.charAt(i))>-1){indentLine(cm,sel.head.line,"smart");break;}}
+if(text.length>1000||text.indexOf("\n")>-1)input.value=cm.display.prevInput="";else cm.display.prevInput=text;if(withOp)endOperation(cm);cm.state.pasteIncoming=cm.state.cutIncoming=false;return true;}
+function resetInput(cm,user){var minimal,selected,doc=cm.doc;if(!posEq(doc.sel.from,doc.sel.to)){cm.display.prevInput="";minimal=hasCopyEvent&&(doc.sel.to.line-doc.sel.from.line>100||(selected=cm.getSelection()).length>1000);var content=minimal?"-":selected||cm.getSelection();cm.display.input.value=content;if(cm.state.focused)selectInput(cm.display.input);if(ie&&!ie_lt9)cm.display.inputHasSelection=content;}else if(user){cm.display.prevInput=cm.display.input.value="";if(ie&&!ie_lt9)cm.display.inputHasSelection=null;}
+cm.display.inaccurateSelection=minimal;}
+function focusInput(cm){if(cm.options.readOnly!="nocursor"&&(!mobile||document.activeElement!=cm.display.input))
+cm.display.input.focus();}
+function isReadOnly(cm){return cm.options.readOnly||cm.doc.cantEdit;}
+function registerEventHandlers(cm){var d=cm.display;on(d.scroller,"mousedown",operation(cm,onMouseDown));if(old_ie)
+on(d.scroller,"dblclick",operation(cm,function(e){if(signalDOMEvent(cm,e))return;var pos=posFromMouse(cm,e);if(!pos||clickInGutter(cm,e)||eventInWidget(cm.display,e))return;e_preventDefault(e);var word=findWordAt(getLine(cm.doc,pos.line).text,pos);extendSelection(cm.doc,word.from,word.to);}));else
+on(d.scroller,"dblclick",function(e){signalDOMEvent(cm,e)||e_preventDefault(e);});on(d.lineSpace,"selectstart",function(e){if(!eventInWidget(d,e))e_preventDefault(e);});if(!captureMiddleClick)on(d.scroller,"contextmenu",function(e){onContextMenu(cm,e);});on(d.scroller,"scroll",function(){if(d.scroller.clientHeight){setScrollTop(cm,d.scroller.scrollTop);setScrollLeft(cm,d.scroller.scrollLeft,true);signal(cm,"scroll",cm);}});on(d.scrollbarV,"scroll",function(){if(d.scroller.clientHeight)setScrollTop(cm,d.scrollbarV.scrollTop);});on(d.scrollbarH,"scroll",function(){if(d.scroller.clientHeight)setScrollLeft(cm,d.scrollbarH.scrollLeft);});on(d.scroller,"mousewheel",function(e){onScrollWheel(cm,e);});on(d.scroller,"DOMMouseScroll",function(e){onScrollWheel(cm,e);});function reFocus(){if(cm.state.focused)setTimeout(bind(focusInput,cm),0);}
+on(d.scrollbarH,"mousedown",reFocus);on(d.scrollbarV,"mousedown",reFocus);on(d.wrapper,"scroll",function(){d.wrapper.scrollTop=d.wrapper.scrollLeft=0;});var resizeTimer;function onResize(){if(resizeTimer==null)resizeTimer=setTimeout(function(){resizeTimer=null;d.cachedCharWidth=d.cachedTextHeight=knownScrollbarWidth=null;clearCaches(cm);runInOp(cm,bind(regChange,cm));},100);}
+on(window,"resize",onResize);function unregister(){for(var p=d.wrapper.parentNode;p&&p!=document.body;p=p.parentNode){}
+if(p)setTimeout(unregister,5000);else off(window,"resize",onResize);}
+setTimeout(unregister,5000);on(d.input,"keyup",operation(cm,onKeyUp));on(d.input,"input",function(){if(ie&&!ie_lt9&&cm.display.inputHasSelection)cm.display.inputHasSelection=null;fastPoll(cm);});on(d.input,"keydown",operation(cm,onKeyDown));on(d.input,"keypress",operation(cm,onKeyPress));on(d.input,"focus",bind(onFocus,cm));on(d.input,"blur",bind(onBlur,cm));function drag_(e){if(signalDOMEvent(cm,e)||cm.options.onDragEvent&&cm.options.onDragEvent(cm,addStop(e)))return;e_stop(e);}
+if(cm.options.dragDrop){on(d.scroller,"dragstart",function(e){onDragStart(cm,e);});on(d.scroller,"dragenter",drag_);on(d.scroller,"dragover",drag_);on(d.scroller,"drop",operation(cm,onDrop));}
+on(d.scroller,"paste",function(e){if(eventInWidget(d,e))return;focusInput(cm);fastPoll(cm);});on(d.input,"paste",function(){if(webkit&&!cm.state.fakedLastChar&&!(new Date-cm.state.lastMiddleDown<200)){var start=d.input.selectionStart,end=d.input.selectionEnd;d.input.value+="$";d.input.selectionStart=start;d.input.selectionEnd=end;cm.state.fakedLastChar=true;}
+cm.state.pasteIncoming=true;fastPoll(cm);});function prepareCopy(e){if(d.inaccurateSelection){d.prevInput="";d.inaccurateSelection=false;d.input.value=cm.getSelection();selectInput(d.input);}
+if(e.type=="cut")cm.state.cutIncoming=true;}
+on(d.input,"cut",prepareCopy);on(d.input,"copy",prepareCopy);if(khtml)on(d.sizer,"mouseup",function(){if(document.activeElement==d.input)d.input.blur();focusInput(cm);});}
+function eventInWidget(display,e){for(var n=e_target(e);n!=display.wrapper;n=n.parentNode){if(!n||n.ignoreEvents||n.parentNode==display.sizer&&n!=display.mover)return true;}}
+function posFromMouse(cm,e,liberal){var display=cm.display;if(!liberal){var target=e_target(e);if(target==display.scrollbarH||target==display.scrollbarH.firstChild||target==display.scrollbarV||target==display.scrollbarV.firstChild||target==display.scrollbarFiller||target==display.gutterFiller)return null;}
+var x,y,space=getRect(display.lineSpace);try{x=e.clientX;y=e.clientY;}catch(e){return null;}
+return coordsChar(cm,x-space.left,y-space.top);}
+var lastClick,lastDoubleClick;function onMouseDown(e){if(signalDOMEvent(this,e))return;var cm=this,display=cm.display,doc=cm.doc,sel=doc.sel;sel.shift=e.shiftKey;if(eventInWidget(display,e)){if(!webkit){display.scroller.draggable=false;setTimeout(function(){display.scroller.draggable=true;},100);}
+return;}
+if(clickInGutter(cm,e))return;var start=posFromMouse(cm,e);switch(e_button(e)){case 3:if(captureMiddleClick)onContextMenu.call(cm,cm,e);return;case 2:if(webkit)cm.state.lastMiddleDown=+new Date;if(start)extendSelection(cm.doc,start);setTimeout(bind(focusInput,cm),20);e_preventDefault(e);return;}
+if(!start){if(e_target(e)==display.scroller)e_preventDefault(e);return;}
+if(!cm.state.focused)onFocus(cm);var now=+new Date,type="single";if(lastDoubleClick&&lastDoubleClick.time>now-400&&posEq(lastDoubleClick.pos,start)){type="triple";e_preventDefault(e);setTimeout(bind(focusInput,cm),20);selectLine(cm,start.line);}else if(lastClick&&lastClick.time>now-400&&posEq(lastClick.pos,start)){type="double";lastDoubleClick={time:now,pos:start};e_preventDefault(e);var word=findWordAt(getLine(doc,start.line).text,start);extendSelection(cm.doc,word.from,word.to);}else{lastClick={time:now,pos:start};}
+var last=start;if(cm.options.dragDrop&&dragAndDrop&&!isReadOnly(cm)&&!posEq(sel.from,sel.to)&&!posLess(start,sel.from)&&!posLess(sel.to,start)&&type=="single"){var dragEnd=operation(cm,function(e2){if(webkit)display.scroller.draggable=false;cm.state.draggingText=false;off(document,"mouseup",dragEnd);off(display.scroller,"drop",dragEnd);if(Math.abs(e.clientX-e2.clientX)+Math.abs(e.clientY-e2.clientY)<10){e_preventDefault(e2);extendSelection(cm.doc,start);focusInput(cm);if(old_ie&&!ie_lt9)
+setTimeout(function(){document.body.focus();focusInput(cm);},20);}});if(webkit)display.scroller.draggable=true;cm.state.draggingText=dragEnd;if(display.scroller.dragDrop)display.scroller.dragDrop();on(document,"mouseup",dragEnd);on(display.scroller,"drop",dragEnd);return;}
+e_preventDefault(e);if(type=="single")extendSelection(cm.doc,clipPos(doc,start));var startstart=sel.from,startend=sel.to,lastPos=start;function doSelect(cur){if(posEq(lastPos,cur))return;lastPos=cur;if(type=="single"){extendSelection(cm.doc,clipPos(doc,start),cur);return;}
+startstart=clipPos(doc,startstart);startend=clipPos(doc,startend);if(type=="double"){var word=findWordAt(getLine(doc,cur.line).text,cur);if(posLess(cur,startstart))extendSelection(cm.doc,word.from,startend);else extendSelection(cm.doc,startstart,word.to);}else if(type=="triple"){if(posLess(cur,startstart))extendSelection(cm.doc,startend,clipPos(doc,Pos(cur.line,0)));else extendSelection(cm.doc,startstart,clipPos(doc,Pos(cur.line+1,0)));}}
+var editorSize=getRect(display.wrapper);var counter=0;function extend(e){var curCount=++counter;var cur=posFromMouse(cm,e,true);if(!cur)return;if(!posEq(cur,last)){if(!cm.state.focused)onFocus(cm);last=cur;doSelect(cur);var visible=visibleLines(display,doc);if(cur.line>=visible.to||cur.line<visible.from)
+setTimeout(operation(cm,function(){if(counter==curCount)extend(e);}),150);}else{var outside=e.clientY<editorSize.top?-20:e.clientY>editorSize.bottom?20:0;if(outside)setTimeout(operation(cm,function(){if(counter!=curCount)return;display.scroller.scrollTop+=outside;extend(e);}),50);}}
+function done(e){counter=Infinity;e_preventDefault(e);focusInput(cm);off(document,"mousemove",move);off(document,"mouseup",up);}
+var move=operation(cm,function(e){if(!old_ie&&!e_button(e))done(e);else extend(e);});var up=operation(cm,done);on(document,"mousemove",move);on(document,"mouseup",up);}
+function gutterEvent(cm,e,type,prevent,signalfn){try{var mX=e.clientX,mY=e.clientY;}
+catch(e){return false;}
+if(mX>=Math.floor(getRect(cm.display.gutters).right))return false;if(prevent)e_preventDefault(e);var display=cm.display;var lineBox=getRect(display.lineDiv);if(mY>lineBox.bottom||!hasHandler(cm,type))return e_defaultPrevented(e);mY-=lineBox.top-display.viewOffset;for(var i=0;i<cm.options.gutters.length;++i){var g=display.gutters.childNodes[i];if(g&&getRect(g).right>=mX){var line=lineAtHeight(cm.doc,mY);var gutter=cm.options.gutters[i];signalfn(cm,type,cm,line,gutter,e);return e_defaultPrevented(e);}}}
+function contextMenuInGutter(cm,e){if(!hasHandler(cm,"gutterContextMenu"))return false;return gutterEvent(cm,e,"gutterContextMenu",false,signal);}
+function clickInGutter(cm,e){return gutterEvent(cm,e,"gutterClick",true,signalLater);}
+var lastDrop=0;function onDrop(e){var cm=this;if(signalDOMEvent(cm,e)||eventInWidget(cm.display,e)||(cm.options.onDragEvent&&cm.options.onDragEvent(cm,addStop(e))))
+return;e_preventDefault(e);if(ie)lastDrop=+new Date;var pos=posFromMouse(cm,e,true),files=e.dataTransfer.files;if(!pos||isReadOnly(cm))return;if(files&&files.length&&window.FileReader&&window.File){var n=files.length,text=Array(n),read=0;var loadFile=function(file,i){var reader=new FileReader;reader.onload=function(){text[i]=reader.result;if(++read==n){pos=clipPos(cm.doc,pos);makeChange(cm.doc,{from:pos,to:pos,text:splitLines(text.join("\n")),origin:"paste"},"around");}};reader.readAsText(file);};for(var i=0;i<n;++i)loadFile(files[i],i);}else{if(cm.state.draggingText&&!(posLess(pos,cm.doc.sel.from)||posLess(cm.doc.sel.to,pos))){cm.state.draggingText(e);setTimeout(bind(focusInput,cm),20);return;}
+try{var text=e.dataTransfer.getData("Text");if(text){var curFrom=cm.doc.sel.from,curTo=cm.doc.sel.to;setSelection(cm.doc,pos,pos);if(cm.state.draggingText)replaceRange(cm.doc,"",curFrom,curTo,"paste");cm.replaceSelection(text,null,"paste");focusInput(cm);}}
+catch(e){}}}
+function onDragStart(cm,e){if(ie&&(!cm.state.draggingText||+new Date-lastDrop<100)){e_stop(e);return;}
+if(signalDOMEvent(cm,e)||eventInWidget(cm.display,e))return;var txt=cm.getSelection();e.dataTransfer.setData("Text",txt);if(e.dataTransfer.setDragImage&&!safari){var img=elt("img",null,null,"position: fixed; left: 0; top: 0;");img.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";if(opera){img.width=img.height=1;cm.display.wrapper.appendChild(img);img._top=img.offsetTop;}
+e.dataTransfer.setDragImage(img,0,0);if(opera)img.parentNode.removeChild(img);}}
+function setScrollTop(cm,val){if(Math.abs(cm.doc.scrollTop-val)<2)return;cm.doc.scrollTop=val;if(!gecko)updateDisplay(cm,[],val);if(cm.display.scroller.scrollTop!=val)cm.display.scroller.scrollTop=val;if(cm.display.scrollbarV.scrollTop!=val)cm.display.scrollbarV.scrollTop=val;if(gecko)updateDisplay(cm,[]);startWorker(cm,100);}
+function setScrollLeft(cm,val,isScroller){if(isScroller?val==cm.doc.scrollLeft:Math.abs(cm.doc.scrollLeft-val)<2)return;val=Math.min(val,cm.display.scroller.scrollWidth-cm.display.scroller.clientWidth);cm.doc.scrollLeft=val;alignHorizontally(cm);if(cm.display.scroller.scrollLeft!=val)cm.display.scroller.scrollLeft=val;if(cm.display.scrollbarH.scrollLeft!=val)cm.display.scrollbarH.scrollLeft=val;}
+var wheelSamples=0,wheelPixelsPerUnit=null;if(old_ie)wheelPixelsPerUnit=-.53;else if(gecko)wheelPixelsPerUnit=15;else if(chrome)wheelPixelsPerUnit=-.7;else if(safari)wheelPixelsPerUnit=-1/3;function onScrollWheel(cm,e){var dx=e.wheelDeltaX,dy=e.wheelDeltaY;if(dx==null&&e.detail&&e.axis==e.HORIZONTAL_AXIS)dx=e.detail;if(dy==null&&e.detail&&e.axis==e.VERTICAL_AXIS)dy=e.detail;else if(dy==null)dy=e.wheelDelta;var display=cm.display,scroll=display.scroller;if(!(dx&&scroll.scrollWidth>scroll.clientWidth||dy&&scroll.scrollHeight>scroll.clientHeight))return;if(dy&&mac&&webkit){for(var cur=e.target;cur!=scroll;cur=cur.parentNode){if(cur.lineObj){cm.display.currentWheelTarget=cur;break;}}}
+if(dx&&!gecko&&!opera&&wheelPixelsPerUnit!=null){if(dy)
+setScrollTop(cm,Math.max(0,Math.min(scroll.scrollTop+dy*wheelPixelsPerUnit,scroll.scrollHeight-scroll.clientHeight)));setScrollLeft(cm,Math.max(0,Math.min(scroll.scrollLeft+dx*wheelPixelsPerUnit,scroll.scrollWidth-scroll.clientWidth)));e_preventDefault(e);display.wheelStartX=null;return;}
+if(dy&&wheelPixelsPerUnit!=null){var pixels=dy*wheelPixelsPerUnit;var top=cm.doc.scrollTop,bot=top+display.wrapper.clientHeight;if(pixels<0)top=Math.max(0,top+pixels-50);else bot=Math.min(cm.doc.height,bot+pixels+50);updateDisplay(cm,[],{top:top,bottom:bot});}
+if(wheelSamples<20){if(display.wheelStartX==null){display.wheelStartX=scroll.scrollLeft;display.wheelStartY=scroll.scrollTop;display.wheelDX=dx;display.wheelDY=dy;setTimeout(function(){if(display.wheelStartX==null)return;var movedX=scroll.scrollLeft-display.wheelStartX;var movedY=scroll.scrollTop-display.wheelStartY;var sample=(movedY&&display.wheelDY&&movedY/display.wheelDY)||(movedX&&display.wheelDX&&movedX/display.wheelDX);display.wheelStartX=display.wheelStartY=null;if(!sample)return;wheelPixelsPerUnit=(wheelPixelsPerUnit*wheelSamples+sample)/(wheelSamples+1);++wheelSamples;},200);}else{display.wheelDX+=dx;display.wheelDY+=dy;}}}
+function doHandleBinding(cm,bound,dropShift){if(typeof bound=="string"){bound=commands[bound];if(!bound)return false;}
+if(cm.display.pollingFast&&readInput(cm))cm.display.pollingFast=false;var doc=cm.doc,prevShift=doc.sel.shift,done=false;try{if(isReadOnly(cm))cm.state.suppressEdits=true;if(dropShift)doc.sel.shift=false;done=bound(cm)!=Pass;}finally{doc.sel.shift=prevShift;cm.state.suppressEdits=false;}
+return done;}
+function allKeyMaps(cm){var maps=cm.state.keyMaps.slice(0);if(cm.options.extraKeys)maps.push(cm.options.extraKeys);maps.push(cm.options.keyMap);return maps;}
+var maybeTransition;function handleKeyBinding(cm,e){var startMap=getKeyMap(cm.options.keyMap),next=startMap.auto;clearTimeout(maybeTransition);if(next&&!isModifierKey(e))maybeTransition=setTimeout(function(){if(getKeyMap(cm.options.keyMap)==startMap){cm.options.keyMap=(next.call?next.call(null,cm):next);keyMapChanged(cm);}},50);var name=keyName(e,true),handled=false;if(!name)return false;var keymaps=allKeyMaps(cm);if(e.shiftKey){handled=lookupKey("Shift-"+name,keymaps,function(b){return doHandleBinding(cm,b,true);})||lookupKey(name,keymaps,function(b){if(typeof b=="string"?/^go[A-Z]/.test(b):b.motion)
+return doHandleBinding(cm,b);});}else{handled=lookupKey(name,keymaps,function(b){return doHandleBinding(cm,b);});}
+if(handled){e_preventDefault(e);restartBlink(cm);if(ie_lt9){e.oldKeyCode=e.keyCode;e.keyCode=0;}
+signalLater(cm,"keyHandled",cm,name,e);}
+return handled;}
+function handleCharBinding(cm,e,ch){var handled=lookupKey("'"+ch+"'",allKeyMaps(cm),function(b){return doHandleBinding(cm,b,true);});if(handled){e_preventDefault(e);restartBlink(cm);signalLater(cm,"keyHandled",cm,"'"+ch+"'",e);}
+return handled;}
+function onKeyUp(e){var cm=this;if(signalDOMEvent(cm,e)||cm.options.onKeyEvent&&cm.options.onKeyEvent(cm,addStop(e)))return;if(e.keyCode==16)cm.doc.sel.shift=false;}
+var lastStoppedKey=null;function onKeyDown(e){var cm=this;if(!cm.state.focused)onFocus(cm);if(signalDOMEvent(cm,e)||cm.options.onKeyEvent&&cm.options.onKeyEvent(cm,addStop(e)))return;if(old_ie&&e.keyCode==27)e.returnValue=false;var code=e.keyCode;cm.doc.sel.shift=code==16||e.shiftKey;var handled=handleKeyBinding(cm,e);if(opera){lastStoppedKey=handled?code:null;if(!handled&&code==88&&!hasCopyEvent&&(mac?e.metaKey:e.ctrlKey))
+cm.replaceSelection("");}}
+function onKeyPress(e){var cm=this;if(signalDOMEvent(cm,e)||cm.options.onKeyEvent&&cm.options.onKeyEvent(cm,addStop(e)))return;var keyCode=e.keyCode,charCode=e.charCode;if(opera&&keyCode==lastStoppedKey){lastStoppedKey=null;e_preventDefault(e);return;}
+if(((opera&&(!e.which||e.which<10))||khtml)&&handleKeyBinding(cm,e))return;var ch=String.fromCharCode(charCode==null?keyCode:charCode);if(handleCharBinding(cm,e,ch))return;if(ie&&!ie_lt9)cm.display.inputHasSelection=null;fastPoll(cm);}
+function onFocus(cm){if(cm.options.readOnly=="nocursor")return;if(!cm.state.focused){signal(cm,"focus",cm);cm.state.focused=true;if(cm.display.wrapper.className.search(/\bCodeMirror-focused\b/)==-1)
+cm.display.wrapper.className+=" CodeMirror-focused";if(!cm.curOp){resetInput(cm,true);if(webkit)setTimeout(bind(resetInput,cm,true),0);}}
+slowPoll(cm);restartBlink(cm);}
+function onBlur(cm){if(cm.state.focused){signal(cm,"blur",cm);cm.state.focused=false;cm.display.wrapper.className=cm.display.wrapper.className.replace(" CodeMirror-focused","");}
+clearInterval(cm.display.blinker);setTimeout(function(){if(!cm.state.focused)cm.doc.sel.shift=false;},150);}
+var detectingSelectAll;function onContextMenu(cm,e){if(signalDOMEvent(cm,e,"contextmenu"))return;var display=cm.display,sel=cm.doc.sel;if(eventInWidget(display,e)||contextMenuInGutter(cm,e))return;var pos=posFromMouse(cm,e),scrollPos=display.scroller.scrollTop;if(!pos||opera)return;var reset=cm.options.resetSelectionOnContextMenu;if(reset&&(posEq(sel.from,sel.to)||posLess(pos,sel.from)||!posLess(pos,sel.to)))
+operation(cm,setSelection)(cm.doc,pos,pos);var oldCSS=display.input.style.cssText;display.inputDiv.style.position="absolute";display.input.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(e.clientY-5)+"px; left: "+(e.clientX-5)+"px; z-index: 1000; background: transparent; outline: none;"+"border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);";focusInput(cm);resetInput(cm,true);if(posEq(sel.from,sel.to))display.input.value=display.prevInput=" ";function prepareSelectAllHack(){if(display.input.selectionStart!=null){var extval=display.input.value="\u200b"+(posEq(sel.from,sel.to)?"":display.input.value);display.prevInput="\u200b";display.input.selectionStart=1;display.input.selectionEnd=extval.length;}}
+function rehide(){display.inputDiv.style.position="relative";display.input.style.cssText=oldCSS;if(ie_lt9)display.scrollbarV.scrollTop=display.scroller.scrollTop=scrollPos;slowPoll(cm);if(display.input.selectionStart!=null){if(!old_ie||ie_lt9)prepareSelectAllHack();clearTimeout(detectingSelectAll);var i=0,poll=function(){if(display.prevInput=="\u200b"&&display.input.selectionStart==0)
+operation(cm,commands.selectAll)(cm);else if(i++<10)detectingSelectAll=setTimeout(poll,500);else resetInput(cm);};detectingSelectAll=setTimeout(poll,200);}}
+if(old_ie&&!ie_lt9)prepareSelectAllHack();if(captureMiddleClick){e_stop(e);var mouseup=function(){off(window,"mouseup",mouseup);setTimeout(rehide,20);};on(window,"mouseup",mouseup);}else{setTimeout(rehide,50);}}
+var changeEnd=CodeMirror.changeEnd=function(change){if(!change.text)return change.to;return Pos(change.from.line+change.text.length-1,lst(change.text).length+(change.text.length==1?change.from.ch:0));};function clipPostChange(doc,change,pos){if(!posLess(change.from,pos))return clipPos(doc,pos);var diff=(change.text.length-1)-(change.to.line-change.from.line);if(pos.line>change.to.line+diff){var preLine=pos.line-diff,lastLine=doc.first+doc.size-1;if(preLine>lastLine)return Pos(lastLine,getLine(doc,lastLine).text.length);return clipToLen(pos,getLine(doc,preLine).text.length);}
+if(pos.line==change.to.line+diff)
+return clipToLen(pos,lst(change.text).length+(change.text.length==1?change.from.ch:0)+
+getLine(doc,change.to.line).text.length-change.to.ch);var inside=pos.line-change.from.line;return clipToLen(pos,change.text[inside].length+(inside?0:change.from.ch));}
+function computeSelAfterChange(doc,change,hint){if(hint&&typeof hint=="object")
+return{anchor:clipPostChange(doc,change,hint.anchor),head:clipPostChange(doc,change,hint.head)};if(hint=="start")return{anchor:change.from,head:change.from};var end=changeEnd(change);if(hint=="around")return{anchor:change.from,head:end};if(hint=="end")return{anchor:end,head:end};var adjustPos=function(pos){if(posLess(pos,change.from))return pos;if(!posLess(change.to,pos))return end;var line=pos.line+change.text.length-(change.to.line-change.from.line)-1,ch=pos.ch;if(pos.line==change.to.line)ch+=end.ch-change.to.ch;return Pos(line,ch);};return{anchor:adjustPos(doc.sel.anchor),head:adjustPos(doc.sel.head)};}
+function filterChange(doc,change,update){var obj={canceled:false,from:change.from,to:change.to,text:change.text,origin:change.origin,cancel:function(){this.canceled=true;}};if(update)obj.update=function(from,to,text,origin){if(from)this.from=clipPos(doc,from);if(to)this.to=clipPos(doc,to);if(text)this.text=text;if(origin!==undefined)this.origin=origin;};signal(doc,"beforeChange",doc,obj);if(doc.cm)signal(doc.cm,"beforeChange",doc.cm,obj);if(obj.canceled)return null;return{from:obj.from,to:obj.to,text:obj.text,origin:obj.origin};}
+function makeChange(doc,change,selUpdate,ignoreReadOnly){if(doc.cm){if(!doc.cm.curOp)return operation(doc.cm,makeChange)(doc,change,selUpdate,ignoreReadOnly);if(doc.cm.state.suppressEdits)return;}
+if(hasHandler(doc,"beforeChange")||doc.cm&&hasHandler(doc.cm,"beforeChange")){change=filterChange(doc,change,true);if(!change)return;}
+var split=sawReadOnlySpans&&!ignoreReadOnly&&removeReadOnlyRanges(doc,change.from,change.to);if(split){for(var i=split.length-1;i>=1;--i)
+makeChangeNoReadonly(doc,{from:split[i].from,to:split[i].to,text:[""]});if(split.length)
+makeChangeNoReadonly(doc,{from:split[0].from,to:split[0].to,text:change.text},selUpdate);}else{makeChangeNoReadonly(doc,change,selUpdate);}}
+function makeChangeNoReadonly(doc,change,selUpdate){if(change.text.length==1&&change.text[0]==""&&posEq(change.from,change.to))return;var selAfter=computeSelAfterChange(doc,change,selUpdate);addToHistory(doc,change,selAfter,doc.cm?doc.cm.curOp.id:NaN);makeChangeSingleDoc(doc,change,selAfter,stretchSpansOverChange(doc,change));var rebased=[];linkedDocs(doc,function(doc,sharedHist){if(!sharedHist&&indexOf(rebased,doc.history)==-1){rebaseHist(doc.history,change);rebased.push(doc.history);}
+makeChangeSingleDoc(doc,change,null,stretchSpansOverChange(doc,change));});}
+function makeChangeFromHistory(doc,type){if(doc.cm&&doc.cm.state.suppressEdits)return;var hist=doc.history;var event=(type=="undo"?hist.done:hist.undone).pop();if(!event)return;var anti={changes:[],anchorBefore:event.anchorAfter,headBefore:event.headAfter,anchorAfter:event.anchorBefore,headAfter:event.headBefore,generation:hist.generation};(type=="undo"?hist.undone:hist.done).push(anti);hist.generation=event.generation||++hist.maxGeneration;var filter=hasHandler(doc,"beforeChange")||doc.cm&&hasHandler(doc.cm,"beforeChange");for(var i=event.changes.length-1;i>=0;--i){var change=event.changes[i];change.origin=type;if(filter&&!filterChange(doc,change,false)){(type=="undo"?hist.done:hist.undone).length=0;return;}
+anti.changes.push(historyChangeFromChange(doc,change));var after=i?computeSelAfterChange(doc,change,null):{anchor:event.anchorBefore,head:event.headBefore};makeChangeSingleDoc(doc,change,after,mergeOldSpans(doc,change));var rebased=[];linkedDocs(doc,function(doc,sharedHist){if(!sharedHist&&indexOf(rebased,doc.history)==-1){rebaseHist(doc.history,change);rebased.push(doc.history);}
+makeChangeSingleDoc(doc,change,null,mergeOldSpans(doc,change));});}}
+function shiftDoc(doc,distance){function shiftPos(pos){return Pos(pos.line+distance,pos.ch);}
+doc.first+=distance;if(doc.cm)regChange(doc.cm,doc.first,doc.first,distance);doc.sel.head=shiftPos(doc.sel.head);doc.sel.anchor=shiftPos(doc.sel.anchor);doc.sel.from=shiftPos(doc.sel.from);doc.sel.to=shiftPos(doc.sel.to);}
+function makeChangeSingleDoc(doc,change,selAfter,spans){if(doc.cm&&!doc.cm.curOp)
+return operation(doc.cm,makeChangeSingleDoc)(doc,change,selAfter,spans);if(change.to.line<doc.first){shiftDoc(doc,change.text.length-1-(change.to.line-change.from.line));return;}
+if(change.from.line>doc.lastLine())return;if(change.from.line<doc.first){var shift=change.text.length-1-(doc.first-change.from.line);shiftDoc(doc,shift);change={from:Pos(doc.first,0),to:Pos(change.to.line+shift,change.to.ch),text:[lst(change.text)],origin:change.origin};}
+var last=doc.lastLine();if(change.to.line>last){change={from:change.from,to:Pos(last,getLine(doc,last).text.length),text:[change.text[0]],origin:change.origin};}
+change.removed=getBetween(doc,change.from,change.to);if(!selAfter)selAfter=computeSelAfterChange(doc,change,null);if(doc.cm)makeChangeSingleDocInEditor(doc.cm,change,spans,selAfter);else updateDoc(doc,change,spans,selAfter);}
+function makeChangeSingleDocInEditor(cm,change,spans,selAfter){var doc=cm.doc,display=cm.display,from=change.from,to=change.to;var recomputeMaxLength=false,checkWidthStart=from.line;if(!cm.options.lineWrapping){checkWidthStart=lineNo(visualLine(doc,getLine(doc,from.line)));doc.iter(checkWidthStart,to.line+1,function(line){if(line==display.maxLine){recomputeMaxLength=true;return true;}});}
+if(!posLess(doc.sel.head,change.from)&&!posLess(change.to,doc.sel.head))
+cm.curOp.cursorActivity=true;updateDoc(doc,change,spans,selAfter,estimateHeight(cm));if(!cm.options.lineWrapping){doc.iter(checkWidthStart,from.line+change.text.length,function(line){var len=lineLength(doc,line);if(len>display.maxLineLength){display.maxLine=line;display.maxLineLength=len;display.maxLineChanged=true;recomputeMaxLength=false;}});if(recomputeMaxLength)cm.curOp.updateMaxLine=true;}
+doc.frontier=Math.min(doc.frontier,from.line);startWorker(cm,400);var lendiff=change.text.length-(to.line-from.line)-1;regChange(cm,from.line,to.line+1,lendiff);if(hasHandler(cm,"change")){var changeObj={from:from,to:to,text:change.text,removed:change.removed,origin:change.origin};if(cm.curOp.textChanged){for(var cur=cm.curOp.textChanged;cur.next;cur=cur.next){}
+cur.next=changeObj;}else cm.curOp.textChanged=changeObj;}}
+function replaceRange(doc,code,from,to,origin){if(!to)to=from;if(posLess(to,from)){var tmp=to;to=from;from=tmp;}
+if(typeof code=="string")code=splitLines(code);makeChange(doc,{from:from,to:to,text:code,origin:origin},null);}
+function Pos(line,ch){if(!(this instanceof Pos))return new Pos(line,ch);this.line=line;this.ch=ch;}
+CodeMirror.Pos=Pos;function posEq(a,b){return a.line==b.line&&a.ch==b.ch;}
+function posLess(a,b){return a.line<b.line||(a.line==b.line&&a.ch<b.ch);}
+function cmp(a,b){return a.line-b.line||a.ch-b.ch;}
+function copyPos(x){return Pos(x.line,x.ch);}
+function clipLine(doc,n){return Math.max(doc.first,Math.min(n,doc.first+doc.size-1));}
+function clipPos(doc,pos){if(pos.line<doc.first)return Pos(doc.first,0);var last=doc.first+doc.size-1;if(pos.line>last)return Pos(last,getLine(doc,last).text.length);return clipToLen(pos,getLine(doc,pos.line).text.length);}
+function clipToLen(pos,linelen){var ch=pos.ch;if(ch==null||ch>linelen)return Pos(pos.line,linelen);else if(ch<0)return Pos(pos.line,0);else return pos;}
+function isLine(doc,l){return l>=doc.first&&l<doc.first+doc.size;}
+function extendSelection(doc,pos,other,bias){if(doc.sel.shift||doc.sel.extend){var anchor=doc.sel.anchor;if(other){var posBefore=posLess(pos,anchor);if(posBefore!=posLess(other,anchor)){anchor=pos;pos=other;}else if(posBefore!=posLess(pos,other)){pos=other;}}
+setSelection(doc,anchor,pos,bias);}else{setSelection(doc,pos,other||pos,bias);}
+if(doc.cm)doc.cm.curOp.userSelChange=true;}
+function filterSelectionChange(doc,anchor,head){var obj={anchor:anchor,head:head};signal(doc,"beforeSelectionChange",doc,obj);if(doc.cm)signal(doc.cm,"beforeSelectionChange",doc.cm,obj);obj.anchor=clipPos(doc,obj.anchor);obj.head=clipPos(doc,obj.head);return obj;}
+function setSelection(doc,anchor,head,bias,checkAtomic){if(!checkAtomic&&hasHandler(doc,"beforeSelectionChange")||doc.cm&&hasHandler(doc.cm,"beforeSelectionChange")){var filtered=filterSelectionChange(doc,anchor,head);head=filtered.head;anchor=filtered.anchor;}
+var sel=doc.sel;sel.goalColumn=null;if(bias==null)bias=posLess(head,sel.head)?-1:1;if(checkAtomic||!posEq(anchor,sel.anchor))
+anchor=skipAtomic(doc,anchor,bias,checkAtomic!="push");if(checkAtomic||!posEq(head,sel.head))
+head=skipAtomic(doc,head,bias,checkAtomic!="push");if(posEq(sel.anchor,anchor)&&posEq(sel.head,head))return;sel.anchor=anchor;sel.head=head;var inv=posLess(head,anchor);sel.from=inv?head:anchor;sel.to=inv?anchor:head;if(doc.cm)
+doc.cm.curOp.updateInput=doc.cm.curOp.selectionChanged=doc.cm.curOp.cursorActivity=true;signalLater(doc,"cursorActivity",doc);}
+function reCheckSelection(cm){setSelection(cm.doc,cm.doc.sel.from,cm.doc.sel.to,null,"push");}
+function skipAtomic(doc,pos,bias,mayClear){var flipped=false,curPos=pos;var dir=bias||1;doc.cantEdit=false;search:for(;;){var line=getLine(doc,curPos.line);if(line.markedSpans){for(var i=0;i<line.markedSpans.length;++i){var sp=line.markedSpans[i],m=sp.marker;if((sp.from==null||(m.inclusiveLeft?sp.from<=curPos.ch:sp.from<curPos.ch))&&(sp.to==null||(m.inclusiveRight?sp.to>=curPos.ch:sp.to>curPos.ch))){if(mayClear){signal(m,"beforeCursorEnter");if(m.explicitlyCleared){if(!line.markedSpans)break;else{--i;continue;}}}
+if(!m.atomic)continue;var newPos=m.find()[dir<0?"from":"to"];if(posEq(newPos,curPos)){newPos.ch+=dir;if(newPos.ch<0){if(newPos.line>doc.first)newPos=clipPos(doc,Pos(newPos.line-1));else newPos=null;}else if(newPos.ch>line.text.length){if(newPos.line<doc.first+doc.size-1)newPos=Pos(newPos.line+1,0);else newPos=null;}
+if(!newPos){if(flipped){if(!mayClear)return skipAtomic(doc,pos,bias,true);doc.cantEdit=true;return Pos(doc.first,0);}
+flipped=true;newPos=pos;dir=-dir;}}
+curPos=newPos;continue search;}}}
+return curPos;}}
+function scrollCursorIntoView(cm){var coords=scrollPosIntoView(cm,cm.doc.sel.head,null,cm.options.cursorScrollMargin);if(!cm.state.focused)return;var display=cm.display,box=getRect(display.sizer),doScroll=null;if(coords.top+box.top<0)doScroll=true;else if(coords.bottom+box.top>(window.innerHeight||document.documentElement.clientHeight))doScroll=false;if(doScroll!=null&&!phantom){var scrollNode=elt("div","\u200b",null,"position: absolute; top: "+
+(coords.top-display.viewOffset)+"px; height: "+
+(coords.bottom-coords.top+scrollerCutOff)+"px; left: "+
+coords.left+"px; width: 2px;");cm.display.lineSpace.appendChild(scrollNode);scrollNode.scrollIntoView(doScroll);cm.display.lineSpace.removeChild(scrollNode);}}
+function scrollPosIntoView(cm,pos,end,margin){if(margin==null)margin=0;for(;;){var changed=false,coords=cursorCoords(cm,pos);var endCoords=!end||end==pos?coords:cursorCoords(cm,end);var scrollPos=calculateScrollPos(cm,Math.min(coords.left,endCoords.left),Math.min(coords.top,endCoords.top)-margin,Math.max(coords.left,endCoords.left),Math.max(coords.bottom,endCoords.bottom)+margin);var startTop=cm.doc.scrollTop,startLeft=cm.doc.scrollLeft;if(scrollPos.scrollTop!=null){setScrollTop(cm,scrollPos.scrollTop);if(Math.abs(cm.doc.scrollTop-startTop)>1)changed=true;}
+if(scrollPos.scrollLeft!=null){setScrollLeft(cm,scrollPos.scrollLeft);if(Math.abs(cm.doc.scrollLeft-startLeft)>1)changed=true;}
+if(!changed)return coords;}}
+function scrollIntoView(cm,x1,y1,x2,y2){var scrollPos=calculateScrollPos(cm,x1,y1,x2,y2);if(scrollPos.scrollTop!=null)setScrollTop(cm,scrollPos.scrollTop);if(scrollPos.scrollLeft!=null)setScrollLeft(cm,scrollPos.scrollLeft);}
+function calculateScrollPos(cm,x1,y1,x2,y2){var display=cm.display,snapMargin=textHeight(cm.display);if(y1<0)y1=0;var screen=display.scroller.clientHeight-scrollerCutOff,screentop=display.scroller.scrollTop,result={};var docBottom=cm.doc.height+paddingVert(display);var atTop=y1<snapMargin,atBottom=y2>docBottom-snapMargin;if(y1<screentop){result.scrollTop=atTop?0:y1;}else if(y2>screentop+screen){var newTop=Math.min(y1,(atBottom?docBottom:y2)-screen);if(newTop!=screentop)result.scrollTop=newTop;}
+var screenw=display.scroller.clientWidth-scrollerCutOff,screenleft=display.scroller.scrollLeft;x1+=display.gutters.offsetWidth;x2+=display.gutters.offsetWidth;var gutterw=display.gutters.offsetWidth;var atLeft=x1<gutterw+10;if(x1<screenleft+gutterw||atLeft){if(atLeft)x1=0;result.scrollLeft=Math.max(0,x1-10-gutterw);}else if(x2>screenw+screenleft-3){result.scrollLeft=x2+10-screenw;}
+return result;}
+function updateScrollPos(cm,left,top){cm.curOp.updateScrollPos={scrollLeft:left==null?cm.doc.scrollLeft:left,scrollTop:top==null?cm.doc.scrollTop:top};}
+function addToScrollPos(cm,left,top){var pos=cm.curOp.updateScrollPos||(cm.curOp.updateScrollPos={scrollLeft:cm.doc.scrollLeft,scrollTop:cm.doc.scrollTop});var scroll=cm.display.scroller;pos.scrollTop=Math.max(0,Math.min(scroll.scrollHeight-scroll.clientHeight,pos.scrollTop+top));pos.scrollLeft=Math.max(0,Math.min(scroll.scrollWidth-scroll.clientWidth,pos.scrollLeft+left));}
+function indentLine(cm,n,how,aggressive){var doc=cm.doc;if(how==null)how="add";if(how=="smart"){if(!cm.doc.mode.indent)how="prev";else var state=getStateBefore(cm,n);}
+var tabSize=cm.options.tabSize;var line=getLine(doc,n),curSpace=countColumn(line.text,null,tabSize);var curSpaceString=line.text.match(/^\s*/)[0],indentation;if(!aggressive&&!/\S/.test(line.text)){indentation=0;how="not";}else if(how=="smart"){indentation=cm.doc.mode.indent(state,line.text.slice(curSpaceString.length),line.text);if(indentation==Pass){if(!aggressive)return;how="prev";}}
+if(how=="prev"){if(n>doc.first)indentation=countColumn(getLine(doc,n-1).text,null,tabSize);else indentation=0;}else if(how=="add"){indentation=curSpace+cm.options.indentUnit;}else if(how=="subtract"){indentation=curSpace-cm.options.indentUnit;}else if(typeof how=="number"){indentation=curSpace+how;}
+indentation=Math.max(0,indentation);var indentString="",pos=0;if(cm.options.indentWithTabs)
+for(var i=Math.floor(indentation/tabSize);i;--i){pos+=tabSize;indentString+="\t";}
+if(pos<indentation)indentString+=spaceStr(indentation-pos);if(indentString!=curSpaceString)
+replaceRange(cm.doc,indentString,Pos(n,0),Pos(n,curSpaceString.length),"+input");else if(doc.sel.head.line==n&&doc.sel.head.ch<curSpaceString.length)
+setSelection(doc,Pos(n,curSpaceString.length),Pos(n,curSpaceString.length),1);line.stateAfter=null;}
+function changeLine(cm,handle,op){var no=handle,line=handle,doc=cm.doc;if(typeof handle=="number")line=getLine(doc,clipLine(doc,handle));else no=lineNo(handle);if(no==null)return null;if(op(line,no))regChange(cm,no,no+1);else return null;return line;}
+function findPosH(doc,pos,dir,unit,visually){var line=pos.line,ch=pos.ch,origDir=dir;var lineObj=getLine(doc,line);var possible=true;function findNextLine(){var l=line+dir;if(l<doc.first||l>=doc.first+doc.size)return(possible=false);line=l;return lineObj=getLine(doc,l);}
+function moveOnce(boundToLine){var next=(visually?moveVisually:moveLogically)(lineObj,ch,dir,true);if(next==null){if(!boundToLine&&findNextLine()){if(visually)ch=(dir<0?lineRight:lineLeft)(lineObj);else ch=dir<0?lineObj.text.length:0;}else return(possible=false);}else ch=next;return true;}
+if(unit=="char")moveOnce();else if(unit=="column")moveOnce(true);else if(unit=="word"||unit=="group"){var sawType=null,group=unit=="group";for(var first=true;;first=false){if(dir<0&&!moveOnce(!first))break;var cur=lineObj.text.charAt(ch)||"\n";var type=isWordChar(cur)?"w":!group?null:/\s/.test(cur)?null:"p";if(sawType&&sawType!=type){if(dir<0){dir=1;moveOnce();}
+break;}
+if(type)sawType=type;if(dir>0&&!moveOnce(!first))break;}}
+var result=skipAtomic(doc,Pos(line,ch),origDir,true);if(!possible)result.hitSide=true;return result;}
+function findPosV(cm,pos,dir,unit){var doc=cm.doc,x=pos.left,y;if(unit=="page"){var pageSize=Math.min(cm.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);y=pos.top+dir*(pageSize-(dir<0?1.5:.5)*textHeight(cm.display));}else if(unit=="line"){y=dir>0?pos.bottom+3:pos.top-3;}
+for(;;){var target=coordsChar(cm,x,y);if(!target.outside)break;if(dir<0?y<=0:y>=doc.height){target.hitSide=true;break;}
+y+=dir*5;}
+return target;}
+function findWordAt(line,pos){var start=pos.ch,end=pos.ch;if(line){if((pos.xRel<0||end==line.length)&&start)--start;else++end;var startChar=line.charAt(start);var check=isWordChar(startChar)?isWordChar:/\s/.test(startChar)?function(ch){return/\s/.test(ch);}:function(ch){return!/\s/.test(ch)&&!isWordChar(ch);};while(start>0&&check(line.charAt(start-1)))--start;while(end<line.length&&check(line.charAt(end)))++end;}
+return{from:Pos(pos.line,start),to:Pos(pos.line,end)};}
+function selectLine(cm,line){extendSelection(cm.doc,Pos(line,0),clipPos(cm.doc,Pos(line+1,0)));}
+CodeMirror.prototype={constructor:CodeMirror,focus:function(){window.focus();focusInput(this);fastPoll(this);},setOption:function(option,value){var options=this.options,old=options[option];if(options[option]==value&&option!="mode")return;options[option]=value;if(optionHandlers.hasOwnProperty(option))
+operation(this,optionHandlers[option])(this,value,old);},getOption:function(option){return this.options[option];},getDoc:function(){return this.doc;},addKeyMap:function(map,bottom){this.state.keyMaps[bottom?"push":"unshift"](map);},removeKeyMap:function(map){var maps=this.state.keyMaps;for(var i=0;i<maps.length;++i)
+if(maps[i]==map||(typeof maps[i]!="string"&&maps[i].name==map)){maps.splice(i,1);return true;}},addOverlay:operation(null,function(spec,options){var mode=spec.token?spec:CodeMirror.getMode(this.options,spec);if(mode.startState)throw new Error("Overlays may not be stateful.");this.state.overlays.push({mode:mode,modeSpec:spec,opaque:options&&options.opaque});this.state.modeGen++;regChange(this);}),removeOverlay:operation(null,function(spec){var overlays=this.state.overlays;for(var i=0;i<overlays.length;++i){var cur=overlays[i].modeSpec;if(cur==spec||typeof spec=="string"&&cur.name==spec){overlays.splice(i,1);this.state.modeGen++;regChange(this);return;}}}),indentLine:operation(null,function(n,dir,aggressive){if(typeof dir!="string"&&typeof dir!="number"){if(dir==null)dir=this.options.smartIndent?"smart":"prev";else dir=dir?"add":"subtract";}
+if(isLine(this.doc,n))indentLine(this,n,dir,aggressive);}),indentSelection:operation(null,function(how){var sel=this.doc.sel;if(posEq(sel.from,sel.to))return indentLine(this,sel.from.line,how,true);var e=sel.to.line-(sel.to.ch?0:1);for(var i=sel.from.line;i<=e;++i)indentLine(this,i,how);}),getTokenAt:function(pos,precise){var doc=this.doc;pos=clipPos(doc,pos);var state=getStateBefore(this,pos.line,precise),mode=this.doc.mode;var line=getLine(doc,pos.line);var stream=new StringStream(line.text,this.options.tabSize);while(stream.pos<pos.ch&&!stream.eol()){stream.start=stream.pos;var style=mode.token(stream,state);}
+return{start:stream.start,end:stream.pos,string:stream.current(),className:style||null,type:style||null,state:state};},getTokenTypeAt:function(pos){pos=clipPos(this.doc,pos);var styles=getLineStyles(this,getLine(this.doc,pos.line));var before=0,after=(styles.length-1)/2,ch=pos.ch;if(ch==0)return styles[2];for(;;){var mid=(before+after)>>1;if((mid?styles[mid*2-1]:0)>=ch)after=mid;else if(styles[mid*2+1]<ch)before=mid+1;else return styles[mid*2+2];}},getModeAt:function(pos){var mode=this.doc.mode;if(!mode.innerMode)return mode;return CodeMirror.innerMode(mode,this.getTokenAt(pos).state).mode;},getHelper:function(pos,type){return this.getHelpers(pos,type)[0];},getHelpers:function(pos,type){var found=[];if(!helpers.hasOwnProperty(type))return helpers;var help=helpers[type],mode=this.getModeAt(pos);if(typeof mode[type]=="string"){if(help[mode[type]])found.push(help[mode[type]]);}else if(mode[type]){for(var i=0;i<mode[type].length;i++){var val=help[mode[type][i]];if(val)found.push(val);}}else if(mode.helperType&&help[mode.helperType]){found.push(help[mode.helperType]);}else if(help[mode.name]){found.push(help[mode.name]);}
+for(var i=0;i<help._global.length;i++){var cur=help._global[i];if(cur.pred(mode,this)&&indexOf(found,cur.val)==-1)
+found.push(cur.val);}
+return found;},getStateAfter:function(line,precise){var doc=this.doc;line=clipLine(doc,line==null?doc.first+doc.size-1:line);return getStateBefore(this,line+1,precise);},cursorCoords:function(start,mode){var pos,sel=this.doc.sel;if(start==null)pos=sel.head;else if(typeof start=="object")pos=clipPos(this.doc,start);else pos=start?sel.from:sel.to;return cursorCoords(this,pos,mode||"page");},charCoords:function(pos,mode){return charCoords(this,clipPos(this.doc,pos),mode||"page");},coordsChar:function(coords,mode){coords=fromCoordSystem(this,coords,mode||"page");return coordsChar(this,coords.left,coords.top);},lineAtHeight:function(height,mode){height=fromCoordSystem(this,{top:height,left:0},mode||"page").top;return lineAtHeight(this.doc,height+this.display.viewOffset);},heightAtLine:function(line,mode){var end=false,last=this.doc.first+this.doc.size-1;if(line<this.doc.first)line=this.doc.first;else if(line>last){line=last;end=true;}
+var lineObj=getLine(this.doc,line);return intoCoordSystem(this,getLine(this.doc,line),{top:0,left:0},mode||"page").top+
+(end?lineObj.height:0);},defaultTextHeight:function(){return textHeight(this.display);},defaultCharWidth:function(){return charWidth(this.display);},setGutterMarker:operation(null,function(line,gutterID,value){return changeLine(this,line,function(line){var markers=line.gutterMarkers||(line.gutterMarkers={});markers[gutterID]=value;if(!value&&isEmpty(markers))line.gutterMarkers=null;return true;});}),clearGutter:operation(null,function(gutterID){var cm=this,doc=cm.doc,i=doc.first;doc.iter(function(line){if(line.gutterMarkers&&line.gutterMarkers[gutterID]){line.gutterMarkers[gutterID]=null;regChange(cm,i,i+1);if(isEmpty(line.gutterMarkers))line.gutterMarkers=null;}
+++i;});}),addLineClass:operation(null,function(handle,where,cls){return changeLine(this,handle,function(line){var prop=where=="text"?"textClass":where=="background"?"bgClass":"wrapClass";if(!line[prop])line[prop]=cls;else if(new RegExp("(?:^|\\s)"+cls+"(?:$|\\s)").test(line[prop]))return false;else line[prop]+=" "+cls;return true;});}),removeLineClass:operation(null,function(handle,where,cls){return changeLine(this,handle,function(line){var prop=where=="text"?"textClass":where=="background"?"bgClass":"wrapClass";var cur=line[prop];if(!cur)return false;else if(cls==null)line[prop]=null;else{var found=cur.match(new RegExp("(?:^|\\s+)"+cls+"(?:$|\\s+)"));if(!found)return false;var end=found.index+found[0].length;line[prop]=cur.slice(0,found.index)+(!found.index||end==cur.length?"":" ")+cur.slice(end)||null;}
+return true;});}),addLineWidget:operation(null,function(handle,node,options){return addLineWidget(this,handle,node,options);}),removeLineWidget:function(widget){widget.clear();},lineInfo:function(line){if(typeof line=="number"){if(!isLine(this.doc,line))return null;var n=line;line=getLine(this.doc,line);if(!line)return null;}else{var n=lineNo(line);if(n==null)return null;}
+return{line:n,handle:line,text:line.text,gutterMarkers:line.gutterMarkers,textClass:line.textClass,bgClass:line.bgClass,wrapClass:line.wrapClass,widgets:line.widgets};},getViewport:function(){return{from:this.display.showingFrom,to:this.display.showingTo};},addWidget:function(pos,node,scroll,vert,horiz){var display=this.display;pos=cursorCoords(this,clipPos(this.doc,pos));var top=pos.bottom,left=pos.left;node.style.position="absolute";display.sizer.appendChild(node);if(vert=="over"){top=pos.top;}else if(vert=="above"||vert=="near"){var vspace=Math.max(display.wrapper.clientHeight,this.doc.height),hspace=Math.max(display.sizer.clientWidth,display.lineSpace.clientWidth);if((vert=='above'||pos.bottom+node.offsetHeight>vspace)&&pos.top>node.offsetHeight)
+top=pos.top-node.offsetHeight;else if(pos.bottom+node.offsetHeight<=vspace)
+top=pos.bottom;if(left+node.offsetWidth>hspace)
+left=hspace-node.offsetWidth;}
+node.style.top=top+"px";node.style.left=node.style.right="";if(horiz=="right"){left=display.sizer.clientWidth-node.offsetWidth;node.style.right="0px";}else{if(horiz=="left")left=0;else if(horiz=="middle")left=(display.sizer.clientWidth-node.offsetWidth)/2;node.style.left=left+"px";}
+if(scroll)
+scrollIntoView(this,left,top,left+node.offsetWidth,top+node.offsetHeight);},triggerOnKeyDown:operation(null,onKeyDown),triggerOnKeyPress:operation(null,onKeyPress),triggerOnKeyUp:operation(null,onKeyUp),execCommand:function(cmd){if(commands.hasOwnProperty(cmd))
+return commands[cmd](this);},findPosH:function(from,amount,unit,visually){var dir=1;if(amount<0){dir=-1;amount=-amount;}
+for(var i=0,cur=clipPos(this.doc,from);i<amount;++i){cur=findPosH(this.doc,cur,dir,unit,visually);if(cur.hitSide)break;}
+return cur;},moveH:operation(null,function(dir,unit){var sel=this.doc.sel,pos;if(sel.shift||sel.extend||posEq(sel.from,sel.to))
+pos=findPosH(this.doc,sel.head,dir,unit,this.options.rtlMoveVisually);else
+pos=dir<0?sel.from:sel.to;extendSelection(this.doc,pos,pos,dir);}),deleteH:operation(null,function(dir,unit){var sel=this.doc.sel;if(!posEq(sel.from,sel.to))replaceRange(this.doc,"",sel.from,sel.to,"+delete");else replaceRange(this.doc,"",sel.from,findPosH(this.doc,sel.head,dir,unit,false),"+delete");this.curOp.userSelChange=true;}),findPosV:function(from,amount,unit,goalColumn){var dir=1,x=goalColumn;if(amount<0){dir=-1;amount=-amount;}
+for(var i=0,cur=clipPos(this.doc,from);i<amount;++i){var coords=cursorCoords(this,cur,"div");if(x==null)x=coords.left;else coords.left=x;cur=findPosV(this,coords,dir,unit);if(cur.hitSide)break;}
+return cur;},moveV:operation(null,function(dir,unit){var sel=this.doc.sel,target,goal;if(sel.shift||sel.extend||posEq(sel.from,sel.to)){var pos=cursorCoords(this,sel.head,"div");if(sel.goalColumn!=null)pos.left=sel.goalColumn;target=findPosV(this,pos,dir,unit);if(unit=="page")addToScrollPos(this,0,charCoords(this,target,"div").top-pos.top);goal=pos.left;}else{target=dir<0?sel.from:sel.to;}
+extendSelection(this.doc,target,target,dir);if(goal!=null)sel.goalColumn=goal;}),toggleOverwrite:function(value){if(value!=null&&value==this.state.overwrite)return;if(this.state.overwrite=!this.state.overwrite)
+this.display.cursor.className+=" CodeMirror-overwrite";else
+this.display.cursor.className=this.display.cursor.className.replace(" CodeMirror-overwrite","");},hasFocus:function(){return document.activeElement==this.display.input;},scrollTo:operation(null,function(x,y){updateScrollPos(this,x,y);}),getScrollInfo:function(){var scroller=this.display.scroller,co=scrollerCutOff;return{left:scroller.scrollLeft,top:scroller.scrollTop,height:scroller.scrollHeight-co,width:scroller.scrollWidth-co,clientHeight:scroller.clientHeight-co,clientWidth:scroller.clientWidth-co};},scrollIntoView:operation(null,function(range,margin){if(range==null)range={from:this.doc.sel.head,to:null};else if(typeof range=="number")range={from:Pos(range,0),to:null};else if(range.from==null)range={from:range,to:null};if(!range.to)range.to=range.from;if(!margin)margin=0;var coords=range;if(range.from.line!=null){this.curOp.scrollToPos={from:range.from,to:range.to,margin:margin};coords={from:cursorCoords(this,range.from),to:cursorCoords(this,range.to)};}
+var sPos=calculateScrollPos(this,Math.min(coords.from.left,coords.to.left),Math.min(coords.from.top,coords.to.top)-margin,Math.max(coords.from.right,coords.to.right),Math.max(coords.from.bottom,coords.to.bottom)+margin);updateScrollPos(this,sPos.scrollLeft,sPos.scrollTop);}),setSize:operation(null,function(width,height){function interpret(val){return typeof val=="number"||/^\d+$/.test(String(val))?val+"px":val;}
+if(width!=null)this.display.wrapper.style.width=interpret(width);if(height!=null)this.display.wrapper.style.height=interpret(height);if(this.options.lineWrapping)
+this.display.measureLineCache.length=this.display.measureLineCachePos=0;this.curOp.forceUpdate=true;signal(this,"refresh",this);}),operation:function(f){return runInOp(this,f);},refresh:operation(null,function(){var oldHeight=this.display.cachedTextHeight;clearCaches(this);updateScrollPos(this,this.doc.scrollLeft,this.doc.scrollTop);regChange(this);if(oldHeight==null||Math.abs(oldHeight-textHeight(this.display))>.5)
+estimateLineHeights(this);signal(this,"refresh",this);}),swapDoc:operation(null,function(doc){var old=this.doc;old.cm=null;attachDoc(this,doc);clearCaches(this);resetInput(this,true);updateScrollPos(this,doc.scrollLeft,doc.scrollTop);signalLater(this,"swapDoc",this,old);return old;}),getInputField:function(){return this.display.input;},getWrapperElement:function(){return this.display.wrapper;},getScrollerElement:function(){return this.display.scroller;},getGutterElement:function(){return this.display.gutters;}};eventMixin(CodeMirror);var optionHandlers=CodeMirror.optionHandlers={};var defaults=CodeMirror.defaults={};function option(name,deflt,handle,notOnInit){CodeMirror.defaults[name]=deflt;if(handle)optionHandlers[name]=notOnInit?function(cm,val,old){if(old!=Init)handle(cm,val,old);}:handle;}
+var Init=CodeMirror.Init={toString:function(){return"CodeMirror.Init";}};option("value","",function(cm,val){cm.setValue(val);},true);option("mode",null,function(cm,val){cm.doc.modeOption=val;loadMode(cm);},true);option("indentUnit",2,loadMode,true);option("indentWithTabs",false);option("smartIndent",true);option("tabSize",4,function(cm){resetModeState(cm);clearCaches(cm);regChange(cm);},true);option("specialChars",/[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\ufeff]/g,function(cm,val){cm.options.specialChars=new RegExp(val.source+(val.test("\t")?"":"|\t"),"g");cm.refresh();},true);option("specialCharPlaceholder",defaultSpecialCharPlaceholder,function(cm){cm.refresh();},true);option("electricChars",true);option("rtlMoveVisually",!windows);option("wholeLineUpdateBefore",true);option("theme","default",function(cm){themeChanged(cm);guttersChanged(cm);},true);option("keyMap","default",keyMapChanged);option("extraKeys",null);option("onKeyEvent",null);option("onDragEvent",null);option("lineWrapping",false,wrappingChanged,true);option("gutters",[],function(cm){setGuttersForLineNumbers(cm.options);guttersChanged(cm);},true);option("fixedGutter",true,function(cm,val){cm.display.gutters.style.left=val?compensateForHScroll(cm.display)+"px":"0";cm.refresh();},true);option("coverGutterNextToScrollbar",false,updateScrollbars,true);option("lineNumbers",false,function(cm){setGuttersForLineNumbers(cm.options);guttersChanged(cm);},true);option("firstLineNumber",1,guttersChanged,true);option("lineNumberFormatter",function(integer){return integer;},guttersChanged,true);option("showCursorWhenSelecting",false,updateSelection,true);option("resetSelectionOnContextMenu",true);option("readOnly",false,function(cm,val){if(val=="nocursor"){onBlur(cm);cm.display.input.blur();cm.display.disabled=true;}else{cm.display.disabled=false;if(!val)resetInput(cm,true);}});option("disableInput",false,function(cm,val){if(!val)resetInput(cm,true);},true);option("dragDrop",true);option("cursorBlinkRate",530);option("cursorScrollMargin",0);option("cursorHeight",1);option("workTime",100);option("workDelay",100);option("flattenSpans",true,resetModeState,true);option("addModeClass",false,resetModeState,true);option("pollInterval",100);option("undoDepth",40,function(cm,val){cm.doc.history.undoDepth=val;});option("historyEventDelay",500);option("viewportMargin",10,function(cm){cm.refresh();},true);option("maxHighlightLength",10000,resetModeState,true);option("crudeMeasuringFrom",10000);option("moveInputWithCursor",true,function(cm,val){if(!val)cm.display.inputDiv.style.top=cm.display.inputDiv.style.left=0;});option("tabindex",null,function(cm,val){cm.display.input.tabIndex=val||"";});option("autofocus",null);var modes=CodeMirror.modes={},mimeModes=CodeMirror.mimeModes={};CodeMirror.defineMode=function(name,mode){if(!CodeMirror.defaults.mode&&name!="null")CodeMirror.defaults.mode=name;if(arguments.length>2){mode.dependencies=[];for(var i=2;i<arguments.length;++i)mode.dependencies.push(arguments[i]);}
+modes[name]=mode;};CodeMirror.defineMIME=function(mime,spec){mimeModes[mime]=spec;};CodeMirror.resolveMode=function(spec){if(typeof spec=="string"&&mimeModes.hasOwnProperty(spec)){spec=mimeModes[spec];}else if(spec&&typeof spec.name=="string"&&mimeModes.hasOwnProperty(spec.name)){var found=mimeModes[spec.name];spec=createObj(found,spec);spec.name=found.name;}else if(typeof spec=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(spec)){return CodeMirror.resolveMode("application/xml");}
+if(typeof spec=="string")return{name:spec};else return spec||{name:"null"};};CodeMirror.getMode=function(options,spec){var spec=CodeMirror.resolveMode(spec);var mfactory=modes[spec.name];if(!mfactory)return CodeMirror.getMode(options,"text/plain");var modeObj=mfactory(options,spec);if(modeExtensions.hasOwnProperty(spec.name)){var exts=modeExtensions[spec.name];for(var prop in exts){if(!exts.hasOwnProperty(prop))continue;if(modeObj.hasOwnProperty(prop))modeObj["_"+prop]=modeObj[prop];modeObj[prop]=exts[prop];}}
+modeObj.name=spec.name;if(spec.helperType)modeObj.helperType=spec.helperType;if(spec.modeProps)for(var prop in spec.modeProps)
+modeObj[prop]=spec.modeProps[prop];return modeObj;};CodeMirror.defineMode("null",function(){return{token:function(stream){stream.skipToEnd();}};});CodeMirror.defineMIME("text/plain","null");var modeExtensions=CodeMirror.modeExtensions={};CodeMirror.extendMode=function(mode,properties){var exts=modeExtensions.hasOwnProperty(mode)?modeExtensions[mode]:(modeExtensions[mode]={});copyObj(properties,exts);};CodeMirror.defineExtension=function(name,func){CodeMirror.prototype[name]=func;};CodeMirror.defineDocExtension=function(name,func){Doc.prototype[name]=func;};CodeMirror.defineOption=option;var initHooks=[];CodeMirror.defineInitHook=function(f){initHooks.push(f);};var helpers=CodeMirror.helpers={};CodeMirror.registerHelper=function(type,name,value){if(!helpers.hasOwnProperty(type))helpers[type]=CodeMirror[type]={_global:[]};helpers[type][name]=value;};CodeMirror.registerGlobalHelper=function(type,name,predicate,value){CodeMirror.registerHelper(type,name,value);helpers[type]._global.push({pred:predicate,val:value});};CodeMirror.isWordChar=isWordChar;function copyState(mode,state){if(state===true)return state;if(mode.copyState)return mode.copyState(state);var nstate={};for(var n in state){var val=state[n];if(val instanceof Array)val=val.concat([]);nstate[n]=val;}
+return nstate;}
+CodeMirror.copyState=copyState;function startState(mode,a1,a2){return mode.startState?mode.startState(a1,a2):true;}
+CodeMirror.startState=startState;CodeMirror.innerMode=function(mode,state){while(mode.innerMode){var info=mode.innerMode(state);if(!info||info.mode==mode)break;state=info.state;mode=info.mode;}
+return info||{mode:mode,state:state};};var commands=CodeMirror.commands={selectAll:function(cm){cm.setSelection(Pos(cm.firstLine(),0),Pos(cm.lastLine()));},killLine:function(cm){var from=cm.getCursor(true),to=cm.getCursor(false),sel=!posEq(from,to);if(!sel&&cm.getLine(from.line).length==from.ch)
+cm.replaceRange("",from,Pos(from.line+1,0),"+delete");else cm.replaceRange("",from,sel?to:Pos(from.line),"+delete");},deleteLine:function(cm){var l=cm.getCursor().line;cm.replaceRange("",Pos(l,0),Pos(l),"+delete");},delLineLeft:function(cm){var cur=cm.getCursor();cm.replaceRange("",Pos(cur.line,0),cur,"+delete");},undo:function(cm){cm.undo();},redo:function(cm){cm.redo();},goDocStart:function(cm){cm.extendSelection(Pos(cm.firstLine(),0));},goDocEnd:function(cm){cm.extendSelection(Pos(cm.lastLine()));},goLineStart:function(cm){cm.extendSelection(lineStart(cm,cm.getCursor().line));},goLineStartSmart:function(cm){var cur=cm.getCursor(),start=lineStart(cm,cur.line);var line=cm.getLineHandle(start.line);var order=getOrder(line);if(!order||order[0].level==0){var firstNonWS=Math.max(0,line.text.search(/\S/));var inWS=cur.line==start.line&&cur.ch<=firstNonWS&&cur.ch;cm.extendSelection(Pos(start.line,inWS?0:firstNonWS));}else cm.extendSelection(start);},goLineEnd:function(cm){cm.extendSelection(lineEnd(cm,cm.getCursor().line));},goLineRight:function(cm){var top=cm.charCoords(cm.getCursor(),"div").top+5;cm.extendSelection(cm.coordsChar({left:cm.display.lineDiv.offsetWidth+100,top:top},"div"));},goLineLeft:function(cm){var top=cm.charCoords(cm.getCursor(),"div").top+5;cm.extendSelection(cm.coordsChar({left:0,top:top},"div"));},goLineUp:function(cm){cm.moveV(-1,"line");},goLineDown:function(cm){cm.moveV(1,"line");},goPageUp:function(cm){cm.moveV(-1,"page");},goPageDown:function(cm){cm.moveV(1,"page");},goCharLeft:function(cm){cm.moveH(-1,"char");},goCharRight:function(cm){cm.moveH(1,"char");},goColumnLeft:function(cm){cm.moveH(-1,"column");},goColumnRight:function(cm){cm.moveH(1,"column");},goWordLeft:function(cm){cm.moveH(-1,"word");},goGroupRight:function(cm){cm.moveH(1,"group");},goGroupLeft:function(cm){cm.moveH(-1,"group");},goWordRight:function(cm){cm.moveH(1,"word");},delCharBefore:function(cm){cm.deleteH(-1,"char");},delCharAfter:function(cm){cm.deleteH(1,"char");},delWordBefore:function(cm){cm.deleteH(-1,"word");},delWordAfter:function(cm){cm.deleteH(1,"word");},delGroupBefore:function(cm){cm.deleteH(-1,"group");},delGroupAfter:function(cm){cm.deleteH(1,"group");},indentAuto:function(cm){cm.indentSelection("smart");},indentMore:function(cm){cm.indentSelection("add");},indentLess:function(cm){cm.indentSelection("subtract");},insertTab:function(cm){cm.replaceSelection("\t","end","+input");},defaultTab:function(cm){if(cm.somethingSelected())cm.indentSelection("add");else cm.replaceSelection("\t","end","+input");},transposeChars:function(cm){var cur=cm.getCursor(),line=cm.getLine(cur.line);if(cur.ch>0&&cur.ch<line.length-1)
+cm.replaceRange(line.charAt(cur.ch)+line.charAt(cur.ch-1),Pos(cur.line,cur.ch-1),Pos(cur.line,cur.ch+1));},newlineAndIndent:function(cm){operation(cm,function(){cm.replaceSelection("\n","end","+input");cm.indentLine(cm.getCursor().line,null,true);})();},toggleOverwrite:function(cm){cm.toggleOverwrite();}};var keyMap=CodeMirror.keyMap={};keyMap.basic={"Left":"goCharLeft","Right":"goCharRight","Up":"goLineUp","Down":"goLineDown","End":"goLineEnd","Home":"goLineStartSmart","PageUp":"goPageUp","PageDown":"goPageDown","Delete":"delCharAfter","Backspace":"delCharBefore","Shift-Backspace":"delCharBefore","Tab":"defaultTab","Shift-Tab":"indentAuto","Enter":"newlineAndIndent","Insert":"toggleOverwrite"};keyMap.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Alt-Up":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Down":"goDocEnd","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore",fallthrough:"basic"};keyMap.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineStart","Cmd-Right":"goLineEnd","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delLineLeft",fallthrough:["basic","emacsy"]};keyMap["default"]=mac?keyMap.macDefault:keyMap.pcDefault;keyMap.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"};function getKeyMap(val){if(typeof val=="string")return keyMap[val];else return val;}
+function lookupKey(name,maps,handle){function lookup(map){map=getKeyMap(map);var found=map[name];if(found===false)return"stop";if(found!=null&&handle(found))return true;if(map.nofallthrough)return"stop";var fallthrough=map.fallthrough;if(fallthrough==null)return false;if(Object.prototype.toString.call(fallthrough)!="[object Array]")
+return lookup(fallthrough);for(var i=0,e=fallthrough.length;i<e;++i){var done=lookup(fallthrough[i]);if(done)return done;}
+return false;}
+for(var i=0;i<maps.length;++i){var done=lookup(maps[i]);if(done)return done!="stop";}}
+function isModifierKey(event){var name=keyNames[event.keyCode];return name=="Ctrl"||name=="Alt"||name=="Shift"||name=="Mod";}
+function keyName(event,noShift){if(opera&&event.keyCode==34&&event["char"])return false;var name=keyNames[event.keyCode];if(name==null||event.altGraphKey)return false;if(event.altKey)name="Alt-"+name;if(flipCtrlCmd?event.metaKey:event.ctrlKey)name="Ctrl-"+name;if(flipCtrlCmd?event.ctrlKey:event.metaKey)name="Cmd-"+name;if(!noShift&&event.shiftKey)name="Shift-"+name;return name;}
+CodeMirror.lookupKey=lookupKey;CodeMirror.isModifierKey=isModifierKey;CodeMirror.keyName=keyName;CodeMirror.fromTextArea=function(textarea,options){if(!options)options={};options.value=textarea.value;if(!options.tabindex&&textarea.tabindex)
+options.tabindex=textarea.tabindex;if(!options.placeholder&&textarea.placeholder)
+options.placeholder=textarea.placeholder;if(options.autofocus==null){var hasFocus=document.body;try{hasFocus=document.activeElement;}catch(e){}
+options.autofocus=hasFocus==textarea||textarea.getAttribute("autofocus")!=null&&hasFocus==document.body;}
+function save(){textarea.value=cm.getValue();}
+if(textarea.form){on(textarea.form,"submit",save);if(!options.leaveSubmitMethodAlone){var form=textarea.form,realSubmit=form.submit;try{var wrappedSubmit=form.submit=function(){save();form.submit=realSubmit;form.submit();form.submit=wrappedSubmit;};}catch(e){}}}
+textarea.style.display="none";var cm=CodeMirror(function(node){textarea.parentNode.insertBefore(node,textarea.nextSibling);},options);cm.save=save;cm.getTextArea=function(){return textarea;};cm.toTextArea=function(){save();textarea.parentNode.removeChild(cm.getWrapperElement());textarea.style.display="";if(textarea.form){off(textarea.form,"submit",save);if(typeof textarea.form.submit=="function")
+textarea.form.submit=realSubmit;}};return cm;};function StringStream(string,tabSize){this.pos=this.start=0;this.string=string;this.tabSize=tabSize||8;this.lastColumnPos=this.lastColumnValue=0;this.lineStart=0;}
+StringStream.prototype={eol:function(){return this.pos>=this.string.length;},sol:function(){return this.pos==this.lineStart;},peek:function(){return this.string.charAt(this.pos)||undefined;},next:function(){if(this.pos<this.string.length)
+return this.string.charAt(this.pos++);},eat:function(match){var ch=this.string.charAt(this.pos);if(typeof match=="string")var ok=ch==match;else var ok=ch&&(match.test?match.test(ch):match(ch));if(ok){++this.pos;return ch;}},eatWhile:function(match){var start=this.pos;while(this.eat(match)){}
+return this.pos>start;},eatSpace:function(){var start=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos)))++this.pos;return this.pos>start;},skipToEnd:function(){this.pos=this.string.length;},skipTo:function(ch){var found=this.string.indexOf(ch,this.pos);if(found>-1){this.pos=found;return true;}},backUp:function(n){this.pos-=n;},column:function(){if(this.lastColumnPos<this.start){this.lastColumnValue=countColumn(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue);this.lastColumnPos=this.start;}
+return this.lastColumnValue-(this.lineStart?countColumn(this.string,this.lineStart,this.tabSize):0);},indentation:function(){return countColumn(this.string,null,this.tabSize)-
+(this.lineStart?countColumn(this.string,this.lineStart,this.tabSize):0);},match:function(pattern,consume,caseInsensitive){if(typeof pattern=="string"){var cased=function(str){return caseInsensitive?str.toLowerCase():str;};var substr=this.string.substr(this.pos,pattern.length);if(cased(substr)==cased(pattern)){if(consume!==false)this.pos+=pattern.length;return true;}}else{var match=this.string.slice(this.pos).match(pattern);if(match&&match.index>0)return null;if(match&&consume!==false)this.pos+=match[0].length;return match;}},current:function(){return this.string.slice(this.start,this.pos);},hideFirstChars:function(n,inner){this.lineStart+=n;try{return inner();}
+finally{this.lineStart-=n;}}};CodeMirror.StringStream=StringStream;function TextMarker(doc,type){this.lines=[];this.type=type;this.doc=doc;}
+CodeMirror.TextMarker=TextMarker;eventMixin(TextMarker);TextMarker.prototype.clear=function(){if(this.explicitlyCleared)return;var cm=this.doc.cm,withOp=cm&&!cm.curOp;if(withOp)startOperation(cm);if(hasHandler(this,"clear")){var found=this.find();if(found)signalLater(this,"clear",found.from,found.to);}
+var min=null,max=null;for(var i=0;i<this.lines.length;++i){var line=this.lines[i];var span=getMarkedSpanFor(line.markedSpans,this);if(span.to!=null)max=lineNo(line);line.markedSpans=removeMarkedSpan(line.markedSpans,span);if(span.from!=null)
+min=lineNo(line);else if(this.collapsed&&!lineIsHidden(this.doc,line)&&cm)
+updateLineHeight(line,textHeight(cm.display));}
+if(cm&&this.collapsed&&!cm.options.lineWrapping)for(var i=0;i<this.lines.length;++i){var visual=visualLine(cm.doc,this.lines[i]),len=lineLength(cm.doc,visual);if(len>cm.display.maxLineLength){cm.display.maxLine=visual;cm.display.maxLineLength=len;cm.display.maxLineChanged=true;}}
+if(min!=null&&cm)regChange(cm,min,max+1);this.lines.length=0;this.explicitlyCleared=true;if(this.atomic&&this.doc.cantEdit){this.doc.cantEdit=false;if(cm)reCheckSelection(cm);}
+if(withOp)endOperation(cm);};TextMarker.prototype.find=function(bothSides){var from,to;for(var i=0;i<this.lines.length;++i){var line=this.lines[i];var span=getMarkedSpanFor(line.markedSpans,this);if(span.from!=null||span.to!=null){var found=lineNo(line);if(span.from!=null)from=Pos(found,span.from);if(span.to!=null)to=Pos(found,span.to);}}
+if(this.type=="bookmark"&&!bothSides)return from;return from&&{from:from,to:to};};TextMarker.prototype.changed=function(){var pos=this.find(),cm=this.doc.cm;if(!pos||!cm)return;if(this.type!="bookmark")pos=pos.from;var line=getLine(this.doc,pos.line);clearCachedMeasurement(cm,line);if(pos.line>=cm.display.showingFrom&&pos.line<cm.display.showingTo){for(var node=cm.display.lineDiv.firstChild;node;node=node.nextSibling)if(node.lineObj==line){if(node.offsetHeight!=line.height)updateLineHeight(line,node.offsetHeight);break;}
+runInOp(cm,function(){cm.curOp.selectionChanged=cm.curOp.forceUpdate=cm.curOp.updateMaxLine=true;});}};TextMarker.prototype.attachLine=function(line){if(!this.lines.length&&this.doc.cm){var op=this.doc.cm.curOp;if(!op.maybeHiddenMarkers||indexOf(op.maybeHiddenMarkers,this)==-1)
+(op.maybeUnhiddenMarkers||(op.maybeUnhiddenMarkers=[])).push(this);}
+this.lines.push(line);};TextMarker.prototype.detachLine=function(line){this.lines.splice(indexOf(this.lines,line),1);if(!this.lines.length&&this.doc.cm){var op=this.doc.cm.curOp;(op.maybeHiddenMarkers||(op.maybeHiddenMarkers=[])).push(this);}};var nextMarkerId=0;function markText(doc,from,to,options,type){if(options&&options.shared)return markTextShared(doc,from,to,options,type);if(doc.cm&&!doc.cm.curOp)return operation(doc.cm,markText)(doc,from,to,options,type);var marker=new TextMarker(doc,type);if(options)copyObj(options,marker);if(posLess(to,from)||posEq(from,to)&&marker.clearWhenEmpty!==false)
+return marker;if(marker.replacedWith){marker.collapsed=true;marker.replacedWith=elt("span",[marker.replacedWith],"CodeMirror-widget");if(!options.handleMouseEvents)marker.replacedWith.ignoreEvents=true;}
+if(marker.collapsed){if(conflictingCollapsedRange(doc,from.line,from,to,marker)||from.line!=to.line&&conflictingCollapsedRange(doc,to.line,from,to,marker))
+throw new Error("Inserting collapsed marker partially overlapping an existing one");sawCollapsedSpans=true;}
+if(marker.addToHistory)
+addToHistory(doc,{from:from,to:to,origin:"markText"},{head:doc.sel.head,anchor:doc.sel.anchor},NaN);var curLine=from.line,cm=doc.cm,updateMaxLine;doc.iter(curLine,to.line+1,function(line){if(cm&&marker.collapsed&&!cm.options.lineWrapping&&visualLine(doc,line)==cm.display.maxLine)
+updateMaxLine=true;var span={from:null,to:null,marker:marker};if(curLine==from.line)span.from=from.ch;if(curLine==to.line)span.to=to.ch;if(marker.collapsed&&curLine!=from.line)updateLineHeight(line,0);addMarkedSpan(line,span);++curLine;});if(marker.collapsed)doc.iter(from.line,to.line+1,function(line){if(lineIsHidden(doc,line))updateLineHeight(line,0);});if(marker.clearOnEnter)on(marker,"beforeCursorEnter",function(){marker.clear();});if(marker.readOnly){sawReadOnlySpans=true;if(doc.history.done.length||doc.history.undone.length)
+doc.clearHistory();}
+if(marker.collapsed){marker.id=++nextMarkerId;marker.atomic=true;}
+if(cm){if(updateMaxLine)cm.curOp.updateMaxLine=true;if(marker.className||marker.title||marker.startStyle||marker.endStyle||marker.collapsed)
+regChange(cm,from.line,to.line+1);if(marker.atomic)reCheckSelection(cm);}
+return marker;}
+function SharedTextMarker(markers,primary){this.markers=markers;this.primary=primary;for(var i=0,me=this;i<markers.length;++i){markers[i].parent=this;on(markers[i],"clear",function(){me.clear();});}}
+CodeMirror.SharedTextMarker=SharedTextMarker;eventMixin(SharedTextMarker);SharedTextMarker.prototype.clear=function(){if(this.explicitlyCleared)return;this.explicitlyCleared=true;for(var i=0;i<this.markers.length;++i)
+this.markers[i].clear();signalLater(this,"clear");};SharedTextMarker.prototype.find=function(){return this.primary.find();};function markTextShared(doc,from,to,options,type){options=copyObj(options);options.shared=false;var markers=[markText(doc,from,to,options,type)],primary=markers[0];var widget=options.replacedWith;linkedDocs(doc,function(doc){if(widget)options.replacedWith=widget.cloneNode(true);markers.push(markText(doc,clipPos(doc,from),clipPos(doc,to),options,type));for(var i=0;i<doc.linked.length;++i)
+if(doc.linked[i].isParent)return;primary=lst(markers);});return new SharedTextMarker(markers,primary);}
+function getMarkedSpanFor(spans,marker){if(spans)for(var i=0;i<spans.length;++i){var span=spans[i];if(span.marker==marker)return span;}}
+function removeMarkedSpan(spans,span){for(var r,i=0;i<spans.length;++i)
+if(spans[i]!=span)(r||(r=[])).push(spans[i]);return r;}
+function addMarkedSpan(line,span){line.markedSpans=line.markedSpans?line.markedSpans.concat([span]):[span];span.marker.attachLine(line);}
+function markedSpansBefore(old,startCh,isInsert){if(old)for(var i=0,nw;i<old.length;++i){var span=old[i],marker=span.marker;var startsBefore=span.from==null||(marker.inclusiveLeft?span.from<=startCh:span.from<startCh);if(startsBefore||span.from==startCh&&marker.type=="bookmark"&&(!isInsert||!span.marker.insertLeft)){var endsAfter=span.to==null||(marker.inclusiveRight?span.to>=startCh:span.to>startCh);(nw||(nw=[])).push({from:span.from,to:endsAfter?null:span.to,marker:marker});}}
+return nw;}
+function markedSpansAfter(old,endCh,isInsert){if(old)for(var i=0,nw;i<old.length;++i){var span=old[i],marker=span.marker;var endsAfter=span.to==null||(marker.inclusiveRight?span.to>=endCh:span.to>endCh);if(endsAfter||span.from==endCh&&marker.type=="bookmark"&&(!isInsert||span.marker.insertLeft)){var startsBefore=span.from==null||(marker.inclusiveLeft?span.from<=endCh:span.from<endCh);(nw||(nw=[])).push({from:startsBefore?null:span.from-endCh,to:span.to==null?null:span.to-endCh,marker:marker});}}
+return nw;}
+function stretchSpansOverChange(doc,change){var oldFirst=isLine(doc,change.from.line)&&getLine(doc,change.from.line).markedSpans;var oldLast=isLine(doc,change.to.line)&&getLine(doc,change.to.line).markedSpans;if(!oldFirst&&!oldLast)return null;var startCh=change.from.ch,endCh=change.to.ch,isInsert=posEq(change.from,change.to);var first=markedSpansBefore(oldFirst,startCh,isInsert);var last=markedSpansAfter(oldLast,endCh,isInsert);var sameLine=change.text.length==1,offset=lst(change.text).length+(sameLine?startCh:0);if(first){for(var i=0;i<first.length;++i){var span=first[i];if(span.to==null){var found=getMarkedSpanFor(last,span.marker);if(!found)span.to=startCh;else if(sameLine)span.to=found.to==null?null:found.to+offset;}}}
+if(last){for(var i=0;i<last.length;++i){var span=last[i];if(span.to!=null)span.to+=offset;if(span.from==null){var found=getMarkedSpanFor(first,span.marker);if(!found){span.from=offset;if(sameLine)(first||(first=[])).push(span);}}else{span.from+=offset;if(sameLine)(first||(first=[])).push(span);}}}
+if(first)first=clearEmptySpans(first);if(last&&last!=first)last=clearEmptySpans(last);var newMarkers=[first];if(!sameLine){var gap=change.text.length-2,gapMarkers;if(gap>0&&first)
+for(var i=0;i<first.length;++i)
+if(first[i].to==null)
+(gapMarkers||(gapMarkers=[])).push({from:null,to:null,marker:first[i].marker});for(var i=0;i<gap;++i)
+newMarkers.push(gapMarkers);newMarkers.push(last);}
+return newMarkers;}
+function clearEmptySpans(spans){for(var i=0;i<spans.length;++i){var span=spans[i];if(span.from!=null&&span.from==span.to&&span.marker.clearWhenEmpty!==false)
+spans.splice(i--,1);}
+if(!spans.length)return null;return spans;}
+function mergeOldSpans(doc,change){var old=getOldSpans(doc,change);var stretched=stretchSpansOverChange(doc,change);if(!old)return stretched;if(!stretched)return old;for(var i=0;i<old.length;++i){var oldCur=old[i],stretchCur=stretched[i];if(oldCur&&stretchCur){spans:for(var j=0;j<stretchCur.length;++j){var span=stretchCur[j];for(var k=0;k<oldCur.length;++k)
+if(oldCur[k].marker==span.marker)continue spans;oldCur.push(span);}}else if(stretchCur){old[i]=stretchCur;}}
+return old;}
+function removeReadOnlyRanges(doc,from,to){var markers=null;doc.iter(from.line,to.line+1,function(line){if(line.markedSpans)for(var i=0;i<line.markedSpans.length;++i){var mark=line.markedSpans[i].marker;if(mark.readOnly&&(!markers||indexOf(markers,mark)==-1))
+(markers||(markers=[])).push(mark);}});if(!markers)return null;var parts=[{from:from,to:to}];for(var i=0;i<markers.length;++i){var mk=markers[i],m=mk.find();for(var j=0;j<parts.length;++j){var p=parts[j];if(posLess(p.to,m.from)||posLess(m.to,p.from))continue;var newParts=[j,1];if(posLess(p.from,m.from)||!mk.inclusiveLeft&&posEq(p.from,m.from))
+newParts.push({from:p.from,to:m.from});if(posLess(m.to,p.to)||!mk.inclusiveRight&&posEq(p.to,m.to))
+newParts.push({from:m.to,to:p.to});parts.splice.apply(parts,newParts);j+=newParts.length-1;}}
+return parts;}
+function extraLeft(marker){return marker.inclusiveLeft?-1:0;}
+function extraRight(marker){return marker.inclusiveRight?1:0;}
+function compareCollapsedMarkers(a,b){var lenDiff=a.lines.length-b.lines.length;if(lenDiff!=0)return lenDiff;var aPos=a.find(),bPos=b.find();var fromCmp=cmp(aPos.from,bPos.from)||extraLeft(a)-extraLeft(b);if(fromCmp)return-fromCmp;var toCmp=cmp(aPos.to,bPos.to)||extraRight(a)-extraRight(b);if(toCmp)return toCmp;return b.id-a.id;}
+function collapsedSpanAtSide(line,start){var sps=sawCollapsedSpans&&line.markedSpans,found;if(sps)for(var sp,i=0;i<sps.length;++i){sp=sps[i];if(sp.marker.collapsed&&(start?sp.from:sp.to)==null&&(!found||compareCollapsedMarkers(found,sp.marker)<0))
+found=sp.marker;}
+return found;}
+function collapsedSpanAtStart(line){return collapsedSpanAtSide(line,true);}
+function collapsedSpanAtEnd(line){return collapsedSpanAtSide(line,false);}
+function conflictingCollapsedRange(doc,lineNo,from,to,marker){var line=getLine(doc,lineNo);var sps=sawCollapsedSpans&&line.markedSpans;if(sps)for(var i=0;i<sps.length;++i){var sp=sps[i];if(!sp.marker.collapsed)continue;var found=sp.marker.find(true);var fromCmp=cmp(found.from,from)||extraLeft(sp.marker)-extraLeft(marker);var toCmp=cmp(found.to,to)||extraRight(sp.marker)-extraRight(marker);if(fromCmp>=0&&toCmp<=0||fromCmp<=0&&toCmp>=0)continue;if(fromCmp<=0&&(cmp(found.to,from)||extraRight(sp.marker)-extraLeft(marker))>0||fromCmp>=0&&(cmp(found.from,to)||extraLeft(sp.marker)-extraRight(marker))<0)
+return true;}}
+function visualLine(doc,line){var merged;while(merged=collapsedSpanAtStart(line))
+line=getLine(doc,merged.find().from.line);return line;}
+function lineIsHidden(doc,line){var sps=sawCollapsedSpans&&line.markedSpans;if(sps)for(var sp,i=0;i<sps.length;++i){sp=sps[i];if(!sp.marker.collapsed)continue;if(sp.from==null)return true;if(sp.marker.replacedWith)continue;if(sp.from==0&&sp.marker.inclusiveLeft&&lineIsHiddenInner(doc,line,sp))
+return true;}}
+function lineIsHiddenInner(doc,line,span){if(span.to==null){var end=span.marker.find().to,endLine=getLine(doc,end.line);return lineIsHiddenInner(doc,endLine,getMarkedSpanFor(endLine.markedSpans,span.marker));}
+if(span.marker.inclusiveRight&&span.to==line.text.length)
+return true;for(var sp,i=0;i<line.markedSpans.length;++i){sp=line.markedSpans[i];if(sp.marker.collapsed&&!sp.marker.replacedWith&&sp.from==span.to&&(sp.to==null||sp.to!=span.from)&&(sp.marker.inclusiveLeft||span.marker.inclusiveRight)&&lineIsHiddenInner(doc,line,sp))return true;}}
+function detachMarkedSpans(line){var spans=line.markedSpans;if(!spans)return;for(var i=0;i<spans.length;++i)
+spans[i].marker.detachLine(line);line.markedSpans=null;}
+function attachMarkedSpans(line,spans){if(!spans)return;for(var i=0;i<spans.length;++i)
+spans[i].marker.attachLine(line);line.markedSpans=spans;}
+var LineWidget=CodeMirror.LineWidget=function(cm,node,options){if(options)for(var opt in options)if(options.hasOwnProperty(opt))
+this[opt]=options[opt];this.cm=cm;this.node=node;};eventMixin(LineWidget);function widgetOperation(f){return function(){var withOp=!this.cm.curOp;if(withOp)startOperation(this.cm);try{var result=f.apply(this,arguments);}
+finally{if(withOp)endOperation(this.cm);}
+return result;};}
+LineWidget.prototype.clear=widgetOperation(function(){var ws=this.line.widgets,no=lineNo(this.line);if(no==null||!ws)return;for(var i=0;i<ws.length;++i)if(ws[i]==this)ws.splice(i--,1);if(!ws.length)this.line.widgets=null;var aboveVisible=heightAtLine(this.cm,this.line)<this.cm.doc.scrollTop;updateLineHeight(this.line,Math.max(0,this.line.height-widgetHeight(this)));if(aboveVisible)addToScrollPos(this.cm,0,-this.height);regChange(this.cm,no,no+1);});LineWidget.prototype.changed=widgetOperation(function(){var oldH=this.height;this.height=null;var diff=widgetHeight(this)-oldH;if(!diff)return;updateLineHeight(this.line,this.line.height+diff);var no=lineNo(this.line);regChange(this.cm,no,no+1);});function widgetHeight(widget){if(widget.height!=null)return widget.height;if(!widget.node.parentNode||widget.node.parentNode.nodeType!=1)
+removeChildrenAndAdd(widget.cm.display.measure,elt("div",[widget.node],null,"position: relative"));return widget.height=widget.node.offsetHeight;}
+function addLineWidget(cm,handle,node,options){var widget=new LineWidget(cm,node,options);if(widget.noHScroll)cm.display.alignWidgets=true;changeLine(cm,handle,function(line){var widgets=line.widgets||(line.widgets=[]);if(widget.insertAt==null)widgets.push(widget);else widgets.splice(Math.min(widgets.length-1,Math.max(0,widget.insertAt)),0,widget);widget.line=line;if(!lineIsHidden(cm.doc,line)||widget.showIfHidden){var aboveVisible=heightAtLine(cm,line)<cm.doc.scrollTop;updateLineHeight(line,line.height+widgetHeight(widget));if(aboveVisible)addToScrollPos(cm,0,widget.height);}
+return true;});return widget;}
+var Line=CodeMirror.Line=function(text,markedSpans,estimateHeight){this.text=text;attachMarkedSpans(this,markedSpans);this.height=estimateHeight?estimateHeight(this):1;};eventMixin(Line);Line.prototype.lineNo=function(){return lineNo(this);};function updateLine(line,text,markedSpans,estimateHeight){line.text=text;if(line.stateAfter)line.stateAfter=null;if(line.styles)line.styles=null;if(line.order!=null)line.order=null;detachMarkedSpans(line);attachMarkedSpans(line,markedSpans);var estHeight=estimateHeight?estimateHeight(line):1;if(estHeight!=line.height)updateLineHeight(line,estHeight);}
+function cleanUpLine(line){line.parent=null;detachMarkedSpans(line);}
+function runMode(cm,text,mode,state,f,forceToEnd){var flattenSpans=mode.flattenSpans;if(flattenSpans==null)flattenSpans=cm.options.flattenSpans;var curStart=0,curStyle=null;var stream=new StringStream(text,cm.options.tabSize),style;if(text==""&&mode.blankLine)mode.blankLine(state);while(!stream.eol()){if(stream.pos>cm.options.maxHighlightLength){flattenSpans=false;if(forceToEnd)processLine(cm,text,state,stream.pos);stream.pos=text.length;style=null;}else{style=mode.token(stream,state);}
+if(cm.options.addModeClass){var mName=CodeMirror.innerMode(mode,state).mode.name;if(mName)style="m-"+(style?mName+" "+style:mName);}
+if(!flattenSpans||curStyle!=style){if(curStart<stream.start)f(stream.start,curStyle);curStart=stream.start;curStyle=style;}
+stream.start=stream.pos;}
+while(curStart<stream.pos){var pos=Math.min(stream.pos,curStart+50000);f(pos,curStyle);curStart=pos;}}
+function highlightLine(cm,line,state,forceToEnd){var st=[cm.state.modeGen];runMode(cm,line.text,cm.doc.mode,state,function(end,style){st.push(end,style);},forceToEnd);for(var o=0;o<cm.state.overlays.length;++o){var overlay=cm.state.overlays[o],i=1,at=0;runMode(cm,line.text,overlay.mode,true,function(end,style){var start=i;while(at<end){var i_end=st[i];if(i_end>end)
+st.splice(i,1,end,st[i+1],i_end);i+=2;at=Math.min(end,i_end);}
+if(!style)return;if(overlay.opaque){st.splice(start,i-start,end,style);i=start+2;}else{for(;start<i;start+=2){var cur=st[start+1];st[start+1]=cur?cur+" "+style:style;}}});}
+return st;}
+function getLineStyles(cm,line){if(!line.styles||line.styles[0]!=cm.state.modeGen)
+line.styles=highlightLine(cm,line,line.stateAfter=getStateBefore(cm,lineNo(line)));return line.styles;}
+function processLine(cm,text,state,startAt){var mode=cm.doc.mode;var stream=new StringStream(text,cm.options.tabSize);stream.start=stream.pos=startAt||0;if(text==""&&mode.blankLine)mode.blankLine(state);while(!stream.eol()&&stream.pos<=cm.options.maxHighlightLength){mode.token(stream,state);stream.start=stream.pos;}}
+var styleToClassCache={},styleToClassCacheWithMode={};function interpretTokenStyle(style,builder){if(!style)return null;for(;;){var lineClass=style.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!lineClass)break;style=style.slice(0,lineClass.index)+style.slice(lineClass.index+lineClass[0].length);var prop=lineClass[1]?"bgClass":"textClass";if(builder[prop]==null)
+builder[prop]=lineClass[2];else if(!(new RegExp("(?:^|\s)"+lineClass[2]+"(?:$|\s)")).test(builder[prop]))
+builder[prop]+=" "+lineClass[2];}
+if(/^\s*$/.test(style))return null;var cache=builder.cm.options.addModeClass?styleToClassCacheWithMode:styleToClassCache;return cache[style]||(cache[style]=style.replace(/\S+/g,"cm-$&"));}
+function buildLineContent(cm,realLine,measure,copyWidgets){var merged,line=realLine,empty=true;while(merged=collapsedSpanAtStart(line))
+line=getLine(cm.doc,merged.find().from.line);var builder={pre:elt("pre"),col:0,pos:0,measure:null,measuredSomething:false,cm:cm,copyWidgets:copyWidgets};do{if(line.text)empty=false;builder.measure=line==realLine&&measure;builder.pos=0;builder.addToken=builder.measure?buildTokenMeasure:buildToken;if((old_ie||webkit)&&cm.getOption("lineWrapping"))
+builder.addToken=buildTokenSplitSpaces(builder.addToken);var next=insertLineContent(line,builder,getLineStyles(cm,line));if(measure&&line==realLine&&!builder.measuredSomething){measure[0]=builder.pre.appendChild(zeroWidthElement(cm.display.measure));builder.measuredSomething=true;}
+if(next)line=getLine(cm.doc,next.to.line);}while(next);if(measure&&!builder.measuredSomething&&!measure[0])
+measure[0]=builder.pre.appendChild(empty?elt("span","\u00a0"):zeroWidthElement(cm.display.measure));if(!builder.pre.firstChild&&!lineIsHidden(cm.doc,realLine))
+builder.pre.appendChild(document.createTextNode("\u00a0"));var order;if(measure&&ie&&(order=getOrder(line))){var l=order.length-1;if(order[l].from==order[l].to)--l;var last=order[l],prev=order[l-1];if(last.from+1==last.to&&prev&&last.level<prev.level){var span=measure[builder.pos-1];if(span)span.parentNode.insertBefore(span.measureRight=zeroWidthElement(cm.display.measure),span.nextSibling);}}
+var textClass=builder.textClass?builder.textClass+" "+(realLine.textClass||""):realLine.textClass;if(textClass)builder.pre.className=textClass;signal(cm,"renderLine",cm,realLine,builder.pre);return builder;}
+function defaultSpecialCharPlaceholder(ch){var token=elt("span","\u2022","cm-invalidchar");token.title="\\u"+ch.charCodeAt(0).toString(16);return token;}
+function buildToken(builder,text,style,startStyle,endStyle,title){if(!text)return;var special=builder.cm.options.specialChars;if(!special.test(text)){builder.col+=text.length;var content=document.createTextNode(text);}else{var content=document.createDocumentFragment(),pos=0;while(true){special.lastIndex=pos;var m=special.exec(text);var skipped=m?m.index-pos:text.length-pos;if(skipped){content.appendChild(document.createTextNode(text.slice(pos,pos+skipped)));builder.col+=skipped;}
+if(!m)break;pos+=skipped+1;if(m[0]=="\t"){var tabSize=builder.cm.options.tabSize,tabWidth=tabSize-builder.col%tabSize;content.appendChild(elt("span",spaceStr(tabWidth),"cm-tab"));builder.col+=tabWidth;}else{var token=builder.cm.options.specialCharPlaceholder(m[0]);content.appendChild(token);builder.col+=1;}}}
+if(style||startStyle||endStyle||builder.measure){var fullStyle=style||"";if(startStyle)fullStyle+=startStyle;if(endStyle)fullStyle+=endStyle;var token=elt("span",[content],fullStyle);if(title)token.title=title;return builder.pre.appendChild(token);}
+builder.pre.appendChild(content);}
+function buildTokenMeasure(builder,text,style,startStyle,endStyle){var wrapping=builder.cm.options.lineWrapping;for(var i=0;i<text.length;++i){var start=i==0,to=i+1;while(to<text.length&&isExtendingChar(text.charAt(to)))++to;var ch=text.slice(i,to);i=to-1;if(i&&wrapping&&spanAffectsWrapping(text,i))
+builder.pre.appendChild(elt("wbr"));var old=builder.measure[builder.pos];var span=builder.measure[builder.pos]=buildToken(builder,ch,style,start&&startStyle,i==text.length-1&&endStyle);if(old)span.leftSide=old.leftSide||old;if(old_ie&&wrapping&&ch==" "&&i&&!/\s/.test(text.charAt(i-1))&&i<text.length-1&&!/\s/.test(text.charAt(i+1)))
+span.style.whiteSpace="normal";builder.pos+=ch.length;}
+if(text.length)builder.measuredSomething=true;}
+function buildTokenSplitSpaces(inner){function split(old){var out=" ";for(var i=0;i<old.length-2;++i)out+=i%2?" ":"\u00a0";out+=" ";return out;}
+return function(builder,text,style,startStyle,endStyle,title){return inner(builder,text.replace(/ {3,}/g,split),style,startStyle,endStyle,title);};}
+function buildCollapsedSpan(builder,size,marker,ignoreWidget){var widget=!ignoreWidget&&marker.replacedWith;if(widget){if(builder.copyWidgets)widget=widget.cloneNode(true);builder.pre.appendChild(widget);if(builder.measure){if(size){builder.measure[builder.pos]=widget;}else{var elt=zeroWidthElement(builder.cm.display.measure);if(marker.type=="bookmark"&&!marker.insertLeft)
+builder.measure[builder.pos]=builder.pre.appendChild(elt);else if(builder.measure[builder.pos])
+return;else
+builder.measure[builder.pos]=builder.pre.insertBefore(elt,widget);}
+builder.measuredSomething=true;}}
+builder.pos+=size;}
+function insertLineContent(line,builder,styles){var spans=line.markedSpans,allText=line.text,at=0;if(!spans){for(var i=1;i<styles.length;i+=2)
+builder.addToken(builder,allText.slice(at,at=styles[i]),interpretTokenStyle(styles[i+1],builder));return;}
+var len=allText.length,pos=0,i=1,text="",style;var nextChange=0,spanStyle,spanEndStyle,spanStartStyle,title,collapsed;for(;;){if(nextChange==pos){spanStyle=spanEndStyle=spanStartStyle=title="";collapsed=null;nextChange=Infinity;var foundBookmarks=[];for(var j=0;j<spans.length;++j){var sp=spans[j],m=sp.marker;if(sp.from<=pos&&(sp.to==null||sp.to>pos)){if(sp.to!=null&&nextChange>sp.to){nextChange=sp.to;spanEndStyle="";}
+if(m.className)spanStyle+=" "+m.className;if(m.startStyle&&sp.from==pos)spanStartStyle+=" "+m.startStyle;if(m.endStyle&&sp.to==nextChange)spanEndStyle+=" "+m.endStyle;if(m.title&&!title)title=m.title;if(m.collapsed&&(!collapsed||compareCollapsedMarkers(collapsed.marker,m)<0))
+collapsed=sp;}else if(sp.from>pos&&nextChange>sp.from){nextChange=sp.from;}
+if(m.type=="bookmark"&&sp.from==pos&&m.replacedWith)foundBookmarks.push(m);}
+if(collapsed&&(collapsed.from||0)==pos){buildCollapsedSpan(builder,(collapsed.to==null?len:collapsed.to)-pos,collapsed.marker,collapsed.from==null);if(collapsed.to==null)return collapsed.marker.find();}
+if(!collapsed&&foundBookmarks.length)for(var j=0;j<foundBookmarks.length;++j)
+buildCollapsedSpan(builder,0,foundBookmarks[j]);}
+if(pos>=len)break;var upto=Math.min(len,nextChange);while(true){if(text){var end=pos+text.length;if(!collapsed){var tokenText=end>upto?text.slice(0,upto-pos):text;builder.addToken(builder,tokenText,style?style+spanStyle:spanStyle,spanStartStyle,pos+tokenText.length==nextChange?spanEndStyle:"",title);}
+if(end>=upto){text=text.slice(upto-pos);pos=upto;break;}
+pos=end;spanStartStyle="";}
+text=allText.slice(at,at=styles[i++]);style=interpretTokenStyle(styles[i++],builder);}}}
+function updateDoc(doc,change,markedSpans,selAfter,estimateHeight){function spansFor(n){return markedSpans?markedSpans[n]:null;}
+function update(line,text,spans){updateLine(line,text,spans,estimateHeight);signalLater(line,"change",line,change);}
+var from=change.from,to=change.to,text=change.text;var firstLine=getLine(doc,from.line),lastLine=getLine(doc,to.line);var lastText=lst(text),lastSpans=spansFor(text.length-1),nlines=to.line-from.line;if(from.ch==0&&to.ch==0&&lastText==""&&(!doc.cm||doc.cm.options.wholeLineUpdateBefore)){for(var i=0,e=text.length-1,added=[];i<e;++i)
+added.push(new Line(text[i],spansFor(i),estimateHeight));update(lastLine,lastLine.text,lastSpans);if(nlines)doc.remove(from.line,nlines);if(added.length)doc.insert(from.line,added);}else if(firstLine==lastLine){if(text.length==1){update(firstLine,firstLine.text.slice(0,from.ch)+lastText+firstLine.text.slice(to.ch),lastSpans);}else{for(var added=[],i=1,e=text.length-1;i<e;++i)
+added.push(new Line(text[i],spansFor(i),estimateHeight));added.push(new Line(lastText+firstLine.text.slice(to.ch),lastSpans,estimateHeight));update(firstLine,firstLine.text.slice(0,from.ch)+text[0],spansFor(0));doc.insert(from.line+1,added);}}else if(text.length==1){update(firstLine,firstLine.text.slice(0,from.ch)+text[0]+lastLine.text.slice(to.ch),spansFor(0));doc.remove(from.line+1,nlines);}else{update(firstLine,firstLine.text.slice(0,from.ch)+text[0],spansFor(0));update(lastLine,lastText+lastLine.text.slice(to.ch),lastSpans);for(var i=1,e=text.length-1,added=[];i<e;++i)
+added.push(new Line(text[i],spansFor(i),estimateHeight));if(nlines>1)doc.remove(from.line+1,nlines-1);doc.insert(from.line+1,added);}
+signalLater(doc,"change",doc,change);setSelection(doc,selAfter.anchor,selAfter.head,null,true);}
+function LeafChunk(lines){this.lines=lines;this.parent=null;for(var i=0,e=lines.length,height=0;i<e;++i){lines[i].parent=this;height+=lines[i].height;}
+this.height=height;}
+LeafChunk.prototype={chunkSize:function(){return this.lines.length;},removeInner:function(at,n){for(var i=at,e=at+n;i<e;++i){var line=this.lines[i];this.height-=line.height;cleanUpLine(line);signalLater(line,"delete");}
+this.lines.splice(at,n);},collapse:function(lines){lines.splice.apply(lines,[lines.length,0].concat(this.lines));},insertInner:function(at,lines,height){this.height+=height;this.lines=this.lines.slice(0,at).concat(lines).concat(this.lines.slice(at));for(var i=0,e=lines.length;i<e;++i)lines[i].parent=this;},iterN:function(at,n,op){for(var e=at+n;at<e;++at)
+if(op(this.lines[at]))return true;}};function BranchChunk(children){this.children=children;var size=0,height=0;for(var i=0,e=children.length;i<e;++i){var ch=children[i];size+=ch.chunkSize();height+=ch.height;ch.parent=this;}
+this.size=size;this.height=height;this.parent=null;}
+BranchChunk.prototype={chunkSize:function(){return this.size;},removeInner:function(at,n){this.size-=n;for(var i=0;i<this.children.length;++i){var child=this.children[i],sz=child.chunkSize();if(at<sz){var rm=Math.min(n,sz-at),oldHeight=child.height;child.removeInner(at,rm);this.height-=oldHeight-child.height;if(sz==rm){this.children.splice(i--,1);child.parent=null;}
+if((n-=rm)==0)break;at=0;}else at-=sz;}
+if(this.size-n<25){var lines=[];this.collapse(lines);this.children=[new LeafChunk(lines)];this.children[0].parent=this;}},collapse:function(lines){for(var i=0,e=this.children.length;i<e;++i)this.children[i].collapse(lines);},insertInner:function(at,lines,height){this.size+=lines.length;this.height+=height;for(var i=0,e=this.children.length;i<e;++i){var child=this.children[i],sz=child.chunkSize();if(at<=sz){child.insertInner(at,lines,height);if(child.lines&&child.lines.length>50){while(child.lines.length>50){var spilled=child.lines.splice(child.lines.length-25,25);var newleaf=new LeafChunk(spilled);child.height-=newleaf.height;this.children.splice(i+1,0,newleaf);newleaf.parent=this;}
+this.maybeSpill();}
+break;}
+at-=sz;}},maybeSpill:function(){if(this.children.length<=10)return;var me=this;do{var spilled=me.children.splice(me.children.length-5,5);var sibling=new BranchChunk(spilled);if(!me.parent){var copy=new BranchChunk(me.children);copy.parent=me;me.children=[copy,sibling];me=copy;}else{me.size-=sibling.size;me.height-=sibling.height;var myIndex=indexOf(me.parent.children,me);me.parent.children.splice(myIndex+1,0,sibling);}
+sibling.parent=me.parent;}while(me.children.length>10);me.parent.maybeSpill();},iterN:function(at,n,op){for(var i=0,e=this.children.length;i<e;++i){var child=this.children[i],sz=child.chunkSize();if(at<sz){var used=Math.min(n,sz-at);if(child.iterN(at,used,op))return true;if((n-=used)==0)break;at=0;}else at-=sz;}}};var nextDocId=0;var Doc=CodeMirror.Doc=function(text,mode,firstLine){if(!(this instanceof Doc))return new Doc(text,mode,firstLine);if(firstLine==null)firstLine=0;BranchChunk.call(this,[new LeafChunk([new Line("",null)])]);this.first=firstLine;this.scrollTop=this.scrollLeft=0;this.cantEdit=false;this.history=makeHistory();this.cleanGeneration=1;this.frontier=firstLine;var start=Pos(firstLine,0);this.sel={from:start,to:start,head:start,anchor:start,shift:false,extend:false,goalColumn:null};this.id=++nextDocId;this.modeOption=mode;if(typeof text=="string")text=splitLines(text);updateDoc(this,{from:start,to:start,text:text},null,{head:start,anchor:start});};Doc.prototype=createObj(BranchChunk.prototype,{constructor:Doc,iter:function(from,to,op){if(op)this.iterN(from-this.first,to-from,op);else this.iterN(this.first,this.first+this.size,from);},insert:function(at,lines){var height=0;for(var i=0,e=lines.length;i<e;++i)height+=lines[i].height;this.insertInner(at-this.first,lines,height);},remove:function(at,n){this.removeInner(at-this.first,n);},getValue:function(lineSep){var lines=getLines(this,this.first,this.first+this.size);if(lineSep===false)return lines;return lines.join(lineSep||"\n");},setValue:function(code){var top=Pos(this.first,0),last=this.first+this.size-1;makeChange(this,{from:top,to:Pos(last,getLine(this,last).text.length),text:splitLines(code),origin:"setValue"},{head:top,anchor:top},true);},replaceRange:function(code,from,to,origin){from=clipPos(this,from);to=to?clipPos(this,to):from;replaceRange(this,code,from,to,origin);},getRange:function(from,to,lineSep){var lines=getBetween(this,clipPos(this,from),clipPos(this,to));if(lineSep===false)return lines;return lines.join(lineSep||"\n");},getLine:function(line){var l=this.getLineHandle(line);return l&&l.text;},setLine:function(line,text){if(isLine(this,line))
+replaceRange(this,text,Pos(line,0),clipPos(this,Pos(line)));},removeLine:function(line){if(line)replaceRange(this,"",clipPos(this,Pos(line-1)),clipPos(this,Pos(line)));else replaceRange(this,"",Pos(0,0),clipPos(this,Pos(1,0)));},getLineHandle:function(line){if(isLine(this,line))return getLine(this,line);},getLineNumber:function(line){return lineNo(line);},getLineHandleVisualStart:function(line){if(typeof line=="number")line=getLine(this,line);return visualLine(this,line);},lineCount:function(){return this.size;},firstLine:function(){return this.first;},lastLine:function(){return this.first+this.size-1;},clipPos:function(pos){return clipPos(this,pos);},getCursor:function(start){var sel=this.sel,pos;if(start==null||start=="head")pos=sel.head;else if(start=="anchor")pos=sel.anchor;else if(start=="end"||start===false)pos=sel.to;else pos=sel.from;return copyPos(pos);},somethingSelected:function(){return!posEq(this.sel.head,this.sel.anchor);},setCursor:docOperation(function(line,ch,extend){var pos=clipPos(this,typeof line=="number"?Pos(line,ch||0):line);if(extend)extendSelection(this,pos);else setSelection(this,pos,pos);}),setSelection:docOperation(function(anchor,head,bias){setSelection(this,clipPos(this,anchor),clipPos(this,head||anchor),bias);}),extendSelection:docOperation(function(from,to,bias){extendSelection(this,clipPos(this,from),to&&clipPos(this,to),bias);}),getSelection:function(lineSep){return this.getRange(this.sel.from,this.sel.to,lineSep);},replaceSelection:function(code,collapse,origin){makeChange(this,{from:this.sel.from,to:this.sel.to,text:splitLines(code),origin:origin},collapse||"around");},undo:docOperation(function(){makeChangeFromHistory(this,"undo");}),redo:docOperation(function(){makeChangeFromHistory(this,"redo");}),setExtending:function(val){this.sel.extend=val;},historySize:function(){var hist=this.history;return{undo:hist.done.length,redo:hist.undone.length};},clearHistory:function(){this.history=makeHistory(this.history.maxGeneration);},markClean:function(){this.cleanGeneration=this.changeGeneration(true);},changeGeneration:function(forceSplit){if(forceSplit)
+this.history.lastOp=this.history.lastOrigin=null;return this.history.generation;},isClean:function(gen){return this.history.generation==(gen||this.cleanGeneration);},getHistory:function(){return{done:copyHistoryArray(this.history.done),undone:copyHistoryArray(this.history.undone)};},setHistory:function(histData){var hist=this.history=makeHistory(this.history.maxGeneration);hist.done=histData.done.slice(0);hist.undone=histData.undone.slice(0);},markText:function(from,to,options){return markText(this,clipPos(this,from),clipPos(this,to),options,"range");},setBookmark:function(pos,options){var realOpts={replacedWith:options&&(options.nodeType==null?options.widget:options),insertLeft:options&&options.insertLeft,clearWhenEmpty:false};pos=clipPos(this,pos);return markText(this,pos,pos,realOpts,"bookmark");},findMarksAt:function(pos){pos=clipPos(this,pos);var markers=[],spans=getLine(this,pos.line).markedSpans;if(spans)for(var i=0;i<spans.length;++i){var span=spans[i];if((span.from==null||span.from<=pos.ch)&&(span.to==null||span.to>=pos.ch))
+markers.push(span.marker.parent||span.marker);}
+return markers;},getAllMarks:function(){var markers=[];this.iter(function(line){var sps=line.markedSpans;if(sps)for(var i=0;i<sps.length;++i)
+if(sps[i].from!=null)markers.push(sps[i].marker);});return markers;},posFromIndex:function(off){var ch,lineNo=this.first;this.iter(function(line){var sz=line.text.length+1;if(sz>off){ch=off;return true;}
+off-=sz;++lineNo;});return clipPos(this,Pos(lineNo,ch));},indexFromPos:function(coords){coords=clipPos(this,coords);var index=coords.ch;if(coords.line<this.first||coords.ch<0)return 0;this.iter(this.first,coords.line,function(line){index+=line.text.length+1;});return index;},copy:function(copyHistory){var doc=new Doc(getLines(this,this.first,this.first+this.size),this.modeOption,this.first);doc.scrollTop=this.scrollTop;doc.scrollLeft=this.scrollLeft;doc.sel={from:this.sel.from,to:this.sel.to,head:this.sel.head,anchor:this.sel.anchor,shift:this.sel.shift,extend:false,goalColumn:this.sel.goalColumn};if(copyHistory){doc.history.undoDepth=this.history.undoDepth;doc.setHistory(this.getHistory());}
+return doc;},linkedDoc:function(options){if(!options)options={};var from=this.first,to=this.first+this.size;if(options.from!=null&&options.from>from)from=options.from;if(options.to!=null&&options.to<to)to=options.to;var copy=new Doc(getLines(this,from,to),options.mode||this.modeOption,from);if(options.sharedHist)copy.history=this.history;(this.linked||(this.linked=[])).push({doc:copy,sharedHist:options.sharedHist});copy.linked=[{doc:this,isParent:true,sharedHist:options.sharedHist}];return copy;},unlinkDoc:function(other){if(other instanceof CodeMirror)other=other.doc;if(this.linked)for(var i=0;i<this.linked.length;++i){var link=this.linked[i];if(link.doc!=other)continue;this.linked.splice(i,1);other.unlinkDoc(this);break;}
+if(other.history==this.history){var splitIds=[other.id];linkedDocs(other,function(doc){splitIds.push(doc.id);},true);other.history=makeHistory();other.history.done=copyHistoryArray(this.history.done,splitIds);other.history.undone=copyHistoryArray(this.history.undone,splitIds);}},iterLinkedDocs:function(f){linkedDocs(this,f);},getMode:function(){return this.mode;},getEditor:function(){return this.cm;}});Doc.prototype.eachLine=Doc.prototype.iter;var dontDelegate="iter insert remove copy getEditor".split(" ");for(var prop in Doc.prototype)if(Doc.prototype.hasOwnProperty(prop)&&indexOf(dontDelegate,prop)<0)
+CodeMirror.prototype[prop]=(function(method){return function(){return method.apply(this.doc,arguments);};})(Doc.prototype[prop]);eventMixin(Doc);function linkedDocs(doc,f,sharedHistOnly){function propagate(doc,skip,sharedHist){if(doc.linked)for(var i=0;i<doc.linked.length;++i){var rel=doc.linked[i];if(rel.doc==skip)continue;var shared=sharedHist&&rel.sharedHist;if(sharedHistOnly&&!shared)continue;f(rel.doc,shared);propagate(rel.doc,doc,shared);}}
+propagate(doc,null,true);}
+function attachDoc(cm,doc){if(doc.cm)throw new Error("This document is already in use.");cm.doc=doc;doc.cm=cm;estimateLineHeights(cm);loadMode(cm);if(!cm.options.lineWrapping)computeMaxLength(cm);cm.options.mode=doc.modeOption;regChange(cm);}
+function getLine(chunk,n){n-=chunk.first;while(!chunk.lines){for(var i=0;;++i){var child=chunk.children[i],sz=child.chunkSize();if(n<sz){chunk=child;break;}
+n-=sz;}}
+return chunk.lines[n];}
+function getBetween(doc,start,end){var out=[],n=start.line;doc.iter(start.line,end.line+1,function(line){var text=line.text;if(n==end.line)text=text.slice(0,end.ch);if(n==start.line)text=text.slice(start.ch);out.push(text);++n;});return out;}
+function getLines(doc,from,to){var out=[];doc.iter(from,to,function(line){out.push(line.text);});return out;}
+function updateLineHeight(line,height){var diff=height-line.height;for(var n=line;n;n=n.parent)n.height+=diff;}
+function lineNo(line){if(line.parent==null)return null;var cur=line.parent,no=indexOf(cur.lines,line);for(var chunk=cur.parent;chunk;cur=chunk,chunk=chunk.parent){for(var i=0;;++i){if(chunk.children[i]==cur)break;no+=chunk.children[i].chunkSize();}}
+return no+cur.first;}
+function lineAtHeight(chunk,h){var n=chunk.first;outer:do{for(var i=0,e=chunk.children.length;i<e;++i){var child=chunk.children[i],ch=child.height;if(h<ch){chunk=child;continue outer;}
+h-=ch;n+=child.chunkSize();}
+return n;}while(!chunk.lines);for(var i=0,e=chunk.lines.length;i<e;++i){var line=chunk.lines[i],lh=line.height;if(h<lh)break;h-=lh;}
+return n+i;}
+function heightAtLine(cm,lineObj){lineObj=visualLine(cm.doc,lineObj);var h=0,chunk=lineObj.parent;for(var i=0;i<chunk.lines.length;++i){var line=chunk.lines[i];if(line==lineObj)break;else h+=line.height;}
+for(var p=chunk.parent;p;chunk=p,p=chunk.parent){for(var i=0;i<p.children.length;++i){var cur=p.children[i];if(cur==chunk)break;else h+=cur.height;}}
+return h;}
+function getOrder(line){var order=line.order;if(order==null)order=line.order=bidiOrdering(line.text);return order;}
+function makeHistory(startGen){return{done:[],undone:[],undoDepth:Infinity,lastTime:0,lastOp:null,lastOrigin:null,generation:startGen||1,maxGeneration:startGen||1};}
+function attachLocalSpans(doc,change,from,to){var existing=change["spans_"+doc.id],n=0;doc.iter(Math.max(doc.first,from),Math.min(doc.first+doc.size,to),function(line){if(line.markedSpans)
+(existing||(existing=change["spans_"+doc.id]={}))[n]=line.markedSpans;++n;});}
+function historyChangeFromChange(doc,change){var from={line:change.from.line,ch:change.from.ch};var histChange={from:from,to:changeEnd(change),text:getBetween(doc,change.from,change.to)};attachLocalSpans(doc,histChange,change.from.line,change.to.line+1);linkedDocs(doc,function(doc){attachLocalSpans(doc,histChange,change.from.line,change.to.line+1);},true);return histChange;}
+function addToHistory(doc,change,selAfter,opId){var hist=doc.history;hist.undone.length=0;var time=+new Date,cur=lst(hist.done);if(cur&&(hist.lastOp==opId||hist.lastOrigin==change.origin&&change.origin&&((change.origin.charAt(0)=="+"&&doc.cm&&hist.lastTime>time-doc.cm.options.historyEventDelay)||change.origin.charAt(0)=="*"))){var last=lst(cur.changes);if(posEq(change.from,change.to)&&posEq(change.from,last.to)){last.to=changeEnd(change);}else{cur.changes.push(historyChangeFromChange(doc,change));}
+cur.anchorAfter=selAfter.anchor;cur.headAfter=selAfter.head;}else{cur={changes:[historyChangeFromChange(doc,change)],generation:hist.generation,anchorBefore:doc.sel.anchor,headBefore:doc.sel.head,anchorAfter:selAfter.anchor,headAfter:selAfter.head};hist.done.push(cur);while(hist.done.length>hist.undoDepth)
+hist.done.shift();}
+hist.generation=++hist.maxGeneration;hist.lastTime=time;hist.lastOp=opId;hist.lastOrigin=change.origin;}
+function removeClearedSpans(spans){if(!spans)return null;for(var i=0,out;i<spans.length;++i){if(spans[i].marker.explicitlyCleared){if(!out)out=spans.slice(0,i);}
+else if(out)out.push(spans[i]);}
+return!out?spans:out.length?out:null;}
+function getOldSpans(doc,change){var found=change["spans_"+doc.id];if(!found)return null;for(var i=0,nw=[];i<change.text.length;++i)
+nw.push(removeClearedSpans(found[i]));return nw;}
+function copyHistoryArray(events,newGroup){for(var i=0,copy=[];i<events.length;++i){var event=events[i],changes=event.changes,newChanges=[];copy.push({changes:newChanges,anchorBefore:event.anchorBefore,headBefore:event.headBefore,anchorAfter:event.anchorAfter,headAfter:event.headAfter});for(var j=0;j<changes.length;++j){var change=changes[j],m;newChanges.push({from:change.from,to:change.to,text:change.text});if(newGroup)for(var prop in change)if(m=prop.match(/^spans_(\d+)$/)){if(indexOf(newGroup,Number(m[1]))>-1){lst(newChanges)[prop]=change[prop];delete change[prop];}}}}
+return copy;}
+function rebaseHistSel(pos,from,to,diff){if(to<pos.line){pos.line+=diff;}else if(from<pos.line){pos.line=from;pos.ch=0;}}
+function rebaseHistArray(array,from,to,diff){for(var i=0;i<array.length;++i){var sub=array[i],ok=true;for(var j=0;j<sub.changes.length;++j){var cur=sub.changes[j];if(!sub.copied){cur.from=copyPos(cur.from);cur.to=copyPos(cur.to);}
+if(to<cur.from.line){cur.from.line+=diff;cur.to.line+=diff;}else if(from<=cur.to.line){ok=false;break;}}
+if(!sub.copied){sub.anchorBefore=copyPos(sub.anchorBefore);sub.headBefore=copyPos(sub.headBefore);sub.anchorAfter=copyPos(sub.anchorAfter);sub.readAfter=copyPos(sub.headAfter);sub.copied=true;}
+if(!ok){array.splice(0,i+1);i=0;}else{rebaseHistSel(sub.anchorBefore);rebaseHistSel(sub.headBefore);rebaseHistSel(sub.anchorAfter);rebaseHistSel(sub.headAfter);}}}
+function rebaseHist(hist,change){var from=change.from.line,to=change.to.line,diff=change.text.length-(to-from)-1;rebaseHistArray(hist.done,from,to,diff);rebaseHistArray(hist.undone,from,to,diff);}
+function stopMethod(){e_stop(this);}
+function addStop(event){if(!event.stop)event.stop=stopMethod;return event;}
+function e_preventDefault(e){if(e.preventDefault)e.preventDefault();else e.returnValue=false;}
+function e_stopPropagation(e){if(e.stopPropagation)e.stopPropagation();else e.cancelBubble=true;}
+function e_defaultPrevented(e){return e.defaultPrevented!=null?e.defaultPrevented:e.returnValue==false;}
+function e_stop(e){e_preventDefault(e);e_stopPropagation(e);}
+CodeMirror.e_stop=e_stop;CodeMirror.e_preventDefault=e_preventDefault;CodeMirror.e_stopPropagation=e_stopPropagation;function e_target(e){return e.target||e.srcElement;}
+function e_button(e){var b=e.which;if(b==null){if(e.button&1)b=1;else if(e.button&2)b=3;else if(e.button&4)b=2;}
+if(mac&&e.ctrlKey&&b==1)b=3;return b;}
+function on(emitter,type,f){if(emitter.addEventListener)
+emitter.addEventListener(type,f,false);else if(emitter.attachEvent)
+emitter.attachEvent("on"+type,f);else{var map=emitter._handlers||(emitter._handlers={});var arr=map[type]||(map[type]=[]);arr.push(f);}}
+function off(emitter,type,f){if(emitter.removeEventListener)
+emitter.removeEventListener(type,f,false);else if(emitter.detachEvent)
+emitter.detachEvent("on"+type,f);else{var arr=emitter._handlers&&emitter._handlers[type];if(!arr)return;for(var i=0;i<arr.length;++i)
+if(arr[i]==f){arr.splice(i,1);break;}}}
+function signal(emitter,type){var arr=emitter._handlers&&emitter._handlers[type];if(!arr)return;var args=Array.prototype.slice.call(arguments,2);for(var i=0;i<arr.length;++i)arr[i].apply(null,args);}
+var delayedCallbacks,delayedCallbackDepth=0;function signalLater(emitter,type){var arr=emitter._handlers&&emitter._handlers[type];if(!arr)return;var args=Array.prototype.slice.call(arguments,2);if(!delayedCallbacks){++delayedCallbackDepth;delayedCallbacks=[];setTimeout(fireDelayed,0);}
+function bnd(f){return function(){f.apply(null,args);};};for(var i=0;i<arr.length;++i)
+delayedCallbacks.push(bnd(arr[i]));}
+function signalDOMEvent(cm,e,override){signal(cm,override||e.type,cm,e);return e_defaultPrevented(e)||e.codemirrorIgnore;}
+function fireDelayed(){--delayedCallbackDepth;var delayed=delayedCallbacks;delayedCallbacks=null;for(var i=0;i<delayed.length;++i)delayed[i]();}
+function hasHandler(emitter,type){var arr=emitter._handlers&&emitter._handlers[type];return arr&&arr.length>0;}
+CodeMirror.on=on;CodeMirror.off=off;CodeMirror.signal=signal;function eventMixin(ctor){ctor.prototype.on=function(type,f){on(this,type,f);};ctor.prototype.off=function(type,f){off(this,type,f);};}
+var scrollerCutOff=30;var Pass=CodeMirror.Pass={toString:function(){return"CodeMirror.Pass";}};function Delayed(){this.id=null;}
+Delayed.prototype={set:function(ms,f){clearTimeout(this.id);this.id=setTimeout(f,ms);}};function countColumn(string,end,tabSize,startIndex,startValue){if(end==null){end=string.search(/[^\s\u00a0]/);if(end==-1)end=string.length;}
+for(var i=startIndex||0,n=startValue||0;i<end;++i){if(string.charAt(i)=="\t")n+=tabSize-(n%tabSize);else++n;}
+return n;}
+CodeMirror.countColumn=countColumn;var spaceStrs=[""];function spaceStr(n){while(spaceStrs.length<=n)
+spaceStrs.push(lst(spaceStrs)+" ");return spaceStrs[n];}
+function lst(arr){return arr[arr.length-1];}
+function selectInput(node){if(ios){node.selectionStart=0;node.selectionEnd=node.value.length;}else{try{node.select();}
+catch(_e){}}}
+function indexOf(collection,elt){if(collection.indexOf)return collection.indexOf(elt);for(var i=0,e=collection.length;i<e;++i)
+if(collection[i]==elt)return i;return-1;}
+function createObj(base,props){function Obj(){}
+Obj.prototype=base;var inst=new Obj();if(props)copyObj(props,inst);return inst;}
+function copyObj(obj,target){if(!target)target={};for(var prop in obj)if(obj.hasOwnProperty(prop))target[prop]=obj[prop];return target;}
+function emptyArray(size){for(var a=[],i=0;i<size;++i)a.push(undefined);return a;}
+function bind(f){var args=Array.prototype.slice.call(arguments,1);return function(){return f.apply(null,args);};}
+var nonASCIISingleCaseWordChar=/[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function isWordChar(ch){return/\w/.test(ch)||ch>"\x80"&&(ch.toUpperCase()!=ch.toLowerCase()||nonASCIISingleCaseWordChar.test(ch));}
+function isEmpty(obj){for(var n in obj)if(obj.hasOwnProperty(n)&&obj[n])return false;return true;}
+var extendingChars=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function isExtendingChar(ch){return ch.charCodeAt(0)>=768&&extendingChars.test(ch);}
+function elt(tag,content,className,style){var e=document.createElement(tag);if(className)e.className=className;if(style)e.style.cssText=style;if(typeof content=="string")setTextContent(e,content);else if(content)for(var i=0;i<content.length;++i)e.appendChild(content[i]);return e;}
+function removeChildren(e){for(var count=e.childNodes.length;count>0;--count)
+e.removeChild(e.firstChild);return e;}
+function removeChildrenAndAdd(parent,e){return removeChildren(parent).appendChild(e);}
+function setTextContent(e,str){if(ie_lt9){e.innerHTML="";e.appendChild(document.createTextNode(str));}else e.textContent=str;}
+function getRect(node){return node.getBoundingClientRect();}
+CodeMirror.replaceGetRect=function(f){getRect=f;};var dragAndDrop=function(){if(ie_lt9)return false;var div=elt('div');return"draggable"in div||"dragDrop"in div;}();function spanAffectsWrapping(){return false;}
+if(gecko)
+spanAffectsWrapping=function(str,i){return str.charCodeAt(i-1)==36&&str.charCodeAt(i)==39;};else if(safari&&!/Version\/([6-9]|\d\d)\b/.test(navigator.userAgent))
+spanAffectsWrapping=function(str,i){return/\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i-1,i+1));};else if(webkit&&/Chrome\/(?:29|[3-9]\d|\d\d\d)\./.test(navigator.userAgent))
+spanAffectsWrapping=function(str,i){var code=str.charCodeAt(i-1);return code>=8208&&code<=8212;};else if(webkit)
+spanAffectsWrapping=function(str,i){if(i>1&&str.charCodeAt(i-1)==45){if(/\w/.test(str.charAt(i-2))&&/[^\-?\.]/.test(str.charAt(i)))return true;if(i>2&&/[\d\.,]/.test(str.charAt(i-2))&&/[\d\.,]/.test(str.charAt(i)))return false;}
+return/[~!#%&*)=+}\]\\|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|\u2026[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i-1,i+1));};var knownScrollbarWidth;function scrollbarWidth(measure){if(knownScrollbarWidth!=null)return knownScrollbarWidth;var test=elt("div",null,null,"width: 50px; height: 50px; overflow-x: scroll");removeChildrenAndAdd(measure,test);if(test.offsetWidth)
+knownScrollbarWidth=test.offsetHeight-test.clientHeight;return knownScrollbarWidth||0;}
+var zwspSupported;function zeroWidthElement(measure){if(zwspSupported==null){var test=elt("span","\u200b");removeChildrenAndAdd(measure,elt("span",[test,document.createTextNode("x")]));if(measure.firstChild.offsetHeight!=0)
+zwspSupported=test.offsetWidth<=1&&test.offsetHeight>2&&!ie_lt8;}
+if(zwspSupported)return elt("span","\u200b");else return elt("span","\u00a0",null,"display: inline-block; width: 1px; margin-right: -1px");}
+var splitLines="\n\nb".split(/\n/).length!=3?function(string){var pos=0,result=[],l=string.length;while(pos<=l){var nl=string.indexOf("\n",pos);if(nl==-1)nl=string.length;var line=string.slice(pos,string.charAt(nl-1)=="\r"?nl-1:nl);var rt=line.indexOf("\r");if(rt!=-1){result.push(line.slice(0,rt));pos+=rt+1;}else{result.push(line);pos=nl+1;}}
+return result;}:function(string){return string.split(/\r\n?|\n/);};CodeMirror.splitLines=splitLines;var hasSelection=window.getSelection?function(te){try{return te.selectionStart!=te.selectionEnd;}
+catch(e){return false;}}:function(te){try{var range=te.ownerDocument.selection.createRange();}
+catch(e){}
+if(!range||range.parentElement()!=te)return false;return range.compareEndPoints("StartToEnd",range)!=0;};var hasCopyEvent=(function(){var e=elt("div");if("oncopy"in e)return true;e.setAttribute("oncopy","return;");return typeof e.oncopy=='function';})();var keyNames={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};CodeMirror.keyNames=keyNames;(function(){for(var i=0;i<10;i++)keyNames[i+48]=keyNames[i+96]=String(i);for(var i=65;i<=90;i++)keyNames[i]=String.fromCharCode(i);for(var i=1;i<=12;i++)keyNames[i+111]=keyNames[i+63235]="F"+i;})();function iterateBidiSections(order,from,to,f){if(!order)return f(from,to,"ltr");var found=false;for(var i=0;i<order.length;++i){var part=order[i];if(part.from<to&&part.to>from||from==to&&part.to==from){f(Math.max(part.from,from),Math.min(part.to,to),part.level==1?"rtl":"ltr");found=true;}}
+if(!found)f(from,to,"ltr");}
+function bidiLeft(part){return part.level%2?part.to:part.from;}
+function bidiRight(part){return part.level%2?part.from:part.to;}
+function lineLeft(line){var order=getOrder(line);return order?bidiLeft(order[0]):0;}
+function lineRight(line){var order=getOrder(line);if(!order)return line.text.length;return bidiRight(lst(order));}
+function lineStart(cm,lineN){var line=getLine(cm.doc,lineN);var visual=visualLine(cm.doc,line);if(visual!=line)lineN=lineNo(visual);var order=getOrder(visual);var ch=!order?0:order[0].level%2?lineRight(visual):lineLeft(visual);return Pos(lineN,ch);}
+function lineEnd(cm,lineN){var merged,line;while(merged=collapsedSpanAtEnd(line=getLine(cm.doc,lineN)))
+lineN=merged.find().to.line;var order=getOrder(line);var ch=!order?line.text.length:order[0].level%2?lineLeft(line):lineRight(line);return Pos(lineN,ch);}
+function compareBidiLevel(order,a,b){var linedir=order[0].level;if(a==linedir)return true;if(b==linedir)return false;return a<b;}
+var bidiOther;function getBidiPartAt(order,pos){bidiOther=null;for(var i=0,found;i<order.length;++i){var cur=order[i];if(cur.from<pos&&cur.to>pos)return i;if((cur.from==pos||cur.to==pos)){if(found==null){found=i;}else if(compareBidiLevel(order,cur.level,order[found].level)){if(cur.from!=cur.to)bidiOther=found;return i;}else{if(cur.from!=cur.to)bidiOther=i;return found;}}}
+return found;}
+function moveInLine(line,pos,dir,byUnit){if(!byUnit)return pos+dir;do pos+=dir;while(pos>0&&isExtendingChar(line.text.charAt(pos)));return pos;}
+function moveVisually(line,start,dir,byUnit){var bidi=getOrder(line);if(!bidi)return moveLogically(line,start,dir,byUnit);var pos=getBidiPartAt(bidi,start),part=bidi[pos];var target=moveInLine(line,start,part.level%2?-dir:dir,byUnit);for(;;){if(target>part.from&&target<part.to)return target;if(target==part.from||target==part.to){if(getBidiPartAt(bidi,target)==pos)return target;part=bidi[pos+=dir];return(dir>0)==part.level%2?part.to:part.from;}else{part=bidi[pos+=dir];if(!part)return null;if((dir>0)==part.level%2)
+target=moveInLine(line,part.to,-1,byUnit);else
+target=moveInLine(line,part.from,1,byUnit);}}}
+function moveLogically(line,start,dir,byUnit){var target=start+dir;if(byUnit)while(target>0&&isExtendingChar(line.text.charAt(target)))target+=dir;return target<0||target>line.text.length?null:target;}
+var bidiOrdering=(function(){var lowTypes="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL";var arabicTypes="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr";function charType(code){if(code<=0xff)return lowTypes.charAt(code);else if(0x590<=code&&code<=0x5f4)return"R";else if(0x600<=code&&code<=0x6ff)return arabicTypes.charAt(code-0x600);else if(0x700<=code&&code<=0x8ac)return"r";else return"L";}
+var bidiRE=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;var isNeutral=/[stwN]/,isStrong=/[LRr]/,countsAsLeft=/[Lb1n]/,countsAsNum=/[1n]/;var outerType="L";return function(str){if(!bidiRE.test(str))return false;var len=str.length,types=[];for(var i=0,type;i<len;++i)
+types.push(type=charType(str.charCodeAt(i)));for(var i=0,prev=outerType;i<len;++i){var type=types[i];if(type=="m")types[i]=prev;else prev=type;}
+for(var i=0,cur=outerType;i<len;++i){var type=types[i];if(type=="1"&&cur=="r")types[i]="n";else if(isStrong.test(type)){cur=type;if(type=="r")types[i]="R";}}
+for(var i=1,prev=types[0];i<len-1;++i){var type=types[i];if(type=="+"&&prev=="1"&&types[i+1]=="1")types[i]="1";else if(type==","&&prev==types[i+1]&&(prev=="1"||prev=="n"))types[i]=prev;prev=type;}
+for(var i=0;i<len;++i){var type=types[i];if(type==",")types[i]="N";else if(type=="%"){for(var end=i+1;end<len&&types[end]=="%";++end){}
+var replace=(i&&types[i-1]=="!")||(end<len&&types[end]=="1")?"1":"N";for(var j=i;j<end;++j)types[j]=replace;i=end-1;}}
+for(var i=0,cur=outerType;i<len;++i){var type=types[i];if(cur=="L"&&type=="1")types[i]="L";else if(isStrong.test(type))cur=type;}
+for(var i=0;i<len;++i){if(isNeutral.test(types[i])){for(var end=i+1;end<len&&isNeutral.test(types[end]);++end){}
+var before=(i?types[i-1]:outerType)=="L";var after=(end<len?types[end]:outerType)=="L";var replace=before||after?"L":"R";for(var j=i;j<end;++j)types[j]=replace;i=end-1;}}
+var order=[],m;for(var i=0;i<len;){if(countsAsLeft.test(types[i])){var start=i;for(++i;i<len&&countsAsLeft.test(types[i]);++i){}
+order.push({from:start,to:i,level:0});}else{var pos=i,at=order.length;for(++i;i<len&&types[i]!="L";++i){}
+for(var j=pos;j<i;){if(countsAsNum.test(types[j])){if(pos<j)order.splice(at,0,{from:pos,to:j,level:1});var nstart=j;for(++j;j<i&&countsAsNum.test(types[j]);++j){}
+order.splice(at,0,{from:nstart,to:j,level:2});pos=j;}else++j;}
+if(pos<i)order.splice(at,0,{from:pos,to:i,level:1});}}
+if(order[0].level==1&&(m=str.match(/^\s+/))){order[0].from=m[0].length;order.unshift({from:0,to:m[0].length,level:0});}
+if(lst(order).level==1&&(m=str.match(/\s+$/))){lst(order).to-=m[0].length;order.push({from:len-m[0].length,to:len,level:0});}
+if(order[0].level!=lst(order).level)
+order.push({from:len,to:len,level:order[0].level});return order;};})();CodeMirror.version="3.21.1";return CodeMirror;})();;CodeMirror.defineMode("css",function(config,parserConfig){"use strict";if(!parserConfig.propertyKeywords)parserConfig=CodeMirror.resolveMode("text/css");var indentUnit=config.indentUnit||config.tabSize||2,hooks=parserConfig.hooks||{},atMediaTypes=parserConfig.atMediaTypes||{},atMediaFeatures=parserConfig.atMediaFeatures||{},propertyKeywords=parserConfig.propertyKeywords||{},colorKeywords=parserConfig.colorKeywords||{},valueKeywords=parserConfig.valueKeywords||{},allowNested=!!parserConfig.allowNested,type=null;function ret(style,tp){type=tp;return style;}
+function tokenBase(stream,state){var ch=stream.next();if(hooks[ch]){var result=hooks[ch](stream,state);if(result!==false)return result;}
+if(ch=="@"){stream.eatWhile(/[\w\\\-]/);return ret("def",stream.current());}
+else if(ch=="=")ret(null,"compare");else if((ch=="~"||ch=="|")&&stream.eat("="))return ret(null,"compare");else if(ch=="\""||ch=="'"){state.tokenize=tokenString(ch);return state.tokenize(stream,state);}
+else if(ch=="#"){stream.eatWhile(/[\w\\\-]/);return ret("atom","hash");}
+else if(ch=="!"){stream.match(/^\s*\w*/);return ret("keyword","important");}
+else if(/\d/.test(ch)||ch=="."&&stream.eat(/\d/)){stream.eatWhile(/[\w.%]/);return ret("number","unit");}
+else if(ch==="-"){if(/\d/.test(stream.peek())){stream.eatWhile(/[\w.%]/);return ret("number","unit");}else if(stream.match(/^[^-]+-/)){return ret("meta","meta");}}
+else if(/[,+>*\/]/.test(ch)){return ret(null,"select-op");}
+else if(ch=="."&&stream.match(/^-?[_a-z][_a-z0-9-]*/i)){return ret("qualifier","qualifier");}
+else if(ch==":"){return ret("operator",ch);}
+else if(/[;{}\[\]\(\)]/.test(ch)){return ret(null,ch);}
+else if(ch=="u"&&stream.match("rl(")){stream.backUp(1);state.tokenize=tokenParenthesized;return ret("property","variable");}
+else{stream.eatWhile(/[\w\\\-]/);return ret("property","variable");}}
+function tokenString(quote,nonInclusive){return function(stream,state){var escaped=false,ch;while((ch=stream.next())!=null){if(ch==quote&&!escaped)
+break;escaped=!escaped&&ch=="\\";}
+if(!escaped){if(nonInclusive)stream.backUp(1);state.tokenize=tokenBase;}
+return ret("string","string");};}
+function tokenParenthesized(stream,state){stream.next();if(!stream.match(/\s*[\"\']/,false))
+state.tokenize=tokenString(")",true);else
+state.tokenize=tokenBase;return ret(null,"(");}
+return{startState:function(base){return{tokenize:tokenBase,baseIndent:base||0,stack:[],lastToken:null};},token:function(stream,state){state.tokenize=state.tokenize||tokenBase;if(state.tokenize==tokenBase&&stream.eatSpace())return null;var style=state.tokenize(stream,state);if(style&&typeof style!="string")style=ret(style[0],style[1]);var context=state.stack[state.stack.length-1];if(style=="variable"){if(type=="variable-definition")state.stack.push("propertyValue");return state.lastToken="variable-2";}else if(style=="property"){var word=stream.current().toLowerCase();if(context=="propertyValue"){if(valueKeywords.hasOwnProperty(word)){style="string-2";}else if(colorKeywords.hasOwnProperty(word)){style="keyword";}else{style="variable-2";}}else if(context=="rule"){if(!propertyKeywords.hasOwnProperty(word)){style+=" error";}}else if(context=="block"){if(propertyKeywords.hasOwnProperty(word)){style="property";}else if(colorKeywords.hasOwnProperty(word)){style="keyword";}else if(valueKeywords.hasOwnProperty(word)){style="string-2";}else{style="tag";}}else if(!context||context=="@media{"){style="tag";}else if(context=="@media"){if(atMediaTypes[stream.current()]){style="attribute";}else if(/^(only|not)$/.test(word)){style="keyword";}else if(word=="and"){style="error";}else if(atMediaFeatures.hasOwnProperty(word)){style="error";}else{style="attribute error";}}else if(context=="@mediaType"){if(atMediaTypes.hasOwnProperty(word)){style="attribute";}else if(word=="and"){style="operator";}else if(/^(only|not)$/.test(word)){style="error";}else{style="error";}}else if(context=="@mediaType("){if(propertyKeywords.hasOwnProperty(word)){}else if(atMediaTypes.hasOwnProperty(word)){style="error";}else if(word=="and"){style="operator";}else if(/^(only|not)$/.test(word)){style="error";}else{style+=" error";}}else if(context=="@import"){style="tag";}else{style="error";}}else if(style=="atom"){if(!context||context=="@media{"||context=="block"){style="builtin";}else if(context=="propertyValue"){if(!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())){style+=" error";}}else{style="error";}}else if(context=="@media"&&type=="{"){style="error";}
+if(type=="{"){if(context=="@media"||context=="@mediaType"){state.stack[state.stack.length-1]="@media{";}
+else{var newContext=allowNested?"block":"rule";state.stack.push(newContext);}}
+else if(type=="}"){if(context=="interpolation")style="operator";while(state.stack.length){var removed=state.stack.pop();if(removed.indexOf("{")>-1||removed=="block"||removed=="rule"){break;}}}
+else if(type=="interpolation")state.stack.push("interpolation");else if(type=="@media")state.stack.push("@media");else if(type=="@import")state.stack.push("@import");else if(context=="@media"&&/\b(keyword|attribute)\b/.test(style))
+state.stack[state.stack.length-1]="@mediaType";else if(context=="@mediaType"&&stream.current()==",")
+state.stack[state.stack.length-1]="@media";else if(type=="("){if(context=="@media"||context=="@mediaType"){state.stack[state.stack.length-1]="@mediaType";state.stack.push("@mediaType(");}
+else state.stack.push("(");}
+else if(type==")"){while(state.stack.length){var removed=state.stack.pop();if(removed.indexOf("(")>-1){break;}}}
+else if(type==":"&&state.lastToken=="property")state.stack.push("propertyValue");else if(context=="propertyValue"&&type==";")state.stack.pop();else if(context=="@import"&&type==";")state.stack.pop();return state.lastToken=style;},indent:function(state,textAfter){var n=state.stack.length;if(/^\}/.test(textAfter))
+n-=state.stack[n-1]=="propertyValue"?2:1;return state.baseIndent+n*indentUnit;},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"};});(function(){function keySet(array){var keys={};for(var i=0;i<array.length;++i){keys[array[i]]=true;}
+return keys;}
+var atMediaTypes=keySet(["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"]);var atMediaFeatures=keySet(["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"]);var propertyKeywords=keySet(["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid-cell","grid-column","grid-column-align","grid-column-sizing","grid-column-span","grid-columns","grid-flow","grid-row","grid-row-align","grid-row-sizing","grid-row-span","grid-rows","grid-template","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-inside","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","zoom","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-profile","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","kerning","text-anchor","writing-mode"]);var colorKeywords=keySet(["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]);var valueKeywords=keySet(["above","absolute","activeborder","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","cover","crop","cross","crosshair","currentcolor","cursive","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ew-resize","expanded","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-table","inset","inside","intrinsic","invert","italic","justify","kannada","katakana","katakana-iroha","keep-all","khmer","landscape","lao","large","larger","left","level","lighter","line-through","linear","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","single","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","x-large","x-small","xor","xx-large","xx-small"]);function tokenCComment(stream,state){var maybeEnd=false,ch;while((ch=stream.next())!=null){if(maybeEnd&&ch=="/"){state.tokenize=null;break;}
+maybeEnd=(ch=="*");}
+return["comment","comment"];}
+CodeMirror.defineMIME("text/css",{atMediaTypes:atMediaTypes,atMediaFeatures:atMediaFeatures,propertyKeywords:propertyKeywords,colorKeywords:colorKeywords,valueKeywords:valueKeywords,hooks:{"<":function(stream,state){function tokenSGMLComment(stream,state){var dashes=0,ch;while((ch=stream.next())!=null){if(dashes>=2&&ch==">"){state.tokenize=null;break;}
+dashes=(ch=="-")?dashes+1:0;}
+return["comment","comment"];}
+if(stream.eat("!")){state.tokenize=tokenSGMLComment;return tokenSGMLComment(stream,state);}},"/":function(stream,state){if(stream.eat("*")){state.tokenize=tokenCComment;return tokenCComment(stream,state);}
+return false;}},name:"css"});CodeMirror.defineMIME("text/x-scss",{atMediaTypes:atMediaTypes,atMediaFeatures:atMediaFeatures,propertyKeywords:propertyKeywords,colorKeywords:colorKeywords,valueKeywords:valueKeywords,allowNested:true,hooks:{":":function(stream){if(stream.match(/\s*{/)){return[null,"{"];}
+return false;},"$":function(stream){stream.match(/^[\w-]+/);if(stream.peek()==":"){return["variable","variable-definition"];}
+return["variable","variable"];},",":function(stream,state){if(state.stack[state.stack.length-1]=="propertyValue"&&stream.match(/^ *\$/,false)){return["operator",";"];}},"/":function(stream,state){if(stream.eat("/")){stream.skipToEnd();return["comment","comment"];}else if(stream.eat("*")){state.tokenize=tokenCComment;return tokenCComment(stream,state);}else{return["operator","operator"];}},"#":function(stream){if(stream.eat("{")){return["operator","interpolation"];}else{stream.eatWhile(/[\w\\\-]/);return["atom","hash"];}}},name:"css"});})();;CodeMirror.defineMode("javascript",function(config,parserConfig){var indentUnit=config.indentUnit;var statementIndent=parserConfig.statementIndent;var jsonMode=parserConfig.json;var isTS=parserConfig.typescript;var keywords=function(){function kw(type){return{type:type,style:"keyword"};}
+var A=kw("keyword a"),B=kw("keyword b"),C=kw("keyword c");var operator=kw("operator"),atom={type:"atom",style:"atom"};var jsKeywords={"if":kw("if"),"while":A,"with":A,"else":B,"do":B,"try":B,"finally":B,"return":C,"break":C,"continue":C,"new":C,"delete":C,"throw":C,"var":kw("var"),"const":kw("var"),"let":kw("var"),"function":kw("function"),"catch":kw("catch"),"for":kw("for"),"switch":kw("switch"),"case":kw("case"),"default":kw("default"),"in":operator,"typeof":operator,"instanceof":operator,"true":atom,"false":atom,"null":atom,"undefined":atom,"NaN":atom,"Infinity":atom,"this":kw("this"),"module":kw("module"),"class":kw("class"),"super":kw("atom"),"yield":C,"export":kw("export"),"import":kw("import"),"extends":C};if(isTS){var type={type:"variable",style:"variable-3"};var tsKeywords={"interface":kw("interface"),"extends":kw("extends"),"constructor":kw("constructor"),"public":kw("public"),"private":kw("private"),"protected":kw("protected"),"static":kw("static"),"string":type,"number":type,"bool":type,"any":type};for(var attr in tsKeywords){jsKeywords[attr]=tsKeywords[attr];}}
+return jsKeywords;}();var isOperatorChar=/[+\-*&%=<>!?|~^]/;function nextUntilUnescaped(stream,end){var escaped=false,next;while((next=stream.next())!=null){if(next==end&&!escaped)
+return false;escaped=!escaped&&next=="\\";}
+return escaped;}
+var type,content;function ret(tp,style,cont){type=tp;content=cont;return style;}
+function tokenBase(stream,state){var ch=stream.next();if(ch=='"'||ch=="'"){state.tokenize=tokenString(ch);return state.tokenize(stream,state);}else if(ch=="."&&stream.match(/^\d+(?:[eE][+\-]?\d+)?/)){return ret("number","number");}else if(ch=="."&&stream.match("..")){return ret("spread","meta");}else if(/[\[\]{}\(\),;\:\.]/.test(ch)){return ret(ch);}else if(ch=="="&&stream.eat(">")){return ret("=>");}else if(ch=="0"&&stream.eat(/x/i)){stream.eatWhile(/[\da-f]/i);return ret("number","number");}else if(/\d/.test(ch)){stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);return ret("number","number");}else if(ch=="/"){if(stream.eat("*")){state.tokenize=tokenComment;return tokenComment(stream,state);}else if(stream.eat("/")){stream.skipToEnd();return ret("comment","comment");}else if(state.lastType=="operator"||state.lastType=="keyword c"||state.lastType=="sof"||/^[\[{}\(,;:]$/.test(state.lastType)){nextUntilUnescaped(stream,"/");stream.eatWhile(/[gimy]/);return ret("regexp","string-2");}else{stream.eatWhile(isOperatorChar);return ret("operator",null,stream.current());}}else if(ch=="`"){state.tokenize=tokenQuasi;return tokenQuasi(stream,state);}else if(ch=="#"){stream.skipToEnd();return ret("error","error");}else if(isOperatorChar.test(ch)){stream.eatWhile(isOperatorChar);return ret("operator",null,stream.current());}else{stream.eatWhile(/[\w\$_]/);var word=stream.current(),known=keywords.propertyIsEnumerable(word)&&keywords[word];return(known&&state.lastType!=".")?ret(known.type,known.style,word):ret("variable","variable",word);}}
+function tokenString(quote){return function(stream,state){if(!nextUntilUnescaped(stream,quote))
+state.tokenize=tokenBase;return ret("string","string");};}
+function tokenComment(stream,state){var maybeEnd=false,ch;while(ch=stream.next()){if(ch=="/"&&maybeEnd){state.tokenize=tokenBase;break;}
+maybeEnd=(ch=="*");}
+return ret("comment","comment");}
+function tokenQuasi(stream,state){var escaped=false,next;while((next=stream.next())!=null){if(!escaped&&(next=="`"||next=="$"&&stream.eat("{"))){state.tokenize=tokenBase;break;}
+escaped=!escaped&&next=="\\";}
+return ret("quasi","string-2",stream.current());}
+var brackets="([{}])";function findFatArrow(stream,state){if(state.fatArrowAt)state.fatArrowAt=null;var arrow=stream.string.indexOf("=>",stream.start);if(arrow<0)return;var depth=0,sawSomething=false;for(var pos=arrow-1;pos>=0;--pos){var ch=stream.string.charAt(pos);var bracket=brackets.indexOf(ch);if(bracket>=0&&bracket<3){if(!depth){++pos;break;}
+if(--depth==0)break;}else if(bracket>=3&&bracket<6){++depth;}else if(/[$\w]/.test(ch)){sawSomething=true;}else if(sawSomething&&!depth){++pos;break;}}
+if(sawSomething&&!depth)state.fatArrowAt=pos;}
+var atomicTypes={"atom":true,"number":true,"variable":true,"string":true,"regexp":true,"this":true};function JSLexical(indented,column,type,align,prev,info){this.indented=indented;this.column=column;this.type=type;this.prev=prev;this.info=info;if(align!=null)this.align=align;}
+function inScope(state,varname){for(var v=state.localVars;v;v=v.next)
+if(v.name==varname)return true;for(var cx=state.context;cx;cx=cx.prev){for(var v=cx.vars;v;v=v.next)
+if(v.name==varname)return true;}}
+function parseJS(state,style,type,content,stream){var cc=state.cc;cx.state=state;cx.stream=stream;cx.marked=null,cx.cc=cc;if(!state.lexical.hasOwnProperty("align"))
+state.lexical.align=true;while(true){var combinator=cc.length?cc.pop():jsonMode?expression:statement;if(combinator(type,content)){while(cc.length&&cc[cc.length-1].lex)
+cc.pop()();if(cx.marked)return cx.marked;if(type=="variable"&&inScope(state,content))return"variable-2";return style;}}}
+var cx={state:null,column:null,marked:null,cc:null};function pass(){for(var i=arguments.length-1;i>=0;i--)cx.cc.push(arguments[i]);}
+function cont(){pass.apply(null,arguments);return true;}
+function register(varname){function inList(list){for(var v=list;v;v=v.next)
+if(v.name==varname)return true;return false;}
+var state=cx.state;if(state.context){cx.marked="def";if(inList(state.localVars))return;state.localVars={name:varname,next:state.localVars};}else{if(inList(state.globalVars))return;if(parserConfig.globalVars)
+state.globalVars={name:varname,next:state.globalVars};}}
+var defaultVars={name:"this",next:{name:"arguments"}};function pushcontext(){cx.state.context={prev:cx.state.context,vars:cx.state.localVars};cx.state.localVars=defaultVars;}
+function popcontext(){cx.state.localVars=cx.state.context.vars;cx.state.context=cx.state.context.prev;}
+function pushlex(type,info){var result=function(){var state=cx.state,indent=state.indented;if(state.lexical.type=="stat")indent=state.lexical.indented;state.lexical=new JSLexical(indent,cx.stream.column(),type,null,state.lexical,info);};result.lex=true;return result;}
+function poplex(){var state=cx.state;if(state.lexical.prev){if(state.lexical.type==")")
+state.indented=state.lexical.indented;state.lexical=state.lexical.prev;}}
+poplex.lex=true;function expect(wanted){return function(type){if(type==wanted)return cont();else if(wanted==";")return pass();else return cont(arguments.callee);};}
+function statement(type,value){if(type=="var")return cont(pushlex("vardef",value.length),vardef,expect(";"),poplex);if(type=="keyword a")return cont(pushlex("form"),expression,statement,poplex);if(type=="keyword b")return cont(pushlex("form"),statement,poplex);if(type=="{")return cont(pushlex("}"),block,poplex);if(type==";")return cont();if(type=="if")return cont(pushlex("form"),expression,statement,poplex,maybeelse);if(type=="function")return cont(functiondef);if(type=="for")return cont(pushlex("form"),forspec,poplex,statement,poplex);if(type=="variable")return cont(pushlex("stat"),maybelabel);if(type=="switch")return cont(pushlex("form"),expression,pushlex("}","switch"),expect("{"),block,poplex,poplex);if(type=="case")return cont(expression,expect(":"));if(type=="default")return cont(expect(":"));if(type=="catch")return cont(pushlex("form"),pushcontext,expect("("),funarg,expect(")"),statement,poplex,popcontext);if(type=="module")return cont(pushlex("form"),pushcontext,afterModule,popcontext,poplex);if(type=="class")return cont(pushlex("form"),className,objlit,poplex);if(type=="export")return cont(pushlex("form"),afterExport,poplex);if(type=="import")return cont(pushlex("form"),afterImport,poplex);return pass(pushlex("stat"),expression,expect(";"),poplex);}
+function expression(type){return expressionInner(type,false);}
+function expressionNoComma(type){return expressionInner(type,true);}
+function expressionInner(type,noComma){if(cx.state.fatArrowAt==cx.stream.start){var body=noComma?arrowBodyNoComma:arrowBody;if(type=="(")return cont(pushcontext,commasep(pattern,")"),expect("=>"),body,popcontext);else if(type=="variable")return pass(pushcontext,pattern,expect("=>"),body,popcontext);}
+var maybeop=noComma?maybeoperatorNoComma:maybeoperatorComma;if(atomicTypes.hasOwnProperty(type))return cont(maybeop);if(type=="function")return cont(functiondef);if(type=="keyword c")return cont(noComma?maybeexpressionNoComma:maybeexpression);if(type=="(")return cont(pushlex(")"),maybeexpression,comprehension,expect(")"),poplex,maybeop);if(type=="operator"||type=="spread")return cont(noComma?expressionNoComma:expression);if(type=="[")return cont(pushlex("]"),expressionNoComma,maybeArrayComprehension,poplex,maybeop);if(type=="{")return cont(commasep(objprop,"}"),maybeop);return cont();}
+function maybeexpression(type){if(type.match(/[;\}\)\],]/))return pass();return pass(expression);}
+function maybeexpressionNoComma(type){if(type.match(/[;\}\)\],]/))return pass();return pass(expressionNoComma);}
+function maybeoperatorComma(type,value){if(type==",")return cont(expression);return maybeoperatorNoComma(type,value,false);}
+function maybeoperatorNoComma(type,value,noComma){var me=noComma==false?maybeoperatorComma:maybeoperatorNoComma;var expr=noComma==false?expression:expressionNoComma;if(value=="=>")return cont(pushcontext,noComma?arrowBodyNoComma:arrowBody,popcontext);if(type=="operator"){if(/\+\+|--/.test(value))return cont(me);if(value=="?")return cont(expression,expect(":"),expr);return cont(expr);}
+if(type=="quasi"){cx.cc.push(me);return quasi(value);}
+if(type==";")return;if(type=="(")return cont(commasep(expressionNoComma,")","call"),me);if(type==".")return cont(property,me);if(type=="[")return cont(pushlex("]"),maybeexpression,expect("]"),poplex,me);}
+function quasi(value){if(!value)debugger;if(value.slice(value.length-2)!="${")return cont();return cont(expression,continueQuasi);}
+function continueQuasi(type){if(type=="}"){cx.marked="string-2";cx.state.tokenize=tokenQuasi;return cont();}}
+function arrowBody(type){findFatArrow(cx.stream,cx.state);if(type=="{")return pass(statement);return pass(expression);}
+function arrowBodyNoComma(type){findFatArrow(cx.stream,cx.state);if(type=="{")return pass(statement);return pass(expressionNoComma);}
+function maybelabel(type){if(type==":")return cont(poplex,statement);return pass(maybeoperatorComma,expect(";"),poplex);}
+function property(type){if(type=="variable"){cx.marked="property";return cont();}}
+function objprop(type,value){if(type=="variable"){cx.marked="property";if(value=="get"||value=="set")return cont(getterSetter);}else if(type=="number"||type=="string"){cx.marked=type+" property";}else if(type=="["){return cont(expression,expect("]"),afterprop);}
+if(atomicTypes.hasOwnProperty(type))return cont(afterprop);}
+function getterSetter(type){if(type!="variable")return pass(afterprop);cx.marked="property";return cont(functiondef);}
+function afterprop(type){if(type==":")return cont(expressionNoComma);if(type=="(")return pass(functiondef);}
+function commasep(what,end,info){function proceed(type){if(type==","){var lex=cx.state.lexical;if(lex.info=="call")lex.pos=(lex.pos||0)+1;return cont(what,proceed);}
+if(type==end)return cont();return cont(expect(end));}
+return function(type){if(type==end)return cont();if(info===false)return pass(what,proceed);return pass(pushlex(end,info),what,proceed,poplex);};}
+function block(type){if(type=="}")return cont();return pass(statement,block);}
+function maybetype(type){if(isTS&&type==":")return cont(typedef);}
+function typedef(type){if(type=="variable"){cx.marked="variable-3";return cont();}}
+function vardef(){return pass(pattern,maybetype,maybeAssign,vardefCont);}
+function pattern(type,value){if(type=="variable"){register(value);return cont();}
+if(type=="[")return cont(commasep(pattern,"]"));if(type=="{")return cont(commasep(proppattern,"}"));}
+function proppattern(type,value){if(type=="variable"&&!cx.stream.match(/^\s*:/,false)){register(value);return cont(maybeAssign);}
+if(type=="variable")cx.marked="property";return cont(expect(":"),pattern,maybeAssign);}
+function maybeAssign(_type,value){if(value=="=")return cont(expressionNoComma);}
+function vardefCont(type){if(type==",")return cont(vardef);}
+function maybeelse(type,value){if(type=="keyword b"&&value=="else")return cont(pushlex("form"),statement,poplex);}
+function forspec(type){if(type=="(")return cont(pushlex(")"),forspec1,expect(")"));}
+function forspec1(type){if(type=="var")return cont(vardef,expect(";"),forspec2);if(type==";")return cont(forspec2);if(type=="variable")return cont(formaybeinof);return pass(expression,expect(";"),forspec2);}
+function formaybeinof(_type,value){if(value=="in"||value=="of"){cx.marked="keyword";return cont(expression);}
+return cont(maybeoperatorComma,forspec2);}
+function forspec2(type,value){if(type==";")return cont(forspec3);if(value=="in"||value=="of"){cx.marked="keyword";return cont(expression);}
+return pass(expression,expect(";"),forspec3);}
+function forspec3(type){if(type!=")")cont(expression);}
+function functiondef(type,value){if(value=="*"){cx.marked="keyword";return cont(functiondef);}
+if(type=="variable"){register(value);return cont(functiondef);}
+if(type=="(")return cont(pushcontext,commasep(funarg,")"),statement,popcontext);}
+function funarg(type){if(type=="spread")return cont(funarg);return pass(pattern,maybetype);}
+function className(type,value){if(type=="variable"){register(value);return cont(classNameAfter);}}
+function classNameAfter(_type,value){if(value=="extends")return cont(expression);}
+function objlit(type){if(type=="{")return cont(commasep(objprop,"}"));}
+function afterModule(type,value){if(type=="string")return cont(statement);if(type=="variable"){register(value);return cont(maybeFrom);}}
+function afterExport(_type,value){if(value=="*"){cx.marked="keyword";return cont(maybeFrom,expect(";"));}
+if(value=="default"){cx.marked="keyword";return cont(expression,expect(";"));}
+return pass(statement);}
+function afterImport(type){if(type=="string")return cont();return pass(importSpec,maybeFrom);}
+function importSpec(type,value){if(type=="{")return cont(commasep(importSpec,"}"));if(type=="variable")register(value);return cont();}
+function maybeFrom(_type,value){if(value=="from"){cx.marked="keyword";return cont(expression);}}
+function maybeArrayComprehension(type){if(type=="for")return pass(comprehension);if(type==",")return cont(commasep(expressionNoComma,"]",false));return pass(commasep(expressionNoComma,"]",false));}
+function comprehension(type){if(type=="for")return cont(forspec,comprehension);if(type=="if")return cont(expression,comprehension);}
+return{startState:function(basecolumn){var state={tokenize:tokenBase,lastType:"sof",cc:[],lexical:new JSLexical((basecolumn||0)-indentUnit,0,"block",false),localVars:parserConfig.localVars,context:parserConfig.localVars&&{vars:parserConfig.localVars},indented:0};if(parserConfig.globalVars)state.globalVars=parserConfig.globalVars;return state;},token:function(stream,state){if(stream.sol()){if(!state.lexical.hasOwnProperty("align"))
+state.lexical.align=false;state.indented=stream.indentation();findFatArrow(stream,state);}
+if(state.tokenize!=tokenComment&&stream.eatSpace())return null;var style=state.tokenize(stream,state);if(type=="comment")return style;state.lastType=type=="operator"&&(content=="++"||content=="--")?"incdec":type;return parseJS(state,style,type,content,stream);},indent:function(state,textAfter){if(state.tokenize==tokenComment)return CodeMirror.Pass;if(state.tokenize!=tokenBase)return 0;var firstChar=textAfter&&textAfter.charAt(0),lexical=state.lexical;for(var i=state.cc.length-1;i>=0;--i){var c=state.cc[i];if(c==poplex)lexical=lexical.prev;else if(c!=maybeelse)break;}
+if(lexical.type=="stat"&&firstChar=="}")lexical=lexical.prev;if(statementIndent&&lexical.type==")"&&lexical.prev.type=="stat")
+lexical=lexical.prev;var type=lexical.type,closing=firstChar==type;if(type=="vardef")return lexical.indented+(state.lastType=="operator"||state.lastType==","?lexical.info+1:0);else if(type=="form"&&firstChar=="{")return lexical.indented;else if(type=="form")return lexical.indented+indentUnit;else if(type=="stat")
+return lexical.indented+(state.lastType=="operator"||state.lastType==","?statementIndent||indentUnit:0);else if(lexical.info=="switch"&&!closing&&parserConfig.doubleIndentSwitch!=false)
+return lexical.indented+(/^(?:case|default)\b/.test(textAfter)?indentUnit:2*indentUnit);else if(lexical.align)return lexical.column+(closing?0:1);else return lexical.indented+(closing?0:indentUnit);},electricChars:":{}",blockCommentStart:jsonMode?null:"/*",blockCommentEnd:jsonMode?null:"*/",lineComment:jsonMode?null:"//",fold:"brace",helperType:jsonMode?"json":"javascript",jsonMode:jsonMode};});CodeMirror.defineMIME("text/javascript","javascript");CodeMirror.defineMIME("text/ecmascript","javascript");CodeMirror.defineMIME("application/javascript","javascript");CodeMirror.defineMIME("application/ecmascript","javascript");CodeMirror.defineMIME("application/json",{name:"javascript",json:true});CodeMirror.defineMIME("application/x-json",{name:"javascript",json:true});CodeMirror.defineMIME("text/typescript",{name:"javascript",typescript:true});CodeMirror.defineMIME("application/typescript",{name:"javascript",typescript:true});;CodeMirror.defineMode("xml",function(config,parserConfig){var indentUnit=config.indentUnit;var multilineTagIndentFactor=parserConfig.multilineTagIndentFactor||1;var multilineTagIndentPastTag=parserConfig.multilineTagIndentPastTag||true;var Kludges=parserConfig.htmlMode?{autoSelfClosers:{'area':true,'base':true,'br':true,'col':true,'command':true,'embed':true,'frame':true,'hr':true,'img':true,'input':true,'keygen':true,'link':true,'meta':true,'param':true,'source':true,'track':true,'wbr':true},implicitlyClosed:{'dd':true,'li':true,'optgroup':true,'option':true,'p':true,'rp':true,'rt':true,'tbody':true,'td':true,'tfoot':true,'th':true,'tr':true},contextGrabbers:{'dd':{'dd':true,'dt':true},'dt':{'dd':true,'dt':true},'li':{'li':true},'option':{'option':true,'optgroup':true},'optgroup':{'optgroup':true},'p':{'address':true,'article':true,'aside':true,'blockquote':true,'dir':true,'div':true,'dl':true,'fieldset':true,'footer':true,'form':true,'h1':true,'h2':true,'h3':true,'h4':true,'h5':true,'h6':true,'header':true,'hgroup':true,'hr':true,'menu':true,'nav':true,'ol':true,'p':true,'pre':true,'section':true,'table':true,'ul':true},'rp':{'rp':true,'rt':true},'rt':{'rp':true,'rt':true},'tbody':{'tbody':true,'tfoot':true},'td':{'td':true,'th':true},'tfoot':{'tbody':true},'th':{'td':true,'th':true},'thead':{'tbody':true,'tfoot':true},'tr':{'tr':true}},doNotIndent:{"pre":true},allowUnquoted:true,allowMissing:true}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:false,allowMissing:false};var alignCDATA=parserConfig.alignCDATA;var tagName,type;function inText(stream,state){function chain(parser){state.tokenize=parser;return parser(stream,state);}
+var ch=stream.next();if(ch=="<"){if(stream.eat("!")){if(stream.eat("[")){if(stream.match("CDATA["))return chain(inBlock("atom","]]>"));else return null;}else if(stream.match("--")){return chain(inBlock("comment","-->"));}else if(stream.match("DOCTYPE",true,true)){stream.eatWhile(/[\w\._\-]/);return chain(doctype(1));}else{return null;}}else if(stream.eat("?")){stream.eatWhile(/[\w\._\-]/);state.tokenize=inBlock("meta","?>");return"meta";}else{var isClose=stream.eat("/");tagName="";var c;while((c=stream.eat(/[^\s\u00a0=<>\"\'\/?]/)))tagName+=c;if(!tagName)return"tag error";type=isClose?"closeTag":"openTag";state.tokenize=inTag;return"tag";}}else if(ch=="&"){var ok;if(stream.eat("#")){if(stream.eat("x")){ok=stream.eatWhile(/[a-fA-F\d]/)&&stream.eat(";");}else{ok=stream.eatWhile(/[\d]/)&&stream.eat(";");}}else{ok=stream.eatWhile(/[\w\.\-:]/)&&stream.eat(";");}
+return ok?"atom":"error";}else{stream.eatWhile(/[^&<]/);return null;}}
+function inTag(stream,state){var ch=stream.next();if(ch==">"||(ch=="/"&&stream.eat(">"))){state.tokenize=inText;type=ch==">"?"endTag":"selfcloseTag";return"tag";}else if(ch=="="){type="equals";return null;}else if(ch=="<"){state.tokenize=inText;var next=state.tokenize(stream,state);return next?next+" error":"error";}else if(/[\'\"]/.test(ch)){state.tokenize=inAttribute(ch);state.stringStartCol=stream.column();return state.tokenize(stream,state);}else{stream.eatWhile(/[^\s\u00a0=<>\"\']/);return"word";}}
+function inAttribute(quote){var closure=function(stream,state){while(!stream.eol()){if(stream.next()==quote){state.tokenize=inTag;break;}}
+return"string";};closure.isInAttribute=true;return closure;}
+function inBlock(style,terminator){return function(stream,state){while(!stream.eol()){if(stream.match(terminator)){state.tokenize=inText;break;}
+stream.next();}
+return style;};}
+function doctype(depth){return function(stream,state){var ch;while((ch=stream.next())!=null){if(ch=="<"){state.tokenize=doctype(depth+1);return state.tokenize(stream,state);}else if(ch==">"){if(depth==1){state.tokenize=inText;break;}else{state.tokenize=doctype(depth-1);return state.tokenize(stream,state);}}}
+return"meta";};}
+var curState,curStream,setStyle;function pass(){for(var i=arguments.length-1;i>=0;i--)curState.cc.push(arguments[i]);}
+function cont(){pass.apply(null,arguments);return true;}
+function pushContext(tagName,startOfLine){var noIndent=Kludges.doNotIndent.hasOwnProperty(tagName)||(curState.context&&curState.context.noIndent);curState.context={prev:curState.context,tagName:tagName,indent:curState.indented,startOfLine:startOfLine,noIndent:noIndent};}
+function popContext(){if(curState.context)curState.context=curState.context.prev;}
+function element(type){if(type=="openTag"){curState.tagName=tagName;curState.tagStart=curStream.column();return cont(attributes,endtag(curState.startOfLine));}else if(type=="closeTag"){var err=false;if(curState.context){if(curState.context.tagName!=tagName){if(Kludges.implicitlyClosed.hasOwnProperty(curState.context.tagName.toLowerCase())){popContext();}
+err=!curState.context||curState.context.tagName!=tagName;}}else{err=true;}
+if(err)setStyle="error";return cont(endclosetag(err));}
+return cont();}
+function endtag(startOfLine){return function(type){var tagName=curState.tagName;curState.tagName=curState.tagStart=null;if(type=="selfcloseTag"||(type=="endTag"&&Kludges.autoSelfClosers.hasOwnProperty(tagName.toLowerCase()))){maybePopContext(tagName.toLowerCase());return cont();}
+if(type=="endTag"){maybePopContext(tagName.toLowerCase());pushContext(tagName,startOfLine);return cont();}
+return cont();};}
+function endclosetag(err){return function(type){if(err)setStyle="error";if(type=="endTag"){popContext();return cont();}
+setStyle="error";return cont(arguments.callee);};}
+function maybePopContext(nextTagName){var parentTagName;while(true){if(!curState.context){return;}
+parentTagName=curState.context.tagName.toLowerCase();if(!Kludges.contextGrabbers.hasOwnProperty(parentTagName)||!Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)){return;}
+popContext();}}
+function attributes(type){if(type=="word"){setStyle="attribute";return cont(attribute,attributes);}
+if(type=="endTag"||type=="selfcloseTag")return pass();setStyle="error";return cont(attributes);}
+function attribute(type){if(type=="equals")return cont(attvalue,attributes);if(!Kludges.allowMissing)setStyle="error";else if(type=="word"){setStyle="attribute";return cont(attribute,attributes);}
+return(type=="endTag"||type=="selfcloseTag")?pass():cont();}
+function attvalue(type){if(type=="string")return cont(attvaluemaybe);if(type=="word"&&Kludges.allowUnquoted){setStyle="string";return cont();}
+setStyle="error";return(type=="endTag"||type=="selfCloseTag")?pass():cont();}
+function attvaluemaybe(type){if(type=="string")return cont(attvaluemaybe);else return pass();}
+return{startState:function(){return{tokenize:inText,cc:[],indented:0,startOfLine:true,tagName:null,tagStart:null,context:null};},token:function(stream,state){if(!state.tagName&&stream.sol()){state.startOfLine=true;state.indented=stream.indentation();}
+if(stream.eatSpace())return null;setStyle=type=tagName=null;var style=state.tokenize(stream,state);state.type=type;if((style||type)&&style!="comment"){curState=state;curStream=stream;while(true){var comb=state.cc.pop()||element;if(comb(type||style))break;}}
+state.startOfLine=false;if(setStyle)
+style=setStyle=="error"?style+" error":setStyle;return style;},indent:function(state,textAfter,fullLine){var context=state.context;if(state.tokenize.isInAttribute){return state.stringStartCol+1;}
+if((state.tokenize!=inTag&&state.tokenize!=inText)||context&&context.noIndent)
+return fullLine?fullLine.match(/^(\s*)/)[0].length:0;if(state.tagName){if(multilineTagIndentPastTag)
+return state.tagStart+state.tagName.length+2;else
+return state.tagStart+indentUnit*multilineTagIndentFactor;}
+if(alignCDATA&&/<!\[CDATA\[/.test(textAfter))return 0;if(context&&/^<\//.test(textAfter))
+context=context.prev;while(context&&!context.startOfLine)
+context=context.prev;if(context)return context.indent+indentUnit;else return 0;},electricChars:"/",blockCommentStart:"<!--",blockCommentEnd:"-->",configuration:parserConfig.htmlMode?"html":"xml",helperType:parserConfig.htmlMode?"html":"xml"};});CodeMirror.defineMIME("text/xml","xml");CodeMirror.defineMIME("application/xml","xml");if(!CodeMirror.mimeModes.hasOwnProperty("text/html"))
+CodeMirror.defineMIME("text/html",{name:"xml",htmlMode:true});;CodeMirror.defineMode("htmlmixed",function(config,parserConfig){var htmlMode=CodeMirror.getMode(config,{name:"xml",htmlMode:true});var cssMode=CodeMirror.getMode(config,"css");var scriptTypes=[],scriptTypesConf=parserConfig&&parserConfig.scriptTypes;scriptTypes.push({matches:/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,mode:CodeMirror.getMode(config,"javascript")});if(scriptTypesConf)for(var i=0;i<scriptTypesConf.length;++i){var conf=scriptTypesConf[i];scriptTypes.push({matches:conf.matches,mode:conf.mode&&CodeMirror.getMode(config,conf.mode)});}
+scriptTypes.push({matches:/./,mode:CodeMirror.getMode(config,"text/plain")});function html(stream,state){var tagName=state.htmlState.tagName;var style=htmlMode.token(stream,state.htmlState);if(tagName=="script"&&/\btag\b/.test(style)&&stream.current()==">"){var scriptType=stream.string.slice(Math.max(0,stream.pos-100),stream.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);scriptType=scriptType?scriptType[1]:"";if(scriptType&&/[\"\']/.test(scriptType.charAt(0)))scriptType=scriptType.slice(1,scriptType.length-1);for(var i=0;i<scriptTypes.length;++i){var tp=scriptTypes[i];if(typeof tp.matches=="string"?scriptType==tp.matches:tp.matches.test(scriptType)){if(tp.mode){state.token=script;state.localMode=tp.mode;state.localState=tp.mode.startState&&tp.mode.startState(htmlMode.indent(state.htmlState,""));}
+break;}}}else if(tagName=="style"&&/\btag\b/.test(style)&&stream.current()==">"){state.token=css;state.localMode=cssMode;state.localState=cssMode.startState(htmlMode.indent(state.htmlState,""));}
+return style;}
+function maybeBackup(stream,pat,style){var cur=stream.current();var close=cur.search(pat),m;if(close>-1)stream.backUp(cur.length-close);else if(m=cur.match(/<\/?$/)){stream.backUp(cur.length);if(!stream.match(pat,false))stream.match(cur);}
+return style;}
+function script(stream,state){if(stream.match(/^<\/\s*script\s*>/i,false)){state.token=html;state.localState=state.localMode=null;return html(stream,state);}
+return maybeBackup(stream,/<\/\s*script\s*>/,state.localMode.token(stream,state.localState));}
+function css(stream,state){if(stream.match(/^<\/\s*style\s*>/i,false)){state.token=html;state.localState=state.localMode=null;return html(stream,state);}
+return maybeBackup(stream,/<\/\s*style\s*>/,cssMode.token(stream,state.localState));}
+return{startState:function(){var state=htmlMode.startState();return{token:html,localMode:null,localState:null,htmlState:state};},copyState:function(state){if(state.localState)
+var local=CodeMirror.copyState(state.localMode,state.localState);return{token:state.token,localMode:state.localMode,localState:local,htmlState:CodeMirror.copyState(htmlMode,state.htmlState)};},token:function(stream,state){return state.token(stream,state);},indent:function(state,textAfter){if(!state.localMode||/^\s*<\//.test(textAfter))
+return htmlMode.indent(state.htmlState,textAfter);else if(state.localMode.indent)
+return state.localMode.indent(state.localState,textAfter);else
+return CodeMirror.Pass;},electricChars:"/{}:",innerMode:function(state){return{state:state.localState||state.htmlState,mode:state.localMode||htmlMode};}};},"xml","javascript","css");CodeMirror.defineMIME("text/html","htmlmixed");;(function(){var ie_lt8=/MSIE \d/.test(navigator.userAgent)&&(document.documentMode==null||document.documentMode<8);var Pos=CodeMirror.Pos;var matching={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<"};function findMatchingBracket(cm,where,strict){var state=cm.state.matchBrackets;var maxScanLen=(state&&state.maxScanLineLength)||10000;var maxScanLines=(state&&state.maxScanLines)||100;var cur=where||cm.getCursor(),line=cm.getLineHandle(cur.line),pos=cur.ch-1;var match=(pos>=0&&matching[line.text.charAt(pos)])||matching[line.text.charAt(++pos)];if(!match)return null;var forward=match.charAt(1)==">",d=forward?1:-1;if(strict&&forward!=(pos==cur.ch))return null;var style=cm.getTokenTypeAt(Pos(cur.line,pos+1));var stack=[line.text.charAt(pos)],re=/[(){}[\]]/;function scan(line,lineNo,start){if(!line.text)return;var pos=forward?0:line.text.length-1,end=forward?line.text.length:-1;if(line.text.length>maxScanLen)return null;if(start!=null)pos=start+d;for(;pos!=end;pos+=d){var ch=line.text.charAt(pos);if(re.test(ch)&&cm.getTokenTypeAt(Pos(lineNo,pos+1))==style){var match=matching[ch];if(match.charAt(1)==">"==forward)stack.push(ch);else if(stack.pop()!=match.charAt(0))return{pos:pos,match:false};else if(!stack.length)return{pos:pos,match:true};}}}
+for(var i=cur.line,found,e=forward?Math.min(i+maxScanLines,cm.lineCount()):Math.max(-1,i-maxScanLines);i!=e;i+=d){if(i==cur.line)found=scan(line,i,pos);else found=scan(cm.getLineHandle(i),i);if(found)break;}
+return{from:Pos(cur.line,pos),to:found&&Pos(i,found.pos),match:found&&found.match,forward:forward};}
+function matchBrackets(cm,autoclear){var maxHighlightLen=cm.state.matchBrackets.maxHighlightLineLength||1000;var found=findMatchingBracket(cm);if(!found||cm.getLine(found.from.line).length>maxHighlightLen||found.to&&cm.getLine(found.to.line).length>maxHighlightLen)
+return;var style=found.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket";var one=cm.markText(found.from,Pos(found.from.line,found.from.ch+1),{className:style});var two=found.to&&cm.markText(found.to,Pos(found.to.line,found.to.ch+1),{className:style});if(ie_lt8&&cm.state.focused)cm.display.input.focus();var clear=function(){cm.operation(function(){one.clear();two&&two.clear();});};if(autoclear)setTimeout(clear,800);else return clear;}
+var currentlyHighlighted=null;function doMatchBrackets(cm){cm.operation(function(){if(currentlyHighlighted){currentlyHighlighted();currentlyHighlighted=null;}
+if(!cm.somethingSelected())currentlyHighlighted=matchBrackets(cm,false);});}
+CodeMirror.defineOption("matchBrackets",false,function(cm,val,old){if(old&&old!=CodeMirror.Init)
+cm.off("cursorActivity",doMatchBrackets);if(val){cm.state.matchBrackets=typeof val=="object"?val:{};cm.on("cursorActivity",doMatchBrackets);}});CodeMirror.defineExtension("matchBrackets",function(){matchBrackets(this,true);});CodeMirror.defineExtension("findMatchingBracket",function(pos,strict){return findMatchingBracket(this,pos,strict);});})();;(function(){var DEFAULT_BRACKETS="()[]{}''\"\"";var DEFAULT_EXPLODE_ON_ENTER="[]{}";var SPACE_CHAR_REGEX=/\s/;CodeMirror.defineOption("autoCloseBrackets",false,function(cm,val,old){if(old!=CodeMirror.Init&&old)
+cm.removeKeyMap("autoCloseBrackets");if(!val)return;var pairs=DEFAULT_BRACKETS,explode=DEFAULT_EXPLODE_ON_ENTER;if(typeof val=="string")pairs=val;else if(typeof val=="object"){if(val.pairs!=null)pairs=val.pairs;if(val.explode!=null)explode=val.explode;}
+var map=buildKeymap(pairs);if(explode)map.Enter=buildExplodeHandler(explode);cm.addKeyMap(map);});function charsAround(cm,pos){var str=cm.getRange(CodeMirror.Pos(pos.line,pos.ch-1),CodeMirror.Pos(pos.line,pos.ch+1));return str.length==2?str:null;}
+function buildKeymap(pairs){var map={name:"autoCloseBrackets",Backspace:function(cm){if(cm.somethingSelected())return CodeMirror.Pass;var cur=cm.getCursor(),around=charsAround(cm,cur);if(around&&pairs.indexOf(around)%2==0)
+cm.replaceRange("",CodeMirror.Pos(cur.line,cur.ch-1),CodeMirror.Pos(cur.line,cur.ch+1));else
+return CodeMirror.Pass;}};var closingBrackets="";for(var i=0;i<pairs.length;i+=2)(function(left,right){if(left!=right)closingBrackets+=right;function surround(cm){var selection=cm.getSelection();cm.replaceSelection(left+selection+right);}
+function maybeOverwrite(cm){var cur=cm.getCursor(),ahead=cm.getRange(cur,CodeMirror.Pos(cur.line,cur.ch+1));if(ahead!=right||cm.somethingSelected())return CodeMirror.Pass;else cm.execCommand("goCharRight");}
+map["'"+left+"'"]=function(cm){if(left=="'"&&cm.getTokenAt(cm.getCursor()).type=="comment")
+return CodeMirror.Pass;if(cm.somethingSelected())return surround(cm);if(left==right&&maybeOverwrite(cm)!=CodeMirror.Pass)return;var cur=cm.getCursor(),ahead=CodeMirror.Pos(cur.line,cur.ch+1);var line=cm.getLine(cur.line),nextChar=line.charAt(cur.ch),curChar=cur.ch>0?line.charAt(cur.ch-1):"";if(left==right&&CodeMirror.isWordChar(curChar))
+return CodeMirror.Pass;if(line.length==cur.ch||closingBrackets.indexOf(nextChar)>=0||SPACE_CHAR_REGEX.test(nextChar))
+cm.replaceSelection(left+right,{head:ahead,anchor:ahead});else
+return CodeMirror.Pass;};if(left!=right)map["'"+right+"'"]=maybeOverwrite;})(pairs.charAt(i),pairs.charAt(i+1));return map;}
+function buildExplodeHandler(pairs){return function(cm){var cur=cm.getCursor(),around=charsAround(cm,cur);if(!around||pairs.indexOf(around)%2!=0)return CodeMirror.Pass;cm.operation(function(){var newPos=CodeMirror.Pos(cur.line+1,0);cm.replaceSelection("\n\n",{anchor:newPos,head:newPos},"+input");cm.indentLine(cur.line+1,null,true);cm.indentLine(cur.line+2,null,true);});};}})();;(function(){"use strict";CodeMirror.defineOption("styleSelectedText",false,function(cm,val,old){var prev=old&&old!=CodeMirror.Init;if(val&&!prev){cm.state.markedSelection=[];cm.state.markedSelectionStyle=typeof val=="string"?val:"CodeMirror-selectedtext";reset(cm);cm.on("cursorActivity",onCursorActivity);cm.on("change",onChange);}else if(!val&&prev){cm.off("cursorActivity",onCursorActivity);cm.off("change",onChange);clear(cm);cm.state.markedSelection=cm.state.markedSelectionStyle=null;}});function onCursorActivity(cm){cm.operation(function(){update(cm);});}
+function onChange(cm){if(cm.state.markedSelection.length)
+cm.operation(function(){clear(cm);});}
+var CHUNK_SIZE=8;var Pos=CodeMirror.Pos;function cmp(pos1,pos2){return pos1.line-pos2.line||pos1.ch-pos2.ch;}
+function coverRange(cm,from,to,addAt){if(cmp(from,to)==0)return;var array=cm.state.markedSelection;var cls=cm.state.markedSelectionStyle;for(var line=from.line;;){var start=line==from.line?from:Pos(line,0);var endLine=line+CHUNK_SIZE,atEnd=endLine>=to.line;var end=atEnd?to:Pos(endLine,0);var mark=cm.markText(start,end,{className:cls});if(addAt==null)array.push(mark);else array.splice(addAt++,0,mark);if(atEnd)break;line=endLine;}}
+function clear(cm){var array=cm.state.markedSelection;for(var i=0;i<array.length;++i)array[i].clear();array.length=0;}
+function reset(cm){clear(cm);var from=cm.getCursor("start"),to=cm.getCursor("end");coverRange(cm,from,to);}
+function update(cm){var from=cm.getCursor("start"),to=cm.getCursor("end");if(cmp(from,to)==0)return clear(cm);var array=cm.state.markedSelection;if(!array.length)return coverRange(cm,from,to);var coverStart=array[0].find(),coverEnd=array[array.length-1].find();if(!coverStart||!coverEnd||to.line-from.line<CHUNK_SIZE||cmp(from,coverEnd.to)>=0||cmp(to,coverStart.from)<=0)
+return reset(cm);while(cmp(from,coverStart.from)>0){array.shift().clear();coverStart=array[0].find();}
+if(cmp(from,coverStart.from)<0){if(coverStart.to.line-from.line<CHUNK_SIZE){array.shift().clear();coverRange(cm,from,coverStart.to,0);}else{coverRange(cm,from,coverStart.from,0);}}
+while(cmp(to,coverEnd.to)<0){array.pop().clear();coverEnd=array[array.length-1].find();}
+if(cmp(to,coverEnd.to)>0){if(to.line-coverEnd.from.line<CHUNK_SIZE){array.pop().clear();coverRange(cm,coverEnd.from,to);}else{coverRange(cm,coverEnd.to,to);}}}})();;(function(){"use strict";var noOptions={};var nonWS=/[^\s\u00a0]/;var Pos=CodeMirror.Pos;function firstNonWS(str){var found=str.search(nonWS);return found==-1?0:found;}
+CodeMirror.commands.toggleComment=function(cm){var from=cm.getCursor("start"),to=cm.getCursor("end");cm.uncomment(from,to)||cm.lineComment(from,to);};CodeMirror.defineExtension("lineComment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=self.getModeAt(from);var commentString=options.lineComment||mode.lineComment;if(!commentString){if(options.blockCommentStart||mode.blockCommentStart){options.fullLines=true;self.blockComment(from,to,options);}
+return;}
+var firstLine=self.getLine(from.line);if(firstLine==null)return;var end=Math.min(to.ch!=0||to.line==from.line?to.line+1:to.line,self.lastLine()+1);var pad=options.padding==null?" ":options.padding;var blankLines=options.commentBlankLines||from.line==to.line;self.operation(function(){if(options.indent){var baseString=firstLine.slice(0,firstNonWS(firstLine));for(var i=from.line;i<end;++i){var line=self.getLine(i),cut=baseString.length;if(!blankLines&&!nonWS.test(line))continue;if(line.slice(0,cut)!=baseString)cut=firstNonWS(line);self.replaceRange(baseString+commentString+pad,Pos(i,0),Pos(i,cut));}}else{for(var i=from.line;i<end;++i){if(blankLines||nonWS.test(self.getLine(i)))
+self.replaceRange(commentString+pad,Pos(i,0));}}});});CodeMirror.defineExtension("blockComment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=self.getModeAt(from);var startString=options.blockCommentStart||mode.blockCommentStart;var endString=options.blockCommentEnd||mode.blockCommentEnd;if(!startString||!endString){if((options.lineComment||mode.lineComment)&&options.fullLines!=false)
+self.lineComment(from,to,options);return;}
+var end=Math.min(to.line,self.lastLine());if(end!=from.line&&to.ch==0&&nonWS.test(self.getLine(end)))--end;var pad=options.padding==null?" ":options.padding;if(from.line>end)return;self.operation(function(){if(options.fullLines!=false){var lastLineHasText=nonWS.test(self.getLine(end));self.replaceRange(pad+endString,Pos(end));self.replaceRange(startString+pad,Pos(from.line,0));var lead=options.blockCommentLead||mode.blockCommentLead;if(lead!=null)for(var i=from.line+1;i<=end;++i)
+if(i!=end||lastLineHasText)
+self.replaceRange(lead+pad,Pos(i,0));}else{self.replaceRange(endString,to);self.replaceRange(startString,from);}});});CodeMirror.defineExtension("uncomment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=self.getModeAt(from);var end=Math.min(to.line,self.lastLine()),start=Math.min(from.line,end);var lineString=options.lineComment||mode.lineComment,lines=[];var pad=options.padding==null?" ":options.padding,didSomething;lineComment:{if(!lineString)break lineComment;for(var i=start;i<=end;++i){var line=self.getLine(i);var found=line.indexOf(lineString);if(found==-1&&(i!=end||i==start)&&nonWS.test(line))break lineComment;if(i!=start&&found>-1&&nonWS.test(line.slice(0,found)))break lineComment;lines.push(line);}
+self.operation(function(){for(var i=start;i<=end;++i){var line=lines[i-start];var pos=line.indexOf(lineString),endPos=pos+lineString.length;if(pos<0)continue;if(line.slice(endPos,endPos+pad.length)==pad)endPos+=pad.length;didSomething=true;self.replaceRange("",Pos(i,pos),Pos(i,endPos));}});if(didSomething)return true;}
+var startString=options.blockCommentStart||mode.blockCommentStart;var endString=options.blockCommentEnd||mode.blockCommentEnd;if(!startString||!endString)return false;var lead=options.blockCommentLead||mode.blockCommentLead;var startLine=self.getLine(start),endLine=end==start?startLine:self.getLine(end);var open=startLine.indexOf(startString),close=endLine.lastIndexOf(endString);if(close==-1&&start!=end){endLine=self.getLine(--end);close=endLine.lastIndexOf(endString);}
+if(open==-1||close==-1)return false;self.operation(function(){self.replaceRange("",Pos(end,close-(pad&&endLine.slice(close-pad.length,close)==pad?pad.length:0)),Pos(end,close+endString.length));var openEnd=open+startString.length;if(pad&&startLine.slice(openEnd,openEnd+pad.length)==pad)openEnd+=pad.length;self.replaceRange("",Pos(start,open),Pos(start,openEnd));if(lead)for(var i=start+1;i<=end;++i){var line=self.getLine(i),found=line.indexOf(lead);if(found==-1||nonWS.test(line.slice(0,found)))continue;var foundEnd=found+lead.length;if(pad&&line.slice(foundEnd,foundEnd+pad.length)==pad)foundEnd+=pad.length;self.replaceRange("",Pos(i,found),Pos(i,foundEnd));}});return true;});})();;CodeMirror.overlayMode=CodeMirror.overlayParser=function(base,overlay,combine){return{startState:function(){return{base:CodeMirror.startState(base),overlay:CodeMirror.startState(overlay),basePos:0,baseCur:null,overlayPos:0,overlayCur:null};},copyState:function(state){return{base:CodeMirror.copyState(base,state.base),overlay:CodeMirror.copyState(overlay,state.overlay),basePos:state.basePos,baseCur:null,overlayPos:state.overlayPos,overlayCur:null};},token:function(stream,state){if(stream.start==state.basePos){state.baseCur=base.token(stream,state.base);state.basePos=stream.pos;}
+if(stream.start==state.overlayPos){stream.pos=stream.start;state.overlayCur=overlay.token(stream,state.overlay);state.overlayPos=stream.pos;}
+stream.pos=Math.min(state.basePos,state.overlayPos);if(stream.eol())state.basePos=state.overlayPos=0;if(state.overlayCur==null)return state.baseCur;if(state.baseCur!=null&&combine)return state.baseCur+" "+state.overlayCur;else return state.overlayCur;},indent:base.indent&&function(state,textAfter){return base.indent(state.base,textAfter);},electricChars:base.electricChars,innerMode:function(state){return{state:state.base,mode:base};},blankLine:function(state){if(base.blankLine)base.blankLine(state.base);if(overlay.blankLine)overlay.blankLine(state.overlay);}};};;CodeMirror.defineMode("htmlembedded",function(config,parserConfig){var scriptStartRegex=parserConfig.scriptStartRegex||/^<%/i,scriptEndRegex=parserConfig.scriptEndRegex||/^%>/i;var scriptingMode,htmlMixedMode;function htmlDispatch(stream,state){if(stream.match(scriptStartRegex,false)){state.token=scriptingDispatch;return scriptingMode.token(stream,state.scriptState);}
+else
+return htmlMixedMode.token(stream,state.htmlState);}
+function scriptingDispatch(stream,state){if(stream.match(scriptEndRegex,false)){state.token=htmlDispatch;return htmlMixedMode.token(stream,state.htmlState);}
+else
+return scriptingMode.token(stream,state.scriptState);}
+return{startState:function(){scriptingMode=scriptingMode||CodeMirror.getMode(config,parserConfig.scriptingModeSpec);htmlMixedMode=htmlMixedMode||CodeMirror.getMode(config,"htmlmixed");return{token:parserConfig.startOpen?scriptingDispatch:htmlDispatch,htmlState:CodeMirror.startState(htmlMixedMode),scriptState:CodeMirror.startState(scriptingMode)};},token:function(stream,state){return state.token(stream,state);},indent:function(state,textAfter){if(state.token==htmlDispatch)
+return htmlMixedMode.indent(state.htmlState,textAfter);else if(scriptingMode.indent)
+return scriptingMode.indent(state.scriptState,textAfter);},copyState:function(state){return{token:state.token,htmlState:CodeMirror.copyState(htmlMixedMode,state.htmlState),scriptState:CodeMirror.copyState(scriptingMode,state.scriptState)};},electricChars:"/{}:",innerMode:function(state){if(state.token==scriptingDispatch)return{state:state.scriptState,mode:scriptingMode};else return{state:state.htmlState,mode:htmlMixedMode};}};},"htmlmixed");CodeMirror.defineMIME("application/x-ejs",{name:"htmlembedded",scriptingModeSpec:"javascript"});CodeMirror.defineMIME("application/x-aspx",{name:"htmlembedded",scriptingModeSpec:"text/x-csharp"});CodeMirror.defineMIME("application/x-jsp",{name:"htmlembedded",scriptingModeSpec:"text/x-java"});CodeMirror.defineMIME("application/x-erb",{name:"htmlembedded",scriptingModeSpec:"ruby"});;CodeMirror.defineMode("clike",function(config,parserConfig){var indentUnit=config.indentUnit,statementIndentUnit=parserConfig.statementIndentUnit||indentUnit,dontAlignCalls=parserConfig.dontAlignCalls,keywords=parserConfig.keywords||{},builtin=parserConfig.builtin||{},blockKeywords=parserConfig.blockKeywords||{},atoms=parserConfig.atoms||{},hooks=parserConfig.hooks||{},multiLineStrings=parserConfig.multiLineStrings;var isOperatorChar=/[+\-*&%=<>!?|\/]/;var curPunc;function tokenBase(stream,state){var ch=stream.next();if(hooks[ch]){var result=hooks[ch](stream,state);if(result!==false)return result;}
+if(ch=='"'||ch=="'"){state.tokenize=tokenString(ch);return state.tokenize(stream,state);}
+if(/[\[\]{}\(\),;\:\.]/.test(ch)){curPunc=ch;return null;}
+if(/\d/.test(ch)){stream.eatWhile(/[\w\.]/);return"number";}
+if(ch=="/"){if(stream.eat("*")){state.tokenize=tokenComment;return tokenComment(stream,state);}
+if(stream.eat("/")){stream.skipToEnd();return"comment";}}
+if(isOperatorChar.test(ch)){stream.eatWhile(isOperatorChar);return"operator";}
+stream.eatWhile(/[\w\$_]/);var cur=stream.current();if(keywords.propertyIsEnumerable(cur)){if(blockKeywords.propertyIsEnumerable(cur))curPunc="newstatement";return"keyword";}
+if(builtin.propertyIsEnumerable(cur)){if(blockKeywords.propertyIsEnumerable(cur))curPunc="newstatement";return"builtin";}
+if(atoms.propertyIsEnumerable(cur))return"atom";return"variable";}
+function tokenString(quote){return function(stream,state){var escaped=false,next,end=false;while((next=stream.next())!=null){if(next==quote&&!escaped){end=true;break;}
+escaped=!escaped&&next=="\\";}
+if(end||!(escaped||multiLineStrings))
+state.tokenize=null;return"string";};}
+function tokenComment(stream,state){var maybeEnd=false,ch;while(ch=stream.next()){if(ch=="/"&&maybeEnd){state.tokenize=null;break;}
+maybeEnd=(ch=="*");}
+return"comment";}
+function Context(indented,column,type,align,prev){this.indented=indented;this.column=column;this.type=type;this.align=align;this.prev=prev;}
+function pushContext(state,col,type){var indent=state.indented;if(state.context&&state.context.type=="statement")
+indent=state.context.indented;return state.context=new Context(indent,col,type,null,state.context);}
+function popContext(state){var t=state.context.type;if(t==")"||t=="]"||t=="}")
+state.indented=state.context.indented;return state.context=state.context.prev;}
+return{startState:function(basecolumn){return{tokenize:null,context:new Context((basecolumn||0)-indentUnit,0,"top",false),indented:0,startOfLine:true};},token:function(stream,state){var ctx=state.context;if(stream.sol()){if(ctx.align==null)ctx.align=false;state.indented=stream.indentation();state.startOfLine=true;}
+if(stream.eatSpace())return null;curPunc=null;var style=(state.tokenize||tokenBase)(stream,state);if(style=="comment"||style=="meta")return style;if(ctx.align==null)ctx.align=true;if((curPunc==";"||curPunc==":"||curPunc==",")&&ctx.type=="statement")popContext(state);else if(curPunc=="{")pushContext(state,stream.column(),"}");else if(curPunc=="[")pushContext(state,stream.column(),"]");else if(curPunc=="(")pushContext(state,stream.column(),")");else if(curPunc=="}"){while(ctx.type=="statement")ctx=popContext(state);if(ctx.type=="}")ctx=popContext(state);while(ctx.type=="statement")ctx=popContext(state);}
+else if(curPunc==ctx.type)popContext(state);else if(((ctx.type=="}"||ctx.type=="top")&&curPunc!=';')||(ctx.type=="statement"&&curPunc=="newstatement"))
+pushContext(state,stream.column(),"statement");state.startOfLine=false;return style;},indent:function(state,textAfter){if(state.tokenize!=tokenBase&&state.tokenize!=null)return CodeMirror.Pass;var ctx=state.context,firstChar=textAfter&&textAfter.charAt(0);if(ctx.type=="statement"&&firstChar=="}")ctx=ctx.prev;var closing=firstChar==ctx.type;if(ctx.type=="statement")return ctx.indented+(firstChar=="{"?0:statementIndentUnit);else if(ctx.align&&(!dontAlignCalls||ctx.type!=")"))return ctx.column+(closing?0:1);else if(ctx.type==")"&&!closing)return ctx.indented+statementIndentUnit;else return ctx.indented+(closing?0:indentUnit);},electricChars:"{}",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",fold:"brace"};});(function(){function words(str){var obj={},words=str.split(" ");for(var i=0;i<words.length;++i)obj[words[i]]=true;return obj;}
+var cKeywords="auto if break int case long char register continue return default short do sizeof "+"double static else struct entry switch extern typedef float union for unsigned "+"goto while enum void const signed volatile";function cppHook(stream,state){if(!state.startOfLine)return false;for(;;){if(stream.skipTo("\\")){stream.next();if(stream.eol()){state.tokenize=cppHook;break;}}else{stream.skipToEnd();state.tokenize=null;break;}}
+return"meta";}
+function tokenAtString(stream,state){var next;while((next=stream.next())!=null){if(next=='"'&&!stream.eat('"')){state.tokenize=null;break;}}
+return"string";}
+function mimes(ms,mode){for(var i=0;i<ms.length;++i)CodeMirror.defineMIME(ms[i],mode);}
+mimes(["text/x-csrc","text/x-c","text/x-chdr"],{name:"clike",keywords:words(cKeywords),blockKeywords:words("case do else for if switch while struct"),atoms:words("null"),hooks:{"#":cppHook}});mimes(["text/x-c++src","text/x-c++hdr"],{name:"clike",keywords:words(cKeywords+" asm dynamic_cast namespace reinterpret_cast try bool explicit new "+"static_cast typeid catch operator template typename class friend private "+"this using const_cast inline public throw virtual delete mutable protected "+"wchar_t"),blockKeywords:words("catch class do else finally for if struct switch try while"),atoms:words("true false null"),hooks:{"#":cppHook}});CodeMirror.defineMIME("text/x-java",{name:"clike",keywords:words("abstract assert boolean break byte case catch char class const continue default "+"do double else enum extends final finally float for goto if implements import "+"instanceof int interface long native new package private protected public "+"return short static strictfp super switch synchronized this throw throws transient "+"try void volatile while"),blockKeywords:words("catch class do else finally for if switch try while"),atoms:words("true false null"),hooks:{"@":function(stream){stream.eatWhile(/[\w\$_]/);return"meta";}}});CodeMirror.defineMIME("text/x-csharp",{name:"clike",keywords:words("abstract as base break case catch checked class const continue"+" default delegate do else enum event explicit extern finally fixed for"+" foreach goto if implicit in interface internal is lock namespace new"+" operator out override params private protected public readonly ref return sealed"+" sizeof stackalloc static struct switch this throw try typeof unchecked"+" unsafe using virtual void volatile while add alias ascending descending dynamic from get"+" global group into join let orderby partial remove select set value var yield"),blockKeywords:words("catch class do else finally for foreach if struct switch try while"),builtin:words("Boolean Byte Char DateTime DateTimeOffset Decimal Double"+" Guid Int16 Int32 Int64 Object SByte Single String TimeSpan UInt16 UInt32"+" UInt64 bool byte char decimal double short int long object"+" sbyte float string ushort uint ulong"),atoms:words("true false null"),hooks:{"@":function(stream,state){if(stream.eat('"')){state.tokenize=tokenAtString;return tokenAtString(stream,state);}
+stream.eatWhile(/[\w\$_]/);return"meta";}}});CodeMirror.defineMIME("text/x-scala",{name:"clike",keywords:words("abstract case catch class def do else extends false final finally for forSome if "+"implicit import lazy match new null object override package private protected return "+"sealed super this throw trait try trye type val var while with yield _ : = => <- <: "+"<% >: # @ "+"assert assume require print println printf readLine readBoolean readByte readShort "+"readChar readInt readLong readFloat readDouble "+"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either "+"Enumeration Equiv Error Exception Fractional Function IndexedSeq Integral Iterable "+"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering "+"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder "+"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector :: #:: "+"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable "+"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process "+"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String "+"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"),blockKeywords:words("catch class do else finally for forSome if match switch try while"),atoms:words("true false null"),hooks:{"@":function(stream){stream.eatWhile(/[\w\$_]/);return"meta";}}});mimes(["x-shader/x-vertex","x-shader/x-fragment"],{name:"clike",keywords:words("float int bool void "+"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 "+"mat2 mat3 mat4 "+"sampler1D sampler2D sampler3D samplerCube "+"sampler1DShadow sampler2DShadow"+"const attribute uniform varying "+"break continue discard return "+"for while do if else struct "+"in out inout"),blockKeywords:words("for while do if else struct"),builtin:words("radians degrees sin cos tan asin acos atan "+"pow exp log exp2 sqrt inversesqrt "+"abs sign floor ceil fract mod min max clamp mix step smootstep "+"length distance dot cross normalize ftransform faceforward "+"reflect refract matrixCompMult "+"lessThan lessThanEqual greaterThan greaterThanEqual "+"equal notEqual any all not "+"texture1D texture1DProj texture1DLod texture1DProjLod "+"texture2D texture2DProj texture2DLod texture2DProjLod "+"texture3D texture3DProj texture3DLod texture3DProjLod "+"textureCube textureCubeLod "+"shadow1D shadow2D shadow1DProj shadow2DProj "+"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod "+"dFdx dFdy fwidth "+"noise1 noise2 noise3 noise4"),atoms:words("true false "+"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex "+"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 "+"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 "+"gl_FogCoord "+"gl_Position gl_PointSize gl_ClipVertex "+"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor "+"gl_TexCoord gl_FogFragCoord "+"gl_FragCoord gl_FrontFacing "+"gl_FragColor gl_FragData gl_FragDepth "+"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix "+"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse "+"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse "+"gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose "+"gl_ProjectionMatrixInverseTranspose "+"gl_ModelViewProjectionMatrixInverseTranspose "+"gl_TextureMatrixInverseTranspose "+"gl_NormalScale gl_DepthRange gl_ClipPlane "+"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel "+"gl_FrontLightModelProduct gl_BackLightModelProduct "+"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ "+"gl_FogParameters "+"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords "+"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats "+"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits "+"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits "+"gl_MaxDrawBuffers"),hooks:{"#":cppHook}});}());;CodeMirror.defineMode("coffeescript",function(conf){var ERRORCLASS="error";function wordRegexp(words){return new RegExp("^(("+words.join(")|(")+"))\\b");}
+var operators=/^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?)/;var delimiters=/^(?:[()\[\]{},:`=;]|\.\.?\.?)/;var identifiers=/^[_A-Za-z$][_A-Za-z$0-9]*/;var properties=/^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*/;var wordOperators=wordRegexp(["and","or","not","is","isnt","in","instanceof","typeof"]);var indentKeywords=["for","while","loop","if","unless","else","switch","try","catch","finally","class"];var commonKeywords=["break","by","continue","debugger","delete","do","in","of","new","return","then","this","throw","when","until"];var keywords=wordRegexp(indentKeywords.concat(commonKeywords));indentKeywords=wordRegexp(indentKeywords);var stringPrefixes=/^('{3}|\"{3}|['\"])/;var regexPrefixes=/^(\/{3}|\/)/;var commonConstants=["Infinity","NaN","undefined","null","true","false","on","off","yes","no"];var constants=wordRegexp(commonConstants);function tokenBase(stream,state){if(stream.sol()){if(state.scope.align===null)state.scope.align=false;var scopeOffset=state.scope.offset;if(stream.eatSpace()){var lineOffset=stream.indentation();if(lineOffset>scopeOffset&&state.scope.type=="coffee"){return"indent";}else if(lineOffset<scopeOffset){return"dedent";}
+return null;}else{if(scopeOffset>0){dedent(stream,state);}}}
+if(stream.eatSpace()){return null;}
+var ch=stream.peek();if(stream.match("####")){stream.skipToEnd();return"comment";}
+if(stream.match("###")){state.tokenize=longComment;return state.tokenize(stream,state);}
+if(ch==="#"){stream.skipToEnd();return"comment";}
+if(stream.match(/^-?[0-9\.]/,false)){var floatLiteral=false;if(stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)){floatLiteral=true;}
+if(stream.match(/^-?\d+\.\d*/)){floatLiteral=true;}
+if(stream.match(/^-?\.\d+/)){floatLiteral=true;}
+if(floatLiteral){if(stream.peek()=="."){stream.backUp(1);}
+return"number";}
+var intLiteral=false;if(stream.match(/^-?0x[0-9a-f]+/i)){intLiteral=true;}
+if(stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)){intLiteral=true;}
+if(stream.match(/^-?0(?![\dx])/i)){intLiteral=true;}
+if(intLiteral){return"number";}}
+if(stream.match(stringPrefixes)){state.tokenize=tokenFactory(stream.current(),"string");return state.tokenize(stream,state);}
+if(stream.match(regexPrefixes)){if(stream.current()!="/"||stream.match(/^.*\//,false)){state.tokenize=tokenFactory(stream.current(),"string-2");return state.tokenize(stream,state);}else{stream.backUp(1);}}
+if(stream.match(operators)||stream.match(wordOperators)){return"operator";}
+if(stream.match(delimiters)){return"punctuation";}
+if(stream.match(constants)){return"atom";}
+if(stream.match(keywords)){return"keyword";}
+if(stream.match(identifiers)){return"variable";}
+if(stream.match(properties)){return"property";}
+stream.next();return ERRORCLASS;}
+function tokenFactory(delimiter,outclass){var singleline=delimiter.length==1;return function(stream,state){while(!stream.eol()){stream.eatWhile(/[^'"\/\\]/);if(stream.eat("\\")){stream.next();if(singleline&&stream.eol()){return outclass;}}else if(stream.match(delimiter)){state.tokenize=tokenBase;return outclass;}else{stream.eat(/['"\/]/);}}
+if(singleline){if(conf.mode.singleLineStringErrors){outclass=ERRORCLASS;}else{state.tokenize=tokenBase;}}
+return outclass;};}
+function longComment(stream,state){while(!stream.eol()){stream.eatWhile(/[^#]/);if(stream.match("###")){state.tokenize=tokenBase;break;}
+stream.eatWhile("#");}
+return"comment";}
+function indent(stream,state,type){type=type||"coffee";var offset=0,align=false,alignOffset=null;for(var scope=state.scope;scope;scope=scope.prev){if(scope.type==="coffee"){offset=scope.offset+conf.indentUnit;break;}}
+if(type!=="coffee"){align=null;alignOffset=stream.column()+stream.current().length;}else if(state.scope.align){state.scope.align=false;}
+state.scope={offset:offset,type:type,prev:state.scope,align:align,alignOffset:alignOffset};}
+function dedent(stream,state){if(!state.scope.prev)return;if(state.scope.type==="coffee"){var _indent=stream.indentation();var matched=false;for(var scope=state.scope;scope;scope=scope.prev){if(_indent===scope.offset){matched=true;break;}}
+if(!matched){return true;}
+while(state.scope.prev&&state.scope.offset!==_indent){state.scope=state.scope.prev;}
+return false;}else{state.scope=state.scope.prev;return false;}}
+function tokenLexer(stream,state){var style=state.tokenize(stream,state);var current=stream.current();if(current==="."){style=state.tokenize(stream,state);current=stream.current();if(/^\.[\w$]+$/.test(current)){return"variable";}else{return ERRORCLASS;}}
+if(current==="return"){state.dedent+=1;}
+if(((current==="->"||current==="=>")&&!state.lambda&&!stream.peek())||style==="indent"){indent(stream,state);}
+var delimiter_index="[({".indexOf(current);if(delimiter_index!==-1){indent(stream,state,"])}".slice(delimiter_index,delimiter_index+1));}
+if(indentKeywords.exec(current)){indent(stream,state);}
+if(current=="then"){dedent(stream,state);}
+if(style==="dedent"){if(dedent(stream,state)){return ERRORCLASS;}}
+delimiter_index="])}".indexOf(current);if(delimiter_index!==-1){while(state.scope.type=="coffee"&&state.scope.prev)
+state.scope=state.scope.prev;if(state.scope.type==current)
+state.scope=state.scope.prev;}
+if(state.dedent>0&&stream.eol()&&state.scope.type=="coffee"){if(state.scope.prev)state.scope=state.scope.prev;state.dedent-=1;}
+return style;}
+var external={startState:function(basecolumn){return{tokenize:tokenBase,scope:{offset:basecolumn||0,type:"coffee",prev:null,align:false},lastToken:null,lambda:false,dedent:0};},token:function(stream,state){var fillAlign=state.scope.align===null&&state.scope;if(fillAlign&&stream.sol())fillAlign.align=false;var style=tokenLexer(stream,state);if(fillAlign&&style&&style!="comment")fillAlign.align=true;state.lastToken={style:style,content:stream.current()};if(stream.eol()&&stream.lambda){state.lambda=false;}
+return style;},indent:function(state,text){if(state.tokenize!=tokenBase)return 0;var scope=state.scope;var closer=text&&"])}".indexOf(text.charAt(0))>-1;if(closer)while(scope.type=="coffee"&&scope.prev)scope=scope.prev;var closes=closer&&scope.type===text.charAt(0);if(scope.align)
+return scope.alignOffset-(closes?1:0);else
+return(closes?scope.prev:scope).offset;},lineComment:"#",fold:"indent"};return external;});CodeMirror.defineMIME("text/x-coffeescript","coffeescript");;(function(){function keywords(str){var obj={},words=str.split(" ");for(var i=0;i<words.length;++i)obj[words[i]]=true;return obj;}
+function heredoc(delim){return function(stream,state){if(stream.match(delim))state.tokenize=null;else stream.skipToEnd();return"string";};}
+var phpConfig={name:"clike",keywords:keywords("abstract and array as break case catch class clone const continue declare default "+"do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final "+"for foreach function global goto if implements interface instanceof namespace "+"new or private protected public static switch throw trait try use var while xor "+"die echo empty exit eval include include_once isset list require require_once return "+"print unset __halt_compiler self static parent yield insteadof finally"),blockKeywords:keywords("catch do else elseif for foreach if switch try while finally"),atoms:keywords("true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"),builtin:keywords("func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once"),multiLineStrings:true,hooks:{"$":function(stream){stream.eatWhile(/[\w\$_]/);return"variable-2";},"<":function(stream,state){if(stream.match(/<</)){stream.eatWhile(/[\w\.]/);state.tokenize=heredoc(stream.current().slice(3));return state.tokenize(stream,state);}
+return false;},"#":function(stream){while(!stream.eol()&&!stream.match("?>",false))stream.next();return"comment";},"/":function(stream){if(stream.eat("/")){while(!stream.eol()&&!stream.match("?>",false))stream.next();return"comment";}
+return false;}}};CodeMirror.defineMode("php",function(config,parserConfig){var htmlMode=CodeMirror.getMode(config,"text/html");var phpMode=CodeMirror.getMode(config,phpConfig);function dispatch(stream,state){var isPHP=state.curMode==phpMode;if(stream.sol()&&state.pending!='"')state.pending=null;if(!isPHP){if(stream.match(/^<\?\w*/)){state.curMode=phpMode;state.curState=state.php;return"meta";}
+if(state.pending=='"'){while(!stream.eol()&&stream.next()!='"'){}
+var style="string";}else if(state.pending&&stream.pos<state.pending.end){stream.pos=state.pending.end;var style=state.pending.style;}else{var style=htmlMode.token(stream,state.curState);}
+state.pending=null;var cur=stream.current(),openPHP=cur.search(/<\?/);if(openPHP!=-1){if(style=="string"&&/\"$/.test(cur)&&!/\?>/.test(cur))state.pending='"';else state.pending={end:stream.pos,style:style};stream.backUp(cur.length-openPHP);}
+return style;}else if(isPHP&&state.php.tokenize==null&&stream.match("?>")){state.curMode=htmlMode;state.curState=state.html;return"meta";}else{return phpMode.token(stream,state.curState);}}
+return{startState:function(){var html=CodeMirror.startState(htmlMode),php=CodeMirror.startState(phpMode);return{html:html,php:php,curMode:parserConfig.startOpen?phpMode:htmlMode,curState:parserConfig.startOpen?php:html,pending:null};},copyState:function(state){var html=state.html,htmlNew=CodeMirror.copyState(htmlMode,html),php=state.php,phpNew=CodeMirror.copyState(phpMode,php),cur;if(state.curMode==htmlMode)cur=htmlNew;else cur=phpNew;return{html:htmlNew,php:phpNew,curMode:state.curMode,curState:cur,pending:state.pending};},token:dispatch,indent:function(state,textAfter){if((state.curMode!=phpMode&&/^\s*<\//.test(textAfter))||(state.curMode==phpMode&&/^\?>/.test(textAfter)))
+return htmlMode.indent(state.html,textAfter);return state.curMode.indent(state.curState,textAfter);},electricChars:"/{}:",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",innerMode:function(state){return{state:state.curState,mode:state.curMode};}};},"htmlmixed","clike");CodeMirror.defineMIME("application/x-httpd-php","php");CodeMirror.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:true});CodeMirror.defineMIME("text/x-php",phpConfig);})();;CodeMirror.defineMode("python",function(conf,parserConf){var ERRORCLASS='error';function wordRegexp(words){return new RegExp("^(("+words.join(")|(")+"))\\b");}
+var singleOperators=parserConf.singleOperators||new RegExp("^[\\+\\-\\*/%&|\\^~<>!]");var singleDelimiters=parserConf.singleDelimiters||new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]');var doubleOperators=parserConf.doubleOperators||new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))");var doubleDelimiters=parserConf.doubleDelimiters||new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))");var tripleDelimiters=parserConf.tripleDelimiters||new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");var identifiers=parserConf.identifiers||new RegExp("^[_A-Za-z][_A-Za-z0-9]*");var wordOperators=wordRegexp(['and','or','not','is','in']);var commonkeywords=['as','assert','break','class','continue','def','del','elif','else','except','finally','for','from','global','if','import','lambda','pass','raise','return','try','while','with','yield'];var commonBuiltins=['abs','all','any','bin','bool','bytearray','callable','chr','classmethod','compile','complex','delattr','dict','dir','divmod','enumerate','eval','filter','float','format','frozenset','getattr','globals','hasattr','hash','help','hex','id','input','int','isinstance','issubclass','iter','len','list','locals','map','max','memoryview','min','next','object','oct','open','ord','pow','property','range','repr','reversed','round','set','setattr','slice','sorted','staticmethod','str','sum','super','tuple','type','vars','zip','__import__','NotImplemented','Ellipsis','__debug__'];var py2={'builtins':['apply','basestring','buffer','cmp','coerce','execfile','file','intern','long','raw_input','reduce','reload','unichr','unicode','xrange','False','True','None'],'keywords':['exec','print']};var py3={'builtins':['ascii','bytes','exec','print'],'keywords':['nonlocal','False','True','None']};if(parserConf.extra_keywords!=undefined){commonkeywords=commonkeywords.concat(parserConf.extra_keywords);}
+if(parserConf.extra_builtins!=undefined){commonBuiltins=commonBuiltins.concat(parserConf.extra_builtins);}
+if(!!parserConf.version&&parseInt(parserConf.version,10)===3){commonkeywords=commonkeywords.concat(py3.keywords);commonBuiltins=commonBuiltins.concat(py3.builtins);var stringPrefixes=new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))","i");}else{commonkeywords=commonkeywords.concat(py2.keywords);commonBuiltins=commonBuiltins.concat(py2.builtins);var stringPrefixes=new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))","i");}
+var keywords=wordRegexp(commonkeywords);var builtins=wordRegexp(commonBuiltins);var indentInfo=null;function tokenBase(stream,state){if(stream.sol()){var scopeOffset=state.scopes[0].offset;if(stream.eatSpace()){var lineOffset=stream.indentation();if(lineOffset>scopeOffset){indentInfo='indent';}else if(lineOffset<scopeOffset){indentInfo='dedent';}
+return null;}else{if(scopeOffset>0){dedent(stream,state);}}}
+if(stream.eatSpace()){return null;}
+var ch=stream.peek();if(ch==='#'){stream.skipToEnd();return'comment';}
+if(stream.match(/^[0-9\.]/,false)){var floatLiteral=false;if(stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)){floatLiteral=true;}
+if(stream.match(/^\d+\.\d*/)){floatLiteral=true;}
+if(stream.match(/^\.\d+/)){floatLiteral=true;}
+if(floatLiteral){stream.eat(/J/i);return'number';}
+var intLiteral=false;if(stream.match(/^0x[0-9a-f]+/i)){intLiteral=true;}
+if(stream.match(/^0b[01]+/i)){intLiteral=true;}
+if(stream.match(/^0o[0-7]+/i)){intLiteral=true;}
+if(stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)){stream.eat(/J/i);intLiteral=true;}
+if(stream.match(/^0(?![\dx])/i)){intLiteral=true;}
+if(intLiteral){stream.eat(/L/i);return'number';}}
+if(stream.match(stringPrefixes)){state.tokenize=tokenStringFactory(stream.current());return state.tokenize(stream,state);}
+if(stream.match(tripleDelimiters)||stream.match(doubleDelimiters)){return null;}
+if(stream.match(doubleOperators)||stream.match(singleOperators)||stream.match(wordOperators)){return'operator';}
+if(stream.match(singleDelimiters)){return null;}
+if(stream.match(keywords)){return'keyword';}
+if(stream.match(builtins)){return'builtin';}
+if(stream.match(identifiers)){if(state.lastToken=='def'||state.lastToken=='class'){return'def';}
+return'variable';}
+stream.next();return ERRORCLASS;}
+function tokenStringFactory(delimiter){while('rub'.indexOf(delimiter.charAt(0).toLowerCase())>=0){delimiter=delimiter.substr(1);}
+var singleline=delimiter.length==1;var OUTCLASS='string';function tokenString(stream,state){while(!stream.eol()){stream.eatWhile(/[^'"\\]/);if(stream.eat('\\')){stream.next();if(singleline&&stream.eol()){return OUTCLASS;}}else if(stream.match(delimiter)){state.tokenize=tokenBase;return OUTCLASS;}else{stream.eat(/['"]/);}}
+if(singleline){if(parserConf.singleLineStringErrors){return ERRORCLASS;}else{state.tokenize=tokenBase;}}
+return OUTCLASS;}
+tokenString.isString=true;return tokenString;}
+function indent(stream,state,type){type=type||'py';var indentUnit=0;if(type==='py'){if(state.scopes[0].type!=='py'){state.scopes[0].offset=stream.indentation();return;}
+for(var i=0;i<state.scopes.length;++i){if(state.scopes[i].type==='py'){indentUnit=state.scopes[i].offset+conf.indentUnit;break;}}}else{indentUnit=stream.column()+stream.current().length;}
+state.scopes.unshift({offset:indentUnit,type:type});}
+function dedent(stream,state,type){type=type||'py';if(state.scopes.length==1)return;if(state.scopes[0].type==='py'){var _indent=stream.indentation();var _indent_index=-1;for(var i=0;i<state.scopes.length;++i){if(_indent===state.scopes[i].offset){_indent_index=i;break;}}
+if(_indent_index===-1){return true;}
+while(state.scopes[0].offset!==_indent){state.scopes.shift();}
+return false;}else{if(type==='py'){state.scopes[0].offset=stream.indentation();return false;}else{if(state.scopes[0].type!=type){return true;}
+state.scopes.shift();return false;}}}
+function tokenLexer(stream,state){indentInfo=null;var style=state.tokenize(stream,state);var current=stream.current();if(current==='.'){style=stream.match(identifiers,false)?null:ERRORCLASS;if(style===null&&state.lastStyle==='meta'){style='meta';}
+return style;}
+if(current==='@'){return stream.match(identifiers,false)?'meta':ERRORCLASS;}
+if((style==='variable'||style==='builtin')&&state.lastStyle==='meta'){style='meta';}
+if(current==='pass'||current==='return'){state.dedent+=1;}
+if(current==='lambda')state.lambda=true;if((current===':'&&!state.lambda&&state.scopes[0].type=='py')||indentInfo==='indent'){indent(stream,state);}
+var delimiter_index='[({'.indexOf(current);if(delimiter_index!==-1){indent(stream,state,'])}'.slice(delimiter_index,delimiter_index+1));}
+if(indentInfo==='dedent'){if(dedent(stream,state)){return ERRORCLASS;}}
+delimiter_index='])}'.indexOf(current);if(delimiter_index!==-1){if(dedent(stream,state,current)){return ERRORCLASS;}}
+if(state.dedent>0&&stream.eol()&&state.scopes[0].type=='py'){if(state.scopes.length>1)state.scopes.shift();state.dedent-=1;}
+return style;}
+var external={startState:function(basecolumn){return{tokenize:tokenBase,scopes:[{offset:basecolumn||0,type:'py'}],lastStyle:null,lastToken:null,lambda:false,dedent:0};},token:function(stream,state){var style=tokenLexer(stream,state);state.lastStyle=style;var current=stream.current();if(current&&style){state.lastToken=current;}
+if(stream.eol()&&state.lambda){state.lambda=false;}
+return style;},indent:function(state){if(state.tokenize!=tokenBase){return state.tokenize.isString?CodeMirror.Pass:0;}
+return state.scopes[0].offset;},lineComment:"#",fold:"indent"};return external;});CodeMirror.defineMIME("text/x-python","python");(function(){"use strict";var words=function(str){return str.split(' ');};CodeMirror.defineMIME("text/x-cython",{name:"python",extra_keywords:words("by cdef cimport cpdef ctypedef enum except"+"extern gil include nogil property public"+"readonly struct union DEF IF ELIF ELSE")});})();;CodeMirror.defineMode('shell',function(){var words={};function define(style,string){var split=string.split(' ');for(var i=0;i<split.length;i++){words[split[i]]=style;}};define('atom','true false');define('keyword','if then do else elif while until for in esac fi fin '+'fil done exit set unset export function');define('builtin','ab awk bash beep cat cc cd chown chmod chroot clear cp '+'curl cut diff echo find gawk gcc get git grep kill killall ln ls make '+'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh '+'shopt shred source sort sleep ssh start stop su sudo tee telnet top '+'touch vi vim wall wc wget who write yes zsh');function tokenBase(stream,state){var sol=stream.sol();var ch=stream.next();if(ch==='\''||ch==='"'||ch==='`'){state.tokens.unshift(tokenString(ch));return tokenize(stream,state);}
+if(ch==='#'){if(sol&&stream.eat('!')){stream.skipToEnd();return'meta';}
+stream.skipToEnd();return'comment';}
+if(ch==='$'){state.tokens.unshift(tokenDollar);return tokenize(stream,state);}
+if(ch==='+'||ch==='='){return'operator';}
+if(ch==='-'){stream.eat('-');stream.eatWhile(/\w/);return'attribute';}
+if(/\d/.test(ch)){stream.eatWhile(/\d/);if(!/\w/.test(stream.peek())){return'number';}}
+stream.eatWhile(/[\w-]/);var cur=stream.current();if(stream.peek()==='='&&/\w+/.test(cur))return'def';return words.hasOwnProperty(cur)?words[cur]:null;}
+function tokenString(quote){return function(stream,state){var next,end=false,escaped=false;while((next=stream.next())!=null){if(next===quote&&!escaped){end=true;break;}
+if(next==='$'&&!escaped&&quote!=='\''){escaped=true;stream.backUp(1);state.tokens.unshift(tokenDollar);break;}
+escaped=!escaped&&next==='\\';}
+if(end||!escaped){state.tokens.shift();}
+return(quote==='`'||quote===')'?'quote':'string');};};var tokenDollar=function(stream,state){if(state.tokens.length>1)stream.eat('$');var ch=stream.next(),hungry=/\w/;if(ch==='{')hungry=/[^}]/;if(ch==='('){state.tokens[0]=tokenString(')');return tokenize(stream,state);}
+if(!/\d/.test(ch)){stream.eatWhile(hungry);stream.eat('}');}
+state.tokens.shift();return'def';};function tokenize(stream,state){return(state.tokens[0]||tokenBase)(stream,state);};return{startState:function(){return{tokens:[]};},token:function(stream,state){if(stream.eatSpace())return null;return tokenize(stream,state);}};});CodeMirror.defineMIME('text/x-sh','shell');;WebInspector.CodeMirrorUtils=function()
+{WebInspector.InplaceEditor.call(this);}
+WebInspector.CodeMirrorUtils.prototype={editorContent:function(editingContext){return editingContext.codeMirror.getValue();},_consumeCopy:function(e)
+{e.consume();},setUpEditor:function(editingContext)
+{var element=editingContext.element;var config=editingContext.config;loadScript("CodeMirrorTextEditor.js");editingContext.cssLoadView=new WebInspector.CodeMirrorCSSLoadView();editingContext.cssLoadView.show(element);WebInspector.setCurrentFocusElement(element);element.addEventListener("copy",this._consumeCopy,false);var codeMirror=window.CodeMirror(element,{mode:config.mode,lineWrapping:config.lineWrapping,smartIndent:config.smartIndent,autofocus:true,theme:config.theme,value:config.initialValue});codeMirror.getWrapperElement().classList.add("source-code");codeMirror.on("cursorActivity",function(cm){cm.display.cursor.scrollIntoViewIfNeeded(false);});editingContext.codeMirror=codeMirror;},closeEditor:function(editingContext)
+{editingContext.element.removeEventListener("copy",this._consumeCopy,false);editingContext.cssLoadView.detach();},cancelEditing:function(editingContext)
+{editingContext.codeMirror.setValue(editingContext.oldText);},augmentEditingHandle:function(editingContext,handle)
+{function setWidth(editingContext,width)
+{var padding=30;var codeMirror=editingContext.codeMirror;codeMirror.getWrapperElement().style.width=(width-codeMirror.getWrapperElement().offsetLeft-padding)+"px";codeMirror.refresh();}
+handle.codeMirror=editingContext.codeMirror;handle.setWidth=setWidth.bind(null,editingContext);},__proto__:WebInspector.InplaceEditor.prototype}
+WebInspector.CodeMirrorUtils.TokenizerFactory=function(){}
+WebInspector.CodeMirrorUtils.TokenizerFactory.prototype={createTokenizer:function(mimeType)
+{var mode=CodeMirror.getMode({indentUnit:2},mimeType);var state=CodeMirror.startState(mode);function tokenize(line,callback)
+{var stream=new CodeMirror.StringStream(line);while(!stream.eol()){var style=mode.token(stream,state);var value=stream.current();callback(value,style,stream.start,stream.start+value.length);stream.start=stream.pos;}}
+return tokenize;}}
+WebInspector.CodeMirrorCSSLoadView=function()
+{WebInspector.VBox.call(this);this.element.classList.add("hidden");this.registerRequiredCSS("cm/codemirror.css");this.registerRequiredCSS("cm/cmdevtools.css");}
+WebInspector.CodeMirrorCSSLoadView.prototype={__proto__:WebInspector.VBox.prototype};WebInspector.CodeMirrorTextEditor=function(url,delegate)
+{WebInspector.VBox.call(this);this._delegate=delegate;this._url=url;this.registerRequiredCSS("cm/codemirror.css");this.registerRequiredCSS("cm/cmdevtools.css");this._codeMirror=window.CodeMirror(this.element,{lineNumbers:true,gutters:["CodeMirror-linenumbers"],matchBrackets:true,smartIndent:false,styleSelectedText:true,electricChars:false,});this._codeMirror._codeMirrorTextEditor=this;CodeMirror.keyMap["devtools-common"]={"Left":"goCharLeft","Right":"goCharRight","Up":"goLineUp","Down":"goLineDown","End":"goLineEnd","Home":"goLineStartSmart","PageUp":"goPageUp","PageDown":"goPageDown","Delete":"delCharAfter","Backspace":"delCharBefore","Tab":"defaultTab","Shift-Tab":"indentLess","Enter":"smartNewlineAndIndent","Ctrl-Space":"autocomplete"};CodeMirror.keyMap["devtools-pc"]={"Ctrl-A":"selectAll","Ctrl-Z":"undoAndReveal","Shift-Ctrl-Z":"redoAndReveal","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-Up":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Down":"goDocEnd","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-/":"toggleComment",fallthrough:"devtools-common"};CodeMirror.keyMap["devtools-mac"]={"Cmd-A":"selectAll","Cmd-Z":"undoAndReveal","Shift-Cmd-Z":"redoAndReveal","Cmd-Up":"goDocStart","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineStartSmart","Cmd-Right":"goLineEnd","Alt-Backspace":"delGroupBefore","Alt-Delete":"delGroupAfter","Cmd-/":"toggleComment",fallthrough:"devtools-common"};WebInspector.settings.textEditorIndent.addChangeListener(this._updateEditorIndentation,this);this._updateEditorIndentation();WebInspector.settings.showWhitespacesInEditor.addChangeListener(this._updateCodeMirrorMode,this);WebInspector.settings.textEditorBracketMatching.addChangeListener(this._enableBracketMatchingIfNeeded,this);this._enableBracketMatchingIfNeeded();this._codeMirror.setOption("keyMap",WebInspector.isMac()?"devtools-mac":"devtools-pc");this._codeMirror.setOption("flattenSpans",false);this._codeMirror.setOption("maxHighlightLength",WebInspector.CodeMirrorTextEditor.maxHighlightLength);this._codeMirror.setOption("mode",null);this._codeMirror.setOption("crudeMeasuringFrom",1000);this._shouldClearHistory=true;this._lineSeparator="\n";this._tokenHighlighter=new WebInspector.CodeMirrorTextEditor.TokenHighlighter(this._codeMirror);this._blockIndentController=new WebInspector.CodeMirrorTextEditor.BlockIndentController(this._codeMirror);this._fixWordMovement=new WebInspector.CodeMirrorTextEditor.FixWordMovement(this._codeMirror);this._autocompleteController=new WebInspector.CodeMirrorTextEditor.AutocompleteController(this,this._codeMirror);this._codeMirror.on("change",this._change.bind(this));this._codeMirror.on("beforeChange",this._beforeChange.bind(this));this._codeMirror.on("gutterClick",this._gutterClick.bind(this));this._codeMirror.on("cursorActivity",this._cursorActivity.bind(this));this._codeMirror.on("beforeSelectionChange",this._beforeSelectionChange.bind(this));this._codeMirror.on("scroll",this._scroll.bind(this));this._codeMirror.on("focus",this._focus.bind(this));this._codeMirror.on("blur",this._blur.bind(this));this.element.addEventListener("contextmenu",this._contextMenu.bind(this),false);function updateAnticipateJumpFlag(value)
+{this._isHandlingMouseDownEvent=value;}
+this.element.addEventListener("mousedown",updateAnticipateJumpFlag.bind(this,true),true);this.element.addEventListener("mousedown",updateAnticipateJumpFlag.bind(this,false),false);this.element.style.overflow="hidden";this.element.firstChild.classList.add("source-code");this.element.firstChild.classList.add("fill");this._elementToWidget=new Map();this._nestedUpdatesCounter=0;this.element.addEventListener("focus",this._handleElementFocus.bind(this),false);this.element.addEventListener("keydown",this._handleKeyDown.bind(this),true);this.element.addEventListener("keydown",this._handlePostKeyDown.bind(this),false);this.element.tabIndex=0;this._setupWhitespaceHighlight();}
+WebInspector.CodeMirrorTextEditor.BeforeChangeObject;WebInspector.CodeMirrorTextEditor.ChangeObject;WebInspector.CodeMirrorTextEditor.maxHighlightLength=1000;WebInspector.CodeMirrorTextEditor.autocompleteCommand=function(codeMirror)
+{codeMirror._codeMirrorTextEditor._autocompleteController.autocomplete();}
+CodeMirror.commands.autocomplete=WebInspector.CodeMirrorTextEditor.autocompleteCommand;CodeMirror.commands.smartNewlineAndIndent=function(codeMirror)
+{codeMirror.operation(innerSmartNewlineAndIndent.bind(null,codeMirror));function countIndent(line)
+{for(var i=0;i<line.length;++i){if(!WebInspector.TextUtils.isSpaceChar(line[i]))
+return i;}
+return line.length;}
+function innerSmartNewlineAndIndent(codeMirror)
+{var cur=codeMirror.getCursor("start");var line=codeMirror.getLine(cur.line);var indent=cur.line>0?countIndent(line):0;if(cur.ch<=indent){codeMirror.replaceSelection("\n"+line.substring(0,cur.ch),"end","+input");codeMirror.setSelection(new CodeMirror.Pos(cur.line+1,cur.ch));}else
+codeMirror.execCommand("newlineAndIndent");}}
+CodeMirror.commands.undoAndReveal=function(codemirror)
+{var scrollInfo=codemirror.getScrollInfo();codemirror.execCommand("undo");var cursor=codemirror.getCursor("start");codemirror._codeMirrorTextEditor._innerRevealLine(cursor.line,scrollInfo);codemirror._codeMirrorTextEditor._autocompleteController.finishAutocomplete();}
+CodeMirror.commands.redoAndReveal=function(codemirror)
+{var scrollInfo=codemirror.getScrollInfo();codemirror.execCommand("redo");var cursor=codemirror.getCursor("start");codemirror._codeMirrorTextEditor._innerRevealLine(cursor.line,scrollInfo);codemirror._codeMirrorTextEditor._autocompleteController.finishAutocomplete();}
+WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold=2000;WebInspector.CodeMirrorTextEditor.MaximumNumberOfWhitespacesPerSingleSpan=16;WebInspector.CodeMirrorTextEditor.MaxEditableTextSize=1024*1024*10;WebInspector.CodeMirrorTextEditor.prototype={_enableBracketMatchingIfNeeded:function()
+{this._codeMirror.setOption("autoCloseBrackets",WebInspector.settings.textEditorBracketMatching.get()?{explode:false}:false);},wasShown:function()
+{if(this._wasOnceShown)
+return;this._wasOnceShown=true;this._codeMirror.refresh();},_guessIndentationLevel:function()
+{var tabRegex=/^\t+/;var tabLines=0;var indents={};function processLine(lineHandle)
+{var text=lineHandle.text;if(text.length===0||!WebInspector.TextUtils.isSpaceChar(text[0]))
+return;if(tabRegex.test(text)){++tabLines;return;}
+var i=0;while(i<text.length&&WebInspector.TextUtils.isSpaceChar(text[i]))
+++i;if(i%2!==0)
+return;indents[i]=1+(indents[i]||0);}
+this._codeMirror.eachLine(0,1000,processLine);var onePercentFilterThreshold=this.linesCount/100;if(tabLines&&tabLines>onePercentFilterThreshold)
+return"\t";var minimumIndent=Infinity;for(var i in indents){if(indents[i]<onePercentFilterThreshold)
+continue;var indent=parseInt(i,10);if(minimumIndent>indent)
+minimumIndent=indent;}
+if(minimumIndent===Infinity)
+return WebInspector.TextUtils.Indent.FourSpaces;return new Array(minimumIndent+1).join(" ");},_updateEditorIndentation:function()
+{var extraKeys={};var indent=WebInspector.settings.textEditorIndent.get();if(WebInspector.settings.textEditorAutoDetectIndent.get())
+indent=this._guessIndentationLevel();if(indent===WebInspector.TextUtils.Indent.TabCharacter){this._codeMirror.setOption("indentWithTabs",true);this._codeMirror.setOption("indentUnit",4);}else{this._codeMirror.setOption("indentWithTabs",false);this._codeMirror.setOption("indentUnit",indent.length);extraKeys.Tab=function(codeMirror)
+{if(codeMirror.somethingSelected())
+return CodeMirror.Pass;var pos=codeMirror.getCursor("head");codeMirror.replaceRange(indent.substring(pos.ch%indent.length),codeMirror.getCursor());}}
+this._codeMirror.setOption("extraKeys",extraKeys);this._indentationLevel=indent;},indent:function()
+{return this._indentationLevel;},highlightSearchResults:function(regex,range)
+{function innerHighlightRegex()
+{if(range){this._revealLine(range.startLine);if(range.endColumn>WebInspector.CodeMirrorTextEditor.maxHighlightLength)
+this.setSelection(range);else
+this.setSelection(WebInspector.TextRange.createFromLocation(range.startLine,range.startColumn));}else{this.setSelection(this.selection().collapseToEnd());}
+this._tokenHighlighter.highlightSearchResults(regex,range);}
+if(!this._selectionBeforeSearch)
+this._selectionBeforeSearch=this.selection();this._codeMirror.operation(innerHighlightRegex.bind(this));},cancelSearchResultsHighlight:function()
+{this._codeMirror.operation(this._tokenHighlighter.highlightSelectedTokens.bind(this._tokenHighlighter));if(this._selectionBeforeSearch){this._reportJump(this._selectionBeforeSearch,this.selection());delete this._selectionBeforeSearch;}},undo:function()
+{this._codeMirror.undo();},redo:function()
+{this._codeMirror.redo();},_setupWhitespaceHighlight:function()
+{if(WebInspector.CodeMirrorTextEditor._whitespaceStyleInjected||!WebInspector.settings.showWhitespacesInEditor.get())
+return;WebInspector.CodeMirrorTextEditor._whitespaceStyleInjected=true;const classBase=".show-whitespaces .CodeMirror .cm-whitespace-";const spaceChar="·";var spaceChars="";var rules="";for(var i=1;i<=WebInspector.CodeMirrorTextEditor.MaximumNumberOfWhitespacesPerSingleSpan;++i){spaceChars+=spaceChar;var rule=classBase+i+"::before { content: '"+spaceChars+"';}\n";rules+=rule;}
+var style=document.createElement("style");style.textContent=rules;document.head.appendChild(style);},_handleKeyDown:function(e)
+{if(this._autocompleteController.keyDown(e))
+e.consume(true);},_handlePostKeyDown:function(e)
+{if(e.defaultPrevented)
+e.consume(true);},_shouldProcessWordForAutocompletion:function(word)
+{return word.length&&(word[0]<'0'||word[0]>'9');},_addTextToCompletionDictionary:function(text)
+{if(this.readOnly())
+return;var words=WebInspector.TextUtils.textToWords(text);for(var i=0;i<words.length;++i){if(this._shouldProcessWordForAutocompletion(words[i]))
+this._dictionary.addWord(words[i]);}},_removeTextFromCompletionDictionary:function(text)
+{if(this.readOnly())
+return;var words=WebInspector.TextUtils.textToWords(text);for(var i=0;i<words.length;++i){if(this._shouldProcessWordForAutocompletion(words[i]))
+this._dictionary.removeWord(words[i]);}},setCompletionDictionary:function(dictionary)
+{if(!dictionary){delete this._dictionary;return;}
+this._dictionary=dictionary;this._addTextToCompletionDictionary(this.text());},cursorPositionToCoordinates:function(lineNumber,column)
+{if(lineNumber>=this._codeMirror.lineCount()||lineNumber<0||column<0||column>this._codeMirror.getLine(lineNumber).length)
+return null;var metrics=this._codeMirror.cursorCoords(new CodeMirror.Pos(lineNumber,column));return{x:metrics.left,y:metrics.top,height:metrics.bottom-metrics.top};},coordinatesToCursorPosition:function(x,y)
+{var element=document.elementFromPoint(x,y);if(!element||!element.isSelfOrDescendant(this._codeMirror.getWrapperElement()))
+return null;var gutterBox=this._codeMirror.getGutterElement().boxInWindow();if(x>=gutterBox.x&&x<=gutterBox.x+gutterBox.width&&y>=gutterBox.y&&y<=gutterBox.y+gutterBox.height)
+return null;var coords=this._codeMirror.coordsChar({left:x,top:y});return this._toRange(coords,coords);},tokenAtTextPosition:function(lineNumber,column)
+{if(lineNumber<0||lineNumber>=this._codeMirror.lineCount())
+return null;var token=this._codeMirror.getTokenAt(new CodeMirror.Pos(lineNumber,(column||0)+1));if(!token||!token.type)
+return null;return{startColumn:token.start,endColumn:token.end-1,type:token.type};},copyRange:function(textRange)
+{var pos=this._toPos(textRange.normalize());return this._codeMirror.getRange(pos.start,pos.end);},isClean:function()
+{return this._codeMirror.isClean();},markClean:function()
+{this._codeMirror.markClean();},_hasLongLines:function()
+{function lineIterator(lineHandle)
+{if(lineHandle.text.length>WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold)
+hasLongLines=true;return hasLongLines;}
+var hasLongLines=false;this._codeMirror.eachLine(lineIterator);return hasLongLines;},_whitespaceOverlayMode:function(mimeType)
+{var modeName=CodeMirror.mimeModes[mimeType]?(CodeMirror.mimeModes[mimeType].name||CodeMirror.mimeModes[mimeType]):CodeMirror.mimeModes["text/plain"];modeName+="+whitespaces";if(CodeMirror.modes[modeName])
+return modeName;function modeConstructor(config,parserConfig)
+{function nextToken(stream)
+{if(stream.peek()===" "){var spaces=0;while(spaces<WebInspector.CodeMirrorTextEditor.MaximumNumberOfWhitespacesPerSingleSpan&&stream.peek()===" "){++spaces;stream.next();}
+return"whitespace whitespace-"+spaces;}
+while(!stream.eol()&&stream.peek()!==" ")
+stream.next();return null;}
+var whitespaceMode={token:nextToken};return CodeMirror.overlayMode(CodeMirror.getMode(config,mimeType),whitespaceMode,false);}
+CodeMirror.defineMode(modeName,modeConstructor);return modeName;},_enableLongLinesMode:function()
+{this._codeMirror.setOption("styleSelectedText",false);this._longLinesMode=true;},_disableLongLinesMode:function()
+{this._codeMirror.setOption("styleSelectedText",true);this._longLinesMode=false;},_updateCodeMirrorMode:function()
+{var showWhitespaces=WebInspector.settings.showWhitespacesInEditor.get();this.element.classList.toggle("show-whitespaces",showWhitespaces);this._codeMirror.setOption("mode",showWhitespaces?this._whitespaceOverlayMode(this._mimeType):this._mimeType);},setMimeType:function(mimeType)
+{this._mimeType=mimeType;if(this._hasLongLines())
+this._enableLongLinesMode();else
+this._disableLongLinesMode();this._updateCodeMirrorMode();},setReadOnly:function(readOnly)
+{this.element.classList.toggle("CodeMirror-readonly",readOnly)
+this._codeMirror.setOption("readOnly",readOnly);},readOnly:function()
+{return!!this._codeMirror.getOption("readOnly");},removeHighlight:function(highlightDescriptor)
+{highlightDescriptor.clear();},highlightRange:function(range,cssClass)
+{cssClass="CodeMirror-persist-highlight "+cssClass;var pos=this._toPos(range);++pos.end.ch;return this._codeMirror.markText(pos.start,pos.end,{className:cssClass,startStyle:cssClass+"-start",endStyle:cssClass+"-end"});},defaultFocusedElement:function()
+{return this.element;},focus:function()
+{this._codeMirror.focus();},_handleElementFocus:function()
+{this._codeMirror.focus();},beginUpdates:function()
+{++this._nestedUpdatesCounter;},endUpdates:function()
+{if(!--this._nestedUpdatesCounter)
+this._codeMirror.refresh();},_revealLine:function(lineNumber)
+{this._innerRevealLine(lineNumber,this._codeMirror.getScrollInfo());},_innerRevealLine:function(lineNumber,scrollInfo)
+{var topLine=this._codeMirror.lineAtHeight(scrollInfo.top,"local");var bottomLine=this._codeMirror.lineAtHeight(scrollInfo.top+scrollInfo.clientHeight,"local");var linesPerScreen=bottomLine-topLine+1;if(lineNumber<topLine){var topLineToReveal=Math.max(lineNumber-(linesPerScreen/2)+1,0)|0;this._codeMirror.scrollIntoView(new CodeMirror.Pos(topLineToReveal,0));}else if(lineNumber>bottomLine){var bottomLineToReveal=Math.min(lineNumber+(linesPerScreen/2)-1,this.linesCount-1)|0;this._codeMirror.scrollIntoView(new CodeMirror.Pos(bottomLineToReveal,0));}},_gutterClick:function(instance,lineNumber,gutter,event)
+{this.dispatchEventToListeners(WebInspector.TextEditor.Events.GutterClick,{lineNumber:lineNumber,event:event});},_contextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);var target=event.target.enclosingNodeOrSelfWithClass("CodeMirror-gutter-elt");if(target)
+this._delegate.populateLineGutterContextMenu(contextMenu,parseInt(target.textContent,10)-1);else
+this._delegate.populateTextAreaContextMenu(contextMenu,0);contextMenu.show();},addBreakpoint:function(lineNumber,disabled,conditional)
+{if(lineNumber<0||lineNumber>=this._codeMirror.lineCount())
+return;var className="cm-breakpoint"+(conditional?" cm-breakpoint-conditional":"")+(disabled?" cm-breakpoint-disabled":"");this._codeMirror.addLineClass(lineNumber,"wrap",className);},removeBreakpoint:function(lineNumber)
+{if(lineNumber<0||lineNumber>=this._codeMirror.lineCount())
+return;var wrapClasses=this._codeMirror.getLineHandle(lineNumber).wrapClass;if(!wrapClasses)
+return;var classes=wrapClasses.split(" ");for(var i=0;i<classes.length;++i){if(classes[i].startsWith("cm-breakpoint"))
+this._codeMirror.removeLineClass(lineNumber,"wrap",classes[i]);}},setExecutionLine:function(lineNumber)
+{this.clearPositionHighlight();this._executionLine=this._codeMirror.getLineHandle(lineNumber);if(!this._executionLine)
+return;this._codeMirror.addLineClass(this._executionLine,"wrap","cm-execution-line");},clearExecutionLine:function()
+{this.clearPositionHighlight();if(this._executionLine)
+this._codeMirror.removeLineClass(this._executionLine,"wrap","cm-execution-line");delete this._executionLine;},addDecoration:function(lineNumber,element)
+{var widget=this._codeMirror.addLineWidget(lineNumber,element);this._elementToWidget.put(element,widget);},removeDecoration:function(lineNumber,element)
+{var widget=this._elementToWidget.remove(element);if(widget)
+this._codeMirror.removeLineWidget(widget);},revealPosition:function(lineNumber,columnNumber,shouldHighlight)
+{lineNumber=Number.constrain(lineNumber,0,this._codeMirror.lineCount()-1);if(typeof columnNumber!=="number")
+columnNumber=0;columnNumber=Number.constrain(columnNumber,0,this._codeMirror.getLine(lineNumber).length);this.clearPositionHighlight();this._highlightedLine=this._codeMirror.getLineHandle(lineNumber);if(!this._highlightedLine)
+return;this._revealLine(lineNumber);if(shouldHighlight){this._codeMirror.addLineClass(this._highlightedLine,null,"cm-highlight");this._clearHighlightTimeout=setTimeout(this.clearPositionHighlight.bind(this),2000);}
+this.setSelection(WebInspector.TextRange.createFromLocation(lineNumber,columnNumber));},clearPositionHighlight:function()
+{if(this._clearHighlightTimeout)
+clearTimeout(this._clearHighlightTimeout);delete this._clearHighlightTimeout;if(this._highlightedLine)
+this._codeMirror.removeLineClass(this._highlightedLine,null,"cm-highlight");delete this._highlightedLine;},elementsToRestoreScrollPositionsFor:function()
+{return[];},inheritScrollPositions:function(textEditor)
+{},_updatePaddingBottom:function(width,height)
+{var scrollInfo=this._codeMirror.getScrollInfo();var newPaddingBottom;var linesElement=this.element.firstElementChild.querySelector(".CodeMirror-lines");var lineCount=this._codeMirror.lineCount();if(lineCount<=1)
+newPaddingBottom=0;else
+newPaddingBottom=Math.max(scrollInfo.clientHeight-this._codeMirror.getLineHandle(this._codeMirror.lastLine()).height,0);newPaddingBottom+="px";linesElement.style.paddingBottom=newPaddingBottom;this._codeMirror.setSize(width,height);},_resizeEditor:function()
+{var parentElement=this.element.parentElement;if(!parentElement||!this.isShowing())
+return;var scrollLeft=this._codeMirror.doc.scrollLeft;var scrollTop=this._codeMirror.doc.scrollTop;var width=parentElement.offsetWidth;var height=parentElement.offsetHeight;this._codeMirror.setSize(width,height);this._updatePaddingBottom(width,height);this._codeMirror.scrollTo(scrollLeft,scrollTop);},onResize:function()
+{this._autocompleteController.finishAutocomplete();this._resizeEditor();},editRange:function(range,text)
+{var pos=this._toPos(range);this._codeMirror.replaceRange(text,pos.start,pos.end);var newRange=this._toRange(pos.start,this._codeMirror.posFromIndex(this._codeMirror.indexFromPos(pos.start)+text.length));this._delegate.onTextChanged(range,newRange);if(WebInspector.settings.textEditorAutoDetectIndent.get())
+this._updateEditorIndentation();return newRange;},_wordRangeForCursorPosition:function(lineNumber,column,prefixOnly)
+{var line=this.line(lineNumber);if(column===0||!WebInspector.TextUtils.isWordChar(line.charAt(column-1)))
+return null;var wordStart=column-1;while(wordStart>0&&WebInspector.TextUtils.isWordChar(line.charAt(wordStart-1)))
+--wordStart;if(prefixOnly)
+return new WebInspector.TextRange(lineNumber,wordStart,lineNumber,column);var wordEnd=column;while(wordEnd<line.length&&WebInspector.TextUtils.isWordChar(line.charAt(wordEnd)))
+++wordEnd;return new WebInspector.TextRange(lineNumber,wordStart,lineNumber,wordEnd);},_beforeChange:function(codeMirror,changeObject)
+{if(!this._dictionary)
+return;this._updatedLines=this._updatedLines||{};for(var i=changeObject.from.line;i<=changeObject.to.line;++i)
+this._updatedLines[i]=this.line(i);},_change:function(codeMirror,changeObject)
+{var hasOneLine=this._codeMirror.lineCount()===1;if(hasOneLine!==this._hasOneLine)
+this._resizeEditor();this._hasOneLine=hasOneLine;var widgets=this._elementToWidget.values();for(var i=0;i<widgets.length;++i)
+this._codeMirror.removeLineWidget(widgets[i]);this._elementToWidget.clear();if(this._updatedLines){for(var lineNumber in this._updatedLines)
+this._removeTextFromCompletionDictionary(this._updatedLines[lineNumber]);delete this._updatedLines;}
+var linesToUpdate={};var singleCharInput=false;do{var oldRange=this._toRange(changeObject.from,changeObject.to);var newRange=oldRange.clone();var linesAdded=changeObject.text.length;singleCharInput=(changeObject.origin==="+input"&&changeObject.text.length===1&&changeObject.text[0].length===1)||(changeObject.origin==="+delete"&&changeObject.removed.length===1&&changeObject.removed[0].length===1);if(linesAdded===0){newRange.endLine=newRange.startLine;newRange.endColumn=newRange.startColumn;}else if(linesAdded===1){newRange.endLine=newRange.startLine;newRange.endColumn=newRange.startColumn+changeObject.text[0].length;}else{newRange.endLine=newRange.startLine+linesAdded-1;newRange.endColumn=changeObject.text[linesAdded-1].length;}
+if(!this._muteTextChangedEvent)
+this._delegate.onTextChanged(oldRange,newRange);if(this._dictionary){for(var i=newRange.startLine;i<=newRange.endLine;++i)
+linesToUpdate[i]=this.line(i);}}while(changeObject=changeObject.next);if(this._dictionary){for(var lineNumber in linesToUpdate)
+this._addTextToCompletionDictionary(linesToUpdate[lineNumber]);}
+if(singleCharInput)
+this._autocompleteController.autocomplete();},_cursorActivity:function()
+{var start=this._codeMirror.getCursor("anchor");var end=this._codeMirror.getCursor("head");this._delegate.selectionChanged(this._toRange(start,end));if(!this._tokenHighlighter.highlightedRegex())
+this._codeMirror.operation(this._tokenHighlighter.highlightSelectedTokens.bind(this._tokenHighlighter));},_beforeSelectionChange:function(codeMirror,selection)
+{if(!this._isHandlingMouseDownEvent)
+return;this._reportJump(this.selection(),this._toRange(selection.anchor,selection.head));},_reportJump:function(from,to)
+{if(from&&to&&from.equal(to))
+return;this._delegate.onJumpToPosition(from,to);},_scroll:function()
+{if(this._scrollTimer)
+clearTimeout(this._scrollTimer);var topmostLineNumber=this._codeMirror.lineAtHeight(this._codeMirror.getScrollInfo().top,"local");this._scrollTimer=setTimeout(this._delegate.scrollChanged.bind(this._delegate,topmostLineNumber),100);},_focus:function()
+{this._delegate.editorFocused();},_blur:function()
+{this._autocompleteController.finishAutocomplete();},scrollToLine:function(lineNumber)
+{var pos=new CodeMirror.Pos(lineNumber,0);var coords=this._codeMirror.charCoords(pos,"local");this._codeMirror.scrollTo(0,coords.top);},firstVisibleLine:function()
+{return this._codeMirror.lineAtHeight(this._codeMirror.getScrollInfo().top,"local");},lastVisibleLine:function()
+{var scrollInfo=this._codeMirror.getScrollInfo();return this._codeMirror.lineAtHeight(scrollInfo.top+scrollInfo.clientHeight,"local");},selection:function()
+{var start=this._codeMirror.getCursor("anchor");var end=this._codeMirror.getCursor("head");return this._toRange(start,end);},lastSelection:function()
+{return this._lastSelection;},setSelection:function(textRange)
+{this._lastSelection=textRange;var pos=this._toPos(textRange);this._codeMirror.setSelection(pos.start,pos.end);},_detectLineSeparator:function(text)
+{this._lineSeparator=text.indexOf("\r\n")>=0?"\r\n":"\n";},setText:function(text)
+{this._muteTextChangedEvent=true;if(text.length>WebInspector.CodeMirrorTextEditor.MaxEditableTextSize){if(this._dictionary)
+this._dictionary.reset();this.setReadOnly(true);}
+this._codeMirror.setValue(text);this._updateEditorIndentation();if(this._shouldClearHistory){this._codeMirror.clearHistory();this._shouldClearHistory=false;}
+this._detectLineSeparator(text);delete this._muteTextChangedEvent;},text:function()
+{return this._codeMirror.getValue().replace(/\n/g,this._lineSeparator);},range:function()
+{var lineCount=this.linesCount;var lastLine=this._codeMirror.getLine(lineCount-1);return this._toRange(new CodeMirror.Pos(0,0),new CodeMirror.Pos(lineCount-1,lastLine.length));},line:function(lineNumber)
+{return this._codeMirror.getLine(lineNumber);},get linesCount()
+{return this._codeMirror.lineCount();},setAttribute:function(line,name,value)
+{if(line<0||line>=this._codeMirror.lineCount())
+return;var handle=this._codeMirror.getLineHandle(line);if(handle.attributes===undefined)handle.attributes={};handle.attributes[name]=value;},getAttribute:function(line,name)
+{if(line<0||line>=this._codeMirror.lineCount())
+return null;var handle=this._codeMirror.getLineHandle(line);return handle.attributes&&handle.attributes[name]!==undefined?handle.attributes[name]:null;},removeAttribute:function(line,name)
+{if(line<0||line>=this._codeMirror.lineCount())
+return;var handle=this._codeMirror.getLineHandle(line);if(handle&&handle.attributes)
+delete handle.attributes[name];},_toPos:function(range)
+{return{start:new CodeMirror.Pos(range.startLine,range.startColumn),end:new CodeMirror.Pos(range.endLine,range.endColumn)}},_toRange:function(start,end)
+{return new WebInspector.TextRange(start.line,start.ch,end.line,end.ch);},textEditorPositionHandle:function(lineNumber,columnNumber)
+{return new WebInspector.CodeMirrorPositionHandle(this._codeMirror,new CodeMirror.Pos(lineNumber,columnNumber));},__proto__:WebInspector.VBox.prototype}
+WebInspector.CodeMirrorPositionHandle=function(codeMirror,pos)
+{this._codeMirror=codeMirror;this._lineHandle=codeMirror.getLineHandle(pos.line);this._columnNumber=pos.ch;}
+WebInspector.CodeMirrorPositionHandle.prototype={resolve:function()
+{var lineNumber=this._codeMirror.getLineNumber(this._lineHandle);if(typeof lineNumber!=="number")
+return null;return{lineNumber:lineNumber,columnNumber:this._columnNumber};},equal:function(positionHandle)
+{return positionHandle._lineHandle===this._lineHandle&&positionHandle._columnNumber==this._columnNumber&&positionHandle._codeMirror===this._codeMirror;}}
+WebInspector.CodeMirrorTextEditor.TokenHighlighter=function(codeMirror)
+{this._codeMirror=codeMirror;}
+WebInspector.CodeMirrorTextEditor.TokenHighlighter.prototype={highlightSearchResults:function(regex,range)
+{var oldRegex=this._highlightRegex;this._highlightRegex=regex;this._highlightRange=range;if(this._searchResultMarker){this._searchResultMarker.clear();delete this._searchResultMarker;}
+if(this._highlightDescriptor&&this._highlightDescriptor.selectionStart)
+this._codeMirror.removeLineClass(this._highlightDescriptor.selectionStart.line,"wrap","cm-line-with-selection");var selectionStart=this._highlightRange?new CodeMirror.Pos(this._highlightRange.startLine,this._highlightRange.startColumn):null;if(selectionStart)
+this._codeMirror.addLineClass(selectionStart.line,"wrap","cm-line-with-selection");if(this._highlightRegex===oldRegex){if(this._highlightDescriptor)
+this._highlightDescriptor.selectionStart=selectionStart;}else{this._removeHighlight();this._setHighlighter(this._searchHighlighter.bind(this,this._highlightRegex),selectionStart);}
+if(this._highlightRange){var pos=WebInspector.CodeMirrorTextEditor.prototype._toPos(this._highlightRange);this._searchResultMarker=this._codeMirror.markText(pos.start,pos.end,{className:"cm-column-with-selection"});}},highlightedRegex:function()
+{return this._highlightRegex;},highlightSelectedTokens:function()
+{delete this._highlightRegex;delete this._highlightRange;if(this._highlightDescriptor&&this._highlightDescriptor.selectionStart)
+this._codeMirror.removeLineClass(this._highlightDescriptor.selectionStart.line,"wrap","cm-line-with-selection");this._removeHighlight();var selectionStart=this._codeMirror.getCursor("start");var selectionEnd=this._codeMirror.getCursor("end");if(selectionStart.line!==selectionEnd.line)
+return;if(selectionStart.ch===selectionEnd.ch)
+return;var selectedText=this._codeMirror.getSelection();if(this._isWord(selectedText,selectionStart.line,selectionStart.ch,selectionEnd.ch)){if(selectionStart)
+this._codeMirror.addLineClass(selectionStart.line,"wrap","cm-line-with-selection")
+this._setHighlighter(this._tokenHighlighter.bind(this,selectedText,selectionStart),selectionStart);}},_isWord:function(selectedText,lineNumber,startColumn,endColumn)
+{var line=this._codeMirror.getLine(lineNumber);var leftBound=startColumn===0||!WebInspector.TextUtils.isWordChar(line.charAt(startColumn-1));var rightBound=endColumn===line.length||!WebInspector.TextUtils.isWordChar(line.charAt(endColumn));return leftBound&&rightBound&&WebInspector.TextUtils.isWord(selectedText);},_removeHighlight:function()
+{if(this._highlightDescriptor){this._codeMirror.removeOverlay(this._highlightDescriptor.overlay);delete this._highlightDescriptor;}},_searchHighlighter:function(regex,stream)
+{if(stream.column()===0)
+delete this._searchMatchLength;if(this._searchMatchLength){if(this._searchMatchLength>1){for(var i=0;i<this._searchMatchLength-2;++i)
+stream.next();this._searchMatchLength=1;return"search-highlight";}else{stream.next();delete this._searchMatchLength;return"search-highlight search-highlight-end";}}
+var match=stream.match(regex,false);if(match){stream.next();var matchLength=match[0].length;if(matchLength===1)
+return"search-highlight search-highlight-full";this._searchMatchLength=matchLength;return"search-highlight search-highlight-start";}
+while(!stream.match(regex,false)&&stream.next()){};},_tokenHighlighter:function(token,selectionStart,stream)
+{var tokenFirstChar=token.charAt(0);if(stream.match(token)&&(stream.eol()||!WebInspector.TextUtils.isWordChar(stream.peek())))
+return stream.column()===selectionStart.ch?"token-highlight column-with-selection":"token-highlight";var eatenChar;do{eatenChar=stream.next();}while(eatenChar&&(WebInspector.TextUtils.isWordChar(eatenChar)||stream.peek()!==tokenFirstChar));},_setHighlighter:function(highlighter,selectionStart)
+{var overlayMode={token:highlighter};this._codeMirror.addOverlay(overlayMode);this._highlightDescriptor={overlay:overlayMode,selectionStart:selectionStart};}}
+WebInspector.CodeMirrorTextEditor.BlockIndentController=function(codeMirror)
+{codeMirror.addKeyMap(this);}
+WebInspector.CodeMirrorTextEditor.BlockIndentController.prototype={name:"blockIndentKeymap",Enter:function(codeMirror)
+{if(codeMirror.somethingSelected())
+return CodeMirror.Pass;var cursor=codeMirror.getCursor();if(cursor.ch===0)
+return CodeMirror.Pass;var line=codeMirror.getLine(cursor.line);if(line.substr(cursor.ch-1,2)==="{}"){codeMirror.execCommand("newlineAndIndent");codeMirror.setCursor(cursor);codeMirror.execCommand("newlineAndIndent");codeMirror.execCommand("indentMore");}else if(line.substr(cursor.ch-1,1)==="{"){codeMirror.execCommand("newlineAndIndent");codeMirror.execCommand("indentMore");}else
+return CodeMirror.Pass;},"'}'":function(codeMirror)
+{var cursor=codeMirror.getCursor();var line=codeMirror.getLine(cursor.line);for(var i=0;i<line.length;++i){if(!WebInspector.TextUtils.isSpaceChar(line.charAt(i)))
+return CodeMirror.Pass;}
+codeMirror.replaceRange("}",cursor);var matchingBracket=codeMirror.findMatchingBracket();if(!matchingBracket||!matchingBracket.match)
+return;line=codeMirror.getLine(matchingBracket.to.line);var desiredIndentation=0;while(desiredIndentation<line.length&&WebInspector.TextUtils.isSpaceChar(line.charAt(desiredIndentation)))
+++desiredIndentation;codeMirror.replaceRange(line.substr(0,desiredIndentation)+"}",new CodeMirror.Pos(cursor.line,0),new CodeMirror.Pos(cursor.line,cursor.ch+1));}}
+WebInspector.CodeMirrorTextEditor.FixWordMovement=function(codeMirror)
+{function moveLeft(shift,codeMirror)
+{var cursor=codeMirror.getCursor("head");if(cursor.ch!==0||cursor.line===0)
+return CodeMirror.Pass;codeMirror.setExtending(shift);codeMirror.execCommand("goLineUp");codeMirror.execCommand("goLineEnd")
+codeMirror.setExtending(false);}
+function moveRight(shift,codeMirror)
+{var cursor=codeMirror.getCursor("head");var line=codeMirror.getLine(cursor.line);if(cursor.ch!==line.length||cursor.line+1===codeMirror.lineCount())
+return CodeMirror.Pass;codeMirror.setExtending(shift);codeMirror.execCommand("goLineDown");codeMirror.execCommand("goLineStart");codeMirror.setExtending(false);}
+function delWordBack(codeMirror)
+{if(codeMirror.somethingSelected())
+return CodeMirror.Pass;var cursor=codeMirror.getCursor("head");if(cursor.ch===0)
+codeMirror.execCommand("delCharBefore");else
+return CodeMirror.Pass;}
+var modifierKey=WebInspector.isMac()?"Alt":"Ctrl";var leftKey=modifierKey+"-Left";var rightKey=modifierKey+"-Right";var keyMap={};keyMap[leftKey]=moveLeft.bind(null,false);keyMap[rightKey]=moveRight.bind(null,false);keyMap["Shift-"+leftKey]=moveLeft.bind(null,true);keyMap["Shift-"+rightKey]=moveRight.bind(null,true);keyMap[modifierKey+"-Backspace"]=delWordBack;codeMirror.addKeyMap(keyMap);}
+WebInspector.CodeMirrorTextEditor.AutocompleteController=function(textEditor,codeMirror)
+{this._textEditor=textEditor;this._codeMirror=codeMirror;this._codeMirror.on("scroll",this._onScroll.bind(this));this._codeMirror.on("cursorActivity",this._onCursorActivity.bind(this));}
+WebInspector.CodeMirrorTextEditor.AutocompleteController.prototype={autocomplete:function()
+{var dictionary=this._textEditor._dictionary;if(!dictionary||this._codeMirror.somethingSelected()){this.finishAutocomplete();return;}
+var cursor=this._codeMirror.getCursor();var substituteRange=this._textEditor._wordRangeForCursorPosition(cursor.line,cursor.ch,false);if(!substituteRange||substituteRange.startColumn===cursor.ch){this.finishAutocomplete();return;}
+var prefixRange=substituteRange.clone();prefixRange.endColumn=cursor.ch;var substituteWord=this._textEditor.copyRange(substituteRange);var hasPrefixInDictionary=dictionary.hasWord(substituteWord);if(hasPrefixInDictionary)
+dictionary.removeWord(substituteWord);var wordsWithPrefix=dictionary.wordsWithPrefix(this._textEditor.copyRange(prefixRange));if(hasPrefixInDictionary)
+dictionary.addWord(substituteWord);function sortSuggestions(a,b)
+{return dictionary.wordCount(b)-dictionary.wordCount(a)||a.length-b.length;}
+wordsWithPrefix.sort(sortSuggestions);if(!this._suggestBox){this._suggestBox=new WebInspector.SuggestBox(this,this._textEditor.element,"generic-suggest",6);this._anchorBox=this._anchorBoxForPosition(cursor.line,cursor.ch);}
+this._suggestBox.updateSuggestions(this._anchorBox,wordsWithPrefix,0,true,this._textEditor.copyRange(prefixRange));this._prefixRange=prefixRange;if(!this._suggestBox.visible())
+this.finishAutocomplete();},finishAutocomplete:function()
+{if(!this._suggestBox)
+return;this._suggestBox.hide();this._suggestBox=null;this._prefixRange=null;this._anchorBox=null;},keyDown:function(e)
+{if(!this._suggestBox)
+return false;if(e.keyCode===WebInspector.KeyboardShortcut.Keys.Esc.code){this.finishAutocomplete();return true;}
+if(e.keyCode===WebInspector.KeyboardShortcut.Keys.Tab.code){this._suggestBox.acceptSuggestion();this.finishAutocomplete();return true;}
+return this._suggestBox.keyPressed(e);},applySuggestion:function(suggestion,isIntermediateSuggestion)
+{this._currentSuggestion=suggestion;},acceptSuggestion:function()
+{if(this._prefixRange.endColumn-this._prefixRange.startColumn!==this._currentSuggestion.length){var pos=this._textEditor._toPos(this._prefixRange);this._codeMirror.replaceRange(this._currentSuggestion,pos.start,pos.end,"+autocomplete");}},_onScroll:function()
+{if(!this._suggestBox)
+return;var cursor=this._codeMirror.getCursor();var scrollInfo=this._codeMirror.getScrollInfo();var topmostLineNumber=this._codeMirror.lineAtHeight(scrollInfo.top,"local");var bottomLine=this._codeMirror.lineAtHeight(scrollInfo.top+scrollInfo.clientHeight,"local");if(cursor.line<topmostLineNumber||cursor.line>bottomLine)
+this.finishAutocomplete();else{this._anchorBox=this._anchorBoxForPosition(cursor.line,cursor.ch);this._suggestBox.setPosition(this._anchorBox);}},_onCursorActivity:function()
+{if(!this._suggestBox)
+return;var cursor=this._codeMirror.getCursor();if(cursor.line!==this._prefixRange.startLine||cursor.ch>this._prefixRange.endColumn||cursor.ch<this._prefixRange.startColumn)
+this.finishAutocomplete();},_anchorBoxForPosition:function(line,column)
+{var metrics=this._textEditor.cursorPositionToCoordinates(line,column);return metrics?new AnchorBox(metrics.x,metrics.y,0,metrics.height):null;},}
+WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens=function(modeName,tokenPrefix)
+{var oldModeName=modeName+"-old";if(CodeMirror.modes[oldModeName])
+return;CodeMirror.defineMode(oldModeName,CodeMirror.modes[modeName]);CodeMirror.defineMode(modeName,modeConstructor);function modeConstructor(config,parserConfig)
+{var innerConfig={};for(var i in parserConfig)
+innerConfig[i]=parserConfig[i];innerConfig.name=oldModeName;var codeMirrorMode=CodeMirror.getMode(config,innerConfig);codeMirrorMode.name=modeName;codeMirrorMode.token=tokenOverride.bind(null,codeMirrorMode.token);return codeMirrorMode;}
+function tokenOverride(superToken,stream,state)
+{var token=superToken(stream,state);return token?tokenPrefix+token:token;}}
+WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens("css","css-");WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens("javascript","js-");WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens("xml","xml-");(function(){var backgroundColor=InspectorFrontendHost.getSelectionBackgroundColor();var backgroundColorRule=backgroundColor?".CodeMirror .CodeMirror-selected { background-color: "+backgroundColor+";}":"";var foregroundColor=InspectorFrontendHost.getSelectionForegroundColor();var foregroundColorRule=foregroundColor?".CodeMirror .CodeMirror-selectedtext:not(.CodeMirror-persist-highlight) { color: "+foregroundColor+"!important;}":"";if(!foregroundColorRule&&!backgroundColorRule)
+return;var style=document.createElement("style");style.textContent=backgroundColorRule+foregroundColorRule;document.head.appendChild(style);})();
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ConsolePanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ConsolePanel.js
new file mode 100644 (file)
index 0000000..333dcce
--- /dev/null
@@ -0,0 +1,362 @@
+WebInspector.ConsoleViewMessage=function(target,consoleMessage,linkifier)
+{this._message=consoleMessage;this._linkifier=linkifier;this._target=target;this._repeatCount=1;this._dataGrids=[];this._dataGridParents=new Map();this._customFormatters={"object":this._formatParameterAsObject,"array":this._formatParameterAsArray,"node":this._formatParameterAsNode,"string":this._formatParameterAsString};}
+WebInspector.ConsoleViewMessage.prototype={wasShown:function()
+{for(var i=0;this._dataGrids&&i<this._dataGrids.length;++i){var dataGrid=this._dataGrids[i];var parentElement=this._dataGridParents.get(dataGrid)||null;dataGrid.show(parentElement);dataGrid.updateWidths();}},willHide:function()
+{for(var i=0;this._dataGrids&&i<this._dataGrids.length;++i){var dataGrid=this._dataGrids[i];this._dataGridParents.put(dataGrid,dataGrid.element.parentElement);dataGrid.detach();}},consoleMessage:function()
+{return this._message;},_formatMessage:function()
+{this._formattedMessage=document.createElement("span");this._formattedMessage.className="console-message-text source-code";function linkifyRequest(title)
+{return WebInspector.Linkifier.linkifyUsingRevealer((this.request),title,this.url);}
+var consoleMessage=this._message;if(!this._messageElement){if(consoleMessage.source===WebInspector.ConsoleMessage.MessageSource.ConsoleAPI){switch(consoleMessage.type){case WebInspector.ConsoleMessage.MessageType.Trace:this._messageElement=this._format(consoleMessage.parameters||["console.trace()"]);break;case WebInspector.ConsoleMessage.MessageType.Clear:this._messageElement=document.createTextNode(WebInspector.UIString("Console was cleared"));this._formattedMessage.classList.add("console-info");break;case WebInspector.ConsoleMessage.MessageType.Assert:var args=[WebInspector.UIString("Assertion failed:")];if(consoleMessage.parameters)
+args=args.concat(consoleMessage.parameters);this._messageElement=this._format(args);break;case WebInspector.ConsoleMessage.MessageType.Dir:var obj=consoleMessage.parameters?consoleMessage.parameters[0]:undefined;var args=["%O",obj];this._messageElement=this._format(args);break;case WebInspector.ConsoleMessage.MessageType.Profile:case WebInspector.ConsoleMessage.MessageType.ProfileEnd:this._messageElement=this._format([consoleMessage.messageText]);break;default:var args=consoleMessage.parameters||[consoleMessage.messageText];this._messageElement=this._format(args);}}else if(consoleMessage.source===WebInspector.ConsoleMessage.MessageSource.Network){if(consoleMessage.request){consoleMessage.stackTrace=consoleMessage.request.initiator.stackTrace;if(consoleMessage.request.initiator&&consoleMessage.request.initiator.url){consoleMessage.url=consoleMessage.request.initiator.url;consoleMessage.line=consoleMessage.request.initiator.lineNumber;}
+this._messageElement=document.createElement("span");if(consoleMessage.level===WebInspector.ConsoleMessage.MessageLevel.Error){this._messageElement.appendChild(document.createTextNode(consoleMessage.request.requestMethod+" "));this._messageElement.appendChild(WebInspector.Linkifier.linkifyUsingRevealer(consoleMessage.request,consoleMessage.request.url,consoleMessage.request.url));if(consoleMessage.request.failed)
+this._messageElement.appendChild(document.createTextNode(" "+consoleMessage.request.localizedFailDescription));else
+this._messageElement.appendChild(document.createTextNode(" "+consoleMessage.request.statusCode+" ("+consoleMessage.request.statusText+")"));}else{var fragment=WebInspector.linkifyStringAsFragmentWithCustomLinkifier(consoleMessage.messageText,linkifyRequest.bind(consoleMessage));this._messageElement.appendChild(fragment);}}else{var url=consoleMessage.url;if(url){var isExternal=!WebInspector.resourceForURL(url)&&!WebInspector.workspace.uiSourceCodeForURL(url);this._anchorElement=WebInspector.linkifyURLAsNode(url,url,"console-message-url",isExternal);}
+this._messageElement=this._format([consoleMessage.messageText]);}}else{var args=consoleMessage.parameters||[consoleMessage.messageText];this._messageElement=this._format(args);}}
+if(consoleMessage.source!==WebInspector.ConsoleMessage.MessageSource.Network||consoleMessage.request){var callFrame=this._callFrameAnchorFromStackTrace(consoleMessage.stackTrace);if(callFrame)
+this._anchorElement=this._linkifyCallFrame(callFrame);else if(consoleMessage.url&&consoleMessage.url!=="undefined")
+this._anchorElement=this._linkifyLocation(consoleMessage.url,consoleMessage.line,consoleMessage.column);}
+this._formattedMessage.appendChild(this._messageElement);if(this._anchorElement){this._formattedMessage.appendChild(document.createTextNode(" "));this._formattedMessage.appendChild(this._anchorElement);}
+var dumpStackTrace=!!consoleMessage.stackTrace&&consoleMessage.stackTrace.length&&(consoleMessage.source===WebInspector.ConsoleMessage.MessageSource.Network||consoleMessage.level===WebInspector.ConsoleMessage.MessageLevel.Error||consoleMessage.type===WebInspector.ConsoleMessage.MessageType.Trace);if(dumpStackTrace){var ol=document.createElement("ol");ol.className="outline-disclosure";var treeOutline=new TreeOutline(ol);var content=this._formattedMessage;var root=new TreeElement(content,null,true);content.treeElementForTest=root;treeOutline.appendChild(root);if(consoleMessage.type===WebInspector.ConsoleMessage.MessageType.Trace)
+root.expand();this._populateStackTraceTreeElement(root);this._formattedMessage=ol;}},_formattedMessageText:function()
+{this.formattedMessage();return this._messageElement.textContent;},formattedMessage:function()
+{if(!this._formattedMessage)
+this._formatMessage();return this._formattedMessage;},_linkifyLocation:function(url,lineNumber,columnNumber)
+{console.assert(this._linkifier);if(!this._linkifier)
+return null;lineNumber=lineNumber?lineNumber-1:0;columnNumber=columnNumber?columnNumber-1:0;if(this._message.source===WebInspector.ConsoleMessage.MessageSource.CSS){var headerIds=WebInspector.cssModel.styleSheetIdsForURL(url);var cssLocation=new WebInspector.CSSLocation(url,lineNumber,columnNumber);return this._linkifier.linkifyCSSLocation(headerIds[0]||null,cssLocation,"console-message-url");}
+return this._linkifier.linkifyLocation(url,lineNumber,columnNumber,"console-message-url");},_linkifyCallFrame:function(callFrame)
+{console.assert(this._linkifier);if(!this._linkifier)
+return null;var lineNumber=callFrame.lineNumber?callFrame.lineNumber-1:0;var columnNumber=callFrame.columnNumber?callFrame.columnNumber-1:0;var rawLocation=new WebInspector.DebuggerModel.Location(callFrame.scriptId,lineNumber,columnNumber);return this._linkifier.linkifyRawLocation(rawLocation,"console-message-url");},_callFrameAnchorFromStackTrace:function(stackTrace)
+{if(!stackTrace||!stackTrace.length)
+return null;var callFrame=stackTrace[0].scriptId?stackTrace[0]:null;if(!WebInspector.experimentsSettings.frameworksDebuggingSupport.isEnabled())
+return callFrame;if(!WebInspector.settings.skipStackFramesSwitch.get())
+return callFrame;var regex=WebInspector.settings.skipStackFramesPattern.asRegExp();if(!regex)
+return callFrame;for(var i=0;i<stackTrace.length;++i){var script=this._target.debuggerModel.scriptForId(stackTrace[i].scriptId);if(!script||!regex.test(script.sourceURL))
+return stackTrace[i].scriptId?stackTrace[i]:null;}
+return callFrame;},isErrorOrWarning:function()
+{return(this._message.level===WebInspector.ConsoleMessage.MessageLevel.Warning||this._message.level===WebInspector.ConsoleMessage.MessageLevel.Error);},_format:function(parameters)
+{var formattedResult=document.createElement("span");if(!parameters.length)
+return formattedResult;for(var i=0;i<parameters.length;++i){if(parameters[i]instanceof WebInspector.RemoteObject)
+continue;if(typeof parameters[i]==="object")
+parameters[i]=WebInspector.RemoteObject.fromPayload(parameters[i],this._target);else
+parameters[i]=WebInspector.RemoteObject.fromPrimitiveValue(parameters[i],this._target);}
+var shouldFormatMessage=WebInspector.RemoteObject.type(parameters[0])==="string"&&this._message.type!==WebInspector.ConsoleMessage.MessageType.Result;if(shouldFormatMessage){var result=this._formatWithSubstitutionString(parameters[0].description,parameters.slice(1),formattedResult);parameters=result.unusedSubstitutions;if(parameters.length)
+formattedResult.appendChild(document.createTextNode(" "));}
+if(this._message.type===WebInspector.ConsoleMessage.MessageType.Table){formattedResult.appendChild(this._formatParameterAsTable(parameters));return formattedResult;}
+for(var i=0;i<parameters.length;++i){if(shouldFormatMessage&&parameters[i].type==="string")
+formattedResult.appendChild(WebInspector.linkifyStringAsFragment(parameters[i].description));else
+formattedResult.appendChild(this._formatParameter(parameters[i],false,true));if(i<parameters.length-1)
+formattedResult.appendChild(document.createTextNode(" "));}
+return formattedResult;},_formatParameter:function(output,forceObjectFormat,includePreview)
+{var type;if(forceObjectFormat)
+type="object";else if(output instanceof WebInspector.RemoteObject)
+type=output.subtype||output.type;else
+type=typeof output;var formatter=this._customFormatters[type];if(!formatter){formatter=this._formatParameterAsValue;output=output.description;}
+var span=document.createElement("span");span.className="console-formatted-"+type+" source-code";formatter.call(this,output,span,includePreview);return span;},_formatParameterAsValue:function(val,elem)
+{elem.appendChild(document.createTextNode(val));},_formatParameterAsObject:function(obj,elem,includePreview)
+{this._formatParameterAsArrayOrObject(obj,obj.description||"",elem,includePreview);},_formatParameterAsArrayOrObject:function(obj,description,elem,includePreview)
+{var titleElement=document.createElement("span");if(description)
+titleElement.createTextChild(description);if(includePreview&&obj.preview){titleElement.classList.add("console-object-preview");var lossless=this._appendObjectPreview(obj,description,titleElement);if(lossless){elem.appendChild(titleElement);return;}}
+var section=new WebInspector.ObjectPropertiesSection(obj,titleElement);section.enableContextMenu();elem.appendChild(section.element);var note=section.titleElement.createChild("span","object-info-state-note");note.title=WebInspector.UIString("Object state below is captured upon first expansion");},_appendObjectPreview:function(obj,description,titleElement)
+{var preview=obj.preview;var isArray=obj.subtype==="array";if(description)
+titleElement.createTextChild(" ");titleElement.createTextChild(isArray?"[":"{");for(var i=0;i<preview.properties.length;++i){if(i>0)
+titleElement.createTextChild(", ");var property=preview.properties[i];var name=property.name;if(!isArray||name!=i){if(/^\s|\s$|^$|\n/.test(name))
+name="\""+name.replace(/\n/g,"\u21B5")+"\"";titleElement.createChild("span","name").textContent=name;titleElement.createTextChild(": ");}
+titleElement.appendChild(this._renderPropertyPreviewOrAccessor(obj,[property]));}
+if(preview.overflow)
+titleElement.createChild("span").textContent="\u2026";titleElement.createTextChild(isArray?"]":"}");return preview.lossless;},_renderPropertyPreviewOrAccessor:function(object,propertyPath)
+{var property=propertyPath.peekLast();if(property.type==="accessor")
+return this._formatAsAccessorProperty(object,propertyPath.select("name"),false);return this._renderPropertyPreview(property.type,(property.subtype),property.value);},_renderPropertyPreview:function(type,subtype,description)
+{var span=document.createElement("span");span.className="console-formatted-"+type;if(type==="function"){span.textContent="function";return span;}
+if(type==="object"&&subtype==="regexp"){span.classList.add("console-formatted-string");span.textContent=description;return span;}
+if(type==="object"&&subtype==="node"&&description){span.classList.add("console-formatted-preview-node");WebInspector.DOMPresentationUtils.createSpansForNodeTitle(span,description);return span;}
+if(type==="string"){span.textContent="\""+description.replace(/\n/g,"\u21B5")+"\"";return span;}
+span.textContent=description;return span;},_formatParameterAsNode:function(object,elem)
+{function printNode(nodeId)
+{if(!nodeId){this._formatParameterAsObject(object,elem,false);return;}
+var node=WebInspector.domModel.nodeForId(nodeId);var renderer=WebInspector.moduleManager.instance(WebInspector.Renderer,node);if(renderer)
+elem.appendChild(renderer.render(node));else
+console.error("No renderer for node found");}
+object.pushNodeToFrontend(printNode.bind(this));},useArrayPreviewInFormatter:function(array)
+{return this._message.type!==WebInspector.ConsoleMessage.MessageType.DirXML&&!!array.preview;},_formatParameterAsArray:function(array,elem)
+{if(this.useArrayPreviewInFormatter(array)){this._formatParameterAsArrayOrObject(array,"",elem,true);return;}
+const maxFlatArrayLength=100;if(this._message.isOutdated||array.arrayLength()>maxFlatArrayLength)
+this._formatParameterAsObject(array,elem,false);else
+array.getOwnProperties(this._printArray.bind(this,array,elem));},_formatParameterAsTable:function(parameters)
+{var element=document.createElement("span");var table=parameters[0];if(!table||!table.preview)
+return element;var columnNames=[];var preview=table.preview;var rows=[];for(var i=0;i<preview.properties.length;++i){var rowProperty=preview.properties[i];var rowPreview=rowProperty.valuePreview;if(!rowPreview)
+continue;var rowValue={};const maxColumnsToRender=20;for(var j=0;j<rowPreview.properties.length;++j){var cellProperty=rowPreview.properties[j];var columnRendered=columnNames.indexOf(cellProperty.name)!=-1;if(!columnRendered){if(columnNames.length===maxColumnsToRender)
+continue;columnRendered=true;columnNames.push(cellProperty.name);}
+if(columnRendered){var cellElement=this._renderPropertyPreviewOrAccessor(table,[rowProperty,cellProperty]);cellElement.classList.add("nowrap-below");rowValue[cellProperty.name]=cellElement;}}
+rows.push([rowProperty.name,rowValue]);}
+var flatValues=[];for(var i=0;i<rows.length;++i){var rowName=rows[i][0];var rowValue=rows[i][1];flatValues.push(rowName);for(var j=0;j<columnNames.length;++j)
+flatValues.push(rowValue[columnNames[j]]);}
+if(!flatValues.length)
+return element;columnNames.unshift(WebInspector.UIString("(index)"));var dataGrid=WebInspector.DataGrid.createSortableDataGrid(columnNames,flatValues);dataGrid.renderInline();this._dataGrids.push(dataGrid);this._dataGridParents.put(dataGrid,element);return element;},_formatParameterAsString:function(output,elem)
+{var span=document.createElement("span");span.className="console-formatted-string source-code";span.appendChild(WebInspector.linkifyStringAsFragment(output.description));elem.classList.remove("console-formatted-string");elem.appendChild(document.createTextNode("\""));elem.appendChild(span);elem.appendChild(document.createTextNode("\""));},_printArray:function(array,elem,properties)
+{if(!properties)
+return;var elements=[];for(var i=0;i<properties.length;++i){var property=properties[i];var name=property.name;if(isNaN(name))
+continue;if(property.getter)
+elements[name]=this._formatAsAccessorProperty(array,[name],true);else if(property.value)
+elements[name]=this._formatAsArrayEntry(property.value);}
+elem.appendChild(document.createTextNode("["));var lastNonEmptyIndex=-1;function appendUndefined(elem,index)
+{if(index-lastNonEmptyIndex<=1)
+return;var span=elem.createChild("span","console-formatted-undefined");span.textContent=WebInspector.UIString("undefined × %d",index-lastNonEmptyIndex-1);}
+var length=array.arrayLength();for(var i=0;i<length;++i){var element=elements[i];if(!element)
+continue;if(i-lastNonEmptyIndex>1){appendUndefined(elem,i);elem.appendChild(document.createTextNode(", "));}
+elem.appendChild(element);lastNonEmptyIndex=i;if(i<length-1)
+elem.appendChild(document.createTextNode(", "));}
+appendUndefined(elem,length);elem.appendChild(document.createTextNode("]"));},_formatAsArrayEntry:function(output)
+{return this._formatParameter(output,output.subtype==="array",false);},_formatAsAccessorProperty:function(object,propertyPath,isArrayEntry)
+{var rootElement=WebInspector.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan(object,propertyPath,onInvokeGetterClick.bind(this));function onInvokeGetterClick(result,wasThrown)
+{if(!result)
+return;rootElement.removeChildren();if(wasThrown){var element=rootElement.createChild("span","error-message");element.textContent=WebInspector.UIString("<exception>");element.title=result.description;}else if(isArrayEntry){rootElement.appendChild(this._formatAsArrayEntry(result));}else{const maxLength=100;var type=result.type;var subtype=result.subtype;var description="";if(type!=="function"&&result.description){if(type==="string"||subtype==="regexp")
+description=result.description.trimMiddle(maxLength);else
+description=result.description.trimEnd(maxLength);}
+rootElement.appendChild(this._renderPropertyPreview(type,subtype,description));}}
+return rootElement;},_formatWithSubstitutionString:function(format,parameters,formattedResult)
+{var formatters={};function parameterFormatter(force,obj)
+{return this._formatParameter(obj,force,false);}
+function stringFormatter(obj)
+{return obj.description;}
+function floatFormatter(obj)
+{if(typeof obj.value!=="number")
+return"NaN";return obj.value;}
+function integerFormatter(obj)
+{if(typeof obj.value!=="number")
+return"NaN";return Math.floor(obj.value);}
+function bypassFormatter(obj)
+{return(obj instanceof Node)?obj:"";}
+var currentStyle=null;function styleFormatter(obj)
+{currentStyle={};var buffer=document.createElement("span");buffer.setAttribute("style",obj.description);for(var i=0;i<buffer.style.length;i++){var property=buffer.style[i];if(isWhitelistedProperty(property))
+currentStyle[property]=buffer.style[property];}}
+function isWhitelistedProperty(property)
+{var prefixes=["background","border","color","font","line","margin","padding","text","-webkit-background","-webkit-border","-webkit-font","-webkit-margin","-webkit-padding","-webkit-text"];for(var i=0;i<prefixes.length;i++){if(property.startsWith(prefixes[i]))
+return true;}
+return false;}
+formatters.o=parameterFormatter.bind(this,false);formatters.s=stringFormatter;formatters.f=floatFormatter;formatters.i=integerFormatter;formatters.d=integerFormatter;formatters.c=styleFormatter;formatters.O=parameterFormatter.bind(this,true);formatters._=bypassFormatter;function append(a,b)
+{if(b instanceof Node)
+a.appendChild(b);else if(typeof b!=="undefined"){var toAppend=WebInspector.linkifyStringAsFragment(String(b));if(currentStyle){var wrapper=document.createElement('span');for(var key in currentStyle)
+wrapper.style[key]=currentStyle[key];wrapper.appendChild(toAppend);toAppend=wrapper;}
+a.appendChild(toAppend);}
+return a;}
+return String.format(format,parameters,formatters,formattedResult,append);},clearHighlight:function()
+{if(!this._formattedMessage)
+return;var highlightedMessage=this._formattedMessage;delete this._formattedMessage;delete this._anchorElement;delete this._messageElement;this._formatMessage();this._element.replaceChild(this._formattedMessage,highlightedMessage);},highlightSearchResults:function(regexObject)
+{if(!this._formattedMessage)
+return;this._highlightSearchResultsInElement(regexObject,this._messageElement);if(this._anchorElement)
+this._highlightSearchResultsInElement(regexObject,this._anchorElement);this._element.scrollIntoViewIfNeeded();},_highlightSearchResultsInElement:function(regexObject,element)
+{regexObject.lastIndex=0;var text=element.textContent;var match=regexObject.exec(text);var matchRanges=[];while(match){matchRanges.push(new WebInspector.SourceRange(match.index,match[0].length));match=regexObject.exec(text);}
+WebInspector.highlightSearchResults(element,matchRanges);},matchesRegex:function(regexObject)
+{regexObject.lastIndex=0;return regexObject.test(this._formattedMessageText())||(!!this._anchorElement&&regexObject.test(this._anchorElement.textContent));},updateTimestamp:function(show)
+{if(!this._element)
+return;if(show&&!this.timestampElement){this.timestampElement=this._element.createChild("span","console-timestamp");this.timestampElement.textContent=(new Date(this._message.timestamp)).toConsoleTime();var afterRepeatCountChild=this.repeatCountElement&&this.repeatCountElement.nextSibling;this._element.insertBefore(this.timestampElement,afterRepeatCountChild||this._element.firstChild);return;}
+if(!show&&this.timestampElement){this.timestampElement.remove();delete this.timestampElement;}},toMessageElement:function()
+{if(this._element)
+return this._element;var element=document.createElement("div");element.message=this;element.className="console-message";this._element=element;switch(this._message.level){case WebInspector.ConsoleMessage.MessageLevel.Log:element.classList.add("console-log-level");break;case WebInspector.ConsoleMessage.MessageLevel.Debug:element.classList.add("console-debug-level");break;case WebInspector.ConsoleMessage.MessageLevel.Warning:element.classList.add("console-warning-level");break;case WebInspector.ConsoleMessage.MessageLevel.Error:element.classList.add("console-error-level");break;case WebInspector.ConsoleMessage.MessageLevel.Info:element.classList.add("console-info-level");break;}
+if(this._message.type===WebInspector.ConsoleMessage.MessageType.StartGroup||this._message.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)
+element.classList.add("console-group-title");element.appendChild(this.formattedMessage());if(this._repeatCount>1)
+this._showRepeatCountElement();this.updateTimestamp(WebInspector.settings.consoleTimestampsEnabled.get());return element;},_populateStackTraceTreeElement:function(parentTreeElement)
+{for(var i=0;i<this._message.stackTrace.length;i++){var frame=this._message.stackTrace[i];var content=document.createElementWithClass("div","stacktrace-entry");var messageTextElement=document.createElement("span");messageTextElement.className="console-message-text source-code";var functionName=frame.functionName||WebInspector.UIString("(anonymous function)");messageTextElement.appendChild(document.createTextNode(functionName));content.appendChild(messageTextElement);if(frame.scriptId){content.appendChild(document.createTextNode(" "));var urlElement=this._linkifyCallFrame(frame);if(!urlElement)
+continue;content.appendChild(urlElement);}
+var treeElement=new TreeElement(content);parentTreeElement.appendChild(treeElement);}},incrementRepeatCount:function()
+{this._repeatCount++;this._showRepeatCountElement();},_showRepeatCountElement:function()
+{if(!this._element)
+return;if(!this.repeatCountElement){this.repeatCountElement=document.createElement("span");this.repeatCountElement.className="bubble";this._element.insertBefore(this.repeatCountElement,this._element.firstChild);this._element.classList.add("repeated-message");}
+this.repeatCountElement.textContent=this._repeatCount;},toString:function()
+{var sourceString;switch(this._message.source){case WebInspector.ConsoleMessage.MessageSource.XML:sourceString="XML";break;case WebInspector.ConsoleMessage.MessageSource.JS:sourceString="JavaScript";break;case WebInspector.ConsoleMessage.MessageSource.Network:sourceString="Network";break;case WebInspector.ConsoleMessage.MessageSource.ConsoleAPI:sourceString="ConsoleAPI";break;case WebInspector.ConsoleMessage.MessageSource.Storage:sourceString="Storage";break;case WebInspector.ConsoleMessage.MessageSource.AppCache:sourceString="AppCache";break;case WebInspector.ConsoleMessage.MessageSource.Rendering:sourceString="Rendering";break;case WebInspector.ConsoleMessage.MessageSource.CSS:sourceString="CSS";break;case WebInspector.ConsoleMessage.MessageSource.Security:sourceString="Security";break;case WebInspector.ConsoleMessage.MessageSource.Other:sourceString="Other";break;}
+var typeString;switch(this._message.type){case WebInspector.ConsoleMessage.MessageType.Log:typeString="Log";break;case WebInspector.ConsoleMessage.MessageType.Dir:typeString="Dir";break;case WebInspector.ConsoleMessage.MessageType.DirXML:typeString="Dir XML";break;case WebInspector.ConsoleMessage.MessageType.Trace:typeString="Trace";break;case WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed:case WebInspector.ConsoleMessage.MessageType.StartGroup:typeString="Start Group";break;case WebInspector.ConsoleMessage.MessageType.EndGroup:typeString="End Group";break;case WebInspector.ConsoleMessage.MessageType.Assert:typeString="Assert";break;case WebInspector.ConsoleMessage.MessageType.Result:typeString="Result";break;case WebInspector.ConsoleMessage.MessageType.Profile:case WebInspector.ConsoleMessage.MessageType.ProfileEnd:typeString="Profiling";break;}
+var levelString;switch(this._message.level){case WebInspector.ConsoleMessage.MessageLevel.Log:levelString="Log";break;case WebInspector.ConsoleMessage.MessageLevel.Warning:levelString="Warning";break;case WebInspector.ConsoleMessage.MessageLevel.Debug:levelString="Debug";break;case WebInspector.ConsoleMessage.MessageLevel.Error:levelString="Error";break;case WebInspector.ConsoleMessage.MessageLevel.Info:levelString="Info";break;}
+return sourceString+" "+typeString+" "+levelString+": "+this.formattedMessage().textContent+"\n"+this._message.url+" line "+this._message.line;},get text()
+{return this._message.messageText;}};WebInspector.ConsoleView=function(hideContextSelector)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("filter.css");this._searchableView=new WebInspector.SearchableView(this);this._searchableView.setMinimalSearchQuerySize(0);this._searchableView.show(this.element);this._contentsElement=this._searchableView.element;this._contentsElement.classList.add("console-view");this._visibleViewMessages=[];this._urlToMessageCount={};this._clearConsoleButton=new WebInspector.StatusBarButton(WebInspector.UIString("Clear console log."),"clear-status-bar-item");this._clearConsoleButton.addEventListener("click",this._requestClearMessages,this);this._executionContextSelector=new WebInspector.StatusBarComboBox(this._executionContextChanged.bind(this),"console-context");this._topLevelOptionByContextListId={};this._subOptionsByContextListId={};this._filter=new WebInspector.ConsoleViewFilter(this);this._filter.addEventListener(WebInspector.ConsoleViewFilter.Events.FilterChanged,this._updateMessageList.bind(this));if(hideContextSelector)
+this._executionContextSelector.element.classList.add("hidden");this._filterBar=new WebInspector.FilterBar();var statusBarElement=this._contentsElement.createChild("div","console-status-bar");statusBarElement.appendChild(this._clearConsoleButton.element);statusBarElement.appendChild(this._filterBar.filterButton().element);statusBarElement.appendChild(this._executionContextSelector.element);this._filtersContainer=this._contentsElement.createChild("div","console-filters-header hidden");this._filtersContainer.appendChild(this._filterBar.filtersElement());this._filterBar.addEventListener(WebInspector.FilterBar.Events.FiltersToggled,this._onFiltersToggled,this);this._filterBar.setName("consoleView");this._filter.addFilters(this._filterBar);this.messagesElement=document.createElement("div");this.messagesElement.id="console-messages";this.messagesElement.className="monospace";this.messagesElement.addEventListener("click",this._messagesClicked.bind(this),true);this._contentsElement.appendChild(this.messagesElement);this._scrolledToBottom=true;this.promptElement=document.createElement("div");this.promptElement.id="console-prompt";this.promptElement.className="source-code";this.promptElement.spellcheck=false;this.messagesElement.appendChild(this.promptElement);this.messagesElement.appendChild(document.createElement("br"));this.topGroup=new WebInspector.ConsoleGroup(null);this.messagesElement.insertBefore(this.topGroup.element,this.promptElement);this.currentGroup=this.topGroup;this._registerShortcuts();this.registerRequiredCSS("textPrompt.css");this.messagesElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),false);WebInspector.settings.monitoringXHREnabled.addChangeListener(this._monitoringXHREnabledSettingChanged.bind(this));this._linkifier=new WebInspector.Linkifier();this._messageToViewMessage=new Map();this._consoleMessages=[];this.prompt=new WebInspector.TextPromptWithHistory(this._completionsForTextPrompt.bind(this));this.prompt.setSuggestBoxEnabled("generic-suggest");this.prompt.renderAsBlock();this.prompt.attach(this.promptElement);this.prompt.proxyElement.addEventListener("keydown",this._promptKeyDown.bind(this),false);this.prompt.setHistoryData(WebInspector.settings.consoleHistory.get());this._filterStatusMessageElement=document.createElement("div");this._filterStatusMessageElement.classList.add("console-message");this._filterStatusTextElement=this._filterStatusMessageElement.createChild("span","console-info");this._filterStatusMessageElement.createTextChild(" ");var resetFiltersLink=this._filterStatusMessageElement.createChild("span","console-info node-link");resetFiltersLink.textContent=WebInspector.UIString("Show all messages.");resetFiltersLink.addEventListener("click",this._filter.reset.bind(this._filter),true);this.messagesElement.insertBefore(this._filterStatusMessageElement,this.topGroup.element);this._updateFilterStatus();WebInspector.targetManager.targets().forEach(this._targetAdded,this);WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.TargetAdded,this._onTargetAdded,this);WebInspector.settings.consoleTimestampsEnabled.addChangeListener(this._consoleTimestampsSettingChanged,this);}
+WebInspector.ConsoleView.prototype={_onTargetAdded:function(event)
+{this._targetAdded((event.data));},_targetAdded:function(target)
+{target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,this._onConsoleMessageAdded.bind(this,target),this);target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._consoleCleared,this);target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.CommandEvaluated,this._commandEvaluated,this);target.consoleModel.messages.forEach(this._consoleMessageAdded.bind(this,target));function loadContextList(contextList)
+{this._addExecutionContextList(target,contextList);this._contextListChanged(target,contextList);}
+target.runtimeModel.contextLists().forEach(loadContextList,this);target.runtimeModel.addEventListener(WebInspector.RuntimeModel.Events.ExecutionContextListAdded,this._executionContextListAdded.bind(this,target));target.runtimeModel.addEventListener(WebInspector.RuntimeModel.Events.ExecutionContextListRemoved,this._executionContextListRemoved,this);},_consoleTimestampsSettingChanged:function(event)
+{var enabled=(event.data);this._messageToViewMessage.values().forEach(function(viewMessage){viewMessage.updateTimestamp(enabled);})},defaultFocusedElement:function()
+{return this.promptElement},_onFiltersToggled:function(event)
+{var toggled=(event.data);this._filtersContainer.classList.toggle("hidden",!toggled);},_executionContextListAdded:function(target,event)
+{var contextList=(event.data);this._addExecutionContextList(target,contextList);},_addExecutionContextList:function(target,contextList)
+{var maxLength=50;var topLevelOption=this._executionContextSelector.createOption(contextList.displayName().trimMiddle(maxLength),contextList.url());topLevelOption._executionContext=null;topLevelOption._target=target;this._topLevelOptionByContextListId[contextList.id()]=topLevelOption;this._subOptionsByContextListId[contextList.id()]=[];contextList.addEventListener(WebInspector.ExecutionContextList.EventTypes.Reset,this._contextListReset,this);contextList.addEventListener(WebInspector.ExecutionContextList.EventTypes.ContextAdded,this._contextListChanged.bind(this,target,contextList));},_executionContextListRemoved:function(event)
+{var contextList=(event.data);this._removeSubOptions(contextList.id());var topLevelOption=this._topLevelOptionByContextListId[contextList.id()];this._executionContextSelector.removeOption(topLevelOption);delete this._topLevelOptionByContextListId[contextList.id()];delete this._subOptionsByContextListId[contextList.id()];this._executionContextChanged();},_removeSubOptions:function(contextListId)
+{var selectedOptionRemoved=false;var subOptions=this._subOptionsByContextListId[contextListId];for(var i=0;i<subOptions.length;++i){selectedOptionRemoved|=this._executionContextSelector.selectedOption()===subOptions[i];this._executionContextSelector.removeOption(subOptions[i]);}
+this._subOptionsByContextListId[contextListId]=[];return selectedOptionRemoved;},_executionContextChanged:function()
+{var runtimeModel=this._currentTarget().runtimeModel;var runtimeContext=runtimeModel.currentExecutionContext();if(this._currentExecutionContext()!==runtimeContext)
+runtimeModel.setCurrentExecutionContext(this._currentExecutionContext());this.prompt.clearAutoComplete(true);},_currentExecutionContext:function()
+{var option=this._executionContextSelector.selectedOption();return option?option._executionContext:null;},_currentTarget:function()
+{var option=this._executionContextSelector.selectedOption();return option?option._target:WebInspector.targetManager.mainTarget();},_completionsForTextPrompt:function(proxyElement,wordRange,force,completionsReadyCallback)
+{this._currentTarget().runtimeModel.completionsForTextPrompt(proxyElement,wordRange,force,completionsReadyCallback);},_contextListReset:function(event)
+{var contextList=(event.data);var option=this._topLevelOptionByContextListId[contextList.id()];var maxLength=50;option.text=contextList.displayName().trimMiddle(maxLength);option.title=contextList.url();var selectedRemoved=this._removeSubOptions(contextList.id());if(selectedRemoved){this._executionContextSelector.select(option);this._executionContextChanged();}},_contextListChanged:function(target,contextList)
+{var currentExecutionContext=this._currentExecutionContext();var shouldSelectOption=this._removeSubOptions(contextList.id());var topLevelOption=this._topLevelOptionByContextListId[contextList.id()];var nextTopLevelOption=topLevelOption.nextSibling;var subOptions=this._subOptionsByContextListId[contextList.id()];var executionContexts=contextList.executionContexts();for(var i=0;i<executionContexts.length;++i){if(executionContexts[i].isMainWorldContext){topLevelOption._executionContext=executionContexts[i];continue;}
+var subOption=document.createElement("option");subOption.text="\u00a0\u00a0\u00a0\u00a0"+executionContexts[i].name;subOption._executionContext=executionContexts[i];subOption._target=target;this._executionContextSelector.selectElement().insertBefore(subOption,nextTopLevelOption);subOptions.push(subOption);if(shouldSelectOption&&executionContexts[i]===currentExecutionContext){this._executionContextSelector.select(subOption);shouldSelectOption=false;}}
+if(shouldSelectOption)
+this._executionContextSelector.select(topLevelOption);this._executionContextChanged();},willHide:function()
+{this.prompt.hideSuggestBox();this.prompt.clearAutoComplete(true);},wasShown:function()
+{if(!this.prompt.isCaretInsidePrompt())
+this.prompt.moveCaretToEndOfPrompt();},focus:function()
+{if(this.promptElement===WebInspector.currentFocusElement())
+return;WebInspector.setCurrentFocusElement(this.promptElement);this.prompt.moveCaretToEndOfPrompt();},storeScrollPositions:function()
+{WebInspector.View.prototype.storeScrollPositions.call(this);this._scrolledToBottom=this.messagesElement.isScrolledToBottom();},restoreScrollPositions:function()
+{if(this._scrolledToBottom)
+this._immediatelyScrollIntoView();else
+WebInspector.View.prototype.restoreScrollPositions.call(this);},onResize:function()
+{this.prompt.hideSuggestBox();this.restoreScrollPositions();},_isScrollIntoViewScheduled:function()
+{return!!this._scrollIntoViewTimer;},_scheduleScrollIntoView:function()
+{if(this._scrollIntoViewTimer)
+return;function scrollIntoView()
+{delete this._scrollIntoViewTimer;this.messagesElement.scrollTop=this.messagesElement.scrollHeight;}
+this._scrollIntoViewTimer=setTimeout(scrollIntoView.bind(this),20);},_immediatelyScrollIntoView:function()
+{this.promptElement.scrollIntoView(true);this._cancelScheduledScrollIntoView();},_cancelScheduledScrollIntoView:function()
+{if(!this._isScrollIntoViewScheduled())
+return;clearTimeout(this._scrollIntoViewTimer);delete this._scrollIntoViewTimer;},_updateFilterStatus:function(count){count=(typeof count==="undefined")?(this._consoleMessages.length-this._visibleViewMessages.length):count;this._filterStatusTextElement.textContent=WebInspector.UIString(count==1?"%d message is hidden by filters.":"%d messages are hidden by filters.",count);this._filterStatusMessageElement.style.display=count?"":"none";},_consoleMessageAdded:function(target,message)
+{if(this._urlToMessageCount[message.url])
+this._urlToMessageCount[message.url]++;else
+this._urlToMessageCount[message.url]=1;var previousMessage=this._consoleMessages.peekLast();if(previousMessage&&!message.isGroupMessage()&&message.isEqual(previousMessage)){previousMessage.timestamp=message.timestamp;this._messageToViewMessage.get(previousMessage).incrementRepeatCount();return;}
+this._consoleMessages.push(message);var viewMessage=this._createViewMessage(target,message);if(this._filter.shouldBeVisible(viewMessage))
+this._showConsoleMessage(viewMessage);else
+this._updateFilterStatus();},_onConsoleMessageAdded:function(target,event)
+{var message=(event.data);this._consoleMessageAdded(target,message);},_showConsoleMessage:function(viewMessage)
+{var message=viewMessage.consoleMessage();if(!this._isScrollIntoViewScheduled()&&((viewMessage instanceof WebInspector.ConsoleCommandResult)||this.messagesElement.isScrolledToBottom()))
+this._scheduleScrollIntoView();this._visibleViewMessages.push(viewMessage);if(message.type===WebInspector.ConsoleMessage.MessageType.EndGroup){var parentGroup=this.currentGroup.parentGroup;if(parentGroup)
+this.currentGroup=parentGroup;}else{if(message.type===WebInspector.ConsoleMessage.MessageType.StartGroup||message.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed){var group=new WebInspector.ConsoleGroup(this.currentGroup);this.currentGroup.messagesElement.appendChild(group.element);this.currentGroup=group;viewMessage.group=group;}
+this.currentGroup.addMessage(viewMessage);}
+if(this._searchRegex&&viewMessage.matchesRegex(this._searchRegex)){this._searchResults.push(viewMessage);this._searchableView.updateSearchMatchesCount(this._searchResults.length);}},_createViewMessage:function(target,message)
+{var viewMessage=this._messageToViewMessage.get(message);if(viewMessage)
+return viewMessage;if(message.type===WebInspector.ConsoleMessage.MessageType.Command)
+viewMessage=new WebInspector.ConsoleCommand(target,message);else
+viewMessage=new WebInspector.ConsoleViewMessage(target,message,this._linkifier);this._messageToViewMessage.put(message,viewMessage);return viewMessage;},_consoleCleared:function()
+{this._scrolledToBottom=true;this._clearCurrentSearchResultHighlight();this._updateFilterStatus(0);for(var i=0;i<this._visibleViewMessages.length;++i)
+this._visibleViewMessages[i].willHide();this._visibleViewMessages=[];this._searchResults=[];this._messageToViewMessage.clear();this._consoleMessages=[];if(this._searchRegex)
+this._searchableView.updateSearchMatchesCount(0);this.currentGroup=this.topGroup;this.topGroup.messagesElement.removeChildren();this._linkifier.reset();},_handleContextMenuEvent:function(event)
+{if(event.target.enclosingNodeOrSelfWithNodeName("a"))
+return;var contextMenu=new WebInspector.ContextMenu(event);function monitoringXHRItemAction()
+{WebInspector.settings.monitoringXHREnabled.set(!WebInspector.settings.monitoringXHREnabled.get());}
+contextMenu.appendCheckboxItem(WebInspector.UIString("Log XMLHttpRequests"),monitoringXHRItemAction,WebInspector.settings.monitoringXHREnabled.get());function preserveLogItemAction()
+{WebInspector.settings.preserveConsoleLog.set(!WebInspector.settings.preserveConsoleLog.get());}
+contextMenu.appendCheckboxItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Preserve log upon navigation":"Preserve Log upon Navigation"),preserveLogItemAction,WebInspector.settings.preserveConsoleLog.get());var sourceElement=event.target.enclosingNodeOrSelfWithClass("console-message");var filterSubMenu=contextMenu.appendSubMenuItem(WebInspector.UIString("Filter"));if(sourceElement&&sourceElement.message.url){var menuTitle=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Hide messages from %s":"Hide Messages from %s",new WebInspector.ParsedURL(sourceElement.message.url).displayName);filterSubMenu.appendItem(menuTitle,this._filter.addMessageURLFilter.bind(this._filter,sourceElement.message.url));}
+filterSubMenu.appendSeparator();var unhideAll=filterSubMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Unhide all":"Unhide All"),this._filter.removeMessageURLFilter.bind(this._filter));filterSubMenu.appendSeparator();var hasFilters=false;for(var url in this._filter.messageURLFilters){filterSubMenu.appendCheckboxItem(String.sprintf("%s (%d)",new WebInspector.ParsedURL(url).displayName,this._urlToMessageCount[url]),this._filter.removeMessageURLFilter.bind(this._filter,url),true);hasFilters=true;}
+filterSubMenu.setEnabled(hasFilters||(sourceElement&&sourceElement.message.url));unhideAll.setEnabled(hasFilters);contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Clear console":"Clear Console"),this._requestClearMessages.bind(this));var request=(sourceElement&&sourceElement.message)?sourceElement.message.request:null;if(request&&request.type===WebInspector.resourceTypes.XHR){contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString("Replay XHR"),NetworkAgent.replayXHR.bind(null,request.requestId));}
+contextMenu.show();},_updateMessageList:function()
+{var group=this.topGroup;var visibleMessageIndex=0;var newVisibleMessages=[];if(this._searchRegex)
+this._searchResults=[];var anchor=null;for(var i=0;i<this._consoleMessages.length;++i){var sourceMessage=this._consoleMessages[i];var sourceViewMessage=this._messageToViewMessage.get(sourceMessage);var visibleViewMessage=this._visibleViewMessages[visibleMessageIndex];if(visibleViewMessage===sourceViewMessage){if(this._filter.shouldBeVisible(sourceViewMessage)){newVisibleMessages.push(this._visibleViewMessages[visibleMessageIndex]);if(this._searchRegex&&sourceViewMessage.matchesRegex(this._searchRegex))
+this._searchResults.push(sourceViewMessage);if(sourceMessage.type===WebInspector.ConsoleMessage.MessageType.EndGroup){anchor=group.element;group=group.parentGroup||group;}else if(sourceMessage.type===WebInspector.ConsoleMessage.MessageType.StartGroup||sourceMessage.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed){group=sourceViewMessage.group;anchor=group.messagesElement.firstChild;}else
+anchor=sourceViewMessage.toMessageElement();}else{sourceViewMessage.willHide();sourceViewMessage.toMessageElement().remove();}
+++visibleMessageIndex;}else{if(this._filter.shouldBeVisible(sourceViewMessage)){if(this._searchRegex&&sourceViewMessage.matchesRegex(this._searchRegex))
+this._searchResults.push(sourceViewMessage);group.addMessage(sourceViewMessage,anchor?anchor.nextSibling:group.messagesElement.firstChild);newVisibleMessages.push(sourceViewMessage);anchor=sourceViewMessage.toMessageElement();}}}
+if(this._searchRegex)
+this._searchableView.updateSearchMatchesCount(this._searchResults.length);this._visibleViewMessages=newVisibleMessages;this._updateFilterStatus();},_monitoringXHREnabledSettingChanged:function(event)
+{ConsoleAgent.setMonitoringXHREnabled(event.data);},_messagesClicked:function()
+{if(!this.prompt.isCaretInsidePrompt()&&window.getSelection().isCollapsed)
+this.prompt.moveCaretToEndOfPrompt();},_registerShortcuts:function()
+{this._shortcuts={};var shortcut=WebInspector.KeyboardShortcut;var section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Console"));var shortcutL=shortcut.makeDescriptor("l",WebInspector.KeyboardShortcut.Modifiers.Ctrl);this._shortcuts[shortcutL.key]=this._requestClearMessages.bind(this);var keys=[shortcutL];if(WebInspector.isMac()){var shortcutK=shortcut.makeDescriptor("k",WebInspector.KeyboardShortcut.Modifiers.Meta);this._shortcuts[shortcutK.key]=this._requestClearMessages.bind(this);keys.unshift(shortcutK);}
+section.addAlternateKeys(keys,WebInspector.UIString("Clear console"));section.addKey(shortcut.makeDescriptor(shortcut.Keys.Tab),WebInspector.UIString("Autocomplete common prefix"));section.addKey(shortcut.makeDescriptor(shortcut.Keys.Right),WebInspector.UIString("Accept suggestion"));keys=[shortcut.makeDescriptor(shortcut.Keys.Down),shortcut.makeDescriptor(shortcut.Keys.Up)];section.addRelatedKeys(keys,WebInspector.UIString("Next/previous line"));if(WebInspector.isMac()){keys=[shortcut.makeDescriptor("N",shortcut.Modifiers.Alt),shortcut.makeDescriptor("P",shortcut.Modifiers.Alt)];section.addRelatedKeys(keys,WebInspector.UIString("Next/previous command"));}
+section.addKey(shortcut.makeDescriptor(shortcut.Keys.Enter),WebInspector.UIString("Execute command"));},_requestClearMessages:function()
+{WebInspector.console.requestClearMessages();},_promptKeyDown:function(event)
+{if(isEnterKey(event)){this._enterKeyPressed(event);return;}
+var shortcut=WebInspector.KeyboardShortcut.makeKeyFromEvent(event);var handler=this._shortcuts[shortcut];if(handler){handler();event.preventDefault();}},_enterKeyPressed:function(event)
+{if(event.altKey||event.ctrlKey||event.shiftKey)
+return;event.consume(true);this.prompt.clearAutoComplete(true);var str=this.prompt.text;if(!str.length)
+return;this._appendCommand(str,true);},_printResult:function(result,wasThrown,originatingCommand)
+{if(!result)
+return;var target=result.target();function addMessage(url,lineNumber,columnNumber)
+{var resultMessage=new WebInspector.ConsoleCommandResult((result),wasThrown,originatingCommand,this._linkifier,url,lineNumber,columnNumber);this._messageToViewMessage.put(resultMessage.consoleMessage(),resultMessage);target.consoleModel.addMessage(resultMessage.consoleMessage());}
+if(result.type!=="function"){addMessage.call(this);return;}
+target.debuggerAgent().getFunctionDetails(result.objectId,didGetDetails.bind(this));function didGetDetails(error,response)
+{if(error){console.error(error);addMessage.call(this);return;}
+var url;var lineNumber;var columnNumber;var script=WebInspector.debuggerModel.scriptForId(response.location.scriptId);if(script&&script.sourceURL){url=script.sourceURL;lineNumber=response.location.lineNumber+1;columnNumber=response.location.columnNumber+1;}
+addMessage.call(this,url,lineNumber,columnNumber);}},_appendCommand:function(text,useCommandLineAPI)
+{this.prompt.text="";this._currentTarget().consoleModel.evaluateCommand(text,useCommandLineAPI);},_commandEvaluated:function(event)
+{var data=(event.data);this.prompt.pushHistoryItem(data.text);WebInspector.settings.consoleHistory.set(this.prompt.historyData.slice(-30));this._printResult(data.result,data.wasThrown,(this._messageToViewMessage.get(data.commandMessage)));},elementsToRestoreScrollPositionsFor:function()
+{return[this.messagesElement];},searchCanceled:function()
+{this._clearCurrentSearchResultHighlight();delete this._searchResults;delete this._searchRegex;},performSearch:function(query,shouldJump)
+{this.searchCanceled();this._searchableView.updateSearchMatchesCount(0);this._searchRegex=createPlainTextSearchRegex(query,"gi");this._searchResults=[];for(var i=0;i<this._visibleViewMessages.length;i++){if(this._visibleViewMessages[i].matchesRegex(this._searchRegex))
+this._searchResults.push(this._visibleViewMessages[i]);}
+this._searchableView.updateSearchMatchesCount(this._searchResults.length);this._currentSearchResultIndex=-1;if(shouldJump&&this._searchResults.length)
+this._jumpToSearchResult(0);},jumpToNextSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;this._jumpToSearchResult((this._currentSearchResultIndex+1)%this._searchResults.length);},jumpToPreviousSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;var index=this._currentSearchResultIndex-1;if(index===-1)
+index=this._searchResults.length-1;this._jumpToSearchResult(index);},_clearCurrentSearchResultHighlight:function()
+{if(!this._searchResults)
+return;var highlightedViewMessage=this._searchResults[this._currentSearchResultIndex];if(highlightedViewMessage)
+highlightedViewMessage.clearHighlight();this._currentSearchResultIndex=-1;},_jumpToSearchResult:function(index)
+{this._clearCurrentSearchResultHighlight();this._currentSearchResultIndex=index;this._searchableView.updateCurrentMatchIndex(this._currentSearchResultIndex);this._searchResults[index].highlightSearchResults(this._searchRegex);},__proto__:WebInspector.VBox.prototype}
+WebInspector.ConsoleViewFilter=function(view)
+{this._view=view;this._messageURLFilters=WebInspector.settings.messageURLFilters.get();this._filterChanged=this.dispatchEventToListeners.bind(this,WebInspector.ConsoleViewFilter.Events.FilterChanged);};WebInspector.ConsoleViewFilter.Events={FilterChanged:"FilterChanged"};WebInspector.ConsoleViewFilter.prototype={addFilters:function(filterBar)
+{this._textFilterUI=new WebInspector.TextFilterUI(true);this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._textFilterChanged,this);filterBar.addFilter(this._textFilterUI);var levels=[{name:"error",label:WebInspector.UIString("Errors")},{name:"warning",label:WebInspector.UIString("Warnings")},{name:"info",label:WebInspector.UIString("Info")},{name:"log",label:WebInspector.UIString("Logs")},{name:"debug",label:WebInspector.UIString("Debug")}];this._levelFilterUI=new WebInspector.NamedBitSetFilterUI(levels,WebInspector.settings.messageLevelFilters);this._levelFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._filterChanged,this);filterBar.addFilter(this._levelFilterUI);},_textFilterChanged:function(event)
+{this._filterRegex=this._textFilterUI.regex();this._filterChanged();},addMessageURLFilter:function(url)
+{this._messageURLFilters[url]=true;WebInspector.settings.messageURLFilters.set(this._messageURLFilters);this._filterChanged();},removeMessageURLFilter:function(url)
+{if(!url)
+this._messageURLFilters={};else
+delete this._messageURLFilters[url];WebInspector.settings.messageURLFilters.set(this._messageURLFilters);this._filterChanged();},get messageURLFilters()
+{return this._messageURLFilters;},shouldBeVisible:function(viewMessage)
+{if(!viewMessage)
+return false;var message=viewMessage.consoleMessage();if((message.type===WebInspector.ConsoleMessage.MessageType.StartGroup||message.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed||message.type===WebInspector.ConsoleMessage.MessageType.EndGroup))
+return true;if(message.type===WebInspector.ConsoleMessage.MessageType.Result||message.type===WebInspector.ConsoleMessage.MessageType.Command)
+return true;if(message.url&&this._messageURLFilters[message.url])
+return false;if(message.level&&!this._levelFilterUI.accept(message.level))
+return false;if(this._filterRegex){this._filterRegex.lastIndex=0;if(!viewMessage.matchesRegex(this._filterRegex))
+return false;}
+return true;},reset:function()
+{this._messageURLFilters={};WebInspector.settings.messageURLFilters.set(this._messageURLFilters);WebInspector.settings.messageLevelFilters.set({});this._filterChanged();},__proto__:WebInspector.Object.prototype};WebInspector.ConsoleCommand=function(target,message)
+{WebInspector.ConsoleViewMessage.call(this,target,message,null);}
+WebInspector.ConsoleCommand.prototype={wasShown:function()
+{},willHide:function()
+{},clearHighlight:function()
+{var highlightedMessage=this._formattedCommand;delete this._formattedCommand;this._formatCommand();this._element.replaceChild(this._formattedCommand,highlightedMessage);},highlightSearchResults:function(regexObject)
+{regexObject.lastIndex=0;var match=regexObject.exec(this.text);var matchRanges=[];while(match){matchRanges.push(new WebInspector.SourceRange(match.index,match[0].length));match=regexObject.exec(this.text);}
+WebInspector.highlightSearchResults(this._formattedCommand,matchRanges);this._element.scrollIntoViewIfNeeded();},matchesRegex:function(regexObject)
+{regexObject.lastIndex=0;return regexObject.test(this.text);},toMessageElement:function()
+{if(!this._element){this._element=document.createElement("div");this._element.command=this;this._element.className="console-user-command";this._formatCommand();this._element.appendChild(this._formattedCommand);}
+return this._element;},_formatCommand:function()
+{this._formattedCommand=document.createElement("span");this._formattedCommand.className="console-message-text source-code";this._formattedCommand.textContent=this.text;},__proto__:WebInspector.ConsoleViewMessage.prototype}
+WebInspector.ConsoleCommandResult=function(result,wasThrown,originatingCommand,linkifier,url,lineNumber,columnNumber)
+{this.originatingCommand=originatingCommand;var level=wasThrown?WebInspector.ConsoleMessage.MessageLevel.Error:WebInspector.ConsoleMessage.MessageLevel.Log;var message=new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.JS,level,"",WebInspector.ConsoleMessage.MessageType.Result,url,lineNumber,columnNumber,undefined,[result]);WebInspector.ConsoleViewMessage.call(this,result.target(),message,linkifier);}
+WebInspector.ConsoleCommandResult.prototype={useArrayPreviewInFormatter:function(array)
+{return false;},toMessageElement:function()
+{var element=WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this);element.classList.add("console-user-command-result");return element;},__proto__:WebInspector.ConsoleViewMessage.prototype}
+WebInspector.ConsoleGroup=function(parentGroup)
+{this.parentGroup=parentGroup;var element=document.createElement("div");element.className="console-group";element.group=this;this.element=element;if(parentGroup){var bracketElement=document.createElement("div");bracketElement.className="console-group-bracket";element.appendChild(bracketElement);}
+var messagesElement=document.createElement("div");messagesElement.className="console-group-messages";element.appendChild(messagesElement);this.messagesElement=messagesElement;}
+WebInspector.ConsoleGroup.prototype={addMessage:function(viewMessage,node)
+{var message=viewMessage.consoleMessage();var element=viewMessage.toMessageElement();if(message.type===WebInspector.ConsoleMessage.MessageType.StartGroup||message.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed){this.messagesElement.parentNode.insertBefore(element,this.messagesElement);element.addEventListener("click",this._titleClicked.bind(this),false);var groupElement=element.enclosingNodeOrSelfWithClass("console-group");if(groupElement&&message.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)
+groupElement.classList.add("collapsed");}else{this.messagesElement.insertBefore(element,node||null);viewMessage.wasShown();}
+if(element.previousSibling&&viewMessage.originatingCommand&&element.previousSibling.command===viewMessage.originatingCommand)
+element.previousSibling.classList.add("console-adjacent-user-command-result");},_titleClicked:function(event)
+{var groupTitleElement=event.target.enclosingNodeOrSelfWithClass("console-group-title");if(groupTitleElement){var groupElement=groupTitleElement.enclosingNodeOrSelfWithClass("console-group");if(groupElement&&!groupElement.classList.toggle("collapsed")){if(groupElement.group){groupElement.group.wasShown();}}
+groupTitleElement.scrollIntoViewIfNeeded(true);}
+event.consume(true);},wasShown:function()
+{if(this.element.classList.contains("collapsed"))
+return;var node=this.messagesElement.firstChild;while(node){if(node.classList.contains("console-message")&&node.message)
+node.message.wasShown();if(node.classList.contains("console-group")&&node.group)
+node.group.wasShown();node=node.nextSibling;}}}
+WebInspector.ConsoleView.ShowConsoleActionDelegate=function()
+{}
+WebInspector.ConsoleView.ShowConsoleActionDelegate.prototype={handleAction:function()
+{WebInspector.console.show();return true;}};WebInspector.ConsolePanel=function()
+{WebInspector.Panel.call(this,"console");this._view=WebInspector.ConsolePanel._view();}
+WebInspector.ConsolePanel._view=function()
+{if(!WebInspector.ConsolePanel._consoleView)
+WebInspector.ConsolePanel._consoleView=new WebInspector.ConsoleView(!Capabilities.isMainFrontend);return WebInspector.ConsolePanel._consoleView;}
+WebInspector.ConsolePanel.prototype={defaultFocusedElement:function()
+{return this._view.defaultFocusedElement();},wasShown:function()
+{WebInspector.Panel.prototype.wasShown.call(this);this._view.show(this.element);},willHide:function()
+{WebInspector.Panel.prototype.willHide.call(this);if(WebInspector.ConsolePanel.WrapperView._instance)
+WebInspector.ConsolePanel.WrapperView._instance._showViewInWrapper();},__proto__:WebInspector.Panel.prototype}
+WebInspector.ConsolePanel.WrapperView=function()
+{WebInspector.VBox.call(this);this.element.classList.add("console-view-wrapper");WebInspector.ConsolePanel.WrapperView._instance=this;this._view=WebInspector.ConsolePanel._view();this.wasShown();}
+WebInspector.ConsolePanel.WrapperView.prototype={wasShown:function()
+{if(!WebInspector.inspectorView.currentPanel()||WebInspector.inspectorView.currentPanel().name!=="console")
+this._showViewInWrapper();},defaultFocusedElement:function()
+{return this._view.defaultFocusedElement();},focus:function()
+{this._view.focus();},_showViewInWrapper:function()
+{this._view.show(this.element);},__proto__:WebInspector.VBox.prototype}
+WebInspector.ConsolePanel.ConsoleRevealer=function()
+{}
+WebInspector.ConsolePanel.ConsoleRevealer.prototype={reveal:function(object)
+{if(!(object instanceof WebInspector.ConsoleModel))
+return;var consoleView=WebInspector.ConsolePanel._view();if(consoleView.isShowing()){consoleView.focus();return;}
+WebInspector.inspectorView.showViewInDrawer("console");}}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/DevTools.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/DevTools.js
deleted file mode 100644 (file)
index 6829b99..0000000
+++ /dev/null
@@ -1,44193 +0,0 @@
-\r
-\r
-\r
-\r
-\r
-Function.prototype.bind = function(thisObject)\r
-{\r
-var func = this;\r
-var args = Array.prototype.slice.call(arguments, 1);\r
-function bound()\r
-{\r
-return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0)));\r
-}\r
-bound.toString = function() {\r
-return "bound: " + func;\r
-};\r
-return bound;\r
-}\r
-\r
-Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, direction)\r
-{\r
-var startNode;\r
-var startOffset = 0;\r
-var endNode;\r
-var endOffset = 0;\r
-\r
-if (!stayWithinNode)\r
-stayWithinNode = this;\r
-\r
-if (!direction || direction === "backward" || direction === "both") {\r
-var node = this;\r
-while (node) {\r
-if (node === stayWithinNode) {\r
-if (!startNode)\r
-startNode = stayWithinNode;\r
-break;\r
-}\r
-\r
-if (node.nodeType === Node.TEXT_NODE) {\r
-var start = (node === this ? (offset - 1) : (node.nodeValue.length - 1));\r
-for (var i = start; i >= 0; --i) {\r
-if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {\r
-startNode = node;\r
-startOffset = i + 1;\r
-break;\r
-}\r
-}\r
-}\r
-\r
-if (startNode)\r
-break;\r
-\r
-node = node.traversePreviousNode(stayWithinNode);\r
-}\r
-\r
-if (!startNode) {\r
-startNode = stayWithinNode;\r
-startOffset = 0;\r
-}\r
-} else {\r
-startNode = this;\r
-startOffset = offset;\r
-}\r
-\r
-if (!direction || direction === "forward" || direction === "both") {\r
-node = this;\r
-while (node) {\r
-if (node === stayWithinNode) {\r
-if (!endNode)\r
-endNode = stayWithinNode;\r
-break;\r
-}\r
-\r
-if (node.nodeType === Node.TEXT_NODE) {\r
-var start = (node === this ? offset : 0);\r
-for (var i = start; i < node.nodeValue.length; ++i) {\r
-if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {\r
-endNode = node;\r
-endOffset = i;\r
-break;\r
-}\r
-}\r
-}\r
-\r
-if (endNode)\r
-break;\r
-\r
-node = node.traverseNextNode(stayWithinNode);\r
-}\r
-\r
-if (!endNode) {\r
-endNode = stayWithinNode;\r
-endOffset = stayWithinNode.nodeType === Node.TEXT_NODE ? stayWithinNode.nodeValue.length : stayWithinNode.childNodes.length;\r
-}\r
-} else {\r
-endNode = this;\r
-endOffset = offset;\r
-}\r
-\r
-var result = this.ownerDocument.createRange();\r
-result.setStart(startNode, startOffset);\r
-result.setEnd(endNode, endOffset);\r
-\r
-return result;\r
-}\r
-\r
-Node.prototype.traverseNextTextNode = function(stayWithin)\r
-{\r
-var node = this.traverseNextNode(stayWithin);\r
-if (!node)\r
-return;\r
-\r
-while (node && node.nodeType !== Node.TEXT_NODE)\r
-node = node.traverseNextNode(stayWithin);\r
-\r
-return node;\r
-}\r
-\r
-Node.prototype.rangeBoundaryForOffset = function(offset)\r
-{\r
-var node = this.traverseNextTextNode(this);\r
-while (node && offset > node.nodeValue.length) {\r
-offset -= node.nodeValue.length;\r
-node = node.traverseNextTextNode(this);\r
-}\r
-if (!node)\r
-return { container: this, offset: 0 };\r
-return { container: node, offset: offset };\r
-}\r
-\r
-Element.prototype.removeStyleClass = function(className) \r
-{\r
-\r
-if (this.className === className) {\r
-this.className = "";\r
-return;\r
-}\r
-\r
-var index = this.className.indexOf(className);\r
-if (index === -1)\r
-return;\r
-\r
-this.className = this.className.split(" ").filter(function(s) {\r
-return s && s !== className;\r
-}).join(" ");\r
-}\r
-\r
-Element.prototype.removeMatchingStyleClasses = function(classNameRegex)\r
-{\r
-var regex = new RegExp("(^|\\s+)" + classNameRegex + "($|\\s+)");\r
-if (regex.test(this.className))\r
-this.className = this.className.replace(regex, " ");\r
-}\r
-\r
-Element.prototype.addStyleClass = function(className) \r
-{\r
-if (className && !this.hasStyleClass(className))\r
-this.className += (this.className.length ? " " + className : className);\r
-}\r
-\r
-Element.prototype.hasStyleClass = function(className) \r
-{\r
-if (!className)\r
-return false;\r
-\r
-if (this.className === className)\r
-return true;\r
-\r
-var index = this.className.indexOf(className);\r
-if (index === -1)\r
-return false;\r
-var toTest = " " + this.className + " ";\r
-return toTest.indexOf(" " + className + " ", index) !== -1;\r
-}\r
-\r
-Element.prototype.positionAt = function(x, y)\r
-{\r
-this.style.left = x + "px";\r
-this.style.top = y + "px";\r
-}\r
-\r
-Element.prototype.pruneEmptyTextNodes = function()\r
-{\r
-var sibling = this.firstChild;\r
-while (sibling) {\r
-var nextSibling = sibling.nextSibling;\r
-if (sibling.nodeType === this.TEXT_NODE && sibling.nodeValue === "")\r
-this.removeChild(sibling);\r
-sibling = nextSibling;\r
-}\r
-}\r
-\r
-Element.prototype.isScrolledToBottom = function()\r
-{\r
-return this.scrollTop === this.scrollHeight - this.offsetHeight;\r
-}\r
-\r
-Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray)\r
-{\r
-for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)\r
-for (var i = 0; i < nameArray.length; ++i)\r
-if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())\r
-return node;\r
-return null;\r
-}\r
-\r
-Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName)\r
-{\r
-return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);\r
-}\r
-\r
-Node.prototype.enclosingNodeOrSelfWithClass = function(className)\r
-{\r
-for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)\r
-if (node.nodeType === Node.ELEMENT_NODE && node.hasStyleClass(className))\r
-return node;\r
-return null;\r
-}\r
-\r
-Node.prototype.enclosingNodeWithClass = function(className)\r
-{\r
-if (!this.parentNode)\r
-return null;\r
-return this.parentNode.enclosingNodeOrSelfWithClass(className);\r
-}\r
-\r
-Element.prototype.query = function(query) \r
-{\r
-return this.ownerDocument.evaluate(query, this, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\r
-}\r
-\r
-Element.prototype.removeChildren = function()\r
-{\r
-if (this.firstChild)\r
-this.textContent = "";\r
-}\r
-\r
-Element.prototype.isInsertionCaretInside = function()\r
-{\r
-var selection = window.getSelection();\r
-if (!selection.rangeCount || !selection.isCollapsed)\r
-return false;\r
-var selectionRange = selection.getRangeAt(0);\r
-return selectionRange.startContainer === this || selectionRange.startContainer.isDescendant(this);\r
-}\r
-\r
-Element.prototype.createChild = function(elementName, className)\r
-{\r
-var element = document.createElement(elementName);\r
-if (className)\r
-element.className = className;\r
-this.appendChild(element);\r
-return element;\r
-}\r
-\r
-Element.prototype.__defineGetter__("totalOffsetLeft", function()\r
-{\r
-var total = 0;\r
-for (var element = this; element; element = element.offsetParent)\r
-total += element.offsetLeft + (this !== element ? element.clientLeft : 0);\r
-return total;\r
-});\r
-\r
-Element.prototype.__defineGetter__("totalOffsetTop", function()\r
-{\r
-var total = 0;\r
-for (var element = this; element; element = element.offsetParent)\r
-total += element.offsetTop + (this !== element ? element.clientTop : 0);\r
-return total;\r
-});\r
-\r
-Element.prototype.offsetRelativeToWindow = function(targetWindow)\r
-{\r
-var elementOffset = {x: 0, y: 0};\r
-var curElement = this;\r
-var curWindow = this.ownerDocument.defaultView;\r
-while (curWindow && curElement) {\r
-elementOffset.x += curElement.totalOffsetLeft;\r
-elementOffset.y += curElement.totalOffsetTop;\r
-if (curWindow === targetWindow)\r
-break;\r
-\r
-curElement = curWindow.frameElement;\r
-curWindow = curWindow.parent;\r
-}\r
-\r
-return elementOffset;\r
-}\r
-\r
-KeyboardEvent.prototype.__defineGetter__("data", function()\r
-{\r
-\r
-\r
-switch (this.type) {\r
-case "keypress":\r
-if (!this.ctrlKey && !this.metaKey)\r
-return String.fromCharCode(this.charCode);\r
-else\r
-return "";\r
-case "keydown":\r
-case "keyup":\r
-if (!this.ctrlKey && !this.metaKey && !this.altKey)\r
-return String.fromCharCode(this.which);\r
-else\r
-return "";\r
-}\r
-});\r
-\r
-Text.prototype.select = function(start, end)\r
-{\r
-start = start || 0;\r
-end = end || this.textContent.length;\r
-\r
-if (start < 0)\r
-start = end + start;\r
-\r
-var selection = window.getSelection();\r
-selection.removeAllRanges();\r
-var range = document.createRange();\r
-range.setStart(this, start);\r
-range.setEnd(this, end);\r
-selection.addRange(range);\r
-return this;\r
-}\r
-\r
-Element.prototype.__defineGetter__("selectionLeftOffset", function() {\r
-\r
-\r
-var selection = window.getSelection();\r
-if (!selection.containsNode(this, true))\r
-return null;\r
-\r
-var leftOffset = selection.anchorOffset;\r
-var node = selection.anchorNode;\r
-\r
-while (node !== this) {\r
-while (node.previousSibling) {\r
-node = node.previousSibling;\r
-leftOffset += node.textContent.length;\r
-}\r
-node = node.parentNode;\r
-}\r
-\r
-return leftOffset;\r
-});\r
-\r
-Node.prototype.isWhitespace = isNodeWhitespace;\r
-Node.prototype.displayName = nodeDisplayName;\r
-Node.prototype.isAncestor = function(node)\r
-{\r
-return isAncestorNode(this, node);\r
-};\r
-Node.prototype.isDescendant = isDescendantNode;\r
-Node.prototype.traverseNextNode = traverseNextNode;\r
-Node.prototype.traversePreviousNode = traversePreviousNode;\r
-Node.prototype.onlyTextChild = onlyTextChild;\r
-\r
-String.prototype.hasSubstring = function(string, caseInsensitive)\r
-{\r
-if (!caseInsensitive)\r
-return this.indexOf(string) !== -1;\r
-return this.match(new RegExp(string.escapeForRegExp(), "i"));\r
-}\r
-\r
-String.prototype.asParsedURL = function()\r
-{\r
-\r
-\r
-\r
-\r
-\r
-\r
-var match = this.match(/^([^:]+):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);\r
-if (!match)\r
-return null;\r
-var result = {};\r
-result.scheme = match[1].toLowerCase();\r
-result.host = match[2];\r
-result.port = match[3];\r
-result.path = match[4] || "/";\r
-result.fragment = match[5];\r
-return result;\r
-}\r
-\r
-String.prototype.escapeCharacters = function(chars)\r
-{\r
-var foundChar = false;\r
-for (var i = 0; i < chars.length; ++i) {\r
-if (this.indexOf(chars.charAt(i)) !== -1) {\r
-foundChar = true;\r
-break;\r
-}\r
-}\r
-\r
-if (!foundChar)\r
-return this;\r
-\r
-var result = "";\r
-for (var i = 0; i < this.length; ++i) {\r
-if (chars.indexOf(this.charAt(i)) !== -1)\r
-result += "\\";\r
-result += this.charAt(i);\r
-}\r
-\r
-return result;\r
-}\r
-\r
-String.prototype.escapeForRegExp = function()\r
-{\r
-return this.escapeCharacters("^[]{}()\\.$*+?|");\r
-}\r
-\r
-String.prototype.escapeHTML = function()\r
-{\r
-return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");\r
-}\r
-\r
-String.prototype.collapseWhitespace = function()\r
-{\r
-return this.replace(/[\s\xA0]+/g, " ");\r
-}\r
-\r
-String.prototype.trimURL = function(baseURLDomain)\r
-{\r
-var result = this.replace(/^(https|http|file):\/\//i, "");\r
-if (baseURLDomain)\r
-result = result.replace(new RegExp("^" + baseURLDomain.escapeForRegExp(), "i"), "");\r
-return result;\r
-}\r
-\r
-function isNodeWhitespace()\r
-{\r
-if (!this || this.nodeType !== Node.TEXT_NODE)\r
-return false;\r
-if (!this.nodeValue.length)\r
-return true;\r
-return this.nodeValue.match(/^[\s\xA0]+$/);\r
-}\r
-\r
-function nodeDisplayName()\r
-{\r
-if (!this)\r
-return "";\r
-\r
-switch (this.nodeType) {\r
-case Node.DOCUMENT_NODE:\r
-return "Document";\r
-\r
-case Node.ELEMENT_NODE:\r
-var name = "<" + this.nodeName.toLowerCase();\r
-\r
-if (this.hasAttributes()) {\r
-var value = this.getAttribute("id");\r
-if (value)\r
-name += " id=\"" + value + "\"";\r
-value = this.getAttribute("class");\r
-if (value)\r
-name += " class=\"" + value + "\"";\r
-if (this.nodeName.toLowerCase() === "a") {\r
-value = this.getAttribute("name");\r
-if (value)\r
-name += " name=\"" + value + "\"";\r
-value = this.getAttribute("href");\r
-if (value)\r
-name += " href=\"" + value + "\"";\r
-} else if (this.nodeName.toLowerCase() === "img") {\r
-value = this.getAttribute("src");\r
-if (value)\r
-name += " src=\"" + value + "\"";\r
-} else if (this.nodeName.toLowerCase() === "iframe") {\r
-value = this.getAttribute("src");\r
-if (value)\r
-name += " src=\"" + value + "\"";\r
-} else if (this.nodeName.toLowerCase() === "input") {\r
-value = this.getAttribute("name");\r
-if (value)\r
-name += " name=\"" + value + "\"";\r
-value = this.getAttribute("type");\r
-if (value)\r
-name += " type=\"" + value + "\"";\r
-} else if (this.nodeName.toLowerCase() === "form") {\r
-value = this.getAttribute("action");\r
-if (value)\r
-name += " action=\"" + value + "\"";\r
-}\r
-}\r
-\r
-return name + ">";\r
-\r
-case Node.TEXT_NODE:\r
-if (isNodeWhitespace.call(this))\r
-return "(whitespace)";\r
-return "\"" + this.nodeValue + "\"";\r
-\r
-case Node.COMMENT_NODE:\r
-return "<!--" + this.nodeValue + "-->";\r
-\r
-case Node.DOCUMENT_TYPE_NODE:\r
-var docType = "<!DOCTYPE " + this.nodeName;\r
-if (this.publicId) {\r
-docType += " PUBLIC \"" + this.publicId + "\"";\r
-if (this.systemId)\r
-docType += " \"" + this.systemId + "\"";\r
-} else if (this.systemId)\r
-docType += " SYSTEM \"" + this.systemId + "\"";\r
-if (this.internalSubset)\r
-docType += " [" + this.internalSubset + "]";\r
-return docType + ">";\r
-}\r
-\r
-return this.nodeName.toLowerCase().collapseWhitespace();\r
-}\r
-\r
-function isAncestorNode(ancestor, node)\r
-{\r
-if (!node || !ancestor)\r
-return false;\r
-\r
-var currentNode = node.parentNode;\r
-while (currentNode) {\r
-if (ancestor === currentNode)\r
-return true;\r
-currentNode = currentNode.parentNode;\r
-}\r
-return false;\r
-}\r
-\r
-function isDescendantNode(descendant)\r
-{\r
-return isAncestorNode(descendant, this);\r
-}\r
-\r
-function traverseNextNode(stayWithin)\r
-{\r
-if (!this)\r
-return;\r
-\r
-var node = this.firstChild;\r
-if (node)\r
-return node;\r
-\r
-if (stayWithin && this === stayWithin)\r
-return null;\r
-\r
-node = this.nextSibling;\r
-if (node)\r
-return node;\r
-\r
-node = this;\r
-while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))\r
-node = node.parentNode;\r
-if (!node)\r
-return null;\r
-\r
-return node.nextSibling;\r
-}\r
-\r
-function traversePreviousNode(stayWithin)\r
-{\r
-if (!this)\r
-return;\r
-if (stayWithin && this === stayWithin)\r
-return null;\r
-var node = this.previousSibling;\r
-while (node && node.lastChild)\r
-node = node.lastChild;\r
-if (node)\r
-return node;\r
-return this.parentNode;\r
-}\r
-\r
-function onlyTextChild()\r
-{\r
-if (!this)\r
-return null;\r
-\r
-var firstChild = this.firstChild;\r
-if (!firstChild || firstChild.nodeType !== Node.TEXT_NODE)\r
-return null;\r
-\r
-var sibling = firstChild.nextSibling;\r
-return sibling ? null : firstChild;\r
-}\r
-\r
-function appropriateSelectorForNode(node, justSelector)\r
-{\r
-if (!node)\r
-return "";\r
-\r
-var lowerCaseName = node.localName || node.nodeName.toLowerCase();\r
-\r
-var id = node.getAttribute("id");\r
-if (id) {\r
-var selector = "#" + id;\r
-return (justSelector ? selector : lowerCaseName + selector);\r
-}\r
-\r
-var className = node.getAttribute("class");\r
-if (className) {\r
-var selector = "." + className.replace(/\s+/, ".");\r
-return (justSelector ? selector : lowerCaseName + selector);\r
-}\r
-\r
-if (lowerCaseName === "input" && node.getAttribute("type"))\r
-return lowerCaseName + "[type=\"" + node.getAttribute("type") + "\"]";\r
-\r
-return lowerCaseName;\r
-}\r
-\r
-function getDocumentForNode(node)\r
-{\r
-return node.nodeType == Node.DOCUMENT_NODE ? node : node.ownerDocument;\r
-}\r
-\r
-function parentNode(node)\r
-{\r
-return node.parentNode;\r
-}\r
-\r
-Number.millisToString = function(ms, formatterFunction, higherResolution)\r
-{\r
-return Number.secondsToString(ms / 1000, formatterFunction, higherResolution);\r
-}\r
-\r
-Number.secondsToString = function(seconds, formatterFunction, higherResolution)\r
-{\r
-if (!formatterFunction)\r
-formatterFunction = String.sprintf;\r
-\r
-if (seconds === 0)\r
-return "0";\r
-\r
-var ms = seconds * 1000;\r
-if (higherResolution && ms < 1000)\r
-return formatterFunction("%.3fms", ms);\r
-else if (ms < 1000)\r
-return formatterFunction("%.0fms", ms);\r
-\r
-if (seconds < 60)\r
-return formatterFunction("%.2fs", seconds);\r
-\r
-var minutes = seconds / 60;\r
-if (minutes < 60)\r
-return formatterFunction("%.1fmin", minutes);\r
-\r
-var hours = minutes / 60;\r
-if (hours < 24)\r
-return formatterFunction("%.1fhrs", hours);\r
-\r
-var days = hours / 24;\r
-return formatterFunction("%.1f days", days);\r
-}\r
-\r
-Number.bytesToString = function(bytes, formatterFunction, higherResolution)\r
-{\r
-if (!formatterFunction)\r
-formatterFunction = String.sprintf;\r
-if (typeof higherResolution === "undefined")\r
-higherResolution = true;\r
-\r
-if (bytes < 1024)\r
-return formatterFunction("%.0fB", bytes);\r
-\r
-var kilobytes = bytes / 1024;\r
-if (higherResolution && kilobytes < 1024)\r
-return formatterFunction("%.2fKB", kilobytes);\r
-else if (kilobytes < 1024)\r
-return formatterFunction("%.0fKB", kilobytes);\r
-\r
-var megabytes = kilobytes / 1024;\r
-if (higherResolution)\r
-return formatterFunction("%.2fMB", megabytes);\r
-else\r
-return formatterFunction("%.0fMB", megabytes);\r
-}\r
-\r
-Number.constrain = function(num, min, max)\r
-{\r
-if (num < min)\r
-num = min;\r
-else if (num > max)\r
-num = max;\r
-return num;\r
-}\r
-\r
-HTMLTextAreaElement.prototype.moveCursorToEnd = function()\r
-{\r
-var length = this.value.length;\r
-this.setSelectionRange(length, length);\r
-}\r
-\r
-Array.prototype.remove = function(value, onlyFirst)\r
-{\r
-if (onlyFirst) {\r
-var index = this.indexOf(value);\r
-if (index !== -1)\r
-this.splice(index, 1);\r
-return;\r
-}\r
-\r
-var length = this.length;\r
-for (var i = 0; i < length; ++i) {\r
-if (this[i] === value)\r
-this.splice(i, 1);\r
-}\r
-}\r
-\r
-Array.prototype.keySet = function()\r
-{\r
-var keys = {};\r
-for (var i = 0; i < this.length; ++i)\r
-keys[this[i]] = true;\r
-return keys;\r
-}\r
-\r
-Array.diff = function(left, right)\r
-{\r
-var o = left;\r
-var n = right;\r
-\r
-var ns = {};\r
-var os = {};\r
-\r
-for (var i = 0; i < n.length; i++) {\r
-if (ns[n[i]] == null)\r
-ns[n[i]] = { rows: [], o: null };\r
-ns[n[i]].rows.push(i);\r
-}\r
-\r
-for (var i = 0; i < o.length; i++) {\r
-if (os[o[i]] == null)\r
-os[o[i]] = { rows: [], n: null };\r
-os[o[i]].rows.push(i);\r
-}\r
-\r
-for (var i in ns) {\r
-if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {\r
-n[ns[i].rows[0]] = { text: n[ns[i].rows[0]], row: os[i].rows[0] };\r
-o[os[i].rows[0]] = { text: o[os[i].rows[0]], row: ns[i].rows[0] };\r
-}\r
-}\r
-\r
-for (var i = 0; i < n.length - 1; i++) {\r
-if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null && n[i + 1] == o[n[i].row + 1]) {\r
-n[i + 1] = { text: n[i + 1], row: n[i].row + 1 };\r
-o[n[i].row + 1] = { text: o[n[i].row + 1], row: i + 1 };\r
-}\r
-}\r
-\r
-for (var i = n.length - 1; i > 0; i--) {\r
-if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null && \r
-n[i - 1] == o[n[i].row - 1]) {\r
-n[i - 1] = { text: n[i - 1], row: n[i].row - 1 };\r
-o[n[i].row - 1] = { text: o[n[i].row - 1], row: i - 1 };\r
-}\r
-}\r
-\r
-return { left: o, right: n };\r
-}\r
-\r
-Array.convert = function(list)\r
-{\r
-\r
-return Array.prototype.slice.call(list);\r
-}\r
-\r
-function insertionIndexForObjectInListSortedByFunction(anObject, aList, aFunction)\r
-{\r
-var first = 0;\r
-var last = aList.length - 1;\r
-var floor = Math.floor;\r
-var mid, c;\r
-\r
-while (first <= last) {\r
-mid = floor((first + last) / 2);\r
-c = aFunction(anObject, aList[mid]);\r
-\r
-if (c > 0)\r
-first = mid + 1;\r
-else if (c < 0)\r
-last = mid - 1;\r
-else {\r
-\r
-while (mid > 0 && aFunction(anObject, aList[mid - 1]) === 0)\r
-mid--;\r
-first = mid;\r
-break;\r
-}\r
-}\r
-\r
-return first;\r
-}\r
-\r
-String.sprintf = function(format)\r
-{\r
-return String.vsprintf(format, Array.prototype.slice.call(arguments, 1));\r
-}\r
-\r
-String.tokenizeFormatString = function(format)\r
-{\r
-var tokens = [];\r
-var substitutionIndex = 0;\r
-\r
-function addStringToken(str)\r
-{\r
-tokens.push({ type: "string", value: str });\r
-}\r
-\r
-function addSpecifierToken(specifier, precision, substitutionIndex)\r
-{\r
-tokens.push({ type: "specifier", specifier: specifier, precision: precision, substitutionIndex: substitutionIndex });\r
-}\r
-\r
-var index = 0;\r
-for (var precentIndex = format.indexOf("%", index); precentIndex !== -1; precentIndex = format.indexOf("%", index)) {\r
-addStringToken(format.substring(index, precentIndex));\r
-index = precentIndex + 1;\r
-\r
-if (format[index] === "%") {\r
-addStringToken("%");\r
-++index;\r
-continue;\r
-}\r
-\r
-if (!isNaN(format[index])) {\r
-\r
-var number = parseInt(format.substring(index));\r
-while (!isNaN(format[index]))\r
-++index;\r
-\r
-\r
-if (number > 0 && format[index] === "$") {\r
-substitutionIndex = (number - 1);\r
-++index;\r
-}\r
-}\r
-\r
-var precision = -1;\r
-if (format[index] === ".") {\r
-\r
-\r
-++index;\r
-precision = parseInt(format.substring(index));\r
-if (isNaN(precision))\r
-precision = 0;\r
-while (!isNaN(format[index]))\r
-++index;\r
-}\r
-\r
-addSpecifierToken(format[index], precision, substitutionIndex);\r
-\r
-++substitutionIndex;\r
-++index;\r
-}\r
-\r
-addStringToken(format.substring(index));\r
-\r
-return tokens;\r
-}\r
-\r
-String.standardFormatters = {\r
-d: function(substitution)\r
-{\r
-if (typeof substitution == "object" && WebInspector.RemoteObject.type(substitution) === "number")\r
-substitution = substitution.description;\r
-substitution = parseInt(substitution);\r
-return !isNaN(substitution) ? substitution : 0;\r
-},\r
-\r
-f: function(substitution, token)\r
-{\r
-if (typeof substitution == "object" && WebInspector.RemoteObject.type(substitution) === "number")\r
-substitution = substitution.description;\r
-substitution = parseFloat(substitution);\r
-if (substitution && token.precision > -1)\r
-substitution = substitution.toFixed(token.precision);\r
-return !isNaN(substitution) ? substitution : (token.precision > -1 ? Number(0).toFixed(token.precision) : 0);\r
-},\r
-\r
-s: function(substitution)\r
-{\r
-if (typeof substitution == "object" && WebInspector.RemoteObject.type(substitution) !== "null")\r
-substitution = substitution.description;\r
-return substitution;\r
-},\r
-};\r
-\r
-String.vsprintf = function(format, substitutions)\r
-{\r
-return String.format(format, substitutions, String.standardFormatters, "", function(a, b) { return a + b; }).formattedResult;\r
-}\r
-\r
-String.format = function(format, substitutions, formatters, initialValue, append)\r
-{\r
-if (!format || !substitutions || !substitutions.length)\r
-return { formattedResult: append(initialValue, format), unusedSubstitutions: substitutions };\r
-\r
-function prettyFunctionName()\r
-{\r
-return "String.format(\"" + format + "\", \"" + substitutions.join("\", \"") + "\")";\r
-}\r
-\r
-function warn(msg)\r
-{\r
-console.warn(prettyFunctionName() + ": " + msg);\r
-}\r
-\r
-function error(msg)\r
-{\r
-console.error(prettyFunctionName() + ": " + msg);\r
-}\r
-\r
-var result = initialValue;\r
-var tokens = String.tokenizeFormatString(format);\r
-var usedSubstitutionIndexes = {};\r
-\r
-for (var i = 0; i < tokens.length; ++i) {\r
-var token = tokens[i];\r
-\r
-if (token.type === "string") {\r
-result = append(result, token.value);\r
-continue;\r
-}\r
-\r
-if (token.type !== "specifier") {\r
-error("Unknown token type \"" + token.type + "\" found.");\r
-continue;\r
-}\r
-\r
-if (token.substitutionIndex >= substitutions.length) {\r
-\r
-\r
-error("not enough substitution arguments. Had " + substitutions.length + " but needed " + (token.substitutionIndex + 1) + ", so substitution was skipped.");\r
-result = append(result, "%" + (token.precision > -1 ? token.precision : "") + token.specifier);\r
-continue;\r
-}\r
-\r
-usedSubstitutionIndexes[token.substitutionIndex] = true;\r
-\r
-if (!(token.specifier in formatters)) {\r
-\r
-warn("unsupported format character \u201C" + token.specifier + "\u201D. Treating as a string.");\r
-result = append(result, substitutions[token.substitutionIndex]);\r
-continue;\r
-}\r
-\r
-result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));\r
-}\r
-\r
-var unusedSubstitutions = [];\r
-for (var i = 0; i < substitutions.length; ++i) {\r
-if (i in usedSubstitutionIndexes)\r
-continue;\r
-unusedSubstitutions.push(substitutions[i]);\r
-}\r
-\r
-return { formattedResult: result, unusedSubstitutions: unusedSubstitutions };\r
-}\r
-\r
-function isEnterKey(event) {\r
-\r
-return event.keyCode !== 229 && event.keyIdentifier === "Enter";\r
-}\r
-\r
-\r
-function highlightSearchResult(element, offset, length)\r
-{\r
-var lineText = element.textContent;\r
-var endOffset = offset + length;\r
-var highlightNode = document.createElement("span");\r
-highlightNode.className = "webkit-search-result";\r
-highlightNode.textContent = lineText.substring(offset, endOffset);\r
-\r
-var boundary = element.rangeBoundaryForOffset(offset);\r
-var textNode = boundary.container;\r
-var text = textNode.textContent;\r
-\r
-if (boundary.offset + length < text.length) {\r
-\r
-textNode.textContent = text.substring(boundary.offset + length);\r
-textNode.parentElement.insertBefore(highlightNode, textNode);\r
-var prefixNode = document.createTextNode(text.substring(0, boundary.offset));\r
-textNode.parentElement.insertBefore(prefixNode, highlightNode);\r
-return highlightNode;\r
-}\r
-\r
-var parentElement = textNode.parentElement;\r
-var anchorElement = textNode.nextSibling;\r
-\r
-length -= text.length - boundary.offset;\r
-textNode.textContent = text.substring(0, boundary.offset);\r
-textNode = textNode.traverseNextTextNode(element);\r
-\r
-while (textNode) {\r
-var text = textNode.textContent;\r
-if (length < text.length) {\r
-textNode.textContent = text.substring(length);\r
-break;\r
-}\r
-\r
-length -= text.length;\r
-textNode.textContent = "";\r
-textNode = textNode.traverseNextTextNode(element);\r
-}\r
-\r
-parentElement.insertBefore(highlightNode, anchorElement);\r
-return highlightNode;\r
-}\r
-\r
-function createSearchRegex(query)\r
-{\r
-var regex = "";\r
-for (var i = 0; i < query.length; ++i) {\r
-var char = query.charAt(i);\r
-if (char === "]")\r
-char = "\\]";\r
-regex += "[" + char + "]";\r
-}\r
-return new RegExp(regex, "i");\r
-}\r
-\r
-function offerFileForDownload(contents)\r
-{\r
-var builder = new BlobBuilder();\r
-builder.append(contents);\r
-var blob = builder.getBlob("application/octet-stream");\r
-var url = window.createObjectURL(blob);\r
-window.open(url);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-function TreeOutline(listNode)\r
-{\r
-this.children = [];\r
-this.selectedTreeElement = null;\r
-this._childrenListNode = listNode;\r
-this._childrenListNode.removeChildren();\r
-this._knownTreeElements = [];\r
-this._treeElementsExpandedState = [];\r
-this.expandTreeElementsWhenArrowing = false;\r
-this.root = true;\r
-this.hasChildren = false;\r
-this.expanded = true;\r
-this.selected = false;\r
-this.treeOutline = this;\r
-\r
-this._childrenListNode.tabIndex = 0;\r
-this._childrenListNode.addEventListener("keydown", this._treeKeyDown.bind(this), true);\r
-}\r
-\r
-TreeOutline._knownTreeElementNextIdentifier = 1;\r
-\r
-TreeOutline._appendChild = function(child)\r
-{\r
-if (!child)\r
-throw("child can't be undefined or null");\r
-\r
-var lastChild = this.children[this.children.length - 1];\r
-if (lastChild) {\r
-lastChild.nextSibling = child;\r
-child.previousSibling = lastChild;\r
-} else {\r
-child.previousSibling = null;\r
-child.nextSibling = null;\r
-}\r
-\r
-this.children.push(child);\r
-this.hasChildren = true;\r
-child.parent = this;\r
-child.treeOutline = this.treeOutline;\r
-child.treeOutline._rememberTreeElement(child);\r
-\r
-var current = child.children[0];\r
-while (current) {\r
-current.treeOutline = this.treeOutline;\r
-current.treeOutline._rememberTreeElement(current);\r
-current = current.traverseNextTreeElement(false, child, true);\r
-}\r
-\r
-if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)\r
-child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];\r
-\r
-if (!this._childrenListNode) {\r
-this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");\r
-this._childrenListNode.parentTreeElement = this;\r
-this._childrenListNode.addStyleClass("children");\r
-if (this.hidden)\r
-this._childrenListNode.addStyleClass("hidden");\r
-}\r
-\r
-child._attach();\r
-}\r
-\r
-TreeOutline._insertChild = function(child, index)\r
-{\r
-if (!child)\r
-throw("child can't be undefined or null");\r
-\r
-var previousChild = (index > 0 ? this.children[index - 1] : null);\r
-if (previousChild) {\r
-previousChild.nextSibling = child;\r
-child.previousSibling = previousChild;\r
-} else {\r
-child.previousSibling = null;\r
-}\r
-\r
-var nextChild = this.children[index];\r
-if (nextChild) {\r
-nextChild.previousSibling = child;\r
-child.nextSibling = nextChild;\r
-} else {\r
-child.nextSibling = null;\r
-}\r
-\r
-this.children.splice(index, 0, child);\r
-this.hasChildren = true;\r
-child.parent = this;\r
-child.treeOutline = this.treeOutline;\r
-child.treeOutline._rememberTreeElement(child);\r
-\r
-var current = child.children[0];\r
-while (current) {\r
-current.treeOutline = this.treeOutline;\r
-current.treeOutline._rememberTreeElement(current);\r
-current = current.traverseNextTreeElement(false, child, true);\r
-}\r
-\r
-if (child.hasChildren && child.treeOutline._treeElementsExpandedState[child.identifier] !== undefined)\r
-child.expanded = child.treeOutline._treeElementsExpandedState[child.identifier];\r
-\r
-if (!this._childrenListNode) {\r
-this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");\r
-this._childrenListNode.parentTreeElement = this;\r
-this._childrenListNode.addStyleClass("children");\r
-if (this.hidden)\r
-this._childrenListNode.addStyleClass("hidden");\r
-}\r
-\r
-child._attach();\r
-}\r
-\r
-TreeOutline._removeChildAtIndex = function(childIndex)\r
-{\r
-if (childIndex < 0 || childIndex >= this.children.length)\r
-throw("childIndex out of range");\r
-\r
-var child = this.children[childIndex];\r
-this.children.splice(childIndex, 1);\r
-\r
-var parent = child.parent;\r
-if (child.deselect()) {\r
-if (child.previousSibling)\r
-child.previousSibling.select();\r
-else if (child.nextSibling)\r
-child.nextSibling.select();\r
-else\r
-parent.select();\r
-}\r
-\r
-if (child.previousSibling)\r
-child.previousSibling.nextSibling = child.nextSibling;\r
-if (child.nextSibling)\r
-child.nextSibling.previousSibling = child.previousSibling;\r
-\r
-if (child.treeOutline) {\r
-child.treeOutline._forgetTreeElement(child);\r
-child.treeOutline._forgetChildrenRecursive(child);\r
-}\r
-\r
-child._detach();\r
-child.treeOutline = null;\r
-child.parent = null;\r
-child.nextSibling = null;\r
-child.previousSibling = null;\r
-}\r
-\r
-TreeOutline._removeChild = function(child)\r
-{\r
-if (!child)\r
-throw("child can't be undefined or null");\r
-\r
-var childIndex = this.children.indexOf(child);\r
-if (childIndex === -1)\r
-throw("child not found in this node's children");\r
-\r
-TreeOutline._removeChildAtIndex.call(this, childIndex);\r
-}\r
-\r
-TreeOutline._removeChildren = function()\r
-{\r
-for (var i = 0; i < this.children.length; ++i) {\r
-var child = this.children[i];\r
-child.deselect();\r
-\r
-if (child.treeOutline) {\r
-child.treeOutline._forgetTreeElement(child);\r
-child.treeOutline._forgetChildrenRecursive(child);\r
-}\r
-\r
-child._detach();\r
-child.treeOutline = null;\r
-child.parent = null;\r
-child.nextSibling = null;\r
-child.previousSibling = null;\r
-}\r
-\r
-this.children = [];\r
-}\r
-\r
-TreeOutline._removeChildrenRecursive = function()\r
-{\r
-var childrenToRemove = this.children;\r
-\r
-var child = this.children[0];\r
-while (child) {\r
-if (child.children.length)\r
-childrenToRemove = childrenToRemove.concat(child.children);\r
-child = child.traverseNextTreeElement(false, this, true);\r
-}\r
-\r
-for (var i = 0; i < childrenToRemove.length; ++i) {\r
-var child = childrenToRemove[i];\r
-child.deselect();\r
-if (child.treeOutline)\r
-child.treeOutline._forgetTreeElement(child);\r
-child._detach();\r
-child.children = [];\r
-child.treeOutline = null;\r
-child.parent = null;\r
-child.nextSibling = null;\r
-child.previousSibling = null;\r
-}\r
-\r
-this.children = [];\r
-}\r
-\r
-TreeOutline.prototype._rememberTreeElement = function(element)\r
-{\r
-if (!this._knownTreeElements[element.identifier])\r
-this._knownTreeElements[element.identifier] = [];\r
-\r
-\r
-var elements = this._knownTreeElements[element.identifier];\r
-if (elements.indexOf(element) !== -1)\r
-return;\r
-\r
-\r
-elements.push(element);\r
-}\r
-\r
-TreeOutline.prototype._forgetTreeElement = function(element)\r
-{\r
-if (this._knownTreeElements[element.identifier])\r
-this._knownTreeElements[element.identifier].remove(element, true);\r
-}\r
-\r
-TreeOutline.prototype._forgetChildrenRecursive = function(parentElement)\r
-{\r
-var child = parentElement.children[0];\r
-while (child) {\r
-this._forgetTreeElement(child);\r
-child = child.traverseNextTreeElement(false, this, true);\r
-}\r
-}\r
-\r
-TreeOutline.prototype.getCachedTreeElement = function(representedObject)\r
-{\r
-if (!representedObject)\r
-return null;\r
-\r
-if ("__treeElementIdentifier" in representedObject) {\r
-\r
-\r
-var elements = this._knownTreeElements[representedObject.__treeElementIdentifier];\r
-if (elements) {\r
-for (var i = 0; i < elements.length; ++i)\r
-if (elements[i].representedObject === representedObject)\r
-return elements[i];\r
-}\r
-}\r
-return null;\r
-}\r
-\r
-TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor, getParent)\r
-{\r
-if (!representedObject)\r
-return null;\r
-\r
-var cachedElement = this.getCachedTreeElement(representedObject);\r
-if (cachedElement)\r
-return cachedElement;\r
-\r
-\r
-\r
-var item;\r
-var found = false;\r
-for (var i = 0; i < this.children.length; ++i) {\r
-item = this.children[i];\r
-if (item.representedObject === representedObject || isAncestor(item.representedObject, representedObject)) {\r
-found = true;\r
-break;\r
-}\r
-}\r
-\r
-if (!found)\r
-return null;\r
-\r
-\r
-\r
-var ancestors = [];\r
-var currentObject = representedObject;\r
-while (currentObject) {\r
-ancestors.unshift(currentObject);\r
-if (currentObject === item.representedObject)\r
-break;\r
-currentObject = getParent(currentObject);\r
-}\r
-\r
-\r
-for (var i = 0; i < ancestors.length; ++i) {\r
-\r
-\r
-if (ancestors[i] === representedObject)\r
-continue;\r
-\r
-\r
-item = this.findTreeElement(ancestors[i], isAncestor, getParent);\r
-if (item && item.onpopulate)\r
-item.onpopulate(item);\r
-}\r
-\r
-return this.getCachedTreeElement(representedObject);\r
-}\r
-\r
-TreeOutline.prototype.treeElementFromPoint = function(x, y)\r
-{\r
-var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y);\r
-var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]);\r
-if (listNode)\r
-return listNode.parentTreeElement || listNode.treeElement;\r
-return null;\r
-}\r
-\r
-TreeOutline.prototype._treeKeyDown = function(event)\r
-{\r
-if (event.target !== this._childrenListNode)\r
-return;\r
-\r
-if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)\r
-return;\r
-\r
-var handled = false;\r
-var nextSelectedElement;\r
-if (event.keyIdentifier === "Up" && !event.altKey) {\r
-nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);\r
-while (nextSelectedElement && !nextSelectedElement.selectable)\r
-nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);\r
-handled = nextSelectedElement ? true : false;\r
-} else if (event.keyIdentifier === "Down" && !event.altKey) {\r
-nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);\r
-while (nextSelectedElement && !nextSelectedElement.selectable)\r
-nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);\r
-handled = nextSelectedElement ? true : false;\r
-} else if (event.keyIdentifier === "Left") {\r
-if (this.selectedTreeElement.expanded) {\r
-if (event.altKey)\r
-this.selectedTreeElement.collapseRecursively();\r
-else\r
-this.selectedTreeElement.collapse();\r
-handled = true;\r
-} else if (this.selectedTreeElement.parent && !this.selectedTreeElement.parent.root) {\r
-handled = true;\r
-if (this.selectedTreeElement.parent.selectable) {\r
-nextSelectedElement = this.selectedTreeElement.parent;\r
-handled = nextSelectedElement ? true : false;\r
-} else if (this.selectedTreeElement.parent)\r
-this.selectedTreeElement.parent.collapse();\r
-}\r
-} else if (event.keyIdentifier === "Right") {\r
-if (!this.selectedTreeElement.revealed()) {\r
-this.selectedTreeElement.reveal();\r
-handled = true;\r
-} else if (this.selectedTreeElement.hasChildren) {\r
-handled = true;\r
-if (this.selectedTreeElement.expanded) {\r
-nextSelectedElement = this.selectedTreeElement.children[0];\r
-handled = nextSelectedElement ? true : false;\r
-} else {\r
-if (event.altKey)\r
-this.selectedTreeElement.expandRecursively();\r
-else\r
-this.selectedTreeElement.expand();\r
-}\r
-}\r
-} else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Backspace.code || event.keyCode === WebInspector.KeyboardShortcut.Keys.Delete.code) {\r
-if (this.selectedTreeElement.ondelete)\r
-handled = this.selectedTreeElement.ondelete();\r
-} else if (isEnterKey(event)) {\r
-if (this.selectedTreeElement.onenter)\r
-handled = this.selectedTreeElement.onenter();\r
-}\r
-\r
-if (nextSelectedElement) {\r
-nextSelectedElement.reveal();\r
-nextSelectedElement.select(false, true);\r
-}\r
-\r
-if (handled) {\r
-event.preventDefault();\r
-event.stopPropagation();\r
-}\r
-}\r
-\r
-TreeOutline.prototype.expand = function()\r
-{\r
-\r
-}\r
-\r
-TreeOutline.prototype.collapse = function()\r
-{\r
-\r
-}\r
-\r
-TreeOutline.prototype.revealed = function()\r
-{\r
-return true;\r
-}\r
-\r
-TreeOutline.prototype.reveal = function()\r
-{\r
-\r
-}\r
-\r
-TreeOutline.prototype.select = function()\r
-{\r
-\r
-}\r
-\r
-TreeOutline.prototype.appendChild = TreeOutline._appendChild;\r
-TreeOutline.prototype.insertChild = TreeOutline._insertChild;\r
-TreeOutline.prototype.removeChild = TreeOutline._removeChild;\r
-TreeOutline.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;\r
-TreeOutline.prototype.removeChildren = TreeOutline._removeChildren;\r
-TreeOutline.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;\r
-\r
-function TreeElement(title, representedObject, hasChildren)\r
-{\r
-this._title = title;\r
-this.representedObject = (representedObject || {});\r
-\r
-if (this.representedObject.__treeElementIdentifier)\r
-this.identifier = this.representedObject.__treeElementIdentifier;\r
-else {\r
-this.identifier = TreeOutline._knownTreeElementNextIdentifier++;\r
-this.representedObject.__treeElementIdentifier = this.identifier;\r
-}\r
-\r
-this._hidden = false;\r
-this.expanded = false;\r
-this.selected = false;\r
-this.hasChildren = hasChildren;\r
-this.children = [];\r
-this.treeOutline = null;\r
-this.parent = null;\r
-this.previousSibling = null;\r
-this.nextSibling = null;\r
-this._listItemNode = null;\r
-}\r
-\r
-TreeElement.prototype = {\r
-selectable: true,\r
-arrowToggleWidth: 10,\r
-\r
-get listItemElement() {\r
-return this._listItemNode;\r
-},\r
-\r
-get childrenListElement() {\r
-return this._childrenListNode;\r
-},\r
-\r
-get title() {\r
-return this._title;\r
-},\r
-\r
-set title(x) {\r
-this._title = x;\r
-this._setListItemNodeContent();\r
-},\r
-\r
-get titleHTML() {\r
-return this._titleHTML;\r
-},\r
-\r
-set titleHTML(x) {\r
-this._titleHTML = x;\r
-this._setListItemNodeContent();\r
-},\r
-\r
-get tooltip() {\r
-return this._tooltip;\r
-},\r
-\r
-set tooltip(x) {\r
-this._tooltip = x;\r
-if (this._listItemNode)\r
-this._listItemNode.title = x ? x : "";\r
-},\r
-\r
-get hasChildren() {\r
-return this._hasChildren;\r
-},\r
-\r
-set hasChildren(x) {\r
-if (this._hasChildren === x)\r
-return;\r
-\r
-this._hasChildren = x;\r
-\r
-if (!this._listItemNode)\r
-return;\r
-\r
-if (x)\r
-this._listItemNode.addStyleClass("parent");\r
-else {\r
-this._listItemNode.removeStyleClass("parent");\r
-this.collapse();\r
-}\r
-},\r
-\r
-get hidden() {\r
-return this._hidden;\r
-},\r
-\r
-set hidden(x) {\r
-if (this._hidden === x)\r
-return;\r
-\r
-this._hidden = x;\r
-\r
-if (x) {\r
-if (this._listItemNode)\r
-this._listItemNode.addStyleClass("hidden");\r
-if (this._childrenListNode)\r
-this._childrenListNode.addStyleClass("hidden");\r
-} else {\r
-if (this._listItemNode)\r
-this._listItemNode.removeStyleClass("hidden");\r
-if (this._childrenListNode)\r
-this._childrenListNode.removeStyleClass("hidden");\r
-}\r
-},\r
-\r
-get shouldRefreshChildren() {\r
-return this._shouldRefreshChildren;\r
-},\r
-\r
-set shouldRefreshChildren(x) {\r
-this._shouldRefreshChildren = x;\r
-if (x && this.expanded)\r
-this.expand();\r
-},\r
-\r
-_setListItemNodeContent: function()\r
-{\r
-if (!this._listItemNode)\r
-return;\r
-\r
-if (!this._titleHTML && !this._title)\r
-this._listItemNode.removeChildren();\r
-else if (typeof this._titleHTML === "string")\r
-this._listItemNode.innerHTML = this._titleHTML;\r
-else if (typeof this._title === "string")\r
-this._listItemNode.textContent = this._title;\r
-else {\r
-this._listItemNode.removeChildren();\r
-if (this._title.parentNode)\r
-this._title.parentNode.removeChild(this._title);\r
-this._listItemNode.appendChild(this._title);\r
-}\r
-}\r
-}\r
-\r
-TreeElement.prototype.appendChild = TreeOutline._appendChild;\r
-TreeElement.prototype.insertChild = TreeOutline._insertChild;\r
-TreeElement.prototype.removeChild = TreeOutline._removeChild;\r
-TreeElement.prototype.removeChildAtIndex = TreeOutline._removeChildAtIndex;\r
-TreeElement.prototype.removeChildren = TreeOutline._removeChildren;\r
-TreeElement.prototype.removeChildrenRecursive = TreeOutline._removeChildrenRecursive;\r
-\r
-TreeElement.prototype._attach = function()\r
-{\r
-if (!this._listItemNode || this.parent._shouldRefreshChildren) {\r
-if (this._listItemNode && this._listItemNode.parentNode)\r
-this._listItemNode.parentNode.removeChild(this._listItemNode);\r
-\r
-this._listItemNode = this.treeOutline._childrenListNode.ownerDocument.createElement("li");\r
-this._listItemNode.treeElement = this;\r
-this._setListItemNodeContent();\r
-this._listItemNode.title = this._tooltip ? this._tooltip : "";\r
-\r
-if (this.hidden)\r
-this._listItemNode.addStyleClass("hidden");\r
-if (this.hasChildren)\r
-this._listItemNode.addStyleClass("parent");\r
-if (this.expanded)\r
-this._listItemNode.addStyleClass("expanded");\r
-if (this.selected)\r
-this._listItemNode.addStyleClass("selected");\r
-\r
-this._listItemNode.addEventListener("mousedown", TreeElement.treeElementMouseDown, false);\r
-this._listItemNode.addEventListener("click", TreeElement.treeElementToggled, false);\r
-this._listItemNode.addEventListener("dblclick", TreeElement.treeElementDoubleClicked, false);\r
-\r
-if (this.onattach)\r
-this.onattach(this);\r
-}\r
-\r
-var nextSibling = null;\r
-if (this.nextSibling && this.nextSibling._listItemNode && this.nextSibling._listItemNode.parentNode === this.parent._childrenListNode)\r
-nextSibling = this.nextSibling._listItemNode;\r
-this.parent._childrenListNode.insertBefore(this._listItemNode, nextSibling);\r
-if (this._childrenListNode)\r
-this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);\r
-if (this.selected)\r
-this.select();\r
-if (this.expanded)\r
-this.expand();\r
-}\r
-\r
-TreeElement.prototype._detach = function()\r
-{\r
-if (this._listItemNode && this._listItemNode.parentNode)\r
-this._listItemNode.parentNode.removeChild(this._listItemNode);\r
-if (this._childrenListNode && this._childrenListNode.parentNode)\r
-this._childrenListNode.parentNode.removeChild(this._childrenListNode);\r
-}\r
-\r
-TreeElement.treeElementMouseDown = function(event)\r
-{\r
-var element = event.currentTarget;\r
-if (!element || !element.treeElement || !element.treeElement.selectable)\r
-return;\r
-\r
-if (element.treeElement.isEventWithinDisclosureTriangle(event))\r
-return;\r
-\r
-element.treeElement.selectOnMouseDown(event);\r
-}\r
-\r
-TreeElement.treeElementToggled = function(event)\r
-{\r
-var element = event.currentTarget;\r
-if (!element || !element.treeElement)\r
-return;\r
-\r
-if (!element.treeElement.isEventWithinDisclosureTriangle(event))\r
-return;\r
-\r
-if (element.treeElement.expanded) {\r
-if (event.altKey)\r
-element.treeElement.collapseRecursively();\r
-else\r
-element.treeElement.collapse();\r
-} else {\r
-if (event.altKey)\r
-element.treeElement.expandRecursively();\r
-else\r
-element.treeElement.expand();\r
-}\r
-event.stopPropagation();\r
-}\r
-\r
-TreeElement.treeElementDoubleClicked = function(event)\r
-{\r
-var element = event.currentTarget;\r
-if (!element || !element.treeElement)\r
-return;\r
-\r
-if (element.treeElement.ondblclick)\r
-element.treeElement.ondblclick.call(element.treeElement, event);\r
-else if (element.treeElement.hasChildren && !element.treeElement.expanded)\r
-element.treeElement.expand();\r
-}\r
-\r
-TreeElement.prototype.collapse = function()\r
-{\r
-if (this._listItemNode)\r
-this._listItemNode.removeStyleClass("expanded");\r
-if (this._childrenListNode)\r
-this._childrenListNode.removeStyleClass("expanded");\r
-\r
-this.expanded = false;\r
-if (this.treeOutline)\r
-this.treeOutline._treeElementsExpandedState[this.identifier] = true;\r
-\r
-if (this.oncollapse)\r
-this.oncollapse(this);\r
-}\r
-\r
-TreeElement.prototype.collapseRecursively = function()\r
-{\r
-var item = this;\r
-while (item) {\r
-if (item.expanded)\r
-item.collapse();\r
-item = item.traverseNextTreeElement(false, this, true);\r
-}\r
-}\r
-\r
-TreeElement.prototype.expand = function()\r
-{\r
-if (!this.hasChildren || (this.expanded && !this._shouldRefreshChildren && this._childrenListNode))\r
-return;\r
-\r
-if (this.treeOutline && (!this._childrenListNode || this._shouldRefreshChildren)) {\r
-if (this._childrenListNode && this._childrenListNode.parentNode)\r
-this._childrenListNode.parentNode.removeChild(this._childrenListNode);\r
-\r
-this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");\r
-this._childrenListNode.parentTreeElement = this;\r
-this._childrenListNode.addStyleClass("children");\r
-\r
-if (this.hidden)\r
-this._childrenListNode.addStyleClass("hidden");\r
-\r
-if (this.onpopulate)\r
-this.onpopulate(this);\r
-\r
-for (var i = 0; i < this.children.length; ++i)\r
-this.children[i]._attach();\r
-\r
-delete this._shouldRefreshChildren;\r
-}\r
-\r
-if (this._listItemNode) {\r
-this._listItemNode.addStyleClass("expanded");\r
-if (this._childrenListNode && this._childrenListNode.parentNode != this._listItemNode.parentNode)\r
-this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);\r
-}\r
-\r
-if (this._childrenListNode)\r
-this._childrenListNode.addStyleClass("expanded");\r
-\r
-this.expanded = true;\r
-if (this.treeOutline)\r
-this.treeOutline._treeElementsExpandedState[this.identifier] = true;\r
-\r
-if (this.onexpand)\r
-this.onexpand(this);\r
-}\r
-\r
-TreeElement.prototype.expandRecursively = function(maxDepth)\r
-{\r
-var item = this;\r
-var info = {};\r
-var depth = 0;\r
-\r
-\r
-\r
-\r
-if (typeof maxDepth === "undefined" || typeof maxDepth === "null")\r
-maxDepth = 3;\r
-\r
-while (item) {\r
-if (depth < maxDepth)\r
-item.expand();\r
-item = item.traverseNextTreeElement(false, this, (depth >= maxDepth), info);\r
-depth += info.depthChange;\r
-}\r
-}\r
-\r
-TreeElement.prototype.hasAncestor = function(ancestor) {\r
-if (!ancestor)\r
-return false;\r
-\r
-var currentNode = this.parent;\r
-while (currentNode) {\r
-if (ancestor === currentNode)\r
-return true;\r
-currentNode = currentNode.parent;\r
-}\r
-\r
-return false;\r
-}\r
-\r
-TreeElement.prototype.reveal = function()\r
-{\r
-var currentAncestor = this.parent;\r
-while (currentAncestor && !currentAncestor.root) {\r
-if (!currentAncestor.expanded)\r
-currentAncestor.expand();\r
-currentAncestor = currentAncestor.parent;\r
-}\r
-\r
-if (this.onreveal)\r
-this.onreveal(this);\r
-}\r
-\r
-TreeElement.prototype.revealed = function()\r
-{\r
-var currentAncestor = this.parent;\r
-while (currentAncestor && !currentAncestor.root) {\r
-if (!currentAncestor.expanded)\r
-return false;\r
-currentAncestor = currentAncestor.parent;\r
-}\r
-\r
-return true;\r
-}\r
-\r
-TreeElement.prototype.selectOnMouseDown = function(event)\r
-{\r
-this.select(false, true);\r
-}\r
-\r
-TreeElement.prototype.select = function(supressOnSelect, selectedByUser)\r
-{\r
-if (!this.treeOutline || !this.selectable || this.selected)\r
-return;\r
-\r
-if (this.treeOutline.selectedTreeElement)\r
-this.treeOutline.selectedTreeElement.deselect();\r
-\r
-this.selected = true;\r
-this.treeOutline._childrenListNode.focus();\r
-\r
-\r
-if (!this.treeOutline)\r
-return;\r
-this.treeOutline.selectedTreeElement = this;\r
-if (this._listItemNode)\r
-this._listItemNode.addStyleClass("selected");\r
-\r
-if (this.onselect && !supressOnSelect)\r
-this.onselect(this, selectedByUser);\r
-}\r
-\r
-TreeElement.prototype.deselect = function(supressOnDeselect)\r
-{\r
-if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)\r
-return false;\r
-\r
-this.selected = false;\r
-this.treeOutline.selectedTreeElement = null;\r
-if (this._listItemNode)\r
-this._listItemNode.removeStyleClass("selected");\r
-\r
-if (this.ondeselect && !supressOnDeselect)\r
-this.ondeselect(this);\r
-return true;\r
-}\r
-\r
-TreeElement.prototype.traverseNextTreeElement = function(skipHidden, stayWithin, dontPopulate, info)\r
-{\r
-if (!dontPopulate && this.hasChildren && this.onpopulate)\r
-this.onpopulate(this);\r
-\r
-if (info)\r
-info.depthChange = 0;\r
-\r
-var element = skipHidden ? (this.revealed() ? this.children[0] : null) : this.children[0];\r
-if (element && (!skipHidden || (skipHidden && this.expanded))) {\r
-if (info)\r
-info.depthChange = 1;\r
-return element;\r
-}\r
-\r
-if (this === stayWithin)\r
-return null;\r
-\r
-element = skipHidden ? (this.revealed() ? this.nextSibling : null) : this.nextSibling;\r
-if (element)\r
-return element;\r
-\r
-element = this;\r
-while (element && !element.root && !(skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling) && element.parent !== stayWithin) {\r
-if (info)\r
-info.depthChange -= 1;\r
-element = element.parent;\r
-}\r
-\r
-if (!element)\r
-return null;\r
-\r
-return (skipHidden ? (element.revealed() ? element.nextSibling : null) : element.nextSibling);\r
-}\r
-\r
-TreeElement.prototype.traversePreviousTreeElement = function(skipHidden, dontPopulate)\r
-{\r
-var element = skipHidden ? (this.revealed() ? this.previousSibling : null) : this.previousSibling;\r
-if (!dontPopulate && element && element.hasChildren && element.onpopulate)\r
-element.onpopulate(element);\r
-\r
-while (element && (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1])) {\r
-if (!dontPopulate && element.hasChildren && element.onpopulate)\r
-element.onpopulate(element);\r
-element = (skipHidden ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1]);\r
-}\r
-\r
-if (element)\r
-return element;\r
-\r
-if (!this.parent || this.parent.root)\r
-return null;\r
-\r
-return this.parent;\r
-}\r
-\r
-TreeElement.prototype.isEventWithinDisclosureTriangle = function(event)\r
-{\r
-var left = this._listItemNode.totalOffsetLeft;\r
-return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-;(function preloadImages()\r
-{\r
-(new Image()).src = "Images/clearConsoleButtonGlyph.png";\r
-(new Image()).src = "Images/consoleButtonGlyph.png";\r
-(new Image()).src = "Images/dockButtonGlyph.png";\r
-(new Image()).src = "Images/enableOutlineButtonGlyph.png";\r
-(new Image()).src = "Images/enableSolidButtonGlyph.png";\r
-(new Image()).src = "Images/excludeButtonGlyph.png";\r
-(new Image()).src = "Images/focusButtonGlyph.png";\r
-(new Image()).src = "Images/largerResourcesButtonGlyph.png";\r
-(new Image()).src = "Images/nodeSearchButtonGlyph.png";\r
-(new Image()).src = "Images/pauseOnExceptionButtonGlyph.png";\r
-(new Image()).src = "Images/percentButtonGlyph.png";\r
-(new Image()).src = "Images/recordButtonGlyph.png";\r
-(new Image()).src = "Images/recordToggledButtonGlyph.png";\r
-(new Image()).src = "Images/reloadButtonGlyph.png";\r
-(new Image()).src = "Images/undockButtonGlyph.png";\r
-})();\r
-\r
-var WebInspector = {\r
-resources: {},\r
-missingLocalizedStrings: {},\r
-pendingDispatches: 0,\r
-\r
-get platform()\r
-{\r
-if (!("_platform" in this))\r
-this._platform = InspectorFrontendHost.platform();\r
-\r
-return this._platform;\r
-},\r
-\r
-get platformFlavor()\r
-{\r
-if (!("_platformFlavor" in this))\r
-this._platformFlavor = this._detectPlatformFlavor();\r
-\r
-return this._platformFlavor;\r
-},\r
-\r
-_detectPlatformFlavor: function()\r
-{\r
-const userAgent = navigator.userAgent;\r
-\r
-if (this.platform === "windows") {\r
-var match = userAgent.match(/Windows NT (\d+)\.(?:\d+)/);\r
-if (match && match[1] >= 6)\r
-return WebInspector.PlatformFlavor.WindowsVista;\r
-return null;\r
-} else if (this.platform === "mac") {\r
-var match = userAgent.match(/Mac OS X\s*(?:(\d+)_(\d+))?/);\r
-if (!match || match[1] != 10)\r
-return WebInspector.PlatformFlavor.MacSnowLeopard;\r
-switch (Number(match[2])) {\r
-case 4:\r
-return WebInspector.PlatformFlavor.MacTiger;\r
-case 5:\r
-return WebInspector.PlatformFlavor.MacLeopard;\r
-case 6:\r
-default:\r
-return WebInspector.PlatformFlavor.MacSnowLeopard;\r
-}\r
-}\r
-\r
-return null;\r
-},\r
-\r
-get port()\r
-{\r
-if (!("_port" in this))\r
-this._port = InspectorFrontendHost.port();\r
-\r
-return this._port;\r
-},\r
-\r
-get previousFocusElement()\r
-{\r
-return this._previousFocusElement;\r
-},\r
-\r
-get currentFocusElement()\r
-{\r
-return this._currentFocusElement;\r
-},\r
-\r
-set currentFocusElement(x)\r
-{\r
-if (this._currentFocusElement !== x)\r
-this._previousFocusElement = this._currentFocusElement;\r
-this._currentFocusElement = x;\r
-\r
-if (this._currentFocusElement) {\r
-this._currentFocusElement.focus();\r
-\r
-\r
-\r
-var selection = window.getSelection();\r
-if (selection.isCollapsed && !this._currentFocusElement.isInsertionCaretInside()) {\r
-var selectionRange = this._currentFocusElement.ownerDocument.createRange();\r
-selectionRange.setStart(this._currentFocusElement, 0);\r
-selectionRange.setEnd(this._currentFocusElement, 0);\r
-\r
-selection.removeAllRanges();\r
-selection.addRange(selectionRange);\r
-}\r
-} else if (this._previousFocusElement)\r
-this._previousFocusElement.blur();\r
-},\r
-\r
-get currentPanel()\r
-{\r
-return this._currentPanel;\r
-},\r
-\r
-set currentPanel(x)\r
-{\r
-if (this._currentPanel === x)\r
-return;\r
-\r
-if (this._currentPanel)\r
-this._currentPanel.hide();\r
-\r
-this._currentPanel = x;\r
-\r
-this.updateSearchLabel();\r
-\r
-if (x) {\r
-x.show();\r
-\r
-if (this.currentQuery) {\r
-if (x.performSearch) {\r
-function performPanelSearch()\r
-{\r
-this.updateSearchMatchesCount();\r
-\r
-x.currentQuery = this.currentQuery;\r
-x.performSearch(this.currentQuery);\r
-}\r
-\r
-\r
-setTimeout(performPanelSearch.bind(this), 0);\r
-} else {\r
-\r
-this.updateSearchMatchesCount();\r
-}\r
-}\r
-}\r
-\r
-for (var panelName in WebInspector.panels) {\r
-if (WebInspector.panels[panelName] === x) {\r
-WebInspector.settings.lastActivePanel = panelName;\r
-this._panelHistory.setPanel(panelName);\r
-}\r
-}\r
-},\r
-\r
-createJSBreakpointsSidebarPane: function()\r
-{\r
-var pane = new WebInspector.BreakpointsSidebarPane(WebInspector.UIString("Breakpoints"));\r
-function breakpointAdded(event)\r
-{\r
-pane.addBreakpointItem(new WebInspector.BreakpointItem(event.data));\r
-}\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointAdded, breakpointAdded);\r
-return pane;\r
-},\r
-\r
-createDOMBreakpointsSidebarPane: function()\r
-{\r
-var pane = new WebInspector.BreakpointsSidebarPane(WebInspector.UIString("DOM Breakpoints"));\r
-function breakpointAdded(event)\r
-{\r
-pane.addBreakpointItem(new WebInspector.BreakpointItem(event.data));\r
-}\r
-WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.DOMBreakpointAdded, breakpointAdded);\r
-return pane;\r
-},\r
-\r
-createXHRBreakpointsSidebarPane: function()\r
-{\r
-var pane = new WebInspector.XHRBreakpointsSidebarPane();\r
-function breakpointAdded(event)\r
-{\r
-pane.addBreakpointItem(new WebInspector.BreakpointItem(event.data));\r
-}\r
-WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.XHRBreakpointAdded, breakpointAdded);\r
-return pane;\r
-},\r
-\r
-_createPanels: function()\r
-{\r
-var hiddenPanels = (InspectorFrontendHost.hiddenPanels() || "").split(',');\r
-if (hiddenPanels.indexOf("elements") === -1)\r
-this.panels.elements = new WebInspector.ElementsPanel();\r
-if (hiddenPanels.indexOf("resources") === -1)\r
-this.panels.resources = new WebInspector.ResourcesPanel();\r
-if (hiddenPanels.indexOf("network") === -1)\r
-this.panels.network = new WebInspector.NetworkPanel();\r
-if (hiddenPanels.indexOf("scripts") === -1)\r
-this.panels.scripts = new WebInspector.ScriptsPanel();\r
-if (hiddenPanels.indexOf("timeline") === -1)\r
-this.panels.timeline = new WebInspector.TimelinePanel();\r
-if (hiddenPanels.indexOf("profiles") === -1) {\r
-this.panels.profiles = new WebInspector.ProfilesPanel();\r
-this.panels.profiles.registerProfileType(new WebInspector.CPUProfileType());\r
-if (Preferences.heapProfilerPresent)\r
-this.panels.profiles.registerProfileType(new WebInspector.HeapSnapshotProfileType());\r
-}\r
-if (hiddenPanels.indexOf("audits") === -1)\r
-this.panels.audits = new WebInspector.AuditsPanel();\r
-if (hiddenPanels.indexOf("console") === -1)\r
-this.panels.console = new WebInspector.ConsolePanel();\r
-},\r
-\r
-get attached()\r
-{\r
-return this._attached;\r
-},\r
-\r
-set attached(x)\r
-{\r
-if (this._attached === x)\r
-return;\r
-\r
-this._attached = x;\r
-\r
-this.updateSearchLabel();\r
-\r
-var dockToggleButton = document.getElementById("dock-status-bar-item");\r
-var body = document.body;\r
-\r
-if (x) {\r
-body.removeStyleClass("detached");\r
-body.addStyleClass("attached");\r
-dockToggleButton.title = WebInspector.UIString("Undock into separate window.");\r
-} else {\r
-body.removeStyleClass("attached");\r
-body.addStyleClass("detached");\r
-dockToggleButton.title = WebInspector.UIString("Dock to main window.");\r
-}\r
-if (this.drawer)\r
-this.drawer.resize();\r
-},\r
-\r
-get errors()\r
-{\r
-return this._errors || 0;\r
-},\r
-\r
-set errors(x)\r
-{\r
-x = Math.max(x, 0);\r
-\r
-if (this._errors === x)\r
-return;\r
-this._errors = x;\r
-this._updateErrorAndWarningCounts();\r
-},\r
-\r
-get warnings()\r
-{\r
-return this._warnings || 0;\r
-},\r
-\r
-set warnings(x)\r
-{\r
-x = Math.max(x, 0);\r
-\r
-if (this._warnings === x)\r
-return;\r
-this._warnings = x;\r
-this._updateErrorAndWarningCounts();\r
-},\r
-\r
-_updateErrorAndWarningCounts: function()\r
-{\r
-var errorWarningElement = document.getElementById("error-warning-count");\r
-if (!errorWarningElement)\r
-return;\r
-\r
-if (!this.errors && !this.warnings) {\r
-errorWarningElement.addStyleClass("hidden");\r
-return;\r
-}\r
-\r
-errorWarningElement.removeStyleClass("hidden");\r
-\r
-errorWarningElement.removeChildren();\r
-\r
-if (this.errors) {\r
-var errorElement = document.createElement("span");\r
-errorElement.id = "error-count";\r
-errorElement.textContent = this.errors;\r
-errorWarningElement.appendChild(errorElement);\r
-}\r
-\r
-if (this.warnings) {\r
-var warningsElement = document.createElement("span");\r
-warningsElement.id = "warning-count";\r
-warningsElement.textContent = this.warnings;\r
-errorWarningElement.appendChild(warningsElement);\r
-}\r
-\r
-if (this.errors) {\r
-if (this.warnings) {\r
-if (this.errors == 1) {\r
-if (this.warnings == 1)\r
-errorWarningElement.title = WebInspector.UIString("%d error, %d warning", this.errors, this.warnings);\r
-else\r
-errorWarningElement.title = WebInspector.UIString("%d error, %d warnings", this.errors, this.warnings);\r
-} else if (this.warnings == 1)\r
-errorWarningElement.title = WebInspector.UIString("%d errors, %d warning", this.errors, this.warnings);\r
-else\r
-errorWarningElement.title = WebInspector.UIString("%d errors, %d warnings", this.errors, this.warnings);\r
-} else if (this.errors == 1)\r
-errorWarningElement.title = WebInspector.UIString("%d error", this.errors);\r
-else\r
-errorWarningElement.title = WebInspector.UIString("%d errors", this.errors);\r
-} else if (this.warnings == 1)\r
-errorWarningElement.title = WebInspector.UIString("%d warning", this.warnings);\r
-else if (this.warnings)\r
-errorWarningElement.title = WebInspector.UIString("%d warnings", this.warnings);\r
-else\r
-errorWarningElement.title = null;\r
-},\r
-\r
-get styleChanges()\r
-{\r
-return this._styleChanges;\r
-},\r
-\r
-set styleChanges(x)\r
-{\r
-x = Math.max(x, 0);\r
-\r
-if (this._styleChanges === x)\r
-return;\r
-this._styleChanges = x;\r
-this._updateChangesCount();\r
-},\r
-\r
-_updateChangesCount: function()\r
-{\r
-\r
-return;\r
-\r
-var changesElement = document.getElementById("changes-count");\r
-if (!changesElement)\r
-return;\r
-\r
-if (!this.styleChanges) {\r
-changesElement.addStyleClass("hidden");\r
-return;\r
-}\r
-\r
-changesElement.removeStyleClass("hidden");\r
-changesElement.removeChildren();\r
-\r
-if (this.styleChanges) {\r
-var styleChangesElement = document.createElement("span");\r
-styleChangesElement.id = "style-changes-count";\r
-styleChangesElement.textContent = this.styleChanges;\r
-changesElement.appendChild(styleChangesElement);\r
-}\r
-\r
-if (this.styleChanges) {\r
-if (this.styleChanges === 1)\r
-changesElement.title = WebInspector.UIString("%d style change", this.styleChanges);\r
-else\r
-changesElement.title = WebInspector.UIString("%d style changes", this.styleChanges);\r
-}\r
-},\r
-\r
-highlightDOMNode: function(nodeId)\r
-{\r
-if ("_hideDOMNodeHighlightTimeout" in this) {\r
-clearTimeout(this._hideDOMNodeHighlightTimeout);\r
-delete this._hideDOMNodeHighlightTimeout;\r
-}\r
-\r
-if (this._highlightedDOMNodeId === nodeId)\r
-return;\r
-\r
-this._highlightedDOMNodeId = nodeId;\r
-if (nodeId)\r
-InspectorBackend.highlightDOMNode(nodeId);\r
-else\r
-InspectorBackend.hideDOMNodeHighlight();\r
-},\r
-\r
-highlightDOMNodeForTwoSeconds: function(nodeId)\r
-{\r
-this.highlightDOMNode(nodeId);\r
-this._hideDOMNodeHighlightTimeout = setTimeout(this.highlightDOMNode.bind(this, 0), 2000);\r
-},\r
-\r
-wireElementWithDOMNode: function(element, nodeId)\r
-{\r
-element.addEventListener("click", this._updateFocusedNode.bind(this, nodeId), false);\r
-element.addEventListener("mouseover", this.highlightDOMNode.bind(this, nodeId), false);\r
-element.addEventListener("mouseout", this.highlightDOMNode.bind(this, 0), false);\r
-},\r
-\r
-_updateFocusedNode: function(nodeId)\r
-{\r
-this.currentPanel = this.panels.elements;\r
-this.panels.elements.updateFocusedNode(nodeId);\r
-},\r
-\r
-get networkResources()\r
-{\r
-return this.panels.network.resources;\r
-},\r
-\r
-forAllResources: function(callback)\r
-{\r
-WebInspector.resourceManager.forAllResources(callback);\r
-},\r
-\r
-resourceForURL: function(url)\r
-{\r
-return this.resourceManager.resourceForURL(url);\r
-}\r
-}\r
-\r
-WebInspector.PlatformFlavor = {\r
-WindowsVista: "windows-vista",\r
-MacTiger: "mac-tiger",\r
-MacLeopard: "mac-leopard",\r
-MacSnowLeopard: "mac-snowleopard"\r
-};\r
-\r
-(function parseQueryParameters()\r
-{\r
-WebInspector.queryParamsObject = {};\r
-var queryParams = window.location.search;\r
-if (!queryParams)\r
-return;\r
-var params = queryParams.substring(1).split("&");\r
-for (var i = 0; i < params.length; ++i) {\r
-var pair = params[i].split("=");\r
-WebInspector.queryParamsObject[pair[0]] = pair[1];\r
-}\r
-})();\r
-\r
-WebInspector.loaded = function()\r
-{\r
-if ("page" in WebInspector.queryParamsObject) {\r
-WebInspector.socket = new WebSocket("ws://" + window.location.host + "/devtools/page/" + WebInspector.queryParamsObject.page);\r
-WebInspector.socket.onmessage = function(message) { InspectorBackend.dispatch(message.data); }\r
-WebInspector.socket.onerror = function(error) { console.error(error); }\r
-WebInspector.socket.onopen = function() {\r
-InspectorFrontendHost.sendMessageToBackend = WebInspector.socket.send.bind(WebInspector.socket);\r
-InspectorFrontendHost.loaded = WebInspector.socket.send.bind(WebInspector.socket, "loaded");\r
-WebInspector.doLoadedDone();\r
-}\r
-return;\r
-}\r
-WebInspector.doLoadedDone();\r
-}\r
-\r
-WebInspector.doLoadedDone = function()\r
-{\r
-InspectorBackend.setInjectedScriptSource("(" + injectedScriptConstructor + ");");\r
-\r
-var platform = WebInspector.platform;\r
-document.body.addStyleClass("platform-" + platform);\r
-var flavor = WebInspector.platformFlavor;\r
-if (flavor)\r
-document.body.addStyleClass("platform-" + flavor);\r
-var port = WebInspector.port;\r
-document.body.addStyleClass("port-" + port);\r
-\r
-InspectorFrontendHost.loaded();\r
-WebInspector.settings = new WebInspector.Settings();\r
-\r
-this._registerShortcuts();\r
-\r
-\r
-WebInspector.shortcutsHelp.section(WebInspector.UIString("Console"));\r
-WebInspector.shortcutsHelp.section(WebInspector.UIString("Elements Panel"));\r
-\r
-this.drawer = new WebInspector.Drawer();\r
-this.console = new WebInspector.ConsoleView(this.drawer);\r
-\r
-\r
-\r
-this.drawer.visibleView = this.console;\r
-this.resourceManager = new WebInspector.ResourceManager();\r
-this.domAgent = new WebInspector.DOMAgent();\r
-\r
-InspectorBackend.registerDomainDispatcher("Inspector", this);\r
-\r
-this.resourceCategories = {\r
-documents: new WebInspector.ResourceCategory("documents", WebInspector.UIString("Documents"), "rgb(47,102,236)"),\r
-stylesheets: new WebInspector.ResourceCategory("stylesheets", WebInspector.UIString("Stylesheets"), "rgb(157,231,119)"),\r
-images: new WebInspector.ResourceCategory("images", WebInspector.UIString("Images"), "rgb(164,60,255)"),\r
-scripts: new WebInspector.ResourceCategory("scripts", WebInspector.UIString("Scripts"), "rgb(255,121,0)"),\r
-xhr: new WebInspector.ResourceCategory("xhr", WebInspector.UIString("XHR"), "rgb(231,231,10)"),\r
-fonts: new WebInspector.ResourceCategory("fonts", WebInspector.UIString("Fonts"), "rgb(255,82,62)"),\r
-websockets: new WebInspector.ResourceCategory("websockets", WebInspector.UIString("WebSocket"), "rgb(186,186,186)"), \r
-other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")\r
-};\r
-\r
-this.cssModel = new WebInspector.CSSStyleModel();\r
-this.debuggerModel = new WebInspector.DebuggerModel();\r
-\r
-this.breakpointManager = new WebInspector.BreakpointManager();\r
-\r
-this.panels = {};\r
-this._createPanels();\r
-this._panelHistory = new WebInspector.PanelHistory();\r
-\r
-var toolbarElement = document.getElementById("toolbar");\r
-var previousToolbarItem = toolbarElement.children[0];\r
-\r
-this.panelOrder = [];\r
-for (var panelName in this.panels)\r
-previousToolbarItem = WebInspector.addPanelToolbarIcon(toolbarElement, this.panels[panelName], previousToolbarItem);\r
-\r
-this.Tips = {\r
-ResourceNotCompressed: {id: 0, message: WebInspector.UIString("You could save bandwidth by having your web server compress this transfer with gzip or zlib.")}\r
-};\r
-\r
-this.Warnings = {\r
-IncorrectMIMEType: {id: 0, message: WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s.")}\r
-};\r
-\r
-this.addMainEventListeners(document);\r
-\r
-window.addEventListener("resize", this.windowResize.bind(this), true);\r
-\r
-document.addEventListener("focus", this.focusChanged.bind(this), true);\r
-document.addEventListener("keydown", this.documentKeyDown.bind(this), false);\r
-document.addEventListener("beforecopy", this.documentCanCopy.bind(this), true);\r
-document.addEventListener("copy", this.documentCopy.bind(this), true);\r
-document.addEventListener("contextmenu", this.contextMenuEventFired.bind(this), true);\r
-\r
-var dockToggleButton = document.getElementById("dock-status-bar-item");\r
-dockToggleButton.addEventListener("click", this.toggleAttach.bind(this), false);\r
-\r
-if (this.attached)\r
-dockToggleButton.title = WebInspector.UIString("Undock into separate window.");\r
-else\r
-dockToggleButton.title = WebInspector.UIString("Dock to main window.");\r
-\r
-var errorWarningCount = document.getElementById("error-warning-count");\r
-errorWarningCount.addEventListener("click", this.showConsole.bind(this), false);\r
-this._updateErrorAndWarningCounts();\r
-\r
-this.styleChanges = 0;\r
-\r
-\r
-\r
-\r
-\r
-var searchField = document.getElementById("search");\r
-searchField.addEventListener("search", this.performSearch.bind(this), false); \r
-searchField.addEventListener("mousedown", this._searchFieldManualFocus.bind(this), false); \r
-searchField.addEventListener("keydown", this._searchKeyDown.bind(this), true);\r
-\r
-toolbarElement.addEventListener("mousedown", this.toolbarDragStart, true);\r
-document.getElementById("close-button-left").addEventListener("click", this.close, true);\r
-document.getElementById("close-button-right").addEventListener("click", this.close, true);\r
-\r
-this.extensionServer.initExtensions();\r
-\r
-function populateInspectorState(inspectorState)\r
-{\r
-WebInspector.monitoringXHREnabled = inspectorState.monitoringXHREnabled;\r
-if ("pauseOnExceptionsState" in inspectorState)\r
-WebInspector.panels.scripts.updatePauseOnExceptionsState(inspectorState.pauseOnExceptionsState);\r
-}\r
-InspectorBackend.getInspectorState(populateInspectorState);\r
-\r
-function onPopulateScriptObjects()\r
-{\r
-if (!WebInspector.currentPanel)\r
-WebInspector.showPanel(WebInspector.settings.lastActivePanel);\r
-}\r
-InspectorBackend.populateScriptObjects(onPopulateScriptObjects);\r
-\r
-InspectorBackend.setConsoleMessagesEnabled(true);\r
-\r
-function propertyNamesCallback(names)\r
-{\r
-WebInspector.cssNameCompletions = new WebInspector.CSSCompletions(names);\r
-}\r
-\r
-\r
-InspectorBackend.getSupportedCSSProperties(propertyNamesCallback);\r
-}\r
-\r
-WebInspector.addPanelToolbarIcon = function(toolbarElement, panel, previousToolbarItem)\r
-{\r
-var panelToolbarItem = panel.toolbarItem;\r
-this.panelOrder.push(panel);\r
-panelToolbarItem.addEventListener("click", this._toolbarItemClicked.bind(this));\r
-if (previousToolbarItem)\r
-toolbarElement.insertBefore(panelToolbarItem, previousToolbarItem.nextSibling);\r
-else\r
-toolbarElement.insertBefore(panelToolbarItem, toolbarElement.firstChild);\r
-return panelToolbarItem;\r
-}\r
-\r
-var windowLoaded = function()\r
-{\r
-var localizedStringsURL = InspectorFrontendHost.localizedStringsURL();\r
-if (localizedStringsURL) {\r
-var localizedStringsScriptElement = document.createElement("script");\r
-localizedStringsScriptElement.addEventListener("load", WebInspector.loaded.bind(WebInspector), false);\r
-localizedStringsScriptElement.type = "text/javascript";\r
-localizedStringsScriptElement.src = localizedStringsURL;\r
-document.head.appendChild(localizedStringsScriptElement);\r
-} else\r
-WebInspector.loaded();\r
-\r
-window.removeEventListener("DOMContentLoaded", windowLoaded, false);\r
-delete windowLoaded;\r
-};\r
-\r
-window.addEventListener("DOMContentLoaded", windowLoaded, false);\r
-\r
-WebInspector.dispatch = function(message) {\r
-\r
-\r
-function delayDispatch()\r
-{\r
-InspectorBackend.dispatch(message);\r
-WebInspector.pendingDispatches--;\r
-}\r
-WebInspector.pendingDispatches++;\r
-setTimeout(delayDispatch, 0);\r
-}\r
-\r
-WebInspector.dispatchMessageFromBackend = function(messageObject)\r
-{\r
-WebInspector.dispatch(messageObject);\r
-}\r
-\r
-WebInspector.windowResize = function(event)\r
-{\r
-if (this.currentPanel)\r
-this.currentPanel.resize();\r
-this.drawer.resize();\r
-}\r
-\r
-WebInspector.windowFocused = function(event)\r
-{\r
-\r
-\r
-\r
-if (event.target.document.nodeType === Node.DOCUMENT_NODE)\r
-document.body.removeStyleClass("inactive");\r
-}\r
-\r
-WebInspector.windowBlurred = function(event)\r
-{\r
-\r
-\r
-\r
-if (event.target.document.nodeType === Node.DOCUMENT_NODE)\r
-document.body.addStyleClass("inactive");\r
-}\r
-\r
-WebInspector.focusChanged = function(event)\r
-{\r
-this.currentFocusElement = event.target;\r
-}\r
-\r
-WebInspector.setAttachedWindow = function(attached)\r
-{\r
-this.attached = attached;\r
-}\r
-\r
-WebInspector.close = function(event)\r
-{\r
-if (this._isClosing)\r
-return;\r
-this._isClosing = true;\r
-InspectorFrontendHost.closeWindow();\r
-}\r
-\r
-WebInspector.disconnectFromBackend = function()\r
-{\r
-InspectorFrontendHost.disconnectFromBackend();\r
-}\r
-\r
-WebInspector.documentClick = function(event)\r
-{\r
-var anchor = event.target.enclosingNodeOrSelfWithNodeName("a");\r
-if (!anchor || anchor.target === "_blank")\r
-return;\r
-\r
-\r
-event.preventDefault();\r
-event.stopPropagation();\r
-\r
-function followLink()\r
-{\r
-\r
-if (WebInspector.canShowSourceLine(anchor.href, anchor.getAttribute("line_number"), anchor.getAttribute("preferred_panel"))) {\r
-if (anchor.hasStyleClass("webkit-html-external-link")) {\r
-anchor.removeStyleClass("webkit-html-external-link");\r
-anchor.addStyleClass("webkit-html-resource-link");\r
-}\r
-\r
-WebInspector.showSourceLine(anchor.href, anchor.getAttribute("line_number"), anchor.getAttribute("preferred_panel"));\r
-return;\r
-}\r
-\r
-const profileMatch = WebInspector.ProfileType.URLRegExp.exec(anchor.href);\r
-if (profileMatch) {\r
-WebInspector.showProfileForURL(anchor.href);\r
-return;\r
-}\r
-\r
-var parsedURL = anchor.href.asParsedURL();\r
-if (parsedURL && parsedURL.scheme === "webkit-link-action") {\r
-if (parsedURL.host === "show-panel") {\r
-var panel = parsedURL.path.substring(1);\r
-if (WebInspector.panels[panel])\r
-WebInspector.showPanel(panel);\r
-}\r
-return;\r
-}\r
-\r
-WebInspector.showPanel("resources");\r
-}\r
-\r
-if (WebInspector.followLinkTimeout)\r
-clearTimeout(WebInspector.followLinkTimeout);\r
-\r
-if (anchor.preventFollowOnDoubleClick) {\r
-\r
-\r
-if (event.detail === 1)\r
-WebInspector.followLinkTimeout = setTimeout(followLink, 333);\r
-return;\r
-}\r
-\r
-followLink();\r
-}\r
-\r
-WebInspector.openResource = function(resourceURL, inResourcesPanel)\r
-{\r
-var resource = WebInspector.resourceForURL(resourceURL);\r
-if (inResourcesPanel && resource) {\r
-WebInspector.panels.resources.showResource(resource);\r
-WebInspector.showPanel("resources");\r
-} else\r
-InspectorBackend.openInInspectedWindow(resource ? resource.url : resourceURL);\r
-}\r
-\r
-WebInspector._registerShortcuts = function()\r
-{\r
-var shortcut = WebInspector.KeyboardShortcut;\r
-var section = WebInspector.shortcutsHelp.section(WebInspector.UIString("All Panels"));\r
-var keys = [\r
-shortcut.shortcutToString("]", shortcut.Modifiers.CtrlOrMeta),\r
-shortcut.shortcutToString("[", shortcut.Modifiers.CtrlOrMeta)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Next/previous panel"));\r
-section.addKey(shortcut.shortcutToString(shortcut.Keys.Esc), WebInspector.UIString("Toggle console"));\r
-section.addKey(shortcut.shortcutToString("f", shortcut.Modifiers.CtrlOrMeta), WebInspector.UIString("Search"));\r
-if (WebInspector.isMac()) {\r
-keys = [\r
-shortcut.shortcutToString("g", shortcut.Modifiers.Meta),\r
-shortcut.shortcutToString("g", shortcut.Modifiers.Meta | shortcut.Modifiers.Shift)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Find next/previous"));\r
-}\r
-}\r
-\r
-WebInspector.documentKeyDown = function(event)\r
-{\r
-var isInputElement = event.target.nodeName === "INPUT";\r
-var isInEditMode = event.target.enclosingNodeOrSelfWithClass("text-prompt") || WebInspector.isEditingAnyField();\r
-const helpKey = WebInspector.isMac() ? "U+003F" : "U+00BF"; \r
-\r
-if (event.keyIdentifier === "F1" ||\r
-(event.keyIdentifier === helpKey && event.shiftKey && (!isInEditMode && !isInputElement || event.metaKey))) {\r
-WebInspector.shortcutsHelp.show();\r
-event.stopPropagation();\r
-event.preventDefault();\r
-return;\r
-}\r
-\r
-if (WebInspector.isEditingAnyField())\r
-return;\r
-\r
-if (this.currentFocusElement && this.currentFocusElement.handleKeyEvent) {\r
-this.currentFocusElement.handleKeyEvent(event);\r
-if (event.handled) {\r
-event.preventDefault();\r
-return;\r
-}\r
-}\r
-\r
-if (this.currentPanel && this.currentPanel.handleShortcut) {\r
-this.currentPanel.handleShortcut(event);\r
-if (event.handled) {\r
-event.preventDefault();\r
-return;\r
-}\r
-}\r
-\r
-var isMac = WebInspector.isMac();\r
-switch (event.keyIdentifier) {\r
-case "Left":\r
-var isBackKey = !isInEditMode && (isMac ? event.metaKey : event.ctrlKey);\r
-if (isBackKey && this._panelHistory.canGoBack()) {\r
-this._panelHistory.goBack();\r
-event.preventDefault();\r
-}\r
-break;\r
-\r
-case "Right":\r
-var isForwardKey = !isInEditMode && (isMac ? event.metaKey : event.ctrlKey);\r
-if (isForwardKey && this._panelHistory.canGoForward()) {\r
-this._panelHistory.goForward();\r
-event.preventDefault();\r
-}\r
-break;\r
-\r
-case "U+001B": \r
-event.preventDefault();\r
-if (this.drawer.fullPanel)\r
-return;\r
-\r
-this.drawer.visible = !this.drawer.visible;\r
-break;\r
-\r
-case "U+0046": \r
-if (isMac)\r
-var isFindKey = event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey;\r
-else\r
-var isFindKey = event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey;\r
-\r
-if (isFindKey) {\r
-WebInspector.focusSearchField();\r
-event.preventDefault();\r
-}\r
-break;\r
-\r
-case "F3":\r
-if (!isMac) {\r
-WebInspector.focusSearchField();\r
-event.preventDefault();\r
-}\r
-break;\r
-\r
-case "U+0047": \r
-if (isMac && event.metaKey && !event.ctrlKey && !event.altKey) {\r
-if (event.shiftKey) {\r
-if (this.currentPanel.jumpToPreviousSearchResult)\r
-this.currentPanel.jumpToPreviousSearchResult();\r
-} else if (this.currentPanel.jumpToNextSearchResult)\r
-this.currentPanel.jumpToNextSearchResult();\r
-event.preventDefault();\r
-}\r
-break;\r
-\r
-\r
-case "U+005B":\r
-case "U+00DB": \r
-if (isMac)\r
-var isRotateLeft = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;\r
-else\r
-var isRotateLeft = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;\r
-\r
-if (isRotateLeft) {\r
-var index = this.panelOrder.indexOf(this.currentPanel);\r
-index = (index === 0) ? this.panelOrder.length - 1 : index - 1;\r
-this.panelOrder[index].toolbarItem.click();\r
-event.preventDefault();\r
-}\r
-\r
-break;\r
-\r
-\r
-case "U+005D":\r
-case "U+00DD":  \r
-if (isMac)\r
-var isRotateRight = event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey;\r
-else\r
-var isRotateRight = event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;\r
-\r
-if (isRotateRight) {\r
-var index = this.panelOrder.indexOf(this.currentPanel);\r
-index = (index + 1) % this.panelOrder.length;\r
-this.panelOrder[index].toolbarItem.click();\r
-event.preventDefault();\r
-}\r
-\r
-break;\r
-\r
-case "U+0052": \r
-if ((event.metaKey && isMac) || (event.ctrlKey && !isMac)) {\r
-InspectorBackend.reloadPage();\r
-event.preventDefault();\r
-}\r
-break;\r
-case "F5":\r
-if (!isMac)\r
-InspectorBackend.reloadPage();\r
-break;\r
-}\r
-}\r
-\r
-WebInspector.documentCanCopy = function(event)\r
-{\r
-if (this.currentPanel && this.currentPanel.handleCopyEvent)\r
-event.preventDefault();\r
-}\r
-\r
-WebInspector.documentCopy = function(event)\r
-{\r
-if (this.currentPanel && this.currentPanel.handleCopyEvent)\r
-this.currentPanel.handleCopyEvent(event);\r
-}\r
-\r
-WebInspector.contextMenuEventFired = function(event)\r
-{\r
-if (event.handled || event.target.hasStyleClass("popup-glasspane"))\r
-event.preventDefault();\r
-}\r
-\r
-WebInspector.animateStyle = function(animations, duration, callback)\r
-{\r
-var interval;\r
-var complete = 0;\r
-\r
-const intervalDuration = (1000 / 30); \r
-const animationsLength = animations.length;\r
-const propertyUnit = {opacity: ""};\r
-const defaultUnit = "px";\r
-\r
-function cubicInOut(t, b, c, d)\r
-{\r
-if ((t/=d/2) < 1) return c/2*t*t*t + b;\r
-return c/2*((t-=2)*t*t + 2) + b;\r
-}\r
-\r
-\r
-for (var i = 0; i < animationsLength; ++i) {\r
-var animation = animations[i];\r
-var element = null, start = null, end = null, key = null;\r
-for (key in animation) {\r
-if (key === "element")\r
-element = animation[key];\r
-else if (key === "start")\r
-start = animation[key];\r
-else if (key === "end")\r
-end = animation[key];\r
-}\r
-\r
-if (!element || !end)\r
-continue;\r
-\r
-if (!start) {\r
-var computedStyle = element.ownerDocument.defaultView.getComputedStyle(element);\r
-start = {};\r
-for (key in end)\r
-start[key] = parseInt(computedStyle.getPropertyValue(key));\r
-animation.start = start;\r
-} else\r
-for (key in start)\r
-element.style.setProperty(key, start[key] + (key in propertyUnit ? propertyUnit[key] : defaultUnit));\r
-}\r
-\r
-function animateLoop()\r
-{\r
-\r
-complete += intervalDuration;\r
-var next = complete + intervalDuration;\r
-\r
-\r
-for (var i = 0; i < animationsLength; ++i) {\r
-var animation = animations[i];\r
-var element = animation.element;\r
-var start = animation.start;\r
-var end = animation.end;\r
-if (!element || !end)\r
-continue;\r
-\r
-var style = element.style;\r
-for (key in end) {\r
-var endValue = end[key];\r
-if (next < duration) {\r
-var startValue = start[key];\r
-var newValue = cubicInOut(complete, startValue, endValue - startValue, duration);\r
-style.setProperty(key, newValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));\r
-} else\r
-style.setProperty(key, endValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));\r
-}\r
-}\r
-\r
-\r
-if (complete >= duration) {\r
-clearInterval(interval);\r
-if (callback)\r
-callback();\r
-}\r
-}\r
-\r
-interval = setInterval(animateLoop, intervalDuration);\r
-return interval;\r
-}\r
-\r
-WebInspector.updateSearchLabel = function()\r
-{\r
-if (!this.currentPanel)\r
-return;\r
-\r
-var newLabel = WebInspector.UIString("Search %s", this.currentPanel.toolbarItemLabel);\r
-if (this.attached)\r
-document.getElementById("search").setAttribute("placeholder", newLabel);\r
-else {\r
-document.getElementById("search").removeAttribute("placeholder");\r
-document.getElementById("search-toolbar-label").textContent = newLabel;\r
-}\r
-}\r
-\r
-WebInspector.focusSearchField = function()\r
-{\r
-var searchField = document.getElementById("search");\r
-searchField.focus();\r
-searchField.select();\r
-}\r
-\r
-WebInspector.toggleAttach = function()\r
-{\r
-if (!this.attached)\r
-InspectorFrontendHost.requestAttachWindow();\r
-else\r
-InspectorFrontendHost.requestDetachWindow();\r
-}\r
-\r
-WebInspector.toolbarDragStart = function(event)\r
-{\r
-if ((!WebInspector.attached && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacLeopard && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacSnowLeopard) || WebInspector.port == "qt")\r
-return;\r
-\r
-var target = event.target;\r
-if (target.hasStyleClass("toolbar-item") && target.hasStyleClass("toggleable"))\r
-return;\r
-\r
-var toolbar = document.getElementById("toolbar");\r
-if (target !== toolbar && !target.hasStyleClass("toolbar-item"))\r
-return;\r
-\r
-toolbar.lastScreenX = event.screenX;\r
-toolbar.lastScreenY = event.screenY;\r
-\r
-WebInspector.elementDragStart(toolbar, WebInspector.toolbarDrag, WebInspector.toolbarDragEnd, event, (WebInspector.attached ? "row-resize" : "default"));\r
-}\r
-\r
-WebInspector.toolbarDragEnd = function(event)\r
-{\r
-var toolbar = document.getElementById("toolbar");\r
-\r
-WebInspector.elementDragEnd(event);\r
-\r
-delete toolbar.lastScreenX;\r
-delete toolbar.lastScreenY;\r
-}\r
-\r
-WebInspector.toolbarDrag = function(event)\r
-{\r
-var toolbar = document.getElementById("toolbar");\r
-\r
-if (WebInspector.attached) {\r
-var height = window.innerHeight - (event.screenY - toolbar.lastScreenY);\r
-\r
-InspectorFrontendHost.setAttachedWindowHeight(height);\r
-} else {\r
-var x = event.screenX - toolbar.lastScreenX;\r
-var y = event.screenY - toolbar.lastScreenY;\r
-\r
-\r
-\r
-InspectorFrontendHost.moveWindowBy(x, y);\r
-}\r
-\r
-toolbar.lastScreenX = event.screenX;\r
-toolbar.lastScreenY = event.screenY;\r
-\r
-event.preventDefault();\r
-}\r
-\r
-WebInspector.elementDragStart = function(element, dividerDrag, elementDragEnd, event, cursor)\r
-{\r
-if (this._elementDraggingEventListener || this._elementEndDraggingEventListener)\r
-this.elementDragEnd(event);\r
-\r
-this._elementDraggingEventListener = dividerDrag;\r
-this._elementEndDraggingEventListener = elementDragEnd;\r
-\r
-document.addEventListener("mousemove", dividerDrag, true);\r
-document.addEventListener("mouseup", elementDragEnd, true);\r
-\r
-document.body.style.cursor = cursor;\r
-\r
-event.preventDefault();\r
-}\r
-\r
-WebInspector.elementDragEnd = function(event)\r
-{\r
-document.removeEventListener("mousemove", this._elementDraggingEventListener, true);\r
-document.removeEventListener("mouseup", this._elementEndDraggingEventListener, true);\r
-\r
-document.body.style.removeProperty("cursor");\r
-\r
-delete this._elementDraggingEventListener;\r
-delete this._elementEndDraggingEventListener;\r
-\r
-event.preventDefault();\r
-}\r
-\r
-WebInspector.toggleSearchingForNode = function()\r
-{\r
-if (this.panels.elements) {\r
-this.showPanel("elements");\r
-this.panels.elements.toggleSearchingForNode();\r
-}\r
-}\r
-\r
-WebInspector.showConsole = function()\r
-{\r
-this.drawer.showView(this.console);\r
-}\r
-\r
-WebInspector.showChanges = function()\r
-{\r
-this.drawer.showView(this.changes);\r
-}\r
-\r
-WebInspector.showPanel = function(panel)\r
-{\r
-if (!(panel in this.panels))\r
-panel = "elements";\r
-this.currentPanel = this.panels[panel];\r
-}\r
-\r
-WebInspector.consoleMessagesCleared = function()\r
-{\r
-WebInspector.console.clearMessages();\r
-}\r
-\r
-WebInspector.domContentEventFired = function(time)\r
-{\r
-this.panels.audits.mainResourceDOMContentTime = time;\r
-if (this.panels.network)\r
-this.panels.network.mainResourceDOMContentTime = time;\r
-this.extensionServer.notifyPageDOMContentLoaded((time - WebInspector.mainResource.startTime) * 1000);\r
-this.mainResourceDOMContentTime = time;\r
-}\r
-\r
-WebInspector.loadEventFired = function(time)\r
-{\r
-this.panels.audits.mainResourceLoadTime = time;\r
-if (this.panels.network)\r
-this.panels.network.mainResourceLoadTime = time;\r
-this.extensionServer.notifyPageLoaded((time - WebInspector.mainResource.startTime) * 1000);\r
-this.mainResourceLoadTime = time;\r
-}\r
-\r
-WebInspector.searchingForNodeWasEnabled = function()\r
-{\r
-this.panels.elements.searchingForNodeWasEnabled();\r
-}\r
-\r
-WebInspector.searchingForNodeWasDisabled = function()\r
-{\r
-this.panels.elements.searchingForNodeWasDisabled();\r
-}\r
-\r
-WebInspector.reset = function()\r
-{\r
-this.debuggerModel.reset();\r
-\r
-for (var panelName in this.panels) {\r
-var panel = this.panels[panelName];\r
-if ("reset" in panel)\r
-panel.reset();\r
-}\r
-\r
-this.resources = {};\r
-this.highlightDOMNode(0);\r
-\r
-this.console.clearMessages();\r
-this.extensionServer.notifyInspectorReset();\r
-}\r
-\r
-WebInspector.bringToFront = function()\r
-{\r
-InspectorFrontendHost.bringToFront();\r
-}\r
-\r
-WebInspector.inspectedURLChanged = function(url)\r
-{\r
-InspectorFrontendHost.inspectedURLChanged(url);\r
-this.settings.inspectedURLChanged(url);\r
-this.extensionServer.notifyInspectedURLChanged();\r
-}\r
-\r
-WebInspector.updateConsoleMessageExpiredCount = function(count)\r
-{\r
-var message = String.sprintf(WebInspector.UIString("%d console messages are not shown."), count);\r
-WebInspector.console.addMessage(WebInspector.ConsoleMessage.createTextMessage(message, WebInspector.ConsoleMessage.MessageLevel.Warning));\r
-}\r
-\r
-WebInspector.addConsoleMessage = function(payload)\r
-{\r
-var consoleMessage = new WebInspector.ConsoleMessage(\r
-payload.source,\r
-payload.type,\r
-payload.level,\r
-payload.line,\r
-payload.url,\r
-payload.repeatCount,\r
-payload.message,\r
-payload.parameters,\r
-payload.stackTrace,\r
-payload.requestId);\r
-this.console.addMessage(consoleMessage);\r
-}\r
-\r
-WebInspector.updateConsoleMessageRepeatCount = function(count)\r
-{\r
-this.console.updateMessageRepeatCount(count);\r
-}\r
-\r
-WebInspector.log = function(message, messageLevel)\r
-{\r
-\r
-var self = this;\r
-\r
-\r
-function isLogAvailable()\r
-{\r
-return WebInspector.ConsoleMessage && WebInspector.RemoteObject && self.console;\r
-}\r
-\r
-\r
-function flushQueue()\r
-{\r
-var queued = WebInspector.log.queued;\r
-if (!queued)\r
-return;\r
-\r
-for (var i = 0; i < queued.length; ++i)\r
-logMessage(queued[i]);\r
-\r
-delete WebInspector.log.queued;\r
-}\r
-\r
-\r
-\r
-function flushQueueIfAvailable()\r
-{\r
-if (!isLogAvailable())\r
-return;\r
-\r
-clearInterval(WebInspector.log.interval);\r
-delete WebInspector.log.interval;\r
-\r
-flushQueue();\r
-}\r
-\r
-\r
-function logMessage(message)\r
-{\r
-var repeatCount = 1;\r
-if (message == WebInspector.log.lastMessage)\r
-repeatCount = WebInspector.log.repeatCount + 1;\r
-\r
-WebInspector.log.lastMessage = message;\r
-WebInspector.log.repeatCount = repeatCount;\r
-\r
-\r
-message = new WebInspector.RemoteObject.fromPrimitiveValue(message);\r
-\r
-\r
-var msg = new WebInspector.ConsoleMessage(\r
-WebInspector.ConsoleMessage.MessageSource.Other,\r
-WebInspector.ConsoleMessage.MessageType.Log,\r
-messageLevel || WebInspector.ConsoleMessage.MessageLevel.Debug,\r
--1,\r
-null,\r
-repeatCount,\r
-null,\r
-[message],\r
-null);\r
-\r
-self.console.addMessage(msg);\r
-}\r
-\r
-\r
-if (!isLogAvailable()) {\r
-if (!WebInspector.log.queued)\r
-WebInspector.log.queued = [];\r
-\r
-WebInspector.log.queued.push(message);\r
-\r
-if (!WebInspector.log.interval)\r
-WebInspector.log.interval = setInterval(flushQueueIfAvailable, 1000);\r
-\r
-return;\r
-}\r
-\r
-\r
-flushQueue();\r
-\r
-\r
-logMessage(message);\r
-}\r
-\r
-WebInspector.drawLoadingPieChart = function(canvas, percent) {\r
-var g = canvas.getContext("2d");\r
-var darkColor = "rgb(122, 168, 218)";\r
-var lightColor = "rgb(228, 241, 251)";\r
-var cx = 8;\r
-var cy = 8;\r
-var r = 7;\r
-\r
-g.beginPath();\r
-g.arc(cx, cy, r, 0, Math.PI * 2, false);\r
-g.closePath();\r
-\r
-g.lineWidth = 1;\r
-g.strokeStyle = darkColor;\r
-g.fillStyle = lightColor;\r
-g.fill();\r
-g.stroke();\r
-\r
-var startangle = -Math.PI / 2;\r
-var endangle = startangle + (percent * Math.PI * 2);\r
-\r
-g.beginPath();\r
-g.moveTo(cx, cy);\r
-g.arc(cx, cy, r, startangle, endangle, false);\r
-g.closePath();\r
-\r
-g.fillStyle = darkColor;\r
-g.fill();\r
-}\r
-\r
-WebInspector.updateFocusedNode = function(nodeId)\r
-{\r
-this._updateFocusedNode(nodeId);\r
-this.highlightDOMNodeForTwoSeconds(nodeId);\r
-}\r
-\r
-WebInspector.displayNameForURL = function(url)\r
-{\r
-if (!url)\r
-return "";\r
-\r
-var resource = this.resourceForURL(url);\r
-if (resource)\r
-return resource.displayName;\r
-\r
-if (!WebInspector.mainResource)\r
-return url.trimURL("");\r
-\r
-var lastPathComponent = WebInspector.mainResource.lastPathComponent;\r
-var index = WebInspector.mainResource.url.indexOf(lastPathComponent);\r
-if (index !== -1 && index + lastPathComponent.length === WebInspector.mainResource.url.length) {\r
-var baseURL = WebInspector.mainResource.url.substring(0, index);\r
-if (url.indexOf(baseURL) === 0)\r
-return url.substring(index);\r
-}\r
-\r
-return url.trimURL(WebInspector.mainResource.domain);\r
-}\r
-\r
-WebInspector._choosePanelToShowSourceLine = function(url, line, preferredPanel)\r
-{\r
-preferredPanel = preferredPanel || "resources";\r
-\r
-var panel = this.panels[preferredPanel];\r
-if (panel && panel.canShowSourceLine(url, line))\r
-return panel;\r
-panel = this.panels.resources;\r
-return panel.canShowSourceLine(url, line) ? panel : null;\r
-}\r
-\r
-WebInspector.canShowSourceLine = function(url, line, preferredPanel)\r
-{\r
-return !!this._choosePanelToShowSourceLine(url, line, preferredPanel);\r
-}\r
-\r
-WebInspector.showSourceLine = function(url, line, preferredPanel)\r
-{\r
-this.currentPanel = this._choosePanelToShowSourceLine(url, line, preferredPanel);\r
-if (!this.currentPanel)\r
-return false;\r
-this.currentPanel.showSourceLine(url, line);\r
-return true;\r
-}\r
-\r
-WebInspector.linkifyStringAsFragment = function(string)\r
-{\r
-var container = document.createDocumentFragment();\r
-var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|www\.)[\w$\-_+*'=\|\/\\(){}[\]%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({%@&#~]/;\r
-    var lineColumnRegEx = /:(\d+)(:(\d+))?$/;\r
-\r
-    while (string) {\r
-        var linkString = linkStringRegEx.exec(string);\r
-        if (!linkString)\r
-            break;\r
-\r
-        linkString = linkString[0];\r
-        var title = linkString;\r
-        var linkIndex = string.indexOf(linkString);\r
-        var nonLink = string.substring(0, linkIndex);\r
-        container.appendChild(document.createTextNode(nonLink));\r
-\r
-        var profileStringMatches = WebInspector.ProfileType.URLRegExp.exec(title);\r
-        if (profileStringMatches)\r
-            title = WebInspector.panels.profiles.displayTitleForProfileLink(profileStringMatches[2], profileStringMatches[1]);\r
-\r
-        var realURL = (linkString.indexOf("www.") === 0 ? "http://" + linkString : linkString);\r
-        var lineColumnMatch = lineColumnRegEx.exec(realURL);\r
-        if (lineColumnMatch)\r
-            realURL = realURL.substring(0, realURL.length - lineColumnMatch[0].length);\r
-\r
-        var hasResourceWithURL = !!WebInspector.resourceForURL(realURL);\r
-        var urlNode = WebInspector.linkifyURLAsNode(realURL, title, null, hasResourceWithURL);\r
-        container.appendChild(urlNode);\r
-        if (lineColumnMatch) {\r
-            urlNode.setAttribute("line_number", lineColumnMatch[1]);\r
-            urlNode.setAttribute("preferred_panel", "scripts");\r
-        }\r
-        string = string.substring(linkIndex + linkString.length, string.length);\r
-    }\r
-\r
-    if (string)\r
-        container.appendChild(document.createTextNode(string));\r
-\r
-    return container;\r
-}\r
-\r
-WebInspector.showProfileForURL = function(url)\r
-{\r
-    WebInspector.showPanel("profiles");\r
-    WebInspector.panels.profiles.showProfileForURL(url);\r
-}\r
-\r
-WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText)\r
-{\r
-    if (!linkText)\r
-        linkText = url;\r
-    classes = (classes ? classes + " " : "");\r
-    classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-link";\r
-\r
-    var a = document.createElement("a");\r
-    a.href = url;\r
-    a.className = classes;\r
-    if (typeof tooltipText === "undefined")\r
-        a.title = url;\r
-    else if (typeof tooltipText !== "string" || tooltipText.length)\r
-        a.title = tooltipText;\r
-    a.textContent = linkText;\r
-\r
-    return a;\r
-}\r
-\r
-WebInspector.linkifyURL = function(url, linkText, classes, isExternal, tooltipText)\r
-{\r
-    // Use the DOM version of this function so as to avoid needing to escape attributes.\r
-    // FIXME:  Get rid of linkifyURL entirely.\r
-    return WebInspector.linkifyURLAsNode(url, linkText, classes, isExternal, tooltipText).outerHTML;\r
-}\r
-\r
-WebInspector.linkifyResourceAsNode = function(url, preferredPanel, lineNumber, classes, tooltipText)\r
-{\r
-    var linkText = WebInspector.displayNameForURL(url);\r
-    if (lineNumber)\r
-        linkText += ":" + lineNumber;\r
-    var node = WebInspector.linkifyURLAsNode(url, linkText, classes, false, tooltipText);\r
-    node.setAttribute("line_number", lineNumber);\r
-    node.setAttribute("preferred_panel", preferredPanel);\r
-    return node;\r
-}\r
-\r
-WebInspector.resourceURLForRelatedNode = function(node, url)\r
-{\r
-    if (!url || url.indexOf("://") > 0)\r
-        return url;\r
-\r
-    for (var frameOwnerCandidate = node; frameOwnerCandidate; frameOwnerCandidate = frameOwnerCandidate.parentNode) {\r
-        if (frameOwnerCandidate.documentURL) {\r
-            var result = WebInspector.completeURL(frameOwnerCandidate.documentURL, url);\r
-            if (result)\r
-                return result;\r
-            break;\r
-        }\r
-    }\r
-\r
-    // documentURL not found or has bad value\r
-    var resourceURL = url;\r
-    function callback(resource)\r
-    {\r
-        if (resource.path === url) {\r
-            resourceURL = resource.url;\r
-            return true;\r
-        }\r
-    }\r
-    WebInspector.forAllResources(callback);\r
-    return resourceURL;\r
-}\r
-\r
-WebInspector.completeURL = function(baseURL, href)\r
-{\r
-    var parsedURL = baseURL.asParsedURL();\r
-    if (parsedURL) {\r
-        var path = href;\r
-        if (path.charAt(0) !== "/") {\r
-            var basePath = parsedURL.path;\r
-            path = basePath.substring(0, basePath.lastIndexOf("/")) + "/" + path;\r
-        } else if (path.length > 1 && path.charAt(1) === "/") {\r
-            // href starts with "//" which is a full URL with the protocol dropped (use the baseURL protocol).\r
-            return parsedURL.scheme + ":" + path;\r
-        }\r
-        return parsedURL.scheme + "://" + parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "") + path;\r
-    }\r
-    return null;\r
-}\r
-\r
-WebInspector.addMainEventListeners = function(doc)\r
-{\r
-    doc.defaultView.addEventListener("focus", this.windowFocused.bind(this), false);\r
-    doc.defaultView.addEventListener("blur", this.windowBlurred.bind(this), false);\r
-    doc.addEventListener("click", this.documentClick.bind(this), true);\r
-}\r
-\r
-WebInspector._searchFieldManualFocus = function(event)\r
-{\r
-    this.currentFocusElement = event.target;\r
-    this._previousFocusElement = event.target;\r
-}\r
-\r
-WebInspector._searchKeyDown = function(event)\r
-{\r
-    // Escape Key will clear the field and clear the search results\r
-    if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code) {\r
-        // If focus belongs here and text is empty - nothing to do, return unhandled.\r
-        if (event.target.value === "" && this.currentFocusElement === this.previousFocusElement)\r
-            return;\r
-        event.preventDefault();\r
-        event.stopPropagation();\r
-        // When search was selected manually and is currently blank, we'd like Esc stay unhandled\r
-\r
-event.target.value = "";\r
-\r
-this.performSearch(event);\r
-this.currentFocusElement = this.previousFocusElement;\r
-if (this.currentFocusElement === event.target)\r
-this.currentFocusElement.select();\r
-return false;\r
-}\r
-\r
-if (!isEnterKey(event))\r
-return false;\r
-\r
-\r
-event.target.select();\r
-\r
-\r
-\r
-\r
-this.performSearch(event);\r
-\r
-\r
-\r
-event.preventDefault();\r
-}\r
-\r
-WebInspector.performSearch = function(event)\r
-{\r
-var forceSearch = event.keyIdentifier === "Enter";\r
-this.doPerformSearch(event.target.value, forceSearch, event.shiftKey, false);\r
-}\r
-\r
-WebInspector.doPerformSearch = function(query, forceSearch, isBackwardSearch, repeatSearch)\r
-{\r
-var isShortSearch = (query.length < 3);\r
-\r
-\r
-if (isShortSearch && this.shortSearchWasForcedByKeyEvent && this.currentQuery !== query)\r
-delete this.shortSearchWasForcedByKeyEvent;\r
-\r
-\r
-if (isShortSearch && forceSearch)\r
-this.shortSearchWasForcedByKeyEvent = true;\r
-\r
-if (!query || !query.length || (!forceSearch && isShortSearch)) {\r
-\r
-if (this.shortSearchWasForcedByKeyEvent) {\r
-delete this.shortSearchWasForcedByKeyEvent;\r
-return;\r
-}\r
-\r
-delete this.currentQuery;\r
-\r
-for (var panelName in this.panels) {\r
-var panel = this.panels[panelName];\r
-var hadCurrentQuery = !!panel.currentQuery;\r
-delete panel.currentQuery;\r
-if (hadCurrentQuery && panel.searchCanceled)\r
-panel.searchCanceled();\r
-}\r
-\r
-this.updateSearchMatchesCount();\r
-\r
-return;\r
-}\r
-\r
-if (!repeatSearch && query === this.currentPanel.currentQuery && this.currentPanel.currentQuery === this.currentQuery) {\r
-\r
-\r
-if (forceSearch) {\r
-if (!isBackwardSearch && this.currentPanel.jumpToNextSearchResult)\r
-this.currentPanel.jumpToNextSearchResult();\r
-else if (isBackwardSearch && this.currentPanel.jumpToPreviousSearchResult)\r
-this.currentPanel.jumpToPreviousSearchResult();\r
-}\r
-return;\r
-}\r
-\r
-this.currentQuery = query;\r
-\r
-this.updateSearchMatchesCount();\r
-\r
-if (!this.currentPanel.performSearch)\r
-return;\r
-\r
-this.currentPanel.currentQuery = query;\r
-this.currentPanel.performSearch(query);\r
-}\r
-\r
-WebInspector.addNodesToSearchResult = function(nodeIds)\r
-{\r
-WebInspector.panels.elements.addNodesToSearchResult(nodeIds);\r
-}\r
-\r
-WebInspector.updateSearchMatchesCount = function(matches, panel)\r
-{\r
-if (!panel)\r
-panel = this.currentPanel;\r
-\r
-panel.currentSearchMatches = matches;\r
-\r
-if (panel !== this.currentPanel)\r
-return;\r
-\r
-if (!this.currentPanel.currentQuery) {\r
-document.getElementById("search-results-matches").addStyleClass("hidden");\r
-return;\r
-}\r
-\r
-if (matches) {\r
-if (matches === 1)\r
-var matchesString = WebInspector.UIString("1 match");\r
-else\r
-var matchesString = WebInspector.UIString("%d matches", matches);\r
-} else\r
-var matchesString = WebInspector.UIString("Not Found");\r
-\r
-var matchesToolbarElement = document.getElementById("search-results-matches");\r
-matchesToolbarElement.removeStyleClass("hidden");\r
-matchesToolbarElement.textContent = matchesString;\r
-}\r
-\r
-WebInspector.UIString = function(string)\r
-{\r
-if (window.localizedStrings && string in window.localizedStrings)\r
-string = window.localizedStrings[string];\r
-else {\r
-if (!(string in WebInspector.missingLocalizedStrings)) {\r
-if (!WebInspector.InspectorBackendStub)\r
-console.error("Localized string \"" + string + "\" not found.");\r
-WebInspector.missingLocalizedStrings[string] = true;\r
-}\r
-\r
-if (Preferences.showMissingLocalizedStrings)\r
-string += " (not localized)";\r
-}\r
-\r
-return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));\r
-}\r
-\r
-WebInspector.formatLocalized = function(format, substitutions, formatters, initialValue, append)\r
-{\r
-return String.format(WebInspector.UIString(format), substitutions, formatters, initialValue, append);\r
-}\r
-\r
-WebInspector.isMac = function()\r
-{\r
-if (!("_isMac" in this))\r
-this._isMac = WebInspector.platform === "mac";\r
-\r
-return this._isMac;\r
-}\r
-\r
-WebInspector.isBeingEdited = function(element)\r
-{\r
-return element.__editing;\r
-}\r
-\r
-WebInspector.isEditingAnyField = function()\r
-{\r
-return this.__editing;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.startEditing = function(element, config)\r
-{\r
-if (element.__editing)\r
-return;\r
-element.__editing = true;\r
-WebInspector.__editing = true;\r
-\r
-config = config || {};\r
-var committedCallback = config.commitHandler;\r
-var cancelledCallback = config.cancelHandler;\r
-var context = config.context;\r
-var oldText = getContent(element);\r
-var moveDirection = "";\r
-\r
-element.addStyleClass("editing");\r
-\r
-var oldTabIndex = element.tabIndex;\r
-if (element.tabIndex < 0)\r
-element.tabIndex = 0;\r
-\r
-function blurEventListener() {\r
-editingCommitted.call(element);\r
-}\r
-\r
-function getContent(element) {\r
-if (element.tagName === "INPUT" && element.type === "text")\r
-return element.value;\r
-else\r
-return element.textContent;\r
-}\r
-\r
-function cleanUpAfterEditing() {\r
-delete this.__editing;\r
-delete WebInspector.__editing;\r
-\r
-this.removeStyleClass("editing");\r
-this.tabIndex = oldTabIndex;\r
-this.scrollTop = 0;\r
-this.scrollLeft = 0;\r
-\r
-element.removeEventListener("blur", blurEventListener, false);\r
-element.removeEventListener("keydown", keyDownEventListener, true);\r
-\r
-if (element === WebInspector.currentFocusElement || element.isAncestor(WebInspector.currentFocusElement))\r
-WebInspector.currentFocusElement = WebInspector.previousFocusElement;\r
-}\r
-\r
-function editingCancelled() {\r
-if (this.tagName === "INPUT" && this.type === "text")\r
-this.value = oldText;\r
-else\r
-this.textContent = oldText;\r
-\r
-cleanUpAfterEditing.call(this);\r
-\r
-if (cancelledCallback)\r
-cancelledCallback(this, context);\r
-}\r
-\r
-function editingCommitted() {\r
-cleanUpAfterEditing.call(this);\r
-\r
-if (committedCallback)\r
-committedCallback(this, getContent(this), oldText, context, moveDirection);\r
-}\r
-\r
-function defaultFinishHandler(event)\r
-{\r
-var isMetaOrCtrl = WebInspector.isMac() ?\r
-event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :\r
-event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;\r
-if (isEnterKey(event) && (!config.multiline || isMetaOrCtrl))\r
-return "commit";\r
-else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code)\r
-return "cancel";\r
-else if (event.keyIdentifier === "U+0009") \r
-return "move-" + (event.shiftKey ? "backward" : "forward");\r
-}\r
-\r
-function keyDownEventListener(event)\r
-{\r
-var handler = config.customFinishHandler || defaultFinishHandler;\r
-var result = handler(event);\r
-if (result === "commit") {\r
-editingCommitted.call(element);\r
-event.preventDefault();\r
-event.stopPropagation();\r
-} else if (result === "cancel") {\r
-editingCancelled.call(element);\r
-event.preventDefault();\r
-event.stopPropagation();\r
-} else if (result && result.indexOf("move-") === 0) {\r
-moveDirection = result.substring(5);\r
-if (event.keyIdentifier !== "U+0009")\r
-blurEventListener();\r
-}\r
-}\r
-\r
-element.addEventListener("blur", blurEventListener, false);\r
-element.addEventListener("keydown", keyDownEventListener, true);\r
-\r
-WebInspector.currentFocusElement = element;\r
-return {\r
-cancel: editingCancelled.bind(element),\r
-commit: editingCommitted.bind(element)\r
-};\r
-}\r
-\r
-WebInspector._toolbarItemClicked = function(event)\r
-{\r
-var toolbarItem = event.currentTarget;\r
-this.currentPanel = toolbarItem.panel;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.MIMETypes = {\r
-"text/html":                   {0: true},\r
-"text/xml":                    {0: true},\r
-"text/plain":                  {0: true},\r
-"application/xhtml+xml":       {0: true},\r
-"text/css":                    {1: true},\r
-"text/xsl":                    {1: true},\r
-"image/jpeg":                  {2: true},\r
-"image/png":                   {2: true},\r
-"image/gif":                   {2: true},\r
-"image/bmp":                   {2: true},\r
-"image/vnd.microsoft.icon":    {2: true},\r
-"image/x-icon":                {2: true},\r
-"image/x-xbitmap":             {2: true},\r
-"font/ttf":                    {3: true},\r
-"font/opentype":               {3: true},\r
-"application/x-font-type1":    {3: true},\r
-"application/x-font-ttf":      {3: true},\r
-"application/x-truetype-font": {3: true},\r
-"text/javascript":             {4: true},\r
-"text/ecmascript":             {4: true},\r
-"application/javascript":      {4: true},\r
-"application/ecmascript":      {4: true},\r
-"application/x-javascript":    {4: true},\r
-"text/javascript1.1":          {4: true},\r
-"text/javascript1.2":          {4: true},\r
-"text/javascript1.3":          {4: true},\r
-"text/jscript":                {4: true},\r
-"text/livescript":             {4: true},\r
-}\r
-\r
-WebInspector.PanelHistory = function()\r
-{\r
-this._history = [];\r
-this._historyIterator = -1;\r
-}\r
-\r
-WebInspector.PanelHistory.prototype = {\r
-canGoBack: function()\r
-{\r
-return this._historyIterator > 0;\r
-},\r
-\r
-goBack: function()\r
-{\r
-this._inHistory = true;\r
-WebInspector.currentPanel = WebInspector.panels[this._history[--this._historyIterator]];\r
-delete this._inHistory;\r
-},\r
-\r
-canGoForward: function()\r
-{\r
-return this._historyIterator < this._history.length - 1;\r
-},\r
-\r
-goForward: function()\r
-{\r
-this._inHistory = true;\r
-WebInspector.currentPanel = WebInspector.panels[this._history[++this._historyIterator]];\r
-delete this._inHistory;\r
-},\r
-\r
-setPanel: function(panelName)\r
-{\r
-if (this._inHistory)\r
-return;\r
-\r
-this._history.splice(this._historyIterator + 1, this._history.length - this._historyIterator - 1);\r
-if (!this._history.length || this._history[this._history.length - 1] !== panelName)\r
-this._history.push(panelName);\r
-this._historyIterator = this._history.length - 1;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-InspectorBackendStub = function()\r
-{\r
-this._lastCallbackId = 1;\r
-this._callbacks = {};\r
-this._domainDispatchers = {};\r
-this._registerDelegate('{"seq": 0, "domain": "Backend", "command": "setInjectedScriptSource", "arguments": {"scriptSource": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Backend", "command": "dispatchOnInjectedScript", "arguments": {"injectedScriptId": "number","methodName": "string","arguments": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "addScriptToEvaluateOnLoad", "arguments": {"scriptSource": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "removeAllScriptsToEvaluateOnLoad", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Backend", "command": "releaseWrapperObjectGroup", "arguments": {"injectedScriptId": "number","objectGroup": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "getInspectorState", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setMonitoringXHREnabled", "arguments": {"enable": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "reloadPage", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "populateScriptObjects", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "openInInspectedWindow", "arguments": {"url": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setSearchingForNode", "arguments": {"enabled": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "didEvaluateForTestInFrontend", "arguments": {"testCallId": "number","jsonResult": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "highlightDOMNode", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "hideDOMNodeHighlight", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "highlightFrame", "arguments": {"frameId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "hideFrameHighlight", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setConsoleMessagesEnabled", "arguments": {"enabled": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "clearConsoleMessages", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setExtraHeaders", "arguments": {"headers": "object"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Resources", "command": "cachedResources", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Resources", "command": "resourceContent", "arguments": {"frameId": "number","url": "string","base64Encode": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "getCookies", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "deleteCookie", "arguments": {"cookieName": "string","domain": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Backend", "command": "getDatabaseTableNames", "arguments": {"databaseId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Backend", "command": "executeSQL", "arguments": {"databaseId": "number","query": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "getDOMStorageEntries", "arguments": {"storageId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setDOMStorageItem", "arguments": {"storageId": "number","key": "string","value": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "removeDOMStorageItem", "arguments": {"storageId": "number","key": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "ApplicationCache", "command": "getApplicationCaches", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "FileSystem", "command": "getFileSystemPathAsync", "arguments": {"type": "number","origin": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "FileSystem", "command": "revealFolderInOS", "arguments": {"path": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "getChildNodes", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "setAttribute", "arguments": {"elementId": "number","name": "string","value": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "removeAttribute", "arguments": {"elementId": "number","name": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "setTextNodeValue", "arguments": {"nodeId": "number","value": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "getEventListenersForNode", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "copyNode", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "removeNode", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "changeTagName", "arguments": {"nodeId": "number","newTagName": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "getOuterHTML", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "setOuterHTML", "arguments": {"nodeId": "number","outerHTML": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "addInspectedNode", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "performSearch", "arguments": {"query": "string","runSynchronously": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "searchCanceled", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "pushNodeByPathToFrontend", "arguments": {"path": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "getStylesForNode2", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "getComputedStyleForNode2", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "getInlineStyleForNode2", "arguments": {"nodeId": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "getAllStyles2", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "getStyleSheet2", "arguments": {"styleSheetId": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "getStyleSheetText2", "arguments": {"styleSheetId": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "setStyleSheetText2", "arguments": {"styleSheetId": "string","text": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "setPropertyText2", "arguments": {"styleId": "object","propertyIndex": "number","text": "string","overwrite": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "toggleProperty2", "arguments": {"styleId": "object","propertyIndex": "number","disable": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "setRuleSelector2", "arguments": {"ruleId": "object","selector": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "addRule2", "arguments": {"contextNodeId": "number","selector": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "getSupportedCSSProperties", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "CSS", "command": "querySelectorAll", "arguments": {"documentId": "number","selector": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "startTimelineProfiler", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "stopTimelineProfiler", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Backend", "command": "enableDebugger", "arguments": {"always": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "disableDebugger", "arguments": {"always": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "activateBreakpoints", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "deactivateBreakpoints", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "setBreakpoint", "arguments": {"sourceID": "string","lineNumber": "number","condition": "string","enabled": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "removeBreakpoint", "arguments": {"breakpointId": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setStickyBreakpoints", "arguments": {"breakpoints": "object"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "setDOMBreakpoint", "arguments": {"nodeId": "number","type": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "DOM", "command": "removeDOMBreakpoint", "arguments": {"nodeId": "number","type": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setEventListenerBreakpoint", "arguments": {"eventName": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "removeEventListenerBreakpoint", "arguments": {"eventName": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "setXHRBreakpoint", "arguments": {"url": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "removeXHRBreakpoint", "arguments": {"url": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "stepOverStatement", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "stepIntoStatement", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "stepOutOfFunction", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "pause", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "resume", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "setPauseOnExceptionsState", "arguments": {"pauseOnExceptionsState": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "editScriptSource", "arguments": {"sourceID": "string","newContent": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Debugger", "command": "getScriptSource", "arguments": {"sourceID": "string"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "enableProfiler", "arguments": {"always": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "disableProfiler", "arguments": {"always": "boolean"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "startProfiling", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Inspector", "command": "stopProfiling", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Profiler", "command": "getProfileHeaders", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Profiler", "command": "getProfile", "arguments": {"type": "string","uid": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Profiler", "command": "removeProfile", "arguments": {"type": "string","uid": "number"}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Profiler", "command": "clearProfiles", "arguments": {}}');\r
-this._registerDelegate('{"seq": 0, "domain": "Profiler", "command": "takeHeapSnapshot", "arguments": {}}');\r
-}\r
-\r
-InspectorBackendStub.prototype = {\r
-_wrap: function(callback)\r
-{\r
-var callbackId = this._lastCallbackId++;\r
-this._callbacks[callbackId] = callback || function() {};\r
-return callbackId;\r
-},\r
-\r
-_processResponse: function(callbackId, args)\r
-{\r
-var callback = this._callbacks[callbackId];\r
-callback.apply(null, args);\r
-delete this._callbacks[callbackId];\r
-},\r
-\r
-_removeResponseCallbackEntry: function(callbackId)\r
-{\r
-delete this._callbacks[callbackId];\r
-},\r
-\r
-_registerDelegate: function(commandInfo)\r
-{\r
-var commandObject = JSON.parse(commandInfo);\r
-this[commandObject.command] = this.sendMessageToBackend.bind(this, commandInfo);\r
-},\r
-\r
-sendMessageToBackend: function()\r
-{\r
-var args = Array.prototype.slice.call(arguments);\r
-var request = JSON.parse(args.shift());\r
-\r
-for (var key in request.arguments) {\r
-if (args.length === 0) {\r
-console.error("Protocol Error: Invalid number of arguments for 'InspectorBackend.%s' call. It should have the next arguments '%s'.", request.command, JSON.stringify(request.arguments));\r
-return;\r
-}\r
-var value = args.shift();\r
-if (typeof value !== request.arguments[key]) {\r
-console.error("Protocol Error: Invalid type of argument '%s' for 'InspectorBackend.%s' call. It should be '%s' but it is '%s'.", key, request.command, request.arguments[key], typeof value);\r
-return;\r
-}\r
-request.arguments[key] = value;\r
-}\r
-\r
-if (args.length === 1) {\r
-if (typeof args[0] !== "function" && typeof args[0] !== "undefined") {\r
-console.error("Protocol Error: Optional callback argument for 'InspectorBackend.%s' call should be a function but its type is '%s'.", request.command, typeof args[0]);\r
-return;\r
-}\r
-request.seq = this._wrap(args[0]);\r
-}\r
-\r
-if (window.dumpInspectorProtocolMessages)\r
-console.log("frontend: " + JSON.stringify(request));\r
-\r
-var message = JSON.stringify(request);\r
-InspectorFrontendHost.sendMessageToBackend(message);\r
-},\r
-\r
-registerDomainDispatcher: function(domain, dispatcher)\r
-{\r
-this._domainDispatchers[domain] = dispatcher;\r
-},\r
-\r
-dispatch: function(message)\r
-{\r
-if (window.dumpInspectorProtocolMessages)\r
-console.log("backend: " + ((typeof message === "string") ? message : JSON.stringify(message)));\r
-\r
-var messageObject = (typeof message === "string") ? JSON.parse(message) : message;\r
-\r
-var arguments = [];\r
-if (messageObject.data)\r
-for (var key in messageObject.data)\r
-arguments.push(messageObject.data[key]);\r
-\r
-if ("seq" in messageObject) { \r
-if (messageObject.success)\r
-this._processResponse(messageObject.seq, arguments);\r
-else {\r
-this._removeResponseCallbackEntry(messageObject.seq)\r
-this.reportProtocolError(messageObject);\r
-}\r
-return;\r
-}\r
-\r
-if (messageObject.type === "event") {\r
-if (!(messageObject.domain in this._domainDispatchers)) {\r
-console.error("Protocol Error: the message is for non-existing domain '%s'", messageObject.domain);\r
-return;\r
-}\r
-var dispatcher = this._domainDispatchers[messageObject.domain];\r
-if (!(messageObject.event in dispatcher)) {\r
-console.error("Protocol Error: Attempted to dispatch an unimplemented method '%s.%s'", messageObject.domain, messageObject.event);\r
-return;\r
-}\r
-dispatcher[messageObject.event].apply(dispatcher, arguments);\r
-}\r
-},\r
-\r
-reportProtocolError: function(messageObject)\r
-{\r
-console.error("Protocol Error: InspectorBackend request with seq = %d failed.", messageObject.seq);\r
-for (var i = 0; i < messageObject.errors.length; ++i)\r
-console.error("    " + messageObject.errors[i]);\r
-this._removeResponseCallbackEntry(messageObject.seq);\r
-}\r
-}\r
-\r
-InspectorBackend = new InspectorBackendStub();\r
-\r
-\r
-\r
-\r
-if (!window.InspectorFrontendHost) {\r
-\r
-WebInspector.InspectorFrontendHostStub = function()\r
-{\r
-this._attachedWindowHeight = 0;\r
-}\r
-\r
-WebInspector._platformFlavor = WebInspector.PlatformFlavor.MacLeopard;\r
-\r
-WebInspector.InspectorFrontendHostStub.prototype = {\r
-platform: function()\r
-{\r
-var match = navigator.userAgent.match(/Windows NT/);\r
-if (match)\r
-return "windows";\r
-match = navigator.userAgent.match(/Mac OS X/);\r
-if (match)\r
-return "mac";\r
-return "linux";\r
-},\r
-\r
-port: function()\r
-{\r
-return "unknown";\r
-},\r
-\r
-bringToFront: function()\r
-{\r
-this._windowVisible = true;\r
-},\r
-\r
-closeWindow: function()\r
-{\r
-this._windowVisible = false;\r
-},\r
-\r
-disconnectFromBackend: function()\r
-{\r
-this._windowVisible = false;\r
-},\r
-\r
-attach: function()\r
-{\r
-},\r
-\r
-detach: function()\r
-{\r
-},\r
-\r
-search: function(sourceRow, query)\r
-{\r
-},\r
-\r
-setAttachedWindowHeight: function(height)\r
-{\r
-},\r
-\r
-moveWindowBy: function(x, y)\r
-{\r
-},\r
-\r
-setExtensionAPI: function(script)\r
-{\r
-},\r
-\r
-loaded: function()\r
-{\r
-},\r
-\r
-localizedStringsURL: function()\r
-{\r
-return undefined;\r
-},\r
-\r
-hiddenPanels: function()\r
-{\r
-return "";\r
-},\r
-\r
-inspectedURLChanged: function(url)\r
-{\r
-},\r
-\r
-copyText: function()\r
-{\r
-},\r
-\r
-canAttachWindow: function()\r
-{\r
-return false;\r
-},\r
-\r
-sendMessageToBackend: function(message)\r
-{\r
-}\r
-}\r
-\r
-InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();\r
-\r
-}\r
-\r
-\r
-\r
-\r
-\r
-if (!window.InspectorExtensionRegistry) {\r
-\r
-WebInspector.InspectorExtensionRegistryStub = function()\r
-{\r
-}\r
-\r
-WebInspector.InspectorExtensionRegistryStub.prototype = {\r
-getExtensionsAsync: function()\r
-{\r
-}\r
-};\r
-\r
-InspectorExtensionRegistry = new WebInspector.InspectorExtensionRegistryStub();\r
-\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Object = function() {\r
-}\r
-\r
-WebInspector.Object.prototype = {\r
-addEventListener: function(eventType, listener, thisObject)\r
-{\r
-if (!("_listeners" in this))\r
-this._listeners = {};\r
-if (!(eventType in this._listeners))\r
-this._listeners[eventType] = [];\r
-this._listeners[eventType].push({ thisObject: thisObject, listener: listener });\r
-},\r
-\r
-removeEventListener: function(eventType, listener, thisObject)\r
-{\r
-if (!("_listeners" in this) || !(eventType in this._listeners))\r
-return;\r
-var listeners = this._listeners[eventType];\r
-for (var i = 0; i < listeners.length; ++i) {\r
-if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)\r
-listeners.splice(i, 1);\r
-else if (!listener && thisObject && listeners[i].thisObject === thisObject)\r
-listeners.splice(i, 1);\r
-}\r
-\r
-if (!listeners.length)\r
-delete this._listeners[eventType];\r
-},\r
-\r
-removeAllListeners: function()\r
-{\r
-delete this._listeners;\r
-},\r
-\r
-dispatchEventToListeners: function(eventType, eventData)\r
-{\r
-if (!("_listeners" in this) || !(eventType in this._listeners))\r
-return;\r
-\r
-var stoppedPropagation = false;\r
-\r
-function stopPropagation()\r
-{\r
-stoppedPropagation = true;\r
-}\r
-\r
-function preventDefault()\r
-{\r
-this.defaultPrevented = true;\r
-}\r
-\r
-var event = {target: this, type: eventType, data: eventData, defaultPrevented: false};\r
-event.stopPropagation = stopPropagation;\r
-event.preventDefault = preventDefault;\r
-\r
-var listeners = this._listeners[eventType].slice(0);\r
-for (var i = 0; i < listeners.length; ++i) {\r
-listeners[i].listener.call(listeners[i].thisObject, event);\r
-if (stoppedPropagation)\r
-break;\r
-}\r
-\r
-return event.defaultPrevented;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-var Preferences = {\r
-canEditScriptSource: false,\r
-maxInlineTextChildLength: 80,\r
-minConsoleHeight: 75,\r
-minSidebarWidth: 100,\r
-minElementsSidebarWidth: 200,\r
-minScriptsSidebarWidth: 200,\r
-styleRulesExpandedState: {},\r
-showMissingLocalizedStrings: false,\r
-samplingCPUProfiler: false,\r
-showColorNicknames: true,\r
-debuggerAlwaysEnabled: false,\r
-profilerAlwaysEnabled: false,\r
-onlineDetectionEnabled: true,\r
-nativeInstrumentationEnabled: false,\r
-resourceExportEnabled: false,\r
-fileSystemEnabled: false,\r
-useDataURLForResourceImageIcons: true,\r
-showTimingTab: false,\r
-showCookiesTab: false,\r
-debugMode: false\r
-}\r
-\r
-WebInspector.Settings = function()\r
-{\r
-this.installApplicationSetting("colorFormat", "hex");\r
-this.installApplicationSetting("consoleHistory", []);\r
-this.installApplicationSetting("eventListenersFilter", "all");\r
-this.installApplicationSetting("lastViewedScriptFile", "application");\r
-this.installApplicationSetting("resourcesLargeRows", true);\r
-this.installApplicationSetting("resourcesSortOptions", {timeOption: "responseTime", sizeOption: "transferSize"});\r
-this.installApplicationSetting("resourceViewTab", "content");\r
-this.installApplicationSetting("showInheritedComputedStyleProperties", false);\r
-this.installApplicationSetting("showUserAgentStyles", true);\r
-this.installApplicationSetting("watchExpressions", []);\r
-this.installApplicationSetting("lastActivePanel", "elements");\r
-\r
-this.installProjectSetting("breakpoints", {});\r
-this.installProjectSetting("nativeBreakpoints", []);\r
-}\r
-\r
-WebInspector.Settings.Events = {\r
-ProjectChanged: "project-changed"\r
-}\r
-\r
-WebInspector.Settings.prototype = {\r
-installApplicationSetting: function(key, defaultValue)\r
-{\r
-if (key in this)\r
-return;\r
-\r
-this.__defineGetter__(key, this._get.bind(this, key, defaultValue));\r
-this.__defineSetter__(key, this._set.bind(this, key));\r
-},\r
-\r
-installProjectSetting: function(key, defaultValue)\r
-{\r
-this.__defineGetter__(key, this._getProjectSetting.bind(this, key, defaultValue));\r
-this.__defineSetter__(key, this._setProjectSetting.bind(this, key));\r
-},\r
-\r
-inspectedURLChanged: function(url)\r
-{\r
-var fragmentIndex = url.indexOf("#");\r
-if (fragmentIndex !== -1)\r
-url = url.substring(0, fragmentIndex);\r
-this._projectId = url;\r
-this.dispatchEventToListeners(WebInspector.Settings.Events.ProjectChanged);\r
-},\r
-\r
-get projectId()\r
-{\r
-return this._projectId;\r
-},\r
-\r
-findSettingForAllProjects: function(key)\r
-{\r
-var result = {};\r
-var regexp = "^" + key + ":(.*)";\r
-for (var i = 0; i < window.localStorage.length; ++i) {\r
-var fullKey =  window.localStorage.key(i);\r
-var match = fullKey.match(regexp);\r
-if (!match)\r
-continue;\r
-try {\r
-result[match[1]] = JSON.parse(window.localStorage[fullKey]);\r
-} catch(e) {\r
-window.localStorage.removeItem(fullKey);\r
-}\r
-}\r
-return result;\r
-},\r
-\r
-_get: function(key, defaultValue)\r
-{\r
-if (key in window.localStorage) {\r
-try {\r
-return JSON.parse(window.localStorage[key]);\r
-} catch(e) {\r
-window.localStorage.removeItem(key);\r
-}\r
-}\r
-return defaultValue;\r
-},\r
-\r
-_set: function(key, value)\r
-{\r
-window.localStorage[key] = JSON.stringify(value);\r
-},\r
-\r
-_getProjectSetting: function(key, defaultValue)\r
-{\r
-return this._get(this._formatProjectKey(key), defaultValue);\r
-},\r
-\r
-_setProjectSetting: function(key, value)\r
-{\r
-return this._set(this._formatProjectKey(key), value);\r
-},\r
-\r
-_formatProjectKey: function(key)\r
-{\r
-return key + ":" + this._projectId;\r
-}\r
-}\r
-\r
-WebInspector.Settings.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.CSSStyleModel = function()\r
-{\r
-}\r
-\r
-WebInspector.CSSStyleModel.parseRuleArrayPayload = function(ruleArray)\r
-{\r
-var result = [];\r
-for (var i = 0; i < ruleArray.length; ++i)\r
-result.push(WebInspector.CSSRule.parsePayload(ruleArray[i]));\r
-return result;\r
-}\r
-\r
-WebInspector.CSSStyleModel.prototype = {\r
-getStylesAsync: function(nodeId, userCallback)\r
-{\r
-function callback(userCallback, payload)\r
-{\r
-if (!payload) {\r
-if (userCallback)\r
-userCallback(null);\r
-return;\r
-}\r
-\r
-var result = {};\r
-if ("inlineStyle" in payload)\r
-result.inlineStyle = WebInspector.CSSStyleDeclaration.parsePayload(payload.inlineStyle);\r
-\r
-result.computedStyle = WebInspector.CSSStyleDeclaration.parsePayload(payload.computedStyle);\r
-result.matchedCSSRules = WebInspector.CSSStyleModel.parseRuleArrayPayload(payload.matchedCSSRules);\r
-\r
-result.styleAttributes = {};\r
-for (var name in payload.styleAttributes)\r
-result.styleAttributes[name] = WebInspector.CSSStyleDeclaration.parsePayload(payload.styleAttributes[name]);\r
-\r
-result.pseudoElements = [];\r
-for (var i = 0; i < payload.pseudoElements.length; ++i) {\r
-var entryPayload = payload.pseudoElements[i];\r
-result.pseudoElements.push({ pseudoId: entryPayload.pseudoId, rules: WebInspector.CSSStyleModel.parseRuleArrayPayload(entryPayload.rules) });\r
-}\r
-\r
-result.inherited = [];\r
-for (var i = 0; i < payload.inherited.length; ++i) {\r
-var entryPayload = payload.inherited[i];\r
-var entry = {};\r
-if ("inlineStyle" in entryPayload)\r
-entry.inlineStyle = WebInspector.CSSStyleDeclaration.parsePayload(entryPayload.inlineStyle);\r
-if ("matchedCSSRules" in entryPayload)\r
-entry.matchedCSSRules = WebInspector.CSSStyleModel.parseRuleArrayPayload(entryPayload.matchedCSSRules);\r
-result.inherited.push(entry);\r
-}\r
-\r
-if (userCallback)\r
-userCallback(result);\r
-}\r
-\r
-InspectorBackend.getStylesForNode2(nodeId, callback.bind(null, userCallback));\r
-},\r
-\r
-getComputedStyleAsync: function(nodeId, userCallback)\r
-{\r
-function callback(userCallback, stylePayload)\r
-{\r
-if (!stylePayload)\r
-userCallback(null);\r
-else\r
-userCallback(WebInspector.CSSStyleDeclaration.parsePayload(stylePayload));\r
-}\r
-\r
-InspectorBackend.getComputedStyleForNode2(nodeId, callback.bind(null, userCallback));\r
-},\r
-\r
-getInlineStyleAsync: function(nodeId, userCallback)\r
-{\r
-function callback(userCallback, stylePayload)\r
-{\r
-if (!stylePayload)\r
-userCallback(null);\r
-else\r
-userCallback(WebInspector.CSSStyleDeclaration.parsePayload(stylePayload));\r
-}\r
-\r
-InspectorBackend.getInlineStyleForNode2(nodeId, callback.bind(null, userCallback));\r
-},\r
-\r
-setRuleSelector: function(ruleId, nodeId, newSelector, successCallback, failureCallback)\r
-{\r
-function checkAffectsCallback(nodeId, successCallback, rulePayload, selectedNodeIds)\r
-{\r
-var doesAffectSelectedNode = (selectedNodeIds.indexOf(nodeId) >= 0);\r
-var rule = WebInspector.CSSRule.parsePayload(rulePayload);\r
-successCallback(rule, doesAffectSelectedNode);\r
-this._styleSheetChanged(rule.id.styleSheetId, true);\r
-}\r
-\r
-function callback(nodeId, successCallback, failureCallback, newSelector, rulePayload)\r
-{\r
-if (!rulePayload)\r
-failureCallback();\r
-else\r
-InspectorBackend.querySelectorAll(nodeId, newSelector, checkAffectsCallback.bind(this, nodeId, successCallback, rulePayload));\r
-}\r
-\r
-InspectorBackend.setRuleSelector2(ruleId, newSelector, callback.bind(this, nodeId, successCallback, failureCallback));\r
-},\r
-\r
-addRule: function(nodeId, selector, successCallback, failureCallback)\r
-{\r
-function checkAffectsCallback(nodeId, successCallback, rulePayload, selectedNodeIds)\r
-{\r
-var doesAffectSelectedNode = (selectedNodeIds.indexOf(nodeId) >= 0);\r
-var rule = WebInspector.CSSRule.parsePayload(rulePayload);\r
-successCallback(rule, doesAffectSelectedNode);\r
-this._styleSheetChanged(rule.id.styleSheetId, true);\r
-}\r
-\r
-function callback(successCallback, failureCallback, selector, rulePayload)\r
-{\r
-if (!rulePayload) {\r
-\r
-failureCallback();\r
-} else\r
-InspectorBackend.querySelectorAll(nodeId, selector, checkAffectsCallback.bind(this, nodeId, successCallback, rulePayload));\r
-}\r
-\r
-InspectorBackend.addRule2(nodeId, selector, callback.bind(this, successCallback, failureCallback, selector));\r
-},\r
-\r
-_styleSheetChanged: function(styleSheetId, majorChange)\r
-{\r
-if (!majorChange || !styleSheetId)\r
-return;\r
-\r
-function callback(href, content)\r
-{\r
-var resource = WebInspector.resourceManager.resourceForURL(href);\r
-if (resource && resource.type === WebInspector.Resource.Type.Stylesheet)\r
-resource.setContent(content, this._onRevert.bind(this, styleSheetId));\r
-}\r
-InspectorBackend.getStyleSheetText2(styleSheetId, callback.bind(this));\r
-},\r
-\r
-_onRevert: function(styleSheetId, contentToRevertTo)\r
-{\r
-function callback(success)\r
-{\r
-this._styleSheetChanged(styleSheetId, true);\r
-this.dispatchEventToListeners("stylesheet changed");\r
-}\r
-InspectorBackend.setStyleSheetText2(styleSheetId, contentToRevertTo, callback.bind(this));\r
-}\r
-}\r
-\r
-WebInspector.CSSStyleModel.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-WebInspector.CSSStyleDeclaration = function(payload)\r
-{\r
-this.id = payload.styleId;\r
-this.properties = payload.properties;\r
-this._shorthandValues = payload.shorthandValues;\r
-this._livePropertyMap = {}; \r
-this._allProperties = []; \r
-this._longhandProperties = {}; \r
-this.__disabledProperties = {}; \r
-var payloadPropertyCount = payload.cssProperties.length;\r
-\r
-var propertyIndex = 0;\r
-for (var i = 0; i < payloadPropertyCount; ++i) {\r
-var property = new WebInspector.CSSProperty.parsePayload(this, i, payload.cssProperties[i]);\r
-this._allProperties.push(property);\r
-if (property.disabled)\r
-this.__disabledProperties[i] = property;\r
-if (!property.active && !property.styleBased)\r
-continue;\r
-var name = property.name;\r
-this[propertyIndex] = name;\r
-this._livePropertyMap[name] = property;\r
-\r
-\r
-if (property.shorthand) { \r
-var longhands = this._longhandProperties[property.shorthand];\r
-if (!longhands) {\r
-longhands = [];\r
-this._longhandProperties[property.shorthand] = longhands;\r
-}\r
-longhands.push(property);\r
-}\r
-++propertyIndex;\r
-}\r
-this.length = propertyIndex;\r
-if ("cssText" in payload)\r
-this.cssText = payload.cssText;\r
-}\r
-\r
-WebInspector.CSSStyleDeclaration.parsePayload = function(payload)\r
-{\r
-return new WebInspector.CSSStyleDeclaration(payload);\r
-}\r
-\r
-WebInspector.CSSStyleDeclaration.prototype = {\r
-get allProperties()\r
-{\r
-return this._allProperties;\r
-},\r
-\r
-getLiveProperty: function(name)\r
-{\r
-return this._livePropertyMap[name];\r
-},\r
-\r
-getPropertyValue: function(name)\r
-{\r
-var property = this._livePropertyMap[name];\r
-return property ? property.value : "";\r
-},\r
-\r
-getPropertyPriority: function(name)\r
-{\r
-var property = this._livePropertyMap[name];\r
-return property ? property.priority : "";\r
-},\r
-\r
-getPropertyShorthand: function(name)\r
-{\r
-var property = this._livePropertyMap[name];\r
-return property ? property.shorthand : "";\r
-},\r
-\r
-isPropertyImplicit: function(name)\r
-{\r
-var property = this._livePropertyMap[name];\r
-return property ? property.implicit : "";\r
-},\r
-\r
-styleTextWithShorthands: function()\r
-{\r
-var cssText = "";\r
-var foundProperties = {};\r
-for (var i = 0; i < this.length; ++i) {\r
-var individualProperty = this[i];\r
-var shorthandProperty = this.getPropertyShorthand(individualProperty);\r
-var propertyName = (shorthandProperty || individualProperty);\r
-\r
-if (propertyName in foundProperties)\r
-continue;\r
-\r
-if (shorthandProperty) {\r
-var value = this.getShorthandValue(shorthandProperty);\r
-var priority = this.getShorthandPriority(shorthandProperty);\r
-} else {\r
-var value = this.getPropertyValue(individualProperty);\r
-var priority = this.getPropertyPriority(individualProperty);\r
-}\r
-\r
-foundProperties[propertyName] = true;\r
-\r
-cssText += propertyName + ": " + value;\r
-if (priority)\r
-cssText += " !" + priority;\r
-cssText += "; ";\r
-}\r
-\r
-return cssText;\r
-},\r
-\r
-getLonghandProperties: function(name)\r
-{\r
-return this._longhandProperties[name] || [];\r
-},\r
-\r
-getShorthandValue: function(shorthandProperty)\r
-{\r
-var property = this.getLiveProperty(shorthandProperty);\r
-return property ? property.value : this._shorthandValues[shorthandProperty];\r
-},\r
-\r
-getShorthandPriority: function(shorthandProperty)\r
-{\r
-var priority = this.getPropertyPriority(shorthandProperty);\r
-if (priority)\r
-return priority;\r
-\r
-var longhands = this._longhandProperties[shorthandProperty];\r
-return longhands ? this.getPropertyPriority(longhands[0]) : null;\r
-},\r
-\r
-propertyAt: function(index)\r
-{\r
-return (index < this.allProperties.length) ? this.allProperties[index] : null;\r
-},\r
-\r
-pastLastSourcePropertyIndex: function()\r
-{\r
-for (var i = this.allProperties.length - 1; i >= 0; --i) {\r
-var property = this.allProperties[i];\r
-if (property.active || property.disabled)\r
-return i + 1;\r
-}\r
-return 0;\r
-},\r
-\r
-newBlankProperty: function()\r
-{\r
-return new WebInspector.CSSProperty(this, this.pastLastSourcePropertyIndex(), "", "", "", "active", true, false, false, "");\r
-},\r
-\r
-insertPropertyAt: function(index, name, value, userCallback)\r
-{\r
-function callback(userCallback, payload)\r
-{\r
-if (!userCallback)\r
-return;\r
-\r
-if (!payload)\r
-userCallback(null);\r
-else {\r
-userCallback(WebInspector.CSSStyleDeclaration.parsePayload(payload));\r
-WebInspector.cssModel._styleSheetChanged(this.id.styleSheetId, true);\r
-}\r
-}\r
-\r
-InspectorBackend.setPropertyText2(this.id, index, name + ": " + value + ";", false, callback.bind(null, userCallback));\r
-},\r
-\r
-appendProperty: function(name, value, userCallback)\r
-{\r
-this.insertPropertyAt(this.allProperties.length, name, value, userCallback);\r
-}\r
-}\r
-\r
-WebInspector.CSSRule = function(payload)\r
-{\r
-this.id = payload.ruleId;\r
-this.selectorText = payload.selectorText;\r
-this.sourceLine = payload.sourceLine;\r
-this.sourceURL = payload.sourceURL;\r
-this.origin = payload.origin;\r
-this.style = WebInspector.CSSStyleDeclaration.parsePayload(payload.style);\r
-this.style.parentRule = this;\r
-this.selectorRange = payload.selectorRange;\r
-}\r
-\r
-WebInspector.CSSRule.parsePayload = function(payload)\r
-{\r
-return new WebInspector.CSSRule(payload);\r
-}\r
-\r
-WebInspector.CSSRule.prototype = {\r
-get isUserAgent()\r
-{\r
-return this.origin === "user-agent";\r
-},\r
-\r
-get isUser()\r
-{\r
-return this.origin === "user";\r
-},\r
-\r
-get isViaInspector()\r
-{\r
-return this.origin === "inspector";\r
-},\r
-\r
-get isRegular()\r
-{\r
-return this.origin === "";\r
-}\r
-}\r
-\r
-WebInspector.CSSProperty = function(ownerStyle, index, name, value, priority, status, parsedOk, implicit, shorthand, text)\r
-{\r
-this.ownerStyle = ownerStyle;\r
-this.index = index;\r
-this.name = name;\r
-this.value = value;\r
-this.priority = priority;\r
-this.status = status;\r
-this.parsedOk = parsedOk;\r
-this.implicit = implicit;\r
-this.shorthand = shorthand;\r
-this.text = text;\r
-}\r
-\r
-WebInspector.CSSProperty.parsePayload = function(ownerStyle, index, payload)\r
-{\r
-var result = new WebInspector.CSSProperty(\r
-ownerStyle, index, payload.name, payload.value, payload.priority, payload.status, payload.parsedOk, payload.implicit, payload.shorthandName, payload.text);\r
-return result;\r
-}\r
-\r
-WebInspector.CSSProperty.prototype = {\r
-get propertyText()\r
-{\r
-if (this.text !== undefined)\r
-return this.text;\r
-\r
-if (this.name === "")\r
-return "";\r
-return this.name + ": " + this.value + (this.priority ? " !" + this.priority : "") + ";";\r
-},\r
-\r
-get isLive()\r
-{\r
-return this.active || this.styleBased;\r
-},\r
-\r
-get active()\r
-{\r
-return this.status === "active";\r
-},\r
-\r
-get styleBased()\r
-{\r
-return this.status === "style";\r
-},\r
-\r
-get inactive()\r
-{\r
-return this.status === "inactive";\r
-},\r
-\r
-get disabled()\r
-{\r
-return this.status === "disabled";\r
-},\r
-\r
-\r
-setText: function(propertyText, majorChange, userCallback)\r
-{\r
-function callback(stylePayload)\r
-{\r
-if (stylePayload)\r
-this.text = propertyText;\r
-\r
-if (!userCallback)\r
-return;\r
-if (!stylePayload)\r
-userCallback(null);\r
-else {\r
-var style = WebInspector.CSSStyleDeclaration.parsePayload(stylePayload);\r
-userCallback(style);\r
-WebInspector.cssModel._styleSheetChanged(style.id.styleSheetId, majorChange);\r
-}\r
-}\r
-\r
-if (!this.ownerStyle)\r
-throw "No ownerStyle for property";\r
-\r
-\r
-InspectorBackend.setPropertyText2(this.ownerStyle.id, this.index, propertyText, this.index < this.ownerStyle.pastLastSourcePropertyIndex(), callback.bind(this));\r
-},\r
-\r
-setValue: function(newValue, userCallback)\r
-{\r
-var text = this.name + ": " + newValue + (this.priority ? " !" + this.priority : "") + ";"\r
-this.setText(text, userCallback);\r
-},\r
-\r
-setDisabled: function(disabled, userCallback)\r
-{\r
-if (!this.ownerStyle && userCallback)\r
-userCallback(null);\r
-if (disabled === this.disabled && userCallback)\r
-userCallback(this.ownerStyle);\r
-\r
-function callback(stylePayload)\r
-{\r
-if (!userCallback)\r
-return;\r
-if (!stylePayload)\r
-userCallback(null);\r
-else {\r
-var style = WebInspector.CSSStyleDeclaration.parsePayload(stylePayload);\r
-userCallback(style);\r
-WebInspector.cssModel._styleSheetChanged(this.ownerStyle.id.styleSheetId, false);\r
-}\r
-}\r
-\r
-InspectorBackend.toggleProperty2(this.ownerStyle.id, this.index, disabled, callback.bind(this));\r
-}\r
-}\r
-\r
-WebInspector.CSSStyleSheet = function(payload)\r
-{\r
-this.id = payload.styleSheetId;\r
-this.sourceURL = payload.sourceURL;\r
-this.title = payload.title;\r
-this.disabled = payload.disabled;\r
-this.rules = [];\r
-this.styles = {};\r
-for (var i = 0; i < payload.rules.length; ++i) {\r
-var rule = WebInspector.CSSRule.parsePayload(payload.rules[i]);\r
-this.rules.push(rule);\r
-if (rule.style)\r
-this.styles[rule.style.id] = rule.style;\r
-}\r
-if ("text" in payload)\r
-this._text = payload.text;\r
-}\r
-\r
-WebInspector.CSSStyleSheet.createForId = function(styleSheetId, userCallback)\r
-{\r
-function callback(styleSheetPayload)\r
-{\r
-if (!styleSheetPayload)\r
-userCallback(null);\r
-else\r
-userCallback(new WebInspector.CSSStyleSheet(styleSheetPayload));\r
-}\r
-InspectorBackend.getStyleSheet2(styleSheetId, callback.bind(this));\r
-}\r
-\r
-WebInspector.CSSStyleSheet.prototype = {\r
-getText: function()\r
-{\r
-return this._text;\r
-},\r
-\r
-setText: function(newText, userCallback)\r
-{\r
-function callback(styleSheetPayload)\r
-{\r
-if (!styleSheetPayload)\r
-userCallback(null);\r
-else {\r
-userCallback(new WebInspector.CSSStyleSheet(styleSheetPayload));\r
-WebInspector.cssModel._styleSheetChanged(this.id, true);\r
-}\r
-}\r
-\r
-InspectorBackend.setStyleSheetText2(this.id, newText, callback.bind(this));\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Checkbox = function(label, className, tooltip)\r
-{\r
-this.element = document.createElement('label');\r
-this._inputElement = document.createElement('input');\r
-this._inputElement.type = "checkbox";\r
-\r
-this.element.className = className;\r
-this.element.appendChild(this._inputElement);\r
-this.element.appendChild(document.createTextNode(label));\r
-if (tooltip)\r
-this.element.title = tooltip;\r
-}\r
-\r
-WebInspector.Checkbox.prototype = {\r
-set checked(checked)\r
-{\r
-this._inputElement.checked = checked;\r
-},\r
-\r
-get checked()\r
-{\r
-return this._inputElement.checked;\r
-},\r
-\r
-addEventListener: function(listener)\r
-{\r
-function listenerWrapper(event)\r
-{\r
-if (listener)\r
-listener(event);\r
-event.stopPropagation();\r
-return true;\r
-}\r
-\r
-this._inputElement.addEventListener("click", listenerWrapper, false);\r
-this.element.addEventListener("click", listenerWrapper, false);\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ContextMenu = function() {\r
-this._items = [];\r
-this._handlers = {};\r
-}\r
-\r
-WebInspector.ContextMenu.prototype = {\r
-show: function(event)\r
-{\r
-\r
-while (this._items.length > 0 && !("id" in this._items[this._items.length - 1]))\r
-this._items.splice(this._items.length - 1, 1);\r
-\r
-if (this._items.length) {\r
-WebInspector._contextMenu = this;\r
-InspectorFrontendHost.showContextMenu(event, this._items);\r
-}\r
-},\r
-\r
-appendItem: function(label, handler, disabled)\r
-{\r
-var id = this._items.length;\r
-this._items.push({type: "item", id: id, label: label, enabled: !disabled});\r
-this._handlers[id] = handler;\r
-},\r
-\r
-appendCheckboxItem: function(label, handler, checked, disabled)\r
-{\r
-var id = this._items.length;\r
-this._items.push({type: "checkbox", id: id, label: label, checked: !!checked, enabled: !disabled});\r
-this._handlers[id] = handler;\r
-},\r
-\r
-appendSeparator: function()\r
-{\r
-\r
-if (this._items.length === 0)\r
-return;\r
-if (!("id" in this._items[this._items.length - 1]))\r
-return;\r
-this._items.push({type: "separator"});\r
-},\r
-\r
-_itemSelected: function(id)\r
-{\r
-if (this._handlers[id])\r
-this._handlers[id].call(this);\r
-}\r
-}\r
-\r
-WebInspector.contextMenuItemSelected = function(id)\r
-{\r
-if (WebInspector._contextMenu)\r
-WebInspector._contextMenu._itemSelected(id);\r
-}\r
-\r
-WebInspector.contextMenuCleared = function()\r
-{\r
-\r
-\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.KeyboardShortcut = function()\r
-{\r
-};\r
-\r
-\r
-WebInspector.KeyboardShortcut.Modifiers = {\r
-None: 0,   \r
-Shift: 1,\r
-Ctrl: 2,\r
-Alt: 4,\r
-Meta: 8,   \r
-get CtrlOrMeta()\r
-{\r
-\r
-return WebInspector.isMac() ? this.Meta : this.Ctrl;\r
-}\r
-};\r
-\r
-WebInspector.KeyboardShortcut.Keys = {\r
-Backspace: { code: 8, name: "\u21a4" },\r
-Tab: { code: 9, name: { mac: "\u21e5", other: "<Tab>" } },\r
-Enter: { code: 13, name: { mac: "\u21a9", other: "<Enter>" } },\r
-Esc: { code: 27, name: { mac: "\u238b", other: "<Esc>" } },\r
-Space: { code: 32, name: "<Space>" },\r
-PageUp: { code: 33,  name: { mac: "\u21de", other: "<PageUp>" } },      \r
-PageDown: { code: 34, name: { mac: "\u21df", other: "<PageDown>" } },   \r
-End: { code: 35, name: { mac: "\u2197", other: "<End>" } },             \r
-Home: { code: 36, name: { mac: "\u2196", other: "<Home>" } },           \r
-Left: { code: 37, name: "\u2190" },           \r
-Up: { code: 38, name: "\u2191" },             \r
-Right: { code: 39, name: "\u2192" },          \r
-Down: { code: 40, name: "\u2193" },           \r
-Delete: { code: 46, name: "<Del>" },\r
-Zero: { code: 48, name: "0" },\r
-F1: { code: 112, name: "F1" },\r
-F2: { code: 113, name: "F2" },\r
-F3: { code: 114, name: "F3" },\r
-F4: { code: 115, name: "F4" },\r
-F5: { code: 116, name: "F5" },\r
-F6: { code: 117, name: "F6" },\r
-F7: { code: 118, name: "F7" },\r
-F8: { code: 119, name: "F8" },\r
-F9: { code: 120, name: "F9" },\r
-F10: { code: 121, name: "F10" },\r
-F11: { code: 122, name: "F11" },\r
-F12: { code: 123, name: "F12" },\r
-Semicolon: { code: 186, name: ";" },\r
-Plus: { code: 187, name: "+" },\r
-Comma: { code: 188, name: "," },\r
-Minus: { code: 189, name: "-" },\r
-Period: { code: 190, name: "." },\r
-Slash: { code: 191, name: "/" },\r
-Apostrophe: { code: 192, name: "`" },\r
-SingleQuote: { code: 222, name: "\'" }\r
-};\r
-\r
-\r
-WebInspector.KeyboardShortcut.makeKey = function(keyCode, optModifiers)\r
-{\r
-if (typeof keyCode === "string")\r
-keyCode = keyCode.charCodeAt(0) - 32;\r
-var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;\r
-for (var i = 1; i < arguments.length; i++)\r
-modifiers |= arguments[i];\r
-return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);\r
-};\r
-\r
-WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent)\r
-{\r
-var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;\r
-if (keyboardEvent.shiftKey)\r
-modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;\r
-if (keyboardEvent.ctrlKey)\r
-modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl;\r
-if (keyboardEvent.altKey)\r
-modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt;\r
-if (keyboardEvent.metaKey)\r
-modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta;\r
-return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyboardEvent.keyCode, modifiers);\r
-};\r
-\r
-WebInspector.KeyboardShortcut.makeDescriptor = function(key, optModifiers)\r
-{\r
-var modifiers = 0;\r
-for (var i = 1; i < arguments.length; i++)\r
-modifiers |= arguments[i];\r
-\r
-return {\r
-key: WebInspector.KeyboardShortcut.makeKey(typeof key === "string" ? key : key.code, modifiers),\r
-name: WebInspector.KeyboardShortcut.shortcutToString(key, modifiers)\r
-};\r
-}\r
-\r
-WebInspector.KeyboardShortcut.shortcutToString = function(key, modifiers)\r
-{\r
-return WebInspector.KeyboardShortcut._modifiersToString(modifiers) + WebInspector.KeyboardShortcut._keyName(key);\r
-}\r
-\r
-WebInspector.KeyboardShortcut._keyName = function(key)\r
-{\r
-if (typeof key === "string")\r
-return key.toUpperCase();\r
-if (typeof key.name === "string")\r
-return key.name;\r
-return key.name[WebInspector.platform] || key.name.other;\r
-}\r
-\r
-WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers)\r
-{\r
-return (keyCode & 255) | (modifiers << 8);\r
-};\r
-\r
-WebInspector.KeyboardShortcut._modifiersToString = function(modifiers)\r
-{\r
-const cmdKey = "\u2318";\r
-const optKey = "\u2325";\r
-const shiftKey = "\u21e7";\r
-const ctrlKey = "\u2303";\r
-\r
-var isMac = WebInspector.isMac();\r
-var res = "";\r
-if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Ctrl)\r
-res += isMac ? ctrlKey : "<Ctrl> + ";\r
-if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Alt)\r
-res += isMac ? optKey : "<Alt> + ";\r
-if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Shift)\r
-res += isMac ? shiftKey : "<Shift> + ";\r
-if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Meta)\r
-res += isMac ? cmdKey : "<Win> + ";\r
-\r
-return res;\r
-};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TextPrompt = function(element, completions, stopCharacters)\r
-{\r
-this.element = element;\r
-this.element.addStyleClass("text-prompt");\r
-this.completions = completions;\r
-this.completionStopCharacters = stopCharacters;\r
-this.history = [];\r
-this.historyOffset = 0;\r
-this.element.addEventListener("keydown", this._onKeyDown.bind(this), true);\r
-}\r
-\r
-WebInspector.TextPrompt.prototype = {\r
-get text()\r
-{\r
-return this.element.textContent;\r
-},\r
-\r
-set text(x)\r
-{\r
-if (!x) {\r
-\r
-this.element.removeChildren();\r
-this.element.appendChild(document.createElement("br"));\r
-} else\r
-this.element.textContent = x;\r
-\r
-this.moveCaretToEndOfPrompt();\r
-},\r
-\r
-_onKeyDown: function(event)\r
-{\r
-function defaultAction()\r
-{\r
-this.clearAutoComplete();\r
-this.autoCompleteSoon();\r
-}\r
-\r
-var handled = false;\r
-switch (event.keyIdentifier) {\r
-case "Up":\r
-this._upKeyPressed(event);\r
-break;\r
-case "Down":\r
-this._downKeyPressed(event);\r
-break;\r
-case "U+0009": \r
-this._tabKeyPressed(event);\r
-break;\r
-case "Right":\r
-case "End":\r
-if (!this.acceptAutoComplete())\r
-this.autoCompleteSoon();\r
-break;\r
-case "Alt":\r
-case "Meta":\r
-case "Shift":\r
-case "Control":\r
-break;\r
-case "U+0050": \r
-if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {\r
-handled = true;\r
-this._moveBackInHistory();\r
-break;\r
-}\r
-defaultAction.call(this);\r
-break;\r
-case "U+004E": \r
-if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {\r
-handled = true;\r
-this._moveForwardInHistory();\r
-break;\r
-}\r
-defaultAction.call(this);\r
-break;\r
-default:\r
-defaultAction.call(this);\r
-break;\r
-}\r
-\r
-if (handled) {\r
-event.preventDefault();\r
-event.stopPropagation();\r
-}\r
-},\r
-\r
-acceptAutoComplete: function()\r
-{\r
-if (!this.autoCompleteElement || !this.autoCompleteElement.parentNode)\r
-return false;\r
-\r
-var text = this.autoCompleteElement.textContent;\r
-var textNode = document.createTextNode(text);\r
-this.autoCompleteElement.parentNode.replaceChild(textNode, this.autoCompleteElement);\r
-delete this.autoCompleteElement;\r
-\r
-var finalSelectionRange = document.createRange();\r
-finalSelectionRange.setStart(textNode, text.length);\r
-finalSelectionRange.setEnd(textNode, text.length);\r
-\r
-var selection = window.getSelection();\r
-selection.removeAllRanges();\r
-selection.addRange(finalSelectionRange);\r
-\r
-return true;\r
-},\r
-\r
-clearAutoComplete: function(includeTimeout)\r
-{\r
-if (includeTimeout && "_completeTimeout" in this) {\r
-clearTimeout(this._completeTimeout);\r
-delete this._completeTimeout;\r
-}\r
-\r
-if (!this.autoCompleteElement)\r
-return;\r
-\r
-if (this.autoCompleteElement.parentNode)\r
-this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);\r
-delete this.autoCompleteElement;\r
-\r
-if (!this._userEnteredRange || !this._userEnteredText)\r
-return;\r
-\r
-this._userEnteredRange.deleteContents();\r
-this.element.pruneEmptyTextNodes();\r
-\r
-var userTextNode = document.createTextNode(this._userEnteredText);\r
-this._userEnteredRange.insertNode(userTextNode);\r
-\r
-var selectionRange = document.createRange();\r
-selectionRange.setStart(userTextNode, this._userEnteredText.length);\r
-selectionRange.setEnd(userTextNode, this._userEnteredText.length);\r
-\r
-var selection = window.getSelection();\r
-selection.removeAllRanges();\r
-selection.addRange(selectionRange);\r
-\r
-delete this._userEnteredRange;\r
-delete this._userEnteredText;\r
-},\r
-\r
-autoCompleteSoon: function()\r
-{\r
-if (!("_completeTimeout" in this))\r
-this._completeTimeout = setTimeout(this.complete.bind(this, true), 250);\r
-},\r
-\r
-complete: function(auto, reverse)\r
-{\r
-this.clearAutoComplete(true);\r
-var selection = window.getSelection();\r
-if (!selection.rangeCount)\r
-return;\r
-\r
-var selectionRange = selection.getRangeAt(0);\r
-if (!selectionRange.commonAncestorContainer.isDescendant(this.element))\r
-return;\r
-if (auto && !this.isCaretAtEndOfPrompt())\r
-return;\r
-var wordPrefixRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, this.completionStopCharacters, this.element, "backward");\r
-this.completions(wordPrefixRange, auto, this._completionsReady.bind(this, selection, auto, wordPrefixRange, reverse));\r
-},\r
-\r
-_completionsReady: function(selection, auto, originalWordPrefixRange, reverse, completions)\r
-{\r
-if (!completions || !completions.length)\r
-return;\r
-\r
-var selectionRange = selection.getRangeAt(0);\r
-\r
-var fullWordRange = document.createRange();\r
-fullWordRange.setStart(originalWordPrefixRange.startContainer, originalWordPrefixRange.startOffset);\r
-fullWordRange.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r
-\r
-if (originalWordPrefixRange.toString() + selectionRange.toString() != fullWordRange.toString())\r
-return;\r
-\r
-var wordPrefixLength = originalWordPrefixRange.toString().length;\r
-\r
-if (auto)\r
-var completionText = completions[0];\r
-else {\r
-if (completions.length === 1) {\r
-var completionText = completions[0];\r
-wordPrefixLength = completionText.length;\r
-} else {\r
-var commonPrefix = completions[0];\r
-for (var i = 0; i < completions.length; ++i) {\r
-var completion = completions[i];\r
-var lastIndex = Math.min(commonPrefix.length, completion.length);\r
-for (var j = wordPrefixLength; j < lastIndex; ++j) {\r
-if (commonPrefix[j] !== completion[j]) {\r
-commonPrefix = commonPrefix.substr(0, j);\r
-break;\r
-}\r
-}\r
-}\r
-wordPrefixLength = commonPrefix.length;\r
-\r
-if (selection.isCollapsed)\r
-var completionText = completions[0];\r
-else {\r
-var currentText = fullWordRange.toString();\r
-\r
-var foundIndex = null;\r
-for (var i = 0; i < completions.length; ++i) {\r
-if (completions[i] === currentText)\r
-foundIndex = i;\r
-}\r
-\r
-var nextIndex = foundIndex + (reverse ? -1 : 1);\r
-if (foundIndex === null || nextIndex >= completions.length)\r
-var completionText = completions[0];\r
-else if (nextIndex < 0)\r
-var completionText = completions[completions.length - 1];\r
-else\r
-var completionText = completions[nextIndex];\r
-}\r
-}\r
-}\r
-\r
-this._userEnteredRange = fullWordRange;\r
-this._userEnteredText = fullWordRange.toString();\r
-\r
-fullWordRange.deleteContents();\r
-this.element.pruneEmptyTextNodes();\r
-\r
-var finalSelectionRange = document.createRange();\r
-\r
-if (auto) {\r
-var prefixText = completionText.substring(0, wordPrefixLength);\r
-var suffixText = completionText.substring(wordPrefixLength);\r
-\r
-var prefixTextNode = document.createTextNode(prefixText);\r
-fullWordRange.insertNode(prefixTextNode);\r
-\r
-this.autoCompleteElement = document.createElement("span");\r
-this.autoCompleteElement.className = "auto-complete-text";\r
-this.autoCompleteElement.textContent = suffixText;\r
-\r
-prefixTextNode.parentNode.insertBefore(this.autoCompleteElement, prefixTextNode.nextSibling);\r
-\r
-finalSelectionRange.setStart(prefixTextNode, wordPrefixLength);\r
-finalSelectionRange.setEnd(prefixTextNode, wordPrefixLength);\r
-} else {\r
-var completionTextNode = document.createTextNode(completionText);\r
-fullWordRange.insertNode(completionTextNode);\r
-\r
-if (completions.length > 1)\r
-finalSelectionRange.setStart(completionTextNode, wordPrefixLength);\r
-else\r
-finalSelectionRange.setStart(completionTextNode, completionText.length);\r
-\r
-finalSelectionRange.setEnd(completionTextNode, completionText.length);\r
-}\r
-\r
-selection.removeAllRanges();\r
-selection.addRange(finalSelectionRange);\r
-},\r
-\r
-isCaretInsidePrompt: function()\r
-{\r
-return this.element.isInsertionCaretInside();\r
-},\r
-\r
-isCaretAtEndOfPrompt: function()\r
-{\r
-var selection = window.getSelection();\r
-if (!selection.rangeCount || !selection.isCollapsed)\r
-return false;\r
-\r
-var selectionRange = selection.getRangeAt(0);\r
-var node = selectionRange.startContainer;\r
-if (node !== this.element && !node.isDescendant(this.element))\r
-return false;\r
-\r
-if (node.nodeType === Node.TEXT_NODE && selectionRange.startOffset < node.nodeValue.length)\r
-return false;\r
-\r
-var foundNextText = false;\r
-while (node) {\r
-if (node.nodeType === Node.TEXT_NODE && node.nodeValue.length) {\r
-if (foundNextText)\r
-return false;\r
-foundNextText = true;\r
-}\r
-\r
-node = node.traverseNextNode(this.element);\r
-}\r
-\r
-return true;\r
-},\r
-\r
-isCaretOnFirstLine: function()\r
-{\r
-var selection = window.getSelection();\r
-var focusNode = selection.focusNode;\r
-if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)\r
-return true;\r
-\r
-if (focusNode.textContent.substring(0, selection.focusOffset).indexOf("\n") !== -1)\r
-return false;\r
-focusNode = focusNode.previousSibling;\r
-\r
-while (focusNode) {\r
-if (focusNode.nodeType !== Node.TEXT_NODE)\r
-return true;\r
-if (focusNode.textContent.indexOf("\n") !== -1)\r
-return false;\r
-focusNode = focusNode.previousSibling;\r
-}\r
-\r
-return true;\r
-},\r
-\r
-isCaretOnLastLine: function()\r
-{\r
-var selection = window.getSelection();\r
-var focusNode = selection.focusNode;\r
-if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this.element)\r
-return true;\r
-\r
-if (focusNode.textContent.substring(selection.focusOffset).indexOf("\n") !== -1)\r
-return false;\r
-focusNode = focusNode.nextSibling;\r
-\r
-while (focusNode) {\r
-if (focusNode.nodeType !== Node.TEXT_NODE)\r
-return true;\r
-if (focusNode.textContent.indexOf("\n") !== -1)\r
-return false;\r
-focusNode = focusNode.nextSibling;\r
-}\r
-\r
-return true;\r
-},\r
-\r
-moveCaretToEndOfPrompt: function()\r
-{\r
-var selection = window.getSelection();\r
-var selectionRange = document.createRange();\r
-\r
-var offset = this.element.childNodes.length;\r
-selectionRange.setStart(this.element, offset);\r
-selectionRange.setEnd(this.element, offset);\r
-\r
-selection.removeAllRanges();\r
-selection.addRange(selectionRange);\r
-},\r
-\r
-_tabKeyPressed: function(event)\r
-{\r
-event.preventDefault();\r
-event.stopPropagation();\r
-\r
-this.complete(false, event.shiftKey);\r
-},\r
-\r
-_upKeyPressed: function(event)\r
-{\r
-if (!this.isCaretOnFirstLine())\r
-return;\r
-\r
-event.preventDefault();\r
-event.stopPropagation();\r
-\r
-this._moveBackInHistory();\r
-},\r
-\r
-_downKeyPressed: function(event)\r
-{\r
-if (!this.isCaretOnLastLine())\r
-return;\r
-\r
-event.preventDefault();\r
-event.stopPropagation();\r
-\r
-this._moveForwardInHistory();\r
-},\r
-\r
-_moveBackInHistory: function()\r
-{\r
-if (this.historyOffset == this.history.length)\r
-return;\r
-\r
-this.clearAutoComplete(true);\r
-\r
-if (this.historyOffset === 0)\r
-this.tempSavedCommand = this.text;\r
-\r
-++this.historyOffset;\r
-this.text = this.history[this.history.length - this.historyOffset];\r
-\r
-this.element.scrollIntoView(true);\r
-var firstNewlineIndex = this.text.indexOf("\n");\r
-if (firstNewlineIndex === -1)\r
-this.moveCaretToEndOfPrompt();\r
-else {\r
-var selection = window.getSelection();\r
-var selectionRange = document.createRange();\r
-\r
-selectionRange.setStart(this.element.firstChild, firstNewlineIndex);\r
-selectionRange.setEnd(this.element.firstChild, firstNewlineIndex);\r
-\r
-selection.removeAllRanges();\r
-selection.addRange(selectionRange);\r
-}\r
-},\r
-\r
-_moveForwardInHistory: function()\r
-{\r
-if (this.historyOffset === 0)\r
-return;\r
-\r
-this.clearAutoComplete(true);\r
-\r
---this.historyOffset;\r
-\r
-if (this.historyOffset === 0) {\r
-this.text = this.tempSavedCommand;\r
-delete this.tempSavedCommand;\r
-return;\r
-}\r
-\r
-this.text = this.history[this.history.length - this.historyOffset];\r
-this.element.scrollIntoView();\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Popover = function(contentElement)\r
-{\r
-this.element = document.createElement("div");\r
-this.element.className = "popover";\r
-\r
-this._popupArrowElement = document.createElement("div");\r
-this._popupArrowElement.className = "arrow";\r
-this.element.appendChild(this._popupArrowElement);\r
-\r
-this.contentElement = contentElement;\r
-this._contentDiv = document.createElement("div");\r
-this._contentDiv.className = "content";\r
-}\r
-\r
-WebInspector.Popover.prototype = {\r
-show: function(anchor, preferredWidth, preferredHeight)\r
-{\r
-\r
-if (WebInspector.Popover._popoverElement)\r
-document.body.removeChild(WebInspector.Popover._popoverElement);\r
-WebInspector.Popover._popoverElement = this.element;\r
-\r
-\r
-this.contentElement.positionAt(0, 0);\r
-document.body.appendChild(this.contentElement);\r
-var preferredWidth = preferredWidth || this.contentElement.offsetWidth;\r
-var preferredHeight = preferredHeight || this.contentElement.offsetHeight;\r
-\r
-this._contentDiv.appendChild(this.contentElement);\r
-this.element.appendChild(this._contentDiv);\r
-document.body.appendChild(this.element);\r
-this._positionElement(anchor, preferredWidth, preferredHeight);\r
-},\r
-\r
-hide: function()\r
-{\r
-if (WebInspector.Popover._popoverElement) {\r
-delete WebInspector.Popover._popoverElement;\r
-document.body.removeChild(this.element);\r
-}\r
-},\r
-\r
-_positionElement: function(anchorElement, preferredWidth, preferredHeight)\r
-{\r
-const borderWidth = 25;\r
-const scrollerWidth = 11;\r
-const arrowHeight = 15;\r
-const arrowOffset = 10;\r
-const borderRadius = 10;\r
-\r
-\r
-preferredWidth = Math.max(preferredWidth, 50);\r
-const totalWidth = window.innerWidth;\r
-const totalHeight = window.innerHeight;\r
-\r
-var anchorBox = {x: anchorElement.totalOffsetLeft, y: anchorElement.totalOffsetTop, width: anchorElement.offsetWidth, height: anchorElement.offsetHeight};\r
-while (anchorElement !== document.body) {\r
-if (anchorElement.scrollLeft)\r
-anchorBox.x -= anchorElement.scrollLeft;\r
-if (anchorElement.scrollTop)\r
-anchorBox.y -= anchorElement.scrollTop;\r
-anchorElement = anchorElement.parentElement;\r
-}\r
-\r
-var newElementPosition = { x: 0, y: 0, width: preferredWidth + scrollerWidth, height: preferredHeight };\r
-\r
-var verticalAlignment;\r
-var roomAbove = anchorBox.y;\r
-var roomBelow = totalHeight - anchorBox.y - anchorBox.height;\r
-\r
-if (roomAbove > roomBelow) {\r
-\r
-if (anchorBox.y > newElementPosition.height + arrowHeight + borderRadius)\r
-newElementPosition.y = anchorBox.y - newElementPosition.height - arrowHeight;\r
-else {\r
-newElementPosition.y = borderRadius * 2;\r
-newElementPosition.height = anchorBox.y - borderRadius * 2 - arrowHeight;\r
-}\r
-verticalAlignment = "bottom";\r
-} else {\r
-\r
-newElementPosition.y = anchorBox.y + anchorBox.height + arrowHeight;\r
-if (newElementPosition.y + newElementPosition.height + arrowHeight - borderWidth >= totalHeight)\r
-newElementPosition.height = totalHeight - anchorBox.y - anchorBox.height - borderRadius * 2 - arrowHeight;\r
-\r
-verticalAlignment = "top";\r
-}\r
-\r
-var horizontalAlignment;\r
-if (anchorBox.x + newElementPosition.width < totalWidth) {\r
-newElementPosition.x = Math.max(borderRadius, anchorBox.x - borderRadius - arrowOffset);\r
-horizontalAlignment = "left";\r
-} else if (newElementPosition.width + borderRadius * 2 < totalWidth) {\r
-newElementPosition.x = totalWidth - newElementPosition.width - borderRadius;\r
-horizontalAlignment = "right";\r
-\r
-var arrowRightPosition = Math.max(0, totalWidth - anchorBox.x - anchorBox.width - borderRadius - arrowOffset);\r
-arrowRightPosition += anchorBox.width / 2;\r
-this._popupArrowElement.style.right = arrowRightPosition + "px";\r
-} else {\r
-newElementPosition.x = borderRadius;\r
-newElementPosition.width = totalWidth - borderRadius * 2;\r
-newElementPosition.height += scrollerWidth;\r
-horizontalAlignment = "left";\r
-if (verticalAlignment === "bottom")\r
-newElementPosition.y -= scrollerWidth;\r
-\r
-this._popupArrowElement.style.left = Math.max(0, anchorBox.x - borderRadius * 2 - arrowOffset) + "px";\r
-this._popupArrowElement.style.left += anchorBox.width / 2;\r
-}\r
-\r
-this.element.className = "popover " + verticalAlignment + "-" + horizontalAlignment + "-arrow";\r
-this.element.positionAt(newElementPosition.x - borderWidth, newElementPosition.y - borderWidth);\r
-this.element.style.width = newElementPosition.width + borderWidth * 2 + "px";\r
-this.element.style.height = newElementPosition.height + borderWidth * 2 + "px";\r
-}\r
-}\r
-\r
-WebInspector.PopoverHelper = function(panelElement, getAnchor, showPopup, showOnClick, onHide)\r
-{\r
-this._panelElement = panelElement;\r
-this._getAnchor = getAnchor;\r
-this._showPopup = showPopup;\r
-this._showOnClick = showOnClick;\r
-this._onHide = onHide;\r
-panelElement.addEventListener("mousedown", this._mouseDown.bind(this), false);\r
-panelElement.addEventListener("mousemove", this._mouseMove.bind(this), false);\r
-this.setTimeout(1000);\r
-}\r
-\r
-WebInspector.PopoverHelper.prototype = {\r
-setTimeout: function(timeout)\r
-{\r
-this._timeout = timeout;\r
-},\r
-\r
-_mouseDown: function(event)\r
-{\r
-this._killHidePopupTimer();\r
-this._handleMouseAction(event, true);\r
-},\r
-\r
-_mouseMove: function(event)\r
-{\r
-\r
-if (this._hoverElement === event.target || (this._hoverElement && this._hoverElement.isAncestor(event.target)))\r
-return;\r
-\r
-\r
-if (this._popup && !this._hidePopupTimer) {\r
-var self = this;\r
-function doHide()\r
-{\r
-self._hidePopup();\r
-delete self._hidePopupTimer;\r
-}\r
-this._hidePopupTimer = setTimeout(doHide, this._timeout / 2);\r
-}\r
-\r
-this._handleMouseAction(event);\r
-},\r
-\r
-_handleMouseAction: function(event, isMouseDown)\r
-{\r
-this._resetHoverTimer();\r
-\r
-this._hoverElement = this._getAnchor(event.target);\r
-if (!this._hoverElement)\r
-return;\r
-\r
-const toolTipDelay = isMouseDown ? 0 : (this._popup ? this._timeout * 0.6 : this._timeout);\r
-this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);\r
-},\r
-\r
-_resetHoverTimer: function()\r
-{\r
-if (this._hoverTimer) {\r
-clearTimeout(this._hoverTimer);\r
-delete this._hoverTimer;\r
-}\r
-},\r
-\r
-hidePopup: function()\r
-{\r
-this._resetHoverTimer();\r
-this._hidePopup();\r
-},\r
-\r
-_hidePopup: function()\r
-{\r
-if (!this._popup)\r
-return;\r
-\r
-if (this._onHide)\r
-this._onHide();\r
-\r
-this._popup.hide();\r
-delete this._popup;\r
-},\r
-\r
-_mouseHover: function(element)\r
-{\r
-delete this._hoverTimer;\r
-\r
-this._popup = this._showPopup(element);\r
-if (this._popup)\r
-this._popup.contentElement.addEventListener("mousemove", this._killHidePopupTimer.bind(this), true);\r
-},\r
-\r
-_killHidePopupTimer: function()\r
-{\r
-if (this._hidePopupTimer) {\r
-clearTimeout(this._hidePopupTimer);\r
-delete this._hidePopupTimer;\r
-\r
-\r
-\r
-this._resetHoverTimer();\r
-}\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TabbedPane = function(element)\r
-{\r
-this.element = element || document.createElement("div");\r
-this.element.addStyleClass("tabbed-pane");\r
-this._tabsElement = this.element.createChild("div", "tabbed-pane-header");\r
-this._contentElement = this.element.createChild("div", "tabbed-pane-content");\r
-this._tabs = {};\r
-}\r
-\r
-WebInspector.TabbedPane.prototype = {\r
-appendTab: function(id, tabTitle, view)\r
-{\r
-var tabElement = document.createElement("li");\r
-tabElement.textContent = tabTitle;\r
-tabElement.addEventListener("click", this.selectTab.bind(this, id, true), false);\r
-\r
-this._tabsElement.appendChild(tabElement);\r
-this._contentElement.appendChild(view.element);\r
-\r
-this._tabs[id] = { tabElement: tabElement, view: view }\r
-},\r
-\r
-selectTab: function(id, userGesture)\r
-{\r
-if (!(id in this._tabs))\r
-return false;\r
-\r
-if (this._currentTab) {\r
-this._hideTab(this._currentTab)\r
-delete this._currentTab;\r
-}\r
-\r
-var tab = this._tabs[id];\r
-this._showTab(tab);\r
-this._currentTab = tab;\r
-if (userGesture) {\r
-var event = {tabId: id};\r
-this.dispatchEventToListeners("tab-selected", event);\r
-}\r
-return true;\r
-},\r
-\r
-_showTab: function(tab)\r
-{\r
-tab.tabElement.addStyleClass("selected");\r
-tab.view.show(this._contentElement);\r
-},\r
-\r
-_hideTab: function(tab)\r
-{\r
-tab.tabElement.removeStyleClass("selected");\r
-tab.view.visible = false;\r
-}\r
-}\r
-\r
-WebInspector.TabbedPane.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Placard = function(title, subtitle)\r
-{\r
-this.element = document.createElement("div");\r
-this.element.className = "placard";\r
-this.element.placard = this;\r
-\r
-this.titleElement = document.createElement("div");\r
-this.titleElement.className = "title";\r
-\r
-this.subtitleElement = document.createElement("div");\r
-this.subtitleElement.className = "subtitle";\r
-\r
-this.element.appendChild(this.subtitleElement);\r
-this.element.appendChild(this.titleElement);\r
-\r
-this.title = title;\r
-this.subtitle = subtitle;\r
-this.selected = false;\r
-}\r
-\r
-WebInspector.Placard.prototype = {\r
-get title()\r
-{\r
-return this._title;\r
-},\r
-\r
-set title(x)\r
-{\r
-if (this._title === x)\r
-return;\r
-this._title = x;\r
-this.titleElement.textContent = x;\r
-},\r
-\r
-get subtitle()\r
-{\r
-return this._subtitle;\r
-},\r
-\r
-set subtitle(x)\r
-{\r
-if (this._subtitle === x)\r
-return;\r
-this._subtitle = x;\r
-this.subtitleElement.textContent = x;\r
-},\r
-\r
-get selected()\r
-{\r
-return this._selected;\r
-},\r
-\r
-set selected(x)\r
-{\r
-if (x)\r
-this.select();\r
-else\r
-this.deselect();\r
-},\r
-\r
-select: function()\r
-{\r
-if (this._selected)\r
-return;\r
-this._selected = true;\r
-this.element.addStyleClass("selected");\r
-},\r
-\r
-deselect: function()\r
-{\r
-if (!this._selected)\r
-return;\r
-this._selected = false;\r
-this.element.removeStyleClass("selected");\r
-},\r
-\r
-toggleSelected: function()\r
-{\r
-this.selected = !this.selected;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.View = function(element)\r
-{\r
-this.element = element || document.createElement("div");\r
-this._visible = false;\r
-}\r
-\r
-WebInspector.View.prototype = {\r
-get visible()\r
-{\r
-return this._visible;\r
-},\r
-\r
-set visible(x)\r
-{\r
-if (this._visible === x)\r
-return;\r
-\r
-if (x)\r
-this.show();\r
-else\r
-this.hide();\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-this._visible = true;\r
-if (parentElement && parentElement !== this.element.parentNode) {\r
-this.detach();\r
-parentElement.appendChild(this.element);\r
-}\r
-if (!this.element.parentNode && this.attach)\r
-this.attach();\r
-this.element.addStyleClass("visible");\r
-},\r
-\r
-hide: function()\r
-{\r
-this.element.removeStyleClass("visible");\r
-this._visible = false;\r
-},\r
-\r
-detach: function()\r
-{\r
-if (this.element.parentNode)\r
-this.element.parentNode.removeChild(this.element);\r
-}\r
-}\r
-\r
-WebInspector.View.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Drawer = function()\r
-{\r
-WebInspector.View.call(this, document.getElementById("drawer"));\r
-\r
-this._savedHeight = 200; \r
-this.state = WebInspector.Drawer.State.Hidden;\r
-this.fullPanel = false;\r
-\r
-this.mainElement = document.getElementById("main");\r
-this.toolbarElement = document.getElementById("toolbar");\r
-this.mainStatusBar = document.getElementById("main-status-bar");\r
-this.mainStatusBar.addEventListener("mousedown", this._startStatusBarDragging.bind(this), true);\r
-this.viewStatusBar = document.getElementById("other-drawer-status-bar-items");\r
-this._counters = document.getElementById("counters");\r
-this._drawerStatusBar = document.getElementById("drawer-status-bar");\r
-}\r
-\r
-WebInspector.Drawer.prototype = {\r
-get visibleView()\r
-{\r
-return this._visibleView;\r
-},\r
-\r
-set visibleView(x)\r
-{\r
-if (this._visibleView === x) {\r
-if (this.visible && this.fullPanel)\r
-return;\r
-this.visible = !this.visible;\r
-return;\r
-}\r
-\r
-var firstTime = !this._visibleView;\r
-if (this._visibleView)\r
-this._visibleView.hide();\r
-\r
-this._visibleView = x;\r
-\r
-if (x && !firstTime) {\r
-this._safelyRemoveChildren();\r
-this.viewStatusBar.removeChildren(); \r
-x.attach(this.element, this.viewStatusBar);\r
-x.show();\r
-this.visible = true;\r
-}\r
-},\r
-\r
-get savedHeight()\r
-{\r
-var height = this._savedHeight || this.element.offsetHeight;\r
-return Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this.mainElement.totalOffsetTop - Preferences.minConsoleHeight);\r
-},\r
-\r
-showView: function(view)\r
-{\r
-if (!this.visible || this.visibleView !== view)\r
-this.visibleView = view;\r
-},\r
-\r
-show: function()\r
-{\r
-if (this._animating || this.visible)\r
-return;\r
-\r
-if (this.visibleView)\r
-this.visibleView.show();\r
-\r
-WebInspector.View.prototype.show.call(this);\r
-\r
-this._animating = true;\r
-\r
-document.body.addStyleClass("drawer-visible");\r
-\r
-var anchoredItems = document.getElementById("anchored-status-bar-items");\r
-var height = (this.fullPanel ? window.innerHeight - this.toolbarElement.offsetHeight : this.savedHeight);\r
-var animations = [\r
-{element: this.element, end: {height: height}},\r
-{element: document.getElementById("main"), end: {bottom: height}},\r
-{element: document.getElementById("main-status-bar"), start: {"padding-left": anchoredItems.offsetWidth - 1}, end: {"padding-left": 0}},\r
-{element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 0}, end: {opacity: 1}}\r
-];\r
-\r
-var drawerStatusBar = document.getElementById("drawer-status-bar");\r
-drawerStatusBar.insertBefore(anchoredItems, drawerStatusBar.firstChild);\r
-\r
-if (this._currentPanelCounters) {\r
-var oldRight = this._drawerStatusBar.clientWidth - (this._counters.offsetLeft + this._currentPanelCounters.offsetWidth);\r
-var newRight = WebInspector.Panel.counterRightMargin;\r
-var rightPadding = (oldRight - newRight);\r
-animations.push({element: this._currentPanelCounters, start: {"padding-right": rightPadding}, end: {"padding-right": 0}});\r
-this._currentPanelCounters.parentNode.removeChild(this._currentPanelCounters);\r
-this.mainStatusBar.appendChild(this._currentPanelCounters);\r
-}\r
-\r
-function animationFinished()\r
-{\r
-if ("updateStatusBarItems" in WebInspector.currentPanel)\r
-WebInspector.currentPanel.updateStatusBarItems();\r
-if (this.visibleView.afterShow)\r
-this.visibleView.afterShow();\r
-delete this._animating;\r
-delete this._currentAnimationInterval;\r
-this.state = (this.fullPanel ? WebInspector.Drawer.State.Full : WebInspector.Drawer.State.Variable);\r
-if (this._currentPanelCounters)\r
-this._currentPanelCounters.removeAttribute("style");\r
-}\r
-\r
-this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));\r
-},\r
-\r
-hide: function()\r
-{\r
-if (this._animating || !this.visible)\r
-return;\r
-\r
-WebInspector.View.prototype.hide.call(this);\r
-\r
-if (this.visibleView)\r
-this.visibleView.hide();\r
-\r
-this._animating = true;\r
-\r
-if (!this.fullPanel)\r
-this._savedHeight = this.element.offsetHeight;\r
-\r
-if (this.element === WebInspector.currentFocusElement || this.element.isAncestor(WebInspector.currentFocusElement))\r
-WebInspector.currentFocusElement = WebInspector.previousFocusElement;\r
-\r
-var anchoredItems = document.getElementById("anchored-status-bar-items");\r
-\r
-\r
-\r
-this.mainStatusBar.style.setProperty("padding-left", (anchoredItems.offsetWidth - 1) + "px");\r
-document.body.removeStyleClass("drawer-visible");\r
-if ("updateStatusBarItems" in WebInspector.currentPanel)\r
-WebInspector.currentPanel.updateStatusBarItems();\r
-document.body.addStyleClass("drawer-visible");\r
-\r
-var animations = [\r
-{element: document.getElementById("main"), end: {bottom: 0}},\r
-{element: document.getElementById("main-status-bar"), start: {"padding-left": 0}, end: {"padding-left": anchoredItems.offsetWidth - 1}},\r
-{element: document.getElementById("other-drawer-status-bar-items"), start: {opacity: 1}, end: {opacity: 0}}\r
-];\r
-\r
-if (this._currentPanelCounters) {\r
-var newRight = this._drawerStatusBar.clientWidth - this._counters.offsetLeft;\r
-var oldRight = this.mainStatusBar.clientWidth - (this._currentPanelCounters.offsetLeft + this._currentPanelCounters.offsetWidth);\r
-var rightPadding = (newRight - oldRight);\r
-animations.push({element: this._currentPanelCounters, start: {"padding-right": 0}, end: {"padding-right": rightPadding}});\r
-}\r
-\r
-function animationFinished()\r
-{\r
-WebInspector.currentPanel.resize();\r
-var mainStatusBar = document.getElementById("main-status-bar");\r
-mainStatusBar.insertBefore(anchoredItems, mainStatusBar.firstChild);\r
-mainStatusBar.style.removeProperty("padding-left");\r
-\r
-if (this._currentPanelCounters) {\r
-this._currentPanelCounters.setAttribute("style", null);\r
-this._currentPanelCounters.parentNode.removeChild(this._currentPanelCounters);\r
-this._counters.insertBefore(this._currentPanelCounters, this._counters.firstChild);\r
-}\r
-\r
-document.body.removeStyleClass("drawer-visible");\r
-delete this._animating;\r
-delete this._currentAnimationInterval;\r
-this.state = WebInspector.Drawer.State.Hidden;\r
-}\r
-\r
-this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this.state === WebInspector.Drawer.State.Hidden)\r
-return;\r
-\r
-var height;\r
-var mainElement = document.getElementById("main");\r
-if (this.state === WebInspector.Drawer.State.Variable) {\r
-height = parseInt(this.element.style.height);\r
-height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);\r
-} else\r
-height = window.innerHeight - this.toolbarElement.offsetHeight;\r
-\r
-mainElement.style.bottom = height + "px";\r
-this.element.style.height = height + "px";\r
-},\r
-\r
-enterPanelMode: function()\r
-{\r
-this._cancelAnimationIfNeeded();\r
-this.fullPanel = true;\r
-\r
-if (this.visible) {\r
-this._savedHeight = this.element.offsetHeight;\r
-var height = window.innerHeight - this.toolbarElement.offsetHeight;\r
-this._animateDrawerHeight(height, WebInspector.Drawer.State.Full);\r
-}\r
-},\r
-\r
-exitPanelMode: function()\r
-{\r
-this._cancelAnimationIfNeeded();\r
-this.fullPanel = false;\r
-\r
-if (this.visible) {\r
-\r
-\r
-this.state = WebInspector.Drawer.State.Variable;\r
-var height = this.savedHeight;\r
-this._animateDrawerHeight(height, WebInspector.Drawer.State.Variable);\r
-}\r
-},\r
-\r
-immediatelyExitPanelMode: function()\r
-{\r
-this.visible = false;\r
-this.fullPanel = false;\r
-},\r
-\r
-set currentPanelCounters(x)\r
-{\r
-if (!x) {\r
-if (this._currentPanelCounters)\r
-this._currentPanelCounters.parentElement.removeChild(this._currentPanelCounters);\r
-delete this._currentPanelCounters;\r
-return;\r
-}\r
-\r
-this._currentPanelCounters = x;\r
-if (this.visible)\r
-this.mainStatusBar.appendChild(x);\r
-else\r
-this._counters.insertBefore(x, this._counters.firstChild);\r
-},\r
-\r
-_cancelAnimationIfNeeded: function()\r
-{\r
-if (this._animating) {\r
-clearInterval(this._currentAnimationInterval);\r
-delete this._animating;\r
-delete this._currentAnimationInterval;\r
-}\r
-},\r
-\r
-_animateDrawerHeight: function(height, finalState)\r
-{\r
-this._animating = true;\r
-var animations = [\r
-{element: this.element, end: {height: height}},\r
-{element: document.getElementById("main"), end: {bottom: height}}\r
-];\r
-\r
-function animationFinished()\r
-{\r
-delete this._animating;\r
-delete this._currentAnimationInterval;\r
-this.state = finalState;\r
-}\r
-\r
-this._currentAnimationInterval = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));\r
-},\r
-\r
-_animationDuration: function()\r
-{\r
-\r
-if (this.fullPanel && (this.state === WebInspector.Drawer.State.Hidden || this.state === WebInspector.Drawer.State.Full))\r
-return 0;\r
-\r
-return (window.event && window.event.shiftKey ? 2000 : 250);\r
-},\r
-\r
-_safelyRemoveChildren: function()\r
-{\r
-var child = this.element.firstChild;\r
-while (child) {\r
-if (child.id !== "drawer-status-bar") {\r
-var moveTo = child.nextSibling;\r
-this.element.removeChild(child);\r
-child = moveTo;\r
-} else\r
-child = child.nextSibling;\r
-}\r
-},\r
-\r
-_startStatusBarDragging: function(event)\r
-{\r
-if (!this.visible || event.target !== this.mainStatusBar)\r
-return;\r
-\r
-WebInspector.elementDragStart(this.mainStatusBar, this._statusBarDragging.bind(this), this._endStatusBarDragging.bind(this), event, "row-resize");\r
-\r
-this._statusBarDragOffset = event.pageY - this.element.totalOffsetTop;\r
-\r
-event.stopPropagation();\r
-},\r
-\r
-_statusBarDragging: function(event)\r
-{\r
-var mainElement = document.getElementById("main");\r
-var height = window.innerHeight - event.pageY + this._statusBarDragOffset;\r
-height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - mainElement.totalOffsetTop - Preferences.minConsoleHeight);\r
-\r
-mainElement.style.bottom = height + "px";\r
-this.element.style.height = height + "px";\r
-\r
-event.preventDefault();\r
-event.stopPropagation();\r
-},\r
-\r
-_endStatusBarDragging: function(event)\r
-{\r
-WebInspector.elementDragEnd(event);\r
-\r
-this._savedHeight = this.element.offsetHeight;\r
-delete this._statusBarDragOffset;\r
-\r
-event.stopPropagation();\r
-}\r
-}\r
-\r
-WebInspector.Drawer.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-WebInspector.Drawer.State = {\r
-Hidden: 0,\r
-Variable: 1,\r
-Full: 2\r
-};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ChangesView = function(drawer)\r
-{\r
-WebInspector.View.call(this);\r
-this.element.innerHTML = "<div style=\"bottom:25%;color:rgb(192,192,192);font-size:12px;height:65px;left:0px;margin:auto;position:absolute;right:0px;text-align:center;top:0px;\"><h1>Not Implemented Yet</h1></div>";\r
-\r
-this.drawer = drawer;\r
-\r
-this.clearButton = document.createElement("button");\r
-this.clearButton.id = "clear-changes-status-bar-item";\r
-this.clearButton.title = WebInspector.UIString("Clear changes log.");\r
-this.clearButton.className = "status-bar-item clear-status-bar-item";\r
-this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);\r
-\r
-this.toggleChangesButton = document.getElementById("changes-status-bar-item");\r
-this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");\r
-this.toggleChangesButton.addEventListener("click", this._toggleChangesButtonClicked.bind(this), false);\r
-var anchoredStatusBar = document.getElementById("anchored-status-bar-items");\r
-anchoredStatusBar.appendChild(this.toggleChangesButton);\r
-}\r
-\r
-WebInspector.ChangesView.prototype = {\r
-_clearButtonClicked: function()\r
-{\r
-\r
-},\r
-\r
-_toggleChangesButtonClicked: function()\r
-{\r
-this.drawer.visibleView = this;\r
-},\r
-\r
-attach: function(mainElement, statusBarElement)\r
-{\r
-mainElement.appendChild(this.element);\r
-statusBarElement.appendChild(this.clearButton);\r
-},\r
-\r
-show: function()\r
-{\r
-this.toggleChangesButton.addStyleClass("toggled-on");\r
-this.toggleChangesButton.title = WebInspector.UIString("Hide changes view.");\r
-},\r
-\r
-hide: function()\r
-{\r
-this.toggleChangesButton.removeStyleClass("toggled-on");\r
-this.toggleChangesButton.title = WebInspector.UIString("Show changes view.");\r
-}\r
-}\r
-\r
-WebInspector.ChangesView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-const ExpressionStopCharacters = " =:[({;,!+-*/&|^<>";\r
-\r
-WebInspector.ConsoleView = function(drawer)\r
-{\r
-WebInspector.View.call(this, document.getElementById("console-view"));\r
-\r
-this.messages = [];\r
-this.drawer = drawer;\r
-\r
-this.clearButton = document.getElementById("clear-console-status-bar-item");\r
-this.clearButton.title = WebInspector.UIString("Clear console log.");\r
-this.clearButton.addEventListener("click", this._clearButtonClicked.bind(this), false);\r
-\r
-this.messagesElement = document.getElementById("console-messages");\r
-this.messagesElement.addEventListener("selectstart", this._messagesSelectStart.bind(this), false);\r
-this.messagesElement.addEventListener("click", this._messagesClicked.bind(this), true);\r
-\r
-this.promptElement = document.getElementById("console-prompt");\r
-this.promptElement.className = "source-code";\r
-this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);\r
-this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), ExpressionStopCharacters + ".");\r
-this.prompt.history = WebInspector.settings.consoleHistory;\r
-\r
-this.topGroup = new WebInspector.ConsoleGroup(null);\r
-this.messagesElement.insertBefore(this.topGroup.element, this.promptElement);\r
-this.currentGroup = this.topGroup;\r
-\r
-this.toggleConsoleButton = document.getElementById("console-status-bar-item");\r
-this.toggleConsoleButton.title = WebInspector.UIString("Show console.");\r
-this.toggleConsoleButton.addEventListener("click", this._toggleConsoleButtonClicked.bind(this), false);\r
-\r
-\r
-this.filterBarElement = document.getElementById("console-filter");\r
-\r
-function createDividerElement() {\r
-var dividerElement = document.createElement("div");\r
-dividerElement.addStyleClass("scope-bar-divider");\r
-this.filterBarElement.appendChild(dividerElement);\r
-}\r
-\r
-var updateFilterHandler = this._updateFilter.bind(this);\r
-function createFilterElement(category, label) {\r
-var categoryElement = document.createElement("li");\r
-categoryElement.category = category;\r
-categoryElement.className = category;\r
-categoryElement.addEventListener("click", updateFilterHandler, false);\r
-categoryElement.textContent = label;\r
-\r
-this.filterBarElement.appendChild(categoryElement);\r
-\r
-return categoryElement;\r
-}\r
-\r
-this.allElement = createFilterElement.call(this, "all", WebInspector.UIString("All"));\r
-createDividerElement.call(this);\r
-this.errorElement = createFilterElement.call(this, "errors", WebInspector.UIString("Errors"));\r
-this.warningElement = createFilterElement.call(this, "warnings", WebInspector.UIString("Warnings"));\r
-this.logElement = createFilterElement.call(this, "logs", WebInspector.UIString("Logs"));\r
-\r
-this.filter(this.allElement, false);\r
-this._registerShortcuts();\r
-\r
-this.messagesElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);\r
-\r
-this._customFormatters = {\r
-"object": this._formatobject,\r
-"array":  this._formatarray,\r
-"node":   this._formatnode,\r
-"string": this._formatstring\r
-};\r
-}\r
-\r
-WebInspector.ConsoleView.prototype = {\r
-_updateFilter: function(e)\r
-{\r
-var isMac = WebInspector.isMac();\r
-var selectMultiple = false;\r
-if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)\r
-selectMultiple = true;\r
-if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)\r
-selectMultiple = true;\r
-\r
-this.filter(e.target, selectMultiple);\r
-},\r
-\r
-filter: function(target, selectMultiple)\r
-{\r
-function unselectAll()\r
-{\r
-this.allElement.removeStyleClass("selected");\r
-this.errorElement.removeStyleClass("selected");\r
-this.warningElement.removeStyleClass("selected");\r
-this.logElement.removeStyleClass("selected");\r
-\r
-this.messagesElement.removeStyleClass("filter-all");\r
-this.messagesElement.removeStyleClass("filter-errors");\r
-this.messagesElement.removeStyleClass("filter-warnings");\r
-this.messagesElement.removeStyleClass("filter-logs");\r
-}\r
-\r
-var targetFilterClass = "filter-" + target.category;\r
-\r
-if (target.category === "all") {\r
-if (target.hasStyleClass("selected")) {\r
-\r
-return;\r
-}\r
-\r
-unselectAll.call(this);\r
-} else {\r
-\r
-if (this.allElement.hasStyleClass("selected")) {\r
-this.allElement.removeStyleClass("selected");\r
-this.messagesElement.removeStyleClass("filter-all");\r
-}\r
-}\r
-\r
-if (!selectMultiple) {\r
-\r
-\r
-unselectAll.call(this);\r
-\r
-target.addStyleClass("selected");\r
-this.messagesElement.addStyleClass(targetFilterClass);\r
-\r
-return;\r
-}\r
-\r
-if (target.hasStyleClass("selected")) {\r
-\r
-\r
-target.removeStyleClass("selected");\r
-this.messagesElement.removeStyleClass(targetFilterClass);\r
-} else {\r
-\r
-\r
-target.addStyleClass("selected");\r
-this.messagesElement.addStyleClass(targetFilterClass);\r
-}\r
-},\r
-\r
-_toggleConsoleButtonClicked: function()\r
-{\r
-this.drawer.visibleView = this;\r
-},\r
-\r
-attach: function(mainElement, statusBarElement)\r
-{\r
-mainElement.appendChild(this.element);\r
-statusBarElement.appendChild(this.clearButton);\r
-statusBarElement.appendChild(this.filterBarElement);\r
-},\r
-\r
-show: function()\r
-{\r
-this.toggleConsoleButton.addStyleClass("toggled-on");\r
-this.toggleConsoleButton.title = WebInspector.UIString("Hide console.");\r
-if (!this.prompt.isCaretInsidePrompt())\r
-this.prompt.moveCaretToEndOfPrompt();\r
-},\r
-\r
-afterShow: function()\r
-{\r
-WebInspector.currentFocusElement = this.promptElement;\r
-},\r
-\r
-hide: function()\r
-{\r
-this.toggleConsoleButton.removeStyleClass("toggled-on");\r
-this.toggleConsoleButton.title = WebInspector.UIString("Show console.");\r
-},\r
-\r
-_scheduleScrollIntoView: function()\r
-{\r
-if (this._scrollIntoViewTimer)\r
-return;\r
-\r
-function scrollIntoView()\r
-{\r
-this.promptElement.scrollIntoView(true);\r
-delete this._scrollIntoViewTimer;\r
-}\r
-this._scrollIntoViewTimer = setTimeout(scrollIntoView.bind(this), 20);\r
-},\r
-\r
-addMessage: function(msg)\r
-{\r
-var shouldScrollToLastMessage = this.messagesElement.isScrolledToBottom();\r
-\r
-if (msg instanceof WebInspector.ConsoleMessage && !(msg instanceof WebInspector.ConsoleCommandResult)) {\r
-this._incrementErrorWarningCount(msg);\r
-WebInspector.resourceManager.addConsoleMessage(msg);\r
-this.commandSincePreviousMessage = false;\r
-this.previousMessage = msg;\r
-} else if (msg instanceof WebInspector.ConsoleCommand) {\r
-if (this.previousMessage) {\r
-this.commandSincePreviousMessage = true;\r
-}\r
-}\r
-\r
-this.messages.push(msg);\r
-\r
-if (msg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {\r
-var parentGroup = this.currentGroup.parentGroup\r
-if (parentGroup)\r
-this.currentGroup = parentGroup;\r
-} else {\r
-if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup || msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) {\r
-var group = new WebInspector.ConsoleGroup(this.currentGroup);\r
-this.currentGroup.messagesElement.appendChild(group.element);\r
-this.currentGroup = group;\r
-}\r
-\r
-this.currentGroup.addMessage(msg);\r
-}\r
-\r
-if (shouldScrollToLastMessage)\r
-this._scheduleScrollIntoView();\r
-},\r
-\r
-updateMessageRepeatCount: function(count)\r
-{\r
-var msg = this.previousMessage;\r
-var prevRepeatCount = msg.totalRepeatCount;\r
-\r
-if (!this.commandSincePreviousMessage) {\r
-msg.repeatDelta = count - prevRepeatCount;\r
-msg.repeatCount = msg.repeatCount + msg.repeatDelta;\r
-msg.totalRepeatCount = count;\r
-msg._updateRepeatCount();\r
-this._incrementErrorWarningCount(msg);\r
-} else {\r
-var msgCopy = new WebInspector.ConsoleMessage(msg.source, msg.type, msg.level, msg.line, msg.url, count - prevRepeatCount, msg._messageText, msg._parameters, msg._stackTrace, msg._requestId);\r
-msgCopy.totalRepeatCount = count;\r
-msgCopy._formatMessage();\r
-this.addMessage(msgCopy);\r
-}\r
-},\r
-\r
-_incrementErrorWarningCount: function(msg)\r
-{\r
-switch (msg.level) {\r
-case WebInspector.ConsoleMessage.MessageLevel.Warning:\r
-WebInspector.warnings += msg.repeatDelta;\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Error:\r
-WebInspector.errors += msg.repeatDelta;\r
-break;\r
-}\r
-},\r
-\r
-requestClearMessages: function()\r
-{\r
-InspectorBackend.clearConsoleMessages();\r
-},\r
-\r
-clearMessages: function()\r
-{\r
-WebInspector.resourceManager.clearConsoleMessages();\r
-\r
-this.messages = [];\r
-\r
-this.currentGroup = this.topGroup;\r
-this.topGroup.messagesElement.removeChildren();\r
-\r
-WebInspector.errors = 0;\r
-WebInspector.warnings = 0;\r
-\r
-delete this.commandSincePreviousMessage;\r
-delete this.previousMessage;\r
-},\r
-\r
-completions: function(wordRange, bestMatchOnly, completionsReadyCallback)\r
-{\r
-\r
-var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, ExpressionStopCharacters, this.promptElement, "backward");\r
-var expressionString = expressionRange.toString();\r
-var lastIndex = expressionString.length - 1;\r
-\r
-var dotNotation = (expressionString[lastIndex] === ".");\r
-var bracketNotation = (expressionString[lastIndex] === "[");\r
-\r
-if (dotNotation || bracketNotation)\r
-expressionString = expressionString.substr(0, lastIndex);\r
-\r
-var prefix = wordRange.toString();\r
-if (!expressionString && !prefix)\r
-return;\r
-\r
-var reportCompletions = this._reportCompletions.bind(this, bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix);\r
-\r
-\r
-var includeInspectorCommandLineAPI = (!dotNotation && !bracketNotation);\r
-var callFrameId = WebInspector.panels.scripts.selectedCallFrameId();\r
-var injectedScriptAccess;\r
-if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {\r
-var selectedCallFrame = WebInspector.panels.scripts.sidebarPanes.callstack.selectedCallFrame;\r
-injectedScriptAccess = InjectedScriptAccess.get(selectedCallFrame.worldId);\r
-} else\r
-injectedScriptAccess = InjectedScriptAccess.getDefault();\r
-injectedScriptAccess.getCompletions(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions);\r
-},\r
-\r
-_reportCompletions: function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {\r
-if (isException)\r
-return;\r
-\r
-if (bracketNotation) {\r
-if (prefix.length && prefix[0] === "'")\r
-var quoteUsed = "'";\r
-else\r
-var quoteUsed = "\"";\r
-}\r
-\r
-var results = [];\r
-var properties = Object.keys(result).sort();\r
-\r
-for (var i = 0; i < properties.length; ++i) {\r
-var property = properties[i];\r
-\r
-if (dotNotation && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(property))\r
-continue;\r
-\r
-if (bracketNotation) {\r
-if (!/^[0-9]+$/.test(property))\r
-property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + quoteUsed;\r
-property += "]";\r
-}\r
-\r
-if (property.length < prefix.length)\r
-continue;\r
-if (property.indexOf(prefix) !== 0)\r
-continue;\r
-\r
-results.push(property);\r
-if (bestMatchOnly)\r
-break;\r
-}\r
-completionsReadyCallback(results);\r
-},\r
-\r
-_clearButtonClicked: function()\r
-{\r
-this.requestClearMessages();\r
-},\r
-\r
-_handleContextMenuEvent: function(event)\r
-{\r
-if (!window.getSelection().isCollapsed) {\r
-\r
-\r
-return;\r
-}\r
-\r
-var contextMenu = new WebInspector.ContextMenu();\r
-\r
-function monitoringXHRWasChanged(newState)\r
-{\r
-WebInspector.monitoringXHREnabled = newState;\r
-}\r
-var itemAction = InspectorBackend.setMonitoringXHREnabled.bind(InspectorBackend, !WebInspector.monitoringXHREnabled, monitoringXHRWasChanged);\r
-contextMenu.appendCheckboxItem(WebInspector.UIString("XMLHttpRequest logging"), itemAction, WebInspector.monitoringXHREnabled);\r
-contextMenu.appendItem(WebInspector.UIString("Clear Console"), this.requestClearMessages.bind(this));\r
-contextMenu.show(event);\r
-},\r
-\r
-_messagesSelectStart: function(event)\r
-{\r
-if (this._selectionTimeout)\r
-clearTimeout(this._selectionTimeout);\r
-\r
-this.prompt.clearAutoComplete();\r
-\r
-function moveBackIfOutside()\r
-{\r
-delete this._selectionTimeout;\r
-if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)\r
-this.prompt.moveCaretToEndOfPrompt();\r
-this.prompt.autoCompleteSoon();\r
-}\r
-\r
-this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);\r
-},\r
-\r
-_messagesClicked: function(event)\r
-{\r
-var link = event.target.enclosingNodeOrSelfWithNodeName("a");\r
-if (!link || !link.representedNode)\r
-return;\r
-\r
-WebInspector.updateFocusedNode(link.representedNode.id);\r
-event.stopPropagation();\r
-event.preventDefault();\r
-},\r
-\r
-_registerShortcuts: function()\r
-{\r
-this._shortcuts = {};\r
-\r
-var shortcut = WebInspector.KeyboardShortcut;\r
-var shortcutK = shortcut.makeDescriptor("k", WebInspector.KeyboardShortcut.Modifiers.Meta);\r
-\r
-this._shortcuts[shortcutK.key] = this.requestClearMessages.bind(this);\r
-this._shortcuts[shortcutK.key].isMacOnly = true;\r
-\r
-var clearConsoleHandler = this.requestClearMessages.bind(this);\r
-var shortcutL = shortcut.makeDescriptor("l", WebInspector.KeyboardShortcut.Modifiers.Ctrl);\r
-this._shortcuts[shortcutL.key] = clearConsoleHandler;\r
-\r
-var section = WebInspector.shortcutsHelp.section(WebInspector.UIString("Console"));\r
-var keys = WebInspector.isMac() ? [ shortcutK.name, shortcutL.name ] : [ shortcutL.name ];\r
-section.addAlternateKeys(keys, WebInspector.UIString("Clear Console"));\r
-\r
-keys = [\r
-shortcut.shortcutToString(shortcut.Keys.Tab),\r
-shortcut.shortcutToString(shortcut.Keys.Tab, shortcut.Modifiers.Shift)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Next/previous suggestion"));\r
-section.addKey(shortcut.shortcutToString(shortcut.Keys.Right), WebInspector.UIString("Accept suggestion"));\r
-keys = [\r
-shortcut.shortcutToString(shortcut.Keys.Down),\r
-shortcut.shortcutToString(shortcut.Keys.Up)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Next/previous line"));\r
-keys = [\r
-shortcut.shortcutToString("N", shortcut.Modifiers.Alt),\r
-shortcut.shortcutToString("P", shortcut.Modifiers.Alt)\r
-];\r
-if (WebInspector.isMac())\r
-section.addRelatedKeys(keys, WebInspector.UIString("Next/previous command"));\r
-section.addKey(shortcut.shortcutToString(shortcut.Keys.Enter), WebInspector.UIString("Execute command"));\r
-},\r
-\r
-_promptKeyDown: function(event)\r
-{\r
-if (isEnterKey(event)) {\r
-this._enterKeyPressed(event);\r
-return;\r
-}\r
-\r
-var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);\r
-var handler = this._shortcuts[shortcut];\r
-if (handler) {\r
-if (!this._shortcuts[shortcut].isMacOnly || WebInspector.isMac()) {\r
-handler();\r
-event.preventDefault();\r
-return;\r
-}\r
-}\r
-},\r
-\r
-evalInInspectedWindow: function(expression, objectGroup, callback)\r
-{\r
-if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {\r
-WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, objectGroup, callback);\r
-return;\r
-}\r
-this.doEvalInWindow(expression, objectGroup, callback);\r
-},\r
-\r
-doEvalInWindow: function(expression, objectGroup, callback)\r
-{\r
-if (!expression) {\r
-\r
-expression = "this";\r
-}\r
-\r
-function evalCallback(result)\r
-{\r
-callback(WebInspector.RemoteObject.fromPayload(result));\r
-};\r
-InjectedScriptAccess.getDefault().evaluate(expression, objectGroup, evalCallback);\r
-},\r
-\r
-_enterKeyPressed: function(event)\r
-{\r
-if (event.altKey || event.ctrlKey || event.shiftKey)\r
-return;\r
-\r
-event.preventDefault();\r
-event.stopPropagation();\r
-\r
-this.prompt.clearAutoComplete(true);\r
-\r
-var str = this.prompt.text;\r
-if (!str.length)\r
-return;\r
-\r
-var commandMessage = new WebInspector.ConsoleCommand(str);\r
-this.addMessage(commandMessage);\r
-\r
-var self = this;\r
-function printResult(result)\r
-{\r
-self.prompt.history.push(str);\r
-self.prompt.historyOffset = 0;\r
-self.prompt.text = "";\r
-\r
-WebInspector.settings.consoleHistory = self.prompt.history.slice(-30);\r
-\r
-self.addMessage(new WebInspector.ConsoleCommandResult(result, commandMessage));\r
-}\r
-this.evalInInspectedWindow(str, "console", printResult);\r
-},\r
-\r
-_format: function(output, forceObjectFormat)\r
-{\r
-var isProxy = (output != null && typeof output === "object");\r
-var type = (forceObjectFormat ? "object" : WebInspector.RemoteObject.type(output));\r
-\r
-var formatter = this._customFormatters[type];\r
-if (!formatter || !isProxy) {\r
-formatter = this._formatvalue;\r
-output = output.description;\r
-}\r
-\r
-var span = document.createElement("span");\r
-span.className = "console-formatted-" + type + " source-code";\r
-formatter.call(this, output, span);\r
-return span;\r
-},\r
-\r
-_formatvalue: function(val, elem)\r
-{\r
-elem.appendChild(document.createTextNode(val));\r
-},\r
-\r
-_formatobject: function(obj, elem)\r
-{\r
-elem.appendChild(new WebInspector.ObjectPropertiesSection(obj, obj.description, null, true).element);\r
-},\r
-\r
-_formatnode: function(object, elem)\r
-{\r
-function printNode(nodeId)\r
-{\r
-if (!nodeId) {\r
-\r
-\r
-this._formatobject(object, elem);\r
-return;\r
-}\r
-var treeOutline = new WebInspector.ElementsTreeOutline();\r
-treeOutline.showInElementsPanelEnabled = true;\r
-treeOutline.rootDOMNode = WebInspector.domAgent.nodeForId(nodeId);\r
-treeOutline.element.addStyleClass("outline-disclosure");\r
-if (!treeOutline.children[0].hasChildren)\r
-treeOutline.element.addStyleClass("single-node");\r
-elem.appendChild(treeOutline.element);\r
-}\r
-object.pushNodeToFrontend(printNode.bind(this));\r
-},\r
-\r
-_formatarray: function(arr, elem)\r
-{\r
-arr.getOwnProperties(false, this._printArray.bind(this, elem));\r
-},\r
-\r
-_formatstring: function(output, elem)\r
-{\r
-var span = document.createElement("span");\r
-span.className = "console-formatted-string source-code";\r
-span.appendChild(WebInspector.linkifyStringAsFragment(output.description));\r
-\r
-\r
-elem.removeStyleClass("console-formatted-string");\r
-elem.appendChild(document.createTextNode("\""));\r
-elem.appendChild(span);\r
-elem.appendChild(document.createTextNode("\""));\r
-},\r
-\r
-_printArray: function(elem, properties)\r
-{\r
-if (!properties)\r
-return;\r
-\r
-var elements = [];\r
-for (var i = 0; i < properties.length; ++i) {\r
-var name = properties[i].name;\r
-if (name == parseInt(name))\r
-elements[name] = this._formatAsArrayEntry(properties[i].value);\r
-}\r
-\r
-elem.appendChild(document.createTextNode("["));\r
-for (var i = 0; i < elements.length; ++i) {\r
-var element = elements[i];\r
-if (element)\r
-elem.appendChild(element);\r
-else\r
-elem.appendChild(document.createTextNode("undefined"))\r
-if (i < elements.length - 1)\r
-elem.appendChild(document.createTextNode(", "));\r
-}\r
-elem.appendChild(document.createTextNode("]"));\r
-},\r
-\r
-_formatAsArrayEntry: function(output)\r
-{\r
-\r
-return this._format(output, WebInspector.RemoteObject.type(output) === "array");\r
-}\r
-}\r
-\r
-WebInspector.ConsoleView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-WebInspector.ConsoleMessage = function(source, type, level, line, url, repeatCount, message, parameters, stackTrace, requestId)\r
-{\r
-this.source = source;\r
-this.type = type;\r
-this.level = level;\r
-this.line = line;\r
-this.url = url;\r
-this.repeatCount = repeatCount;\r
-this.repeatDelta = repeatCount;\r
-this.totalRepeatCount = repeatCount;\r
-this._messageText = message;\r
-this._parameters = parameters;\r
-this._stackTrace = stackTrace;\r
-this._requestId = requestId;\r
-this._formatMessage();\r
-}\r
-\r
-WebInspector.ConsoleMessage.createTextMessage = function(text, level)\r
-{\r
-level = level || WebInspector.ConsoleMessage.MessageLevel.Log;\r
-return new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Log, level, 0, null, 1, null, [text], null);\r
-}\r
-\r
-WebInspector.ConsoleMessage.prototype = {\r
-_formatMessage: function()\r
-{\r
-var stackTrace = this._stackTrace;\r
-var messageText;\r
-switch (this.type) {\r
-case WebInspector.ConsoleMessage.MessageType.Trace:\r
-messageText = document.createTextNode("console.trace()");\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.UncaughtException:\r
-messageText = document.createTextNode(this._messageText);\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.NetworkError:\r
-var resource = this._requestId && WebInspector.panels.network.resources[this._requestId];\r
-if (resource) {\r
-stackTrace = resource.stackTrace;\r
-\r
-messageText = document.createElement("span");\r
-messageText.appendChild(document.createTextNode(resource.requestMethod + " "));\r
-messageText.appendChild(WebInspector.linkifyURLAsNode(resource.url));\r
-if (resource.failed)\r
-messageText.appendChild(document.createTextNode(" " + resource.localizedFailDescription));\r
-else\r
-messageText.appendChild(document.createTextNode(" " + resource.statusCode + " (" + resource.statusText + ")"));\r
-} else\r
-messageText = this._format([this._messageText]);\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.Assert:\r
-var args = [WebInspector.UIString("Assertion failed:")];\r
-if (this._parameters)\r
-args = args.concat(this._parameters);\r
-messageText = this._format(args);\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.Object:\r
-var obj = this._parameters ? this._parameters[0] : undefined;\r
-var args = ["%O", obj];\r
-messageText = this._format(args);\r
-break;\r
-default:\r
-var args = this._parameters || [this._messageText];\r
-messageText = this._format(args);\r
-break;\r
-}\r
-\r
-this._formattedMessage = document.createElement("span");\r
-this._formattedMessage.className = "console-message-text source-code";\r
-\r
-if (stackTrace && stackTrace.length) {\r
-var topCallFrame = stackTrace[0];\r
-var sourceName = topCallFrame.scriptName;\r
-var sourceLine = topCallFrame.lineNumber;\r
-} else {\r
-var sourceName = this.url;\r
-var sourceLine = this.line;\r
-}\r
-\r
-if (sourceName && sourceName !== "undefined") {\r
-var urlElement = WebInspector.linkifyResourceAsNode(sourceName, "scripts", sourceLine, "console-message-url");\r
-this._formattedMessage.appendChild(urlElement);\r
-}\r
-\r
-this._formattedMessage.appendChild(messageText);\r
-\r
-if (this._stackTrace) {\r
-switch (this.type) {\r
-case WebInspector.ConsoleMessage.MessageType.Trace:\r
-case WebInspector.ConsoleMessage.MessageType.UncaughtException:\r
-case WebInspector.ConsoleMessage.MessageType.NetworkError:\r
-case WebInspector.ConsoleMessage.MessageType.Assert: {\r
-var ol = document.createElement("ol");\r
-ol.className = "outline-disclosure";\r
-var treeOutline = new TreeOutline(ol);\r
-\r
-var content = this._formattedMessage;\r
-var root = new TreeElement(content, null, true);\r
-content.treeElementForTest = root;\r
-treeOutline.appendChild(root);\r
-if (this.type === WebInspector.ConsoleMessage.MessageType.Trace)\r
-root.expand();\r
-\r
-this._populateStackTraceTreeElement(root);\r
-this._formattedMessage = ol;\r
-}\r
-}\r
-}\r
-\r
-\r
-this.message = this._formattedMessage.textContent;\r
-},\r
-\r
-isErrorOrWarning: function()\r
-{\r
-return (this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error);\r
-},\r
-\r
-_format: function(parameters)\r
-{\r
-\r
-var formattedResult = document.createElement("span");\r
-if (!parameters.length)\r
-return formattedResult;\r
-\r
-\r
-\r
-for (var i = 0; i < parameters.length; ++i) {\r
-if (typeof parameters[i] === "object")\r
-parameters[i] = WebInspector.RemoteObject.fromPayload(parameters[i]);\r
-else\r
-parameters[i] = WebInspector.RemoteObject.fromPrimitiveValue(parameters[i]);\r
-}\r
-\r
-\r
-var shouldFormatMessage = WebInspector.RemoteObject.type(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;\r
-\r
-\r
-if (shouldFormatMessage) {\r
-\r
-var result = this._formatWithSubstitutionString(parameters, formattedResult);\r
-parameters = result.unusedSubstitutions;\r
-if (parameters.length)\r
-formattedResult.appendChild(document.createTextNode(" "));\r
-}\r
-\r
-\r
-for (var i = 0; i < parameters.length; ++i) {\r
-\r
-if (shouldFormatMessage && parameters[i].type === "string")\r
-formattedResult.appendChild(document.createTextNode(parameters[i].description));\r
-else\r
-formattedResult.appendChild(WebInspector.console._format(parameters[i]));\r
-if (i < parameters.length - 1)\r
-formattedResult.appendChild(document.createTextNode(" "));\r
-}\r
-return formattedResult;\r
-},\r
-\r
-_formatWithSubstitutionString: function(parameters, formattedResult)\r
-{\r
-var formatters = {}\r
-for (var i in String.standardFormatters)\r
-formatters[i] = String.standardFormatters[i];\r
-\r
-function consoleFormatWrapper(force)\r
-{\r
-return function(obj) {\r
-return WebInspector.console._format(obj, force);\r
-};\r
-}\r
-\r
-\r
-formatters.o = consoleFormatWrapper();\r
-\r
-formatters.i = formatters.d;\r
-\r
-formatters.O = consoleFormatWrapper(true);\r
-\r
-function append(a, b)\r
-{\r
-if (!(b instanceof Node))\r
-a.appendChild(WebInspector.linkifyStringAsFragment(b.toString()));\r
-else\r
-a.appendChild(b);\r
-return a;\r
-}\r
-\r
-\r
-return String.format(parameters[0].description, parameters.slice(1), formatters, formattedResult, append);\r
-},\r
-\r
-toMessageElement: function()\r
-{\r
-if (this._element)\r
-return this._element;\r
-\r
-var element = document.createElement("div");\r
-element.message = this;\r
-element.className = "console-message";\r
-\r
-this._element = element;\r
-\r
-switch (this.level) {\r
-case WebInspector.ConsoleMessage.MessageLevel.Tip:\r
-element.addStyleClass("console-tip-level");\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Log:\r
-element.addStyleClass("console-log-level");\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Debug:\r
-element.addStyleClass("console-debug-level");\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Warning:\r
-element.addStyleClass("console-warning-level");\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Error:\r
-element.addStyleClass("console-error-level");\r
-break;\r
-}\r
-\r
-if (this.type === WebInspector.ConsoleMessage.MessageType.StartGroup || this.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)\r
-element.addStyleClass("console-group-title");\r
-\r
-if (this.elementsTreeOutline) {\r
-element.addStyleClass("outline-disclosure");\r
-element.appendChild(this.elementsTreeOutline.element);\r
-return element;\r
-}\r
-\r
-element.appendChild(this._formattedMessage);\r
-\r
-if (this.repeatCount > 1)\r
-this._updateRepeatCount();\r
-\r
-return element;\r
-},\r
-\r
-_populateStackTraceTreeElement: function(parentTreeElement)\r
-{\r
-for (var i = 0; i < this._stackTrace.length; i++) {\r
-var frame = this._stackTrace[i];\r
-\r
-var content = document.createElement("div");\r
-var messageTextElement = document.createElement("span");\r
-messageTextElement.className = "console-message-text source-code";\r
-var functionName = frame.functionName || WebInspector.UIString("(anonymous function)");\r
-messageTextElement.appendChild(document.createTextNode(functionName));\r
-content.appendChild(messageTextElement);\r
-\r
-var urlElement = WebInspector.linkifyResourceAsNode(frame.scriptName, "scripts", frame.lineNumber, "console-message-url");\r
-content.appendChild(urlElement);\r
-\r
-var treeElement = new TreeElement(content);\r
-parentTreeElement.appendChild(treeElement);\r
-}\r
-},\r
-\r
-_updateRepeatCount: function() {\r
-if (!this.repeatCountElement) {\r
-this.repeatCountElement = document.createElement("span");\r
-this.repeatCountElement.className = "bubble";\r
-\r
-this._element.insertBefore(this.repeatCountElement, this._element.firstChild);\r
-this._element.addStyleClass("repeated-message");\r
-}\r
-this.repeatCountElement.textContent = this.repeatCount;\r
-},\r
-\r
-toString: function()\r
-{\r
-var sourceString;\r
-switch (this.source) {\r
-case WebInspector.ConsoleMessage.MessageSource.HTML:\r
-sourceString = "HTML";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageSource.WML:\r
-sourceString = "WML";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageSource.XML:\r
-sourceString = "XML";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageSource.JS:\r
-sourceString = "JS";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageSource.CSS:\r
-sourceString = "CSS";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageSource.Other:\r
-sourceString = "Other";\r
-break;\r
-}\r
-\r
-var typeString;\r
-switch (this.type) {\r
-case WebInspector.ConsoleMessage.MessageType.Log:\r
-case WebInspector.ConsoleMessage.MessageType.UncaughtException:\r
-case WebInspector.ConsoleMessage.MessageType.NetworkError:\r
-typeString = "Log";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.Object:\r
-typeString = "Object";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.Trace:\r
-typeString = "Trace";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed:\r
-case WebInspector.ConsoleMessage.MessageType.StartGroup:\r
-typeString = "Start Group";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.EndGroup:\r
-typeString = "End Group";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.Assert:\r
-typeString = "Assert";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageType.Result:\r
-typeString = "Result";\r
-break;\r
-}\r
-\r
-var levelString;\r
-switch (this.level) {\r
-case WebInspector.ConsoleMessage.MessageLevel.Tip:\r
-levelString = "Tip";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Log:\r
-levelString = "Log";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Warning:\r
-levelString = "Warning";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Debug:\r
-levelString = "Debug";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Error:\r
-levelString = "Error";\r
-break;\r
-}\r
-\r
-return sourceString + " " + typeString + " " + levelString + ": " + this._formattedMessage.textContent + "\n" + this.url + " line " + this.line;\r
-},\r
-\r
-isEqual: function(msg)\r
-{\r
-if (!msg)\r
-return false;\r
-\r
-if (this._stackTrace) {\r
-if (!msg._stackTrace)\r
-return false;\r
-var l = this._stackTrace;\r
-var r = msg._stackTrace;\r
-for (var i = 0; i < l.length; i++) {\r
-if (l[i].scriptName !== r[i].scriptName ||\r
-l[i].functionName !== r[i].functionName ||\r
-l[i].lineNumber !== r[i].lineNumber ||\r
-l[i].column !== r[i].column)\r
-return false;\r
-}\r
-}\r
-\r
-return (this.source === msg.source)\r
-&& (this.type === msg.type)\r
-&& (this.level === msg.level)\r
-&& (this.line === msg.line)\r
-&& (this.url === msg.url)\r
-&& (this.message === msg.message)\r
-&& (this._requestId === msg._requestId);\r
-}\r
-}\r
-\r
-\r
-WebInspector.ConsoleMessage.MessageSource = {\r
-HTML: 0,\r
-WML: 1,\r
-XML: 2,\r
-JS: 3,\r
-CSS: 4,\r
-Other: 5\r
-}\r
-\r
-WebInspector.ConsoleMessage.MessageType = {\r
-Log: 0,\r
-Object: 1,\r
-Trace: 2,\r
-StartGroup: 3,\r
-StartGroupCollapsed: 4,\r
-EndGroup: 5,\r
-Assert: 6,\r
-UncaughtException: 7,\r
-NetworkError:8,\r
-Result: 9\r
-}\r
-\r
-WebInspector.ConsoleMessage.MessageLevel = {\r
-Tip: 0,\r
-Log: 1,\r
-Warning: 2,\r
-Error: 3,\r
-Debug: 4\r
-}\r
-\r
-WebInspector.ConsoleCommand = function(command)\r
-{\r
-this.command = command;\r
-}\r
-\r
-WebInspector.ConsoleCommand.prototype = {\r
-toMessageElement: function()\r
-{\r
-var element = document.createElement("div");\r
-element.command = this;\r
-element.className = "console-user-command";\r
-\r
-var commandTextElement = document.createElement("span");\r
-commandTextElement.className = "console-message-text source-code";\r
-commandTextElement.textContent = this.command;\r
-element.appendChild(commandTextElement);\r
-\r
-return element;\r
-}\r
-}\r
-\r
-WebInspector.ConsoleCommandResult = function(result, originatingCommand)\r
-{\r
-var level = (result.isError() ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);\r
-this.originatingCommand = originatingCommand;\r
-WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Result, level, -1, null, 1, null, [result]);\r
-}\r
-\r
-WebInspector.ConsoleCommandResult.prototype = {\r
-toMessageElement: function()\r
-{\r
-var element = WebInspector.ConsoleMessage.prototype.toMessageElement.call(this);\r
-element.addStyleClass("console-user-command-result");\r
-return element;\r
-}\r
-}\r
-\r
-WebInspector.ConsoleCommandResult.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;\r
-\r
-WebInspector.ConsoleGroup = function(parentGroup)\r
-{\r
-this.parentGroup = parentGroup;\r
-\r
-var element = document.createElement("div");\r
-element.className = "console-group";\r
-element.group = this;\r
-this.element = element;\r
-\r
-var messagesElement = document.createElement("div");\r
-messagesElement.className = "console-group-messages";\r
-element.appendChild(messagesElement);\r
-this.messagesElement = messagesElement;\r
-}\r
-\r
-WebInspector.ConsoleGroup.prototype = {\r
-addMessage: function(msg)\r
-{\r
-var element = msg.toMessageElement();\r
-\r
-if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup || msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) {\r
-this.messagesElement.parentNode.insertBefore(element, this.messagesElement);\r
-element.addEventListener("click", this._titleClicked.bind(this), false);\r
-var groupElement = element.enclosingNodeOrSelfWithClass("console-group");\r
-if (groupElement && msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)\r
-groupElement.addStyleClass("collapsed");\r
-} else\r
-this.messagesElement.appendChild(element);\r
-\r
-if (element.previousSibling && msg.originatingCommand && element.previousSibling.command === msg.originatingCommand)\r
-element.previousSibling.addStyleClass("console-adjacent-user-command-result");\r
-},\r
-\r
-_titleClicked: function(event)\r
-{\r
-var groupTitleElement = event.target.enclosingNodeOrSelfWithClass("console-group-title");\r
-if (groupTitleElement) {\r
-var groupElement = groupTitleElement.enclosingNodeOrSelfWithClass("console-group");\r
-if (groupElement)\r
-if (groupElement.hasStyleClass("collapsed"))\r
-groupElement.removeStyleClass("collapsed");\r
-else\r
-groupElement.addStyleClass("collapsed");\r
-groupTitleElement.scrollIntoViewIfNeeded(true);\r
-}\r
-\r
-event.stopPropagation();\r
-event.preventDefault();\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Panel = function(name)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("panel");\r
-this.element.addStyleClass(name);\r
-this._panelName = name;\r
-\r
-WebInspector.settings.installApplicationSetting(this._sidebarWidthSettingName(), undefined);\r
-}\r
-\r
-\r
-WebInspector.Panel.counterRightMargin = 25;\r
-\r
-WebInspector.Panel.prototype = {\r
-get toolbarItem()\r
-{\r
-if (this._toolbarItem)\r
-return this._toolbarItem;\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-this._toolbarItem = document.createElement("button");\r
-this._toolbarItem.className = "toolbar-item toggleable";\r
-this._toolbarItem.panel = this;\r
-\r
-this._toolbarItem.addStyleClass(this._panelName);\r
-\r
-var iconElement = document.createElement("div");\r
-iconElement.className = "toolbar-icon";\r
-this._toolbarItem.appendChild(iconElement);\r
-\r
-if ("toolbarItemLabel" in this) {\r
-var labelElement = document.createElement("div");\r
-labelElement.className = "toolbar-label";\r
-labelElement.textContent = this.toolbarItemLabel;\r
-this._toolbarItem.appendChild(labelElement);\r
-}\r
-\r
-return this._toolbarItem;\r
-},\r
-\r
-get name()\r
-{\r
-return this._panelName;\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.View.prototype.show.call(this);\r
-\r
-var statusBarItems = this.statusBarItems;\r
-if (statusBarItems) {\r
-this._statusBarItemContainer = document.createElement("div");\r
-for (var i = 0; i < statusBarItems.length; ++i)\r
-this._statusBarItemContainer.appendChild(statusBarItems[i]);\r
-document.getElementById("main-status-bar").appendChild(this._statusBarItemContainer);\r
-}\r
-\r
-if ("_toolbarItem" in this)\r
-this._toolbarItem.addStyleClass("toggled-on");\r
-\r
-WebInspector.currentFocusElement = this.defaultFocusedElement;\r
-\r
-this.restoreSidebarWidth();\r
-this._restoreScrollPositions();\r
-},\r
-\r
-hide: function()\r
-{\r
-this._storeScrollPositions();\r
-WebInspector.View.prototype.hide.call(this);\r
-\r
-if (this._statusBarItemContainer && this._statusBarItemContainer.parentNode)\r
-this._statusBarItemContainer.parentNode.removeChild(this._statusBarItemContainer);\r
-delete this._statusBarItemContainer;\r
-if ("_toolbarItem" in this)\r
-this._toolbarItem.removeStyleClass("toggled-on");\r
-},\r
-\r
-get defaultFocusedElement()\r
-{\r
-return this.sidebarTreeElement || this.element;\r
-},\r
-\r
-attach: function()\r
-{\r
-if (!this.element.parentNode)\r
-document.getElementById("main-panels").appendChild(this.element);\r
-},\r
-\r
-searchCanceled: function()\r
-{\r
-if (this._searchResults) {\r
-for (var i = 0; i < this._searchResults.length; ++i) {\r
-var view = this._searchResults[i];\r
-if (view.searchCanceled)\r
-view.searchCanceled();\r
-delete view.currentQuery;\r
-}\r
-}\r
-\r
-WebInspector.updateSearchMatchesCount(0, this);\r
-\r
-if (this._currentSearchChunkIntervalIdentifier) {\r
-clearInterval(this._currentSearchChunkIntervalIdentifier);\r
-delete this._currentSearchChunkIntervalIdentifier;\r
-}\r
-\r
-this._totalSearchMatches = 0;\r
-this._currentSearchResultIndex = 0;\r
-this._searchResults = [];\r
-},\r
-\r
-performSearch: function(query)\r
-{\r
-\r
-this.searchCanceled(true);\r
-\r
-var searchableViews = this.searchableViews;\r
-if (!searchableViews || !searchableViews.length)\r
-return;\r
-\r
-var parentElement = this.viewsContainerElement;\r
-var visibleView = this.visibleView;\r
-var sortFuction = this.searchResultsSortFunction;\r
-\r
-var matchesCountUpdateTimeout = null;\r
-\r
-function updateMatchesCount()\r
-{\r
-WebInspector.updateSearchMatchesCount(this._totalSearchMatches, this);\r
-matchesCountUpdateTimeout = null;\r
-}\r
-\r
-function updateMatchesCountSoon()\r
-{\r
-if (matchesCountUpdateTimeout)\r
-return;\r
-\r
-matchesCountUpdateTimeout = setTimeout(updateMatchesCount.bind(this), 500);\r
-}\r
-\r
-function finishedCallback(view, searchMatches)\r
-{\r
-if (!searchMatches)\r
-return;\r
-\r
-this._totalSearchMatches += searchMatches;\r
-this._searchResults.push(view);\r
-\r
-if (sortFuction)\r
-this._searchResults.sort(sortFuction);\r
-\r
-if (this.searchMatchFound)\r
-this.searchMatchFound(view, searchMatches);\r
-\r
-updateMatchesCountSoon.call(this);\r
-\r
-if (view === visibleView)\r
-view.jumpToFirstSearchResult();\r
-}\r
-\r
-var i = 0;\r
-var panel = this;\r
-var boundFinishedCallback = finishedCallback.bind(this);\r
-var chunkIntervalIdentifier = null;\r
-\r
-\r
-\r
-\r
-function processChunk()\r
-{\r
-var view = searchableViews[i];\r
-\r
-if (++i >= searchableViews.length) {\r
-if (panel._currentSearchChunkIntervalIdentifier === chunkIntervalIdentifier)\r
-delete panel._currentSearchChunkIntervalIdentifier;\r
-clearInterval(chunkIntervalIdentifier);\r
-}\r
-\r
-if (!view)\r
-return;\r
-\r
-if (view.element.parentNode !== parentElement && view.element.parentNode && parentElement)\r
-view.detach();\r
-\r
-view.currentQuery = query;\r
-view.performSearch(query, boundFinishedCallback);\r
-}\r
-\r
-processChunk();\r
-\r
-chunkIntervalIdentifier = setInterval(processChunk, 25);\r
-this._currentSearchChunkIntervalIdentifier = chunkIntervalIdentifier;\r
-},\r
-\r
-jumpToNextSearchResult: function()\r
-{\r
-if (!this.showView || !this._searchResults || !this._searchResults.length)\r
-return;\r
-\r
-var showFirstResult = false;\r
-\r
-this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);\r
-if (this._currentSearchResultIndex === -1) {\r
-this._currentSearchResultIndex = 0;\r
-showFirstResult = true;\r
-}\r
-\r
-var currentView = this._searchResults[this._currentSearchResultIndex];\r
-\r
-if (currentView.showingLastSearchResult()) {\r
-if (++this._currentSearchResultIndex >= this._searchResults.length)\r
-this._currentSearchResultIndex = 0;\r
-currentView = this._searchResults[this._currentSearchResultIndex];\r
-showFirstResult = true;\r
-}\r
-\r
-if (currentView !== this.visibleView) {\r
-this.showView(currentView);\r
-WebInspector.focusSearchField();\r
-}\r
-\r
-if (showFirstResult)\r
-currentView.jumpToFirstSearchResult();\r
-else\r
-currentView.jumpToNextSearchResult();\r
-},\r
-\r
-jumpToPreviousSearchResult: function()\r
-{\r
-if (!this.showView || !this._searchResults || !this._searchResults.length)\r
-return;\r
-\r
-var showLastResult = false;\r
-\r
-this._currentSearchResultIndex = this._searchResults.indexOf(this.visibleView);\r
-if (this._currentSearchResultIndex === -1) {\r
-this._currentSearchResultIndex = 0;\r
-showLastResult = true;\r
-}\r
-\r
-var currentView = this._searchResults[this._currentSearchResultIndex];\r
-\r
-if (currentView.showingFirstSearchResult()) {\r
-if (--this._currentSearchResultIndex < 0)\r
-this._currentSearchResultIndex = (this._searchResults.length - 1);\r
-currentView = this._searchResults[this._currentSearchResultIndex];\r
-showLastResult = true;\r
-}\r
-\r
-if (currentView !== this.visibleView) {\r
-this.showView(currentView);\r
-WebInspector.focusSearchField();\r
-}\r
-\r
-if (showLastResult)\r
-currentView.jumpToLastSearchResult();\r
-else\r
-currentView.jumpToPreviousSearchResult();\r
-},\r
-\r
-createSidebar: function(parentElement, resizerParentElement)\r
-{\r
-if (this.sidebarElement)\r
-return;\r
-\r
-if (!parentElement)\r
-parentElement = this.element;\r
-\r
-if (!resizerParentElement)\r
-resizerParentElement = parentElement;\r
-\r
-this.sidebarElement = document.createElement("div");\r
-this.sidebarElement.className = "sidebar";\r
-parentElement.appendChild(this.sidebarElement);\r
-\r
-this.sidebarResizeElement = document.createElement("div");\r
-this.sidebarResizeElement.className = "sidebar-resizer-vertical";\r
-this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarDragging.bind(this), false);\r
-resizerParentElement.appendChild(this.sidebarResizeElement);\r
-\r
-this.sidebarTreeElement = document.createElement("ol");\r
-this.sidebarTreeElement.className = "sidebar-tree";\r
-this.sidebarElement.appendChild(this.sidebarTreeElement);\r
-\r
-this.sidebarTree = new TreeOutline(this.sidebarTreeElement);\r
-this.sidebarTree.panel = this;\r
-},\r
-\r
-_sidebarWidthSettingName: function()\r
-{\r
-return this._panelName + "SidebarWidth";\r
-},\r
-\r
-_startSidebarDragging: function(event)\r
-{\r
-WebInspector.elementDragStart(this.sidebarResizeElement, this._sidebarDragging.bind(this), this._endSidebarDragging.bind(this), event, "col-resize");\r
-},\r
-\r
-_sidebarDragging: function(event)\r
-{\r
-this.updateSidebarWidth(event.pageX);\r
-\r
-event.preventDefault();\r
-},\r
-\r
-_endSidebarDragging: function(event)\r
-{\r
-WebInspector.elementDragEnd(event);\r
-this.saveSidebarWidth();\r
-},\r
-\r
-updateSidebarWidth: function(width)\r
-{\r
-if (!this.sidebarElement)\r
-return;\r
-\r
-if (this.sidebarElement.offsetWidth <= 0) {\r
-\r
-\r
-return;\r
-}\r
-\r
-if (!("_currentSidebarWidth" in this))\r
-this._currentSidebarWidth = this.sidebarElement.offsetWidth;\r
-\r
-if (typeof width === "undefined")\r
-width = this._currentSidebarWidth;\r
-\r
-width = Number.constrain(width, Preferences.minSidebarWidth, window.innerWidth / 2);\r
-\r
-this._currentSidebarWidth = width;\r
-this.setSidebarWidth(width);\r
-\r
-this.updateMainViewWidth(width);\r
-},\r
-\r
-setSidebarWidth: function(width)\r
-{\r
-this.sidebarElement.style.width = width + "px";\r
-this.sidebarResizeElement.style.left = (width - 3) + "px";\r
-},\r
-\r
-restoreSidebarWidth: function()\r
-{\r
-var sidebarWidth = WebInspector.settings[this._sidebarWidthSettingName()];\r
-this.updateSidebarWidth(sidebarWidth);\r
-},\r
-\r
-saveSidebarWidth: function()\r
-{\r
-if (!this.sidebarElement)\r
-return;\r
-WebInspector.settings[this._sidebarWidthSettingName()] = this.sidebarElement.offsetWidth;\r
-},\r
-\r
-updateMainViewWidth: function(width)\r
-{\r
-\r
-},\r
-\r
-resize: function()\r
-{\r
-var visibleView = this.visibleView;\r
-if (visibleView && "resize" in visibleView)\r
-visibleView.resize();\r
-},\r
-\r
-canShowSourceLine: function(url, line)\r
-{\r
-return false;\r
-},\r
-\r
-showSourceLine: function(url, line)\r
-{\r
-return false;\r
-},\r
-\r
-elementsToRestoreScrollPositionsFor: function()\r
-{\r
-return [];\r
-},\r
-\r
-_storeScrollPositions: function()\r
-{\r
-var elements = this.elementsToRestoreScrollPositionsFor();\r
-for (var i = 0; i < elements.length; ++i) {\r
-var container = elements[i];\r
-container._scrollTop = container.scrollTop;\r
-}\r
-},\r
-\r
-_restoreScrollPositions: function()\r
-{\r
-var elements = this.elementsToRestoreScrollPositionsFor();\r
-for (var i = 0; i < elements.length; ++i) {\r
-var container = elements[i];\r
-if (container._scrollTop)\r
-container.scrollTop = container._scrollTop;\r
-}\r
-}\r
-}\r
-\r
-WebInspector.Panel.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TimelineGrid = function()\r
-{\r
-this.element = document.createElement("div");\r
-\r
-this._itemsGraphsElement = document.createElement("div");\r
-this._itemsGraphsElement.id = "resources-graphs";\r
-this.element.appendChild(this._itemsGraphsElement);\r
-\r
-this._dividersElement = document.createElement("div");\r
-this._dividersElement.className = "resources-dividers";\r
-this.element.appendChild(this._dividersElement);\r
-\r
-this._eventDividersElement = document.createElement("div");\r
-this._eventDividersElement.className = "resources-event-dividers";\r
-this.element.appendChild(this._eventDividersElement);\r
-\r
-this._dividersLabelBarElement = document.createElement("div");\r
-this._dividersLabelBarElement.className = "resources-dividers-label-bar";\r
-this.element.appendChild(this._dividersLabelBarElement);\r
-}\r
-\r
-WebInspector.TimelineGrid.prototype = {\r
-get itemsGraphsElement()\r
-{\r
-return this._itemsGraphsElement;\r
-},\r
-\r
-\r
-updateDividers: function(force, calculator, paddingLeft)\r
-{\r
-var dividerCount = Math.round(this._dividersElement.offsetWidth / 64);\r
-var slice = calculator.boundarySpan / dividerCount;\r
-if (!force && this._currentDividerSlice === slice)\r
-return false;\r
-\r
-if (typeof paddingLeft !== "number")\r
-paddingLeft = 0;\r
-this._currentDividerSlice = slice;\r
-\r
-\r
-var divider = this._dividersElement.firstChild;\r
-var dividerLabelBar = this._dividersLabelBarElement.firstChild;\r
-\r
-var dividersLabelBarElementClientWidth = this._dividersLabelBarElement.clientWidth;\r
-var clientWidth = dividersLabelBarElementClientWidth - paddingLeft;\r
-for (var i = paddingLeft ? 0 : 1; i <= dividerCount; ++i) {\r
-if (!divider) {\r
-divider = document.createElement("div");\r
-divider.className = "resources-divider";\r
-this._dividersElement.appendChild(divider);\r
-\r
-dividerLabelBar = document.createElement("div");\r
-dividerLabelBar.className = "resources-divider";\r
-var label = document.createElement("div");\r
-label.className = "resources-divider-label";\r
-dividerLabelBar._labelElement = label;\r
-dividerLabelBar.appendChild(label);\r
-this._dividersLabelBarElement.appendChild(dividerLabelBar);\r
-dividersLabelBarElementClientWidth = this._dividersLabelBarElement.clientWidth;\r
-}\r
-\r
-if (i === (paddingLeft ? 0 : 1)) {\r
-divider.addStyleClass("first");\r
-dividerLabelBar.addStyleClass("first");\r
-} else {\r
-divider.removeStyleClass("first");\r
-dividerLabelBar.removeStyleClass("first");\r
-}\r
-\r
-if (i === dividerCount) {\r
-divider.addStyleClass("last");\r
-dividerLabelBar.addStyleClass("last");\r
-} else {\r
-divider.removeStyleClass("last");\r
-dividerLabelBar.removeStyleClass("last");\r
-}\r
-\r
-var left = paddingLeft + clientWidth * (i / dividerCount);\r
-var percentLeft = 100 * left / dividersLabelBarElementClientWidth;\r
-this._setDividerAndBarLeft(divider, dividerLabelBar, percentLeft);\r
-\r
-if (!isNaN(slice))\r
-dividerLabelBar._labelElement.textContent = calculator.formatValue(slice * i);\r
-else\r
-dividerLabelBar._labelElement.textContent = "";\r
-\r
-divider = divider.nextSibling;\r
-dividerLabelBar = dividerLabelBar.nextSibling;\r
-}\r
-\r
-\r
-while (divider) {\r
-var nextDivider = divider.nextSibling;\r
-this._dividersElement.removeChild(divider);\r
-divider = nextDivider;\r
-}\r
-while (dividerLabelBar) {\r
-var nextDivider = dividerLabelBar.nextSibling;\r
-this._dividersLabelBarElement.removeChild(dividerLabelBar);\r
-dividerLabelBar = nextDivider;\r
-}\r
-return true;\r
-},\r
-\r
-_setDividerAndBarLeft: function(divider, dividerLabelBar, percentLeft)\r
-{\r
-var percentStyleLeft = parseFloat(divider.style.left);\r
-if (!isNaN(percentStyleLeft) && Math.abs(percentStyleLeft - percentLeft) < 0.1)\r
-return;\r
-divider.style.left = percentLeft + "%";\r
-dividerLabelBar.style.left = percentLeft + "%";\r
-},\r
-\r
-addEventDivider: function(divider)\r
-{\r
-this._eventDividersElement.appendChild(divider);\r
-},\r
-\r
-addEventDividers: function(dividers)\r
-{\r
-this.element.removeChild(this._eventDividersElement);\r
-for (var i = 0; i < dividers.length; ++i)\r
-if (dividers[i])\r
-this._eventDividersElement.appendChild(dividers[i]);\r
-this.element.appendChild(this._eventDividersElement);\r
-},\r
-\r
-removeEventDividers: function()\r
-{\r
-this._eventDividersElement.removeChildren();\r
-},\r
-\r
-hideEventDividers: function()\r
-{\r
-this._eventDividersElement.addStyleClass("hidden");\r
-},\r
-\r
-showEventDividers: function()\r
-{\r
-this._eventDividersElement.removeStyleClass("hidden");\r
-},\r
-\r
-setScrollAndDividerTop: function(scrollTop, dividersTop)\r
-{\r
-this._dividersElement.style.top = scrollTop + "px";\r
-this._eventDividersElement.style.top = scrollTop + "px";\r
-this._dividersLabelBarElement.style.top = dividersTop + "px";\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-WebInspector.Resource = function(identifier, url)\r
-{\r
-this.identifier = identifier;\r
-this.url = url;\r
-this._startTime = -1;\r
-this._endTime = -1;\r
-this._requestMethod = "";\r
-this._category = WebInspector.resourceCategories.other;\r
-this._pendingContentCallbacks = [];\r
-}\r
-\r
-\r
-WebInspector.Resource.Type = {\r
-Document:   0,\r
-Stylesheet: 1,\r
-Image:      2,\r
-Font:       3,\r
-Script:     4,\r
-XHR:        5,\r
-Media:      6,\r
-WebSocket:  7,\r
-Other:      8,\r
-\r
-isTextType: function(type)\r
-{\r
-return (type === this.Document) || (type === this.Stylesheet) || (type === this.Script) || (type === this.XHR);\r
-},\r
-\r
-toUIString: function(type)\r
-{\r
-return WebInspector.UIString(WebInspector.Resource.Type.toString(type));\r
-},\r
-\r
-\r
-\r
-toString: function(type)\r
-{\r
-switch (type) {\r
-case this.Document:\r
-return "document";\r
-case this.Stylesheet:\r
-return "stylesheet";\r
-case this.Image:\r
-return "image";\r
-case this.Font:\r
-return "font";\r
-case this.Script:\r
-return "script";\r
-case this.XHR:\r
-return "xhr";\r
-case this.Media:\r
-return "media";\r
-case this.WebSocket:\r
-return "websocket";\r
-case this.Other:\r
-default:\r
-return "other";\r
-}\r
-}\r
-}\r
-\r
-WebInspector.Resource.prototype = {\r
-get url()\r
-{\r
-return this._url;\r
-},\r
-\r
-set url(x)\r
-{\r
-if (this._url === x)\r
-return;\r
-\r
-this._url = x;\r
-delete this._parsedQueryParameters;\r
-\r
-var parsedURL = x.asParsedURL();\r
-this.domain = parsedURL ? parsedURL.host : "";\r
-this.path = parsedURL ? parsedURL.path : "";\r
-this.lastPathComponent = "";\r
-if (parsedURL && parsedURL.path) {\r
-\r
-var path = parsedURL.path;\r
-var indexOfQuery = path.indexOf("?");\r
-if (indexOfQuery !== -1)\r
-path = path.substring(0, indexOfQuery);\r
-\r
-\r
-var lastSlashIndex = path.lastIndexOf("/");\r
-if (lastSlashIndex !== -1)\r
-this.lastPathComponent = path.substring(lastSlashIndex + 1);\r
-}\r
-this.lastPathComponentLowerCase = this.lastPathComponent.toLowerCase();\r
-},\r
-\r
-get documentURL()\r
-{\r
-return this._documentURL;\r
-},\r
-\r
-set documentURL(x)\r
-{\r
-this._documentURL = x;\r
-},\r
-\r
-get displayName()\r
-{\r
-if (this._displayName)\r
-return this._displayName;\r
-this._displayName = this.lastPathComponent;\r
-if (!this._displayName)\r
-this._displayName = this.displayDomain;\r
-if (!this._displayName && this.url)\r
-this._displayName = this.url.trimURL(WebInspector.mainResource ? WebInspector.mainResource.domain : "");\r
-if (this._displayName === "/")\r
-this._displayName = this.url;\r
-return this._displayName;\r
-},\r
-\r
-get displayDomain()\r
-{\r
-\r
-if (this.domain && (!WebInspector.mainResource || (WebInspector.mainResource && this.domain !== WebInspector.mainResource.domain)))\r
-return this.domain;\r
-return "";\r
-},\r
-\r
-get startTime()\r
-{\r
-return this._startTime || -1;\r
-},\r
-\r
-set startTime(x)\r
-{\r
-this._startTime = x;\r
-},\r
-\r
-get responseReceivedTime()\r
-{\r
-return this._responseReceivedTime || -1;\r
-},\r
-\r
-set responseReceivedTime(x)\r
-{\r
-this._responseReceivedTime = x;\r
-},\r
-\r
-get endTime()\r
-{\r
-return this._endTime || -1;\r
-},\r
-\r
-set endTime(x)\r
-{\r
-if (this.timing && this.timing.requestTime) {\r
-\r
-this._endTime = Math.max(x, this.responseReceivedTime);\r
-} else {\r
-\r
-this._endTime = x;\r
-if (this._responseReceivedTime > x)\r
-this._responseReceivedTime = x;\r
-}\r
-},\r
-\r
-get duration()\r
-{\r
-if (this._endTime === -1 || this._startTime === -1)\r
-return -1;\r
-return this._endTime - this._startTime;\r
-},\r
-\r
-get latency()\r
-{\r
-if (this._responseReceivedTime === -1 || this._startTime === -1)\r
-return -1;\r
-return this._responseReceivedTime - this._startTime;\r
-},\r
-\r
-get receiveDuration()\r
-{\r
-if (this._endTime === -1 || this._responseReceivedTime === -1)\r
-return -1;\r
-return this._endTime - this._responseReceivedTime;\r
-},\r
-\r
-get resourceSize()\r
-{\r
-return this._resourceSize || 0;\r
-},\r
-\r
-set resourceSize(x)\r
-{\r
-this._resourceSize = x;\r
-},\r
-\r
-get transferSize()\r
-{\r
-\r
-return this.cached ? 0 : Number(this.responseHeaders["Content-Length"] || this.resourceSize || 0);\r
-},\r
-\r
-get expectedContentLength()\r
-{\r
-return this._expectedContentLength || 0;\r
-},\r
-\r
-set expectedContentLength(x)\r
-{\r
-this._expectedContentLength = x;\r
-},\r
-\r
-get finished()\r
-{\r
-return this._finished;\r
-},\r
-\r
-set finished(x)\r
-{\r
-if (this._finished === x)\r
-return;\r
-\r
-this._finished = x;\r
-\r
-if (x) {\r
-this._checkWarnings();\r
-this.dispatchEventToListeners("finished");\r
-if (this._pendingContentCallbacks.length)\r
-this._innerRequestContent();\r
-}\r
-},\r
-\r
-get failed()\r
-{\r
-return this._failed;\r
-},\r
-\r
-set failed(x)\r
-{\r
-this._failed = x;\r
-},\r
-\r
-get category()\r
-{\r
-return this._category;\r
-},\r
-\r
-set category(x)\r
-{\r
-this._category = x;\r
-},\r
-\r
-get cached()\r
-{\r
-return this._cached;\r
-},\r
-\r
-set cached(x)\r
-{\r
-this._cached = x;\r
-if (x)\r
-delete this._timing;\r
-},\r
-\r
-\r
-get timing()\r
-{\r
-return this._timing;\r
-},\r
-\r
-set timing(x)\r
-{\r
-if (x && !this._cached) {\r
-\r
-\r
-this._startTime = x.requestTime;\r
-this._responseReceivedTime = x.requestTime + x.receiveHeadersEnd / 1000.0;\r
-\r
-this._timing = x;\r
-this.dispatchEventToListeners("timing changed");\r
-}\r
-},\r
-\r
-get mimeType()\r
-{\r
-return this._mimeType;\r
-},\r
-\r
-set mimeType(x)\r
-{\r
-this._mimeType = x;\r
-},\r
-\r
-get type()\r
-{\r
-return this._type;\r
-},\r
-\r
-set type(x)\r
-{\r
-if (this._type === x)\r
-return;\r
-\r
-this._type = x;\r
-\r
-switch (x) {\r
-case WebInspector.Resource.Type.Document:\r
-this.category = WebInspector.resourceCategories.documents;\r
-break;\r
-case WebInspector.Resource.Type.Stylesheet:\r
-this.category = WebInspector.resourceCategories.stylesheets;\r
-break;\r
-case WebInspector.Resource.Type.Script:\r
-this.category = WebInspector.resourceCategories.scripts;\r
-break;\r
-case WebInspector.Resource.Type.Image:\r
-this.category = WebInspector.resourceCategories.images;\r
-break;\r
-case WebInspector.Resource.Type.Font:\r
-this.category = WebInspector.resourceCategories.fonts;\r
-break;\r
-case WebInspector.Resource.Type.XHR:\r
-this.category = WebInspector.resourceCategories.xhr;\r
-break;\r
-case WebInspector.Resource.Type.WebSocket:\r
-this.category = WebInspector.resourceCategories.websockets;\r
-break;\r
-case WebInspector.Resource.Type.Other:\r
-default:\r
-this.category = WebInspector.resourceCategories.other;\r
-break;\r
-}\r
-},\r
-\r
-get requestHeaders()\r
-{\r
-return this._requestHeaders || {};\r
-},\r
-\r
-set requestHeaders(x)\r
-{\r
-this._requestHeaders = x;\r
-delete this._sortedRequestHeaders;\r
-delete this._requestCookies;\r
-\r
-this.dispatchEventToListeners("requestHeaders changed");\r
-},\r
-\r
-get sortedRequestHeaders()\r
-{\r
-if (this._sortedRequestHeaders !== undefined)\r
-return this._sortedRequestHeaders;\r
-\r
-this._sortedRequestHeaders = [];\r
-for (var key in this.requestHeaders)\r
-this._sortedRequestHeaders.push({header: key, value: this.requestHeaders[key]});\r
-this._sortedRequestHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });\r
-\r
-return this._sortedRequestHeaders;\r
-},\r
-\r
-requestHeaderValue: function(headerName)\r
-{\r
-return this._headerValue(this.requestHeaders, headerName);\r
-},\r
-\r
-get requestCookies()\r
-{\r
-if (!this._requestCookies)\r
-this._requestCookies = WebInspector.CookieParser.parseCookie(this.requestHeaderValue("Cookie"));\r
-return this._requestCookies;\r
-},\r
-\r
-get requestFormData()\r
-{\r
-return this._requestFormData;\r
-},\r
-\r
-set requestFormData(x)\r
-{\r
-this._requestFormData = x;\r
-delete this._parsedFormParameters;\r
-},\r
-\r
-get responseHeaders()\r
-{\r
-return this._responseHeaders || {};\r
-},\r
-\r
-set responseHeaders(x)\r
-{\r
-this._responseHeaders = x;\r
-delete this._sortedResponseHeaders;\r
-delete this._responseCookies;\r
-\r
-this.dispatchEventToListeners("responseHeaders changed");\r
-},\r
-\r
-get sortedResponseHeaders()\r
-{\r
-if (this._sortedResponseHeaders !== undefined)\r
-return this._sortedResponseHeaders;\r
-\r
-this._sortedResponseHeaders = [];\r
-for (var key in this.responseHeaders)\r
-this._sortedResponseHeaders.push({header: key, value: this.responseHeaders[key]});\r
-this._sortedResponseHeaders.sort(function(a,b) { return a.header.localeCompare(b.header) });\r
-\r
-return this._sortedResponseHeaders;\r
-},\r
-\r
-responseHeaderValue: function(headerName)\r
-{\r
-return this._headerValue(this.responseHeaders, headerName);\r
-},\r
-\r
-get responseCookies()\r
-{\r
-if (!this._responseCookies)\r
-this._responseCookies = WebInspector.CookieParser.parseSetCookie(this.responseHeaderValue("Set-Cookie"));\r
-return this._responseCookies;\r
-},\r
-\r
-get queryParameters()\r
-{\r
-if (this._parsedQueryParameters)\r
-return this._parsedQueryParameters;\r
-var queryString = this.url.split("?", 2)[1];\r
-if (!queryString)\r
-return;\r
-this._parsedQueryParameters = this._parseParameters(queryString);\r
-return this._parsedQueryParameters;\r
-},\r
-\r
-get formParameters()\r
-{\r
-if (this._parsedFormParameters)\r
-return this._parsedFormParameters;\r
-if (!this.requestFormData)\r
-return;\r
-var requestContentType = this.requestHeaderValue("Content-Type");\r
-if (!requestContentType || !requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))\r
-return;\r
-this._parsedFormParameters = this._parseParameters(this.requestFormData);\r
-return this._parsedFormParameters;\r
-},\r
-\r
-_parseParameters: function(queryString)\r
-{\r
-function parseNameValue(pair)\r
-{\r
-var parameter = {};\r
-var splitPair = pair.split("=", 2);\r
-\r
-parameter.name = splitPair[0];\r
-if (splitPair.length === 1)\r
-parameter.value = "";\r
-else\r
-parameter.value = splitPair[1];\r
-return parameter;\r
-}\r
-return queryString.split("&").map(parseNameValue);\r
-},\r
-\r
-_headerValue: function(headers, headerName)\r
-{\r
-headerName = headerName.toLowerCase();\r
-for (var header in headers) {\r
-if (header.toLowerCase() === headerName)\r
-return headers[header];\r
-}\r
-},\r
-\r
-get errors()\r
-{\r
-return this._errors || 0;\r
-},\r
-\r
-set errors(x)\r
-{\r
-this._errors = x;\r
-this.dispatchEventToListeners("errors-warnings-updated");\r
-},\r
-\r
-get warnings()\r
-{\r
-return this._warnings || 0;\r
-},\r
-\r
-set warnings(x)\r
-{\r
-this._warnings = x;\r
-this.dispatchEventToListeners("errors-warnings-updated");\r
-},\r
-\r
-clearErrorsAndWarnings: function()\r
-{\r
-this._warnings = 0;\r
-this._errors = 0;\r
-this.dispatchEventToListeners("errors-warnings-updated");\r
-},\r
-\r
-_mimeTypeIsConsistentWithType: function()\r
-{\r
-\r
-\r
-\r
-if (this.statusCode >= 400)\r
-return true;\r
-\r
-if (typeof this.type === "undefined"\r
-|| this.type === WebInspector.Resource.Type.Other\r
-|| this.type === WebInspector.Resource.Type.XHR\r
-|| this.type === WebInspector.Resource.Type.WebSocket)\r
-return true;\r
-\r
-if (!this.mimeType)\r
-return true; \r
-\r
-if (this.mimeType in WebInspector.MIMETypes)\r
-return this.type in WebInspector.MIMETypes[this.mimeType];\r
-\r
-return false;\r
-},\r
-\r
-_checkWarnings: function()\r
-{\r
-for (var warning in WebInspector.Warnings)\r
-this._checkWarning(WebInspector.Warnings[warning]);\r
-},\r
-\r
-_checkWarning: function(warning)\r
-{\r
-var msg;\r
-switch (warning.id) {\r
-case WebInspector.Warnings.IncorrectMIMEType.id:\r
-if (!this._mimeTypeIsConsistentWithType())\r
-msg = new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.Other,\r
-WebInspector.ConsoleMessage.MessageType.Log,\r
-WebInspector.ConsoleMessage.MessageLevel.Warning,\r
--1,\r
-this.url,\r
-1,\r
-String.sprintf(WebInspector.Warnings.IncorrectMIMEType.message, WebInspector.Resource.Type.toUIString(this.type), this.mimeType),\r
-null,\r
-null);\r
-break;\r
-}\r
-\r
-if (msg)\r
-WebInspector.console.addMessage(msg);\r
-},\r
-\r
-get content()\r
-{\r
-return this._content;\r
-},\r
-\r
-get contentTimestamp()\r
-{\r
-return this._contentTimestamp;\r
-},\r
-\r
-setInitialContent: function(content)\r
-{\r
-this._content = content;\r
-},\r
-\r
-isLocallyModified: function()\r
-{\r
-return !!this._baseRevision;\r
-},\r
-\r
-setContent: function(newContent, onRevert)\r
-{\r
-var revisionResource = new WebInspector.Resource(null, this.url);\r
-revisionResource.type = this.type;\r
-revisionResource.loader = this.loader;\r
-revisionResource.timestamp = this.timestamp;\r
-revisionResource._content = this._content;\r
-revisionResource._actualResource = this;\r
-revisionResource._fireOnRevert = onRevert;\r
-\r
-if (this.finished)\r
-revisionResource.finished = true;\r
-else {\r
-function finished()\r
-{\r
-this.removeEventListener("finished", finished);\r
-revisionResource.finished = true;\r
-}\r
-this.addEventListener("finished", finished.bind(this));\r
-}\r
-\r
-if (!this._baseRevision)\r
-this._baseRevision = revisionResource;\r
-else\r
-revisionResource._baseRevision = this._baseRevision;\r
-\r
-var data = { revision: revisionResource };\r
-this._content = newContent;\r
-this.timestamp = new Date();\r
-this.dispatchEventToListeners("content-changed", data);\r
-},\r
-\r
-revertToThis: function()\r
-{\r
-if (!this._actualResource || !this._fireOnRevert)\r
-return;\r
-\r
-function callback(content)\r
-{\r
-if (content)\r
-this._fireOnRevert(content);\r
-}\r
-this.requestContent(callback.bind(this));\r
-},\r
-\r
-get baseRevision()\r
-{\r
-return this._baseRevision;\r
-},\r
-\r
-requestContent: function(callback)\r
-{\r
-if (this._content) {\r
-callback(this._content, this._contentEncoded);\r
-return;\r
-}\r
-this._pendingContentCallbacks.push(callback);\r
-if (this.finished)\r
-this._innerRequestContent();\r
-},\r
-\r
-get contentURL()\r
-{\r
-const maxDataUrlSize = 1024 * 1024;\r
-\r
-if (!this._content || this._content.length > maxDataUrlSize)\r
-return this.url;\r
-\r
-return "data:" + this.mimeType + (this._contentEncoded ? ";base64," : ",") + this._content;\r
-},\r
-\r
-_innerRequestContent: function()\r
-{\r
-if (this._contentRequested)\r
-return;\r
-this._contentRequested = true;\r
-this._contentEncoded = !WebInspector.Resource.Type.isTextType(this.type);\r
-\r
-function onResourceContent(data)\r
-{\r
-this._content = data;\r
-var callbacks = this._pendingContentCallbacks.slice();\r
-for (var i = 0; i < callbacks.length; ++i)\r
-callbacks[i](this._content, this._contentEncoded);\r
-this._pendingContentCallbacks.length = 0;\r
-delete this._contentRequested;\r
-}\r
-WebInspector.ResourceManager.requestContent(this, this._contentEncoded, onResourceContent.bind(this));\r
-}\r
-}\r
-\r
-WebInspector.Resource.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ResourceManager = function()\r
-{\r
-this._resourcesById = {};\r
-this._resourcesByURL = {};\r
-this._resourceTreeModel = new WebInspector.ResourceTreeModel();\r
-InspectorBackend.cachedResources(this._processCachedResources.bind(this));\r
-InspectorBackend.registerDomainDispatcher("Resources", this);\r
-}\r
-\r
-WebInspector.ResourceManager.prototype = {\r
-identifierForInitialRequest: function(identifier, url, loader, callStack)\r
-{\r
-var resource = this._createResource(identifier, url, loader, callStack);\r
-\r
-\r
-this._bindResourceURL(resource);\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-WebInspector.panels.audits.resourceStarted(resource);\r
-},\r
-\r
-_createResource: function(identifier, url, loader, stackTrace)\r
-{\r
-var resource = new WebInspector.Resource(identifier, url);\r
-resource.loader = loader;\r
-if (loader)\r
-resource.documentURL = loader.url;\r
-resource.stackTrace = stackTrace;\r
-\r
-this._resourcesById[identifier] = resource;\r
-return resource;\r
-},\r
-\r
-willSendRequest: function(identifier, time, request, redirectResponse)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-\r
-\r
-var isRedirect = !redirectResponse.isNull && request.url.length;\r
-if (isRedirect) {\r
-resource.endTime = time;\r
-this.didReceiveResponse(identifier, time, "Other", redirectResponse);\r
-resource = this._appendRedirect(resource.identifier, request.url);\r
-}\r
-\r
-this._updateResourceWithRequest(resource, request);\r
-resource.startTime = time;\r
-\r
-if (isRedirect) {\r
-WebInspector.panels.network.refreshResource(resource);\r
-WebInspector.panels.audits.resourceStarted(resource);\r
-} else \r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-_updateResourceWithRequest: function(resource, request)\r
-{\r
-resource.requestMethod = request.httpMethod;\r
-resource.requestHeaders = request.httpHeaderFields;\r
-resource.requestFormData = request.requestFormData;\r
-},\r
-\r
-_appendRedirect: function(identifier, redirectURL)\r
-{\r
-var originalResource = this._resourcesById[identifier];\r
-originalResource.identifier = null;\r
-\r
-var newResource = this._createResource(identifier, redirectURL, originalResource.loader, originalResource.stackTrace);\r
-newResource.redirects = originalResource.redirects || [];\r
-delete originalResource.redirects;\r
-newResource.redirects.push(originalResource);\r
-return newResource;\r
-},\r
-\r
-markResourceAsCached: function(identifier)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.cached = true;\r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-didReceiveResponse: function(identifier, time, resourceType, response)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.responseReceivedTime = time;\r
-resource.type = WebInspector.Resource.Type[resourceType];\r
-\r
-this._updateResourceWithResponse(resource, response);\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-this._resourceTreeModel.addResourceToFrame(resource.loader.frameId, resource);\r
-},\r
-\r
-_updateResourceWithResponse: function(resource, response)\r
-{\r
-if (resource.isNull)\r
-return;\r
-\r
-resource.mimeType = response.mimeType;\r
-resource.expectedContentLength = response.expectedContentLength;\r
-resource.textEncodingName = response.textEncodingName;\r
-resource.suggestedFilename = response.suggestedFilename;\r
-resource.statusCode = response.httpStatusCode;\r
-resource.statusText = response.httpStatusText;\r
-\r
-resource.responseHeaders = response.httpHeaderFields;\r
-resource.connectionReused = response.connectionReused;\r
-resource.connectionID = response.connectionID;\r
-\r
-if (response.wasCached)\r
-resource.cached = true;\r
-else\r
-resource.timing = response.timing;\r
-\r
-if (response.loadInfo) {\r
-if (response.loadInfo.httpStatusCode)\r
-resource.statusCode = response.loadInfo.httpStatusCode;\r
-if (response.loadInfo.httpStatusText)\r
-resource.statusText = response.loadInfo.httpStatusText;\r
-resource.requestHeaders = response.loadInfo.requestHeaders;\r
-resource.responseHeaders = response.loadInfo.responseHeaders;\r
-}\r
-},\r
-\r
-didReceiveContentLength: function(identifier, time, lengthReceived)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.resourceSize += lengthReceived;\r
-resource.endTime = time;\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-didFinishLoading: function(identifier, finishTime)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.endTime = finishTime;\r
-resource.finished = true;\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-WebInspector.panels.audits.resourceFinished(resource);\r
-WebInspector.extensionServer.notifyResourceFinished(resource);\r
-delete this._resourcesById[identifier];\r
-},\r
-\r
-didFailLoading: function(identifier, time, localizedDescription)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.failed = true;\r
-resource.localizedFailDescription = localizedDescription;\r
-resource.finished = true;\r
-resource.endTime = time;\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-WebInspector.panels.audits.resourceFinished(resource);\r
-WebInspector.extensionServer.notifyResourceFinished(resource);\r
-delete this._resourcesById[identifier];\r
-},\r
-\r
-didLoadResourceFromMemoryCache: function(time, cachedResource)\r
-{\r
-var resource = this._createResource(null, cachedResource.url, cachedResource.loader);\r
-this._updateResourceWithCachedResource(resource, cachedResource);\r
-resource.cached = true;\r
-resource.requestMethod = "GET";\r
-resource.startTime = resource.responseReceivedTime = resource.endTime = time;\r
-resource.finished = true;\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-WebInspector.panels.audits.resourceStarted(resource);\r
-WebInspector.panels.audits.resourceFinished(resource);\r
-this._resourceTreeModel.addResourceToFrame(resource.loader.frameId, resource);\r
-},\r
-\r
-_updateResourceWithCachedResource: function(resource, cachedResource)\r
-{\r
-resource.type = WebInspector.Resource.Type[cachedResource.type];\r
-resource.resourceSize = cachedResource.encodedSize;\r
-this._updateResourceWithResponse(resource, cachedResource.response);\r
-},\r
-\r
-setInitialContent: function(identifier, sourceString, type)\r
-{\r
-var resource = WebInspector.panels.network.resources[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.type = WebInspector.Resource.Type[type];\r
-resource.setInitialContent(sourceString);\r
-WebInspector.panels.resources.refreshResource(resource);\r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-didCommitLoadForFrame: function(frame, loader)\r
-{\r
-this._resourceTreeModel.didCommitLoadForFrame(frame, loader);\r
-if (!frame.parentId) {\r
-var mainResource = this.resourceForURL(frame.url);\r
-if (mainResource) {\r
-WebInspector.mainResource = mainResource;\r
-mainResource.isMainResource = true;\r
-}\r
-}\r
-},\r
-\r
-frameDetachedFromParent: function(frameId)\r
-{\r
-this._resourceTreeModel.frameDetachedFromParent(frameId);\r
-},\r
-\r
-didCreateWebSocket: function(identifier, requestURL)\r
-{\r
-var resource = this._createResource(identifier, requestURL);\r
-resource.type = WebInspector.Resource.Type.WebSocket;\r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-willSendWebSocketHandshakeRequest: function(identifier, time, request)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.requestMethod = "GET";\r
-resource.requestHeaders = request.webSocketHeaderFields;\r
-resource.webSocketRequestKey3 = request.webSocketRequestKey3;\r
-resource.startTime = time;\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-didReceiveWebSocketHandshakeResponse: function(identifier, time, response)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-\r
-resource.statusCode = response.statusCode;\r
-resource.statusText = response.statusText;\r
-resource.responseHeaders = response.webSocketHeaderFields;\r
-resource.webSocketChallengeResponse = response.webSocketChallengeResponse;\r
-resource.responseReceivedTime = time;\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-didCloseWebSocket: function(identifier, time)\r
-{\r
-var resource = this._resourcesById[identifier];\r
-if (!resource)\r
-return;\r
-resource.endTime = time;\r
-\r
-WebInspector.panels.network.refreshResource(resource);\r
-},\r
-\r
-_processCachedResources: function(mainFramePayload)\r
-{\r
-var mainResource = this._addFramesRecursively(mainFramePayload);\r
-WebInspector.mainResource = mainResource;\r
-mainResource.isMainResource = true;\r
-},\r
-\r
-_addFramesRecursively: function(framePayload)\r
-{\r
-var frameResource = this._createResource(null, framePayload.resource.url, framePayload.resource.loader);\r
-this._updateResourceWithRequest(frameResource, framePayload.resource.request);\r
-this._updateResourceWithResponse(frameResource, framePayload.resource.response);\r
-frameResource.type = WebInspector.Resource.Type["Document"];\r
-frameResource.finished = true;\r
-this._bindResourceURL(frameResource);\r
-\r
-this._resourceTreeModel.addOrUpdateFrame(framePayload);\r
-this._resourceTreeModel.addResourceToFrame(framePayload.id, frameResource);\r
-\r
-for (var i = 0; framePayload.children && i < framePayload.children.length; ++i)\r
-this._addFramesRecursively(framePayload.children[i]);\r
-\r
-if (!framePayload.subresources)\r
-return;\r
-\r
-for (var i = 0; i < framePayload.subresources.length; ++i) {\r
-var cachedResource = framePayload.subresources[i];\r
-var resource = this._createResource(null, cachedResource.url, cachedResource.loader);\r
-this._updateResourceWithCachedResource(resource, cachedResource);\r
-resource.finished = true;\r
-this._bindResourceURL(resource);\r
-this._resourceTreeModel.addResourceToFrame(framePayload.id, resource);\r
-}\r
-return frameResource;\r
-},\r
-\r
-resourceForURL: function(url)\r
-{\r
-\r
-var entry = this._resourcesByURL[url];\r
-if (entry instanceof Array)\r
-return entry[0];\r
-return entry;\r
-},\r
-\r
-addConsoleMessage: function(msg)\r
-{\r
-var resource = this.resourceForURL(msg.url);\r
-if (!resource)\r
-return;\r
-\r
-switch (msg.level) {\r
-case WebInspector.ConsoleMessage.MessageLevel.Warning:\r
-resource.warnings += msg.repeatDelta;\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Error:\r
-resource.errors += msg.repeatDelta;\r
-break;\r
-}\r
-\r
-var view = WebInspector.ResourceManager.resourceViewForResource(resource);\r
-if (view.addMessage)\r
-view.addMessage(msg);\r
-},\r
-\r
-clearConsoleMessages: function()\r
-{\r
-function callback(resource)\r
-{\r
-resource.clearErrorsAndWarnings();\r
-}\r
-this._resourceTreeModel.forAllResources(callback);\r
-},\r
-\r
-forAllResources: function(callback)\r
-{\r
-this._resourceTreeModel.forAllResources(callback);\r
-},\r
-\r
-_bindResourceURL: function(resource)\r
-{\r
-var resourceForURL = this._resourcesByURL[resource.url];\r
-if (!resourceForURL)\r
-this._resourcesByURL[resource.url] = resource;\r
-else if (resourceForURL instanceof Array)\r
-resourceForURL.push(resource);\r
-else\r
-this._resourcesByURL[resource.url] = [resourceForURL, resource];\r
-},\r
-\r
-_unbindResourceURL: function(resource)\r
-{\r
-var resourceForURL = this._resourcesByURL[resource.url];\r
-if (!resourceForURL)\r
-return;\r
-\r
-if (resourceForURL instanceof Array) {\r
-resourceForURL.remove(resource, true);\r
-if (resourceForURL.length === 1)\r
-this._resourcesByURL[resource.url] = resourceForURL[0];\r
-return;\r
-}\r
-\r
-delete this._resourcesByURL[resource.url];\r
-},\r
-\r
-updateDOMStorage: function(storageId)\r
-{\r
-WebInspector.panels.resources.updateDOMStorage(storageId);\r
-},\r
-\r
-updateApplicationCacheStatus: function(status)\r
-{\r
-WebInspector.panels.resources.updateApplicationCacheStatus(status);\r
-},\r
-\r
-didGetFileSystemPath: function(root, type, origin)\r
-{\r
-WebInspector.panels.resources.updateFileSystemPath(root, type, origin);\r
-},\r
-\r
-didGetFileSystemError: function(type, origin)\r
-{\r
-WebInspector.panels.resources.updateFileSystemError(type, origin);\r
-},\r
-\r
-didGetFileSystemDisabled: function()\r
-{\r
-WebInspector.panels.resources.setFileSystemDisabled();\r
-},\r
-\r
-updateNetworkState: function(isNowOnline)\r
-{\r
-WebInspector.panels.resources.updateNetworkState(isNowOnline);\r
-},\r
-\r
-addDOMStorage: function(payload)\r
-{\r
-if (!WebInspector.panels.resources)\r
-return;\r
-var domStorage = new WebInspector.DOMStorage(\r
-payload.id,\r
-payload.host,\r
-payload.isLocalStorage);\r
-WebInspector.panels.resources.addDOMStorage(domStorage);\r
-},\r
-\r
-selectDOMStorage: function(o)\r
-{\r
-WebInspector.showPanel("resources");\r
-WebInspector.panels.resources.selectDOMStorage(o);\r
-},\r
-\r
-addDatabase: function(payload)\r
-{\r
-if (!WebInspector.panels.resources)\r
-return;\r
-var database = new WebInspector.Database(\r
-payload.id,\r
-payload.domain,\r
-payload.name,\r
-payload.version);\r
-WebInspector.panels.resources.addDatabase(database);\r
-},\r
-\r
-selectDatabase: function(o)\r
-{\r
-WebInspector.showPanel("resources");\r
-WebInspector.panels.resources.selectDatabase(o);\r
-},\r
-\r
-sqlTransactionSucceeded: function(transactionId, columnNames, values)\r
-{\r
-var callback = WebInspector.Database.successCallbacks[transactionId];\r
-if (!callback)\r
-return;\r
-delete WebInspector.Database.successCallbacks[transactionId];\r
-callback(columnNames, values);\r
-},\r
-\r
-sqlTransactionFailed: function(transactionId, errorObj)\r
-{\r
-var callback = WebInspector.Database.errorCallbacks[transactionId];\r
-if (!callback)\r
-return;\r
-delete WebInspector.Database.errorCallbacks[transactionId];\r
-callback(errorObj);\r
-}\r
-}\r
-\r
-WebInspector.ResourceManager.createResourceView = function(resource)\r
-{\r
-switch (resource.category) {\r
-case WebInspector.resourceCategories.documents:\r
-case WebInspector.resourceCategories.stylesheets:\r
-case WebInspector.resourceCategories.scripts:\r
-case WebInspector.resourceCategories.xhr:\r
-return new WebInspector.SourceView(resource);\r
-case WebInspector.resourceCategories.images:\r
-return new WebInspector.ImageView(resource);\r
-case WebInspector.resourceCategories.fonts:\r
-return new WebInspector.FontView(resource);\r
-default:\r
-return new WebInspector.ResourceView(resource);\r
-}\r
-}\r
-\r
-WebInspector.ResourceManager.resourceViewTypeMatchesResource = function(resource)\r
-{\r
-var resourceView = resource._resourcesView;\r
-switch (resource.category) {\r
-case WebInspector.resourceCategories.documents:\r
-case WebInspector.resourceCategories.stylesheets:\r
-case WebInspector.resourceCategories.scripts:\r
-case WebInspector.resourceCategories.xhr:\r
-return resourceView.__proto__ === WebInspector.SourceView.prototype;\r
-case WebInspector.resourceCategories.images:\r
-return resourceView.__proto__ === WebInspector.ImageView.prototype;\r
-case WebInspector.resourceCategories.fonts:\r
-return resourceView.__proto__ === WebInspector.FontView.prototype;\r
-default:\r
-return resourceView.__proto__ === WebInspector.ResourceView.prototype;\r
-}\r
-}\r
-\r
-WebInspector.ResourceManager.resourceViewForResource = function(resource)\r
-{\r
-if (!resource)\r
-return null;\r
-if (!resource._resourcesView)\r
-resource._resourcesView = WebInspector.ResourceManager.createResourceView(resource);\r
-return resource._resourcesView;\r
-}\r
-\r
-WebInspector.ResourceManager.recreateResourceView = function(resource)\r
-{\r
-var newView = WebInspector.ResourceManager.createResourceView(resource);\r
-\r
-var oldView = resource._resourcesView;\r
-var oldViewParentNode = oldView.visible ? oldView.element.parentNode : null;\r
-var scrollTop = oldView.scrollTop;\r
-\r
-resource._resourcesView.detach();\r
-delete resource._resourcesView;\r
-\r
-resource._resourcesView = newView;\r
-\r
-if (oldViewParentNode)\r
-newView.show(oldViewParentNode);\r
-if (scrollTop)\r
-newView.scrollTop = scrollTop;\r
-\r
-WebInspector.panels.scripts.viewRecreated(oldView, newView);\r
-return newView;\r
-}\r
-\r
-WebInspector.ResourceManager.existingResourceViewForResource = function(resource)\r
-{\r
-if (!resource)\r
-return null;\r
-return resource._resourcesView;\r
-}\r
-\r
-WebInspector.ResourceManager.requestContent = function(resource, base64Encode, callback)\r
-{\r
-InspectorBackend.resourceContent(resource.loader.frameId, resource.url, base64Encode, callback);\r
-}\r
-\r
-WebInspector.ResourceTreeModel = function()\r
-{\r
-this._resourcesByFrameId = {};\r
-this._subframes = {};\r
-}\r
-\r
-WebInspector.ResourceTreeModel.prototype = {\r
-addOrUpdateFrame: function(frame)\r
-{\r
-var tmpResource = new WebInspector.Resource(null, frame.url);\r
-WebInspector.panels.resources.addOrUpdateFrame(frame.parentId, frame.id, frame.name, tmpResource.displayName);\r
-var subframes = this._subframes[frame.parentId];\r
-if (!subframes) {\r
-subframes = {};\r
-this._subframes[frame.parentId || 0] = subframes;\r
-}\r
-subframes[frame.id] = true;\r
-},\r
-\r
-didCommitLoadForFrame: function(frame, loader)\r
-{\r
-\r
-this._clearChildFramesAndResources(frame.parentId ? frame.id : 0, loader.loaderId);\r
-\r
-this.addOrUpdateFrame(frame);\r
-\r
-var resourcesForFrame = this._resourcesByFrameId[frame.id];\r
-for (var i = 0; resourcesForFrame && i < resourcesForFrame.length; ++i)\r
-WebInspector.panels.resources.addResourceToFrame(frame.id, resourcesForFrame[i]);\r
-},\r
-\r
-frameDetachedFromParent: function(frameId)\r
-{\r
-this._clearChildFramesAndResources(frameId, 0);\r
-WebInspector.panels.resources.removeFrame(frameId);\r
-},\r
-\r
-_clearChildFramesAndResources: function(frameId, loaderId)\r
-{\r
-WebInspector.panels.resources.removeResourcesFromFrame(frameId);\r
-\r
-this._clearResources(frameId, loaderId);\r
-var subframes = this._subframes[frameId];\r
-if (!subframes)\r
-return;\r
-\r
-for (var childFrameId in subframes) {\r
-WebInspector.panels.resources.removeFrame(childFrameId);\r
-this._clearChildFramesAndResources(childFrameId, loaderId);\r
-}\r
-delete this._subframes[frameId];\r
-},\r
-\r
-addResourceToFrame: function(frameId, resource)\r
-{\r
-var resourcesForFrame = this._resourcesByFrameId[frameId];\r
-if (!resourcesForFrame) {\r
-resourcesForFrame = [];\r
-this._resourcesByFrameId[frameId] = resourcesForFrame;\r
-}\r
-resourcesForFrame.push(resource);\r
-\r
-WebInspector.panels.resources.addResourceToFrame(frameId, resource);\r
-},\r
-\r
-_clearResources: function(frameId, loaderToPreserveId)\r
-{\r
-var resourcesForFrame = this._resourcesByFrameId[frameId];\r
-if (!resourcesForFrame)\r
-return;\r
-\r
-var preservedResourcesForFrame = [];\r
-for (var i = 0; i < resourcesForFrame.length; ++i) {\r
-var resource = resourcesForFrame[i];\r
-if (resource.loader.loaderId === loaderToPreserveId) {\r
-preservedResourcesForFrame.push(resource);\r
-continue;\r
-}\r
-WebInspector.resourceManager._unbindResourceURL(resource);\r
-}\r
-\r
-delete this._resourcesByFrameId[frameId];\r
-if (preservedResourcesForFrame.length)\r
-this._resourcesByFrameId[frameId] = preservedResourcesForFrame;\r
-},\r
-\r
-forAllResources: function(callback)\r
-{\r
-this._callForFrameResources(0, callback);\r
-},\r
-\r
-_callForFrameResources: function(frameId, callback)\r
-{\r
-var resources = this._resourcesByFrameId[frameId];\r
-for (var i = 0; resources && i < resources.length; ++i) {\r
-if (callback(resources[i]))\r
-return true;\r
-}\r
-\r
-var frames = this._subframes[frameId];\r
-if (frames) {\r
-for (var id in frames) {\r
-if (this._callForFrameResources(id, callback))\r
-return true;\r
-}\r
-}\r
-return false;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ResourceCategory = function(name, title, color)\r
-{\r
-this.name = name;\r
-this.title = title;\r
-this.color = color;\r
-}\r
-\r
-WebInspector.ResourceCategory.prototype = {\r
-toString: function()\r
-{\r
-return this.title;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Database = function(id, domain, name, version)\r
-{\r
-this._id = id;\r
-this._domain = domain;\r
-this._name = name;\r
-this._version = version;\r
-}\r
-\r
-WebInspector.Database.successCallbacks = {};\r
-WebInspector.Database.errorCallbacks = {};\r
-\r
-WebInspector.Database.prototype = {\r
-get id()\r
-{\r
-return this._id;\r
-},\r
-\r
-get name()\r
-{\r
-return this._name;\r
-},\r
-\r
-set name(x)\r
-{\r
-this._name = x;\r
-},\r
-\r
-get version()\r
-{\r
-return this._version;\r
-},\r
-\r
-set version(x)\r
-{\r
-this._version = x;\r
-},\r
-\r
-get domain()\r
-{\r
-return this._domain;\r
-},\r
-\r
-set domain(x)\r
-{\r
-this._domain = x;\r
-},\r
-\r
-get displayDomain()\r
-{\r
-return WebInspector.Resource.prototype.__lookupGetter__("displayDomain").call(this);\r
-},\r
-\r
-getTableNames: function(callback)\r
-{\r
-function sortingCallback(names)\r
-{\r
-callback(names.sort());\r
-}\r
-InspectorBackend.getDatabaseTableNames(this._id, sortingCallback);\r
-},\r
-\r
-executeSql: function(query, onSuccess, onError)\r
-{\r
-function callback(success, transactionId)\r
-{\r
-if (!success) {\r
-onError(WebInspector.UIString("Database not found."));\r
-return;\r
-}\r
-WebInspector.Database.successCallbacks[transactionId] = onSuccess;\r
-WebInspector.Database.errorCallbacks[transactionId] = onError;\r
-}\r
-InspectorBackend.executeSQL(this._id, query, callback);\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DOMStorage = function(id, domain, isLocalStorage)\r
-{\r
-this._id = id;\r
-this._domain = domain;\r
-this._isLocalStorage = isLocalStorage;\r
-}\r
-\r
-WebInspector.DOMStorage.prototype = {\r
-get id()\r
-{\r
-return this._id;\r
-},\r
-\r
-get domStorage()\r
-{\r
-return this._domStorage;\r
-},\r
-\r
-get domain()\r
-{\r
-return this._domain;\r
-},\r
-\r
-get isLocalStorage()\r
-{\r
-return this._isLocalStorage;\r
-},\r
-\r
-getEntries: function(callback)\r
-{\r
-InspectorBackend.getDOMStorageEntries(this._id, callback);\r
-},\r
-\r
-setItem: function(key, value, callback)\r
-{\r
-InspectorBackend.setDOMStorageItem(this._id, key, value, callback);\r
-},\r
-\r
-removeItem: function(key, callback)\r
-{\r
-InspectorBackend.removeDOMStorageItem(this._id, key, callback);\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DOMStorageItemsView = function(domStorage)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.domStorage = domStorage;\r
-\r
-this.element.addStyleClass("storage-view");\r
-this.element.addStyleClass("table");\r
-\r
-this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");\r
-this.deleteButton.visible = false;\r
-this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);\r
-\r
-this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");\r
-this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);\r
-}\r
-\r
-WebInspector.DOMStorageItemsView.prototype = {\r
-get statusBarItems()\r
-{\r
-return [this.refreshButton.element, this.deleteButton.element];\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this.update();\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.View.prototype.hide.call(this);\r
-this.deleteButton.visible = false;\r
-},\r
-\r
-update: function()\r
-{\r
-this.element.removeChildren();\r
-var callback = this._showDOMStorageEntries.bind(this);\r
-this.domStorage.getEntries(callback);\r
-},\r
-\r
-_showDOMStorageEntries: function(entries)\r
-{\r
-this._dataGrid = this._dataGridForDOMStorageEntries(entries);\r
-this.element.appendChild(this._dataGrid.element);\r
-this._dataGrid.autoSizeColumns(10);\r
-this.deleteButton.visible = true;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this._dataGrid)\r
-this._dataGrid.updateWidths();\r
-},\r
-\r
-_dataGridForDOMStorageEntries: function(entries)\r
-{\r
-var columns = {};\r
-columns[0] = {};\r
-columns[1] = {};\r
-columns[0].title = WebInspector.UIString("Key");\r
-columns[1].title = WebInspector.UIString("Value");\r
-\r
-var nodes = [];\r
-\r
-var keys = [];\r
-var length = entries.length;\r
-for (var i = 0; i < entries.length; i++) {\r
-var data = {};\r
-\r
-var key = entries[i][0];\r
-data[0] = key;\r
-var value = entries[i][1];\r
-data[1] = value;\r
-var node = new WebInspector.DataGridNode(data, false);\r
-node.selectable = true;\r
-nodes.push(node);\r
-keys.push(key);\r
-}\r
-\r
-var dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));\r
-var length = nodes.length;\r
-for (var i = 0; i < length; ++i)\r
-dataGrid.appendChild(nodes[i]);\r
-dataGrid.addCreationNode(false);\r
-if (length > 0)\r
-nodes[0].selected = true;\r
-return dataGrid;\r
-},\r
-\r
-_deleteButtonClicked: function(event)\r
-{\r
-if (!this._dataGrid || !this._dataGrid.selectedNode)\r
-return;\r
-\r
-this._deleteCallback(this._dataGrid.selectedNode);\r
-},\r
-\r
-_refreshButtonClicked: function(event)\r
-{\r
-this.update();\r
-},\r
-\r
-_editingCallback: function(editingNode, columnIdentifier, oldText, newText)\r
-{\r
-var domStorage = this.domStorage;\r
-if (columnIdentifier === 0) {\r
-if (oldText)\r
-domStorage.removeItem(oldText);\r
-\r
-domStorage.setItem(newText, editingNode.data[1]);\r
-} else {\r
-domStorage.setItem(editingNode.data[0], newText);\r
-}\r
-\r
-this.update();\r
-},\r
-\r
-_deleteCallback: function(node)\r
-{\r
-if (!node || node.isCreationNode)\r
-return;\r
-\r
-if (this.domStorage)\r
-this.domStorage.removeItem(node.data[0]);\r
-\r
-this.update();\r
-}\r
-}\r
-\r
-WebInspector.DOMStorageItemsView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DataGrid = function(columns, editCallback, deleteCallback)\r
-{\r
-this.element = document.createElement("div");\r
-this.element.className = "data-grid";\r
-this.element.tabIndex = 0;\r
-this.element.addEventListener("keydown", this._keyDown.bind(this), false);\r
-\r
-this._headerTable = document.createElement("table");\r
-this._headerTable.className = "header";\r
-this._headerTableHeaders = {};\r
-\r
-this._dataTable = document.createElement("table");\r
-this._dataTable.className = "data";\r
-\r
-this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this), true);\r
-this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);\r
-\r
-this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable.bind(this), true);\r
-\r
-\r
-\r
-if (editCallback) {\r
-this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);\r
-this._editCallback = editCallback;\r
-}\r
-if (deleteCallback)\r
-this._deleteCallback = deleteCallback;\r
-\r
-this.aligned = {};\r
-\r
-this._scrollContainer = document.createElement("div");\r
-this._scrollContainer.className = "data-container";\r
-this._scrollContainer.appendChild(this._dataTable);\r
-\r
-this.element.appendChild(this._headerTable);\r
-this.element.appendChild(this._scrollContainer);\r
-\r
-var headerRow = document.createElement("tr");\r
-var columnGroup = document.createElement("colgroup");\r
-this._columnCount = 0;\r
-\r
-for (var columnIdentifier in columns) {\r
-var column = columns[columnIdentifier];\r
-if (column.disclosure)\r
-this.disclosureColumnIdentifier = columnIdentifier;\r
-\r
-var col = document.createElement("col");\r
-if (column.width)\r
-col.style.width = column.width;\r
-column.element = col;\r
-columnGroup.appendChild(col);\r
-\r
-var cell = document.createElement("th");\r
-cell.className = columnIdentifier + "-column";\r
-cell.columnIdentifier = columnIdentifier;\r
-this._headerTableHeaders[columnIdentifier] = cell;\r
-\r
-var div = document.createElement("div");\r
-if (column.titleDOMFragment)\r
-div.appendChild(column.titleDOMFragment);\r
-else\r
-div.textContent = column.title;\r
-cell.appendChild(div);\r
-\r
-if (column.sort) {\r
-cell.addStyleClass("sort-" + column.sort);\r
-this._sortColumnCell = cell;\r
-}\r
-\r
-if (column.sortable) {\r
-cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);\r
-cell.addStyleClass("sortable");\r
-}\r
-\r
-if (column.aligned)\r
-this.aligned[columnIdentifier] = column.aligned;\r
-\r
-headerRow.appendChild(cell);\r
-\r
-++this._columnCount;\r
-}\r
-\r
-columnGroup.span = this._columnCount;\r
-\r
-var cell = document.createElement("th");\r
-cell.className = "corner";\r
-headerRow.appendChild(cell);\r
-\r
-this._headerTableColumnGroup = columnGroup;\r
-this._headerTable.appendChild(this._headerTableColumnGroup);\r
-this.headerTableBody.appendChild(headerRow);\r
-\r
-var fillerRow = document.createElement("tr");\r
-fillerRow.className = "filler";\r
-\r
-for (var columnIdentifier in columns) {\r
-var column = columns[columnIdentifier];\r
-var cell = document.createElement("td");\r
-cell.className = columnIdentifier + "-column";\r
-fillerRow.appendChild(cell);\r
-}\r
-\r
-this._dataTableColumnGroup = columnGroup.cloneNode(true);\r
-this._dataTable.appendChild(this._dataTableColumnGroup);\r
-this.dataTableBody.appendChild(fillerRow);\r
-\r
-this.columns = columns || {};\r
-this._columnsArray = [];\r
-for (var columnIdentifier in columns) {\r
-columns[columnIdentifier].ordinal = this._columnsArray.length;\r
-this._columnsArray.push(columns[columnIdentifier]);\r
-}\r
-\r
-for (var i = 0; i < this._columnsArray.length; ++i)\r
-this._columnsArray[i].bodyElement = this._dataTableColumnGroup.children[i];\r
-\r
-this.children = [];\r
-this.selectedNode = null;\r
-this.expandNodesWhenArrowing = false;\r
-this.root = true;\r
-this.hasChildren = false;\r
-this.expanded = true;\r
-this.revealed = true;\r
-this.selected = false;\r
-this.dataGrid = this;\r
-this.indentWidth = 15;\r
-this.resizers = [];\r
-this._columnWidthsInitialized = false;\r
-}\r
-\r
-WebInspector.DataGrid.prototype = {\r
-_ondblclick: function(event)\r
-{\r
-if (this._editing || this._editingNode)\r
-return;\r
-\r
-this._startEditing(event.target);\r
-},\r
-\r
-_startEditingColumnOfDataGridNode: function(node, column)\r
-{\r
-this._editing = true;\r
-this._editingNode = node;\r
-this._editingNode.select();\r
-\r
-var element = this._editingNode._element.children[column];\r
-WebInspector.startEditing(element, {\r
-context: element.textContent,\r
-commitHandler: this._editingCommitted.bind(this),\r
-cancelHandler: this._editingCancelled.bind(this)\r
-});\r
-window.getSelection().setBaseAndExtent(element, 0, element, 1);\r
-},\r
-\r
-_startEditing: function(target)\r
-{\r
-var element = target.enclosingNodeOrSelfWithNodeName("td");\r
-if (!element)\r
-return;\r
-\r
-this._editingNode = this.dataGridNodeFromNode(target);\r
-if (!this._editingNode) {\r
-if (!this.creationNode)\r
-return;\r
-this._editingNode = this.creationNode;\r
-}\r
-\r
-\r
-if (this._editingNode.isCreationNode)\r
-return this._startEditingColumnOfDataGridNode(this._editingNode, 0);\r
-\r
-this._editing = true;\r
-WebInspector.startEditing(element, {\r
-context: element.textContent,\r
-commitHandler: this._editingCommitted.bind(this),\r
-cancelHandler: this._editingCancelled.bind(this)\r
-});\r
-window.getSelection().setBaseAndExtent(element, 0, element, 1);\r
-},\r
-\r
-_editingCommitted: function(element, newText, oldText, context, moveDirection)\r
-{\r
-\r
-\r
-\r
-\r
-var columnIdentifier = parseInt(element.className.match(/\b(\d+)-column\b/)[1]);\r
-\r
-var textBeforeEditing = this._editingNode.data[columnIdentifier];\r
-var currentEditingNode = this._editingNode;\r
-\r
-function moveToNextIfNeeded(wasChange) {\r
-if (!moveDirection)\r
-return;\r
-\r
-if (moveDirection === "forward") {\r
-if (currentEditingNode.isCreationNode && columnIdentifier === 0 && !wasChange)\r
-return;\r
-\r
-if (columnIdentifier === 0)\r
-return this._startEditingColumnOfDataGridNode(currentEditingNode, 1);\r
-\r
-var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);\r
-if (nextDataGridNode)\r
-return this._startEditingColumnOfDataGridNode(nextDataGridNode, 0);\r
-if (currentEditingNode.isCreationNode && wasChange) {\r
-addCreationNode(false);\r
-return this._startEditingColumnOfDataGridNode(this.creationNode, 0);\r
-}\r
-return;\r
-}\r
-\r
-if (moveDirection === "backward") {\r
-if (columnIdentifier === 1)\r
-return this._startEditingColumnOfDataGridNode(currentEditingNode, 0);\r
-var nextDataGridNode = currentEditingNode.traversePreviousNode(true, null, true);\r
-\r
-if (nextDataGridNode)\r
-return this._startEditingColumnOfDataGridNode(nextDataGridNode, 1);\r
-return;\r
-}\r
-}\r
-\r
-if (textBeforeEditing == newText) {\r
-this._editingCancelled(element);\r
-moveToNextIfNeeded.call(this, false);\r
-return;\r
-}\r
-\r
-\r
-this._editingNode.data[columnIdentifier] = newText;\r
-\r
-\r
-\r
-this._editCallback(this._editingNode, columnIdentifier, textBeforeEditing, newText);\r
-\r
-if (this._editingNode.isCreationNode)\r
-this.addCreationNode(false);\r
-\r
-this._editingCancelled(element);\r
-moveToNextIfNeeded.call(this, true);\r
-},\r
-\r
-_editingCancelled: function(element, context)\r
-{\r
-delete this._editing;\r
-this._editingNode = null;\r
-},\r
-\r
-get sortColumnIdentifier()\r
-{\r
-if (!this._sortColumnCell)\r
-return null;\r
-return this._sortColumnCell.columnIdentifier;\r
-},\r
-\r
-get sortOrder()\r
-{\r
-if (!this._sortColumnCell || this._sortColumnCell.hasStyleClass("sort-ascending"))\r
-return "ascending";\r
-if (this._sortColumnCell.hasStyleClass("sort-descending"))\r
-return "descending";\r
-return null;\r
-},\r
-\r
-get headerTableBody()\r
-{\r
-if ("_headerTableBody" in this)\r
-return this._headerTableBody;\r
-\r
-this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[0];\r
-if (!this._headerTableBody) {\r
-this._headerTableBody = this.element.ownerDocument.createElement("tbody");\r
-this._headerTable.insertBefore(this._headerTableBody, this._headerTable.tFoot);\r
-}\r
-\r
-return this._headerTableBody;\r
-},\r
-\r
-get dataTableBody()\r
-{\r
-if ("_dataTableBody" in this)\r
-return this._dataTableBody;\r
-\r
-this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];\r
-if (!this._dataTableBody) {\r
-this._dataTableBody = this.element.ownerDocument.createElement("tbody");\r
-this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tFoot);\r
-}\r
-\r
-return this._dataTableBody;\r
-},\r
-\r
-autoSizeColumns: function(minPercent, maxPercent, maxDescentLevel)\r
-{\r
-if (minPercent)\r
-minPercent = Math.min(minPercent, Math.floor(100 / this._columnCount));\r
-var widths = {};\r
-var columns = this.columns;\r
-for (var columnIdentifier in columns)\r
-widths[columnIdentifier] = (columns[columnIdentifier].title || "").length;\r
-\r
-var children = maxDescentLevel ? this._enumerateChildren(this, [], maxDescentLevel + 1) : this.children;\r
-for (var i = 0; i < children.length; ++i) {\r
-var node = children[i];\r
-for (var columnIdentifier in columns) {\r
-var text = node.data[columnIdentifier] || "";\r
-if (text.length > widths[columnIdentifier])\r
-widths[columnIdentifier] = text.length;\r
-}\r
-}\r
-\r
-var totalColumnWidths = 0;\r
-for (var columnIdentifier in columns)\r
-totalColumnWidths += widths[columnIdentifier];\r
-\r
-var recoupPercent = 0;\r
-for (var columnIdentifier in columns) {\r
-var width = Math.round(100 * widths[columnIdentifier] / totalColumnWidths);\r
-if (minPercent && width < minPercent) {\r
-recoupPercent += (minPercent - width);\r
-width = minPercent;\r
-} else if (maxPercent && width > maxPercent) {\r
-recoupPercent -= (width - maxPercent);\r
-width = maxPercent;\r
-}\r
-widths[columnIdentifier] = width;\r
-}\r
-\r
-while (minPercent && recoupPercent > 0) {\r
-for (var columnIdentifier in columns) {\r
-if (widths[columnIdentifier] > minPercent) {\r
---widths[columnIdentifier];\r
---recoupPercent;\r
-if (!recoupPercent)\r
-break;\r
-}\r
-}\r
-}\r
-\r
-while (maxPercent && recoupPercent < 0) {\r
-for (var columnIdentifier in columns) {\r
-if (widths[columnIdentifier] < maxPercent) {\r
-++widths[columnIdentifier];\r
-++recoupPercent;\r
-if (!recoupPercent)\r
-break;\r
-}\r
-}\r
-}\r
-\r
-for (var columnIdentifier in columns)\r
-columns[columnIdentifier].element.style.width = widths[columnIdentifier] + "%";\r
-this._columnWidthsInitialized = false;\r
-this.updateWidths();\r
-},\r
-\r
-_enumerateChildren: function(rootNode, result, maxLevel)\r
-{\r
-if (!rootNode.root)\r
-result.push(rootNode);\r
-if (!maxLevel)\r
-return;\r
-for (var i = 0; i < rootNode.children.length; ++i)\r
-this._enumerateChildren(rootNode.children[i], result, maxLevel - 1);\r
-return result;\r
-},\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-updateWidths: function()\r
-{\r
-var headerTableColumns = this._headerTableColumnGroup.children;\r
-\r
-var tableWidth = this._dataTable.offsetWidth;\r
-var numColumns = headerTableColumns.length;\r
-\r
-\r
-if (!this._columnWidthsInitialized && this.element.offsetWidth) {\r
-\r
-\r
-\r
-\r
-for (var i = 0; i < numColumns; i++) {\r
-var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWidth;\r
-var percentWidth = ((columnWidth / tableWidth) * 100) + "%";\r
-this._headerTableColumnGroup.children[i].style.width = percentWidth;\r
-this._dataTableColumnGroup.children[i].style.width = percentWidth;\r
-}\r
-this._columnWidthsInitialized = true;\r
-}\r
-this._positionResizers();\r
-this.dispatchEventToListeners("width changed");\r
-},\r
-\r
-columnWidthsMap: function()\r
-{\r
-var result = {};\r
-for (var i = 0; i < this._columnsArray.length; ++i) {\r
-var width = this._headerTableColumnGroup.children[i].style.width;\r
-result[this._columnsArray[i].columnIdentifier] = parseFloat(width);\r
-}\r
-return result;\r
-},\r
-\r
-applyColumnWidthsMap: function(columnWidthsMap)\r
-{\r
-for (var columnIdentifier in this.columns) {\r
-var column = this.columns[columnIdentifier];\r
-var width = (columnWidthsMap[columnIdentifier] || 0) + "%";\r
-this._headerTableColumnGroup.children[column.ordinal].style.width = width;\r
-this._dataTableColumnGroup.children[column.ordinal].style.width = width;\r
-}\r
-\r
-\r
-delete this._columnWidthsInitialized;\r
-this.updateWidths();\r
-},\r
-\r
-isColumnVisible: function(columnIdentifier)\r
-{\r
-var column = this.columns[columnIdentifier];\r
-var columnElement = column.element;\r
-return !columnElement.hidden;\r
-},\r
-\r
-showColumn: function(columnIdentifier)\r
-{\r
-var column = this.columns[columnIdentifier];\r
-var columnElement = column.element;\r
-if (!columnElement.hidden)\r
-return;\r
-\r
-columnElement.hidden = false;\r
-columnElement.removeStyleClass("hidden");\r
-\r
-var columnBodyElement = column.bodyElement;\r
-columnBodyElement.hidden = false;\r
-columnBodyElement.removeStyleClass("hidden");\r
-},\r
-\r
-hideColumn: function(columnIdentifier)\r
-{\r
-var column = this.columns[columnIdentifier];\r
-var columnElement = column.element;\r
-if (columnElement.hidden)\r
-return;\r
-\r
-var oldWidth = parseFloat(columnElement.style.width);\r
-\r
-columnElement.hidden = true;\r
-columnElement.addStyleClass("hidden");\r
-columnElement.style.width = 0;\r
-\r
-var columnBodyElement = column.bodyElement;\r
-columnBodyElement.hidden = true;\r
-columnBodyElement.addStyleClass("hidden");\r
-columnBodyElement.style.width = 0;\r
-\r
-this._columnWidthsInitialized = false;\r
-},\r
-\r
-isScrolledToLastRow: function()\r
-{\r
-return this._scrollContainer.isScrolledToBottom();\r
-},\r
-\r
-scrollToLastRow: function()\r
-{\r
-this._scrollContainer.scrollTop = this._scrollContainer.scrollHeight - this._scrollContainer.offsetHeight;\r
-},\r
-\r
-_positionResizers: function()\r
-{\r
-var headerTableColumns = this._headerTableColumnGroup.children;\r
-var numColumns = headerTableColumns.length;\r
-var left = 0;\r
-var previousResizer = null;\r
-\r
-\r
-for (var i = 0; i < numColumns - 1; i++) {\r
-var resizer = this.resizers[i];\r
-\r
-if (!resizer) {\r
-\r
-\r
-resizer = document.createElement("div");\r
-resizer.addStyleClass("data-grid-resizer");\r
-\r
-resizer.addEventListener("mousedown", this._startResizerDragging.bind(this), false);\r
-this.element.appendChild(resizer);\r
-this.resizers[i] = resizer;\r
-}\r
-\r
-\r
-\r
-\r
-left += this.headerTableBody.rows[0].cells[i].offsetWidth;\r
-\r
-var columnIsVisible = !this._headerTableColumnGroup.children[i].hidden;\r
-if (columnIsVisible) {\r
-resizer.style.removeProperty("display");\r
-resizer.style.left = left + "px";\r
-resizer.leftNeighboringColumnID = i;\r
-if (previousResizer)\r
-previousResizer.rightNeighboringColumnID = i;\r
-previousResizer = resizer;\r
-} else {\r
-resizer.style.setProperty("display", "none");\r
-resizer.leftNeighboringColumnID = 0;\r
-resizer.rightNeighboringColumnID = 0;\r
-}\r
-}\r
-if (previousResizer)\r
-previousResizer.rightNeighboringColumnID = numColumns - 1;\r
-},\r
-\r
-addCreationNode: function(hasChildren)\r
-{\r
-if (this.creationNode)\r
-this.creationNode.makeNormal();\r
-\r
-var emptyData = {};\r
-for (var column in this.columns)\r
-emptyData[column] = '';\r
-this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);\r
-this.appendChild(this.creationNode);\r
-},\r
-\r
-appendChild: function(child)\r
-{\r
-this.insertChild(child, this.children.length);\r
-},\r
-\r
-insertChild: function(child, index)\r
-{\r
-if (!child)\r
-throw("insertChild: Node can't be undefined or null.");\r
-if (child.parent === this)\r
-throw("insertChild: Node is already a child of this node.");\r
-\r
-if (child.parent)\r
-child.parent.removeChild(child);\r
-\r
-this.children.splice(index, 0, child);\r
-this.hasChildren = true;\r
-\r
-child.parent = this;\r
-child.dataGrid = this.dataGrid;\r
-child._recalculateSiblings(index);\r
-\r
-delete child._depth;\r
-delete child._revealed;\r
-delete child._attached;\r
-child._shouldRefreshChildren = true;\r
-\r
-var current = child.children[0];\r
-while (current) {\r
-current.dataGrid = this.dataGrid;\r
-delete current._depth;\r
-delete current._revealed;\r
-delete current._attached;\r
-current._shouldRefreshChildren = true;\r
-current = current.traverseNextNode(false, child, true);\r
-}\r
-\r
-if (this.expanded)\r
-child._attach();\r
-},\r
-\r
-removeChild: function(child)\r
-{\r
-if (!child)\r
-throw("removeChild: Node can't be undefined or null.");\r
-if (child.parent !== this)\r
-throw("removeChild: Node is not a child of this node.");\r
-\r
-child.deselect();\r
-child._detach();\r
-\r
-this.children.remove(child, true);\r
-\r
-if (child.previousSibling)\r
-child.previousSibling.nextSibling = child.nextSibling;\r
-if (child.nextSibling)\r
-child.nextSibling.previousSibling = child.previousSibling;\r
-\r
-child.dataGrid = null;\r
-child.parent = null;\r
-child.nextSibling = null;\r
-child.previousSibling = null;\r
-\r
-if (this.children.length <= 0)\r
-this.hasChildren = false;\r
-},\r
-\r
-removeChildren: function()\r
-{\r
-for (var i = 0; i < this.children.length; ++i) {\r
-var child = this.children[i];\r
-child.deselect();\r
-child._detach();\r
-\r
-child.dataGrid = null;\r
-child.parent = null;\r
-child.nextSibling = null;\r
-child.previousSibling = null;\r
-}\r
-\r
-this.children = [];\r
-this.hasChildren = false;\r
-},\r
-\r
-removeChildrenRecursive: function()\r
-{\r
-var childrenToRemove = this.children;\r
-\r
-var child = this.children[0];\r
-while (child) {\r
-if (child.children.length)\r
-childrenToRemove = childrenToRemove.concat(child.children);\r
-child = child.traverseNextNode(false, this, true);\r
-}\r
-\r
-for (var i = 0; i < childrenToRemove.length; ++i) {\r
-var child = childrenToRemove[i];\r
-child.deselect();\r
-child._detach();\r
-\r
-child.children = [];\r
-child.dataGrid = null;\r
-child.parent = null;\r
-child.nextSibling = null;\r
-child.previousSibling = null;\r
-}\r
-\r
-this.children = [];\r
-},\r
-\r
-sortNodes: function(comparator, reverseMode)\r
-{\r
-function comparatorWrapper(a, b)\r
-{\r
-if (a._dataGridNode._data.summaryRow)\r
-return 1;\r
-if (b._dataGridNode._data.summaryRow)\r
-return -1;\r
-\r
-var aDataGirdNode = a._dataGridNode;\r
-var bDataGirdNode = b._dataGridNode;\r
-return reverseMode ? comparator(bDataGirdNode, aDataGirdNode) : comparator(aDataGirdNode, bDataGirdNode);\r
-}\r
-\r
-var tbody = this.dataTableBody;\r
-var tbodyParent = tbody.parentElement;\r
-tbodyParent.removeChild(tbody);\r
-\r
-var childNodes = tbody.childNodes;\r
-var fillerRow = childNodes[childNodes.length - 1];\r
-\r
-var sortedRows = Array.prototype.slice.call(childNodes, 0, childNodes.length - 1);\r
-sortedRows.sort(comparatorWrapper);\r
-var sortedRowsLength = sortedRows.length;\r
-\r
-tbody.removeChildren();\r
-var previousSiblingNode = null;\r
-for (var i = 0; i < sortedRowsLength; ++i) {\r
-var row = sortedRows[i];\r
-var node = row._dataGridNode;\r
-node.previousSibling = previousSiblingNode;\r
-if (previousSiblingNode)\r
-previousSiblingNode.nextSibling = node;\r
-tbody.appendChild(row);\r
-previousSiblingNode = node;\r
-}\r
-if (previousSiblingNode)\r
-previousSiblingNode.nextSibling = null;\r
-\r
-tbody.appendChild(fillerRow);\r
-tbodyParent.appendChild(tbody);\r
-},\r
-\r
-_keyDown: function(event)\r
-{\r
-if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)\r
-return;\r
-\r
-var handled = false;\r
-var nextSelectedNode;\r
-if (event.keyIdentifier === "Up" && !event.altKey) {\r
-nextSelectedNode = this.selectedNode.traversePreviousNode(true);\r
-while (nextSelectedNode && !nextSelectedNode.selectable)\r
-nextSelectedNode = nextSelectedNode.traversePreviousNode(!this.expandTreeNodesWhenArrowing);\r
-handled = nextSelectedNode ? true : false;\r
-} else if (event.keyIdentifier === "Down" && !event.altKey) {\r
-nextSelectedNode = this.selectedNode.traverseNextNode(true);\r
-while (nextSelectedNode && !nextSelectedNode.selectable)\r
-nextSelectedNode = nextSelectedNode.traverseNextNode(!this.expandTreeNodesWhenArrowing);\r
-handled = nextSelectedNode ? true : false;\r
-} else if (event.keyIdentifier === "Left") {\r
-if (this.selectedNode.expanded) {\r
-if (event.altKey)\r
-this.selectedNode.collapseRecursively();\r
-else\r
-this.selectedNode.collapse();\r
-handled = true;\r
-} else if (this.selectedNode.parent && !this.selectedNode.parent.root) {\r
-handled = true;\r
-if (this.selectedNode.parent.selectable) {\r
-nextSelectedNode = this.selectedNode.parent;\r
-handled = nextSelectedNode ? true : false;\r
-} else if (this.selectedNode.parent)\r
-this.selectedNode.parent.collapse();\r
-}\r
-} else if (event.keyIdentifier === "Right") {\r
-if (!this.selectedNode.revealed) {\r
-this.selectedNode.reveal();\r
-handled = true;\r
-} else if (this.selectedNode.hasChildren) {\r
-handled = true;\r
-if (this.selectedNode.expanded) {\r
-nextSelectedNode = this.selectedNode.children[0];\r
-handled = nextSelectedNode ? true : false;\r
-} else {\r
-if (event.altKey)\r
-this.selectedNode.expandRecursively();\r
-else\r
-this.selectedNode.expand();\r
-}\r
-}\r
-} else if (event.keyCode === 8 || event.keyCode === 46) {\r
-if (this._deleteCallback) {\r
-handled = true;\r
-this._deleteCallback(this.selectedNode);\r
-}\r
-} else if (isEnterKey(event)) {\r
-if (this._editCallback) {\r
-handled = true;\r
-\r
-\r
-this._startEditing(this.selectedNode._element.children[0]);\r
-}\r
-}\r
-\r
-if (nextSelectedNode) {\r
-nextSelectedNode.reveal();\r
-nextSelectedNode.select();\r
-}\r
-\r
-if (handled) {\r
-event.preventDefault();\r
-event.stopPropagation();\r
-}\r
-},\r
-\r
-expand: function()\r
-{\r
-\r
-},\r
-\r
-collapse: function()\r
-{\r
-\r
-},\r
-\r
-reveal: function()\r
-{\r
-\r
-},\r
-\r
-dataGridNodeFromNode: function(target)\r
-{\r
-var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");\r
-return rowElement._dataGridNode;\r
-},\r
-\r
-dataGridNodeFromPoint: function(x, y)\r
-{\r
-var node = this._dataTable.ownerDocument.elementFromPoint(x, y);\r
-var rowElement = node.enclosingNodeOrSelfWithNodeName("tr");\r
-return rowElement._dataGridNode;\r
-},\r
-\r
-_clickInHeaderCell: function(event)\r
-{\r
-var cell = event.target.enclosingNodeOrSelfWithNodeName("th");\r
-if (!cell || !cell.columnIdentifier || !cell.hasStyleClass("sortable"))\r
-return;\r
-\r
-var sortOrder = this.sortOrder;\r
-\r
-if (this._sortColumnCell)\r
-this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+");\r
-\r
-if (cell == this._sortColumnCell) {\r
-if (sortOrder === "ascending")\r
-sortOrder = "descending";\r
-else\r
-sortOrder = "ascending";\r
-}\r
-\r
-this._sortColumnCell = cell;\r
-\r
-cell.addStyleClass("sort-" + sortOrder);\r
-\r
-this.dispatchEventToListeners("sorting changed");\r
-},\r
-\r
-markColumnAsSortedBy: function(columnIdentifier, sortOrder)\r
-{\r
-if (this._sortColumnCell)\r
-this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+");\r
-this._sortColumnCell = this._headerTableHeaders[columnIdentifier];\r
-this._sortColumnCell.addStyleClass("sort-" + sortOrder);\r
-},\r
-\r
-headerTableHeader: function(columnIdentifier)\r
-{\r
-return this._headerTableHeaders[columnIdentifier];\r
-},\r
-\r
-_mouseDownInDataTable: function(event)\r
-{\r
-var gridNode = this.dataGridNodeFromNode(event.target);\r
-if (!gridNode || !gridNode.selectable)\r
-return;\r
-\r
-if (gridNode.isEventWithinDisclosureTriangle(event))\r
-return;\r
-\r
-if (event.metaKey) {\r
-if (gridNode.selected)\r
-gridNode.deselect();\r
-else\r
-gridNode.select();\r
-} else\r
-gridNode.select();\r
-},\r
-\r
-_contextMenuInDataTable: function(event)\r
-{\r
-var gridNode = this.dataGridNodeFromNode(event.target);\r
-if (!gridNode || !gridNode.selectable)\r
-return;\r
-\r
-if (gridNode.isEventWithinDisclosureTriangle(event))\r
-return;\r
-\r
-var contextMenu = new WebInspector.ContextMenu();\r
-\r
-\r
-if (this.dataGrid._editCallback) {\r
-if (gridNode === this.creationNode)\r
-contextMenu.appendItem(WebInspector.UIString("Add New"), this._startEditing.bind(this, event.target));\r
-else\r
-contextMenu.appendItem(WebInspector.UIString("Edit"), this._startEditing.bind(this, event.target));\r
-}\r
-if (this.dataGrid._deleteCallback && gridNode !== this.creationNode)\r
-contextMenu.appendItem(WebInspector.UIString("Delete"), this._deleteCallback.bind(this, gridNode));\r
-\r
-contextMenu.show(event);\r
-},\r
-\r
-_clickInDataTable: function(event)\r
-{\r
-var gridNode = this.dataGridNodeFromNode(event.target);\r
-if (!gridNode || !gridNode.hasChildren)\r
-return;\r
-\r
-if (!gridNode.isEventWithinDisclosureTriangle(event))\r
-return;\r
-\r
-if (gridNode.expanded) {\r
-if (event.altKey)\r
-gridNode.collapseRecursively();\r
-else\r
-gridNode.collapse();\r
-} else {\r
-if (event.altKey)\r
-gridNode.expandRecursively();\r
-else\r
-gridNode.expand();\r
-}\r
-},\r
-\r
-_startResizerDragging: function(event)\r
-{\r
-this.currentResizer = event.target;\r
-if (!this.currentResizer.rightNeighboringColumnID)\r
-return;\r
-WebInspector.elementDragStart(this.lastResizer, this._resizerDragging.bind(this),\r
-this._endResizerDragging.bind(this), event, "col-resize");\r
-},\r
-\r
-_resizerDragging: function(event)\r
-{\r
-var resizer = this.currentResizer;\r
-if (!resizer)\r
-return;\r
-\r
-\r
-\r
-var dragPoint = event.clientX - this.element.totalOffsetLeft;\r
-\r
-\r
-var leftEdgeOfPreviousColumn = 0;\r
-var firstRowCells = this.headerTableBody.rows[0].cells;\r
-for (var i = 0; i < resizer.leftNeighboringColumnID; i++)\r
-leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;\r
-\r
-var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[resizer.leftNeighboringColumnID].offsetWidth + firstRowCells[resizer.rightNeighboringColumnID].offsetWidth;\r
-\r
-\r
-var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;\r
-var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;\r
-\r
-dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);\r
-\r
-resizer.style.left = (dragPoint - this.CenterResizerOverBorderAdjustment) + "px";\r
-\r
-var percentLeftColumn = (((dragPoint - leftEdgeOfPreviousColumn) / this._dataTable.offsetWidth) * 100) + "%";\r
-this._headerTableColumnGroup.children[resizer.leftNeighboringColumnID].style.width = percentLeftColumn;\r
-this._dataTableColumnGroup.children[resizer.leftNeighboringColumnID].style.width = percentLeftColumn;\r
-\r
-var percentRightColumn = (((rightEdgeOfNextColumn - dragPoint) / this._dataTable.offsetWidth) * 100) + "%";\r
-this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width =  percentRightColumn;\r
-this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width = percentRightColumn;\r
-\r
-this._positionResizers();\r
-event.preventDefault();\r
-this.dispatchEventToListeners("width changed");\r
-},\r
-\r
-_endResizerDragging: function(event)\r
-{\r
-WebInspector.elementDragEnd(event);\r
-this.currentResizer = null;\r
-this.dispatchEventToListeners("width changed");\r
-},\r
-\r
-ColumnResizePadding: 10,\r
-\r
-CenterResizerOverBorderAdjustment: 3,\r
-}\r
-\r
-WebInspector.DataGrid.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-WebInspector.DataGridNode = function(data, hasChildren)\r
-{\r
-this._expanded = false;\r
-this._selected = false;\r
-this._shouldRefreshChildren = true;\r
-this._data = data || {};\r
-this.hasChildren = hasChildren || false;\r
-this.children = [];\r
-this.dataGrid = null;\r
-this.parent = null;\r
-this.previousSibling = null;\r
-this.nextSibling = null;\r
-this.disclosureToggleWidth = 10;\r
-}\r
-\r
-WebInspector.DataGridNode.prototype = {\r
-selectable: true,\r
-\r
-get element()\r
-{\r
-if (this._element)\r
-return this._element;\r
-\r
-if (!this.dataGrid)\r
-return null;\r
-\r
-this._element = document.createElement("tr");\r
-this._element._dataGridNode = this;\r
-\r
-if (this.hasChildren)\r
-this._element.addStyleClass("parent");\r
-if (this.expanded)\r
-this._element.addStyleClass("expanded");\r
-if (this.selected)\r
-this._element.addStyleClass("selected");\r
-if (this.revealed)\r
-this._element.addStyleClass("revealed");\r
-\r
-this.createCells();\r
-return this._element;\r
-},\r
-\r
-createCells: function()\r
-{\r
-for (var columnIdentifier in this.dataGrid.columns) {\r
-var cell = this.createCell(columnIdentifier);\r
-this._element.appendChild(cell);\r
-}\r
-},\r
-\r
-get data()\r
-{\r
-return this._data;\r
-},\r
-\r
-set data(x)\r
-{\r
-this._data = x || {};\r
-this.refresh();\r
-},\r
-\r
-get revealed()\r
-{\r
-if ("_revealed" in this)\r
-return this._revealed;\r
-\r
-var currentAncestor = this.parent;\r
-while (currentAncestor && !currentAncestor.root) {\r
-if (!currentAncestor.expanded) {\r
-this._revealed = false;\r
-return false;\r
-}\r
-\r
-currentAncestor = currentAncestor.parent;\r
-}\r
-\r
-this._revealed = true;\r
-return true;\r
-},\r
-\r
-set hasChildren(x)\r
-{\r
-if (this._hasChildren === x)\r
-return;\r
-\r
-this._hasChildren = x;\r
-\r
-if (!this._element)\r
-return;\r
-\r
-if (this._hasChildren)\r
-{\r
-this._element.addStyleClass("parent");\r
-if (this.expanded)\r
-this._element.addStyleClass("expanded");\r
-}\r
-else\r
-{\r
-this._element.removeStyleClass("parent");\r
-this._element.removeStyleClass("expanded");\r
-}\r
-},\r
-\r
-get hasChildren()\r
-{\r
-return this._hasChildren;\r
-},\r
-\r
-set revealed(x)\r
-{\r
-if (this._revealed === x)\r
-return;\r
-\r
-this._revealed = x;\r
-\r
-if (this._element) {\r
-if (this._revealed)\r
-this._element.addStyleClass("revealed");\r
-else\r
-this._element.removeStyleClass("revealed");\r
-}\r
-\r
-for (var i = 0; i < this.children.length; ++i)\r
-this.children[i].revealed = x && this.expanded;\r
-},\r
-\r
-get depth()\r
-{\r
-if ("_depth" in this)\r
-return this._depth;\r
-if (this.parent && !this.parent.root)\r
-this._depth = this.parent.depth + 1;\r
-else\r
-this._depth = 0;\r
-return this._depth;\r
-},\r
-\r
-get shouldRefreshChildren()\r
-{\r
-return this._shouldRefreshChildren;\r
-},\r
-\r
-set shouldRefreshChildren(x)\r
-{\r
-this._shouldRefreshChildren = x;\r
-if (x && this.expanded)\r
-this.expand();\r
-},\r
-\r
-get selected()\r
-{\r
-return this._selected;\r
-},\r
-\r
-set selected(x)\r
-{\r
-if (x)\r
-this.select();\r
-else\r
-this.deselect();\r
-},\r
-\r
-get expanded()\r
-{\r
-return this._expanded;\r
-},\r
-\r
-set expanded(x)\r
-{\r
-if (x)\r
-this.expand();\r
-else\r
-this.collapse();\r
-},\r
-\r
-refresh: function()\r
-{\r
-if (!this._element || !this.dataGrid)\r
-return;\r
-\r
-this._element.removeChildren();\r
-this.createCells();\r
-},\r
-\r
-createCell: function(columnIdentifier)\r
-{\r
-var cell = document.createElement("td");\r
-cell.className = columnIdentifier + "-column";\r
-\r
-var alignment = this.dataGrid.aligned[columnIdentifier];\r
-if (alignment)\r
-cell.addStyleClass(alignment);\r
-\r
-var div = document.createElement("div");\r
-div.textContent = this.data[columnIdentifier];\r
-cell.appendChild(div);\r
-\r
-if (columnIdentifier === this.dataGrid.disclosureColumnIdentifier) {\r
-cell.addStyleClass("disclosure");\r
-if (this.depth)\r
-cell.style.setProperty("padding-left", (this.depth * this.dataGrid.indentWidth) + "px");\r
-}\r
-\r
-return cell;\r
-},\r
-\r
-\r
-appendChild: WebInspector.DataGrid.prototype.appendChild,\r
-insertChild: WebInspector.DataGrid.prototype.insertChild,\r
-removeChild: WebInspector.DataGrid.prototype.removeChild,\r
-removeChildren: WebInspector.DataGrid.prototype.removeChildren,\r
-removeChildrenRecursive: WebInspector.DataGrid.prototype.removeChildrenRecursive,\r
-\r
-_recalculateSiblings: function(myIndex)\r
-{\r
-if (!this.parent)\r
-return;\r
-\r
-var previousChild = (myIndex > 0 ? this.parent.children[myIndex - 1] : null);\r
-\r
-if (previousChild) {\r
-previousChild.nextSibling = this;\r
-this.previousSibling = previousChild;\r
-} else\r
-this.previousSibling = null;\r
-\r
-var nextChild = this.parent.children[myIndex + 1];\r
-\r
-if (nextChild) {\r
-nextChild.previousSibling = this;\r
-this.nextSibling = nextChild;\r
-} else\r
-this.nextSibling = null;\r
-},\r
-\r
-collapse: function()\r
-{\r
-if (this._element)\r
-this._element.removeStyleClass("expanded");\r
-\r
-this._expanded = false;\r
-\r
-for (var i = 0; i < this.children.length; ++i)\r
-this.children[i].revealed = false;\r
-\r
-this.dispatchEventToListeners("collapsed");\r
-},\r
-\r
-collapseRecursively: function()\r
-{\r
-var item = this;\r
-while (item) {\r
-if (item.expanded)\r
-item.collapse();\r
-item = item.traverseNextNode(false, this, true);\r
-}\r
-},\r
-\r
-expand: function()\r
-{\r
-if (!this.hasChildren || this.expanded)\r
-return;\r
-\r
-if (this.revealed && !this._shouldRefreshChildren)\r
-for (var i = 0; i < this.children.length; ++i)\r
-this.children[i].revealed = true;\r
-\r
-if (this._shouldRefreshChildren) {\r
-for (var i = 0; i < this.children.length; ++i)\r
-this.children[i]._detach();\r
-\r
-this.dispatchEventToListeners("populate");\r
-\r
-if (this._attached) {\r
-for (var i = 0; i < this.children.length; ++i) {\r
-var child = this.children[i];\r
-if (this.revealed)\r
-child.revealed = true;\r
-child._attach();\r
-}\r
-}\r
-\r
-delete this._shouldRefreshChildren;\r
-}\r
-\r
-if (this._element)\r
-this._element.addStyleClass("expanded");\r
-\r
-this._expanded = true;\r
-\r
-this.dispatchEventToListeners("expanded");\r
-},\r
-\r
-expandRecursively: function()\r
-{\r
-var item = this;\r
-while (item) {\r
-item.expand();\r
-item = item.traverseNextNode(false, this);\r
-}\r
-},\r
-\r
-reveal: function()\r
-{\r
-var currentAncestor = this.parent;\r
-while (currentAncestor && !currentAncestor.root) {\r
-if (!currentAncestor.expanded)\r
-currentAncestor.expand();\r
-currentAncestor = currentAncestor.parent;\r
-}\r
-\r
-this.element.scrollIntoViewIfNeeded(false);\r
-\r
-this.dispatchEventToListeners("revealed");\r
-},\r
-\r
-select: function(supressSelectedEvent)\r
-{\r
-if (!this.dataGrid || !this.selectable || this.selected)\r
-return;\r
-\r
-if (this.dataGrid.selectedNode)\r
-this.dataGrid.selectedNode.deselect();\r
-\r
-this._selected = true;\r
-this.dataGrid.selectedNode = this;\r
-\r
-if (this._element)\r
-this._element.addStyleClass("selected");\r
-\r
-if (!supressSelectedEvent)\r
-this.dispatchEventToListeners("selected");\r
-},\r
-\r
-deselect: function(supressDeselectedEvent)\r
-{\r
-if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)\r
-return;\r
-\r
-this._selected = false;\r
-this.dataGrid.selectedNode = null;\r
-\r
-if (this._element)\r
-this._element.removeStyleClass("selected");\r
-\r
-if (!supressDeselectedEvent)\r
-this.dispatchEventToListeners("deselected");\r
-},\r
-\r
-traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)\r
-{\r
-if (!dontPopulate && this.hasChildren)\r
-this.dispatchEventToListeners("populate");\r
-\r
-if (info)\r
-info.depthChange = 0;\r
-\r
-var node = (!skipHidden || this.revealed) ? this.children[0] : null;\r
-if (node && (!skipHidden || this.expanded)) {\r
-if (info)\r
-info.depthChange = 1;\r
-return node;\r
-}\r
-\r
-if (this === stayWithin)\r
-return null;\r
-\r
-node = (!skipHidden || this.revealed) ? this.nextSibling : null;\r
-if (node)\r
-return node;\r
-\r
-node = this;\r
-while (node && !node.root && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {\r
-if (info)\r
-info.depthChange -= 1;\r
-node = node.parent;\r
-}\r
-\r
-if (!node)\r
-return null;\r
-\r
-return (!skipHidden || node.revealed) ? node.nextSibling : null;\r
-},\r
-\r
-traversePreviousNode: function(skipHidden, dontPopulate)\r
-{\r
-var node = (!skipHidden || this.revealed) ? this.previousSibling : null;\r
-if (!dontPopulate && node && node.hasChildren)\r
-node.dispatchEventToListeners("populate");\r
-\r
-while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {\r
-if (!dontPopulate && node.hasChildren)\r
-node.dispatchEventToListeners("populate");\r
-node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);\r
-}\r
-\r
-if (node)\r
-return node;\r
-\r
-if (!this.parent || this.parent.root)\r
-return null;\r
-\r
-return this.parent;\r
-},\r
-\r
-isEventWithinDisclosureTriangle: function(event)\r
-{\r
-if (!this.hasChildren)\r
-return false;\r
-var cell = event.target.enclosingNodeOrSelfWithNodeName("td");\r
-if (!cell.hasStyleClass("disclosure"))\r
-return false;\r
-var computedLeftPadding = window.getComputedStyle(cell).getPropertyCSSValue("padding-left").getFloatValue(CSSPrimitiveValue.CSS_PX);\r
-var left = cell.totalOffsetLeft + computedLeftPadding;\r
-return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;\r
-},\r
-\r
-_attach: function()\r
-{\r
-if (!this.dataGrid || this._attached)\r
-return;\r
-\r
-this._attached = true;\r
-\r
-var nextNode = null;\r
-var previousNode = this.traversePreviousNode(true, true);\r
-if (previousNode && previousNode.element.parentNode && previousNode.element.nextSibling)\r
-var nextNode = previousNode.element.nextSibling;\r
-if (!nextNode)\r
-nextNode = this.dataGrid.dataTableBody.lastChild;\r
-this.dataGrid.dataTableBody.insertBefore(this.element, nextNode);\r
-\r
-if (this.expanded)\r
-for (var i = 0; i < this.children.length; ++i)\r
-this.children[i]._attach();\r
-},\r
-\r
-_detach: function()\r
-{\r
-if (!this._attached)\r
-return;\r
-\r
-this._attached = false;\r
-\r
-if (this._element && this._element.parentNode)\r
-this._element.parentNode.removeChild(this._element);\r
-\r
-for (var i = 0; i < this.children.length; ++i)\r
-this.children[i]._detach();\r
-},\r
-\r
-savePosition: function()\r
-{\r
-if (this._savedPosition)\r
-return;\r
-\r
-if (!this.parent)\r
-throw("savePosition: Node must have a parent.");\r
-this._savedPosition = {\r
-parent: this.parent,\r
-index: this.parent.children.indexOf(this)\r
-};\r
-},\r
-\r
-restorePosition: function()\r
-{\r
-if (!this._savedPosition)\r
-return;\r
-\r
-if (this.parent !== this._savedPosition.parent)\r
-this._savedPosition.parent.insertChild(this, this._savedPosition.index);\r
-\r
-delete this._savedPosition;\r
-}\r
-}\r
-\r
-WebInspector.DataGridNode.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-WebInspector.CreationDataGridNode = function(data, hasChildren)\r
-{\r
-WebInspector.DataGridNode.call(this, data, hasChildren);\r
-this.isCreationNode = true;\r
-}\r
-\r
-WebInspector.CreationDataGridNode.prototype = {\r
-makeNormal: function()\r
-{\r
-delete this.isCreationNode;\r
-delete this.makeNormal;\r
-}\r
-}\r
-\r
-WebInspector.CreationDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.CookiesTable = function(cookieDomain, expandable, deleteCallback)\r
-{\r
-this._cookieDomain = cookieDomain;\r
-\r
-var columns = { 0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {} };\r
-columns[0].title = WebInspector.UIString("Name");\r
-columns[0].sortable = true;\r
-columns[0].disclosure = expandable;\r
-columns[0].width = "24%";\r
-columns[1].title = WebInspector.UIString("Value");\r
-columns[1].sortable = true;\r
-columns[1].width = "34%";\r
-columns[2].title = WebInspector.UIString("Domain");\r
-columns[2].sortable = true;\r
-columns[2].width = "7%";\r
-columns[3].title = WebInspector.UIString("Path");\r
-columns[3].sortable = true;\r
-columns[3].width = "7%";\r
-columns[4].title = WebInspector.UIString("Expires");\r
-columns[4].sortable = true;\r
-columns[4].width = "7%";\r
-columns[5].title = WebInspector.UIString("Size");\r
-columns[5].aligned = "right";\r
-columns[5].sortable = true;\r
-columns[5].width = "7%";\r
-columns[6].title = WebInspector.UIString("HTTP");\r
-columns[6].aligned = "centered";\r
-columns[6].sortable = true;\r
-columns[6].width = "7%";\r
-columns[7].title = WebInspector.UIString("Secure");\r
-columns[7].aligned = "centered";\r
-columns[7].sortable = true;\r
-columns[7].width = "7%";\r
-\r
-this._dataGrid = new WebInspector.DataGrid(columns, null, deleteCallback ? this._onDeleteFromGrid.bind(this) : null);\r
-this._dataGrid.addEventListener("sorting changed", this._rebuildTable, this);\r
-\r
-this.element = this._dataGrid.element;\r
-this._data = [];\r
-this._deleteCallback = deleteCallback;\r
-}\r
-\r
-WebInspector.CookiesTable.prototype = {\r
-updateWidths: function()\r
-{\r
-if (this._dataGrid)\r
-this._dataGrid.updateWidths();\r
-},\r
-\r
-setCookies: function(cookies)\r
-{\r
-this._data = [{cookies: cookies}];\r
-this._rebuildTable();\r
-},\r
-\r
-addCookiesFolder: function(folderName, cookies)\r
-{\r
-this._data.push({cookies: cookies, folderName: folderName});\r
-this._rebuildTable();\r
-},\r
-\r
-get selectedCookie()\r
-{\r
-var node = this._dataGrid.selectedNode;\r
-return node ? node.cookie : null;\r
-},\r
-\r
-_rebuildTable: function()\r
-{\r
-this._dataGrid.removeChildren();\r
-for (var i = 0; i < this._data.length; ++i) {\r
-var item = this._data[i];\r
-if (item.folderName) {\r
-var groupData = [ item.folderName, "", "", "", "", this._totalSize(item.cookies), "", "" ];\r
-var groupNode = new WebInspector.DataGridNode(groupData);\r
-groupNode.selectable = true;\r
-this._dataGrid.appendChild(groupNode);\r
-groupNode.element.addStyleClass("row-group");\r
-this._populateNode(groupNode, item.cookies);\r
-groupNode.expand();\r
-} else\r
-this._populateNode(this._dataGrid, item.cookies);\r
-}\r
-},\r
-\r
-_populateNode: function(parentNode, cookies)\r
-{\r
-var selectedCookie = this.selectedCookie;\r
-parentNode.removeChildren();\r
-if (!cookies)\r
-return;\r
-\r
-this._sortCookies(cookies);\r
-for (var i = 0; i < cookies.length; ++i) {\r
-var cookieNode = this._createGridNode(cookies[i]);\r
-parentNode.appendChild(cookieNode);\r
-if (selectedCookie === cookies[i])\r
-cookieNode.selected = true;\r
-}\r
-},\r
-\r
-_totalSize: function(cookies)\r
-{\r
-var totalSize = 0;\r
-for (var i = 0; cookies && i < cookies.length; ++i)\r
-totalSize += cookies[i].size;\r
-return totalSize;\r
-},\r
-\r
-_sortCookies: function(cookies)\r
-{\r
-var sortDirection = this._dataGrid.sortOrder === "ascending" ? 1 : -1;\r
-\r
-function localeCompare(field, cookie1, cookie2)\r
-{\r
-return sortDirection * (cookie1[field] + "").localeCompare(cookie2[field] + "")\r
-}\r
-\r
-function numberCompare(field, cookie1, cookie2)\r
-{\r
-return sortDirection * (cookie1[field] - cookie2[field]);\r
-}\r
-\r
-function expiresCompare(cookie1, cookie2)\r
-{\r
-if (cookie1.session !== cookie2.session)\r
-return sortDirection * (cookie1.session ? 1 : -1);\r
-\r
-if (cookie1.session)\r
-return 0;\r
-\r
-return sortDirection * (cookie1.expires - cookie2.expires);\r
-}\r
-\r
-var comparator;\r
-switch (parseInt(this._dataGrid.sortColumnIdentifier)) {\r
-case 0: comparator = localeCompare.bind(this, "name"); break;\r
-case 1: comparator = localeCompare.bind(this, "value"); break;\r
-case 2: comparator = localeCompare.bind(this, "domain"); break;\r
-case 3: comparator = localeCompare.bind(this, "path"); break;\r
-case 4: comparator = expiresCompare; break;\r
-case 5: comparator = numberCompare.bind(this, "size"); break;\r
-case 6: comparator = localeCompare.bind(this, "httpOnly"); break;\r
-case 7: comparator = localeCompare.bind(this, "secure"); break;\r
-default: localeCompare.bind(this, "name");\r
-}\r
-\r
-cookies.sort(comparator);\r
-},\r
-\r
-_createGridNode: function(cookie)\r
-{\r
-var data = {};\r
-data[0] = cookie.name;\r
-data[1] = cookie.value;\r
-data[2] = cookie.domain || "";\r
-data[3] = cookie.path || "";\r
-data[4] = cookie.type === WebInspector.Cookie.Type.Request ? "" :\r
-(cookie.session ? WebInspector.UIString("Session") : new Date(cookie.expires).toGMTString());\r
-data[5] = cookie.size;\r
-const checkmark = "\u2713";\r
-data[6] = (cookie.httpOnly ? checkmark : "");\r
-data[7] = (cookie.secure ? checkmark : "");\r
-\r
-var node = new WebInspector.DataGridNode(data);\r
-node.cookie = cookie;\r
-node.selectable = true;\r
-return node;\r
-},\r
-\r
-_onDeleteFromGrid: function(node)\r
-{\r
-this._deleteCallback(node.cookie);\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.CookieItemsView = function(treeElement, cookieDomain)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("storage-view");\r
-\r
-this._deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");\r
-this._deleteButton.visible = false;\r
-this._deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);\r
-\r
-this._refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");\r
-this._refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);\r
-\r
-this._treeElement = treeElement;\r
-this._cookieDomain = cookieDomain;\r
-\r
-this._emptyMsgElement = document.createElement("div");\r
-this._emptyMsgElement.className = "storage-empty-view";\r
-this._emptyMsgElement.textContent = WebInspector.UIString("This site has no cookies.");\r
-this.element.appendChild(this._emptyMsgElement);\r
-}\r
-\r
-WebInspector.CookieItemsView.prototype = {\r
-get statusBarItems()\r
-{\r
-return [this._refreshButton.element, this._deleteButton.element];\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this._update();\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.View.prototype.hide.call(this);\r
-this._deleteButton.visible = false;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this._cookiesTable)\r
-this._cookiesTable.updateWidths();\r
-},\r
-\r
-_update: function()\r
-{\r
-WebInspector.Cookies.getCookiesAsync(this._updateWithCookies.bind(this));\r
-},\r
-\r
-_updateWithCookies: function(allCookies, isAdvanced)\r
-{\r
-this._cookies = isAdvanced ? this._filterCookiesForDomain(allCookies) : allCookies;\r
-\r
-if (!this._cookies.length) {\r
-\r
-this._emptyMsgElement.removeStyleClass("hidden");\r
-this._deleteButton.visible = false;\r
-if (this._cookiesTable)\r
-this._cookiesTable.element.addStyleClass("hidden");\r
-return;\r
-}\r
-\r
-if (!this._cookiesTable) {\r
-this._cookiesTable = isAdvanced ? new WebInspector.CookiesTable(this._cookieDomain, false, this._deleteCookie.bind(this)) : new WebInspector.SimpleCookiesTable();\r
-this.element.appendChild(this._cookiesTable.element);\r
-}\r
-\r
-this._cookiesTable.setCookies(this._cookies);\r
-this._cookiesTable.element.removeStyleClass("hidden");\r
-this._emptyMsgElement.addStyleClass("hidden");\r
-if (isAdvanced) {\r
-this._treeElement.subtitle = String.sprintf(WebInspector.UIString("%d cookies (%s)"), this._cookies.length,\r
-Number.bytesToString(this._totalSize, WebInspector.UIString));\r
-this._deleteButton.visible = true;\r
-}\r
-},\r
-\r
-_filterCookiesForDomain: function(allCookies)\r
-{\r
-var cookies = [];\r
-var resourceURLsForDocumentURL = [];\r
-this._totalSize = 0;\r
-\r
-function populateResourcesForDocuments(resource)\r
-{\r
-var url = resource.documentURL.asParsedURL();\r
-if (url && url.host == this._cookieDomain)\r
-resourceURLsForDocumentURL.push(resource.url);\r
-}\r
-WebInspector.forAllResources(populateResourcesForDocuments.bind(this));\r
-\r
-for (var i = 0; i < allCookies.length; ++i) {\r
-var pushed = false;\r
-var size = allCookies[i].size;\r
-for (var j = 0; j < resourceURLsForDocumentURL.length; ++j) {\r
-var resourceURL = resourceURLsForDocumentURL[j];\r
-if (WebInspector.Cookies.cookieMatchesResourceURL(allCookies[i], resourceURL)) {\r
-this._totalSize += size;\r
-if (!pushed) {\r
-pushed = true;\r
-cookies.push(allCookies[i]);\r
-}\r
-}\r
-}\r
-}\r
-return cookies;\r
-},\r
-\r
-_deleteCookie: function(cookie)\r
-{\r
-InspectorBackend.deleteCookie(cookie.name, this._cookieDomain);\r
-this._update();\r
-},\r
-\r
-_deleteButtonClicked: function()\r
-{\r
-if (this._cookiesTable.selectedCookie)\r
-this._deleteCookie(this._cookiesTable.selectedCookie);\r
-},\r
-\r
-_refreshButtonClicked: function(event)\r
-{\r
-this._update();\r
-}\r
-}\r
-\r
-WebInspector.CookieItemsView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-WebInspector.SimpleCookiesTable = function()\r
-{\r
-this.element = document.createElement("div");\r
-var columns = {};\r
-columns[0] = {};\r
-columns[1] = {};\r
-columns[0].title = WebInspector.UIString("Name");\r
-columns[1].title = WebInspector.UIString("Value");\r
-\r
-this._dataGrid = new WebInspector.DataGrid(columns);\r
-this._dataGrid.autoSizeColumns(20, 80);\r
-this.element.appendChild(this._dataGrid.element);\r
-this._dataGrid.updateWidths();\r
-}\r
-\r
-WebInspector.SimpleCookiesTable.prototype = {\r
-setCookies: function(cookies)\r
-{\r
-this._dataGrid.removeChildren();\r
-var addedCookies = {};\r
-for (var i = 0; i < cookies.length; ++i) {\r
-if (addedCookies[cookies[i].name])\r
-continue;\r
-addedCookies[cookies[i].name] = true;\r
-var data = {};\r
-data[0] = cookies[i].name;\r
-data[1] = cookies[i].value;\r
-\r
-var node = new WebInspector.DataGridNode(data, false);\r
-node.selectable = true;\r
-this._dataGrid.appendChild(node);\r
-}\r
-this._dataGrid.children[0].selected = true;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this._dataGrid)\r
-this._dataGrid.updateWidths();\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ApplicationCacheItemsView = function(treeElement, appcacheDomain)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("storage-view");\r
-this.element.addStyleClass("table");\r
-\r
-\r
-\r
-this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");\r
-this.deleteButton.visible = false;\r
-this.deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);\r
-\r
-\r
-\r
-this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");\r
-this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);\r
-\r
-if (Preferences.onlineDetectionEnabled) {\r
-this.connectivityIcon = document.createElement("img");\r
-this.connectivityIcon.className = "storage-application-cache-connectivity-icon";\r
-this.connectivityIcon.src = "";\r
-this.connectivityMessage = document.createElement("span");\r
-this.connectivityMessage.className = "storage-application-cache-connectivity";\r
-this.connectivityMessage.textContent = "";\r
-}\r
-\r
-this.divider = document.createElement("span");\r
-this.divider.className = "status-bar-item status-bar-divider";\r
-\r
-this.statusIcon = document.createElement("img");\r
-this.statusIcon.className = "storage-application-cache-status-icon";\r
-this.statusIcon.src = "";\r
-this.statusMessage = document.createElement("span");\r
-this.statusMessage.className = "storage-application-cache-status";\r
-this.statusMessage.textContent = "";\r
-\r
-this._treeElement = treeElement;\r
-this._appcacheDomain = appcacheDomain;\r
-\r
-this._emptyMsgElement = document.createElement("div");\r
-this._emptyMsgElement.className = "storage-empty-view";\r
-this._emptyMsgElement.textContent = WebInspector.UIString("No Application Cache information available.");\r
-this.element.appendChild(this._emptyMsgElement);\r
-\r
-this.updateStatus(applicationCache.UNCACHED);\r
-}\r
-\r
-WebInspector.ApplicationCacheItemsView.prototype = {\r
-get statusBarItems()\r
-{\r
-if (Preferences.onlineDetectionEnabled) {\r
-return [\r
-this.refreshButton.element, this.deleteButton.element,\r
-this.connectivityIcon, this.connectivityMessage, this.divider,\r
-this.statusIcon, this.statusMessage\r
-];\r
-} else {\r
-return [\r
-this.refreshButton.element, this.deleteButton.element, this.divider,\r
-this.statusIcon, this.statusMessage\r
-];\r
-}\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this.updateNetworkState(navigator.onLine);\r
-this._update();\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.View.prototype.hide.call(this);\r
-this.deleteButton.visible = false;\r
-},\r
-\r
-updateStatus: function(status)\r
-{\r
-var statusInformation = {};\r
-statusInformation[applicationCache.UNCACHED]    = { src: "Images/warningOrangeDot.png", text: "UNCACHED"    };\r
-statusInformation[applicationCache.IDLE]        = { src: "Images/warningOrangeDot.png", text: "IDLE"        };\r
-statusInformation[applicationCache.CHECKING]    = { src: "Images/successGreenDot.png",  text: "CHECKING"    };\r
-statusInformation[applicationCache.DOWNLOADING] = { src: "Images/successGreenDot.png",  text: "DOWNLOADING" };\r
-statusInformation[applicationCache.UPDATEREADY] = { src: "Images/successGreenDot.png",  text: "UPDATEREADY" };\r
-statusInformation[applicationCache.OBSOLETE]    = { src: "Images/errorRedDot.png",      text: "OBSOLETE"    };\r
-\r
-var info = statusInformation[status];\r
-if (!info) {\r
-console.error("Unknown Application Cache Status was Not Handled: %d", status);\r
-return;\r
-}\r
-\r
-this.statusIcon.src = info.src;\r
-this.statusMessage.textContent = info.text;\r
-},\r
-\r
-updateNetworkState: function(isNowOnline)\r
-{\r
-if (Preferences.onlineDetectionEnabled) {\r
-if (isNowOnline) {\r
-this.connectivityIcon.src = "Images/successGreenDot.png";\r
-this.connectivityMessage.textContent = WebInspector.UIString("Online");\r
-} else {\r
-this.connectivityIcon.src = "Images/errorRedDot.png";\r
-this.connectivityMessage.textContent = WebInspector.UIString("Offline");\r
-}\r
-}\r
-},\r
-\r
-_update: function()\r
-{\r
-WebInspector.ApplicationCache.getApplicationCachesAsync(this._updateCallback.bind(this));\r
-},\r
-\r
-_updateCallback: function(applicationCaches)\r
-{\r
-\r
-\r
-this._manifest = applicationCaches.manifest;\r
-this._creationTime = applicationCaches.creationTime;\r
-this._updateTime = applicationCaches.updateTime;\r
-this._size = applicationCaches.size;\r
-this._resources = applicationCaches.resources;\r
-var lastPathComponent = applicationCaches.lastPathComponent;\r
-\r
-if (!this._manifest) {\r
-this._emptyMsgElement.removeStyleClass("hidden");\r
-this.deleteButton.visible = false;\r
-if (this._dataGrid)\r
-this._dataGrid.element.addStyleClass("hidden");\r
-return;\r
-}\r
-\r
-if (!this._dataGrid)\r
-this._createDataGrid();\r
-\r
-this._populateDataGrid();\r
-this._dataGrid.autoSizeColumns(20, 80);\r
-this._dataGrid.element.removeStyleClass("hidden");\r
-this._emptyMsgElement.addStyleClass("hidden");\r
-this.deleteButton.visible = true;\r
-\r
-var totalSizeString = Number.bytesToString(this._size, WebInspector.UIString);\r
-this._treeElement.subtitle = WebInspector.UIString("%s (%s)", lastPathComponent, totalSizeString);\r
-\r
-\r
-\r
-\r
-},\r
-\r
-_createDataGrid: function()\r
-{\r
-var columns = { 0: {}, 1: {}, 2: {} };\r
-columns[0].title = WebInspector.UIString("Resource");\r
-columns[0].sort = "ascending";\r
-columns[0].sortable = true;\r
-columns[1].title = WebInspector.UIString("Type");\r
-columns[1].sortable = true;\r
-columns[2].title = WebInspector.UIString("Size");\r
-columns[2].aligned = "right";\r
-columns[2].sortable = true;\r
-this._dataGrid = new WebInspector.DataGrid(columns);\r
-this.element.appendChild(this._dataGrid.element);\r
-this._dataGrid.addEventListener("sorting changed", this._populateDataGrid, this);\r
-this._dataGrid.updateWidths();\r
-},\r
-\r
-_populateDataGrid: function()\r
-{\r
-var selectedResource = this._dataGrid.selectedNode ? this._dataGrid.selectedNode.resource : null;\r
-var sortDirection = this._dataGrid.sortOrder === "ascending" ? 1 : -1;\r
-\r
-function numberCompare(field, resource1, resource2)\r
-{\r
-return sortDirection * (resource1[field] - resource2[field]);\r
-}\r
-function localeCompare(field, resource1, resource2)\r
-{\r
-return sortDirection * (resource1[field] + "").localeCompare(resource2[field] + "")\r
-}\r
-\r
-var comparator;\r
-switch (parseInt(this._dataGrid.sortColumnIdentifier)) {\r
-case 0: comparator = localeCompare.bind(this, "name"); break;\r
-case 1: comparator = localeCompare.bind(this, "type"); break;\r
-case 2: comparator = numberCompare.bind(this, "size"); break;\r
-default: localeCompare.bind(this, "resource"); \r
-}\r
-\r
-this._resources.sort(comparator);\r
-this._dataGrid.removeChildren();\r
-\r
-var nodeToSelect;\r
-for (var i = 0; i < this._resources.length; ++i) {\r
-var data = {};\r
-var resource = this._resources[i];\r
-data[0] = resource.name;\r
-data[1] = resource.type;\r
-data[2] = Number.bytesToString(resource.size, WebInspector.UIString);\r
-var node = new WebInspector.DataGridNode(data);\r
-node.resource = resource;\r
-node.selectable = true;\r
-this._dataGrid.appendChild(node);\r
-if (resource === selectedResource) {\r
-nodeToSelect = node;\r
-nodeToSelect.selected = true;\r
-}\r
-}\r
-\r
-if (!nodeToSelect)\r
-this._dataGrid.children[0].selected = true;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this._dataGrid)\r
-this._dataGrid.updateWidths();\r
-},\r
-\r
-_deleteButtonClicked: function(event)\r
-{\r
-if (!this._dataGrid || !this._dataGrid.selectedNode)\r
-return;\r
-\r
-\r
-this._deleteCallback(this._dataGrid.selectedNode);\r
-},\r
-\r
-_deleteCallback: function(node)\r
-{\r
-\r
-\r
-\r
-},\r
-\r
-_refreshButtonClicked: function(event)\r
-{\r
-\r
-\r
-}\r
-}\r
-\r
-WebInspector.ApplicationCacheItemsView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.FileSystem = {}\r
-\r
-\r
-WebInspector.FileSystem.TEMPORARY = 0;\r
-WebInspector.FileSystem.PERSISTENT = 1;\r
-\r
-WebInspector.FileSystem.getFileSystemPathsAsync = function(origin)\r
-{\r
-InspectorBackend.getFileSystemPathAsync(WebInspector.FileSystem.PERSISTENT, origin);\r
-InspectorBackend.getFileSystemPathAsync(WebInspector.FileSystem.TEMPORARY, origin);\r
-}\r
-\r
-WebInspector.FileSystemView = function(treeElement, fileSystemOrigin)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("resource-view");\r
-this._treeElement = treeElement;\r
-this._origin = fileSystemOrigin;\r
-this._tabbedPane = new WebInspector.TabbedPane(this.element);\r
-\r
-this._persistentFileSystemElement = document.createElement("div");\r
-this._persistentFileSystemElement.className = "resource-view-headers";\r
-this._tabbedPane.appendTab("persistent", WebInspector.UIString("Persistent File System"), this._persistentFileSystemElement, this._selectFileSystemTab.bind(this, true));\r
-\r
-this._tempFileSystemElement = document.createElement("div");\r
-this._tempFileSystemElement.className = "resource-view-headers";\r
-this._tabbedPane.appendTab("temp", WebInspector.UIString("Temporary File System"), this._tempFileSystemElement, this.selectTemporaryFileSystemTab.bind(this, true));\r
-\r
-this._temporaryRoot = "";\r
-this._persistentRoot = "";\r
-this._isFileSystemDisabled = false;\r
-this._persistentRootError = false;\r
-this._temporaryRootError = false;\r
-this.fileSystemVisible = true;\r
-this._selectFileSystemTab();\r
-this.refreshFileSystem();\r
-}\r
-\r
-WebInspector.FileSystemView.prototype = {\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this._update();\r
-},\r
-\r
-set fileSystemVisible(x)\r
-{\r
-if (x === this._fileSystemVisible)\r
-return;\r
-this._fileSystemVisible = x;\r
-if (x)\r
-this.element.addStyleClass("headers-visible");\r
-else\r
-this.element.removeStyleClass("headers-visible"); \r
-this._selectFileSystemTab();\r
-},\r
-\r
-_update: function()\r
-{\r
-this._selectFileSystemTab();\r
-WebInspector.FileSystem.getFileSystemPathsAsync(this._origin);\r
-},\r
-\r
-updateFileSystemPath: function(root, type, origin)\r
-{\r
-if (origin == this._origin && type == WebInspector.FileSystem.PERSISTENT) {\r
-this._persistentRoot = root;\r
-this._persistentRootError = false;\r
-}\r
-\r
-if (origin == this._origin && type == WebInspector.FileSystem.TEMPORARY) {\r
-this._temporaryRoot = root;\r
-this._temporaryRootErrorError = false;\r
-}\r
-\r
-this.refreshFileSystem();\r
-},\r
-\r
-updateFileSystemError: function(type, origin)\r
-{\r
-if (type == WebInspector.FileSystem.PERSISTENT)\r
-this._persistentRootError = true;\r
-\r
-if (type == WebInspector.FileSystem.TEMPORARY)\r
-this._temporaryRootError = true;\r
-\r
-this.refreshFileSystem();\r
-},\r
-\r
-setFileSystemDisabled: function()\r
-{\r
-this._isFileSystemDisabled = true;\r
-this.refreshFileSystem();\r
-},\r
-_selectFileSystemTab: function()\r
-{\r
-this._tabbedPane.selectTab("persistent");\r
-},\r
-\r
-selectTemporaryFileSystemTab: function()\r
-{\r
-this._tabbedPane.selectTab("temp");\r
-},\r
-\r
-_revealPersistentFolderInOS: function()\r
-{\r
-InspectorBackend.revealFolderInOS(this._persistentRoot);\r
-},\r
-\r
-_revealTemporaryFolderInOS: function()\r
-{\r
-InspectorBackend.revealFolderInOS(this._temporaryRoot);\r
-},\r
-\r
-_createTextAndButton: function(fileSystemElement, rootPathText, type, isError)\r
-{\r
-fileSystemElement.removeChildren();\r
-var rootPath = WebInspector.UIString("File System root path not available.");\r
-if (this._isFileSystemDisabled)\r
-rootPath = WebInspector.UIString("File System is disabled.");\r
-else if (isError)\r
-rootPath = WebInspector.UIString("Error in fetching root path for file system.");\r
-else if (rootPathText)\r
-rootPath = rootPathText;\r
-\r
-var rootTextNode = document.createTextNode("Root: " + rootPath.escapeHTML());\r
-var rootSystemElement = document.createElement("div");\r
-rootSystemElement.className = "header-value source-code";\r
-rootSystemElement.appendChild(rootTextNode);\r
-fileSystemElement.appendChild(rootSystemElement);\r
-\r
-if (!isError && rootPathText) {\r
-\r
-var contentElement = document.createElement("div");\r
-contentElement.className = "panel-enabler-view-content";\r
-fileSystemElement.appendChild(contentElement);\r
-var choicesForm = document.createElement("form");\r
-contentElement.appendChild(choicesForm);\r
-var enableButton = document.createElement("button");\r
-enableButton.setAttribute("type", "button");\r
-enableButton.textContent = WebInspector.UIString("Reveal folder in OS");\r
-\r
-if (type == WebInspector.FileSystem.PERSISTENT)\r
-enableButton.addEventListener("click", this._revealPersistentFolderInOS.bind(this), false);\r
-if (type == WebInspector.FileSystem.TEMPORARY)\r
-enableButton.addEventListener("click", this._revealTemporaryFolderInOS.bind(this), false);\r
-choicesForm.appendChild(enableButton);\r
-fileSystemElement.appendChild(contentElement);\r
-}\r
-},\r
-\r
-refreshFileSystem: function()\r
-{\r
-this._createTextAndButton(this._persistentFileSystemElement, this._persistentRoot, WebInspector.FileSystem.PERSISTENT, this._persistentRootError);\r
-this._createTextAndButton(this._tempFileSystemElement, this._temporaryRoot, WebInspector.FileSystem.TEMPORARY, this._temporaryRootError);\r
-}, \r
-}\r
-\r
-WebInspector.FileSystemView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Script = function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage, worldType)\r
-{\r
-this.sourceID = sourceID;\r
-this.sourceURL = sourceURL;\r
-this._source = source;\r
-this.startingLine = startingLine;\r
-this.errorLine = errorLine;\r
-this.errorMessage = errorMessage;\r
-this.worldType = worldType;\r
-\r
-\r
-\r
-\r
-\r
-if (!sourceURL) {\r
-\r
-var pattern = /^\s*\/\/[ \t]*@[ \t]*sourceURL[ \t]*=[ \t]*(\S+).*$/m;\r
-var match = pattern.exec(source);\r
-\r
-if (match)\r
-this.sourceURL = match[1];\r
-}\r
-}\r
-\r
-WebInspector.Script.WorldType = {\r
-MAIN_WORLD: 0,\r
-EXTENSIONS_WORLD: 1\r
-}\r
-\r
-WebInspector.Script.WorldType = {\r
-MAIN_WORLD: 0,\r
-EXTENSIONS_WORLD: 1\r
-}\r
-\r
-WebInspector.Script.Events = {\r
-SourceChanged: "source-changed"\r
-}\r
-\r
-WebInspector.Script.prototype = {\r
-get linesCount()\r
-{\r
-if (!this.source)\r
-return 0;\r
-if (this._linesCount)\r
-return this._linesCount;\r
-this._linesCount = 0;\r
-var lastIndex = this.source.indexOf("\n");\r
-while (lastIndex !== -1) {\r
-lastIndex = this.source.indexOf("\n", lastIndex + 1)\r
-this._linesCount++;\r
-}\r
-return this._linesCount;\r
-},\r
-\r
-get source()\r
-{\r
-return this._source;\r
-},\r
-\r
-set source(source)\r
-{\r
-this._source = source;\r
-this.dispatchEventToListeners(WebInspector.Script.Events.SourceChanged);\r
-}\r
-}\r
-\r
-WebInspector.Script.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Breakpoint = function(debuggerModel, breakpointId, sourceID, url, line, enabled, condition)\r
-{\r
-this.id = breakpointId;\r
-this.url = url;\r
-this.line = line;\r
-this.sourceID = sourceID;\r
-this._enabled = enabled;\r
-this._condition = condition || "";\r
-this._sourceText = "";\r
-this._hit = false;\r
-this._debuggerModel = debuggerModel;\r
-}\r
-\r
-WebInspector.Breakpoint.prototype = {\r
-get enabled()\r
-{\r
-return this._enabled;\r
-},\r
-\r
-get sourceText()\r
-{\r
-return this._sourceText;\r
-},\r
-\r
-set sourceText(text)\r
-{\r
-this._sourceText = text;\r
-this.dispatchEventToListeners("label-changed");\r
-},\r
-\r
-get condition()\r
-{\r
-return this._condition;\r
-},\r
-\r
-get hit()\r
-{\r
-return this._hit;\r
-},\r
-\r
-set hit(hit)\r
-{\r
-this._hit = hit;\r
-this.dispatchEventToListeners("hit-state-changed");\r
-},\r
-\r
-click: function(event)\r
-{\r
-WebInspector.panels.scripts.showSourceLine(this.url, this.line);\r
-},\r
-\r
-compareTo: function(other)\r
-{\r
-if (this.url != other.url)\r
-return this.url < other.url ? -1 : 1;\r
-if (this.line != other.line)\r
-return this.line < other.line ? -1 : 1;\r
-return 0;\r
-},\r
-\r
-populateLabelElement: function(element)\r
-{\r
-var displayName = this.url ? WebInspector.displayNameForURL(this.url) : WebInspector.UIString("(program)");\r
-var labelElement = document.createTextNode(displayName + ":" + this.line);\r
-element.appendChild(labelElement);\r
-\r
-var sourceTextElement = document.createElement("div");\r
-sourceTextElement.textContent = this.sourceText;\r
-sourceTextElement.className = "source-text monospace";\r
-element.appendChild(sourceTextElement);\r
-},\r
-\r
-remove: function()\r
-{\r
-this._debuggerModel.removeBreakpoint(this.id);\r
-this.dispatchEventToListeners("removed");\r
-this.removeAllListeners();\r
-delete this._debuggerModel;\r
-}\r
-}\r
-\r
-WebInspector.Breakpoint.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.BreakpointManager = function()\r
-{\r
-this._stickyBreakpoints = {};\r
-var breakpoints = WebInspector.settings.findSettingForAllProjects("nativeBreakpoints");\r
-for (var projectId in breakpoints)\r
-this._stickyBreakpoints[projectId] = this._validateBreakpoints(breakpoints[projectId]);\r
-InspectorBackend.setStickyBreakpoints(this._stickyBreakpoints);\r
-\r
-this._breakpoints = {};\r
-this._domBreakpointsRestored = false;\r
-this._scriptBreakpoints = {};\r
-\r
-WebInspector.settings.addEventListener(WebInspector.Settings.Events.ProjectChanged, this._projectChanged, this);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointAdded, this._scriptBreakpointAdded, this);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointRemoved, this._scriptBreakpointRemoved, this);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this);\r
-}\r
-\r
-WebInspector.BreakpointManager.BreakpointTypes = {\r
-DOM: "DOM",\r
-JS: "JS",\r
-EventListener: "EventListener",\r
-XHR: "XHR"\r
-}\r
-\r
-WebInspector.BreakpointManager.Events = {\r
-DOMBreakpointAdded: "dom-breakpoint-added",\r
-EventListenerBreakpointAdded: "event-listener-breakpoint-added",\r
-XHRBreakpointAdded: "xhr-breakpoint-added",\r
-ProjectChanged: "project-changed"\r
-}\r
-\r
-WebInspector.BreakpointManager.prototype = {\r
-createDOMBreakpoint: function(nodeId, type)\r
-{\r
-this._createDOMBreakpoint(nodeId, type, true, false);\r
-},\r
-\r
-_createDOMBreakpoint: function(nodeId, type, enabled, restored)\r
-{\r
-var node = WebInspector.domAgent.nodeForId(nodeId);\r
-if (!node)\r
-return;\r
-\r
-var breakpointId = this._createDOMBreakpointId(nodeId, type);\r
-if (breakpointId in this._breakpoints)\r
-return;\r
-\r
-var breakpoint = new WebInspector.DOMBreakpoint(node, type);\r
-this._setBreakpoint(breakpointId, breakpoint, enabled, restored);\r
-if (enabled && restored)\r
-breakpoint._enable();\r
-\r
-breakpoint.view = new WebInspector.DOMBreakpointView(this, breakpointId, enabled, node, type);\r
-this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.DOMBreakpointAdded, breakpoint.view);\r
-},\r
-\r
-createEventListenerBreakpoint: function(eventName)\r
-{\r
-this._createEventListenerBreakpoint(eventName, true, false);\r
-},\r
-\r
-_createEventListenerBreakpoint: function(eventName, enabled, restored)\r
-{\r
-var breakpointId = this._createEventListenerBreakpointId(eventName);\r
-if (breakpointId in this._breakpoints)\r
-return;\r
-\r
-var breakpoint = new WebInspector.EventListenerBreakpoint(eventName);\r
-this._setBreakpoint(breakpointId, breakpoint, enabled, restored);\r
-\r
-breakpoint.view = new WebInspector.EventListenerBreakpointView(this, breakpointId, enabled, eventName);\r
-this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.EventListenerBreakpointAdded, breakpoint.view);\r
-},\r
-\r
-_createJavaScriptBreakpoint: function(url, lineNumber, condition, enabled, restored)\r
-{\r
-var breakpointId = this._createJavaScriptBreakpointId(url, lineNumber);\r
-if (breakpointId in this._breakpoints)\r
-return;\r
-\r
-var breakpoint = new WebInspector.JavaScriptBreakpoint(url, lineNumber, condition);\r
-this._setBreakpoint(breakpointId, breakpoint, enabled, restored);\r
-},\r
-\r
-_scriptBreakpointAdded: function(event)\r
-{\r
-var scriptBreakpoint = event.data;\r
-\r
-if (!scriptBreakpoint.url)\r
-return;\r
-\r
-if (!scriptBreakpoint.restored)\r
-this._createJavaScriptBreakpoint(scriptBreakpoint.url, scriptBreakpoint.originalLineNumber, scriptBreakpoint.condition, scriptBreakpoint.enabled, false);\r
-var breakpointId = this._createJavaScriptBreakpointId(scriptBreakpoint.url, scriptBreakpoint.originalLineNumber);\r
-this._scriptBreakpoints[scriptBreakpoint.id] = breakpointId;\r
-},\r
-\r
-_scriptBreakpointRemoved: function(event)\r
-{\r
-var scriptBreakpointId = event.data;\r
-var breakpointId = this._scriptBreakpoints[scriptBreakpointId];\r
-delete this._scriptBreakpoints[scriptBreakpointId];\r
-if (breakpointId in this._breakpoints)\r
-this._removeBreakpoint(breakpointId);\r
-},\r
-\r
-createXHRBreakpoint: function(url)\r
-{\r
-this._createXHRBreakpoint(url, true, false);\r
-},\r
-\r
-_createXHRBreakpoint: function(url, enabled, restored)\r
-{\r
-var breakpointId = this._createXHRBreakpointId(url);\r
-if (breakpointId in this._breakpoints)\r
-return;\r
-\r
-var breakpoint = new WebInspector.XHRBreakpoint(url);\r
-this._setBreakpoint(breakpointId, breakpoint, enabled, restored);\r
-\r
-breakpoint.view = new WebInspector.XHRBreakpointView(this, breakpointId, enabled, url);\r
-this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.XHRBreakpointAdded, breakpoint.view);\r
-},\r
-\r
-_setBreakpoint: function(breakpointId, breakpoint, enabled, restored)\r
-{\r
-this._breakpoints[breakpointId] = breakpoint;\r
-breakpoint.enabled = enabled;\r
-if (restored)\r
-return;\r
-if (enabled)\r
-breakpoint._enable();\r
-this._saveBreakpoints();\r
-},\r
-\r
-_setBreakpointEnabled: function(breakpointId, enabled)\r
-{\r
-var breakpoint = this._breakpoints[breakpointId];\r
-if (breakpoint.enabled === enabled)\r
-return;\r
-if (enabled)\r
-breakpoint._enable();\r
-else\r
-breakpoint._disable();\r
-breakpoint.enabled = enabled;\r
-this._saveBreakpoints();\r
-},\r
-\r
-_removeBreakpoint: function(breakpointId)\r
-{\r
-var breakpoint = this._breakpoints[breakpointId];\r
-if (breakpoint.enabled)\r
-breakpoint._disable();\r
-delete this._breakpoints[breakpointId];\r
-this._saveBreakpoints();\r
-},\r
-\r
-breakpointViewForEventData: function(eventData)\r
-{\r
-var breakpointId;\r
-if (eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.DOM)\r
-breakpointId = this._createDOMBreakpointId(eventData.nodeId, eventData.type);\r
-else if (eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.EventListener)\r
-breakpointId = this._createEventListenerBreakpointId(eventData.eventName);\r
-else if (eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.XHR)\r
-breakpointId = this._createXHRBreakpointId(eventData.breakpointURL);\r
-else\r
-return;\r
-\r
-var breakpoint = this._breakpoints[breakpointId];\r
-if (breakpoint)\r
-return breakpoint.view;\r
-},\r
-\r
-_debuggerPaused: function(event)\r
-{\r
-var eventType = event.data.eventType;\r
-var eventData = event.data.eventData;\r
-\r
-if (eventType !== WebInspector.DebuggerEventTypes.NativeBreakpoint)\r
-return;\r
-\r
-var breakpointView = this.breakpointViewForEventData(eventData);\r
-if (!breakpointView)\r
-return;\r
-\r
-breakpointView.hit = true;\r
-this._lastHitBreakpointView = breakpointView;\r
-},\r
-\r
-_debuggerResumed: function(event)\r
-{\r
-if (!this._lastHitBreakpointView)\r
-return;\r
-this._lastHitBreakpointView.hit = false;\r
-delete this._lastHitBreakpointView;\r
-},\r
-\r
-_projectChanged: function(event)\r
-{\r
-this._breakpoints = {};\r
-this._domBreakpointsRestored = false;\r
-this._scriptBreakpoints = {};\r
-this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.ProjectChanged);\r
-\r
-var breakpoints = this._stickyBreakpoints[WebInspector.settings.projectId] || [];\r
-for (var i = 0; i < breakpoints.length; ++i) {\r
-var breakpoint = breakpoints[i];\r
-if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.EventListener)\r
-this._createEventListenerBreakpoint(breakpoint.condition.eventName, breakpoint.enabled, true);\r
-else if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.JS)\r
-this._createJavaScriptBreakpoint(breakpoint.condition.url, breakpoint.condition.lineNumber, breakpoint.condition.condition, breakpoint.enabled, true);\r
-else if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.XHR)\r
-this._createXHRBreakpoint(breakpoint.condition.url, breakpoint.enabled, true);\r
-}\r
-},\r
-\r
-restoreDOMBreakpoints: function()\r
-{\r
-function didPushNodeByPathToFrontend(path, nodeId)\r
-{\r
-pathToNodeId[path] = nodeId;\r
-pendingCalls -= 1;\r
-if (pendingCalls)\r
-return;\r
-for (var i = 0; i < breakpoints.length; ++i) {\r
-var breakpoint = breakpoints[i];\r
-if (breakpoint.type !== WebInspector.BreakpointManager.BreakpointTypes.DOM)\r
-continue;\r
-var nodeId = pathToNodeId[breakpoint.condition.path];\r
-if (nodeId)\r
-this._createDOMBreakpoint(nodeId, breakpoint.condition.type, breakpoint.enabled, true);\r
-}\r
-this._domBreakpointsRestored = true;\r
-this._saveBreakpoints();\r
-}\r
-\r
-var breakpoints = this._stickyBreakpoints[WebInspector.settings.projectId] || [];\r
-var pathToNodeId = {};\r
-var pendingCalls = 0;\r
-for (var i = 0; i < breakpoints.length; ++i) {\r
-if (breakpoints[i].type !== WebInspector.BreakpointManager.BreakpointTypes.DOM)\r
-continue;\r
-var path = breakpoints[i].condition.path;\r
-if (path in pathToNodeId)\r
-continue;\r
-pathToNodeId[path] = 0;\r
-pendingCalls += 1;\r
-InspectorBackend.pushNodeByPathToFrontend(path, didPushNodeByPathToFrontend.bind(this, path));\r
-}\r
-if (!pendingCalls)\r
-this._domBreakpointsRestored = true;\r
-},\r
-\r
-_saveBreakpoints: function()\r
-{\r
-var breakpoints = [];\r
-for (var breakpointId in this._breakpoints) {\r
-var breakpoint = this._breakpoints[breakpointId];\r
-var persistentBreakpoint = breakpoint._serializeToJSON();\r
-persistentBreakpoint.enabled = breakpoint.enabled;\r
-breakpoints.push(persistentBreakpoint);\r
-}\r
-if (!this._domBreakpointsRestored) {\r
-var stickyBreakpoints = this._stickyBreakpoints[WebInspector.settings.projectId] || [];\r
-for (var i = 0; i < stickyBreakpoints.length; ++i) {\r
-if (stickyBreakpoints[i].type === WebInspector.BreakpointManager.BreakpointTypes.DOM)\r
-breakpoints.push(stickyBreakpoints[i]);\r
-}\r
-}\r
-WebInspector.settings.nativeBreakpoints = breakpoints;\r
-\r
-this._stickyBreakpoints[WebInspector.settings.projectId] = breakpoints;\r
-InspectorBackend.setStickyBreakpoints(this._stickyBreakpoints);\r
-},\r
-\r
-_validateBreakpoints: function(persistentBreakpoints)\r
-{\r
-var breakpoints = [];\r
-var breakpointsSet = {};\r
-for (var i = 0; i < persistentBreakpoints.length; ++i) {\r
-var breakpoint = persistentBreakpoints[i];\r
-if (!("type" in breakpoint && "enabled" in breakpoint && "condition" in breakpoint))\r
-continue;\r
-var id = breakpoint.type + ":";\r
-var condition = breakpoint.condition;\r
-if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.DOM) {\r
-if (typeof condition.path !== "string" || typeof condition.type !== "number")\r
-continue;\r
-id += condition.path + ":" + condition.type;\r
-} else if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.EventListener) {\r
-if (typeof condition.eventName !== "string")\r
-continue;\r
-id += condition.eventName;\r
-} else if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.JS) {\r
-if (typeof condition.url !== "string" || typeof condition.lineNumber !== "number" || typeof condition.condition !== "string")\r
-continue;\r
-id += condition.url + ":" + condition.lineNumber;\r
-} else if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.XHR) {\r
-if (typeof condition.url !== "string")\r
-continue;\r
-id += condition.url;\r
-}\r
-if (id in breakpointsSet)\r
-continue;\r
-breakpointsSet[id] = true;\r
-breakpoints.push(breakpoint);\r
-}\r
-return breakpoints;\r
-},\r
-\r
-_createDOMBreakpointId: function(nodeId, type)\r
-{\r
-return "dom:" + nodeId + ":" + type;\r
-},\r
-\r
-_createJavaScriptBreakpointId: function(url, lineNumber)\r
-{\r
-return "js:" + url + ":" + lineNumber;\r
-},\r
-\r
-_createEventListenerBreakpointId: function(eventName)\r
-{\r
-return "eventListner:" + eventName;\r
-},\r
-\r
-_createXHRBreakpointId: function(url)\r
-{\r
-return "xhr:" + url;\r
-}\r
-}\r
-\r
-WebInspector.BreakpointManager.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-WebInspector.DOMBreakpoint = function(node, type)\r
-{\r
-this._nodeId = node.id;\r
-this._path = node.path();\r
-this._type = type;\r
-}\r
-\r
-WebInspector.DOMBreakpoint.prototype = {\r
-_enable: function()\r
-{\r
-InspectorBackend.setDOMBreakpoint(this._nodeId, this._type);\r
-},\r
-\r
-_disable: function()\r
-{\r
-InspectorBackend.removeDOMBreakpoint(this._nodeId, this._type);\r
-},\r
-\r
-_serializeToJSON: function()\r
-{\r
-var type = WebInspector.BreakpointManager.BreakpointTypes.DOM;\r
-return { type: type, condition: { path: this._path, type: this._type } };\r
-}\r
-}\r
-\r
-WebInspector.JavaScriptBreakpoint = function(url, lineNumber, condition)\r
-{\r
-this._url = url;\r
-this._lineNumber = lineNumber;\r
-this._condition = condition;\r
-}\r
-\r
-WebInspector.JavaScriptBreakpoint.prototype = {\r
-_enable: function()\r
-{\r
-},\r
-\r
-_disable: function()\r
-{\r
-},\r
-\r
-_serializeToJSON: function()\r
-{\r
-var type = WebInspector.BreakpointManager.BreakpointTypes.JS;\r
-return { type: type, condition: { url: this._url, lineNumber: this._lineNumber, condition: this._condition } };\r
-}\r
-}\r
-\r
-WebInspector.EventListenerBreakpoint = function(eventName)\r
-{\r
-this._eventName = eventName;\r
-}\r
-\r
-WebInspector.EventListenerBreakpoint.prototype = {\r
-_enable: function()\r
-{\r
-InspectorBackend.setEventListenerBreakpoint(this._eventName);\r
-},\r
-\r
-_disable: function()\r
-{\r
-InspectorBackend.removeEventListenerBreakpoint(this._eventName);\r
-},\r
-\r
-_serializeToJSON: function()\r
-{\r
-var type = WebInspector.BreakpointManager.BreakpointTypes.EventListener;\r
-return { type: type, condition: { eventName: this._eventName } };\r
-}\r
-}\r
-\r
-WebInspector.XHRBreakpoint = function(url)\r
-{\r
-this._url = url;\r
-}\r
-\r
-WebInspector.XHRBreakpoint.prototype = {\r
-_enable: function()\r
-{\r
-InspectorBackend.setXHRBreakpoint(this._url);\r
-},\r
-\r
-_disable: function()\r
-{\r
-InspectorBackend.removeXHRBreakpoint(this._url);\r
-},\r
-\r
-_serializeToJSON: function()\r
-{\r
-var type = WebInspector.BreakpointManager.BreakpointTypes.XHR;\r
-return { type: type, condition: { url: this._url } };\r
-}\r
-}\r
-\r
-\r
-\r
-WebInspector.NativeBreakpointView = function(manager, id, enabled)\r
-{\r
-this._manager = manager;\r
-this._id = id;\r
-this._enabled = enabled;\r
-this._hit = false;\r
-}\r
-\r
-WebInspector.NativeBreakpointView.prototype = {\r
-get enabled()\r
-{\r
-return this._enabled;\r
-},\r
-\r
-set enabled(enabled)\r
-{\r
-this._manager._setBreakpointEnabled(this._id, enabled);\r
-this._enabled = enabled;\r
-this.dispatchEventToListeners("enable-changed");\r
-},\r
-\r
-get hit()\r
-{\r
-return this._hit;\r
-},\r
-\r
-set hit(hit)\r
-{\r
-this._hit = hit;\r
-this.dispatchEventToListeners("hit-state-changed");\r
-},\r
-\r
-remove: function()\r
-{\r
-this._manager._removeBreakpoint(this._id);\r
-this._onRemove();\r
-this.dispatchEventToListeners("removed");\r
-},\r
-\r
-_compare: function(x, y)\r
-{\r
-if (x !== y)\r
-return x < y ? -1 : 1;\r
-return 0;\r
-},\r
-\r
-_onRemove: function()\r
-{\r
-}\r
-}\r
-\r
-WebInspector.NativeBreakpointView.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-WebInspector.DOMBreakpointView = function(manager, id, enabled, node, type)\r
-{\r
-WebInspector.NativeBreakpointView.call(this, manager, id, enabled);\r
-this._node = node;\r
-this._nodeId = node.id;\r
-this._type = type;\r
-node.breakpoints[this._type] = this;\r
-}\r
-\r
-WebInspector.DOMBreakpointView.prototype = {\r
-compareTo: function(other)\r
-{\r
-return this._compare(this._type, other._type);\r
-},\r
-\r
-populateLabelElement: function(element)\r
-{\r
-\r
-var linkifiedNode = WebInspector.panels.elements.linkifyNodeById(this._nodeId);\r
-linkifiedNode.addStyleClass("monospace");\r
-element.appendChild(linkifiedNode);\r
-var description = document.createElement("div");\r
-description.className = "source-text";\r
-description.textContent = WebInspector.domBreakpointTypeLabel(this._type);\r
-element.appendChild(description);\r
-},\r
-\r
-populateStatusMessageElement: function(element, eventData)\r
-{\r
-var substitutions = [WebInspector.domBreakpointTypeLabel(this._type), WebInspector.panels.elements.linkifyNodeById(this._nodeId)];\r
-var formatters = {\r
-s: function(substitution)\r
-{\r
-return substitution;\r
-}\r
-};\r
-function append(a, b)\r
-{\r
-if (typeof b === "string")\r
-b = document.createTextNode(b);\r
-element.appendChild(b);\r
-}\r
-if (this._type === WebInspector.DOMBreakpointTypes.SubtreeModified) {\r
-var targetNode = WebInspector.panels.elements.linkifyNodeById(eventData.targetNodeId);\r
-if (eventData.insertion) {\r
-if (eventData.targetNodeId !== this._nodeId)\r
-WebInspector.formatLocalized("Paused on a \"%s\" breakpoint set on %s, because a new child was added to its descendant %s.", substitutions.concat(targetNode), formatters, "", append);\r
-else\r
-WebInspector.formatLocalized("Paused on a \"%s\" breakpoint set on %s, because a new child was added to that node.", substitutions, formatters, "", append);\r
-} else\r
-WebInspector.formatLocalized("Paused on a \"%s\" breakpoint set on %s, because its descendant %s was removed.", substitutions.concat(targetNode), formatters, "", append);\r
-} else\r
-WebInspector.formatLocalized("Paused on a \"%s\" breakpoint set on %s.", substitutions, formatters, "", append);\r
-},\r
-\r
-_onRemove: function()\r
-{\r
-delete this._node.breakpoints[this._type];\r
-}\r
-}\r
-\r
-WebInspector.DOMBreakpointView.prototype.__proto__ = WebInspector.NativeBreakpointView.prototype;\r
-\r
-WebInspector.EventListenerBreakpointView = function(manager, id, enabled, eventName)\r
-{\r
-WebInspector.NativeBreakpointView.call(this, manager, id, enabled);\r
-this._eventName = eventName;\r
-}\r
-\r
-WebInspector.EventListenerBreakpointView.eventNameForUI = function(eventName)\r
-{\r
-if (!WebInspector.EventListenerBreakpointView._eventNamesForUI) {\r
-WebInspector.EventListenerBreakpointView._eventNamesForUI = {\r
-"instrumentation:setTimer": WebInspector.UIString("Set Timer"),\r
-"instrumentation:clearTimer": WebInspector.UIString("Clear Timer"),\r
-"instrumentation:timerFired": WebInspector.UIString("Timer Fired")\r
-};\r
-}\r
-return WebInspector.EventListenerBreakpointView._eventNamesForUI[eventName] || eventName.substring(eventName.indexOf(":") + 1);\r
-}\r
-\r
-WebInspector.EventListenerBreakpointView.prototype = {\r
-get eventName()\r
-{\r
-return this._eventName;\r
-},\r
-\r
-compareTo: function(other)\r
-{\r
-return this._compare(this._eventName, other._eventName);\r
-},\r
-\r
-populateLabelElement: function(element)\r
-{\r
-element.appendChild(document.createTextNode(this._uiEventName()));\r
-},\r
-\r
-populateStatusMessageElement: function(element, eventData)\r
-{\r
-var status = WebInspector.UIString("Paused on a \"%s\" Event Listener.", this._uiEventName());\r
-element.appendChild(document.createTextNode(status));\r
-},\r
-\r
-_uiEventName: function()\r
-{\r
-return WebInspector.EventListenerBreakpointView.eventNameForUI(this._eventName);\r
-}\r
-}\r
-\r
-WebInspector.EventListenerBreakpointView.prototype.__proto__ = WebInspector.NativeBreakpointView.prototype;\r
-\r
-WebInspector.XHRBreakpointView = function(manager, id, enabled, url)\r
-{\r
-WebInspector.NativeBreakpointView.call(this, manager, id, enabled);\r
-this._url = url;\r
-}\r
-\r
-WebInspector.XHRBreakpointView.prototype = {\r
-compareTo: function(other)\r
-{\r
-return this._compare(this._url, other._url);\r
-},\r
-\r
-populateEditElement: function(element)\r
-{\r
-element.textContent = this._url;\r
-},\r
-\r
-populateLabelElement: function(element)\r
-{\r
-var label;\r
-if (!this._url.length)\r
-label = WebInspector.UIString("Any XHR");\r
-else\r
-label = WebInspector.UIString("URL contains \"%s\"", this._url);\r
-element.appendChild(document.createTextNode(label));\r
-element.addStyleClass("cursor-auto");\r
-},\r
-\r
-populateStatusMessageElement: function(element)\r
-{\r
-var status = WebInspector.UIString("Paused on a XMLHttpRequest.");\r
-element.appendChild(document.createTextNode(status));\r
-}\r
-}\r
-\r
-WebInspector.XHRBreakpointView.prototype.__proto__ = WebInspector.NativeBreakpointView.prototype;\r
-\r
-WebInspector.DOMBreakpointTypes = {\r
-SubtreeModified: 0,\r
-AttributeModified: 1,\r
-NodeRemoved: 2\r
-};\r
-\r
-WebInspector.domBreakpointTypeLabel = function(type)\r
-{\r
-if (!WebInspector._DOMBreakpointTypeLabels) {\r
-WebInspector._DOMBreakpointTypeLabels = {};\r
-WebInspector._DOMBreakpointTypeLabels[WebInspector.DOMBreakpointTypes.SubtreeModified] = WebInspector.UIString("Subtree Modified");\r
-WebInspector._DOMBreakpointTypeLabels[WebInspector.DOMBreakpointTypes.AttributeModified] = WebInspector.UIString("Attribute Modified");\r
-WebInspector._DOMBreakpointTypeLabels[WebInspector.DOMBreakpointTypes.NodeRemoved] = WebInspector.UIString("Node Removed");\r
-}\r
-return WebInspector._DOMBreakpointTypeLabels[type];\r
-}\r
-\r
-WebInspector.domBreakpointTypeContextMenuLabel = function(type)\r
-{\r
-if (!WebInspector._DOMBreakpointTypeContextMenuLabels) {\r
-WebInspector._DOMBreakpointTypeContextMenuLabels = {};\r
-WebInspector._DOMBreakpointTypeContextMenuLabels[WebInspector.DOMBreakpointTypes.SubtreeModified] = WebInspector.UIString("Break on Subtree Modifications");\r
-WebInspector._DOMBreakpointTypeContextMenuLabels[WebInspector.DOMBreakpointTypes.AttributeModified] = WebInspector.UIString("Break on Attributes Modifications");\r
-WebInspector._DOMBreakpointTypeContextMenuLabels[WebInspector.DOMBreakpointTypes.NodeRemoved] = WebInspector.UIString("Break on Node Removal");\r
-}\r
-return WebInspector._DOMBreakpointTypeContextMenuLabels[type];\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SidebarPane = function(title)\r
-{\r
-this.element = document.createElement("div");\r
-this.element.className = "pane";\r
-\r
-this.titleElement = document.createElement("div");\r
-this.titleElement.className = "title";\r
-this.titleElement.tabIndex = 0;\r
-this.titleElement.addEventListener("click", this.toggleExpanded.bind(this), false);\r
-this.titleElement.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);\r
-\r
-this.bodyElement = document.createElement("div");\r
-this.bodyElement.className = "body";\r
-\r
-this.element.appendChild(this.titleElement);\r
-this.element.appendChild(this.bodyElement);\r
-\r
-this.title = title;\r
-this.growbarVisible = false;\r
-this.expanded = false;\r
-}\r
-\r
-WebInspector.SidebarPane.prototype = {\r
-get title()\r
-{\r
-return this._title;\r
-},\r
-\r
-set title(x)\r
-{\r
-if (this._title === x)\r
-return;\r
-this._title = x;\r
-this.titleElement.textContent = x;\r
-},\r
-\r
-get growbarVisible()\r
-{\r
-return this._growbarVisible;\r
-},\r
-\r
-set growbarVisible(x)\r
-{\r
-if (this._growbarVisible === x)\r
-return;\r
-\r
-this._growbarVisible = x;\r
-\r
-if (x && !this._growbarElement) {\r
-this._growbarElement = document.createElement("div");\r
-this._growbarElement.className = "growbar";\r
-this.element.appendChild(this._growbarElement);\r
-} else if (!x && this._growbarElement) {\r
-if (this._growbarElement.parentNode)\r
-this._growbarElement.parentNode(this._growbarElement);\r
-delete this._growbarElement;\r
-}\r
-},\r
-\r
-get expanded()\r
-{\r
-return this._expanded;\r
-},\r
-\r
-set expanded(x)\r
-{\r
-if (x)\r
-this.expand();\r
-else\r
-this.collapse();\r
-},\r
-\r
-expand: function()\r
-{\r
-if (this._expanded)\r
-return;\r
-this._expanded = true;\r
-this.element.addStyleClass("expanded");\r
-if (this.onexpand)\r
-this.onexpand(this);\r
-},\r
-\r
-collapse: function()\r
-{\r
-if (!this._expanded)\r
-return;\r
-this._expanded = false;\r
-this.element.removeStyleClass("expanded");\r
-if (this.oncollapse)\r
-this.oncollapse(this);\r
-},\r
-\r
-toggleExpanded: function()\r
-{\r
-this.expanded = !this.expanded;\r
-},\r
-\r
-_onTitleKeyDown: function(event)\r
-{\r
-if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code)\r
-this.toggleExpanded();\r
-}\r
-}\r
-\r
-WebInspector.SidebarPane.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ElementsTreeOutline = function() {\r
-this.element = document.createElement("ol");\r
-this.element.addEventListener("mousedown", this._onmousedown.bind(this), false);\r
-this.element.addEventListener("mousemove", this._onmousemove.bind(this), false);\r
-this.element.addEventListener("mouseout", this._onmouseout.bind(this), false);\r
-\r
-TreeOutline.call(this, this.element);\r
-\r
-this.includeRootDOMNode = true;\r
-this.selectEnabled = false;\r
-this.showInElementsPanelEnabled = false;\r
-this.rootDOMNode = null;\r
-this.focusedDOMNode = null;\r
-\r
-this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);\r
-}\r
-\r
-WebInspector.ElementsTreeOutline.prototype = {\r
-get rootDOMNode()\r
-{\r
-return this._rootDOMNode;\r
-},\r
-\r
-set rootDOMNode(x)\r
-{\r
-if (this._rootDOMNode === x)\r
-return;\r
-\r
-this._rootDOMNode = x;\r
-\r
-this._isXMLMimeType = !!(WebInspector.mainResource && WebInspector.mainResource.mimeType && WebInspector.mainResource.mimeType.match(/x(?:ht)?ml/i));\r
-\r
-this.update();\r
-},\r
-\r
-get isXMLMimeType()\r
-{\r
-return this._isXMLMimeType;\r
-},\r
-\r
-nodeNameToCorrectCase: function(nodeName)\r
-{\r
-return this.isXMLMimeType ? nodeName : nodeName.toLowerCase();\r
-},\r
-\r
-get focusedDOMNode()\r
-{\r
-return this._focusedDOMNode;\r
-},\r
-\r
-set focusedDOMNode(x)\r
-{\r
-if (this._focusedDOMNode === x) {\r
-this.revealAndSelectNode(x);\r
-return;\r
-}\r
-\r
-this._focusedDOMNode = x;\r
-\r
-this.revealAndSelectNode(x);\r
-\r
-\r
-\r
-\r
-\r
-if (this._focusedDOMNode === x)\r
-this.focusedNodeChanged();\r
-},\r
-\r
-get editing()\r
-{\r
-return this._editing;\r
-},\r
-\r
-update: function()\r
-{\r
-var selectedNode = this.selectedTreeElement ? this.selectedTreeElement.representedObject : null;\r
-\r
-this.removeChildren();\r
-\r
-if (!this.rootDOMNode)\r
-return;\r
-\r
-var treeElement;\r
-if (this.includeRootDOMNode) {\r
-treeElement = new WebInspector.ElementsTreeElement(this.rootDOMNode);\r
-treeElement.selectable = this.selectEnabled;\r
-this.appendChild(treeElement);\r
-} else {\r
-\r
-var node = this.rootDOMNode.firstChild;\r
-while (node) {\r
-treeElement = new WebInspector.ElementsTreeElement(node);\r
-treeElement.selectable = this.selectEnabled;\r
-this.appendChild(treeElement);\r
-node = node.nextSibling;\r
-}\r
-}\r
-\r
-if (selectedNode)\r
-this.revealAndSelectNode(selectedNode);\r
-},\r
-\r
-updateSelection: function()\r
-{\r
-if (!this.selectedTreeElement)\r
-return;\r
-var element = this.treeOutline.selectedTreeElement;\r
-element.updateSelection();\r
-},\r
-\r
-focusedNodeChanged: function(forceUpdate) {},\r
-\r
-findTreeElement: function(node)\r
-{\r
-var treeElement = TreeOutline.prototype.findTreeElement.call(this, node, isAncestorNode, parentNode);\r
-if (!treeElement && node.nodeType === Node.TEXT_NODE) {\r
-\r
-treeElement = TreeOutline.prototype.findTreeElement.call(this, node.parentNode, isAncestorNode, parentNode);\r
-}\r
-\r
-return treeElement;\r
-},\r
-\r
-createTreeElementFor: function(node)\r
-{\r
-var treeElement = this.findTreeElement(node);\r
-if (treeElement)\r
-return treeElement;\r
-if (!node.parentNode)\r
-return null;\r
-\r
-var treeElement = this.createTreeElementFor(node.parentNode);\r
-if (treeElement && treeElement.showChild(node.index))\r
-return treeElement.children[node.index];\r
-\r
-return null;\r
-},\r
-\r
-set suppressRevealAndSelect(x)\r
-{\r
-if (this._suppressRevealAndSelect === x)\r
-return;\r
-this._suppressRevealAndSelect = x;\r
-},\r
-\r
-revealAndSelectNode: function(node)\r
-{\r
-if (!node || this._suppressRevealAndSelect)\r
-return;\r
-\r
-var treeElement = this.createTreeElementFor(node);\r
-if (!treeElement)\r
-return;\r
-\r
-treeElement.reveal();\r
-treeElement.select();\r
-},\r
-\r
-_treeElementFromEvent: function(event)\r
-{\r
-var root = this.element;\r
-\r
-\r
-\r
-var x = root.totalOffsetLeft + root.offsetWidth - 20;\r
-\r
-var y = event.pageY;\r
-\r
-\r
-\r
-\r
-var elementUnderMouse = this.treeElementFromPoint(x, y);\r
-var elementAboveMouse = this.treeElementFromPoint(x, y - 2);\r
-var element;\r
-if (elementUnderMouse === elementAboveMouse)\r
-element = elementUnderMouse;\r
-else\r
-element = this.treeElementFromPoint(x, y + 2);\r
-\r
-return element;\r
-},\r
-\r
-_onmousedown: function(event)\r
-{\r
-var element = this._treeElementFromEvent(event);\r
-\r
-if (!element || element.isEventWithinDisclosureTriangle(event))\r
-return;\r
-\r
-element.select();\r
-},\r
-\r
-_onmousemove: function(event)\r
-{\r
-var element = this._treeElementFromEvent(event);\r
-if (element && this._previousHoveredElement === element)\r
-return;\r
-\r
-if (this._previousHoveredElement) {\r
-this._previousHoveredElement.hovered = false;\r
-delete this._previousHoveredElement;\r
-}\r
-\r
-if (element) {\r
-element.hovered = true;\r
-this._previousHoveredElement = element;\r
-\r
-\r
-if (element.representedObject && !element.tooltip)\r
-element._createTooltipForNode();\r
-}\r
-\r
-WebInspector.highlightDOMNode(element ? element.representedObject.id : 0);\r
-},\r
-\r
-_onmouseout: function(event)\r
-{\r
-var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);\r
-if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.element))\r
-return;\r
-\r
-if (this._previousHoveredElement) {\r
-this._previousHoveredElement.hovered = false;\r
-delete this._previousHoveredElement;\r
-}\r
-\r
-WebInspector.highlightDOMNode(0);\r
-},\r
-\r
-_contextMenuEventFired: function(event)\r
-{\r
-var listItem = event.target.enclosingNodeOrSelfWithNodeName("LI");\r
-if (!listItem || !listItem.treeElement)\r
-return;\r
-\r
-var contextMenu = new WebInspector.ContextMenu();\r
-if (this.showInElementsPanelEnabled) {\r
-function focusElement()\r
-{\r
-WebInspector.currentPanel = WebInspector.panels.elements;\r
-WebInspector.panels.elements.focusedDOMNode = listItem.treeElement.representedObject;\r
-}\r
-contextMenu.appendItem(WebInspector.UIString("Reveal in Elements Panel"), focusElement.bind(this));\r
-} else {\r
-var href = event.target.enclosingNodeOrSelfWithClass("webkit-html-resource-link") || event.target.enclosingNodeOrSelfWithClass("webkit-html-external-link");\r
-var tag = event.target.enclosingNodeOrSelfWithClass("webkit-html-tag");\r
-var textNode = event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");\r
-var needSeparator;\r
-if (href)\r
-needSeparator = WebInspector.panels.elements.populateHrefContextMenu(contextMenu, event, href);\r
-if (tag && listItem.treeElement._populateTagContextMenu) {\r
-if (needSeparator)\r
-contextMenu.appendSeparator();\r
-listItem.treeElement._populateTagContextMenu(contextMenu, event);\r
-} else if (textNode && listItem.treeElement._populateTextContextMenu) {\r
-if (needSeparator)\r
-contextMenu.appendSeparator();\r
-listItem.treeElement._populateTextContextMenu(contextMenu, textNode);\r
-}\r
-}\r
-contextMenu.show(event);\r
-}\r
-}\r
-\r
-WebInspector.ElementsTreeOutline.prototype.__proto__ = TreeOutline.prototype;\r
-\r
-WebInspector.ElementsTreeElement = function(node, elementCloseTag)\r
-{\r
-this._elementCloseTag = elementCloseTag;\r
-var hasChildrenOverride = !elementCloseTag && node.hasChildNodes() && !this._showInlineText(node);\r
-\r
-\r
-TreeElement.call(this, "", node, hasChildrenOverride);\r
-\r
-if (this.representedObject.nodeType == Node.ELEMENT_NODE && !elementCloseTag)\r
-this._canAddAttributes = true;\r
-this._searchQuery = null;\r
-this._expandedChildrenLimit = WebInspector.ElementsTreeElement.InitialChildrenLimit;\r
-}\r
-\r
-WebInspector.ElementsTreeElement.InitialChildrenLimit = 500;\r
-\r
-\r
-\r
-\r
-WebInspector.ElementsTreeElement.ForbiddenClosingTagElements = [\r
-"area", "base", "basefont", "br", "canvas", "col", "command", "embed", "frame",\r
-"hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source"\r
-].keySet();\r
-\r
-\r
-WebInspector.ElementsTreeElement.EditTagBlacklist = [\r
-"html", "head", "body"\r
-].keySet();\r
-\r
-WebInspector.ElementsTreeElement.prototype = {\r
-highlightSearchResults: function(searchQuery)\r
-{\r
-if (this._searchQuery === searchQuery)\r
-return;\r
-\r
-this._searchQuery = searchQuery;\r
-this.updateTitle();\r
-},\r
-\r
-get hovered()\r
-{\r
-return this._hovered;\r
-},\r
-\r
-set hovered(x)\r
-{\r
-if (this._hovered === x)\r
-return;\r
-\r
-this._hovered = x;\r
-\r
-if (this.listItemElement) {\r
-if (x) {\r
-this.updateSelection();\r
-this.listItemElement.addStyleClass("hovered");\r
-} else {\r
-this.listItemElement.removeStyleClass("hovered");\r
-}\r
-}\r
-},\r
-\r
-get expandedChildrenLimit()\r
-{\r
-return this._expandedChildrenLimit;\r
-},\r
-\r
-set expandedChildrenLimit(x)\r
-{\r
-if (this._expandedChildrenLimit === x)\r
-return;\r
-\r
-this._expandedChildrenLimit = x;\r
-if (this.treeOutline && !this._updateChildrenInProgress)\r
-this._updateChildren(true);\r
-},\r
-\r
-get expandedChildCount()\r
-{\r
-var count = this.children.length;\r
-if (count && this.children[count - 1]._elementCloseTag)\r
-count--;\r
-if (count && this.children[count - 1].expandAllButton)\r
-count--;\r
-return count;\r
-},\r
-\r
-showChild: function(index)\r
-{\r
-if (this._elementCloseTag)\r
-return;\r
-\r
-if (index >= this.expandedChildrenLimit) {\r
-this._expandedChildrenLimit = index + 1;\r
-this._updateChildren(true);\r
-}\r
-\r
-\r
-return this.expandedChildCount > index;\r
-},\r
-\r
-_createTooltipForNode: function()\r
-{\r
-var node = this.representedObject;\r
-if (!node.nodeName || node.nodeName.toLowerCase() !== "img")\r
-return;\r
-\r
-function setTooltip(properties)\r
-{\r
-if (!properties)\r
-return;\r
-\r
-if (properties.offsetHeight === properties.naturalHeight && properties.offsetWidth === properties.naturalWidth)\r
-this.tooltip = WebInspector.UIString("%d × %d pixels", properties.offsetWidth, properties.offsetHeight);\r
-else\r
-this.tooltip = WebInspector.UIString("%d × %d pixels (Natural: %d × %d pixels)", properties.offsetWidth, properties.offsetHeight, properties.naturalWidth, properties.naturalHeight);\r
-}\r
-\r
-InjectedScriptAccess.getForNode(node).getNodeProperties(node.id, ["naturalHeight", "naturalWidth", "offsetHeight", "offsetWidth"], setTooltip.bind(this));\r
-},\r
-\r
-updateSelection: function()\r
-{\r
-var listItemElement = this.listItemElement;\r
-if (!listItemElement)\r
-return;\r
-\r
-if (document.body.offsetWidth <= 0) {\r
-\r
-\r
-return;\r
-}\r
-\r
-if (!this.selectionElement) {\r
-this.selectionElement = document.createElement("div");\r
-this.selectionElement.className = "selection selected";\r
-listItemElement.insertBefore(this.selectionElement, listItemElement.firstChild);\r
-}\r
-\r
-this.selectionElement.style.height = listItemElement.offsetHeight + "px";\r
-},\r
-\r
-onattach: function()\r
-{\r
-if (this._hovered) {\r
-this.updateSelection();\r
-this.listItemElement.addStyleClass("hovered");\r
-}\r
-\r
-this.updateTitle();\r
-\r
-this._preventFollowingLinksOnDoubleClick();\r
-},\r
-\r
-_preventFollowingLinksOnDoubleClick: function()\r
-{\r
-var links = this.listItemElement.querySelectorAll("li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-external-link, li > .webkit-html-tag > .webkit-html-attribute > .webkit-html-resource-link");\r
-if (!links)\r
-return;\r
-\r
-for (var i = 0; i < links.length; ++i)\r
-links[i].preventFollowOnDoubleClick = true;\r
-},\r
-\r
-onpopulate: function()\r
-{\r
-if (this.children.length || this._showInlineText(this.representedObject) || this._elementCloseTag)\r
-return;\r
-\r
-this.updateChildren();\r
-},\r
-\r
-updateChildren: function(fullRefresh)\r
-{\r
-if (this._elementCloseTag)\r
-return;\r
-\r
-WebInspector.domAgent.getChildNodesAsync(this.representedObject, this._updateChildren.bind(this, fullRefresh));\r
-},\r
-\r
-insertChildElement: function(child, index, closingTag)\r
-{\r
-var newElement = new WebInspector.ElementsTreeElement(child, closingTag);\r
-newElement.selectable = this.treeOutline.selectEnabled;\r
-this.insertChild(newElement, index);\r
-return newElement;\r
-},\r
-\r
-moveChild: function(child, targetIndex)\r
-{\r
-var wasSelected = child.selected;\r
-this.removeChild(child);\r
-this.insertChild(child, targetIndex);\r
-if (wasSelected)\r
-child.select();\r
-},\r
-\r
-_updateChildren: function(fullRefresh)\r
-{\r
-if (this._updateChildrenInProgress)\r
-return;\r
-\r
-this._updateChildrenInProgress = true;\r
-var focusedNode = this.treeOutline.focusedDOMNode;\r
-var originalScrollTop;\r
-if (fullRefresh) {\r
-var treeOutlineContainerElement = this.treeOutline.element.parentNode;\r
-originalScrollTop = treeOutlineContainerElement.scrollTop;\r
-var selectedTreeElement = this.treeOutline.selectedTreeElement;\r
-if (selectedTreeElement && selectedTreeElement.hasAncestor(this))\r
-this.select();\r
-this.removeChildren();\r
-}\r
-\r
-var treeElement = this;\r
-var treeChildIndex = 0;\r
-var elementToSelect;\r
-\r
-function updateChildrenOfNode(node)\r
-{\r
-var treeOutline = treeElement.treeOutline;\r
-var child = node.firstChild;\r
-while (child) {\r
-var currentTreeElement = treeElement.children[treeChildIndex];\r
-if (!currentTreeElement || currentTreeElement.representedObject !== child) {\r
-\r
-var existingTreeElement = null;\r
-for (var i = (treeChildIndex + 1), size = treeElement.expandedChildCount; i < size; ++i) {\r
-if (treeElement.children[i].representedObject === child) {\r
-existingTreeElement = treeElement.children[i];\r
-break;\r
-}\r
-}\r
-\r
-if (existingTreeElement && existingTreeElement.parent === treeElement) {\r
-\r
-treeElement.moveChild(existingTreeElement, treeChildIndex);\r
-} else {\r
-\r
-if (treeChildIndex < treeElement.expandedChildrenLimit) {\r
-var newElement = treeElement.insertChildElement(child, treeChildIndex);\r
-if (child === focusedNode)\r
-elementToSelect = newElement;\r
-if (treeElement.expandedChildCount > treeElement.expandedChildrenLimit)\r
-treeElement.expandedChildrenLimit++;\r
-}\r
-}\r
-}\r
-\r
-child = child.nextSibling;\r
-++treeChildIndex;\r
-}\r
-}\r
-\r
-\r
-for (var i = (this.children.length - 1); i >= 0; --i) {\r
-var currentChild = this.children[i];\r
-var currentNode = currentChild.representedObject;\r
-var currentParentNode = currentNode.parentNode;\r
-\r
-if (currentParentNode === this.representedObject)\r
-continue;\r
-\r
-var selectedTreeElement = this.treeOutline.selectedTreeElement;\r
-if (selectedTreeElement && (selectedTreeElement === currentChild || selectedTreeElement.hasAncestor(currentChild)))\r
-this.select();\r
-\r
-this.removeChildAtIndex(i);\r
-}\r
-\r
-updateChildrenOfNode(this.representedObject);\r
-this.adjustCollapsedRange(false);\r
-\r
-var lastChild = this.children[this.children.length - 1];\r
-if (this.representedObject.nodeType == Node.ELEMENT_NODE && (!lastChild || !lastChild._elementCloseTag))\r
-this.insertChildElement(this.representedObject, this.children.length, true);\r
-\r
-\r
-if (fullRefresh && elementToSelect) {\r
-elementToSelect.select();\r
-if (treeOutlineContainerElement && originalScrollTop <= treeOutlineContainerElement.scrollHeight)\r
-treeOutlineContainerElement.scrollTop = originalScrollTop;\r
-}\r
-\r
-delete this._updateChildrenInProgress;\r
-},\r
-\r
-adjustCollapsedRange: function()\r
-{\r
-\r
-\r
-if (this.expandAllButtonElement && this.expandAllButtonElement.__treeElement.parent)\r
-this.removeChild(this.expandAllButtonElement.__treeElement);\r
-\r
-const node = this.representedObject;\r
-if (!node.children)\r
-return;\r
-const childNodeCount = node.children.length;\r
-\r
-\r
-for (var i = this.expandedChildCount, limit = Math.min(this.expandedChildrenLimit, childNodeCount); i < limit; ++i)\r
-this.insertChildElement(node.children[i], i);\r
-\r
-const expandedChildCount = this.expandedChildCount;\r
-if (childNodeCount > this.expandedChildCount) {\r
-var targetButtonIndex = expandedChildCount;\r
-if (!this.expandAllButtonElement) {\r
-var item = new TreeElement(null, null, false);\r
-item.titleHTML = "<button class=\"show-all-nodes\" value=\"\" />";\r
-item.selectable = false;\r
-item.expandAllButton = true;\r
-this.insertChild(item, targetButtonIndex);\r
-this.expandAllButtonElement = item.listItemElement.firstChild;\r
-this.expandAllButtonElement.__treeElement = item;\r
-this.expandAllButtonElement.addEventListener("click", this.handleLoadAllChildren.bind(this), false);\r
-} else if (!this.expandAllButtonElement.__treeElement.parent)\r
-this.insertChild(this.expandAllButtonElement.__treeElement, targetButtonIndex);\r
-this.expandAllButtonElement.textContent = WebInspector.UIString("Show All Nodes (%d More)", childNodeCount - expandedChildCount);\r
-} else if (this.expandAllButtonElement)\r
-delete this.expandAllButtonElement;\r
-},\r
-\r
-handleLoadAllChildren: function()\r
-{\r
-this.expandedChildrenLimit = Math.max(this.representedObject._childNodeCount, this.expandedChildrenLimit + WebInspector.ElementsTreeElement.InitialChildrenLimit);\r
-},\r
-\r
-onexpand: function()\r
-{\r
-if (this._elementCloseTag)\r
-return;\r
-\r
-this.updateTitle();\r
-this.treeOutline.updateSelection();\r
-},\r
-\r
-oncollapse: function()\r
-{\r
-if (this._elementCloseTag)\r
-return;\r
-\r
-this.updateTitle();\r
-this.treeOutline.updateSelection();\r
-},\r
-\r
-onreveal: function()\r
-{\r
-if (this.listItemElement)\r
-this.listItemElement.scrollIntoViewIfNeeded(false);\r
-},\r
-\r
-onselect: function(treeElement, selectedByUser)\r
-{\r
-this.treeOutline.suppressRevealAndSelect = true;\r
-this.treeOutline.focusedDOMNode = this.representedObject;\r
-if (selectedByUser)\r
-WebInspector.highlightDOMNode(this.representedObject.id);\r
-this.updateSelection();\r
-this.treeOutline.suppressRevealAndSelect = false;\r
-},\r
-\r
-ondelete: function()\r
-{\r
-var startTagTreeElement = this.treeOutline.findTreeElement(this.representedObject);\r
-startTagTreeElement ? startTagTreeElement.remove() : this.remove();\r
-return true;\r
-},\r
-\r
-onenter: function()\r
-{\r
-\r
-\r
-if (this.treeOutline.editing)\r
-return false;\r
-\r
-this._startEditing();\r
-\r
-\r
-return true;\r
-},\r
-\r
-selectOnMouseDown: function(event)\r
-{\r
-TreeElement.prototype.selectOnMouseDown.call(this, event);\r
-\r
-if (this._editing)\r
-return;\r
-\r
-if (this.treeOutline.showInElementsPanelEnabled) {\r
-WebInspector.showPanel("elements");\r
-WebInspector.panels.elements.focusedDOMNode = this.representedObject;\r
-}\r
-\r
-\r
-if (event.detail >= 2)\r
-event.preventDefault();\r
-},\r
-\r
-ondblclick: function(event)\r
-{\r
-if (this._editing || this._elementCloseTag)\r
-return;\r
-\r
-if (this._startEditingTarget(event.target))\r
-return;\r
-\r
-if (this.hasChildren && !this.expanded)\r
-this.expand();\r
-},\r
-\r
-_insertInLastAttributePosition: function(tag, node)\r
-{\r
-if (tag.getElementsByClassName("webkit-html-attribute").length > 0)\r
-tag.insertBefore(node, tag.lastChild);\r
-else {\r
-var nodeName = tag.textContent.match(/^<(.*?)>$/)[1];\r
-tag.textContent = '';\r
-tag.appendChild(document.createTextNode('<'+nodeName));\r
-tag.appendChild(node);\r
-tag.appendChild(document.createTextNode('>'));\r
-}\r
-\r
-this.updateSelection();\r
-},\r
-\r
-_startEditingTarget: function(eventTarget)\r
-{\r
-if (this.treeOutline.focusedDOMNode != this.representedObject)\r
-return;\r
-\r
-if (this.representedObject.nodeType != Node.ELEMENT_NODE && this.representedObject.nodeType != Node.TEXT_NODE)\r
-return false;\r
-\r
-var textNode = eventTarget.enclosingNodeOrSelfWithClass("webkit-html-text-node");\r
-if (textNode)\r
-return this._startEditingTextNode(textNode);\r
-\r
-var attribute = eventTarget.enclosingNodeOrSelfWithClass("webkit-html-attribute");\r
-if (attribute)\r
-return this._startEditingAttribute(attribute, eventTarget);\r
-\r
-var tagName = eventTarget.enclosingNodeOrSelfWithClass("webkit-html-tag-name");\r
-if (tagName)\r
-return this._startEditingTagName(tagName);\r
-\r
-var newAttribute = eventTarget.enclosingNodeOrSelfWithClass("add-attribute");\r
-if (newAttribute)\r
-return this._addNewAttribute();\r
-\r
-return false;\r
-},\r
-\r
-_populateTagContextMenu: function(contextMenu, event)\r
-{\r
-var attribute = event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");\r
-var newAttribute = event.target.enclosingNodeOrSelfWithClass("add-attribute");\r
-\r
-\r
-contextMenu.appendItem(WebInspector.UIString("Add Attribute"), this._addNewAttribute.bind(this));\r
-if (attribute && !newAttribute)\r
-contextMenu.appendItem(WebInspector.UIString("Edit Attribute"), this._startEditingAttribute.bind(this, attribute, event.target));\r
-contextMenu.appendSeparator();\r
-\r
-\r
-contextMenu.appendItem(WebInspector.UIString("Edit as HTML"), this._editAsHTML.bind(this));\r
-contextMenu.appendItem(WebInspector.UIString("Copy as HTML"), this._copyHTML.bind(this));\r
-contextMenu.appendItem(WebInspector.UIString("Delete Node"), this.remove.bind(this));\r
-\r
-if (Preferences.nativeInstrumentationEnabled) {\r
-\r
-contextMenu.appendSeparator();\r
-\r
-function handlerFunction(nodeId, breakType)\r
-{\r
-WebInspector.breakpointManager.createDOMBreakpoint(nodeId, breakType);\r
-WebInspector.panels.elements.sidebarPanes.domBreakpoints.expand();\r
-}\r
-var node = this.representedObject;\r
-for (var key in WebInspector.DOMBreakpointTypes) {\r
-var type = WebInspector.DOMBreakpointTypes[key];\r
-var label = WebInspector.domBreakpointTypeContextMenuLabel(type);\r
-var breakpoint = node.breakpoints[type];\r
-if (!breakpoint)\r
-var handler = handlerFunction.bind(this, node.id, type);\r
-else\r
-var handler = breakpoint.remove.bind(breakpoint);\r
-contextMenu.appendCheckboxItem(label, handler, !!breakpoint);\r
-}\r
-}\r
-},\r
-\r
-_populateTextContextMenu: function(contextMenu, textNode)\r
-{\r
-contextMenu.appendItem(WebInspector.UIString("Edit Text"), this._startEditingTextNode.bind(this, textNode));\r
-},\r
-\r
-_startEditing: function()\r
-{\r
-if (this.treeOutline.focusedDOMNode !== this.representedObject)\r
-return;\r
-\r
-var listItem = this._listItemNode;\r
-\r
-if (this._canAddAttributes) {\r
-var attribute = listItem.getElementsByClassName("webkit-html-attribute")[0];\r
-if (attribute)\r
-return this._startEditingAttribute(attribute, attribute.getElementsByClassName("webkit-html-attribute-value")[0]);\r
-\r
-return this._addNewAttribute();\r
-}\r
-\r
-if (this.representedObject.nodeType === Node.TEXT_NODE) {\r
-var textNode = listItem.getElementsByClassName("webkit-html-text-node")[0];\r
-if (textNode)\r
-return this._startEditingTextNode(textNode);\r
-return;\r
-}\r
-},\r
-\r
-_addNewAttribute: function()\r
-{\r
-\r
-\r
-var container = document.createElement("span");\r
-container.innerHTML = this._attributeHTML(" ", "");\r
-var attr = container.firstChild;\r
-attr.style.marginLeft = "2px"; \r
-attr.style.marginRight = "2px"; \r
-\r
-var tag = this.listItemElement.getElementsByClassName("webkit-html-tag")[0];\r
-this._insertInLastAttributePosition(tag, attr);\r
-return this._startEditingAttribute(attr, attr);\r
-},\r
-\r
-_triggerEditAttribute: function(attributeName)\r
-{\r
-var attributeElements = this.listItemElement.getElementsByClassName("webkit-html-attribute-name");\r
-for (var i = 0, len = attributeElements.length; i < len; ++i) {\r
-if (attributeElements[i].textContent === attributeName) {\r
-for (var elem = attributeElements[i].nextSibling; elem; elem = elem.nextSibling) {\r
-if (elem.nodeType !== Node.ELEMENT_NODE)\r
-continue;\r
-\r
-if (elem.hasStyleClass("webkit-html-attribute-value"))\r
-return this._startEditingAttribute(elem.parentNode, elem);\r
-}\r
-}\r
-}\r
-},\r
-\r
-_startEditingAttribute: function(attribute, elementForSelection)\r
-{\r
-if (WebInspector.isBeingEdited(attribute))\r
-return true;\r
-\r
-var attributeNameElement = attribute.getElementsByClassName("webkit-html-attribute-name")[0];\r
-if (!attributeNameElement)\r
-return false;\r
-\r
-var attributeName = attributeNameElement.innerText;\r
-\r
-function removeZeroWidthSpaceRecursive(node)\r
-{\r
-if (node.nodeType === Node.TEXT_NODE) {\r
-node.nodeValue = node.nodeValue.replace(/\u200B/g, "");\r
-return;\r
-}\r
-\r
-if (node.nodeType !== Node.ELEMENT_NODE)\r
-return;\r
-\r
-for (var child = node.firstChild; child; child = child.nextSibling)\r
-removeZeroWidthSpaceRecursive(child);\r
-}\r
-\r
-\r
-removeZeroWidthSpaceRecursive(attribute);\r
-\r
-this._editing = WebInspector.startEditing(attribute, {\r
-context: attributeName,\r
-commitHandler: this._attributeEditingCommitted.bind(this),\r
-cancelHandler: this._editingCancelled.bind(this)\r
-});\r
-window.getSelection().setBaseAndExtent(elementForSelection, 0, elementForSelection, 1);\r
-\r
-return true;\r
-},\r
-\r
-_startEditingTextNode: function(textNode)\r
-{\r
-if (WebInspector.isBeingEdited(textNode))\r
-return true;\r
-\r
-this._editing = WebInspector.startEditing(textNode, {\r
-context: null,\r
-commitHandler: this._textNodeEditingCommitted.bind(this),\r
-cancelHandler: this._editingCancelled.bind(this)\r
-});\r
-window.getSelection().setBaseAndExtent(textNode, 0, textNode, 1);\r
-\r
-return true;\r
-},\r
-\r
-_startEditingTagName: function(tagNameElement)\r
-{\r
-if (!tagNameElement) {\r
-tagNameElement = this.listItemElement.getElementsByClassName("webkit-html-tag-name")[0];\r
-if (!tagNameElement)\r
-return false;\r
-}\r
-\r
-var tagName = tagNameElement.textContent;\r
-if (WebInspector.ElementsTreeElement.EditTagBlacklist[tagName.toLowerCase()])\r
-return false;\r
-\r
-if (WebInspector.isBeingEdited(tagNameElement))\r
-return true;\r
-\r
-var closingTagElement = this._distinctClosingTagElement();\r
-\r
-function keyupListener(event)\r
-{\r
-if (closingTagElement)\r
-closingTagElement.textContent = "</" + tagNameElement.textContent + ">";\r
-}\r
-\r
-function editingComitted(element, newTagName)\r
-{\r
-tagNameElement.removeEventListener('keyup', keyupListener, false);\r
-this._tagNameEditingCommitted.apply(this, arguments);\r
-}\r
-\r
-function editingCancelled()\r
-{\r
-tagNameElement.removeEventListener('keyup', keyupListener, false);\r
-this._editingCancelled.apply(this, arguments);\r
-}\r
-\r
-tagNameElement.addEventListener('keyup', keyupListener, false);\r
-\r
-this._editing = WebInspector.startEditing(tagNameElement, {\r
-context: tagName,\r
-commitHandler: editingComitted.bind(this),\r
-cancelHandler: editingCancelled.bind(this)\r
-});\r
-window.getSelection().setBaseAndExtent(tagNameElement, 0, tagNameElement, 1);\r
-return true;\r
-},\r
-\r
-_startEditingAsHTML: function(commitCallback, initialValue)\r
-{\r
-if (this._htmlEditElement && WebInspector.isBeingEdited(this._htmlEditElement))\r
-return true;\r
-\r
-this._htmlEditElement = document.createElement("div");\r
-this._htmlEditElement.className = "source-code elements-tree-editor";\r
-this._htmlEditElement.textContent = initialValue;\r
-\r
-\r
-var child = this.listItemElement.firstChild;\r
-while (child) {\r
-child.style.display = "none";\r
-child = child.nextSibling;\r
-}\r
-\r
-if (this._childrenListNode)\r
-this._childrenListNode.style.display = "none";\r
-\r
-this.listItemElement.appendChild(this._htmlEditElement);\r
-\r
-this.updateSelection();\r
-\r
-function commit()\r
-{\r
-commitCallback(this._htmlEditElement.textContent);\r
-dispose.call(this);\r
-}\r
-\r
-function dispose()\r
-{\r
-delete this._editing;\r
-\r
-\r
-this.listItemElement.removeChild(this._htmlEditElement);\r
-delete this._htmlEditElement;\r
-\r
-if (this._childrenListNode)\r
-this._childrenListNode.style.removeProperty("display");\r
-\r
-var child = this.listItemElement.firstChild;\r
-while (child) {\r
-child.style.removeProperty("display");\r
-child = child.nextSibling;\r
-}\r
-\r
-this.updateSelection();\r
-}\r
-\r
-this._editing = WebInspector.startEditing(this._htmlEditElement, {\r
-context: null,\r
-commitHandler: commit.bind(this),\r
-cancelHandler: dispose.bind(this),\r
-multiline: true\r
-});\r
-},\r
-\r
-_attributeEditingCommitted: function(element, newText, oldText, attributeName, moveDirection)\r
-{\r
-delete this._editing;\r
-\r
-\r
-\r
-var moveToAttribute, moveToTagName, moveToNewAttribute;\r
-if (moveDirection) {\r
-var found = false;\r
-\r
-\r
-var attributes = this.representedObject.attributes;\r
-for (var i = 0; i < attributes.length; ++i) {\r
-if (attributes[i].name === attributeName) {\r
-found = true;\r
-if (moveDirection === "backward") {\r
-if (i === 0)\r
-moveToTagName = true;\r
-else\r
-moveToAttribute = attributes[i - 1].name;\r
-} else if (moveDirection === "forward") {\r
-if (i === attributes.length - 1)\r
-moveToNewAttribute = true;\r
-else\r
-moveToAttribute = attributes[i + 1].name;\r
-}\r
-}\r
-}\r
-\r
-\r
-if (!found) {\r
-if (moveDirection === "backward" && attributes.length > 0)\r
-moveToAttribute = attributes[attributes.length - 1].name;\r
-else if (moveDirection === "forward") {\r
-if (!/^\s*$/.test(newText))\r
-moveToNewAttribute = true;\r
-else\r
-moveToTagName = true;\r
-}\r
-}\r
-}\r
-\r
-function moveToNextAttributeIfNeeded()\r
-{\r
-\r
-if (element.textContent.trim().length === 0)\r
-element.parentNode.removeChild(element);\r
-\r
-\r
-if (moveToAttribute)\r
-this._triggerEditAttribute(moveToAttribute);\r
-else if (moveToNewAttribute)\r
-this._addNewAttribute();\r
-else if (moveToTagName)\r
-this._startEditingTagName();\r
-}\r
-\r
-function regenerateStyledAttribute(name, value)\r
-{\r
-var previous = element.previousSibling;\r
-if (!previous || previous.nodeType !== Node.TEXT_NODE)\r
-element.parentNode.insertBefore(document.createTextNode(" "), element);\r
-element.outerHTML = this._attributeHTML(name, value);\r
-}\r
-\r
-var parseContainerElement = document.createElement("span");\r
-parseContainerElement.innerHTML = "<span " + newText + "></span>";\r
-var parseElement = parseContainerElement.firstChild;\r
-\r
-if (!parseElement) {\r
-this._editingCancelled(element, attributeName);\r
-moveToNextAttributeIfNeeded.call(this);\r
-return;\r
-}\r
-\r
-if (!parseElement.hasAttributes()) {\r
-this.representedObject.removeAttribute(attributeName);\r
-moveToNextAttributeIfNeeded.call(this);\r
-return;\r
-}\r
-\r
-var foundOriginalAttribute = false;\r
-for (var i = 0; i < parseElement.attributes.length; ++i) {\r
-var attr = parseElement.attributes[i];\r
-foundOriginalAttribute = foundOriginalAttribute || attr.name === attributeName;\r
-try {\r
-this.representedObject.setAttribute(attr.name, attr.value);\r
-regenerateStyledAttribute.call(this, attr.name, attr.value);\r
-} catch(e) {} \r
-}\r
-\r
-if (!foundOriginalAttribute)\r
-this.representedObject.removeAttribute(attributeName);\r
-\r
-this.treeOutline.focusedNodeChanged(true);\r
-\r
-moveToNextAttributeIfNeeded.call(this);\r
-},\r
-\r
-_tagNameEditingCommitted: function(element, newText, oldText, tagName, moveDirection)\r
-{\r
-delete this._editing;\r
-var self = this;\r
-\r
-function cancel()\r
-{\r
-var closingTagElement = self._distinctClosingTagElement();\r
-if (closingTagElement)\r
-closingTagElement.textContent = "</" + tagName + ">";\r
-\r
-self._editingCancelled(element, tagName);\r
-moveToNextAttributeIfNeeded.call(self);\r
-}\r
-\r
-function moveToNextAttributeIfNeeded()\r
-{\r
-if (moveDirection !== "forward") {\r
-this._addNewAttribute();\r
-return;\r
-}\r
-\r
-var attributes = this.representedObject.attributes;\r
-if (attributes.length > 0)\r
-this._triggerEditAttribute(attributes[0].name);\r
-else\r
-this._addNewAttribute();\r
-}\r
-\r
-newText = newText.trim();\r
-if (newText === oldText) {\r
-cancel();\r
-return;\r
-}\r
-\r
-var treeOutline = this.treeOutline;\r
-var wasExpanded = this.expanded;\r
-\r
-function changeTagNameCallback(nodeId)\r
-{\r
-if (!nodeId) {\r
-cancel();\r
-return;\r
-}\r
-\r
-\r
-WebInspector.panels.elements.updateModifiedNodes();\r
-\r
-WebInspector.updateFocusedNode(nodeId);\r
-var newTreeItem = treeOutline.findTreeElement(WebInspector.domAgent.nodeForId(nodeId));\r
-if (wasExpanded)\r
-newTreeItem.expand();\r
-\r
-moveToNextAttributeIfNeeded.call(newTreeItem);\r
-}\r
-\r
-InspectorBackend.changeTagName(this.representedObject.id, newText, changeTagNameCallback);\r
-},\r
-\r
-_textNodeEditingCommitted: function(element, newText)\r
-{\r
-delete this._editing;\r
-\r
-var textNode;\r
-if (this.representedObject.nodeType === Node.ELEMENT_NODE) {\r
-\r
-\r
-textNode = this.representedObject.firstChild;\r
-} else if (this.representedObject.nodeType == Node.TEXT_NODE)\r
-textNode = this.representedObject;\r
-\r
-textNode.nodeValue = newText;\r
-},\r
-\r
-_editingCancelled: function(element, context)\r
-{\r
-delete this._editing;\r
-\r
-\r
-this.updateTitle();\r
-},\r
-\r
-_distinctClosingTagElement: function()\r
-{\r
-\r
-\r
-\r
-\r
-if (this.expanded) {\r
-var closers = this._childrenListNode.querySelectorAll(".close");\r
-return closers[closers.length-1];\r
-}\r
-\r
-\r
-\r
-\r
-var tags = this.listItemElement.getElementsByClassName("webkit-html-tag");\r
-return (tags.length === 1 ? null : tags[tags.length-1]);\r
-},\r
-\r
-updateTitle: function()\r
-{\r
-\r
-\r
-if (this._editing)\r
-return;\r
-\r
-this.titleHTML = "<span class=\"highlight\">" + this._nodeTitleInfo(WebInspector.linkifyURL).titleHTML + "</span>";\r
-delete this.selectionElement;\r
-this.updateSelection();\r
-this._preventFollowingLinksOnDoubleClick();\r
-this._highlightSearchResults();\r
-},\r
-\r
-_attributeHTML: function(name, value, node, linkify)\r
-{\r
-var hasText = (value.length > 0);\r
-var html = "<span class=\"webkit-html-attribute\"><span class=\"webkit-html-attribute-name\">" + name.escapeHTML() + "</span>";\r
-\r
-if (hasText)\r
-html += "=&#8203;\"";\r
-\r
-if (linkify && (name === "src" || name === "href")) {\r
-var rewrittenHref = WebInspector.resourceURLForRelatedNode(node, value);\r
-value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B");\r
-html += linkify(rewrittenHref, value, "webkit-html-attribute-value", node.nodeName.toLowerCase() === "a");\r
-} else {\r
-value = value.escapeHTML().replace(/([\/;:\)\]\}])/g, "$1&#8203;");\r
-html += "<span class=\"webkit-html-attribute-value\">" + value + "</span>";\r
-}\r
-\r
-if (hasText)\r
-html += "\"";\r
-\r
-html += "</span>";\r
-return html;\r
-},\r
-\r
-_tagHTML: function(tagName, isClosingTag, isDistinctTreeElement, linkify)\r
-{\r
-var node = this.representedObject;\r
-var result = "<span class=\"webkit-html-tag" + (isClosingTag && isDistinctTreeElement ? " close" : "")  + "\">&lt;";\r
-result += "<span " + (isClosingTag ? "" : "class=\"webkit-html-tag-name\"") + ">" + (isClosingTag ? "/" : "") + tagName + "</span>";\r
-if (!isClosingTag && node.hasAttributes()) {\r
-for (var i = 0; i < node.attributes.length; ++i) {\r
-var attr = node.attributes[i];\r
-result += " " + this._attributeHTML(attr.name, attr.value, node, linkify);\r
-}\r
-}\r
-result += "&gt;</span>&#8203;";\r
-\r
-return result;\r
-},\r
-\r
-_nodeTitleInfo: function(linkify)\r
-{\r
-var node = this.representedObject;\r
-var info = {titleHTML: "", hasChildren: this.hasChildren};\r
-\r
-switch (node.nodeType) {\r
-case Node.DOCUMENT_NODE:\r
-info.titleHTML = "Document";\r
-break;\r
-\r
-case Node.DOCUMENT_FRAGMENT_NODE:\r
-info.titleHTML = "Document Fragment";\r
-break;\r
-\r
-case Node.ATTRIBUTE_NODE:\r
-var value = node.value || "\u200B"; \r
-info.titleHTML = this._attributeHTML(node.name, value);\r
-break;\r
-\r
-case Node.ELEMENT_NODE:\r
-var tagName = this.treeOutline.nodeNameToCorrectCase(node.nodeName).escapeHTML();\r
-if (this._elementCloseTag) {\r
-info.titleHTML = this._tagHTML(tagName, true, true);\r
-info.hasChildren = false;\r
-break;\r
-}\r
-\r
-var titleHTML = this._tagHTML(tagName, false, false, linkify);\r
-\r
-var textChild = onlyTextChild.call(node);\r
-var showInlineText = textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength;\r
-\r
-if (!this.expanded && (!showInlineText && (this.treeOutline.isXMLMimeType || !WebInspector.ElementsTreeElement.ForbiddenClosingTagElements[tagName]))) {\r
-if (this.hasChildren)\r
-titleHTML += "<span class=\"webkit-html-text-node\">&#8230;</span>&#8203;";\r
-titleHTML += this._tagHTML(tagName, true, false);\r
-}\r
-\r
-\r
-\r
-\r
-if (showInlineText) {\r
-titleHTML += "<span class=\"webkit-html-text-node\">" + textChild.nodeValue.escapeHTML() + "</span>&#8203;" + this._tagHTML(tagName, true, false);\r
-info.hasChildren = false;\r
-}\r
-info.titleHTML = titleHTML;\r
-break;\r
-\r
-case Node.TEXT_NODE:\r
-if (isNodeWhitespace.call(node))\r
-info.titleHTML = "(whitespace)";\r
-else {\r
-if (node.parentNode && node.parentNode.nodeName.toLowerCase() === "script") {\r
-var newNode = document.createElement("span");\r
-newNode.textContent = node.textContent;\r
-\r
-var javascriptSyntaxHighlighter = new WebInspector.DOMSyntaxHighlighter("text/javascript");\r
-javascriptSyntaxHighlighter.syntaxHighlightNode(newNode);\r
-\r
-info.titleHTML = "<span class=\"webkit-html-text-node webkit-html-js-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";\r
-} else if (node.parentNode && node.parentNode.nodeName.toLowerCase() === "style") {\r
-var newNode = document.createElement("span");\r
-newNode.textContent = node.textContent;\r
-\r
-var cssSyntaxHighlighter = new WebInspector.DOMSyntaxHighlighter("text/css");\r
-cssSyntaxHighlighter.syntaxHighlightNode(newNode);\r
-\r
-info.titleHTML = "<span class=\"webkit-html-text-node webkit-html-css-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";\r
-} else\r
-info.titleHTML = "\"<span class=\"webkit-html-text-node\">" + node.nodeValue.escapeHTML() + "</span>\"";\r
-}\r
-break;\r
-\r
-case Node.COMMENT_NODE:\r
-info.titleHTML = "<span class=\"webkit-html-comment\">&lt;!--" + node.nodeValue.escapeHTML() + "--&gt;</span>";\r
-break;\r
-\r
-case Node.DOCUMENT_TYPE_NODE:\r
-var titleHTML = "<span class=\"webkit-html-doctype\">&lt;!DOCTYPE " + node.nodeName;\r
-if (node.publicId) {\r
-titleHTML += " PUBLIC \"" + node.publicId + "\"";\r
-if (node.systemId)\r
-titleHTML += " \"" + node.systemId + "\"";\r
-} else if (node.systemId)\r
-titleHTML += " SYSTEM \"" + node.systemId + "\"";\r
-if (node.internalSubset)\r
-titleHTML += " [" + node.internalSubset + "]";\r
-titleHTML += "&gt;</span>";\r
-info.titleHTML = titleHTML;\r
-break;\r
-\r
-case Node.CDATA_SECTION_NODE:\r
-info.titleHTML = "<span class=\"webkit-html-text-node\">&lt;![CDATA[" + node.nodeValue.escapeHTML() + "]]&gt;</span>";\r
-break;\r
-default:\r
-info.titleHTML = this.treeOutline.nodeNameToCorrectCase(node.nodeName).collapseWhitespace().escapeHTML();\r
-}\r
-\r
-return info;\r
-},\r
-\r
-_showInlineText: function(node)\r
-{\r
-if (node.nodeType === Node.ELEMENT_NODE) {\r
-var textChild = onlyTextChild.call(node);\r
-if (textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength)\r
-return true;\r
-}\r
-return false;\r
-},\r
-\r
-remove: function()\r
-{\r
-var parentElement = this.parent;\r
-if (!parentElement)\r
-return;\r
-\r
-var self = this;\r
-function removeNodeCallback(removedNodeId)\r
-{\r
-\r
-\r
-if (removedNodeId === -1)\r
-return;\r
-\r
-parentElement.removeChild(self);\r
-parentElement.adjustCollapsedRange(true);\r
-}\r
-\r
-InspectorBackend.removeNode(this.representedObject.id, removeNodeCallback);\r
-},\r
-\r
-_editAsHTML: function()\r
-{\r
-var treeOutline = this.treeOutline;\r
-var node = this.representedObject;\r
-var wasExpanded = this.expanded;\r
-\r
-function selectNode(nodeId)\r
-{\r
-if (!nodeId)\r
-return;\r
-\r
-\r
-WebInspector.panels.elements.updateModifiedNodes();\r
-\r
-WebInspector.updateFocusedNode(nodeId);\r
-if (wasExpanded) {\r
-var newTreeItem = treeOutline.findTreeElement(WebInspector.domAgent.nodeForId(nodeId));\r
-if (newTreeItem)\r
-newTreeItem.expand();\r
-}\r
-}\r
-\r
-function commitChange(value)\r
-{\r
-InspectorBackend.setOuterHTML(node.id, value, selectNode);\r
-}\r
-\r
-InspectorBackend.getOuterHTML(node.id, this._startEditingAsHTML.bind(this, commitChange));\r
-},\r
-\r
-_copyHTML: function()\r
-{\r
-InspectorBackend.copyNode(this.representedObject.id);\r
-},\r
-\r
-_highlightSearchResults: function()\r
-{\r
-if (!this._searchQuery)\r
-return;\r
-var text = this.listItemElement.textContent;\r
-var regexObject = createSearchRegex(this._searchQuery);\r
-\r
-var offset = 0;\r
-var match = regexObject.exec(text);\r
-while (match) {\r
-highlightSearchResult(this.listItemElement, offset + match.index, match[0].length);\r
-offset += match.index + 1;\r
-text = text.substring(match.index + 1);\r
-match = regexObject.exec(text);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.ElementsTreeElement.prototype.__proto__ = TreeElement.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SidebarSectionTreeElement = function(title, representedObject, hasChildren)\r
-{\r
-TreeElement.call(this, title.escapeHTML(), representedObject || {}, hasChildren);\r
-}\r
-\r
-WebInspector.SidebarSectionTreeElement.prototype = {\r
-selectable: false,\r
-\r
-get smallChildren()\r
-{\r
-return this._smallChildren;\r
-},\r
-\r
-set smallChildren(x)\r
-{\r
-if (this._smallChildren === x)\r
-return;\r
-\r
-this._smallChildren = x;\r
-\r
-if (this._smallChildren)\r
-this._childrenListNode.addStyleClass("small");\r
-else\r
-this._childrenListNode.removeStyleClass("small");\r
-},\r
-\r
-onattach: function()\r
-{\r
-this._listItemNode.addStyleClass("sidebar-tree-section");\r
-},\r
-\r
-onreveal: function()\r
-{\r
-if (this.listItemElement)\r
-this.listItemElement.scrollIntoViewIfNeeded(false);\r
-}\r
-}\r
-\r
-WebInspector.SidebarSectionTreeElement.prototype.__proto__ = TreeElement.prototype;\r
-\r
-WebInspector.SidebarTreeElement = function(className, title, subtitle, representedObject, hasChildren)\r
-{\r
-TreeElement.call(this, "", representedObject || {}, hasChildren);\r
-\r
-if (hasChildren) {\r
-this.disclosureButton = document.createElement("button");\r
-this.disclosureButton.className = "disclosure-button";\r
-}\r
-\r
-if (!this.iconElement) {\r
-this.iconElement = document.createElement("img");\r
-this.iconElement.className = "icon";\r
-}\r
-\r
-this.statusElement = document.createElement("div");\r
-this.statusElement.className = "status";\r
-\r
-this.titlesElement = document.createElement("div");\r
-this.titlesElement.className = "titles";\r
-\r
-this.titleElement = document.createElement("span");\r
-this.titleElement.className = "title";\r
-this.titlesElement.appendChild(this.titleElement);\r
-\r
-this.subtitleElement = document.createElement("span");\r
-this.subtitleElement.className = "subtitle";\r
-this.titlesElement.appendChild(this.subtitleElement);\r
-\r
-this.className = className;\r
-this.mainTitle = title;\r
-this.subtitle = subtitle;\r
-}\r
-\r
-WebInspector.SidebarTreeElement.prototype = {\r
-get small()\r
-{\r
-return this._small;\r
-},\r
-\r
-set small(x)\r
-{\r
-this._small = x;\r
-\r
-if (this._listItemNode) {\r
-if (this._small)\r
-this._listItemNode.addStyleClass("small");\r
-else\r
-this._listItemNode.removeStyleClass("small");\r
-}\r
-},\r
-\r
-get mainTitle()\r
-{\r
-return this._mainTitle;\r
-},\r
-\r
-set mainTitle(x)\r
-{\r
-this._mainTitle = x;\r
-this.refreshTitles();\r
-},\r
-\r
-get subtitle()\r
-{\r
-return this._subtitle;\r
-},\r
-\r
-set subtitle(x)\r
-{\r
-this._subtitle = x;\r
-this.refreshTitles();\r
-},\r
-\r
-get bubbleText()\r
-{\r
-return this._bubbleText;\r
-},\r
-\r
-set bubbleText(x)\r
-{\r
-if (!this.bubbleElement) {\r
-this.bubbleElement = document.createElement("div");\r
-this.bubbleElement.className = "bubble";\r
-this.statusElement.appendChild(this.bubbleElement);\r
-}\r
-\r
-this._bubbleText = x;\r
-this.bubbleElement.textContent = x;\r
-},\r
-\r
-refreshTitles: function()\r
-{\r
-var mainTitle = this.mainTitle;\r
-if (this.titleElement.textContent !== mainTitle)\r
-this.titleElement.textContent = mainTitle;\r
-\r
-var subtitle = this.subtitle;\r
-if (subtitle) {\r
-if (this.subtitleElement.textContent !== subtitle)\r
-this.subtitleElement.textContent = subtitle;\r
-this.titlesElement.removeStyleClass("no-subtitle");\r
-} else\r
-this.titlesElement.addStyleClass("no-subtitle");\r
-},\r
-\r
-isEventWithinDisclosureTriangle: function(event)\r
-{\r
-return event.target === this.disclosureButton;\r
-},\r
-\r
-onattach: function()\r
-{\r
-this._listItemNode.addStyleClass("sidebar-tree-item");\r
-\r
-if (this.className)\r
-this._listItemNode.addStyleClass(this.className);\r
-\r
-if (this.small)\r
-this._listItemNode.addStyleClass("small");\r
-\r
-if (this.hasChildren && this.disclosureButton)\r
-this._listItemNode.appendChild(this.disclosureButton);\r
-\r
-this._listItemNode.appendChild(this.iconElement);\r
-this._listItemNode.appendChild(this.statusElement);\r
-this._listItemNode.appendChild(this.titlesElement);\r
-},\r
-\r
-onreveal: function()\r
-{\r
-if (this._listItemNode)\r
-this._listItemNode.scrollIntoViewIfNeeded(false);\r
-}\r
-}\r
-\r
-WebInspector.SidebarTreeElement.prototype.__proto__ = TreeElement.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Section = function(title, subtitle)\r
-{\r
-this.element = document.createElement("div");\r
-this.element.className = "section";\r
-this.element._section = this;\r
-\r
-this.headerElement = document.createElement("div");\r
-this.headerElement.className = "header";\r
-\r
-this.titleElement = document.createElement("div");\r
-this.titleElement.className = "title";\r
-\r
-this.subtitleElement = document.createElement("div");\r
-this.subtitleElement.className = "subtitle";\r
-\r
-this.headerElement.appendChild(this.subtitleElement);\r
-this.headerElement.appendChild(this.titleElement);\r
-\r
-this.headerElement.addEventListener("click", this.toggleExpanded.bind(this), false);\r
-this.element.appendChild(this.headerElement);\r
-\r
-this.title = title;\r
-this.subtitle = subtitle;\r
-this._expanded = false;\r
-}\r
-\r
-WebInspector.Section.prototype = {\r
-get title()\r
-{\r
-return this._title;\r
-},\r
-\r
-set title(x)\r
-{\r
-if (this._title === x)\r
-return;\r
-this._title = x;\r
-\r
-if (x instanceof Node) {\r
-this.titleElement.removeChildren();\r
-this.titleElement.appendChild(x);\r
-} else\r
-this.titleElement.textContent = x;\r
-},\r
-\r
-get subtitle()\r
-{\r
-return this._subtitle;\r
-},\r
-\r
-set subtitle(x)\r
-{\r
-if (this._subtitle === x)\r
-return;\r
-this._subtitle = x;\r
-this.subtitleElement.textContent = x;\r
-},\r
-\r
-get subtitleAsTextForTest()\r
-{\r
-var result = this.subtitleElement.textContent;\r
-var child = this.subtitleElement.querySelector("[data-uncopyable]");\r
-if (child) {\r
-var linkData = child.getAttribute("data-uncopyable");\r
-if (linkData)\r
-result += linkData;\r
-}\r
-return result;\r
-},\r
-\r
-get expanded()\r
-{\r
-return this._expanded;\r
-},\r
-\r
-set expanded(x)\r
-{\r
-if (x)\r
-this.expand();\r
-else\r
-this.collapse();\r
-},\r
-\r
-get populated()\r
-{\r
-return this._populated;\r
-},\r
-\r
-set populated(x)\r
-{\r
-this._populated = x;\r
-if (!x && this.onpopulate && this._expanded) {\r
-this.onpopulate(this);\r
-this._populated = true;\r
-}\r
-},\r
-\r
-get nextSibling()\r
-{\r
-var curElement = this.element;\r
-do {\r
-curElement = curElement.nextSibling;\r
-} while (curElement && !curElement._section);\r
-\r
-return curElement ? curElement._section : null;\r
-},\r
-\r
-get previousSibling()\r
-{\r
-var curElement = this.element;\r
-do {\r
-curElement = curElement.previousSibling;\r
-} while (curElement && !curElement._section);\r
-\r
-return curElement ? curElement._section : null;\r
-},\r
-\r
-expand: function()\r
-{\r
-if (this._expanded)\r
-return;\r
-this._expanded = true;\r
-this.element.addStyleClass("expanded");\r
-\r
-if (!this._populated && this.onpopulate) {\r
-this.onpopulate(this);\r
-this._populated = true;\r
-}\r
-},\r
-\r
-collapse: function()\r
-{\r
-if (!this._expanded)\r
-return;\r
-this._expanded = false;\r
-this.element.removeStyleClass("expanded");\r
-},\r
-\r
-toggleExpanded: function()\r
-{\r
-this.expanded = !this.expanded;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.PropertiesSection = function(title, subtitle)\r
-{\r
-WebInspector.Section.call(this, title, subtitle);\r
-\r
-this.headerElement.addStyleClass("monospace");\r
-this.propertiesElement = document.createElement("ol");\r
-this.propertiesElement.className = "properties properties-tree monospace";\r
-this.propertiesElement.tabIndex = 0;\r
-this.propertiesTreeOutline = new TreeOutline(this.propertiesElement);\r
-this.propertiesTreeOutline.section = this;\r
-\r
-this.element.appendChild(this.propertiesElement);\r
-}\r
-\r
-WebInspector.PropertiesSection.prototype.__proto__ = WebInspector.Section.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.RemoteObject = function(objectId, type, description, hasChildren)\r
-{\r
-this._objectId = objectId;\r
-this._type = type;\r
-this._description = description;\r
-this._hasChildren = hasChildren;\r
-}\r
-\r
-WebInspector.RemoteObject.fromPrimitiveValue = function(value)\r
-{\r
-return new WebInspector.RemoteObject(null, typeof value, value);\r
-}\r
-\r
-WebInspector.RemoteObject.fromLocalObject = function(value)\r
-{\r
-return new WebInspector.LocalJSONObject(value);\r
-}\r
-\r
-WebInspector.RemoteObject.resolveNode = function(node, callback)\r
-{\r
-function mycallback(object)\r
-{\r
-callback(object ? WebInspector.RemoteObject.fromPayload(object) : null);\r
-}\r
-InjectedScriptAccess.getForNode(node).resolveNode(node.id, mycallback);\r
-}\r
-\r
-WebInspector.RemoteObject.fromPayload = function(payload)\r
-{\r
-if (typeof payload === "object")\r
-return new WebInspector.RemoteObject(payload.objectId, payload.type, payload.description, payload.hasChildren);\r
-\r
-return payload;\r
-}\r
-\r
-WebInspector.RemoteObject.type = function(remoteObject)\r
-{\r
-if (remoteObject === null)\r
-return "null";\r
-\r
-var type = typeof remoteObject;\r
-if (type !== "object" && type !== "function")\r
-return type;\r
-\r
-return remoteObject.type;\r
-}\r
-\r
-WebInspector.RemoteObject.prototype = {\r
-get objectId()\r
-{\r
-return this._objectId;\r
-},\r
-\r
-get type()\r
-{\r
-return this._type;\r
-},\r
-\r
-get description()\r
-{\r
-return this._description;\r
-},\r
-\r
-get hasChildren()\r
-{\r
-return this._hasChildren;\r
-},\r
-\r
-isError: function()\r
-{\r
-return this._type === "error";\r
-},\r
-\r
-getOwnProperties: function(abbreviate, callback)\r
-{\r
-this.getProperties(false, abbreviate, callback);\r
-},\r
-\r
-getProperties: function(ignoreHasOwnProperty, abbreviate, callback)\r
-{\r
-if (!this._objectId) {\r
-callback([]);\r
-return;\r
-}\r
-function remoteObjectBinder(properties)\r
-{\r
-for (var i = 0; properties && i < properties.length; ++i)\r
-properties[i].value = WebInspector.RemoteObject.fromPayload(properties[i].value);\r
-callback(properties);\r
-}\r
-InjectedScriptAccess.getForObjectId(this._objectId).getProperties(this._objectId, ignoreHasOwnProperty, abbreviate, remoteObjectBinder);\r
-},\r
-\r
-setPropertyValue: function(name, value, callback)\r
-{\r
-if (!this._objectId) {\r
-callback(false);\r
-return;\r
-}\r
-InjectedScriptAccess.getForObjectId(this._objectId).setPropertyValue(this._objectId, name, value, callback);\r
-},\r
-\r
-pushNodeToFrontend: function(callback)\r
-{\r
-InjectedScriptAccess.getForObjectId(this._objectId).pushNodeToFrontend(this._objectId, callback);\r
-}\r
-}\r
-\r
-WebInspector.RemoteObjectProperty = function(name, value)\r
-{\r
-this.name = name;\r
-this.value = value;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.LocalJSONObject = function(value)\r
-{\r
-this._value = value;\r
-}\r
-\r
-WebInspector.LocalJSONObject.prototype = {\r
-get description()\r
-{\r
-var type = this.type;\r
-switch (type) {\r
-case "array":\r
-return "[" + this._value.length + "]";\r
-case "object":\r
-return this.hasChildren ? "{...}" : "{ }";\r
-default:\r
-return JSON.stringify(this._value);\r
-}\r
-},\r
-\r
-get type()\r
-{\r
-if (this._value === null)\r
-return "null";\r
-if (this._value instanceof Array)\r
-return "array";\r
-return typeof this._value;\r
-},\r
-\r
-get hasChildren()\r
-{\r
-return typeof this._value === "object" && this._value !== null && Object.keys(this._value).length;\r
-},\r
-\r
-getOwnProperties: function(abbreviate, callback)\r
-{\r
-return this.getProperties(false, abbreviate, callback);\r
-},\r
-\r
-getProperties: function(ignoreHasOwnProperty, abbreviate, callback)\r
-{\r
-function buildProperty(propName)\r
-{\r
-return new WebInspector.RemoteObjectProperty(propName, new WebInspector.LocalJSONObject(this._value[propName]));\r
-}\r
-callback(Object.keys(this._value).map(buildProperty.bind(this)));\r
-},\r
-\r
-isError: function()\r
-{\r
-return false;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ObjectPropertiesSection = function(object, title, subtitle, emptyPlaceholder, ignoreHasOwnProperty, extraProperties, treeElementConstructor)\r
-{\r
-this.emptyPlaceholder = (emptyPlaceholder || WebInspector.UIString("No Properties"));\r
-this.object = object;\r
-this.ignoreHasOwnProperty = ignoreHasOwnProperty;\r
-this.extraProperties = extraProperties;\r
-this.treeElementConstructor = treeElementConstructor || WebInspector.ObjectPropertyTreeElement;\r
-this.editable = true;\r
-\r
-WebInspector.PropertiesSection.call(this, title, subtitle);\r
-}\r
-\r
-WebInspector.ObjectPropertiesSection.prototype = {\r
-onpopulate: function()\r
-{\r
-this.update();\r
-},\r
-\r
-update: function()\r
-{\r
-var self = this;\r
-var callback = function(properties) {\r
-if (!properties)\r
-return;\r
-self.updateProperties(properties);\r
-};\r
-this.object.getProperties(this.ignoreHasOwnProperty, true, callback);\r
-},\r
-\r
-updateProperties: function(properties, rootTreeElementConstructor, rootPropertyComparer)\r
-{\r
-if (!rootTreeElementConstructor)\r
-rootTreeElementConstructor = this.treeElementConstructor;\r
-\r
-if (!rootPropertyComparer)\r
-rootPropertyComparer = WebInspector.ObjectPropertiesSection.CompareProperties;\r
-\r
-if (this.extraProperties)\r
-for (var i = 0; i < this.extraProperties.length; ++i)\r
-properties.push(this.extraProperties[i]);\r
-\r
-properties.sort(rootPropertyComparer);\r
-\r
-this.propertiesTreeOutline.removeChildren();\r
-\r
-for (var i = 0; i < properties.length; ++i) {\r
-properties[i].parentObject = this.object;\r
-this.propertiesTreeOutline.appendChild(new rootTreeElementConstructor(properties[i]));\r
-}\r
-\r
-if (!this.propertiesTreeOutline.children.length) {\r
-var title = "<div class=\"info\">" + this.emptyPlaceholder + "</div>";\r
-var infoElement = new TreeElement(null, null, false);\r
-infoElement.titleHTML = title;\r
-this.propertiesTreeOutline.appendChild(infoElement);\r
-}\r
-this.propertiesForTest = properties;\r
-}\r
-}\r
-\r
-WebInspector.ObjectPropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;\r
-\r
-WebInspector.ObjectPropertiesSection.CompareProperties = function(propertyA, propertyB) \r
-{\r
-var a = propertyA.name;\r
-var b = propertyB.name;\r
-if (a === "__proto__")\r
-return 1;\r
-if (b === "__proto__")\r
-return -1;\r
-\r
-\r
-\r
-\r
-\r
-var diff = 0;\r
-var chunk = /^\d+|^\D+/;\r
-var chunka, chunkb, anum, bnum;\r
-while (diff === 0) {\r
-if (!a && b)\r
-return -1;\r
-if (!b && a)\r
-return 1;\r
-chunka = a.match(chunk)[0];\r
-chunkb = b.match(chunk)[0];\r
-anum = !isNaN(chunka);\r
-bnum = !isNaN(chunkb);\r
-if (anum && !bnum)\r
-return -1;\r
-if (bnum && !anum)\r
-return 1;\r
-if (anum && bnum) {\r
-diff = chunka - chunkb;\r
-if (diff === 0 && chunka.length !== chunkb.length) {\r
-if (!+chunka && !+chunkb) \r
-return chunka.length - chunkb.length;\r
-else\r
-return chunkb.length - chunka.length;\r
-}\r
-} else if (chunka !== chunkb)\r
-return (chunka < chunkb) ? -1 : 1;\r
-a = a.substring(chunka.length);\r
-b = b.substring(chunkb.length);\r
-}\r
-return diff;\r
-}\r
-\r
-WebInspector.ObjectPropertyTreeElement = function(property)\r
-{\r
-this.property = property;\r
-\r
-\r
-TreeElement.call(this, "", null, false);\r
-}\r
-\r
-WebInspector.ObjectPropertyTreeElement.prototype = {\r
-onpopulate: function()\r
-{\r
-if (this.children.length && !this.shouldRefreshChildren)\r
-return;\r
-\r
-var callback = function(properties) {\r
-this.removeChildren();\r
-if (!properties)\r
-return;\r
-\r
-properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);\r
-for (var i = 0; i < properties.length; ++i) {\r
-this.appendChild(new this.treeOutline.section.treeElementConstructor(properties[i]));\r
-}\r
-};\r
-this.property.value.getOwnProperties(true, callback.bind(this));\r
-},\r
-\r
-ondblclick: function(event)\r
-{\r
-this.startEditing();\r
-},\r
-\r
-onattach: function()\r
-{\r
-this.update();\r
-},\r
-\r
-update: function()\r
-{\r
-this.nameElement = document.createElement("span");\r
-this.nameElement.className = "name";\r
-this.nameElement.textContent = this.property.name;\r
-\r
-var separatorElement = document.createElement("span");\r
-separatorElement.className = "separator";\r
-separatorElement.textContent = ": ";\r
-\r
-this.valueElement = document.createElement("span");\r
-this.valueElement.className = "value";\r
-this.valueElement.textContent = this.property.value.description;\r
-if (this.property.isGetter)\r
-this.valueElement.addStyleClass("dimmed");\r
-if (this.property.value.isError())\r
-this.valueElement.addStyleClass("error");\r
-if (this.property.value.type)\r
-this.valueElement.addStyleClass("console-formatted-" + this.property.value.type);\r
-if (this.property.value.type === "node")\r
-this.valueElement.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);\r
-\r
-this.listItemElement.removeChildren();\r
-\r
-this.listItemElement.appendChild(this.nameElement);\r
-this.listItemElement.appendChild(separatorElement);\r
-this.listItemElement.appendChild(this.valueElement);\r
-this.hasChildren = this.property.value.hasChildren;\r
-},\r
-\r
-_contextMenuEventFired: function()\r
-{\r
-function selectNode(nodeId)\r
-{\r
-if (nodeId) {\r
-WebInspector.currentPanel = WebInspector.panels.elements;\r
-WebInspector.panels.elements.focusedDOMNode = WebInspector.domAgent.nodeForId(nodeId);\r
-}\r
-}\r
-\r
-function revealElement()\r
-{\r
-this.property.value.pushNodeToFrontend(selectNode);\r
-}\r
-\r
-var contextMenu = new WebInspector.ContextMenu();\r
-contextMenu.appendItem(WebInspector.UIString("Reveal in Elements Panel"), revealElement.bind(this));\r
-contextMenu.show(event);\r
-},\r
-\r
-updateSiblings: function()\r
-{\r
-if (this.parent.root)\r
-this.treeOutline.section.update();\r
-else\r
-this.parent.shouldRefreshChildren = true;\r
-},\r
-\r
-startEditing: function()\r
-{\r
-if (WebInspector.isBeingEdited(this.valueElement) || !this.treeOutline.section.editable)\r
-return;\r
-\r
-var context = { expanded: this.expanded };\r
-\r
-\r
-this.hasChildren = false;\r
-\r
-this.listItemElement.addStyleClass("editing-sub-part");\r
-\r
-WebInspector.startEditing(this.valueElement, {\r
-context: context,\r
-commitHandler: this.editingCommitted.bind(this),\r
-cancelHandler: this.editingCancelled.bind(this)\r
-});\r
-},\r
-\r
-editingEnded: function(context)\r
-{\r
-this.listItemElement.scrollLeft = 0;\r
-this.listItemElement.removeStyleClass("editing-sub-part");\r
-if (context.expanded)\r
-this.expand();\r
-},\r
-\r
-editingCancelled: function(element, context)\r
-{\r
-this.update();\r
-this.editingEnded(context);\r
-},\r
-\r
-editingCommitted: function(element, userInput, previousContent, context)\r
-{\r
-if (userInput === previousContent)\r
-return this.editingCancelled(element, context); \r
-\r
-this.applyExpression(userInput, true);\r
-\r
-this.editingEnded(context);\r
-},\r
-\r
-applyExpression: function(expression, updateInterface)\r
-{\r
-expression = expression.trim();\r
-var expressionLength = expression.length;\r
-var self = this;\r
-var callback = function(success) {\r
-if (!updateInterface)\r
-return;\r
-\r
-if (!success)\r
-self.update();\r
-\r
-if (!expressionLength) {\r
-\r
-self.parent.removeChild(this);\r
-} else {\r
-\r
-self.updateSiblings();\r
-}\r
-};\r
-this.property.parentObject.setPropertyValue(this.property.name, expression.trim(), callback);\r
-}\r
-}\r
-\r
-WebInspector.ObjectPropertyTreeElement.prototype.__proto__ = TreeElement.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.BreakpointsSidebarPane = function(title)\r
-{\r
-WebInspector.SidebarPane.call(this, title);\r
-\r
-this.listElement = document.createElement("ol");\r
-this.listElement.className = "breakpoint-list";\r
-\r
-this.emptyElement = document.createElement("div");\r
-this.emptyElement.className = "info";\r
-this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");\r
-\r
-this.bodyElement.appendChild(this.emptyElement);\r
-\r
-WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.ProjectChanged, this._projectChanged, this);\r
-}\r
-\r
-WebInspector.BreakpointsSidebarPane.prototype = {\r
-addBreakpointItem: function(breakpointItem)\r
-{\r
-var element = breakpointItem.element;\r
-element._breakpointItem = breakpointItem;\r
-\r
-breakpointItem.addEventListener("breakpoint-hit", this.expand, this);\r
-breakpointItem.addEventListener("removed", this._removeListElement.bind(this, element), this);\r
-\r
-var currentElement = this.listElement.firstChild;\r
-while (currentElement) {\r
-if (currentElement._breakpointItem && currentElement._breakpointItem.compareTo(element._breakpointItem) > 0)\r
-break;\r
-currentElement = currentElement.nextSibling;\r
-}\r
-this._addListElement(element, currentElement);\r
-\r
-if (breakpointItem.click) {\r
-element.addStyleClass("cursor-pointer");\r
-element.addEventListener("click", breakpointItem.click.bind(breakpointItem), false);\r
-}\r
-element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this, breakpointItem), true);\r
-},\r
-\r
-_contextMenuEventFired: function(breakpointItem, event)\r
-{\r
-var contextMenu = new WebInspector.ContextMenu();\r
-contextMenu.appendItem(WebInspector.UIString("Remove Breakpoint"), breakpointItem.remove.bind(breakpointItem));\r
-contextMenu.show(event);\r
-},\r
-\r
-_addListElement: function(element, beforeElement)\r
-{\r
-if (beforeElement)\r
-this.listElement.insertBefore(element, beforeElement);\r
-else {\r
-if (!this.listElement.firstChild) {\r
-this.bodyElement.removeChild(this.emptyElement);\r
-this.bodyElement.appendChild(this.listElement);\r
-}\r
-this.listElement.appendChild(element);\r
-}\r
-},\r
-\r
-_removeListElement: function(element)\r
-{\r
-this.listElement.removeChild(element);\r
-if (!this.listElement.firstChild) {\r
-this.bodyElement.removeChild(this.listElement);\r
-this.bodyElement.appendChild(this.emptyElement);\r
-}\r
-},\r
-\r
-_projectChanged: function()\r
-{\r
-this.listElement.removeChildren();\r
-if (this.listElement.parentElement) {\r
-this.bodyElement.removeChild(this.listElement);\r
-this.bodyElement.appendChild(this.emptyElement);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.BreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-WebInspector.XHRBreakpointsSidebarPane = function()\r
-{\r
-WebInspector.BreakpointsSidebarPane.call(this, WebInspector.UIString("XHR Breakpoints"));\r
-\r
-function addButtonClicked(event)\r
-{\r
-event.stopPropagation();\r
-this._startEditingBreakpoint(null);\r
-}\r
-\r
-var addButton = document.createElement("button");\r
-addButton.className = "add";\r
-addButton.addEventListener("click", addButtonClicked.bind(this), false);\r
-this.titleElement.appendChild(addButton);\r
-}\r
-\r
-WebInspector.XHRBreakpointsSidebarPane.prototype = {\r
-addBreakpointItem: function(breakpointItem)\r
-{\r
-WebInspector.BreakpointsSidebarPane.prototype.addBreakpointItem.call(this, breakpointItem);\r
-breakpointItem._labelElement.addEventListener("dblclick", this._startEditingBreakpoint.bind(this, breakpointItem), false);\r
-},\r
-\r
-_startEditingBreakpoint: function(breakpointItem)\r
-{\r
-if (this._editingBreakpoint)\r
-return;\r
-this._editingBreakpoint = true;\r
-\r
-if (!this.expanded)\r
-this.expanded = true;\r
-\r
-var inputElement = document.createElement("span");\r
-inputElement.className = "breakpoint-condition editing";\r
-if (breakpointItem) {\r
-breakpointItem.populateEditElement(inputElement);\r
-this.listElement.insertBefore(inputElement, breakpointItem.element);\r
-breakpointItem.element.addStyleClass("hidden");\r
-} else\r
-this._addListElement(inputElement, this.listElement.firstChild);\r
-\r
-var commitHandler = this._hideEditBreakpointDialog.bind(this, inputElement, true, breakpointItem);\r
-var cancelHandler = this._hideEditBreakpointDialog.bind(this, inputElement, false, breakpointItem);\r
-WebInspector.startEditing(inputElement, {\r
-commitHandler: commitHandler,\r
-cancelHandler: cancelHandler\r
-});\r
-},\r
-\r
-_hideEditBreakpointDialog: function(inputElement, accept, breakpointItem)\r
-{\r
-this._removeListElement(inputElement);\r
-this._editingBreakpoint = false;\r
-if (accept) {\r
-if (breakpointItem)\r
-breakpointItem.remove();\r
-WebInspector.breakpointManager.createXHRBreakpoint(inputElement.textContent.toLowerCase());\r
-} else if (breakpointItem)\r
-breakpointItem.element.removeStyleClass("hidden");\r
-}\r
-}\r
-\r
-WebInspector.XHRBreakpointsSidebarPane.prototype.__proto__ = WebInspector.BreakpointsSidebarPane.prototype;\r
-\r
-WebInspector.BreakpointItem = function(breakpoint)\r
-{\r
-this._breakpoint = breakpoint;\r
-\r
-this._element = document.createElement("li");\r
-\r
-var checkboxElement = document.createElement("input");\r
-checkboxElement.className = "checkbox-elem";\r
-checkboxElement.type = "checkbox";\r
-checkboxElement.checked = this._breakpoint.enabled;\r
-checkboxElement.addEventListener("click", this._checkboxClicked.bind(this), false);\r
-this._element.appendChild(checkboxElement);\r
-\r
-this._createLabelElement();\r
-\r
-this._breakpoint.addEventListener("enable-changed", this._enableChanged, this);\r
-this._breakpoint.addEventListener("hit-state-changed", this._hitStateChanged, this);\r
-this._breakpoint.addEventListener("label-changed", this._labelChanged, this);\r
-this._breakpoint.addEventListener("removed", this.dispatchEventToListeners.bind(this, "removed"));\r
-if (breakpoint.click)\r
-this.click = breakpoint.click.bind(breakpoint);\r
-}\r
-\r
-WebInspector.BreakpointItem.prototype = {\r
-get element()\r
-{\r
-return this._element;\r
-},\r
-\r
-compareTo: function(other)\r
-{\r
-return this._breakpoint.compareTo(other._breakpoint);\r
-},\r
-\r
-populateEditElement: function(element)\r
-{\r
-this._breakpoint.populateEditElement(element);\r
-},\r
-\r
-remove: function()\r
-{\r
-this._breakpoint.remove();\r
-},\r
-\r
-_checkboxClicked: function(event)\r
-{\r
-this._breakpoint.enabled = !this._breakpoint.enabled;\r
-\r
-\r
-event.stopPropagation();\r
-},\r
-\r
-_enableChanged: function(event)\r
-{\r
-var checkbox = this._element.firstChild;\r
-checkbox.checked = this._breakpoint.enabled;\r
-},\r
-\r
-_hitStateChanged: function(event)\r
-{\r
-if (event.target.hit) {\r
-this._element.addStyleClass("breakpoint-hit");\r
-this.dispatchEventToListeners("breakpoint-hit");\r
-} else\r
-this._element.removeStyleClass("breakpoint-hit");\r
-},\r
-\r
-_labelChanged: function(event)\r
-{\r
-this._element.removeChild(this._labelElement);\r
-this._createLabelElement();\r
-},\r
-\r
-_createLabelElement: function()\r
-{\r
-this._labelElement = document.createElement("span");\r
-this._breakpoint.populateLabelElement(this._labelElement);\r
-this._element.appendChild(this._labelElement);\r
-}\r
-}\r
-\r
-WebInspector.BreakpointItem.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-WebInspector.EventListenerBreakpointsSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listener Breakpoints"));\r
-\r
-this.categoriesElement = document.createElement("ol");\r
-this.categoriesElement.tabIndex = 0;\r
-this.categoriesElement.addStyleClass("properties-tree event-listener-breakpoints");\r
-this.categoriesTreeOutline = new TreeOutline(this.categoriesElement);\r
-this.bodyElement.appendChild(this.categoriesElement);\r
-\r
-WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.ProjectChanged, this._projectChanged, this);\r
-WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.EventListenerBreakpointAdded, this._breakpointAdded, this);\r
-\r
-this._breakpointItems = {};\r
-this._createCategory("Keyboard", "listener", ["keydown", "keyup", "keypress", "textInput"]);\r
-this._createCategory("Mouse", "listener", ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mousemove", "mouseout", "mousewheel"]);\r
-\r
-\r
-\r
-this._createCategory("Control", "listener", ["resize", "scroll", "zoom", "focus", "blur", "select", "change", "submit", "reset"]);\r
-this._createCategory("Clipboard", "listener", ["copy", "cut", "paste", "beforecopy", "beforecut", "beforepaste"]);\r
-this._createCategory("Load", "listener", ["load", "unload", "abort", "error"]);\r
-this._createCategory("DOM Mutation", "listener", ["DOMActivate", "DOMFocusIn", "DOMFocusOut", "DOMAttrModified", "DOMCharacterDataModified", "DOMNodeInserted", "DOMNodeInsertedIntoDocument", "DOMNodeRemoved", "DOMNodeRemovedFromDocument", "DOMSubtreeModified", "DOMContentLoaded"]);\r
-this._createCategory("Device", "listener", ["deviceorientation", "devicemotion"]);\r
-this._createCategory("Timer", "instrumentation", ["setTimer", "clearTimer", "timerFired"]);\r
-}\r
-\r
-WebInspector.EventListenerBreakpointsSidebarPane.prototype = {\r
-_createCategory: function(name, type, eventNames)\r
-{\r
-var categoryItem = {};\r
-categoryItem.element = new TreeElement(WebInspector.UIString(name));\r
-this.categoriesTreeOutline.appendChild(categoryItem.element);\r
-categoryItem.element.listItemElement.addStyleClass("event-category");\r
-categoryItem.element.selectable = true;\r
-\r
-categoryItem.checkbox = this._createCheckbox(categoryItem.element);\r
-categoryItem.checkbox.addEventListener("click", this._categoryCheckboxClicked.bind(this, categoryItem), true);\r
-\r
-categoryItem.children = {};\r
-for (var i = 0; i < eventNames.length; ++i) {\r
-var eventName = type + ":" + eventNames[i];\r
-\r
-var breakpointItem = {};\r
-var title = WebInspector.EventListenerBreakpointView.eventNameForUI(eventName);\r
-breakpointItem.element = new TreeElement(title);\r
-categoryItem.element.appendChild(breakpointItem.element);\r
-var hitMarker = document.createElement("div");\r
-hitMarker.className = "breakpoint-hit-marker";\r
-breakpointItem.element.listItemElement.appendChild(hitMarker);\r
-breakpointItem.element.listItemElement.addStyleClass("source-code");\r
-breakpointItem.element.selectable = true;\r
-\r
-breakpointItem.checkbox = this._createCheckbox(breakpointItem.element);\r
-breakpointItem.checkbox.addEventListener("click", this._breakpointCheckboxClicked.bind(this, breakpointItem), true);\r
-breakpointItem.parent = categoryItem;\r
-breakpointItem.eventName = eventName;\r
-\r
-this._breakpointItems[eventName] = breakpointItem;\r
-categoryItem.children[eventName] = breakpointItem;\r
-}\r
-},\r
-\r
-_createCheckbox: function(treeElement)\r
-{\r
-var checkbox = document.createElement("input");\r
-checkbox.className = "checkbox-elem";\r
-checkbox.type = "checkbox";\r
-treeElement.listItemElement.insertBefore(checkbox, treeElement.listItemElement.firstChild);\r
-return checkbox;\r
-},\r
-\r
-_categoryCheckboxClicked: function(categoryItem)\r
-{\r
-var checked = categoryItem.checkbox.checked;\r
-for (var eventName in categoryItem.children) {\r
-var breakpointItem = categoryItem.children[eventName];\r
-if (breakpointItem.checkbox.checked !== checked) {\r
-breakpointItem.checkbox.checked = checked;\r
-this._breakpointCheckboxClicked(breakpointItem);\r
-}\r
-}\r
-},\r
-\r
-_breakpointCheckboxClicked: function(breakpointItem)\r
-{\r
-if (breakpointItem.checkbox.checked)\r
-WebInspector.breakpointManager.createEventListenerBreakpoint(breakpointItem.eventName);\r
-else\r
-breakpointItem.breakpoint.remove();\r
-},\r
-\r
-_breakpointAdded: function(event)\r
-{\r
-var breakpoint = event.data;\r
-\r
-var breakpointItem = this._breakpointItems[breakpoint.eventName];\r
-breakpointItem.breakpoint = breakpoint;\r
-breakpoint.addEventListener("hit-state-changed", this._breakpointHitStateChanged.bind(this, breakpointItem));\r
-breakpoint.addEventListener("removed", this._breakpointRemoved.bind(this, breakpointItem));\r
-breakpointItem.checkbox.checked = true;\r
-this._updateCategoryCheckbox(breakpointItem);\r
-},\r
-\r
-_breakpointHitStateChanged: function(breakpointItem, event)\r
-{\r
-if (event.target.hit) {\r
-this.expanded = true;\r
-var categoryItem = breakpointItem.parent;\r
-categoryItem.element.expand();\r
-breakpointItem.element.listItemElement.addStyleClass("breakpoint-hit");\r
-} else\r
-breakpointItem.element.listItemElement.removeStyleClass("breakpoint-hit");\r
-},\r
-\r
-_breakpointRemoved: function(breakpointItem)\r
-{\r
-breakpointItem.breakpoint = null;\r
-breakpointItem.checkbox.checked = false;\r
-this._updateCategoryCheckbox(breakpointItem);\r
-},\r
-\r
-_updateCategoryCheckbox: function(breakpointItem)\r
-{\r
-var categoryItem = breakpointItem.parent;\r
-var hasEnabled = false, hasDisabled = false;\r
-for (var eventName in categoryItem.children) {\r
-var breakpointItem = categoryItem.children[eventName];\r
-if (breakpointItem.checkbox.checked)\r
-hasEnabled = true;\r
-else\r
-hasDisabled = true;\r
-}\r
-categoryItem.checkbox.checked = hasEnabled;\r
-categoryItem.checkbox.indeterminate = hasEnabled && hasDisabled;\r
-},\r
-\r
-_projectChanged: function()\r
-{\r
-for (var eventName in this._breakpointItems) {\r
-var breakpointItem = this._breakpointItems[eventName];\r
-breakpointItem.breakpoint = null;\r
-breakpointItem.checkbox.checked = false;\r
-this._updateCategoryCheckbox(breakpointItem);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.EventListenerBreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.CallStackSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack"));\r
-}\r
-\r
-WebInspector.CallStackSidebarPane.prototype = {\r
-update: function(callFrames, eventType, eventData)\r
-{\r
-this.bodyElement.removeChildren();\r
-\r
-this.placards = [];\r
-delete this._selectedCallFrame;\r
-\r
-if (!callFrames) {\r
-var infoElement = document.createElement("div");\r
-infoElement.className = "info";\r
-infoElement.textContent = WebInspector.UIString("Not Paused");\r
-this.bodyElement.appendChild(infoElement);\r
-return;\r
-}\r
-\r
-var title;\r
-var subtitle;\r
-var script;\r
-\r
-for (var i = 0; i < callFrames.length; ++i) {\r
-var callFrame = callFrames[i];\r
-switch (callFrame.type) {\r
-case "function":\r
-title = callFrame.functionName || WebInspector.UIString("(anonymous function)");\r
-break;\r
-case "program":\r
-title = WebInspector.UIString("(program)");\r
-break;\r
-}\r
-\r
-script = WebInspector.debuggerModel.scriptForSourceID(callFrame.sourceID);\r
-if (script)\r
-subtitle = WebInspector.displayNameForURL(script.sourceURL);\r
-else\r
-subtitle = WebInspector.UIString("(internal script)");\r
-\r
-if (callFrame.line > 0) {\r
-if (subtitle)\r
-subtitle += ":" + callFrame.line;\r
-else\r
-subtitle = WebInspector.UIString("line %d", callFrame.line);\r
-}\r
-\r
-var placard = new WebInspector.Placard(title, subtitle);\r
-placard.callFrame = callFrame;\r
-\r
-placard.element.addEventListener("click", this._placardSelected.bind(this), false);\r
-\r
-this.placards.push(placard);\r
-this.bodyElement.appendChild(placard.element);\r
-}\r
-\r
-if (eventType === WebInspector.DebuggerEventTypes.JavaScriptPause)\r
-return;\r
-\r
-var statusMessageElement = document.createElement("div");\r
-statusMessageElement.className = "info";\r
-if (eventType === WebInspector.DebuggerEventTypes.NativeBreakpoint) {\r
-var breakpoint = WebInspector.breakpointManager.breakpointViewForEventData(eventData);\r
-if (breakpoint)\r
-breakpoint.populateStatusMessageElement(statusMessageElement, eventData);\r
-} else\r
-statusMessageElement.appendChild(document.createTextNode(WebInspector.UIString("Paused on a JavaScript breakpoint.")));\r
-this.bodyElement.appendChild(statusMessageElement);\r
-},\r
-\r
-get selectedCallFrame()\r
-{\r
-return this._selectedCallFrame;\r
-},\r
-\r
-set selectedCallFrame(x)\r
-{\r
-if (this._selectedCallFrame === x)\r
-return;\r
-\r
-this._selectedCallFrame = x;\r
-\r
-for (var i = 0; i < this.placards.length; ++i) {\r
-var placard = this.placards[i];\r
-placard.selected = (placard.callFrame === this._selectedCallFrame);\r
-}\r
-\r
-this.dispatchEventToListeners("call frame selected");\r
-},\r
-\r
-handleShortcut: function(event)\r
-{\r
-var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);\r
-var handler = this._shortcuts[shortcut];\r
-if (handler) {\r
-handler(event);\r
-event.handled = true;\r
-}\r
-},\r
-\r
-_selectNextCallFrameOnStack: function()\r
-{\r
-var index = this._selectedCallFrameIndex();\r
-if (index == -1)\r
-return;\r
-this._selectedPlacardByIndex(index + 1);\r
-},\r
-\r
-_selectPreviousCallFrameOnStack: function()\r
-{\r
-var index = this._selectedCallFrameIndex();\r
-if (index == -1)\r
-return;\r
-this._selectedPlacardByIndex(index - 1);\r
-},\r
-\r
-_selectedPlacardByIndex: function(index)\r
-{\r
-if (index < 0 || index >= this.placards.length)\r
-return;\r
-var placard = this.placards[index];\r
-this.selectedCallFrame = placard.callFrame\r
-},\r
-\r
-_selectedCallFrameIndex: function()\r
-{\r
-if (!this._selectedCallFrame)\r
-return -1;\r
-for (var i = 0; i < this.placards.length; ++i) {\r
-var placard = this.placards[i];\r
-if (placard.callFrame === this._selectedCallFrame)\r
-return i;\r
-}\r
-return -1;\r
-},\r
-\r
-_placardSelected: function(event)\r
-{\r
-var placardElement = event.target.enclosingNodeOrSelfWithClass("placard");\r
-this.selectedCallFrame = placardElement.placard.callFrame;\r
-},\r
-\r
-registerShortcuts: function(section)\r
-{\r
-this._shortcuts = {};\r
-\r
-var nextCallFrame = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Period,\r
-WebInspector.KeyboardShortcut.Modifiers.Ctrl);\r
-this._shortcuts[nextCallFrame.key] = this._selectNextCallFrameOnStack.bind(this);\r
-\r
-var prevCallFrame = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Comma,\r
-WebInspector.KeyboardShortcut.Modifiers.Ctrl);\r
-this._shortcuts[prevCallFrame.key] = this._selectPreviousCallFrameOnStack.bind(this);\r
-\r
-section.addRelatedKeys([ nextCallFrame.name, prevCallFrame.name ], WebInspector.UIString("Next/previous call frame"));\r
-}\r
-}\r
-\r
-WebInspector.CallStackSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ScopeChainSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Scope Variables"));\r
-this._expandedProperties = [];\r
-}\r
-\r
-WebInspector.ScopeChainSidebarPane.prototype = {\r
-update: function(callFrame)\r
-{\r
-this.bodyElement.removeChildren();\r
-\r
-this.sections = [];\r
-this.callFrame = callFrame;\r
-\r
-if (!callFrame) {\r
-var infoElement = document.createElement("div");\r
-infoElement.className = "info";\r
-infoElement.textContent = WebInspector.UIString("Not Paused");\r
-this.bodyElement.appendChild(infoElement);\r
-return;\r
-}\r
-\r
-var foundLocalScope = false;\r
-var scopeChain = callFrame.scopeChain;\r
-for (var i = 0; i < scopeChain.length; ++i) {\r
-var scopeObjectProxy = scopeChain[i];\r
-var title = null;\r
-var subtitle = scopeObjectProxy.description;\r
-var emptyPlaceholder = null;\r
-var extraProperties = null;\r
-\r
-if (scopeObjectProxy.isLocal) {\r
-foundLocalScope = true;\r
-title = WebInspector.UIString("Local");\r
-emptyPlaceholder = WebInspector.UIString("No Variables");\r
-subtitle = null;\r
-if (scopeObjectProxy.thisObject)\r
-extraProperties = [ new WebInspector.RemoteObjectProperty("this", WebInspector.RemoteObject.fromPayload(scopeObjectProxy.thisObject)) ];\r
-} else if (scopeObjectProxy.isClosure) {\r
-title = WebInspector.UIString("Closure");\r
-emptyPlaceholder = WebInspector.UIString("No Variables");\r
-subtitle = null;\r
-} else if (i === (scopeChain.length - 1))\r
-title = WebInspector.UIString("Global");\r
-else if (scopeObjectProxy.isElement)\r
-title = WebInspector.UIString("Event Target");\r
-else if (scopeObjectProxy.isDocument)\r
-title = WebInspector.UIString("Event Document");\r
-else if (scopeObjectProxy.isWithBlock)\r
-title = WebInspector.UIString("With Block");\r
-\r
-if (!title || title === subtitle)\r
-subtitle = null;\r
-\r
-var section = new WebInspector.ObjectPropertiesSection(WebInspector.RemoteObject.fromPayload(scopeObjectProxy), title, subtitle, emptyPlaceholder, true, extraProperties, WebInspector.ScopeVariableTreeElement);\r
-section.editInSelectedCallFrameWhenPaused = true;\r
-section.pane = this;\r
-\r
-if (!foundLocalScope || scopeObjectProxy.isLocal)\r
-section.expanded = true;\r
-\r
-this.sections.push(section);\r
-this.bodyElement.appendChild(section.element);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.ScopeChainSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-WebInspector.ScopeVariableTreeElement = function(property)\r
-{\r
-WebInspector.ObjectPropertyTreeElement.call(this, property);\r
-}\r
-\r
-WebInspector.ScopeVariableTreeElement.prototype = {\r
-onattach: function()\r
-{\r
-WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);\r
-if (this.hasChildren && this.propertyIdentifier in this.treeOutline.section.pane._expandedProperties)\r
-this.expand();\r
-},\r
-\r
-onexpand: function()\r
-{\r
-this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier] = true;\r
-},\r
-\r
-oncollapse: function()\r
-{\r
-delete this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier];\r
-},\r
-\r
-get propertyIdentifier()\r
-{\r
-if ("_propertyIdentifier" in this)\r
-return this._propertyIdentifier;\r
-var section = this.treeOutline.section;\r
-this._propertyIdentifier = section.title + ":" + (section.subtitle ? section.subtitle + ":" : "") + this.propertyPath;\r
-return this._propertyIdentifier;\r
-},\r
-\r
-get propertyPath()\r
-{\r
-if ("_propertyPath" in this)\r
-return this._propertyPath;\r
-\r
-var current = this;\r
-var result;\r
-\r
-do {\r
-if (result)\r
-result = current.property.name + "." + result;\r
-else\r
-result = current.property.name;\r
-current = current.parent;\r
-} while (current && !current.root);\r
-\r
-this._propertyPath = result;\r
-return result;\r
-}\r
-}\r
-\r
-WebInspector.ScopeVariableTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.WatchExpressionsSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Watch Expressions"));\r
-this.reset();\r
-}\r
-\r
-WebInspector.WatchExpressionsSidebarPane.prototype = {\r
-reset: function()\r
-{\r
-this.bodyElement.removeChildren();\r
-\r
-this.expanded = WebInspector.settings.watchExpressions.length > 0;\r
-this.section = new WebInspector.WatchExpressionsSection();\r
-this.bodyElement.appendChild(this.section.element);\r
-\r
-var addElement = document.createElement("button");\r
-addElement.setAttribute("type", "button");\r
-addElement.textContent = WebInspector.UIString("Add");\r
-addElement.addEventListener("click", this.section.addExpression.bind(this.section), false);\r
-\r
-var refreshElement = document.createElement("button");\r
-refreshElement.setAttribute("type", "button");\r
-refreshElement.textContent = WebInspector.UIString("Refresh");\r
-refreshElement.addEventListener("click", this.section.update.bind(this.section), false);\r
-\r
-var centerElement = document.createElement("div");\r
-centerElement.addStyleClass("watch-expressions-buttons-container");\r
-centerElement.appendChild(addElement);\r
-centerElement.appendChild(refreshElement);\r
-this.bodyElement.appendChild(centerElement);\r
-\r
-this.onexpand = this.refreshExpressions.bind(this);\r
-},\r
-\r
-refreshExpressions: function()\r
-{\r
-if (this.section)\r
-this.section.update();\r
-}\r
-}\r
-\r
-WebInspector.WatchExpressionsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-WebInspector.WatchExpressionsSection = function()\r
-{\r
-this._watchObjectGroupId = "watch-group";\r
-\r
-WebInspector.ObjectPropertiesSection.call(this);\r
-\r
-this.watchExpressions = WebInspector.settings.watchExpressions;\r
-\r
-this.headerElement.className = "hidden";\r
-this.editable = true;\r
-this.expanded = true;\r
-this.propertiesElement.addStyleClass("watch-expressions");\r
-}\r
-\r
-WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";\r
-\r
-WebInspector.WatchExpressionsSection.prototype = {\r
-update: function()\r
-{\r
-function appendResult(expression, watchIndex, result)\r
-{\r
-var property = new WebInspector.RemoteObjectProperty(expression, result);\r
-property.watchIndex = watchIndex;\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-properties.push(property);\r
-\r
-if (properties.length == propertyCount) {\r
-this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties);\r
-\r
-\r
-\r
-if (this._newExpressionAdded) {\r
-delete this._newExpressionAdded;\r
-\r
-treeElement = this.findAddedTreeElement();\r
-if (treeElement)\r
-treeElement.startEditing();\r
-}\r
-}\r
-}\r
-\r
-\r
-InspectorBackend.releaseWrapperObjectGroup(0, this._watchObjectGroupId)\r
-var properties = [];\r
-\r
-\r
-\r
-var propertyCount = 0;\r
-for (var i = 0; i < this.watchExpressions.length; ++i) {\r
-if (!this.watchExpressions[i]) \r
-continue;\r
-++propertyCount;\r
-}\r
-\r
-\r
-\r
-for (var i = 0; i < this.watchExpressions.length; ++i) {\r
-var expression = this.watchExpressions[i];\r
-if (!expression)\r
-continue;\r
-\r
-WebInspector.console.evalInInspectedWindow("(" + expression + ")", this._watchObjectGroupId, appendResult.bind(this, expression, i));\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-this.expanded = (propertyCount != 0);\r
-},\r
-\r
-addExpression: function()\r
-{\r
-this._newExpressionAdded = true;\r
-this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression);\r
-this.update();\r
-},\r
-\r
-updateExpression: function(element, value)\r
-{\r
-this.watchExpressions[element.property.watchIndex] = value;\r
-this.saveExpressions();\r
-this.update();\r
-},\r
-\r
-findAddedTreeElement: function()\r
-{\r
-var children = this.propertiesTreeOutline.children;\r
-for (var i = 0; i < children.length; ++i)\r
-if (children[i].property.name === WebInspector.WatchExpressionsSection.NewWatchExpression)\r
-return children[i];\r
-},\r
-\r
-saveExpressions: function()\r
-{\r
-var toSave = [];\r
-for (var i = 0; i < this.watchExpressions.length; i++)\r
-if (this.watchExpressions[i])\r
-toSave.push(this.watchExpressions[i]);\r
-\r
-WebInspector.settings.watchExpressions = toSave;\r
-return toSave.length;\r
-}\r
-}\r
-\r
-WebInspector.WatchExpressionsSection.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;\r
-\r
-WebInspector.WatchExpressionsSection.CompareProperties = function(propertyA, propertyB) \r
-{\r
-if (propertyA.watchIndex == propertyB.watchIndex)\r
-return 0;\r
-else if (propertyA.watchIndex < propertyB.watchIndex)\r
-return -1;\r
-else\r
-return 1;\r
-}\r
-\r
-WebInspector.WatchExpressionTreeElement = function(property)\r
-{\r
-WebInspector.ObjectPropertyTreeElement.call(this, property);\r
-}\r
-\r
-WebInspector.WatchExpressionTreeElement.prototype = {\r
-update: function()\r
-{\r
-WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);\r
-\r
-if (this.property.value.isError())\r
-this.valueElement.addStyleClass("watch-expressions-error-level");\r
-\r
-var deleteButton = document.createElement("input");\r
-deleteButton.type = "button";\r
-deleteButton.title = WebInspector.UIString("Delete watch expression.");\r
-deleteButton.addStyleClass("enabled-button");\r
-deleteButton.addStyleClass("delete-button");\r
-deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);\r
-\r
-this.listItemElement.insertBefore(deleteButton, this.listItemElement.firstChild);\r
-},\r
-\r
-_deleteButtonClicked: function()\r
-{\r
-this.treeOutline.section.updateExpression(this, null);\r
-},\r
-\r
-startEditing: function()\r
-{\r
-if (WebInspector.isBeingEdited(this.nameElement) || !this.treeOutline.section.editable)\r
-return;\r
-\r
-this.nameElement.textContent = this.property.name.trim();\r
-\r
-var context = { expanded: this.expanded };\r
-\r
-\r
-this.hasChildren = false;\r
-\r
-this.listItemElement.addStyleClass("editing-sub-part");\r
-\r
-WebInspector.startEditing(this.nameElement, {\r
-context: context,\r
-commitHandler: this.editingCommitted.bind(this),\r
-cancelHandler: this.editingCancelled.bind(this)\r
-});\r
-},\r
-\r
-editingCancelled: function(element, context)\r
-{\r
-if (!this.nameElement.textContent)\r
-this.treeOutline.section.updateExpression(this, null);\r
-\r
-this.update();\r
-this.editingEnded(context);\r
-},\r
-\r
-applyExpression: function(expression, updateInterface)\r
-{\r
-expression = expression.trim();\r
-\r
-if (!expression)\r
-expression = null;\r
-\r
-this.property.name = expression;\r
-this.treeOutline.section.updateExpression(this, expression);\r
-}\r
-}\r
-\r
-WebInspector.WatchExpressionTreeElement.prototype.__proto__ = WebInspector.ObjectPropertyTreeElement.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.WorkersSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Workers"));\r
-\r
-this._workers = {};\r
-\r
-this._enableWorkersCheckbox = new WebInspector.Checkbox(\r
-WebInspector.UIString("Debug"),\r
-"sidebar-pane-subtitle",\r
-WebInspector.UIString("Allow debugging workers. Enabling this option will replace native workers with the iframe-based JavaScript implementation"));\r
-this.titleElement.insertBefore(this._enableWorkersCheckbox.element, this.titleElement.firstChild);\r
-\r
-this._enableWorkersCheckbox.addEventListener(this._onTriggerInstrument.bind(this));\r
-this._enableWorkersCheckbox.checked = false;\r
-\r
-this._listElement = document.createElement("ol");\r
-this._listElement.className = "workers-list";\r
-\r
-this.bodyElement.appendChild(this._listElement);\r
-this._treeOutline = new TreeOutline(this._listElement);\r
-}\r
-\r
-WebInspector.WorkersSidebarPane.prototype = {\r
-addWorker: function(id, url, isShared)\r
-{\r
-if (id in this._workers) \r
-return;\r
-var worker = new WebInspector.Worker(id, url, isShared);\r
-this._workers[id] = worker;\r
-\r
-var title = WebInspector.linkifyURL(url, WebInspector.displayNameForURL(url), "worker-item", true, url);\r
-var treeElement = new TreeElement(null, worker, false);\r
-treeElement.titleHTML = title;\r
-this._treeOutline.appendChild(treeElement);\r
-},\r
-\r
-removeWorker: function(id)\r
-{\r
-if (id in this._workers) {\r
-this._treeOutline.removeChild(this._treeOutline.findTreeElement(this._workers[id]));\r
-delete this._workers[id];\r
-}\r
-},\r
-\r
-setInstrumentation: function(enabled)\r
-{\r
-InspectorBackend.removeAllScriptsToEvaluateOnLoad();\r
-if (enabled)\r
-InspectorBackend.addScriptToEvaluateOnLoad("(" + InjectedFakeWorker + ")");\r
-},\r
-\r
-reset: function()\r
-{\r
-this.setInstrumentation(this._enableWorkersCheckbox.checked);\r
-this._treeOutline.removeChildren();\r
-this._workers = {};\r
-},\r
-\r
-_onTriggerInstrument: function(event)\r
-{\r
-this.setInstrumentation(this._enableWorkersCheckbox.checked);\r
-}\r
-};\r
-\r
-WebInspector.WorkersSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-WebInspector.Worker = function(id, url, shared)\r
-{\r
-this.id = id;\r
-this.url = url;\r
-this.shared = shared;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.MetricsSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Metrics"));\r
-this._inlineStyleId = null;\r
-}\r
-\r
-WebInspector.MetricsSidebarPane.prototype = {\r
-update: function(node)\r
-{\r
-if (node)\r
-this.node = node;\r
-else\r
-node = this.node;\r
-\r
-if (!node || !node.ownerDocument.defaultView || node.nodeType !== Node.ELEMENT_NODE) {\r
-this.bodyElement.removeChildren();\r
-return;\r
-}\r
-\r
-var self = this;\r
-var callback = function(style) {\r
-if (!style)\r
-return;\r
-self._update(style);\r
-};\r
-WebInspector.cssModel.getComputedStyleAsync(node.id, callback);\r
-\r
-var inlineStyleCallback = function(style) {\r
-if (!style)\r
-return;\r
-self.inlineStyle = style;\r
-};\r
-WebInspector.cssModel.getInlineStyleAsync(node.id, inlineStyleCallback);\r
-},\r
-\r
-_update: function(style)\r
-{\r
-\r
-var metricsElement = document.createElement("div");\r
-metricsElement.className = "metrics";\r
-\r
-function createBoxPartElement(style, name, side, suffix)\r
-{\r
-var propertyName = (name !== "position" ? name + "-" : "") + side + suffix;\r
-var value = style.getPropertyValue(propertyName);\r
-if (value === "" || (name !== "position" && value === "0px"))\r
-value = "\u2012";\r
-else if (name === "position" && value === "auto")\r
-value = "\u2012";\r
-value = value.replace(/px$/, "");\r
-\r
-var element = document.createElement("div");\r
-element.className = side;\r
-element.textContent = value;\r
-element.addEventListener("dblclick", this.startEditing.bind(this, element, name, propertyName), false);\r
-return element;\r
-}\r
-\r
-\r
-var noMarginDisplayType = {\r
-"table-cell": true,\r
-"table-column": true,\r
-"table-column-group": true,\r
-"table-footer-group": true,\r
-"table-header-group": true,\r
-"table-row": true,\r
-"table-row-group": true\r
-};\r
-\r
-\r
-var noPaddingDisplayType = {\r
-"table-column": true,\r
-"table-column-group": true,\r
-"table-footer-group": true,\r
-"table-header-group": true,\r
-"table-row": true,\r
-"table-row-group": true\r
-};\r
-\r
-\r
-var noPositionType = {\r
-"static": true\r
-};\r
-\r
-var boxes = ["content", "padding", "border", "margin", "position"];\r
-var boxLabels = [WebInspector.UIString("content"), WebInspector.UIString("padding"), WebInspector.UIString("border"), WebInspector.UIString("margin"), WebInspector.UIString("position")];\r
-var previousBox;\r
-for (var i = 0; i < boxes.length; ++i) {\r
-var name = boxes[i];\r
-\r
-if (name === "margin" && noMarginDisplayType[style.getPropertyValue("display")])\r
-continue;\r
-if (name === "padding" && noPaddingDisplayType[style.getPropertyValue("display")])\r
-continue;\r
-if (name === "position" && noPositionType[style.getPropertyValue("position")])\r
-continue;\r
-\r
-var boxElement = document.createElement("div");\r
-boxElement.className = name;\r
-\r
-if (name === "content") {\r
-var width = style.getPropertyValue("width").replace(/px$/, "");\r
-var widthElement = document.createElement("span");\r
-widthElement.textContent = width;\r
-widthElement.addEventListener("dblclick", this.startEditing.bind(this, widthElement, "width", "width"), false);\r
-\r
-var height = style.getPropertyValue("height").replace(/px$/, "");\r
-var heightElement = document.createElement("span");\r
-heightElement.textContent = height;\r
-heightElement.addEventListener("dblclick", this.startEditing.bind(this, heightElement, "height", "height"), false);\r
-\r
-boxElement.appendChild(widthElement);\r
-boxElement.appendChild(document.createTextNode(" \u00D7 "));\r
-boxElement.appendChild(heightElement);\r
-} else {\r
-var suffix = (name === "border" ? "-width" : "");\r
-\r
-var labelElement = document.createElement("div");\r
-labelElement.className = "label";\r
-labelElement.textContent = boxLabels[i];\r
-boxElement.appendChild(labelElement);\r
-\r
-boxElement.appendChild(createBoxPartElement.call(this, style, name, "top", suffix));\r
-boxElement.appendChild(document.createElement("br"));\r
-boxElement.appendChild(createBoxPartElement.call(this, style, name, "left", suffix));\r
-\r
-if (previousBox)\r
-boxElement.appendChild(previousBox);\r
-\r
-boxElement.appendChild(createBoxPartElement.call(this, style, name, "right", suffix));\r
-boxElement.appendChild(document.createElement("br"));\r
-boxElement.appendChild(createBoxPartElement.call(this, style, name, "bottom", suffix));\r
-}\r
-\r
-previousBox = boxElement;\r
-}\r
-\r
-metricsElement.appendChild(previousBox);\r
-this.bodyElement.removeChildren();\r
-this.bodyElement.appendChild(metricsElement);\r
-},\r
-\r
-startEditing: function(targetElement, box, styleProperty)\r
-{\r
-if (WebInspector.isBeingEdited(targetElement))\r
-return;\r
-\r
-var context = { box: box, styleProperty: styleProperty };\r
-\r
-WebInspector.startEditing(targetElement, {\r
-context: context,\r
-commitHandler: this.editingCommitted.bind(this),\r
-cancelHandler: this.editingCancelled.bind(this)\r
-});\r
-},\r
-\r
-editingCancelled: function(element, context)\r
-{\r
-this.update();\r
-},\r
-\r
-editingCommitted: function(element, userInput, previousContent, context)\r
-{\r
-if (!this.inlineStyle) {\r
-\r
-return this.editingCancelled(element, context); \r
-}\r
-\r
-if (userInput === previousContent)\r
-return this.editingCancelled(element, context); \r
-\r
-if (context.box !== "position" && (!userInput || userInput === "\u2012"))\r
-userInput = "0px";\r
-else if (context.box === "position" && (!userInput || userInput === "\u2012"))\r
-userInput = "auto";\r
-\r
-\r
-if (/^\d+$/.test(userInput))\r
-userInput += "px";\r
-\r
-var self = this;\r
-var callback = function(style) {\r
-if (!style)\r
-return;\r
-self.inlineStyle = style;\r
-self.dispatchEventToListeners("metrics edited");\r
-self.update();\r
-};\r
-\r
-function setEnabledValueCallback(context, style)\r
-{\r
-var property = style.getLiveProperty(context.styleProperty);\r
-if (!property)\r
-style.appendProperty(context.styleProperty, userInput, callback);\r
-else\r
-property.setValue(userInput, callback);\r
-}\r
-\r
-var allProperties = this.inlineStyle.allProperties;\r
-for (var i = 0; i < allProperties.length; ++i) {\r
-var property = allProperties[i];\r
-if (property.name !== context.styleProperty || property.inactive)\r
-continue;\r
-if (property.disabled)\r
-property.setDisabled(false, setEnabledValueCallback.bind(null, context));\r
-else\r
-property.setValue(userInput, callback);\r
-return;\r
-}\r
-\r
-this.inlineStyle.appendProperty(context.styleProperty, userInput, callback);\r
-}\r
-}\r
-\r
-WebInspector.MetricsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.PropertiesSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Properties"));\r
-}\r
-\r
-WebInspector.PropertiesSidebarPane.prototype = {\r
-update: function(node)\r
-{\r
-var body = this.bodyElement;\r
-\r
-if (!node) {\r
-body.removeChildren();\r
-this.sections = [];\r
-return;\r
-}\r
-\r
-var self = this;\r
-var callback = function(prototypes) {\r
-var body = self.bodyElement;\r
-body.removeChildren();\r
-self.sections = [];\r
-\r
-\r
-for (var i = 0; i < prototypes.length; ++i) {\r
-var prototype = WebInspector.RemoteObject.fromPayload(prototypes[i]);\r
-var title = prototype.description;\r
-if (title.match(/Prototype$/))\r
-title = title.replace(/Prototype$/, "");\r
-var section = new WebInspector.ObjectPropertiesSection(prototype, title);\r
-self.sections.push(section);\r
-body.appendChild(section.element);\r
-}\r
-};\r
-InjectedScriptAccess.getForNode(node).getPrototypes(node.id, callback);\r
-}\r
-}\r
-\r
-WebInspector.PropertiesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.EventListenersSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listeners"));\r
-this.bodyElement.addStyleClass("events-pane");\r
-\r
-this.sections = [];\r
-\r
-this.settingsSelectElement = document.createElement("select");\r
-\r
-var option = document.createElement("option");\r
-option.value = "all";\r
-option.label = WebInspector.UIString("All Nodes");\r
-this.settingsSelectElement.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "selected";\r
-option.label = WebInspector.UIString("Selected Node Only");\r
-this.settingsSelectElement.appendChild(option);\r
-\r
-var filter = WebInspector.settings.eventListenersFilter;\r
-if (filter === "all")\r
-this.settingsSelectElement[0].selected = true;\r
-else if (filter === "selected")\r
-this.settingsSelectElement[1].selected = true;\r
-this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);\r
-this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);\r
-\r
-this.titleElement.appendChild(this.settingsSelectElement);\r
-}\r
-\r
-WebInspector.EventListenersSidebarPane.prototype = {\r
-update: function(node)\r
-{\r
-var body = this.bodyElement;\r
-body.removeChildren();\r
-this.sections = [];\r
-\r
-var self = this;\r
-function callback(nodeId, eventListeners) {\r
-var sectionNames = [];\r
-var sectionMap = {};\r
-for (var i = 0; i < eventListeners.length; ++i) {\r
-var eventListener = eventListeners[i];\r
-eventListener.node = WebInspector.domAgent.nodeForId(eventListener.nodeId);\r
-delete eventListener.nodeId; \r
-if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listenerBody.toString()))\r
-continue; \r
-var type = eventListener.type;\r
-var section = sectionMap[type];\r
-if (!section) {\r
-section = new WebInspector.EventListenersSection(type, nodeId);\r
-sectionMap[type] = section;\r
-sectionNames.push(type);\r
-self.sections.push(section);\r
-}\r
-section.addListener(eventListener);\r
-}\r
-\r
-if (sectionNames.length === 0) {\r
-var div = document.createElement("div");\r
-div.className = "info";\r
-div.textContent = WebInspector.UIString("No Event Listeners");\r
-body.appendChild(div);\r
-return;\r
-}\r
-\r
-sectionNames.sort();\r
-for (var i = 0; i < sectionNames.length; ++i) {\r
-var section = sectionMap[sectionNames[i]];\r
-section.update();\r
-body.appendChild(section.element);\r
-}\r
-}\r
-\r
-WebInspector.EventListeners.getEventListenersForNodeAsync(node, callback);\r
-},\r
-\r
-_changeSetting: function(event)\r
-{\r
-var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];\r
-WebInspector.settings.eventListenersFilter = selectedOption.value;\r
-\r
-for (var i = 0; i < this.sections.length; ++i)\r
-this.sections[i].update();\r
-}\r
-}\r
-\r
-WebInspector.EventListenersSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-WebInspector.EventListenersSection = function(title, nodeId)\r
-{\r
-this.eventListeners = [];\r
-this._nodeId = nodeId;\r
-WebInspector.PropertiesSection.call(this, title);\r
-\r
-\r
-this.propertiesElement.parentNode.removeChild(this.propertiesElement);\r
-delete this.propertiesElement;\r
-delete this.propertiesTreeOutline;\r
-\r
-this.eventBars = document.createElement("div");\r
-this.eventBars.className = "event-bars";\r
-this.element.appendChild(this.eventBars);\r
-}\r
-\r
-WebInspector.EventListenersSection.prototype = {\r
-update: function()\r
-{\r
-\r
-var filteredEventListeners = this.eventListeners;\r
-if (WebInspector.settings.eventListenersFilter === "selected") {\r
-filteredEventListeners = [];\r
-for (var i = 0; i < this.eventListeners.length; ++i) {\r
-var eventListener = this.eventListeners[i];\r
-if (eventListener.node.id === this._nodeId)\r
-filteredEventListeners.push(eventListener);\r
-}\r
-}\r
-\r
-this.eventBars.removeChildren();\r
-var length = filteredEventListeners.length;\r
-for (var i = 0; i < length; ++i) {\r
-var eventListener = filteredEventListeners[i];\r
-var eventListenerBar = new WebInspector.EventListenerBar(eventListener, this._nodeId);\r
-this.eventBars.appendChild(eventListenerBar.element);\r
-}\r
-},\r
-\r
-addListener: function(eventListener)\r
-{\r
-this.eventListeners.push(eventListener);\r
-}\r
-}\r
-\r
-WebInspector.EventListenersSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;\r
-\r
-WebInspector.EventListenerBar = function(eventListener, nodeId)\r
-{\r
-this.eventListener = eventListener;\r
-this._nodeId = nodeId;\r
-WebInspector.ObjectPropertiesSection.call(this);\r
-this._setNodeTitle();\r
-this._setFunctionSubtitle();\r
-this.editable = false;\r
-this.element.className = "event-bar";  \r
-this.headerElement.addStyleClass("source-code");\r
-this.propertiesElement.className = "event-properties properties-tree source-code";  \r
-}\r
-\r
-WebInspector.EventListenerBar.prototype = {\r
-update: function()\r
-{\r
-function updateWithNodeObject(nodeObject)\r
-{\r
-var properties = [];\r
-if (nodeObject)\r
-properties.push(new WebInspector.RemoteObjectProperty("node", nodeObject));\r
-\r
-for (var propertyName in this.eventListener) {\r
-var value = WebInspector.RemoteObject.fromPrimitiveValue(this.eventListener[propertyName]);\r
-properties.push(new WebInspector.RemoteObjectProperty(propertyName, value));\r
-}\r
-this.updateProperties(properties);\r
-}\r
-var node = this.eventListener.node;\r
-delete this.eventListener.node;\r
-WebInspector.RemoteObject.resolveNode(node, updateWithNodeObject.bind(this));\r
-},\r
-\r
-_setNodeTitle: function()\r
-{\r
-var node = this.eventListener.node;\r
-if (!node)\r
-return;\r
-\r
-if (node.nodeType === Node.DOCUMENT_NODE) {\r
-this.titleElement.textContent = "document";\r
-return;\r
-}\r
-\r
-if (node.id === this._nodeId) {\r
-this.titleElement.textContent = appropriateSelectorForNode(node);\r
-return;\r
-}\r
-\r
-this.titleElement.removeChildren();\r
-this.titleElement.appendChild(WebInspector.panels.elements.linkifyNodeReference(this.eventListener.node));\r
-},\r
-\r
-_setFunctionSubtitle: function()\r
-{\r
-\r
-if (this.eventListener.sourceName) {\r
-this.subtitleElement.removeChildren();\r
-this.subtitleElement.appendChild(WebInspector.linkifyResourceAsNode(this.eventListener.sourceName, "scripts", this.eventListener.lineNumber));\r
-} else {\r
-var match = this.eventListener.listenerBody.match(/function ([^\(]+?)\(/);\r
-if (match)\r
-this.subtitleElement.textContent = match[1];\r
-else\r
-this.subtitleElement.textContent = WebInspector.UIString("(anonymous function)");\r
-}\r
-}\r
-}\r
-\r
-WebInspector.EventListenerBar.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.Color = function(str)\r
-{\r
-this.value = str;\r
-this._parse();\r
-}\r
-\r
-WebInspector.Color.prototype = {\r
-get shorthex()\r
-{\r
-if ("_short" in this)\r
-return this._short;\r
-\r
-if (!this.simple)\r
-return null;\r
-\r
-var hex = this.hex;\r
-if (hex.charAt(0) === hex.charAt(1) && hex.charAt(2) === hex.charAt(3) && hex.charAt(4) === hex.charAt(5))\r
-this._short = hex.charAt(0) + hex.charAt(2) + hex.charAt(4);\r
-else\r
-this._short = hex;\r
-\r
-return this._short;\r
-},\r
-\r
-get hex()\r
-{\r
-if (!this.simple)\r
-return null;\r
-\r
-return this._hex;\r
-},\r
-\r
-set hex(x)\r
-{\r
-this._hex = x;\r
-},\r
-\r
-get rgb()\r
-{\r
-if ("_rgb" in this)\r
-return this._rgb;\r
-\r
-if (this.simple)\r
-this._rgb = this._hexToRGB(this.hex);\r
-else {\r
-var rgba = this.rgba;\r
-this._rgb = [rgba[0], rgba[1], rgba[2]];\r
-}\r
-\r
-return this._rgb;\r
-},\r
-\r
-set rgb(x)\r
-{\r
-this._rgb = x;\r
-},\r
-\r
-get hsl()\r
-{\r
-if ("_hsl" in this)\r
-return this._hsl;\r
-\r
-this._hsl = this._rgbToHSL(this.rgb);\r
-return this._hsl;\r
-},\r
-\r
-set hsl(x)\r
-{\r
-this._hsl = x;\r
-},\r
-\r
-get nickname()\r
-{\r
-if (typeof this._nickname !== "undefined") \r
-return this._nickname;\r
-else\r
-return null;\r
-},\r
-\r
-set nickname(x)\r
-{\r
-this._nickname = x;\r
-},\r
-\r
-get rgba()\r
-{\r
-return this._rgba;\r
-},\r
-\r
-set rgba(x)\r
-{\r
-this._rgba = x;\r
-},\r
-\r
-get hsla()\r
-{\r
-return this._hsla;\r
-},\r
-\r
-set hsla(x)\r
-{\r
-this._hsla = x;\r
-},\r
-\r
-hasShortHex: function()\r
-{\r
-var shorthex = this.shorthex;\r
-return (shorthex && shorthex.length === 3);\r
-},\r
-\r
-toString: function(format)\r
-{\r
-if (!format)\r
-format = this.format;\r
-\r
-switch (format) {\r
-case "original":\r
-return this.value;\r
-case "rgb":\r
-return "rgb(" + this.rgb.join(", ") + ")";\r
-case "rgba":\r
-return "rgba(" + this.rgba.join(", ") + ")";\r
-case "hsl":\r
-var hsl = this.hsl;\r
-return "hsl(" + hsl[0] + ", " + hsl[1] + "%, " + hsl[2] + "%)";\r
-case "hsla":\r
-var hsla = this.hsla;\r
-return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + hsla[3] + ")";\r
-case "hex":\r
-return "#" + this.hex;\r
-case "shorthex":\r
-return "#" + this.shorthex;\r
-case "nickname":\r
-return this.nickname;\r
-}\r
-\r
-throw "invalid color format";\r
-},\r
-\r
-_rgbToHex: function(rgb)\r
-{\r
-var r = parseInt(rgb[0]).toString(16);\r
-var g = parseInt(rgb[1]).toString(16);\r
-var b = parseInt(rgb[2]).toString(16);\r
-if (r.length === 1)\r
-r = "0" + r;\r
-if (g.length === 1)\r
-g = "0" + g;\r
-if (b.length === 1)\r
-b = "0" + b;\r
-\r
-return (r + g + b).toUpperCase();\r
-},\r
-\r
-_hexToRGB: function(hex)\r
-{\r
-var r = parseInt(hex.substring(0,2), 16);\r
-var g = parseInt(hex.substring(2,4), 16);\r
-var b = parseInt(hex.substring(4,6), 16);\r
-\r
-return [r, g, b];\r
-},\r
-\r
-_rgbToHSL: function(rgb)\r
-{\r
-var r = parseInt(rgb[0]) / 255;\r
-var g = parseInt(rgb[1]) / 255;\r
-var b = parseInt(rgb[2]) / 255;\r
-var max = Math.max(r, g, b);\r
-var min = Math.min(r, g, b);\r
-var diff = max - min;\r
-var add = max + min;\r
-\r
-if (min === max)\r
-var h = 0;\r
-else if (r === max)\r
-var h = ((60 * (g - b) / diff) + 360) % 360;\r
-else if (g === max)\r
-var h = (60 * (b - r) / diff) + 120;\r
-else\r
-var h = (60 * (r - g) / diff) + 240;\r
-\r
-var l = 0.5 * add;\r
-\r
-if (l === 0)\r
-var s = 0;\r
-else if (l === 1)\r
-var s = 1;\r
-else if (l <= 0.5)\r
-var s = diff / add;\r
-else\r
-var s = diff / (2 - add);\r
-\r
-h = Math.round(h);\r
-s = Math.round(s*100);\r
-l = Math.round(l*100);\r
-\r
-return [h, s, l];\r
-},\r
-\r
-_hslToRGB: function(hsl)\r
-{\r
-var h = parseFloat(hsl[0]) / 360;\r
-var s = parseFloat(hsl[1]) / 100;\r
-var l = parseFloat(hsl[2]) / 100;\r
-\r
-if (l <= 0.5)\r
-var q = l * (1 + s);\r
-else\r
-var q = l + s - (l * s);\r
-\r
-var p = 2 * l - q;\r
-\r
-var tr = h + (1 / 3);\r
-var tg = h;\r
-var tb = h - (1 / 3);\r
-\r
-var r = Math.round(hueToRGB(p, q, tr) * 255);\r
-var g = Math.round(hueToRGB(p, q, tg) * 255);\r
-var b = Math.round(hueToRGB(p, q, tb) * 255);\r
-return [r, g, b];\r
-\r
-function hueToRGB(p, q, h) {\r
-if (h < 0)\r
-h += 1;\r
-else if (h > 1)\r
-h -= 1;\r
-\r
-if ((h * 6) < 1)\r
-return p + (q - p) * h * 6;\r
-else if ((h * 2) < 1)\r
-return q;\r
-else if ((h * 3) < 2)\r
-return p + (q - p) * ((2 / 3) - h) * 6;\r
-else\r
-return p;\r
-}\r
-},\r
-\r
-_rgbaToHSLA: function(rgba)\r
-{\r
-var alpha = rgba[3];\r
-var hsl = this._rgbToHSL(rgba)\r
-hsl.push(alpha);\r
-return hsl;\r
-},\r
-\r
-_hslaToRGBA: function(hsla)\r
-{\r
-var alpha = hsla[3];\r
-var rgb = this._hslToRGB(hsla);\r
-rgb.push(alpha);\r
-return rgb;\r
-},\r
-\r
-_parse: function()\r
-{\r
-\r
-var value = this.value.toLowerCase().replace(/%|\s+/g, "");\r
-if (value in WebInspector.Color.AdvancedNickNames) {\r
-this.format = "nickname";\r
-var set = WebInspector.Color.AdvancedNickNames[value];\r
-this.simple = false;\r
-this.rgba = set[0];\r
-this.hsla = set[1];\r
-this.nickname = set[2];\r
-this.alpha = set[0][3];\r
-return;\r
-}\r
-\r
-\r
-var simple = /^(?:#([0-9a-f]{3,6})|rgb\(([^)]+)\)|(\w+)|hsl\(([^)]+)\))$/i;\r
-var match = this.value.match(simple);\r
-if (match) {\r
-this.simple = true;\r
-\r
-if (match[1]) { \r
-var hex = match[1].toUpperCase();\r
-if (hex.length === 3) {\r
-this.format = "shorthex";\r
-this.hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);\r
-} else {\r
-this.format = "hex";\r
-this.hex = hex;\r
-}\r
-} else if (match[2]) { \r
-this.format = "rgb";\r
-var rgb = match[2].split(/\s*,\s*/);\r
-this.rgb = rgb;\r
-this.hex = this._rgbToHex(rgb);\r
-} else if (match[3]) { \r
-var nickname = match[3].toLowerCase();\r
-if (nickname in WebInspector.Color.Nicknames) {\r
-this.format = "nickname";\r
-this.hex = WebInspector.Color.Nicknames[nickname];\r
-} else \r
-throw "unknown color name";\r
-} else if (match[4]) { \r
-this.format = "hsl";\r
-var hsl = match[4].replace(/%/g, "").split(/\s*,\s*/);\r
-this.hsl = hsl;\r
-this.rgb = this._hslToRGB(hsl);\r
-this.hex = this._rgbToHex(this.rgb);\r
-}\r
-\r
-\r
-var hex = this.hex;\r
-if (hex && hex in WebInspector.Color.HexTable) {\r
-var set = WebInspector.Color.HexTable[hex];\r
-this.rgb = set[0];\r
-this.hsl = set[1];\r
-this.nickname = set[2];\r
-}\r
-\r
-return;\r
-}\r
-\r
-\r
-var advanced = /^(?:rgba\(([^)]+)\)|hsla\(([^)]+)\))$/;\r
-match = this.value.match(advanced);\r
-if (match) {\r
-this.simple = false;\r
-if (match[1]) { \r
-this.format = "rgba";\r
-this.rgba = match[1].split(/\s*,\s*/);\r
-this.hsla = this._rgbaToHSLA(this.rgba);\r
-this.alpha = this.rgba[3];\r
-} else if (match[2]) { \r
-this.format = "hsla";\r
-this.hsla = match[2].replace(/%/g, "").split(/\s*,\s*/);\r
-this.rgba = this._hslaToRGBA(this.hsla);\r
-this.alpha = this.hsla[3];\r
-}\r
-\r
-return;\r
-}\r
-\r
-\r
-throw "could not parse color";\r
-}\r
-}\r
-\r
-\r
-WebInspector.Color.HexTable = {\r
-"000000": [[0, 0, 0], [0, 0, 0], "black"],\r
-"000080": [[0, 0, 128], [240, 100, 25], "navy"],\r
-"00008B": [[0, 0, 139], [240, 100, 27], "darkBlue"],\r
-"0000CD": [[0, 0, 205], [240, 100, 40], "mediumBlue"],\r
-"0000FF": [[0, 0, 255], [240, 100, 50], "blue"],\r
-"006400": [[0, 100, 0], [120, 100, 20], "darkGreen"],\r
-"008000": [[0, 128, 0], [120, 100, 25], "green"],\r
-"008080": [[0, 128, 128], [180, 100, 25], "teal"],\r
-"008B8B": [[0, 139, 139], [180, 100, 27], "darkCyan"],\r
-"00BFFF": [[0, 191, 255], [195, 100, 50], "deepSkyBlue"],\r
-"00CED1": [[0, 206, 209], [181, 100, 41], "darkTurquoise"],\r
-"00FA9A": [[0, 250, 154], [157, 100, 49], "mediumSpringGreen"],\r
-"00FF00": [[0, 255, 0], [120, 100, 50], "lime"],\r
-"00FF7F": [[0, 255, 127], [150, 100, 50], "springGreen"],\r
-"00FFFF": [[0, 255, 255], [180, 100, 50], "cyan"],\r
-"191970": [[25, 25, 112], [240, 64, 27], "midnightBlue"],\r
-"1E90FF": [[30, 144, 255], [210, 100, 56], "dodgerBlue"],\r
-"20B2AA": [[32, 178, 170], [177, 70, 41], "lightSeaGreen"],\r
-"228B22": [[34, 139, 34], [120, 61, 34], "forestGreen"],\r
-"2E8B57": [[46, 139, 87], [146, 50, 36], "seaGreen"],\r
-"2F4F4F": [[47, 79, 79], [180, 25, 25], "darkSlateGray"],\r
-"32CD32": [[50, 205, 50], [120, 61, 50], "limeGreen"],\r
-"3CB371": [[60, 179, 113], [147, 50, 47], "mediumSeaGreen"],\r
-"40E0D0": [[64, 224, 208], [174, 72, 56], "turquoise"],\r
-"4169E1": [[65, 105, 225], [225, 73, 57], "royalBlue"],\r
-"4682B4": [[70, 130, 180], [207, 44, 49], "steelBlue"],\r
-"483D8B": [[72, 61, 139], [248, 39, 39], "darkSlateBlue"],\r
-"48D1CC": [[72, 209, 204], [178, 60, 55], "mediumTurquoise"],\r
-"4B0082": [[75, 0, 130], [275, 100, 25], "indigo"],\r
-"556B2F": [[85, 107, 47], [82, 39, 30], "darkOliveGreen"],\r
-"5F9EA0": [[95, 158, 160], [182, 25, 50], "cadetBlue"],\r
-"6495ED": [[100, 149, 237], [219, 79, 66], "cornflowerBlue"],\r
-"66CDAA": [[102, 205, 170], [160, 51, 60], "mediumAquaMarine"],\r
-"696969": [[105, 105, 105], [0, 0, 41], "dimGray"],\r
-"6A5ACD": [[106, 90, 205], [248, 53, 58], "slateBlue"],\r
-"6B8E23": [[107, 142, 35], [80, 60, 35], "oliveDrab"],\r
-"708090": [[112, 128, 144], [210, 13, 50], "slateGray"],\r
-"778899": [[119, 136, 153], [210, 14, 53], "lightSlateGray"],\r
-"7B68EE": [[123, 104, 238], [249, 80, 67], "mediumSlateBlue"],\r
-"7CFC00": [[124, 252, 0], [90, 100, 49], "lawnGreen"],\r
-"7FFF00": [[127, 255, 0], [90, 100, 50], "chartreuse"],\r
-"7FFFD4": [[127, 255, 212], [160, 100, 75], "aquamarine"],\r
-"800000": [[128, 0, 0], [0, 100, 25], "maroon"],\r
-"800080": [[128, 0, 128], [300, 100, 25], "purple"],\r
-"808000": [[128, 128, 0], [60, 100, 25], "olive"],\r
-"808080": [[128, 128, 128], [0, 0, 50], "gray"],\r
-"87CEEB": [[135, 206, 235], [197, 71, 73], "skyBlue"],\r
-"87CEFA": [[135, 206, 250], [203, 92, 75], "lightSkyBlue"],\r
-"8A2BE2": [[138, 43, 226], [271, 76, 53], "blueViolet"],\r
-"8B0000": [[139, 0, 0], [0, 100, 27], "darkRed"],\r
-"8B008B": [[139, 0, 139], [300, 100, 27], "darkMagenta"],\r
-"8B4513": [[139, 69, 19], [25, 76, 31], "saddleBrown"],\r
-"8FBC8F": [[143, 188, 143], [120, 25, 65], "darkSeaGreen"],\r
-"90EE90": [[144, 238, 144], [120, 73, 75], "lightGreen"],\r
-"9370D8": [[147, 112, 219], [260, 60, 65], "mediumPurple"],\r
-"9400D3": [[148, 0, 211], [282, 100, 41], "darkViolet"],\r
-"98FB98": [[152, 251, 152], [120, 93, 79], "paleGreen"],\r
-"9932CC": [[153, 50, 204], [280, 61, 50], "darkOrchid"],\r
-"9ACD32": [[154, 205, 50], [80, 61, 50], "yellowGreen"],\r
-"A0522D": [[160, 82, 45], [19, 56, 40], "sienna"],\r
-"A52A2A": [[165, 42, 42], [0, 59, 41], "brown"],\r
-"A9A9A9": [[169, 169, 169], [0, 0, 66], "darkGray"],\r
-"ADD8E6": [[173, 216, 230], [195, 53, 79], "lightBlue"],\r
-"ADFF2F": [[173, 255, 47], [84, 100, 59], "greenYellow"],\r
-"AFEEEE": [[175, 238, 238], [180, 65, 81], "paleTurquoise"],\r
-"B0C4DE": [[176, 196, 222], [214, 41, 78], "lightSteelBlue"],\r
-"B0E0E6": [[176, 224, 230], [187, 52, 80], "powderBlue"],\r
-"B22222": [[178, 34, 34], [0, 68, 42], "fireBrick"],\r
-"B8860B": [[184, 134, 11], [43, 89, 38], "darkGoldenrod"],\r
-"BA55D3": [[186, 85, 211], [288, 59, 58], "mediumOrchid"],\r
-"BC8F8F": [[188, 143, 143], [0, 25, 65], "rosyBrown"],\r
-"BDB76B": [[189, 183, 107], [56, 38, 58], "darkKhaki"],\r
-"C0C0C0": [[192, 192, 192], [0, 0, 75], "silver"],\r
-"C71585": [[199, 21, 133], [322, 81, 43], "mediumVioletRed"],\r
-"CD5C5C": [[205, 92, 92], [0, 53, 58], "indianRed"],\r
-"CD853F": [[205, 133, 63], [30, 59, 53], "peru"],\r
-"D2691E": [[210, 105, 30], [25, 75, 47], "chocolate"],\r
-"D2B48C": [[210, 180, 140], [34, 44, 69], "tan"],\r
-"D3D3D3": [[211, 211, 211], [0, 0, 83], "lightGrey"],\r
-"D87093": [[219, 112, 147], [340, 60, 65], "paleVioletRed"],\r
-"D8BFD8": [[216, 191, 216], [300, 24, 80], "thistle"],\r
-"DA70D6": [[218, 112, 214], [302, 59, 65], "orchid"],\r
-"DAA520": [[218, 165, 32], [43, 74, 49], "goldenrod"],\r
-"DC143C": [[237, 164, 61], [35, 83, 58], "crimson"],\r
-"DCDCDC": [[220, 220, 220], [0, 0, 86], "gainsboro"],\r
-"DDA0DD": [[221, 160, 221], [300, 47, 75], "plum"],\r
-"DEB887": [[222, 184, 135], [34, 57, 70], "burlyWood"],\r
-"E0FFFF": [[224, 255, 255], [180, 100, 94], "lightCyan"],\r
-"E6E6FA": [[230, 230, 250], [240, 67, 94], "lavender"],\r
-"E9967A": [[233, 150, 122], [15, 72, 70], "darkSalmon"],\r
-"EE82EE": [[238, 130, 238], [300, 76, 72], "violet"],\r
-"EEE8AA": [[238, 232, 170], [55, 67, 80], "paleGoldenrod"],\r
-"F08080": [[240, 128, 128], [0, 79, 72], "lightCoral"],\r
-"F0E68C": [[240, 230, 140], [54, 77, 75], "khaki"],\r
-"F0F8FF": [[240, 248, 255], [208, 100, 97], "aliceBlue"],\r
-"F0FFF0": [[240, 255, 240], [120, 100, 97], "honeyDew"],\r
-"F0FFFF": [[240, 255, 255], [180, 100, 97], "azure"],\r
-"F4A460": [[244, 164, 96], [28, 87, 67], "sandyBrown"],\r
-"F5DEB3": [[245, 222, 179], [39, 77, 83], "wheat"],\r
-"F5F5DC": [[245, 245, 220], [60, 56, 91], "beige"],\r
-"F5F5F5": [[245, 245, 245], [0, 0, 96], "whiteSmoke"],\r
-"F5FFFA": [[245, 255, 250], [150, 100, 98], "mintCream"],\r
-"F8F8FF": [[248, 248, 255], [240, 100, 99], "ghostWhite"],\r
-"FA8072": [[250, 128, 114], [6, 93, 71], "salmon"],\r
-"FAEBD7": [[250, 235, 215], [34, 78, 91], "antiqueWhite"],\r
-"FAF0E6": [[250, 240, 230], [30, 67, 94], "linen"],\r
-"FAFAD2": [[250, 250, 210], [60, 80, 90], "lightGoldenrodYellow"],\r
-"FDF5E6": [[253, 245, 230], [39, 85, 95], "oldLace"],\r
-"FF0000": [[255, 0, 0], [0, 100, 50], "red"],\r
-"FF00FF": [[255, 0, 255], [300, 100, 50], "magenta"],\r
-"FF1493": [[255, 20, 147], [328, 100, 54], "deepPink"],\r
-"FF4500": [[255, 69, 0], [16, 100, 50], "orangeRed"],\r
-"FF6347": [[255, 99, 71], [9, 100, 64], "tomato"],\r
-"FF69B4": [[255, 105, 180], [330, 100, 71], "hotPink"],\r
-"FF7F50": [[255, 127, 80], [16, 100, 66], "coral"],\r
-"FF8C00": [[255, 140, 0], [33, 100, 50], "darkOrange"],\r
-"FFA07A": [[255, 160, 122], [17, 100, 74], "lightSalmon"],\r
-"FFA500": [[255, 165, 0], [39, 100, 50], "orange"],\r
-"FFB6C1": [[255, 182, 193], [351, 100, 86], "lightPink"],\r
-"FFC0CB": [[255, 192, 203], [350, 100, 88], "pink"],\r
-"FFD700": [[255, 215, 0], [51, 100, 50], "gold"],\r
-"FFDAB9": [[255, 218, 185], [28, 100, 86], "peachPuff"],\r
-"FFDEAD": [[255, 222, 173], [36, 100, 84], "navajoWhite"],\r
-"FFE4B5": [[255, 228, 181], [38, 100, 85], "moccasin"],\r
-"FFE4C4": [[255, 228, 196], [33, 100, 88], "bisque"],\r
-"FFE4E1": [[255, 228, 225], [6, 100, 94], "mistyRose"],\r
-"FFEBCD": [[255, 235, 205], [36, 100, 90], "blanchedAlmond"],\r
-"FFEFD5": [[255, 239, 213], [37, 100, 92], "papayaWhip"],\r
-"FFF0F5": [[255, 240, 245], [340, 100, 97], "lavenderBlush"],\r
-"FFF5EE": [[255, 245, 238], [25, 100, 97], "seaShell"],\r
-"FFF8DC": [[255, 248, 220], [48, 100, 93], "cornsilk"],\r
-"FFFACD": [[255, 250, 205], [54, 100, 90], "lemonChiffon"],\r
-"FFFAF0": [[255, 250, 240], [40, 100, 97], "floralWhite"],\r
-"FFFAFA": [[255, 250, 250], [0, 100, 99], "snow"],\r
-"FFFF00": [[255, 255, 0], [60, 100, 50], "yellow"],\r
-"FFFFE0": [[255, 255, 224], [60, 100, 94], "lightYellow"],\r
-"FFFFF0": [[255, 255, 240], [60, 100, 97], "ivory"],\r
-"FFFFFF": [[255, 255, 255], [0, 100, 100], "white"]\r
-};\r
-\r
-\r
-WebInspector.Color.Nicknames = {\r
-"aliceblue": "F0F8FF",\r
-"antiquewhite": "FAEBD7",\r
-"aqua": "00FFFF",\r
-"aquamarine": "7FFFD4",\r
-"azure": "F0FFFF",\r
-"beige": "F5F5DC",\r
-"bisque": "FFE4C4",\r
-"black": "000000",\r
-"blanchedalmond": "FFEBCD",\r
-"blue": "0000FF",\r
-"blueviolet": "8A2BE2",\r
-"brown": "A52A2A",\r
-"burlywood": "DEB887",\r
-"cadetblue": "5F9EA0",\r
-"chartreuse": "7FFF00",\r
-"chocolate": "D2691E",\r
-"coral": "FF7F50",\r
-"cornflowerblue": "6495ED",\r
-"cornsilk": "FFF8DC",\r
-"crimson": "DC143C",\r
-"cyan": "00FFFF",\r
-"darkblue": "00008B",\r
-"darkcyan": "008B8B",\r
-"darkgoldenrod": "B8860B",\r
-"darkgray": "A9A9A9",\r
-"darkgreen": "006400",\r
-"darkkhaki": "BDB76B",\r
-"darkmagenta": "8B008B",\r
-"darkolivegreen": "556B2F",\r
-"darkorange": "FF8C00",\r
-"darkorchid": "9932CC",\r
-"darkred": "8B0000",\r
-"darksalmon": "E9967A",\r
-"darkseagreen": "8FBC8F",\r
-"darkslateblue": "483D8B",\r
-"darkslategray": "2F4F4F",\r
-"darkturquoise": "00CED1",\r
-"darkviolet": "9400D3",\r
-"deeppink": "FF1493",\r
-"deepskyblue": "00BFFF",\r
-"dimgray": "696969",\r
-"dodgerblue": "1E90FF",\r
-"firebrick": "B22222",\r
-"floralwhite": "FFFAF0",\r
-"forestgreen": "228B22",\r
-"fuchsia": "FF00FF",\r
-"gainsboro": "DCDCDC",\r
-"ghostwhite": "F8F8FF",\r
-"gold": "FFD700",\r
-"goldenrod": "DAA520",\r
-"gray": "808080",\r
-"green": "008000",\r
-"greenyellow": "ADFF2F",\r
-"honeydew": "F0FFF0",\r
-"hotpink": "FF69B4",\r
-"indianred": "CD5C5C",\r
-"indigo": "4B0082",\r
-"ivory": "FFFFF0",\r
-"khaki": "F0E68C",\r
-"lavender": "E6E6FA",\r
-"lavenderblush": "FFF0F5",\r
-"lawngreen": "7CFC00",\r
-"lemonchiffon": "FFFACD",\r
-"lightblue": "ADD8E6",\r
-"lightcoral": "F08080",\r
-"lightcyan": "E0FFFF",\r
-"lightgoldenrodyellow": "FAFAD2",\r
-"lightgreen": "90EE90",\r
-"lightgrey": "D3D3D3",\r
-"lightpink": "FFB6C1",\r
-"lightsalmon": "FFA07A",\r
-"lightseagreen": "20B2AA",\r
-"lightskyblue": "87CEFA",\r
-"lightslategray": "778899",\r
-"lightsteelblue": "B0C4DE",\r
-"lightyellow": "FFFFE0",\r
-"lime": "00FF00",\r
-"limegreen": "32CD32",\r
-"linen": "FAF0E6",\r
-"magenta": "FF00FF",\r
-"maroon": "800000",\r
-"mediumaquamarine": "66CDAA",\r
-"mediumblue": "0000CD",\r
-"mediumorchid": "BA55D3",\r
-"mediumpurple": "9370D8",\r
-"mediumseagreen": "3CB371",\r
-"mediumslateblue": "7B68EE",\r
-"mediumspringgreen": "00FA9A",\r
-"mediumturquoise": "48D1CC",\r
-"mediumvioletred": "C71585",\r
-"midnightblue": "191970",\r
-"mintcream": "F5FFFA",\r
-"mistyrose": "FFE4E1",\r
-"moccasin": "FFE4B5",\r
-"navajowhite": "FFDEAD",\r
-"navy": "000080",\r
-"oldlace": "FDF5E6",\r
-"olive": "808000",\r
-"olivedrab": "6B8E23",\r
-"orange": "FFA500",\r
-"orangered": "FF4500",\r
-"orchid": "DA70D6",\r
-"palegoldenrod": "EEE8AA",\r
-"palegreen": "98FB98",\r
-"paleturquoise": "AFEEEE",\r
-"palevioletred": "D87093",\r
-"papayawhip": "FFEFD5",\r
-"peachpuff": "FFDAB9",\r
-"peru": "CD853F",\r
-"pink": "FFC0CB",\r
-"plum": "DDA0DD",\r
-"powderblue": "B0E0E6",\r
-"purple": "800080",\r
-"red": "FF0000",\r
-"rosybrown": "BC8F8F",\r
-"royalblue": "4169E1",\r
-"saddlebrown": "8B4513",\r
-"salmon": "FA8072",\r
-"sandybrown": "F4A460",\r
-"seagreen": "2E8B57",\r
-"seashell": "FFF5EE",\r
-"sienna": "A0522D",\r
-"silver": "C0C0C0",\r
-"skyblue": "87CEEB",\r
-"slateblue": "6A5ACD",\r
-"slategray": "708090",\r
-"snow": "FFFAFA",\r
-"springgreen": "00FF7F",\r
-"steelblue": "4682B4",\r
-"tan": "D2B48C",\r
-"teal": "008080",\r
-"thistle": "D8BFD8",\r
-"tomato": "FF6347",\r
-"turquoise": "40E0D0",\r
-"violet": "EE82EE",\r
-"wheat": "F5DEB3",\r
-"white": "FFFFFF",\r
-"whitesmoke": "F5F5F5",\r
-"yellow": "FFFF00",\r
-"yellowgreen": "9ACD32"\r
-};\r
-\r
-\r
-WebInspector.Color.AdvancedNickNames = {\r
-"transparent": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],\r
-"rgba(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],\r
-"hsla(0,0,0,0)": [[0, 0, 0, 0], [0, 0, 0, 0], "transparent"],\r
-};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.CSSCompletions = function(values)\r
-{\r
-this._values = values.slice();\r
-this._values.sort();\r
-}\r
-\r
-WebInspector.CSSCompletions.prototype = {\r
-startsWith: function(prefix)\r
-{\r
-var firstIndex = this._firstIndexOfPrefix(prefix);\r
-if (firstIndex === -1)\r
-return [];\r
-\r
-var results = [];\r
-while (this._values[firstIndex].indexOf(prefix) === 0)\r
-results.push(this._values[firstIndex++]);\r
-return results;\r
-},\r
-\r
-firstStartsWith: function(prefix)\r
-{\r
-var foundIndex = this._firstIndexOfPrefix(prefix);\r
-return (foundIndex === -1 ? "" : this._values[foundIndex]);\r
-},\r
-\r
-_firstIndexOfPrefix: function(prefix)\r
-{\r
-if (!prefix)\r
-return -1;\r
-if (!this._values.length)\r
-return -1;\r
-\r
-var maxIndex = this._values.length - 1;\r
-var minIndex = 0;\r
-var foundIndex;\r
-\r
-do {\r
-var middleIndex = (maxIndex + minIndex) >> 1;\r
-if (this._values[middleIndex].indexOf(prefix) === 0) {\r
-foundIndex = middleIndex;\r
-break;\r
-}\r
-if (this._values[middleIndex] < prefix)\r
-minIndex = middleIndex + 1;\r
-else\r
-maxIndex = middleIndex - 1;\r
-} while (minIndex <= maxIndex);\r
-\r
-if (foundIndex === undefined)\r
-return -1;\r
-\r
-while (foundIndex && this._values[foundIndex - 1].indexOf(prefix) === 0)\r
-foundIndex--;\r
-\r
-return foundIndex;\r
-},\r
-\r
-keySet: function()\r
-{\r
-return this._values.keySet();\r
-},\r
-\r
-next: function(str, prefix)\r
-{\r
-return this._closest(str, prefix, 1);\r
-},\r
-\r
-previous: function(str, prefix)\r
-{\r
-return this._closest(str, prefix, -1);\r
-},\r
-\r
-_closest: function(str, prefix, shift)\r
-{\r
-if (!str)\r
-return "";\r
-\r
-var index = this._values.indexOf(str);\r
-if (index === -1)\r
-return "";\r
-\r
-if (!prefix) {\r
-index = (index + this._values.length + shift) % this._values.length;\r
-return this._values[index];\r
-}\r
-\r
-var propertiesWithPrefix = this.startsWith(prefix);\r
-var j = propertiesWithPrefix.indexOf(str);\r
-j = (j + propertiesWithPrefix.length + shift) % propertiesWithPrefix.length;\r
-return propertiesWithPrefix[j];\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.StylesSidebarPane = function(computedStylePane)\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Styles"));\r
-\r
-this.settingsSelectElement = document.createElement("select");\r
-\r
-var option = document.createElement("option");\r
-option.value = "original";\r
-option.action = this._changeColorFormat.bind(this);\r
-option.label = WebInspector.UIString("As Authored");\r
-this.settingsSelectElement.appendChild(option);\r
-\r
-var option = document.createElement("option");\r
-option.value = "hex";\r
-option.action = this._changeColorFormat.bind(this);\r
-option.label = WebInspector.UIString("Hex Colors");\r
-this.settingsSelectElement.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "rgb";\r
-option.action = this._changeColorFormat.bind(this);\r
-option.label = WebInspector.UIString("RGB Colors");\r
-this.settingsSelectElement.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "hsl";\r
-option.action = this._changeColorFormat.bind(this);\r
-option.label = WebInspector.UIString("HSL Colors");\r
-this.settingsSelectElement.appendChild(option);\r
-\r
-this.settingsSelectElement.appendChild(document.createElement("hr"));\r
-\r
-option = document.createElement("option");\r
-option.action = this._createNewRule.bind(this);\r
-option.label = WebInspector.UIString("New Style Rule");\r
-this.settingsSelectElement.appendChild(option);\r
-\r
-this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false);\r
-this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false);\r
-var format = WebInspector.settings.colorFormat;\r
-if (format === "original")\r
-this.settingsSelectElement[0].selected = true;\r
-else if (format === "hex")\r
-this.settingsSelectElement[1].selected = true;\r
-else if (format === "rgb")\r
-this.settingsSelectElement[2].selected = true;\r
-else if (format === "hsl")\r
-this.settingsSelectElement[3].selected = true;\r
-\r
-this.titleElement.appendChild(this.settingsSelectElement);\r
-this._computedStylePane = computedStylePane;\r
-this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);\r
-}\r
-\r
-\r
-WebInspector.StylesSidebarPane.InheritedProperties = [\r
-"azimuth", "border-collapse", "border-spacing", "caption-side", "color", "cursor", "direction", "elevation",\r
-"empty-cells", "font-family", "font-size", "font-style", "font-variant", "font-weight", "font", "letter-spacing",\r
-"line-height", "list-style-image", "list-style-position", "list-style-type", "list-style", "orphans", "pitch-range",\r
-"pitch", "quotes", "richness", "speak-header", "speak-numeral", "speak-punctuation", "speak", "speech-rate", "stress",\r
-"text-align", "text-indent", "text-transform", "text-shadow", "visibility", "voice-family", "volume", "white-space", "widows", "word-spacing"\r
-].keySet();\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.StylesSidebarPane.PseudoIdNames = [\r
-"", "first-line", "first-letter", "before", "after", "selection", "", "-webkit-scrollbar", "-webkit-file-upload-button",\r
-"-webkit-input-placeholder", "-webkit-slider-thumb", "-webkit-search-cancel-button", "-webkit-search-decoration",\r
-"-webkit-search-results-decoration", "-webkit-search-results-button", "-webkit-media-controls-panel",\r
-"-webkit-media-controls-play-button", "-webkit-media-controls-mute-button", "-webkit-media-controls-timeline",\r
-"-webkit-media-controls-timeline-container", "-webkit-media-controls-volume-slider",\r
-"-webkit-media-controls-volume-slider-container", "-webkit-media-controls-current-time-display",\r
-"-webkit-media-controls-time-remaining-display", "-webkit-media-controls-seek-back-button", "-webkit-media-controls-seek-forward-button",\r
-"-webkit-media-controls-fullscreen-button", "-webkit-media-controls-rewind-button", "-webkit-media-controls-return-to-realtime-button",\r
-"-webkit-media-controls-toggle-closed-captions-button", "-webkit-media-controls-status-display", "-webkit-scrollbar-thumb",\r
-"-webkit-scrollbar-button", "-webkit-scrollbar-track", "-webkit-scrollbar-track-piece", "-webkit-scrollbar-corner",\r
-"-webkit-resizer", "-webkit-input-list-button", "-webkit-inner-spin-button", "-webkit-outer-spin-button"\r
-];\r
-\r
-WebInspector.StylesSidebarPane.prototype = {\r
-_contextMenuEventFired: function(event)\r
-{\r
-var href = event.target.enclosingNodeOrSelfWithClass("webkit-html-resource-link") || event.target.enclosingNodeOrSelfWithClass("webkit-html-external-link");\r
-if (href) {\r
-var contextMenu = new WebInspector.ContextMenu();\r
-var filled = WebInspector.panels.elements.populateHrefContextMenu(contextMenu, event, href);\r
-if (filled)\r
-contextMenu.show(event);\r
-}\r
-},\r
-\r
-update: function(node, editedSection, forceUpdate)\r
-{\r
-var refresh = false;\r
-\r
-if (forceUpdate)\r
-delete this.node;\r
-\r
-if (!forceUpdate && (!node || node === this.node))\r
-refresh = true;\r
-\r
-if (node && node.nodeType === Node.TEXT_NODE && node.parentNode)\r
-node = node.parentNode;\r
-\r
-if (node && node.nodeType !== Node.ELEMENT_NODE)\r
-node = null;\r
-\r
-if (node)\r
-this.node = node;\r
-else\r
-node = this.node;\r
-\r
-if (!node) {\r
-this.bodyElement.removeChildren();\r
-this._computedStylePane.bodyElement.removeChildren();\r
-this.sections = {};\r
-return;\r
-}\r
-\r
-function stylesCallback(styles)\r
-{\r
-if (styles)\r
-this._rebuildUpdate(node, styles);\r
-}\r
-\r
-function computedStyleCallback(computedStyle)\r
-{\r
-if (computedStyle)\r
-this._refreshUpdate(node, computedStyle, editedSection);\r
-}\r
-\r
-if (refresh)\r
-WebInspector.cssModel.getComputedStyleAsync(node.id, computedStyleCallback.bind(this));\r
-else\r
-WebInspector.cssModel.getStylesAsync(node.id, stylesCallback.bind(this));\r
-},\r
-\r
-_refreshUpdate: function(node, computedStyle, editedSection)\r
-{\r
-for (var pseudoId in this.sections) {\r
-var styleRules = this._refreshStyleRules(this.sections[pseudoId], computedStyle);\r
-var usedProperties = {};\r
-var disabledComputedProperties = {};\r
-this._markUsedProperties(styleRules, usedProperties, disabledComputedProperties);\r
-this._refreshSectionsForStyleRules(styleRules, usedProperties, disabledComputedProperties, editedSection);\r
-}\r
-\r
-this.sections[0][0].rebuildComputedTrace(this.sections[0]);\r
-},\r
-\r
-_rebuildUpdate: function(node, styles)\r
-{\r
-this.bodyElement.removeChildren();\r
-this._computedStylePane.bodyElement.removeChildren();\r
-\r
-var styleRules = this._rebuildStyleRules(node, styles);\r
-var usedProperties = {};\r
-var disabledComputedProperties = {};\r
-this._markUsedProperties(styleRules, usedProperties, disabledComputedProperties);\r
-this.sections[0] = this._rebuildSectionsForStyleRules(styleRules, usedProperties, disabledComputedProperties, 0);\r
-var anchorElement = this.sections[0].inheritedPropertiesSeparatorElement;\r
-\r
-this.sections[0][0].rebuildComputedTrace(this.sections[0]);\r
-\r
-for (var i = 0; i < styles.pseudoElements.length; ++i) {\r
-var pseudoElementCSSRules = styles.pseudoElements[i];\r
-\r
-styleRules = [];\r
-var pseudoId = pseudoElementCSSRules.pseudoId;\r
-\r
-var entry = { isStyleSeparator: true, pseudoId: pseudoId };\r
-styleRules.push(entry);\r
-\r
-\r
-for (var j = pseudoElementCSSRules.rules.length - 1; j >= 0; --j) {\r
-var rule = pseudoElementCSSRules.rules[j];\r
-styleRules.push({ style: rule.style, selectorText: rule.selectorText, sourceURL: rule.sourceURL, rule: rule, editable: !!(rule.style && rule.style.id) });\r
-}\r
-usedProperties = {};\r
-disabledComputedProperties = {};\r
-this._markUsedProperties(styleRules, usedProperties, disabledComputedProperties);\r
-this.sections[pseudoId] = this._rebuildSectionsForStyleRules(styleRules, usedProperties, disabledComputedProperties, pseudoId, anchorElement);\r
-}\r
-},\r
-\r
-_refreshStyleRules: function(sections, computedStyle)\r
-{\r
-var nodeComputedStyle = computedStyle;\r
-var styleRules = [];\r
-for (var i = 0; sections && i < sections.length; ++i) {\r
-var section = sections[i];\r
-if (section instanceof WebInspector.BlankStylePropertiesSection)\r
-continue;\r
-if (section.computedStyle)\r
-section.styleRule.style = nodeComputedStyle;\r
-var styleRule = { section: section, style: section.styleRule.style, computedStyle: section.computedStyle, rule: section.rule, editable: !!(section.styleRule.style && section.styleRule.style.id) };\r
-styleRules.push(styleRule);\r
-}\r
-return styleRules;\r
-},\r
-\r
-_rebuildStyleRules: function(node, styles)\r
-{\r
-var nodeComputedStyle = styles.computedStyle;\r
-this.sections = {};\r
-\r
-var styleRules = [];\r
-\r
-styleRules.push({ computedStyle: true, selectorText: "", style: nodeComputedStyle, editable: false });\r
-\r
-var styleAttributes = {};\r
-for (var name in styles.styleAttributes) {\r
-var attrStyle = { style: styles.styleAttributes[name], editable: false };\r
-attrStyle.selectorText = WebInspector.panels.elements.treeOutline.nodeNameToCorrectCase(node.nodeName) + "[" + name;\r
-if (node.getAttribute(name))\r
-attrStyle.selectorText += "=" + node.getAttribute(name);\r
-attrStyle.selectorText += "]";\r
-styleRules.push(attrStyle);\r
-}\r
-\r
-\r
-if (styles.inlineStyle && node.nodeType === Node.ELEMENT_NODE) {\r
-var inlineStyle = { selectorText: "element.style", style: styles.inlineStyle, isAttribute: true };\r
-styleRules.push(inlineStyle);\r
-}\r
-\r
-\r
-if (styles.matchedCSSRules.length)\r
-styleRules.push({ isStyleSeparator: true, text: WebInspector.UIString("Matched CSS Rules") });\r
-for (var i = styles.matchedCSSRules.length - 1; i >= 0; --i) {\r
-var rule = styles.matchedCSSRules[i];\r
-styleRules.push({ style: rule.style, selectorText: rule.selectorText, sourceURL: rule.sourceURL, rule: rule, editable: !!(rule.style && rule.style.id) });\r
-}\r
-\r
-\r
-var parentNode = node.parentNode;\r
-function insertInheritedNodeSeparator(node)\r
-{\r
-var entry = {};\r
-entry.isStyleSeparator = true;\r
-entry.node = node;\r
-styleRules.push(entry);\r
-}\r
-\r
-for (var parentOrdinal = 0; parentOrdinal < styles.inherited.length; ++parentOrdinal) {\r
-var parentStyles = styles.inherited[parentOrdinal];\r
-var separatorInserted = false;\r
-if (parentStyles.inlineStyle) {\r
-if (this._containsInherited(parentStyles.inlineStyle)) {\r
-var inlineStyle = { selectorText: WebInspector.UIString("Style Attribute"), style: parentStyles.inlineStyle, isAttribute: true, isInherited: true };\r
-if (!separatorInserted) {\r
-insertInheritedNodeSeparator(parentNode);\r
-separatorInserted = true;\r
-}\r
-styleRules.push(inlineStyle);\r
-}\r
-}\r
-\r
-for (var i = parentStyles.matchedCSSRules.length - 1; i >= 0; --i) {\r
-var rulePayload = parentStyles.matchedCSSRules[i];\r
-if (!this._containsInherited(rulePayload.style))\r
-continue;\r
-var rule = rulePayload;\r
-if (!separatorInserted) {\r
-insertInheritedNodeSeparator(parentNode);\r
-separatorInserted = true;\r
-}\r
-styleRules.push({ style: rule.style, selectorText: rule.selectorText, sourceURL: rule.sourceURL, rule: rule, isInherited: true, editable: !!(rule.style && rule.style.id) });\r
-}\r
-parentNode = parentNode.parentNode;\r
-}\r
-return styleRules;\r
-},\r
-\r
-_markUsedProperties: function(styleRules, usedProperties, disabledComputedProperties)\r
-{\r
-var priorityUsed = false;\r
-\r
-\r
-for (var i = 0; i < styleRules.length; ++i) {\r
-var styleRule = styleRules[i];\r
-if (styleRule.computedStyle || styleRule.isStyleSeparator)\r
-continue;\r
-if (styleRule.section && styleRule.section.noAffect)\r
-continue;\r
-\r
-styleRule.usedProperties = {};\r
-\r
-var style = styleRule.style;\r
-var allProperties = style.allProperties;\r
-for (var j = 0; j < allProperties.length; ++j) {\r
-var property = allProperties[j];\r
-if (!property.isLive)\r
-continue;\r
-var name = property.name;\r
-\r
-if (!priorityUsed && property.priority.length)\r
-priorityUsed = true;\r
-\r
-\r
-\r
-if (!(name in usedProperties))\r
-styleRule.usedProperties[name] = true;\r
-\r
-if (name === "font") {\r
-\r
-\r
-\r
-styleRule.usedProperties["font-family"] = true;\r
-styleRule.usedProperties["font-size"] = true;\r
-styleRule.usedProperties["font-style"] = true;\r
-styleRule.usedProperties["font-variant"] = true;\r
-styleRule.usedProperties["font-weight"] = true;\r
-styleRule.usedProperties["line-height"] = true;\r
-}\r
-}\r
-\r
-\r
-\r
-for (var name in styleRules[i].usedProperties)\r
-usedProperties[name] = true;\r
-}\r
-\r
-if (priorityUsed) {\r
-\r
-var foundPriorityProperties = [];\r
-\r
-\r
-for (var i = (styleRules.length - 1); i >= 0; --i) {\r
-if (styleRules[i].computedStyle || styleRules[i].isStyleSeparator)\r
-continue;\r
-\r
-var style = styleRules[i].style;\r
-var allProperties = style.allProperties;\r
-for (var j = 0; j < allProperties.length; ++j) {\r
-var property = allProperties[j];\r
-if (!property.isLive)\r
-continue;\r
-var name = property.name;\r
-if (property.priority.length) {\r
-if (!(name in foundPriorityProperties))\r
-styleRules[i].usedProperties[name] = true;\r
-else\r
-delete styleRules[i].usedProperties[name];\r
-foundPriorityProperties[name] = true;\r
-} else if (name in foundPriorityProperties)\r
-delete styleRules[i].usedProperties[name];\r
-}\r
-}\r
-}\r
-},\r
-\r
-_refreshSectionsForStyleRules: function(styleRules, usedProperties, disabledComputedProperties, editedSection)\r
-{\r
-\r
-for (var i = 0; i < styleRules.length; ++i) {\r
-var styleRule = styleRules[i];\r
-var section = styleRule.section;\r
-if (styleRule.computedStyle) {\r
-section._disabledComputedProperties = disabledComputedProperties;\r
-section._usedProperties = usedProperties;\r
-section.update();\r
-} else {\r
-section._usedProperties = styleRule.usedProperties;\r
-section.update(section === editedSection);\r
-}\r
-}\r
-},\r
-\r
-_rebuildSectionsForStyleRules: function(styleRules, usedProperties, disabledComputedProperties, pseudoId, anchorElement)\r
-{\r
-\r
-var sections = [];\r
-var lastWasSeparator = true;\r
-for (var i = 0; i < styleRules.length; ++i) {\r
-var styleRule = styleRules[i];\r
-if (styleRule.isStyleSeparator) {\r
-var separatorElement = document.createElement("div");\r
-separatorElement.className = "styles-sidebar-separator";\r
-if (styleRule.node) {\r
-var link = WebInspector.panels.elements.linkifyNodeReference(styleRule.node);\r
-separatorElement.appendChild(document.createTextNode(WebInspector.UIString("Inherited from") + " "));\r
-separatorElement.appendChild(link);\r
-if (!sections.inheritedPropertiesSeparatorElement)\r
-sections.inheritedPropertiesSeparatorElement = separatorElement;\r
-} else if ("pseudoId" in styleRule) {\r
-var pseudoName = WebInspector.StylesSidebarPane.PseudoIdNames[styleRule.pseudoId];\r
-if (pseudoName)\r
-separatorElement.textContent = WebInspector.UIString("Pseudo ::%s element", pseudoName);\r
-else\r
-separatorElement.textContent = WebInspector.UIString("Pseudo element");\r
-} else\r
-separatorElement.textContent = styleRule.text;\r
-this.bodyElement.insertBefore(separatorElement, anchorElement);\r
-lastWasSeparator = true;\r
-continue;\r
-}\r
-var computedStyle = styleRule.computedStyle;\r
-\r
-\r
-var editable = styleRule.editable;\r
-if (typeof editable === "undefined")\r
-editable = true;\r
-\r
-if (computedStyle)\r
-var section = new WebInspector.ComputedStylePropertiesSection(styleRule, usedProperties, disabledComputedProperties, styleRules);\r
-else\r
-var section = new WebInspector.StylePropertiesSection(styleRule, editable, styleRule.isInherited, lastWasSeparator);\r
-section.pane = this;\r
-section.expanded = true;\r
-\r
-if (computedStyle) {\r
-this._computedStylePane.bodyElement.appendChild(section.element);\r
-lastWasSeparator = true;\r
-} else {\r
-this.bodyElement.insertBefore(section.element, anchorElement);\r
-lastWasSeparator = false;\r
-}\r
-sections.push(section);\r
-}\r
-return sections;\r
-},\r
-\r
-_containsInherited: function(style)\r
-{\r
-var properties = style.allProperties;\r
-for (var i = 0; i < properties.length; ++i) {\r
-var property = properties[i];\r
-\r
-if (property.isLive && property.name in WebInspector.StylesSidebarPane.InheritedProperties)\r
-return true;\r
-}\r
-return false;\r
-},\r
-\r
-_changeSetting: function(event)\r
-{\r
-var options = this.settingsSelectElement.options;\r
-var selectedOption = options[this.settingsSelectElement.selectedIndex];\r
-selectedOption.action(event);\r
-\r
-\r
-var selectedIndex = 0;\r
-for (var i = 0; i < options.length; ++i) {\r
-if (options[i].value === WebInspector.settings.colorFormat) {\r
-selectedIndex = i;\r
-break;\r
-}\r
-}\r
-\r
-this.settingsSelectElement.selectedIndex = selectedIndex;\r
-},\r
-\r
-_changeColorFormat: function(event)\r
-{\r
-var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex];\r
-WebInspector.settings.colorFormat = selectedOption.value;\r
-\r
-for (var pseudoId in this.sections) {\r
-var sections = this.sections[pseudoId];\r
-for (var i = 0; i < sections.length; ++i)\r
-sections[i].update(true);\r
-}\r
-},\r
-\r
-_createNewRule: function(event)\r
-{\r
-this.addBlankSection().startEditingSelector();\r
-},\r
-\r
-addBlankSection: function()\r
-{\r
-var blankSection = new WebInspector.BlankStylePropertiesSection(appropriateSelectorForNode(this.node, true));\r
-blankSection.pane = this;\r
-\r
-var elementStyleSection = this.sections[0][1];\r
-this.bodyElement.insertBefore(blankSection.element, elementStyleSection.element.nextSibling);\r
-\r
-this.sections[0].splice(2, 0, blankSection);\r
-\r
-return blankSection;\r
-},\r
-\r
-removeSection: function(section)\r
-{\r
-for (var pseudoId in this.sections) {\r
-var sections = this.sections[pseudoId];\r
-var index = sections.indexOf(section);\r
-if (index === -1)\r
-continue;\r
-sections.splice(index, 1);\r
-if (section.element.parentNode)\r
-section.element.parentNode.removeChild(section.element);\r
-}\r
-},\r
-\r
-registerShortcuts: function()\r
-{\r
-var section = WebInspector.shortcutsHelp.section(WebInspector.UIString("Styles Pane"));\r
-var shortcut = WebInspector.KeyboardShortcut;\r
-var keys = [\r
-shortcut.shortcutToString(shortcut.Keys.Tab),\r
-shortcut.shortcutToString(shortcut.Keys.Tab, shortcut.Modifiers.Shift)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Next/previous property"));\r
-keys = [\r
-shortcut.shortcutToString(shortcut.Keys.Up),\r
-shortcut.shortcutToString(shortcut.Keys.Down)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Increment/decrement value"));\r
-keys = [\r
-shortcut.shortcutToString(shortcut.Keys.Up, shortcut.Modifiers.Shift),\r
-shortcut.shortcutToString(shortcut.Keys.Down, shortcut.Modifiers.Shift)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Increment/decrement by %f", 10));\r
-keys = [\r
-shortcut.shortcutToString(shortcut.Keys.PageUp),\r
-shortcut.shortcutToString(shortcut.Keys.PageDown)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Increment/decrement by %f", 10));\r
-keys = [\r
-shortcut.shortcutToString(shortcut.Keys.PageUp, shortcut.Modifiers.Shift),\r
-shortcut.shortcutToString(shortcut.Keys.PageDown, shortcut.Modifiers.Shift)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Increment/decrement by %f", 100));\r
-keys = [\r
-shortcut.shortcutToString(shortcut.Keys.PageUp, shortcut.Modifiers.Alt),\r
-shortcut.shortcutToString(shortcut.Keys.PageDown, shortcut.Modifiers.Alt)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Increment/decrement by %f", 0.1));\r
-}\r
-}\r
-\r
-WebInspector.StylesSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-WebInspector.ComputedStyleSidebarPane = function()\r
-{\r
-WebInspector.SidebarPane.call(this, WebInspector.UIString("Computed Style"));\r
-var showInheritedCheckbox = new WebInspector.Checkbox(WebInspector.UIString("Show inherited"), "sidebar-pane-subtitle");\r
-this.titleElement.appendChild(showInheritedCheckbox.element);\r
-\r
-if (WebInspector.settings.showInheritedComputedStyleProperties) {\r
-this.bodyElement.addStyleClass("show-inherited");\r
-showInheritedCheckbox.checked = true;\r
-}\r
-\r
-function showInheritedToggleFunction(event)\r
-{\r
-WebInspector.settings.showInheritedComputedStyleProperties = showInheritedCheckbox.checked;\r
-if (WebInspector.settings.showInheritedComputedStyleProperties)\r
-this.bodyElement.addStyleClass("show-inherited");\r
-else\r
-this.bodyElement.removeStyleClass("show-inherited");\r
-}\r
-\r
-showInheritedCheckbox.addEventListener(showInheritedToggleFunction.bind(this));\r
-}\r
-\r
-WebInspector.ComputedStyleSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-WebInspector.StylePropertiesSection = function(styleRule, editable, isInherited, isFirstSection)\r
-{\r
-WebInspector.PropertiesSection.call(this, "");\r
-this.element.className = "styles-section monospace" + (isFirstSection ? " first-styles-section" : "");\r
-\r
-this._selectorElement = document.createElement("span");\r
-this._selectorElement.textContent = styleRule.selectorText;\r
-this.titleElement.appendChild(this._selectorElement);\r
-if (Preferences.debugMode)\r
-this._selectorElement.addEventListener("click", this._debugShowStyle.bind(this), false);\r
-\r
-var openBrace = document.createElement("span");\r
-openBrace.textContent = " {";\r
-this.titleElement.appendChild(openBrace);\r
-\r
-var closeBrace = document.createElement("div");\r
-closeBrace.textContent = "}";\r
-this.element.appendChild(closeBrace);\r
-\r
-this._selectorElement.addEventListener("dblclick", this._handleSelectorDoubleClick.bind(this), false);\r
-this.element.addEventListener("dblclick", this._handleEmptySpaceDoubleClick.bind(this), false);\r
-\r
-this.styleRule = styleRule;\r
-this.rule = this.styleRule.rule;\r
-this.editable = editable;\r
-this.isInherited = isInherited;\r
-\r
-\r
-var isUserAgent = this.rule && this.rule.isUserAgent;\r
-var isUser = this.rule && this.rule.isUser;\r
-var isViaInspector = this.rule && this.rule.isViaInspector;\r
-\r
-if (isUserAgent || isUser)\r
-this.editable = false;\r
-\r
-this._usedProperties = styleRule.usedProperties;\r
-\r
-if (this.rule)\r
-this.titleElement.addStyleClass("styles-selector");\r
-\r
-function linkifyUncopyable(url, line)\r
-{\r
-var link = WebInspector.linkifyResourceAsNode(url, "resources", line + 1);\r
-link.setAttribute("data-uncopyable", link.textContent);\r
-link.textContent = "";\r
-return link;\r
-}\r
-\r
-var subtitle = "";\r
-if (this.styleRule.sourceURL)\r
-this.subtitleElement.appendChild(linkifyUncopyable(this.styleRule.sourceURL, this.rule.sourceLine));\r
-else if (isUserAgent)\r
-subtitle = WebInspector.UIString("user agent stylesheet");\r
-else if (isUser)\r
-subtitle = WebInspector.UIString("user stylesheet");\r
-else if (isViaInspector)\r
-subtitle = WebInspector.UIString("via inspector");\r
-else if (this.rule && this.rule.sourceURL)\r
-this.subtitleElement.appendChild(linkifyUncopyable(this.rule.sourceURL, this.rule.sourceLine));\r
-\r
-if (isInherited)\r
-this.element.addStyleClass("show-inherited"); \r
-if (subtitle)\r
-this.subtitle = subtitle;\r
-\r
-this.identifier = styleRule.selectorText;\r
-if (this.subtitle)\r
-this.identifier += ":" + this.subtitle;\r
-\r
-if (!this.editable)\r
-this.element.addStyleClass("read-only");\r
-}\r
-\r
-WebInspector.StylePropertiesSection.prototype = {\r
-collapse: function(dontRememberState)\r
-{\r
-\r
-},\r
-\r
-isPropertyInherited: function(propertyName)\r
-{\r
-if (this.isInherited) {\r
-\r
-\r
-return !(propertyName in WebInspector.StylesSidebarPane.InheritedProperties);\r
-}\r
-return false;\r
-},\r
-\r
-isPropertyOverloaded: function(propertyName, shorthand)\r
-{\r
-if (!this._usedProperties || this.noAffect)\r
-return false;\r
-\r
-if (this.isInherited && !(propertyName in WebInspector.StylesSidebarPane.InheritedProperties)) {\r
-\r
-return false;\r
-}\r
-\r
-var used = (propertyName in this._usedProperties);\r
-if (used || !shorthand)\r
-return !used;\r
-\r
-\r
-\r
-var longhandProperties = this.styleRule.style.getLonghandProperties(propertyName);\r
-for (var j = 0; j < longhandProperties.length; ++j) {\r
-var individualProperty = longhandProperties[j];\r
-if (individualProperty.name in this._usedProperties)\r
-return false;\r
-}\r
-\r
-return true;\r
-},\r
-\r
-nextEditableSibling: function()\r
-{\r
-var curSection = this;\r
-do {\r
-curSection = curSection.nextSibling;\r
-} while (curSection && !curSection.editable);\r
-\r
-return curSection;\r
-},\r
-\r
-previousEditableSibling: function()\r
-{\r
-var curSection = this;\r
-do {\r
-curSection = curSection.previousSibling;\r
-} while (curSection && !curSection.editable);\r
-\r
-return curSection;\r
-},\r
-\r
-update: function(full)\r
-{\r
-if (full) {\r
-this.propertiesTreeOutline.removeChildren();\r
-this.populated = false;\r
-} else {\r
-var child = this.propertiesTreeOutline.children[0];\r
-while (child) {\r
-child.overloaded = this.isPropertyOverloaded(child.name, child.shorthand);\r
-child = child.traverseNextTreeElement(false, null, true);\r
-}\r
-}\r
-this.afterUpdate();\r
-},\r
-\r
-afterUpdate: function()\r
-{\r
-if (this._afterUpdate) {\r
-this._afterUpdate(this);\r
-delete this._afterUpdate;\r
-}\r
-},\r
-\r
-onpopulate: function()\r
-{\r
-var style = this.styleRule.style;\r
-\r
-var handledProperties = {};\r
-var shorthandNames = {};\r
-\r
-this.uniqueProperties = [];\r
-var allProperties = style.allProperties;\r
-for (var i = 0; i < allProperties.length; ++i)\r
-this.uniqueProperties.push(allProperties[i]);\r
-\r
-\r
-for (var i = 0; i < this.uniqueProperties.length; ++i) {\r
-var property = this.uniqueProperties[i];\r
-if (property.disabled)\r
-continue;\r
-if (property.shorthand)\r
-shorthandNames[property.shorthand] = true;\r
-}\r
-\r
-\r
-for (var i = 0; i < this.uniqueProperties.length; ++i) {\r
-var property = this.uniqueProperties[i];\r
-var disabled = property.disabled;\r
-if (!disabled && this.disabledComputedProperties && !(property.name in this.usedProperties) && property.name in this.disabledComputedProperties)\r
-disabled = true;\r
-\r
-var shorthand = !disabled ? property.shorthand : null;\r
-\r
-if (shorthand && shorthand in handledProperties)\r
-continue;\r
-\r
-if (shorthand) {\r
-property = style.getLiveProperty(shorthand);\r
-if (!property)\r
-property = new WebInspector.CSSProperty(style, style.allProperties.length, shorthand, style.getShorthandValue(shorthand), style.getShorthandPriority(shorthand), "style", true, true, "");\r
-}\r
-\r
-var isShorthand = !!(property.isLive && (shorthand || shorthandNames[property.name]));\r
-var inherited = this.isPropertyInherited(property.name);\r
-var overloaded = this.isPropertyOverloaded(property.name, isShorthand);\r
-\r
-var item = new WebInspector.StylePropertyTreeElement(this.styleRule, style, property, isShorthand, inherited, overloaded);\r
-this.propertiesTreeOutline.appendChild(item);\r
-handledProperties[property.name] = property;\r
-}\r
-},\r
-\r
-findTreeElementWithName: function(name)\r
-{\r
-var treeElement = this.propertiesTreeOutline.children[0];\r
-while (treeElement) {\r
-if (treeElement.name === name)\r
-return treeElement;\r
-treeElement = treeElement.traverseNextTreeElement(true, null, true);\r
-}\r
-return null;\r
-},\r
-\r
-addNewBlankProperty: function(optionalIndex)\r
-{\r
-var style = this.styleRule.style;\r
-var property = style.newBlankProperty();\r
-var item = new WebInspector.StylePropertyTreeElement(this.styleRule, style, property, false, false, false);\r
-this.propertiesTreeOutline.appendChild(item);\r
-item.listItemElement.textContent = "";\r
-item._newProperty = true;\r
-item.updateTitle();\r
-return item;\r
-},\r
-\r
-_debugShowStyle: function(anchor)\r
-{\r
-var boundHandler;\r
-function removeStyleBox(element, event)\r
-{\r
-if (event.target === element) {\r
-event.stopPropagation();\r
-return;\r
-}\r
-document.body.removeChild(element);\r
-document.getElementById("main").removeEventListener("mousedown", boundHandler, true);\r
-}\r
-\r
-if (!event.shiftKey)\r
-return;\r
-\r
-var container = document.createElement("div");\r
-var element = document.createElement("span");\r
-container.appendChild(element);\r
-element.style.background = "yellow";\r
-element.style.display = "inline-block";\r
-container.style.cssText = "z-index: 2000000; position: absolute; top: 50px; left: 50px; white-space: pre; overflow: auto; background: white; font-family: monospace; font-size: 12px; border: 1px solid black; opacity: 0.85; -webkit-user-select: text; padding: 2px;";\r
-container.style.width = (document.body.offsetWidth - 100) + "px";\r
-container.style.height = (document.body.offsetHeight - 100) + "px";\r
-document.body.appendChild(container);\r
-if (this.rule)\r
-element.textContent = this.rule.selectorText + " {" + ((this.styleRule.style.cssText !== undefined) ? this.styleRule.style.cssText : "<no cssText>") + "}";\r
-else\r
-element.textContent = this.styleRule.style.cssText;\r
-boundHandler = removeStyleBox.bind(null, container);\r
-document.getElementById("main").addEventListener("mousedown", boundHandler, true);\r
-},\r
-\r
-_handleEmptySpaceDoubleClick: function(event)\r
-{\r
-if (event.target.hasStyleClass("header")) {\r
-event.stopPropagation();\r
-return;\r
-}\r
-this.expand();\r
-this.addNewBlankProperty().startEditing();\r
-},\r
-\r
-_handleSelectorClick: function(event)\r
-{\r
-event.stopPropagation();\r
-},\r
-\r
-_handleSelectorDoubleClick: function(event)\r
-{\r
-this._startEditingOnMouseEvent();\r
-event.stopPropagation();\r
-},\r
-\r
-_startEditingOnMouseEvent: function()\r
-{\r
-if (!this.editable)\r
-return;\r
-\r
-if (!this.rule && this.propertiesTreeOutline.children.length === 0) {\r
-this.expand();\r
-this.addNewBlankProperty().startEditing();\r
-return;\r
-}\r
-\r
-if (!this.rule)\r
-return;\r
-\r
-this.startEditingSelector();\r
-},\r
-\r
-startEditingSelector: function()\r
-{\r
-var element = this._selectorElement;\r
-if (WebInspector.isBeingEdited(element))\r
-return;\r
-\r
-WebInspector.startEditing(this._selectorElement, {\r
-context: null,\r
-commitHandler: this.editingSelectorCommitted.bind(this),\r
-cancelHandler: this.editingSelectorCancelled.bind(this)\r
-});\r
-window.getSelection().setBaseAndExtent(element, 0, element, 1);\r
-},\r
-\r
-editingSelectorCommitted: function(element, newContent, oldContent, context, moveDirection)\r
-{\r
-function moveToNextIfNeeded() {\r
-if (!moveDirection)\r
-return;\r
-\r
-if (moveDirection === "forward") {\r
-this.expand();\r
-if (this.propertiesTreeOutline.children.length === 0)\r
-this.addNewBlankProperty().startEditing();\r
-else {\r
-var item = this.propertiesTreeOutline.children[0]\r
-item.startEditing(item.nameElement);\r
-}\r
-} else {\r
-var previousSection = this.previousEditableSibling();\r
-if (!previousSection)\r
-return;\r
-\r
-previousSection.expand();\r
-previousSection.addNewBlankProperty().startEditing();\r
-}\r
-}\r
-\r
-if (newContent === oldContent)\r
-return moveToNextIfNeeded.call(this);\r
-\r
-var self = this;\r
-\r
-function successCallback(newRule, doesAffectSelectedNode)\r
-{\r
-if (!doesAffectSelectedNode) {\r
-self.noAffect = true;\r
-self.element.addStyleClass("no-affect");\r
-} else {\r
-delete self.noAffect;\r
-self.element.removeStyleClass("no-affect");\r
-}\r
-\r
-self.rule = newRule;\r
-self.styleRule = { section: self, style: newRule.style, selectorText: newRule.selectorText, sourceURL: newRule.sourceURL, rule: newRule };\r
-\r
-var oldIdentifier = this.identifier;\r
-self.identifier = newRule.selectorText + ":" + self.subtitleElement.textContent;\r
-\r
-self.pane.update();\r
-\r
-WebInspector.panels.elements.renameSelector(oldIdentifier, this.identifier, oldContent, newContent);\r
-\r
-moveToNextIfNeeded.call(self);\r
-}\r
-\r
-var focusedNode = WebInspector.panels.elements.focusedDOMNode;\r
-WebInspector.cssModel.setRuleSelector(this.rule.id, focusedNode ? focusedNode.id : 0, newContent, successCallback, moveToNextIfNeeded.bind(this));\r
-},\r
-\r
-editingSelectorCancelled: function()\r
-{\r
-\r
-}\r
-}\r
-\r
-WebInspector.StylePropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;\r
-\r
-WebInspector.ComputedStylePropertiesSection = function(styleRule, usedProperties, disabledComputedProperties)\r
-{\r
-WebInspector.PropertiesSection.call(this, "");\r
-this.headerElement.addStyleClass("hidden");\r
-this.element.className = "styles-section monospace first-styles-section read-only computed-style";\r
-this.styleRule = styleRule;\r
-this._usedProperties = usedProperties;\r
-this._disabledComputedProperties = disabledComputedProperties;\r
-this._alwaysShowComputedProperties = { "display": true, "height": true, "width": true };\r
-this.computedStyle = true;\r
-this._propertyTreeElements = {};\r
-this._expandedPropertyNames = {};\r
-}\r
-\r
-WebInspector.ComputedStylePropertiesSection.prototype = {\r
-collapse: function(dontRememberState)\r
-{\r
-\r
-},\r
-\r
-_isPropertyInherited: function(propertyName)\r
-{\r
-return !(propertyName in this._usedProperties) && !(propertyName in this._alwaysShowComputedProperties) && !(propertyName in this._disabledComputedProperties);\r
-},\r
-\r
-update: function()\r
-{\r
-this._expandedPropertyNames = {};\r
-for (var name in this._propertyTreeElements) {\r
-if (this._propertyTreeElements[name].expanded)\r
-this._expandedPropertyNames[name] = true;\r
-}\r
-this._propertyTreeElements = {};\r
-this.propertiesTreeOutline.removeChildren();\r
-this.populated = false;\r
-},\r
-\r
-onpopulate: function()\r
-{\r
-function sorter(a, b)\r
-{\r
-return a.name.localeCompare(b.name);\r
-}\r
-\r
-var style = this.styleRule.style;\r
-var uniqueProperties = [];\r
-var allProperties = style.allProperties;\r
-for (var i = 0; i < allProperties.length; ++i)\r
-uniqueProperties.push(allProperties[i]);\r
-uniqueProperties.sort(sorter);\r
-\r
-this._propertyTreeElements = {};\r
-for (var i = 0; i < uniqueProperties.length; ++i) {\r
-var property = uniqueProperties[i];\r
-var inherited = this._isPropertyInherited(property.name);\r
-var item = new WebInspector.StylePropertyTreeElement(this.styleRule, style, property, false, inherited, false);\r
-this.propertiesTreeOutline.appendChild(item);\r
-this._propertyTreeElements[property.name] = item;\r
-}\r
-},\r
-\r
-rebuildComputedTrace: function(sections)\r
-{\r
-for (var i = 0; i < sections.length; ++i) {\r
-var section = sections[i];\r
-if (section.computedStyle || section instanceof WebInspector.BlankStylePropertiesSection)\r
-continue;\r
-\r
-for (var j = 0; j < section.uniqueProperties.length; ++j) {\r
-var property = section.uniqueProperties[j];\r
-if (property.disabled)\r
-continue;\r
-if (section.isInherited && !(property.name in WebInspector.StylesSidebarPane.InheritedProperties))\r
-continue;\r
-\r
-var treeElement = this._propertyTreeElements[property.name];\r
-if (treeElement) {\r
-var selectorText = section.styleRule.selectorText;\r
-var value = property.value;\r
-var title = "<span style='color: gray'>" + selectorText + "</span> - " + value;\r
-var subtitle = " <span style='float:right'>" + section.subtitleElement.innerHTML + "</span>";\r
-var childElement = new TreeElement(null, null, false);\r
-childElement.titleHTML = title + subtitle;\r
-treeElement.appendChild(childElement);\r
-if (section.isPropertyOverloaded(property.name))\r
-childElement.listItemElement.addStyleClass("overloaded");\r
-}\r
-}\r
-}\r
-\r
-\r
-for (var name in this._expandedPropertyNames) {\r
-if (name in this._propertyTreeElements)\r
-this._propertyTreeElements[name].expand();\r
-}\r
-}\r
-}\r
-\r
-WebInspector.ComputedStylePropertiesSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;\r
-\r
-WebInspector.BlankStylePropertiesSection = function(defaultSelectorText)\r
-{\r
-WebInspector.StylePropertiesSection.call(this, {selectorText: defaultSelectorText, rule: {isViaInspector: true}}, true, false, false);\r
-this.element.addStyleClass("blank-section");\r
-}\r
-\r
-WebInspector.BlankStylePropertiesSection.prototype = {\r
-expand: function()\r
-{\r
-\r
-},\r
-\r
-editingSelectorCommitted: function(element, newContent, oldContent, context)\r
-{\r
-var self = this;\r
-function successCallback(newRule, doesSelectorAffectSelectedNode)\r
-{\r
-var styleRule = { section: self, style: newRule.style, selectorText: newRule.selectorText, sourceURL: newRule.sourceURL, rule: newRule };\r
-self.makeNormal(styleRule);\r
-\r
-if (!doesSelectorAffectSelectedNode) {\r
-self.noAffect = true;\r
-self.element.addStyleClass("no-affect");\r
-}\r
-\r
-self.subtitleElement.textContent = WebInspector.UIString("via inspector");\r
-self.expand();\r
-\r
-self.addNewBlankProperty().startEditing();\r
-}\r
-\r
-WebInspector.cssModel.addRule(this.pane.node.id, newContent, successCallback, this.editingSelectorCancelled.bind(this));\r
-},\r
-\r
-editingSelectorCancelled: function()\r
-{\r
-this.pane.removeSection(this);\r
-},\r
-\r
-makeNormal: function(styleRule)\r
-{\r
-this.element.removeStyleClass("blank-section");\r
-this.styleRule = styleRule;\r
-this.rule = styleRule.rule;\r
-this.identifier = styleRule.selectorText + ":via inspector";\r
-this.__proto__ = WebInspector.StylePropertiesSection.prototype;\r
-}\r
-}\r
-\r
-WebInspector.BlankStylePropertiesSection.prototype.__proto__ = WebInspector.StylePropertiesSection.prototype;\r
-\r
-WebInspector.StylePropertyTreeElement = function(styleRule, style, property, shorthand, inherited, overloaded)\r
-{\r
-this._styleRule = styleRule;\r
-this.style = style;\r
-this.property = property;\r
-this.shorthand = shorthand;\r
-this._inherited = inherited;\r
-this._overloaded = overloaded;\r
-\r
-\r
-TreeElement.call(this, "", null, shorthand);\r
-}\r
-\r
-WebInspector.StylePropertyTreeElement.prototype = {\r
-get inherited()\r
-{\r
-return this._inherited;\r
-},\r
-\r
-set inherited(x)\r
-{\r
-if (x === this._inherited)\r
-return;\r
-this._inherited = x;\r
-this.updateState();\r
-},\r
-\r
-get overloaded()\r
-{\r
-return this._overloaded;\r
-},\r
-\r
-set overloaded(x)\r
-{\r
-if (x === this._overloaded)\r
-return;\r
-this._overloaded = x;\r
-this.updateState();\r
-},\r
-\r
-get disabled()\r
-{\r
-return this.property.disabled;\r
-},\r
-\r
-get name()\r
-{\r
-if (!this.disabled || !this.property.text)\r
-return this.property.name;\r
-\r
-var text = this.property.text;\r
-var index = text.indexOf(":");\r
-if (index < 1)\r
-return this.property.name;\r
-\r
-return text.substring(0, index).trim();\r
-},\r
-\r
-get priority()\r
-{\r
-if (this.disabled)\r
-return ""; \r
-return this.property.priority;\r
-},\r
-\r
-get value()\r
-{\r
-if (!this.disabled || !this.property.text)\r
-return this.property.value;\r
-\r
-var match = this.property.text.match(/(.*);\s*/);\r
-if (!match || !match[1])\r
-return this.property.value;\r
-\r
-var text = match[1];\r
-var index = text.indexOf(":");\r
-if (index < 1)\r
-return this.property.value;\r
-\r
-return text.substring(index + 1).trim();\r
-},\r
-\r
-get parsedOk()\r
-{\r
-return this.property.parsedOk;\r
-},\r
-\r
-onattach: function()\r
-{\r
-this.updateTitle();\r
-},\r
-\r
-updateTitle: function()\r
-{\r
-var value = this.value;\r
-\r
-this.updateState();\r
-\r
-var enabledCheckboxElement;\r
-if (this.parsedOk) {\r
-enabledCheckboxElement = document.createElement("input");\r
-enabledCheckboxElement.className = "enabled-button";\r
-enabledCheckboxElement.type = "checkbox";\r
-enabledCheckboxElement.checked = !this.disabled;\r
-enabledCheckboxElement.addEventListener("change", this.toggleEnabled.bind(this), false);\r
-}\r
-\r
-var nameElement = document.createElement("span");\r
-nameElement.className = "webkit-css-property";\r
-nameElement.textContent = this.name;\r
-this.nameElement = nameElement;\r
-\r
-var valueElement = document.createElement("span");\r
-valueElement.className = "value";\r
-this.valueElement = valueElement;\r
-\r
-if (value) {\r
-function processValue(regex, processor, nextProcessor, valueText)\r
-{\r
-var container = document.createDocumentFragment();\r
-\r
-var items = valueText.replace(regex, "\0$1\0").split("\0");\r
-for (var i = 0; i < items.length; ++i) {\r
-if ((i % 2) === 0) {\r
-if (nextProcessor)\r
-container.appendChild(nextProcessor(items[i]));\r
-else\r
-container.appendChild(document.createTextNode(items[i]));\r
-} else {\r
-var processedNode = processor(items[i]);\r
-if (processedNode)\r
-container.appendChild(processedNode);\r
-}\r
-}\r
-\r
-return container;\r
-}\r
-\r
-function linkifyURL(url)\r
-{\r
-var container = document.createDocumentFragment();\r
-container.appendChild(document.createTextNode("url("));\r
-var hasResource = !!WebInspector.resourceForURL(url);\r
-container.appendChild(WebInspector.linkifyURLAsNode(url, url, null, hasResource));\r
-container.appendChild(document.createTextNode(")"));\r
-return container;\r
-}\r
-\r
-function processColor(text)\r
-{\r
-try {\r
-var color = new WebInspector.Color(text);\r
-} catch (e) {\r
-return document.createTextNode(text);\r
-}\r
-\r
-var swatchElement = document.createElement("span");\r
-swatchElement.title = WebInspector.UIString("Click to change color format");\r
-swatchElement.className = "swatch";\r
-swatchElement.style.setProperty("background-color", text);\r
-\r
-swatchElement.addEventListener("click", changeColorDisplay, false);\r
-swatchElement.addEventListener("dblclick", function(event) { event.stopPropagation() }, false);\r
-\r
-var format;\r
-if (WebInspector.settings.colorFormat === "original")\r
-format = "original";\r
-else if (Preferences.showColorNicknames && color.nickname)\r
-format = "nickname";\r
-else if (WebInspector.settings.colorFormat === "rgb")\r
-format = (color.simple ? "rgb" : "rgba");\r
-else if (WebInspector.settings.colorFormat === "hsl")\r
-format = (color.simple ? "hsl" : "hsla");\r
-else if (color.simple)\r
-format = (color.hasShortHex() ? "shorthex" : "hex");\r
-else\r
-format = "rgba";\r
-\r
-var colorValueElement = document.createElement("span");\r
-colorValueElement.textContent = color.toString(format);\r
-\r
-function nextFormat(curFormat)\r
-{\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-switch (curFormat) {\r
-case "original":\r
-return color.simple ? "rgb" : "rgba";\r
-\r
-case "rgb":\r
-case "rgba":\r
-return color.simple ? "hsl" : "hsla";\r
-\r
-case "hsl":\r
-case "hsla":\r
-if (color.nickname)\r
-return "nickname";\r
-if (color.simple)\r
-return color.hasShortHex() ? "shorthex" : "hex";\r
-else\r
-return "original";\r
-\r
-case "shorthex":\r
-return "hex";\r
-\r
-case "hex":\r
-return "original";\r
-\r
-case "nickname":\r
-if (color.simple)\r
-return color.hasShortHex() ? "shorthex" : "hex";\r
-else\r
-return "original";\r
-\r
-default:\r
-return null;\r
-}\r
-}\r
-\r
-function changeColorDisplay(event)\r
-{\r
-do {\r
-format = nextFormat(format);\r
-var currentValue = color.toString(format || "");\r
-} while (format && currentValue === color.value && format !== "original");\r
-\r
-if (format)\r
-colorValueElement.textContent = currentValue;\r
-}\r
-\r
-var container = document.createDocumentFragment();\r
-container.appendChild(swatchElement);\r
-container.appendChild(colorValueElement);\r
-return container;\r
-}\r
-\r
-var colorRegex = /((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b\w+\b(?!-))/g;\r
-var colorProcessor = processValue.bind(window, colorRegex, processColor, null);\r
-\r
-valueElement.appendChild(processValue(/url\(([^)]+)\)/g, linkifyURL, colorProcessor, value));\r
-}\r
-\r
-this.listItemElement.removeChildren();\r
-\r
-if (!this.treeOutline)\r
-return;\r
-\r
-\r
-if (enabledCheckboxElement && this.treeOutline.section && this.treeOutline.section.editable && this.parent.root)\r
-this.listItemElement.appendChild(enabledCheckboxElement);\r
-this.listItemElement.appendChild(nameElement);\r
-this.listItemElement.appendChild(document.createTextNode(": "));\r
-this.listItemElement.appendChild(valueElement);\r
-this.listItemElement.appendChild(document.createTextNode(";"));\r
-\r
-if (!this.parsedOk) {\r
-\r
-this.hasChildren = false;\r
-this.listItemElement.addStyleClass("not-parsed-ok");\r
-}\r
-if (this.property.inactive)\r
-this.listItemElement.addStyleClass("inactive");\r
-\r
-this.tooltip = this.property.propertyText;\r
-},\r
-\r
-updateAll: function(updateAllRules)\r
-{\r
-if (!this.treeOutline)\r
-return;\r
-if (updateAllRules && this.treeOutline.section && this.treeOutline.section.pane)\r
-this.treeOutline.section.pane.update(null, this.treeOutline.section);\r
-else if (this.treeOutline.section)\r
-this.treeOutline.section.update(true);\r
-else\r
-this.updateTitle(); \r
-},\r
-\r
-toggleEnabled: function(event)\r
-{\r
-var disabled = !event.target.checked;\r
-\r
-function callback(newStyle)\r
-{\r
-if (!newStyle)\r
-return;\r
-\r
-this.style = newStyle;\r
-this._styleRule.style = newStyle;\r
-\r
-if (this.treeOutline.section && this.treeOutline.section.pane)\r
-this.treeOutline.section.pane.dispatchEventToListeners("style property toggled");\r
-\r
-this.updateAll(true);\r
-}\r
-\r
-this.property.setDisabled(disabled, callback.bind(this));\r
-},\r
-\r
-updateState: function()\r
-{\r
-if (!this.listItemElement)\r
-return;\r
-\r
-if (this.style.isPropertyImplicit(this.name) || this.value === "initial")\r
-this.listItemElement.addStyleClass("implicit");\r
-else\r
-this.listItemElement.removeStyleClass("implicit");\r
-\r
-this.selectable = !this.inherited;\r
-if (this.inherited)\r
-this.listItemElement.addStyleClass("inherited");\r
-else\r
-this.listItemElement.removeStyleClass("inherited");\r
-\r
-if (this.overloaded)\r
-this.listItemElement.addStyleClass("overloaded");\r
-else\r
-this.listItemElement.removeStyleClass("overloaded");\r
-\r
-if (this.disabled)\r
-this.listItemElement.addStyleClass("disabled");\r
-else\r
-this.listItemElement.removeStyleClass("disabled");\r
-},\r
-\r
-onpopulate: function()\r
-{\r
-\r
-if (this.children.length || !this.shorthand)\r
-return;\r
-\r
-var longhandProperties = this.style.getLonghandProperties(this.name);\r
-for (var i = 0; i < longhandProperties.length; ++i) {\r
-var name = longhandProperties[i].name;\r
-\r
-\r
-if (this.treeOutline.section) {\r
-var inherited = this.treeOutline.section.isPropertyInherited(name);\r
-var overloaded = this.treeOutline.section.isPropertyOverloaded(name);\r
-}\r
-\r
-var liveProperty = this.style.getLiveProperty(name);\r
-var item = new WebInspector.StylePropertyTreeElement(this._styleRule, this.style, liveProperty, false, inherited, overloaded);\r
-this.appendChild(item);\r
-}\r
-},\r
-\r
-ondblclick: function(event)\r
-{\r
-this.startEditing(event.target);\r
-event.stopPropagation();\r
-},\r
-\r
-restoreNameElement: function()\r
-{\r
-\r
-if (this.nameElement === this.listItemElement.querySelector(".webkit-css-property"))\r
-return;\r
-\r
-this.nameElement = document.createElement("span");\r
-this.nameElement.className = "webkit-css-property";\r
-this.nameElement.textContent = "";\r
-this.listItemElement.insertBefore(this.nameElement, this.listItemElement.firstChild);\r
-},\r
-\r
-startEditing: function(selectElement)\r
-{\r
-\r
-if (this.parent.shorthand)\r
-return;\r
-\r
-if (this.treeOutline.section && !this.treeOutline.section.editable)\r
-return;\r
-\r
-if (!selectElement)\r
-selectElement = this.nameElement; \r
-else\r
-selectElement = selectElement.enclosingNodeOrSelfWithClass("webkit-css-property") || selectElement.enclosingNodeOrSelfWithClass("value");\r
-\r
-var isEditingName = selectElement === this.nameElement;\r
-if (!isEditingName && selectElement !== this.valueElement) {\r
-\r
-isEditingName = false;\r
-selectElement = this.valueElement;\r
-}\r
-\r
-if (WebInspector.isBeingEdited(selectElement))\r
-return;\r
-\r
-var context = {\r
-expanded: this.expanded,\r
-hasChildren: this.hasChildren,\r
-keyDownListener: isEditingName ? this.editingNameKeyDown.bind(this) : this.editingValueKeyDown.bind(this),\r
-keyPressListener: isEditingName ? this.editingNameKeyPress.bind(this) : this.editingValueKeyPress.bind(this),\r
-isEditingName: isEditingName,\r
-};\r
-\r
-\r
-this.hasChildren = false;\r
-\r
-selectElement.addEventListener("keydown", context.keyDownListener, false);\r
-selectElement.addEventListener("keypress", context.keyPressListener, false);\r
-if (selectElement.parentElement)\r
-selectElement.parentElement.addStyleClass("child-editing");\r
-selectElement.textContent = selectElement.textContent; \r
-\r
-function shouldCommitValueSemicolon(text, cursorPosition)\r
-{\r
-\r
-var openQuote = "";\r
-for (var i = 0; i < cursorPosition; ++i) {\r
-var ch = text[i];\r
-if (ch === "\\" && openQuote !== "")\r
-++i; \r
-else if (!openQuote && (ch === "\"" || ch === "'"))\r
-openQuote = ch;\r
-else if (openQuote === ch)\r
-openQuote = "";\r
-}\r
-return !openQuote;\r
-}\r
-\r
-function nameValueFinishHandler(context, isEditingName, event)\r
-{\r
-\r
-var isFieldInputTerminated = (event.keyCode === WebInspector.KeyboardShortcut.Keys.Semicolon.code) &&\r
-(isEditingName ? event.shiftKey : (!event.shiftKey && shouldCommitValueSemicolon(event.target.textContent, event.target.selectionLeftOffset)));\r
-if (isEnterKey(event) || isFieldInputTerminated) {\r
-\r
-event.preventDefault();\r
-return "move-forward";\r
-} else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code)\r
-return "cancel";\r
-else if (event.keyIdentifier === "U+0009") \r
-return "move-" + (event.shiftKey ? "backward" : "forward");\r
-}\r
-\r
-WebInspector.startEditing(selectElement, {\r
-context: context,\r
-commitHandler: this.editingCommitted.bind(this),\r
-cancelHandler: this.editingCancelled.bind(this),\r
-customFinishHandler: nameValueFinishHandler.bind(this, context, isEditingName)\r
-});\r
-window.getSelection().setBaseAndExtent(selectElement, 0, selectElement, 1);\r
-},\r
-\r
-editingNameKeyPress: function(event)\r
-{\r
-\r
-var character = event.data.toLowerCase();\r
-if (character && /[a-z-]/.test(character)) {\r
-var selection = window.getSelection();\r
-var prefix = selection.anchorNode.textContent.substring(0, selection.anchorOffset);\r
-var property = WebInspector.cssNameCompletions.firstStartsWith(prefix + character);\r
-\r
-if (!selection.isCollapsed)\r
-selection.deleteFromDocument();\r
-\r
-this.restoreNameElement();\r
-\r
-if (property) {\r
-if (property !== this.nameElement.textContent)\r
-this.nameElement.textContent = property;\r
-this.nameElement.firstChild.select(prefix.length + 1);\r
-event.preventDefault();\r
-}\r
-}\r
-},\r
-\r
-editingValueKeyPress: function(event)\r
-{\r
-\r
-},\r
-\r
-editingNameKeyDown: function(event)\r
-{\r
-var showNext;\r
-if (event.keyIdentifier === "Up")\r
-showNext = false;\r
-else if (event.keyIdentifier === "Down")\r
-showNext = true;\r
-else\r
-return;\r
-\r
-var selection = window.getSelection();\r
-if (!selection.rangeCount)\r
-return;\r
-\r
-var selectionRange = selection.getRangeAt(0);\r
-if (selectionRange.commonAncestorContainer !== this.nameElement && !selectionRange.commonAncestorContainer.isDescendant(this.nameElement))\r
-return;\r
-\r
-const styleValueDelimeters = " \t\n\"':;,/()";\r
-var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, styleValueDelimeters, this.nameElement);\r
-var wordString = wordRange.toString();\r
-var cursorPosition = selectionRange.startOffset != selectionRange.endOffset ? selectionRange.startOffset : 0;\r
-var prefix = selectionRange.startContainer.textContent.substring(0, cursorPosition);\r
-var property;\r
-\r
-if (showNext)\r
-property = WebInspector.cssNameCompletions.next(wordString, prefix);\r
-else\r
-property = WebInspector.cssNameCompletions.previous(wordString, prefix);\r
-\r
-if (property) {\r
-this.nameElement.textContent = property;\r
-this.nameElement.firstChild.select(cursorPosition);\r
-}\r
-event.preventDefault();\r
-},\r
-\r
-editingValueKeyDown: function(event)\r
-{\r
-var arrowKeyPressed = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down");\r
-var pageKeyPressed = (event.keyIdentifier === "PageUp" || event.keyIdentifier === "PageDown");\r
-if (!arrowKeyPressed && !pageKeyPressed)\r
-return;\r
-\r
-var selection = window.getSelection();\r
-if (!selection.rangeCount)\r
-return;\r
-\r
-var selectionRange = selection.getRangeAt(0);\r
-if (selectionRange.commonAncestorContainer !== this.valueElement && !selectionRange.commonAncestorContainer.isDescendant(this.valueElement))\r
-return;\r
-\r
-const styleValueDelimeters = " \t\n\"':;,/()";\r
-var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, styleValueDelimeters, this.valueElement);\r
-var wordString = wordRange.toString();\r
-var replacementString = wordString;\r
-\r
-var matches = /(.*?)(-?\d+(?:\.\d+)?)(.*)/.exec(wordString);\r
-if (matches && matches.length) {\r
-var prefix = matches[1];\r
-var number = parseFloat(matches[2]);\r
-var suffix = matches[3];\r
-\r
-\r
-var numberNearZero = (number < 1 && number > -1);\r
-if (number === 1 && event.keyIdentifier === "Down")\r
-numberNearZero = true;\r
-else if (number === -1 && event.keyIdentifier === "Up")\r
-numberNearZero = true;\r
-\r
-if (numberNearZero && event.altKey && arrowKeyPressed) {\r
-if (event.keyIdentifier === "Down")\r
-number = Math.ceil(number - 1);\r
-else\r
-number = Math.floor(number + 1);\r
-} else {\r
-\r
-\r
-var changeAmount = 1;\r
-if (event.shiftKey && pageKeyPressed)\r
-changeAmount = 100;\r
-else if (event.shiftKey || pageKeyPressed)\r
-changeAmount = 10;\r
-else if (event.altKey || numberNearZero)\r
-changeAmount = 0.1;\r
-\r
-if (event.keyIdentifier === "Down" || event.keyIdentifier === "PageDown")\r
-changeAmount *= -1;\r
-\r
-\r
-\r
-number = Number((number + changeAmount).toFixed(6));\r
-}\r
-\r
-replacementString = prefix + number + suffix;\r
-} else {\r
-\r
-}\r
-\r
-var replacementTextNode = document.createTextNode(replacementString);\r
-\r
-wordRange.deleteContents();\r
-wordRange.insertNode(replacementTextNode);\r
-\r
-var finalSelectionRange = document.createRange();\r
-finalSelectionRange.setStart(replacementTextNode, 0);\r
-finalSelectionRange.setEnd(replacementTextNode, replacementString.length);\r
-\r
-selection.removeAllRanges();\r
-selection.addRange(finalSelectionRange);\r
-\r
-event.preventDefault();\r
-\r
-if (!("originalPropertyText" in this)) {\r
-\r
-\r
-this.originalPropertyText = this.property.propertyText;\r
-}\r
-\r
-\r
-this.applyStyleText(this.nameElement.textContent + ": " + this.valueElement.textContent);\r
-},\r
-\r
-editingEnded: function(context)\r
-{\r
-this.hasChildren = context.hasChildren;\r
-if (context.expanded)\r
-this.expand();\r
-var editedElement = context.isEditingName ? this.nameElement : this.valueElement;\r
-editedElement.removeEventListener("keydown", context.keyDownListener, false);\r
-editedElement.removeEventListener("keypress", context.keyPressListener, false);\r
-if (editedElement.parentElement)\r
-editedElement.parentElement.removeStyleClass("child-editing");\r
-\r
-delete this.originalPropertyText;\r
-},\r
-\r
-editingCancelled: function(element, context)\r
-{\r
-if ("originalPropertyText" in this)\r
-this.applyStyleText(this.originalPropertyText, true);\r
-else {\r
-if (this._newProperty)\r
-this.treeOutline.removeChild(this);\r
-else\r
-this.updateTitle();\r
-}\r
-this.editingEnded(context);\r
-},\r
-\r
-editingCommitted: function(element, userInput, previousContent, context, moveDirection)\r
-{\r
-this.editingEnded(context);\r
-var isEditingName = context.isEditingName;\r
-\r
-\r
-var createNewProperty, moveToPropertyName, moveToSelector;\r
-var moveTo = this;\r
-var moveToOther = (isEditingName ^ (moveDirection === "forward"));\r
-var abandonNewProperty = this._newProperty && !userInput && (moveToOther || isEditingName);\r
-if (moveDirection === "forward" && !isEditingName || moveDirection === "backward" && isEditingName) {\r
-do {\r
-moveTo = (moveDirection === "forward" ? moveTo.nextSibling : moveTo.previousSibling);\r
-} while(moveTo && !moveTo.selectable);\r
-\r
-if (moveTo)\r
-moveToPropertyName = moveTo.name;\r
-else if (moveDirection === "forward" && (!this._newProperty || userInput))\r
-createNewProperty = true;\r
-else if (moveDirection === "backward" && this.treeOutline.section.rule)\r
-moveToSelector = true;\r
-}\r
-\r
-\r
-var blankInput = /^\s*$/.test(userInput);\r
-var shouldCommitNewProperty = this._newProperty && (moveToOther || (!moveDirection && !isEditingName) || (isEditingName && blankInput));\r
-\r
-if ((userInput !== previousContent && !this._newProperty) || shouldCommitNewProperty) {\r
-this.treeOutline.section._afterUpdate = moveToNextCallback.bind(this, this._newProperty, !blankInput, this.treeOutline.section);\r
-var propertyText;\r
-if (blankInput || (this._newProperty && /^\s*$/.test(this.valueElement.textContent)))\r
-propertyText = "";\r
-else {\r
-if (isEditingName)\r
-propertyText = userInput + ": " + this.valueElement.textContent;\r
-else\r
-propertyText = this.nameElement.textContent + ": " + userInput;\r
-}\r
-this.applyStyleText(propertyText, true);\r
-} else {\r
-if (!this._newProperty)\r
-this.updateTitle();\r
-moveToNextCallback(this._newProperty, false, this.treeOutline.section);\r
-}\r
-\r
-var moveToIndex = moveTo && this.treeOutline ? this.treeOutline.children.indexOf(moveTo) : -1;\r
-\r
-\r
-function moveToNextCallback(alreadyNew, valueChanged, section)\r
-{\r
-if (!moveDirection)\r
-return;\r
-\r
-\r
-if (moveTo && moveTo.parent) {\r
-moveTo.startEditing(!isEditingName ? moveTo.nameElement : moveTo.valueElement);\r
-return;\r
-}\r
-\r
-\r
-\r
-if (moveTo && !moveTo.parent) {\r
-var propertyElements = section.propertiesTreeOutline.children;\r
-if (moveDirection === "forward" && blankInput && !isEditingName)\r
---moveToIndex;\r
-if (moveToIndex >= propertyElements.length && !this._newProperty)\r
-createNewProperty = true;\r
-else {\r
-var treeElement = moveToIndex >= 0 ? propertyElements[moveToIndex] : null;\r
-if (treeElement) {\r
-treeElement.startEditing(!isEditingName ? treeElement.nameElement : treeElement.valueElement);\r
-return;\r
-} else if (!alreadyNew)\r
-moveToSelector = true;\r
-}\r
-}\r
-\r
-\r
-if (createNewProperty) {\r
-if (alreadyNew && !valueChanged && (isEditingName ^ (moveDirection === "backward")))\r
-return;\r
-\r
-section.addNewBlankProperty().startEditing();\r
-return;\r
-}\r
-\r
-if (abandonNewProperty) {\r
-var sectionToEdit = moveDirection === "backward" ? section : section.nextEditableSibling();\r
-if (sectionToEdit && sectionToEdit.rule)\r
-sectionToEdit.startEditingSelector();\r
-return;\r
-}\r
-\r
-if (moveToSelector)\r
-section.startEditingSelector();\r
-}\r
-},\r
-\r
-applyStyleText: function(styleText, updateInterface)\r
-{\r
-var section = this.treeOutline.section;\r
-var elementsPanel = WebInspector.panels.elements;\r
-styleText = styleText.replace(/\s/g, " ").trim(); \r
-var styleTextLength = styleText.length;\r
-if (!styleTextLength && updateInterface && this._newProperty) {\r
-\r
-this.parent.removeChild(this);\r
-section.afterUpdate();\r
-return;\r
-}\r
-\r
-function callback(newStyle)\r
-{\r
-if (!newStyle) {\r
-\r
-\r
-\r
-if (this._newProperty) {\r
-this.parent.removeChild(this);\r
-return;\r
-}\r
-if (updateInterface)\r
-this.updateTitle();\r
-return;\r
-}\r
-\r
-this.style = newStyle;\r
-this.property = newStyle.propertyAt(this.property.index);\r
-this._styleRule.style = this.style;\r
-\r
-if (section && section.pane)\r
-section.pane.dispatchEventToListeners("style edited");\r
-\r
-if (updateInterface)\r
-this.updateAll(true);\r
-}\r
-\r
-\r
-\r
-if (styleText.length && !/;\s*$/.test(styleText))\r
-styleText += ";";\r
-this.property.setText(styleText, updateInterface, callback.bind(this));\r
-}\r
-}\r
-\r
-WebInspector.StylePropertyTreeElement.prototype.__proto__ = TreeElement.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.PanelEnablerView = function(identifier, headingText, disclaimerText, buttonTitle)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("panel-enabler-view");\r
-this.element.addStyleClass(identifier);\r
-\r
-this.contentElement = document.createElement("div");\r
-this.contentElement.className = "panel-enabler-view-content";\r
-this.element.appendChild(this.contentElement);\r
-\r
-this.imageElement = document.createElement("img");\r
-this.contentElement.appendChild(this.imageElement);\r
-\r
-this.choicesForm = document.createElement("form");\r
-this.contentElement.appendChild(this.choicesForm);\r
-\r
-this.headerElement = document.createElement("h1");\r
-this.headerElement.textContent = headingText;\r
-this.choicesForm.appendChild(this.headerElement);\r
-\r
-var self = this;\r
-function enableOption(text, checked) {\r
-var label = document.createElement("label");\r
-var option = document.createElement("input");\r
-option.type = "radio";\r
-option.name = "enable-option";\r
-if (checked)\r
-option.checked = true;\r
-label.appendChild(option);\r
-label.appendChild(document.createTextNode(text));\r
-self.choicesForm.appendChild(label);\r
-return option;\r
-};\r
-\r
-this.enabledForSession = enableOption(WebInspector.UIString("Only enable for this session"), true);\r
-this.enabledAlways = enableOption(WebInspector.UIString("Always enable"));\r
-\r
-this.disclaimerElement = document.createElement("div");\r
-this.disclaimerElement.className = "panel-enabler-disclaimer";\r
-this.disclaimerElement.textContent = disclaimerText;\r
-this.choicesForm.appendChild(this.disclaimerElement);\r
-\r
-this.enableButton = document.createElement("button");\r
-this.enableButton.setAttribute("type", "button");\r
-this.enableButton.textContent = buttonTitle;\r
-this.enableButton.addEventListener("click", this._enableButtonCicked.bind(this), false);\r
-this.choicesForm.appendChild(this.enableButton);\r
-}\r
-\r
-WebInspector.PanelEnablerView.prototype = {\r
-_enableButtonCicked: function()\r
-{\r
-this.dispatchEventToListeners("enable clicked");\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-\r
-setTimeout(this.resize.bind(this), 0);\r
-},\r
-\r
-resize: function()\r
-{\r
-this.imageElement.removeStyleClass("hidden");\r
-\r
-if (this.element.offsetWidth < (this.choicesForm.offsetWidth + this.imageElement.offsetWidth))\r
-this.imageElement.addStyleClass("hidden");\r
-},\r
-\r
-get alwaysEnabled() {\r
-return this.enabledAlways.checked;\r
-}\r
-}\r
-\r
-WebInspector.PanelEnablerView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.WelcomeView = function(identifier, headingText, instructionsText)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("panel-enabler-view");\r
-this.element.addStyleClass(identifier);\r
-this.element.addStyleClass("welcome");\r
-\r
-this.contentElement = document.createElement("div");\r
-this.contentElement.className = "panel-enabler-view-content";\r
-this.element.appendChild(this.contentElement);\r
-\r
-this.alignerElement = document.createElement("div");\r
-this.alignerElement.className = "welcome-instructions-aligner";\r
-this.contentElement.appendChild(this.alignerElement);\r
-\r
-this.instructionsElement = document.createElement("div");\r
-this.instructionsElement.className = "instructions";\r
-this.contentElement.appendChild(this.instructionsElement);\r
-\r
-this.headerElement = document.createElement("h1");\r
-this.headerElement.textContent = headingText;\r
-this.instructionsElement.appendChild(this.headerElement);\r
-\r
-if (instructionsText)\r
-this.addMessage(instructionsText);\r
-}\r
-\r
-WebInspector.WelcomeView.prototype = {\r
-addMessage: function(message)\r
-{\r
-var messageElement = document.createElement("div");\r
-messageElement.className = "message";\r
-if (typeof message == "string")\r
-\r
-\r
-messageElement.innerHTML = message;\r
-else\r
-messageElement.appendChild(message);\r
-this.instructionsElement.appendChild(messageElement);\r
-}\r
-}\r
-\r
-WebInspector.WelcomeView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.StatusBarButton = function(title, className, states)\r
-{\r
-this.element = document.createElement("button");\r
-this.element.className = className + " status-bar-item";\r
-this.element.addEventListener("click", this._clicked.bind(this), false);\r
-\r
-this.glyph = document.createElement("div");\r
-this.glyph.className = "glyph";\r
-this.element.appendChild(this.glyph);\r
-\r
-this.glyphShadow = document.createElement("div");\r
-this.glyphShadow.className = "glyph shadow";\r
-this.element.appendChild(this.glyphShadow);\r
-\r
-this.states = states;\r
-if (!states)\r
-this.states = 2;\r
-\r
-if (states == 2)\r
-this._state = false;\r
-else\r
-this._state = 0;\r
-\r
-this.title = title;\r
-this.disabled = false;\r
-this._visible = true;\r
-}\r
-\r
-WebInspector.StatusBarButton.prototype = {\r
-_clicked: function()\r
-{\r
-this.dispatchEventToListeners("click");\r
-},\r
-\r
-get disabled()\r
-{\r
-return this._disabled;\r
-},\r
-\r
-set disabled(x)\r
-{\r
-if (this._disabled === x)\r
-return;\r
-this._disabled = x;\r
-this.element.disabled = x;\r
-},\r
-\r
-get title()\r
-{\r
-return this._title;\r
-},\r
-\r
-set title(x)\r
-{\r
-if (this._title === x)\r
-return;\r
-this._title = x;\r
-this.element.title = x;\r
-},\r
-\r
-get state()\r
-{\r
-return this._state;\r
-},\r
-\r
-set state(x)\r
-{\r
-if (this._state === x)\r
-return;\r
-\r
-if (this.states === 2) {\r
-if (x)\r
-this.element.addStyleClass("toggled-on");\r
-else\r
-this.element.removeStyleClass("toggled-on");\r
-} else {\r
-if (x !== 0) {\r
-this.element.removeStyleClass("toggled-" + this._state);\r
-this.element.addStyleClass("toggled-" + x);\r
-} else \r
-this.element.removeStyleClass("toggled-" + this._state);\r
-}\r
-this._state = x;\r
-},\r
-\r
-get toggled()\r
-{\r
-if (this.states !== 2)\r
-throw("Only used toggled when there are 2 states, otherwise, use state");\r
-return this.state;\r
-},\r
-\r
-set toggled(x)\r
-{\r
-if (this.states !== 2)\r
-throw("Only used toggled when there are 2 states, otherwise, use state");\r
-this.state = x;\r
-},\r
-\r
-get visible()\r
-{\r
-return this._visible;\r
-},\r
-\r
-set visible(x)\r
-{\r
-if (this._visible === x)\r
-return;\r
-\r
-if (x)\r
-this.element.removeStyleClass("hidden");\r
-else\r
-this.element.addStyleClass("hidden");\r
-this._visible = x;\r
-}\r
-}\r
-\r
-WebInspector.StatusBarButton.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SummaryBar = function(categories)\r
-{\r
-this.categories = categories;\r
-\r
-this.element = document.createElement("div");\r
-this.element.className = "summary-bar";\r
-\r
-this.graphElement = document.createElement("canvas");\r
-this.graphElement.setAttribute("width", "450");\r
-this.graphElement.setAttribute("height", "38");\r
-this.graphElement.className = "summary-graph";\r
-this.element.appendChild(this.graphElement);\r
-\r
-this.legendElement = document.createElement("div");\r
-this.legendElement.className = "summary-graph-legend";\r
-this.element.appendChild(this.legendElement);\r
-}\r
-\r
-WebInspector.SummaryBar.prototype = {\r
-\r
-get calculator() {\r
-return this._calculator;\r
-},\r
-\r
-set calculator(x) {\r
-this._calculator = x;\r
-},\r
-\r
-reset: function()\r
-{\r
-this.legendElement.removeChildren();\r
-this._drawSummaryGraph();\r
-},\r
-\r
-update: function(data)\r
-{\r
-var graphInfo = this.calculator.computeSummaryValues(data);\r
-\r
-var fillSegments = [];\r
-\r
-this.legendElement.removeChildren();\r
-\r
-for (var category in this.categories) {\r
-var size = graphInfo.categoryValues[category];\r
-if (!size)\r
-continue;\r
-\r
-var colorString = this.categories[category].color;\r
-\r
-var fillSegment = {color: colorString, value: size};\r
-fillSegments.push(fillSegment);\r
-\r
-var legendLabel = this._makeLegendElement(this.categories[category].title, this.calculator.formatValue(size), colorString);\r
-this.legendElement.appendChild(legendLabel);\r
-}\r
-\r
-if (graphInfo.total) {\r
-var totalLegendLabel = this._makeLegendElement(WebInspector.UIString("Total"), this.calculator.formatValue(graphInfo.total));\r
-totalLegendLabel.addStyleClass("total");\r
-this.legendElement.appendChild(totalLegendLabel);\r
-}\r
-\r
-this._drawSummaryGraph(fillSegments);\r
-},\r
-\r
-_drawSwatch: function(canvas, color)\r
-{\r
-var ctx = canvas.getContext("2d");\r
-\r
-function drawSwatchSquare() {\r
-ctx.fillStyle = color;\r
-ctx.fillRect(0, 0, 13, 13);\r
-\r
-var gradient = ctx.createLinearGradient(0, 0, 13, 13);\r
-gradient.addColorStop(0.0, "rgba(255, 255, 255, 0.2)");\r
-gradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");\r
-\r
-ctx.fillStyle = gradient;\r
-ctx.fillRect(0, 0, 13, 13);\r
-\r
-gradient = ctx.createLinearGradient(13, 13, 0, 0);\r
-gradient.addColorStop(0.0, "rgba(0, 0, 0, 0.2)");\r
-gradient.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");\r
-\r
-ctx.fillStyle = gradient;\r
-ctx.fillRect(0, 0, 13, 13);\r
-\r
-ctx.strokeStyle = "rgba(0, 0, 0, 0.6)";\r
-ctx.strokeRect(0.5, 0.5, 12, 12);\r
-}\r
-\r
-ctx.clearRect(0, 0, 13, 24);\r
-\r
-drawSwatchSquare();\r
-\r
-ctx.save();\r
-\r
-ctx.translate(0, 25);\r
-ctx.scale(1, -1);\r
-\r
-drawSwatchSquare();\r
-\r
-ctx.restore();\r
-\r
-this._fadeOutRect(ctx, 0, 13, 13, 13, 0.5, 0.0);\r
-},\r
-\r
-_drawSummaryGraph: function(segments)\r
-{\r
-if (!segments || !segments.length) {\r
-segments = [{color: "white", value: 1}];\r
-this._showingEmptySummaryGraph = true;\r
-} else\r
-delete this._showingEmptySummaryGraph;\r
-\r
-\r
-var total = 0;\r
-for (var i = 0; i < segments.length; ++i)\r
-total += segments[i].value;\r
-\r
-\r
-var percents = segments.map(function(s) { return Math.max(Math.round(100 * s.value / total), 1) });\r
-\r
-\r
-var percentTotal = 0;\r
-for (var i = 0; i < percents.length; ++i)\r
-percentTotal += percents[i];\r
-\r
-\r
-\r
-while (percentTotal > 100) {\r
-for (var i = 0; i < percents.length && percentTotal > 100; ++i) {\r
-if (percents[i] > 1) {\r
---percents[i];\r
---percentTotal;\r
-}\r
-}\r
-}\r
-\r
-\r
-\r
-while (percentTotal < 100) {\r
-for (var i = 0; i < percents.length && percentTotal < 100; ++i) {\r
-++percents[i];\r
-++percentTotal;\r
-}\r
-}\r
-\r
-var ctx = this.graphElement.getContext("2d");\r
-\r
-var x = 0;\r
-var y = 0;\r
-var w = 450;\r
-var h = 19;\r
-var r = (h / 2);\r
-\r
-function drawPillShadow()\r
-{\r
-\r
-\r
-\r
-\r
-\r
-ctx.beginPath();\r
-ctx.moveTo(x + 4, y + h - 3 - 0.5);\r
-ctx.lineTo(x + w - 4, y + h - 3 - 0.5);\r
-ctx.closePath();\r
-\r
-ctx.save();\r
-\r
-ctx.shadowBlur = 2;\r
-ctx.shadowColor = "rgba(0, 0, 0, 0.5)";\r
-ctx.shadowOffsetX = 3;\r
-ctx.shadowOffsetY = 5;\r
-\r
-ctx.strokeStyle = "white";\r
-ctx.lineWidth = 1;\r
-\r
-ctx.stroke();\r
-\r
-ctx.shadowOffsetX = -3;\r
-\r
-ctx.stroke();\r
-\r
-ctx.restore();\r
-\r
-ctx.save();\r
-\r
-ctx.globalCompositeOperation = "destination-out";\r
-ctx.strokeStyle = "rgba(0, 0, 0, 1)";\r
-ctx.lineWidth = 1;\r
-\r
-ctx.stroke();\r
-\r
-ctx.restore();\r
-}\r
-\r
-function drawPill()\r
-{\r
-\r
-ctx.beginPath();\r
-ctx.moveTo(x, y + r);\r
-ctx.lineTo(x, y + h - r);\r
-ctx.arc(x + r, y + h - r, r, Math.PI, Math.PI / 2, true);\r
-ctx.lineTo(x + w - r, y + h);\r
-ctx.arc(x + w - r, y + h - r, r, Math.PI / 2, 0, true);\r
-ctx.lineTo(x + w, y + r);\r
-ctx.arc(x + w - r, y + r, r, 0, 3 * Math.PI / 2, true);\r
-ctx.lineTo(x + r, y);\r
-ctx.arc(x + r, y + r, r, Math.PI / 2, Math.PI, true);\r
-ctx.closePath();\r
-\r
-\r
-ctx.save();\r
-ctx.clip();\r
-\r
-\r
-var previousSegmentsWidth = 0;\r
-for (var i = 0; i < segments.length; ++i) {\r
-var segmentWidth = Math.round(w * percents[i] / 100);\r
-ctx.fillStyle = segments[i].color;\r
-ctx.fillRect(x + previousSegmentsWidth, y, segmentWidth, h);\r
-previousSegmentsWidth += segmentWidth;\r
-}\r
-\r
-\r
-ctx.lineWidth = 1;\r
-for (var i = 1; i < 20; ++i) {\r
-ctx.beginPath();\r
-ctx.moveTo(x + (i * Math.round(w / 20)) + 0.5, y);\r
-ctx.lineTo(x + (i * Math.round(w / 20)) + 0.5, y + h);\r
-ctx.closePath();\r
-\r
-ctx.strokeStyle = "rgba(0, 0, 0, 0.2)";\r
-ctx.stroke();\r
-\r
-ctx.beginPath();\r
-ctx.moveTo(x + (i * Math.round(w / 20)) + 1.5, y);\r
-ctx.lineTo(x + (i * Math.round(w / 20)) + 1.5, y + h);\r
-ctx.closePath();\r
-\r
-ctx.strokeStyle = "rgba(255, 255, 255, 0.2)";\r
-ctx.stroke();\r
-}\r
-\r
-\r
-var lightGradient = ctx.createLinearGradient(x, y, x, y + (h / 1.5));\r
-lightGradient.addColorStop(0.0, "rgba(220, 220, 220, 0.6)");\r
-lightGradient.addColorStop(0.4, "rgba(220, 220, 220, 0.2)");\r
-lightGradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");\r
-\r
-var darkGradient = ctx.createLinearGradient(x, y + (h / 3), x, y + h);\r
-darkGradient.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");\r
-darkGradient.addColorStop(0.8, "rgba(0, 0, 0, 0.2)");\r
-darkGradient.addColorStop(1.0, "rgba(0, 0, 0, 0.5)");\r
-\r
-ctx.fillStyle = darkGradient;\r
-ctx.fillRect(x, y, w, h);\r
-\r
-ctx.fillStyle = lightGradient;\r
-ctx.fillRect(x, y, w, h);\r
-\r
-ctx.restore();\r
-}\r
-\r
-ctx.clearRect(x, y, w, (h * 2));\r
-\r
-drawPillShadow();\r
-drawPill();\r
-\r
-ctx.save();\r
-\r
-ctx.translate(0, (h * 2) + 1);\r
-ctx.scale(1, -1);\r
-\r
-drawPill();\r
-\r
-ctx.restore();\r
-\r
-this._fadeOutRect(ctx, x, y + h + 1, w, h, 0.5, 0.0);\r
-},\r
-\r
-_fadeOutRect: function(ctx, x, y, w, h, a1, a2)\r
-{\r
-ctx.save();\r
-\r
-var gradient = ctx.createLinearGradient(x, y, x, y + h);\r
-gradient.addColorStop(0.0, "rgba(0, 0, 0, " + (1.0 - a1) + ")");\r
-gradient.addColorStop(0.8, "rgba(0, 0, 0, " + (1.0 - a2) + ")");\r
-gradient.addColorStop(1.0, "rgba(0, 0, 0, 1.0)");\r
-\r
-ctx.globalCompositeOperation = "destination-out";\r
-\r
-ctx.fillStyle = gradient;\r
-ctx.fillRect(x, y, w, h);\r
-\r
-ctx.restore();\r
-},\r
-\r
-_makeLegendElement: function(label, value, color)\r
-{\r
-var legendElement = document.createElement("label");\r
-legendElement.className = "summary-graph-legend-item";\r
-\r
-if (color) {\r
-var swatch = document.createElement("canvas");\r
-swatch.className = "summary-graph-legend-swatch";\r
-swatch.setAttribute("width", "13");\r
-swatch.setAttribute("height", "24");\r
-\r
-legendElement.appendChild(swatch);\r
-\r
-this._drawSwatch(swatch, color);\r
-}\r
-\r
-var labelElement = document.createElement("div");\r
-labelElement.className = "summary-graph-legend-label";\r
-legendElement.appendChild(labelElement);\r
-\r
-var headerElement = document.createElement("div");\r
-headerElement.className = "summary-graph-legend-header";\r
-headerElement.textContent = label;\r
-labelElement.appendChild(headerElement);\r
-\r
-var valueElement = document.createElement("div");\r
-valueElement.className = "summary-graph-legend-value";\r
-valueElement.textContent = value;\r
-labelElement.appendChild(valueElement);\r
-\r
-return legendElement;\r
-}\r
-}\r
-\r
-WebInspector.SummaryBar.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ElementsPanel = function()\r
-{\r
-WebInspector.Panel.call(this, "elements");\r
-\r
-this.contentElement = document.createElement("div");\r
-this.contentElement.id = "elements-content";\r
-this.contentElement.className = "outline-disclosure source-code";\r
-\r
-this.treeOutline = new WebInspector.ElementsTreeOutline();\r
-this.treeOutline.panel = this;\r
-this.treeOutline.includeRootDOMNode = false;\r
-this.treeOutline.selectEnabled = true;\r
-\r
-this.treeOutline.focusedNodeChanged = function(forceUpdate)\r
-{\r
-if (this.panel.visible && WebInspector.currentFocusElement !== document.getElementById("search"))\r
-WebInspector.currentFocusElement = this.element;\r
-\r
-this.panel.updateBreadcrumb(forceUpdate);\r
-\r
-for (var pane in this.panel.sidebarPanes)\r
-this.panel.sidebarPanes[pane].needsUpdate = true;\r
-\r
-this.panel.updateStyles(true);\r
-this.panel.updateMetrics();\r
-this.panel.updateProperties();\r
-this.panel.updateEventListeners();\r
-\r
-if (this._focusedDOMNode) {\r
-InspectorBackend.addInspectedNode(this._focusedDOMNode.id);\r
-WebInspector.extensionServer.notifyObjectSelected(this.panel.name);\r
-}\r
-};\r
-\r
-this.contentElement.appendChild(this.treeOutline.element);\r
-\r
-this.crumbsElement = document.createElement("div");\r
-this.crumbsElement.className = "crumbs";\r
-this.crumbsElement.addEventListener("mousemove", this._mouseMovedInCrumbs.bind(this), false);\r
-this.crumbsElement.addEventListener("mouseout", this._mouseMovedOutOfCrumbs.bind(this), false);\r
-\r
-this.sidebarPanes = {};\r
-this.sidebarPanes.computedStyle = new WebInspector.ComputedStyleSidebarPane();\r
-this.sidebarPanes.styles = new WebInspector.StylesSidebarPane(this.sidebarPanes.computedStyle);\r
-this.sidebarPanes.metrics = new WebInspector.MetricsSidebarPane();\r
-this.sidebarPanes.properties = new WebInspector.PropertiesSidebarPane();\r
-if (Preferences.nativeInstrumentationEnabled)\r
-this.sidebarPanes.domBreakpoints = WebInspector.createDOMBreakpointsSidebarPane();\r
-this.sidebarPanes.eventListeners = new WebInspector.EventListenersSidebarPane();\r
-\r
-this.sidebarPanes.styles.onexpand = this.updateStyles.bind(this);\r
-this.sidebarPanes.metrics.onexpand = this.updateMetrics.bind(this);\r
-this.sidebarPanes.properties.onexpand = this.updateProperties.bind(this);\r
-this.sidebarPanes.eventListeners.onexpand = this.updateEventListeners.bind(this);\r
-\r
-this.sidebarPanes.styles.expanded = true;\r
-\r
-this.sidebarPanes.styles.addEventListener("style edited", this._stylesPaneEdited, this);\r
-this.sidebarPanes.styles.addEventListener("style property toggled", this._stylesPaneEdited, this);\r
-this.sidebarPanes.metrics.addEventListener("metrics edited", this._metricsPaneEdited, this);\r
-WebInspector.cssModel.addEventListener("stylesheet changed", this._styleSheetChanged, this);\r
-\r
-this.sidebarElement = document.createElement("div");\r
-this.sidebarElement.id = "elements-sidebar";\r
-\r
-for (var pane in this.sidebarPanes)\r
-this.sidebarElement.appendChild(this.sidebarPanes[pane].element);\r
-\r
-this.sidebarResizeElement = document.createElement("div");\r
-this.sidebarResizeElement.className = "sidebar-resizer-vertical";\r
-this.sidebarResizeElement.addEventListener("mousedown", this.rightSidebarResizerDragStart.bind(this), false);\r
-\r
-this._nodeSearchButton = new WebInspector.StatusBarButton(WebInspector.UIString("Select an element in the page to inspect it."), "node-search-status-bar-item");\r
-this._nodeSearchButton.addEventListener("click", this.toggleSearchingForNode.bind(this), false);\r
-\r
-this.element.appendChild(this.contentElement);\r
-this.element.appendChild(this.sidebarElement);\r
-this.element.appendChild(this.sidebarResizeElement);\r
-\r
-this._registerShortcuts();\r
-\r
-this.reset();\r
-}\r
-\r
-WebInspector.ElementsPanel.prototype = {\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Elements");\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-return [this._nodeSearchButton.element, this.crumbsElement];\r
-},\r
-\r
-get defaultFocusedElement()\r
-{\r
-return this.treeOutline.element;\r
-},\r
-\r
-updateStatusBarItems: function()\r
-{\r
-this.updateBreadcrumbSizes();\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";\r
-this.updateBreadcrumb();\r
-this.treeOutline.updateSelection();\r
-if (this.recentlyModifiedNodes.length)\r
-this.updateModifiedNodes();\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.Panel.prototype.hide.call(this);\r
-\r
-WebInspector.highlightDOMNode(0);\r
-this.setSearchingForNode(false);\r
-},\r
-\r
-resize: function()\r
-{\r
-this.treeOutline.updateSelection();\r
-this.updateBreadcrumbSizes();\r
-},\r
-\r
-reset: function()\r
-{\r
-if (this.focusedDOMNode)\r
-this._selectedPathOnReset = this.focusedDOMNode.path();\r
-\r
-this.rootDOMNode = null;\r
-this.focusedDOMNode = null;\r
-\r
-WebInspector.highlightDOMNode(0);\r
-\r
-this.recentlyModifiedNodes = [];\r
-\r
-delete this.currentQuery;\r
-},\r
-\r
-setDocument: function(inspectedRootDocument)\r
-{\r
-this.reset();\r
-this.searchCanceled();\r
-\r
-if (!inspectedRootDocument)\r
-return;\r
-\r
-inspectedRootDocument.addEventListener("DOMNodeInserted", this._nodeInserted.bind(this));\r
-inspectedRootDocument.addEventListener("DOMNodeRemoved", this._nodeRemoved.bind(this));\r
-inspectedRootDocument.addEventListener("DOMAttrModified", this._attributesUpdated.bind(this));\r
-inspectedRootDocument.addEventListener("DOMCharacterDataModified", this._characterDataModified.bind(this));\r
-\r
-this.rootDOMNode = inspectedRootDocument;\r
-\r
-function selectNode(candidateFocusNode)\r
-{\r
-if (!candidateFocusNode)\r
-candidateFocusNode = inspectedRootDocument.body || inspectedRootDocument.documentElement;\r
-\r
-if (!candidateFocusNode)\r
-return;\r
-\r
-this.focusedDOMNode = candidateFocusNode;\r
-if (this.treeOutline.selectedTreeElement)\r
-this.treeOutline.selectedTreeElement.expand();\r
-}\r
-\r
-function selectLastSelectedNode(nodeId)\r
-{\r
-if (this.focusedDOMNode) {\r
-\r
-return;\r
-}\r
-var node = nodeId ? WebInspector.domAgent.nodeForId(nodeId) : 0;\r
-selectNode.call(this, node);\r
-}\r
-\r
-if (this._selectedPathOnReset)\r
-InspectorBackend.pushNodeByPathToFrontend(this._selectedPathOnReset, selectLastSelectedNode.bind(this));\r
-else\r
-selectNode.call(this);\r
-delete this._selectedPathOnReset;\r
-},\r
-\r
-searchCanceled: function()\r
-{\r
-delete this._searchQuery;\r
-this._hideSearchHighlights();\r
-\r
-WebInspector.updateSearchMatchesCount(0, this);\r
-\r
-this._currentSearchResultIndex = 0;\r
-this._searchResults = [];\r
-InspectorBackend.searchCanceled();\r
-},\r
-\r
-performSearch: function(query)\r
-{\r
-\r
-this.searchCanceled();\r
-\r
-const whitespaceTrimmedQuery = query.trim();\r
-if (!whitespaceTrimmedQuery.length)\r
-return;\r
-\r
-this._updatedMatchCountOnce = false;\r
-this._matchesCountUpdateTimeout = null;\r
-this._searchQuery = query;\r
-\r
-InspectorBackend.performSearch(whitespaceTrimmedQuery, false);\r
-},\r
-\r
-populateHrefContextMenu: function(contextMenu, event, anchorElement)\r
-{\r
-if (!anchorElement.href)\r
-return false;\r
-\r
-var resourceURL = WebInspector.resourceURLForRelatedNode(this.focusedDOMNode, anchorElement.href);\r
-if (!resourceURL)\r
-return false;\r
-\r
-\r
-\r
-contextMenu.appendItem(WebInspector.UIString("Open Link in New Window"), WebInspector.openResource.bind(null, resourceURL, false));\r
-if (WebInspector.resourceForURL(resourceURL))\r
-contextMenu.appendItem(WebInspector.UIString("Open Link in Resources Panel"), WebInspector.openResource.bind(null, resourceURL, true));\r
-return true;\r
-},\r
-\r
-_updateMatchesCount: function()\r
-{\r
-WebInspector.updateSearchMatchesCount(this._searchResults.length, this);\r
-this._matchesCountUpdateTimeout = null;\r
-this._updatedMatchCountOnce = true;\r
-},\r
-\r
-_updateMatchesCountSoon: function()\r
-{\r
-if (!this._updatedMatchCountOnce)\r
-return this._updateMatchesCount();\r
-if (this._matchesCountUpdateTimeout)\r
-return;\r
-\r
-this._matchesCountUpdateTimeout = setTimeout(this._updateMatchesCount.bind(this), 500);\r
-},\r
-\r
-addNodesToSearchResult: function(nodeIds)\r
-{\r
-if (!nodeIds.length)\r
-return;\r
-\r
-for (var i = 0; i < nodeIds.length; ++i) {\r
-var nodeId = nodeIds[i];\r
-var node = WebInspector.domAgent.nodeForId(nodeId);\r
-if (!node)\r
-continue;\r
-\r
-this._currentSearchResultIndex = 0;\r
-this._searchResults.push(node);\r
-}\r
-this._highlightCurrentSearchResult();\r
-this._updateMatchesCountSoon();\r
-},\r
-\r
-jumpToNextSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-\r
-if (++this._currentSearchResultIndex >= this._searchResults.length)\r
-this._currentSearchResultIndex = 0;\r
-this._highlightCurrentSearchResult();\r
-},\r
-\r
-jumpToPreviousSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-\r
-if (--this._currentSearchResultIndex < 0)\r
-this._currentSearchResultIndex = (this._searchResults.length - 1);\r
-this._highlightCurrentSearchResult();\r
-},\r
-\r
-_highlightCurrentSearchResult: function()\r
-{\r
-this._hideSearchHighlights();\r
-var node = this._searchResults[this._currentSearchResultIndex];\r
-var treeElement = this.treeOutline.findTreeElement(node);\r
-if (treeElement) {\r
-treeElement.highlightSearchResults(this._searchQuery);\r
-treeElement.reveal();\r
-}\r
-},\r
-\r
-_hideSearchHighlights: function(node)\r
-{\r
-for (var i = 0; this._searchResults && i < this._searchResults.length; ++i) {\r
-var node = this._searchResults[i];\r
-var treeElement = this.treeOutline.findTreeElement(node);\r
-if (treeElement)\r
-treeElement.highlightSearchResults(null);\r
-}\r
-},\r
-\r
-renameSelector: function(oldIdentifier, newIdentifier, oldSelector, newSelector)\r
-{\r
-\r
-},\r
-\r
-get rootDOMNode()\r
-{\r
-return this.treeOutline.rootDOMNode;\r
-},\r
-\r
-set rootDOMNode(x)\r
-{\r
-this.treeOutline.rootDOMNode = x;\r
-},\r
-\r
-get focusedDOMNode()\r
-{\r
-return this.treeOutline.focusedDOMNode;\r
-},\r
-\r
-set focusedDOMNode(x)\r
-{\r
-this.treeOutline.focusedDOMNode = x;\r
-},\r
-\r
-_attributesUpdated: function(event)\r
-{\r
-this.recentlyModifiedNodes.push({node: event.target, updated: true});\r
-if (this.visible)\r
-this._updateModifiedNodesSoon();\r
-},\r
-\r
-_characterDataModified: function(event)\r
-{\r
-this.recentlyModifiedNodes.push({node: event.target, updated: true});\r
-if (this.visible)\r
-this._updateModifiedNodesSoon();\r
-},\r
-\r
-_nodeInserted: function(event)\r
-{\r
-this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, inserted: true});\r
-if (this.visible)\r
-this._updateModifiedNodesSoon();\r
-},\r
-\r
-_nodeRemoved: function(event)\r
-{\r
-this.recentlyModifiedNodes.push({node: event.target, parent: event.relatedNode, removed: true});\r
-if (this.visible)\r
-this._updateModifiedNodesSoon();\r
-},\r
-\r
-_updateModifiedNodesSoon: function()\r
-{\r
-if ("_updateModifiedNodesTimeout" in this)\r
-return;\r
-this._updateModifiedNodesTimeout = setTimeout(this.updateModifiedNodes.bind(this), 0);\r
-},\r
-\r
-updateModifiedNodes: function()\r
-{\r
-if ("_updateModifiedNodesTimeout" in this) {\r
-clearTimeout(this._updateModifiedNodesTimeout);\r
-delete this._updateModifiedNodesTimeout;\r
-}\r
-\r
-var updatedParentTreeElements = [];\r
-var updateBreadcrumbs = false;\r
-\r
-for (var i = 0; i < this.recentlyModifiedNodes.length; ++i) {\r
-var replaced = this.recentlyModifiedNodes[i].replaced;\r
-var parent = this.recentlyModifiedNodes[i].parent;\r
-var node = this.recentlyModifiedNodes[i].node;\r
-\r
-if (this.recentlyModifiedNodes[i].updated) {\r
-var nodeItem = this.treeOutline.findTreeElement(node);\r
-if (nodeItem)\r
-nodeItem.updateTitle();\r
-continue;\r
-}\r
-\r
-if (!parent)\r
-continue;\r
-\r
-var parentNodeItem = this.treeOutline.findTreeElement(parent);\r
-if (parentNodeItem && !parentNodeItem.alreadyUpdatedChildren) {\r
-parentNodeItem.updateChildren(replaced);\r
-parentNodeItem.alreadyUpdatedChildren = true;\r
-updatedParentTreeElements.push(parentNodeItem);\r
-}\r
-\r
-if (!updateBreadcrumbs && (this.focusedDOMNode === parent || isAncestorNode(this.focusedDOMNode, parent)))\r
-updateBreadcrumbs = true;\r
-}\r
-\r
-for (var i = 0; i < updatedParentTreeElements.length; ++i)\r
-delete updatedParentTreeElements[i].alreadyUpdatedChildren;\r
-\r
-this.recentlyModifiedNodes = [];\r
-\r
-if (updateBreadcrumbs)\r
-this.updateBreadcrumb(true);\r
-},\r
-\r
-_stylesPaneEdited: function()\r
-{\r
-\r
-this.sidebarPanes.metrics.needsUpdate = true;\r
-this.updateMetrics();\r
-},\r
-\r
-_metricsPaneEdited: function()\r
-{\r
-\r
-this.sidebarPanes.styles.needsUpdate = true;\r
-this.updateStyles(true);\r
-},\r
-\r
-_styleSheetChanged: function()\r
-{\r
-this._metricsPaneEdited();\r
-this._stylesPaneEdited();\r
-},\r
-\r
-_mouseMovedInCrumbs: function(event)\r
-{\r
-var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);\r
-var crumbElement = nodeUnderMouse.enclosingNodeOrSelfWithClass("crumb");\r
-\r
-WebInspector.highlightDOMNode(crumbElement ? crumbElement.representedObject.id : 0);\r
-\r
-if ("_mouseOutOfCrumbsTimeout" in this) {\r
-clearTimeout(this._mouseOutOfCrumbsTimeout);\r
-delete this._mouseOutOfCrumbsTimeout;\r
-}\r
-},\r
-\r
-_mouseMovedOutOfCrumbs: function(event)\r
-{\r
-var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);\r
-if (nodeUnderMouse && nodeUnderMouse.isDescendant(this.crumbsElement))\r
-return;\r
-\r
-WebInspector.highlightDOMNode(0);\r
-\r
-this._mouseOutOfCrumbsTimeout = setTimeout(this.updateBreadcrumbSizes.bind(this), 1000);\r
-},\r
-\r
-updateBreadcrumb: function(forceUpdate)\r
-{\r
-if (!this.visible)\r
-return;\r
-\r
-var crumbs = this.crumbsElement;\r
-\r
-var handled = false;\r
-var foundRoot = false;\r
-var crumb = crumbs.firstChild;\r
-while (crumb) {\r
-if (crumb.representedObject === this.rootDOMNode)\r
-foundRoot = true;\r
-\r
-if (foundRoot)\r
-crumb.addStyleClass("dimmed");\r
-else\r
-crumb.removeStyleClass("dimmed");\r
-\r
-if (crumb.representedObject === this.focusedDOMNode) {\r
-crumb.addStyleClass("selected");\r
-handled = true;\r
-} else {\r
-crumb.removeStyleClass("selected");\r
-}\r
-\r
-crumb = crumb.nextSibling;\r
-}\r
-\r
-if (handled && !forceUpdate) {\r
-\r
-\r
-this.updateBreadcrumbSizes();\r
-return;\r
-}\r
-\r
-crumbs.removeChildren();\r
-\r
-var panel = this;\r
-\r
-function selectCrumbFunction(event)\r
-{\r
-var crumb = event.currentTarget;\r
-if (crumb.hasStyleClass("collapsed")) {\r
-\r
-if (crumb === panel.crumbsElement.firstChild) {\r
-\r
-\r
-var currentCrumb = crumb;\r
-while (currentCrumb) {\r
-var hidden = currentCrumb.hasStyleClass("hidden");\r
-var collapsed = currentCrumb.hasStyleClass("collapsed");\r
-if (!hidden && !collapsed)\r
-break;\r
-crumb = currentCrumb;\r
-currentCrumb = currentCrumb.nextSibling;\r
-}\r
-}\r
-\r
-panel.updateBreadcrumbSizes(crumb);\r
-} else {\r
-\r
-\r
-if (event.detail >= 2 || crumb.hasStyleClass("dimmed"))\r
-panel.rootDOMNode = crumb.representedObject.parentNode;\r
-panel.focusedDOMNode = crumb.representedObject;\r
-}\r
-\r
-event.preventDefault();\r
-}\r
-\r
-foundRoot = false;\r
-for (var current = this.focusedDOMNode; current; current = current.parentNode) {\r
-if (current.nodeType === Node.DOCUMENT_NODE)\r
-continue;\r
-\r
-if (current === this.rootDOMNode)\r
-foundRoot = true;\r
-\r
-var crumb = document.createElement("span");\r
-crumb.className = "crumb";\r
-crumb.representedObject = current;\r
-crumb.addEventListener("mousedown", selectCrumbFunction, false);\r
-\r
-var crumbTitle;\r
-switch (current.nodeType) {\r
-case Node.ELEMENT_NODE:\r
-this.decorateNodeLabel(current, crumb);\r
-break;\r
-\r
-case Node.TEXT_NODE:\r
-if (isNodeWhitespace.call(current))\r
-crumbTitle = WebInspector.UIString("(whitespace)");\r
-else\r
-crumbTitle = WebInspector.UIString("(text)");\r
-break\r
-\r
-case Node.COMMENT_NODE:\r
-crumbTitle = "<!-->";\r
-break;\r
-\r
-case Node.DOCUMENT_TYPE_NODE:\r
-crumbTitle = "<!DOCTYPE>";\r
-break;\r
-\r
-default:\r
-crumbTitle = this.treeOutline.nodeNameToCorrectCase(current.nodeName);\r
-}\r
-\r
-if (!crumb.childNodes.length) {\r
-var nameElement = document.createElement("span");\r
-nameElement.textContent = crumbTitle;\r
-crumb.appendChild(nameElement);\r
-crumb.title = crumbTitle;\r
-}\r
-\r
-if (foundRoot)\r
-crumb.addStyleClass("dimmed");\r
-if (current === this.focusedDOMNode)\r
-crumb.addStyleClass("selected");\r
-if (!crumbs.childNodes.length)\r
-crumb.addStyleClass("end");\r
-\r
-crumbs.appendChild(crumb);\r
-}\r
-\r
-if (crumbs.hasChildNodes())\r
-crumbs.lastChild.addStyleClass("start");\r
-\r
-this.updateBreadcrumbSizes();\r
-},\r
-\r
-decorateNodeLabel: function(node, parentElement)\r
-{\r
-var title = this.treeOutline.nodeNameToCorrectCase(node.nodeName);\r
-\r
-var nameElement = document.createElement("span");\r
-nameElement.textContent = title;\r
-parentElement.appendChild(nameElement);\r
-\r
-var idAttribute = node.getAttribute("id");\r
-if (idAttribute) {\r
-var idElement = document.createElement("span");\r
-parentElement.appendChild(idElement);\r
-\r
-var part = "#" + idAttribute;\r
-title += part;\r
-idElement.appendChild(document.createTextNode(part));\r
-\r
-\r
-nameElement.className = "extra";\r
-}\r
-\r
-var classAttribute = node.getAttribute("class");\r
-if (classAttribute) {\r
-var classes = classAttribute.split(/\s+/);\r
-var foundClasses = {};\r
-\r
-if (classes.length) {\r
-var classesElement = document.createElement("span");\r
-classesElement.className = "extra";\r
-parentElement.appendChild(classesElement);\r
-\r
-for (var i = 0; i < classes.length; ++i) {\r
-var className = classes[i];\r
-if (className && !(className in foundClasses)) {\r
-var part = "." + className;\r
-title += part;\r
-classesElement.appendChild(document.createTextNode(part));\r
-foundClasses[className] = true;\r
-}\r
-}\r
-}\r
-}\r
-parentElement.title = title;\r
-},\r
-\r
-linkifyNodeReference: function(node)\r
-{\r
-var link = document.createElement("span");\r
-link.className = "node-link";\r
-this.decorateNodeLabel(node, link);\r
-WebInspector.wireElementWithDOMNode(link, node.id);\r
-return link;\r
-},\r
-\r
-linkifyNodeById: function(nodeId)\r
-{\r
-var node = WebInspector.domAgent.nodeForId(nodeId);\r
-if (!node)\r
-return document.createTextNode(WebInspector.UIString("<node>"));\r
-return this.linkifyNodeReference(node);\r
-},\r
-\r
-updateBreadcrumbSizes: function(focusedCrumb)\r
-{\r
-if (!this.visible)\r
-return;\r
-\r
-if (document.body.offsetWidth <= 0) {\r
-\r
-\r
-return;\r
-}\r
-\r
-var crumbs = this.crumbsElement;\r
-if (!crumbs.childNodes.length || crumbs.offsetWidth <= 0)\r
-return; \r
-\r
-\r
-var selectedIndex = 0;\r
-var focusedIndex = 0;\r
-var selectedCrumb;\r
-\r
-var i = 0;\r
-var crumb = crumbs.firstChild;\r
-while (crumb) {\r
-\r
-if (!selectedCrumb && crumb.hasStyleClass("selected")) {\r
-selectedCrumb = crumb;\r
-selectedIndex = i;\r
-}\r
-\r
-\r
-if (crumb === focusedCrumb)\r
-focusedIndex = i;\r
-\r
-\r
-\r
-if (crumb !== crumbs.lastChild)\r
-crumb.removeStyleClass("start");\r
-if (crumb !== crumbs.firstChild)\r
-crumb.removeStyleClass("end");\r
-\r
-crumb.removeStyleClass("compact");\r
-crumb.removeStyleClass("collapsed");\r
-crumb.removeStyleClass("hidden");\r
-\r
-crumb = crumb.nextSibling;\r
-++i;\r
-}\r
-\r
-\r
-\r
-crumbs.firstChild.addStyleClass("end");\r
-crumbs.lastChild.addStyleClass("start");\r
-\r
-function crumbsAreSmallerThanContainer()\r
-{\r
-var rightPadding = 20;\r
-var errorWarningElement = document.getElementById("error-warning-count");\r
-if (!WebInspector.drawer.visible && errorWarningElement)\r
-rightPadding += errorWarningElement.offsetWidth;\r
-return ((crumbs.totalOffsetLeft + crumbs.offsetWidth + rightPadding) < window.innerWidth);\r
-}\r
-\r
-if (crumbsAreSmallerThanContainer())\r
-return; \r
-\r
-var BothSides = 0;\r
-var AncestorSide = -1;\r
-var ChildSide = 1;\r
-\r
-function makeCrumbsSmaller(shrinkingFunction, direction, significantCrumb)\r
-{\r
-if (!significantCrumb)\r
-significantCrumb = (focusedCrumb || selectedCrumb);\r
-\r
-if (significantCrumb === selectedCrumb)\r
-var significantIndex = selectedIndex;\r
-else if (significantCrumb === focusedCrumb)\r
-var significantIndex = focusedIndex;\r
-else {\r
-var significantIndex = 0;\r
-for (var i = 0; i < crumbs.childNodes.length; ++i) {\r
-if (crumbs.childNodes[i] === significantCrumb) {\r
-significantIndex = i;\r
-break;\r
-}\r
-}\r
-}\r
-\r
-function shrinkCrumbAtIndex(index)\r
-{\r
-var shrinkCrumb = crumbs.childNodes[index];\r
-if (shrinkCrumb && shrinkCrumb !== significantCrumb)\r
-shrinkingFunction(shrinkCrumb);\r
-if (crumbsAreSmallerThanContainer())\r
-return true; \r
-return false;\r
-}\r
-\r
-\r
-\r
-if (direction) {\r
-\r
-var index = (direction > 0 ? 0 : crumbs.childNodes.length - 1);\r
-while (index !== significantIndex) {\r
-if (shrinkCrumbAtIndex(index))\r
-return true;\r
-index += (direction > 0 ? 1 : -1);\r
-}\r
-} else {\r
-\r
-\r
-var startIndex = 0;\r
-var endIndex = crumbs.childNodes.length - 1;\r
-while (startIndex != significantIndex || endIndex != significantIndex) {\r
-var startDistance = significantIndex - startIndex;\r
-var endDistance = endIndex - significantIndex;\r
-if (startDistance >= endDistance)\r
-var index = startIndex++;\r
-else\r
-var index = endIndex--;\r
-if (shrinkCrumbAtIndex(index))\r
-return true;\r
-}\r
-}\r
-\r
-\r
-return false;\r
-}\r
-\r
-function coalesceCollapsedCrumbs()\r
-{\r
-var crumb = crumbs.firstChild;\r
-var collapsedRun = false;\r
-var newStartNeeded = false;\r
-var newEndNeeded = false;\r
-while (crumb) {\r
-var hidden = crumb.hasStyleClass("hidden");\r
-if (!hidden) {\r
-var collapsed = crumb.hasStyleClass("collapsed"); \r
-if (collapsedRun && collapsed) {\r
-crumb.addStyleClass("hidden");\r
-crumb.removeStyleClass("compact");\r
-crumb.removeStyleClass("collapsed");\r
-\r
-if (crumb.hasStyleClass("start")) {\r
-crumb.removeStyleClass("start");\r
-newStartNeeded = true;\r
-}\r
-\r
-if (crumb.hasStyleClass("end")) {\r
-crumb.removeStyleClass("end");\r
-newEndNeeded = true;\r
-}\r
-\r
-continue;\r
-}\r
-\r
-collapsedRun = collapsed;\r
-\r
-if (newEndNeeded) {\r
-newEndNeeded = false;\r
-crumb.addStyleClass("end");\r
-}\r
-} else\r
-collapsedRun = true;\r
-crumb = crumb.nextSibling;\r
-}\r
-\r
-if (newStartNeeded) {\r
-crumb = crumbs.lastChild;\r
-while (crumb) {\r
-if (!crumb.hasStyleClass("hidden")) {\r
-crumb.addStyleClass("start");\r
-break;\r
-}\r
-crumb = crumb.previousSibling;\r
-}\r
-}\r
-}\r
-\r
-function compact(crumb)\r
-{\r
-if (crumb.hasStyleClass("hidden"))\r
-return;\r
-crumb.addStyleClass("compact");\r
-}\r
-\r
-function collapse(crumb, dontCoalesce)\r
-{\r
-if (crumb.hasStyleClass("hidden"))\r
-return;\r
-crumb.addStyleClass("collapsed");\r
-crumb.removeStyleClass("compact");\r
-if (!dontCoalesce)\r
-coalesceCollapsedCrumbs();\r
-}\r
-\r
-function compactDimmed(crumb)\r
-{\r
-if (crumb.hasStyleClass("dimmed"))\r
-compact(crumb);\r
-}\r
-\r
-function collapseDimmed(crumb)\r
-{\r
-if (crumb.hasStyleClass("dimmed"))\r
-collapse(crumb);\r
-}\r
-\r
-if (!focusedCrumb) {\r
-\r
-\r
-\r
-\r
-if (makeCrumbsSmaller(compact, ChildSide))\r
-return;\r
-\r
-\r
-if (makeCrumbsSmaller(collapse, ChildSide))\r
-return;\r
-\r
-\r
-if (makeCrumbsSmaller(compactDimmed, AncestorSide))\r
-return;\r
-\r
-\r
-if (makeCrumbsSmaller(collapseDimmed, AncestorSide))\r
-return;\r
-}\r
-\r
-\r
-if (makeCrumbsSmaller(compact, (focusedCrumb ? BothSides : AncestorSide)))\r
-return;\r
-\r
-\r
-if (makeCrumbsSmaller(collapse, (focusedCrumb ? BothSides : AncestorSide)))\r
-return;\r
-\r
-if (!selectedCrumb)\r
-return;\r
-\r
-\r
-compact(selectedCrumb);\r
-if (crumbsAreSmallerThanContainer())\r
-return;\r
-\r
-\r
-collapse(selectedCrumb, true);\r
-},\r
-\r
-updateStyles: function(forceUpdate)\r
-{\r
-var stylesSidebarPane = this.sidebarPanes.styles;\r
-var computedStylePane = this.sidebarPanes.computedStyle;\r
-if ((!stylesSidebarPane.expanded && !computedStylePane.expanded) || !stylesSidebarPane.needsUpdate)\r
-return;\r
-\r
-stylesSidebarPane.update(this.focusedDOMNode, null, forceUpdate);\r
-stylesSidebarPane.needsUpdate = false;\r
-},\r
-\r
-updateMetrics: function()\r
-{\r
-var metricsSidebarPane = this.sidebarPanes.metrics;\r
-if (!metricsSidebarPane.expanded || !metricsSidebarPane.needsUpdate)\r
-return;\r
-\r
-metricsSidebarPane.update(this.focusedDOMNode);\r
-metricsSidebarPane.needsUpdate = false;\r
-},\r
-\r
-updateProperties: function()\r
-{\r
-var propertiesSidebarPane = this.sidebarPanes.properties;\r
-if (!propertiesSidebarPane.expanded || !propertiesSidebarPane.needsUpdate)\r
-return;\r
-\r
-propertiesSidebarPane.update(this.focusedDOMNode);\r
-propertiesSidebarPane.needsUpdate = false;\r
-},\r
-\r
-updateEventListeners: function()\r
-{\r
-var eventListenersSidebarPane = this.sidebarPanes.eventListeners;\r
-if (!eventListenersSidebarPane.expanded || !eventListenersSidebarPane.needsUpdate)\r
-return;\r
-\r
-eventListenersSidebarPane.update(this.focusedDOMNode);\r
-eventListenersSidebarPane.needsUpdate = false;\r
-},\r
-\r
-_registerShortcuts: function()\r
-{\r
-var shortcut = WebInspector.KeyboardShortcut;\r
-var section = WebInspector.shortcutsHelp.section(WebInspector.UIString("Elements Panel"));\r
-var keys = [\r
-shortcut.shortcutToString(shortcut.Keys.Up),\r
-shortcut.shortcutToString(shortcut.Keys.Down)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Navigate elements"));\r
-var keys = [\r
-shortcut.shortcutToString(shortcut.Keys.Right),\r
-shortcut.shortcutToString(shortcut.Keys.Left)\r
-];\r
-section.addRelatedKeys(keys, WebInspector.UIString("Expand/collapse"));\r
-section.addKey(shortcut.shortcutToString(shortcut.Keys.Enter), WebInspector.UIString("Edit attribute"));\r
-\r
-this.sidebarPanes.styles.registerShortcuts();\r
-},\r
-\r
-handleShortcut: function(event)\r
-{\r
-\r
-\r
-if (event.keyIdentifier === "U+0043") {     \r
-if (WebInspector.isMac())\r
-var isNodeSearchKey = event.metaKey && !event.ctrlKey && !event.altKey && event.shiftKey;\r
-else\r
-var isNodeSearchKey = event.ctrlKey && !event.metaKey && !event.altKey && event.shiftKey;\r
-\r
-if (isNodeSearchKey) {\r
-this.toggleSearchingForNode();\r
-event.handled = true;\r
-return;\r
-}\r
-}\r
-},\r
-\r
-handleCopyEvent: function(event)\r
-{\r
-\r
-if (!window.getSelection().isCollapsed)\r
-return;\r
-event.clipboardData.clearData();\r
-event.preventDefault();\r
-InspectorBackend.copyNode(this.focusedDOMNode.id);\r
-},\r
-\r
-rightSidebarResizerDragStart: function(event)\r
-{\r
-WebInspector.elementDragStart(this.sidebarElement, this.rightSidebarResizerDrag.bind(this), this.rightSidebarResizerDragEnd.bind(this), event, "col-resize");\r
-},\r
-\r
-rightSidebarResizerDragEnd: function(event)\r
-{\r
-WebInspector.elementDragEnd(event);\r
-this.saveSidebarWidth();\r
-},\r
-\r
-rightSidebarResizerDrag: function(event)\r
-{\r
-var x = event.pageX;\r
-var newWidth = Number.constrain(window.innerWidth - x, Preferences.minElementsSidebarWidth, window.innerWidth * 0.66);\r
-this.setSidebarWidth(newWidth);\r
-event.preventDefault();\r
-},\r
-\r
-setSidebarWidth: function(newWidth)\r
-{\r
-this.sidebarElement.style.width = newWidth + "px";\r
-this.contentElement.style.right = newWidth + "px";\r
-this.sidebarResizeElement.style.right = (newWidth - 3) + "px";\r
-this.treeOutline.updateSelection();\r
-},\r
-\r
-updateFocusedNode: function(nodeId)\r
-{\r
-var node = WebInspector.domAgent.nodeForId(nodeId);\r
-if (!node)\r
-return;\r
-\r
-this.focusedDOMNode = node;\r
-this._nodeSearchButton.toggled = false;\r
-},\r
-\r
-_setSearchingForNode: function(enabled)\r
-{\r
-this._nodeSearchButton.toggled = enabled;\r
-},\r
-\r
-setSearchingForNode: function(enabled)\r
-{\r
-InspectorBackend.setSearchingForNode(enabled, this._setSearchingForNode.bind(this));\r
-},\r
-\r
-toggleSearchingForNode: function()\r
-{\r
-this.setSearchingForNode(!this._nodeSearchButton.toggled);\r
-},\r
-\r
-elementsToRestoreScrollPositionsFor: function()\r
-{\r
-return [ this.contentElement, this.sidebarElement ];\r
-}\r
-}\r
-\r
-WebInspector.ElementsPanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.NetworkPanel = function()\r
-{\r
-WebInspector.Panel.call(this, "network");\r
-\r
-this.createSidebar();\r
-this.sidebarElement.className = "network-sidebar";\r
-\r
-this._resources = [];\r
-this._resourcesById = {};\r
-this._resourcesByURL = {};\r
-this._lastIdentifier = 0;\r
-this._staleResources = [];\r
-this._resourceGridNodes = {};\r
-this._mainResourceLoadTime = -1;\r
-this._mainResourceDOMContentTime = -1;\r
-this._hiddenCategories = {};\r
-\r
-this._categories = WebInspector.resourceCategories;\r
-\r
-this.containerElement = document.createElement("div");\r
-this.containerElement.id = "network-container";\r
-this.sidebarElement.appendChild(this.containerElement);\r
-\r
-this._viewsContainerElement = document.createElement("div");\r
-this._viewsContainerElement.id = "network-views";\r
-this._viewsContainerElement.className = "hidden";\r
-this.element.appendChild(this._viewsContainerElement);\r
-\r
-this._closeButtonElement = document.createElement("button");\r
-this._closeButtonElement.id = "network-close-button";\r
-this._closeButtonElement.addEventListener("click", this._toggleGridMode.bind(this), false);\r
-this._viewsContainerElement.appendChild(this._closeButtonElement);\r
-\r
-this._createSortingFunctions();\r
-this._createTable();\r
-this._createTimelineGrid();\r
-this._createStatusbarButtons();\r
-this._createFilterStatusBarItems();\r
-this._createSummaryBar();\r
-\r
-if (!WebInspector.settings.resourcesLargeRows)\r
-this._setLargerResources(WebInspector.settings.resourcesLargeRows);\r
-\r
-this._popoverHelper = new WebInspector.PopoverHelper(this.element, this._getPopoverAnchor.bind(this), this._showPopover.bind(this), true);\r
-\r
-this._popoverHelper.setTimeout(100);\r
-\r
-this.calculator = new WebInspector.NetworkTransferTimeCalculator();\r
-this._filter(this._filterAllElement, false);\r
-\r
-this._toggleGridMode();\r
-}\r
-\r
-WebInspector.NetworkPanel.prototype = {\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Network");\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-return [this._largerResourcesButton.element, this._preserveLogToggle.element, this._clearButton.element, this._filterBarElement];\r
-},\r
-\r
-isCategoryVisible: function(categoryName)\r
-{\r
-return true;\r
-},\r
-\r
-elementsToRestoreScrollPositionsFor: function()\r
-{\r
-return [this.containerElement];\r
-},\r
-\r
-resize: function()\r
-{\r
-WebInspector.Panel.prototype.resize.call(this);\r
-this._dataGrid.updateWidths();\r
-this._positionSummaryBar();\r
-},\r
-\r
-updateSidebarWidth: function(width)\r
-{\r
-if (!this._viewingResourceMode)\r
-return;\r
-WebInspector.Panel.prototype.updateSidebarWidth.call(this, width);\r
-if (this._summaryBarElement.parentElement === this.element)\r
-this._summaryBarElement.style.width = width + "px";\r
-},\r
-\r
-updateMainViewWidth: function(width)\r
-{\r
-this._viewsContainerElement.style.left = width + "px";\r
-},\r
-\r
-handleShortcut: function(event)\r
-{\r
-if (this._viewingResourceMode && event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code) {\r
-this._toggleGridMode();\r
-event.handled = true;\r
-}\r
-},\r
-\r
-_positionSummaryBar: function()\r
-{\r
-\r
-\r
-var fillerRow = this._dataGrid.dataTableBody.lastChild;\r
-if (this._summaryBarElement.parentElement !== this.element && fillerRow.offsetHeight > 0) {\r
-\r
-if (this._summaryBarRowNode) {\r
-this._dataGrid.removeChild(this._summaryBarRowNode);\r
-delete this._summaryBarRowNode;\r
-}\r
-this._summaryBarElement.addStyleClass("network-summary-bar-bottom");\r
-this._summaryBarElement.style.setProperty("width", this.sidebarElement.offsetWidth + "px");\r
-this.element.appendChild(this._summaryBarElement);\r
-this._dataGrid.element.style.bottom = "20px";\r
-return;\r
-}\r
-\r
-if (!this._summaryBarRowNode && !fillerRow.offsetHeight) {\r
-\r
-this._summaryBarRowNode = new WebInspector.NetworkTotalGridNode(this._summaryBarElement);\r
-this._summaryBarElement.removeStyleClass("network-summary-bar-bottom");\r
-this._summaryBarElement.style.removeProperty("width");\r
-this._dataGrid.appendChild(this._summaryBarRowNode);\r
-this._dataGrid.element.style.bottom = 0;\r
-this._sortItems();\r
-}\r
-},\r
-\r
-_resetSummaryBar: function()\r
-{\r
-delete this._summaryBarRowNode;\r
-this._summaryBarElement.parentElement.removeChild(this._summaryBarElement);\r
-this._updateSummaryBar();\r
-},\r
-\r
-_createTimelineGrid: function()\r
-{\r
-this._timelineGrid = new WebInspector.TimelineGrid();\r
-this._timelineGrid.element.addStyleClass("network-timeline-grid");\r
-this._dataGrid.element.appendChild(this._timelineGrid.element);\r
-},\r
-\r
-_createTable: function()\r
-{\r
-var columns = {name: {}, method: {}, status: {}, type: {}, size: {}, time: {}, timeline: {}};\r
-columns.name.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Name"), WebInspector.UIString("Path"));\r
-columns.name.sortable = true;\r
-columns.name.width = "20%";\r
-columns.name.disclosure = true;\r
-\r
-columns.method.title = WebInspector.UIString("Method");\r
-columns.method.sortable = true;\r
-columns.method.width = "7%";\r
-\r
-columns.status.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Status"), WebInspector.UIString("Text"));\r
-columns.status.sortable = true;\r
-columns.status.width = "8%";\r
-\r
-columns.type.title = WebInspector.UIString("Type");\r
-columns.type.sortable = true;\r
-columns.type.width = "10%";\r
-\r
-columns.size.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Size"), WebInspector.UIString("Transfer"));\r
-columns.size.sortable = true;\r
-columns.size.width = "10%";\r
-columns.size.aligned = "right";\r
-\r
-columns.time.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Time"), WebInspector.UIString("Latency"));\r
-columns.time.sortable = true;\r
-columns.time.width = "10%";\r
-columns.time.aligned = "right";\r
-\r
-columns.timeline.title = "";\r
-columns.timeline.sortable = false;\r
-columns.timeline.width = "37%";\r
-columns.timeline.sort = "ascending";\r
-\r
-this._dataGrid = new WebInspector.DataGrid(columns);\r
-this._dataGrid.element.addEventListener("contextmenu", this._contextMenu.bind(this), true);\r
-this.containerElement.appendChild(this._dataGrid.element);\r
-this._dataGrid.addEventListener("sorting changed", this._sortItems, this);\r
-this._dataGrid.addEventListener("width changed", this._updateDividersIfNeeded, this);\r
-\r
-this._patchTimelineHeader();\r
-},\r
-\r
-_makeHeaderFragment: function(title, subtitle)\r
-{\r
-var fragment = document.createDocumentFragment();\r
-fragment.appendChild(document.createTextNode(title));\r
-var subtitleDiv = document.createElement("div");\r
-subtitleDiv.className = "network-header-subtitle";\r
-subtitleDiv.textContent = subtitle;\r
-fragment.appendChild(subtitleDiv);\r
-return fragment;\r
-},\r
-\r
-_patchTimelineHeader: function()\r
-{\r
-var timelineSorting = document.createElement("select");\r
-\r
-var option = document.createElement("option");\r
-option.value = "startTime";\r
-option.label = WebInspector.UIString("Timeline");\r
-timelineSorting.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "startTime";\r
-option.label = WebInspector.UIString("Start Time");\r
-timelineSorting.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "responseTime";\r
-option.label = WebInspector.UIString("Response Time");\r
-timelineSorting.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "endTime";\r
-option.label = WebInspector.UIString("End Time");\r
-timelineSorting.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "duration";\r
-option.label = WebInspector.UIString("Duration");\r
-timelineSorting.appendChild(option);\r
-\r
-option = document.createElement("option");\r
-option.value = "latency";\r
-option.label = WebInspector.UIString("Latency");\r
-timelineSorting.appendChild(option);\r
-\r
-var header = this._dataGrid.headerTableHeader("timeline");\r
-header.replaceChild(timelineSorting, header.firstChild);\r
-\r
-timelineSorting.addEventListener("click", function(event) { event.stopPropagation() }, false);\r
-timelineSorting.addEventListener("change", this._sortByTimeline.bind(this), false);\r
-this._timelineSortSelector = timelineSorting;\r
-},\r
-\r
-_createSortingFunctions: function()\r
-{\r
-this._sortingFunctions = {};\r
-this._sortingFunctions.name = WebInspector.NetworkDataGridNode.NameComparator;\r
-this._sortingFunctions.method = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "method", false);\r
-this._sortingFunctions.status = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "statusCode", false);\r
-this._sortingFunctions.type = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "mimeType", false);\r
-this._sortingFunctions.size = WebInspector.NetworkDataGridNode.SizeComparator;\r
-this._sortingFunctions.time = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "duration", false);\r
-this._sortingFunctions.timeline = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "startTime", false);\r
-this._sortingFunctions.startTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "startTime", false);\r
-this._sortingFunctions.endTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "endTime", false);\r
-this._sortingFunctions.responseTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "responseReceivedTime", false);\r
-this._sortingFunctions.duration = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "duration", true);\r
-this._sortingFunctions.latency = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "latency", true);\r
-\r
-var timeCalculator = new WebInspector.NetworkTransferTimeCalculator();\r
-var durationCalculator = new WebInspector.NetworkTransferDurationCalculator();\r
-\r
-this._calculators = {};\r
-this._calculators.timeline = timeCalculator;\r
-this._calculators.startTime = timeCalculator;\r
-this._calculators.endTime = timeCalculator;\r
-this._calculators.responseTime = timeCalculator;\r
-this._calculators.duration = durationCalculator;\r
-this._calculators.latency = durationCalculator;\r
-},\r
-\r
-_sortItems: function()\r
-{\r
-var columnIdentifier = this._dataGrid.sortColumnIdentifier;\r
-if (columnIdentifier === "timeline") {\r
-this._sortByTimeline();\r
-return;\r
-}\r
-var sortingFunction = this._sortingFunctions[columnIdentifier];\r
-if (!sortingFunction)\r
-return;\r
-\r
-this._dataGrid.sortNodes(sortingFunction, this._dataGrid.sortOrder === "descending");\r
-this._timelineSortSelector.selectedIndex = 0;\r
-},\r
-\r
-_sortByTimeline: function()\r
-{\r
-var selectedIndex = this._timelineSortSelector.selectedIndex;\r
-if (!selectedIndex)\r
-selectedIndex = 1; \r
-var selectedOption = this._timelineSortSelector[selectedIndex];\r
-var value = selectedOption.value;\r
-\r
-var sortingFunction = this._sortingFunctions[value];\r
-this._dataGrid.sortNodes(sortingFunction);\r
-this.calculator = this._calculators[value];\r
-if (this.calculator.startAtZero)\r
-this._timelineGrid.hideEventDividers();\r
-else\r
-this._timelineGrid.showEventDividers();\r
-this._dataGrid.markColumnAsSortedBy("timeline", "ascending");\r
-},\r
-\r
-_createFilterStatusBarItems: function()\r
-{\r
-var filterBarElement = document.createElement("div");\r
-filterBarElement.className = "scope-bar status-bar-item";\r
-filterBarElement.id = "network-filter";\r
-\r
-function createFilterElement(category, label)\r
-{\r
-var categoryElement = document.createElement("li");\r
-categoryElement.category = category;\r
-categoryElement.className = category;\r
-categoryElement.appendChild(document.createTextNode(label));\r
-categoryElement.addEventListener("click", this._updateFilter.bind(this), false);\r
-filterBarElement.appendChild(categoryElement);\r
-\r
-return categoryElement;\r
-}\r
-\r
-this._filterAllElement = createFilterElement.call(this, "all", WebInspector.UIString("All"));\r
-\r
-\r
-var dividerElement = document.createElement("div");\r
-dividerElement.addStyleClass("scope-bar-divider");\r
-filterBarElement.appendChild(dividerElement);\r
-\r
-for (var category in this._categories)\r
-createFilterElement.call(this, category, this._categories[category].title);\r
-this._filterBarElement = filterBarElement;\r
-},\r
-\r
-_createSummaryBar: function()\r
-{\r
-this._summaryBarElement = document.createElement("div");\r
-this._summaryBarElement.className = "network-summary-bar";\r
-this.containerElement.appendChild(this._summaryBarElement);\r
-},\r
-\r
-_updateSummaryBar: function()\r
-{\r
-this._positionSummaryBar(); \r
-var numRequests = this._resources.length;\r
-\r
-if (!numRequests) {\r
-if (this._summaryBarElement._isDisplayingWarning)\r
-return;\r
-this._summaryBarElement._isDisplayingWarning = true;\r
-\r
-var img = document.createElement("img");\r
-img.src = "Images/warningIcon.png";\r
-this._summaryBarElement.removeChildren();\r
-this._summaryBarElement.appendChild(img);\r
-this._summaryBarElement.appendChild(document.createTextNode(" "));\r
-this._summaryBarElement.appendChild(document.createTextNode(\r
-WebInspector.UIString("No requests captured. Reload the page to see detailed information on the network activity.")));\r
-return;\r
-}\r
-delete this._summaryBarElement._isDisplayingWarning;\r
-\r
-var transferSize = 0;\r
-var baseTime = -1;\r
-var maxTime = -1;\r
-for (var i = 0; i < this._resources.length; ++i) {\r
-var resource = this._resources[i];\r
-transferSize += (resource.cached || !resource.transferSize) ? 0 : resource.transferSize;\r
-if (resource.isMainResource)\r
-baseTime = resource.startTime;\r
-if (resource.endTime > maxTime)\r
-maxTime = resource.endTime;\r
-}\r
-var text = String.sprintf(WebInspector.UIString("%d requests"), numRequests);\r
-text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s transferred"), Number.bytesToString(transferSize));\r
-if (baseTime !== -1 && this._mainResourceLoadTime !== -1 && this._mainResourceDOMContentTime !== -1 && this._mainResourceDOMContentTime > baseTime) {\r
-text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s (onload: %s, DOMContentLoaded: %s)"),\r
-Number.secondsToString(maxTime - baseTime),\r
-Number.secondsToString(this._mainResourceLoadTime - baseTime),\r
-Number.secondsToString(this._mainResourceDOMContentTime - baseTime));\r
-}\r
-this._summaryBarElement.textContent = text;\r
-},\r
-\r
-_showCategory: function(category)\r
-{\r
-this._dataGrid.element.addStyleClass("filter-" + category);\r
-delete this._hiddenCategories[category];\r
-},\r
-\r
-_hideCategory: function(category)\r
-{\r
-this._dataGrid.element.removeStyleClass("filter-" + category);\r
-this._hiddenCategories[category] = true;\r
-},\r
-\r
-_updateFilter: function(e)\r
-{\r
-var isMac = WebInspector.isMac();\r
-var selectMultiple = false;\r
-if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)\r
-selectMultiple = true;\r
-if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)\r
-selectMultiple = true;\r
-\r
-this._filter(e.target, selectMultiple);\r
-this._positionSummaryBar();\r
-},\r
-\r
-_filter: function(target, selectMultiple)\r
-{\r
-function unselectAll()\r
-{\r
-for (var i = 0; i < this._filterBarElement.childNodes.length; ++i) {\r
-var child = this._filterBarElement.childNodes[i];\r
-if (!child.category)\r
-continue;\r
-\r
-child.removeStyleClass("selected");\r
-this._hideCategory(child.category);\r
-}\r
-}\r
-\r
-if (target.category === this._filterAllElement) {\r
-if (target.hasStyleClass("selected")) {\r
-\r
-return;\r
-}\r
-\r
-\r
-unselectAll.call(this);\r
-} else {\r
-\r
-if (this._filterAllElement.hasStyleClass("selected")) {\r
-this._filterAllElement.removeStyleClass("selected");\r
-this._hideCategory("all");\r
-}\r
-}\r
-\r
-if (!selectMultiple) {\r
-\r
-\r
-unselectAll.call(this);\r
-\r
-target.addStyleClass("selected");\r
-this._showCategory(target.category);\r
-return;\r
-}\r
-\r
-if (target.hasStyleClass("selected")) {\r
-\r
-\r
-target.removeStyleClass("selected");\r
-this._hideCategory(target.category);\r
-} else {\r
-\r
-\r
-target.addStyleClass("selected");\r
-this._showCategory(target.category);\r
-}\r
-},\r
-\r
-_scheduleRefresh: function()\r
-{\r
-if (this._needsRefresh)\r
-return;\r
-\r
-this._needsRefresh = true;\r
-\r
-if (this.visible && !("_refreshTimeout" in this))\r
-this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);\r
-},\r
-\r
-_updateDividersIfNeeded: function(force)\r
-{\r
-var timelineColumn = this._dataGrid.columns.timeline;\r
-for (var i = 0; i < this._dataGrid.resizers.length; ++i) {\r
-if (timelineColumn.ordinal === this._dataGrid.resizers[i].rightNeighboringColumnID) {\r
-\r
-this._timelineGrid.element.style.left = this._dataGrid.resizers[i].style.left;\r
-this._timelineGrid.element.style.right = "18px";\r
-}\r
-}\r
-\r
-var proceed = true;\r
-if (!this.visible) {\r
-this._scheduleRefresh();\r
-proceed = false;\r
-} else\r
-proceed = this._timelineGrid.updateDividers(force, this.calculator);\r
-\r
-if (!proceed)\r
-return;\r
-\r
-if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {\r
-\r
-\r
-\r
-\r
-\r
-\r
-return;\r
-}\r
-\r
-this._timelineGrid.removeEventDividers();\r
-if (this._mainResourceLoadTime !== -1) {\r
-var percent = this.calculator.computePercentageFromEventTime(this._mainResourceLoadTime);\r
-\r
-var loadDivider = document.createElement("div");\r
-loadDivider.className = "network-event-divider network-red-divider";\r
-\r
-var loadDividerPadding = document.createElement("div");\r
-loadDividerPadding.className = "network-event-divider-padding";\r
-loadDividerPadding.title = WebInspector.UIString("Load event fired");\r
-loadDividerPadding.appendChild(loadDivider);\r
-loadDividerPadding.style.left = percent + "%";\r
-this._timelineGrid.addEventDivider(loadDividerPadding);\r
-}\r
-\r
-if (this._mainResourceDOMContentTime !== -1) {\r
-var percent = this.calculator.computePercentageFromEventTime(this._mainResourceDOMContentTime);\r
-\r
-var domContentDivider = document.createElement("div");\r
-domContentDivider.className = "network-event-divider network-blue-divider";\r
-\r
-var domContentDividerPadding = document.createElement("div");\r
-domContentDividerPadding.className = "network-event-divider-padding";\r
-domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");\r
-domContentDividerPadding.appendChild(domContentDivider);\r
-domContentDividerPadding.style.left = percent + "%";\r
-this._timelineGrid.addEventDivider(domContentDividerPadding);\r
-}\r
-},\r
-\r
-_refreshIfNeeded: function()\r
-{\r
-if (this._needsRefresh)\r
-this.refresh();\r
-},\r
-\r
-_invalidateAllItems: function()\r
-{\r
-this._staleResources = this._resources.slice();\r
-},\r
-\r
-get calculator()\r
-{\r
-return this._calculator;\r
-},\r
-\r
-set calculator(x)\r
-{\r
-if (!x || this._calculator === x)\r
-return;\r
-\r
-this._calculator = x;\r
-this._calculator.reset();\r
-\r
-this._invalidateAllItems();\r
-this.refresh();\r
-},\r
-\r
-_resourceGridNode: function(resource)\r
-{\r
-return this._resourceGridNodes[resource.identifier];\r
-},\r
-\r
-revealAndSelectItem: function(resource)\r
-{\r
-var node = this._resourceGridNode(resource);\r
-if (node) {\r
-node.reveal();\r
-node.select(true);\r
-}\r
-},\r
-\r
-addEventDivider: function(divider)\r
-{\r
-this._timelineGrid.addEventDivider(divider);\r
-},\r
-\r
-_createStatusbarButtons: function()\r
-{\r
-this._preserveLogToggle = new WebInspector.StatusBarButton(WebInspector.UIString("Preserve Log upon Navigation"), "record-profile-status-bar-item");\r
-this._preserveLogToggle.addEventListener("click", this._onPreserveLogClicked.bind(this), false);\r
-\r
-this._clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");\r
-this._clearButton.addEventListener("click", this._reset.bind(this), false);\r
-\r
-this._largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "network-larger-resources-status-bar-item");\r
-this._largerResourcesButton.toggled = WebInspector.settings.resourcesLargeRows;\r
-this._largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);\r
-},\r
-\r
-set mainResourceLoadTime(x)\r
-{\r
-if (this._mainResourceLoadTime === x)\r
-return;\r
-\r
-this._mainResourceLoadTime = x || -1;\r
-\r
-this._updateDividersIfNeeded(true);\r
-},\r
-\r
-set mainResourceDOMContentTime(x)\r
-{\r
-if (this._mainResourceDOMContentTime === x)\r
-return;\r
-\r
-this._mainResourceDOMContentTime = x || -1;\r
-this._updateDividersIfNeeded(true);\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-this._refreshIfNeeded();\r
-\r
-if (this.visibleView)\r
-this.visibleView.show(this._viewsContainerElement);\r
-\r
-this._dataGrid.updateWidths();\r
-this._positionSummaryBar();\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.Panel.prototype.hide.call(this);\r
-this._popoverHelper.hidePopup();\r
-},\r
-\r
-get searchableViews()\r
-{\r
-var views = [];\r
-return views;\r
-},\r
-\r
-searchMatchFound: function(view, matches)\r
-{\r
-this._resourceGridNode(view.resource).searchMatches = matches;\r
-},\r
-\r
-searchCanceled: function(startingNewSearch)\r
-{\r
-WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);\r
-\r
-if (startingNewSearch || !this._resources)\r
-return;\r
-},\r
-\r
-performSearch: function(query)\r
-{\r
-WebInspector.Panel.prototype.performSearch.call(this, query);\r
-},\r
-\r
-refresh: function()\r
-{\r
-this._needsRefresh = false;\r
-if ("_refreshTimeout" in this) {\r
-clearTimeout(this._refreshTimeout);\r
-delete this._refreshTimeout;\r
-}\r
-\r
-var wasScrolledToLastRow = this._dataGrid.isScrolledToLastRow();\r
-var staleItemsLength = this._staleResources.length;\r
-var boundariesChanged = false;\r
-\r
-for (var i = 0; i < staleItemsLength; ++i) {\r
-var resource = this._staleResources[i];\r
-var node = this._resourceGridNode(resource);\r
-if (!node) {\r
-\r
-node = new WebInspector.NetworkDataGridNode(this, resource);\r
-this._resourceGridNodes[resource.identifier] = node;\r
-this._dataGrid.appendChild(node);\r
-}\r
-node.refreshResource();\r
-\r
-if (this.calculator.updateBoundaries(resource))\r
-boundariesChanged = true;\r
-}\r
-\r
-if (boundariesChanged) {\r
-\r
-this._invalidateAllItems();\r
-staleItemsLength = this._staleResources.length;\r
-}\r
-\r
-for (var i = 0; i < staleItemsLength; ++i)\r
-this._resourceGridNode(this._staleResources[i]).refreshGraph(this.calculator);\r
-\r
-this._staleResources = [];\r
-this._sortItems();\r
-this._updateSummaryBar();\r
-this._dataGrid.updateWidths();\r
-\r
-if (wasScrolledToLastRow)\r
-this._dataGrid.scrollToLastRow();\r
-},\r
-\r
-_onPreserveLogClicked: function(e)\r
-{\r
-this._preserveLogToggle.toggled = !this._preserveLogToggle.toggled;\r
-},\r
-\r
-reset: function()\r
-{\r
-if (!this._preserveLogToggle.toggled)\r
-this._reset();\r
-},\r
-\r
-_reset: function()\r
-{\r
-this._popoverHelper.hidePopup();\r
-this._closeVisibleResource();\r
-\r
-this._toggleGridMode();\r
-\r
-\r
-if (this._calculator)\r
-this._calculator.reset();\r
-\r
-this._resources = [];\r
-this._resourcesById = {};\r
-this._resourcesByURL = {};\r
-this._staleResources = [];\r
-this._resourceGridNodes = {};\r
-\r
-this._dataGrid.removeChildren();\r
-delete this._summaryBarRowNode;\r
-this._updateDividersIfNeeded(true);\r
-\r
-\r
-this._mainResourceLoadTime = -1;\r
-this._mainResourceDOMContentTime = -1;\r
-\r
-this._viewsContainerElement.removeChildren();\r
-this._viewsContainerElement.appendChild(this._closeButtonElement);\r
-this._resetSummaryBar();\r
-},\r
-\r
-get resources()\r
-{\r
-return this._resourcesById;\r
-},\r
-\r
-refreshResource: function(resource)\r
-{\r
-if (!resource.identifier)\r
-resource.identifier = "network:" + this._lastIdentifier++;\r
-\r
-if (!this._resourcesById[resource.identifier]) {\r
-this._resources.push(resource);\r
-this._resourcesById[resource.identifier] = resource;\r
-this._resourcesByURL[resource.url] = resource;\r
-\r
-\r
-if (resource.redirects) {\r
-for (var i = 0; i < resource.redirects.length; ++i)\r
-this.refreshResource(resource.redirects[i]);\r
-}\r
-}\r
-\r
-this._staleResources.push(resource);\r
-this._scheduleRefresh();\r
-\r
-if (!resource)\r
-return;\r
-\r
-var oldView = WebInspector.ResourceManager.existingResourceViewForResource(resource);\r
-if (!oldView)\r
-return;\r
-\r
-if (WebInspector.ResourceManager.resourceViewTypeMatchesResource(resource))\r
-return;\r
-\r
-var newView = WebInspector.ResourceManager.recreateResourceView(resource);\r
-if (this.visibleView === oldView)\r
-this.visibleView = newView;\r
-},\r
-\r
-canShowSourceLine: function(url, line)\r
-{\r
-return !!this._resourcesByURL[url];\r
-},\r
-\r
-showSourceLine: function(url, line)\r
-{\r
-this._showResource(this._resourcesByURL[url], line);\r
-},\r
-\r
-_showResource: function(resource, line)\r
-{\r
-if (!resource)\r
-return;\r
-\r
-this._popoverHelper.hidePopup();\r
-\r
-this._toggleViewingResourceMode();\r
-\r
-if (this.visibleView) {\r
-this.visibleView.detach();\r
-delete this.visibleView;\r
-}\r
-\r
-var view = new WebInspector.NetworkItemView(resource);\r
-view.show(this._viewsContainerElement);\r
-this.visibleView = view;\r
-\r
-this.updateSidebarWidth();\r
-},\r
-\r
-_closeVisibleResource: function()\r
-{\r
-this.element.removeStyleClass("viewing-resource");\r
-\r
-if (this.visibleView) {\r
-this.visibleView.detach();\r
-delete this.visibleView;\r
-}\r
-\r
-if (this._lastSelectedGraphTreeElement)\r
-this._lastSelectedGraphTreeElement.select(true);\r
-\r
-this.updateSidebarWidth();\r
-},\r
-\r
-_toggleLargerResources: function()\r
-{\r
-WebInspector.settings.resourcesLargeRows = !WebInspector.settings.resourcesLargeRows;\r
-this._setLargerResources(WebInspector.settings.resourcesLargeRows);\r
-},\r
-\r
-_setLargerResources: function(enabled)\r
-{\r
-this._largerResourcesButton.toggled = enabled;\r
-if (!enabled) {\r
-this._largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");\r
-this._dataGrid.element.addStyleClass("small");\r
-this._timelineGrid.element.addStyleClass("small");\r
-this._viewsContainerElement.addStyleClass("small");\r
-} else {\r
-this._largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");\r
-this._dataGrid.element.removeStyleClass("small");\r
-this._timelineGrid.element.removeStyleClass("small");\r
-this._viewsContainerElement.removeStyleClass("small");\r
-}\r
-this._positionSummaryBar();\r
-},\r
-\r
-_getPopoverAnchor: function(element)\r
-{\r
-var anchor = element.enclosingNodeOrSelfWithClass("network-graph-bar") || element.enclosingNodeOrSelfWithClass("network-graph-label");\r
-if (!anchor)\r
-return null;\r
-var resource = anchor.parentElement.resource;\r
-return resource && resource.timing ? anchor : null;\r
-},\r
-\r
-_showPopover: function(anchor)\r
-{\r
-var resource = anchor.parentElement.resource;\r
-var tableElement = WebInspector.ResourceTimingView.createTimingTable(resource);\r
-var popover = new WebInspector.Popover(tableElement);\r
-popover.show(anchor);\r
-return popover;\r
-},\r
-\r
-_toggleGridMode: function()\r
-{\r
-if (this._viewingResourceMode) {\r
-this._viewingResourceMode = false;\r
-this.element.removeStyleClass("viewing-resource");\r
-this._dataGrid.element.removeStyleClass("viewing-resource-mode");\r
-this._viewsContainerElement.addStyleClass("hidden");\r
-this.sidebarElement.style.right = 0;\r
-this.sidebarElement.style.removeProperty("width");\r
-this._summaryBarElement.style.removeProperty("width");\r
-if (this._dataGrid.selectedNode)\r
-this._dataGrid.selectedNode.selected = false;\r
-}\r
-\r
-if (this._briefGrid) {\r
-this._dataGrid.element.removeStyleClass("full-grid-mode");\r
-this._dataGrid.element.addStyleClass("brief-grid-mode");\r
-\r
-this._dataGrid.hideColumn("method");\r
-this._dataGrid.hideColumn("status");\r
-this._dataGrid.hideColumn("type");\r
-this._dataGrid.hideColumn("size");\r
-this._dataGrid.hideColumn("time");\r
-\r
-var widths = {};\r
-widths.name = 20;\r
-widths.timeline = 80;\r
-} else {\r
-this._dataGrid.element.addStyleClass("full-grid-mode");\r
-this._dataGrid.element.removeStyleClass("brief-grid-mode");\r
-\r
-this._dataGrid.showColumn("method");\r
-this._dataGrid.showColumn("status");\r
-this._dataGrid.showColumn("type");\r
-this._dataGrid.showColumn("size");\r
-this._dataGrid.showColumn("time");\r
-\r
-var widths = {};\r
-widths.name = 20;\r
-widths.method = 7;\r
-widths.status = 8;\r
-widths.type = 10;\r
-widths.size = 10;\r
-widths.time = 10;\r
-widths.timeline = 37;\r
-}\r
-\r
-this._dataGrid.showColumn("timeline");\r
-this._dataGrid.applyColumnWidthsMap(widths);\r
-\r
-},\r
-\r
-_toggleViewingResourceMode: function()\r
-{\r
-if (this._viewingResourceMode)\r
-return;\r
-this._viewingResourceMode = true;\r
-this._preservedColumnWidths = this._dataGrid.columnWidthsMap();\r
-\r
-this.element.addStyleClass("viewing-resource");\r
-this._dataGrid.element.addStyleClass("viewing-resource-mode");\r
-this._dataGrid.element.removeStyleClass("full-grid-mode");\r
-this._dataGrid.element.removeStyleClass("brief-grid-mode");\r
-\r
-this._dataGrid.hideColumn("method");\r
-this._dataGrid.hideColumn("status");\r
-this._dataGrid.hideColumn("type");\r
-this._dataGrid.hideColumn("size");\r
-this._dataGrid.hideColumn("time");\r
-this._dataGrid.hideColumn("timeline");\r
-\r
-this._viewsContainerElement.removeStyleClass("hidden");\r
-this.updateSidebarWidth(200);\r
-\r
-var widths = {};\r
-widths.name = 100;\r
-this._dataGrid.applyColumnWidthsMap(widths);\r
-},\r
-\r
-_contextMenu: function(event)\r
-{\r
-\r
-if (typeof window.createObjectURL !== "function" || !Preferences.resourceExportEnabled)\r
-return;\r
-\r
-var contextMenu = new WebInspector.ContextMenu();\r
-var gridNode = this._dataGrid.dataGridNodeFromNode(event.target);\r
-var resource = gridNode && gridNode._resource;\r
-if (resource)\r
-contextMenu.appendItem(WebInspector.UIString("Export to HAR"), this._exportResource.bind(this, resource));\r
-contextMenu.appendItem(WebInspector.UIString("Export all to HAR"), this._exportAll.bind(this));\r
-contextMenu.show(event);\r
-},\r
-\r
-_exportAll: function()\r
-{\r
-var harArchive = {\r
-log: (new WebInspector.HARLog()).build()\r
-}\r
-offerFileForDownload(JSON.stringify(harArchive));\r
-},\r
-\r
-_exportResource: function(resource)\r
-{\r
-var har = (new WebInspector.HAREntry(resource)).build();\r
-offerFileForDownload(JSON.stringify(har));\r
-}\r
-}\r
-\r
-WebInspector.NetworkPanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-WebInspector.NetworkBaseCalculator = function()\r
-{\r
-}\r
-\r
-WebInspector.NetworkBaseCalculator.prototype = {\r
-computeSummaryValues: function(items)\r
-{\r
-var total = 0;\r
-var categoryValues = {};\r
-\r
-var itemsLength = items.length;\r
-for (var i = 0; i < itemsLength; ++i) {\r
-var item = items[i];\r
-var value = this._value(item);\r
-if (typeof value === "undefined")\r
-continue;\r
-if (!(item.category.name in categoryValues))\r
-categoryValues[item.category.name] = 0;\r
-categoryValues[item.category.name] += value;\r
-total += value;\r
-}\r
-\r
-return {categoryValues: categoryValues, total: total};\r
-},\r
-\r
-computeBarGraphPercentages: function(item)\r
-{\r
-return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan) * 100};\r
-},\r
-\r
-computeBarGraphLabels: function(item)\r
-{\r
-const label = this.formatValue(this._value(item));\r
-return {left: label, right: label, tooltip: label};\r
-},\r
-\r
-get boundarySpan()\r
-{\r
-return this.maximumBoundary - this.minimumBoundary;\r
-},\r
-\r
-updateBoundaries: function(item)\r
-{\r
-this.minimumBoundary = 0;\r
-\r
-var value = this._value(item);\r
-if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {\r
-this.maximumBoundary = value;\r
-return true;\r
-}\r
-return false;\r
-},\r
-\r
-reset: function()\r
-{\r
-delete this.minimumBoundary;\r
-delete this.maximumBoundary;\r
-},\r
-\r
-_value: function(item)\r
-{\r
-return 0;\r
-},\r
-\r
-formatValue: function(value)\r
-{\r
-return value.toString();\r
-}\r
-}\r
-\r
-WebInspector.NetworkTimeCalculator = function(startAtZero)\r
-{\r
-WebInspector.NetworkBaseCalculator.call(this);\r
-this.startAtZero = startAtZero;\r
-}\r
-\r
-WebInspector.NetworkTimeCalculator.prototype = {\r
-computeSummaryValues: function(resources)\r
-{\r
-var resourcesByCategory = {};\r
-var resourcesLength = resources.length;\r
-for (var i = 0; i < resourcesLength; ++i) {\r
-var resource = resources[i];\r
-if (!(resource.category.name in resourcesByCategory))\r
-resourcesByCategory[resource.category.name] = [];\r
-resourcesByCategory[resource.category.name].push(resource);\r
-}\r
-\r
-var earliestStart;\r
-var latestEnd;\r
-var categoryValues = {};\r
-for (var category in resourcesByCategory) {\r
-resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);\r
-categoryValues[category] = 0;\r
-\r
-var segment = {start: -1, end: -1};\r
-\r
-var categoryResources = resourcesByCategory[category];\r
-var resourcesLength = categoryResources.length;\r
-for (var i = 0; i < resourcesLength; ++i) {\r
-var resource = categoryResources[i];\r
-if (resource.startTime === -1 || resource.endTime === -1)\r
-continue;\r
-\r
-if (typeof earliestStart === "undefined")\r
-earliestStart = resource.startTime;\r
-else\r
-earliestStart = Math.min(earliestStart, resource.startTime);\r
-\r
-if (typeof latestEnd === "undefined")\r
-latestEnd = resource.endTime;\r
-else\r
-latestEnd = Math.max(latestEnd, resource.endTime);\r
-\r
-if (resource.startTime <= segment.end) {\r
-segment.end = Math.max(segment.end, resource.endTime);\r
-continue;\r
-}\r
-\r
-categoryValues[category] += segment.end - segment.start;\r
-\r
-segment.start = resource.startTime;\r
-segment.end = resource.endTime;\r
-}\r
-\r
-\r
-categoryValues[category] += segment.end - segment.start;\r
-}\r
-\r
-return {categoryValues: categoryValues, total: latestEnd - earliestStart};\r
-},\r
-\r
-computeBarGraphPercentages: function(resource)\r
-{\r
-if (resource.startTime !== -1)\r
-var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;\r
-else\r
-var start = 0;\r
-\r
-if (resource.responseReceivedTime !== -1)\r
-var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;\r
-else\r
-var middle = (this.startAtZero ? start : 100);\r
-\r
-if (resource.endTime !== -1)\r
-var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;\r
-else\r
-var end = (this.startAtZero ? middle : 100);\r
-\r
-if (this.startAtZero) {\r
-end -= start;\r
-middle -= start;\r
-start = 0;\r
-}\r
-\r
-return {start: start, middle: middle, end: end};\r
-},\r
-\r
-computePercentageFromEventTime: function(eventTime)\r
-{\r
-\r
-\r
-\r
-if (eventTime !== -1 && !this.startAtZero)\r
-return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;\r
-\r
-return 0;\r
-},\r
-\r
-computeBarGraphLabels: function(resource)\r
-{\r
-var rightLabel = "";\r
-if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)\r
-rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);\r
-\r
-var hasLatency = resource.latency > 0;\r
-if (hasLatency)\r
-var leftLabel = this.formatValue(resource.latency);\r
-else\r
-var leftLabel = rightLabel;\r
-\r
-if (resource.timing)\r
-return {left: leftLabel, right: rightLabel};\r
-\r
-if (hasLatency && rightLabel) {\r
-var total = this.formatValue(resource.duration);\r
-var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);\r
-} else if (hasLatency)\r
-var tooltip = WebInspector.UIString("%s latency", leftLabel);\r
-else if (rightLabel)\r
-var tooltip = WebInspector.UIString("%s download", rightLabel);\r
-\r
-if (resource.cached)\r
-tooltip = WebInspector.UIString("%s (from cache)", tooltip);\r
-return {left: leftLabel, right: rightLabel, tooltip: tooltip};\r
-},\r
-\r
-updateBoundaries: function(resource)\r
-{\r
-var didChange = false;\r
-\r
-var lowerBound;\r
-if (this.startAtZero)\r
-lowerBound = 0;\r
-else\r
-lowerBound = this._lowerBound(resource);\r
-\r
-if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {\r
-this.minimumBoundary = lowerBound;\r
-didChange = true;\r
-}\r
-\r
-var upperBound = this._upperBound(resource);\r
-if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {\r
-this.maximumBoundary = upperBound;\r
-didChange = true;\r
-}\r
-\r
-return didChange;\r
-},\r
-\r
-formatValue: function(value)\r
-{\r
-return Number.secondsToString(value, WebInspector.UIString);\r
-},\r
-\r
-_lowerBound: function(resource)\r
-{\r
-return 0;\r
-},\r
-\r
-_upperBound: function(resource)\r
-{\r
-return 0;\r
-}\r
-}\r
-\r
-WebInspector.NetworkTimeCalculator.prototype.__proto__ = WebInspector.NetworkBaseCalculator.prototype;\r
-\r
-WebInspector.NetworkTransferTimeCalculator = function()\r
-{\r
-WebInspector.NetworkTimeCalculator.call(this, false);\r
-}\r
-\r
-WebInspector.NetworkTransferTimeCalculator.prototype = {\r
-formatValue: function(value)\r
-{\r
-return Number.secondsToString(value, WebInspector.UIString);\r
-},\r
-\r
-_lowerBound: function(resource)\r
-{\r
-return resource.startTime;\r
-},\r
-\r
-_upperBound: function(resource)\r
-{\r
-return resource.endTime;\r
-}\r
-}\r
-\r
-WebInspector.NetworkTransferTimeCalculator.prototype.__proto__ = WebInspector.NetworkTimeCalculator.prototype;\r
-\r
-WebInspector.NetworkTransferDurationCalculator = function()\r
-{\r
-WebInspector.NetworkTimeCalculator.call(this, true);\r
-}\r
-\r
-WebInspector.NetworkTransferDurationCalculator.prototype = {\r
-formatValue: function(value)\r
-{\r
-return Number.secondsToString(value, WebInspector.UIString);\r
-},\r
-\r
-_upperBound: function(resource)\r
-{\r
-return resource.duration;\r
-}\r
-}\r
-\r
-WebInspector.NetworkTransferDurationCalculator.prototype.__proto__ = WebInspector.NetworkTimeCalculator.prototype;\r
-\r
-WebInspector.NetworkDataGridNode = function(panel, resource)\r
-{\r
-WebInspector.DataGridNode.call(this, {});\r
-this._panel = panel;\r
-this._resource = resource;\r
-}\r
-\r
-WebInspector.NetworkDataGridNode.prototype = {\r
-createCells: function()\r
-{\r
-this._nameCell = this._createDivInTD("name");\r
-this._methodCell = this._createDivInTD("method");\r
-this._statusCell = this._createDivInTD("status");\r
-this._typeCell = this._createDivInTD("type");\r
-this._sizeCell = this._createDivInTD("size");\r
-this._timeCell = this._createDivInTD("time");\r
-this._createTimelineCell();\r
-this._nameCell.addEventListener("click", this.select.bind(this), false);\r
-},\r
-\r
-select: function()\r
-{\r
-this._panel._showResource(this._resource);\r
-WebInspector.DataGridNode.prototype.select.apply(this, arguments);\r
-},\r
-\r
-get selectable()\r
-{\r
-if (!this._panel._viewingResourceMode)\r
-return false;\r
-if (!this._panel._hiddenCategories.all)\r
-return true;\r
-if (this._panel._hiddenCategories[this._resource.category.name])\r
-return false;\r
-return true;\r
-},\r
-\r
-_createDivInTD: function(columnIdentifier)\r
-{\r
-var td = document.createElement("td");\r
-td.className = columnIdentifier + "-column";\r
-var div = document.createElement("div");\r
-td.appendChild(div);\r
-this._element.appendChild(td);\r
-return div;\r
-},\r
-\r
-_createTimelineCell: function()\r
-{\r
-this._graphElement = document.createElement("div");\r
-this._graphElement.className = "network-graph-side";\r
-\r
-this._barAreaElement = document.createElement("div");\r
-\r
-this._barAreaElement.className = "network-graph-bar-area";\r
-this._barAreaElement.resource = this._resource;\r
-this._graphElement.appendChild(this._barAreaElement);\r
-\r
-this._barLeftElement = document.createElement("div");\r
-this._barLeftElement.className = "network-graph-bar waiting";\r
-this._barAreaElement.appendChild(this._barLeftElement);\r
-\r
-this._barRightElement = document.createElement("div");\r
-this._barRightElement.className = "network-graph-bar";\r
-this._barAreaElement.appendChild(this._barRightElement);\r
-\r
-\r
-this._labelLeftElement = document.createElement("div");\r
-this._labelLeftElement.className = "network-graph-label waiting";\r
-this._barAreaElement.appendChild(this._labelLeftElement);\r
-\r
-this._labelRightElement = document.createElement("div");\r
-this._labelRightElement.className = "network-graph-label";\r
-this._barAreaElement.appendChild(this._labelRightElement);\r
-\r
-this._graphElement.addEventListener("mouseover", this._refreshLabelPositions.bind(this), false);\r
-\r
-this._timelineCell = document.createElement("td");\r
-this._timelineCell.className = "timeline-column";\r
-this._element.appendChild(this._timelineCell);\r
-this._timelineCell.appendChild(this._graphElement);\r
-},\r
-\r
-refreshResource: function()\r
-{\r
-this._refreshNameCell();\r
-\r
-this._methodCell.textContent = this._resource.requestMethod;\r
-\r
-this._refreshStatusCell();\r
-\r
-if (this._resource.mimeType) {\r
-this._typeCell.removeStyleClass("network-dim-cell");\r
-this._typeCell.textContent = this._resource.mimeType;\r
-} else {\r
-this._typeCell.addStyleClass("network-dim-cell");\r
-this._typeCell.textContent = WebInspector.UIString("Pending");\r
-}\r
-\r
-this._refreshSizeCell();\r
-this._refreshTimeCell();\r
-\r
-if (this._resource.cached)\r
-this._graphElement.addStyleClass("resource-cached");\r
-\r
-this._element.addStyleClass("network-item");\r
-if (!this._element.hasStyleClass("network-category-" + this._resource.category.name)) {\r
-this._element.removeMatchingStyleClasses("network-category-\\w+");\r
-this._element.addStyleClass("network-category-" + this._resource.category.name);\r
-}\r
-},\r
-\r
-_refreshNameCell: function()\r
-{\r
-this._nameCell.removeChildren();\r
-\r
-if (this._resource.category === WebInspector.resourceCategories.images) {\r
-var previewImage = document.createElement("img");\r
-previewImage.className = "image-network-icon-preview";\r
-\r
-function onResourceContent()\r
-{\r
-previewImage.src = this._resource.contentURL;\r
-}\r
-if (Preferences.useDataURLForResourceImageIcons)\r
-this._resource.requestContent(onResourceContent.bind(this));\r
-else\r
-previewImage.src = this._resource.url;\r
-\r
-var iconElement = document.createElement("div");\r
-iconElement.className = "icon";\r
-iconElement.appendChild(previewImage);\r
-} else {\r
-var iconElement = document.createElement("img");\r
-iconElement.className = "icon";\r
-}\r
-this._nameCell.appendChild(iconElement);\r
-this._nameCell.appendChild(document.createTextNode(this._fileName()));\r
-\r
-\r
-var subtitle = this._resource.displayDomain;\r
-\r
-if (this._resource.path && this._resource.lastPathComponent) {\r
-var lastPathComponentIndex = this._resource.path.lastIndexOf("/" + this._resource.lastPathComponent);\r
-if (lastPathComponentIndex != -1)\r
-subtitle += this._resource.path.substring(0, lastPathComponentIndex);\r
-}\r
-\r
-this._appendSubtitle(this._nameCell, subtitle);\r
-this._nameCell.title = this._resource.url;\r
-},\r
-\r
-_fileName: function()\r
-{\r
-var fileName = this._resource.displayName;\r
-if (this._resource.queryString)\r
-fileName += "?" + this._resource.queryString;\r
-return fileName;\r
-},\r
-\r
-_refreshStatusCell: function()\r
-{\r
-this._statusCell.removeChildren();\r
-\r
-var fromCache = this._resource.cached;\r
-if (fromCache) {\r
-this._statusCell.textContent = WebInspector.UIString("(from cache)");\r
-this._statusCell.addStyleClass("network-dim-cell");\r
-return;\r
-}\r
-\r
-this._statusCell.removeStyleClass("network-dim-cell");\r
-if (this._resource.statusCode) {\r
-this._statusCell.appendChild(document.createTextNode(this._resource.statusCode));\r
-this._statusCell.removeStyleClass("network-dim-cell");\r
-this._appendSubtitle(this._statusCell, this._resource.statusText);\r
-this._statusCell.title = this._resource.statusCode + " " + this._resource.statusText;\r
-} else {\r
-this._statusCell.addStyleClass("network-dim-cell");\r
-this._statusCell.textContent = WebInspector.UIString("Pending");\r
-}\r
-},\r
-\r
-_refreshSizeCell: function()\r
-{\r
-var resourceSize = typeof this._resource.resourceSize === "number" ? Number.bytesToString(this._resource.resourceSize) : "?";\r
-var transferSize = typeof this._resource.transferSize === "number" ? Number.bytesToString(this._resource.transferSize) : "?";\r
-var fromCache = this._resource.cached;\r
-this._sizeCell.textContent = !fromCache ? resourceSize : WebInspector.UIString("(from cache)");\r
-if (fromCache)\r
-this._sizeCell.addStyleClass("network-dim-cell");\r
-else\r
-this._sizeCell.removeStyleClass("network-dim-cell");\r
-if (!fromCache)\r
-this._appendSubtitle(this._sizeCell, transferSize);\r
-},\r
-\r
-_refreshTimeCell: function()\r
-{\r
-if (this._resource.duration > 0) {\r
-this._timeCell.removeStyleClass("network-dim-cell");\r
-this._timeCell.textContent = Number.secondsToString(this._resource.duration);\r
-this._appendSubtitle(this._timeCell, Number.secondsToString(this._resource.latency));\r
-} else {\r
-this._timeCell.addStyleClass("network-dim-cell");\r
-this._timeCell.textContent = WebInspector.UIString("Pending");\r
-}\r
-},\r
-\r
-_appendSubtitle: function(cellElement, subtitleText)\r
-{\r
-var subtitleElement = document.createElement("div");\r
-subtitleElement.className = "network-cell-subtitle";\r
-subtitleElement.textContent = subtitleText;\r
-cellElement.appendChild(subtitleElement);\r
-},\r
-\r
-refreshGraph: function(calculator)\r
-{\r
-var percentages = calculator.computeBarGraphPercentages(this._resource);\r
-this._percentages = percentages;\r
-\r
-this._barAreaElement.removeStyleClass("hidden");\r
-\r
-if (!this._graphElement.hasStyleClass("network-category-" + this._resource.category.name)) {\r
-this._graphElement.removeMatchingStyleClasses("network-category-\\w+");\r
-this._graphElement.addStyleClass("network-category-" + this._resource.category.name);\r
-}\r
-\r
-this._barLeftElement.style.setProperty("left", percentages.start + "%");\r
-this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");\r
-\r
-this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");\r
-this._barRightElement.style.setProperty("left", percentages.middle + "%");\r
-\r
-var labels = calculator.computeBarGraphLabels(this._resource);\r
-this._labelLeftElement.textContent = labels.left;\r
-this._labelRightElement.textContent = labels.right;\r
-\r
-var tooltip = (labels.tooltip || "");\r
-this._barLeftElement.title = tooltip;\r
-this._labelLeftElement.title = tooltip;\r
-this._labelRightElement.title = tooltip;\r
-this._barRightElement.title = tooltip;\r
-},\r
-\r
-_refreshLabelPositions: function()\r
-{\r
-if (!this._percentages)\r
-return;\r
-this._labelLeftElement.style.removeProperty("left");\r
-this._labelLeftElement.style.removeProperty("right");\r
-this._labelLeftElement.removeStyleClass("before");\r
-this._labelLeftElement.removeStyleClass("hidden");\r
-\r
-this._labelRightElement.style.removeProperty("left");\r
-this._labelRightElement.style.removeProperty("right");\r
-this._labelRightElement.removeStyleClass("after");\r
-this._labelRightElement.removeStyleClass("hidden");\r
-\r
-const labelPadding = 10;\r
-const barRightElementOffsetWidth = this._barRightElement.offsetWidth;\r
-const barLeftElementOffsetWidth = this._barLeftElement.offsetWidth;\r
-\r
-if (this._barLeftElement) {\r
-var leftBarWidth = barLeftElementOffsetWidth - labelPadding;\r
-var rightBarWidth = (barRightElementOffsetWidth - barLeftElementOffsetWidth) - labelPadding;\r
-} else {\r
-var leftBarWidth = (barLeftElementOffsetWidth - barRightElementOffsetWidth) - labelPadding;\r
-var rightBarWidth = barRightElementOffsetWidth - labelPadding;\r
-}\r
-\r
-const labelLeftElementOffsetWidth = this._labelLeftElement.offsetWidth;\r
-const labelRightElementOffsetWidth = this._labelRightElement.offsetWidth;\r
-\r
-const labelBefore = (labelLeftElementOffsetWidth > leftBarWidth);\r
-const labelAfter = (labelRightElementOffsetWidth > rightBarWidth);\r
-const graphElementOffsetWidth = this._graphElement.offsetWidth;\r
-\r
-if (labelBefore && (graphElementOffsetWidth * (this._percentages.start / 100)) < (labelLeftElementOffsetWidth + 10))\r
-var leftHidden = true;\r
-\r
-if (labelAfter && (graphElementOffsetWidth * ((100 - this._percentages.end) / 100)) < (labelRightElementOffsetWidth + 10))\r
-var rightHidden = true;\r
-\r
-if (barLeftElementOffsetWidth == barRightElementOffsetWidth) {\r
-\r
-if (labelBefore && !labelAfter)\r
-leftHidden = true;\r
-else if (labelAfter && !labelBefore)\r
-rightHidden = true;\r
-}\r
-\r
-if (labelBefore) {\r
-if (leftHidden)\r
-this._labelLeftElement.addStyleClass("hidden");\r
-this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");\r
-this._labelLeftElement.addStyleClass("before");\r
-} else {\r
-this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");\r
-this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");\r
-}\r
-\r
-if (labelAfter) {\r
-if (rightHidden)\r
-this._labelRightElement.addStyleClass("hidden");\r
-this._labelRightElement.style.setProperty("left", this._percentages.end + "%");\r
-this._labelRightElement.addStyleClass("after");\r
-} else {\r
-this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");\r
-this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");\r
-}\r
-}\r
-}\r
-\r
-WebInspector.NetworkDataGridNode.NameComparator = function(a, b)\r
-{\r
-var aFileName = a._resource.displayName + (a._resource.queryString ? a._resource.queryString : "");\r
-var bFileName = b._resource.displayName + (b._resource.queryString ? b._resource.queryString : "");\r
-if (aFileName > bFileName)\r
-return 1;\r
-if (bFileName > aFileName)\r
-return -1;\r
-return 0;\r
-}\r
-\r
-WebInspector.NetworkDataGridNode.SizeComparator = function(a, b)\r
-{\r
-if (b._resource.cached && !a._resource.cached)\r
-return 1;\r
-if (a._resource.cached && !b._resource.cached)\r
-return -1;\r
-\r
-if (a._resource.resourceSize === b._resource.resourceSize)\r
-return 0;\r
-\r
-return a._resource.resourceSize - b._resource.resourceSize;\r
-}\r
-\r
-WebInspector.NetworkDataGridNode.ResourcePropertyComparator = function(propertyName, revert, a, b)\r
-{\r
-var aValue = a._resource[propertyName];\r
-var bValue = b._resource[propertyName];\r
-if (aValue > bValue)\r
-return revert ? -1 : 1;\r
-if (bValue > aValue)\r
-return revert ? 1 : -1;\r
-return 0;\r
-}\r
-\r
-WebInspector.NetworkDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;\r
-\r
-WebInspector.NetworkTotalGridNode = function(element)\r
-{\r
-this._summaryBarElement = element;\r
-WebInspector.DataGridNode.call(this, {summaryRow: true});\r
-}\r
-\r
-WebInspector.NetworkTotalGridNode.prototype = {\r
-createCells: function()\r
-{\r
-var td = document.createElement("td");\r
-td.setAttribute("colspan", 7);\r
-td.className = "network-summary";\r
-td.appendChild(this._summaryBarElement);\r
-this._element.appendChild(td);\r
-}\r
-}\r
-\r
-WebInspector.NetworkTotalGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;\r
-\r
-\r
-\r
-\r
-\r
-var InjectedFakeWorker = function(InjectedScriptHost, inspectedWindow, injectedScriptId)\r
-{\r
-\r
-Worker = function(url)\r
-{\r
-var impl = new FakeWorker(this, url);\r
-if (impl === null)\r
-return null;\r
-\r
-this.isFake = true;\r
-this.postMessage = bind(impl.postMessage, impl);\r
-this.terminate = bind(impl.terminate, impl);\r
-\r
-function onmessageGetter()\r
-{\r
-return impl.channel.port1.onmessage;\r
-}\r
-function onmessageSetter(callback)\r
-{\r
-impl.channel.port1.onmessage = callback;\r
-}\r
-this.__defineGetter__("onmessage", onmessageGetter);\r
-this.__defineSetter__("onmessage", onmessageSetter);\r
-this.addEventListener = bind(impl.channel.port1.addEventListener, impl.channel.port1);\r
-this.removeEventListener = bind(impl.channel.port1.removeEventListener, impl.channel.port1);\r
-this.dispatchEvent = bind(impl.channel.port1.dispatchEvent, impl.channel.port1);\r
-}\r
-\r
-function FakeWorker(worker, url)\r
-{\r
-var scriptURL = this._expandURLAndCheckOrigin(document.baseURI, location.href, url);\r
-\r
-this._worker = worker;\r
-this._id = InjectedScriptHost.nextWorkerId();\r
-this.channel = new MessageChannel();\r
-this._listeners = [];\r
-this._buildWorker(scriptURL);\r
-\r
-InjectedScriptHost.didCreateWorker(this._id, scriptURL.url, false);\r
-}\r
-\r
-FakeWorker.prototype = {\r
-postMessage: function(msg, opt_ports)\r
-{\r
-if (this._frame != null)\r
-this.channel.port1.postMessage.apply(this.channel.port1, arguments);\r
-else if (this._pendingMessages)\r
-this._pendingMessages.push(arguments)\r
-else\r
-this._pendingMessages = [ arguments ];\r
-},\r
-\r
-terminate: function()\r
-{\r
-InjectedScriptHost.didDestroyWorker(this._id);\r
-\r
-this.channel.port1.close();\r
-this.channel.port2.close();\r
-if (this._frame != null)\r
-this._frame.frameElement.parentNode.removeChild(this._frame.frameElement);\r
-this._frame = null;\r
-this._worker = null; \r
-},\r
-\r
-_buildWorker: function(url)\r
-{\r
-var code = this._loadScript(url.url);\r
-var iframeElement = document.createElement("iframe");\r
-iframeElement.style.display = "none";\r
-\r
-this._document = document;\r
-iframeElement.onload = bind(this._onWorkerFrameLoaded, this, iframeElement, url, code);\r
-\r
-if (document.body)\r
-this._attachWorkerFrameToDocument(iframeElement, url, code);\r
-else\r
-window.addEventListener("load", bind(this._attachWorkerFrameToDocument, this, iframeElement), false);\r
-},\r
-\r
-_attachWorkerFrameToDocument: function(iframeElement)\r
-{\r
-document.body.appendChild(iframeElement);\r
-},\r
-\r
-_onWorkerFrameLoaded: function(iframeElement, url, code)\r
-{\r
-var frame = iframeElement.contentWindow;\r
-this._frame = frame;\r
-this._setupWorkerContext(frame, url);\r
-\r
-var frameContents = '(function() { var location = __devtools.location; var window; ' + code + '})();\n' + '//@ sourceURL=' + url.url;\r
-\r
-frame.eval(frameContents);\r
-if (this._pendingMessages) {\r
-for (var msg = 0; msg < this._pendingMessages.length; ++msg)\r
-this.postMessage.apply(this, this._pendingMessages[msg]);\r
-delete this._pendingMessages;\r
-}\r
-},\r
-\r
-_setupWorkerContext: function(workerFrame, url)\r
-{\r
-workerFrame.__devtools = {\r
-handleException: bind(this._handleException, this),\r
-location: url.mockLocation()\r
-};\r
-\r
-var self = this;\r
-\r
-function onmessageGetter()\r
-{\r
-return self.channel.port2.onmessage ? self.channel.port2.onmessage.originalCallback : null;\r
-}\r
-\r
-function onmessageSetter(callback)\r
-{\r
-var wrappedCallback = bind(self._callbackWrapper, self, callback);\r
-wrappedCallback.originalCallback = callback;\r
-self.channel.port2.onmessage = wrappedCallback;\r
-}\r
-\r
-workerFrame.__defineGetter__("onmessage", onmessageGetter);\r
-workerFrame.__defineSetter__("onmessage", onmessageSetter);\r
-workerFrame.addEventListener = bind(this._addEventListener, this);\r
-workerFrame.removeEventListener = bind(this._removeEventListener, this);\r
-workerFrame.dispatchEvent = bind(this.channel.port2.dispatchEvent, this.channel.port2);\r
-workerFrame.postMessage = bind(this.channel.port2.postMessage, this.channel.port2);\r
-workerFrame.importScripts = bind(this._importScripts, this, workerFrame);\r
-workerFrame.close = bind(this.terminate, this);\r
-},\r
-\r
-_addEventListener: function(type, callback, useCapture)\r
-{\r
-var wrappedCallback = bind(this._callbackWrapper, this, callback);\r
-wrappedCallback.originalCallback = callback;\r
-wrappedCallback.type = type;\r
-wrappedCallback.useCapture = Boolean(useCapture);\r
-\r
-this.channel.port2.addEventListener(type, wrappedCallback, useCapture);\r
-this._listeners.push(wrappedCallback);\r
-},\r
-\r
-_removeEventListener: function(type, callback, useCapture)\r
-{\r
-var listeners = this._listeners;\r
-for (var i = 0; i < listeners.length; ++i) {\r
-if (listeners[i].originalCallback === callback &&\r
-listeners[i].type === type && \r
-listeners[i].useCapture === Boolean(useCapture)) {\r
-this.channel.port2.removeEventListener(type, listeners[i], useCapture);\r
-listeners[i] = listeners[listeners.length - 1];\r
-listeners.pop();\r
-break;\r
-}\r
-}\r
-},\r
-\r
-_callbackWrapper: function(callback, msg)\r
-{\r
-\r
-if (!this._frame.onerror && !this._worker.onerror) {\r
-callback(msg);\r
-return;\r
-}\r
-\r
-try {\r
-callback(msg);\r
-} catch (e) {\r
-this._handleException(e, this._frame.onerror, this._worker.onerror);\r
-}\r
-},\r
-\r
-_handleException: function(e)\r
-{\r
-\r
-\r
-var errorEvent = this._document.createEvent("Event");\r
-errorEvent.initEvent("Event", false, false);\r
-errorEvent.message = "Uncaught exception";\r
-\r
-for (var i = 1; i < arguments.length; ++i) {\r
-if (arguments[i] && arguments[i](errorEvent))\r
-return;\r
-}\r
-\r
-throw e;\r
-},\r
-\r
-_importScripts: function(targetFrame)\r
-{\r
-for (var i = 1; i < arguments.length; ++i) {\r
-var workerOrigin = targetFrame.__devtools.location.href;\r
-var url = this._expandURLAndCheckOrigin(workerOrigin, workerOrigin, arguments[i]);\r
-targetFrame.eval(this._loadScript(url.url) + "\n//@ sourceURL= " + url.url);\r
-}\r
-},\r
-\r
-_loadScript: function(url)\r
-{\r
-var xhr = new XMLHttpRequest();\r
-xhr.open("GET", url, false);\r
-xhr.send(null);\r
-\r
-var text = xhr.responseText;\r
-if (xhr.status != 0 && xhr.status/100 !== 2) { \r
-console.error("Failed to load worker: " + url + "[" + xhr.status + "]");\r
-text = ""; \r
-}\r
-return text;\r
-},\r
-\r
-_expandURLAndCheckOrigin: function(baseURL, origin, url)\r
-{\r
-var scriptURL = new URL(baseURL).completeWith(url);\r
-\r
-if (!scriptURL.sameOrigin(origin))\r
-throw new DOMCoreException("SECURITY_ERR",18);\r
-return scriptURL;\r
-}\r
-};\r
-\r
-function URL(url)\r
-{\r
-this.url = url;\r
-this.split();\r
-}\r
-\r
-URL.prototype = {\r
-urlRegEx: (/^(http[s]?|file):\/\/([^\/:]*)(:[\d]+)?(?:(\/[^#?]*)(\?[^#]*)?(?:#(.*))?)?$/i),\r
-\r
-split: function()\r
-{\r
-function emptyIfNull(str)\r
-{\r
-return str == null ? "" : str;\r
-}\r
-var parts = this.urlRegEx.exec(this.url);\r
-\r
-this.schema = parts[1];\r
-this.host = parts[2];\r
-this.port = emptyIfNull(parts[3]);\r
-this.path = emptyIfNull(parts[4]);\r
-this.query = emptyIfNull(parts[5]);\r
-this.fragment = emptyIfNull(parts[6]);\r
-},\r
-\r
-mockLocation: function()\r
-{\r
-var host = this.host.replace(/^[^@]*@/, "");\r
-\r
-return {\r
-href:     this.url,\r
-protocol: this.schema + ":",\r
-host:     host,\r
-hostname: host,\r
-port:     this.port,\r
-pathname: this.path,\r
-search:   this.query,\r
-hash:     this.fragment\r
-};\r
-},\r
-\r
-completeWith: function(url)\r
-{\r
-if (url === "" || /^[^/]*:/.exec(url)) // If given absolute url, return as is now.\r
-return new URL(url);\r
-\r
-var relParts = /^([^#?]*)(.*)$/.exec(url); \r
-\r
-var path = (relParts[1].slice(0, 1) === "/" ? "" : this.path.replace(/[^/]*$/, "")) + relParts[1];\r
-path = path.replace(/(\/\.)+(\/|$)/g, "/").replace(/[^/]*\/\.\.(\/|$)/g, "");\r
-\r
-return new URL(this.schema + "://" + this.host + this.port + path + relParts[2]);\r
-},\r
-\r
-sameOrigin: function(url)\r
-{\r
-function normalizePort(schema, port)\r
-{\r
-var portNo = port.slice(1);\r
-return (schema === "https" && portNo == 443 || schema === "http" && portNo == 80) ? "" : port;\r
-}\r
-\r
-var other = new URL(url);\r
-\r
-return this.schema === other.schema &&\r
-this.host === other.host &&\r
-normalizePort(this.schema, this.port) === normalizePort(other.schema, other.port);\r
-}\r
-};\r
-\r
-function DOMCoreException(name, code)\r
-{\r
-function formatError()\r
-{\r
-return "Error: " + this.message;\r
-}\r
-\r
-this.name = name;\r
-this.message = name + ": DOM Exception " + code;\r
-this.code = code;\r
-this.toString = bind(formatError, this);\r
-}\r
-\r
-function bind(func, thisObject)\r
-{\r
-var args = Array.prototype.slice.call(arguments, 2);\r
-return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))); };\r
-}\r
-\r
-function noop()\r
-{\r
-}\r
-\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ScriptsPanel = function()\r
-{\r
-WebInspector.Panel.call(this, "scripts");\r
-\r
-this.topStatusBar = document.createElement("div");\r
-this.topStatusBar.className = "status-bar";\r
-this.topStatusBar.id = "scripts-status-bar";\r
-this.element.appendChild(this.topStatusBar);\r
-\r
-this.backButton = document.createElement("button");\r
-this.backButton.className = "status-bar-item";\r
-this.backButton.id = "scripts-back";\r
-this.backButton.title = WebInspector.UIString("Show the previous script resource.");\r
-this.backButton.disabled = true;\r
-this.backButton.appendChild(document.createElement("img"));\r
-this.backButton.addEventListener("click", this._goBack.bind(this), false);\r
-this.topStatusBar.appendChild(this.backButton);\r
-\r
-this.forwardButton = document.createElement("button");\r
-this.forwardButton.className = "status-bar-item";\r
-this.forwardButton.id = "scripts-forward";\r
-this.forwardButton.title = WebInspector.UIString("Show the next script resource.");\r
-this.forwardButton.disabled = true;\r
-this.forwardButton.appendChild(document.createElement("img"));\r
-this.forwardButton.addEventListener("click", this._goForward.bind(this), false);\r
-this.topStatusBar.appendChild(this.forwardButton);\r
-\r
-this.filesSelectElement = document.createElement("select");\r
-this.filesSelectElement.className = "status-bar-item";\r
-this.filesSelectElement.id = "scripts-files";\r
-this.filesSelectElement.addEventListener("change", this._changeVisibleFile.bind(this), false);\r
-this.topStatusBar.appendChild(this.filesSelectElement);\r
-\r
-this.functionsSelectElement = document.createElement("select");\r
-this.functionsSelectElement.className = "status-bar-item";\r
-this.functionsSelectElement.id = "scripts-functions";\r
-\r
-\r
-\r
-\r
-this.sidebarButtonsElement = document.createElement("div");\r
-this.sidebarButtonsElement.id = "scripts-sidebar-buttons";\r
-this.topStatusBar.appendChild(this.sidebarButtonsElement);\r
-\r
-this.pauseButton = document.createElement("button");\r
-this.pauseButton.className = "status-bar-item";\r
-this.pauseButton.id = "scripts-pause";\r
-this.pauseButton.title = WebInspector.UIString("Pause script execution.");\r
-this.pauseButton.disabled = true;\r
-this.pauseButton.appendChild(document.createElement("img"));\r
-this.pauseButton.addEventListener("click", this._togglePause.bind(this), false);\r
-this.sidebarButtonsElement.appendChild(this.pauseButton);\r
-\r
-this.stepOverButton = document.createElement("button");\r
-this.stepOverButton.className = "status-bar-item";\r
-this.stepOverButton.id = "scripts-step-over";\r
-this.stepOverButton.title = WebInspector.UIString("Step over next function call.");\r
-this.stepOverButton.disabled = true;\r
-this.stepOverButton.addEventListener("click", this._stepOverClicked.bind(this), false);\r
-this.stepOverButton.appendChild(document.createElement("img"));\r
-this.sidebarButtonsElement.appendChild(this.stepOverButton);\r
-\r
-this.stepIntoButton = document.createElement("button");\r
-this.stepIntoButton.className = "status-bar-item";\r
-this.stepIntoButton.id = "scripts-step-into";\r
-this.stepIntoButton.title = WebInspector.UIString("Step into next function call.");\r
-this.stepIntoButton.disabled = true;\r
-this.stepIntoButton.addEventListener("click", this._stepIntoClicked.bind(this), false);\r
-this.stepIntoButton.appendChild(document.createElement("img"));\r
-this.sidebarButtonsElement.appendChild(this.stepIntoButton);\r
-\r
-this.stepOutButton = document.createElement("button");\r
-this.stepOutButton.className = "status-bar-item";\r
-this.stepOutButton.id = "scripts-step-out";\r
-this.stepOutButton.title = WebInspector.UIString("Step out of current function.");\r
-this.stepOutButton.disabled = true;\r
-this.stepOutButton.addEventListener("click", this._stepOutClicked.bind(this), false);\r
-this.stepOutButton.appendChild(document.createElement("img"));\r
-this.sidebarButtonsElement.appendChild(this.stepOutButton);\r
-\r
-this.toggleBreakpointsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Deactivate all breakpoints."), "toggle-breakpoints");\r
-this.toggleBreakpointsButton.toggled = true;\r
-this.toggleBreakpointsButton.addEventListener("click", this.toggleBreakpointsClicked.bind(this), false);\r
-this.sidebarButtonsElement.appendChild(this.toggleBreakpointsButton.element);\r
-\r
-this.debuggerStatusElement = document.createElement("div");\r
-this.debuggerStatusElement.id = "scripts-debugger-status";\r
-this.sidebarButtonsElement.appendChild(this.debuggerStatusElement);\r
-\r
-this.viewsContainerElement = document.createElement("div");\r
-this.viewsContainerElement.id = "script-resource-views";\r
-\r
-this.sidebarElement = document.createElement("div");\r
-this.sidebarElement.id = "scripts-sidebar";\r
-\r
-this.sidebarResizeElement = document.createElement("div");\r
-this.sidebarResizeElement.className = "sidebar-resizer-vertical";\r
-this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);\r
-\r
-this.sidebarResizeWidgetElement = document.createElement("div");\r
-this.sidebarResizeWidgetElement.id = "scripts-sidebar-resizer-widget";\r
-this.sidebarResizeWidgetElement.addEventListener("mousedown", this._startSidebarResizeDrag.bind(this), false);\r
-this.topStatusBar.appendChild(this.sidebarResizeWidgetElement);\r
-\r
-this.sidebarPanes = {};\r
-this.sidebarPanes.watchExpressions = new WebInspector.WatchExpressionsSidebarPane();\r
-this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane();\r
-this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane();\r
-this.sidebarPanes.jsBreakpoints = WebInspector.createJSBreakpointsSidebarPane();\r
-if (Preferences.nativeInstrumentationEnabled) {\r
-this.sidebarPanes.domBreakpoints = WebInspector.createDOMBreakpointsSidebarPane();\r
-this.sidebarPanes.xhrBreakpoints = WebInspector.createXHRBreakpointsSidebarPane();\r
-this.sidebarPanes.eventListenerBreakpoints = new WebInspector.EventListenerBreakpointsSidebarPane();\r
-}\r
-\r
-this.sidebarPanes.workers = new WebInspector.WorkersSidebarPane();\r
-\r
-for (var pane in this.sidebarPanes)\r
-this.sidebarElement.appendChild(this.sidebarPanes[pane].element);\r
-\r
-this.sidebarPanes.callstack.expanded = true;\r
-this.sidebarPanes.callstack.addEventListener("call frame selected", this._callFrameSelected, this);\r
-\r
-this.sidebarPanes.scopechain.expanded = true;\r
-this.sidebarPanes.jsBreakpoints.expanded = true;\r
-\r
-var panelEnablerHeading = WebInspector.UIString("You need to enable debugging before you can use the Scripts panel.");\r
-var panelEnablerDisclaimer = WebInspector.UIString("Enabling debugging will make scripts run slower.");\r
-var panelEnablerButton = WebInspector.UIString("Enable Debugging");\r
-\r
-this.panelEnablerView = new WebInspector.PanelEnablerView("scripts", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);\r
-this.panelEnablerView.addEventListener("enable clicked", this._enableDebugging, this);\r
-\r
-this.element.appendChild(this.panelEnablerView.element);\r
-this.element.appendChild(this.viewsContainerElement);\r
-this.element.appendChild(this.sidebarElement);\r
-this.element.appendChild(this.sidebarResizeElement);\r
-\r
-this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");\r
-this.enableToggleButton.addEventListener("click", this._toggleDebugging.bind(this), false);\r
-if (Preferences.debuggerAlwaysEnabled)\r
-this.enableToggleButton.element.addStyleClass("hidden");\r
-\r
-this._pauseOnExceptionButton = new WebInspector.StatusBarButton("", "scripts-pause-on-exceptions-status-bar-item", 3);\r
-this._pauseOnExceptionButton.addEventListener("click", this._togglePauseOnExceptions.bind(this), false);\r
-this._pauseOnExceptionButton.state = WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions;\r
-this._pauseOnExceptionButton.title = WebInspector.UIString("Don't pause on exceptions.\nClick to Pause on all exceptions.");\r
-\r
-this._registerShortcuts();\r
-\r
-this._debuggerEnabled = Preferences.debuggerAlwaysEnabled;\r
-\r
-this.reset();\r
-\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._failedToParseScriptSource, this);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this);\r
-}\r
-\r
-\r
-WebInspector.ScriptsPanel.PauseOnExceptionsState = {\r
-DontPauseOnExceptions : 0,\r
-PauseOnAllExceptions : 1,\r
-PauseOnUncaughtExceptions: 2\r
-};\r
-\r
-WebInspector.ScriptsPanel.prototype = {\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Scripts");\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-return [this.enableToggleButton.element, this._pauseOnExceptionButton.element];\r
-},\r
-\r
-get defaultFocusedElement()\r
-{\r
-return this.filesSelectElement;\r
-},\r
-\r
-get paused()\r
-{\r
-return this._paused;\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-this.sidebarResizeElement.style.right = (this.sidebarElement.offsetWidth - 3) + "px";\r
-\r
-if (this.visibleView)\r
-this.visibleView.show(this.viewsContainerElement);\r
-\r
-if (this._attachDebuggerWhenShown) {\r
-InspectorBackend.enableDebugger(false);\r
-delete this._attachDebuggerWhenShown;\r
-}\r
-},\r
-\r
-hide: function()\r
-{\r
-if (this.visibleView)\r
-this.visibleView.hide();\r
-WebInspector.Panel.prototype.hide.call(this);\r
-},\r
-\r
-get breakpointsActivated()\r
-{\r
-return this.toggleBreakpointsButton.toggled;\r
-},\r
-\r
-_parsedScriptSource: function(event)\r
-{\r
-var sourceID = event.data;\r
-var script = WebInspector.debuggerModel.scriptForSourceID(sourceID);\r
-this._addScript(script);\r
-},\r
-\r
-_failedToParseScriptSource: function(event)\r
-{\r
-this._addScript(event.data);\r
-},\r
-\r
-_addScript: function(script)\r
-{\r
-var resource = WebInspector.resourceForURL(script.sourceURL);\r
-if (resource) {\r
-if (resource.finished) {\r
-\r
-script.resource = resource;\r
-var view = WebInspector.ResourceManager.existingResourceViewForResource(resource);\r
-if (view && view.sourceFrame)\r
-view.sourceFrame.addScript(script);\r
-} else {\r
-\r
-if (!resource._scriptsPendingResourceLoad) {\r
-resource._scriptsPendingResourceLoad = [];\r
-resource.addEventListener("finished", this._resourceLoadingFinished, this);\r
-}\r
-resource._scriptsPendingResourceLoad.push(script);\r
-}\r
-}\r
-this._addScriptToFilesMenu(script);\r
-},\r
-\r
-_resourceLoadingFinished: function(e)\r
-{\r
-var resource = e.target;\r
-for (var i = 0; i < resource._scriptsPendingResourceLoad.length; ++i) {\r
-\r
-var script = resource._scriptsPendingResourceLoad[i];\r
-script.resource = resource;\r
-\r
-\r
-script.filesSelectOption.parentElement.removeChild(script.filesSelectOption);\r
-}\r
-\r
-this._addScriptToFilesMenu(resource._scriptsPendingResourceLoad[0]);\r
-delete resource._scriptsPendingResourceLoad;\r
-},\r
-\r
-canEditScripts: function()\r
-{\r
-return Preferences.canEditScriptSource;\r
-},\r
-\r
-editScriptSource: function(editData, commitEditingCallback, cancelEditingCallback)\r
-{\r
-if (!this.canEditScripts())\r
-return;\r
-\r
-\r
-var breakpoints = WebInspector.debuggerModel.queryBreakpoints(function(b) { return b.sourceID === editData.sourceID });\r
-for (var i = 0; i < breakpoints.length; ++i)\r
-breakpoints[i].remove();\r
-\r
-function mycallback(success, newBodyOrErrorMessage, callFrames)\r
-{\r
-if (success) {\r
-commitEditingCallback(newBodyOrErrorMessage);\r
-if (callFrames && callFrames.length)\r
-this._debuggerPaused({ data: { callFrames: callFrames } });\r
-} else {\r
-if (cancelEditingCallback)\r
-cancelEditingCallback();\r
-WebInspector.log(newBodyOrErrorMessage, WebInspector.ConsoleMessage.MessageLevel.Warning);\r
-}\r
-for (var i = 0; i < breakpoints.length; ++i) {\r
-var breakpoint = breakpoints[i];\r
-var newLine = breakpoint.line;\r
-if (success && breakpoint.line >= editData.line)\r
-newLine += editData.linesCountToShift;\r
-WebInspector.debuggerModel.setBreakpoint(editData.sourceID, newLine, breakpoint.enabled, breakpoint.condition);\r
-}\r
-};\r
-InspectorBackend.editScriptSource(editData.sourceID, editData.content, mycallback.bind(this));\r
-},\r
-\r
-selectedCallFrameId: function()\r
-{\r
-var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;\r
-if (!selectedCallFrame)\r
-return null;\r
-return selectedCallFrame.id;\r
-},\r
-\r
-evaluateInSelectedCallFrame: function(code, updateInterface, objectGroup, callback)\r
-{\r
-var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;\r
-if (!this._paused || !selectedCallFrame)\r
-return;\r
-\r
-if (typeof updateInterface === "undefined")\r
-updateInterface = true;\r
-\r
-var self = this;\r
-function updatingCallbackWrapper(result)\r
-{\r
-callback(result);\r
-if (updateInterface)\r
-self.sidebarPanes.scopechain.update(selectedCallFrame);\r
-}\r
-this.doEvalInCallFrame(selectedCallFrame, code, objectGroup, updatingCallbackWrapper);\r
-},\r
-\r
-doEvalInCallFrame: function(callFrame, code, objectGroup, callback)\r
-{\r
-function evalCallback(result)\r
-{\r
-if (result)\r
-callback(WebInspector.RemoteObject.fromPayload(result));\r
-}\r
-InjectedScriptAccess.get(callFrame.worldId).evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);\r
-},\r
-\r
-_debuggerPaused: function(event)\r
-{\r
-var callFrames = event.data.callFrames;\r
-\r
-this._paused = true;\r
-this._waitingToPause = false;\r
-this._stepping = false;\r
-\r
-this._updateDebuggerButtons();\r
-\r
-WebInspector.currentPanel = this;\r
-\r
-this.sidebarPanes.callstack.update(callFrames, event.data.eventType, event.data.eventData);\r
-this.sidebarPanes.callstack.selectedCallFrame = callFrames[0];\r
-\r
-window.focus();\r
-InspectorFrontendHost.bringToFront();\r
-},\r
-\r
-_debuggerResumed: function()\r
-{\r
-this._paused = false;\r
-this._waitingToPause = false;\r
-this._stepping = false;\r
-\r
-this._clearInterface();\r
-},\r
-\r
-attachDebuggerWhenShown: function()\r
-{\r
-if (this.element.parentElement) {\r
-InspectorBackend.enableDebugger(false);\r
-} else {\r
-this._attachDebuggerWhenShown = true;\r
-}\r
-},\r
-\r
-debuggerWasEnabled: function()\r
-{\r
-if (this._debuggerEnabled)\r
-return;\r
-\r
-this._debuggerEnabled = true;\r
-this.reset(true);\r
-},\r
-\r
-debuggerWasDisabled: function()\r
-{\r
-if (!this._debuggerEnabled)\r
-return;\r
-\r
-this._debuggerEnabled = false;\r
-this.reset(true);\r
-},\r
-\r
-reset: function(preserveItems)\r
-{\r
-this.visibleView = null;\r
-\r
-delete this.currentQuery;\r
-this.searchCanceled();\r
-\r
-this._debuggerResumed();\r
-\r
-this._backForwardList = [];\r
-this._currentBackForwardIndex = -1;\r
-this._updateBackAndForwardButtons();\r
-\r
-this._resourceForURLInFilesSelect = {};\r
-this.filesSelectElement.removeChildren();\r
-this.functionsSelectElement.removeChildren();\r
-this.viewsContainerElement.removeChildren();\r
-\r
-var scripts = WebInspector.debuggerModel.queryScripts(function(s) { return !!s.resource; });\r
-for (var i = 0; i < scripts.length; ++i)\r
-delete scripts[i].resource._resourcesView;\r
-\r
-this.sidebarPanes.watchExpressions.refreshExpressions();\r
-if (!preserveItems)\r
-this.sidebarPanes.workers.reset();\r
-},\r
-\r
-get visibleView()\r
-{\r
-return this._visibleView;\r
-},\r
-\r
-set visibleView(x)\r
-{\r
-if (this._visibleView === x)\r
-return;\r
-\r
-if (this._visibleView)\r
-this._visibleView.hide();\r
-\r
-this._visibleView = x;\r
-\r
-if (x)\r
-x.show(this.viewsContainerElement);\r
-},\r
-\r
-viewRecreated: function(oldView, newView)\r
-{\r
-if (this._visibleView === oldView)\r
-this._visibleView = newView;\r
-},\r
-\r
-canShowSourceLine: function(url, line)\r
-{\r
-if (!this._debuggerEnabled)\r
-return false;\r
-return !!this._scriptOrResourceForURLAndLine(url, line);\r
-},\r
-\r
-showSourceLine: function(url, line)\r
-{\r
-var scriptOrResource = this._scriptOrResourceForURLAndLine(url, line);\r
-this._showScriptOrResource(scriptOrResource, {line: line, shouldHighlightLine: true});\r
-},\r
-\r
-_scriptOrResourceForURLAndLine: function(url, line)\r
-{\r
-var scripts = WebInspector.debuggerModel.scriptsForURL(url);\r
-for (var i = 0; i < scripts.length; ++i) {\r
-var script = scripts[i];\r
-if (script.resource)\r
-return script.resource;\r
-if (script.startingLine <= line && script.startingLine + script.linesCount > line)\r
-return script;\r
-}\r
-return null;\r
-},\r
-\r
-showView: function(view)\r
-{\r
-if (!view)\r
-return;\r
-this._showScriptOrResource(view.resource || view.script);\r
-},\r
-\r
-handleShortcut: function(event)\r
-{\r
-var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);\r
-var handler = this._shortcuts[shortcut];\r
-if (handler) {\r
-handler(event);\r
-event.handled = true;\r
-} else\r
-this.sidebarPanes.callstack.handleShortcut(event);\r
-},\r
-\r
-scriptViewForScript: function(script)\r
-{\r
-if (!script)\r
-return null;\r
-if (!script._scriptView)\r
-script._scriptView = new WebInspector.ScriptView(script);\r
-return script._scriptView;\r
-},\r
-\r
-sourceFrameForScript: function(script)\r
-{\r
-var view = this.scriptViewForScript(script);\r
-if (!view)\r
-return null;\r
-\r
-\r
-if (!this.element.parentNode)\r
-this.attach();\r
-\r
-view.setupSourceFrameIfNeeded();\r
-return view.sourceFrame;\r
-},\r
-\r
-_sourceFrameForScriptOrResource: function(scriptOrResource)\r
-{\r
-if (scriptOrResource instanceof WebInspector.Resource)\r
-return this._sourceFrameForResource(scriptOrResource);\r
-if (scriptOrResource instanceof WebInspector.Script)\r
-return this.sourceFrameForScript(scriptOrResource);\r
-},\r
-\r
-_sourceFrameForResource: function(resource)\r
-{\r
-var view = WebInspector.ResourceManager.resourceViewForResource(resource);\r
-if (!view)\r
-return null;\r
-\r
-if (!view.setupSourceFrameIfNeeded)\r
-return null;\r
-\r
-view.setupSourceFrameIfNeeded();\r
-return view.sourceFrame;\r
-},\r
-\r
-_showScriptOrResource: function(scriptOrResource, options)\r
-{\r
-\r
-options = options || {};\r
-\r
-if (!scriptOrResource)\r
-return;\r
-\r
-var view;\r
-if (scriptOrResource instanceof WebInspector.Resource)\r
-view = WebInspector.ResourceManager.resourceViewForResource(scriptOrResource);\r
-else if (scriptOrResource instanceof WebInspector.Script)\r
-view = this.scriptViewForScript(scriptOrResource);\r
-\r
-if (!view)\r
-return;\r
-\r
-var url = scriptOrResource.url || scriptOrResource.sourceURL;\r
-if (url && !options.initialLoad)\r
-WebInspector.settings.lastViewedScriptFile = url;\r
-\r
-if (!options.fromBackForwardAction) {\r
-var oldIndex = this._currentBackForwardIndex;\r
-if (oldIndex >= 0)\r
-this._backForwardList.splice(oldIndex + 1, this._backForwardList.length - oldIndex);\r
-\r
-\r
-\r
-var previousEntryIndex = this._backForwardList.indexOf(scriptOrResource);\r
-if (previousEntryIndex !== -1) {\r
-this._backForwardList.splice(previousEntryIndex, 1);\r
---this._currentBackForwardIndex;\r
-}\r
-\r
-this._backForwardList.push(scriptOrResource);\r
-++this._currentBackForwardIndex;\r
-\r
-this._updateBackAndForwardButtons();\r
-}\r
-\r
-this.visibleView = view;\r
-\r
-if (options.line) {\r
-if (view.revealLine)\r
-view.revealLine(options.line);\r
-if (view.highlightLine && options.shouldHighlightLine)\r
-view.highlightLine(options.line);\r
-}\r
-\r
-var option;\r
-if (scriptOrResource instanceof WebInspector.Script) {\r
-option = scriptOrResource.filesSelectOption;\r
-\r
-\r
-\r
-if (!option) {\r
-this._addScriptToFilesMenu(scriptOrResource, true);\r
-option = scriptOrResource.filesSelectOption;\r
-}\r
-\r
-console.assert(option);\r
-} else\r
-option = scriptOrResource.filesSelectOption;\r
-\r
-if (option)\r
-this.filesSelectElement.selectedIndex = option.index;\r
-},\r
-\r
-_addScriptToFilesMenu: function(script, force)\r
-{\r
-if (!script.sourceURL && !force)\r
-return;\r
-\r
-if (script.resource) {\r
-if (this._resourceForURLInFilesSelect[script.resource.url])\r
-return;\r
-this._resourceForURLInFilesSelect[script.resource.url] = script.resource;\r
-}\r
-\r
-var displayName = script.sourceURL ? WebInspector.displayNameForURL(script.sourceURL) : WebInspector.UIString("(program)");\r
-\r
-var select = this.filesSelectElement;\r
-var option = document.createElement("option");\r
-option.representedObject = script.resource || script;\r
-option.url = displayName;\r
-option.startingLine = script.startingLine;\r
-option.text = script.resource || script.startingLine === 1 ? displayName : String.sprintf("%s:%d", displayName, script.startingLine);\r
-\r
-function optionCompare(a, b)\r
-{\r
-if (a.url < b.url)\r
-return -1;\r
-else if (a.url > b.url)\r
-return 1;\r
-\r
-if (typeof a.startingLine !== "number")\r
-return -1;\r
-if (typeof b.startingLine !== "number")\r
-return -1;\r
-return a.startingLine - b.startingLine;\r
-}\r
-\r
-var insertionIndex = insertionIndexForObjectInListSortedByFunction(option, select.childNodes, optionCompare);\r
-if (insertionIndex < 0)\r
-select.appendChild(option);\r
-else\r
-select.insertBefore(option, select.childNodes.item(insertionIndex));\r
-\r
-if (script.resource)\r
-script.resource.filesSelectOption = option;\r
-else\r
-script.filesSelectOption = option;\r
-\r
-if (select.options[select.selectedIndex] === option) {\r
-\r
-\r
-this._showScriptOrResource(option.representedObject, {initialLoad: true});\r
-} else {\r
-\r
-var url = option.representedObject.url || option.representedObject.sourceURL;\r
-var lastURL = WebInspector.settings.lastViewedScriptFile;\r
-if (url && url === lastURL) {\r
-\r
-\r
-\r
-var isResource = !!option.representedObject.url;\r
-if (isResource || !this.visibleView || !this.visibleView.script || this.visibleView.script.sourceURL !== url)\r
-this._showScriptOrResource(option.representedObject, {initialLoad: true});\r
-}\r
-}\r
-\r
-if (script.worldType === WebInspector.Script.WorldType.EXTENSIONS_WORLD)\r
-script.filesSelectOption.addStyleClass("extension-script");\r
-},\r
-\r
-_clearCurrentExecutionLine: function()\r
-{\r
-if (this._executionSourceFrame)\r
-this._executionSourceFrame.executionLine = 0;\r
-delete this._executionSourceFrame;\r
-},\r
-\r
-_callFrameSelected: function()\r
-{\r
-this._clearCurrentExecutionLine();\r
-\r
-var callStackPane = this.sidebarPanes.callstack;\r
-var currentFrame = callStackPane.selectedCallFrame;\r
-if (!currentFrame)\r
-return;\r
-\r
-this.sidebarPanes.scopechain.update(currentFrame);\r
-this.sidebarPanes.watchExpressions.refreshExpressions();\r
-\r
-var script = WebInspector.debuggerModel.scriptForSourceID(currentFrame.sourceID);\r
-var scriptOrResource = script.resource || script;\r
-this._showScriptOrResource(scriptOrResource, {line: currentFrame.line});\r
-\r
-this._executionSourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);\r
-if (this._executionSourceFrame)\r
-this._executionSourceFrame.executionLine = currentFrame.line;\r
-},\r
-\r
-_changeVisibleFile: function(event)\r
-{\r
-var select = this.filesSelectElement;\r
-this._showScriptOrResource(select.options[select.selectedIndex].representedObject);\r
-},\r
-\r
-_startSidebarResizeDrag: function(event)\r
-{\r
-WebInspector.elementDragStart(this.sidebarElement, this._sidebarResizeDrag.bind(this), this._endSidebarResizeDrag.bind(this), event, "col-resize");\r
-\r
-if (event.target === this.sidebarResizeWidgetElement)\r
-this._dragOffset = (event.target.offsetWidth - (event.pageX - event.target.totalOffsetLeft));\r
-else\r
-this._dragOffset = 0;\r
-},\r
-\r
-_endSidebarResizeDrag: function(event)\r
-{\r
-WebInspector.elementDragEnd(event);\r
-delete this._dragOffset;\r
-this.saveSidebarWidth();\r
-},\r
-\r
-_sidebarResizeDrag: function(event)\r
-{\r
-var x = event.pageX + this._dragOffset;\r
-var newWidth = Number.constrain(window.innerWidth - x, Preferences.minScriptsSidebarWidth, window.innerWidth * 0.66);\r
-this.setSidebarWidth(newWidth);\r
-event.preventDefault();\r
-},\r
-\r
-setSidebarWidth: function(newWidth)\r
-{\r
-this.sidebarElement.style.width = newWidth + "px";\r
-this.sidebarButtonsElement.style.width = newWidth + "px";\r
-this.viewsContainerElement.style.right = newWidth + "px";\r
-this.sidebarResizeWidgetElement.style.right = newWidth + "px";\r
-this.sidebarResizeElement.style.right = (newWidth - 3) + "px";\r
-\r
-this.resize();\r
-},\r
-\r
-updatePauseOnExceptionsState: function(pauseOnExceptionsState)\r
-{\r
-if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions)\r
-this._pauseOnExceptionButton.title = WebInspector.UIString("Don't pause on exceptions.\nClick to Pause on all exceptions.");\r
-else if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnAllExceptions)\r
-this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on all exceptions.\nClick to Pause on uncaught exceptions.");\r
-else if (pauseOnExceptionsState == WebInspector.ScriptsPanel.PauseOnExceptionsState.PauseOnUncaughtExceptions)\r
-this._pauseOnExceptionButton.title = WebInspector.UIString("Pause on uncaught exceptions.\nClick to Not pause on exceptions.");\r
-\r
-this._pauseOnExceptionButton.state = pauseOnExceptionsState;\r
-},\r
-\r
-_updateDebuggerButtons: function()\r
-{\r
-if (this._debuggerEnabled) {\r
-this.enableToggleButton.title = WebInspector.UIString("Debugging enabled. Click to disable.");\r
-this.enableToggleButton.toggled = true;\r
-this._pauseOnExceptionButton.visible = true;\r
-this.panelEnablerView.visible = false;\r
-} else {\r
-this.enableToggleButton.title = WebInspector.UIString("Debugging disabled. Click to enable.");\r
-this.enableToggleButton.toggled = false;\r
-this._pauseOnExceptionButton.visible = false;\r
-this.panelEnablerView.visible = true;\r
-}\r
-\r
-if (this._paused) {\r
-this.pauseButton.addStyleClass("paused");\r
-\r
-this.pauseButton.disabled = false;\r
-this.stepOverButton.disabled = false;\r
-this.stepIntoButton.disabled = false;\r
-this.stepOutButton.disabled = false;\r
-\r
-this.debuggerStatusElement.textContent = WebInspector.UIString("Paused");\r
-} else {\r
-this.pauseButton.removeStyleClass("paused");\r
-\r
-this.pauseButton.disabled = this._waitingToPause;\r
-this.stepOverButton.disabled = true;\r
-this.stepIntoButton.disabled = true;\r
-this.stepOutButton.disabled = true;\r
-\r
-if (this._waitingToPause)\r
-this.debuggerStatusElement.textContent = WebInspector.UIString("Pausing");\r
-else if (this._stepping)\r
-this.debuggerStatusElement.textContent = WebInspector.UIString("Stepping");\r
-else\r
-this.debuggerStatusElement.textContent = "";\r
-}\r
-},\r
-\r
-_updateBackAndForwardButtons: function()\r
-{\r
-this.backButton.disabled = this._currentBackForwardIndex <= 0;\r
-this.forwardButton.disabled = this._currentBackForwardIndex >= (this._backForwardList.length - 1);\r
-},\r
-\r
-_clearInterface: function()\r
-{\r
-this.sidebarPanes.callstack.update(null);\r
-this.sidebarPanes.scopechain.update(null);\r
-\r
-this._clearCurrentExecutionLine();\r
-this._updateDebuggerButtons();\r
-},\r
-\r
-_goBack: function()\r
-{\r
-if (this._currentBackForwardIndex <= 0) {\r
-console.error("Can't go back from index " + this._currentBackForwardIndex);\r
-return;\r
-}\r
-\r
-this._showScriptOrResource(this._backForwardList[--this._currentBackForwardIndex], {fromBackForwardAction: true});\r
-this._updateBackAndForwardButtons();\r
-},\r
-\r
-_goForward: function()\r
-{\r
-if (this._currentBackForwardIndex >= this._backForwardList.length - 1) {\r
-console.error("Can't go forward from index " + this._currentBackForwardIndex);\r
-return;\r
-}\r
-\r
-this._showScriptOrResource(this._backForwardList[++this._currentBackForwardIndex], {fromBackForwardAction: true});\r
-this._updateBackAndForwardButtons();\r
-},\r
-\r
-_enableDebugging: function()\r
-{\r
-if (this._debuggerEnabled)\r
-return;\r
-this._toggleDebugging(this.panelEnablerView.alwaysEnabled);\r
-},\r
-\r
-_toggleDebugging: function(optionalAlways)\r
-{\r
-this._paused = false;\r
-this._waitingToPause = false;\r
-this._stepping = false;\r
-\r
-if (this._debuggerEnabled)\r
-InspectorBackend.disableDebugger(true);\r
-else\r
-InspectorBackend.enableDebugger(!!optionalAlways);\r
-},\r
-\r
-_togglePauseOnExceptions: function()\r
-{\r
-InspectorBackend.setPauseOnExceptionsState((this._pauseOnExceptionButton.state + 1) % this._pauseOnExceptionButton.states, this.updatePauseOnExceptionsState.bind(this));\r
-},\r
-\r
-_togglePause: function()\r
-{\r
-if (this._paused) {\r
-this._paused = false;\r
-this._waitingToPause = false;\r
-InspectorBackend.resume();\r
-} else {\r
-this._stepping = false;\r
-this._waitingToPause = true;\r
-InspectorBackend.pause();\r
-}\r
-\r
-this._clearInterface();\r
-},\r
-\r
-_stepOverClicked: function()\r
-{\r
-this._paused = false;\r
-this._stepping = true;\r
-\r
-this._clearInterface();\r
-\r
-InspectorBackend.stepOverStatement();\r
-},\r
-\r
-_stepIntoClicked: function()\r
-{\r
-this._paused = false;\r
-this._stepping = true;\r
-\r
-this._clearInterface();\r
-\r
-InspectorBackend.stepIntoStatement();\r
-},\r
-\r
-_stepOutClicked: function()\r
-{\r
-this._paused = false;\r
-this._stepping = true;\r
-\r
-this._clearInterface();\r
-\r
-InspectorBackend.stepOutOfFunction();\r
-},\r
-\r
-toggleBreakpointsClicked: function()\r
-{\r
-this.toggleBreakpointsButton.toggled = !this.toggleBreakpointsButton.toggled;\r
-if (this.toggleBreakpointsButton.toggled) {\r
-InspectorBackend.activateBreakpoints();\r
-this.toggleBreakpointsButton.title = WebInspector.UIString("Deactivate all breakpoints.");\r
-document.getElementById("main-panels").removeStyleClass("breakpoints-deactivated");\r
-} else {\r
-InspectorBackend.deactivateBreakpoints();\r
-this.toggleBreakpointsButton.title = WebInspector.UIString("Activate all breakpoints.");\r
-document.getElementById("main-panels").addStyleClass("breakpoints-deactivated");\r
-}\r
-},\r
-\r
-elementsToRestoreScrollPositionsFor: function()\r
-{\r
-return [ this.sidebarElement ];\r
-},\r
-\r
-_registerShortcuts: function()\r
-{\r
-var section = WebInspector.shortcutsHelp.section(WebInspector.UIString("Scripts Panel"));\r
-var handler, shortcut1, shortcut2;\r
-var platformSpecificModifier = WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta;\r
-\r
-this._shortcuts = {};\r
-\r
-\r
-handler = this.pauseButton.click.bind(this.pauseButton);\r
-shortcut1 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F8);\r
-this._shortcuts[shortcut1.key] = handler;\r
-shortcut2 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Slash, platformSpecificModifier);\r
-this._shortcuts[shortcut2.key] = handler;\r
-section.addAlternateKeys([ shortcut1.name, shortcut2.name ], WebInspector.UIString("Continue"));\r
-\r
-\r
-handler = this.stepOverButton.click.bind(this.stepOverButton);\r
-shortcut1 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F10);\r
-this._shortcuts[shortcut1.key] = handler;\r
-shortcut2 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.SingleQuote, platformSpecificModifier);\r
-this._shortcuts[shortcut2.key] = handler;\r
-section.addAlternateKeys([ shortcut1.name, shortcut2.name ], WebInspector.UIString("Step over"));\r
-\r
-\r
-handler = this.stepIntoButton.click.bind(this.stepIntoButton);\r
-shortcut1 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F11);\r
-this._shortcuts[shortcut1.key] = handler;\r
-shortcut2 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Semicolon, platformSpecificModifier);\r
-this._shortcuts[shortcut2.key] = handler;\r
-section.addAlternateKeys([ shortcut1.name, shortcut2.name ], WebInspector.UIString("Step into"));\r
-\r
-\r
-handler = this.stepOutButton.click.bind(this.stepOutButton);\r
-shortcut1 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F11, WebInspector.KeyboardShortcut.Modifiers.Shift);\r
-this._shortcuts[shortcut1.key] = handler;\r
-shortcut2 = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Semicolon, WebInspector.KeyboardShortcut.Modifiers.Shift, platformSpecificModifier);\r
-this._shortcuts[shortcut2.key] = handler;\r
-section.addAlternateKeys([ shortcut1.name, shortcut2.name ], WebInspector.UIString("Step out"));\r
-\r
-var isMac = WebInspector.isMac();\r
-if (isMac)\r
-shortcut1 = WebInspector.KeyboardShortcut.makeDescriptor("l", WebInspector.KeyboardShortcut.Modifiers.Meta);\r
-else\r
-shortcut1 = WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Ctrl);\r
-this._shortcuts[shortcut1.key] = this.showGoToLineDialog.bind(this);\r
-section.addAlternateKeys([ shortcut1.name ], WebInspector.UIString("Go to Line"));\r
-this.sidebarPanes.callstack.registerShortcuts(section);\r
-},\r
-\r
-searchCanceled: function()\r
-{\r
-WebInspector.updateSearchMatchesCount(0, this);\r
-\r
-if (this._searchView)\r
-this._searchView.searchCanceled();\r
-\r
-delete this._searchView;\r
-delete this._searchQuery;\r
-},\r
-\r
-performSearch: function(query)\r
-{\r
-if (!this.visibleView)\r
-return;\r
-\r
-\r
-this.searchCanceled();\r
-\r
-this._searchView = this.visibleView;\r
-this._searchQuery = query;\r
-\r
-function finishedCallback(view, searchMatches)\r
-{\r
-if (!searchMatches)\r
-return;\r
-\r
-WebInspector.updateSearchMatchesCount(searchMatches, this);\r
-view.jumpToFirstSearchResult();\r
-}\r
-\r
-this._searchView.performSearch(query, finishedCallback.bind(this));\r
-},\r
-\r
-jumpToNextSearchResult: function()\r
-{\r
-if (!this._searchView)\r
-return;\r
-\r
-if (this._searchView !== this.visibleView) {\r
-this.performSearch(this._searchQuery);\r
-return;\r
-}\r
-\r
-if (this._searchView.showingLastSearchResult())\r
-this._searchView.jumpToFirstSearchResult();\r
-else\r
-this._searchView.jumpToNextSearchResult();\r
-},\r
-\r
-jumpToPreviousSearchResult: function()\r
-{\r
-if (!this._searchView)\r
-return;\r
-\r
-if (this._searchView !== this.visibleView) {\r
-this.performSearch(this._searchQuery);\r
-if (this._searchView)\r
-this._searchView.jumpToLastSearchResult();\r
-return;\r
-}\r
-\r
-if (this._searchView.showingFirstSearchResult())\r
-this._searchView.jumpToLastSearchResult();\r
-else\r
-this._searchView.jumpToPreviousSearchResult();\r
-},\r
-\r
-showGoToLineDialog: function(e)\r
-{\r
-var view = this.visibleView;\r
-if (view)\r
-WebInspector.GoToLineDialog.show(view);\r
-}\r
-}\r
-\r
-WebInspector.ScriptsPanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ResourcesPanel = function(database)\r
-{\r
-WebInspector.Panel.call(this, "resources");\r
-\r
-WebInspector.settings.installApplicationSetting("resourcesLastSelectedItem", {});\r
-\r
-this.createSidebar();\r
-this.sidebarElement.addStyleClass("outline-disclosure filter-all children small");\r
-this.sidebarTreeElement.removeStyleClass("sidebar-tree");\r
-\r
-this.resourcesListTreeElement = new WebInspector.StorageCategoryTreeElement(this, WebInspector.UIString("Frames"), "Frames", "frame-storage-tree-item");\r
-this.sidebarTree.appendChild(this.resourcesListTreeElement);\r
-this._treeElementForFrameId = {};\r
-\r
-this.databasesListTreeElement = new WebInspector.StorageCategoryTreeElement(this, WebInspector.UIString("Databases"), "Databases", "database-storage-tree-item");\r
-this.sidebarTree.appendChild(this.databasesListTreeElement);\r
-\r
-this.localStorageListTreeElement = new WebInspector.StorageCategoryTreeElement(this, WebInspector.UIString("Local Storage"), "LocalStorage", "domstorage-storage-tree-item local-storage");\r
-this.sidebarTree.appendChild(this.localStorageListTreeElement);\r
-\r
-this.sessionStorageListTreeElement = new WebInspector.StorageCategoryTreeElement(this, WebInspector.UIString("Session Storage"), "SessionStorage", "domstorage-storage-tree-item session-storage");\r
-this.sidebarTree.appendChild(this.sessionStorageListTreeElement);\r
-\r
-this.cookieListTreeElement = new WebInspector.StorageCategoryTreeElement(this, WebInspector.UIString("Cookies"), "Cookies", "cookie-storage-tree-item");\r
-this.sidebarTree.appendChild(this.cookieListTreeElement);\r
-\r
-this.applicationCacheListTreeElement = new WebInspector.StorageCategoryTreeElement(this, WebInspector.UIString("Application Cache"), "ApplicationCache", "application-cache-storage-tree-item");\r
-this.sidebarTree.appendChild(this.applicationCacheListTreeElement);\r
-\r
-if (Preferences.fileSystemEnabled) {\r
-this.fileSystemListTreeElement = new WebInspector.StorageCategoryTreeElement(this, WebInspector.UIString("File System"), "FileSystem", "file-system-storage-tree-item");\r
-this.sidebarTree.appendChild(this.fileSystemListTreeElement);\r
-this.fileSystemListTreeElement.expand();\r
-}\r
-\r
-this.storageViews = document.createElement("div");\r
-this.storageViews.id = "storage-views";\r
-this.storageViews.className = "diff-container";\r
-this.element.appendChild(this.storageViews);\r
-\r
-this.storageViewStatusBarItemsContainer = document.createElement("div");\r
-this.storageViewStatusBarItemsContainer.className = "status-bar-items";\r
-\r
-this._databases = [];\r
-this._domStorage = [];\r
-this._cookieViews = {};\r
-this._origins = {};\r
-this._domains = {};\r
-\r
-this.sidebarElement.addEventListener("mousemove", this._onmousemove.bind(this), false);\r
-this.sidebarElement.addEventListener("mouseout", this._onmouseout.bind(this), false);\r
-}\r
-\r
-WebInspector.ResourcesPanel.prototype = {\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Resources");\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-return [this.storageViewStatusBarItemsContainer];\r
-},\r
-\r
-elementsToRestoreScrollPositionsFor: function()\r
-{\r
-return [this.sidebarElement];\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-\r
-if (this.visibleView instanceof WebInspector.ResourceView)\r
-this._showResourceView(this.visibleView.resource);\r
-\r
-if (this._initializedDefaultSelection)\r
-return;\r
-\r
-this._initializedDefaultSelection = true;\r
-var itemURL = WebInspector.settings.resourcesLastSelectedItem;\r
-if (itemURL) {\r
-for (var treeElement = this.sidebarTree.children[0]; treeElement; treeElement = treeElement.traverseNextTreeElement(false, this.sidebarTree, true)) {\r
-if (treeElement.itemURL === itemURL) {\r
-treeElement.select();\r
-treeElement.reveal();\r
-return;\r
-}\r
-}\r
-}\r
-this._initDefaultSelection();\r
-},\r
-\r
-_initDefaultSelection: function()\r
-{\r
-if (WebInspector.mainResource && this.resourcesListTreeElement && this.resourcesListTreeElement.expanded)\r
-this.showResource(WebInspector.mainResource);\r
-},\r
-\r
-reset: function()\r
-{\r
-this._origins = {};\r
-this._domains = {};\r
-for (var i = 0; i < this._databases.length; ++i) {\r
-var database = this._databases[i];\r
-delete database._tableViews;\r
-delete database._queryView;\r
-}\r
-this._databases = [];\r
-\r
-var domStorageLength = this._domStorage.length;\r
-for (var i = 0; i < this._domStorage.length; ++i) {\r
-var domStorage = this._domStorage[i];\r
-delete domStorage._domStorageView;\r
-}\r
-this._domStorage = [];\r
-\r
-this._cookieViews = {};\r
-this._fileSystemView = null;\r
-\r
-this._applicationCacheView = null;\r
-delete this._cachedApplicationCacheViewStatus;\r
-\r
-this.databasesListTreeElement.removeChildren();\r
-this.localStorageListTreeElement.removeChildren();\r
-this.sessionStorageListTreeElement.removeChildren();\r
-this.cookieListTreeElement.removeChildren();\r
-this.applicationCacheListTreeElement.removeChildren();\r
-if (Preferences.fileSystemEnabled)\r
-this.fileSystemListTreeElement.removeChildren();\r
-this.storageViews.removeChildren();\r
-\r
-this.storageViewStatusBarItemsContainer.removeChildren();\r
-\r
-if (this.sidebarTree.selectedTreeElement)\r
-this.sidebarTree.selectedTreeElement.deselect();\r
-},\r
-\r
-addOrUpdateFrame: function(parentFrameId, frameId, title, subtitle)\r
-{\r
-var frameTreeElement = this._treeElementForFrameId[frameId];\r
-if (frameTreeElement) {\r
-frameTreeElement.setTitles(title, subtitle);\r
-return;\r
-}\r
-\r
-var parentTreeElement = parentFrameId ? this._treeElementForFrameId[parentFrameId] : this.resourcesListTreeElement;\r
-if (!parentTreeElement) {\r
-console.warning("No frame with id:" + parentFrameId + " to route " + displayName + " to.")\r
-return;\r
-}\r
-\r
-var frameTreeElement = new WebInspector.FrameTreeElement(this, frameId, title, subtitle);\r
-this._treeElementForFrameId[frameId] = frameTreeElement;\r
-\r
-\r
-var children = parentTreeElement.children;\r
-for (var i = 0; i < children.length; ++i) {\r
-var child = children[i];\r
-if (!(child instanceof WebInspector.FrameTreeElement)) {\r
-parentTreeElement.insertChild(frameTreeElement, i);\r
-return;\r
-}\r
-if (child.displayName.localeCompare(frameTreeElement.displayName) > 0) {\r
-parentTreeElement.insertChild(frameTreeElement, i);\r
-return;\r
-}\r
-}\r
-parentTreeElement.appendChild(frameTreeElement);\r
-},\r
-\r
-removeFrame: function(frameId)\r
-{\r
-var frameTreeElement = this._treeElementForFrameId[frameId];\r
-if (!frameTreeElement)\r
-return;\r
-delete this._treeElementForFrameId[frameId];\r
-if (frameTreeElement.parent)\r
-frameTreeElement.parent.removeChild(frameTreeElement);\r
-},\r
-\r
-addResourceToFrame: function(frameId, resource)\r
-{\r
-this.addDocumentURL(resource.documentURL);\r
-\r
-if (resource.statusCode >= 301 && resource.statusCode <= 303)\r
-return;\r
-\r
-var frameTreeElement = this._treeElementForFrameId[frameId];\r
-if (!frameTreeElement) {\r
-\r
-\r
-return;\r
-}\r
-\r
-var resourceTreeElement = new WebInspector.FrameResourceTreeElement(this, resource);\r
-\r
-\r
-var children = frameTreeElement.children;\r
-for (var i = 0; i < children.length; ++i) {\r
-var child = children[i];\r
-if (!(child instanceof WebInspector.FrameResourceTreeElement))\r
-continue;\r
-\r
-if (resource.type === WebInspector.Resource.Type.Document ||\r
-(child._resource.type !== WebInspector.Resource.Type.Document && child._resource.displayName.localeCompare(resource.displayName) > 0)) {\r
-frameTreeElement.insertChild(resourceTreeElement, i);\r
-return;\r
-}\r
-}\r
-frameTreeElement.appendChild(resourceTreeElement);\r
-},\r
-\r
-removeResourcesFromFrame: function(frameId)\r
-{\r
-var frameTreeElement = this._treeElementForFrameId[frameId];\r
-if (frameTreeElement)\r
-frameTreeElement.removeChildren();\r
-},\r
-\r
-refreshResource: function(resource)\r
-{\r
-\r
-if (resource.type === WebInspector.Resource.Type.XHR) {\r
-var resourceTreeElement = this._findTreeElementForResource(resource);\r
-if (resourceTreeElement)\r
-resourceTreeElement.parent.removeChild(resourceTreeElement);\r
-}\r
-},\r
-\r
-addDatabase: function(database)\r
-{\r
-this._databases.push(database);\r
-\r
-var databaseTreeElement = new WebInspector.DatabaseTreeElement(this, database);\r
-database._databasesTreeElement = databaseTreeElement;\r
-this.databasesListTreeElement.appendChild(databaseTreeElement);\r
-},\r
-\r
-addDocumentURL: function(url)\r
-{\r
-var parsedURL = url.asParsedURL();\r
-if (!parsedURL)\r
-return;\r
-\r
-var domain = parsedURL.host;\r
-if (!this._domains[domain]) {\r
-this._domains[domain] = true;\r
-\r
-var cookieDomainTreeElement = new WebInspector.CookieTreeElement(this, domain);\r
-this.cookieListTreeElement.appendChild(cookieDomainTreeElement);\r
-\r
-var applicationCacheTreeElement = new WebInspector.ApplicationCacheTreeElement(this, domain);\r
-this.applicationCacheListTreeElement.appendChild(applicationCacheTreeElement);\r
-}\r
-\r
-if (Preferences.fileSystemEnabled) {\r
-\r
-var securityOrigin = parsedURL.scheme + "://" + parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "");\r
-if (!this._origins[securityOrigin]) {\r
-this._origins[securityOrigin] = true;\r
-var fileSystemTreeElement = new WebInspector.FileSystemTreeElement(this, securityOrigin);\r
-this.fileSystemListTreeElement.appendChild(fileSystemTreeElement);\r
-}\r
-}\r
-},\r
-\r
-addDOMStorage: function(domStorage)\r
-{\r
-this._domStorage.push(domStorage);\r
-var domStorageTreeElement = new WebInspector.DOMStorageTreeElement(this, domStorage, (domStorage.isLocalStorage ? "local-storage" : "session-storage"));\r
-domStorage._domStorageTreeElement = domStorageTreeElement;\r
-if (domStorage.isLocalStorage)\r
-this.localStorageListTreeElement.appendChild(domStorageTreeElement);\r
-else\r
-this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);\r
-},\r
-\r
-selectDatabase: function(databaseId)\r
-{\r
-var database;\r
-for (var i = 0, len = this._databases.length; i < len; ++i) {\r
-database = this._databases[i];\r
-if (database.id === databaseId) {\r
-this.showDatabase(database);\r
-database._databasesTreeElement.select();\r
-return;\r
-}\r
-}\r
-},\r
-\r
-selectDOMStorage: function(storageId)\r
-{\r
-var domStorage = this._domStorageForId(storageId);\r
-if (domStorage) {\r
-this.showDOMStorage(domStorage);\r
-domStorage._domStorageTreeElement.select();\r
-}\r
-},\r
-\r
-canShowSourceLine: function(url, line)\r
-{\r
-return !!WebInspector.resourceManager.resourceForURL(url);\r
-},\r
-\r
-showSourceLine: function(url, line)\r
-{\r
-var resource = WebInspector.resourceManager.resourceForURL(url);\r
-if (resource.type === WebInspector.Resource.Type.XHR) {\r
-\r
-if (WebInspector.panels.network && WebInspector.panels.network.canShowSourceLine(url, line)) {\r
-WebInspector.currentPanel = WebInspector.panels.network;\r
-WebInspector.panels.network.showSourceLine(url, line);\r
-}\r
-return;\r
-}\r
-this.showResource(WebInspector.resourceManager.resourceForURL(url), line);\r
-},\r
-\r
-showResource: function(resource, line)\r
-{\r
-var resourceTreeElement = this._findTreeElementForResource(resource);\r
-if (resourceTreeElement) {\r
-resourceTreeElement.reveal();\r
-resourceTreeElement.select();\r
-}\r
-\r
-if (line) {\r
-var view = WebInspector.ResourceManager.resourceViewForResource(resource);\r
-if (view.revealLine)\r
-view.revealLine(line);\r
-if (view.highlightLine)\r
-view.highlightLine(line);\r
-}\r
-return true;\r
-},\r
-\r
-_showResourceView: function(resource)\r
-{\r
-var view = WebInspector.ResourceManager.resourceViewForResource(resource);\r
-\r
-\r
-if (resource.baseRevision && view instanceof WebInspector.SourceView) {\r
-function callback(baseContent)\r
-{\r
-if (baseContent)\r
-this._applyDiffMarkup(view, baseContent, resource.content);\r
-}\r
-resource.baseRevision.requestContent(callback.bind(this));\r
-}\r
-this._innerShowView(view);\r
-},\r
-\r
-_applyDiffMarkup: function(view, baseContent, newContent) {\r
-var oldLines = baseContent.split("\n");\r
-var newLines = newContent.split("\n");\r
-\r
-var diff = Array.diff(oldLines, newLines);\r
-\r
-var diffData = {};\r
-diffData.added = [];\r
-diffData.removed = [];\r
-diffData.changed = [];\r
-\r
-var offset = 0;\r
-var right = diff.right;\r
-for (var i = 0; i < right.length; ++i) {\r
-if (typeof right[i] === "string") {\r
-if (right.length > i + 1 && right[i + 1].row === i + 1 - offset)\r
-diffData.changed.push(i);\r
-else {\r
-diffData.added.push(i);\r
-offset++;\r
-}\r
-} else\r
-offset = i - right[i].row;\r
-}\r
-view.sourceFrame.markDiff(diffData);\r
-},\r
-\r
-showDatabase: function(database, tableName)\r
-{\r
-if (!database)\r
-return;\r
-\r
-var view;\r
-if (tableName) {\r
-if (!("_tableViews" in database))\r
-database._tableViews = {};\r
-view = database._tableViews[tableName];\r
-if (!view) {\r
-view = new WebInspector.DatabaseTableView(database, tableName);\r
-database._tableViews[tableName] = view;\r
-}\r
-} else {\r
-view = database._queryView;\r
-if (!view) {\r
-view = new WebInspector.DatabaseQueryView(database);\r
-database._queryView = view;\r
-}\r
-}\r
-\r
-this._innerShowView(view);\r
-},\r
-\r
-showDOMStorage: function(domStorage)\r
-{\r
-if (!domStorage)\r
-return;\r
-\r
-var view;\r
-view = domStorage._domStorageView;\r
-if (!view) {\r
-view = new WebInspector.DOMStorageItemsView(domStorage);\r
-domStorage._domStorageView = view;\r
-}\r
-\r
-this._innerShowView(view);\r
-},\r
-\r
-showCookies: function(treeElement, cookieDomain)\r
-{\r
-var view = this._cookieViews[cookieDomain];\r
-if (!view) {\r
-view = new WebInspector.CookieItemsView(treeElement, cookieDomain);\r
-this._cookieViews[cookieDomain] = view;\r
-}\r
-\r
-this._innerShowView(view);\r
-},\r
-\r
-showApplicationCache: function(treeElement, appcacheDomain)\r
-{\r
-var view = this._applicationCacheView;\r
-if (!view) {\r
-view = new WebInspector.ApplicationCacheItemsView(treeElement, appcacheDomain);\r
-this._applicationCacheView = view;\r
-}\r
-\r
-this._innerShowView(view);\r
-\r
-if ("_cachedApplicationCacheViewStatus" in this)\r
-this._applicationCacheView.updateStatus(this._cachedApplicationCacheViewStatus);\r
-},\r
-\r
-showFileSystem: function(treeElement, origin)\r
-{\r
-this._fileSystemView = new WebInspector.FileSystemView(treeElement, origin);\r
-this._innerShowView(this._fileSystemView);\r
-},\r
-\r
-showCategoryView: function(categoryName)\r
-{\r
-if (!this._categoryView)\r
-this._categoryView = new WebInspector.StorageCategoryView();\r
-this._categoryView.setText(categoryName);\r
-this._innerShowView(this._categoryView);\r
-},\r
-\r
-_innerShowView: function(view)\r
-{\r
-if (this.visibleView)\r
-this.visibleView.hide();\r
-\r
-view.show(this.storageViews);\r
-this.visibleView = view;\r
-\r
-this.storageViewStatusBarItemsContainer.removeChildren();\r
-var statusBarItems = view.statusBarItems || [];\r
-for (var i = 0; i < statusBarItems.length; ++i)\r
-this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);\r
-},\r
-\r
-closeVisibleView: function()\r
-{\r
-if (this.visibleView)\r
-this.visibleView.hide();\r
-delete this.visibleView;\r
-},\r
-\r
-updateDatabaseTables: function(database)\r
-{\r
-if (!database || !database._databasesTreeElement)\r
-return;\r
-\r
-database._databasesTreeElement.shouldRefreshChildren = true;\r
-\r
-if (!("_tableViews" in database))\r
-return;\r
-\r
-var tableNamesHash = {};\r
-var self = this;\r
-function tableNamesCallback(tableNames)\r
-{\r
-var tableNamesLength = tableNames.length;\r
-for (var i = 0; i < tableNamesLength; ++i)\r
-tableNamesHash[tableNames[i]] = true;\r
-\r
-for (var tableName in database._tableViews) {\r
-if (!(tableName in tableNamesHash)) {\r
-if (self.visibleView === database._tableViews[tableName])\r
-self.closeVisibleView();\r
-delete database._tableViews[tableName];\r
-}\r
-}\r
-}\r
-database.getTableNames(tableNamesCallback);\r
-},\r
-\r
-dataGridForResult: function(columnNames, values)\r
-{\r
-var numColumns = columnNames.length;\r
-if (!numColumns)\r
-return null;\r
-\r
-var columns = {};\r
-\r
-for (var i = 0; i < columnNames.length; ++i) {\r
-var column = {};\r
-column.width = columnNames[i].length;\r
-column.title = columnNames[i];\r
-column.sortable = true;\r
-\r
-columns[columnNames[i]] = column;\r
-}\r
-\r
-var nodes = [];\r
-for (var i = 0; i < values.length / numColumns; ++i) {\r
-var data = {};\r
-for (var j = 0; j < columnNames.length; ++j)\r
-data[columnNames[j]] = values[numColumns * i + j];\r
-\r
-var node = new WebInspector.DataGridNode(data, false);\r
-node.selectable = false;\r
-nodes.push(node);\r
-}\r
-\r
-var dataGrid = new WebInspector.DataGrid(columns);\r
-var length = nodes.length;\r
-for (var i = 0; i < length; ++i)\r
-dataGrid.appendChild(nodes[i]);\r
-\r
-dataGrid.addEventListener("sorting changed", this._sortDataGrid.bind(this, dataGrid), this);\r
-return dataGrid;\r
-},\r
-\r
-_sortDataGrid: function(dataGrid)\r
-{\r
-var nodes = dataGrid.children.slice();\r
-var sortColumnIdentifier = dataGrid.sortColumnIdentifier;\r
-var sortDirection = dataGrid.sortOrder === "ascending" ? 1 : -1;\r
-var columnIsNumeric = true;\r
-\r
-for (var i = 0; i < nodes.length; i++) {\r
-if (isNaN(Number(nodes[i].data[sortColumnIdentifier])))\r
-columnIsNumeric = false;\r
-}\r
-\r
-function comparator(dataGridNode1, dataGridNode2)\r
-{\r
-var item1 = dataGridNode1.data[sortColumnIdentifier];\r
-var item2 = dataGridNode2.data[sortColumnIdentifier];\r
-\r
-var comparison;\r
-if (columnIsNumeric) {\r
-\r
-var number1 = parseFloat(item1);\r
-var number2 = parseFloat(item2);\r
-comparison = number1 < number2 ? -1 : (number1 > number2 ? 1 : 0);\r
-} else\r
-comparison = item1 < item2 ? -1 : (item1 > item2 ? 1 : 0);\r
-\r
-return sortDirection * comparison;\r
-}\r
-\r
-nodes.sort(comparator);\r
-dataGrid.removeChildren();\r
-for (var i = 0; i < nodes.length; i++)\r
-dataGrid.appendChild(nodes[i]);\r
-},\r
-\r
-updateDOMStorage: function(storageId)\r
-{\r
-var domStorage = this._domStorageForId(storageId);\r
-if (!domStorage)\r
-return;\r
-\r
-var view = domStorage._domStorageView;\r
-if (this.visibleView && view === this.visibleView)\r
-domStorage._domStorageView.update();\r
-},\r
-\r
-updateApplicationCacheStatus: function(status)\r
-{\r
-this._cachedApplicationCacheViewStatus = status;\r
-if (this._applicationCacheView && this._applicationCacheView === this.visibleView)\r
-this._applicationCacheView.updateStatus(status);\r
-},\r
-\r
-updateFileSystemPath: function(root, type, origin)\r
-{\r
-if (this._fileSystemView && this._fileSystemView === this.visibleView)\r
-this._fileSystemView.updateFileSystemPath(root, type, origin);  \r
-},\r
-\r
-updateFileSystemError: function(type, origin)\r
-{\r
-if (this._fileSystemView && this._fileSystemView === this.visibleView)\r
-this._fileSystemView.updateFileSystemError(type, origin);  \r
-},\r
-\r
-setFileSystemDisabled: function()\r
-{\r
-if (this._fileSystemView && this._fileSystemView === this.visibleView)\r
-this._fileSystemView.setFileSystemDisabled();  \r
-},\r
-\r
-updateNetworkState: function(isNowOnline)\r
-{\r
-if (this._applicationCacheView && this._applicationCacheView === this.visibleView)\r
-this._applicationCacheView.updateNetworkState(isNowOnline);\r
-},\r
-\r
-updateManifest: function(manifest)\r
-{\r
-if (this._applicationCacheView && this._applicationCacheView === this.visibleView)\r
-this._applicationCacheView.updateManifest(manifest);\r
-},\r
-\r
-_domStorageForId: function(storageId)\r
-{\r
-if (!this._domStorage)\r
-return null;\r
-var domStorageLength = this._domStorage.length;\r
-for (var i = 0; i < domStorageLength; ++i) {\r
-var domStorage = this._domStorage[i];\r
-if (domStorage.id == storageId)\r
-return domStorage;\r
-}\r
-return null;\r
-},\r
-\r
-updateMainViewWidth: function(width)\r
-{\r
-this.storageViews.style.left = width + "px";\r
-this.storageViewStatusBarItemsContainer.style.left = width + "px";\r
-this.resize();\r
-},\r
-\r
-get searchableViews()\r
-{\r
-var views = [];\r
-\r
-const visibleView = this.visibleView;\r
-if (visibleView instanceof WebInspector.ResourceView && visibleView.performSearch)\r
-views.push(visibleView);\r
-\r
-function callback(resourceTreeElement)\r
-{\r
-var resource = resourceTreeElement._resource;\r
-var resourceView = WebInspector.ResourceManager.resourceViewForResource(resource);\r
-if (resourceView.performSearch && resourceView !== visibleView)\r
-views.push(resourceView);\r
-}\r
-this._forAllResourceTreeElements(callback);\r
-return views;\r
-},\r
-\r
-_forAllResourceTreeElements: function(callback)\r
-{\r
-var stop = false;\r
-for (var treeElement = this.resourcesListTreeElement; !stop && treeElement; treeElement = treeElement.traverseNextTreeElement(false, this.resourcesListTreeElement, true)) {\r
-if (treeElement instanceof WebInspector.FrameResourceTreeElement)\r
-stop = callback(treeElement);\r
-}\r
-},\r
-\r
-searchMatchFound: function(view, matches)\r
-{\r
-if (!view.resource)\r
-return;\r
-var treeElement = this._findTreeElementForResource(view.resource);\r
-if (treeElement)\r
-treeElement.searchMatchFound(matches);\r
-},\r
-\r
-_findTreeElementForResource: function(resource)\r
-{\r
-function isAncestor(ancestor, object)\r
-{\r
-\r
-return false;\r
-}\r
-\r
-function getParent(object)\r
-{\r
-\r
-return null;\r
-}\r
-\r
-return this.sidebarTree.findTreeElement(resource, isAncestor, getParent);\r
-},\r
-\r
-searchCanceled: function(startingNewSearch)\r
-{\r
-WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);\r
-\r
-if (startingNewSearch)\r
-return;\r
-\r
-function callback(resourceTreeElement)\r
-{\r
-resourceTreeElement._errorsWarningsUpdated();\r
-}\r
-this._forAllResourceTreeElements(callback);\r
-},\r
-\r
-performSearch: function(query)\r
-{\r
-function callback(resourceTreeElement)\r
-{\r
-resourceTreeElement._resetBubble();\r
-}\r
-this._forAllResourceTreeElements(callback);\r
-WebInspector.Panel.prototype.performSearch.call(this, query);\r
-},\r
-\r
-showView: function(view)\r
-{\r
-if (view)\r
-this.showResource(view.resource);\r
-},\r
-\r
-_onmousemove: function(event)\r
-{\r
-var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);\r
-if (!nodeUnderMouse)\r
-return;\r
-\r
-var listNode = nodeUnderMouse.enclosingNodeOrSelfWithNodeName("li");\r
-if (!listNode)\r
-return;\r
-\r
-var element = listNode.treeElement;\r
-if (this._previousHoveredElement === element)\r
-return;\r
-\r
-if (this._previousHoveredElement) {\r
-this._previousHoveredElement.hovered = false;\r
-delete this._previousHoveredElement;\r
-}\r
-\r
-if (element instanceof WebInspector.FrameTreeElement) {\r
-this._previousHoveredElement = element;\r
-element.hovered = true;\r
-}\r
-},\r
-\r
-_onmouseout: function(event)\r
-{\r
-if (this._previousHoveredElement) {\r
-this._previousHoveredElement.hovered = false;\r
-delete this._previousHoveredElement;\r
-}\r
-}\r
-}\r
-\r
-WebInspector.ResourcesPanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-WebInspector.BaseStorageTreeElement = function(storagePanel, representedObject, title, iconClass, hasChildren)\r
-{\r
-TreeElement.call(this, "", representedObject, hasChildren);\r
-this._storagePanel = storagePanel;\r
-this._titleText = title;\r
-this._iconClass = iconClass;\r
-}\r
-\r
-WebInspector.BaseStorageTreeElement.prototype = {\r
-onattach: function()\r
-{\r
-this.listItemElement.removeChildren();\r
-this.listItemElement.addStyleClass(this._iconClass);\r
-\r
-var selectionElement = document.createElement("div");\r
-selectionElement.className = "selection";\r
-this.listItemElement.appendChild(selectionElement);\r
-\r
-this.imageElement = document.createElement("img");\r
-this.imageElement.className = "icon";\r
-this.listItemElement.appendChild(this.imageElement);\r
-\r
-this.titleElement = document.createElement("div");\r
-this.titleElement.className = "base-storage-tree-element-title";\r
-this.titleElement.textContent = this._titleText;\r
-this.listItemElement.appendChild(this.titleElement);\r
-},\r
-\r
-onselect: function()\r
-{\r
-var itemURL = this.itemURL;\r
-if (itemURL)\r
-WebInspector.settings.resourcesLastSelectedItem = itemURL;\r
-},\r
-\r
-onreveal: function()\r
-{\r
-if (this.listItemElement)\r
-this.listItemElement.scrollIntoViewIfNeeded(false);\r
-},\r
-\r
-get titleText()\r
-{\r
-return this._titleText;\r
-},\r
-\r
-set titleText(titleText)\r
-{\r
-this._titleText = titleText;\r
-if (this.titleElement)\r
-this.titleElement.textContent = this._titleText;\r
-},\r
-\r
-isEventWithinDisclosureTriangle: function()\r
-{\r
-\r
-\r
-\r
-const paddingLeft = 14;\r
-var left = this.listItemElement.totalOffsetLeft + paddingLeft;\r
-return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;\r
-}\r
-}\r
-\r
-WebInspector.BaseStorageTreeElement.prototype.__proto__ = TreeElement.prototype;\r
-\r
-WebInspector.StorageCategoryTreeElement = function(storagePanel, categoryName, settingsKey, iconClass)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, categoryName, iconClass, true);\r
-this._expandedSettingKey = "resources" + settingsKey + "Expanded";\r
-WebInspector.settings.installApplicationSetting(this._expandedSettingKey, settingsKey === "Frames");\r
-this._categoryName = categoryName;\r
-}\r
-\r
-WebInspector.StorageCategoryTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "category://" + this._categoryName;\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showCategoryView(this._categoryName);\r
-},\r
-\r
-onattach: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);\r
-if (WebInspector.settings[this._expandedSettingKey])\r
-this.expand();\r
-},\r
-\r
-onexpand: function()\r
-{\r
-WebInspector.settings[this._expandedSettingKey] = true;\r
-},\r
-\r
-oncollapse: function()\r
-{\r
-WebInspector.settings[this._expandedSettingKey] = false;\r
-}\r
-}\r
-WebInspector.StorageCategoryTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.FrameTreeElement = function(storagePanel, frameId, title, subtitle)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, "", "frame-storage-tree-item");\r
-this._frameId = frameId;\r
-this.setTitles(title, subtitle);\r
-}\r
-\r
-WebInspector.FrameTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "frame://" + encodeURI(this._displayName);\r
-},\r
-\r
-onattach: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);\r
-if (this._titleToSetOnAttach || this._subtitleToSetOnAttach) {\r
-this.setTitles(this._titleToSetOnAttach, this._subtitleToSetOnAttach);\r
-delete this._titleToSetOnAttach;\r
-delete this._subtitleToSetOnAttach;\r
-}\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showCategoryView(this._displayName);\r
-\r
-this.listItemElement.removeStyleClass("hovered");\r
-InspectorBackend.hideFrameHighlight();\r
-},\r
-\r
-get displayName()\r
-{\r
-return this._displayName;\r
-},\r
-\r
-setTitles: function(title, subtitle)\r
-{\r
-this._displayName = "";\r
-if (this.parent) {\r
-if (title) {\r
-this.titleElement.textContent = title;\r
-this._displayName = title;\r
-}\r
-if (subtitle) {\r
-var subtitleElement = document.createElement("span");\r
-subtitleElement.className = "base-storage-tree-element-subtitle";\r
-subtitleElement.textContent = "(" + subtitle + ")";\r
-this._displayName += " (" + subtitle + ")";\r
-this.titleElement.appendChild(subtitleElement);\r
-}\r
-} else {\r
-this._titleToSetOnAttach = title;\r
-this._subtitleToSetOnAttach = subtitle;\r
-}\r
-},\r
-\r
-set hovered(hovered)\r
-{\r
-if (hovered) {\r
-this.listItemElement.addStyleClass("hovered");\r
-InspectorBackend.highlightFrame(this._frameId);\r
-} else {\r
-this.listItemElement.removeStyleClass("hovered");\r
-InspectorBackend.hideFrameHighlight();\r
-}\r
-}\r
-}\r
-WebInspector.FrameTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.FrameResourceTreeElement = function(storagePanel, resource)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, resource, resource.displayName, "resource-sidebar-tree-item resources-category-" + resource.category.name);\r
-this._resource = resource;\r
-this._resource.addEventListener("errors-warnings-updated", this._errorsWarningsUpdated, this);\r
-this._resource.addEventListener("content-changed", this._contentChanged, this);\r
-this.tooltip = resource.url;\r
-}\r
-\r
-WebInspector.FrameResourceTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return this._resource.url;\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel._showResourceView(this._resource);\r
-},\r
-\r
-ondblclick: function(event)\r
-{\r
-InspectorBackend.openInInspectedWindow(this._resource.url);\r
-},\r
-\r
-onattach: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);\r
-\r
-if (this._resource.category === WebInspector.resourceCategories.images) {\r
-var previewImage = document.createElement("img");\r
-previewImage.className = "image-resource-icon-preview";\r
-previewImage.src = this._resource.url;\r
-\r
-var iconElement = document.createElement("div");\r
-iconElement.className = "icon";\r
-iconElement.appendChild(previewImage);\r
-this.listItemElement.replaceChild(iconElement, this.imageElement);\r
-}\r
-\r
-this._statusElement = document.createElement("div");\r
-this._statusElement.className = "status";\r
-this.listItemElement.insertBefore(this._statusElement, this.titleElement);\r
-\r
-this.listItemElement.draggable = true;\r
-this.listItemElement.addEventListener("dragstart", this._ondragstart.bind(this), false);\r
-},\r
-\r
-_ondragstart: function(event)\r
-{\r
-event.dataTransfer.setData("text/plain", this._resource.content);\r
-event.dataTransfer.effectAllowed = "copy";\r
-return true;\r
-},\r
-\r
-_setBubbleText: function(x)\r
-{\r
-if (!this._bubbleElement) {\r
-this._bubbleElement = document.createElement("div");\r
-this._bubbleElement.className = "bubble";\r
-this._statusElement.appendChild(this._bubbleElement);\r
-}\r
-\r
-this._bubbleElement.textContent = x;\r
-},\r
-\r
-_resetBubble: function()\r
-{\r
-if (this._bubbleElement) {\r
-this._bubbleElement.textContent = "";\r
-this._bubbleElement.removeStyleClass("search-matches");\r
-this._bubbleElement.removeStyleClass("warning");\r
-this._bubbleElement.removeStyleClass("error");\r
-}\r
-},\r
-\r
-searchMatchFound: function(matches)\r
-{\r
-this._resetBubble();\r
-\r
-this._setBubbleText(matches);\r
-this._bubbleElement.addStyleClass("search-matches");\r
-\r
-\r
-var currentAncestor = this.parent;\r
-while (currentAncestor && !currentAncestor.root) {\r
-if (!currentAncestor.expanded)\r
-currentAncestor.expand();\r
-currentAncestor = currentAncestor.parent;\r
-}\r
-},\r
-\r
-_errorsWarningsUpdated: function()\r
-{\r
-\r
-if (!this._resource.warnings && !this._resource.errors) {\r
-var view = WebInspector.ResourceManager.existingResourceViewForResource(this._resource);\r
-if (view && view.clearMessages)\r
-view.clearMessages();\r
-}\r
-\r
-if (this._storagePanel.currentQuery)\r
-return;\r
-\r
-this._resetBubble();\r
-\r
-if (this._resource.warnings || this._resource.errors)\r
-this._setBubbleText(this._resource.warnings + this._resource.errors);\r
-\r
-if (this._resource.warnings)\r
-this._bubbleElement.addStyleClass("warning");\r
-\r
-if (this._resource.errors)\r
-this._bubbleElement.addStyleClass("error");\r
-},\r
-\r
-_contentChanged: function(event)\r
-{\r
-this.insertChild(new WebInspector.ResourceRevisionTreeElement(this._storagePanel, event.data.revision), 0);\r
-var oldView = WebInspector.ResourceManager.existingResourceViewForResource(this._resource);\r
-if (oldView) {\r
-var newView = WebInspector.ResourceManager.recreateResourceView(this._resource);\r
-if (oldView === this._storagePanel.visibleView)\r
-this._storagePanel.visibleView = newView;\r
-}\r
-}\r
-}\r
-\r
-WebInspector.FrameResourceTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.DatabaseTreeElement = function(storagePanel, database)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, database.name, "database-storage-tree-item", true);\r
-this._database = database;\r
-}\r
-\r
-WebInspector.DatabaseTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "database://" + encodeURI(this._database.name);\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showDatabase(this._database);\r
-},\r
-\r
-oncollapse: function()\r
-{\r
-\r
-\r
-this.shouldRefreshChildren = true;\r
-},\r
-\r
-onpopulate: function()\r
-{\r
-this.removeChildren();\r
-\r
-function tableNamesCallback(tableNames)\r
-{\r
-var tableNamesLength = tableNames.length;\r
-for (var i = 0; i < tableNamesLength; ++i)\r
-this.appendChild(new WebInspector.DatabaseTableTreeElement(this._storagePanel, this._database, tableNames[i]));\r
-}\r
-this._database.getTableNames(tableNamesCallback.bind(this));\r
-}\r
-\r
-}\r
-WebInspector.DatabaseTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.DatabaseTableTreeElement = function(storagePanel, database, tableName)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, tableName, "database-storage-tree-item");\r
-this._database = database;\r
-this._tableName = tableName;\r
-}\r
-\r
-WebInspector.DatabaseTableTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "database://" + encodeURI(this._database.name) + "/" + encodeURI(this._tableName);\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showDatabase(this._database, this._tableName);\r
-}\r
-}\r
-WebInspector.DatabaseTableTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.DOMStorageTreeElement = function(storagePanel, domStorage, className)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, domStorage.domain ? domStorage.domain : WebInspector.UIString("Local Files"), "domstorage-storage-tree-item " + className);\r
-this._domStorage = domStorage;\r
-}\r
-\r
-WebInspector.DOMStorageTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "storage://" + this._domStorage.domain + "/" + (this._domStorage.isLocalStorage ? "local" : "session");\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showDOMStorage(this._domStorage);\r
-}\r
-}\r
-WebInspector.DOMStorageTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.CookieTreeElement = function(storagePanel, cookieDomain)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, cookieDomain ? cookieDomain : WebInspector.UIString("Local Files"), "cookie-storage-tree-item");\r
-this._cookieDomain = cookieDomain;\r
-}\r
-\r
-WebInspector.CookieTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "cookies://" + this._cookieDomain;\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showCookies(this, this._cookieDomain);\r
-}\r
-}\r
-WebInspector.CookieTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.ApplicationCacheTreeElement = function(storagePanel, appcacheDomain)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, appcacheDomain ? appcacheDomain : WebInspector.UIString("Local Files"), "application-cache-storage-tree-item");\r
-this._appcacheDomain = appcacheDomain;\r
-}\r
-\r
-WebInspector.ApplicationCacheTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "appcache://" + this._appcacheDomain;\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showApplicationCache(this, this._appcacheDomain);\r
-}\r
-}\r
-WebInspector.ApplicationCacheTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.ResourceRevisionTreeElement = function(storagePanel, revision)\r
-{\r
-var title = revision.timestamp ? revision.timestamp.toLocaleTimeString() : "(original)";\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, title, "resource-sidebar-tree-item resources-category-" + revision.category.name);\r
-if (revision.timestamp)\r
-this.tooltip = revision.timestamp.toLocaleString();\r
-this._resource = revision;\r
-}\r
-\r
-WebInspector.ResourceRevisionTreeElement.prototype = {\r
-onattach: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);\r
-this.listItemElement.draggable = true;\r
-this.listItemElement.addEventListener("dragstart", this._ondragstart.bind(this), false);\r
-this.listItemElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), true);\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel._showResourceView(this._resource);\r
-},\r
-\r
-_ondragstart: function(event)\r
-{\r
-event.dataTransfer.setData("text/plain", this._resource.content);\r
-event.dataTransfer.effectAllowed = "copy";\r
-return true;\r
-},\r
-\r
-_handleContextMenuEvent: function(event)\r
-{\r
-var contextMenu = new WebInspector.ContextMenu();\r
-contextMenu.appendItem(WebInspector.UIString("Revert to this revision"), this._resource.revertToThis.bind(this._resource));\r
-contextMenu.show(event);\r
-}\r
-}\r
-\r
-WebInspector.ResourceRevisionTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.FileSystemTreeElement = function(storagePanel, origin)\r
-{\r
-WebInspector.BaseStorageTreeElement.call(this, storagePanel, null, origin, "file-system-storage-tree-item");\r
-this._origin = origin;\r
-}\r
-\r
-WebInspector.FileSystemTreeElement.prototype = {\r
-get itemURL()\r
-{\r
-return "file-system://" + encodeURI(this._origin);\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.BaseStorageTreeElement.prototype.onselect.call(this);\r
-this._storagePanel.showFileSystem(this, this._origin);\r
-}\r
-}\r
-\r
-WebInspector.FileSystemTreeElement.prototype.__proto__ = WebInspector.BaseStorageTreeElement.prototype;\r
-\r
-WebInspector.StorageCategoryView = function()\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("storage-view");\r
-\r
-this._emptyMsgElement = document.createElement("div");\r
-this._emptyMsgElement.className = "storage-empty-view";\r
-this.element.appendChild(this._emptyMsgElement);\r
-}\r
-\r
-WebInspector.StorageCategoryView.prototype = {\r
-setText: function(text)\r
-{\r
-this._emptyMsgElement.textContent = text;\r
-}\r
-}\r
-\r
-WebInspector.StorageCategoryView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";\r
-\r
-WebInspector.ProfileType = function(id, name)\r
-{\r
-this._id = id;\r
-this._name = name;\r
-}\r
-\r
-WebInspector.ProfileType.URLRegExp = /webkit-profile:\/\/(.+)\/(.+)#([0-9]+)/;\r
-\r
-WebInspector.ProfileType.prototype = {\r
-get buttonTooltip()\r
-{\r
-return "";\r
-},\r
-\r
-get buttonStyle()\r
-{\r
-return undefined;\r
-},\r
-\r
-get buttonCaption()\r
-{\r
-return this.name;\r
-},\r
-\r
-get id()\r
-{\r
-return this._id;\r
-},\r
-\r
-get name()\r
-{\r
-return this._name;\r
-},\r
-\r
-buttonClicked: function()\r
-{\r
-},\r
-\r
-viewForProfile: function(profile)\r
-{\r
-if (!profile._profileView)\r
-profile._profileView = this.createView(profile);\r
-return profile._profileView;\r
-},\r
-\r
-get welcomeMessage()\r
-{\r
-return "";\r
-},\r
-\r
-\r
-createView: function(profile)\r
-{\r
-throw new Error("Needs implemented.");\r
-},\r
-\r
-\r
-createSidebarTreeElementForProfile: function(profile)\r
-{\r
-throw new Error("Needs implemented.");\r
-}\r
-}\r
-\r
-WebInspector.ProfilesPanel = function()\r
-{\r
-WebInspector.Panel.call(this, "profiles");\r
-\r
-this.createSidebar();\r
-\r
-this._profileTypesByIdMap = {};\r
-this._profileTypeButtonsByIdMap = {};\r
-\r
-var panelEnablerHeading = WebInspector.UIString("You need to enable profiling before you can use the Profiles panel.");\r
-var panelEnablerDisclaimer = WebInspector.UIString("Enabling profiling will make scripts run slower.");\r
-var panelEnablerButton = WebInspector.UIString("Enable Profiling");\r
-this.panelEnablerView = new WebInspector.PanelEnablerView("profiles", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);\r
-this.panelEnablerView.addEventListener("enable clicked", this._enableProfiling, this);\r
-\r
-this.element.appendChild(this.panelEnablerView.element);\r
-\r
-this.profileViews = document.createElement("div");\r
-this.profileViews.id = "profile-views";\r
-this.element.appendChild(this.profileViews);\r
-\r
-this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");\r
-this.enableToggleButton.addEventListener("click", this._toggleProfiling.bind(this), false);\r
-\r
-this.clearResultsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear CPU profiles."), "clear-status-bar-item");\r
-this.clearResultsButton.addEventListener("click", this._clearProfiles.bind(this), false);\r
-\r
-this.profileViewStatusBarItemsContainer = document.createElement("div");\r
-this.profileViewStatusBarItemsContainer.className = "status-bar-items";\r
-\r
-this.welcomeView = new WebInspector.WelcomeView("profiles", WebInspector.UIString("Welcome to the Profiles panel"));\r
-this.element.appendChild(this.welcomeView.element);\r
-\r
-this._profiles = [];\r
-this._profilerEnabled = Preferences.profilerAlwaysEnabled;\r
-this._reset();\r
-InspectorBackend.registerDomainDispatcher("Profiler", this);\r
-}\r
-\r
-WebInspector.ProfilesPanel.prototype = {\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Profiles");\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-function clickHandler(profileType, buttonElement)\r
-{\r
-profileType.buttonClicked.call(profileType);\r
-this.updateProfileTypeButtons();\r
-}\r
-\r
-var items = [this.enableToggleButton.element];\r
-\r
-for (var typeId in this._profileTypesByIdMap) {\r
-var profileType = this.getProfileType(typeId);\r
-if (profileType.buttonStyle) {\r
-var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);\r
-this._profileTypeButtonsByIdMap[typeId] = button.element;\r
-button.element.addEventListener("click", clickHandler.bind(this, profileType, button.element), false);\r
-items.push(button.element);\r
-}\r
-}\r
-items.push(this.clearResultsButton.element, this.profileViewStatusBarItemsContainer);\r
-return items;\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-this._populateProfiles();\r
-},\r
-\r
-profilerWasEnabled: function()\r
-{\r
-if (this._profilerEnabled)\r
-return;\r
-\r
-this._profilerEnabled = true;\r
-\r
-this._reset();\r
-if (this.visible)\r
-this._populateProfiles();\r
-},\r
-\r
-profilerWasDisabled: function()\r
-{\r
-if (!this._profilerEnabled)\r
-return;\r
-\r
-this._profilerEnabled = false;\r
-this._reset();\r
-},\r
-\r
-resetProfiles: function()\r
-{\r
-this._reset();\r
-},\r
-\r
-_reset: function()\r
-{\r
-for (var i = 0; i < this._profiles.length; ++i)\r
-delete this._profiles[i]._profileView;\r
-delete this.visibleView;\r
-\r
-delete this.currentQuery;\r
-this.searchCanceled();\r
-\r
-this._profiles = [];\r
-this._profilesIdMap = {};\r
-this._profileGroups = {};\r
-this._profileGroupsForLinks = {}\r
-this._profilesWereRequested = false;\r
-\r
-this.sidebarTreeElement.removeStyleClass("some-expandable");\r
-\r
-for (var typeId in this._profileTypesByIdMap)\r
-this.getProfileType(typeId).treeElement.removeChildren();\r
-\r
-this.profileViews.removeChildren();\r
-\r
-this.profileViewStatusBarItemsContainer.removeChildren();\r
-\r
-this._updateInterface();\r
-this.welcomeView.show();\r
-},\r
-\r
-_clearProfiles: function()\r
-{\r
-InspectorBackend.clearProfiles();\r
-this._reset();\r
-},\r
-\r
-registerProfileType: function(profileType)\r
-{\r
-this._profileTypesByIdMap[profileType.id] = profileType;\r
-profileType.treeElement = new WebInspector.SidebarSectionTreeElement(profileType.name, null, true);\r
-this.sidebarTree.appendChild(profileType.treeElement);\r
-profileType.treeElement.expand();\r
-this._addWelcomeMessage(profileType);\r
-},\r
-\r
-_addWelcomeMessage: function(profileType)\r
-{\r
-var message = profileType.welcomeMessage;\r
-\r
-\r
-\r
-var buttonPos = message.indexOf("%s");\r
-if (buttonPos > -1) {\r
-var container = document.createDocumentFragment();\r
-var part1 = document.createElement("span");\r
-part1.innerHTML = message.substr(0, buttonPos);\r
-container.appendChild(part1);\r
-\r
-var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);\r
-container.appendChild(button.element);\r
-\r
-var part2 = document.createElement("span");\r
-part2.innerHTML = message.substr(buttonPos + 2);\r
-container.appendChild(part2);\r
-this.welcomeView.addMessage(container);\r
-} else\r
-this.welcomeView.addMessage(message);\r
-},\r
-\r
-_makeKey: function(text, profileTypeId)\r
-{\r
-return escape(text) + '/' + escape(profileTypeId);\r
-},\r
-\r
-addProfileHeader: function(profile)\r
-{\r
-var typeId = profile.typeId;\r
-var profileType = this.getProfileType(typeId);\r
-var sidebarParent = profileType.treeElement;\r
-var small = false;\r
-var alternateTitle;\r
-\r
-profile.__profilesPanelProfileType = profileType;\r
-this._profiles.push(profile);\r
-this._profilesIdMap[this._makeKey(profile.uid, typeId)] = profile;\r
-\r
-if (profile.title.indexOf(UserInitiatedProfileName) !== 0) {\r
-var profileTitleKey = this._makeKey(profile.title, typeId);\r
-if (!(profileTitleKey in this._profileGroups))\r
-this._profileGroups[profileTitleKey] = [];\r
-\r
-var group = this._profileGroups[profileTitleKey];\r
-group.push(profile);\r
-\r
-if (group.length === 2) {\r
-\r
-group._profilesTreeElement = new WebInspector.ProfileGroupSidebarTreeElement(profile.title);\r
-\r
-\r
-var index = sidebarParent.children.indexOf(group[0]._profilesTreeElement);\r
-sidebarParent.insertChild(group._profilesTreeElement, index);\r
-\r
-\r
-var selected = group[0]._profilesTreeElement.selected;\r
-sidebarParent.removeChild(group[0]._profilesTreeElement);\r
-group._profilesTreeElement.appendChild(group[0]._profilesTreeElement);\r
-if (selected) {\r
-group[0]._profilesTreeElement.select();\r
-group[0]._profilesTreeElement.reveal();\r
-}\r
-\r
-group[0]._profilesTreeElement.small = true;\r
-group[0]._profilesTreeElement.mainTitle = WebInspector.UIString("Run %d", 1);\r
-\r
-this.sidebarTreeElement.addStyleClass("some-expandable");\r
-}\r
-\r
-if (group.length >= 2) {\r
-sidebarParent = group._profilesTreeElement;\r
-alternateTitle = WebInspector.UIString("Run %d", group.length);\r
-small = true;\r
-}\r
-}\r
-\r
-var profileTreeElement = profileType.createSidebarTreeElementForProfile(profile);\r
-profileTreeElement.small = small;\r
-if (alternateTitle)\r
-profileTreeElement.mainTitle = alternateTitle;\r
-profile._profilesTreeElement = profileTreeElement;\r
-\r
-sidebarParent.appendChild(profileTreeElement);\r
-if (!profile.isTemporary) {\r
-this.welcomeView.hide();\r
-if (!this.visibleView)\r
-this.showProfile(profile);\r
-this.dispatchEventToListeners("profile added");\r
-}\r
-},\r
-\r
-removeProfileHeader: function(profile)\r
-{\r
-var typeId = profile.typeId;\r
-var profileType = this.getProfileType(typeId);\r
-var sidebarParent = profileType.treeElement;\r
-\r
-for (var i = 0; i < this._profiles.length; ++i) {\r
-if (this._profiles[i].uid === profile.uid) {\r
-profile = this._profiles[i];\r
-this._profiles.splice(i, 1);\r
-break;\r
-}\r
-}\r
-delete this._profilesIdMap[this._makeKey(profile.uid, typeId)];\r
-\r
-var profileTitleKey = this._makeKey(profile.title, typeId);\r
-delete this._profileGroups[profileTitleKey];\r
-\r
-sidebarParent.removeChild(profile._profilesTreeElement);\r
-\r
-if (!profile.isTemporary)\r
-InspectorBackend.removeProfile(profile.typeId, profile.uid);\r
-\r
-\r
-\r
-if (!this._profiles.length)\r
-this.closeVisibleView();\r
-},\r
-\r
-showProfile: function(profile)\r
-{\r
-if (!profile || profile.isTemporary)\r
-return;\r
-\r
-this.closeVisibleView();\r
-\r
-var view = profile.__profilesPanelProfileType.viewForProfile(profile);\r
-\r
-view.show(this.profileViews);\r
-\r
-profile._profilesTreeElement.select(true);\r
-profile._profilesTreeElement.reveal();\r
-\r
-this.visibleView = view;\r
-\r
-this.profileViewStatusBarItemsContainer.removeChildren();\r
-\r
-var statusBarItems = view.statusBarItems;\r
-for (var i = 0; i < statusBarItems.length; ++i)\r
-this.profileViewStatusBarItemsContainer.appendChild(statusBarItems[i]);\r
-},\r
-\r
-getProfiles: function(typeId)\r
-{\r
-var result = [];\r
-var profilesCount = this._profiles.length;\r
-for (var i = 0; i < profilesCount; ++i)\r
-if (this._profiles[i].typeId === typeId)\r
-result.push(this._profiles[i]);\r
-return result;\r
-},\r
-\r
-hasTemporaryProfile: function(typeId)\r
-{\r
-var profilesCount = this._profiles.length;\r
-for (var i = 0; i < profilesCount; ++i)\r
-if (this._profiles[i].typeId === typeId && this._profiles[i].isTemporary)\r
-return true;\r
-return false;\r
-},\r
-\r
-hasProfile: function(profile)\r
-{\r
-return !!this._profilesIdMap[this._makeKey(profile.uid, profile.typeId)];\r
-},\r
-\r
-updateProfile: function(profile)\r
-{\r
-var profilesCount = this._profiles.length;\r
-for (var i = 0; i < profilesCount; ++i)\r
-if (this._profiles[i].typeId === profile.typeId\r
-&& this._profiles[i].uid === profile.uid) {\r
-this._profiles[i] = profile;\r
-break;\r
-}\r
-},\r
-\r
-loadHeapSnapshot: function(uid, callback)\r
-{\r
-var profile = this._profilesIdMap[this._makeKey(uid, WebInspector.HeapSnapshotProfileType.TypeId)];\r
-if (!profile)\r
-return;\r
-\r
-if (profile._loaded)\r
-callback(profile);\r
-else if (profile._is_loading)\r
-profile._callbacks.push(callback);\r
-else {\r
-profile._is_loading = true;\r
-profile._callbacks = [callback];\r
-profile._json = "";\r
-InspectorBackend.getProfile(profile.typeId, profile.uid);\r
-}\r
-},\r
-\r
-addHeapSnapshotChunk: function(uid, chunk)\r
-{\r
-var profile = this._profilesIdMap[this._makeKey(uid, WebInspector.HeapSnapshotProfileType.TypeId)];\r
-if (!profile || profile._loaded || !profile._is_loading)\r
-return;\r
-\r
-profile._json += chunk;\r
-},\r
-\r
-finishHeapSnapshot: function(uid)\r
-{\r
-var profile = this._profilesIdMap[this._makeKey(uid, WebInspector.HeapSnapshotProfileType.TypeId)];\r
-if (!profile || profile._loaded || !profile._is_loading)\r
-return;\r
-\r
-var callbacks = profile._callbacks;\r
-delete profile._callbacks;\r
-var loadedSnapshot = JSON.parse(profile._json);\r
-delete profile._json;\r
-delete profile._is_loading;\r
-profile._loaded = true;\r
-WebInspector.HeapSnapshotView.prototype.processLoadedSnapshot(profile, loadedSnapshot);\r
-for (var i = 0; i < callbacks.length; ++i)\r
-callbacks[i](profile);\r
-},\r
-\r
-showView: function(view)\r
-{\r
-this.showProfile(view.profile);\r
-},\r
-\r
-getProfileType: function(typeId)\r
-{\r
-return this._profileTypesByIdMap[typeId];\r
-},\r
-\r
-showProfileForURL: function(url)\r
-{\r
-var match = url.match(WebInspector.ProfileType.URLRegExp);\r
-if (!match)\r
-return;\r
-this.showProfile(this._profilesIdMap[this._makeKey(match[3], match[1])]);\r
-},\r
-\r
-updateProfileTypeButtons: function()\r
-{\r
-for (var typeId in this._profileTypeButtonsByIdMap) {\r
-var buttonElement = this._profileTypeButtonsByIdMap[typeId];\r
-var profileType = this.getProfileType(typeId);\r
-buttonElement.className = profileType.buttonStyle;\r
-buttonElement.title = profileType.buttonTooltip;\r
-\r
-}\r
-},\r
-\r
-closeVisibleView: function()\r
-{\r
-if (this.visibleView)\r
-this.visibleView.hide();\r
-delete this.visibleView;\r
-},\r
-\r
-displayTitleForProfileLink: function(title, typeId)\r
-{\r
-title = unescape(title);\r
-if (title.indexOf(UserInitiatedProfileName) === 0) {\r
-title = WebInspector.UIString("Profile %d", title.substring(UserInitiatedProfileName.length + 1));\r
-} else {\r
-var titleKey = this._makeKey(title, typeId);\r
-if (!(titleKey in this._profileGroupsForLinks))\r
-this._profileGroupsForLinks[titleKey] = 0;\r
-\r
-var groupNumber = ++this._profileGroupsForLinks[titleKey];\r
-\r
-if (groupNumber > 2)\r
-\r
-\r
-title += " " + WebInspector.UIString("Run %d", (groupNumber + 1) / 2);\r
-}\r
-\r
-return title;\r
-},\r
-\r
-get searchableViews()\r
-{\r
-var views = [];\r
-\r
-const visibleView = this.visibleView;\r
-if (visibleView && visibleView.performSearch)\r
-views.push(visibleView);\r
-\r
-var profilesLength = this._profiles.length;\r
-for (var i = 0; i < profilesLength; ++i) {\r
-var profile = this._profiles[i];\r
-var view = profile.__profilesPanelProfileType.viewForProfile(profile);\r
-if (!view.performSearch || view === visibleView)\r
-continue;\r
-views.push(view);\r
-}\r
-\r
-return views;\r
-},\r
-\r
-searchMatchFound: function(view, matches)\r
-{\r
-view.profile._profilesTreeElement.searchMatches = matches;\r
-},\r
-\r
-searchCanceled: function(startingNewSearch)\r
-{\r
-WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);\r
-\r
-if (!this._profiles)\r
-return;\r
-\r
-for (var i = 0; i < this._profiles.length; ++i) {\r
-var profile = this._profiles[i];\r
-profile._profilesTreeElement.searchMatches = 0;\r
-}\r
-},\r
-\r
-_updateInterface: function()\r
-{\r
-\r
-if (this._profilerEnabled) {\r
-this.enableToggleButton.title = WebInspector.UIString("Profiling enabled. Click to disable.");\r
-this.enableToggleButton.toggled = true;\r
-for (var typeId in this._profileTypeButtonsByIdMap)\r
-this._profileTypeButtonsByIdMap[typeId].removeStyleClass("hidden");\r
-this.profileViewStatusBarItemsContainer.removeStyleClass("hidden");\r
-this.clearResultsButton.element.removeStyleClass("hidden");\r
-this.panelEnablerView.visible = false;\r
-} else {\r
-this.enableToggleButton.title = WebInspector.UIString("Profiling disabled. Click to enable.");\r
-this.enableToggleButton.toggled = false;\r
-for (var typeId in this._profileTypeButtonsByIdMap)\r
-this._profileTypeButtonsByIdMap[typeId].addStyleClass("hidden");\r
-this.profileViewStatusBarItemsContainer.addStyleClass("hidden");\r
-this.clearResultsButton.element.addStyleClass("hidden");\r
-this.panelEnablerView.visible = true;\r
-}\r
-},\r
-\r
-_enableProfiling: function()\r
-{\r
-if (this._profilerEnabled)\r
-return;\r
-this._toggleProfiling(this.panelEnablerView.alwaysEnabled);\r
-},\r
-\r
-_toggleProfiling: function(optionalAlways)\r
-{\r
-if (this._profilerEnabled)\r
-InspectorBackend.disableProfiler(true);\r
-else\r
-InspectorBackend.enableProfiler(!!optionalAlways);\r
-},\r
-\r
-_populateProfiles: function()\r
-{\r
-if (!this._profilerEnabled || this._profilesWereRequested)\r
-return;\r
-\r
-function populateCallback(profileHeaders) {\r
-profileHeaders.sort(function(a, b) { return a.uid - b.uid; });\r
-var profileHeadersLength = profileHeaders.length;\r
-for (var i = 0; i < profileHeadersLength; ++i)\r
-if (!this.hasProfile(profileHeaders[i]))\r
-WebInspector.panels.profiles.addProfileHeader(profileHeaders[i]);\r
-}\r
-\r
-InspectorBackend.getProfileHeaders(populateCallback.bind(this));\r
-\r
-this._profilesWereRequested = true;\r
-},\r
-\r
-updateMainViewWidth: function(width)\r
-{\r
-this.welcomeView.element.style.left = width + "px";\r
-this.profileViews.style.left = width + "px";\r
-this.profileViewStatusBarItemsContainer.style.left = Math.max(155, width) + "px";\r
-this.resize();\r
-},\r
-\r
-setRecordingProfile: function(isProfiling)\r
-{\r
-this.getProfileType(WebInspector.CPUProfileType.TypeId).setRecordingProfile(isProfiling);\r
-if (this.hasTemporaryProfile(WebInspector.CPUProfileType.TypeId) !== isProfiling) {\r
-if (!this._temporaryRecordingProfile) {\r
-this._temporaryRecordingProfile = {\r
-typeId: WebInspector.CPUProfileType.TypeId,\r
-title: WebInspector.UIString("Recording"),\r
-uid: -1,\r
-isTemporary: true\r
-};\r
-}\r
-if (isProfiling)\r
-this.addProfileHeader(this._temporaryRecordingProfile);\r
-else\r
-this.removeProfileHeader(this._temporaryRecordingProfile);\r
-}\r
-this.updateProfileTypeButtons();\r
-}\r
-}\r
-\r
-WebInspector.ProfilesPanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-WebInspector.ProfileSidebarTreeElement = function(profile, titleFormat, className)\r
-{\r
-this.profile = profile;\r
-this._titleFormat = titleFormat;\r
-\r
-if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)\r
-this._profileNumber = this.profile.title.substring(UserInitiatedProfileName.length + 1);\r
-\r
-WebInspector.SidebarTreeElement.call(this, className, "", "", profile, false);\r
-\r
-this.refreshTitles();\r
-}\r
-\r
-WebInspector.ProfileSidebarTreeElement.prototype = {\r
-onselect: function()\r
-{\r
-this.treeOutline.panel.showProfile(this.profile);\r
-},\r
-\r
-ondelete: function()\r
-{\r
-this.treeOutline.panel.removeProfileHeader(this.profile);\r
-return true;\r
-},\r
-\r
-get mainTitle()\r
-{\r
-if (this._mainTitle)\r
-return this._mainTitle;\r
-if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)\r
-return WebInspector.UIString(this._titleFormat, this._profileNumber);\r
-return this.profile.title;\r
-},\r
-\r
-set mainTitle(x)\r
-{\r
-this._mainTitle = x;\r
-this.refreshTitles();\r
-},\r
-\r
-get subtitle()\r
-{\r
-\r
-},\r
-\r
-set subtitle(x)\r
-{\r
-\r
-},\r
-\r
-set searchMatches(matches)\r
-{\r
-if (!matches) {\r
-if (!this.bubbleElement)\r
-return;\r
-this.bubbleElement.removeStyleClass("search-matches");\r
-this.bubbleText = "";\r
-return;\r
-}\r
-\r
-this.bubbleText = matches;\r
-this.bubbleElement.addStyleClass("search-matches");\r
-}\r
-}\r
-\r
-WebInspector.ProfileSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;\r
-\r
-WebInspector.ProfileGroupSidebarTreeElement = function(title, subtitle)\r
-{\r
-WebInspector.SidebarTreeElement.call(this, "profile-group-sidebar-tree-item", title, subtitle, null, true);\r
-}\r
-\r
-WebInspector.ProfileGroupSidebarTreeElement.prototype = {\r
-onselect: function()\r
-{\r
-if (this.children.length > 0)\r
-WebInspector.panels.profiles.showProfile(this.children[this.children.length - 1].profile);\r
-}\r
-}\r
-\r
-WebInspector.ProfileGroupSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ConsolePanel = function()\r
-{\r
-WebInspector.Panel.call(this, "console");\r
-}\r
-\r
-WebInspector.ConsolePanel.prototype = {\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Console");\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-\r
-this._previousConsoleState = WebInspector.drawer.state;\r
-WebInspector.drawer.enterPanelMode();\r
-WebInspector.showConsole();\r
-\r
-\r
-var scopeBar = document.getElementById("console-filter");\r
-var consoleMessages = document.getElementById("console-messages");\r
-\r
-scopeBar.parentNode.removeChild(scopeBar);\r
-document.getElementById("console-view").insertBefore(scopeBar, consoleMessages);\r
-\r
-\r
-scopeBar.addStyleClass("console-filter-top");\r
-scopeBar.removeStyleClass("status-bar-item");\r
-\r
-consoleMessages.addStyleClass("console-filter-top");\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.Panel.prototype.hide.call(this);\r
-\r
-if (this._previousConsoleState === WebInspector.Drawer.State.Hidden)\r
-WebInspector.drawer.immediatelyExitPanelMode();\r
-else\r
-WebInspector.drawer.exitPanelMode();\r
-delete this._previousConsoleState;\r
-\r
-\r
-var scopeBar = document.getElementById("console-filter");\r
-\r
-scopeBar.parentNode.removeChild(scopeBar);\r
-document.getElementById("other-drawer-status-bar-items").appendChild(scopeBar);\r
-\r
-\r
-scopeBar.removeStyleClass("console-filter-top");\r
-scopeBar.addStyleClass("status-bar-item");\r
-\r
-document.getElementById("console-messages").removeStyleClass("console-filter-top");\r
-}\r
-}\r
-\r
-WebInspector.ConsolePanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.injectedExtensionAPI = function(InjectedScriptHost, inspectedWindow, injectedScriptId)\r
-{\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-function EventSinkImpl(type, customDispatch)\r
-{\r
-this._type = type;\r
-this._listeners = [];\r
-this._customDispatch = customDispatch;\r
-}\r
-\r
-EventSinkImpl.prototype = {\r
-addListener: function(callback)\r
-{\r
-if (typeof callback != "function")\r
-throw new "addListener: callback is not a function";\r
-if (this._listeners.length === 0)\r
-extensionServer.sendRequest({ command: "subscribe", type: this._type });\r
-this._listeners.push(callback);\r
-extensionServer.registerHandler("notify-" + this._type, bind(this._dispatch, this));\r
-},\r
-\r
-removeListener: function(callback)\r
-{\r
-var listeners = this._listeners;\r
-\r
-for (var i = 0; i < listeners.length; ++i) {\r
-if (listeners[i] === callback) {\r
-listeners.splice(i, 1);\r
-break;\r
-}\r
-}\r
-if (this._listeners.length === 0)\r
-extensionServer.sendRequest({ command: "unsubscribe", type: this._type });\r
-},\r
-\r
-_fire: function()\r
-{\r
-var listeners = this._listeners.slice();\r
-for (var i = 0; i < listeners.length; ++i)\r
-listeners[i].apply(null, arguments);\r
-},\r
-\r
-_dispatch: function(request)\r
-{\r
-if (this._customDispatch)\r
-this._customDispatch.call(this, request);\r
-else\r
-this._fire.apply(this, request.arguments);\r
-}\r
-}\r
-\r
-function InspectorExtensionAPI()\r
-{\r
-this.audits = new Audits();\r
-this.inspectedWindow = new InspectedWindow();\r
-this.panels = new Panels();\r
-this.resources = new Resources();\r
-\r
-this.onReset = new EventSink("reset");\r
-}\r
-\r
-InspectorExtensionAPI.prototype = {\r
-log: function(message)\r
-{\r
-extensionServer.sendRequest({ command: "log", message: message });\r
-}\r
-}\r
-\r
-function Resources()\r
-{\r
-function resourceDispatch(request)\r
-{\r
-var resource = request.arguments[1];\r
-resource.__proto__ = new Resource(request.arguments[0]);\r
-this._fire(resource);\r
-}\r
-this.onFinished = new EventSink("resource-finished", resourceDispatch);\r
-}\r
-\r
-Resources.prototype = {\r
-getHAR: function(callback)\r
-{\r
-function callbackWrapper(result)\r
-{\r
-var entries = (result && result.entries) || [];\r
-for (var i = 0; i < entries.length; ++i) {\r
-entries[i].__proto__ = new Resource(entries[i]._resourceId);\r
-delete entries[i]._resourceId;\r
-}\r
-callback(result);\r
-}\r
-return extensionServer.sendRequest({ command: "getHAR" }, callback && callbackWrapper);\r
-},\r
-\r
-addRequestHeaders: function(headers)\r
-{\r
-return extensionServer.sendRequest({ command: "addRequestHeaders", headers: headers, extensionId: location.hostname });\r
-}\r
-}\r
-\r
-function ResourceImpl(id)\r
-{\r
-this._id = id;\r
-}\r
-\r
-ResourceImpl.prototype = {\r
-getContent: function(callback)\r
-{\r
-function callbackWrapper(response)\r
-{\r
-callback(response.content, response.encoding);\r
-}\r
-extensionServer.sendRequest({ command: "getResourceContent", id: this._id }, callback && callbackWrapper);\r
-}\r
-};\r
-\r
-function Panels()\r
-{\r
-var panels = {\r
-elements: new ElementsPanel()\r
-};\r
-\r
-function panelGetter(name)\r
-{\r
-return panels[name];\r
-}\r
-for (var panel in panels)\r
-this.__defineGetter__(panel, bind(panelGetter, null, panel));\r
-}\r
-\r
-Panels.prototype = {\r
-create: function(title, iconURL, pageURL, callback)\r
-{\r
-var id = "extension-panel-" + extensionServer.nextObjectId();\r
-var request = {\r
-command: "createPanel",\r
-id: id,\r
-title: title,\r
-icon: expandURL(iconURL),\r
-url: expandURL(pageURL)\r
-};\r
-extensionServer.sendRequest(request, callback && bind(callback, this, new ExtensionPanel(id)));\r
-}\r
-}\r
-\r
-function PanelImpl(id)\r
-{\r
-this._id = id;\r
-}\r
-\r
-function PanelWithSidebarImpl(id)\r
-{\r
-PanelImpl.call(this, id);\r
-}\r
-\r
-PanelWithSidebarImpl.prototype = {\r
-createSidebarPane: function(title, url, callback)\r
-{\r
-var id = "extension-sidebar-" + extensionServer.nextObjectId();\r
-var request = {\r
-command: "createSidebarPane",\r
-panel: this._id,\r
-id: id,\r
-title: title,\r
-url: expandURL(url)\r
-};\r
-function callbackWrapper()\r
-{\r
-callback(new ExtensionSidebarPane(id));\r
-}\r
-extensionServer.sendRequest(request, callback && callbackWrapper);\r
-},\r
-\r
-createWatchExpressionSidebarPane: function(title, callback)\r
-{\r
-var id = "watch-sidebar-" + extensionServer.nextObjectId();\r
-var request = {\r
-command: "createWatchExpressionSidebarPane",\r
-panel: this._id,\r
-id: id,\r
-title: title\r
-};\r
-function callbackWrapper()\r
-{\r
-callback(new WatchExpressionSidebarPane(id));\r
-}\r
-extensionServer.sendRequest(request, callback && callbackWrapper);\r
-}\r
-}\r
-\r
-PanelWithSidebarImpl.prototype.__proto__ = PanelImpl.prototype;\r
-\r
-function ElementsPanel()\r
-{\r
-var id = "elements";\r
-PanelWithSidebar.call(this, id);\r
-this.onSelectionChanged = new EventSink("panel-objectSelected-" + id);\r
-}\r
-\r
-function ExtensionPanel(id)\r
-{\r
-Panel.call(this, id);\r
-this.onSearch = new EventSink("panel-search-" + id);\r
-}\r
-\r
-function ExtensionSidebarPaneImpl(id)\r
-{\r
-this._id = id;\r
-}\r
-\r
-ExtensionSidebarPaneImpl.prototype = {\r
-setHeight: function(height)\r
-{\r
-extensionServer.sendRequest({ command: "setSidebarHeight", id: this._id, height: height });\r
-}\r
-}\r
-\r
-function WatchExpressionSidebarPaneImpl(id)\r
-{\r
-ExtensionSidebarPaneImpl.call(this, id);\r
-this.onUpdated = new EventSink("watch-sidebar-updated-" + id);\r
-}\r
-\r
-WatchExpressionSidebarPaneImpl.prototype = {\r
-setExpression: function(expression, rootTitle)\r
-{\r
-extensionServer.sendRequest({ command: "setWatchSidebarContent", id: this._id, expression: expression, rootTitle: rootTitle, evaluateOnPage: true });\r
-},\r
-\r
-setObject: function(jsonObject, rootTitle)\r
-{\r
-extensionServer.sendRequest({ command: "setWatchSidebarContent", id: this._id, expression: jsonObject, rootTitle: rootTitle });\r
-}\r
-}\r
-\r
-WatchExpressionSidebarPaneImpl.prototype.__proto__ = ExtensionSidebarPaneImpl.prototype;\r
-\r
-function WatchExpressionSidebarPane(id)\r
-{\r
-var impl = new WatchExpressionSidebarPaneImpl(id);\r
-ExtensionSidebarPane.call(this, id, impl);\r
-}\r
-\r
-function Audits()\r
-{\r
-}\r
-\r
-Audits.prototype = {\r
-addCategory: function(displayName, resultCount)\r
-{\r
-var id = "extension-audit-category-" + extensionServer.nextObjectId();\r
-extensionServer.sendRequest({ command: "addAuditCategory", id: id, displayName: displayName, resultCount: resultCount });\r
-return new AuditCategory(id);\r
-}\r
-}\r
-\r
-function AuditCategoryImpl(id)\r
-{\r
-function auditResultDispatch(request)\r
-{\r
-var auditResult = new AuditResult(request.arguments[0]);\r
-try {\r
-this._fire(auditResult);\r
-} catch (e) {\r
-console.error("Uncaught exception in extension audit event handler: " + e);\r
-auditResult.done();\r
-}\r
-}\r
-this._id = id;\r
-this.onAuditStarted = new EventSink("audit-started-" + id, auditResultDispatch);\r
-}\r
-\r
-function AuditResultImpl(id)\r
-{\r
-this._id = id;\r
-\r
-var formatterTypes = [\r
-"url",\r
-"snippet",\r
-"text"\r
-];\r
-for (var i = 0; i < formatterTypes.length; ++i)\r
-this[formatterTypes[i]] = bind(this._nodeFactory, null, formatterTypes[i]);\r
-}\r
-\r
-AuditResultImpl.prototype = {\r
-addResult: function(displayName, description, severity, details)\r
-{\r
-\r
-if (details && !(details instanceof AuditResultNode))\r
-details = details instanceof Array ? this.createNode.apply(this, details) : this.createNode(details);\r
-\r
-var request = {\r
-command: "addAuditResult",\r
-resultId: this._id,\r
-displayName: displayName,\r
-description: description,\r
-severity: severity,\r
-details: details\r
-};\r
-extensionServer.sendRequest(request);\r
-},\r
-\r
-createResult: function()\r
-{\r
-var node = new AuditResultNode();\r
-node.contents = Array.prototype.slice.call(arguments);\r
-return node;\r
-},\r
-\r
-done: function()\r
-{\r
-extensionServer.sendRequest({ command: "stopAuditCategoryRun", resultId: this._id });\r
-},\r
-\r
-get Severity()\r
-{\r
-return apiPrivate.audits.Severity;\r
-},\r
-\r
-_nodeFactory: function(type)\r
-{\r
-return {\r
-type: type,\r
-arguments: Array.prototype.slice.call(arguments, 1)\r
-};\r
-}\r
-}\r
-\r
-function AuditResultNode(contents)\r
-{\r
-this.contents = contents;\r
-this.children = [];\r
-this.expanded = false;\r
-}\r
-\r
-AuditResultNode.prototype = {\r
-addChild: function()\r
-{\r
-var node = AuditResultImpl.prototype.createResult.apply(null, arguments);\r
-this.children.push(node);\r
-return node;\r
-}\r
-};\r
-\r
-function InspectedWindow()\r
-{\r
-this.onDOMContentLoaded = new EventSink("inspectedPageDOMContentLoaded");\r
-this.onLoaded = new EventSink("inspectedPageLoaded");\r
-this.onNavigated = new EventSink("inspectedURLChanged");\r
-}\r
-\r
-InspectedWindow.prototype = {\r
-reload: function()\r
-{\r
-return extensionServer.sendRequest({ command: "reload" });\r
-},\r
-\r
-eval: function(expression, callback)\r
-{\r
-function callbackWrapper(result)\r
-{\r
-var value = result.value;\r
-if (!result.isException)\r
-value = value === "undefined" ? undefined : JSON.parse(value);\r
-callback(value, result.isException);\r
-}\r
-return extensionServer.sendRequest({ command: "evaluateOnInspectedPage", expression: expression }, callback && callbackWrapper);\r
-}\r
-}\r
-\r
-function ExtensionServerClient()\r
-{\r
-this._callbacks = {};\r
-this._handlers = {};\r
-this._lastRequestId = 0;\r
-this._lastObjectId = 0;\r
-\r
-this.registerHandler("callback", bind(this._onCallback, this));\r
-\r
-var channel = new MessageChannel();\r
-this._port = channel.port1;\r
-this._port.addEventListener("message", bind(this._onMessage, this), false);\r
-this._port.start();\r
-\r
-top.postMessage("registerExtension", [ channel.port2 ], "*");\r
-}\r
-\r
-ExtensionServerClient.prototype = {\r
-sendRequest: function(message, callback)\r
-{\r
-if (typeof callback === "function")\r
-message.requestId = this._registerCallback(callback);\r
-return this._port.postMessage(message);\r
-},\r
-\r
-registerHandler: function(command, handler)\r
-{\r
-this._handlers[command] = handler;\r
-},\r
-\r
-nextObjectId: function()\r
-{\r
-return injectedScriptId + "_" + ++this._lastObjectId;\r
-},\r
-\r
-_registerCallback: function(callback)\r
-{\r
-var id = ++this._lastRequestId;\r
-this._callbacks[id] = callback;\r
-return id;\r
-},\r
-\r
-_onCallback: function(request)\r
-{\r
-if (request.requestId in this._callbacks) {\r
-this._callbacks[request.requestId](request.result);\r
-delete this._callbacks[request.requestId];\r
-}\r
-},\r
-\r
-_onMessage: function(event)\r
-{\r
-var request = event.data;\r
-var handler = this._handlers[request.command];\r
-if (handler)\r
-handler.call(this, request);\r
-}\r
-}\r
-\r
-function expandURL(url)\r
-{\r
-if (!url)\r
-return url;\r
-if (/^[^/]+:/.exec(url)) // See if url has schema.\r
-return url;\r
-var baseURL = location.protocol + "//" + location.hostname + location.port;\r
-if (/^\//.exec(url))\r
-return baseURL + url;\r
-return baseURL + location.pathname.replace(/\/[^/]*$/,"/") + url;\r
-}\r
-\r
-function bind(func, thisObject)\r
-{\r
-var args = Array.prototype.slice.call(arguments, 2);\r
-return function() { return func.apply(thisObject, args.concat(Array.prototype.slice.call(arguments, 0))); };\r
-}\r
-\r
-function populateInterfaceClass(interface, implementation)\r
-{\r
-for (var member in implementation) {\r
-if (member.charAt(0) === "_")\r
-continue;\r
-var value = implementation[member];\r
-interface[member] = typeof value === "function" ? bind(value, implementation)\r
-: interface[member] = implementation[member];\r
-}\r
-}\r
-\r
-function declareInterfaceClass(implConstructor)\r
-{\r
-return function()\r
-{\r
-var impl = { __proto__: implConstructor.prototype };\r
-implConstructor.apply(impl, arguments);\r
-populateInterfaceClass(this, impl);\r
-}\r
-}\r
-\r
-var AuditCategory = declareInterfaceClass(AuditCategoryImpl);\r
-var AuditResult = declareInterfaceClass(AuditResultImpl);\r
-var EventSink = declareInterfaceClass(EventSinkImpl);\r
-var ExtensionSidebarPane = declareInterfaceClass(ExtensionSidebarPaneImpl);\r
-var Panel = declareInterfaceClass(PanelImpl);\r
-var PanelWithSidebar = declareInterfaceClass(PanelWithSidebarImpl);\r
-var Resource = declareInterfaceClass(ResourceImpl);\r
-var WatchExpressionSidebarPane = declareInterfaceClass(WatchExpressionSidebarPaneImpl);\r
-\r
-var extensionServer = new ExtensionServerClient();\r
-\r
-webInspector = new InspectorExtensionAPI();\r
-\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ExtensionAuditCategory = function(id, displayName, ruleCount)\r
-{\r
-this._id = id;\r
-this._displayName = displayName;\r
-this._ruleCount  = ruleCount;\r
-}\r
-\r
-WebInspector.ExtensionAuditCategory.prototype = {\r
-\r
-get id()\r
-{\r
-return this._id;\r
-},\r
-\r
-get displayName()\r
-{\r
-return this._displayName;\r
-},\r
-\r
-get ruleCount()\r
-{\r
-return this._ruleCount;\r
-},\r
-\r
-run: function(resources, callback)\r
-{\r
-new WebInspector.ExtensionAuditCategoryResults(this, callback);\r
-}\r
-}\r
-\r
-WebInspector.ExtensionAuditCategoryResults = function(category, callback)\r
-{\r
-this._category = category;\r
-this._pendingRules = category.ruleCount;\r
-this._ruleCompletionCallback = callback;\r
-\r
-this.id = category.id + "-" + ++WebInspector.ExtensionAuditCategoryResults._lastId;\r
-WebInspector.extensionServer.startAuditRun(category, this);\r
-}\r
-\r
-WebInspector.ExtensionAuditCategoryResults.prototype = {\r
-get complete()\r
-{\r
-return !this._pendingRules;\r
-},\r
-\r
-cancel: function()\r
-{\r
-while (!this.complete)\r
-this._addResult(null);\r
-},\r
-\r
-addResult: function(displayName, description, severity, details)\r
-{\r
-var result = new WebInspector.AuditRuleResult(displayName);\r
-result.addChild(description);\r
-result.severity = severity;\r
-if (details)\r
-this._addNode(result, details);\r
-this._addResult(result);\r
-},\r
-\r
-_addNode: function(parent, node)\r
-{\r
-var addedNode = parent.addChild(node.contents, node.expanded);\r
-if (node.children) {\r
-for (var i = 0; i < node.children.length; ++i)\r
-this._addNode(addedNode, node.children[i]);\r
-}\r
-},\r
-\r
-_addResult: function(result)\r
-{\r
-this._ruleCompletionCallback(result);\r
-this._pendingRules--;\r
-if (!this._pendingRules)\r
-WebInspector.extensionServer.stopAuditRun(this);\r
-}\r
-}\r
-\r
-WebInspector.ExtensionAuditCategoryResults._lastId = 0;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.commonExtensionSymbols = function(apiPrivate)\r
-{\r
-\r
-if (!apiPrivate.audits)\r
-apiPrivate.audits = {};\r
-\r
-apiPrivate.audits.Severity = {\r
-Info: "info",\r
-Warning: "warning",\r
-Severe: "severe"\r
-};\r
-}\r
-\r
-WebInspector.extensionAPI = {};\r
-\r
-WebInspector.commonExtensionSymbols(WebInspector.extensionAPI);\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ExtensionServer = function()\r
-{\r
-this._clientObjects = {};\r
-this._handlers = {};\r
-this._subscribers = {};\r
-this._extraHeaders = {};\r
-this._status = new WebInspector.ExtensionStatus();\r
-\r
-this._registerHandler("addRequestHeaders", this._onAddRequestHeaders.bind(this));\r
-this._registerHandler("addAuditCategory", this._onAddAuditCategory.bind(this));\r
-this._registerHandler("addAuditResult", this._onAddAuditResult.bind(this));\r
-this._registerHandler("createPanel", this._onCreatePanel.bind(this));\r
-this._registerHandler("createSidebarPane", this._onCreateSidebar.bind(this));\r
-this._registerHandler("createWatchExpressionSidebarPane", this._onCreateWatchExpressionSidebarPane.bind(this));\r
-this._registerHandler("evaluateOnInspectedPage", this._onEvaluateOnInspectedPage.bind(this));\r
-this._registerHandler("getHAR", this._onGetHAR.bind(this));\r
-this._registerHandler("getResourceContent", this._onGetResourceContent.bind(this));\r
-this._registerHandler("log", this._onLog.bind(this));\r
-this._registerHandler("reload", this._onReload.bind(this));\r
-this._registerHandler("setSidebarHeight", this._onSetSidebarHeight.bind(this));\r
-this._registerHandler("setWatchSidebarContent", this._onSetWatchSidebarContent.bind(this));\r
-this._registerHandler("stopAuditCategoryRun", this._onStopAuditCategoryRun.bind(this));\r
-this._registerHandler("subscribe", this._onSubscribe.bind(this));\r
-this._registerHandler("unsubscribe", this._onUnsubscribe.bind(this));\r
-\r
-\r
-window.addEventListener("message", this._onWindowMessage.bind(this), false);\r
-}\r
-\r
-WebInspector.ExtensionServer.prototype = {\r
-notifyPanelShown: function(panelName)\r
-{\r
-this._postNotification("panel-shown-" + panelName);\r
-},\r
-\r
-notifyObjectSelected: function(panelId, objectId)\r
-{\r
-this._postNotification("panel-objectSelected-" + panelId, objectId);\r
-},\r
-\r
-notifyResourceFinished: function(resource)\r
-{\r
-this._postNotification("resource-finished", resource.identifier, (new WebInspector.HAREntry(resource)).build());\r
-},\r
-\r
-notifySearchAction: function(panelId, action, searchString)\r
-{\r
-this._postNotification("panel-search-" + panelId, action, searchString);\r
-},\r
-\r
-notifyPageLoaded: function(milliseconds)\r
-{\r
-this._postNotification("inspectedPageLoaded", milliseconds);\r
-},\r
-\r
-notifyPageDOMContentLoaded: function(milliseconds)\r
-{\r
-this._postNotification("inspectedPageDOMContentLoaded", milliseconds);\r
-},\r
-\r
-notifyInspectedURLChanged: function()\r
-{\r
-this._postNotification("inspectedURLChanged");\r
-},\r
-\r
-notifyInspectorReset: function()\r
-{\r
-this._postNotification("reset");\r
-},\r
-\r
-notifyExtensionWatchSidebarUpdated: function(id)\r
-{\r
-this._postNotification("watch-sidebar-updated-" + id);\r
-},\r
-\r
-startAuditRun: function(category, auditRun)\r
-{\r
-this._clientObjects[auditRun.id] = auditRun;\r
-this._postNotification("audit-started-" + category.id, auditRun.id);\r
-},\r
-\r
-stopAuditRun: function(auditRun)\r
-{\r
-delete this._clientObjects[auditRun.id];\r
-},\r
-\r
-_postNotification: function(type, details)\r
-{\r
-var subscribers = this._subscribers[type];\r
-if (!subscribers)\r
-return;\r
-var message = {\r
-command: "notify-" + type,\r
-arguments: Array.prototype.slice.call(arguments, 1)\r
-};\r
-for (var i = 0; i < subscribers.length; ++i)\r
-subscribers[i].postMessage(message);\r
-},\r
-\r
-_onSubscribe: function(message, port)\r
-{\r
-var subscribers = this._subscribers[message.type];\r
-if (subscribers)\r
-subscribers.push(port);\r
-else\r
-this._subscribers[message.type] = [ port ];\r
-},\r
-\r
-_onUnsubscribe: function(message, port)\r
-{\r
-var subscribers = this._subscribers[message.type];\r
-if (!subscribers)\r
-return;\r
-subscribers.remove(port);\r
-if (!subscribers.length)\r
-delete this._subscribers[message.type];\r
-},\r
-\r
-_onAddRequestHeaders: function(message)\r
-{\r
-var id = message.extensionId;\r
-if (typeof id !== "string")\r
-return this._status.E_BADARGTYPE("extensionId", typeof id, "string");\r
-var extensionHeaders = this._extraHeaders[id];\r
-if (!extensionHeaders) {\r
-extensionHeaders = {};\r
-this._extraHeaders[id] = extensionHeaders;\r
-}\r
-for (name in message.headers)\r
-extensionHeaders[name] = message.headers[name];\r
-var allHeaders = {};\r
-for (extension in this._extraHeaders) {\r
-var headers = this._extraHeaders[extension];\r
-for (name in headers) {\r
-if (typeof headers[name] === "string")\r
-allHeaders[name] = headers[name];\r
-}\r
-}\r
-InspectorBackend.setExtraHeaders(allHeaders);\r
-},\r
-\r
-_onCreatePanel: function(message, port)\r
-{\r
-var id = message.id;\r
-\r
-\r
-if (id in this._clientObjects || id in WebInspector.panels)\r
-return this._status.E_EXISTS(id);\r
-var panel = new WebInspector.ExtensionPanel(id, message.title, message.icon);\r
-this._clientObjects[id] = panel;\r
-\r
-var toolbarElement = document.getElementById("toolbar");\r
-var lastToolbarItem = WebInspector.panelOrder[WebInspector.panelOrder.length - 1].toolbarItem;\r
-WebInspector.addPanelToolbarIcon(toolbarElement, panel, lastToolbarItem);\r
-WebInspector.panels[id] = panel;\r
-var iframe = this._createClientIframe(panel.element, message.url);\r
-iframe.style.height = "100%";\r
-return this._status.OK();\r
-},\r
-\r
-_onCreateSidebar: function(message)\r
-{\r
-var sidebar = this._createSidebar(message, WebInspector.SidebarPane);\r
-if (sidebar.isError)\r
-return sidebar;\r
-this._createClientIframe(sidebar.bodyElement, message.url);\r
-return this._status.OK();\r
-},\r
-\r
-_onCreateWatchExpressionSidebarPane: function(message)\r
-{\r
-var sidebar = this._createSidebar(message, WebInspector.ExtensionWatchSidebarPane);\r
-return sidebar.isError ? sidebar : this._status.OK();\r
-},\r
-\r
-_createSidebar: function(message, constructor)\r
-{\r
-var panel = WebInspector.panels[message.panel];\r
-if (!panel)\r
-return this._status.E_NOTFOUND(message.panel);\r
-if (!panel.sidebarElement || !panel.sidebarPanes)\r
-return this._status.E_NOTSUPPORTED();\r
-var id = message.id;\r
-var sidebar = new constructor(message.title, message.id);\r
-this._clientObjects[id] = sidebar;\r
-panel.sidebarPanes[id] = sidebar;\r
-panel.sidebarElement.appendChild(sidebar.element);\r
-\r
-return sidebar;\r
-},\r
-\r
-_createClientIframe: function(parent, url, requestId, port)\r
-{\r
-var iframe = document.createElement("iframe");\r
-iframe.src = url;\r
-iframe.style.width = "100%";\r
-parent.appendChild(iframe);\r
-return iframe;\r
-},\r
-\r
-_onSetSidebarHeight: function(message)\r
-{\r
-var sidebar = this._clientObjects[message.id];\r
-if (!sidebar)\r
-return this._status.E_NOTFOUND(message.id);\r
-sidebar.bodyElement.firstChild.style.height = message.height;\r
-},\r
-\r
-_onSetWatchSidebarContent: function(message)\r
-{\r
-var sidebar = this._clientObjects[message.id];\r
-if (!sidebar)\r
-return this._status.E_NOTFOUND(message.id);\r
-if (message.evaluateOnPage)\r
-sidebar.setExpression(message.expression, message.rootTitle);\r
-else\r
-sidebar.setObject(message.expression, message.rootTitle);\r
-},\r
-\r
-_onLog: function(message)\r
-{\r
-WebInspector.log(message.message);\r
-},\r
-\r
-_onReload: function()\r
-{\r
-InspectorBackend.reloadPage();\r
-return this._status.OK();\r
-},\r
-\r
-_onEvaluateOnInspectedPage: function(message, port)\r
-{\r
-function callback(resultPayload)\r
-{\r
-var resultObject = WebInspector.RemoteObject.fromPayload(resultPayload);\r
-var result = {};\r
-if (resultObject.isError())\r
-result.isException = true;\r
-result.value = resultObject.description;\r
-this._dispatchCallback(message.requestId, port, result);\r
-}\r
-var evalExpression = "JSON.stringify(eval('" +\r
-"with (window.console._commandLineAPI) with (window) {' + unescape('" + escape(message.expression) +\r
-"') + '}'));";\r
-InjectedScriptAccess.getDefault().evaluate(evalExpression, callback.bind(this));\r
-},\r
-\r
-_onRevealAndSelect: function(message)\r
-{\r
-if (message.panelId === "resources" && type === "resource")\r
-return this._onRevealAndSelectResource(message);\r
-else\r
-return this._status.E_NOTSUPPORTED(message.panelId, message.type);\r
-},\r
-\r
-_onRevealAndSelectResource: function(message)\r
-{\r
-var id = message.id;\r
-var resource = null;\r
-\r
-resource = WebInspector.networkResources[id] || WebInspector.resourceForURL(id);\r
-if (!resource)\r
-return this._status.E_NOTFOUND(typeof id + ": " + id);\r
-\r
-WebInspector.panels.resources.showResource(resource, message.line);\r
-WebInspector.showPanel("resources");\r
-},\r
-\r
-_dispatchCallback: function(requestId, port, result)\r
-{\r
-port.postMessage({ command: "callback", requestId: requestId, result: result });\r
-},\r
-\r
-_onGetHAR: function(request)\r
-{\r
-var harLog = new WebInspector.HARLog();\r
-harLog.includeResourceIds = true;\r
-return harLog.build();\r
-},\r
-\r
-_onGetResourceContent: function(message, port)\r
-{\r
-function onContentAvailable(content, encoded)\r
-{\r
-var response = {\r
-encoding: encoded ? "base64" : "",\r
-content: content\r
-};\r
-this._dispatchCallback(message.requestId, port, response);\r
-}\r
-var resource = WebInspector.networkResources[message.id];\r
-if (!resource)\r
-return this._status.E_NOTFOUND(message.id);\r
-resource.requestContent(onContentAvailable.bind(this));\r
-},\r
-\r
-_onAddAuditCategory: function(request)\r
-{\r
-var category = new WebInspector.ExtensionAuditCategory(request.id, request.displayName, request.resultCount);\r
-if (WebInspector.panels.audits.getCategory(category.id))\r
-return this._status.E_EXISTS(category.id);\r
-this._clientObjects[request.id] = category;\r
-WebInspector.panels.audits.addCategory(category);\r
-},\r
-\r
-_onAddAuditResult: function(request)\r
-{\r
-var auditResult = this._clientObjects[request.resultId];\r
-if (!auditResult)\r
-return this._status.E_NOTFOUND(request.resultId);\r
-try {\r
-auditResult.addResult(request.displayName, request.description, request.severity, request.details);\r
-} catch (e) {\r
-return e;\r
-}\r
-return this._status.OK();\r
-},\r
-\r
-_onStopAuditCategoryRun: function(request)\r
-{\r
-var auditRun = this._clientObjects[request.resultId];\r
-if (!auditRun)\r
-return this._status.E_NOTFOUND(request.resultId);\r
-auditRun.cancel();\r
-},\r
-\r
-initExtensions: function()\r
-{\r
-InspectorExtensionRegistry.getExtensionsAsync();\r
-},\r
-\r
-_addExtensions: function(extensions)\r
-{\r
-\r
-InspectorFrontendHost.setExtensionAPI(this._buildExtensionAPIInjectedScript());\r
-for (var i = 0; i < extensions.length; ++i) {\r
-var extension = extensions[i];\r
-try {\r
-if (!extension.startPage)\r
-return;\r
-var iframe = document.createElement("iframe");\r
-iframe.src = extension.startPage;\r
-iframe.style.display = "none";\r
-document.body.appendChild(iframe);\r
-} catch (e) {\r
-console.error("Failed to initialize extension " + extension.startPage + ":" + e);\r
-}\r
-}\r
-},\r
-\r
-_buildExtensionAPIInjectedScript: function()\r
-{\r
-var resourceTypes = {};\r
-var resourceTypeProperties = Object.getOwnPropertyNames(WebInspector.Resource.Type);\r
-for (var i = 0; i < resourceTypeProperties.length; ++i) {\r
-var propName = resourceTypeProperties[i];\r
-var propValue = WebInspector.Resource.Type[propName];\r
-if (typeof propValue === "number")\r
-resourceTypes[propName] = WebInspector.Resource.Type.toString(propValue);\r
-}\r
-var platformAPI = WebInspector.buildPlatformExtensionAPI ? WebInspector.buildPlatformExtensionAPI() : "";\r
-return "(function(){ " +\r
-"var apiPrivate = {};" +\r
-"(" + WebInspector.commonExtensionSymbols.toString() + ")(apiPrivate);" +\r
-"(" + WebInspector.injectedExtensionAPI.toString() + ").apply(this, arguments);" +\r
-"webInspector.resources.Types = " + JSON.stringify(resourceTypes) + ";" +\r
-platformAPI +\r
-"})";\r
-},\r
-\r
-_onWindowMessage: function(event)\r
-{\r
-if (event.data !== "registerExtension")\r
-return;\r
-var port = event.ports[0];\r
-port.addEventListener("message", this._onmessage.bind(this), false);\r
-port.start();\r
-},\r
-\r
-_onmessage: function(event)\r
-{\r
-var request = event.data;\r
-var result;\r
-\r
-if (request.command in this._handlers)\r
-result = this._handlers[request.command](request, event.target);\r
-else\r
-result = this._status.E_NOTSUPPORTED(request.command);\r
-\r
-if (result && request.requestId)\r
-this._dispatchCallback(request.requestId, event.target, result);\r
-},\r
-\r
-_registerHandler: function(command, callback)\r
-{\r
-this._handlers[command] = callback;\r
-}\r
-}\r
-\r
-WebInspector.ExtensionServer._statuses =\r
-{\r
-OK: "",\r
-E_EXISTS: "Object already exists: %s",\r
-E_BADARG: "Invalid argument %s: %s",\r
-E_BADARGTYPE: "Invalid type for argument %s: got %s, expected %s",\r
-E_NOTFOUND: "Object not found: %s",\r
-E_NOTSUPPORTED: "Object does not support requested operation: %s",\r
-}\r
-\r
-WebInspector.ExtensionStatus = function()\r
-{\r
-function makeStatus(code)\r
-{\r
-var description = WebInspector.ExtensionServer._statuses[code] || code;\r
-var details = Array.prototype.slice.call(arguments, 1);\r
-var status = { code: code, description: description, details: details };\r
-if (code !== "OK") {\r
-status.isError = true;\r
-console.log("Extension server error: " + String.vsprintf(description, details));\r
-}\r
-return status;\r
-}\r
-for (status in WebInspector.ExtensionServer._statuses)\r
-this[status] = makeStatus.bind(null, status);\r
-}\r
-\r
-WebInspector.addExtensions = function(extensions)\r
-{\r
-WebInspector.extensionServer._addExtensions(extensions);\r
-}\r
-\r
-WebInspector.extensionServer = new WebInspector.ExtensionServer();\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ExtensionPanel = function(id, label, iconURL, options)\r
-{\r
-this.toolbarItemLabel = label;\r
-this._addStyleRule(".toolbar-item." + id + " .toolbar-icon", "background-image: url(" + iconURL + ");");\r
-WebInspector.Panel.call(this, id);\r
-}\r
-\r
-WebInspector.ExtensionPanel.prototype = {\r
-get defaultFocusedElement()\r
-{\r
-return this.sidebarTreeElement || this.element;\r
-},\r
-\r
-updateMainViewWidth: function(width)\r
-{\r
-this.bodyElement.style.left = width + "px";\r
-this.resize();\r
-},\r
-\r
-searchCanceled: function(startingNewSearch)\r
-{\r
-WebInspector.extensionServer.notifySearchAction(this._id, "cancelSearch");\r
-WebInspector.Panel.prototype.searchCanceled.apply(this, arguments);\r
-},\r
-\r
-performSearch: function(query)\r
-{\r
-WebInspector.extensionServer.notifySearchAction(this._id, "performSearch", query);\r
-WebInspector.Panel.prototype.performSearch.apply(this, arguments);\r
-},\r
-\r
-jumpToNextSearchResult: function()\r
-{\r
-WebInspector.extensionServer.notifySearchAction(this._id, "nextSearchResult");\r
-WebInspector.Panel.prototype.jumpToNextSearchResult.call(this);\r
-},\r
-\r
-jumpToPreviousSearchResult: function()\r
-{\r
-WebInspector.extensionServer.notifySearchAction(this._id, "previousSearchResult");\r
-WebInspector.Panel.prototype.jumpToPreviousSearchResult.call(this);\r
-},\r
-\r
-_addStyleRule: function(selector, body)\r
-{\r
-var style = document.createElement("style");\r
-style.textContent = selector + " { " + body + " }";\r
-document.head.appendChild(style);\r
-}\r
-}\r
-\r
-WebInspector.ExtensionPanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-WebInspector.ExtensionWatchSidebarPane = function(title, id)\r
-{\r
-WebInspector.SidebarPane.call(this, title);\r
-this._id = id;\r
-}\r
-\r
-WebInspector.ExtensionWatchSidebarPane.prototype = {\r
-setObject: function(object, title)\r
-{\r
-this._setObject(WebInspector.RemoteObject.fromLocalObject(object), title);\r
-},\r
-\r
-setExpression: function(expression, title)\r
-{\r
-InjectedScriptAccess.getDefault().evaluate(expression, this._onEvaluate.bind(this, title));\r
-},\r
-\r
-_onEvaluate: function(title, result)\r
-{\r
-this._setObject(WebInspector.RemoteObject.fromPayload(result), title);\r
-},\r
-\r
-_setObject: function(object, title)\r
-{\r
-this.bodyElement.removeChildren();\r
-var section = new WebInspector.ObjectPropertiesSection(object, title, null, true);\r
-if (!title)\r
-section.headerElement.addStyleClass("hidden");\r
-section.expanded = true;\r
-this.bodyElement.appendChild(section.element);\r
-WebInspector.extensionServer.notifyExtensionWatchSidebarUpdated(this._id);\r
-}\r
-}\r
-\r
-WebInspector.ExtensionWatchSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.AuditsPanel = function()\r
-{\r
-WebInspector.Panel.call(this, "audits");\r
-\r
-this.createSidebar();\r
-this.auditsTreeElement = new WebInspector.SidebarSectionTreeElement("", {}, true);\r
-this.sidebarTree.appendChild(this.auditsTreeElement);\r
-this.auditsTreeElement.listItemElement.addStyleClass("hidden");\r
-this.auditsTreeElement.expand();\r
-\r
-this.auditsItemTreeElement = new WebInspector.AuditsSidebarTreeElement();\r
-this.auditsTreeElement.appendChild(this.auditsItemTreeElement);\r
-\r
-this.auditResultsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESULTS"), {}, true);\r
-this.sidebarTree.appendChild(this.auditResultsTreeElement);\r
-this.auditResultsTreeElement.expand();\r
-\r
-this.clearResultsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear audit results."), "clear-status-bar-item");\r
-this.clearResultsButton.addEventListener("click", this._clearButtonClicked.bind(this), false);\r
-\r
-this.viewsContainerElement = document.createElement("div");\r
-this.viewsContainerElement.id = "audit-views";\r
-this.element.appendChild(this.viewsContainerElement);\r
-\r
-this._constructCategories();\r
-\r
-this._launcherView = new WebInspector.AuditLauncherView(this.initiateAudit.bind(this));\r
-for (id in this.categoriesById)\r
-this._launcherView.addCategory(this.categoriesById[id]);\r
-}\r
-\r
-WebInspector.AuditsPanel.prototype = {\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Audits");\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-return [this.clearResultsButton.element];\r
-},\r
-\r
-get mainResourceLoadTime()\r
-{\r
-return this._mainResourceLoadTime;\r
-},\r
-\r
-set mainResourceLoadTime(x)\r
-{\r
-this._mainResourceLoadTime = x;\r
-this._didMainResourceLoad();\r
-},\r
-\r
-get mainResourceDOMContentTime()\r
-{\r
-return this._mainResourceDOMContentTime;\r
-},\r
-\r
-set mainResourceDOMContentTime(x)\r
-{\r
-this._mainResourceDOMContentTime = x;\r
-},\r
-\r
-get categoriesById()\r
-{\r
-return this._auditCategoriesById;\r
-},\r
-\r
-resourceStarted: function(resource)\r
-{\r
-this._launcherView.resourceStarted(resource);\r
-},\r
-\r
-resourceFinished: function(resource)\r
-{\r
-this._launcherView.resourceFinished(resource);\r
-},\r
-\r
-addCategory: function(category)\r
-{\r
-this.categoriesById[category.id] = category;\r
-this._launcherView.addCategory(category);\r
-},\r
-\r
-getCategory: function(id)\r
-{\r
-return this.categoriesById[id];\r
-},\r
-\r
-_constructCategories: function()\r
-{\r
-this._auditCategoriesById = {};\r
-for (var categoryCtorID in WebInspector.AuditCategories) {\r
-var auditCategory = new WebInspector.AuditCategories[categoryCtorID]();\r
-auditCategory._id = categoryCtorID;\r
-this.categoriesById[categoryCtorID] = auditCategory;\r
-}\r
-},\r
-\r
-_executeAudit: function(categories, resultCallback)\r
-{\r
-var resources = [];\r
-for (var id in WebInspector.networkResources)\r
-resources.push(WebInspector.networkResources[id]);\r
-\r
-var rulesRemaining = 0;\r
-for (var i = 0; i < categories.length; ++i)\r
-rulesRemaining += categories[i].ruleCount;\r
-\r
-var results = [];\r
-var mainResourceURL = WebInspector.mainResource.url;\r
-\r
-function ruleResultReadyCallback(categoryResult, ruleResult)\r
-{\r
-if (ruleResult && ruleResult.children)\r
-categoryResult.addRuleResult(ruleResult);\r
-\r
---rulesRemaining;\r
-\r
-if (!rulesRemaining && resultCallback)\r
-resultCallback(mainResourceURL, results);\r
-}\r
-\r
-if (!rulesRemaining) {\r
-resultCallback(mainResourceURL, results);\r
-return;\r
-}\r
-\r
-for (var i = 0; i < categories.length; ++i) {\r
-var category = categories[i];\r
-var result = new WebInspector.AuditCategoryResult(category);\r
-results.push(result);\r
-category.run(resources, ruleResultReadyCallback.bind(null, result));\r
-}\r
-},\r
-\r
-_auditFinishedCallback: function(launcherCallback, mainResourceURL, results)\r
-{\r
-var children = this.auditResultsTreeElement.children;\r
-var ordinal = 1;\r
-for (var i = 0; i < children.length; ++i) {\r
-if (children[i].mainResourceURL === mainResourceURL)\r
-ordinal++;\r
-}\r
-\r
-var resultTreeElement = new WebInspector.AuditResultSidebarTreeElement(results, mainResourceURL, ordinal);\r
-this.auditResultsTreeElement.appendChild(resultTreeElement);\r
-resultTreeElement.reveal();\r
-resultTreeElement.select();\r
-if (launcherCallback)\r
-launcherCallback();\r
-},\r
-\r
-initiateAudit: function(categoryIds, runImmediately, launcherCallback)\r
-{\r
-if (!categoryIds || !categoryIds.length)\r
-return;\r
-\r
-var categories = [];\r
-for (var i = 0; i < categoryIds.length; ++i)\r
-categories.push(this.categoriesById[categoryIds[i]]);\r
-\r
-function initiateAuditCallback(categories, launcherCallback)\r
-{\r
-this._executeAudit(categories, this._auditFinishedCallback.bind(this, launcherCallback));\r
-}\r
-\r
-if (runImmediately)\r
-initiateAuditCallback.call(this, categories, launcherCallback);\r
-else\r
-this._reloadResources(initiateAuditCallback.bind(this, categories, launcherCallback));\r
-},\r
-\r
-_reloadResources: function(callback)\r
-{\r
-this._pageReloadCallback = callback;\r
-InspectorBackend.reloadPage();\r
-},\r
-\r
-_didMainResourceLoad: function()\r
-{\r
-if (this._pageReloadCallback) {\r
-var callback = this._pageReloadCallback;\r
-delete this._pageReloadCallback;\r
-callback();\r
-}\r
-},\r
-\r
-showResults: function(categoryResults)\r
-{\r
-if (!categoryResults._resultView)\r
-categoryResults._resultView = new WebInspector.AuditResultView(categoryResults);\r
-\r
-this.visibleView = categoryResults._resultView;\r
-},\r
-\r
-showLauncherView: function()\r
-{\r
-this.visibleView = this._launcherView;\r
-},\r
-\r
-get visibleView()\r
-{\r
-return this._visibleView;\r
-},\r
-\r
-set visibleView(x)\r
-{\r
-if (this._visibleView === x)\r
-return;\r
-\r
-if (this._visibleView)\r
-this._visibleView.hide();\r
-\r
-this._visibleView = x;\r
-\r
-if (x)\r
-x.show(this.viewsContainerElement);\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-this._updateLauncherViewControls(!WebInspector.panels.resources || WebInspector.panels.resources.resourceTrackingEnabled);\r
-},\r
-\r
-reset: function()\r
-{\r
-this._launcherView.reset();\r
-},\r
-\r
-attach: function()\r
-{\r
-WebInspector.Panel.prototype.attach.call(this);\r
-\r
-this.auditsItemTreeElement.select();\r
-},\r
-\r
-updateMainViewWidth: function(width)\r
-{\r
-this.viewsContainerElement.style.left = width + "px";\r
-},\r
-\r
-_updateLauncherViewControls: function(isTracking)\r
-{\r
-if (this._launcherView)\r
-this._launcherView.updateResourceTrackingState(isTracking);\r
-},\r
-\r
-_clearButtonClicked: function()\r
-{\r
-this.auditsItemTreeElement.reveal();\r
-this.auditsItemTreeElement.select();\r
-this.auditResultsTreeElement.removeChildren();\r
-}\r
-}\r
-\r
-WebInspector.AuditsPanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-\r
-\r
-WebInspector.AuditCategory = function(displayName)\r
-{\r
-this._displayName = displayName;\r
-this._rules = [];\r
-}\r
-\r
-WebInspector.AuditCategory.prototype = {\r
-get id()\r
-{\r
-\r
-return this._id;\r
-},\r
-\r
-get displayName()\r
-{\r
-return this._displayName;\r
-},\r
-\r
-get ruleCount()\r
-{\r
-this._ensureInitialized();\r
-return this._rules.length;\r
-},\r
-\r
-addRule: function(rule, severity)\r
-{\r
-rule.severity = severity;\r
-this._rules.push(rule);\r
-},\r
-\r
-run: function(resources, callback)\r
-{\r
-this._ensureInitialized();\r
-for (var i = 0; i < this._rules.length; ++i)\r
-this._rules[i].run(resources, callback);\r
-},\r
-\r
-_ensureInitialized: function()\r
-{\r
-if (!this._initialized) {\r
-if ("initialize" in this)\r
-this.initialize();\r
-this._initialized = true;\r
-}\r
-}\r
-}\r
-\r
-\r
-WebInspector.AuditRule = function(id, displayName)\r
-{\r
-this._id = id;\r
-this._displayName = displayName;\r
-}\r
-\r
-WebInspector.AuditRule.Severity = {\r
-Info: "info",\r
-Warning: "warning",\r
-Severe: "severe"\r
-}\r
-\r
-WebInspector.AuditRule.SeverityOrder = {\r
-"info": 3,\r
-"warning": 2,\r
-"severe": 1\r
-}\r
-\r
-WebInspector.AuditRule.prototype = {\r
-get id()\r
-{\r
-return this._id;\r
-},\r
-\r
-get displayName()\r
-{\r
-return this._displayName;\r
-},\r
-\r
-set severity(severity)\r
-{\r
-this._severity = severity;\r
-},\r
-\r
-run: function(resources, callback)\r
-{\r
-var result = new WebInspector.AuditRuleResult(this.displayName);\r
-result.severity = this._severity;\r
-this.doRun(resources, result, callback);\r
-},\r
-\r
-doRun: function(resources, result, callback)\r
-{\r
-throw new Error("doRun() not implemented");\r
-}\r
-}\r
-\r
-WebInspector.AuditCategoryResult = function(category)\r
-{\r
-this.title = category.displayName;\r
-this.ruleResults = [];\r
-}\r
-\r
-WebInspector.AuditCategoryResult.prototype = {\r
-addRuleResult: function(ruleResult)\r
-{\r
-this.ruleResults.push(ruleResult);\r
-}\r
-}\r
-\r
-WebInspector.AuditRuleResult = function(value, expanded, className)\r
-{\r
-this.value = value;\r
-this.className = className;\r
-this.expanded = expanded;\r
-this.violationCount = 0;\r
-}\r
-\r
-WebInspector.AuditRuleResult.linkifyDisplayName = function(url)\r
-{\r
-return WebInspector.linkifyURL(url, WebInspector.displayNameForURL(url));\r
-}\r
-\r
-WebInspector.AuditRuleResult.resourceDomain = function(domain)\r
-{\r
-return domain || WebInspector.UIString("[empty domain]");\r
-}\r
-\r
-WebInspector.AuditRuleResult.prototype = {\r
-addChild: function(value, expanded, className)\r
-{\r
-if (!this.children)\r
-this.children = [];\r
-var entry = new WebInspector.AuditRuleResult(value, expanded, className);\r
-this.children.push(entry);\r
-return entry;\r
-},\r
-\r
-addURL: function(url)\r
-{\r
-return this.addChild(WebInspector.AuditRuleResult.linkifyDisplayName(url));\r
-},\r
-\r
-addURLs: function(urls)\r
-{\r
-for (var i = 0; i < urls.length; ++i)\r
-this.addURL(urls[i]);\r
-},\r
-\r
-addSnippet: function(snippet)\r
-{\r
-return this.addChild(snippet, false, "source-code");\r
-}\r
-}\r
-\r
-WebInspector.AuditsSidebarTreeElement = function()\r
-{\r
-this.small = false;\r
-\r
-WebInspector.SidebarTreeElement.call(this, "audits-sidebar-tree-item", WebInspector.UIString("Audits"), "", null, false);\r
-}\r
-\r
-WebInspector.AuditsSidebarTreeElement.prototype = {\r
-onattach: function()\r
-{\r
-WebInspector.SidebarTreeElement.prototype.onattach.call(this);\r
-},\r
-\r
-onselect: function()\r
-{\r
-WebInspector.panels.audits.showLauncherView();\r
-},\r
-\r
-get selectable()\r
-{\r
-return true;\r
-},\r
-\r
-refresh: function()\r
-{\r
-this.refreshTitles();\r
-}\r
-}\r
-\r
-WebInspector.AuditsSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;\r
-\r
-\r
-WebInspector.AuditResultSidebarTreeElement = function(results, mainResourceURL, ordinal)\r
-{\r
-this.results = results;\r
-this.mainResourceURL = mainResourceURL;\r
-\r
-WebInspector.SidebarTreeElement.call(this, "audit-result-sidebar-tree-item", String.sprintf("%s (%d)", mainResourceURL, ordinal), "", {}, false);\r
-}\r
-\r
-WebInspector.AuditResultSidebarTreeElement.prototype = {\r
-onselect: function()\r
-{\r
-WebInspector.panels.audits.showResults(this.results);\r
-},\r
-\r
-get selectable()\r
-{\r
-return true;\r
-}\r
-}\r
-\r
-WebInspector.AuditResultSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;\r
-\r
-\r
-WebInspector.AuditRules = {};\r
-\r
-\r
-WebInspector.AuditCategories = {};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.AuditResultView = function(categoryResults)\r
-{\r
-WebInspector.View.call(this);\r
-this.element.className = "audit-result-view";\r
-\r
-function categorySorter(a, b) {\r
-return (a.title || "").localeCompare(b.title || "");\r
-}\r
-categoryResults.sort(categorySorter);\r
-for (var i = 0; i < categoryResults.length; ++i)\r
-this.element.appendChild(new WebInspector.AuditCategoryResultPane(categoryResults[i]).element);\r
-}\r
-\r
-WebInspector.AuditResultView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-WebInspector.AuditCategoryResultPane = function(categoryResult)\r
-{\r
-WebInspector.SidebarPane.call(this, categoryResult.title);\r
-var treeOutlineElement = document.createElement("ol");\r
-this.bodyElement.addStyleClass("audit-result-tree");\r
-this.bodyElement.appendChild(treeOutlineElement);\r
-\r
-this._treeOutline = new TreeOutline(treeOutlineElement);\r
-this._treeOutline.expandTreeElementsWhenArrowing = true;\r
-\r
-function ruleSorter(a, b)\r
-{\r
-var result = WebInspector.AuditRule.SeverityOrder[a.severity || 0] - WebInspector.AuditRule.SeverityOrder[b.severity || 0];\r
-if (!result)\r
-result = (a.value || "").localeCompare(b.value || "");\r
-return result;\r
-}\r
-\r
-categoryResult.ruleResults.sort(ruleSorter);\r
-\r
-for (var i = 0; i < categoryResult.ruleResults.length; ++i) {\r
-var ruleResult = categoryResult.ruleResults[i];\r
-var treeElement = this._appendResult(this._treeOutline, ruleResult);\r
-treeElement.listItemElement.addStyleClass("audit-result");\r
-\r
-if (ruleResult.severity) {\r
-var severityElement = document.createElement("img");\r
-severityElement.className = "severity-" + ruleResult.severity;\r
-treeElement.listItemElement.appendChild(severityElement);\r
-}\r
-}\r
-this.expand();\r
-}\r
-\r
-WebInspector.AuditCategoryResultPane.prototype = {\r
-_appendResult: function(parentTreeElement, result)\r
-{\r
-var title = "";\r
-\r
-if (typeof result.value === "string") {\r
-title = result.value;\r
-if (result.violationCount)\r
-title = String.sprintf("%s (%d)", title, result.violationCount);\r
-}\r
-\r
-var treeElement = new TreeElement(null, null, !!result.children);\r
-treeElement.titleHTML = title;\r
-parentTreeElement.appendChild(treeElement);\r
-\r
-if (result.className)\r
-treeElement.listItemElement.addStyleClass(result.className);\r
-if (typeof result.value !== "string")\r
-treeElement.listItemElement.appendChild(WebInspector.applyFormatters(result.value));\r
-\r
-if (result.children) {\r
-for (var i = 0; i < result.children.length; ++i)\r
-this._appendResult(treeElement, result.children[i]);\r
-}\r
-if (result.expanded) {\r
-treeElement.listItemElement.removeStyleClass("parent");\r
-treeElement.listItemElement.addStyleClass("parent-expanded");\r
-treeElement.expand();\r
-}\r
-return treeElement;\r
-}\r
-}\r
-\r
-WebInspector.AuditCategoryResultPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.AuditLauncherView = function(runnerCallback)\r
-{\r
-WebInspector.View.call(this);\r
-this._runnerCallback = runnerCallback;\r
-this._categoryIdPrefix = "audit-category-item-";\r
-this._auditRunning = false;\r
-\r
-this.element.addStyleClass("audit-launcher-view");\r
-\r
-this._contentElement = document.createElement("div");\r
-this._contentElement.className = "audit-launcher-view-content";\r
-this.element.appendChild(this._contentElement);\r
-this._boundCategoryClickListener = this._categoryClicked.bind(this);\r
-\r
-this._resetResourceCount();\r
-\r
-this._sortedCategories = [];\r
-\r
-this._headerElement = document.createElement("h1");\r
-this._headerElement.className = "no-audits";\r
-this._headerElement.textContent = WebInspector.UIString("No audits to run");\r
-this._contentElement.appendChild(this._headerElement);\r
-}\r
-\r
-WebInspector.AuditLauncherView.prototype = {\r
-updateResourceTrackingState: function(isTracking)\r
-{\r
-if (!this._auditPresentStateLabelElement)\r
-return;\r
-\r
-if (isTracking) {\r
-this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State");\r
-this._auditPresentStateElement.disabled = false;\r
-this._auditPresentStateElement.parentElement.removeStyleClass("disabled");\r
-} else {\r
-this._resetResourceCount();\r
-this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State (Resource Tracking must be enabled)");\r
-this._auditPresentStateElement.disabled = true;\r
-this._auditPresentStateElement.parentElement.addStyleClass("disabled");\r
-this.auditReloadedStateElement.checked = true;\r
-}\r
-},\r
-\r
-get totalResources()\r
-{\r
-return this._totalResources;\r
-},\r
-\r
-set totalResources(x)\r
-{\r
-if (this._totalResources === x)\r
-return;\r
-this._totalResources = x;\r
-this._updateResourceProgress();\r
-},\r
-\r
-get loadedResources()\r
-{\r
-return this._loadedResources;\r
-},\r
-\r
-set loadedResources(x)\r
-{\r
-if (this._loadedResources === x)\r
-return;\r
-this._loadedResources = x;\r
-this._updateResourceProgress();\r
-},\r
-\r
-_resetResourceCount: function()\r
-{\r
-this.loadedResources = 0;\r
-\r
-\r
-\r
-this.totalResources = 1;\r
-},\r
-\r
-resourceStarted: function(resource)\r
-{\r
-++this.totalResources;\r
-},\r
-\r
-resourceFinished: function(resource)\r
-{\r
-++this.loadedResources;\r
-},\r
-\r
-reset: function()\r
-{\r
-this._resetResourceCount();\r
-},\r
-\r
-addCategory: function(category)\r
-{\r
-if (!this._sortedCategories.length)\r
-this._createLauncherUI();\r
-\r
-var categoryElement = this._createCategoryElement(category.displayName, category.id);\r
-category._checkboxElement = categoryElement.firstChild;\r
-if (this._selectAllCheckboxElement.checked) {\r
-category._checkboxElement.checked = true;\r
-++this._currentCategoriesCount;\r
-}\r
-\r
-function compareCategories(a, b)\r
-{\r
-var aTitle = a.displayName || "";\r
-var bTitle = b.displayName || "";\r
-return aTitle.localeCompare(bTitle);\r
-}\r
-var insertBefore = insertionIndexForObjectInListSortedByFunction(category, this._sortedCategories, compareCategories);\r
-this._categoriesElement.insertBefore(categoryElement, this._categoriesElement.children[insertBefore]);\r
-this._sortedCategories.splice(insertBefore, 0, category);\r
-this._updateButton();\r
-},\r
-\r
-_setAuditRunning: function(auditRunning)\r
-{\r
-if (this._auditRunning === auditRunning)\r
-return;\r
-this._auditRunning = auditRunning;\r
-this._updateButton();\r
-this._updateResourceProgress();\r
-},\r
-\r
-_launchButtonClicked: function(event)\r
-{\r
-var catIds = [];\r
-var childNodes = this._categoriesElement.childNodes;\r
-for (var category = 0; category < this._sortedCategories.length; ++category) {\r
-if (this._sortedCategories[category]._checkboxElement.checked)\r
-catIds.push(this._sortedCategories[category].id);\r
-}\r
-\r
-this._setAuditRunning(true);\r
-this._runnerCallback(catIds, this._auditPresentStateElement.checked, this._setAuditRunning.bind(this, false));\r
-},\r
-\r
-_selectAllClicked: function(checkCategories)\r
-{\r
-var childNodes = this._categoriesElement.childNodes;\r
-for (var i = 0, length = childNodes.length; i < length; ++i)\r
-childNodes[i].firstChild.checked = checkCategories;\r
-this._currentCategoriesCount = checkCategories ? this._sortedCategories.length : 0;\r
-this._updateButton();\r
-},\r
-\r
-_categoryClicked: function(event)\r
-{\r
-this._currentCategoriesCount += event.target.checked ? 1 : -1;\r
-this._selectAllCheckboxElement.checked = this._currentCategoriesCount === this._sortedCategories.length;\r
-this._updateButton();\r
-},\r
-\r
-_createCategoryElement: function(title, id)\r
-{\r
-var labelElement = document.createElement("label");\r
-labelElement.id = this._categoryIdPrefix + id;\r
-\r
-var element = document.createElement("input");\r
-element.type = "checkbox";\r
-if (id !== "")\r
-element.addEventListener("click", this._boundCategoryClickListener, false);\r
-labelElement.appendChild(element);\r
-labelElement.appendChild(document.createTextNode(title));\r
-\r
-return labelElement;\r
-},\r
-\r
-_createLauncherUI: function()\r
-{\r
-this._headerElement = document.createElement("h1");\r
-this._headerElement.textContent = WebInspector.UIString("Select audits to run");\r
-\r
-for (var child = 0; child < this._contentElement.children.length; ++child)\r
-this._contentElement.removeChild(this._contentElement.children[child]);\r
-\r
-this._contentElement.appendChild(this._headerElement);\r
-\r
-function handleSelectAllClick(event)\r
-{\r
-this._selectAllClicked(event.target.checked);\r
-}\r
-var categoryElement = this._createCategoryElement(WebInspector.UIString("Select All"), "");\r
-categoryElement.id = "audit-launcher-selectall";\r
-this._selectAllCheckboxElement = categoryElement.firstChild;\r
-this._selectAllCheckboxElement.checked = true;\r
-this._selectAllCheckboxElement.addEventListener("click", handleSelectAllClick.bind(this), false);\r
-this._contentElement.appendChild(categoryElement);\r
-\r
-this._categoriesElement = document.createElement("div");\r
-this._categoriesElement.className = "audit-categories-container";\r
-this._contentElement.appendChild(this._categoriesElement);\r
-\r
-this._currentCategoriesCount = 0;\r
-\r
-var flexibleSpaceElement = document.createElement("div");\r
-flexibleSpaceElement.className = "flexible-space";\r
-this._contentElement.appendChild(flexibleSpaceElement);\r
-\r
-this._buttonContainerElement = document.createElement("div");\r
-this._buttonContainerElement.className = "button-container";\r
-\r
-var labelElement = document.createElement("label");\r
-this._auditPresentStateElement = document.createElement("input");\r
-this._auditPresentStateElement.name = "audit-mode";\r
-this._auditPresentStateElement.type = "radio";\r
-this._auditPresentStateElement.checked = true;\r
-this._auditPresentStateLabelElement = document.createTextNode("");\r
-labelElement.appendChild(this._auditPresentStateElement);\r
-labelElement.appendChild(this._auditPresentStateLabelElement);\r
-this._buttonContainerElement.appendChild(labelElement);\r
-\r
-labelElement = document.createElement("label");\r
-this.auditReloadedStateElement = document.createElement("input");\r
-this.auditReloadedStateElement.name = "audit-mode";\r
-this.auditReloadedStateElement.type = "radio";\r
-labelElement.appendChild(this.auditReloadedStateElement);\r
-labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load"));\r
-this._buttonContainerElement.appendChild(labelElement);\r
-\r
-this._launchButton = document.createElement("button");\r
-this._launchButton.type = "button";\r
-this._launchButton.textContent = WebInspector.UIString("Run");\r
-this._launchButton.addEventListener("click", this._launchButtonClicked.bind(this), false);\r
-this._buttonContainerElement.appendChild(this._launchButton);\r
-\r
-this._resourceProgressContainer = document.createElement("span");\r
-this._resourceProgressContainer.className = "resource-progress";\r
-var resourceProgressImage = document.createElement("img");\r
-this._resourceProgressContainer.appendChild(resourceProgressImage);\r
-this._resourceProgressTextElement = document.createElement("span");\r
-this._resourceProgressContainer.appendChild(this._resourceProgressTextElement);\r
-this._buttonContainerElement.appendChild(this._resourceProgressContainer);\r
-\r
-this._contentElement.appendChild(this._buttonContainerElement);\r
-\r
-this._selectAllClicked(this._selectAllCheckboxElement.checked);\r
-this.updateResourceTrackingState();\r
-this._updateButton();\r
-this._updateResourceProgress();\r
-},\r
-\r
-_updateResourceProgress: function()\r
-{\r
-if (!this._resourceProgressContainer)\r
-return;\r
-\r
-if (!this._auditRunning) {\r
-this._resetResourceCount();\r
-this._resourceProgressContainer.addStyleClass("hidden");\r
-} else\r
-this._resourceProgressContainer.removeStyleClass("hidden");\r
-this._resourceProgressTextElement.textContent = WebInspector.UIString("Loading (%d of %d)", this.loadedResources, this.totalResources);\r
-},\r
-\r
-_updateButton: function()\r
-{\r
-this._launchButton.disabled = !this._currentCategoriesCount || this._auditRunning;\r
-}\r
-}\r
-\r
-WebInspector.AuditLauncherView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.AuditRules.IPAddressRegexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;\r
-\r
-WebInspector.AuditRules.CacheableResponseCodes =\r
-{\r
-200: true,\r
-203: true,\r
-206: true,\r
-300: true,\r
-301: true,\r
-410: true,\r
-\r
-304: true \r
-}\r
-\r
-WebInspector.AuditRules.getDomainToResourcesMap = function(resources, types, needFullResources)\r
-{\r
-var domainToResourcesMap = {};\r
-for (var i = 0, size = resources.length; i < size; ++i) {\r
-var resource = resources[i];\r
-if (types && types.indexOf(resource.type) === -1)\r
-continue;\r
-var parsedURL = resource.url.asParsedURL();\r
-if (!parsedURL)\r
-continue;\r
-var domain = parsedURL.host;\r
-var domainResources = domainToResourcesMap[domain];\r
-if (domainResources === undefined) {\r
-domainResources = [];\r
-domainToResourcesMap[domain] = domainResources;\r
-}\r
-domainResources.push(needFullResources ? resource : resource.url);\r
-}\r
-return domainToResourcesMap;\r
-}\r
-\r
-WebInspector.AuditRules.evaluateInTargetWindow = function(func, args, callback)\r
-{\r
-InjectedScriptAccess.getDefault().evaluateOnSelf(func.toString(), args, callback);\r
-}\r
-\r
-\r
-WebInspector.AuditRules.GzipRule = function()\r
-{\r
-WebInspector.AuditRule.call(this, "network-gzip", "Enable gzip compression");\r
-}\r
-\r
-WebInspector.AuditRules.GzipRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-var totalSavings = 0;\r
-var compressedSize = 0;\r
-var candidateSize = 0;\r
-var summary = result.addChild("", true);\r
-for (var i = 0, length = resources.length; i < length; ++i) {\r
-var resource = resources[i];\r
-if (this._shouldCompress(resource)) {\r
-var size = resource.resourceSize;\r
-candidateSize += size;\r
-if (this._isCompressed(resource)) {\r
-compressedSize += size;\r
-continue;\r
-}\r
-var savings = 2 * size / 3;\r
-totalSavings += savings;\r
-summary.addChild(String.sprintf("%s could save ~%s", WebInspector.AuditRuleResult.linkifyDisplayName(resource.url), Number.bytesToString(savings, WebInspector.UIString)));\r
-result.violationCount++;\r
-}\r
-}\r
-if (!totalSavings)\r
-return callback(null);\r
-summary.value = String.sprintf("Compressing the following resources with gzip could reduce their transfer size by about two thirds (~%s):", Number.bytesToString(totalSavings, WebInspector.UIString));\r
-callback(result);\r
-},\r
-\r
-_isCompressed: function(resource)\r
-{\r
-var encoding = resource.responseHeaders["Content-Encoding"];\r
-return encoding === "gzip" || encoding === "deflate";\r
-},\r
-\r
-_shouldCompress: function(resource)\r
-{\r
-return WebInspector.Resource.Type.isTextType(resource.type) && resource.domain && resource.resourceSize !== undefined && resource.resourceSize > 150;\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.GzipRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.CombineExternalResourcesRule = function(id, name, type, resourceTypeName, allowedPerDomain)\r
-{\r
-WebInspector.AuditRule.call(this, id, name);\r
-this._type = type;\r
-this._resourceTypeName = resourceTypeName;\r
-this._allowedPerDomain = allowedPerDomain;\r
-}\r
-\r
-WebInspector.AuditRules.CombineExternalResourcesRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources, [this._type]);\r
-var penalizedResourceCount = 0;\r
-\r
-var summary = result.addChild("", true);\r
-for (var domain in domainToResourcesMap) {\r
-var domainResources = domainToResourcesMap[domain];\r
-var extraResourceCount = domainResources.length - this._allowedPerDomain;\r
-if (extraResourceCount <= 0)\r
-continue;\r
-penalizedResourceCount += extraResourceCount - 1;\r
-summary.addChild(String.sprintf("%d %s resources served from %s.", domainResources.length, this._resourceTypeName, WebInspector.AuditRuleResult.resourceDomain(domain)));\r
-result.violationCount += domainResources.length;\r
-}\r
-if (!penalizedResourceCount)\r
-return callback(null);\r
-\r
-summary.value = "There are multiple resources served from same domain. Consider combining them into as few files as possible.";\r
-callback(result);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.CombineExternalResourcesRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.CombineJsResourcesRule = function(allowedPerDomain) {\r
-WebInspector.AuditRules.CombineExternalResourcesRule.call(this, "page-externaljs", "Combine external JavaScript", WebInspector.Resource.Type.Script, "JavaScript", allowedPerDomain);\r
-}\r
-\r
-WebInspector.AuditRules.CombineJsResourcesRule.prototype.__proto__ = WebInspector.AuditRules.CombineExternalResourcesRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.CombineCssResourcesRule = function(allowedPerDomain) {\r
-WebInspector.AuditRules.CombineExternalResourcesRule.call(this, "page-externalcss", "Combine external CSS", WebInspector.Resource.Type.Stylesheet, "CSS", allowedPerDomain);\r
-}\r
-\r
-WebInspector.AuditRules.CombineCssResourcesRule.prototype.__proto__ = WebInspector.AuditRules.CombineExternalResourcesRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.MinimizeDnsLookupsRule = function(hostCountThreshold) {\r
-WebInspector.AuditRule.call(this, "network-minimizelookups", "Minimize DNS lookups");\r
-this._hostCountThreshold = hostCountThreshold;\r
-}\r
-\r
-WebInspector.AuditRules.MinimizeDnsLookupsRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-var summary = result.addChild("");\r
-var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources, undefined);\r
-for (var domain in domainToResourcesMap) {\r
-if (domainToResourcesMap[domain].length > 1)\r
-continue;\r
-var parsedURL = domain.asParsedURL();\r
-if (!parsedURL)\r
-continue;\r
-if (!parsedURL.host.search(WebInspector.AuditRules.IPAddressRegexp))\r
-continue; \r
-summary.addSnippet(match[2]);\r
-result.violationCount++;\r
-}\r
-if (!summary.children || summary.children.length <= this._hostCountThreshold)\r
-return callback(null);\r
-\r
-summary.value = "The following domains only serve one resource each. If possible, avoid the extra DNS lookups by serving these resources from existing domains.";\r
-callback(result);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.MinimizeDnsLookupsRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.ParallelizeDownloadRule = function(optimalHostnameCount, minRequestThreshold, minBalanceThreshold)\r
-{\r
-WebInspector.AuditRule.call(this, "network-parallelizehosts", "Parallelize downloads across hostnames");\r
-this._optimalHostnameCount = optimalHostnameCount;\r
-this._minRequestThreshold = minRequestThreshold;\r
-this._minBalanceThreshold = minBalanceThreshold;\r
-}\r
-\r
-\r
-WebInspector.AuditRules.ParallelizeDownloadRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-function hostSorter(a, b)\r
-{\r
-var aCount = domainToResourcesMap[a].length;\r
-var bCount = domainToResourcesMap[b].length;\r
-return (aCount < bCount) ? 1 : (aCount == bCount) ? 0 : -1;\r
-}\r
-\r
-var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(\r
-resources,\r
-[WebInspector.Resource.Type.Stylesheet, WebInspector.Resource.Type.Image],\r
-true);\r
-\r
-var hosts = [];\r
-for (var url in domainToResourcesMap)\r
-hosts.push(url);\r
-\r
-if (!hosts.length)\r
-return callback(null); \r
-\r
-hosts.sort(hostSorter);\r
-\r
-var optimalHostnameCount = this._optimalHostnameCount;\r
-if (hosts.length > optimalHostnameCount)\r
-hosts.splice(optimalHostnameCount);\r
-\r
-var busiestHostResourceCount = domainToResourcesMap[hosts[0]].length;\r
-var resourceCountAboveThreshold = busiestHostResourceCount - this._minRequestThreshold;\r
-if (resourceCountAboveThreshold <= 0)\r
-return callback(null);\r
-\r
-var avgResourcesPerHost = 0;\r
-for (var i = 0, size = hosts.length; i < size; ++i)\r
-avgResourcesPerHost += domainToResourcesMap[hosts[i]].length;\r
-\r
-\r
-avgResourcesPerHost /= optimalHostnameCount;\r
-avgResourcesPerHost = Math.max(avgResourcesPerHost, 1);\r
-\r
-var pctAboveAvg = (resourceCountAboveThreshold / avgResourcesPerHost) - 1.0;\r
-var minBalanceThreshold = this._minBalanceThreshold;\r
-if (pctAboveAvg < minBalanceThreshold)\r
-return callback(null);\r
-\r
-var resourcesOnBusiestHost = domainToResourcesMap[hosts[0]];\r
-var entry = result.addChild(String.sprintf("This page makes %d parallelizable requests to %s. Increase download parallelization by distributing the following requests across multiple hostnames.", busiestHostResourceCount, hosts[0]), true);\r
-for (var i = 0; i < resourcesOnBusiestHost.length; ++i)\r
-entry.addURL(resourcesOnBusiestHost[i].url);\r
-\r
-result.violationCount = resourcesOnBusiestHost.length;\r
-callback(result);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.ParallelizeDownloadRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-\r
-\r
-WebInspector.AuditRules.UnusedCssRule = function()\r
-{\r
-WebInspector.AuditRule.call(this, "page-unusedcss", "Remove unused CSS rules");\r
-}\r
-\r
-WebInspector.AuditRules.UnusedCssRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-var self = this;\r
-\r
-function evalCallback(styleSheets) {\r
-if (!styleSheets.length)\r
-return callback(null);\r
-\r
-var pseudoSelectorRegexp = /:hover|:link|:active|:visited|:focus|:before|:after/;\r
-var selectors = [];\r
-var testedSelectors = {};\r
-for (var i = 0; i < styleSheets.length; ++i) {\r
-var styleSheet = styleSheets[i];\r
-for (var curRule = 0; curRule < styleSheet.rules.length; ++curRule) {\r
-var selectorText = styleSheet.rules[curRule].selectorText;\r
-if (selectorText.match(pseudoSelectorRegexp) || testedSelectors[selectorText])\r
-continue;\r
-selectors.push(selectorText);\r
-testedSelectors[selectorText] = 1;\r
-}\r
-}\r
-\r
-function selectorsCallback(callback, styleSheets, testedSelectors, foundSelectors)\r
-{\r
-var inlineBlockOrdinal = 0;\r
-var totalStylesheetSize = 0;\r
-var totalUnusedStylesheetSize = 0;\r
-var summary;\r
-\r
-for (var i = 0; i < styleSheets.length; ++i) {\r
-var styleSheet = styleSheets[i];\r
-var stylesheetSize = 0;\r
-var unusedStylesheetSize = 0;\r
-var unusedRules = [];\r
-for (var curRule = 0; curRule < styleSheet.rules.length; ++curRule) {\r
-var rule = styleSheet.rules[curRule];\r
-\r
-var textLength = (rule.selectorRange && rule.style.properties.endOffset) ? rule.style.properties.endOffset - rule.selectorRange.start + 1 : 0;\r
-if (!textLength && rule.style.cssText)\r
-textLength = rule.style.cssText.length + rule.selectorText.length;\r
-stylesheetSize += textLength;\r
-if (!testedSelectors[rule.selectorText] || foundSelectors[rule.selectorText])\r
-continue;\r
-unusedStylesheetSize += textLength;\r
-unusedRules.push(rule.selectorText);\r
-}\r
-totalStylesheetSize += stylesheetSize;\r
-totalUnusedStylesheetSize += unusedStylesheetSize;\r
-\r
-if (!unusedRules.length)\r
-continue;\r
-\r
-var resource = WebInspector.resourceManager.resourceForURL(styleSheet.sourceURL);\r
-var isInlineBlock = resource && resource.type == WebInspector.Resource.Type.Document;\r
-var url = !isInlineBlock ? WebInspector.AuditRuleResult.linkifyDisplayName(styleSheet.sourceURL) : String.sprintf("Inline block #%d", ++inlineBlockOrdinal);\r
-var pctUnused = Math.round(100 * unusedStylesheetSize / stylesheetSize);\r
-if (!summary)\r
-summary = result.addChild("", true);\r
-var entry = summary.addChild(String.sprintf("%s: %s (%d%%) is not used by the current page.", url, Number.bytesToString(unusedStylesheetSize), pctUnused));\r
-\r
-for (var j = 0; j < unusedRules.length; ++j)\r
-entry.addSnippet(unusedRules[j]);\r
-\r
-result.violationCount += unusedRules.length;\r
-}\r
-\r
-if (!totalUnusedStylesheetSize)\r
-return callback(null);\r
-\r
-var totalUnusedPercent = Math.round(100 * totalUnusedStylesheetSize / totalStylesheetSize);\r
-summary.value = String.sprintf("%s (%d%%) of CSS is not used by the current page.", Number.bytesToString(totalUnusedStylesheetSize), totalUnusedPercent);\r
-\r
-callback(result);\r
-}\r
-\r
-function routine(selectorArray)\r
-{\r
-var result = {};\r
-for (var i = 0; i < selectorArray.length; ++i) {\r
-try {\r
-if (document.querySelector(selectorArray[i]))\r
-result[selectorArray[i]] = true;\r
-} catch(e) {\r
-\r
-}\r
-}\r
-return result;\r
-}\r
-\r
-WebInspector.AuditRules.evaluateInTargetWindow(routine, [selectors], selectorsCallback.bind(null, callback, styleSheets, testedSelectors));\r
-}\r
-\r
-function styleSheetCallback(styleSheets, continuation, styleSheet)\r
-{\r
-if (styleSheet)\r
-styleSheets.push(styleSheet);\r
-if (continuation)\r
-continuation(styleSheets);\r
-}\r
-\r
-function allStylesCallback(styleSheetIds)\r
-{\r
-if (!styleSheetIds || !styleSheetIds.length)\r
-return evalCallback([]);\r
-var styleSheets = [];\r
-for (var i = 0; i < styleSheetIds.length; ++i)\r
-WebInspector.CSSStyleSheet.createForId(styleSheetIds[i], styleSheetCallback.bind(null, styleSheets, i == styleSheetIds.length - 1 ? evalCallback : null));\r
-}\r
-\r
-InspectorBackend.getAllStyles2(allStylesCallback);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.UnusedCssRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.CacheControlRule = function(id, name)\r
-{\r
-WebInspector.AuditRule.call(this, id, name);\r
-}\r
-\r
-WebInspector.AuditRules.CacheControlRule.MillisPerMonth = 1000 * 60 * 60 * 24 * 30;\r
-\r
-WebInspector.AuditRules.CacheControlRule.prototype = {\r
-\r
-doRun: function(resources, result, callback)\r
-{\r
-var cacheableAndNonCacheableResources = this._cacheableAndNonCacheableResources(resources);\r
-if (cacheableAndNonCacheableResources[0].length)\r
-this.runChecks(cacheableAndNonCacheableResources[0], result);\r
-this.handleNonCacheableResources(cacheableAndNonCacheableResources[1], result);\r
-\r
-callback(result);\r
-},\r
-\r
-handleNonCacheableResources: function()\r
-{\r
-},\r
-\r
-_cacheableAndNonCacheableResources: function(resources)\r
-{\r
-var processedResources = [[], []];\r
-for (var i = 0; i < resources.length; ++i) {\r
-var resource = resources[i];\r
-if (!this.isCacheableResource(resource))\r
-continue;\r
-if (this._isExplicitlyNonCacheable(resource))\r
-processedResources[1].push(resource);\r
-else\r
-processedResources[0].push(resource);\r
-}\r
-return processedResources;\r
-},\r
-\r
-execCheck: function(messageText, resourceCheckFunction, resources, result)\r
-{\r
-var resourceCount = resources.length;\r
-var urls = [];\r
-for (var i = 0; i < resourceCount; ++i) {\r
-if (resourceCheckFunction.call(this, resources[i]))\r
-urls.push(resources[i].url);\r
-}\r
-if (urls.length) {\r
-var entry = result.addChild(messageText, true);\r
-entry.addURLs(urls);\r
-result.violationCount += urls.length;\r
-}\r
-},\r
-\r
-freshnessLifetimeGreaterThan: function(resource, timeMs)\r
-{\r
-var dateHeader = this.responseHeader(resource, "Date");\r
-if (!dateHeader)\r
-return false;\r
-\r
-var dateHeaderMs = Date.parse(dateHeader);\r
-if (isNaN(dateHeaderMs))\r
-return false;\r
-\r
-var freshnessLifetimeMs;\r
-var maxAgeMatch = this.responseHeaderMatch(resource, "Cache-Control", "max-age=(\\d+)");\r
-\r
-if (maxAgeMatch)\r
-freshnessLifetimeMs = (maxAgeMatch[1]) ? 1000 * maxAgeMatch[1] : 0;\r
-else {\r
-var expiresHeader = this.responseHeader(resource, "Expires");\r
-if (expiresHeader) {\r
-var expDate = Date.parse(expiresHeader);\r
-if (!isNaN(expDate))\r
-freshnessLifetimeMs = expDate - dateHeaderMs;\r
-}\r
-}\r
-\r
-return (isNaN(freshnessLifetimeMs)) ? false : freshnessLifetimeMs > timeMs;\r
-},\r
-\r
-responseHeader: function(resource, header)\r
-{\r
-return resource.responseHeaders[header];\r
-},\r
-\r
-hasResponseHeader: function(resource, header)\r
-{\r
-return resource.responseHeaders[header] !== undefined;\r
-},\r
-\r
-isCompressible: function(resource)\r
-{\r
-return WebInspector.Resource.Type.isTextType(resource.type);\r
-},\r
-\r
-isPubliclyCacheable: function(resource)\r
-{\r
-if (this._isExplicitlyNonCacheable(resource))\r
-return false;\r
-\r
-if (this.responseHeaderMatch(resource, "Cache-Control", "public"))\r
-return true;\r
-\r
-return resource.url.indexOf("?") == -1 && !this.responseHeaderMatch(resource, "Cache-Control", "private");\r
-},\r
-\r
-responseHeaderMatch: function(resource, header, regexp)\r
-{\r
-return resource.responseHeaders[header]\r
-? resource.responseHeaders[header].match(new RegExp(regexp, "im"))\r
-: undefined;\r
-},\r
-\r
-hasExplicitExpiration: function(resource)\r
-{\r
-return this.hasResponseHeader(resource, "Date") &&\r
-(this.hasResponseHeader(resource, "Expires") || this.responseHeaderMatch(resource, "Cache-Control", "max-age"));\r
-},\r
-\r
-_isExplicitlyNonCacheable: function(resource)\r
-{\r
-var hasExplicitExp = this.hasExplicitExpiration(resource);\r
-return this.responseHeaderMatch(resource, "Cache-Control", "(no-cache|no-store|must-revalidate)") ||\r
-this.responseHeaderMatch(resource, "Pragma", "no-cache") ||\r
-(hasExplicitExp && !this.freshnessLifetimeGreaterThan(resource, 0)) ||\r
-(!hasExplicitExp && resource.url && resource.url.indexOf("?") >= 0) ||\r
-(!hasExplicitExp && !this.isCacheableResource(resource));\r
-},\r
-\r
-isCacheableResource: function(resource)\r
-{\r
-return resource.statusCode !== undefined && WebInspector.AuditRules.CacheableResponseCodes[resource.statusCode];\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.CacheControlRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.BrowserCacheControlRule = function()\r
-{\r
-WebInspector.AuditRules.CacheControlRule.call(this, "http-browsercache", "Leverage browser caching");\r
-}\r
-\r
-WebInspector.AuditRules.BrowserCacheControlRule.prototype = {\r
-handleNonCacheableResources: function(resources, result)\r
-{\r
-if (resources.length) {\r
-var entry = result.addChild("The following resources are explicitly non-cacheable. Consider making them cacheable if possible:", true);\r
-result.violationCount += resources.length;\r
-for (var i = 0; i < resources.length; ++i)\r
-entry.addURL(resources[i].url);\r
-}\r
-},\r
-\r
-runChecks: function(resources, result, callback)\r
-{\r
-this.execCheck("The following resources are missing a cache expiration. Resources that do not specify an expiration may not be cached by browsers:",\r
-this._missingExpirationCheck, resources, result);\r
-this.execCheck("The following resources specify a \"Vary\" header that disables caching in most versions of Internet Explorer:",\r
-this._varyCheck, resources, result);\r
-this.execCheck("The following cacheable resources have a short freshness lifetime:",\r
-this._oneMonthExpirationCheck, resources, result);\r
-\r
-\r
-this.execCheck("To further improve cache hit rate, specify an expiration one year in the future for the following cacheable resources:",\r
-this._oneYearExpirationCheck, resources, result);\r
-},\r
-\r
-_missingExpirationCheck: function(resource)\r
-{\r
-return this.isCacheableResource(resource) && !this.hasResponseHeader(resource, "Set-Cookie") && !this.hasExplicitExpiration(resource);\r
-},\r
-\r
-_varyCheck: function(resource)\r
-{\r
-var varyHeader = this.responseHeader(resource, "Vary");\r
-if (varyHeader) {\r
-varyHeader = varyHeader.replace(/User-Agent/gi, "");\r
-varyHeader = varyHeader.replace(/Accept-Encoding/gi, "");\r
-varyHeader = varyHeader.replace(/[, ]*/g, "");\r
-}\r
-return varyHeader && varyHeader.length && this.isCacheableResource(resource) && this.freshnessLifetimeGreaterThan(resource, 0);\r
-},\r
-\r
-_oneMonthExpirationCheck: function(resource)\r
-{\r
-return this.isCacheableResource(resource) &&\r
-!this.hasResponseHeader(resource, "Set-Cookie") &&\r
-!this.freshnessLifetimeGreaterThan(resource, WebInspector.AuditRules.CacheControlRule.MillisPerMonth) &&\r
-this.freshnessLifetimeGreaterThan(resource, 0);\r
-},\r
-\r
-_oneYearExpirationCheck: function(resource)\r
-{\r
-return this.isCacheableResource(resource) &&\r
-!this.hasResponseHeader(resource, "Set-Cookie") &&\r
-!this.freshnessLifetimeGreaterThan(resource, 11 * WebInspector.AuditRules.CacheControlRule.MillisPerMonth) &&\r
-this.freshnessLifetimeGreaterThan(resource, WebInspector.AuditRules.CacheControlRule.MillisPerMonth);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.BrowserCacheControlRule.prototype.__proto__ = WebInspector.AuditRules.CacheControlRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.ProxyCacheControlRule = function() {\r
-WebInspector.AuditRules.CacheControlRule.call(this, "http-proxycache", "Leverage proxy caching");\r
-}\r
-\r
-WebInspector.AuditRules.ProxyCacheControlRule.prototype = {\r
-runChecks: function(resources, result, callback)\r
-{\r
-this.execCheck("Resources with a \"?\" in the URL are not cached by most proxy caching servers:",\r
-this._questionMarkCheck, resources, result);\r
-this.execCheck("Consider adding a \"Cache-Control: public\" header to the following resources:",\r
-this._publicCachingCheck, resources, result);\r
-this.execCheck("The following publicly cacheable resources contain a Set-Cookie header. This security vulnerability can cause cookies to be shared by multiple users.",\r
-this._setCookieCacheableCheck, resources, result);\r
-},\r
-\r
-_questionMarkCheck: function(resource)\r
-{\r
-return resource.url.indexOf("?") >= 0 && !this.hasResponseHeader(resource, "Set-Cookie") && this.isPubliclyCacheable(resource);\r
-},\r
-\r
-_publicCachingCheck: function(resource)\r
-{\r
-return this.isCacheableResource(resource) &&\r
-!this.isCompressible(resource) &&\r
-!this.responseHeaderMatch(resource, "Cache-Control", "public") &&\r
-!this.hasResponseHeader(resource, "Set-Cookie");\r
-},\r
-\r
-_setCookieCacheableCheck: function(resource)\r
-{\r
-return this.hasResponseHeader(resource, "Set-Cookie") && this.isPubliclyCacheable(resource);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.ProxyCacheControlRule.prototype.__proto__ = WebInspector.AuditRules.CacheControlRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.ImageDimensionsRule = function()\r
-{\r
-WebInspector.AuditRule.call(this, "page-imagedims", "Specify image dimensions");\r
-}\r
-\r
-WebInspector.AuditRules.ImageDimensionsRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-function doneCallback(context)\r
-{\r
-var map = context.urlToNoDimensionCount;\r
-for (var url in map) {\r
-var entry = entry || result.addChild("A width and height should be specified for all images in order to speed up page display. The following image(s) are missing a width and/or height:", true);\r
-var value = WebInspector.AuditRuleResult.linkifyDisplayName(url);\r
-if (map[url] > 1)\r
-value += String.sprintf(" (%d uses)", map[url]);\r
-entry.addChild(value);\r
-result.violationCount++;\r
-}\r
-callback(entry ? result : null);\r
-}\r
-\r
-function imageStylesReady(imageId, context, styles)\r
-{\r
---context.imagesLeft;\r
-\r
-const node = WebInspector.domAgent.nodeForId(imageId);\r
-var src = node.getAttribute("src");\r
-if (!src.asParsedURL()) {\r
-for (var frameOwnerCandidate = node; frameOwnerCandidate; frameOwnerCandidate = frameOwnerCandidate.parentNode) {\r
-if (frameOwnerCandidate.documentURL) {\r
-var completeSrc = WebInspector.completeURL(frameOwnerCandidate.documentURL, src);\r
-break;\r
-}\r
-}\r
-}\r
-if (completeSrc)\r
-src = completeSrc;\r
-\r
-const computedStyle = styles.computedStyle;\r
-if (computedStyle.getPropertyValue("position") === "absolute") {\r
-if (!context.imagesLeft)\r
-doneCallback(context);\r
-return;\r
-}\r
-\r
-var widthFound = "width" in styles.styleAttributes;\r
-var heightFound = "height" in styles.styleAttributes;\r
-\r
-for (var i = styles.matchedCSSRules.length - 1; i >= 0 && !(widthFound && heightFound); --i) {\r
-var style = styles.matchedCSSRules[i].style;\r
-if (style.getPropertyValue("width") !== "")\r
-widthFound = true;\r
-if (style.getPropertyValue("height") !== "")\r
-heightFound = true;\r
-}\r
-\r
-if (!widthFound || !heightFound) {\r
-if (src in context.urlToNoDimensionCount)\r
-++context.urlToNoDimensionCount[src];\r
-else\r
-context.urlToNoDimensionCount[src] = 1;\r
-}\r
-\r
-if (!context.imagesLeft)\r
-doneCallback(context);\r
-}\r
-\r
-function receivedImages(imageIds)\r
-{\r
-if (!imageIds || !imageIds.length)\r
-return callback(null);\r
-var context = {imagesLeft: imageIds.length, urlToNoDimensionCount: {}};\r
-for (var i = imageIds.length - 1; i >= 0; --i)\r
-WebInspector.cssModel.getStylesAsync(imageIds[i], imageStylesReady.bind(this, imageIds[i], context));\r
-}\r
-\r
-function pushImageNodes()\r
-{\r
-const nodeIds = [];\r
-var nodes = document.getElementsByTagName("img");\r
-for (var i = 0; i < nodes.length; ++i) {\r
-if (!nodes[i].src)\r
-continue;\r
-var nodeId = this.getNodeId(nodes[i]);\r
-nodeIds.push(nodeId);\r
-}\r
-return nodeIds;\r
-}\r
-\r
-WebInspector.AuditRules.evaluateInTargetWindow(pushImageNodes, null, receivedImages);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.ImageDimensionsRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.CssInHeadRule = function()\r
-{\r
-WebInspector.AuditRule.call(this, "page-cssinhead", "Put CSS in the document head");\r
-}\r
-\r
-WebInspector.AuditRules.CssInHeadRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-function evalCallback(evalResult)\r
-{\r
-if (!evalResult)\r
-return callback(null);\r
-\r
-var summary = result.addChild("");\r
-\r
-var outputMessages = [];\r
-for (var url in evalResult) {\r
-var urlViolations = evalResult[url];\r
-if (urlViolations[0]) {\r
-result.addChild(String.sprintf("%s style block(s) in the %s body should be moved to the document head.", urlViolations[0], WebInspector.AuditRuleResult.linkifyDisplayName(url)));\r
-result.violationCount += urlViolations[0];\r
-}\r
-for (var i = 0; i < urlViolations[1].length; ++i)\r
-result.addChild(String.sprintf("Link node %s should be moved to the document head in %s", WebInspector.AuditRuleResult.linkifyDisplayName(urlViolations[1][i]), WebInspector.AuditRuleResult.linkifyDisplayName(url)));\r
-result.violationCount += urlViolations[1].length;\r
-}\r
-summary.value = String.sprintf("CSS in the document body adversely impacts rendering performance.");\r
-callback(result);\r
-}\r
-\r
-function routine()\r
-{\r
-function allViews() {\r
-var views = [document.defaultView];\r
-var curView = 0;\r
-while (curView < views.length) {\r
-var view = views[curView];\r
-var frames = view.frames;\r
-for (var i = 0; i < frames.length; ++i) {\r
-if (frames[i] !== view)\r
-views.push(frames[i]);\r
-}\r
-++curView;\r
-}\r
-return views;\r
-}\r
-\r
-var views = allViews();\r
-var urlToViolationsArray = {};\r
-var found = false;\r
-for (var i = 0; i < views.length; ++i) {\r
-var view = views[i];\r
-if (!view.document)\r
-continue;\r
-\r
-var inlineStyles = view.document.querySelectorAll("body style");\r
-var inlineStylesheets = view.document.querySelectorAll("body link[rel~='stylesheet'][href]");\r
-if (!inlineStyles.length && !inlineStylesheets.length)\r
-continue;\r
-\r
-found = true;\r
-var inlineStylesheetHrefs = [];\r
-for (var j = 0; j < inlineStylesheets.length; ++j)\r
-inlineStylesheetHrefs.push(inlineStylesheets[j].href);\r
-urlToViolationsArray[view.location.href] = [inlineStyles.length, inlineStylesheetHrefs];\r
-}\r
-return found ? urlToViolationsArray : null;\r
-}\r
-\r
-WebInspector.AuditRules.evaluateInTargetWindow(routine, null, evalCallback);\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.CssInHeadRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.StylesScriptsOrderRule = function()\r
-{\r
-WebInspector.AuditRule.call(this, "page-stylescriptorder", "Optimize the order of styles and scripts");\r
-}\r
-\r
-WebInspector.AuditRules.StylesScriptsOrderRule.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-function evalCallback(resultValue)\r
-{\r
-if (!resultValue)\r
-return callback(null);\r
-\r
-var lateCssUrls = resultValue[0];\r
-var cssBeforeInlineCount = resultValue[1];\r
-\r
-var entry = result.addChild("The following external CSS files were included after an external JavaScript file in the document head. To ensure CSS files are downloaded in parallel, always include external CSS before external JavaScript.", true);\r
-entry.addURLs(lateCssUrls);\r
-result.violationCount += lateCssUrls.length;\r
-\r
-if (cssBeforeInlineCount) {\r
-result.addChild(String.sprintf(" %d inline script block%s found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.", cssBeforeInlineCount, cssBeforeInlineCount > 1 ? "s were" : " was"));\r
-result.violationCount += cssBeforeInlineCount;\r
-}\r
-callback(result);\r
-}\r
-\r
-function routine()\r
-{\r
-var lateStyles = document.querySelectorAll("head script[src] ~ link[rel~='stylesheet'][href]");\r
-var cssBeforeInlineCount = document.querySelectorAll("head link[rel~='stylesheet'][href] ~ script:not([src])").length;\r
-if (!lateStyles.length && !cssBeforeInlineCount)\r
-return null;\r
-\r
-var lateStyleUrls = [];\r
-for (var i = 0; i < lateStyles.length; ++i)\r
-lateStyleUrls.push(lateStyles[i].href);\r
-return [ lateStyleUrls, cssBeforeInlineCount ];\r
-}\r
-\r
-WebInspector.AuditRules.evaluateInTargetWindow(routine, null, evalCallback.bind(this));\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.StylesScriptsOrderRule.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.CookieRuleBase = function(id, name)\r
-{\r
-WebInspector.AuditRule.call(this, id, name);\r
-}\r
-\r
-WebInspector.AuditRules.CookieRuleBase.prototype = {\r
-doRun: function(resources, result, callback)\r
-{\r
-var self = this;\r
-function resultCallback(receivedCookies, isAdvanced) {\r
-self.processCookies(isAdvanced ? receivedCookies : [], resources, result);\r
-callback(result);\r
-}\r
-WebInspector.Cookies.getCookiesAsync(resultCallback);\r
-},\r
-\r
-mapResourceCookies: function(resourcesByDomain, allCookies, callback)\r
-{\r
-for (var i = 0; i < allCookies.length; ++i) {\r
-for (var resourceDomain in resourcesByDomain) {\r
-if (WebInspector.Cookies.cookieDomainMatchesResourceDomain(allCookies[i].domain, resourceDomain))\r
-this._callbackForResourceCookiePairs(resourcesByDomain[resourceDomain], allCookies[i], callback);\r
-}\r
-}\r
-},\r
-\r
-_callbackForResourceCookiePairs: function(resources, cookie, callback)\r
-{\r
-if (!resources)\r
-return;\r
-for (var i = 0; i < resources.length; ++i) {\r
-if (WebInspector.Cookies.cookieMatchesResourceURL(cookie, resources[i].url))\r
-callback(resources[i], cookie);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.CookieRuleBase.prototype.__proto__ = WebInspector.AuditRule.prototype;\r
-\r
-\r
-WebInspector.AuditRules.CookieSizeRule = function(avgBytesThreshold)\r
-{\r
-WebInspector.AuditRules.CookieRuleBase.call(this, "http-cookiesize", "Minimize cookie size");\r
-this._avgBytesThreshold = avgBytesThreshold;\r
-this._maxBytesThreshold = 1000;\r
-}\r
-\r
-WebInspector.AuditRules.CookieSizeRule.prototype = {\r
-_average: function(cookieArray)\r
-{\r
-var total = 0;\r
-for (var i = 0; i < cookieArray.length; ++i)\r
-total += cookieArray[i].size;\r
-return cookieArray.length ? Math.round(total / cookieArray.length) : 0;\r
-},\r
-\r
-_max: function(cookieArray)\r
-{\r
-var result = 0;\r
-for (var i = 0; i < cookieArray.length; ++i)\r
-result = Math.max(cookieArray[i].size, result);\r
-return result;\r
-},\r
-\r
-processCookies: function(allCookies, resources, result)\r
-{\r
-function maxSizeSorter(a, b)\r
-{\r
-return b.maxCookieSize - a.maxCookieSize;\r
-}\r
-\r
-function avgSizeSorter(a, b)\r
-{\r
-return b.avgCookieSize - a.avgCookieSize;\r
-}\r
-\r
-var cookiesPerResourceDomain = {};\r
-\r
-function collectorCallback(resource, cookie)\r
-{\r
-var cookies = cookiesPerResourceDomain[resource.domain];\r
-if (!cookies) {\r
-cookies = [];\r
-cookiesPerResourceDomain[resource.domain] = cookies;\r
-}\r
-cookies.push(cookie);\r
-}\r
-\r
-if (!allCookies.length)\r
-return;\r
-\r
-var sortedCookieSizes = [];\r
-\r
-var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources,\r
-null,\r
-true);\r
-var matchingResourceData = {};\r
-this.mapResourceCookies(domainToResourcesMap, allCookies, collectorCallback.bind(this));\r
-\r
-for (var resourceDomain in cookiesPerResourceDomain) {\r
-var cookies = cookiesPerResourceDomain[resourceDomain];\r
-sortedCookieSizes.push({\r
-domain: resourceDomain,\r
-avgCookieSize: this._average(cookies),\r
-maxCookieSize: this._max(cookies)\r
-});\r
-}\r
-var avgAllCookiesSize = this._average(allCookies);\r
-\r
-var hugeCookieDomains = [];\r
-sortedCookieSizes.sort(maxSizeSorter);\r
-\r
-for (var i = 0, len = sortedCookieSizes.length; i < len; ++i) {\r
-var maxCookieSize = sortedCookieSizes[i].maxCookieSize;\r
-if (maxCookieSize > this._maxBytesThreshold)\r
-hugeCookieDomains.push(WebInspector.AuditRuleResult.resourceDomain(sortedCookieSizes[i].domain) + ": " + Number.bytesToString(maxCookieSize, WebInspector.UIString));\r
-}\r
-\r
-var bigAvgCookieDomains = [];\r
-sortedCookieSizes.sort(avgSizeSorter);\r
-for (var i = 0, len = sortedCookieSizes.length; i < len; ++i) {\r
-var domain = sortedCookieSizes[i].domain;\r
-var avgCookieSize = sortedCookieSizes[i].avgCookieSize;\r
-if (avgCookieSize > this._avgBytesThreshold && avgCookieSize < this._maxBytesThreshold)\r
-bigAvgCookieDomains.push(WebInspector.AuditRuleResult.resourceDomain(domain) + ": " + Number.bytesToString(avgCookieSize, WebInspector.UIString));\r
-}\r
-result.addChild(String.sprintf("The average cookie size for all requests on this page is %s", Number.bytesToString(avgAllCookiesSize, WebInspector.UIString)));\r
-\r
-var message;\r
-if (hugeCookieDomains.length) {\r
-var entry = result.addChild("The following domains have a cookie size in excess of 1KB. This is harmful because requests with cookies larger than 1KB typically cannot fit into a single network packet.", true);\r
-entry.addURLs(hugeCookieDomains);\r
-result.violationCount += hugeCookieDomains.length;\r
-}\r
-\r
-if (bigAvgCookieDomains.length) {\r
-var entry = result.addChild(String.sprintf("The following domains have an average cookie size in excess of %d bytes. Reducing the size of cookies for these domains can reduce the time it takes to send requests.", this._avgBytesThreshold), true);\r
-entry.addURLs(bigAvgCookieDomains);\r
-result.violationCount += bigAvgCookieDomains.length;\r
-}\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.CookieSizeRule.prototype.__proto__ = WebInspector.AuditRules.CookieRuleBase.prototype;\r
-\r
-\r
-WebInspector.AuditRules.StaticCookielessRule = function(minResources)\r
-{\r
-WebInspector.AuditRules.CookieRuleBase.call(this, "http-staticcookieless", "Serve static content from a cookieless domain");\r
-this._minResources = minResources;\r
-}\r
-\r
-WebInspector.AuditRules.StaticCookielessRule.prototype = {\r
-processCookies: function(allCookies, resources, result)\r
-{\r
-var domainToResourcesMap = WebInspector.AuditRules.getDomainToResourcesMap(resources,\r
-[WebInspector.Resource.Type.Stylesheet,\r
-WebInspector.Resource.Type.Image],\r
-true);\r
-var totalStaticResources = 0;\r
-for (var domain in domainToResourcesMap)\r
-totalStaticResources += domainToResourcesMap[domain].length;\r
-if (totalStaticResources < this._minResources)\r
-return;\r
-var matchingResourceData = {};\r
-this.mapResourceCookies(domainToResourcesMap, allCookies, this._collectorCallback.bind(this, matchingResourceData));\r
-\r
-var badUrls = [];\r
-var cookieBytes = 0;\r
-for (var url in matchingResourceData) {\r
-badUrls.push(url);\r
-cookieBytes += matchingResourceData[url]\r
-}\r
-if (badUrls.length < this._minResources)\r
-return;\r
-\r
-var entry = result.addChild(String.sprintf("%s of cookies were sent with the following static resources. Serve these static resources from a domain that does not set cookies:", Number.bytesToString(cookieBytes, WebInspector.UIString)), true);\r
-entry.addURLs(badUrls);\r
-result.violationCount = badUrls.length;\r
-},\r
-\r
-_collectorCallback: function(matchingResourceData, resource, cookie)\r
-{\r
-matchingResourceData[resource.url] = (matchingResourceData[resource.url] || 0) + cookie.size;\r
-}\r
-}\r
-\r
-WebInspector.AuditRules.StaticCookielessRule.prototype.__proto__ = WebInspector.AuditRules.CookieRuleBase.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.AuditCategories.PagePerformance = function() {\r
-WebInspector.AuditCategory.call(this, WebInspector.AuditCategories.PagePerformance.AuditCategoryName);\r
-}\r
-\r
-WebInspector.AuditCategories.PagePerformance.AuditCategoryName = "Web Page Performance";\r
-\r
-WebInspector.AuditCategories.PagePerformance.prototype = {\r
-initialize: function()\r
-{\r
-this.addRule(new WebInspector.AuditRules.UnusedCssRule(), WebInspector.AuditRule.Severity.Warning);\r
-this.addRule(new WebInspector.AuditRules.CssInHeadRule(), WebInspector.AuditRule.Severity.Severe);\r
-this.addRule(new WebInspector.AuditRules.StylesScriptsOrderRule(), WebInspector.AuditRule.Severity.Severe);\r
-}\r
-}\r
-\r
-WebInspector.AuditCategories.PagePerformance.prototype.__proto__ = WebInspector.AuditCategory.prototype;\r
-\r
-WebInspector.AuditCategories.NetworkUtilization = function() {\r
-WebInspector.AuditCategory.call(this, WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName);\r
-}\r
-\r
-WebInspector.AuditCategories.NetworkUtilization.AuditCategoryName = "Network Utilization";\r
-\r
-WebInspector.AuditCategories.NetworkUtilization.prototype = {\r
-initialize: function()\r
-{\r
-this.addRule(new WebInspector.AuditRules.GzipRule(), WebInspector.AuditRule.Severity.Severe);\r
-this.addRule(new WebInspector.AuditRules.ImageDimensionsRule(), WebInspector.AuditRule.Severity.Warning);\r
-this.addRule(new WebInspector.AuditRules.CookieSizeRule(400), WebInspector.AuditRule.Severity.Warning);\r
-this.addRule(new WebInspector.AuditRules.StaticCookielessRule(5), WebInspector.AuditRule.Severity.Warning);\r
-this.addRule(new WebInspector.AuditRules.CombineJsResourcesRule(2), WebInspector.AuditRule.Severity.Severe);\r
-this.addRule(new WebInspector.AuditRules.CombineCssResourcesRule(2), WebInspector.AuditRule.Severity.Severe);\r
-this.addRule(new WebInspector.AuditRules.MinimizeDnsLookupsRule(4), WebInspector.AuditRule.Severity.Warning);\r
-this.addRule(new WebInspector.AuditRules.ParallelizeDownloadRule(4, 10, 0.5), WebInspector.AuditRule.Severity.Warning);\r
-this.addRule(new WebInspector.AuditRules.BrowserCacheControlRule(), WebInspector.AuditRule.Severity.Severe);\r
-this.addRule(new WebInspector.AuditRules.ProxyCacheControlRule(), WebInspector.AuditRule.Severity.Warning);\r
-}\r
-}\r
-\r
-WebInspector.AuditCategories.NetworkUtilization.prototype.__proto__ = WebInspector.AuditCategory.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.applyFormatters = function(value)\r
-{\r
-var formatter;\r
-var type = typeof value;\r
-var args;\r
-\r
-switch (type) {\r
-case "string":\r
-case "boolean":\r
-case "number":\r
-formatter = WebInspector.AuditFormatters.text;\r
-args = [ value.toString() ];\r
-break;\r
-\r
-case "object":\r
-if (value instanceof Array) {\r
-formatter = WebInspector.AuditFormatters.concat;\r
-args = value;\r
-} else if (value.type && value.arguments) {\r
-formatter = WebInspector.AuditFormatters[value.type];\r
-args = value.arguments;\r
-}\r
-}\r
-if (!formatter)\r
-throw "Invalid value or formatter: " + type + JSON.stringify(value);\r
-\r
-return formatter.apply(null, args);\r
-}\r
-\r
-WebInspector.AuditFormatters = {\r
-text: function(text)\r
-{\r
-return document.createTextNode(text);\r
-},\r
-\r
-snippet: function(snippetText)\r
-{\r
-var div = document.createElement("div");\r
-div.innerText = snippetText;\r
-div.className = "source-code";\r
-return div;\r
-},\r
-\r
-concat: function()\r
-{\r
-var parent = document.createElement("span");\r
-for (var arg = 0; arg < arguments.length; ++arg)\r
-parent.appendChild(WebInspector.applyFormatters(arguments[arg]));\r
-return parent;\r
-},\r
-\r
-url: function(url, displayText, allowExternalNavigation)\r
-{\r
-var a = document.createElement("a");\r
-a.href = url;\r
-a.title = url;\r
-a.textContent = displayText || url;\r
-if (allowExternalNavigation)\r
-a.target = "_blank";\r
-return a;\r
-}\r
-};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ResourceHeadersView = function(resource)\r
-{\r
-WebInspector.View.call(this);\r
-this.element.addStyleClass("resource-headers-view");\r
-\r
-this._resource = resource;\r
-\r
-this._headersListElement = document.createElement("ol");\r
-this._headersListElement.className = "outline-disclosure";\r
-this.element.appendChild(this._headersListElement);\r
-\r
-this._headersTreeOutline = new TreeOutline(this._headersListElement);\r
-this._headersTreeOutline.expandTreeElementsWhenArrowing = true;\r
-\r
-this._urlTreeElement = new TreeElement("", null, false);\r
-this._urlTreeElement.selectable = false;\r
-this._headersTreeOutline.appendChild(this._urlTreeElement);\r
-\r
-this._requestMethodTreeElement = new TreeElement("", null, false);\r
-this._requestMethodTreeElement.selectable = false;\r
-this._headersTreeOutline.appendChild(this._requestMethodTreeElement);\r
-\r
-this._statusCodeTreeElement = new TreeElement("", null, false);\r
-this._statusCodeTreeElement.selectable = false;\r
-this._headersTreeOutline.appendChild(this._statusCodeTreeElement);\r
-\r
-this._requestHeadersTreeElement = new TreeElement("", null, true);\r
-this._requestHeadersTreeElement.expanded = true;\r
-this._requestHeadersTreeElement.selectable = false;\r
-this._headersTreeOutline.appendChild(this._requestHeadersTreeElement);\r
-\r
-this._decodeHover = WebInspector.UIString("Double-Click to toggle between URL encoded and decoded formats");\r
-this._decodeRequestParameters = true;\r
-\r
-this._queryStringTreeElement = new TreeElement("", null, true);\r
-this._queryStringTreeElement.expanded = true;\r
-this._queryStringTreeElement.selectable = false;\r
-this._queryStringTreeElement.hidden = true;\r
-this._headersTreeOutline.appendChild(this._queryStringTreeElement);\r
-\r
-this._formDataTreeElement = new TreeElement("", null, true);\r
-this._formDataTreeElement.expanded = true;\r
-this._formDataTreeElement.selectable = false;\r
-this._formDataTreeElement.hidden = true;\r
-this._headersTreeOutline.appendChild(this._formDataTreeElement);\r
-\r
-this._requestPayloadTreeElement = new TreeElement(WebInspector.UIString("Request Payload"), null, true);\r
-this._requestPayloadTreeElement.expanded = true;\r
-this._requestPayloadTreeElement.selectable = false;\r
-this._requestPayloadTreeElement.hidden = true;\r
-this._headersTreeOutline.appendChild(this._requestPayloadTreeElement);\r
-\r
-this._responseHeadersTreeElement = new TreeElement("", null, true);\r
-this._responseHeadersTreeElement.expanded = true;\r
-this._responseHeadersTreeElement.selectable = false;\r
-this._headersTreeOutline.appendChild(this._responseHeadersTreeElement);\r
-\r
-resource.addEventListener("requestHeaders changed", this._refreshRequestHeaders, this);\r
-resource.addEventListener("responseHeaders changed", this._refreshResponseHeaders, this);\r
-resource.addEventListener("finished", this._refreshHTTPInformation, this);\r
-\r
-this._refreshURL();\r
-this._refreshQueryString();\r
-this._refreshRequestHeaders();\r
-this._refreshResponseHeaders();\r
-this._refreshHTTPInformation();\r
-}\r
-\r
-WebInspector.ResourceHeadersView.prototype = {\r
-\r
-_refreshURL: function()\r
-{\r
-this._urlTreeElement.titleHTML = "<div class=\"header-name\">" + WebInspector.UIString("Request URL") + ":</div>" +\r
-"<div class=\"header-value source-code\">" + this._resource.url.escapeHTML() + "</div>";\r
-},\r
-\r
-_refreshQueryString: function()\r
-{\r
-var queryParameters = this._resource.queryParameters;\r
-this._queryStringTreeElement.hidden = !queryParameters;\r
-if (queryParameters)\r
-this._refreshParms(WebInspector.UIString("Query String Parameters"), queryParameters, this._queryStringTreeElement);\r
-},\r
-\r
-_refreshFormData: function()\r
-{\r
-this._formDataTreeElement.hidden = true;\r
-this._requestPayloadTreeElement.hidden = true;\r
-\r
-var formData = this._resource.requestFormData;\r
-if (!formData)\r
-return;\r
-\r
-var formParameters = this._resource.formParameters;\r
-if (formParameters) {\r
-this._formDataTreeElement.hidden = false;\r
-this._refreshParms(WebInspector.UIString("Form Data"), formParameters, this._formDataTreeElement);\r
-} else {\r
-this._requestPayloadTreeElement.hidden = false;\r
-this._refreshRequestPayload(formData);\r
-}\r
-},\r
-\r
-_refreshRequestPayload: function(formData)\r
-{\r
-this._requestPayloadTreeElement.removeChildren();\r
-\r
-var title = "<div class=\"raw-form-data header-value source-code\">" + formData.escapeHTML() + "</div>";\r
-var parmTreeElement = new TreeElement(null, null, false);\r
-parmTreeElement.titleHTML = title;\r
-parmTreeElement.selectable = false;\r
-this._requestPayloadTreeElement.appendChild(parmTreeElement);\r
-},\r
-\r
-_refreshParms: function(title, parms, parmsTreeElement)\r
-{\r
-parmsTreeElement.removeChildren();\r
-\r
-parmsTreeElement.titleHTML = title + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", parms.length) + "</span>";\r
-\r
-for (var i = 0; i < parms.length; ++i) {\r
-var name = parms[i].name;\r
-var value = parms[i].value;\r
-\r
-var errorDecoding = false;\r
-if (this._decodeRequestParameters) {\r
-if (value.indexOf("%") >= 0) {\r
-try {\r
-value = decodeURIComponent(value);\r
-} catch(e) {\r
-errorDecoding = true;\r
-}\r
-}\r
-\r
-value = value.replace(/\+/g, " ");\r
-}\r
-\r
-valueEscaped = value.escapeHTML();\r
-if (errorDecoding)\r
-valueEscaped += " <span class=\"error-message\">" + WebInspector.UIString("(unable to decode value)").escapeHTML() + "</span>";\r
-\r
-var title = "<div class=\"header-name\">" + name.escapeHTML() + ":</div>";\r
-title += "<div class=\"header-value source-code\">" + valueEscaped + "</div>";\r
-\r
-var parmTreeElement = new TreeElement(null, null, false);\r
-parmTreeElement.titleHTML = title;\r
-parmTreeElement.selectable = false;\r
-parmTreeElement.tooltip = this._decodeHover;\r
-parmTreeElement.ondblclick = this._toggleURLdecoding.bind(this);\r
-parmsTreeElement.appendChild(parmTreeElement);\r
-}\r
-},\r
-\r
-_toggleURLdecoding: function(event)\r
-{\r
-this._decodeRequestParameters = !this._decodeRequestParameters;\r
-this._refreshQueryString();\r
-this._refreshFormData();\r
-},\r
-\r
-_getHeaderValue: function(headers, key)\r
-{\r
-var lowerKey = key.toLowerCase();\r
-for (var testKey in headers) {\r
-if (testKey.toLowerCase() === lowerKey)\r
-return headers[testKey];\r
-}\r
-},\r
-\r
-_refreshRequestHeaders: function()\r
-{\r
-var additionalRow = null;\r
-if (typeof this._resource.webSocketRequestKey3 !== "undefined")\r
-additionalRow = {header: "(Key3)", value: this._resource.webSocketRequestKey3};\r
-this._refreshHeaders(WebInspector.UIString("Request Headers"), this._resource.sortedRequestHeaders, additionalRow, this._requestHeadersTreeElement);\r
-this._refreshFormData();\r
-},\r
-\r
-_refreshResponseHeaders: function()\r
-{\r
-var additionalRow = null;\r
-if (typeof this._resource.webSocketChallengeResponse !== "undefined")\r
-additionalRow = {header: "(Challenge Response)", value: this._resource.webSocketChallengeResponse};\r
-this._refreshHeaders(WebInspector.UIString("Response Headers"), this._resource.sortedResponseHeaders, additionalRow, this._responseHeadersTreeElement);\r
-},\r
-\r
-_refreshHTTPInformation: function()\r
-{\r
-var requestMethodElement = this._requestMethodTreeElement;\r
-requestMethodElement.hidden = !this._resource.statusCode;\r
-var statusCodeElement = this._statusCodeTreeElement;\r
-statusCodeElement.hidden = !this._resource.statusCode;\r
-var statusCodeImage = "";\r
-\r
-if (this._resource.statusCode) {\r
-var statusImageSource = "";\r
-if (this._resource.statusCode < 300)\r
-statusImageSource = "Images/successGreenDot.png";\r
-else if (this._resource.statusCode < 400)\r
-statusImageSource = "Images/warningOrangeDot.png";\r
-else\r
-statusImageSource = "Images/errorRedDot.png";\r
-\r
-var statusTextEscaped = this._resource.statusCode + " " + this._resource.statusText.escapeHTML();\r
-statusCodeImage = "<img class=\"resource-status-image\" src=\"" + statusImageSource + "\" title=\"" + statusTextEscaped + "\">";\r
-\r
-requestMethodElement.titleHTML = "<div class=\"header-name\">" + WebInspector.UIString("Request Method") + ":</div>" +\r
-"<div class=\"header-value source-code\">" + this._resource.requestMethod + "</div>";\r
-\r
-statusCodeElement.titleHTML = "<div class=\"header-name\">" + WebInspector.UIString("Status Code") + ":</div>" +\r
-statusCodeImage + "<div class=\"header-value source-code\">" + statusTextEscaped + "</div>";\r
-}\r
-},\r
-\r
-_refreshHeaders: function(title, headers, additionalRow, headersTreeElement)\r
-{\r
-headersTreeElement.removeChildren();\r
-\r
-var length = headers.length;\r
-headersTreeElement.titleHTML = title.escapeHTML() + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", length) + "</span>";\r
-headersTreeElement.hidden = !length;\r
-\r
-var length = headers.length;\r
-for (var i = 0; i < length; ++i) {\r
-var title = "<div class=\"header-name\">" + headers[i].header.escapeHTML() + ":</div>";\r
-title += "<div class=\"header-value source-code\">" + headers[i].value.escapeHTML() + "</div>"\r
-\r
-var headerTreeElement = new TreeElement(null, null, false);\r
-headerTreeElement.titleHTML = title;\r
-headerTreeElement.selectable = false;\r
-headersTreeElement.appendChild(headerTreeElement);\r
-}\r
-\r
-if (additionalRow) {\r
-var title = "<div class=\"header-name\">" + additionalRow.header.escapeHTML() + ":</div>";\r
-title += "<div class=\"header-value source-code\">" + additionalRow.value.escapeHTML() + "</div>"\r
-\r
-var headerTreeElement = new TreeElement(null, null, false);\r
-headerTreeElement.titleHTML = title;\r
-headerTreeElement.selectable = false;\r
-headersTreeElement.appendChild(headerTreeElement);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.ResourceHeadersView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ResourceCookiesView = function(resource)\r
-{\r
-WebInspector.View.call(this);\r
-this.element.addStyleClass("resource-cookies-view");\r
-\r
-this._resource = resource;\r
-\r
-resource.addEventListener("requestHeaders changed", this.show, this);\r
-resource.addEventListener("responseHeaders changed", this.show, this);\r
-}\r
-\r
-WebInspector.ResourceCookiesView.prototype = {\r
-show: function(parentElement)\r
-{\r
-if (!this._resource.requestCookies && !this._resource.responseCookies) {\r
-if (!this._emptyMsgElement) {\r
-this._emptyMsgElement = document.createElement("div");\r
-this._emptyMsgElement.className = "storage-empty-view";\r
-this._emptyMsgElement.textContent = WebInspector.UIString("This request has no cookies.");\r
-this.element.appendChild(this._emptyMsgElement);\r
-}\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-return;\r
-}\r
-\r
-if (this._emptyMsgElement)\r
-this._emptyMsgElement.parentElement.removeChild(this._emptyMsgElement);\r
-\r
-this._cookiesTable = new WebInspector.CookiesTable(null, true, true);\r
-this._cookiesTable.addCookiesFolder(WebInspector.UIString("Request Cookies"), this._resource.requestCookies);\r
-this._cookiesTable.addCookiesFolder(WebInspector.UIString("Response Cookies"), this._resource.responseCookies);\r
-this.element.appendChild(this._cookiesTable.element);\r
-\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this._cookiesTable.updateWidths();\r
-}\r
-}\r
-\r
-WebInspector.ResourceCookiesView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ResourceTimingView = function(resource)\r
-{\r
-WebInspector.View.call(this);\r
-this.element.addStyleClass("resource-timing-view");\r
-\r
-this._resource = resource;\r
-\r
-resource.addEventListener("timing changed", this._refresh, this);\r
-}\r
-\r
-WebInspector.ResourceTimingView.prototype = {\r
-show: function(parentElement)\r
-{\r
-if (!this._resource.timing) {\r
-if (!this._emptyMsgElement) {\r
-this._emptyMsgElement = document.createElement("div");\r
-this._emptyMsgElement.className = "storage-empty-view";\r
-this._emptyMsgElement.textContent = WebInspector.UIString("This request has no detailed timing info.");\r
-this.element.appendChild(this._emptyMsgElement);\r
-}\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-return;\r
-}\r
-\r
-if (this._emptyMsgElement)\r
-this._emptyMsgElement.parentElement.removeChild(this._emptyMsgElement);\r
-\r
-this._refresh();\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-},\r
-\r
-_refresh: function()\r
-{\r
-if (this._tableElement)\r
-this._tableElement.parentElement.removeChild(this._tableElement);\r
-\r
-this._tableElement = WebInspector.ResourceTimingView.createTimingTable(this._resource);\r
-this.element.appendChild(this._tableElement);\r
-}\r
-}\r
-\r
-WebInspector.ResourceTimingView.createTimingTable = function(resource)\r
-{\r
-var tableElement = document.createElement("table");\r
-var rows = [];\r
-\r
-function addRow(title, className, start, end, color)\r
-{\r
-var row = {};\r
-row.title = title;\r
-row.className = className;\r
-row.start = start;\r
-row.end = end;\r
-rows.push(row);\r
-}\r
-\r
-if (resource.timing.proxyStart !== -1)\r
-addRow(WebInspector.UIString("Proxy"), "proxy", resource.timing.proxyStart, resource.timing.proxyEnd);\r
-\r
-if (resource.timing.dnsStart !== -1)\r
-addRow(WebInspector.UIString("DNS Lookup"), "dns", resource.timing.dnsStart, resource.timing.dnsEnd);\r
-\r
-if (resource.timing.connectStart !== -1) {\r
-if (resource.connectionReused)\r
-addRow(WebInspector.UIString("Blocking"), "connecting", resource.timing.connectStart, resource.timing.connectEnd);\r
-else {\r
-var connectStart = resource.timing.connectStart;\r
-\r
-if (resource.timing.dnsStart !== -1)\r
-connectStart += resource.timing.dnsEnd - resource.timing.dnsStart;\r
-addRow(WebInspector.UIString("Connecting"), "connecting", connectStart, resource.timing.connectEnd);\r
-}\r
-}\r
-\r
-if (resource.timing.sslStart !== -1)\r
-addRow(WebInspector.UIString("SSL"), "ssl", resource.timing.sslStart, resource.timing.sslEnd);\r
-\r
-var sendStart = resource.timing.sendStart;\r
-if (resource.timing.sslStart !== -1)\r
-sendStart += resource.timing.sslEnd - resource.timing.sslStart;\r
-\r
-addRow(WebInspector.UIString("Sending"), "sending", resource.timing.sendStart, resource.timing.sendEnd);\r
-addRow(WebInspector.UIString("Waiting"), "waiting", resource.timing.sendEnd, resource.timing.receiveHeadersEnd);\r
-addRow(WebInspector.UIString("Receiving"), "receiving", (resource.responseReceivedTime - resource.timing.requestTime) * 1000, (resource.endTime - resource.timing.requestTime) * 1000);\r
-\r
-const chartWidth = 200;\r
-var total = (resource.endTime - resource.timing.requestTime) * 1000;\r
-var scale = chartWidth / total;\r
-\r
-for (var i = 0; i < rows.length; ++i) {\r
-var tr = document.createElement("tr");\r
-tableElement.appendChild(tr);\r
-\r
-var td = document.createElement("td");\r
-td.textContent = rows[i].title;\r
-tr.appendChild(td);\r
-\r
-td = document.createElement("td");\r
-td.width = chartWidth + "px";\r
-\r
-var row = document.createElement("div");\r
-row.className = "network-timing-row";\r
-td.appendChild(row);\r
-\r
-var bar = document.createElement("span");\r
-bar.className = "network-timing-bar " + rows[i].className;\r
-bar.style.left = scale * rows[i].start + "px";\r
-bar.style.right = scale * (total - rows[i].end) + "px";\r
-bar.style.backgroundColor = rows[i].color;\r
-bar.textContent = "\u200B"; \r
-row.appendChild(bar);\r
-\r
-var title = document.createElement("span");\r
-title.className = "network-timing-bar-title";\r
-if (total - rows[i].end < rows[i].start)\r
-title.style.right = (scale * (total - rows[i].end) + 3) + "px";\r
-else\r
-title.style.left = (scale * rows[i].start + 3) + "px";\r
-title.textContent = Number.millisToString(rows[i].end - rows[i].start);\r
-row.appendChild(title);\r
-\r
-tr.appendChild(td);\r
-}\r
-return tableElement;\r
-}\r
-\r
-WebInspector.ResourceTimingView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.NetworkItemView = function(resource)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("network-item-view");\r
-\r
-this._headersView = new WebInspector.ResourceHeadersView(resource);\r
-\r
-var contentView = WebInspector.ResourceManager.resourceViewForResource(resource);\r
-\r
-this._tabbedPane = new WebInspector.TabbedPane(this.element);\r
-this._tabbedPane.appendTab("headers", WebInspector.UIString("Headers"), this._headersView);\r
-if (contentView.hasContent()) {\r
-\r
-contentView.visible = false;\r
-this._tabbedPane.appendTab("content", WebInspector.UIString("Content"), contentView);\r
-}\r
-if (Preferences.showCookiesTab) {\r
-this._cookiesView = new WebInspector.ResourceCookiesView(resource);\r
-this._tabbedPane.appendTab("cookies", WebInspector.UIString("Cookies"), this._cookiesView);\r
-}\r
-if (Preferences.showTimingTab) {\r
-var timingView = new WebInspector.ResourceTimingView(resource);\r
-this._tabbedPane.appendTab("timing", WebInspector.UIString("Timing"), timingView);\r
-}\r
-\r
-this._tabbedPane.addEventListener("tab-selected", this._tabSelected, this);\r
-}\r
-\r
-WebInspector.NetworkItemView.prototype = {\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this._selectTab();\r
-},\r
-\r
-_selectTab: function(tabId)\r
-{\r
-if (!tabId)\r
-tabId = WebInspector.settings.resourceViewTab;\r
-\r
-if (!this._tabbedPane.selectTab(tabId)) {\r
-this._isInFallbackSelection = true;\r
-this._tabbedPane.selectTab("headers");\r
-delete this._isInFallbackSelection;\r
-}\r
-},\r
-\r
-_tabSelected: function(event)\r
-{\r
-WebInspector.settings.resourceViewTab = event.data.tabId;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this._cookiesView && this._cookiesView.visible)\r
-this._cookiesView.resize();\r
-}\r
-}\r
-\r
-WebInspector.NetworkItemView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ResourceView = function(resource)\r
-{\r
-WebInspector.View.call(this);\r
-this.element.addStyleClass("resource-view");\r
-this.resource = resource;\r
-}\r
-\r
-WebInspector.ResourceView.prototype = {\r
-hasContent: function()\r
-{\r
-return false;\r
-}\r
-}\r
-\r
-WebInspector.ResourceView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SourceFrame = function(parentElement, scripts, canEditScripts)\r
-{\r
-this._parentElement = parentElement;\r
-this._scripts = {};\r
-for (var i = 0; i < scripts.length; ++i)\r
-this._scripts[scripts[i].sourceID] = scripts[i];\r
-this._canEditScripts = canEditScripts;\r
-\r
-this._textModel = new WebInspector.TextEditorModel();\r
-this._textModel.replaceTabsWithSpaces = true;\r
-\r
-this._messages = [];\r
-this._rowMessages = {};\r
-this._messageBubbles = {};\r
-\r
-this._loaded = false;\r
-this._popoverObjectGroup = "popover";\r
-}\r
-\r
-WebInspector.SourceFrame.prototype = {\r
-\r
-set visible(visible)\r
-{\r
-this._visible = visible;\r
-this._createViewerIfNeeded();\r
-\r
-if (visible) {\r
-if (this._textViewer && this._scrollTop)\r
-this._textViewer.element.scrollTop = this._scrollTop;\r
-if (this._textViewer && this._scrollLeft)\r
-this._textViewer.element.scrollLeft = this._scrollLeft;\r
-} else {\r
-this._hidePopup();\r
-if (this._textViewer) {\r
-this._scrollTop = this._textViewer.element.scrollTop;\r
-this._scrollLeft = this._textViewer.element.scrollLeft;\r
-this._textViewer.freeCachedElements();\r
-}\r
-}\r
-},\r
-\r
-get executionLine()\r
-{\r
-return this._executionLine;\r
-},\r
-\r
-set executionLine(x)\r
-{\r
-if (this._executionLine === x)\r
-return;\r
-\r
-var previousLine = this._executionLine;\r
-this._executionLine = x;\r
-\r
-if (this._textViewer)\r
-this._updateExecutionLine(previousLine);\r
-},\r
-\r
-markDiff: function(diffData)\r
-{\r
-if (this._diffLines && this._textViewer)\r
-this._removeDiffDecorations();\r
-\r
-this._diffLines = diffData;\r
-if (this._textViewer)\r
-this._updateDiffDecorations();\r
-},\r
-\r
-revealLine: function(lineNumber)\r
-{\r
-if (this._textViewer)\r
-this._textViewer.revealLine(lineNumber - 1, 0);\r
-else\r
-this._lineNumberToReveal = lineNumber;\r
-},\r
-\r
-addMessage: function(msg)\r
-{\r
-\r
-if (!msg.message || msg.line <= 0 || !msg.isErrorOrWarning())\r
-return;\r
-this._messages.push(msg)\r
-if (this._textViewer)\r
-this._addMessageToSource(msg);\r
-},\r
-\r
-addScript: function(script)\r
-{\r
-this._scripts[script.sourceID] = script;\r
-},\r
-\r
-clearMessages: function()\r
-{\r
-for (var line in this._messageBubbles) {\r
-var bubble = this._messageBubbles[line];\r
-bubble.parentNode.removeChild(bubble);\r
-}\r
-\r
-this._messages = [];\r
-this._rowMessages = {};\r
-this._messageBubbles = {};\r
-if (this._textViewer)\r
-this._textViewer.resize();\r
-},\r
-\r
-sizeToFitContentHeight: function()\r
-{\r
-if (this._textViewer)\r
-this._textViewer.revalidateDecorationsAndPaint();\r
-},\r
-\r
-setContent: function(mimeType, content, url)\r
-{\r
-this._loaded = true;\r
-this._textModel.setText(null, content);\r
-this._mimeType = mimeType;\r
-this._url = url;\r
-this._createViewerIfNeeded();\r
-},\r
-\r
-updateContent: function(content)\r
-{\r
-this._textModel.setText(null, content);\r
-},\r
-\r
-get textModel()\r
-{\r
-return this._textModel;\r
-},\r
-\r
-get scrollTop()\r
-{\r
-return this._textViewer ? this._textViewer.element.scrollTop : 0;\r
-},\r
-\r
-set scrollTop(scrollTop)\r
-{\r
-if (this._textViewer)\r
-this._textViewer.element.scrollTop = scrollTop;\r
-},\r
-\r
-highlightLine: function(line)\r
-{\r
-if (this._textViewer)\r
-this._textViewer.highlightLine(line - 1);\r
-else\r
-this._lineToHighlight = line;\r
-},\r
-\r
-clearLineHighlight: function()\r
-{\r
-if (this._textViewer)\r
-this._textViewer.clearLineHighlight();\r
-else\r
-delete this._lineToHighlight;\r
-},\r
-\r
-_createViewerIfNeeded: function()\r
-{\r
-if (!this._visible || !this._loaded || this._textViewer)\r
-return;\r
-\r
-this._textViewer = new WebInspector.TextViewer(this._textModel, WebInspector.platform, this._url);\r
-var element = this._textViewer.element;\r
-element.addEventListener("contextmenu", this._contextMenu.bind(this), true);\r
-element.addEventListener("mousedown", this._mouseDown.bind(this), true);\r
-element.addEventListener("mousemove", this._mouseMove.bind(this), true);\r
-element.addEventListener("scroll", this._scroll.bind(this), true);\r
-this._parentElement.appendChild(element);\r
-\r
-this._textViewer.beginUpdates();\r
-\r
-this._textViewer.mimeType = this._mimeType;\r
-this._addExistingMessagesToSource();\r
-this._updateExecutionLine();\r
-this._updateDiffDecorations();\r
-this._textViewer.resize();\r
-\r
-if (this._lineNumberToReveal) {\r
-this.revealLine(this._lineNumberToReveal);\r
-delete this._lineNumberToReveal;\r
-}\r
-\r
-if (this._pendingMarkRange) {\r
-var range = this._pendingMarkRange;\r
-this.markAndRevealRange(range);\r
-delete this._pendingMarkRange;\r
-}\r
-\r
-if (this._lineToHighlight) {\r
-this.highlightLine(this._lineToHighlight);\r
-delete this._lineToHighlight;\r
-}\r
-\r
-var breakpoints = this._breakpoints();\r
-for (var i = 0; i < breakpoints.length; ++i)\r
-this._addBreakpoint(breakpoints[i]);\r
-WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointAdded, this._breakpointAdded, this);\r
-\r
-this._textViewer.endUpdates();\r
-\r
-if (this._canEditScripts)\r
-this._textViewer.editCallback = this._editLine.bind(this);\r
-},\r
-\r
-findSearchMatches: function(query)\r
-{\r
-var ranges = [];\r
-\r
-\r
-var regexObject = createSearchRegex(query);\r
-this._collectRegexMatches(regexObject, ranges);\r
-\r
-\r
-try {\r
-if (/^\/.*\/$/.test(query))\r
-this._collectRegexMatches(new RegExp(query.substring(1, query.length - 1)), ranges);\r
-} catch (e) {\r
-\r
-}\r
-return ranges;\r
-},\r
-\r
-_collectRegexMatches: function(regexObject, ranges)\r
-{\r
-for (var i = 0; i < this._textModel.linesCount; ++i) {\r
-var line = this._textModel.line(i);\r
-var offset = 0;\r
-do {\r
-var match = regexObject.exec(line);\r
-if (match) {\r
-ranges.push(new WebInspector.TextRange(i, offset + match.index, i, offset + match.index + match[0].length));\r
-offset += match.index + 1;\r
-line = line.substring(match.index + 1);\r
-}\r
-} while (match)\r
-}\r
-return ranges;\r
-},\r
-\r
-markAndRevealRange: function(range)\r
-{\r
-if (this._textViewer)\r
-this._textViewer.markAndRevealRange(range);\r
-else\r
-this._pendingMarkRange = range;\r
-},\r
-\r
-clearMarkedRange: function()\r
-{\r
-if (this._textViewer) {\r
-this._textViewer.markAndRevealRange(null);\r
-} else\r
-delete this._pendingMarkRange;\r
-},\r
-\r
-_incrementMessageRepeatCount: function(msg, repeatDelta)\r
-{\r
-if (!msg._resourceMessageLineElement)\r
-return;\r
-\r
-if (!msg._resourceMessageRepeatCountElement) {\r
-var repeatedElement = document.createElement("span");\r
-msg._resourceMessageLineElement.appendChild(repeatedElement);\r
-msg._resourceMessageRepeatCountElement = repeatedElement;\r
-}\r
-\r
-msg.repeatCount += repeatDelta;\r
-msg._resourceMessageRepeatCountElement.textContent = WebInspector.UIString(" (repeated %d times)", msg.repeatCount);\r
-},\r
-\r
-_updateExecutionLine: function(previousLine)\r
-{\r
-if (previousLine) {\r
-if (previousLine - 1 < this._textModel.linesCount)\r
-this._textViewer.removeDecoration(previousLine - 1, "webkit-execution-line");\r
-}\r
-\r
-if (!this._executionLine)\r
-return;\r
-\r
-if (this._executionLine < this._textModel.linesCount)\r
-this._textViewer.addDecoration(this._executionLine - 1, "webkit-execution-line");\r
-},\r
-\r
-_updateDiffDecorations: function()\r
-{\r
-if (!this._diffLines)\r
-return;\r
-\r
-function addDecorations(textViewer, lines, className)\r
-{\r
-for (var i = 0; i < lines.length; ++i)\r
-textViewer.addDecoration(lines[i], className);\r
-}\r
-addDecorations(this._textViewer, this._diffLines.added, "webkit-added-line");\r
-addDecorations(this._textViewer, this._diffLines.removed, "webkit-removed-line");\r
-addDecorations(this._textViewer, this._diffLines.changed, "webkit-changed-line");\r
-},\r
-\r
-_removeDiffDecorations: function()\r
-{\r
-function removeDecorations(textViewer, lines, className)\r
-{\r
-for (var i = 0; i < lines.length; ++i)\r
-textViewer.removeDecoration(lines[i], className);\r
-}\r
-removeDecorations(this._textViewer, this._diffLines.added, "webkit-added-line");\r
-removeDecorations(this._textViewer, this._diffLines.removed, "webkit-removed-line");\r
-removeDecorations(this._textViewer, this._diffLines.changed, "webkit-changed-line");\r
-},\r
-\r
-_addExistingMessagesToSource: function()\r
-{\r
-var length = this._messages.length;\r
-for (var i = 0; i < length; ++i)\r
-this._addMessageToSource(this._messages[i]);\r
-},\r
-\r
-_addMessageToSource: function(msg)\r
-{\r
-if (msg.line >= this._textModel.linesCount)\r
-return;\r
-\r
-var messageBubbleElement = this._messageBubbles[msg.line];\r
-if (!messageBubbleElement || messageBubbleElement.nodeType !== Node.ELEMENT_NODE || !messageBubbleElement.hasStyleClass("webkit-html-message-bubble")) {\r
-messageBubbleElement = document.createElement("div");\r
-messageBubbleElement.className = "webkit-html-message-bubble";\r
-this._messageBubbles[msg.line] = messageBubbleElement;\r
-this._textViewer.addDecoration(msg.line - 1, messageBubbleElement);\r
-}\r
-\r
-var rowMessages = this._rowMessages[msg.line];\r
-if (!rowMessages) {\r
-rowMessages = [];\r
-this._rowMessages[msg.line] = rowMessages;\r
-}\r
-\r
-for (var i = 0; i < rowMessages.length; ++i) {\r
-if (rowMessages[i].isEqual(msg)) {\r
-this._incrementMessageRepeatCount(rowMessages[i], msg.repeatDelta);\r
-return;\r
-}\r
-}\r
-\r
-rowMessages.push(msg);\r
-\r
-var imageURL;\r
-switch (msg.level) {\r
-case WebInspector.ConsoleMessage.MessageLevel.Error:\r
-messageBubbleElement.addStyleClass("webkit-html-error-message");\r
-imageURL = "Images/errorIcon.png";\r
-break;\r
-case WebInspector.ConsoleMessage.MessageLevel.Warning:\r
-messageBubbleElement.addStyleClass("webkit-html-warning-message");\r
-imageURL = "Images/warningIcon.png";\r
-break;\r
-}\r
-\r
-var messageLineElement = document.createElement("div");\r
-messageLineElement.className = "webkit-html-message-line";\r
-messageBubbleElement.appendChild(messageLineElement);\r
-\r
-\r
-var image = document.createElement("img");\r
-image.src = imageURL;\r
-image.className = "webkit-html-message-icon";\r
-messageLineElement.appendChild(image);\r
-messageLineElement.appendChild(document.createTextNode(msg.message));\r
-\r
-msg._resourceMessageLineElement = messageLineElement;\r
-},\r
-\r
-_breakpointAdded: function(event)\r
-{\r
-var breakpoint = event.data;\r
-\r
-if (breakpoint.sourceID in this._scripts)\r
-this._addBreakpoint(breakpoint);\r
-},\r
-\r
-_addBreakpoint: function(breakpoint)\r
-{\r
-if (breakpoint.line > this._textModel.linesCount)\r
-return;\r
-\r
-breakpoint.addEventListener("enable-changed", this._breakpointChanged, this);\r
-breakpoint.addEventListener("condition-changed", this._breakpointChanged, this);\r
-breakpoint.addEventListener("removed", this._breakpointRemoved, this);\r
-\r
-breakpoint.sourceText = this._textModel.line(breakpoint.line - 1);\r
-this._setBreakpointDecoration(breakpoint.line, breakpoint.enabled, !!breakpoint.condition);\r
-},\r
-\r
-_breakpointRemoved: function(event)\r
-{\r
-var breakpoint = event.target;\r
-\r
-breakpoint.removeEventListener("enable-changed", null, this);\r
-breakpoint.removeEventListener("condition-changed", null, this);\r
-breakpoint.removeEventListener("removed", null, this);\r
-\r
-this._removeBreakpointDecoration(breakpoint.line);\r
-},\r
-\r
-_breakpointChanged: function(event)\r
-{\r
-var breakpoint = event.target;\r
-this._setBreakpointDecoration(breakpoint.line, breakpoint.enabled, !!breakpoint.condition);\r
-},\r
-\r
-_setBreakpointDecoration: function(lineNumber, enabled, hasCondition)\r
-{\r
-lineNumber -= 1;\r
-this._textViewer.beginUpdates();\r
-this._textViewer.addDecoration(lineNumber, "webkit-breakpoint");\r
-if (enabled)\r
-this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-disabled");\r
-else\r
-this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-disabled");\r
-if (hasCondition)\r
-this._textViewer.addDecoration(lineNumber, "webkit-breakpoint-conditional");\r
-else\r
-this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-conditional");\r
-this._textViewer.endUpdates();\r
-},\r
-\r
-_removeBreakpointDecoration: function(lineNumber)\r
-{\r
-lineNumber -= 1;\r
-this._textViewer.beginUpdates();\r
-this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint");\r
-this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-disabled");\r
-this._textViewer.removeDecoration(lineNumber, "webkit-breakpoint-conditional");\r
-this._textViewer.endUpdates();\r
-},\r
-\r
-_contextMenu: function(event)\r
-{\r
-if (!WebInspector.panels.scripts)\r
-return;\r
-\r
-var target = event.target.enclosingNodeOrSelfWithClass("webkit-line-number");\r
-if (!target)\r
-return;\r
-var lineNumber = target.parentElement.lineNumber + 1;\r
-\r
-var contextMenu = new WebInspector.ContextMenu();\r
-\r
-contextMenu.appendItem(WebInspector.UIString("Continue to Here"), this._continueToLine.bind(this, lineNumber));\r
-\r
-var breakpoint = this._findBreakpoint(lineNumber);\r
-if (!breakpoint) {\r
-\r
-contextMenu.appendItem(WebInspector.UIString("Add Breakpoint"), this._setBreakpoint.bind(this, lineNumber, "", true));\r
-\r
-function addConditionalBreakpoint()\r
-{\r
-this._setBreakpointDecoration(lineNumber, true, true);\r
-function didEditBreakpointCondition(committed, condition)\r
-{\r
-this._removeBreakpointDecoration(lineNumber);\r
-if (committed)\r
-this._setBreakpoint(lineNumber, true, condition);\r
-}\r
-this._editBreakpointCondition(lineNumber, "", didEditBreakpointCondition.bind(this));\r
-}\r
-contextMenu.appendItem(WebInspector.UIString("Add Conditional Breakpoint…"), addConditionalBreakpoint.bind(this));\r
-} else {\r
-\r
-contextMenu.appendItem(WebInspector.UIString("Remove Breakpoint"), breakpoint.remove.bind(breakpoint));\r
-function editBreakpointCondition()\r
-{\r
-function didEditBreakpointCondition(committed, condition)\r
-{\r
-if (committed) {\r
-breakpoint.remove();\r
-this._setBreakpoint(breakpoint.line, breakpoint.enabled, condition);\r
-}\r
-}\r
-this._editBreakpointCondition(lineNumber, breakpoint.condition, didEditBreakpointCondition.bind(this));\r
-}\r
-contextMenu.appendItem(WebInspector.UIString("Edit Breakpoint…"), editBreakpointCondition.bind(this));\r
-function setBreakpointEnabled(enabled)\r
-{\r
-breakpoint.remove();\r
-this._setBreakpoint(breakpoint.line, enabled, breakpoint.condition);\r
-}\r
-if (breakpoint.enabled)\r
-contextMenu.appendItem(WebInspector.UIString("Disable Breakpoint"), setBreakpointEnabled.bind(this, false));\r
-else\r
-contextMenu.appendItem(WebInspector.UIString("Enable Breakpoint"), setBreakpointEnabled.bind(this, true));\r
-}\r
-contextMenu.show(event);\r
-},\r
-\r
-_scroll: function(event)\r
-{\r
-this._hidePopup();\r
-},\r
-\r
-_mouseDown: function(event)\r
-{\r
-this._resetHoverTimer();\r
-this._hidePopup();\r
-if (event.button != 0 || event.altKey || event.ctrlKey || event.metaKey)\r
-return;\r
-var target = event.target.enclosingNodeOrSelfWithClass("webkit-line-number");\r
-if (!target)\r
-return;\r
-var lineNumber = target.parentElement.lineNumber + 1;\r
-\r
-var breakpoint = this._findBreakpoint(lineNumber);\r
-if (breakpoint) {\r
-breakpoint.remove();\r
-if (event.shiftKey)\r
-this._setBreakpoint(breakpoint.line, !breakpoint.enabled, breakpoint.condition);\r
-} else\r
-this._setBreakpoint(lineNumber, true, "");\r
-event.preventDefault();\r
-},\r
-\r
-_mouseMove: function(event)\r
-{\r
-\r
-if (this._hoverElement === event.target || event.target.hasStyleClass("source-frame-eval-expression"))\r
-return;\r
-\r
-this._resetHoverTimer();\r
-\r
-if (this._popup) {\r
-var self = this;\r
-function doHide()\r
-{\r
-self._hidePopup();\r
-delete self._hidePopupTimer;\r
-}\r
-if (!("_hidePopupTimer" in this))\r
-this._hidePopupTimer = setTimeout(doHide, 500);\r
-}\r
-\r
-this._hoverElement = event.target;\r
-\r
-\r
-if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)\r
-return;\r
-\r
-\r
-if (this._hoverElement.hasStyleClass("webkit-javascript-keyword")) {\r
-if (this._hoverElement.textContent !== "this")\r
-return;\r
-} else if (!this._hoverElement.hasStyleClass("webkit-javascript-ident"))\r
-return;\r
-\r
-const toolTipDelay = this._popup ? 600 : 1000;\r
-this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);\r
-},\r
-\r
-_resetHoverTimer: function()\r
-{\r
-if (this._hoverTimer) {\r
-clearTimeout(this._hoverTimer);\r
-delete this._hoverTimer;\r
-}\r
-},\r
-\r
-_hidePopup: function()\r
-{\r
-if (!this._popup)\r
-return;\r
-\r
-\r
-var parentElement = this._popup.highlightElement.parentElement;\r
-var child = this._popup.highlightElement.firstChild;\r
-while (child) {\r
-var nextSibling = child.nextSibling;\r
-parentElement.insertBefore(child, this._popup.highlightElement);\r
-child = nextSibling;\r
-}\r
-parentElement.removeChild(this._popup.highlightElement);\r
-\r
-this._popup.hide();\r
-delete this._popup;\r
-InspectorBackend.releaseWrapperObjectGroup(0, this._popoverObjectGroup);\r
-},\r
-\r
-_mouseHover: function(element)\r
-{\r
-delete this._hoverTimer;\r
-\r
-if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)\r
-return;\r
-\r
-var lineRow = element.enclosingNodeOrSelfWithNodeName("tr");\r
-if (!lineRow)\r
-return;\r
-\r
-\r
-var tokens = [ element ];\r
-var token = element.previousSibling;\r
-while (token && (token.className === "webkit-javascript-ident" || token.className === "webkit-javascript-keyword" || token.textContent.trim() === ".")) {\r
-tokens.push(token);\r
-token = token.previousSibling;\r
-}\r
-tokens.reverse();\r
-\r
-\r
-var parentElement = element.parentElement;\r
-var nextElement = element.nextSibling;\r
-var container = document.createElement("span");\r
-for (var i = 0; i < tokens.length; ++i)\r
-container.appendChild(tokens[i]);\r
-parentElement.insertBefore(container, nextElement);\r
-this._showPopup(container);\r
-},\r
-\r
-_showPopup: function(element)\r
-{\r
-function killHidePopupTimer()\r
-{\r
-if (this._hidePopupTimer) {\r
-clearTimeout(this._hidePopupTimer);\r
-delete this._hidePopupTimer;\r
-\r
-\r
-\r
-this._resetHoverTimer();\r
-}\r
-}\r
-\r
-function showObjectPopup(result)\r
-{\r
-if (!WebInspector.panels.scripts.paused)\r
-return;\r
-\r
-var popupContentElement = null;\r
-if (result.type !== "object" && result.type !== "node" && result.type !== "array") {\r
-popupContentElement = document.createElement("span");\r
-popupContentElement.className = "monospace console-formatted-" + result.type;\r
-popupContentElement.style.whiteSpace = "pre";\r
-popupContentElement.textContent = result.description;\r
-if (result.type === "string")\r
-popupContentElement.textContent = "\"" + popupContentElement.textContent + "\"";\r
-this._popup = new WebInspector.Popover(popupContentElement);\r
-this._popup.show(element);\r
-} else {\r
-var popupContentElement = document.createElement("div");\r
-\r
-var titleElement = document.createElement("div");\r
-titleElement.className = "source-frame-popover-title monospace";\r
-titleElement.textContent = result.description;\r
-popupContentElement.appendChild(titleElement);\r
-\r
-var section = new WebInspector.ObjectPropertiesSection(result, "", null, false);\r
-section.expanded = true;\r
-section.element.addStyleClass("source-frame-popover-tree");\r
-section.headerElement.addStyleClass("hidden");\r
-popupContentElement.appendChild(section.element);\r
-\r
-this._popup = new WebInspector.Popover(popupContentElement);\r
-const popupWidth = 300;\r
-const popupHeight = 250;\r
-this._popup.show(element, popupWidth, popupHeight);\r
-}\r
-this._popup.highlightElement = element;\r
-this._popup.highlightElement.addStyleClass("source-frame-eval-expression");\r
-popupContentElement.addEventListener("mousemove", killHidePopupTimer.bind(this), true);\r
-}\r
-\r
-function evaluateCallback(result)\r
-{\r
-if (result.isError())\r
-return;\r
-if (!WebInspector.panels.scripts.paused)\r
-return;\r
-showObjectPopup.call(this, result);\r
-}\r
-WebInspector.panels.scripts.evaluateInSelectedCallFrame(element.textContent, false, this._popoverObjectGroup, evaluateCallback.bind(this));\r
-},\r
-\r
-_editBreakpointCondition: function(lineNumber, condition, callback)\r
-{\r
-lineNumber -= 1;\r
-this._conditionElement = this._createConditionElement(lineNumber);\r
-this._textViewer.addDecoration(lineNumber, this._conditionElement);\r
-\r
-function finishEditing(committed, element, newText)\r
-{\r
-this._textViewer.removeDecoration(lineNumber, this._conditionElement);\r
-delete this._conditionEditorElement;\r
-delete this._conditionElement;\r
-callback(committed, newText);\r
-}\r
-\r
-WebInspector.startEditing(this._conditionEditorElement, {\r
-context: null,\r
-commitHandler: finishEditing.bind(this, true),\r
-cancelHandler: finishEditing.bind(this, false)\r
-});\r
-this._conditionEditorElement.value = condition;\r
-this._conditionEditorElement.select();\r
-},\r
-\r
-_createConditionElement: function(lineNumber)\r
-{\r
-var conditionElement = document.createElement("div");\r
-conditionElement.className = "source-frame-breakpoint-condition";\r
-\r
-var labelElement = document.createElement("label");\r
-labelElement.className = "source-frame-breakpoint-message";\r
-labelElement.htmlFor = "source-frame-breakpoint-condition";\r
-labelElement.appendChild(document.createTextNode(WebInspector.UIString("The breakpoint on line %d will stop only if this expression is true:", lineNumber)));\r
-conditionElement.appendChild(labelElement);\r
-\r
-var editorElement = document.createElement("input");\r
-editorElement.id = "source-frame-breakpoint-condition";\r
-editorElement.className = "monospace";\r
-editorElement.type = "text"\r
-conditionElement.appendChild(editorElement);\r
-this._conditionEditorElement = editorElement;\r
-\r
-return conditionElement;\r
-},\r
-\r
-_evalSelectionInCallFrame: function(event)\r
-{\r
-if (!WebInspector.panels.scripts || !WebInspector.panels.scripts.paused)\r
-return;\r
-\r
-var selection = this.element.contentWindow.getSelection();\r
-if (!selection.rangeCount)\r
-return;\r
-\r
-var expression = selection.getRangeAt(0).toString().trim();\r
-WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", function(result) {\r
-WebInspector.showConsole();\r
-var commandMessage = new WebInspector.ConsoleCommand(expression);\r
-WebInspector.console.addMessage(commandMessage);\r
-WebInspector.console.addMessage(new WebInspector.ConsoleCommandResult(result, commandMessage));\r
-});\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this._textViewer)\r
-this._textViewer.resize();\r
-},\r
-\r
-_continueToLine: function(lineNumber)\r
-{\r
-var sourceID = this._sourceIDForLine(lineNumber);\r
-if (!sourceID)\r
-return;\r
-WebInspector.debuggerModel.continueToLine(sourceID, lineNumber);\r
-},\r
-\r
-_editLine: function(lineNumber, newContent, cancelEditingCallback)\r
-{\r
-lineNumber += 1;\r
-\r
-var lines = [];\r
-for (var i = 0; i < this._textModel.linesCount; ++i) {\r
-if (i === lineNumber - 1)\r
-lines.push(newContent);\r
-else\r
-lines.push(this._textModel.line(i));\r
-}\r
-\r
-var editData = {};\r
-editData.sourceID = this._sourceIDForLine(lineNumber);\r
-editData.content = lines.join("\n");\r
-editData.line = lineNumber;\r
-editData.linesCountToShift = newContent.split("\n").length - 1;\r
-this._doEditLine(editData, cancelEditingCallback);\r
-},\r
-\r
-_revertEditLine: function(editData, contentToRevertTo)\r
-{\r
-var newEditData = {};\r
-newEditData.sourceID = editData.sourceID;\r
-newEditData.content = contentToRevertTo;\r
-newEditData.line = editData.line;\r
-newEditData.linesCountToShift = -editData.linesCountToShift;\r
-this._doEditLine(newEditData);\r
-},\r
-\r
-_doEditLine: function(editData, cancelEditingCallback)\r
-{\r
-var revertEditingCallback = this._revertEditLine.bind(this, editData);\r
-var commitEditingCallback = this._commitEditLine.bind(this, editData, revertEditingCallback);\r
-WebInspector.panels.scripts.editScriptSource(editData, commitEditingCallback, cancelEditingCallback);\r
-},\r
-\r
-_commitEditLine: function(editData, revertEditLineCallback, newContent)\r
-{\r
-var script = this._scripts[editData.sourceID];\r
-script.source = newContent;\r
-if (script.resource)\r
-script.resource.setContent(newContent, revertEditLineCallback);\r
-},\r
-\r
-_setBreakpoint: function(lineNumber, enabled, condition)\r
-{\r
-var sourceID = this._sourceIDForLine(lineNumber);\r
-if (!sourceID)\r
-return;\r
-WebInspector.debuggerModel.setBreakpoint(sourceID, lineNumber, enabled, condition);\r
-if (!WebInspector.panels.scripts.breakpointsActivated)\r
-WebInspector.panels.scripts.toggleBreakpointsClicked();\r
-},\r
-\r
-_breakpoints: function()\r
-{\r
-var scripts = this._scripts;\r
-return WebInspector.debuggerModel.queryBreakpoints(function(b) { return b.sourceID in scripts; });\r
-},\r
-\r
-_findBreakpoint: function(lineNumber)\r
-{\r
-var sourceID = this._sourceIDForLine(lineNumber);\r
-return WebInspector.debuggerModel.findBreakpoint(sourceID, lineNumber);\r
-},\r
-\r
-_sourceIDForLine: function(lineNumber)\r
-{\r
-var sourceIDForLine = null;\r
-var closestStartingLine = 0;\r
-for (var sourceID in this._scripts) {\r
-var script = this._scripts[sourceID];\r
-if (script.startingLine <= lineNumber && script.startingLine >= closestStartingLine) {\r
-closestStartingLine = script.startingLine;\r
-sourceIDForLine = sourceID;\r
-}\r
-}\r
-return sourceIDForLine;\r
-}\r
-}\r
-\r
-WebInspector.SourceFrame.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DOMSyntaxHighlighter = function(mimeType)\r
-{\r
-this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);\r
-}\r
-\r
-WebInspector.DOMSyntaxHighlighter.prototype = {\r
-createSpan: function(content, className)\r
-{\r
-var span = document.createElement("span");\r
-span.className = "webkit-" + className;\r
-span.appendChild(document.createTextNode(content));\r
-return span;\r
-},\r
-\r
-syntaxHighlightNode: function(node)\r
-{\r
-this._tokenizer.condition = this._tokenizer.initialCondition;\r
-var lines = node.textContent.split("\n");\r
-node.removeChildren();\r
-\r
-for (var i = lines[0].length ? 0 : 1; i < lines.length; ++i) {\r
-var line = lines[i];\r
-var plainTextStart = 0;\r
-this._tokenizer.line = line;\r
-var column = 0;\r
-do {\r
-var newColumn = this._tokenizer.nextToken(column);\r
-var tokenType = this._tokenizer.tokenType;\r
-if (tokenType) {\r
-if (column > plainTextStart) {\r
-var plainText = line.substring(plainTextStart, column);\r
-node.appendChild(document.createTextNode(plainText));\r
-}\r
-var token = line.substring(column, newColumn);\r
-node.appendChild(this.createSpan(token, tokenType));\r
-plainTextStart = newColumn;\r
-}\r
-column = newColumn;\r
-} while (column < line.length)\r
-\r
-if (plainTextStart < line.length) {\r
-var plainText = line.substring(plainTextStart, line.length);\r
-node.appendChild(document.createTextNode(plainText));\r
-}\r
-if (i < lines.length - 1)\r
-node.appendChild(document.createElement("br"));\r
-}\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TextRange = function(startLine, startColumn, endLine, endColumn)\r
-{\r
-this.startLine = startLine;\r
-this.startColumn = startColumn;\r
-this.endLine = endLine;\r
-this.endColumn = endColumn;\r
-}\r
-\r
-WebInspector.TextRange.prototype = {\r
-isEmpty: function()\r
-{\r
-return this.startLine === this.endLine && this.startColumn === this.endColumn;\r
-},\r
-\r
-get linesCount()\r
-{\r
-return this.endLine - this.startLine;\r
-},\r
-\r
-clone: function()\r
-{\r
-return new WebInspector.TextRange(this.startLine, this.startColumn, this.endLine, this.endColumn); \r
-}\r
-}\r
-\r
-WebInspector.TextEditorModel = function()\r
-{\r
-this._lines = [""];\r
-this._attributes = [];\r
-this._undoStack = [];\r
-this._noPunctuationRegex = /[^ !%&()*+,-.:;<=>?\[\]\^{|}~]+/;\r
-}\r
-\r
-WebInspector.TextEditorModel.prototype = {\r
-set changeListener(changeListener)\r
-{\r
-this._changeListener = changeListener;\r
-},\r
-\r
-get linesCount()\r
-{\r
-return this._lines.length;\r
-},\r
-\r
-line: function(lineNumber)\r
-{\r
-if (lineNumber >= this._lines.length)\r
-throw "Out of bounds:" + lineNumber;\r
-return this._lines[lineNumber];\r
-},\r
-\r
-lineLength: function(lineNumber)\r
-{\r
-return this._lines[lineNumber].length;\r
-},\r
-\r
-setText: function(range, text)\r
-{\r
-if (!range)\r
-range = new WebInspector.TextRange(0, 0, this._lines.length - 1, this._lines[this._lines.length - 1].length);\r
-var command = this._pushUndoableCommand(range, text);\r
-var newRange = this._innerSetText(range, text);\r
-command.range = newRange.clone();\r
-\r
-if (this._changeListener)\r
-this._changeListener(range, newRange, command.text, text);\r
-return newRange;\r
-},\r
-\r
-set replaceTabsWithSpaces(replaceTabsWithSpaces)\r
-{\r
-this._replaceTabsWithSpaces = replaceTabsWithSpaces;\r
-},\r
-\r
-_innerSetText: function(range, text)\r
-{\r
-this._eraseRange(range);\r
-if (text === "")\r
-return new WebInspector.TextRange(range.startLine, range.startColumn, range.startLine, range.startColumn);\r
-\r
-var newLines = text.split("\n");\r
-this._replaceTabsIfNeeded(newLines);\r
-\r
-var prefix = this._lines[range.startLine].substring(0, range.startColumn);\r
-var prefixArguments = this._arguments\r
-var suffix = this._lines[range.startLine].substring(range.startColumn);\r
-\r
-var postCaret = prefix.length;\r
-\r
-if (newLines.length === 1) {\r
-this._setLine(range.startLine, prefix + newLines[0] + suffix);\r
-postCaret += newLines[0].length;\r
-} else {\r
-this._setLine(range.startLine, prefix + newLines[0]);\r
-for (var i = 1; i < newLines.length; ++i)\r
-this._insertLine(range.startLine + i, newLines[i]);\r
-this._setLine(range.startLine + newLines.length - 1, newLines[newLines.length - 1] + suffix);\r
-postCaret = newLines[newLines.length - 1].length;\r
-}\r
-return new WebInspector.TextRange(range.startLine, range.startColumn,\r
-range.startLine + newLines.length - 1, postCaret);\r
-},\r
-\r
-_replaceTabsIfNeeded: function(lines)\r
-{\r
-if (!this._replaceTabsWithSpaces)\r
-return;\r
-var spaces = [ "    ", "   ", "  ", " "];\r
-for (var i = 0; i < lines.length; ++i) {\r
-var line = lines[i];\r
-var index = line.indexOf("\t");\r
-while (index !== -1) {\r
-line = line.substring(0, index) + spaces[index % 4] + line.substring(index + 1);\r
-index = line.indexOf("\t", index + 1);\r
-}\r
-lines[i] = line;\r
-}\r
-},\r
-\r
-_eraseRange: function(range)\r
-{\r
-if (range.isEmpty())\r
-return;\r
-\r
-var prefix = this._lines[range.startLine].substring(0, range.startColumn);\r
-var suffix = this._lines[range.endLine].substring(range.endColumn);\r
-\r
-if (range.endLine > range.startLine)\r
-this._removeLines(range.startLine + 1, range.endLine - range.startLine);\r
-this._setLine(range.startLine, prefix + suffix);\r
-},\r
-\r
-_setLine: function(lineNumber, text)\r
-{\r
-this._lines[lineNumber] = text;\r
-},\r
-\r
-_removeLines: function(fromLine, count)\r
-{\r
-this._lines.splice(fromLine, count);\r
-this._attributes.splice(fromLine, count);\r
-},\r
-\r
-_insertLine: function(lineNumber, text)\r
-{\r
-this._lines.splice(lineNumber, 0, text);\r
-this._attributes.splice(lineNumber, 0, {});\r
-},\r
-\r
-wordRange: function(lineNumber, column)\r
-{\r
-return new WebInspector.TextRange(lineNumber, this.wordStart(lineNumber, column, true), lineNumber, this.wordEnd(lineNumber, column, true));\r
-},\r
-\r
-wordStart: function(lineNumber, column, gapless)\r
-{\r
-var line = this._lines[lineNumber];\r
-var prefix = line.substring(0, column).split("").reverse().join("");\r
-var prefixMatch = this._noPunctuationRegex.exec(prefix);\r
-return prefixMatch && (!gapless || prefixMatch.index === 0) ? column - prefixMatch.index - prefixMatch[0].length : column;\r
-},\r
-\r
-wordEnd: function(lineNumber, column, gapless)\r
-{\r
-var line = this._lines[lineNumber];\r
-var suffix = line.substring(column);\r
-var suffixMatch = this._noPunctuationRegex.exec(suffix);\r
-return suffixMatch && (!gapless || suffixMatch.index === 0) ? column + suffixMatch.index + suffixMatch[0].length : column;\r
-},\r
-\r
-copyRange: function(range)\r
-{\r
-if (!range)\r
-range = new WebInspector.TextRange(0, 0, this._lines.length - 1, this._lines[this._lines.length - 1].length);\r
-\r
-var clip = [];\r
-if (range.startLine === range.endLine) {\r
-clip.push(this._lines[range.startLine].substring(range.startColumn, range.endColumn));\r
-return clip.join("\n");\r
-}\r
-clip.push(this._lines[range.startLine].substring(range.startColumn));\r
-for (var i = range.startLine + 1; i < range.endLine; ++i)\r
-clip.push(this._lines[i]);\r
-clip.push(this._lines[range.endLine].substring(0, range.endColumn));\r
-return clip.join("\n");\r
-},\r
-\r
-setAttribute: function(line, name, value)\r
-{\r
-var attrs = this._attributes[line];\r
-if (!attrs) {\r
-attrs = {};\r
-this._attributes[line] = attrs;\r
-}\r
-attrs[name] = value;\r
-},\r
-\r
-getAttribute: function(line, name)\r
-{\r
-var attrs = this._attributes[line];\r
-return attrs ? attrs[name] : null;\r
-},\r
-\r
-removeAttribute: function(line, name)\r
-{\r
-var attrs = this._attributes[line];\r
-if (attrs)\r
-delete attrs[name];\r
-},\r
-\r
-_pushUndoableCommand: function(range, text)\r
-{\r
-var command = {\r
-text: this.copyRange(range),\r
-startLine: range.startLine,\r
-startColumn: range.startColumn,\r
-endLine: range.startLine,\r
-endColumn: range.startColumn\r
-};\r
-if (this._inUndo)\r
-this._redoStack.push(command);\r
-else {\r
-if (!this._inRedo)\r
-this._redoStack = [];\r
-this._undoStack.push(command);\r
-}\r
-return command;\r
-},\r
-\r
-undo: function()\r
-{\r
-this._markRedoableState();\r
-\r
-this._inUndo = true;\r
-var range = this._doUndo(this._undoStack);\r
-delete this._inUndo;\r
-\r
-return range;\r
-},\r
-\r
-redo: function()\r
-{\r
-this.markUndoableState();\r
-\r
-this._inRedo = true;\r
-var range = this._doUndo(this._redoStack);\r
-delete this._inRedo;\r
-\r
-return range;\r
-},\r
-\r
-_doUndo: function(stack)\r
-{\r
-var range = null;\r
-for (var i = stack.length - 1; i >= 0; --i) {\r
-var command = stack[i];\r
-stack.length = i;\r
-\r
-range = this.setText(command.range, command.text);\r
-if (i > 0 && stack[i - 1].explicit)\r
-return range;\r
-}\r
-return range;\r
-},\r
-\r
-markUndoableState: function()\r
-{\r
-if (this._undoStack.length)\r
-this._undoStack[this._undoStack.length - 1].explicit = true;\r
-},\r
-\r
-_markRedoableState: function()\r
-{\r
-if (this._redoStack.length)\r
-this._redoStack[this._redoStack.length - 1].explicit = true;\r
-},\r
-\r
-resetUndoStack: function()\r
-{\r
-this._undoStack = [];\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TextEditorHighlighter = function(textModel, damageCallback)\r
-{\r
-this._textModel = textModel;\r
-this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/html");\r
-this._damageCallback = damageCallback;\r
-this.reset();\r
-}\r
-\r
-WebInspector.TextEditorHighlighter.prototype = {\r
-set mimeType(mimeType)\r
-{\r
-var tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);\r
-if (tokenizer) {\r
-this._tokenizer = tokenizer;\r
-this._tokenizerCondition = this._tokenizer.initialCondition;\r
-}\r
-},\r
-\r
-reset: function()\r
-{\r
-this._lastHighlightedLine = 0;\r
-this._lastHighlightedColumn = 0;\r
-this._tokenizerCondition = this._tokenizer.initialCondition;\r
-},\r
-\r
-highlight: function(endLine)\r
-{\r
-\r
-if (endLine <= this._lastHighlightedLine)\r
-return;\r
-\r
-this._requestedEndLine = endLine;\r
-\r
-if (this._highlightTimer) {\r
-\r
-return;\r
-}\r
-\r
-\r
-this._highlightInChunks(endLine);\r
-\r
-\r
-if (this._lastHighlightedLine < endLine)\r
-this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, endLine), 100);\r
-},\r
-\r
-_highlightInChunks: function(endLine)\r
-{\r
-delete this._highlightTimer;\r
-\r
-\r
-if (this._requestedEndLine <= this._lastHighlightedLine)\r
-return;\r
-\r
-if (this._requestedEndLine !== endLine) {\r
-\r
-this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 100);\r
-return;\r
-}\r
-\r
-this._highlightLines(this._requestedEndLine);\r
-\r
-\r
-if (this._lastHighlightedLine < this._requestedEndLine)\r
-this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 10);\r
-},\r
-\r
-_highlightLines: function(endLine)\r
-{\r
-\r
-this._tokenizer.condition = this._tokenizerCondition;\r
-var tokensCount = 0;\r
-for (var lineNumber = this._lastHighlightedLine; lineNumber < endLine; ++lineNumber) {\r
-var line = this._textModel.line(lineNumber);\r
-this._tokenizer.line = line;\r
-var attributes = this._textModel.getAttribute(lineNumber, "highlight") || {};\r
-\r
-\r
-do {\r
-var newColumn = this._tokenizer.nextToken(this._lastHighlightedColumn);\r
-var tokenType = this._tokenizer.tokenType;\r
-if (tokenType)\r
-attributes[this._lastHighlightedColumn] = { length: newColumn - this._lastHighlightedColumn, tokenType: tokenType, subTokenizer: this._tokenizer.subTokenizer };\r
-this._lastHighlightedColumn = newColumn;\r
-if (++tokensCount > 1000)\r
-break;\r
-} while (this._lastHighlightedColumn < line.length)\r
-\r
-this._textModel.setAttribute(lineNumber, "highlight", attributes);\r
-if (this._lastHighlightedColumn < line.length) {\r
-\r
-break;\r
-} else\r
-this._lastHighlightedColumn = 0;\r
-}\r
-\r
-this._damageCallback(this._lastHighlightedLine, lineNumber);\r
-this._tokenizerCondition = this._tokenizer.condition;\r
-this._lastHighlightedLine = lineNumber;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TextViewer = function(textModel, platform, url)\r
-{\r
-this._textModel = textModel;\r
-this._textModel.changeListener = this._buildChunks.bind(this);\r
-this._highlighter = new WebInspector.TextEditorHighlighter(this._textModel, this._highlightDataReady.bind(this));\r
-\r
-this.element = document.createElement("div");\r
-this.element.className = "text-editor monospace";\r
-this.element.tabIndex = 0;\r
-\r
-this.element.addEventListener("scroll", this._scroll.bind(this), false);\r
-this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);\r
-this.element.addEventListener("beforecopy", this._beforeCopy.bind(this), false);\r
-this.element.addEventListener("copy", this._copy.bind(this), false);\r
-this.element.addEventListener("dblclick", this._handleDoubleClick.bind(this), false);\r
-\r
-this._url = url;\r
-\r
-this._linesContainerElement = document.createElement("table");\r
-this._linesContainerElement.className = "text-editor-lines";\r
-this._linesContainerElement.setAttribute("cellspacing", 0);\r
-this._linesContainerElement.setAttribute("cellpadding", 0);\r
-this.element.appendChild(this._linesContainerElement);\r
-\r
-this._defaultChunkSize = 50;\r
-this._paintCoalescingLevel = 0;\r
-\r
-this.freeCachedElements();\r
-this._buildChunks();\r
-}\r
-\r
-WebInspector.TextViewer.prototype = {\r
-set mimeType(mimeType)\r
-{\r
-this._highlighter.mimeType = mimeType;\r
-},\r
-\r
-get textModel()\r
-{\r
-return this._textModel;\r
-},\r
-\r
-revealLine: function(lineNumber)\r
-{\r
-if (lineNumber >= this._textModel.linesCount)\r
-return;\r
-\r
-var chunk = this._makeLineAChunk(lineNumber);\r
-chunk.element.scrollIntoViewIfNeeded();\r
-},\r
-\r
-set editCallback(editCallback)\r
-{\r
-this._editCallback = editCallback;\r
-},\r
-\r
-addDecoration: function(lineNumber, decoration)\r
-{\r
-var chunk = this._makeLineAChunk(lineNumber);\r
-chunk.addDecoration(decoration);\r
-},\r
-\r
-removeDecoration: function(lineNumber, decoration)\r
-{\r
-var chunk = this._makeLineAChunk(lineNumber);\r
-chunk.removeDecoration(decoration);\r
-},\r
-\r
-markAndRevealRange: function(range)\r
-{\r
-if (this._rangeToMark) {\r
-var markedLine = this._rangeToMark.startLine;\r
-this._rangeToMark = null;\r
-this._paintLines(markedLine, markedLine + 1);\r
-}\r
-\r
-if (range) {\r
-this._rangeToMark = range;\r
-this.revealLine(range.startLine);\r
-this._paintLines(range.startLine, range.startLine + 1);\r
-if (this._markedRangeElement)\r
-this._markedRangeElement.scrollIntoViewIfNeeded();\r
-}\r
-delete this._markedRangeElement;\r
-},\r
-\r
-highlightLine: function(lineNumber)\r
-{\r
-this.clearLineHighlight();\r
-this._highlightedLine = lineNumber;\r
-this.revealLine(lineNumber);\r
-var chunk = this._makeLineAChunk(lineNumber);\r
-chunk.addDecoration("webkit-highlighted-line");\r
-},\r
-\r
-clearLineHighlight: function()\r
-{\r
-if (typeof this._highlightedLine === "number") {\r
-var chunk = this._makeLineAChunk(this._highlightedLine);\r
-chunk.removeDecoration("webkit-highlighted-line");\r
-delete this._highlightedLine;\r
-}\r
-},\r
-\r
-freeCachedElements: function()\r
-{\r
-this._cachedSpans = [];\r
-this._cachedTextNodes = [];\r
-this._cachedRows = [];\r
-},\r
-\r
-_buildChunks: function()\r
-{\r
-this._linesContainerElement.removeChildren();\r
-\r
-this._textChunks = [];\r
-for (var i = 0; i < this._textModel.linesCount; i += this._defaultChunkSize) {\r
-var chunk = new WebInspector.TextChunk(this, i, i + this._defaultChunkSize);\r
-this._textChunks.push(chunk);\r
-this._linesContainerElement.appendChild(chunk.element);\r
-}\r
-\r
-this._indexChunks();\r
-this._highlighter.reset();\r
-this._repaintAll();\r
-},\r
-\r
-_makeLineAChunk: function(lineNumber)\r
-{\r
-if (!this._textChunks)\r
-this._buildChunks();\r
-\r
-var chunkNumber = this._chunkNumberForLine(lineNumber);\r
-var oldChunk = this._textChunks[chunkNumber];\r
-if (oldChunk.linesCount === 1)\r
-return oldChunk;\r
-\r
-var wasExpanded = oldChunk.expanded;\r
-oldChunk.expanded = false;\r
-\r
-var insertIndex = oldChunk.chunkNumber + 1;\r
-\r
-\r
-if (lineNumber > oldChunk.startLine) {\r
-var prefixChunk = new WebInspector.TextChunk(this, oldChunk.startLine, lineNumber);\r
-this._textChunks.splice(insertIndex++, 0, prefixChunk);\r
-this._linesContainerElement.insertBefore(prefixChunk.element, oldChunk.element);\r
-}\r
-\r
-\r
-var lineChunk = new WebInspector.TextChunk(this, lineNumber, lineNumber + 1);\r
-this._textChunks.splice(insertIndex++, 0, lineChunk);\r
-this._linesContainerElement.insertBefore(lineChunk.element, oldChunk.element);\r
-\r
-\r
-if (oldChunk.startLine + oldChunk.linesCount > lineNumber + 1) {\r
-var suffixChunk = new WebInspector.TextChunk(this, lineNumber + 1, oldChunk.startLine + oldChunk.linesCount);\r
-this._textChunks.splice(insertIndex, 0, suffixChunk);\r
-this._linesContainerElement.insertBefore(suffixChunk.element, oldChunk.element);\r
-}\r
-\r
-\r
-this._textChunks.splice(oldChunk.chunkNumber, 1);\r
-this._linesContainerElement.removeChild(oldChunk.element);\r
-this._indexChunks();\r
-\r
-if (wasExpanded) {\r
-if (prefixChunk)\r
-prefixChunk.expanded = true;\r
-lineChunk.expanded = true;\r
-if (suffixChunk)\r
-suffixChunk.expanded = true;\r
-}\r
-\r
-return lineChunk;\r
-},\r
-\r
-_indexChunks: function()\r
-{\r
-for (var i = 0; i < this._textChunks.length; ++i)\r
-this._textChunks[i].chunkNumber = i;\r
-},\r
-\r
-_scroll: function()\r
-{\r
-var scrollTop = this.element.scrollTop;\r
-setTimeout(function() {\r
-if (scrollTop === this.element.scrollTop)\r
-this._repaintAll();\r
-}.bind(this), 50);\r
-},\r
-\r
-_handleKeyDown: function()\r
-{\r
-if (this._editingLine || event.metaKey || event.shiftKey || event.ctrlKey || event.altKey)\r
-return;\r
-\r
-var scrollValue = 0;\r
-if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Up.code)\r
-scrollValue = -1;\r
-else if (event.keyCode == WebInspector.KeyboardShortcut.Keys.Down.code)\r
-scrollValue = 1;\r
-\r
-if (scrollValue) {\r
-event.preventDefault();\r
-event.stopPropagation();\r
-this.element.scrollByLines(scrollValue);\r
-return;\r
-}\r
-\r
-scrollValue = 0;\r
-if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Left.code)\r
-scrollValue = -40;\r
-else if (event.keyCode == WebInspector.KeyboardShortcut.Keys.Right.code)\r
-scrollValue = 40;\r
-\r
-if (scrollValue) {\r
-event.preventDefault();\r
-event.stopPropagation();\r
-this.element.scrollLeft += scrollValue;\r
-}\r
-},\r
-\r
-_handleDoubleClick: function(e)\r
-{\r
-if (!this._editCallback)\r
-return;\r
-\r
-var cell = e.target.enclosingNodeOrSelfWithNodeName("TD");\r
-if (!cell)\r
-return;\r
-\r
-var lineRow = cell.parentElement;\r
-if (lineRow.firstChild === cell)\r
-return;  \r
-\r
-var oldContent = lineRow.lastChild.innerHTML;\r
-var cancelEditingCallback = this._cancelEditingLine.bind(this, lineRow.lastChild, oldContent);\r
-var commitEditingCallback = this._commitEditingLine.bind(this, lineRow.lineNumber, lineRow.lastChild, cancelEditingCallback);\r
-this._editingLine = WebInspector.startEditing(lineRow.lastChild, {\r
-context: null,\r
-commitHandler: commitEditingCallback,\r
-cancelHandler: cancelEditingCallback,\r
-multiline: true\r
-});\r
-},\r
-\r
-_commitEditingLine: function(lineNumber, element, cancelEditingCallback)\r
-{\r
-this._editCallback(lineNumber, element.textContent, cancelEditingCallback);\r
-delete this._editingLine;\r
-},\r
-\r
-_cancelEditingLine: function(element, oldContent, e)\r
-{\r
-element.innerHTML = oldContent;\r
-delete this._editingLine;\r
-},\r
-\r
-_beforeCopy: function(e)\r
-{\r
-e.preventDefault();\r
-},\r
-\r
-_copy: function(e)\r
-{\r
-var range = this._getSelection();\r
-var text = this._textModel.copyRange(range);\r
-InspectorFrontendHost.copyText(text);\r
-e.preventDefault();\r
-},\r
-\r
-beginUpdates: function(enabled)\r
-{\r
-this._paintCoalescingLevel++;\r
-},\r
-\r
-endUpdates: function(enabled)\r
-{\r
-this._paintCoalescingLevel--;\r
-if (!this._paintCoalescingLevel)\r
-this._repaintAll();\r
-},\r
-\r
-_chunkForOffset: function(offset)\r
-{\r
-var currentOffset = 0;\r
-var row = this._linesContainerElement.firstChild;\r
-while (row) {\r
-var rowHeight = row.offsetHeight;\r
-if (offset >= currentOffset && offset < currentOffset + rowHeight)\r
-return row.chunkNumber;\r
-row = row.nextSibling;\r
-currentOffset += rowHeight;\r
-}\r
-return this._textChunks.length - 1;\r
-},\r
-\r
-_chunkNumberForLine: function(lineNumber)\r
-{\r
-for (var i = 0; i < this._textChunks.length; ++i) {\r
-var line = this._textChunks[i].startLine;\r
-if (lineNumber >= this._textChunks[i].startLine && lineNumber < this._textChunks[i].startLine + this._textChunks[i].linesCount)\r
-return i;\r
-}\r
-return this._textChunks.length - 1;\r
-},\r
-\r
-_chunkForLine: function(lineNumber)\r
-{\r
-return this._textChunks[this._chunkNumberForLine(lineNumber)];\r
-},\r
-\r
-_chunkStartLine: function(chunkNumber)\r
-{\r
-var lineNumber = 0;\r
-for (var i = 0; i < chunkNumber && i < this._textChunks.length; ++i)\r
-lineNumber += this._textChunks[i].linesCount;\r
-return lineNumber;\r
-},\r
-\r
-_repaintAll: function()\r
-{\r
-if (this._paintCoalescingLevel)\r
-return;\r
-\r
-if (!this._textChunks)\r
-this._buildChunks();\r
-\r
-var visibleFrom = this.element.scrollTop;\r
-var visibleTo = this.element.scrollTop + this.element.clientHeight;\r
-\r
-var offset = 0;\r
-var firstVisibleLine = -1;\r
-var lastVisibleLine = 0;\r
-var toExpand = [];\r
-var toCollapse = [];\r
-for (var i = 0; i < this._textChunks.length; ++i) {\r
-var chunk = this._textChunks[i];\r
-var chunkHeight = chunk.height;\r
-if (offset + chunkHeight > visibleFrom && offset < visibleTo) {\r
-toExpand.push(chunk);\r
-if (firstVisibleLine === -1)\r
-firstVisibleLine = chunk.startLine;\r
-lastVisibleLine = chunk.startLine + chunk.linesCount;\r
-} else {\r
-toCollapse.push(chunk);\r
-if (offset >= visibleTo)\r
-break;\r
-}\r
-offset += chunkHeight;\r
-}\r
-\r
-for (var j = i; j < this._textChunks.length; ++j)\r
-toCollapse.push(this._textChunks[i]);\r
-\r
-var selection = this._getSelection();\r
-\r
-this._muteHighlightListener = true;\r
-this._highlighter.highlight(lastVisibleLine);\r
-delete this._muteHighlightListener;\r
-\r
-for (var i = 0; i < toCollapse.length; ++i)\r
-toCollapse[i].expanded = false;\r
-for (var i = 0; i < toExpand.length; ++i)\r
-toExpand[i].expanded = true;\r
-\r
-this._restoreSelection(selection);\r
-},\r
-\r
-_highlightDataReady: function(fromLine, toLine)\r
-{\r
-if (this._muteHighlightListener)\r
-return;\r
-\r
-var selection;\r
-for (var i = fromLine; i < toLine; ++i) {\r
-var lineRow = this._textModel.getAttribute(i, "line-row");\r
-if (!lineRow || lineRow.highlighted)\r
-continue;\r
-if (!selection)\r
-selection = this._getSelection();\r
-this._paintLine(lineRow, i);\r
-}\r
-this._restoreSelection(selection);\r
-},\r
-\r
-_paintLines: function(fromLine, toLine)\r
-{\r
-for (var i = fromLine; i < toLine; ++i) {\r
-var lineRow = this._textModel.getAttribute(i, "line-row");\r
-if (lineRow)\r
-this._paintLine(lineRow, i);\r
-}\r
-},\r
-\r
-_paintLine: function(lineRow, lineNumber)\r
-{\r
-var element = lineRow.lastChild;\r
-var highlight = this._textModel.getAttribute(lineNumber, "highlight");\r
-if (!highlight) {\r
-if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)\r
-this._markedRangeElement = highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);\r
-return;\r
-}\r
-\r
-element.removeChildren();\r
-var line = this._textModel.line(lineNumber);\r
-\r
-var plainTextStart = -1;\r
-for (var j = 0; j < line.length;) {\r
-if (j > 1000) {\r
-\r
-if (plainTextStart === -1)\r
-plainTextStart = j;\r
-break;\r
-}\r
-var attribute = highlight[j];\r
-if (!attribute || !attribute.tokenType) {\r
-if (plainTextStart === -1)\r
-plainTextStart = j;\r
-j++;\r
-} else {\r
-if (plainTextStart !== -1) {\r
-this._appendTextNode(element, line.substring(plainTextStart, j));\r
-plainTextStart = -1;\r
-}\r
-this._appendSpan(element, line.substring(j, j + attribute.length), attribute.tokenType);\r
-j += attribute.length;\r
-}\r
-}\r
-if (plainTextStart !== -1)\r
-this._appendTextNode(element, line.substring(plainTextStart, line.length));\r
-if (this._rangeToMark && this._rangeToMark.startLine === lineNumber)\r
-this._markedRangeElement = highlightSearchResult(element, this._rangeToMark.startColumn, this._rangeToMark.endColumn - this._rangeToMark.startColumn);\r
-if (lineRow.decorationsElement)\r
-element.appendChild(lineRow.decorationsElement);\r
-},\r
-\r
-_releaseLinesHighlight: function(fromLine, toLine)\r
-{\r
-for (var i = fromLine; i < toLine; ++i) {\r
-var lineRow = this._textModel.getAttribute(i, "line-row");\r
-if (!lineRow)\r
-continue;\r
-var element = lineRow.lastChild;\r
-if ("spans" in element) {\r
-var spans = element.spans;\r
-for (var j = 0; j < spans.length; ++j)\r
-this._cachedSpans.push(spans[j]);\r
-delete element.spans;\r
-}\r
-if ("textNodes" in element) {\r
-var textNodes = element.textNodes;\r
-for (var j = 0; j < textNodes.length; ++j)\r
-this._cachedTextNodes.push(textNodes[j]);\r
-delete element.textNodes;\r
-}\r
-}\r
-},\r
-\r
-_getSelection: function()\r
-{\r
-var selection = window.getSelection();\r
-if (selection.isCollapsed)\r
-return null;\r
-var selectionRange = selection.getRangeAt(0);\r
-\r
-if (!this.element.isAncestor(selectionRange.startContainer) || !this.element.isAncestor(selectionRange.endContainer))\r
-return null;\r
-var start = this._selectionToPosition(selectionRange.startContainer, selectionRange.startOffset);\r
-var end = this._selectionToPosition(selectionRange.endContainer, selectionRange.endOffset);\r
-return new WebInspector.TextRange(start.line, start.column, end.line, end.column);\r
-},\r
-\r
-_restoreSelection: function(range)\r
-{\r
-if (!range)\r
-return;\r
-var startRow = this._textModel.getAttribute(range.startLine, "line-row");\r
-if (startRow)\r
-var start = startRow.lastChild.rangeBoundaryForOffset(range.startColumn);\r
-else {\r
-var offset = range.startColumn;\r
-var chunkNumber = this._chunkNumberForLine(range.startLine);\r
-for (var i = this._chunkStartLine(chunkNumber); i < range.startLine; ++i)\r
-offset += this._textModel.line(i).length + 1; \r
-var lineCell = this._textChunks[chunkNumber].element.lastChild;\r
-if (lineCell.firstChild)\r
-var start = { container: lineCell.firstChild, offset: offset };\r
-else\r
-var start = { container: lineCell, offset: 0 };\r
-}\r
-\r
-var endRow = this._textModel.getAttribute(range.endLine, "line-row");\r
-if (endRow)\r
-var end = endRow.lastChild.rangeBoundaryForOffset(range.endColumn);\r
-else {\r
-var offset = range.endColumn;\r
-var chunkNumber = this._chunkNumberForLine(range.endLine);\r
-for (var i = this._chunkStartLine(chunkNumber); i < range.endLine; ++i)\r
-offset += this._textModel.line(i).length + 1; \r
-var lineCell = this._textChunks[chunkNumber].element.lastChild;\r
-if (lineCell.firstChild)\r
-var end = { container: lineCell.firstChild, offset: offset };\r
-else\r
-var end = { container: lineCell, offset: 0 };\r
-}\r
-\r
-var selectionRange = document.createRange();\r
-selectionRange.setStart(start.container, start.offset);\r
-selectionRange.setEnd(end.container, end.offset);\r
-\r
-var selection = window.getSelection();\r
-selection.removeAllRanges();\r
-selection.addRange(selectionRange);\r
-},\r
-\r
-_selectionToPosition: function(container, offset)\r
-{\r
-if (container === this.element && offset === 0)\r
-return { line: 0, column: 0 };\r
-if (container === this.element && offset === 1)\r
-return { line: this._textModel.linesCount - 1, column: this._textModel.lineLength(this._textModel.linesCount - 1) };\r
-\r
-var lineRow = container.enclosingNodeOrSelfWithNodeName("tr");\r
-var lineNumber = lineRow.lineNumber;\r
-if (container.nodeName === "TD" && offset === 0)\r
-return { line: lineNumber, column: 0 };\r
-if (container.nodeName === "TD" && offset === 1)\r
-return { line: lineNumber, column: this._textModel.lineLength(lineNumber) };\r
-\r
-var column = 0;\r
-var node = lineRow.lastChild.traverseNextTextNode(lineRow.lastChild);\r
-while (node && node !== container) {\r
-column += node.textContent.length;\r
-node = node.traverseNextTextNode(lineRow.lastChild);\r
-}\r
-\r
-\r
-if (node === container && offset) {\r
-var text = node.textContent;\r
-for (var i = 0; i < offset; ++i) {\r
-if (text.charAt(i) === "\n") {\r
-lineNumber++;\r
-column = 0;\r
-} else\r
-column++;\r
-}\r
-}\r
-return { line: lineNumber, column: column };\r
-},\r
-\r
-_appendSpan: function(element, content, className)\r
-{\r
-if (className === "html-resource-link" || className === "html-external-link") {\r
-element.appendChild(this._createLink(content, className === "html-external-link"));\r
-return;\r
-}\r
-\r
-var span = this._cachedSpans.pop() || document.createElement("span");\r
-span.className = "webkit-" + className;\r
-span.textContent = content;\r
-element.appendChild(span);\r
-if (!("spans" in element))\r
-element.spans = [];\r
-element.spans.push(span);\r
-},\r
-\r
-_appendTextNode: function(element, text)\r
-{\r
-var textNode = this._cachedTextNodes.pop();\r
-if (textNode) {\r
-textNode.nodeValue = text;\r
-} else\r
-textNode = document.createTextNode(text);\r
-element.appendChild(textNode);\r
-if (!("textNodes" in element))\r
-element.textNodes = [];\r
-element.textNodes.push(textNode);\r
-},\r
-\r
-_createLink: function(content, isExternal)\r
-{\r
-var quote = content.charAt(0);\r
-if (content.length > 1 && (quote === "\"" ||   quote === "'"))\r
-content = content.substring(1, content.length - 1);\r
-else\r
-quote = null;\r
-\r
-var a = WebInspector.linkifyURLAsNode(this._rewriteHref(content), content, null, isExternal);\r
-var span = document.createElement("span");\r
-span.className = "webkit-html-attribute-value";\r
-if (quote)\r
-span.appendChild(document.createTextNode(quote));\r
-span.appendChild(a);\r
-if (quote)\r
-span.appendChild(document.createTextNode(quote));\r
-return span;\r
-},\r
-\r
-_rewriteHref: function(hrefValue, isExternal)\r
-{\r
-if (!this._url || !hrefValue || hrefValue.indexOf("://") > 0)\r
-return hrefValue;\r
-return WebInspector.completeURL(this._url, hrefValue);\r
-},\r
-\r
-resize: function()\r
-{\r
-this._repaintAll();\r
-}\r
-}\r
-\r
-var cachedSpans = [];\r
-\r
-WebInspector.TextChunk = function(textViewer, startLine, endLine)\r
-{\r
-this._textViewer = textViewer;\r
-this.element = document.createElement("tr");\r
-this._textModel = textViewer._textModel;\r
-this.element.chunk = this;\r
-this.element.lineNumber = startLine;\r
-\r
-this.startLine = startLine;\r
-endLine = Math.min(this._textModel.linesCount, endLine);\r
-this.linesCount = endLine - startLine;\r
-\r
-this._lineNumberElement = document.createElement("td");\r
-this._lineNumberElement.className = "webkit-line-number";\r
-this.element.appendChild(this._lineNumberElement);\r
-\r
-this._lineContentElement = document.createElement("td");\r
-this._lineContentElement.className = "webkit-line-content";\r
-this.element.appendChild(this._lineContentElement);\r
-\r
-this._expanded = false;\r
-\r
-var lineNumbers = [];\r
-var lines = [];\r
-for (var i = startLine; i < endLine; ++i) {\r
-lineNumbers.push(i + 1);\r
-lines.push(this._textModel.line(i));\r
-}\r
-if (this.linesCount === 1) {\r
-\r
-\r
-var innerSpan = document.createElement("span");\r
-innerSpan.className = "webkit-line-number-inner";\r
-innerSpan.textContent = startLine + 1;\r
-var outerSpan = document.createElement("div");\r
-outerSpan.className = "webkit-line-number-outer";\r
-outerSpan.appendChild(innerSpan);\r
-this._lineNumberElement.appendChild(outerSpan);\r
-} else\r
-this._lineNumberElement.textContent = lineNumbers.join("\n");\r
-this._lineContentElement.textContent = lines.join("\n");\r
-}\r
-\r
-WebInspector.TextChunk.prototype = {\r
-addDecoration: function(decoration)\r
-{\r
-if (typeof decoration === "string") {\r
-this.element.addStyleClass(decoration);\r
-return;\r
-}\r
-if (!this.element.decorationsElement) {\r
-this.element.decorationsElement = document.createElement("div");\r
-this._lineContentElement.appendChild(this.element.decorationsElement);\r
-}\r
-this.element.decorationsElement.appendChild(decoration);\r
-},\r
-\r
-removeDecoration: function(decoration)\r
-{\r
-if (typeof decoration === "string") {\r
-this.element.removeStyleClass(decoration);\r
-return;\r
-}\r
-if (!this.element.decorationsElement)\r
-return;\r
-this.element.decorationsElement.removeChild(decoration);\r
-},\r
-\r
-get expanded()\r
-{\r
-return this._expanded;\r
-},\r
-\r
-set expanded(expanded)\r
-{\r
-if (this._expanded === expanded)\r
-return;\r
-\r
-this._expanded = expanded;\r
-\r
-if (this.linesCount === 1) {\r
-this._textModel.setAttribute(this.startLine, "line-row", this.element);\r
-if (expanded)\r
-this._textViewer._paintLines(this.startLine, this.startLine + 1);\r
-return;\r
-}\r
-\r
-if (expanded) {\r
-var parentElement = this.element.parentElement;\r
-for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {\r
-var lineRow = this._createRow(i);\r
-this._textModel.setAttribute(i, "line-row", lineRow);\r
-parentElement.insertBefore(lineRow, this.element);\r
-}\r
-parentElement.removeChild(this.element);\r
-\r
-this._textViewer._paintLines(this.startLine, this.startLine + this.linesCount);\r
-} else {\r
-var firstLine = this._textModel.getAttribute(this.startLine, "line-row");\r
-var parentElement = firstLine.parentElement;\r
-this._textViewer._releaseLinesHighlight(this.startLine, this.startLine + this.linesCount);\r
-\r
-parentElement.insertBefore(this.element, firstLine);\r
-for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {\r
-var lineRow = this._textModel.getAttribute(i, "line-row");\r
-this._textModel.removeAttribute(i, "line-row");\r
-this._textViewer._cachedRows.push(lineRow);\r
-parentElement.removeChild(lineRow);\r
-}\r
-}\r
-},\r
-\r
-get height()\r
-{\r
-if (!this._expanded)\r
-return this.element.offsetHeight;\r
-var result = 0;\r
-for (var i = this.startLine; i < this.startLine + this.linesCount; ++i) {\r
-var lineRow = this._textModel.getAttribute(i, "line-row");\r
-result += lineRow.offsetHeight;\r
-}\r
-return result;\r
-},\r
-\r
-_createRow: function(lineNumber)\r
-{\r
-var cachedRows = this._textViewer._cachedRows;\r
-if (cachedRows.length) {\r
-var lineRow = cachedRows[cachedRows.length - 1];\r
-cachedRows.length--;\r
-var lineNumberElement = lineRow.firstChild;\r
-var lineContentElement = lineRow.lastChild;\r
-} else {\r
-var lineRow = document.createElement("tr");\r
-\r
-var lineNumberElement = document.createElement("td");\r
-lineNumberElement.className = "webkit-line-number";\r
-lineRow.appendChild(lineNumberElement);\r
-\r
-var lineContentElement = document.createElement("td");\r
-lineContentElement.className = "webkit-line-content";\r
-lineRow.appendChild(lineContentElement);        \r
-}\r
-lineRow.lineNumber = lineNumber;\r
-lineNumberElement.textContent = lineNumber + 1;\r
-lineContentElement.textContent = this._textModel.line(lineNumber);\r
-return lineRow;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SourceTokenizer = function()\r
-{\r
-}\r
-\r
-WebInspector.SourceTokenizer.prototype = {\r
-set line(line) {\r
-this._line = line;\r
-},\r
-\r
-set condition(condition)\r
-{\r
-this._condition = condition;\r
-},\r
-\r
-get condition()\r
-{\r
-return this._condition;\r
-},\r
-\r
-get subTokenizer()\r
-{\r
-return this._condition.subTokenizer;\r
-},\r
-\r
-getLexCondition: function()\r
-{\r
-return this.condition.lexCondition;\r
-},\r
-\r
-setLexCondition: function(lexCondition)\r
-{\r
-this.condition.lexCondition = lexCondition;\r
-},\r
-\r
-_charAt: function(cursor)\r
-{\r
-return cursor < this._line.length ? this._line.charAt(cursor) : "\n";\r
-}\r
-}\r
-\r
-\r
-WebInspector.SourceTokenizer.Registry = function() {\r
-this._tokenizers = {};\r
-this._tokenizerConstructors = {\r
-"text/css": "SourceCSSTokenizer",\r
-"text/html": "SourceHTMLTokenizer",\r
-"text/javascript": "SourceJavaScriptTokenizer"\r
-};\r
-}\r
-\r
-WebInspector.SourceTokenizer.Registry.getInstance = function()\r
-{\r
-if (!WebInspector.SourceTokenizer.Registry._instance)\r
-WebInspector.SourceTokenizer.Registry._instance = new WebInspector.SourceTokenizer.Registry();\r
-return WebInspector.SourceTokenizer.Registry._instance;\r
-}\r
-\r
-WebInspector.SourceTokenizer.Registry.prototype = {\r
-getTokenizer: function(mimeType)\r
-{\r
-if (!this._tokenizerConstructors[mimeType])\r
-return null;\r
-var tokenizerClass = this._tokenizerConstructors[mimeType];\r
-var tokenizer = this._tokenizers[tokenizerClass];\r
-if (!tokenizer) {\r
-tokenizer = new WebInspector[tokenizerClass]();\r
-this._tokenizers[mimeType] = tokenizer;\r
-}\r
-return tokenizer;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SourceCSSTokenizer = function()\r
-{\r
-WebInspector.SourceTokenizer.call(this);\r
-\r
-this._propertyKeywords = WebInspector.cssNameCompletions.keySet();\r
-\r
-this._valueKeywords = [\r
-"above", "absolute", "activeborder", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll",\r
-"alternate", "always","amharic", "amharic-abegede", "antialiased", "appworkspace", "aqua", "arabic-indic", "armenian", "asterisks",\r
-"auto", "avoid", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "black", "blink",\r
-"block", "block-axis", "blue", "bold", "bolder", "border", "border-box", "both", "bottom", "break-all", "break-word", "button",\r
-"button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", "capitalize", "caps-lock-indicator",\r
-"caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic",\r
-"clear", "clip", "close-quote", "col-resize", "collapse", "compact", "condensed", "contain", "content", "content-box", "context-menu",\r
-"continuous", "copy", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", "decimal-leading-zero", "default",\r
-"default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "document",\r
-"dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element",\r
-"ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez",\r
-"ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et",\r
-"ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et",\r
-"ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ew-resize", "expanded",\r
-"extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes", "forwards", "from", "fuchsia", "geometricPrecision",\r
-"georgian", "gray", "graytext", "green", "grey", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help",\r
-"hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore",\r
-"inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline",\r
-"inline-axis", "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "kannada", "katakana",\r
-"katakana-iroha", "khmer", "landscape", "lao", "large", "larger", "left", "level", "lighter", "lime", "line-through", "linear", "lines",\r
-"list-button", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek",\r
-"lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "maroon", "match", "media-controls-background",\r
-"media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button",\r
-"media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display",\r
-"media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button",\r
-"menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple",\r
-"myanmar", "n-resize", "narrower", "navy", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none",\r
-"normal", "not-allowed", "nowrap", "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "olive", "open-quote", "optimizeLegibility",\r
-"optimizeSpeed", "orange", "oriya", "oromo", "outset", "outside", "overlay", "overline", "padding", "padding-box", "painted", "paused",\r
-"persian", "plus-darker", "plus-lighter", "pointer", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "purple",\r
-"push-button", "radio", "read-only", "read-write", "read-write-plaintext-only", "red", "relative", "repeat", "repeat-x",\r
-"repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", "s-resize", "sans-serif",\r
-"scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",\r
-"searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "silver", "single",\r
-"skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",\r
-"small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over",\r
-"space", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super",\r
-"sw-resize", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group",\r
-"table-row", "table-row-group", "teal", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin",\r
-"threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede",\r
-"tigrinya-et", "tigrinya-et-abegede", "to", "top", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian",\r
-"upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "vertical", "vertical-text", "visible",\r
-"visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "white", "wider", "window", "windowframe", "windowtext",\r
-"x-large", "x-small", "xor", "xx-large", "xx-small", "yellow", "-wap-marquee", "-webkit-activelink", "-webkit-auto", "-webkit-baseline-middle",\r
-"-webkit-body", "-webkit-box", "-webkit-center", "-webkit-control", "-webkit-focus-ring-color", "-webkit-grab", "-webkit-grabbing",\r
-"-webkit-gradient", "-webkit-inline-box", "-webkit-left", "-webkit-link", "-webkit-marquee", "-webkit-mini-control", "-webkit-nowrap", "-webkit-right",\r
-"-webkit-small-control", "-webkit-text", "-webkit-xxx-large", "-webkit-zoom-in", "-webkit-zoom-out",\r
-].keySet();\r
-\r
-this._mediaTypes = ["all", "aural", "braille", "embossed", "handheld", "import", "print", "projection", "screen", "tty", "tv"].keySet();\r
-\r
-this._lexConditions = {\r
-INITIAL: 0,\r
-COMMENT: 1,\r
-DSTRING: 2,\r
-SSTRING: 3\r
-};\r
-\r
-this._parseConditions = {\r
-INITIAL: 0,\r
-PROPERTY: 1,\r
-PROPERTY_VALUE: 2,\r
-AT_RULE: 3\r
-};\r
-\r
-this.case_INITIAL = 1000;\r
-this.case_COMMENT = 1002;\r
-this.case_DSTRING = 1003;\r
-this.case_SSTRING = 1004;\r
-\r
-this.initialCondition = { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL }\r
-}\r
-\r
-WebInspector.SourceCSSTokenizer.prototype = {\r
-_stringToken: function(cursor, stringEnds)\r
-{\r
-if (this._isPropertyValue())\r
-this.tokenType = "css-string";\r
-else\r
-this.tokenType = null;\r
-return cursor;\r
-},\r
-\r
-_isPropertyValue: function()\r
-{\r
-return this._condition.parseCondition === this._parseConditions.PROPERTY_VALUE || this._condition.parseCondition === this._parseConditions.AT_RULE;\r
-},\r
-\r
-nextToken: function(cursor)\r
-{\r
-var cursorOnEnter = cursor;\r
-var gotoCase = 1;\r
-while (1) {\r
-switch (gotoCase)\r
-\r
-\r
-{\r
-case 1: var yych;\r
-var yyaccept = 0;\r
-if (this.getLexCondition() < 2) {\r
-if (this.getLexCondition() < 1) {\r
-{ gotoCase = this.case_INITIAL; continue; };\r
-} else {\r
-{ gotoCase = this.case_COMMENT; continue; };\r
-}\r
-} else {\r
-if (this.getLexCondition() < 3) {\r
-{ gotoCase = this.case_DSTRING; continue; };\r
-} else {\r
-{ gotoCase = this.case_SSTRING; continue; };\r
-}\r
-}\r
-\r
-case this.case_COMMENT:\r
-\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 4; continue; };\r
-{ gotoCase = 3; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 4; continue; };\r
-if (yych == '*') { gotoCase = 6; continue; };\r
-{ gotoCase = 3; continue; };\r
-}\r
-case 2:\r
-{ this.tokenType = "css-comment"; return cursor; }\r
-case 3:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 12; continue; };\r
-case 4:\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 6:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '*') { gotoCase = 9; continue; };\r
-if (yych != '/') { gotoCase = 11; continue; };\r
-case 7:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-{ this.tokenType = "css-comment"; return cursor; }\r
-case 9:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '*') { gotoCase = 9; continue; };\r
-if (yych == '/') { gotoCase = 7; continue; };\r
-case 11:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 12:\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 2; continue; };\r
-{ gotoCase = 11; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 2; continue; };\r
-if (yych == '*') { gotoCase = 9; continue; };\r
-{ gotoCase = 11; continue; };\r
-}\r
-\r
-case this.case_DSTRING:\r
-yych = this._charAt(cursor);\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 17; continue; };\r
-if (yych <= '\f') { gotoCase = 16; continue; };\r
-{ gotoCase = 17; continue; };\r
-} else {\r
-if (yych <= '"') {\r
-if (yych <= '!') { gotoCase = 16; continue; };\r
-{ gotoCase = 19; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 21; continue; };\r
-{ gotoCase = 16; continue; };\r
-}\r
-}\r
-case 15:\r
-{ return this._stringToken(cursor); }\r
-case 16:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 23; continue; };\r
-case 17:\r
-++cursor;\r
-case 18:\r
-{ this.tokenType = null; return cursor; }\r
-case 19:\r
-++cursor;\r
-case 20:\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-{ return this._stringToken(cursor, true); }\r
-case 21:\r
-yych = this._charAt(++cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 22; continue; };\r
-if (yych <= '&') { gotoCase = 18; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '[') { gotoCase = 18; continue; };\r
-} else {\r
-if (yych != 'b') { gotoCase = 18; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych >= 'g') { gotoCase = 18; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 22; continue; };\r
-if (yych <= 'q') { gotoCase = 18; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych <= 's') { gotoCase = 18; continue; };\r
-} else {\r
-if (yych != 'v') { gotoCase = 18; continue; };\r
-}\r
-}\r
-}\r
-case 22:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 23:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 15; continue; };\r
-if (yych <= '\f') { gotoCase = 22; continue; };\r
-{ gotoCase = 15; continue; };\r
-} else {\r
-if (yych <= '"') {\r
-if (yych <= '!') { gotoCase = 22; continue; };\r
-{ gotoCase = 26; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 22; continue; };\r
-}\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 22; continue; };\r
-if (yych >= '\'') { gotoCase = 22; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych >= '\\') { gotoCase = 22; continue; };\r
-} else {\r
-if (yych == 'b') { gotoCase = 22; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych <= 'f') { gotoCase = 22; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 22; continue; };\r
-if (yych >= 'r') { gotoCase = 22; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych >= 't') { gotoCase = 22; continue; };\r
-} else {\r
-if (yych == 'v') { gotoCase = 22; continue; };\r
-}\r
-}\r
-}\r
-cursor = YYMARKER;\r
-{ gotoCase = 15; continue; };\r
-case 26:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-{ gotoCase = 20; continue; };\r
-\r
-case this.case_INITIAL:\r
-yych = this._charAt(cursor);\r
-if (yych <= ';') {\r
-if (yych <= '\'') {\r
-if (yych <= '"') {\r
-if (yych <= ' ') { gotoCase = 29; continue; };\r
-if (yych <= '!') { gotoCase = 31; continue; };\r
-{ gotoCase = 33; continue; };\r
-} else {\r
-if (yych == '$') { gotoCase = 31; continue; };\r
-if (yych >= '\'') { gotoCase = 34; continue; };\r
-}\r
-} else {\r
-if (yych <= '.') {\r
-if (yych <= ',') { gotoCase = 29; continue; };\r
-if (yych <= '-') { gotoCase = 35; continue; };\r
-{ gotoCase = 36; continue; };\r
-} else {\r
-if (yych <= '/') { gotoCase = 37; continue; };\r
-if (yych <= '9') { gotoCase = 38; continue; };\r
-if (yych <= ':') { gotoCase = 40; continue; };\r
-{ gotoCase = 42; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '^') {\r
-if (yych <= '?') {\r
-if (yych == '=') { gotoCase = 31; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 29; continue; };\r
-if (yych <= ']') { gotoCase = 31; continue; };\r
-}\r
-} else {\r
-if (yych <= 'z') {\r
-if (yych != '`') { gotoCase = 31; continue; };\r
-} else {\r
-if (yych <= '{') { gotoCase = 44; continue; };\r
-if (yych == '}') { gotoCase = 46; continue; };\r
-}\r
-}\r
-}\r
-case 29:\r
-++cursor;\r
-case 30:\r
-{ this.tokenType = null; return cursor; }\r
-case 31:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-{ gotoCase = 49; continue; };\r
-case 32:\r
-{\r
-var token = this._line.substring(cursorOnEnter, cursor);\r
-if (this._condition.parseCondition === this._parseConditions.INITIAL) {\r
-if (token === "@import" || token === "@media") {\r
-this.tokenType = "css-at-rule";\r
-this._condition.parseCondition = this._parseConditions.AT_RULE;\r
-} else if (token.indexOf("@") === 0)\r
-this.tokenType = "css-at-rule";\r
-else\r
-this.tokenType = "css-selector";\r
-}\r
-else if (this._condition.parseCondition === this._parseConditions.AT_RULE && token in this._mediaTypes)\r
-this.tokenType = "css-keyword";\r
-else if (this._condition.parseCondition === this._parseConditions.PROPERTY && token in this._propertyKeywords)\r
-this.tokenType = "css-property";\r
-else if (this._isPropertyValue() && token in this._valueKeywords)\r
-this.tokenType = "css-keyword";\r
-else if (token === "!important")\r
-this.tokenType = "css-important";\r
-else\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-case 33:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '-') {\r
-if (yych <= '!') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 32; continue; };\r
-{ gotoCase = 124; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 32; continue; };\r
-if (yych <= ' ') { gotoCase = 124; continue; };\r
-{ gotoCase = 122; continue; };\r
-}\r
-} else {\r
-if (yych <= '$') {\r
-if (yych <= '"') { gotoCase = 114; continue; };\r
-if (yych <= '#') { gotoCase = 124; continue; };\r
-{ gotoCase = 122; continue; };\r
-} else {\r
-if (yych == '\'') { gotoCase = 122; continue; };\r
-if (yych <= ',') { gotoCase = 124; continue; };\r
-{ gotoCase = 122; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= '<') {\r
-if (yych <= '.') { gotoCase = 124; continue; };\r
-if (yych <= '9') { gotoCase = 122; continue; };\r
-{ gotoCase = 124; continue; };\r
-} else {\r
-if (yych <= '=') { gotoCase = 122; continue; };\r
-if (yych <= '?') { gotoCase = 124; continue; };\r
-{ gotoCase = 122; continue; };\r
-}\r
-} else {\r
-if (yych <= '^') {\r
-if (yych <= '\\') { gotoCase = 126; continue; };\r
-if (yych <= ']') { gotoCase = 122; continue; };\r
-{ gotoCase = 124; continue; };\r
-} else {\r
-if (yych == '`') { gotoCase = 124; continue; };\r
-if (yych <= 'z') { gotoCase = 122; continue; };\r
-{ gotoCase = 124; continue; };\r
-}\r
-}\r
-}\r
-case 34:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '-') {\r
-if (yych <= '"') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 32; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 32; continue; };\r
-if (yych <= ' ') { gotoCase = 116; continue; };\r
-{ gotoCase = 112; continue; };\r
-}\r
-} else {\r
-if (yych <= '&') {\r
-if (yych == '$') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych <= '\'') { gotoCase = 114; continue; };\r
-if (yych <= ',') { gotoCase = 116; continue; };\r
-{ gotoCase = 112; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= '<') {\r
-if (yych <= '.') { gotoCase = 116; continue; };\r
-if (yych <= '9') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych <= '=') { gotoCase = 112; continue; };\r
-if (yych <= '?') { gotoCase = 116; continue; };\r
-{ gotoCase = 112; continue; };\r
-}\r
-} else {\r
-if (yych <= '^') {\r
-if (yych <= '\\') { gotoCase = 118; continue; };\r
-if (yych <= ']') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych == '`') { gotoCase = 116; continue; };\r
-if (yych <= 'z') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-}\r
-}\r
-}\r
-case 35:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '.') { gotoCase = 65; continue; };\r
-if (yych <= '/') { gotoCase = 49; continue; };\r
-if (yych <= '9') { gotoCase = 50; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 36:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 30; continue; };\r
-if (yych <= '9') { gotoCase = 68; continue; };\r
-{ gotoCase = 30; continue; };\r
-case 37:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '*') { gotoCase = 104; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 38:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-switch (yych) {\r
-case '!':\r
-case '"':\r
-case '$':\r
-case '\'':\r
-case '-':\r
-case '/':\r
-case '=':\r
-case '@':\r
-case 'A':\r
-case 'B':\r
-case 'C':\r
-case 'D':\r
-case 'E':\r
-case 'F':\r
-case 'G':\r
-case 'I':\r
-case 'J':\r
-case 'K':\r
-case 'L':\r
-case 'M':\r
-case 'N':\r
-case 'O':\r
-case 'P':\r
-case 'Q':\r
-case 'R':\r
-case 'S':\r
-case 'T':\r
-case 'U':\r
-case 'V':\r
-case 'W':\r
-case 'X':\r
-case 'Y':\r
-case 'Z':\r
-case '[':\r
-case ']':\r
-case 'a':\r
-case 'b':\r
-case 'f':\r
-case 'h':\r
-case 'j':\r
-case 'l':\r
-case 'n':\r
-case 'o':\r
-case 'q':\r
-case 'u':\r
-case 'v':\r
-case 'w':\r
-case 'x':\r
-case 'y':\r
-case 'z':    { gotoCase = 48; continue; };\r
-case '%':    { gotoCase = 67; continue; };\r
-case '.':    { gotoCase = 65; continue; };\r
-case '0':\r
-case '1':\r
-case '2':\r
-case '3':\r
-case '4':\r
-case '5':\r
-case '6':\r
-case '7':\r
-case '8':\r
-case '9':    { gotoCase = 50; continue; };\r
-case 'H':    { gotoCase = 52; continue; };\r
-case '_':    { gotoCase = 53; continue; };\r
-case 'c':    { gotoCase = 54; continue; };\r
-case 'd':    { gotoCase = 55; continue; };\r
-case 'e':    { gotoCase = 56; continue; };\r
-case 'g':    { gotoCase = 57; continue; };\r
-case 'i':    { gotoCase = 58; continue; };\r
-case 'k':    { gotoCase = 59; continue; };\r
-case 'm':    { gotoCase = 60; continue; };\r
-case 'p':    { gotoCase = 61; continue; };\r
-case 'r':    { gotoCase = 62; continue; };\r
-case 's':    { gotoCase = 63; continue; };\r
-case 't':    { gotoCase = 64; continue; };\r
-default:    { gotoCase = 39; continue; };\r
-}\r
-case 39:\r
-{\r
-if (this._isPropertyValue())\r
-this.tokenType = "css-number";\r
-else\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-case 40:\r
-++cursor;\r
-{\r
-this.tokenType = null;\r
-if (this._condition.parseCondition === this._parseConditions.PROPERTY)\r
-this._condition.parseCondition = this._parseConditions.PROPERTY_VALUE;\r
-return cursor;\r
-}\r
-case 42:\r
-++cursor;\r
-{\r
-this.tokenType = null;\r
-if (this._condition.parseCondition === this._parseConditions.AT_RULE)\r
-this._condition.parseCondition = this._parseConditions.INITIAL;\r
-else\r
-this._condition.parseCondition = this._parseConditions.PROPERTY;\r
-return cursor;\r
-}\r
-case 44:\r
-++cursor;\r
-{\r
-this.tokenType = null;\r
-if (this._condition.parseCondition === this._parseConditions.AT_RULE)\r
-this._condition.parseCondition = this._parseConditions.INITIAL;\r
-else\r
-this._condition.parseCondition = this._parseConditions.PROPERTY;\r
-return cursor;\r
-}\r
-case 46:\r
-++cursor;\r
-{\r
-this.tokenType = null;\r
-this._condition.parseCondition = this._parseConditions.INITIAL;\r
-return cursor;\r
-}\r
-case 48:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 49:\r
-if (yych <= '9') {\r
-if (yych <= '&') {\r
-if (yych <= '"') {\r
-if (yych <= ' ') { gotoCase = 32; continue; };\r
-{ gotoCase = 48; continue; };\r
-} else {\r
-if (yych == '$') { gotoCase = 48; continue; };\r
-{ gotoCase = 32; continue; };\r
-}\r
-} else {\r
-if (yych <= ',') {\r
-if (yych <= '\'') { gotoCase = 48; continue; };\r
-{ gotoCase = 32; continue; };\r
-} else {\r
-if (yych == '.') { gotoCase = 32; continue; };\r
-{ gotoCase = 48; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '=') {\r
-if (yych <= '<') { gotoCase = 32; continue; };\r
-{ gotoCase = 48; continue; };\r
-} else {\r
-if (yych <= '?') { gotoCase = 32; continue; };\r
-if (yych <= '[') { gotoCase = 48; continue; };\r
-{ gotoCase = 32; continue; };\r
-}\r
-} else {\r
-if (yych <= '_') {\r
-if (yych == '^') { gotoCase = 32; continue; };\r
-{ gotoCase = 48; continue; };\r
-} else {\r
-if (yych <= '`') { gotoCase = 32; continue; };\r
-if (yych <= 'z') { gotoCase = 48; continue; };\r
-{ gotoCase = 32; continue; };\r
-}\r
-}\r
-}\r
-case 50:\r
-yyaccept = 1;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-switch (yych) {\r
-case '!':\r
-case '"':\r
-case '$':\r
-case '\'':\r
-case '-':\r
-case '/':\r
-case '=':\r
-case '@':\r
-case 'A':\r
-case 'B':\r
-case 'C':\r
-case 'D':\r
-case 'E':\r
-case 'F':\r
-case 'G':\r
-case 'I':\r
-case 'J':\r
-case 'K':\r
-case 'L':\r
-case 'M':\r
-case 'N':\r
-case 'O':\r
-case 'P':\r
-case 'Q':\r
-case 'R':\r
-case 'S':\r
-case 'T':\r
-case 'U':\r
-case 'V':\r
-case 'W':\r
-case 'X':\r
-case 'Y':\r
-case 'Z':\r
-case '[':\r
-case ']':\r
-case 'a':\r
-case 'b':\r
-case 'f':\r
-case 'h':\r
-case 'j':\r
-case 'l':\r
-case 'n':\r
-case 'o':\r
-case 'q':\r
-case 'u':\r
-case 'v':\r
-case 'w':\r
-case 'x':\r
-case 'y':\r
-case 'z':    { gotoCase = 48; continue; };\r
-case '%':    { gotoCase = 67; continue; };\r
-case '.':    { gotoCase = 65; continue; };\r
-case '0':\r
-case '1':\r
-case '2':\r
-case '3':\r
-case '4':\r
-case '5':\r
-case '6':\r
-case '7':\r
-case '8':\r
-case '9':    { gotoCase = 50; continue; };\r
-case 'H':    { gotoCase = 52; continue; };\r
-case '_':    { gotoCase = 53; continue; };\r
-case 'c':    { gotoCase = 54; continue; };\r
-case 'd':    { gotoCase = 55; continue; };\r
-case 'e':    { gotoCase = 56; continue; };\r
-case 'g':    { gotoCase = 57; continue; };\r
-case 'i':    { gotoCase = 58; continue; };\r
-case 'k':    { gotoCase = 59; continue; };\r
-case 'm':    { gotoCase = 60; continue; };\r
-case 'p':    { gotoCase = 61; continue; };\r
-case 'r':    { gotoCase = 62; continue; };\r
-case 's':    { gotoCase = 63; continue; };\r
-case 't':    { gotoCase = 64; continue; };\r
-default:    { gotoCase = 39; continue; };\r
-}\r
-case 52:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'z') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 53:\r
-yych = this._charAt(++cursor);\r
-if (yych == '_') { gotoCase = 101; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 54:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 55:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'e') { gotoCase = 100; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 56:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 63; continue; };\r
-if (yych == 'x') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 57:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'r') { gotoCase = 98; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 58:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'n') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 59:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'H') { gotoCase = 97; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 60:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 63; continue; };\r
-if (yych == 's') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 61:\r
-yych = this._charAt(++cursor);\r
-if (yych <= 's') {\r
-if (yych == 'c') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-} else {\r
-if (yych <= 't') { gotoCase = 63; continue; };\r
-if (yych == 'x') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-}\r
-case 62:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'a') { gotoCase = 95; continue; };\r
-if (yych == 'e') { gotoCase = 96; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 63:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '9') {\r
-if (yych <= '&') {\r
-if (yych <= '"') {\r
-if (yych <= ' ') { gotoCase = 39; continue; };\r
-{ gotoCase = 48; continue; };\r
-} else {\r
-if (yych == '$') { gotoCase = 48; continue; };\r
-{ gotoCase = 39; continue; };\r
-}\r
-} else {\r
-if (yych <= ',') {\r
-if (yych <= '\'') { gotoCase = 48; continue; };\r
-{ gotoCase = 39; continue; };\r
-} else {\r
-if (yych == '.') { gotoCase = 39; continue; };\r
-{ gotoCase = 48; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '=') {\r
-if (yych <= '<') { gotoCase = 39; continue; };\r
-{ gotoCase = 48; continue; };\r
-} else {\r
-if (yych <= '?') { gotoCase = 39; continue; };\r
-if (yych <= '[') { gotoCase = 48; continue; };\r
-{ gotoCase = 39; continue; };\r
-}\r
-} else {\r
-if (yych <= '_') {\r
-if (yych == '^') { gotoCase = 39; continue; };\r
-{ gotoCase = 48; continue; };\r
-} else {\r
-if (yych <= '`') { gotoCase = 39; continue; };\r
-if (yych <= 'z') { gotoCase = 48; continue; };\r
-{ gotoCase = 39; continue; };\r
-}\r
-}\r
-}\r
-case 64:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'u') { gotoCase = 93; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 65:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 66; continue; };\r
-if (yych <= '9') { gotoCase = 68; continue; };\r
-case 66:\r
-cursor = YYMARKER;\r
-if (yyaccept <= 0) {\r
-{ gotoCase = 32; continue; };\r
-} else {\r
-{ gotoCase = 39; continue; };\r
-}\r
-case 67:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 39; continue; };\r
-case 68:\r
-yyaccept = 1;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'f') {\r
-if (yych <= 'H') {\r
-if (yych <= '/') {\r
-if (yych == '%') { gotoCase = 67; continue; };\r
-{ gotoCase = 39; continue; };\r
-} else {\r
-if (yych <= '9') { gotoCase = 68; continue; };\r
-if (yych <= 'G') { gotoCase = 39; continue; };\r
-{ gotoCase = 80; continue; };\r
-}\r
-} else {\r
-if (yych <= 'b') {\r
-if (yych == '_') { gotoCase = 72; continue; };\r
-{ gotoCase = 39; continue; };\r
-} else {\r
-if (yych <= 'c') { gotoCase = 74; continue; };\r
-if (yych <= 'd') { gotoCase = 77; continue; };\r
-if (yych >= 'f') { gotoCase = 39; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'm') {\r
-if (yych <= 'i') {\r
-if (yych <= 'g') { gotoCase = 78; continue; };\r
-if (yych <= 'h') { gotoCase = 39; continue; };\r
-{ gotoCase = 76; continue; };\r
-} else {\r
-if (yych == 'k') { gotoCase = 81; continue; };\r
-if (yych <= 'l') { gotoCase = 39; continue; };\r
-{ gotoCase = 75; continue; };\r
-}\r
-} else {\r
-if (yych <= 'q') {\r
-if (yych == 'p') { gotoCase = 73; continue; };\r
-{ gotoCase = 39; continue; };\r
-} else {\r
-if (yych <= 'r') { gotoCase = 71; continue; };\r
-if (yych <= 's') { gotoCase = 67; continue; };\r
-if (yych <= 't') { gotoCase = 79; continue; };\r
-{ gotoCase = 39; continue; };\r
-}\r
-}\r
-}\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 67; continue; };\r
-if (yych == 'x') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 71:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'a') { gotoCase = 91; continue; };\r
-if (yych == 'e') { gotoCase = 92; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 72:\r
-yych = this._charAt(++cursor);\r
-if (yych == '_') { gotoCase = 88; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 73:\r
-yych = this._charAt(++cursor);\r
-if (yych <= 's') {\r
-if (yych == 'c') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-} else {\r
-if (yych <= 't') { gotoCase = 67; continue; };\r
-if (yych == 'x') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-}\r
-case 74:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 75:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 67; continue; };\r
-if (yych == 's') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 76:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'n') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 77:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'e') { gotoCase = 87; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 78:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'r') { gotoCase = 85; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 79:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'u') { gotoCase = 83; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 80:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'z') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 81:\r
-yych = this._charAt(++cursor);\r
-if (yych != 'H') { gotoCase = 66; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == 'z') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 83:\r
-yych = this._charAt(++cursor);\r
-if (yych != 'r') { gotoCase = 66; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == 'n') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 85:\r
-yych = this._charAt(++cursor);\r
-if (yych != 'a') { gotoCase = 66; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == 'd') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 87:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'g') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 88:\r
-yych = this._charAt(++cursor);\r
-if (yych != 'q') { gotoCase = 66; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych != 'e') { gotoCase = 66; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 91:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'd') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 92:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 67; continue; };\r
-{ gotoCase = 66; continue; };\r
-case 93:\r
-yych = this._charAt(++cursor);\r
-if (yych != 'r') { gotoCase = 49; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == 'n') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 95:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'd') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 96:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 97:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'z') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 98:\r
-yych = this._charAt(++cursor);\r
-if (yych != 'a') { gotoCase = 49; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == 'd') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 100:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'g') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 101:\r
-yych = this._charAt(++cursor);\r
-if (yych != 'q') { gotoCase = 49; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych != 'e') { gotoCase = 49; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == 'm') { gotoCase = 63; continue; };\r
-{ gotoCase = 49; continue; };\r
-case 104:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 108; continue; };\r
-{ gotoCase = 104; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 108; continue; };\r
-if (yych != '*') { gotoCase = 104; continue; };\r
-}\r
-case 106:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '*') { gotoCase = 106; continue; };\r
-if (yych == '/') { gotoCase = 110; continue; };\r
-{ gotoCase = 104; continue; };\r
-case 108:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.COMMENT);\r
-{ this.tokenType = "css-comment"; return cursor; }\r
-case 110:\r
-++cursor;\r
-{ this.tokenType = "css-comment"; return cursor; }\r
-case 112:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '-') {\r
-if (yych <= '"') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 32; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 32; continue; };\r
-if (yych <= ' ') { gotoCase = 116; continue; };\r
-{ gotoCase = 112; continue; };\r
-}\r
-} else {\r
-if (yych <= '&') {\r
-if (yych == '$') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych <= '\'') { gotoCase = 114; continue; };\r
-if (yych <= ',') { gotoCase = 116; continue; };\r
-{ gotoCase = 112; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= '<') {\r
-if (yych <= '.') { gotoCase = 116; continue; };\r
-if (yych <= '9') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych <= '=') { gotoCase = 112; continue; };\r
-if (yych <= '?') { gotoCase = 116; continue; };\r
-{ gotoCase = 112; continue; };\r
-}\r
-} else {\r
-if (yych <= '^') {\r
-if (yych <= '\\') { gotoCase = 118; continue; };\r
-if (yych <= ']') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych == '`') { gotoCase = 116; continue; };\r
-if (yych <= 'z') { gotoCase = 112; continue; };\r
-{ gotoCase = 116; continue; };\r
-}\r
-}\r
-}\r
-case 114:\r
-++cursor;\r
-if ((yych = this._charAt(cursor)) <= '9') {\r
-if (yych <= '&') {\r
-if (yych <= '"') {\r
-if (yych >= '!') { gotoCase = 48; continue; };\r
-} else {\r
-if (yych == '$') { gotoCase = 48; continue; };\r
-}\r
-} else {\r
-if (yych <= ',') {\r
-if (yych <= '\'') { gotoCase = 48; continue; };\r
-} else {\r
-if (yych != '.') { gotoCase = 48; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '=') {\r
-if (yych >= '=') { gotoCase = 48; continue; };\r
-} else {\r
-if (yych <= '?') { gotoCase = 115; continue; };\r
-if (yych <= '[') { gotoCase = 48; continue; };\r
-}\r
-} else {\r
-if (yych <= '_') {\r
-if (yych != '^') { gotoCase = 48; continue; };\r
-} else {\r
-if (yych <= '`') { gotoCase = 115; continue; };\r
-if (yych <= 'z') { gotoCase = 48; continue; };\r
-}\r
-}\r
-}\r
-case 115:\r
-{ return this._stringToken(cursor, true); }\r
-case 116:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 66; continue; };\r
-if (yych <= '\f') { gotoCase = 116; continue; };\r
-{ gotoCase = 66; continue; };\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '&') { gotoCase = 116; continue; };\r
-{ gotoCase = 121; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 116; continue; };\r
-}\r
-}\r
-case 118:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'a') {\r
-if (yych <= '!') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 66; continue; };\r
-} else {\r
-if (yych != '\r') { gotoCase = 66; continue; };\r
-}\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '"') { gotoCase = 116; continue; };\r
-if (yych <= '&') { gotoCase = 66; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 116; continue; };\r
-{ gotoCase = 66; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'q') {\r
-if (yych <= 'f') {\r
-if (yych <= 'b') { gotoCase = 116; continue; };\r
-if (yych <= 'e') { gotoCase = 66; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych == 'n') { gotoCase = 116; continue; };\r
-{ gotoCase = 66; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych == 's') { gotoCase = 66; continue; };\r
-{ gotoCase = 116; continue; };\r
-} else {\r
-if (yych == 'v') { gotoCase = 116; continue; };\r
-{ gotoCase = 66; continue; };\r
-}\r
-}\r
-}\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.SSTRING);\r
-{ return this._stringToken(cursor); }\r
-case 121:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 115; continue; };\r
-case 122:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '-') {\r
-if (yych <= '!') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 32; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 32; continue; };\r
-if (yych >= '!') { gotoCase = 122; continue; };\r
-}\r
-} else {\r
-if (yych <= '$') {\r
-if (yych <= '"') { gotoCase = 114; continue; };\r
-if (yych >= '$') { gotoCase = 122; continue; };\r
-} else {\r
-if (yych == '\'') { gotoCase = 122; continue; };\r
-if (yych >= '-') { gotoCase = 122; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= '<') {\r
-if (yych <= '.') { gotoCase = 124; continue; };\r
-if (yych <= '9') { gotoCase = 122; continue; };\r
-} else {\r
-if (yych <= '=') { gotoCase = 122; continue; };\r
-if (yych >= '@') { gotoCase = 122; continue; };\r
-}\r
-} else {\r
-if (yych <= '^') {\r
-if (yych <= '\\') { gotoCase = 126; continue; };\r
-if (yych <= ']') { gotoCase = 122; continue; };\r
-} else {\r
-if (yych == '`') { gotoCase = 124; continue; };\r
-if (yych <= 'z') { gotoCase = 122; continue; };\r
-}\r
-}\r
-}\r
-case 124:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 66; continue; };\r
-if (yych <= '\f') { gotoCase = 124; continue; };\r
-{ gotoCase = 66; continue; };\r
-} else {\r
-if (yych <= '"') {\r
-if (yych <= '!') { gotoCase = 124; continue; };\r
-{ gotoCase = 121; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 124; continue; };\r
-}\r
-}\r
-case 126:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'a') {\r
-if (yych <= '!') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 66; continue; };\r
-} else {\r
-if (yych != '\r') { gotoCase = 66; continue; };\r
-}\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '"') { gotoCase = 124; continue; };\r
-if (yych <= '&') { gotoCase = 66; continue; };\r
-{ gotoCase = 124; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 124; continue; };\r
-{ gotoCase = 66; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'q') {\r
-if (yych <= 'f') {\r
-if (yych <= 'b') { gotoCase = 124; continue; };\r
-if (yych <= 'e') { gotoCase = 66; continue; };\r
-{ gotoCase = 124; continue; };\r
-} else {\r
-if (yych == 'n') { gotoCase = 124; continue; };\r
-{ gotoCase = 66; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych == 's') { gotoCase = 66; continue; };\r
-{ gotoCase = 124; continue; };\r
-} else {\r
-if (yych == 'v') { gotoCase = 124; continue; };\r
-{ gotoCase = 66; continue; };\r
-}\r
-}\r
-}\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.DSTRING);\r
-{ return this._stringToken(cursor); }\r
-\r
-case this.case_SSTRING:\r
-yych = this._charAt(cursor);\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 133; continue; };\r
-if (yych <= '\f') { gotoCase = 132; continue; };\r
-{ gotoCase = 133; continue; };\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '&') { gotoCase = 132; continue; };\r
-{ gotoCase = 135; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 137; continue; };\r
-{ gotoCase = 132; continue; };\r
-}\r
-}\r
-case 131:\r
-{ return this._stringToken(cursor); }\r
-case 132:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 139; continue; };\r
-case 133:\r
-++cursor;\r
-case 134:\r
-{ this.tokenType = null; return cursor; }\r
-case 135:\r
-++cursor;\r
-case 136:\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-{ return this._stringToken(cursor, true); }\r
-case 137:\r
-yych = this._charAt(++cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 138; continue; };\r
-if (yych <= '&') { gotoCase = 134; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '[') { gotoCase = 134; continue; };\r
-} else {\r
-if (yych != 'b') { gotoCase = 134; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych >= 'g') { gotoCase = 134; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 138; continue; };\r
-if (yych <= 'q') { gotoCase = 134; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych <= 's') { gotoCase = 134; continue; };\r
-} else {\r
-if (yych != 'v') { gotoCase = 134; continue; };\r
-}\r
-}\r
-}\r
-case 138:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 139:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 131; continue; };\r
-if (yych <= '\f') { gotoCase = 138; continue; };\r
-{ gotoCase = 131; continue; };\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '&') { gotoCase = 138; continue; };\r
-{ gotoCase = 142; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 138; continue; };\r
-}\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 138; continue; };\r
-if (yych >= '\'') { gotoCase = 138; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych >= '\\') { gotoCase = 138; continue; };\r
-} else {\r
-if (yych == 'b') { gotoCase = 138; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych <= 'f') { gotoCase = 138; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 138; continue; };\r
-if (yych >= 'r') { gotoCase = 138; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych >= 't') { gotoCase = 138; continue; };\r
-} else {\r
-if (yych == 'v') { gotoCase = 138; continue; };\r
-}\r
-}\r
-}\r
-cursor = YYMARKER;\r
-{ gotoCase = 131; continue; };\r
-case 142:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-{ gotoCase = 136; continue; };\r
-}\r
-\r
-}\r
-}\r
-}\r
-\r
-WebInspector.SourceCSSTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SourceHTMLTokenizer = function()\r
-{\r
-WebInspector.SourceTokenizer.call(this);\r
-\r
-\r
-this._lexConditions = {\r
-INITIAL: 0,\r
-COMMENT: 1,\r
-DOCTYPE: 2,\r
-TAG: 3,\r
-DSTRING: 4,\r
-SSTRING: 5\r
-};\r
-this.case_INITIAL = 1000;\r
-this.case_COMMENT = 1001;\r
-this.case_DOCTYPE = 1002;\r
-this.case_TAG = 1003;\r
-this.case_DSTRING = 1004;\r
-this.case_SSTRING = 1005;\r
-\r
-this._parseConditions = {\r
-INITIAL: 0,\r
-ATTRIBUTE: 1,\r
-ATTRIBUTE_VALUE: 2,\r
-LINKIFY: 4,\r
-A_NODE: 8,\r
-SCRIPT: 16\r
-};\r
-\r
-this.initialCondition = { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL };\r
-this.condition = this.initialCondition;\r
-}\r
-\r
-WebInspector.SourceHTMLTokenizer.prototype = {\r
-set line(line) {\r
-if (this._internalJavaScriptTokenizer) {\r
-var match = /<\/script/i.exec(line);\r
-if (match) {\r
-this._internalJavaScriptTokenizer.line = line.substring(0, match.index);\r
-} else\r
-this._internalJavaScriptTokenizer.line = line;\r
-}\r
-this._line = line;\r
-},\r
-\r
-_isExpectingAttribute: function()\r
-{\r
-return this._condition.parseCondition & this._parseConditions.ATTRIBUTE;\r
-},\r
-\r
-_isExpectingAttributeValue: function()\r
-{\r
-return this._condition.parseCondition & this._parseConditions.ATTRIBUTE_VALUE;\r
-},\r
-\r
-_setExpectingAttribute: function()\r
-{\r
-if (this._isExpectingAttributeValue())\r
-this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE_VALUE;\r
-this._condition.parseCondition |= this._parseConditions.ATTRIBUTE;\r
-},\r
-\r
-_setExpectingAttributeValue: function()\r
-{\r
-if (this._isExpectingAttribute())\r
-this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE;\r
-this._condition.parseCondition |= this._parseConditions.ATTRIBUTE_VALUE;\r
-},\r
-\r
-_stringToken: function(cursor, stringEnds)\r
-{\r
-if (!this._isExpectingAttributeValue()) {\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-this.tokenType = this._attrValueTokenType();\r
-if (stringEnds)\r
-this._setExpectingAttribute();\r
-return cursor;\r
-},\r
-\r
-_attrValueTokenType: function()\r
-{\r
-if (this._condition.parseCondition & this._parseConditions.LINKIFY) {\r
-if (this._condition.parseCondition & this._parseConditions.A_NODE)\r
-return "html-external-link";\r
-return "html-resource-link";\r
-}\r
-return "html-attribute-value";\r
-},\r
-\r
-nextToken: function(cursor)\r
-{\r
-if (this._internalJavaScriptTokenizer) {\r
-\r
-this.line = this._line;\r
-if (cursor !== this._internalJavaScriptTokenizer._line.length) {\r
-\r
-this._internalJavaScriptTokenizer.condition = this._condition.internalJavaScriptTokenizerCondition;\r
-var result = this._internalJavaScriptTokenizer.nextToken(cursor);\r
-this.tokenType = this._internalJavaScriptTokenizer.tokenType;\r
-this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.condition;\r
-return result;\r
-} else if (cursor !== this._line.length)\r
-delete this._internalJavaScriptTokenizer;\r
-}\r
-\r
-var cursorOnEnter = cursor;\r
-var gotoCase = 1;\r
-while (1) {\r
-switch (gotoCase)\r
-\r
-\r
-{\r
-case 1: var yych;\r
-var yyaccept = 0;\r
-if (this.getLexCondition() < 3) {\r
-if (this.getLexCondition() < 1) {\r
-{ gotoCase = this.case_INITIAL; continue; };\r
-} else {\r
-if (this.getLexCondition() < 2) {\r
-{ gotoCase = this.case_COMMENT; continue; };\r
-} else {\r
-{ gotoCase = this.case_DOCTYPE; continue; };\r
-}\r
-}\r
-} else {\r
-if (this.getLexCondition() < 4) {\r
-{ gotoCase = this.case_TAG; continue; };\r
-} else {\r
-if (this.getLexCondition() < 5) {\r
-{ gotoCase = this.case_DSTRING; continue; };\r
-} else {\r
-{ gotoCase = this.case_SSTRING; continue; };\r
-}\r
-}\r
-}\r
-\r
-case this.case_COMMENT:\r
-\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 4; continue; };\r
-{ gotoCase = 3; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 4; continue; };\r
-if (yych == '-') { gotoCase = 6; continue; };\r
-{ gotoCase = 3; continue; };\r
-}\r
-case 2:\r
-{ this.tokenType = "html-comment"; return cursor; }\r
-case 3:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 9; continue; };\r
-case 4:\r
-++cursor;\r
-case 5:\r
-{ this.tokenType = null; return cursor; }\r
-case 6:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych != '-') { gotoCase = 5; continue; };\r
-case 7:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '>') { gotoCase = 10; continue; };\r
-case 8:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 9:\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 2; continue; };\r
-{ gotoCase = 8; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 2; continue; };\r
-if (yych == '-') { gotoCase = 12; continue; };\r
-{ gotoCase = 8; continue; };\r
-}\r
-case 10:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-{ this.tokenType = "html-comment"; return cursor; }\r
-case 12:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '-') { gotoCase = 7; continue; };\r
-cursor = YYMARKER;\r
-if (yyaccept <= 0) {\r
-{ gotoCase = 2; continue; };\r
-} else {\r
-{ gotoCase = 5; continue; };\r
-}\r
-\r
-case this.case_DOCTYPE:\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 18; continue; };\r
-{ gotoCase = 17; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 18; continue; };\r
-if (yych == '>') { gotoCase = 20; continue; };\r
-{ gotoCase = 17; continue; };\r
-}\r
-case 16:\r
-{ this.tokenType = "html-doctype"; return cursor; }\r
-case 17:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 23; continue; };\r
-case 18:\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 20:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-{ this.tokenType = "html-doctype"; return cursor; }\r
-case 22:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 23:\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 16; continue; };\r
-{ gotoCase = 22; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 16; continue; };\r
-if (yych == '>') { gotoCase = 16; continue; };\r
-{ gotoCase = 22; continue; };\r
-}\r
-\r
-case this.case_DSTRING:\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 28; continue; };\r
-{ gotoCase = 27; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 28; continue; };\r
-if (yych == '"') { gotoCase = 30; continue; };\r
-{ gotoCase = 27; continue; };\r
-}\r
-case 26:\r
-{ return this._stringToken(cursor); }\r
-case 27:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 34; continue; };\r
-case 28:\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 30:\r
-++cursor;\r
-case 31:\r
-this.setLexCondition(this._lexConditions.TAG);\r
-{ return this._stringToken(cursor, true); }\r
-case 32:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 31; continue; };\r
-case 33:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 34:\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 26; continue; };\r
-{ gotoCase = 33; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 26; continue; };\r
-if (yych == '"') { gotoCase = 32; continue; };\r
-{ gotoCase = 33; continue; };\r
-}\r
-\r
-case this.case_INITIAL:\r
-yych = this._charAt(cursor);\r
-if (yych == '<') { gotoCase = 39; continue; };\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 39:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '/') {\r
-if (yych == '!') { gotoCase = 44; continue; };\r
-if (yych >= '/') { gotoCase = 41; continue; };\r
-} else {\r
-if (yych <= 'S') {\r
-if (yych >= 'S') { gotoCase = 42; continue; };\r
-} else {\r
-if (yych == 's') { gotoCase = 42; continue; };\r
-}\r
-}\r
-case 40:\r
-this.setLexCondition(this._lexConditions.TAG);\r
-{\r
-if (this._condition.parseCondition & this._parseConditions.SCRIPT) {\r
-\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-\r
-this._condition.parseCondition = this._parseConditions.INITIAL;\r
-this.tokenType = "html-tag";\r
-return cursor;\r
-}\r
-case 41:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == 'S') { gotoCase = 68; continue; };\r
-if (yych == 's') { gotoCase = 68; continue; };\r
-{ gotoCase = 40; continue; };\r
-case 42:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'C') { gotoCase = 62; continue; };\r
-if (yych == 'c') { gotoCase = 62; continue; };\r
-case 43:\r
-cursor = YYMARKER;\r
-{ gotoCase = 40; continue; };\r
-case 44:\r
-yych = this._charAt(++cursor);\r
-if (yych <= 'C') {\r
-if (yych != '-') { gotoCase = 43; continue; };\r
-} else {\r
-if (yych <= 'D') { gotoCase = 46; continue; };\r
-if (yych == 'd') { gotoCase = 46; continue; };\r
-{ gotoCase = 43; continue; };\r
-}\r
-yych = this._charAt(++cursor);\r
-if (yych == '-') { gotoCase = 54; continue; };\r
-{ gotoCase = 43; continue; };\r
-case 46:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'O') { gotoCase = 47; continue; };\r
-if (yych != 'o') { gotoCase = 43; continue; };\r
-case 47:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'C') { gotoCase = 48; continue; };\r
-if (yych != 'c') { gotoCase = 43; continue; };\r
-case 48:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'T') { gotoCase = 49; continue; };\r
-if (yych != 't') { gotoCase = 43; continue; };\r
-case 49:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'Y') { gotoCase = 50; continue; };\r
-if (yych != 'y') { gotoCase = 43; continue; };\r
-case 50:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'P') { gotoCase = 51; continue; };\r
-if (yych != 'p') { gotoCase = 43; continue; };\r
-case 51:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'E') { gotoCase = 52; continue; };\r
-if (yych != 'e') { gotoCase = 43; continue; };\r
-case 52:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.DOCTYPE);\r
-{ this.tokenType = "html-doctype"; return cursor; }\r
-case 54:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 57; continue; };\r
-{ gotoCase = 54; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 57; continue; };\r
-if (yych != '-') { gotoCase = 54; continue; };\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '-') { gotoCase = 59; continue; };\r
-{ gotoCase = 43; continue; };\r
-case 57:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.COMMENT);\r
-{ this.tokenType = "html-comment"; return cursor; }\r
-case 59:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych != '>') { gotoCase = 54; continue; };\r
-++cursor;\r
-{ this.tokenType = "html-comment"; return cursor; }\r
-case 62:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'R') { gotoCase = 63; continue; };\r
-if (yych != 'r') { gotoCase = 43; continue; };\r
-case 63:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'I') { gotoCase = 64; continue; };\r
-if (yych != 'i') { gotoCase = 43; continue; };\r
-case 64:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'P') { gotoCase = 65; continue; };\r
-if (yych != 'p') { gotoCase = 43; continue; };\r
-case 65:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'T') { gotoCase = 66; continue; };\r
-if (yych != 't') { gotoCase = 43; continue; };\r
-case 66:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.TAG);\r
-{\r
-if (this._condition.parseCondition & this._parseConditions.SCRIPT) {\r
-\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-this.tokenType = "html-tag";\r
-this._condition.parseCondition = this._parseConditions.SCRIPT;\r
-this._setExpectingAttribute();\r
-return cursor;\r
-}\r
-case 68:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'C') { gotoCase = 69; continue; };\r
-if (yych != 'c') { gotoCase = 43; continue; };\r
-case 69:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'R') { gotoCase = 70; continue; };\r
-if (yych != 'r') { gotoCase = 43; continue; };\r
-case 70:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'I') { gotoCase = 71; continue; };\r
-if (yych != 'i') { gotoCase = 43; continue; };\r
-case 71:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'P') { gotoCase = 72; continue; };\r
-if (yych != 'p') { gotoCase = 43; continue; };\r
-case 72:\r
-yych = this._charAt(++cursor);\r
-if (yych == 'T') { gotoCase = 73; continue; };\r
-if (yych != 't') { gotoCase = 43; continue; };\r
-case 73:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.TAG);\r
-{\r
-this.tokenType = "html-tag";\r
-this._condition.parseCondition = this._parseConditions.INITIAL;\r
-return cursor;\r
-}\r
-\r
-case this.case_SSTRING:\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 79; continue; };\r
-{ gotoCase = 78; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 79; continue; };\r
-if (yych == '\'') { gotoCase = 81; continue; };\r
-{ gotoCase = 78; continue; };\r
-}\r
-case 77:\r
-{ return this._stringToken(cursor); }\r
-case 78:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 85; continue; };\r
-case 79:\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 81:\r
-++cursor;\r
-case 82:\r
-this.setLexCondition(this._lexConditions.TAG);\r
-{ return this._stringToken(cursor, true); }\r
-case 83:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 82; continue; };\r
-case 84:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 85:\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 77; continue; };\r
-{ gotoCase = 84; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 77; continue; };\r
-if (yych == '\'') { gotoCase = 83; continue; };\r
-{ gotoCase = 84; continue; };\r
-}\r
-\r
-case this.case_TAG:\r
-yych = this._charAt(cursor);\r
-if (yych <= '&') {\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 90; continue; };\r
-if (yych >= '\r') { gotoCase = 90; continue; };\r
-} else {\r
-if (yych <= ' ') {\r
-if (yych >= ' ') { gotoCase = 90; continue; };\r
-} else {\r
-if (yych == '"') { gotoCase = 92; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= '>') {\r
-if (yych <= ';') {\r
-if (yych <= '\'') { gotoCase = 93; continue; };\r
-} else {\r
-if (yych <= '<') { gotoCase = 90; continue; };\r
-if (yych <= '=') { gotoCase = 94; continue; };\r
-{ gotoCase = 96; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych >= '[') { gotoCase = 90; continue; };\r
-} else {\r
-if (yych == ']') { gotoCase = 90; continue; };\r
-}\r
-}\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-{ gotoCase = 109; continue; };\r
-case 89:\r
-{\r
-if (this._condition.parseCondition === this._parseConditions.SCRIPT) {\r
-\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-\r
-if (this._condition.parseCondition === this._parseConditions.INITIAL) {\r
-this.tokenType = "html-tag";\r
-this._setExpectingAttribute();\r
-var token = this._line.substring(cursorOnEnter, cursor);\r
-if (token === "a")\r
-this._condition.parseCondition |= this._parseConditions.A_NODE;\r
-else if (this._condition.parseCondition & this._parseConditions.A_NODE)\r
-this._condition.parseCondition ^= this._parseConditions.A_NODE;\r
-} else if (this._isExpectingAttribute()) {\r
-var token = this._line.substring(cursorOnEnter, cursor);\r
-if (token === "href" || token === "src")\r
-this._condition.parseCondition |= this._parseConditions.LINKIFY;\r
-else if (this._condition.parseCondition |= this._parseConditions.LINKIFY)\r
-this._condition.parseCondition ^= this._parseConditions.LINKIFY;\r
-this.tokenType = "html-attribute-name";\r
-} else if (this._isExpectingAttributeValue())\r
-this.tokenType = this._attrValueTokenType();\r
-else\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-case 90:\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 92:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 105; continue; };\r
-case 93:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 99; continue; };\r
-case 94:\r
-++cursor;\r
-{\r
-if (this._isExpectingAttribute())\r
-this._setExpectingAttributeValue();\r
-this.tokenType = null;\r
-return cursor;\r
-}\r
-case 96:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.INITIAL);\r
-{\r
-this.tokenType = "html-tag";\r
-if (this._condition.parseCondition & this._parseConditions.SCRIPT) {\r
-if (!this._internalJavaScriptTokenizer) {\r
-this._internalJavaScriptTokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/javascript");\r
-this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.initialCondition;\r
-}\r
-\r
-return cursor;\r
-}\r
-\r
-this._condition.parseCondition = this._parseConditions.INITIAL;\r
-return cursor;\r
-}\r
-case 98:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 99:\r
-if (yych <= '\f') {\r
-if (yych != '\n') { gotoCase = 98; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 100; continue; };\r
-if (yych == '\'') { gotoCase = 102; continue; };\r
-{ gotoCase = 98; continue; };\r
-}\r
-case 100:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.SSTRING);\r
-{ return this._stringToken(cursor); }\r
-case 102:\r
-++cursor;\r
-{ return this._stringToken(cursor, true); }\r
-case 104:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 105:\r
-if (yych <= '\f') {\r
-if (yych != '\n') { gotoCase = 104; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 106; continue; };\r
-if (yych == '"') { gotoCase = 102; continue; };\r
-{ gotoCase = 104; continue; };\r
-}\r
-case 106:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.DSTRING);\r
-{ return this._stringToken(cursor); }\r
-case 108:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 109:\r
-if (yych <= '"') {\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 89; continue; };\r
-if (yych <= '\f') { gotoCase = 108; continue; };\r
-{ gotoCase = 89; continue; };\r
-} else {\r
-if (yych == ' ') { gotoCase = 89; continue; };\r
-if (yych <= '!') { gotoCase = 108; continue; };\r
-{ gotoCase = 89; continue; };\r
-}\r
-} else {\r
-if (yych <= '>') {\r
-if (yych == '\'') { gotoCase = 89; continue; };\r
-if (yych <= ';') { gotoCase = 108; continue; };\r
-{ gotoCase = 89; continue; };\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= 'Z') { gotoCase = 108; continue; };\r
-{ gotoCase = 89; continue; };\r
-} else {\r
-if (yych == ']') { gotoCase = 89; continue; };\r
-{ gotoCase = 108; continue; };\r
-}\r
-}\r
-}\r
-}\r
-\r
-}\r
-}\r
-}\r
-\r
-WebInspector.SourceHTMLTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SourceJavaScriptTokenizer = function()\r
-{\r
-WebInspector.SourceTokenizer.call(this);\r
-\r
-this._keywords = [\r
-"null", "true", "false", "break", "case", "catch", "const", "default", "finally", "for",\r
-"instanceof", "new", "var", "continue", "function", "return", "void", "delete", "if",\r
-"this", "do", "while", "else", "in", "switch", "throw", "try", "typeof", "debugger",\r
-"class", "enum", "export", "extends", "import", "super", "get", "set", "with"\r
-].keySet();\r
-\r
-this._lexConditions = {\r
-DIV: 0,\r
-NODIV: 1,\r
-COMMENT: 2,\r
-DSTRING: 3,\r
-SSTRING: 4,\r
-REGEX: 5\r
-};\r
-\r
-this.case_DIV = 1000;\r
-this.case_NODIV = 1001;\r
-this.case_COMMENT = 1002;\r
-this.case_DSTRING = 1003;\r
-this.case_SSTRING = 1004;\r
-this.case_REGEX = 1005;\r
-\r
-this.initialCondition = { lexCondition: this._lexConditions.NODIV }\r
-this.condition = this.initialCondition;\r
-}\r
-\r
-WebInspector.SourceJavaScriptTokenizer.prototype = {\r
-nextToken: function(cursor)\r
-{\r
-var cursorOnEnter = cursor;\r
-var gotoCase = 1;\r
-while (1) {\r
-switch (gotoCase)\r
-\r
-\r
-{\r
-case 1: var yych;\r
-var yyaccept = 0;\r
-if (this.getLexCondition() < 3) {\r
-if (this.getLexCondition() < 1) {\r
-{ gotoCase = this.case_DIV; continue; };\r
-} else {\r
-if (this.getLexCondition() < 2) {\r
-{ gotoCase = this.case_NODIV; continue; };\r
-} else {\r
-{ gotoCase = this.case_COMMENT; continue; };\r
-}\r
-}\r
-} else {\r
-if (this.getLexCondition() < 4) {\r
-{ gotoCase = this.case_DSTRING; continue; };\r
-} else {\r
-if (this.getLexCondition() < 5) {\r
-{ gotoCase = this.case_SSTRING; continue; };\r
-} else {\r
-{ gotoCase = this.case_REGEX; continue; };\r
-}\r
-}\r
-}\r
-\r
-case this.case_COMMENT:\r
-\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 4; continue; };\r
-{ gotoCase = 3; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 4; continue; };\r
-if (yych == '*') { gotoCase = 6; continue; };\r
-{ gotoCase = 3; continue; };\r
-}\r
-case 2:\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 3:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 12; continue; };\r
-case 4:\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 6:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '*') { gotoCase = 9; continue; };\r
-if (yych != '/') { gotoCase = 11; continue; };\r
-case 7:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.NODIV);\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 9:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '*') { gotoCase = 9; continue; };\r
-if (yych == '/') { gotoCase = 7; continue; };\r
-case 11:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 12:\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 2; continue; };\r
-{ gotoCase = 11; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 2; continue; };\r
-if (yych == '*') { gotoCase = 9; continue; };\r
-{ gotoCase = 11; continue; };\r
-}\r
-\r
-case this.case_DIV:\r
-yych = this._charAt(cursor);\r
-if (yych <= '9') {\r
-if (yych <= '(') {\r
-if (yych <= '#') {\r
-if (yych <= ' ') { gotoCase = 15; continue; };\r
-if (yych <= '!') { gotoCase = 17; continue; };\r
-if (yych <= '"') { gotoCase = 19; continue; };\r
-} else {\r
-if (yych <= '%') {\r
-if (yych <= '$') { gotoCase = 20; continue; };\r
-{ gotoCase = 22; continue; };\r
-} else {\r
-if (yych <= '&') { gotoCase = 23; continue; };\r
-if (yych <= '\'') { gotoCase = 24; continue; };\r
-{ gotoCase = 25; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= ',') {\r
-if (yych <= ')') { gotoCase = 26; continue; };\r
-if (yych <= '*') { gotoCase = 28; continue; };\r
-if (yych <= '+') { gotoCase = 29; continue; };\r
-{ gotoCase = 25; continue; };\r
-} else {\r
-if (yych <= '.') {\r
-if (yych <= '-') { gotoCase = 30; continue; };\r
-{ gotoCase = 31; continue; };\r
-} else {\r
-if (yych <= '/') { gotoCase = 32; continue; };\r
-if (yych <= '0') { gotoCase = 34; continue; };\r
-{ gotoCase = 36; continue; };\r
-}\r
-}\r
-}\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '>') {\r
-if (yych <= ';') { gotoCase = 25; continue; };\r
-if (yych <= '<') { gotoCase = 37; continue; };\r
-if (yych <= '=') { gotoCase = 38; continue; };\r
-{ gotoCase = 39; continue; };\r
-} else {\r
-if (yych <= '@') {\r
-if (yych <= '?') { gotoCase = 25; continue; };\r
-} else {\r
-if (yych <= 'Z') { gotoCase = 20; continue; };\r
-if (yych <= '[') { gotoCase = 25; continue; };\r
-{ gotoCase = 40; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'z') {\r
-if (yych <= '^') {\r
-if (yych <= ']') { gotoCase = 25; continue; };\r
-{ gotoCase = 41; continue; };\r
-} else {\r
-if (yych != '`') { gotoCase = 20; continue; };\r
-}\r
-} else {\r
-if (yych <= '|') {\r
-if (yych <= '{') { gotoCase = 25; continue; };\r
-{ gotoCase = 42; continue; };\r
-} else {\r
-if (yych <= '~') { gotoCase = 25; continue; };\r
-if (yych >= 0x80) { gotoCase = 20; continue; };\r
-}\r
-}\r
-}\r
-}\r
-case 15:\r
-++cursor;\r
-case 16:\r
-{ this.tokenType = null; return cursor; }\r
-case 17:\r
-++cursor;\r
-if ((yych = this._charAt(cursor)) == '=') { gotoCase = 115; continue; };\r
-case 18:\r
-this.setLexCondition(this._lexConditions.NODIV);\r
-{ this.tokenType = null; return cursor; }\r
-case 19:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '\n') { gotoCase = 16; continue; };\r
-if (yych == '\r') { gotoCase = 16; continue; };\r
-{ gotoCase = 107; continue; };\r
-case 20:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 50; continue; };\r
-case 21:\r
-{\r
-var token = this._line.substring(cursorOnEnter, cursor);\r
-if (token in this._keywords)\r
-this.tokenType = "javascript-keyword";\r
-else\r
-this.tokenType = "javascript-ident";\r
-return cursor;\r
-}\r
-case 22:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 23:\r
-yych = this._charAt(++cursor);\r
-if (yych == '&') { gotoCase = 43; continue; };\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 24:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '\n') { gotoCase = 16; continue; };\r
-if (yych == '\r') { gotoCase = 16; continue; };\r
-{ gotoCase = 96; continue; };\r
-case 25:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 18; continue; };\r
-case 26:\r
-++cursor;\r
-{ this.tokenType = null; return cursor; }\r
-case 28:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 29:\r
-yych = this._charAt(++cursor);\r
-if (yych == '+') { gotoCase = 43; continue; };\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 30:\r
-yych = this._charAt(++cursor);\r
-if (yych == '-') { gotoCase = 43; continue; };\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 31:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 18; continue; };\r
-if (yych <= '9') { gotoCase = 89; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 32:\r
-yyaccept = 2;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '.') {\r
-if (yych == '*') { gotoCase = 78; continue; };\r
-} else {\r
-if (yych <= '/') { gotoCase = 80; continue; };\r
-if (yych == '=') { gotoCase = 77; continue; };\r
-}\r
-case 33:\r
-this.setLexCondition(this._lexConditions.NODIV);\r
-{ this.tokenType = null; return cursor; }\r
-case 34:\r
-yyaccept = 3;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= 'E') {\r
-if (yych <= '/') {\r
-if (yych == '.') { gotoCase = 63; continue; };\r
-} else {\r
-if (yych <= '7') { gotoCase = 72; continue; };\r
-if (yych >= 'E') { gotoCase = 62; continue; };\r
-}\r
-} else {\r
-if (yych <= 'd') {\r
-if (yych == 'X') { gotoCase = 74; continue; };\r
-} else {\r
-if (yych <= 'e') { gotoCase = 62; continue; };\r
-if (yych == 'x') { gotoCase = 74; continue; };\r
-}\r
-}\r
-case 35:\r
-{ this.tokenType = "javascript-number"; return cursor; }\r
-case 36:\r
-yyaccept = 3;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '9') {\r
-if (yych == '.') { gotoCase = 63; continue; };\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-{ gotoCase = 60; continue; };\r
-} else {\r
-if (yych <= 'E') {\r
-if (yych <= 'D') { gotoCase = 35; continue; };\r
-{ gotoCase = 62; continue; };\r
-} else {\r
-if (yych == 'e') { gotoCase = 62; continue; };\r
-{ gotoCase = 35; continue; };\r
-}\r
-}\r
-case 37:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ';') { gotoCase = 18; continue; };\r
-if (yych <= '<') { gotoCase = 59; continue; };\r
-if (yych <= '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 38:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 58; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 39:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '<') { gotoCase = 18; continue; };\r
-if (yych <= '=') { gotoCase = 43; continue; };\r
-if (yych <= '>') { gotoCase = 56; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 40:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == 'u') { gotoCase = 44; continue; };\r
-{ gotoCase = 16; continue; };\r
-case 41:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 42:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-if (yych != '|') { gotoCase = 18; continue; };\r
-case 43:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 18; continue; };\r
-case 44:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 46; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 46; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych <= 'f') { gotoCase = 46; continue; };\r
-}\r
-case 45:\r
-cursor = YYMARKER;\r
-if (yyaccept <= 1) {\r
-if (yyaccept <= 0) {\r
-{ gotoCase = 16; continue; };\r
-} else {\r
-{ gotoCase = 21; continue; };\r
-}\r
-} else {\r
-if (yyaccept <= 2) {\r
-{ gotoCase = 33; continue; };\r
-} else {\r
-{ gotoCase = 35; continue; };\r
-}\r
-}\r
-case 46:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 47; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 47:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 48; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 48:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 49; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 49:\r
-yyaccept = 1;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 50:\r
-if (yych <= '[') {\r
-if (yych <= '/') {\r
-if (yych == '$') { gotoCase = 49; continue; };\r
-{ gotoCase = 21; continue; };\r
-} else {\r
-if (yych <= '9') { gotoCase = 49; continue; };\r
-if (yych <= '@') { gotoCase = 21; continue; };\r
-if (yych <= 'Z') { gotoCase = 49; continue; };\r
-{ gotoCase = 21; continue; };\r
-}\r
-} else {\r
-if (yych <= '_') {\r
-if (yych <= '\\') { gotoCase = 51; continue; };\r
-if (yych <= '^') { gotoCase = 21; continue; };\r
-{ gotoCase = 49; continue; };\r
-} else {\r
-if (yych <= '`') { gotoCase = 21; continue; };\r
-if (yych <= 'z') { gotoCase = 49; continue; };\r
-if (yych <= 0x7F) { gotoCase = 21; continue; };\r
-{ gotoCase = 49; continue; };\r
-}\r
-}\r
-case 51:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych != 'u') { gotoCase = 45; continue; };\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 53; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 53:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 54; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 54:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 55; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 55:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 49; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 49; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych <= 'f') { gotoCase = 49; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 56:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '<') { gotoCase = 18; continue; };\r
-if (yych <= '=') { gotoCase = 43; continue; };\r
-if (yych >= '?') { gotoCase = 18; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 58:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 59:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-case 60:\r
-yyaccept = 3;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '9') {\r
-if (yych == '.') { gotoCase = 63; continue; };\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-{ gotoCase = 60; continue; };\r
-} else {\r
-if (yych <= 'E') {\r
-if (yych <= 'D') { gotoCase = 35; continue; };\r
-} else {\r
-if (yych != 'e') { gotoCase = 35; continue; };\r
-}\r
-}\r
-case 62:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ',') {\r
-if (yych == '+') { gotoCase = 69; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= '-') { gotoCase = 69; continue; };\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 70; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 63:\r
-yyaccept = 3;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'D') {\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-if (yych <= '9') { gotoCase = 63; continue; };\r
-{ gotoCase = 35; continue; };\r
-} else {\r
-if (yych <= 'E') { gotoCase = 65; continue; };\r
-if (yych != 'e') { gotoCase = 35; continue; };\r
-}\r
-case 65:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ',') {\r
-if (yych != '+') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= '-') { gotoCase = 66; continue; };\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 67; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 66:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-case 67:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-if (yych <= '9') { gotoCase = 67; continue; };\r
-{ gotoCase = 35; continue; };\r
-case 69:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-case 70:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-if (yych <= '9') { gotoCase = 70; continue; };\r
-{ gotoCase = 35; continue; };\r
-case 72:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-if (yych <= '7') { gotoCase = 72; continue; };\r
-{ gotoCase = 35; continue; };\r
-case 74:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 75; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 75:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-if (yych <= '9') { gotoCase = 75; continue; };\r
-{ gotoCase = 35; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 75; continue; };\r
-if (yych <= '`') { gotoCase = 35; continue; };\r
-if (yych <= 'f') { gotoCase = 75; continue; };\r
-{ gotoCase = 35; continue; };\r
-}\r
-case 77:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 33; continue; };\r
-case 78:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 85; continue; };\r
-{ gotoCase = 78; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 85; continue; };\r
-if (yych == '*') { gotoCase = 83; continue; };\r
-{ gotoCase = 78; continue; };\r
-}\r
-case 80:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 82; continue; };\r
-if (yych != '\r') { gotoCase = 80; continue; };\r
-case 82:\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 83:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '*') { gotoCase = 83; continue; };\r
-if (yych == '/') { gotoCase = 87; continue; };\r
-{ gotoCase = 78; continue; };\r
-case 85:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.COMMENT);\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 87:\r
-++cursor;\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 89:\r
-yyaccept = 3;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'D') {\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-if (yych <= '9') { gotoCase = 89; continue; };\r
-{ gotoCase = 35; continue; };\r
-} else {\r
-if (yych <= 'E') { gotoCase = 91; continue; };\r
-if (yych != 'e') { gotoCase = 35; continue; };\r
-}\r
-case 91:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ',') {\r
-if (yych != '+') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= '-') { gotoCase = 92; continue; };\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 93; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 92:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-case 93:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 35; continue; };\r
-if (yych <= '9') { gotoCase = 93; continue; };\r
-{ gotoCase = 35; continue; };\r
-case 95:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 96:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 45; continue; };\r
-if (yych <= '\f') { gotoCase = 95; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '&') { gotoCase = 95; continue; };\r
-{ gotoCase = 98; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 95; continue; };\r
-}\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'a') {\r
-if (yych <= '!') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 45; continue; };\r
-{ gotoCase = 101; continue; };\r
-} else {\r
-if (yych == '\r') { gotoCase = 101; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '"') { gotoCase = 95; continue; };\r
-if (yych <= '&') { gotoCase = 45; continue; };\r
-{ gotoCase = 95; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 95; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'q') {\r
-if (yych <= 'f') {\r
-if (yych <= 'b') { gotoCase = 95; continue; };\r
-if (yych <= 'e') { gotoCase = 45; continue; };\r
-{ gotoCase = 95; continue; };\r
-} else {\r
-if (yych == 'n') { gotoCase = 95; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych == 's') { gotoCase = 45; continue; };\r
-{ gotoCase = 95; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 100; continue; };\r
-if (yych <= 'v') { gotoCase = 95; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-}\r
-}\r
-case 98:\r
-++cursor;\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 100:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 103; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 103; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych <= 'f') { gotoCase = 103; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 101:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.SSTRING);\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 103:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 104; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 104:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 105; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 105:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 95; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 95; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych <= 'f') { gotoCase = 95; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 106:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 107:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 45; continue; };\r
-if (yych <= '\f') { gotoCase = 106; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= '"') {\r
-if (yych <= '!') { gotoCase = 106; continue; };\r
-{ gotoCase = 98; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 106; continue; };\r
-}\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'a') {\r
-if (yych <= '!') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 45; continue; };\r
-{ gotoCase = 110; continue; };\r
-} else {\r
-if (yych == '\r') { gotoCase = 110; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '"') { gotoCase = 106; continue; };\r
-if (yych <= '&') { gotoCase = 45; continue; };\r
-{ gotoCase = 106; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 106; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'q') {\r
-if (yych <= 'f') {\r
-if (yych <= 'b') { gotoCase = 106; continue; };\r
-if (yych <= 'e') { gotoCase = 45; continue; };\r
-{ gotoCase = 106; continue; };\r
-} else {\r
-if (yych == 'n') { gotoCase = 106; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych == 's') { gotoCase = 45; continue; };\r
-{ gotoCase = 106; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 109; continue; };\r
-if (yych <= 'v') { gotoCase = 106; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-}\r
-}\r
-case 109:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 112; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 112; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych <= 'f') { gotoCase = 112; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 110:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.DSTRING);\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 112:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 113; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 113:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych >= ':') { gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 114; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych >= 'g') { gotoCase = 45; continue; };\r
-}\r
-case 114:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 45; continue; };\r
-if (yych <= '9') { gotoCase = 106; continue; };\r
-{ gotoCase = 45; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 106; continue; };\r
-if (yych <= '`') { gotoCase = 45; continue; };\r
-if (yych <= 'f') { gotoCase = 106; continue; };\r
-{ gotoCase = 45; continue; };\r
-}\r
-case 115:\r
-++cursor;\r
-if ((yych = this._charAt(cursor)) == '=') { gotoCase = 43; continue; };\r
-{ gotoCase = 18; continue; };\r
-\r
-case this.case_DSTRING:\r
-yych = this._charAt(cursor);\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 120; continue; };\r
-if (yych <= '\f') { gotoCase = 119; continue; };\r
-{ gotoCase = 120; continue; };\r
-} else {\r
-if (yych <= '"') {\r
-if (yych <= '!') { gotoCase = 119; continue; };\r
-{ gotoCase = 122; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 124; continue; };\r
-{ gotoCase = 119; continue; };\r
-}\r
-}\r
-case 118:\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 119:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 126; continue; };\r
-case 120:\r
-++cursor;\r
-case 121:\r
-{ this.tokenType = null; return cursor; }\r
-case 122:\r
-++cursor;\r
-case 123:\r
-this.setLexCondition(this._lexConditions.NODIV);\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 124:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 125; continue; };\r
-if (yych <= '&') { gotoCase = 121; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '[') { gotoCase = 121; continue; };\r
-} else {\r
-if (yych != 'b') { gotoCase = 121; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych >= 'g') { gotoCase = 121; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 125; continue; };\r
-if (yych <= 'q') { gotoCase = 121; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych <= 's') { gotoCase = 121; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 127; continue; };\r
-if (yych >= 'w') { gotoCase = 121; continue; };\r
-}\r
-}\r
-}\r
-case 125:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 126:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 118; continue; };\r
-if (yych <= '\f') { gotoCase = 125; continue; };\r
-{ gotoCase = 118; continue; };\r
-} else {\r
-if (yych <= '"') {\r
-if (yych <= '!') { gotoCase = 125; continue; };\r
-{ gotoCase = 133; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 132; continue; };\r
-{ gotoCase = 125; continue; };\r
-}\r
-}\r
-case 127:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 128; continue; };\r
-if (yych <= '9') { gotoCase = 129; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 129; continue; };\r
-if (yych <= '`') { gotoCase = 128; continue; };\r
-if (yych <= 'f') { gotoCase = 129; continue; };\r
-}\r
-case 128:\r
-cursor = YYMARKER;\r
-if (yyaccept <= 0) {\r
-{ gotoCase = 118; continue; };\r
-} else {\r
-{ gotoCase = 121; continue; };\r
-}\r
-case 129:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 128; continue; };\r
-if (yych >= ':') { gotoCase = 128; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 130; continue; };\r
-if (yych <= '`') { gotoCase = 128; continue; };\r
-if (yych >= 'g') { gotoCase = 128; continue; };\r
-}\r
-case 130:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 128; continue; };\r
-if (yych >= ':') { gotoCase = 128; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 131; continue; };\r
-if (yych <= '`') { gotoCase = 128; continue; };\r
-if (yych >= 'g') { gotoCase = 128; continue; };\r
-}\r
-case 131:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 128; continue; };\r
-if (yych <= '9') { gotoCase = 125; continue; };\r
-{ gotoCase = 128; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 125; continue; };\r
-if (yych <= '`') { gotoCase = 128; continue; };\r
-if (yych <= 'f') { gotoCase = 125; continue; };\r
-{ gotoCase = 128; continue; };\r
-}\r
-case 132:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 125; continue; };\r
-if (yych <= '&') { gotoCase = 128; continue; };\r
-{ gotoCase = 125; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '[') { gotoCase = 128; continue; };\r
-{ gotoCase = 125; continue; };\r
-} else {\r
-if (yych == 'b') { gotoCase = 125; continue; };\r
-{ gotoCase = 128; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych <= 'f') { gotoCase = 125; continue; };\r
-{ gotoCase = 128; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 125; continue; };\r
-if (yych <= 'q') { gotoCase = 128; continue; };\r
-{ gotoCase = 125; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych <= 's') { gotoCase = 128; continue; };\r
-{ gotoCase = 125; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 127; continue; };\r
-if (yych <= 'v') { gotoCase = 125; continue; };\r
-{ gotoCase = 128; continue; };\r
-}\r
-}\r
-}\r
-case 133:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-{ gotoCase = 123; continue; };\r
-\r
-case this.case_NODIV:\r
-yych = this._charAt(cursor);\r
-if (yych <= '9') {\r
-if (yych <= '(') {\r
-if (yych <= '#') {\r
-if (yych <= ' ') { gotoCase = 136; continue; };\r
-if (yych <= '!') { gotoCase = 138; continue; };\r
-if (yych <= '"') { gotoCase = 140; continue; };\r
-} else {\r
-if (yych <= '%') {\r
-if (yych <= '$') { gotoCase = 141; continue; };\r
-{ gotoCase = 143; continue; };\r
-} else {\r
-if (yych <= '&') { gotoCase = 144; continue; };\r
-if (yych <= '\'') { gotoCase = 145; continue; };\r
-{ gotoCase = 146; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= ',') {\r
-if (yych <= ')') { gotoCase = 147; continue; };\r
-if (yych <= '*') { gotoCase = 149; continue; };\r
-if (yych <= '+') { gotoCase = 150; continue; };\r
-{ gotoCase = 146; continue; };\r
-} else {\r
-if (yych <= '.') {\r
-if (yych <= '-') { gotoCase = 151; continue; };\r
-{ gotoCase = 152; continue; };\r
-} else {\r
-if (yych <= '/') { gotoCase = 153; continue; };\r
-if (yych <= '0') { gotoCase = 154; continue; };\r
-{ gotoCase = 156; continue; };\r
-}\r
-}\r
-}\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '>') {\r
-if (yych <= ';') { gotoCase = 146; continue; };\r
-if (yych <= '<') { gotoCase = 157; continue; };\r
-if (yych <= '=') { gotoCase = 158; continue; };\r
-{ gotoCase = 159; continue; };\r
-} else {\r
-if (yych <= '@') {\r
-if (yych <= '?') { gotoCase = 146; continue; };\r
-} else {\r
-if (yych <= 'Z') { gotoCase = 141; continue; };\r
-if (yych <= '[') { gotoCase = 146; continue; };\r
-{ gotoCase = 160; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'z') {\r
-if (yych <= '^') {\r
-if (yych <= ']') { gotoCase = 146; continue; };\r
-{ gotoCase = 161; continue; };\r
-} else {\r
-if (yych != '`') { gotoCase = 141; continue; };\r
-}\r
-} else {\r
-if (yych <= '|') {\r
-if (yych <= '{') { gotoCase = 146; continue; };\r
-{ gotoCase = 162; continue; };\r
-} else {\r
-if (yych <= '~') { gotoCase = 146; continue; };\r
-if (yych >= 0x80) { gotoCase = 141; continue; };\r
-}\r
-}\r
-}\r
-}\r
-case 136:\r
-++cursor;\r
-case 137:\r
-{ this.tokenType = null; return cursor; }\r
-case 138:\r
-++cursor;\r
-if ((yych = this._charAt(cursor)) == '=') { gotoCase = 260; continue; };\r
-case 139:\r
-{ this.tokenType = null; return cursor; }\r
-case 140:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '\n') { gotoCase = 137; continue; };\r
-if (yych == '\r') { gotoCase = 137; continue; };\r
-{ gotoCase = 252; continue; };\r
-case 141:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 170; continue; };\r
-case 142:\r
-this.setLexCondition(this._lexConditions.DIV);\r
-{\r
-var token = this._line.substring(cursorOnEnter, cursor);\r
-if (token in this._keywords)\r
-this.tokenType = "javascript-keyword";\r
-else\r
-this.tokenType = "javascript-ident";\r
-return cursor;\r
-}\r
-case 143:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 144:\r
-yych = this._charAt(++cursor);\r
-if (yych == '&') { gotoCase = 163; continue; };\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 145:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == '\n') { gotoCase = 137; continue; };\r
-if (yych == '\r') { gotoCase = 137; continue; };\r
-{ gotoCase = 241; continue; };\r
-case 146:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 139; continue; };\r
-case 147:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.DIV);\r
-{ this.tokenType = null; return cursor; }\r
-case 149:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 150:\r
-yych = this._charAt(++cursor);\r
-if (yych == '+') { gotoCase = 163; continue; };\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 151:\r
-yych = this._charAt(++cursor);\r
-if (yych == '-') { gotoCase = 163; continue; };\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 152:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 139; continue; };\r
-if (yych <= '9') { gotoCase = 234; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 153:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 137; continue; };\r
-{ gotoCase = 197; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 137; continue; };\r
-if (yych <= ')') { gotoCase = 197; continue; };\r
-{ gotoCase = 202; continue; };\r
-}\r
-} else {\r
-if (yych <= 'Z') {\r
-if (yych == '/') { gotoCase = 204; continue; };\r
-{ gotoCase = 197; continue; };\r
-} else {\r
-if (yych <= '[') { gotoCase = 200; continue; };\r
-if (yych <= '\\') { gotoCase = 199; continue; };\r
-if (yych <= ']') { gotoCase = 137; continue; };\r
-{ gotoCase = 197; continue; };\r
-}\r
-}\r
-case 154:\r
-yyaccept = 2;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= 'E') {\r
-if (yych <= '/') {\r
-if (yych == '.') { gotoCase = 183; continue; };\r
-} else {\r
-if (yych <= '7') { gotoCase = 192; continue; };\r
-if (yych >= 'E') { gotoCase = 182; continue; };\r
-}\r
-} else {\r
-if (yych <= 'd') {\r
-if (yych == 'X') { gotoCase = 194; continue; };\r
-} else {\r
-if (yych <= 'e') { gotoCase = 182; continue; };\r
-if (yych == 'x') { gotoCase = 194; continue; };\r
-}\r
-}\r
-case 155:\r
-this.setLexCondition(this._lexConditions.DIV);\r
-{ this.tokenType = "javascript-number"; return cursor; }\r
-case 156:\r
-yyaccept = 2;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '9') {\r
-if (yych == '.') { gotoCase = 183; continue; };\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-{ gotoCase = 180; continue; };\r
-} else {\r
-if (yych <= 'E') {\r
-if (yych <= 'D') { gotoCase = 155; continue; };\r
-{ gotoCase = 182; continue; };\r
-} else {\r
-if (yych == 'e') { gotoCase = 182; continue; };\r
-{ gotoCase = 155; continue; };\r
-}\r
-}\r
-case 157:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ';') { gotoCase = 139; continue; };\r
-if (yych <= '<') { gotoCase = 179; continue; };\r
-if (yych <= '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 158:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 178; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 159:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '<') { gotoCase = 139; continue; };\r
-if (yych <= '=') { gotoCase = 163; continue; };\r
-if (yych <= '>') { gotoCase = 176; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 160:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych == 'u') { gotoCase = 164; continue; };\r
-{ gotoCase = 137; continue; };\r
-case 161:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 162:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-if (yych != '|') { gotoCase = 139; continue; };\r
-case 163:\r
-yych = this._charAt(++cursor);\r
-{ gotoCase = 139; continue; };\r
-case 164:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 166; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 166; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych <= 'f') { gotoCase = 166; continue; };\r
-}\r
-case 165:\r
-cursor = YYMARKER;\r
-if (yyaccept <= 1) {\r
-if (yyaccept <= 0) {\r
-{ gotoCase = 137; continue; };\r
-} else {\r
-{ gotoCase = 142; continue; };\r
-}\r
-} else {\r
-if (yyaccept <= 2) {\r
-{ gotoCase = 155; continue; };\r
-} else {\r
-{ gotoCase = 217; continue; };\r
-}\r
-}\r
-case 166:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 167; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 167:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 168; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 168:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 169; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 169:\r
-yyaccept = 1;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 170:\r
-if (yych <= '[') {\r
-if (yych <= '/') {\r
-if (yych == '$') { gotoCase = 169; continue; };\r
-{ gotoCase = 142; continue; };\r
-} else {\r
-if (yych <= '9') { gotoCase = 169; continue; };\r
-if (yych <= '@') { gotoCase = 142; continue; };\r
-if (yych <= 'Z') { gotoCase = 169; continue; };\r
-{ gotoCase = 142; continue; };\r
-}\r
-} else {\r
-if (yych <= '_') {\r
-if (yych <= '\\') { gotoCase = 171; continue; };\r
-if (yych <= '^') { gotoCase = 142; continue; };\r
-{ gotoCase = 169; continue; };\r
-} else {\r
-if (yych <= '`') { gotoCase = 142; continue; };\r
-if (yych <= 'z') { gotoCase = 169; continue; };\r
-if (yych <= 0x7F) { gotoCase = 142; continue; };\r
-{ gotoCase = 169; continue; };\r
-}\r
-}\r
-case 171:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych != 'u') { gotoCase = 165; continue; };\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 173; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 173:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 174; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 174:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 175; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 175:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 169; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 169; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych <= 'f') { gotoCase = 169; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 176:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '<') { gotoCase = 139; continue; };\r
-if (yych <= '=') { gotoCase = 163; continue; };\r
-if (yych >= '?') { gotoCase = 139; continue; };\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 178:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 179:\r
-yych = this._charAt(++cursor);\r
-if (yych == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-case 180:\r
-yyaccept = 2;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '9') {\r
-if (yych == '.') { gotoCase = 183; continue; };\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-{ gotoCase = 180; continue; };\r
-} else {\r
-if (yych <= 'E') {\r
-if (yych <= 'D') { gotoCase = 155; continue; };\r
-} else {\r
-if (yych != 'e') { gotoCase = 155; continue; };\r
-}\r
-}\r
-case 182:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ',') {\r
-if (yych == '+') { gotoCase = 189; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= '-') { gotoCase = 189; continue; };\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 190; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 183:\r
-yyaccept = 2;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'D') {\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-if (yych <= '9') { gotoCase = 183; continue; };\r
-{ gotoCase = 155; continue; };\r
-} else {\r
-if (yych <= 'E') { gotoCase = 185; continue; };\r
-if (yych != 'e') { gotoCase = 155; continue; };\r
-}\r
-case 185:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ',') {\r
-if (yych != '+') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= '-') { gotoCase = 186; continue; };\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 187; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 186:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-case 187:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-if (yych <= '9') { gotoCase = 187; continue; };\r
-{ gotoCase = 155; continue; };\r
-case 189:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-case 190:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-if (yych <= '9') { gotoCase = 190; continue; };\r
-{ gotoCase = 155; continue; };\r
-case 192:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-if (yych <= '7') { gotoCase = 192; continue; };\r
-{ gotoCase = 155; continue; };\r
-case 194:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 195; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 195:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-if (yych <= '9') { gotoCase = 195; continue; };\r
-{ gotoCase = 155; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 195; continue; };\r
-if (yych <= '`') { gotoCase = 155; continue; };\r
-if (yych <= 'f') { gotoCase = 195; continue; };\r
-{ gotoCase = 155; continue; };\r
-}\r
-case 197:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '.') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 197; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych == '\r') { gotoCase = 165; continue; };\r
-{ gotoCase = 197; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= '/') { gotoCase = 220; continue; };\r
-if (yych <= 'Z') { gotoCase = 197; continue; };\r
-{ gotoCase = 228; continue; };\r
-} else {\r
-if (yych <= '\\') { gotoCase = 227; continue; };\r
-if (yych <= ']') { gotoCase = 165; continue; };\r
-{ gotoCase = 197; continue; };\r
-}\r
-}\r
-case 199:\r
-yych = this._charAt(++cursor);\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-if (yych == '\r') { gotoCase = 165; continue; };\r
-{ gotoCase = 197; continue; };\r
-case 200:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-{ gotoCase = 200; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 165; continue; };\r
-if (yych <= ')') { gotoCase = 200; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych == '/') { gotoCase = 165; continue; };\r
-{ gotoCase = 200; continue; };\r
-} else {\r
-if (yych <= '\\') { gotoCase = 215; continue; };\r
-if (yych <= ']') { gotoCase = 213; continue; };\r
-{ gotoCase = 200; continue; };\r
-}\r
-}\r
-case 202:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 209; continue; };\r
-{ gotoCase = 202; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 209; continue; };\r
-if (yych == '*') { gotoCase = 207; continue; };\r
-{ gotoCase = 202; continue; };\r
-}\r
-case 204:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 206; continue; };\r
-if (yych != '\r') { gotoCase = 204; continue; };\r
-case 206:\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 207:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '*') { gotoCase = 207; continue; };\r
-if (yych == '/') { gotoCase = 211; continue; };\r
-{ gotoCase = 202; continue; };\r
-case 209:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.COMMENT);\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 211:\r
-++cursor;\r
-{ this.tokenType = "javascript-comment"; return cursor; }\r
-case 213:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-{ gotoCase = 213; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 165; continue; };\r
-if (yych <= ')') { gotoCase = 213; continue; };\r
-{ gotoCase = 197; continue; };\r
-}\r
-} else {\r
-if (yych <= 'Z') {\r
-if (yych == '/') { gotoCase = 220; continue; };\r
-{ gotoCase = 213; continue; };\r
-} else {\r
-if (yych <= '[') { gotoCase = 218; continue; };\r
-if (yych <= '\\') { gotoCase = 216; continue; };\r
-{ gotoCase = 213; continue; };\r
-}\r
-}\r
-case 215:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-if (yych == '\r') { gotoCase = 165; continue; };\r
-{ gotoCase = 200; continue; };\r
-case 216:\r
-yyaccept = 3;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 217; continue; };\r
-if (yych != '\r') { gotoCase = 213; continue; };\r
-case 217:\r
-this.setLexCondition(this._lexConditions.REGEX);\r
-{ this.tokenType = "javascript-regexp"; return cursor; }\r
-case 218:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-{ gotoCase = 218; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 165; continue; };\r
-if (yych <= ')') { gotoCase = 218; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych == '/') { gotoCase = 165; continue; };\r
-{ gotoCase = 218; continue; };\r
-} else {\r
-if (yych <= '\\') { gotoCase = 225; continue; };\r
-if (yych <= ']') { gotoCase = 223; continue; };\r
-{ gotoCase = 218; continue; };\r
-}\r
-}\r
-case 220:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'h') {\r
-if (yych == 'g') { gotoCase = 220; continue; };\r
-} else {\r
-if (yych <= 'i') { gotoCase = 220; continue; };\r
-if (yych == 'm') { gotoCase = 220; continue; };\r
-}\r
-{ this.tokenType = "javascript-regexp"; return cursor; }\r
-case 223:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-{ gotoCase = 223; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 165; continue; };\r
-if (yych <= ')') { gotoCase = 223; continue; };\r
-{ gotoCase = 197; continue; };\r
-}\r
-} else {\r
-if (yych <= 'Z') {\r
-if (yych == '/') { gotoCase = 220; continue; };\r
-{ gotoCase = 223; continue; };\r
-} else {\r
-if (yych <= '[') { gotoCase = 218; continue; };\r
-if (yych <= '\\') { gotoCase = 226; continue; };\r
-{ gotoCase = 223; continue; };\r
-}\r
-}\r
-case 225:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-if (yych == '\r') { gotoCase = 165; continue; };\r
-{ gotoCase = 218; continue; };\r
-case 226:\r
-yyaccept = 3;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 217; continue; };\r
-if (yych == '\r') { gotoCase = 217; continue; };\r
-{ gotoCase = 223; continue; };\r
-case 227:\r
-yyaccept = 3;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 217; continue; };\r
-if (yych == '\r') { gotoCase = 217; continue; };\r
-{ gotoCase = 197; continue; };\r
-case 228:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-{ gotoCase = 228; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 165; continue; };\r
-if (yych <= ')') { gotoCase = 228; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych == '/') { gotoCase = 165; continue; };\r
-{ gotoCase = 228; continue; };\r
-} else {\r
-if (yych <= '\\') { gotoCase = 232; continue; };\r
-if (yych >= '^') { gotoCase = 228; continue; };\r
-}\r
-}\r
-case 230:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-{ gotoCase = 230; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 165; continue; };\r
-if (yych <= ')') { gotoCase = 230; continue; };\r
-{ gotoCase = 197; continue; };\r
-}\r
-} else {\r
-if (yych <= 'Z') {\r
-if (yych == '/') { gotoCase = 220; continue; };\r
-{ gotoCase = 230; continue; };\r
-} else {\r
-if (yych <= '[') { gotoCase = 228; continue; };\r
-if (yych <= '\\') { gotoCase = 233; continue; };\r
-{ gotoCase = 230; continue; };\r
-}\r
-}\r
-case 232:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-if (yych == '\r') { gotoCase = 165; continue; };\r
-{ gotoCase = 228; continue; };\r
-case 233:\r
-yyaccept = 3;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 217; continue; };\r
-if (yych == '\r') { gotoCase = 217; continue; };\r
-{ gotoCase = 230; continue; };\r
-case 234:\r
-yyaccept = 2;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'D') {\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-if (yych <= '9') { gotoCase = 234; continue; };\r
-{ gotoCase = 155; continue; };\r
-} else {\r
-if (yych <= 'E') { gotoCase = 236; continue; };\r
-if (yych != 'e') { gotoCase = 155; continue; };\r
-}\r
-case 236:\r
-yych = this._charAt(++cursor);\r
-if (yych <= ',') {\r
-if (yych != '+') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= '-') { gotoCase = 237; continue; };\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 238; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 237:\r
-yych = this._charAt(++cursor);\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-case 238:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '/') { gotoCase = 155; continue; };\r
-if (yych <= '9') { gotoCase = 238; continue; };\r
-{ gotoCase = 155; continue; };\r
-case 240:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 241:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-if (yych <= '\f') { gotoCase = 240; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '&') { gotoCase = 240; continue; };\r
-{ gotoCase = 243; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 240; continue; };\r
-}\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'a') {\r
-if (yych <= '!') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 165; continue; };\r
-{ gotoCase = 246; continue; };\r
-} else {\r
-if (yych == '\r') { gotoCase = 246; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '"') { gotoCase = 240; continue; };\r
-if (yych <= '&') { gotoCase = 165; continue; };\r
-{ gotoCase = 240; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 240; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'q') {\r
-if (yych <= 'f') {\r
-if (yych <= 'b') { gotoCase = 240; continue; };\r
-if (yych <= 'e') { gotoCase = 165; continue; };\r
-{ gotoCase = 240; continue; };\r
-} else {\r
-if (yych == 'n') { gotoCase = 240; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych == 's') { gotoCase = 165; continue; };\r
-{ gotoCase = 240; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 245; continue; };\r
-if (yych <= 'v') { gotoCase = 240; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-}\r
-}\r
-case 243:\r
-++cursor;\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 245:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 248; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 248; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych <= 'f') { gotoCase = 248; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 246:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.SSTRING);\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 248:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 249; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 249:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 250; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 250:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 240; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 240; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych <= 'f') { gotoCase = 240; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 251:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 252:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 165; continue; };\r
-if (yych <= '\f') { gotoCase = 251; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= '"') {\r
-if (yych <= '!') { gotoCase = 251; continue; };\r
-{ gotoCase = 243; continue; };\r
-} else {\r
-if (yych != '\\') { gotoCase = 251; continue; };\r
-}\r
-}\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'a') {\r
-if (yych <= '!') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 165; continue; };\r
-{ gotoCase = 255; continue; };\r
-} else {\r
-if (yych == '\r') { gotoCase = 255; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '"') { gotoCase = 251; continue; };\r
-if (yych <= '&') { gotoCase = 165; continue; };\r
-{ gotoCase = 251; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 251; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'q') {\r
-if (yych <= 'f') {\r
-if (yych <= 'b') { gotoCase = 251; continue; };\r
-if (yych <= 'e') { gotoCase = 165; continue; };\r
-{ gotoCase = 251; continue; };\r
-} else {\r
-if (yych == 'n') { gotoCase = 251; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych == 's') { gotoCase = 165; continue; };\r
-{ gotoCase = 251; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 254; continue; };\r
-if (yych <= 'v') { gotoCase = 251; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-}\r
-}\r
-case 254:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 257; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 257; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych <= 'f') { gotoCase = 257; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 255:\r
-++cursor;\r
-this.setLexCondition(this._lexConditions.DSTRING);\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 257:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 258; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 258:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych >= ':') { gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 259; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych >= 'g') { gotoCase = 165; continue; };\r
-}\r
-case 259:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 165; continue; };\r
-if (yych <= '9') { gotoCase = 251; continue; };\r
-{ gotoCase = 165; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 251; continue; };\r
-if (yych <= '`') { gotoCase = 165; continue; };\r
-if (yych <= 'f') { gotoCase = 251; continue; };\r
-{ gotoCase = 165; continue; };\r
-}\r
-case 260:\r
-++cursor;\r
-if ((yych = this._charAt(cursor)) == '=') { gotoCase = 163; continue; };\r
-{ gotoCase = 139; continue; };\r
-\r
-case this.case_REGEX:\r
-yych = this._charAt(cursor);\r
-if (yych <= '.') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 264; continue; };\r
-{ gotoCase = 265; continue; };\r
-} else {\r
-if (yych == '\r') { gotoCase = 265; continue; };\r
-{ gotoCase = 264; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= '/') { gotoCase = 267; continue; };\r
-if (yych <= 'Z') { gotoCase = 264; continue; };\r
-{ gotoCase = 269; continue; };\r
-} else {\r
-if (yych <= '\\') { gotoCase = 270; continue; };\r
-if (yych <= ']') { gotoCase = 265; continue; };\r
-{ gotoCase = 264; continue; };\r
-}\r
-}\r
-case 263:\r
-{ this.tokenType = "javascript-regexp"; return cursor; }\r
-case 264:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 272; continue; };\r
-case 265:\r
-++cursor;\r
-case 266:\r
-{ this.tokenType = null; return cursor; }\r
-case 267:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-{ gotoCase = 278; continue; };\r
-case 268:\r
-this.setLexCondition(this._lexConditions.NODIV);\r
-{ this.tokenType = "javascript-regexp"; return cursor; }\r
-case 269:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 266; continue; };\r
-if (yych <= '\f') { gotoCase = 276; continue; };\r
-{ gotoCase = 266; continue; };\r
-} else {\r
-if (yych <= '*') {\r
-if (yych <= ')') { gotoCase = 276; continue; };\r
-{ gotoCase = 266; continue; };\r
-} else {\r
-if (yych == '/') { gotoCase = 266; continue; };\r
-{ gotoCase = 276; continue; };\r
-}\r
-}\r
-case 270:\r
-yych = this._charAt(++cursor);\r
-if (yych == '\n') { gotoCase = 266; continue; };\r
-if (yych == '\r') { gotoCase = 266; continue; };\r
-case 271:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 272:\r
-if (yych <= '.') {\r
-if (yych <= '\n') {\r
-if (yych <= '\t') { gotoCase = 271; continue; };\r
-{ gotoCase = 263; continue; };\r
-} else {\r
-if (yych == '\r') { gotoCase = 263; continue; };\r
-{ gotoCase = 271; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych <= '/') { gotoCase = 277; continue; };\r
-if (yych <= 'Z') { gotoCase = 271; continue; };\r
-{ gotoCase = 275; continue; };\r
-} else {\r
-if (yych <= '\\') { gotoCase = 273; continue; };\r
-if (yych <= ']') { gotoCase = 263; continue; };\r
-{ gotoCase = 271; continue; };\r
-}\r
-}\r
-case 273:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 274; continue; };\r
-if (yych != '\r') { gotoCase = 271; continue; };\r
-case 274:\r
-cursor = YYMARKER;\r
-if (yyaccept <= 0) {\r
-{ gotoCase = 263; continue; };\r
-} else {\r
-{ gotoCase = 266; continue; };\r
-}\r
-case 275:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 276:\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 274; continue; };\r
-{ gotoCase = 275; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 274; continue; };\r
-if (yych <= ')') { gotoCase = 275; continue; };\r
-{ gotoCase = 274; continue; };\r
-}\r
-} else {\r
-if (yych <= '[') {\r
-if (yych == '/') { gotoCase = 274; continue; };\r
-{ gotoCase = 275; continue; };\r
-} else {\r
-if (yych <= '\\') { gotoCase = 281; continue; };\r
-if (yych <= ']') { gotoCase = 279; continue; };\r
-{ gotoCase = 275; continue; };\r
-}\r
-}\r
-case 277:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-case 278:\r
-if (yych <= 'h') {\r
-if (yych == 'g') { gotoCase = 277; continue; };\r
-{ gotoCase = 268; continue; };\r
-} else {\r
-if (yych <= 'i') { gotoCase = 277; continue; };\r
-if (yych == 'm') { gotoCase = 277; continue; };\r
-{ gotoCase = 268; continue; };\r
-}\r
-case 279:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '*') {\r
-if (yych <= '\f') {\r
-if (yych == '\n') { gotoCase = 263; continue; };\r
-{ gotoCase = 279; continue; };\r
-} else {\r
-if (yych <= '\r') { gotoCase = 263; continue; };\r
-if (yych <= ')') { gotoCase = 279; continue; };\r
-{ gotoCase = 271; continue; };\r
-}\r
-} else {\r
-if (yych <= 'Z') {\r
-if (yych == '/') { gotoCase = 277; continue; };\r
-{ gotoCase = 279; continue; };\r
-} else {\r
-if (yych <= '[') { gotoCase = 275; continue; };\r
-if (yych <= '\\') { gotoCase = 282; continue; };\r
-{ gotoCase = 279; continue; };\r
-}\r
-}\r
-case 281:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 274; continue; };\r
-if (yych == '\r') { gotoCase = 274; continue; };\r
-{ gotoCase = 275; continue; };\r
-case 282:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych == '\n') { gotoCase = 274; continue; };\r
-if (yych == '\r') { gotoCase = 274; continue; };\r
-{ gotoCase = 279; continue; };\r
-\r
-case this.case_SSTRING:\r
-yych = this._charAt(cursor);\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 287; continue; };\r
-if (yych <= '\f') { gotoCase = 286; continue; };\r
-{ gotoCase = 287; continue; };\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '&') { gotoCase = 286; continue; };\r
-{ gotoCase = 289; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 291; continue; };\r
-{ gotoCase = 286; continue; };\r
-}\r
-}\r
-case 285:\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 286:\r
-yyaccept = 0;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-{ gotoCase = 293; continue; };\r
-case 287:\r
-++cursor;\r
-case 288:\r
-{ this.tokenType = null; return cursor; }\r
-case 289:\r
-++cursor;\r
-case 290:\r
-this.setLexCondition(this._lexConditions.NODIV);\r
-{ this.tokenType = "javascript-string"; return cursor; }\r
-case 291:\r
-yyaccept = 1;\r
-yych = this._charAt(YYMARKER = ++cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 292; continue; };\r
-if (yych <= '&') { gotoCase = 288; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '[') { gotoCase = 288; continue; };\r
-} else {\r
-if (yych != 'b') { gotoCase = 288; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych >= 'g') { gotoCase = 288; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 292; continue; };\r
-if (yych <= 'q') { gotoCase = 288; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych <= 's') { gotoCase = 288; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 294; continue; };\r
-if (yych >= 'w') { gotoCase = 288; continue; };\r
-}\r
-}\r
-}\r
-case 292:\r
-yyaccept = 0;\r
-YYMARKER = ++cursor;\r
-yych = this._charAt(cursor);\r
-case 293:\r
-if (yych <= '\r') {\r
-if (yych == '\n') { gotoCase = 285; continue; };\r
-if (yych <= '\f') { gotoCase = 292; continue; };\r
-{ gotoCase = 285; continue; };\r
-} else {\r
-if (yych <= '\'') {\r
-if (yych <= '&') { gotoCase = 292; continue; };\r
-{ gotoCase = 300; continue; };\r
-} else {\r
-if (yych == '\\') { gotoCase = 299; continue; };\r
-{ gotoCase = 292; continue; };\r
-}\r
-}\r
-case 294:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 295; continue; };\r
-if (yych <= '9') { gotoCase = 296; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 296; continue; };\r
-if (yych <= '`') { gotoCase = 295; continue; };\r
-if (yych <= 'f') { gotoCase = 296; continue; };\r
-}\r
-case 295:\r
-cursor = YYMARKER;\r
-if (yyaccept <= 0) {\r
-{ gotoCase = 285; continue; };\r
-} else {\r
-{ gotoCase = 288; continue; };\r
-}\r
-case 296:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 295; continue; };\r
-if (yych >= ':') { gotoCase = 295; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 297; continue; };\r
-if (yych <= '`') { gotoCase = 295; continue; };\r
-if (yych >= 'g') { gotoCase = 295; continue; };\r
-}\r
-case 297:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 295; continue; };\r
-if (yych >= ':') { gotoCase = 295; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 298; continue; };\r
-if (yych <= '`') { gotoCase = 295; continue; };\r
-if (yych >= 'g') { gotoCase = 295; continue; };\r
-}\r
-case 298:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= '@') {\r
-if (yych <= '/') { gotoCase = 295; continue; };\r
-if (yych <= '9') { gotoCase = 292; continue; };\r
-{ gotoCase = 295; continue; };\r
-} else {\r
-if (yych <= 'F') { gotoCase = 292; continue; };\r
-if (yych <= '`') { gotoCase = 295; continue; };\r
-if (yych <= 'f') { gotoCase = 292; continue; };\r
-{ gotoCase = 295; continue; };\r
-}\r
-case 299:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-if (yych <= 'e') {\r
-if (yych <= '\'') {\r
-if (yych == '"') { gotoCase = 292; continue; };\r
-if (yych <= '&') { gotoCase = 295; continue; };\r
-{ gotoCase = 292; continue; };\r
-} else {\r
-if (yych <= '\\') {\r
-if (yych <= '[') { gotoCase = 295; continue; };\r
-{ gotoCase = 292; continue; };\r
-} else {\r
-if (yych == 'b') { gotoCase = 292; continue; };\r
-{ gotoCase = 295; continue; };\r
-}\r
-}\r
-} else {\r
-if (yych <= 'r') {\r
-if (yych <= 'm') {\r
-if (yych <= 'f') { gotoCase = 292; continue; };\r
-{ gotoCase = 295; continue; };\r
-} else {\r
-if (yych <= 'n') { gotoCase = 292; continue; };\r
-if (yych <= 'q') { gotoCase = 295; continue; };\r
-{ gotoCase = 292; continue; };\r
-}\r
-} else {\r
-if (yych <= 't') {\r
-if (yych <= 's') { gotoCase = 295; continue; };\r
-{ gotoCase = 292; continue; };\r
-} else {\r
-if (yych <= 'u') { gotoCase = 294; continue; };\r
-if (yych <= 'v') { gotoCase = 292; continue; };\r
-{ gotoCase = 295; continue; };\r
-}\r
-}\r
-}\r
-case 300:\r
-++cursor;\r
-yych = this._charAt(cursor);\r
-{ gotoCase = 290; continue; };\r
-}\r
-\r
-}\r
-}\r
-}\r
-\r
-WebInspector.SourceJavaScriptTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.SourceView = function(resource)\r
-{\r
-WebInspector.ResourceView.call(this, resource);\r
-\r
-this.element.addStyleClass("source");\r
-\r
-var scripts = WebInspector.debuggerModel.scriptsForURL(resource.url);\r
-var canEditScripts = WebInspector.panels.scripts.canEditScripts() && resource.type === WebInspector.Resource.Type.Script;\r
-this.sourceFrame = new WebInspector.SourceFrame(this.element, scripts, canEditScripts);\r
-resource.addEventListener("finished", this._resourceLoadingFinished, this);\r
-this._frameNeedsSetup = true;\r
-}\r
-\r
-\r
-\r
-WebInspector.SourceView.DefaultMIMETypeForResourceType = {\r
-0: "text/html",\r
-1: "text/css",\r
-4: "text/javascript"\r
-}\r
-\r
-WebInspector.SourceView.prototype = {\r
-show: function(parentElement)\r
-{\r
-WebInspector.ResourceView.prototype.show.call(this, parentElement);\r
-this.setupSourceFrameIfNeeded();\r
-this.sourceFrame.visible = true;\r
-this.resize();\r
-},\r
-\r
-hide: function()\r
-{\r
-this.sourceFrame.visible = false;\r
-if (!this._frameNeedsSetup)\r
-this.sourceFrame.clearLineHighlight();\r
-WebInspector.View.prototype.hide.call(this);\r
-this._currentSearchResultIndex = -1;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this.sourceFrame)\r
-this.sourceFrame.resize();\r
-},\r
-\r
-get scrollTop()\r
-{\r
-return this.sourceFrame.scrollTop;\r
-},\r
-\r
-set scrollTop(scrollTop)\r
-{\r
-this.sourceFrame.scrollTop = scrollTop;\r
-},\r
-\r
-\r
-setupSourceFrameIfNeeded: function()\r
-{\r
-if (!this._frameNeedsSetup)\r
-return;\r
-\r
-delete this._frameNeedsSetup;\r
-this.resource.requestContent(this._contentLoaded.bind(this));\r
-},\r
-\r
-hasContent: function()\r
-{\r
-return true;\r
-},\r
-\r
-_contentLoaded: function(content)\r
-{\r
-var mimeType = this._canonicalMimeType(this.resource);\r
-this.sourceFrame.setContent(mimeType, content, this.resource.url);\r
-this._sourceFrameSetupFinished();\r
-},\r
-\r
-_canonicalMimeType: function(resource)\r
-{\r
-return WebInspector.SourceView.DefaultMIMETypeForResourceType[resource.type] || resource.mimeType;\r
-},\r
-\r
-_resourceLoadingFinished: function(event)\r
-{\r
-this._frameNeedsSetup = true;\r
-this._sourceFrameSetup = false;\r
-if (this.visible)\r
-this.setupSourceFrameIfNeeded();\r
-this.resource.removeEventListener("finished", this._resourceLoadingFinished, this);\r
-},\r
-\r
-\r
-\r
-\r
-searchCanceled: function()\r
-{\r
-this._currentSearchResultIndex = -1;\r
-this._searchResults = [];\r
-this.sourceFrame.clearMarkedRange();\r
-delete this._delayedFindSearchMatches;\r
-},\r
-\r
-performSearch: function(query, finishedCallback)\r
-{\r
-\r
-this.searchCanceled();\r
-\r
-this._searchFinishedCallback = finishedCallback;\r
-\r
-function findSearchMatches(query, finishedCallback)\r
-{\r
-this._searchResults = this.sourceFrame.findSearchMatches(query);\r
-if (this._searchResults)\r
-finishedCallback(this, this._searchResults.length);\r
-}\r
-\r
-if (!this._sourceFrameSetup) {\r
-\r
-this._delayedFindSearchMatches = findSearchMatches.bind(this, query, finishedCallback);\r
-this.setupSourceFrameIfNeeded();\r
-return;\r
-}\r
-\r
-findSearchMatches.call(this, query, finishedCallback);\r
-},\r
-\r
-jumpToFirstSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-this._currentSearchResultIndex = 0;\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-jumpToLastSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-this._currentSearchResultIndex = (this._searchResults.length - 1);\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-jumpToNextSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-if (++this._currentSearchResultIndex >= this._searchResults.length)\r
-this._currentSearchResultIndex = 0;\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-jumpToPreviousSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-if (--this._currentSearchResultIndex < 0)\r
-this._currentSearchResultIndex = (this._searchResults.length - 1);\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-showingFirstSearchResult: function()\r
-{\r
-return (this._currentSearchResultIndex === 0);\r
-},\r
-\r
-showingLastSearchResult: function()\r
-{\r
-return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));\r
-},\r
-\r
-revealLine: function(lineNumber)\r
-{\r
-this.setupSourceFrameIfNeeded();\r
-this.sourceFrame.revealLine(lineNumber);\r
-},\r
-\r
-highlightLine: function(lineNumber)\r
-{\r
-this.setupSourceFrameIfNeeded();\r
-this.sourceFrame.highlightLine(lineNumber);\r
-},\r
-\r
-addMessage: function(msg)\r
-{\r
-this.sourceFrame.addMessage(msg);\r
-},\r
-\r
-clearMessages: function()\r
-{\r
-this.sourceFrame.clearMessages();\r
-},\r
-\r
-_jumpToSearchResult: function(index)\r
-{\r
-var foundRange = this._searchResults[index];\r
-if (!foundRange)\r
-return;\r
-\r
-this.sourceFrame.markAndRevealRange(foundRange);\r
-},\r
-\r
-_sourceFrameSetupFinished: function()\r
-{\r
-this._sourceFrameSetup = true;\r
-this.resize();\r
-if (this._delayedFindSearchMatches) {\r
-this._delayedFindSearchMatches();\r
-delete this._delayedFindSearchMatches;\r
-}\r
-}\r
-}\r
-\r
-WebInspector.SourceView.prototype.__proto__ = WebInspector.ResourceView.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.FontView = function(resource)\r
-{\r
-WebInspector.ResourceView.call(this, resource);\r
-\r
-this.element.addStyleClass("font");\r
-}\r
-\r
-WebInspector.FontView.prototype = {\r
-hasContent: function()\r
-{\r
-return true;\r
-},\r
-\r
-_createContentIfNeeded: function()\r
-{\r
-if (this.fontPreviewElement)\r
-return;\r
-\r
-var uniqueFontName = "WebInspectorFontPreview" + this.resource.identifier;\r
-\r
-this.fontStyleElement = document.createElement("style");\r
-this.fontStyleElement.textContent = "@font-face { font-family: \"" + uniqueFontName + "\"; src: url(" + this.resource.url + "); }";\r
-document.head.appendChild(this.fontStyleElement);\r
-\r
-this.fontPreviewElement = document.createElement("div");\r
-this.element.appendChild(this.fontPreviewElement);\r
-\r
-this.fontPreviewElement.style.setProperty("font-family", uniqueFontName, null);\r
-this.fontPreviewElement.innerHTML = "ABCDEFGHIJKLM<br>NOPQRSTUVWXYZ<br>abcdefghijklm<br>nopqrstuvwxyz<br>1234567890";\r
-this._lineCount = this.fontPreviewElement.getElementsByTagName("br").length + 1;\r
-\r
-this.updateFontPreviewSize();\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.ResourceView.prototype.show.call(this, parentElement);\r
-this._createContentIfNeeded();\r
-this.updateFontPreviewSize();\r
-},\r
-\r
-resize: function()\r
-{\r
-this.updateFontPreviewSize();\r
-WebInspector.ResourceView.prototype.resize.call(this);\r
-},\r
-\r
-updateFontPreviewSize: function()\r
-{\r
-if (!this.fontPreviewElement || !this.visible)\r
-return;\r
-\r
-const measureFontSize = 50;\r
-this.fontPreviewElement.style.setProperty("font-size", measureFontSize + "px", null);\r
-this.fontPreviewElement.style.setProperty("position", "absolute", null);\r
-this.fontPreviewElement.style.removeProperty("height");\r
-\r
-const height = this.fontPreviewElement.offsetHeight;\r
-const width = this.fontPreviewElement.offsetWidth;\r
-\r
-\r
-const containerWidth = this.element.offsetWidth - 50;\r
-\r
-if (!height || !width || !containerWidth) {\r
-this.fontPreviewElement.style.removeProperty("font-size");\r
-this.fontPreviewElement.style.removeProperty("position");\r
-return;\r
-}\r
-\r
-var realLineHeight = Math.floor(height / this._lineCount);\r
-var fontSizeLineRatio = measureFontSize / realLineHeight;\r
-var widthRatio = containerWidth / width;\r
-var finalFontSize = Math.floor(realLineHeight * widthRatio * fontSizeLineRatio) - 2;\r
-\r
-this.fontPreviewElement.style.setProperty("font-size", finalFontSize + "px", null);\r
-this.fontPreviewElement.style.setProperty("height", this.fontPreviewElement.offsetHeight + "px", null);\r
-this.fontPreviewElement.style.removeProperty("position");\r
-}\r
-}\r
-\r
-WebInspector.FontView.prototype.__proto__ = WebInspector.ResourceView.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ImageView = function(resource)\r
-{\r
-WebInspector.ResourceView.call(this, resource);\r
-\r
-this.element.addStyleClass("image");\r
-}\r
-\r
-WebInspector.ImageView.prototype = {\r
-hasContent: function()\r
-{\r
-return true;\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.ResourceView.prototype.show.call(this, parentElement);\r
-this._createContentIfNeeded();\r
-},\r
-\r
-_createContentIfNeeded: function()\r
-{\r
-if (this._container)\r
-return;\r
-\r
-var imageContainer = document.createElement("div");\r
-imageContainer.className = "image";\r
-this.element.appendChild(imageContainer);\r
-\r
-var imagePreviewElement = document.createElement("img");\r
-imagePreviewElement.addStyleClass("resource-image-view");\r
-imageContainer.appendChild(imagePreviewElement);\r
-\r
-this._container = document.createElement("div");\r
-this._container.className = "info";\r
-this.element.appendChild(this._container);\r
-\r
-var imageNameElement = document.createElement("h1");\r
-imageNameElement.className = "title";\r
-imageNameElement.textContent = this.resource.displayName;\r
-this._container.appendChild(imageNameElement);\r
-\r
-var infoListElement = document.createElement("dl");\r
-infoListElement.className = "infoList";\r
-\r
-function onResourceContent(element, content)\r
-{\r
-imagePreviewElement.setAttribute("src", this.resource.contentURL);\r
-}\r
-this.resource.requestContent(onResourceContent.bind(this));\r
-\r
-\r
-function onImageLoad()\r
-{\r
-var content = this.resource.content;\r
-if (content)\r
-var resourceSize = this._base64ToSize(content);\r
-else\r
-var resourceSize = this.resource.resourceSize;\r
-\r
-var imageProperties = [\r
-{ name: WebInspector.UIString("Dimensions"), value: WebInspector.UIString("%d × %d", imagePreviewElement.naturalWidth, imagePreviewElement.naturalHeight) },\r
-{ name: WebInspector.UIString("File size"), value: Number.bytesToString(resourceSize, WebInspector.UIString) },\r
-{ name: WebInspector.UIString("MIME type"), value: this.resource.mimeType }\r
-];\r
-\r
-infoListElement.removeChildren();\r
-for (var i = 0; i < imageProperties.length; ++i) {\r
-var dt = document.createElement("dt");\r
-dt.textContent = imageProperties[i].name;\r
-infoListElement.appendChild(dt);\r
-var dd = document.createElement("dd");\r
-dd.textContent = imageProperties[i].value;\r
-infoListElement.appendChild(dd);\r
-}\r
-this._container.appendChild(infoListElement);\r
-}\r
-imagePreviewElement.addEventListener("load", onImageLoad.bind(this), false);\r
-},\r
-\r
-_base64ToSize: function(content)\r
-{\r
-if (!content.length)\r
-return 0;\r
-var size = (content.length || 0) * 3 / 4;\r
-if (content.length > 0 && content[content.length - 1] === "=")\r
-size--;\r
-if (content.length > 1 && content[content.length - 2] === "=")\r
-size--;\r
-return size;\r
-}\r
-}\r
-\r
-WebInspector.ImageView.prototype.__proto__ = WebInspector.ResourceView.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DatabaseTableView = function(database, tableName)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.database = database;\r
-this.tableName = tableName;\r
-\r
-this.element.addStyleClass("storage-view");\r
-this.element.addStyleClass("table");\r
-\r
-this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");\r
-this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);\r
-}\r
-\r
-WebInspector.DatabaseTableView.prototype = {\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this.update();\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-return [this.refreshButton.element];\r
-},\r
-\r
-update: function()\r
-{\r
-this.database.executeSql("SELECT * FROM " + this.tableName, this._queryFinished.bind(this), this._queryError.bind(this));\r
-},\r
-\r
-_queryFinished: function(columnNames, values)\r
-{\r
-this.element.removeChildren();\r
-\r
-var dataGrid = WebInspector.panels.resources.dataGridForResult(columnNames, values);\r
-if (!dataGrid) {\r
-var emptyMsgElement = document.createElement("div");\r
-emptyMsgElement.className = "storage-empty-view";\r
-emptyMsgElement.textContent = WebInspector.UIString("The “%s”\ntable is empty.", this.tableName);\r
-this.element.appendChild(emptyMsgElement);\r
-return;\r
-}\r
-\r
-this.element.appendChild(dataGrid.element);\r
-dataGrid.autoSizeColumns(5);\r
-},\r
-\r
-_queryError: function(error)\r
-{\r
-this.element.removeChildren();\r
-\r
-var errorMsgElement = document.createElement("div");\r
-errorMsgElement.className = "storage-table-error";\r
-errorMsgElement.textContent = WebInspector.UIString("An error occurred trying to\nread the “%s” table.", this.tableName);\r
-this.element.appendChild(errorMsgElement);\r
-},\r
-\r
-_refreshButtonClicked: function(event)\r
-{\r
-this.update();\r
-}\r
-}\r
-\r
-WebInspector.DatabaseTableView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DatabaseQueryView = function(database)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.database = database;\r
-\r
-this.element.addStyleClass("storage-view");\r
-this.element.addStyleClass("query");\r
-this.element.addStyleClass("monospace");\r
-this.element.tabIndex = 0;\r
-\r
-this.element.addEventListener("selectstart", this._selectStart.bind(this), false);\r
-\r
-this.promptElement = document.createElement("div");\r
-this.promptElement.className = "database-query-prompt";\r
-this.promptElement.appendChild(document.createElement("br"));\r
-this.promptElement.addEventListener("keydown", this._promptKeyDown.bind(this), true);\r
-this.element.appendChild(this.promptElement);\r
-\r
-this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), " ");\r
-}\r
-\r
-WebInspector.DatabaseQueryView.prototype = {\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-\r
-function moveBackIfOutside()\r
-{\r
-if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)\r
-this.prompt.moveCaretToEndOfPrompt();\r
-}\r
-\r
-setTimeout(moveBackIfOutside.bind(this), 0);\r
-},\r
-\r
-completions: function(wordRange, bestMatchOnly, completionsReadyCallback)\r
-{\r
-var prefix = wordRange.toString().toLowerCase();\r
-if (!prefix.length)\r
-return;\r
-\r
-var results = [];\r
-\r
-function accumulateMatches(textArray)\r
-{\r
-if (bestMatchOnly && results.length)\r
-return;\r
-for (var i = 0; i < textArray.length; ++i) {\r
-var text = textArray[i].toLowerCase();\r
-if (text.length < prefix.length)\r
-continue;\r
-if (text.indexOf(prefix) !== 0)\r
-continue;\r
-results.push(textArray[i]);\r
-if (bestMatchOnly)\r
-return;\r
-}\r
-}\r
-\r
-function tableNamesCallback(tableNames)\r
-{\r
-accumulateMatches(tableNames.map(function(name) { return name + " " }));\r
-accumulateMatches(["SELECT ", "FROM ", "WHERE ", "LIMIT ", "DELETE FROM ", "CREATE ", "DROP ", "TABLE ", "INDEX ", "UPDATE ", "INSERT INTO ", "VALUES ("]);\r
-\r
-completionsReadyCallback(results);\r
-}\r
-this.database.getTableNames(tableNamesCallback);\r
-},\r
-\r
-_promptKeyDown: function(event)\r
-{\r
-if (isEnterKey(event)) {\r
-this._enterKeyPressed(event);\r
-return;\r
-}\r
-},\r
-\r
-_selectStart: function(event)\r
-{\r
-if (this._selectionTimeout)\r
-clearTimeout(this._selectionTimeout);\r
-\r
-this.prompt.clearAutoComplete();\r
-\r
-function moveBackIfOutside()\r
-{\r
-delete this._selectionTimeout;\r
-if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)\r
-this.prompt.moveCaretToEndOfPrompt();\r
-this.prompt.autoCompleteSoon();\r
-}\r
-\r
-this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);\r
-},\r
-\r
-_enterKeyPressed: function(event)\r
-{\r
-event.preventDefault();\r
-event.stopPropagation();\r
-\r
-this.prompt.clearAutoComplete(true);\r
-\r
-var query = this.prompt.text;\r
-if (!query.length)\r
-return;\r
-\r
-this.prompt.history.push(query);\r
-this.prompt.historyOffset = 0;\r
-this.prompt.text = "";\r
-\r
-this.database.executeSql(query, this._queryFinished.bind(this, query), this._queryError.bind(this, query));\r
-},\r
-\r
-_queryFinished: function(query, columnNames, values)\r
-{\r
-var dataGrid = WebInspector.panels.resources.dataGridForResult(columnNames, values);\r
-var trimmedQuery = query.trim();\r
-\r
-if (dataGrid) {\r
-dataGrid.element.addStyleClass("inline");\r
-this._appendQueryResult(trimmedQuery, dataGrid.element);\r
-dataGrid.autoSizeColumns(5);            \r
-}\r
-\r
-if (trimmedQuery.match(/^create /i) || trimmedQuery.match(/^drop table /i))\r
-WebInspector.panels.resources.updateDatabaseTables(this.database);\r
-},\r
-\r
-_queryError: function(query, error)\r
-{\r
-if (error.message)\r
-var message = error.message;\r
-else if (error.code == 2)\r
-var message = WebInspector.UIString("Database no longer has expected version.");\r
-else\r
-var message = WebInspector.UIString("An unexpected error %s occurred.", error.code);\r
-\r
-this._appendQueryResult(query, message, "error");\r
-},\r
-\r
-_appendQueryResult: function(query, result, resultClassName)\r
-{\r
-var element = document.createElement("div");\r
-element.className = "database-user-query";\r
-\r
-var commandTextElement = document.createElement("span");\r
-commandTextElement.className = "database-query-text";\r
-commandTextElement.textContent = query;\r
-element.appendChild(commandTextElement);\r
-\r
-var resultElement = document.createElement("div");\r
-resultElement.className = "database-query-result";\r
-\r
-if (resultClassName)\r
-resultElement.addStyleClass(resultClassName);\r
-\r
-if (typeof result === "string" || result instanceof String)\r
-resultElement.textContent = result;\r
-else if (result && result.nodeName)\r
-resultElement.appendChild(result);\r
-\r
-if (resultElement.childNodes.length)\r
-element.appendChild(resultElement);\r
-\r
-this.element.insertBefore(element, this.promptElement);\r
-this.promptElement.scrollIntoView(false);\r
-}\r
-}\r
-\r
-WebInspector.DatabaseQueryView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ScriptView = function(script)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("script-view");\r
-\r
-this.script = script;\r
-this.script.addEventListener(WebInspector.Script.Events.SourceChanged, this._scriptSourceChanged, this);\r
-\r
-this._frameNeedsSetup = true;\r
-this._sourceFrameSetup = false;\r
-this.sourceFrame = new WebInspector.SourceFrame(this.element, [script], WebInspector.panels.scripts.canEditScripts());\r
-}\r
-\r
-WebInspector.ScriptView.prototype = {\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this.setupSourceFrameIfNeeded();\r
-this.sourceFrame.visible = true;\r
-this.resize();\r
-},\r
-\r
-setupSourceFrameIfNeeded: function()\r
-{\r
-if (!this._frameNeedsSetup)\r
-return;\r
-delete this._frameNeedsSetup;\r
-\r
-this.attach();\r
-\r
-if (this.script.source)\r
-this._sourceFrameSetupFinished();\r
-else\r
-InspectorBackend.getScriptSource(this.script.sourceID, this._didGetScriptSource.bind(this));\r
-},\r
-\r
-_didGetScriptSource: function(source)\r
-{\r
-this.script.source = source || WebInspector.UIString("<source is not available>");\r
-this._sourceFrameSetupFinished();\r
-},\r
-\r
-_sourceFrameSetupFinished: function()\r
-{\r
-this.sourceFrame.setContent("text/javascript", this._prependWhitespace(this.script.source));\r
-this._sourceFrameSetup = true;\r
-},\r
-\r
-_prependWhitespace: function(content) {\r
-var prefix = "";\r
-for (var i = 0; i < this.script.startingLine - 1; ++i)\r
-prefix += "\n";\r
-return prefix + content;\r
-},\r
-\r
-attach: function()\r
-{\r
-if (!this.element.parentNode)\r
-document.getElementById("script-resource-views").appendChild(this.element);\r
-},\r
-\r
-_scriptSourceChanged: function(event)\r
-{\r
-this.sourceFrame.updateContent(this._prependWhitespace(this.script.source));\r
-},\r
-\r
-\r
-\r
-\r
-hide: WebInspector.SourceView.prototype.hide,\r
-revealLine: WebInspector.SourceView.prototype.revealLine,\r
-highlightLine: WebInspector.SourceView.prototype.highlightLine,\r
-addMessage: WebInspector.SourceView.prototype.addMessage,\r
-clearMessages: WebInspector.SourceView.prototype.clearMessages,\r
-searchCanceled: WebInspector.SourceView.prototype.searchCanceled,\r
-performSearch: WebInspector.SourceView.prototype.performSearch,\r
-jumpToFirstSearchResult: WebInspector.SourceView.prototype.jumpToFirstSearchResult,\r
-jumpToLastSearchResult: WebInspector.SourceView.prototype.jumpToLastSearchResult,\r
-jumpToNextSearchResult: WebInspector.SourceView.prototype.jumpToNextSearchResult,\r
-jumpToPreviousSearchResult: WebInspector.SourceView.prototype.jumpToPreviousSearchResult,\r
-showingFirstSearchResult: WebInspector.SourceView.prototype.showingFirstSearchResult,\r
-showingLastSearchResult: WebInspector.SourceView.prototype.showingLastSearchResult,\r
-_jumpToSearchResult: WebInspector.SourceView.prototype._jumpToSearchResult,\r
-resize: WebInspector.SourceView.prototype.resize\r
-}\r
-\r
-WebInspector.ScriptView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ProfileDataGridNode = function(profileView, profileNode, owningTree, hasChildren)\r
-{\r
-this.profileView = profileView;\r
-this.profileNode = profileNode;\r
-\r
-WebInspector.DataGridNode.call(this, null, hasChildren);\r
-\r
-this.addEventListener("populate", this._populate, this);\r
-\r
-this.tree = owningTree;\r
-\r
-this.childrenByCallUID = {};\r
-this.lastComparator = null;\r
-\r
-this.callUID = profileNode.callUID;\r
-this.selfTime = profileNode.selfTime;\r
-this.totalTime = profileNode.totalTime;\r
-this.functionName = profileNode.functionName;\r
-this.numberOfCalls = profileNode.numberOfCalls;\r
-this.url = profileNode.url;\r
-}\r
-\r
-WebInspector.ProfileDataGridNode.prototype = {\r
-get data()\r
-{\r
-function formatMilliseconds(time)\r
-{\r
-return Number.secondsToString(time / 1000, WebInspector.UIString, !Preferences.samplingCPUProfiler);\r
-}\r
-\r
-var data = {};\r
-\r
-data["function"] = this.functionName;\r
-data["calls"] = this.numberOfCalls;\r
-\r
-if (this.profileView.showSelfTimeAsPercent)\r
-data["self"] = WebInspector.UIString("%.2f%%", this.selfPercent);\r
-else\r
-data["self"] = formatMilliseconds(this.selfTime);\r
-\r
-if (this.profileView.showTotalTimeAsPercent)\r
-data["total"] = WebInspector.UIString("%.2f%%", this.totalPercent);\r
-else\r
-data["total"] = formatMilliseconds(this.totalTime);\r
-\r
-if (this.profileView.showAverageTimeAsPercent)\r
-data["average"] = WebInspector.UIString("%.2f%%", this.averagePercent);\r
-else\r
-data["average"] = formatMilliseconds(this.averageTime);\r
-\r
-return data;\r
-},\r
-\r
-createCell: function(columnIdentifier)\r
-{\r
-var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);\r
-\r
-if (columnIdentifier === "self" && this._searchMatchedSelfColumn)\r
-cell.addStyleClass("highlight");\r
-else if (columnIdentifier === "total" && this._searchMatchedTotalColumn)\r
-cell.addStyleClass("highlight");\r
-else if (columnIdentifier === "average" && this._searchMatchedAverageColumn)\r
-cell.addStyleClass("highlight");\r
-else if (columnIdentifier === "calls" && this._searchMatchedCallsColumn)\r
-cell.addStyleClass("highlight");\r
-\r
-if (columnIdentifier !== "function")\r
-return cell;\r
-\r
-if (this.profileNode._searchMatchedFunctionColumn)\r
-cell.addStyleClass("highlight");\r
-\r
-if (this.profileNode.url) {\r
-var lineNumber;\r
-if (this.profileNode.lineNumber > 0)\r
-lineNumber = this.profileNode.lineNumber;\r
-var urlElement = WebInspector.linkifyResourceAsNode(this.profileNode.url, "scripts", lineNumber, "profile-node-file");\r
-cell.insertBefore(urlElement, cell.firstChild);\r
-}\r
-\r
-return cell;\r
-},\r
-\r
-select: function(supressSelectedEvent)\r
-{\r
-WebInspector.DataGridNode.prototype.select.call(this, supressSelectedEvent);\r
-this.profileView._dataGridNodeSelected(this);\r
-},\r
-\r
-deselect: function(supressDeselectedEvent)\r
-{\r
-WebInspector.DataGridNode.prototype.deselect.call(this, supressDeselectedEvent);\r
-this.profileView._dataGridNodeDeselected(this);\r
-},\r
-\r
-sort: function(  comparator,   force)\r
-{\r
-var gridNodeGroups = [[this]];\r
-\r
-for (var gridNodeGroupIndex = 0; gridNodeGroupIndex < gridNodeGroups.length; ++gridNodeGroupIndex) {\r
-var gridNodes = gridNodeGroups[gridNodeGroupIndex];\r
-var count = gridNodes.length;\r
-\r
-for (var index = 0; index < count; ++index) {\r
-var gridNode = gridNodes[index];\r
-\r
-\r
-\r
-if (!force && (!gridNode.expanded || gridNode.lastComparator === comparator)) {\r
-if (gridNode.children.length)\r
-gridNode.shouldRefreshChildren = true;\r
-continue;\r
-}\r
-\r
-gridNode.lastComparator = comparator;\r
-\r
-var children = gridNode.children;\r
-var childCount = children.length;\r
-\r
-if (childCount) {\r
-children.sort(comparator);\r
-\r
-for (var childIndex = 0; childIndex < childCount; ++childIndex)\r
-children[childIndex]._recalculateSiblings(childIndex);\r
-\r
-gridNodeGroups.push(children);\r
-}\r
-}\r
-}\r
-},\r
-\r
-insertChild: function(  profileDataGridNode, index)\r
-{\r
-WebInspector.DataGridNode.prototype.insertChild.call(this, profileDataGridNode, index);\r
-\r
-this.childrenByCallUID[profileDataGridNode.callUID] = profileDataGridNode;\r
-},\r
-\r
-removeChild: function(  profileDataGridNode)\r
-{\r
-WebInspector.DataGridNode.prototype.removeChild.call(this, profileDataGridNode);\r
-\r
-delete this.childrenByCallUID[profileDataGridNode.callUID];\r
-},\r
-\r
-removeChildren: function(  profileDataGridNode)\r
-{\r
-WebInspector.DataGridNode.prototype.removeChildren.call(this);\r
-\r
-this.childrenByCallUID = {};\r
-},\r
-\r
-findChild: function(  node)\r
-{\r
-if (!node)\r
-return null;\r
-return this.childrenByCallUID[node.callUID];\r
-},\r
-\r
-get averageTime()\r
-{\r
-return this.selfTime / Math.max(1, this.numberOfCalls);\r
-},\r
-\r
-get averagePercent()\r
-{\r
-return this.averageTime / this.tree.totalTime * 100.0;\r
-},\r
-\r
-get selfPercent()\r
-{\r
-return this.selfTime / this.tree.totalTime * 100.0;\r
-},\r
-\r
-get totalPercent()\r
-{\r
-return this.totalTime / this.tree.totalTime * 100.0;\r
-},\r
-\r
-get _parent()\r
-{\r
-return this.parent !== this.dataGrid ? this.parent : this.tree;\r
-},\r
-\r
-_populate: function(event)\r
-{\r
-this._sharedPopulate();\r
-\r
-if (this._parent) {\r
-var currentComparator = this._parent.lastComparator;\r
-\r
-if (currentComparator)\r
-this.sort(currentComparator, true);\r
-}\r
-\r
-if (this.removeEventListener)\r
-this.removeEventListener("populate", this._populate, this);\r
-},\r
-\r
-\r
-\r
-_save: function()\r
-{\r
-if (this._savedChildren)\r
-return;\r
-\r
-this._savedSelfTime = this.selfTime;\r
-this._savedTotalTime = this.totalTime;\r
-this._savedNumberOfCalls = this.numberOfCalls;\r
-\r
-this._savedChildren = this.children.slice();\r
-},\r
-\r
-\r
-\r
-_restore: function()\r
-{\r
-if (!this._savedChildren)\r
-return;\r
-\r
-this.selfTime = this._savedSelfTime;\r
-this.totalTime = this._savedTotalTime;\r
-this.numberOfCalls = this._savedNumberOfCalls;\r
-\r
-this.removeChildren();\r
-\r
-var children = this._savedChildren;\r
-var count = children.length;\r
-\r
-for (var index = 0; index < count; ++index) {\r
-children[index]._restore();\r
-this.appendChild(children[index]);\r
-}\r
-},\r
-\r
-_merge: function(child, shouldAbsorb)\r
-{\r
-this.selfTime += child.selfTime;\r
-\r
-if (!shouldAbsorb) {\r
-this.totalTime += child.totalTime;\r
-this.numberOfCalls += child.numberOfCalls;\r
-}\r
-\r
-var children = this.children.slice();\r
-\r
-this.removeChildren();\r
-\r
-var count = children.length;\r
-\r
-for (var index = 0; index < count; ++index) {\r
-if (!shouldAbsorb || children[index] !== child)\r
-this.appendChild(children[index]);\r
-}\r
-\r
-children = child.children.slice();\r
-count = children.length;\r
-\r
-for (var index = 0; index < count; ++index) {\r
-var orphanedChild = children[index],\r
-existingChild = this.childrenByCallUID[orphanedChild.callUID];\r
-\r
-if (existingChild)\r
-existingChild._merge(orphanedChild, false);\r
-else\r
-this.appendChild(orphanedChild);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.ProfileDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;\r
-\r
-WebInspector.ProfileDataGridTree = function(profileView, profileNode)\r
-{\r
-this.tree = this;\r
-this.children = [];\r
-\r
-this.profileView = profileView;\r
-\r
-this.totalTime = profileNode.totalTime;\r
-this.lastComparator = null;\r
-\r
-this.childrenByCallUID = {};\r
-}\r
-\r
-WebInspector.ProfileDataGridTree.prototype = {\r
-get expanded()\r
-{\r
-return true;\r
-},\r
-\r
-appendChild: function(child)\r
-{\r
-this.insertChild(child, this.children.length);\r
-},\r
-\r
-insertChild: function(child, index)\r
-{\r
-this.children.splice(index, 0, child);\r
-this.childrenByCallUID[child.callUID] = child;\r
-},\r
-\r
-removeChildren: function()\r
-{\r
-this.children = [];\r
-this.childrenByCallUID = {};\r
-},\r
-\r
-findChild: WebInspector.ProfileDataGridNode.prototype.findChild,\r
-sort: WebInspector.ProfileDataGridNode.prototype.sort,\r
-\r
-_save: function()\r
-{\r
-if (this._savedChildren)\r
-return;\r
-\r
-this._savedTotalTime = this.totalTime;\r
-this._savedChildren = this.children.slice();\r
-},\r
-\r
-restore: function()\r
-{\r
-if (!this._savedChildren)\r
-return;\r
-\r
-this.children = this._savedChildren;\r
-this.totalTime = this._savedTotalTime;\r
-\r
-var children = this.children;\r
-var count = children.length;\r
-\r
-for (var index = 0; index < count; ++index)\r
-children[index]._restore();\r
-\r
-this._savedChildren = null;\r
-}\r
-}\r
-\r
-WebInspector.ProfileDataGridTree.propertyComparators = [{}, {}];\r
-\r
-WebInspector.ProfileDataGridTree.propertyComparator = function(  property,   isAscending)\r
-{\r
-var comparator = this.propertyComparators[(isAscending ? 1 : 0)][property];\r
-\r
-if (!comparator) {\r
-if (isAscending) {\r
-comparator = function(lhs, rhs)\r
-{\r
-if (lhs[property] < rhs[property])\r
-return -1;\r
-\r
-if (lhs[property] > rhs[property])\r
-return 1;\r
-\r
-return 0;\r
-}\r
-} else {\r
-comparator = function(lhs, rhs)\r
-{\r
-if (lhs[property] > rhs[property])\r
-return -1;\r
-\r
-if (lhs[property] < rhs[property])\r
-return 1;\r
-\r
-return 0;\r
-}\r
-}\r
-\r
-this.propertyComparators[(isAscending ? 1 : 0)][property] = comparator;\r
-}\r
-\r
-return comparator;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.BottomUpProfileDataGridNode = function(  profileView,   profileNode,   owningTree)\r
-{\r
-WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, this._willHaveChildren(profileNode));\r
-\r
-this._remainingNodeInfos = [];\r
-}\r
-\r
-WebInspector.BottomUpProfileDataGridNode.prototype = {\r
-_takePropertiesFromProfileDataGridNode: function(  profileDataGridNode)\r
-{\r
-this._save();\r
-\r
-this.selfTime = profileDataGridNode.selfTime;\r
-this.totalTime = profileDataGridNode.totalTime;\r
-this.numberOfCalls = profileDataGridNode.numberOfCalls;\r
-},\r
-\r
-\r
-_keepOnlyChild: function(  child)\r
-{\r
-this._save();\r
-\r
-this.removeChildren();\r
-this.appendChild(child);\r
-},\r
-\r
-_exclude: function(aCallUID)\r
-{\r
-if (this._remainingNodeInfos)\r
-this._populate();\r
-\r
-this._save();\r
-\r
-var children = this.children;\r
-var index = this.children.length;\r
-\r
-while (index--)\r
-children[index]._exclude(aCallUID);\r
-\r
-var child = this.childrenByCallUID[aCallUID];\r
-\r
-if (child)\r
-this._merge(child, true);\r
-},\r
-\r
-_restore: function()\r
-{\r
-WebInspector.ProfileDataGridNode.prototype._restore();\r
-\r
-if (!this.children.length)\r
-this.hasChildren = this._willHaveChildren();\r
-},\r
-\r
-_merge: function(  child,   shouldAbsorb)\r
-{\r
-this.selfTime -= child.selfTime;\r
-\r
-WebInspector.ProfileDataGridNode.prototype._merge.call(this, child, shouldAbsorb);\r
-},\r
-\r
-_sharedPopulate: function()\r
-{\r
-var remainingNodeInfos = this._remainingNodeInfos;\r
-var count = remainingNodeInfos.length;\r
-\r
-for (var index = 0; index < count; ++index) {\r
-var nodeInfo = remainingNodeInfos[index];\r
-var ancestor = nodeInfo.ancestor;\r
-var focusNode = nodeInfo.focusNode;\r
-var child = this.findChild(ancestor);\r
-\r
-\r
-if (child) {\r
-var totalTimeAccountedFor = nodeInfo.totalTimeAccountedFor;\r
-\r
-child.selfTime += focusNode.selfTime;\r
-child.numberOfCalls += focusNode.numberOfCalls;\r
-\r
-if (!totalTimeAccountedFor)\r
-child.totalTime += focusNode.totalTime;\r
-} else {\r
-\r
-\r
-var child = new WebInspector.BottomUpProfileDataGridNode(this.profileView, ancestor, this.tree);\r
-\r
-if (ancestor !== focusNode) {\r
-\r
-child.selfTime = focusNode.selfTime;\r
-child.totalTime = focusNode.totalTime;\r
-child.numberOfCalls = focusNode.numberOfCalls;\r
-}\r
-\r
-this.appendChild(child);\r
-}\r
-\r
-var parent = ancestor.parent;\r
-if (parent && parent.parent) {\r
-nodeInfo.ancestor = parent;\r
-child._remainingNodeInfos.push(nodeInfo);\r
-}\r
-}\r
-\r
-delete this._remainingNodeInfos;\r
-},\r
-\r
-_willHaveChildren: function(profileNode)\r
-{\r
-profileNode = profileNode || this.profileNode;\r
-\r
-\r
-return !!(profileNode.parent && profileNode.parent.parent);\r
-}\r
-}\r
-\r
-WebInspector.BottomUpProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;\r
-\r
-WebInspector.BottomUpProfileDataGridTree = function(  aProfileView,   aProfileNode)\r
-{\r
-WebInspector.ProfileDataGridTree.call(this, aProfileView, aProfileNode);\r
-\r
-\r
-var profileNodeUIDs = 0;\r
-var profileNodeGroups = [[], [aProfileNode]];\r
-var visitedProfileNodesForCallUID = {};\r
-\r
-this._remainingNodeInfos = [];\r
-\r
-for (var profileNodeGroupIndex = 0; profileNodeGroupIndex < profileNodeGroups.length; ++profileNodeGroupIndex) {\r
-var parentProfileNodes = profileNodeGroups[profileNodeGroupIndex];\r
-var profileNodes = profileNodeGroups[++profileNodeGroupIndex];\r
-var count = profileNodes.length;\r
-\r
-for (var index = 0; index < count; ++index) {\r
-var profileNode = profileNodes[index];\r
-\r
-if (!profileNode.UID)\r
-profileNode.UID = ++profileNodeUIDs;\r
-\r
-if (profileNode.head && profileNode !== profileNode.head) {\r
-\r
-var visitedNodes = visitedProfileNodesForCallUID[profileNode.callUID];\r
-var totalTimeAccountedFor = false;\r
-\r
-if (!visitedNodes) {\r
-visitedNodes = {}\r
-visitedProfileNodesForCallUID[profileNode.callUID] = visitedNodes;\r
-} else {\r
-\r
-\r
-var parentCount = parentProfileNodes.length;\r
-for (var parentIndex = 0; parentIndex < parentCount; ++parentIndex) {\r
-if (visitedNodes[parentProfileNodes[parentIndex].UID]) {\r
-totalTimeAccountedFor = true;\r
-break;\r
-}\r
-}\r
-}\r
-\r
-visitedNodes[profileNode.UID] = true;\r
-\r
-this._remainingNodeInfos.push({ ancestor:profileNode, focusNode:profileNode, totalTimeAccountedFor:totalTimeAccountedFor });\r
-}\r
-\r
-var children = profileNode.children;\r
-if (children.length) {\r
-profileNodeGroups.push(parentProfileNodes.concat([profileNode]))\r
-profileNodeGroups.push(children);\r
-}\r
-}\r
-}\r
-\r
-\r
-WebInspector.BottomUpProfileDataGridNode.prototype._populate.call(this);\r
-\r
-return this;\r
-}\r
-\r
-WebInspector.BottomUpProfileDataGridTree.prototype = {\r
-\r
-focus: function(  profileDataGridNode)\r
-{\r
-if (!profileDataGridNode)\r
-return;\r
-\r
-this._save();\r
-\r
-var currentNode = profileDataGridNode;\r
-var focusNode = profileDataGridNode;\r
-\r
-while (currentNode.parent && (currentNode instanceof WebInspector.ProfileDataGridNode)) {\r
-currentNode._takePropertiesFromProfileDataGridNode(profileDataGridNode);\r
-\r
-focusNode = currentNode;\r
-currentNode = currentNode.parent;\r
-\r
-if (currentNode instanceof WebInspector.ProfileDataGridNode)\r
-currentNode._keepOnlyChild(focusNode);\r
-}\r
-\r
-this.children = [focusNode];\r
-this.totalTime = profileDataGridNode.totalTime;\r
-},\r
-\r
-exclude: function(  profileDataGridNode)\r
-{\r
-if (!profileDataGridNode)\r
-return;\r
-\r
-this._save();\r
-\r
-var excludedCallUID = profileDataGridNode.callUID;\r
-var excludedTopLevelChild = this.childrenByCallUID[excludedCallUID];\r
-\r
-\r
-\r
-if (excludedTopLevelChild)\r
-this.children.remove(excludedTopLevelChild);\r
-\r
-var children = this.children;\r
-var count = children.length;\r
-\r
-for (var index = 0; index < count; ++index)\r
-children[index]._exclude(excludedCallUID);\r
-\r
-if (this.lastComparator)\r
-this.sort(this.lastComparator, true);\r
-},\r
-\r
-_sharedPopulate: WebInspector.BottomUpProfileDataGridNode.prototype._sharedPopulate\r
-}\r
-\r
-WebInspector.BottomUpProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TopDownProfileDataGridNode = function(  profileView,   profileNode,   owningTree)\r
-{\r
-var hasChildren = (profileNode.children && profileNode.children.length);\r
-\r
-WebInspector.ProfileDataGridNode.call(this, profileView, profileNode, owningTree, hasChildren);\r
-\r
-this._remainingChildren = profileNode.children;\r
-}\r
-\r
-WebInspector.TopDownProfileDataGridNode.prototype = {\r
-_sharedPopulate: function()\r
-{\r
-var children = this._remainingChildren;\r
-var childrenLength = children.length;\r
-\r
-for (var i = 0; i < childrenLength; ++i)\r
-this.appendChild(new WebInspector.TopDownProfileDataGridNode(this.profileView, children[i], this.tree));\r
-\r
-this._remainingChildren = null;\r
-},\r
-\r
-_exclude: function(aCallUID)\r
-{\r
-if (this._remainingChildren)\r
-this._populate();\r
-\r
-this._save();\r
-\r
-var children = this.children;\r
-var index = this.children.length;\r
-\r
-while (index--)\r
-children[index]._exclude(aCallUID);\r
-\r
-var child = this.childrenByCallUID[aCallUID];\r
-\r
-if (child)\r
-this._merge(child, true);\r
-}\r
-}\r
-\r
-WebInspector.TopDownProfileDataGridNode.prototype.__proto__ = WebInspector.ProfileDataGridNode.prototype;\r
-\r
-WebInspector.TopDownProfileDataGridTree = function(  profileView,   profileNode)\r
-{\r
-WebInspector.ProfileDataGridTree.call(this, profileView, profileNode);\r
-\r
-this._remainingChildren = profileNode.children;\r
-\r
-WebInspector.TopDownProfileDataGridNode.prototype._populate.call(this);\r
-}\r
-\r
-WebInspector.TopDownProfileDataGridTree.prototype = {\r
-focus: function(  profileDataGrideNode)\r
-{\r
-if (!profileDataGrideNode)\r
-return;\r
-\r
-this._save();\r
-profileDataGrideNode.savePosition();\r
-\r
-this.children = [profileDataGrideNode];\r
-this.totalTime = profileDataGrideNode.totalTime;\r
-},\r
-\r
-exclude: function(  profileDataGrideNode)\r
-{\r
-if (!profileDataGrideNode)\r
-return;\r
-\r
-this._save();\r
-\r
-var excludedCallUID = profileDataGrideNode.callUID;\r
-\r
-WebInspector.TopDownProfileDataGridNode.prototype._exclude.call(this, excludedCallUID);\r
-\r
-if (this.lastComparator)\r
-this.sort(this.lastComparator, true);\r
-},\r
-\r
-restore: function()\r
-{\r
-if (!this._savedChildren)\r
-return;\r
-\r
-this.children[0].restorePosition();\r
-\r
-WebInspector.ProfileDataGridTree.prototype.restore.call(this);\r
-},\r
-\r
-_merge: WebInspector.TopDownProfileDataGridNode.prototype._merge,\r
-\r
-_sharedPopulate: WebInspector.TopDownProfileDataGridNode.prototype._sharedPopulate\r
-}\r
-\r
-WebInspector.TopDownProfileDataGridTree.prototype.__proto__ = WebInspector.ProfileDataGridTree.prototype;\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.CPUProfileView = function(profile)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("profile-view");\r
-\r
-this.showSelfTimeAsPercent = true;\r
-this.showTotalTimeAsPercent = true;\r
-this.showAverageTimeAsPercent = true;\r
-\r
-var columns = { "self": { title: WebInspector.UIString("Self"), width: "72px", sort: "descending", sortable: true },\r
-"total": { title: WebInspector.UIString("Total"), width: "72px", sortable: true },\r
-"average": { title: WebInspector.UIString("Average"), width: "72px", sortable: true },\r
-"calls": { title: WebInspector.UIString("Calls"), width: "54px", sortable: true },\r
-"function": { title: WebInspector.UIString("Function"), disclosure: true, sortable: true } };\r
-\r
-if (Preferences.samplingCPUProfiler) {\r
-delete columns.average;\r
-delete columns.calls;\r
-}\r
-\r
-this.dataGrid = new WebInspector.DataGrid(columns);\r
-this.dataGrid.addEventListener("sorting changed", this._sortData, this);\r
-this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);\r
-this.element.appendChild(this.dataGrid.element);\r
-\r
-this.viewSelectElement = document.createElement("select");\r
-this.viewSelectElement.className = "status-bar-item";\r
-this.viewSelectElement.addEventListener("change", this._changeView.bind(this), false);\r
-this.view = "Heavy";\r
-\r
-var heavyViewOption = document.createElement("option");\r
-heavyViewOption.label = WebInspector.UIString("Heavy (Bottom Up)");\r
-var treeViewOption = document.createElement("option");\r
-treeViewOption.label = WebInspector.UIString("Tree (Top Down)");\r
-this.viewSelectElement.appendChild(heavyViewOption);\r
-this.viewSelectElement.appendChild(treeViewOption);\r
-\r
-this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item");\r
-this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);\r
-\r
-this.focusButton = new WebInspector.StatusBarButton(WebInspector.UIString("Focus selected function."), "focus-profile-node-status-bar-item");\r
-this.focusButton.disabled = true;\r
-this.focusButton.addEventListener("click", this._focusClicked.bind(this), false);\r
-\r
-this.excludeButton = new WebInspector.StatusBarButton(WebInspector.UIString("Exclude selected function."), "exclude-profile-node-status-bar-item");\r
-this.excludeButton.disabled = true;\r
-this.excludeButton.addEventListener("click", this._excludeClicked.bind(this), false);\r
-\r
-this.resetButton = new WebInspector.StatusBarButton(WebInspector.UIString("Restore all functions."), "reset-profile-status-bar-item");\r
-this.resetButton.visible = false;\r
-this.resetButton.addEventListener("click", this._resetClicked.bind(this), false);\r
-\r
-this.profile = profile;\r
-\r
-var self = this;\r
-function profileCallback(profile)\r
-{\r
-self.profile.head = profile.head;\r
-self._assignParentsInProfile();\r
-\r
-self.profileDataGridTree = self.bottomUpProfileDataGridTree;\r
-self.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator("selfTime", false));\r
-\r
-self.refresh();\r
-\r
-self._updatePercentButton();\r
-}\r
-\r
-InspectorBackend.getProfile(this.profile.typeId, this.profile.uid, profileCallback);\r
-}\r
-\r
-WebInspector.CPUProfileView.prototype = {\r
-get statusBarItems()\r
-{\r
-return [this.viewSelectElement, this.percentButton.element, this.focusButton.element, this.excludeButton.element, this.resetButton.element];\r
-},\r
-\r
-get profile()\r
-{\r
-return this._profile;\r
-},\r
-\r
-set profile(profile)\r
-{\r
-this._profile = profile;\r
-},\r
-\r
-get bottomUpProfileDataGridTree()\r
-{\r
-if (!this._bottomUpProfileDataGridTree)\r
-this._bottomUpProfileDataGridTree = new WebInspector.BottomUpProfileDataGridTree(this, this.profile.head);\r
-return this._bottomUpProfileDataGridTree;\r
-},\r
-\r
-get topDownProfileDataGridTree()\r
-{\r
-if (!this._topDownProfileDataGridTree)\r
-this._topDownProfileDataGridTree = new WebInspector.TopDownProfileDataGridTree(this, this.profile.head);\r
-return this._topDownProfileDataGridTree;\r
-},\r
-\r
-get currentTree()\r
-{\r
-return this._currentTree;\r
-},\r
-\r
-set currentTree(tree)\r
-{\r
-this._currentTree = tree;\r
-this.refresh();\r
-},\r
-\r
-get topDownTree()\r
-{\r
-if (!this._topDownTree) {\r
-this._topDownTree = WebInspector.TopDownTreeFactory.create(this.profile.head);\r
-this._sortProfile(this._topDownTree);\r
-}\r
-\r
-return this._topDownTree;\r
-},\r
-\r
-get bottomUpTree()\r
-{\r
-if (!this._bottomUpTree) {\r
-this._bottomUpTree = WebInspector.BottomUpTreeFactory.create(this.profile.head);\r
-this._sortProfile(this._bottomUpTree);\r
-}\r
-\r
-return this._bottomUpTree;\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this.dataGrid.updateWidths();\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.View.prototype.hide.call(this);\r
-this._currentSearchResultIndex = -1;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this.dataGrid)\r
-this.dataGrid.updateWidths();\r
-},\r
-\r
-refresh: function()\r
-{\r
-var selectedProfileNode = this.dataGrid.selectedNode ? this.dataGrid.selectedNode.profileNode : null;\r
-\r
-this.dataGrid.removeChildren();\r
-\r
-var children = this.profileDataGridTree.children;\r
-var count = children.length;\r
-\r
-for (var index = 0; index < count; ++index)\r
-this.dataGrid.appendChild(children[index]);\r
-\r
-if (selectedProfileNode)\r
-selectedProfileNode.selected = true;\r
-},\r
-\r
-refreshVisibleData: function()\r
-{\r
-var child = this.dataGrid.children[0];\r
-while (child) {\r
-child.refresh();\r
-child = child.traverseNextNode(false, null, true);\r
-}\r
-},\r
-\r
-refreshShowAsPercents: function()\r
-{\r
-this._updatePercentButton();\r
-this.refreshVisibleData();\r
-},\r
-\r
-searchCanceled: function()\r
-{\r
-if (this._searchResults) {\r
-for (var i = 0; i < this._searchResults.length; ++i) {\r
-var profileNode = this._searchResults[i].profileNode;\r
-\r
-delete profileNode._searchMatchedSelfColumn;\r
-delete profileNode._searchMatchedTotalColumn;\r
-delete profileNode._searchMatchedCallsColumn;\r
-delete profileNode._searchMatchedFunctionColumn;\r
-\r
-profileNode.refresh();\r
-}\r
-}\r
-\r
-delete this._searchFinishedCallback;\r
-this._currentSearchResultIndex = -1;\r
-this._searchResults = [];\r
-},\r
-\r
-performSearch: function(query, finishedCallback)\r
-{\r
-\r
-this.searchCanceled();\r
-\r
-query = query.trim();\r
-\r
-if (!query.length)\r
-return;\r
-\r
-this._searchFinishedCallback = finishedCallback;\r
-\r
-var greaterThan = (query.indexOf(">") === 0);\r
-var lessThan = (query.indexOf("<") === 0);\r
-var equalTo = (query.indexOf("=") === 0 || ((greaterThan || lessThan) && query.indexOf("=") === 1));\r
-var percentUnits = (query.lastIndexOf("%") === (query.length - 1));\r
-var millisecondsUnits = (query.length > 2 && query.lastIndexOf("ms") === (query.length - 2));\r
-var secondsUnits = (!millisecondsUnits && query.lastIndexOf("s") === (query.length - 1));\r
-\r
-var queryNumber = parseFloat(query);\r
-if (greaterThan || lessThan || equalTo) {\r
-if (equalTo && (greaterThan || lessThan))\r
-queryNumber = parseFloat(query.substring(2));\r
-else\r
-queryNumber = parseFloat(query.substring(1));\r
-}\r
-\r
-var queryNumberMilliseconds = (secondsUnits ? (queryNumber * 1000) : queryNumber);\r
-\r
-\r
-if (!isNaN(queryNumber) && !(greaterThan || lessThan))\r
-equalTo = true;\r
-\r
-function matchesQuery(  profileDataGridNode)\r
-{\r
-delete profileDataGridNode._searchMatchedSelfColumn;\r
-delete profileDataGridNode._searchMatchedTotalColumn;\r
-delete profileDataGridNode._searchMatchedAverageColumn;\r
-delete profileDataGridNode._searchMatchedCallsColumn;\r
-delete profileDataGridNode._searchMatchedFunctionColumn;\r
-\r
-if (percentUnits) {\r
-if (lessThan) {\r
-if (profileDataGridNode.selfPercent < queryNumber)\r
-profileDataGridNode._searchMatchedSelfColumn = true;\r
-if (profileDataGridNode.totalPercent < queryNumber)\r
-profileDataGridNode._searchMatchedTotalColumn = true;\r
-if (profileDataGridNode.averagePercent < queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedAverageColumn = true;\r
-} else if (greaterThan) {\r
-if (profileDataGridNode.selfPercent > queryNumber)\r
-profileDataGridNode._searchMatchedSelfColumn = true;\r
-if (profileDataGridNode.totalPercent > queryNumber)\r
-profileDataGridNode._searchMatchedTotalColumn = true;\r
-if (profileDataGridNode.averagePercent < queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedAverageColumn = true;\r
-}\r
-\r
-if (equalTo) {\r
-if (profileDataGridNode.selfPercent == queryNumber)\r
-profileDataGridNode._searchMatchedSelfColumn = true;\r
-if (profileDataGridNode.totalPercent == queryNumber)\r
-profileDataGridNode._searchMatchedTotalColumn = true;\r
-if (profileDataGridNode.averagePercent < queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedAverageColumn = true;\r
-}\r
-} else if (millisecondsUnits || secondsUnits) {\r
-if (lessThan) {\r
-if (profileDataGridNode.selfTime < queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedSelfColumn = true;\r
-if (profileDataGridNode.totalTime < queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedTotalColumn = true;\r
-if (profileDataGridNode.averageTime < queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedAverageColumn = true;\r
-} else if (greaterThan) {\r
-if (profileDataGridNode.selfTime > queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedSelfColumn = true;\r
-if (profileDataGridNode.totalTime > queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedTotalColumn = true;\r
-if (profileDataGridNode.averageTime > queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedAverageColumn = true;\r
-}\r
-\r
-if (equalTo) {\r
-if (profileDataGridNode.selfTime == queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedSelfColumn = true;\r
-if (profileDataGridNode.totalTime == queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedTotalColumn = true;\r
-if (profileDataGridNode.averageTime == queryNumberMilliseconds)\r
-profileDataGridNode._searchMatchedAverageColumn = true;\r
-}\r
-} else {\r
-if (equalTo && profileDataGridNode.numberOfCalls == queryNumber)\r
-profileDataGridNode._searchMatchedCallsColumn = true;\r
-if (greaterThan && profileDataGridNode.numberOfCalls > queryNumber)\r
-profileDataGridNode._searchMatchedCallsColumn = true;\r
-if (lessThan && profileDataGridNode.numberOfCalls < queryNumber)\r
-profileDataGridNode._searchMatchedCallsColumn = true;\r
-}\r
-\r
-if (profileDataGridNode.functionName.hasSubstring(query, true) || profileDataGridNode.url.hasSubstring(query, true))\r
-profileDataGridNode._searchMatchedFunctionColumn = true;\r
-\r
-if (profileDataGridNode._searchMatchedSelfColumn ||\r
-profileDataGridNode._searchMatchedTotalColumn ||\r
-profileDataGridNode._searchMatchedAverageColumn ||\r
-profileDataGridNode._searchMatchedCallsColumn ||\r
-profileDataGridNode._searchMatchedFunctionColumn)\r
-{\r
-profileDataGridNode.refresh();\r
-return true;\r
-}\r
-\r
-return false;\r
-}\r
-\r
-var current = this.profileDataGridTree.children[0];\r
-\r
-while (current) {\r
-if (matchesQuery(current)) {\r
-this._searchResults.push({ profileNode: current });\r
-}\r
-\r
-current = current.traverseNextNode(false, null, false);\r
-}\r
-\r
-finishedCallback(this, this._searchResults.length);\r
-},\r
-\r
-jumpToFirstSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-this._currentSearchResultIndex = 0;\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-jumpToLastSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-this._currentSearchResultIndex = (this._searchResults.length - 1);\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-jumpToNextSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-if (++this._currentSearchResultIndex >= this._searchResults.length)\r
-this._currentSearchResultIndex = 0;\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-jumpToPreviousSearchResult: function()\r
-{\r
-if (!this._searchResults || !this._searchResults.length)\r
-return;\r
-if (--this._currentSearchResultIndex < 0)\r
-this._currentSearchResultIndex = (this._searchResults.length - 1);\r
-this._jumpToSearchResult(this._currentSearchResultIndex);\r
-},\r
-\r
-showingFirstSearchResult: function()\r
-{\r
-return (this._currentSearchResultIndex === 0);\r
-},\r
-\r
-showingLastSearchResult: function()\r
-{\r
-return (this._searchResults && this._currentSearchResultIndex === (this._searchResults.length - 1));\r
-},\r
-\r
-_jumpToSearchResult: function(index)\r
-{\r
-var searchResult = this._searchResults[index];\r
-if (!searchResult)\r
-return;\r
-\r
-var profileNode = searchResult.profileNode;\r
-profileNode.reveal();\r
-profileNode.select();\r
-},\r
-\r
-_changeView: function(event)\r
-{\r
-if (!event || !this.profile)\r
-return;\r
-\r
-if (event.target.selectedIndex == 1 && this.view == "Heavy") {\r
-this.profileDataGridTree = this.topDownProfileDataGridTree;\r
-this._sortProfile();\r
-this.view = "Tree";\r
-} else if (event.target.selectedIndex == 0 && this.view == "Tree") {\r
-this.profileDataGridTree = this.bottomUpProfileDataGridTree;\r
-this._sortProfile();\r
-this.view = "Heavy";\r
-}\r
-\r
-if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)\r
-return;\r
-\r
-\r
-\r
-\r
-this._searchFinishedCallback(this, -this._searchResults.length);\r
-this.performSearch(this.currentQuery, this._searchFinishedCallback);\r
-},\r
-\r
-_percentClicked: function(event)\r
-{\r
-var currentState = this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent;\r
-this.showSelfTimeAsPercent = !currentState;\r
-this.showTotalTimeAsPercent = !currentState;\r
-this.showAverageTimeAsPercent = !currentState;\r
-this.refreshShowAsPercents();\r
-},\r
-\r
-_updatePercentButton: function()\r
-{\r
-if (this.showSelfTimeAsPercent && this.showTotalTimeAsPercent && this.showAverageTimeAsPercent) {\r
-this.percentButton.title = WebInspector.UIString("Show absolute total and self times.");\r
-this.percentButton.toggled = true;\r
-} else {\r
-this.percentButton.title = WebInspector.UIString("Show total and self times as percentages.");\r
-this.percentButton.toggled = false;\r
-}\r
-},\r
-\r
-_focusClicked: function(event)\r
-{\r
-if (!this.dataGrid.selectedNode)\r
-return;\r
-\r
-this.resetButton.visible = true;\r
-this.profileDataGridTree.focus(this.dataGrid.selectedNode);\r
-this.refresh();\r
-this.refreshVisibleData();\r
-},\r
-\r
-_excludeClicked: function(event)\r
-{\r
-var selectedNode = this.dataGrid.selectedNode\r
-\r
-if (!selectedNode)\r
-return;\r
-\r
-selectedNode.deselect();\r
-\r
-this.resetButton.visible = true;\r
-this.profileDataGridTree.exclude(selectedNode);\r
-this.refresh();\r
-this.refreshVisibleData();\r
-},\r
-\r
-_resetClicked: function(event)\r
-{\r
-this.resetButton.visible = false;\r
-this.profileDataGridTree.restore();\r
-this.refresh();\r
-this.refreshVisibleData();\r
-},\r
-\r
-_dataGridNodeSelected: function(node)\r
-{\r
-this.focusButton.disabled = false;\r
-this.excludeButton.disabled = false;\r
-},\r
-\r
-_dataGridNodeDeselected: function(node)\r
-{\r
-this.focusButton.disabled = true;\r
-this.excludeButton.disabled = true;\r
-},\r
-\r
-_sortData: function(event)\r
-{\r
-this._sortProfile(this.profile);\r
-},\r
-\r
-_sortProfile: function()\r
-{\r
-var sortAscending = this.dataGrid.sortOrder === "ascending";\r
-var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;\r
-var sortProperty = {\r
-"average": "averageTime",\r
-"self": "selfTime",\r
-"total": "totalTime",\r
-"calls": "numberOfCalls",\r
-"function": "functionName"\r
-}[sortColumnIdentifier];\r
-\r
-this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty, sortAscending));\r
-\r
-this.refresh();\r
-},\r
-\r
-_mouseDownInDataGrid: function(event)\r
-{\r
-if (event.detail < 2)\r
-return;\r
-\r
-var cell = event.target.enclosingNodeOrSelfWithNodeName("td");\r
-if (!cell || (!cell.hasStyleClass("total-column") && !cell.hasStyleClass("self-column") && !cell.hasStyleClass("average-column")))\r
-return;\r
-\r
-if (cell.hasStyleClass("total-column"))\r
-this.showTotalTimeAsPercent = !this.showTotalTimeAsPercent;\r
-else if (cell.hasStyleClass("self-column"))\r
-this.showSelfTimeAsPercent = !this.showSelfTimeAsPercent;\r
-else if (cell.hasStyleClass("average-column"))\r
-this.showAverageTimeAsPercent = !this.showAverageTimeAsPercent;\r
-\r
-this.refreshShowAsPercents();\r
-\r
-event.preventDefault();\r
-event.stopPropagation();\r
-},\r
-\r
-_assignParentsInProfile: function()\r
-{\r
-var head = this.profile.head;\r
-head.parent = null;\r
-head.head = null;\r
-var nodesToTraverse = [ { parent: head, children: head.children } ];\r
-while (nodesToTraverse.length > 0) {\r
-var pair = nodesToTraverse.shift();\r
-var parent = pair.parent;\r
-var children = pair.children;\r
-var length = children.length;\r
-for (var i = 0; i < length; ++i) {\r
-children[i].head = head;\r
-children[i].parent = parent;\r
-if (children[i].children.length > 0)\r
-nodesToTraverse.push({ parent: children[i], children: children[i].children });\r
-}\r
-}\r
-}\r
-}\r
-\r
-WebInspector.CPUProfileView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-WebInspector.CPUProfileType = function()\r
-{\r
-WebInspector.ProfileType.call(this, WebInspector.CPUProfileType.TypeId, WebInspector.UIString("CPU PROFILES"));\r
-this._recording = false;\r
-}\r
-\r
-WebInspector.CPUProfileType.TypeId = "CPU";\r
-\r
-WebInspector.CPUProfileType.prototype = {\r
-get buttonTooltip()\r
-{\r
-return this._recording ? WebInspector.UIString("Stop profiling.") : WebInspector.UIString("Start profiling.");\r
-},\r
-\r
-get buttonStyle()\r
-{\r
-return this._recording ? "record-profile-status-bar-item status-bar-item toggled-on" : "record-profile-status-bar-item status-bar-item";\r
-},\r
-\r
-buttonClicked: function()\r
-{\r
-this._recording = !this._recording;\r
-\r
-if (this._recording)\r
-InspectorBackend.startProfiling();\r
-else\r
-InspectorBackend.stopProfiling();\r
-},\r
-\r
-get welcomeMessage()\r
-{\r
-return WebInspector.UIString("Control CPU profiling by pressing the %s button on the status bar.");\r
-},\r
-\r
-setRecordingProfile: function(isProfiling)\r
-{\r
-this._recording = isProfiling;\r
-},\r
-\r
-createSidebarTreeElementForProfile: function(profile)\r
-{\r
-return new WebInspector.ProfileSidebarTreeElement(profile, WebInspector.UIString("Profile %d"), "profile-sidebar-tree-item");\r
-},\r
-\r
-createView: function(profile)\r
-{\r
-return new WebInspector.CPUProfileView(profile);\r
-}\r
-}\r
-\r
-WebInspector.CPUProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;\r
-\r
-\r
-\r
-\r
-WebInspector.HeapSnapshotEdgesIterator = function(snapshot, edges)\r
-{\r
-this._snapshot = snapshot;\r
-this._edges = edges;\r
-this._edgeIndex = 0;\r
-}\r
-\r
-WebInspector.HeapSnapshotEdgesIterator.prototype = {\r
-get done()\r
-{\r
-return this._edgeIndex >= this._edges.length;\r
-},\r
-\r
-get isElement()\r
-{\r
-return this._getType() === this._snapshot._edgeElementType;\r
-},\r
-\r
-get isHidden()\r
-{\r
-return this._getType() === this._snapshot._edgeHiddenType;\r
-},\r
-\r
-get name()\r
-{\r
-return this.isElement || this.isHidden ? this._getNameOrIndex() : this._snapshot._strings[this._getNameOrIndex()];\r
-},\r
-\r
-next: function()\r
-{\r
-this._edgeIndex += this._snapshot._edgeFieldsCount;\r
-},\r
-\r
-get node()\r
-{\r
-return new WebInspector.HeapSnapshotNodeWrapper(this._snapshot, this.nodeIndex);\r
-},\r
-\r
-get nodeIndex()\r
-{\r
-return this._edges[this._edgeIndex + this._snapshot._edgeToNodeOffset];\r
-},\r
-\r
-_getNameOrIndex: function()\r
-{\r
-return this._edges[this._edgeIndex + this._snapshot._edgeNameOffset];\r
-},\r
-\r
-_getType: function()\r
-{\r
-return this._edges[this._edgeIndex + this._snapshot._edgeTypeOffset];\r
-}\r
-};\r
-\r
-WebInspector.HeapSnapshotNodeWrapper = function(snapshot, nodeIndex)\r
-{\r
-this._snapshot = snapshot;\r
-this._nodes = snapshot._nodes;\r
-this._nodeIndex = nodeIndex;\r
-}\r
-\r
-WebInspector.HeapSnapshotNodeWrapper.prototype = {\r
-get edges()\r
-{\r
-return new WebInspector.HeapSnapshotEdgesIterator(this._snapshot, this._getEdges());\r
-},\r
-\r
-get edgesCount()\r
-{\r
-return this._nodes[this._nodeIndex + this._snapshot._edgesCountOffset];\r
-},\r
-\r
-get instancesCount()\r
-{\r
-return this._nodes[this._nodeIndex + this._snapshot._nodeInstancesCountOffset];\r
-},\r
-\r
-get isHidden()\r
-{\r
-return this._getType() === this._snapshot._nodeHiddenType;\r
-},\r
-\r
-get name()\r
-{\r
-return this._snapshot._strings[this._getName()];\r
-},\r
-\r
-get selfSize()\r
-{\r
-return this._nodes[this._nodeIndex + this._snapshot._nodeSelfSizeOffset]; \r
-},\r
-\r
-_getName: function()\r
-{\r
-return this._nodes[this._nodeIndex + this._snapshot._nodeNameOffset]; \r
-},\r
-\r
-_getEdges: function()\r
-{\r
-var firstEdgeIndex = this._nodeIndex + this._snapshot._firstEdgeOffset;\r
-return this._nodes.slice(firstEdgeIndex, firstEdgeIndex + this.edgesCount * this._snapshot._edgeFieldsCount);\r
-},\r
-\r
-_getType: function()\r
-{\r
-return this._nodes[this._nodeIndex + this._snapshot._nodeTypeOffset];\r
-}\r
-};\r
-\r
-WebInspector.HeapSnapshot = function(profile)\r
-{\r
-this._profile = profile;\r
-this._nodes = profile.nodes;\r
-this._strings = profile.strings;\r
-\r
-this._init();\r
-}\r
-\r
-WebInspector.HeapSnapshot.prototype = {\r
-_init: function()\r
-{\r
-this._metaNodeIndex = 0;\r
-this._rootNodeIndex = 1;\r
-var meta = this._nodes[this._metaNodeIndex];\r
-this._nodeTypeOffset = meta.fields.indexOf("type");\r
-this._nodeNameOffset = meta.fields.indexOf("name");\r
-this._nodeIdOffset = meta.fields.indexOf("id");\r
-this._nodeInstancesCountOffset = this._nodeIdOffset;\r
-this._nodeSelfSizeOffset = meta.fields.indexOf("self_size");\r
-this._edgesCountOffset = meta.fields.indexOf("children_count");\r
-this._firstEdgeOffset = meta.fields.indexOf("children");\r
-this._nodeTypes = meta.types[this._nodeTypeOffset];\r
-this._nodeHiddenType = this._nodeTypes.indexOf("hidden");\r
-var edgesMeta = meta.types[this._firstEdgeOffset];\r
-this._edgeFieldsCount = edgesMeta.fields.length;\r
-this._edgeTypeOffset = edgesMeta.fields.indexOf("type");\r
-this._edgeNameOffset = edgesMeta.fields.indexOf("name_or_index");\r
-this._edgeToNodeOffset = edgesMeta.fields.indexOf("to_node");\r
-this._edgeTypes = edgesMeta.types[this._edgeTypeOffset];\r
-this._edgeElementType = this._edgeTypes.indexOf("element");\r
-this._edgeHiddenType = this._edgeTypes.indexOf("hidden");\r
-},\r
-\r
-get rootEdges()\r
-{\r
-return (new WebInspector.HeapSnapshotNodeWrapper(this, this._rootNodeIndex)).edges;\r
-}\r
-};\r
-\r
-WebInspector.HeapSnapshotView = function(parent, profile)\r
-{\r
-WebInspector.View.call(this);\r
-\r
-this.element.addStyleClass("heap-snapshot-view");\r
-\r
-this.parent = parent;\r
-this.parent.addEventListener("profile added", this._updateBaseOptions, this);\r
-\r
-this.showCountAsPercent = false;\r
-this.showSizeAsPercent = false;\r
-this.showCountDeltaAsPercent = false;\r
-this.showSizeDeltaAsPercent = false;\r
-\r
-this.categories = {\r
-code: new WebInspector.ResourceCategory("code", WebInspector.UIString("Code"), "rgb(255,121,0)"),\r
-data: new WebInspector.ResourceCategory("data", WebInspector.UIString("Objects"), "rgb(47,102,236)")\r
-};\r
-\r
-var summaryContainer = document.createElement("div");\r
-summaryContainer.id = "heap-snapshot-summary-container";\r
-\r
-this.countsSummaryBar = new WebInspector.SummaryBar(this.categories);\r
-this.countsSummaryBar.element.className = "heap-snapshot-summary";\r
-this.countsSummaryBar.calculator = new WebInspector.HeapSummaryCountCalculator();\r
-var countsLabel = document.createElement("div");\r
-countsLabel.className = "heap-snapshot-summary-label";\r
-countsLabel.textContent = WebInspector.UIString("Count");\r
-this.countsSummaryBar.element.appendChild(countsLabel);\r
-summaryContainer.appendChild(this.countsSummaryBar.element);\r
-\r
-this.sizesSummaryBar = new WebInspector.SummaryBar(this.categories);\r
-this.sizesSummaryBar.element.className = "heap-snapshot-summary";\r
-this.sizesSummaryBar.calculator = new WebInspector.HeapSummarySizeCalculator();\r
-var sizesLabel = document.createElement("label");\r
-sizesLabel.className = "heap-snapshot-summary-label";\r
-sizesLabel.textContent = WebInspector.UIString("Size");\r
-this.sizesSummaryBar.element.appendChild(sizesLabel);\r
-summaryContainer.appendChild(this.sizesSummaryBar.element);\r
-\r
-this.element.appendChild(summaryContainer);\r
-\r
-var columns = {\r
-cons: { title: WebInspector.UIString("Constructor"), disclosure: true, sortable: true },\r
-count: { title: WebInspector.UIString("Count"), width: "54px", sortable: true },\r
-size: { title: WebInspector.UIString("Size"), width: "72px", sort: "descending", sortable: true },\r
-\r
-countDelta: { title: WebInspector.UIString("\xb1 Count"), width: "72px", sortable: true },\r
-sizeDelta: { title: WebInspector.UIString("\xb1 Size"), width: "72px", sortable: true }\r
-};\r
-\r
-this.dataGrid = new WebInspector.DataGrid(columns);\r
-this.dataGrid.addEventListener("sorting changed", this._sortData, this);\r
-this.dataGrid.element.addEventListener("mousedown", this._mouseDownInDataGrid.bind(this), true);\r
-this.element.appendChild(this.dataGrid.element);\r
-\r
-this.profile = profile;\r
-\r
-this.baseSelectElement = document.createElement("select");\r
-this.baseSelectElement.className = "status-bar-item";\r
-this.baseSelectElement.addEventListener("change", this._changeBase.bind(this), false);\r
-this._updateBaseOptions();\r
-\r
-this.percentButton = new WebInspector.StatusBarButton("", "percent-time-status-bar-item status-bar-item");\r
-this.percentButton.addEventListener("click", this._percentClicked.bind(this), false);\r
-\r
-this._loadProfile(this.profile, profileCallback.bind(this));\r
-\r
-function profileCallback(profile)\r
-{\r
-var list = this._getProfiles();\r
-var profileIndex;\r
-for (var i = 0; i < list.length; ++i)\r
-if (list[i].uid === profile.uid) {\r
-profileIndex = i;\r
-break;\r
-}\r
-if (profileIndex > 0)\r
-this.baseSelectElement.selectedIndex = profileIndex - 1;\r
-else\r
-this.baseSelectElement.selectedIndex = profileIndex;\r
-this._resetDataGridList(resetCompleted.bind(this));\r
-}\r
-\r
-function resetCompleted()\r
-{\r
-this.refresh();\r
-this._updatePercentButton();\r
-}\r
-}\r
-\r
-WebInspector.HeapSnapshotView.prototype = {\r
-get statusBarItems()\r
-{\r
-return [this.baseSelectElement, this.percentButton.element];\r
-},\r
-\r
-get profile()\r
-{\r
-return this._profile;\r
-},\r
-\r
-set profile(profile)\r
-{\r
-this._profile = profile;\r
-},\r
-\r
-show: function(parentElement)\r
-{\r
-WebInspector.View.prototype.show.call(this, parentElement);\r
-this.dataGrid.updateWidths();\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.View.prototype.hide.call(this);\r
-this._currentSearchResultIndex = -1;\r
-},\r
-\r
-resize: function()\r
-{\r
-if (this.dataGrid)\r
-this.dataGrid.updateWidths();\r
-},\r
-\r
-refresh: function()\r
-{\r
-this.dataGrid.removeChildren();\r
-\r
-var children = this.snapshotDataGridList.children;\r
-var count = children.length;\r
-for (var index = 0; index < count; ++index)\r
-this.dataGrid.appendChild(children[index]);\r
-\r
-this._updateSummaryGraph();\r
-},\r
-\r
-refreshShowAsPercents: function()\r
-{\r
-this._updatePercentButton();\r
-this.refreshVisibleData();\r
-},\r
-\r
-_deleteSearchMatchedFlags: function(node)\r
-{\r
-delete node._searchMatchedConsColumn;\r
-delete node._searchMatchedCountColumn;\r
-delete node._searchMatchedSizeColumn;\r
-delete node._searchMatchedCountDeltaColumn;\r
-delete node._searchMatchedSizeDeltaColumn;\r
-},\r
-\r
-searchCanceled: function()\r
-{\r
-if (this._searchResults) {\r
-for (var i = 0; i < this._searchResults.length; ++i) {\r
-var profileNode = this._searchResults[i].profileNode;\r
-this._deleteSearchMatchedFlags(profileNode);\r
-profileNode.refresh();\r
-}\r
-}\r
-\r
-delete this._searchFinishedCallback;\r
-this._currentSearchResultIndex = -1;\r
-this._searchResults = [];\r
-},\r
-\r
-performSearch: function(query, finishedCallback)\r
-{\r
-\r
-this.searchCanceled();\r
-\r
-query = query.trim();\r
-\r
-if (!query.length)\r
-return;\r
-\r
-this._searchFinishedCallback = finishedCallback;\r
-\r
-var helper = WebInspector.HeapSnapshotView.SearchHelper;\r
-\r
-var operationAndNumber = helper.parseOperationAndNumber(query);\r
-var operation = operationAndNumber[0];\r
-var queryNumber = operationAndNumber[1];\r
-\r
-var percentUnits = helper.percents.test(query);\r
-var megaBytesUnits = helper.megaBytes.test(query);\r
-var kiloBytesUnits = helper.kiloBytes.test(query);\r
-var bytesUnits = helper.bytes.test(query);\r
-\r
-var queryNumberBytes = (megaBytesUnits ? (queryNumber * 1024 * 1024) : (kiloBytesUnits ? (queryNumber * 1024) : queryNumber));\r
-\r
-function matchesQuery(heapSnapshotDataGridNode)\r
-{\r
-WebInspector.HeapSnapshotView.prototype._deleteSearchMatchedFlags(heapSnapshotDataGridNode);\r
-\r
-if (percentUnits) {\r
-heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.countPercent, queryNumber);\r
-heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.sizePercent, queryNumber);\r
-heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDeltaPercent, queryNumber);\r
-heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDeltaPercent, queryNumber);\r
-} else if (megaBytesUnits || kiloBytesUnits || bytesUnits) {\r
-heapSnapshotDataGridNode._searchMatchedSizeColumn = operation(heapSnapshotDataGridNode.size, queryNumberBytes);\r
-heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn = operation(heapSnapshotDataGridNode.sizeDelta, queryNumberBytes);\r
-} else {\r
-heapSnapshotDataGridNode._searchMatchedCountColumn = operation(heapSnapshotDataGridNode.count, queryNumber);\r
-heapSnapshotDataGridNode._searchMatchedCountDeltaColumn = operation(heapSnapshotDataGridNode.countDelta, queryNumber);\r
-}\r
-\r
-if (heapSnapshotDataGridNode.constructorName.hasSubstring(query, true))\r
-heapSnapshotDataGridNode._searchMatchedConsColumn = true;\r
-\r
-if (heapSnapshotDataGridNode._searchMatchedConsColumn ||\r
-heapSnapshotDataGridNode._searchMatchedCountColumn ||\r
-heapSnapshotDataGridNode._searchMatchedSizeColumn ||\r
-heapSnapshotDataGridNode._searchMatchedCountDeltaColumn ||\r
-heapSnapshotDataGridNode._searchMatchedSizeDeltaColumn) {\r
-heapSnapshotDataGridNode.refresh();\r
-return true;\r
-}\r
-\r
-return false;\r
-}\r
-\r
-var current = this.snapshotDataGridList.children[0];\r
-var depth = 0;\r
-var info = {};\r
-\r
-\r
-\r
-\r
-const maxDepth = 2;\r
-\r
-while (current) {\r
-if (matchesQuery(current))\r
-this._searchResults.push({ profileNode: current });\r
-current = current.traverseNextNode(false, null, (depth >= maxDepth), info);\r
-depth += info.depthChange;\r
-}\r
-\r
-finishedCallback(this, this._searchResults.length);\r
-},\r
-\r
-\r
-jumpToFirstSearchResult: WebInspector.CPUProfileView.prototype.jumpToFirstSearchResult,\r
-jumpToLastSearchResult: WebInspector.CPUProfileView.prototype.jumpToLastSearchResult,\r
-jumpToNextSearchResult: WebInspector.CPUProfileView.prototype.jumpToNextSearchResult,\r
-jumpToPreviousSearchResult: WebInspector.CPUProfileView.prototype.jumpToPreviousSearchResult,\r
-showingFirstSearchResult: WebInspector.CPUProfileView.prototype.showingFirstSearchResult,\r
-showingLastSearchResult: WebInspector.CPUProfileView.prototype.showingLastSearchResult,\r
-_jumpToSearchResult: WebInspector.CPUProfileView.prototype._jumpToSearchResult,\r
-\r
-refreshVisibleData: function()\r
-{\r
-var child = this.dataGrid.children[0];\r
-while (child) {\r
-child.refresh();\r
-child = child.traverseNextNode(false, null, true);\r
-}\r
-this._updateSummaryGraph();\r
-},\r
-\r
-_changeBase: function()\r
-{\r
-if (this.baseSnapshot.uid === this._getProfiles()[this.baseSelectElement.selectedIndex].uid)\r
-return;\r
-\r
-this._resetDataGridList(resetCompleted.bind(this));\r
-\r
-function resetCompleted() {\r
-this.refresh();\r
-\r
-if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults)\r
-return;\r
-\r
-\r
-\r
-\r
-this._searchFinishedCallback(this, -this._searchResults.length);\r
-this.performSearch(this.currentQuery, this._searchFinishedCallback);\r
-}\r
-},\r
-\r
-_createSnapshotDataGridList: function()\r
-{\r
-if (this._snapshotDataGridList)\r
-delete this._snapshotDataGridList;\r
-\r
-this._snapshotDataGridList = new WebInspector.HeapSnapshotDataGridList(this, this.baseSnapshot.entries, this.profile.entries);\r
-return this._snapshotDataGridList;\r
-},\r
-\r
-_getProfiles: function()\r
-{\r
-return WebInspector.panels.profiles.getProfiles(WebInspector.HeapSnapshotProfileType.TypeId);\r
-},\r
-\r
-_loadProfile: function(profile, callback)\r
-{\r
-WebInspector.panels.profiles.loadHeapSnapshot(profile.uid, callback);\r
-},\r
-\r
-processLoadedSnapshot: function(profile, loadedSnapshot)\r
-{\r
-var snapshot = WebInspector.HeapSnapshotView.prototype._convertSnapshot(loadedSnapshot);\r
-profile.children = snapshot.children;\r
-profile.entries = snapshot.entries;\r
-profile.lowlevels = snapshot.lowlevels;\r
-WebInspector.HeapSnapshotView.prototype._prepareProfile(profile);\r
-},\r
-\r
-_mouseDownInDataGrid: function(event)\r
-{\r
-if (event.detail < 2)\r
-return;\r
-\r
-var cell = event.target.enclosingNodeOrSelfWithNodeName("td");\r
-if (!cell || (!cell.hasStyleClass("count-column") && !cell.hasStyleClass("size-column") && !cell.hasStyleClass("countDelta-column") && !cell.hasStyleClass("sizeDelta-column")))\r
-return;\r
-\r
-if (cell.hasStyleClass("count-column"))\r
-this.showCountAsPercent = !this.showCountAsPercent;\r
-else if (cell.hasStyleClass("size-column"))\r
-this.showSizeAsPercent = !this.showSizeAsPercent;\r
-else if (cell.hasStyleClass("countDelta-column"))\r
-this.showCountDeltaAsPercent = !this.showCountDeltaAsPercent;\r
-else if (cell.hasStyleClass("sizeDelta-column"))\r
-this.showSizeDeltaAsPercent = !this.showSizeDeltaAsPercent;\r
-\r
-this.refreshShowAsPercents();\r
-\r
-event.preventDefault();\r
-event.stopPropagation();\r
-},\r
-\r
-get _isShowingAsPercent()\r
-{\r
-return this.showCountAsPercent && this.showSizeAsPercent && this.showCountDeltaAsPercent && this.showSizeDeltaAsPercent;\r
-},\r
-\r
-_percentClicked: function(event)\r
-{\r
-var currentState = this._isShowingAsPercent;\r
-this.showCountAsPercent = !currentState;\r
-this.showSizeAsPercent = !currentState;\r
-this.showCountDeltaAsPercent = !currentState;\r
-this.showSizeDeltaAsPercent = !currentState;\r
-this.refreshShowAsPercents();\r
-},\r
-\r
-_convertSnapshot: function(loadedSnapshot)\r
-{\r
-var snapshot = new WebInspector.HeapSnapshot(loadedSnapshot);\r
-var result = {lowlevels: {}, entries: {}, children: {}};\r
-for (var rootEdges = snapshot.rootEdges; !rootEdges.done; rootEdges.next()) {\r
-var node = rootEdges.node;\r
-if (node.isHidden)\r
-result.lowlevels[node.name] = {count: node.instancesCount, size: node.selfSize, type: node.name};\r
-else if (node.instancesCount)\r
-result.entries[node.name] = {constructorName: node.name, count: node.instancesCount, size: node.selfSize};\r
-else {\r
-var entry = {constructorName: node.name};\r
-for (var edges = node.edges; !edges.done; edges.next())\r
-entry[edges.nodeIndex] = {constructorName: edges.node.name, count: edges.name};\r
-result.children[rootEdges.nodeIndex] = entry;\r
-}\r
-}\r
-return result;\r
-},\r
-\r
-_prepareProfile: function(profile)\r
-{\r
-for (var profileEntry in profile.entries)\r
-profile.entries[profileEntry].retainers = {};\r
-profile.clusters = {};\r
-\r
-for (var addr in profile.children) {\r
-var retainer = profile.children[addr];\r
-var retainerId = retainer.constructorName + ":" + addr;\r
-for (var childAddr in retainer) {\r
-if (childAddr === "constructorName") continue;\r
-var item = retainer[childAddr];\r
-var itemId = item.constructorName + ":" + childAddr;\r
-if ((item.constructorName === "Object" || item.constructorName === "Array")) {\r
-if (!(itemId in profile.clusters))\r
-profile.clusters[itemId] = { constructorName: itemId, retainers: {} };\r
-mergeRetainers(profile.clusters[itemId], item);\r
-}\r
-mergeRetainers(profile.entries[item.constructorName], item);\r
-}\r
-}\r
-\r
-function mergeRetainers(entry, item)\r
-{\r
-if (!(retainer.constructorName in entry.retainers))\r
-entry.retainers[retainer.constructorName] = { constructorName: retainer.constructorName, count: 0, clusters: {} };\r
-var retainerEntry = entry.retainers[retainer.constructorName];\r
-retainerEntry.count += item.count;\r
-if (retainer.constructorName === "Object" || retainer.constructorName === "Array")\r
-retainerEntry.clusters[retainerId] = true;\r
-}\r
-},\r
-\r
-_resetDataGridList: function(callback)\r
-{\r
-this._loadProfile(this._getProfiles()[this.baseSelectElement.selectedIndex], profileLoaded.bind(this));\r
-\r
-function profileLoaded(profile)\r
-{\r
-this.baseSnapshot = profile;\r
-var lastComparator = WebInspector.HeapSnapshotDataGridList.propertyComparator("size", false);\r
-if (this.snapshotDataGridList)\r
-lastComparator = this.snapshotDataGridList.lastComparator;\r
-this.snapshotDataGridList = this._createSnapshotDataGridList();\r
-this.snapshotDataGridList.sort(lastComparator, true);\r
-callback();\r
-}\r
-},\r
-\r
-_sortData: function()\r
-{\r
-var sortAscending = this.dataGrid.sortOrder === "ascending";\r
-var sortColumnIdentifier = this.dataGrid.sortColumnIdentifier;\r
-var sortProperty = {\r
-cons: ["constructorName", null],\r
-count: ["count", null],\r
-size: ["size", "count"],\r
-countDelta: this.showCountDeltaAsPercent ? ["countDeltaPercent", null] : ["countDelta", null],\r
-sizeDelta: this.showSizeDeltaAsPercent ? ["sizeDeltaPercent", "countDeltaPercent"] : ["sizeDelta", "sizeDeltaPercent"]\r
-}[sortColumnIdentifier];\r
-\r
-this.snapshotDataGridList.sort(WebInspector.HeapSnapshotDataGridList.propertyComparator(sortProperty[0], sortProperty[1], sortAscending));\r
-\r
-this.refresh();\r
-},\r
-\r
-_updateBaseOptions: function()\r
-{\r
-var list = this._getProfiles();\r
-\r
-if (this.baseSelectElement.length === list.length)\r
-return;\r
-\r
-for (var i = this.baseSelectElement.length, n = list.length; i < n; ++i) {\r
-var baseOption = document.createElement("option");\r
-var title = list[i].title;\r
-if (!title.indexOf(UserInitiatedProfileName))\r
-title = WebInspector.UIString("Snapshot %d", title.substring(UserInitiatedProfileName.length + 1));\r
-baseOption.label = WebInspector.UIString("Compared to %s", title);\r
-this.baseSelectElement.appendChild(baseOption);\r
-}\r
-},\r
-\r
-_updatePercentButton: function()\r
-{\r
-if (this._isShowingAsPercent) {\r
-this.percentButton.title = WebInspector.UIString("Show absolute counts and sizes.");\r
-this.percentButton.toggled = true;\r
-} else {\r
-this.percentButton.title = WebInspector.UIString("Show counts and sizes as percentages.");\r
-this.percentButton.toggled = false;\r
-}\r
-},\r
-\r
-_updateSummaryGraph: function()\r
-{\r
-this.countsSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;\r
-this.countsSummaryBar.update(this.profile.lowlevels);\r
-\r
-this.sizesSummaryBar.calculator.showAsPercent = this._isShowingAsPercent;\r
-this.sizesSummaryBar.update(this.profile.lowlevels);\r
-}\r
-};\r
-\r
-WebInspector.HeapSnapshotView.prototype.__proto__ = WebInspector.View.prototype;\r
-\r
-WebInspector.HeapSnapshotView.SearchHelper = {\r
-\r
-operations: {\r
-LESS: function (a, b) { return a !== null && a < b; },\r
-LESS_OR_EQUAL: function (a, b) { return a !== null && a <= b; },\r
-EQUAL: function (a, b) { return a !== null && a === b; },\r
-GREATER_OR_EQUAL: function (a, b) { return a !== null && a >= b; },\r
-GREATER: function (a, b) { return a !== null && a > b; }\r
-},\r
-\r
-operationParsers: {\r
-LESS: /^<(\d+)/,\r
-LESS_OR_EQUAL: /^<=(\d+)/,\r
-GREATER_OR_EQUAL: /^>=(\d+)/,\r
-GREATER: /^>(\d+)/\r
-},\r
-\r
-parseOperationAndNumber: function(query)\r
-{\r
-var operations = WebInspector.HeapSnapshotView.SearchHelper.operations;\r
-var parsers = WebInspector.HeapSnapshotView.SearchHelper.operationParsers;\r
-for (var operation in parsers) {\r
-var match = query.match(parsers[operation]);\r
-if (match !== null)\r
-return [operations[operation], parseFloat(match[1])];\r
-}\r
-return [operations.EQUAL, parseFloat(query)];\r
-},\r
-\r
-percents: /%$/,\r
-\r
-megaBytes: /MB$/i,\r
-\r
-kiloBytes: /KB$/i,\r
-\r
-bytes: /B$/i\r
-}\r
-\r
-WebInspector.HeapSummaryCalculator = function(lowLevelField)\r
-{\r
-this.total = 1;\r
-this.lowLevelField = lowLevelField;\r
-}\r
-\r
-WebInspector.HeapSummaryCalculator.prototype = {\r
-computeSummaryValues: function(lowLevels)\r
-{\r
-var highLevels = { data: 0, code: 0 };\r
-this.total = 0;\r
-for (var item in lowLevels) {\r
-var highItem = this._highFromLow(item);\r
-if (highItem) {\r
-var value = lowLevels[item][this.lowLevelField];\r
-highLevels[highItem] += value;\r
-this.total += value;\r
-}\r
-}\r
-var result = { categoryValues: highLevels };\r
-if (!this.showAsPercent)\r
-result.total = this.total;\r
-return result;\r
-},\r
-\r
-formatValue: function(value)\r
-{\r
-if (this.showAsPercent)\r
-return WebInspector.UIString("%.2f%%", value / this.total * 100.0);\r
-else\r
-return this._valueToString(value);\r
-},\r
-\r
-get showAsPercent()\r
-{\r
-return this._showAsPercent;\r
-},\r
-\r
-set showAsPercent(x)\r
-{\r
-this._showAsPercent = x;\r
-}\r
-}\r
-\r
-WebInspector.HeapSummaryCountCalculator = function()\r
-{\r
-WebInspector.HeapSummaryCalculator.call(this, "count");\r
-}\r
-\r
-WebInspector.HeapSummaryCountCalculator.prototype = {\r
-_highFromLow: function(type)\r
-{\r
-if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE") return "code";\r
-if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/)) return "data";\r
-return null;\r
-},\r
-\r
-_valueToString: function(value)\r
-{\r
-return value.toString();\r
-}\r
-}\r
-\r
-WebInspector.HeapSummaryCountCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;\r
-\r
-WebInspector.HeapSummarySizeCalculator = function()\r
-{\r
-WebInspector.HeapSummaryCalculator.call(this, "size");\r
-}\r
-\r
-WebInspector.HeapSummarySizeCalculator.prototype = {\r
-_highFromLow: function(type)\r
-{\r
-if (type === "CODE_TYPE" || type === "SHARED_FUNCTION_INFO_TYPE" || type === "SCRIPT_TYPE")\r
-return "code";\r
-if (type === "STRING_TYPE" || type === "HEAP_NUMBER_TYPE" || type.match(/^JS_/) || type.match(/_ARRAY_TYPE$/))\r
-return "data";\r
-return null;\r
-},\r
-\r
-_valueToString: Number.bytesToString\r
-}\r
-\r
-WebInspector.HeapSummarySizeCalculator.prototype.__proto__ = WebInspector.HeapSummaryCalculator.prototype;\r
-\r
-WebInspector.HeapSnapshotDataGridNodeWithRetainers = function(owningTree)\r
-{\r
-this.tree = owningTree;\r
-\r
-WebInspector.DataGridNode.call(this, null, this._hasRetainers);\r
-\r
-this.addEventListener("populate", this._populate, this);\r
-};\r
-\r
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype = {\r
-isEmptySet: function(set)\r
-{\r
-for (var x in set)\r
-return false;\r
-return true;\r
-},\r
-\r
-get _hasRetainers()\r
-{\r
-return !this.isEmptySet(this.retainers);\r
-},\r
-\r
-get _parent()\r
-{\r
-\r
-return this.parent !== this.dataGrid ? this.parent : this.tree;\r
-},\r
-\r
-_populate: function(event)\r
-{\r
-function appendDiffEntry(baseItem, snapshotItem)\r
-{\r
-this.appendChild(new WebInspector.HeapSnapshotDataGridRetainerNode(this.snapshotView, baseItem, snapshotItem, this.tree));\r
-}\r
-\r
-this.produceDiff(this.baseRetainers, this.retainers, appendDiffEntry.bind(this));\r
-\r
-if (this._parent) {\r
-var currentComparator = this._parent.lastComparator;\r
-if (currentComparator)\r
-this.sort(currentComparator, true);\r
-}\r
-\r
-this.removeEventListener("populate", this._populate, this);\r
-},\r
-\r
-produceDiff: function(baseEntries, currentEntries, callback)\r
-{\r
-for (var item in currentEntries)\r
-callback(baseEntries[item], currentEntries[item]);\r
-\r
-for (item in baseEntries) {\r
-if (!(item in currentEntries))\r
-callback(baseEntries[item], null);\r
-}\r
-},\r
-\r
-sort: function(comparator, force) {\r
-if (!force && this.lastComparator === comparator)\r
-return;\r
-\r
-this.children.sort(comparator);\r
-var childCount = this.children.length;\r
-for (var childIndex = 0; childIndex < childCount; ++childIndex)\r
-this.children[childIndex]._recalculateSiblings(childIndex);\r
-for (var i = 0; i < this.children.length; ++i) {\r
-var child = this.children[i];\r
-if (!force && (!child.expanded || child.lastComparator === comparator))\r
-continue;\r
-child.sort(comparator, force);\r
-}\r
-this.lastComparator = comparator;\r
-},\r
-\r
-signForDelta: function(delta) {\r
-if (delta === 0)\r
-return "";\r
-if (delta > 0)\r
-return "+";\r
-else\r
-return "\u2212";  \r
-},\r
-\r
-showDeltaAsPercent: function(value)\r
-{\r
-if (value === Number.POSITIVE_INFINITY)\r
-return WebInspector.UIString("new");\r
-else if (value === Number.NEGATIVE_INFINITY)\r
-return WebInspector.UIString("deleted");\r
-if (value > 1000.0)\r
-return WebInspector.UIString("%s >1000%%", this.signForDelta(value));\r
-return WebInspector.UIString("%s%.2f%%", this.signForDelta(value), Math.abs(value));\r
-},\r
-\r
-getTotalCount: function()\r
-{\r
-if (!this._count) {\r
-this._count = 0;\r
-for (var i = 0, n = this.children.length; i < n; ++i)\r
-this._count += this.children[i].count;\r
-}\r
-return this._count;\r
-},\r
-\r
-getTotalSize: function()\r
-{\r
-if (!this._size) {\r
-this._size = 0;\r
-for (var i = 0, n = this.children.length; i < n; ++i)\r
-this._size += this.children[i].size;\r
-}\r
-return this._size;\r
-},\r
-\r
-get countPercent()\r
-{\r
-return this.count / this._parent.getTotalCount() * 100.0;\r
-},\r
-\r
-get sizePercent()\r
-{\r
-return this.size / this._parent.getTotalSize() * 100.0;\r
-},\r
-\r
-get countDeltaPercent()\r
-{\r
-if (this.baseCount > 0) {\r
-if (this.count > 0)\r
-return this.countDelta / this.baseCount * 100.0;\r
-else\r
-return Number.NEGATIVE_INFINITY;\r
-} else\r
-return Number.POSITIVE_INFINITY;\r
-},\r
-\r
-get sizeDeltaPercent()\r
-{\r
-if (this.baseSize > 0) {\r
-if (this.size > 0)\r
-return this.sizeDelta / this.baseSize * 100.0;\r
-else\r
-return Number.NEGATIVE_INFINITY;\r
-} else\r
-return Number.POSITIVE_INFINITY;\r
-},\r
-\r
-get data()\r
-{\r
-var data = {};\r
-\r
-data["cons"] = this.constructorName;\r
-\r
-if (this.snapshotView.showCountAsPercent)\r
-data["count"] = WebInspector.UIString("%.2f%%", this.countPercent);\r
-else\r
-data["count"] = this.count;\r
-\r
-if (this.size !== null) {\r
-if (this.snapshotView.showSizeAsPercent)\r
-data["size"] = WebInspector.UIString("%.2f%%", this.sizePercent);\r
-else\r
-data["size"] = Number.bytesToString(this.size);\r
-} else\r
-data["size"] = "";\r
-\r
-if (this.snapshotView.showCountDeltaAsPercent)\r
-data["countDelta"] = this.showDeltaAsPercent(this.countDeltaPercent);\r
-else\r
-data["countDelta"] = WebInspector.UIString("%s%d", this.signForDelta(this.countDelta), Math.abs(this.countDelta));\r
-\r
-if (this.sizeDelta !== null) {\r
-if (this.snapshotView.showSizeDeltaAsPercent)\r
-data["sizeDelta"] = this.showDeltaAsPercent(this.sizeDeltaPercent);\r
-else\r
-data["sizeDelta"] = WebInspector.UIString("%s%s", this.signForDelta(this.sizeDelta), Number.bytesToString(Math.abs(this.sizeDelta)));\r
-} else\r
-data["sizeDelta"] = "";\r
-\r
-return data;\r
-},\r
-\r
-createCell: function(columnIdentifier)\r
-{\r
-var cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnIdentifier);\r
-\r
-if ((columnIdentifier === "cons" && this._searchMatchedConsColumn) ||\r
-(columnIdentifier === "count" && this._searchMatchedCountColumn) ||\r
-(columnIdentifier === "size" && this._searchMatchedSizeColumn) ||\r
-(columnIdentifier === "countDelta" && this._searchMatchedCountDeltaColumn) ||\r
-(columnIdentifier === "sizeDelta" && this._searchMatchedSizeDeltaColumn))\r
-cell.addStyleClass("highlight");\r
-\r
-return cell;\r
-}\r
-};\r
-\r
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.__proto__ = WebInspector.DataGridNode.prototype;\r
-\r
-WebInspector.HeapSnapshotDataGridNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)\r
-{\r
-this.snapshotView = snapshotView;\r
-\r
-if (!snapshotEntry)\r
-snapshotEntry = { constructorName: baseEntry.constructorName, count: 0, size: 0, retainers: {} };\r
-this.constructorName = snapshotEntry.constructorName;\r
-this.count = snapshotEntry.count;\r
-this.size = snapshotEntry.size;\r
-this.retainers = snapshotEntry.retainers;\r
-\r
-if (!baseEntry)\r
-baseEntry = { count: 0, size: 0, retainers: {} };\r
-this.baseCount = baseEntry.count;\r
-this.countDelta = this.count - this.baseCount;\r
-this.baseSize = baseEntry.size;\r
-this.sizeDelta = this.size - this.baseSize;\r
-this.baseRetainers = baseEntry.retainers;\r
-\r
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);\r
-};\r
-\r
-WebInspector.HeapSnapshotDataGridNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;\r
-\r
-WebInspector.HeapSnapshotDataGridList = function(snapshotView, baseEntries, snapshotEntries)\r
-{\r
-this.tree = this;\r
-this.snapshotView = snapshotView;\r
-this.children = [];\r
-this.lastComparator = null;\r
-this.populateChildren(baseEntries, snapshotEntries);\r
-};\r
-\r
-WebInspector.HeapSnapshotDataGridList.prototype = {\r
-appendChild: function(child)\r
-{\r
-this.insertChild(child, this.children.length);\r
-},\r
-\r
-insertChild: function(child, index)\r
-{\r
-this.children.splice(index, 0, child);\r
-},\r
-\r
-removeChildren: function()\r
-{\r
-this.children = [];\r
-},\r
-\r
-populateChildren: function(baseEntries, snapshotEntries)\r
-{\r
-function appendListEntry(baseItem, snapshotItem)\r
-{\r
-this.appendChild(new WebInspector.HeapSnapshotDataGridNode(this.snapshotView, baseItem, snapshotItem, this));\r
-}\r
-this.produceDiff(baseEntries, snapshotEntries, appendListEntry.bind(this));\r
-},\r
-\r
-produceDiff: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.produceDiff,\r
-sort: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.sort,\r
-getTotalCount: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalCount,\r
-getTotalSize: WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype.getTotalSize\r
-};\r
-\r
-WebInspector.HeapSnapshotDataGridList.propertyComparators = [{}, {}];\r
-\r
-WebInspector.HeapSnapshotDataGridList.propertyComparator = function(property, property2, isAscending)\r
-{\r
-var propertyHash = property + "#" + property2;\r
-var comparator = this.propertyComparators[(isAscending ? 1 : 0)][propertyHash];\r
-if (!comparator) {\r
-comparator = function(lhs, rhs) {\r
-var l = lhs[property], r = rhs[property];\r
-if ((l === null || r === null) && property2 !== null)\r
-l = lhs[property2], r = rhs[property2];\r
-var result = l < r ? -1 : (l > r ? 1 : 0);\r
-return isAscending ? result : -result;\r
-};\r
-this.propertyComparators[(isAscending ? 1 : 0)][propertyHash] = comparator;\r
-}\r
-return comparator;\r
-};\r
-\r
-WebInspector.HeapSnapshotDataGridRetainerNode = function(snapshotView, baseEntry, snapshotEntry, owningTree)\r
-{\r
-this.snapshotView = snapshotView;\r
-\r
-if (!snapshotEntry)\r
-snapshotEntry = { constructorName: baseEntry.constructorName, count: 0, clusters: {} };\r
-this.constructorName = snapshotEntry.constructorName;\r
-this.count = snapshotEntry.count;\r
-this.retainers = this._calculateRetainers(this.snapshotView.profile, snapshotEntry.clusters);\r
-\r
-if (!baseEntry)\r
-baseEntry = { count: 0, clusters: {} };\r
-this.baseCount = baseEntry.count;\r
-this.countDelta = this.count - this.baseCount;\r
-this.baseRetainers = this._calculateRetainers(this.snapshotView.baseSnapshot, baseEntry.clusters);\r
-\r
-this.size = null;\r
-this.sizeDelta = null;\r
-\r
-WebInspector.HeapSnapshotDataGridNodeWithRetainers.call(this, owningTree);\r
-}\r
-\r
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype = {\r
-get sizePercent()\r
-{\r
-return null;\r
-},\r
-\r
-get sizeDeltaPercent()\r
-{\r
-return null;\r
-},\r
-\r
-_calculateRetainers: function(snapshot, clusters)\r
-{\r
-var retainers = {};\r
-if (this.isEmptySet(clusters)) {\r
-if (this.constructorName in snapshot.entries)\r
-return snapshot.entries[this.constructorName].retainers;\r
-} else {\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-for (var clusterName in clusters) {\r
-if (clusterName in snapshot.clusters) {\r
-var clusterRetainers = snapshot.clusters[clusterName].retainers;\r
-for (var clusterRetainer in clusterRetainers) {\r
-var clusterRetainerEntry = clusterRetainers[clusterRetainer];\r
-if (!(clusterRetainer in retainers))\r
-retainers[clusterRetainer] = { constructorName: clusterRetainerEntry.constructorName, count: 0, clusters: {} };\r
-retainers[clusterRetainer].count += clusterRetainerEntry.count;\r
-for (var clusterRetainerCluster in clusterRetainerEntry.clusters)\r
-retainers[clusterRetainer].clusters[clusterRetainerCluster] = true;\r
-}\r
-}\r
-}\r
-}\r
-return retainers;\r
-}\r
-};\r
-\r
-WebInspector.HeapSnapshotDataGridRetainerNode.prototype.__proto__ = WebInspector.HeapSnapshotDataGridNodeWithRetainers.prototype;\r
-\r
-\r
-WebInspector.HeapSnapshotProfileType = function()\r
-{\r
-WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("HEAP SNAPSHOTS"));\r
-}\r
-\r
-WebInspector.HeapSnapshotProfileType.TypeId = "HEAP";\r
-\r
-WebInspector.HeapSnapshotProfileType.prototype = {\r
-get buttonTooltip()\r
-{\r
-return WebInspector.UIString("Take heap snapshot.");\r
-},\r
-\r
-get buttonStyle()\r
-{\r
-return "heap-snapshot-status-bar-item status-bar-item";\r
-},\r
-\r
-buttonClicked: function()\r
-{\r
-InspectorBackend.takeHeapSnapshot();\r
-},\r
-\r
-get welcomeMessage()\r
-{\r
-return WebInspector.UIString("Get a heap snapshot by pressing the %s button on the status bar.");\r
-},\r
-\r
-createSidebarTreeElementForProfile: function(profile)\r
-{\r
-return new WebInspector.ProfileSidebarTreeElement(profile, WebInspector.UIString("Snapshot %d"), "heap-snapshot-sidebar-tree-item");\r
-},\r
-\r
-createView: function(profile)\r
-{\r
-return new WebInspector.HeapSnapshotView(WebInspector.panels.profiles, profile);\r
-}\r
-}\r
-\r
-WebInspector.HeapSnapshotProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DebuggerModel = function()\r
-{\r
-InspectorBackend.registerDomainDispatcher("Debugger", this);\r
-\r
-this._paused = false;\r
-this._breakpoints = {};\r
-this._sourceIDAndLineToBreakpointId = {};\r
-this._scripts = {};\r
-}\r
-\r
-WebInspector.DebuggerModel.Events = {\r
-DebuggerPaused: "debugger-paused",\r
-DebuggerResumed: "debugger-resumed",\r
-ParsedScriptSource: "parsed-script-source",\r
-FailedToParseScriptSource: "failed-to-parse-script-source",\r
-BreakpointAdded: "breakpoint-added",\r
-BreakpointRemoved: "breakpoint-removed"\r
-}\r
-\r
-WebInspector.DebuggerModel.prototype = {\r
-continueToLine: function(sourceID, lineNumber)\r
-{\r
-function didSetBreakpoint(breakpointId, actualLineNumber)\r
-{\r
-if (!breakpointId)\r
-return;\r
-if (this.findBreakpoint(sourceID, actualLineNumber)) {\r
-InspectorBackend.removeBreakpoint(breakpointId);\r
-return;\r
-}\r
-if ("_continueToLineBreakpointId" in this)\r
-InspectorBackend.removeBreakpoint(this._continueToLineBreakpointId);\r
-this._continueToLineBreakpointId = breakpointId;\r
-}\r
-InspectorBackend.setBreakpoint(sourceID, lineNumber, "", true, didSetBreakpoint.bind(this));\r
-if (this._paused)\r
-InspectorBackend.resume();\r
-},\r
-\r
-setBreakpoint: function(sourceID, lineNumber, enabled, condition)\r
-{\r
-function didSetBreakpoint(breakpointId, actualLineNumber)\r
-{\r
-if (breakpointId)\r
-this._breakpointSetOnBackend(breakpointId, sourceID, actualLineNumber, condition, enabled, lineNumber, false);\r
-}\r
-InspectorBackend.setBreakpoint(sourceID, lineNumber, condition, enabled, didSetBreakpoint.bind(this));\r
-},\r
-\r
-removeBreakpoint: function(breakpointId)\r
-{\r
-InspectorBackend.removeBreakpoint(breakpointId);\r
-var breakpoint = this._breakpoints[breakpointId];\r
-delete this._breakpoints[breakpointId];\r
-delete this._sourceIDAndLineToBreakpointId[this._encodeSourceIDAndLine(breakpoint.sourceID, breakpoint.line)];\r
-this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.BreakpointRemoved, breakpointId);\r
-},\r
-\r
-breakpointResolved: function(breakpointId, sourceID, lineNumber, condition, enabled, originalLineNumber)\r
-{\r
-this._breakpointSetOnBackend(breakpointId, sourceID, lineNumber, condition, enabled, originalLineNumber, true);\r
-},\r
-\r
-_breakpointSetOnBackend: function(breakpointId, sourceID, lineNumber, condition, enabled, originalLineNumber, restored)\r
-{\r
-var sourceIDAndLine = this._encodeSourceIDAndLine(sourceID, lineNumber);\r
-if (sourceIDAndLine in this._sourceIDAndLineToBreakpointId) {\r
-InspectorBackend.removeBreakpoint(breakpointId);\r
-return;\r
-}\r
-\r
-var url = this._scripts[sourceID].sourceURL;\r
-var breakpoint = new WebInspector.Breakpoint(this, breakpointId, sourceID, url, lineNumber, enabled, condition);\r
-breakpoint.restored = restored;\r
-breakpoint.originalLineNumber = originalLineNumber;\r
-this._breakpoints[breakpointId] = breakpoint;\r
-this._sourceIDAndLineToBreakpointId[sourceIDAndLine] = breakpointId;\r
-this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.BreakpointAdded, breakpoint);\r
-},\r
-\r
-queryBreakpoints: function(filter)\r
-{\r
-var breakpoints = [];\r
-for (var id in this._breakpoints) {\r
-var breakpoint = this._breakpoints[id];\r
-if (filter(breakpoint))\r
-breakpoints.push(breakpoint);\r
-}\r
-return breakpoints;\r
-},\r
-\r
-findBreakpoint: function(sourceID, lineNumber)\r
-{\r
-var sourceIDAndLine = this._encodeSourceIDAndLine(sourceID, lineNumber);\r
-var breakpointId = this._sourceIDAndLineToBreakpointId[sourceIDAndLine];\r
-return this._breakpoints[breakpointId];\r
-},\r
-\r
-_encodeSourceIDAndLine: function(sourceID, lineNumber)\r
-{\r
-return sourceID + ":" + lineNumber;\r
-},\r
-\r
-reset: function()\r
-{\r
-this._paused = false;\r
-this._breakpoints = {};\r
-delete this._oneTimeBreakpoint;\r
-this._sourceIDAndLineToBreakpointId = {};\r
-this._scripts = {};\r
-},\r
-\r
-scriptForSourceID: function(sourceID)\r
-{\r
-return this._scripts[sourceID];\r
-},\r
-\r
-scriptsForURL: function(url)\r
-{\r
-return this.queryScripts(function(s) { return s.sourceURL === url; });\r
-},\r
-\r
-queryScripts: function(filter)\r
-{\r
-var scripts = [];\r
-for (var sourceID in this._scripts) {\r
-var script = this._scripts[sourceID];\r
-if (filter(script))\r
-scripts.push(script);\r
-}\r
-return scripts;\r
-},\r
-\r
-\r
-\r
-pausedScript: function(details)\r
-{\r
-this._paused = true;\r
-if ("_continueToLineBreakpointId" in this) {\r
-InspectorBackend.removeBreakpoint(this._continueToLineBreakpointId);\r
-delete this._continueToLineBreakpointId;\r
-}\r
-this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerPaused, details);\r
-\r
-if (details.eventType === WebInspector.DebuggerEventTypes.JavaScriptPause || details.eventType === WebInspector.DebuggerEventTypes.NativeBreakpoint)\r
-return;\r
-\r
-var breakpoint = this.findBreakpoint(details.callFrames[0].sourceID, details.callFrames[0].line);\r
-if (!breakpoint)\r
-return;\r
-breakpoint.hit = true;\r
-this._lastHitBreakpoint = breakpoint;\r
-},\r
-\r
-resumedScript: function()\r
-{\r
-this._paused = false;\r
-this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerResumed);\r
-\r
-if (!this._lastHitBreakpoint)\r
-return;\r
-this._lastHitBreakpoint.hit = false;\r
-delete this._lastHitBreakpoint;\r
-},\r
-\r
-attachDebuggerWhenShown: function()\r
-{\r
-WebInspector.panels.scripts.attachDebuggerWhenShown();\r
-},\r
-\r
-debuggerWasEnabled: function()\r
-{\r
-WebInspector.panels.scripts.debuggerWasEnabled();\r
-},\r
-\r
-debuggerWasDisabled: function()\r
-{\r
-WebInspector.panels.scripts.debuggerWasDisabled();\r
-},\r
-\r
-parsedScriptSource: function(sourceID, sourceURL, source, startingLine, scriptWorldType)\r
-{\r
-var script = new WebInspector.Script(sourceID, sourceURL, source, startingLine, undefined, undefined, scriptWorldType);\r
-this._scripts[sourceID] = script;\r
-this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ParsedScriptSource, sourceID);\r
-},\r
-\r
-failedToParseScriptSource: function(sourceURL, source, startingLine, errorLine, errorMessage)\r
-{\r
-var script = new WebInspector.Script(null, sourceURL, source, startingLine, errorLine, errorMessage, undefined);\r
-this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, script);\r
-},\r
-\r
-didCreateWorker: function()\r
-{\r
-var workersPane = WebInspector.panels.scripts.sidebarPanes.workers;\r
-workersPane.addWorker.apply(workersPane, arguments);\r
-},\r
-\r
-didDestroyWorker: function()\r
-{\r
-var workersPane = WebInspector.panels.scripts.sidebarPanes.workers;\r
-workersPane.removeWorker.apply(workersPane, arguments);\r
-}\r
-}\r
-\r
-WebInspector.DebuggerModel.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-WebInspector.DebuggerEventTypes = {\r
-JavaScriptPause: 0,\r
-JavaScriptBreakpoint: 1,\r
-NativeBreakpoint: 2\r
-};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.DOMNode = function(doc, payload) {\r
-this.ownerDocument = doc;\r
-\r
-this.id = payload.id;\r
-this.nodeType = payload.nodeType;\r
-this.nodeName = payload.nodeName;\r
-this.localName = payload.localName;\r
-this._nodeValue = payload.nodeValue;\r
-this.textContent = this.nodeValue;\r
-\r
-this.attributes = [];\r
-this._attributesMap = {};\r
-if (payload.attributes)\r
-this._setAttributesPayload(payload.attributes);\r
-\r
-this._childNodeCount = payload.childNodeCount;\r
-this.children = null;\r
-\r
-this.nextSibling = null;\r
-this.prevSibling = null;\r
-this.firstChild = null;\r
-this.lastChild = null;\r
-this.parentNode = null;\r
-\r
-if (payload.children)\r
-this._setChildrenPayload(payload.children);\r
-\r
-this._computedStyle = null;\r
-this.style = null;\r
-this._matchedCSSRules = [];\r
-\r
-this.breakpoints = {};\r
-\r
-if (this.nodeType === Node.ELEMENT_NODE) {\r
-\r
-if (!this.ownerDocument.documentElement && this.nodeName === "HTML")\r
-this.ownerDocument.documentElement = this;\r
-if (!this.ownerDocument.body && this.nodeName === "BODY")\r
-this.ownerDocument.body = this;\r
-if (payload.documentURL)\r
-this.documentURL = payload.documentURL;\r
-} else if (this.nodeType === Node.DOCUMENT_TYPE_NODE) {\r
-this.publicId = payload.publicId;\r
-this.systemId = payload.systemId;\r
-this.internalSubset = payload.internalSubset;\r
-} else if (this.nodeType === Node.DOCUMENT_NODE) {\r
-this.documentURL = payload.documentURL;\r
-} else if (this.nodeType === Node.ATTRIBUTE_NODE) {\r
-this.name = payload.name;\r
-this.value = payload.value;\r
-}\r
-}\r
-\r
-WebInspector.DOMNode.prototype = {\r
-hasAttributes: function()\r
-{\r
-return this.attributes.length > 0;\r
-},\r
-\r
-hasChildNodes: function()\r
-{\r
-return this._childNodeCount > 0;\r
-},\r
-\r
-get nodeValue() {\r
-return this._nodeValue;\r
-},\r
-\r
-set nodeValue(value) {\r
-if (this.nodeType != Node.TEXT_NODE)\r
-return;\r
-this.ownerDocument._domAgent.setTextNodeValueAsync(this, value, function() {});\r
-},\r
-\r
-getAttribute: function(name)\r
-{\r
-var attr = this._attributesMap[name];\r
-return attr ? attr.value : undefined;\r
-},\r
-\r
-setAttribute: function(name, value)\r
-{\r
-var self = this;\r
-var callback = function()\r
-{\r
-var attr = self._attributesMap[name];\r
-if (attr)\r
-attr.value = value;\r
-else\r
-attr = self._addAttribute(name, value);\r
-};\r
-this.ownerDocument._domAgent.setAttributeAsync(this, name, value, callback);\r
-},\r
-\r
-removeAttribute: function(name)\r
-{\r
-var self = this;\r
-var callback = function()\r
-{\r
-delete self._attributesMap[name];\r
-for (var i = 0;  i < self.attributes.length; ++i) {\r
-if (self.attributes[i].name == name) {\r
-self.attributes.splice(i, 1);\r
-break;\r
-}\r
-}\r
-};\r
-this.ownerDocument._domAgent.removeAttributeAsync(this, name, callback);\r
-},\r
-\r
-path: function()\r
-{\r
-var path = [];\r
-var node = this;\r
-while (node && "index" in node && node.nodeName.length) {\r
-path.push([node.index, node.nodeName]);\r
-node = node.parentNode;\r
-}\r
-path.reverse();\r
-return path.join(",");\r
-},\r
-\r
-_setAttributesPayload: function(attrs)\r
-{\r
-this.attributes = [];\r
-this._attributesMap = {};\r
-for (var i = 0; i < attrs.length; i += 2)\r
-this._addAttribute(attrs[i], attrs[i + 1]);\r
-},\r
-\r
-_insertChild: function(prev, payload)\r
-{\r
-var node = new WebInspector.DOMNode(this.ownerDocument, payload);\r
-if (!prev) {\r
-if (!this.children) {\r
-\r
-this.children = [ node ];\r
-} else\r
-this.children.unshift(node);\r
-} else\r
-this.children.splice(this.children.indexOf(prev) + 1, 0, node);\r
-this._renumber();\r
-return node;\r
-},\r
-\r
-removeChild_: function(node)\r
-{\r
-this.children.splice(this.children.indexOf(node), 1);\r
-node.parentNode = null;\r
-this._renumber();\r
-},\r
-\r
-_setChildrenPayload: function(payloads)\r
-{\r
-this.children = [];\r
-for (var i = 0; i < payloads.length; ++i) {\r
-var payload = payloads[i];\r
-var node = new WebInspector.DOMNode(this.ownerDocument, payload);\r
-this.children.push(node);\r
-}\r
-this._renumber();\r
-},\r
-\r
-_renumber: function()\r
-{\r
-this._childNodeCount = this.children.length;\r
-if (this._childNodeCount == 0) {\r
-this.firstChild = null;\r
-this.lastChild = null;\r
-return;\r
-}\r
-this.firstChild = this.children[0];\r
-this.lastChild = this.children[this._childNodeCount - 1];\r
-for (var i = 0; i < this._childNodeCount; ++i) {\r
-var child = this.children[i];\r
-child.index = i;\r
-child.nextSibling = i + 1 < this._childNodeCount ? this.children[i + 1] : null;\r
-child.prevSibling = i - 1 >= 0 ? this.children[i - 1] : null;\r
-child.parentNode = this;\r
-}\r
-},\r
-\r
-_addAttribute: function(name, value)\r
-{\r
-var attr = {\r
-"name": name,\r
-"value": value,\r
-"_node": this\r
-};\r
-this._attributesMap[name] = attr;\r
-this.attributes.push(attr);\r
-}\r
-}\r
-\r
-WebInspector.DOMDocument = function(domAgent, defaultView, payload)\r
-{\r
-WebInspector.DOMNode.call(this, this, payload);\r
-this._listeners = {};\r
-this._domAgent = domAgent;\r
-this.defaultView = defaultView;\r
-}\r
-\r
-WebInspector.DOMDocument.prototype = {\r
-\r
-addEventListener: function(name, callback)\r
-{\r
-var listeners = this._listeners[name];\r
-if (!listeners) {\r
-listeners = [];\r
-this._listeners[name] = listeners;\r
-}\r
-listeners.push(callback);\r
-},\r
-\r
-removeEventListener: function(name, callback)\r
-{\r
-var listeners = this._listeners[name];\r
-if (!listeners)\r
-return;\r
-\r
-var index = listeners.indexOf(callback);\r
-if (index != -1)\r
-listeners.splice(index, 1);\r
-},\r
-\r
-_fireDomEvent: function(name, event)\r
-{\r
-var listeners = this._listeners[name];\r
-if (!listeners)\r
-return;\r
-\r
-for (var i = 0; i < listeners.length; ++i) {\r
-var listener = listeners[i];\r
-listener.call(this, event);\r
-}\r
-}\r
-}\r
-\r
-WebInspector.DOMDocument.prototype.__proto__ = WebInspector.DOMNode.prototype;\r
-\r
-\r
-WebInspector.DOMWindow = function(domAgent)\r
-{\r
-this._domAgent = domAgent;\r
-}\r
-\r
-WebInspector.DOMWindow.prototype = {\r
-get document()\r
-{\r
-return this._domAgent.document;\r
-},\r
-\r
-get Node()\r
-{\r
-return WebInspector.DOMNode;\r
-},\r
-\r
-get Element()\r
-{\r
-return WebInspector.DOMNode;\r
-},\r
-\r
-Object: function()\r
-{\r
-}\r
-}\r
-\r
-WebInspector.DOMAgent = function() {\r
-this._window = new WebInspector.DOMWindow(this);\r
-this._idToDOMNode = null;\r
-this.document = null;\r
-InspectorBackend.registerDomainDispatcher("DOM", this);\r
-}\r
-\r
-WebInspector.DOMAgent.prototype = {\r
-get domWindow()\r
-{\r
-return this._window;\r
-},\r
-\r
-getChildNodesAsync: function(parent, callback)\r
-{\r
-var children = parent.children;\r
-if (children) {\r
-callback(children);\r
-return;\r
-}\r
-function mycallback() {\r
-callback(parent.children);\r
-}\r
-InspectorBackend.getChildNodes(parent.id, mycallback);\r
-},\r
-\r
-setAttributeAsync: function(node, name, value, callback)\r
-{\r
-var mycallback = this._didApplyDomChange.bind(this, node, callback);\r
-InspectorBackend.setAttribute(node.id, name, value, mycallback);\r
-},\r
-\r
-removeAttributeAsync: function(node, name, callback)\r
-{\r
-var mycallback = this._didApplyDomChange.bind(this, node, callback);\r
-InspectorBackend.removeAttribute(node.id, name, mycallback);\r
-},\r
-\r
-setTextNodeValueAsync: function(node, text, callback)\r
-{\r
-var mycallback = this._didApplyDomChange.bind(this, node, callback);\r
-InspectorBackend.setTextNodeValue(node.id, text, mycallback);\r
-},\r
-\r
-_didApplyDomChange: function(node, callback, success)\r
-{\r
-if (!success)\r
-return;\r
-callback();\r
-\r
-var elem = WebInspector.panels.elements.treeOutline.findTreeElement(node);\r
-if (elem)\r
-elem.updateTitle();\r
-},\r
-\r
-attributesUpdated: function(nodeId, attrsArray)\r
-{\r
-var node = this._idToDOMNode[nodeId];\r
-node._setAttributesPayload(attrsArray);\r
-var event = {target: node};\r
-this.document._fireDomEvent("DOMAttrModified", event);\r
-},\r
-\r
-characterDataModified: function(nodeId, newValue)\r
-{\r
-var node = this._idToDOMNode[nodeId];\r
-node._nodeValue = newValue;\r
-node.textContent = newValue;\r
-var event = { target : node };\r
-this.document._fireDomEvent("DOMCharacterDataModified", event);\r
-},\r
-\r
-nodeForId: function(nodeId)\r
-{\r
-return this._idToDOMNode[nodeId];\r
-},\r
-\r
-didCommitLoad: function()\r
-{\r
-\r
-this.setDocument(null);\r
-},\r
-\r
-setDocument: function(payload)\r
-{\r
-this._idToDOMNode = {};\r
-if (payload && "id" in payload) {\r
-this.document = new WebInspector.DOMDocument(this, this._window, payload);\r
-this._idToDOMNode[payload.id] = this.document;\r
-this._bindNodes(this.document.children);\r
-WebInspector.breakpointManager.restoreDOMBreakpoints();\r
-} else\r
-this.document = null;\r
-WebInspector.panels.elements.setDocument(this.document);\r
-},\r
-\r
-setDetachedRoot: function(payload)\r
-{\r
-var root = new WebInspector.DOMNode(this.document, payload);\r
-this._idToDOMNode[payload.id] = root;\r
-},\r
-\r
-setChildNodes: function(parentId, payloads)\r
-{\r
-var parent = this._idToDOMNode[parentId];\r
-parent._setChildrenPayload(payloads);\r
-this._bindNodes(parent.children);\r
-},\r
-\r
-_bindNodes: function(children)\r
-{\r
-for (var i = 0; i < children.length; ++i) {\r
-var child = children[i];\r
-this._idToDOMNode[child.id] = child;\r
-if (child.children)\r
-this._bindNodes(child.children);\r
-}\r
-},\r
-\r
-childNodeCountUpdated: function(nodeId, newValue)\r
-{\r
-var node = this._idToDOMNode[nodeId];\r
-node._childNodeCount = newValue;\r
-var outline = WebInspector.panels.elements.treeOutline;\r
-var treeElement = outline.findTreeElement(node);\r
-if (treeElement)\r
-treeElement.hasChildren = newValue;\r
-},\r
-\r
-childNodeInserted: function(parentId, prevId, payload)\r
-{\r
-var parent = this._idToDOMNode[parentId];\r
-var prev = this._idToDOMNode[prevId];\r
-var node = parent._insertChild(prev, payload);\r
-this._idToDOMNode[node.id] = node;\r
-var event = { target : node, relatedNode : parent };\r
-this.document._fireDomEvent("DOMNodeInserted", event);\r
-},\r
-\r
-childNodeRemoved: function(parentId, nodeId)\r
-{\r
-var parent = this._idToDOMNode[parentId];\r
-var node = this._idToDOMNode[nodeId];\r
-parent.removeChild_(node);\r
-var event = { target : node, relatedNode : parent };\r
-this.document._fireDomEvent("DOMNodeRemoved", event);\r
-delete this._idToDOMNode[nodeId];\r
-this._removeBreakpoints(node);\r
-},\r
-\r
-_removeBreakpoints: function(node)\r
-{\r
-for (var type in node.breakpoints)\r
-node.breakpoints[type].remove();\r
-if (!node.children)\r
-return;\r
-for (var i = 0; i < node.children.length; ++i)\r
-this._removeBreakpoints(node.children[i]);\r
-}\r
-}\r
-\r
-WebInspector.ApplicationCache = {}\r
-\r
-WebInspector.ApplicationCache.getApplicationCachesAsync = function(callback)\r
-{\r
-function mycallback(applicationCaches)\r
-{\r
-\r
-if (applicationCaches)\r
-callback(applicationCaches);\r
-}\r
-\r
-InspectorBackend.getApplicationCaches(mycallback);\r
-}\r
-\r
-WebInspector.Cookies = {}\r
-\r
-WebInspector.Cookies.getCookiesAsync = function(callback)\r
-{\r
-function mycallback(cookies, cookiesString)\r
-{\r
-if (cookiesString)\r
-callback(WebInspector.Cookies.buildCookiesFromString(cookiesString), false);\r
-else\r
-callback(cookies, true);\r
-}\r
-\r
-InspectorBackend.getCookies(mycallback);\r
-}\r
-\r
-WebInspector.Cookies.buildCookiesFromString = function(rawCookieString)\r
-{\r
-var rawCookies = rawCookieString.split(/;\s*/);\r
-var cookies = [];\r
-\r
-if (!(/^\s*$/.test(rawCookieString))) {\r
-for (var i = 0; i < rawCookies.length; ++i) {\r
-var cookie = rawCookies[i];\r
-var delimIndex = cookie.indexOf("=");\r
-var name = cookie.substring(0, delimIndex);\r
-var value = cookie.substring(delimIndex + 1);\r
-var size = name.length + value.length;\r
-cookies.push({ name: name, value: value, size: size });\r
-}\r
-}\r
-\r
-return cookies;\r
-}\r
-\r
-WebInspector.Cookies.cookieMatchesResourceURL = function(cookie, resourceURL)\r
-{\r
-var url = resourceURL.asParsedURL();\r
-if (!url || !this.cookieDomainMatchesResourceDomain(cookie.domain, url.host))\r
-return false;\r
-return (url.path.indexOf(cookie.path) === 0\r
-&& (!cookie.port || url.port == cookie.port)\r
-&& (!cookie.secure || url.scheme === "https"));\r
-}\r
-\r
-WebInspector.Cookies.cookieDomainMatchesResourceDomain = function(cookieDomain, resourceDomain)\r
-{\r
-if (cookieDomain.charAt(0) !== '.')\r
-return resourceDomain === cookieDomain;\r
-return !!resourceDomain.match(new RegExp("^([^\\.]+\\.)?" + cookieDomain.substring(1).escapeForRegExp() + "$"), "i");\r
-}\r
-\r
-WebInspector.EventListeners = {}\r
-\r
-WebInspector.EventListeners.getEventListenersForNodeAsync = function(node, callback)\r
-{\r
-if (!node)\r
-return;\r
-InspectorBackend.getEventListenersForNode(node.id, callback);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-var injectedScriptConstructor = (function (InjectedScriptHost, inspectedWindow, injectedScriptId) {\r
-\r
-var InjectedScript = function()\r
-{\r
-this._lastBoundObjectId = 1;\r
-this._idToWrappedObject = {};\r
-this._objectGroups = {};\r
-}\r
-\r
-InjectedScript.prototype = {\r
-wrapObjectForConsole: function(object, canAccessInspectedWindow)\r
-{\r
-if (canAccessInspectedWindow)\r
-return this._wrapObject(object, "console");\r
-var result = {};\r
-result.type = typeof object;\r
-result.description = this._toString(object);\r
-return result;\r
-},\r
-\r
-_wrapObject: function(object, objectGroupName, abbreviate)\r
-{\r
-try {\r
-var objectId;\r
-if (typeof object === "object" || typeof object === "function" || this._isHTMLAllCollection(object)) {\r
-var id = this._lastBoundObjectId++;\r
-this._idToWrappedObject[id] = object;\r
-\r
-var group = this._objectGroups[objectGroupName];\r
-if (!group) {\r
-group = [];\r
-this._objectGroups[objectGroupName] = group;\r
-}\r
-group.push(id);\r
-objectId = this._serializeObjectId(id, objectGroupName);\r
-}\r
-return InjectedScript.RemoteObject.fromObject(object, objectId, abbreviate);\r
-} catch (e) {\r
-return InjectedScript.RemoteObject.fromObject("[ Exception: " + e.toString() + " ]");\r
-}\r
-},\r
-\r
-_serializeObjectId: function(id, groupName)\r
-{\r
-return injectedScriptId + ":" + id + ":" + groupName;\r
-},\r
-\r
-_parseObjectId: function(objectId)\r
-{\r
-var tokens = objectId.split(":");\r
-var parsedObjectId = {};\r
-parsedObjectId.id = parseInt(tokens[1]);\r
-parsedObjectId.groupName = tokens[2];\r
-return parsedObjectId;\r
-},\r
-\r
-releaseWrapperObjectGroup: function(objectGroupName)\r
-{\r
-var group = this._objectGroups[objectGroupName];\r
-if (!group)\r
-return;\r
-for (var i = 0; i < group.length; i++)\r
-delete this._idToWrappedObject[group[i]];\r
-delete this._objectGroups[objectGroupName];\r
-},\r
-\r
-dispatch: function(methodName, args)\r
-{\r
-var argsArray = eval("(" + args + ")");\r
-var result = this[methodName].apply(this, argsArray);\r
-if (typeof result === "undefined") {\r
-inspectedWindow.console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);\r
-result = null;\r
-}\r
-return result;\r
-},\r
-\r
-getPrototypes: function(nodeId)\r
-{\r
-this.releaseWrapperObjectGroup("prototypes");\r
-var node = this._nodeForId(nodeId);\r
-if (!node)\r
-return false;\r
-\r
-var result = [];\r
-var prototype = node;\r
-do {\r
-result.push(this._wrapObject(prototype, "prototypes"));\r
-prototype = prototype.__proto__;\r
-} while (prototype)\r
-return result;\r
-},\r
-\r
-getProperties: function(objectId, ignoreHasOwnProperty, abbreviate)\r
-{\r
-var parsedObjectId = this._parseObjectId(objectId);\r
-var object = this._objectForId(parsedObjectId);\r
-if (!this._isDefined(object))\r
-return false;\r
-var properties = [];\r
-\r
-var propertyNames = ignoreHasOwnProperty ? this._getPropertyNames(object) : Object.getOwnPropertyNames(object);\r
-if (!ignoreHasOwnProperty && object.__proto__)\r
-propertyNames.push("__proto__");\r
-\r
-\r
-for (var i = 0; i < propertyNames.length; ++i) {\r
-var propertyName = propertyNames[i];\r
-\r
-var property = {};\r
-property.name = propertyName + "";\r
-var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);\r
-if (!isGetter) {\r
-try {\r
-property.value = this._wrapObject(object[propertyName], parsedObjectId.groupName, abbreviate);\r
-} catch(e) {\r
-property.value = new InjectedScript.RemoteObject.fromException(e);\r
-}\r
-} else {\r
-\r
-property.value = new InjectedScript.RemoteObject.fromObject("\u2014"); \r
-property.isGetter = true;\r
-}\r
-properties.push(property);\r
-}\r
-return properties;\r
-},\r
-\r
-setPropertyValue: function(objectId, propertyName, expression)\r
-{\r
-var parsedObjectId = this._parseObjectId(objectId);\r
-var object = this._objectForId(parsedObjectId);\r
-if (!this._isDefined(object))\r
-return false;\r
-\r
-var expressionLength = expression.length;\r
-if (!expressionLength) {\r
-delete object[propertyName];\r
-return !(propertyName in object);\r
-}\r
-\r
-try {\r
-\r
-\r
-\r
-\r
-\r
-\r
-var result = inspectedWindow.eval("(" + expression + ")");\r
-\r
-object[propertyName] = result;\r
-return true;\r
-} catch(e) {\r
-try {\r
-var result = inspectedWindow.eval("\"" + expression.replace(/"/g, "\\\"") + "\"");\r
-object[propertyName] = result;\r
-return true;\r
-} catch(e) {\r
-return false;\r
-}\r
-}\r
-},\r
-\r
-_populatePropertyNames: function(object, resultSet)\r
-{\r
-for (var o = object; o; o = o.__proto__) {\r
-try {\r
-var names = Object.getOwnPropertyNames(o);\r
-for (var i = 0; i < names.length; ++i)\r
-resultSet[names[i]] = true;\r
-} catch (e) {\r
-}\r
-}\r
-},\r
-\r
-_getPropertyNames: function(object, resultSet)\r
-{\r
-var propertyNameSet = {};\r
-this._populatePropertyNames(object, propertyNameSet);\r
-return Object.keys(propertyNameSet);\r
-},\r
-\r
-getCompletions: function(expression, includeInspectorCommandLineAPI, callFrameId)\r
-{\r
-var props = {};\r
-try {\r
-var expressionResult;\r
-\r
-if (typeof callFrameId === "number") {\r
-var callFrame = this._callFrameForId(callFrameId);\r
-if (!callFrame)\r
-return props;\r
-if (expression)\r
-expressionResult = this._evaluateOn(callFrame.evaluate, callFrame, expression, true);\r
-else {\r
-\r
-var scopeChain = callFrame.scopeChain;\r
-for (var i = 0; i < scopeChain.length; ++i)\r
-this._populatePropertyNames(scopeChain[i], props);\r
-}\r
-} else {\r
-if (!expression)\r
-expression = "this";\r
-expressionResult = this._evaluateOn(inspectedWindow.eval, inspectedWindow, expression, false);\r
-}\r
-if (typeof expressionResult === "object")\r
-this._populatePropertyNames(expressionResult, props);\r
-\r
-if (includeInspectorCommandLineAPI) {\r
-for (var prop in this._commandLineAPI)\r
-props[prop] = true;\r
-}\r
-} catch(e) {\r
-}\r
-return props;\r
-},\r
-\r
-evaluate: function(expression, objectGroup)\r
-{\r
-return this._evaluateAndWrap(inspectedWindow.eval, inspectedWindow, expression, objectGroup, false);\r
-},\r
-\r
-_evaluateAndWrap: function(evalFunction, object, expression, objectGroup, isEvalOnCallFrame)\r
-{\r
-try {\r
-return this._wrapObject(this._evaluateOn(evalFunction, object, expression, isEvalOnCallFrame), objectGroup);\r
-} catch (e) {\r
-return InjectedScript.RemoteObject.fromException(e);\r
-}\r
-},\r
-\r
-_evaluateOn: function(evalFunction, object, expression, isEvalOnCallFrame)\r
-{\r
-\r
-\r
-\r
-inspectedWindow.console._commandLineAPI = this._commandLineAPI;\r
-\r
-\r
-if (!isEvalOnCallFrame)\r
-expression = "with (window) {\n" + expression + "\n} ";\r
-expression = "with (window ? window.console._commandLineAPI : {}) {\n" + expression + "\n}";\r
-var value = evalFunction.call(object, expression);\r
-\r
-delete inspectedWindow.console._commandLineAPI;\r
-\r
-\r
-if (this._type(value) === "error")\r
-throw value.toString();\r
-\r
-return value;\r
-},\r
-\r
-getNodeId: function(node)\r
-{\r
-return InjectedScriptHost.pushNodePathToFrontend(node, false, false);\r
-},\r
-\r
-callFrames: function()\r
-{\r
-var callFrame = InjectedScriptHost.currentCallFrame();\r
-if (!callFrame)\r
-return false;\r
-\r
-injectedScript.releaseWrapperObjectGroup("backtrace");\r
-var result = [];\r
-var depth = 0;\r
-do {\r
-result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));\r
-callFrame = callFrame.caller;\r
-} while (callFrame);\r
-return result;\r
-},\r
-\r
-evaluateInCallFrame: function(callFrameId, code, objectGroup)\r
-{\r
-var callFrame = this._callFrameForId(callFrameId);\r
-if (!callFrame)\r
-return false;\r
-return this._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup, true);\r
-},\r
-\r
-_callFrameForId: function(id)\r
-{\r
-var callFrame = InjectedScriptHost.currentCallFrame();\r
-while (--id >= 0 && callFrame)\r
-callFrame = callFrame.caller;\r
-return callFrame;\r
-},\r
-\r
-_nodeForId: function(nodeId)\r
-{\r
-if (!nodeId)\r
-return null;\r
-return InjectedScriptHost.nodeForId(nodeId);\r
-},\r
-\r
-_objectForId: function(parsedObjectId)\r
-{\r
-return this._idToWrappedObject[parsedObjectId.id];\r
-},\r
-\r
-resolveNode: function(nodeId)\r
-{\r
-var node = this._nodeForId(nodeId);\r
-if (!node)\r
-return false;\r
-\r
-return this._wrapObject(node, "prototype");\r
-},\r
-\r
-getNodeProperties: function(nodeId, properties)\r
-{\r
-var node = this._nodeForId(nodeId);\r
-if (!node)\r
-return false;\r
-var result = {};\r
-for (var i = 0; i < properties.length; ++i)\r
-result[properties[i]] = node[properties[i]];\r
-return result;\r
-},\r
-\r
-pushNodeToFrontend: function(objectId)\r
-{\r
-var parsedObjectId = this._parseObjectId(objectId);\r
-var object = this._objectForId(parsedObjectId);\r
-if (!object || this._type(object) !== "node")\r
-return false;\r
-return InjectedScriptHost.pushNodePathToFrontend(object, false, false);\r
-},\r
-\r
-evaluateOnSelf: function(funcBody, args)\r
-{\r
-var func = window.eval("(" + funcBody + ")");\r
-return func.apply(this, args || []);\r
-},\r
-\r
-_isDefined: function(object)\r
-{\r
-return object || this._isHTMLAllCollection(object);\r
-},\r
-\r
-_isHTMLAllCollection: function(object)\r
-{\r
-\r
-return (typeof object === "undefined") && inspectedWindow.HTMLAllCollection && object instanceof inspectedWindow.HTMLAllCollection;\r
-},\r
-\r
-_type: function(obj)\r
-{\r
-if (obj === null)\r
-return "null";\r
-\r
-var type = typeof obj;\r
-if (type !== "object" && type !== "function") {\r
-\r
-if (this._isHTMLAllCollection(obj))\r
-return "array";\r
-return type;\r
-}\r
-\r
-\r
-\r
-if (!inspectedWindow.document)\r
-return type;\r
-\r
-if (obj instanceof inspectedWindow.Node)\r
-return (obj.nodeType === undefined ? type : "node");\r
-if (obj instanceof inspectedWindow.String)\r
-return "string";\r
-if (obj instanceof inspectedWindow.Array)\r
-return "array";\r
-if (obj instanceof inspectedWindow.Boolean)\r
-return "boolean";\r
-if (obj instanceof inspectedWindow.Number)\r
-return "number";\r
-if (obj instanceof inspectedWindow.Date)\r
-return "date";\r
-if (obj instanceof inspectedWindow.RegExp)\r
-return "regexp";\r
-\r
-if (isFinite(obj.length) && typeof obj.splice === "function")\r
-return "array";\r
-if (isFinite(obj.length) && typeof obj.callee === "function") \r
-return "array";\r
-if (obj instanceof inspectedWindow.NodeList)\r
-return "array";\r
-if (obj instanceof inspectedWindow.HTMLCollection)\r
-return "array";\r
-if (obj instanceof inspectedWindow.Error)\r
-return "error";\r
-return type;\r
-},\r
-\r
-_describe: function(obj, abbreviated)\r
-{\r
-var type = this._type(obj);\r
-\r
-switch (type) {\r
-case "object":\r
-case "node":\r
-var result = InjectedScriptHost.internalConstructorName(obj);\r
-if (result === "Object") {\r
-\r
-\r
-var constructorName = obj.constructor && obj.constructor.name;\r
-if (constructorName)\r
-return constructorName;\r
-}\r
-return result;\r
-case "array":\r
-var className = InjectedScriptHost.internalConstructorName(obj);\r
-if (typeof obj.length === "number")\r
-className += "[" + obj.length + "]";\r
-return className;\r
-case "string":\r
-if (!abbreviated)\r
-return obj;\r
-if (obj.length > 100)\r
-return "\"" + obj.substring(0, 100) + "\u2026\"";\r
-return "\"" + obj + "\"";\r
-case "function":\r
-var objectText = this._toString(obj);\r
-if (abbreviated)\r
-objectText = /.*/.exec(objectText)[0].replace(/ +$/g, "");\r
-return objectText;\r
-default:\r
-return this._toString(obj);\r
-}\r
-},\r
-\r
-_toString: function(obj)\r
-{\r
-\r
-return "" + obj;\r
-},\r
-\r
-_logEvent: function(event)\r
-{\r
-console.log(event.type, event);\r
-},\r
-\r
-_normalizeEventTypes: function(types)\r
-{\r
-if (typeof types === "undefined")\r
-types = [ "mouse", "key", "load", "unload", "abort", "error", "select", "change", "submit", "reset", "focus", "blur", "resize", "scroll" ];\r
-else if (typeof types === "string")\r
-types = [ types ];\r
-\r
-var result = [];\r
-for (var i = 0; i < types.length; i++) {\r
-if (types[i] === "mouse")\r
-result.splice(0, 0, "mousedown", "mouseup", "click", "dblclick", "mousemove", "mouseover", "mouseout");\r
-else if (types[i] === "key")\r
-result.splice(0, 0, "keydown", "keyup", "keypress");\r
-else\r
-result.push(types[i]);\r
-}\r
-return result;\r
-},\r
-\r
-_inspectedNode: function(num)\r
-{\r
-var nodeId = InjectedScriptHost.inspectedNode(num);\r
-return this._nodeForId(nodeId);\r
-},\r
-\r
-_bindToScript: function(func)\r
-{\r
-var args = Array.prototype.slice.call(arguments, 1);\r
-function bound()\r
-{\r
-return func.apply(injectedScript, args.concat(Array.prototype.slice.call(arguments)));\r
-}\r
-bound.toString = function() {\r
-return "bound: " + func;\r
-};\r
-return bound;\r
-}\r
-}\r
-\r
-var injectedScript = new InjectedScript();\r
-\r
-InjectedScript.RemoteObject = function(objectId, type, description, hasChildren)\r
-{\r
-this.objectId = objectId;\r
-this.type = type;\r
-this.description = description;\r
-this.hasChildren = hasChildren;\r
-}\r
-\r
-InjectedScript.RemoteObject.fromException = function(e)\r
-{\r
-return new InjectedScript.RemoteObject(null, "error", e.toString());\r
-}\r
-\r
-InjectedScript.RemoteObject.fromObject = function(object, objectId, abbreviate)\r
-{\r
-var type = injectedScript._type(object);\r
-var rawType = typeof object;\r
-var hasChildren = (rawType === "object" && object !== null && (Object.getOwnPropertyNames(object).length || !!object.__proto__)) || rawType === "function";\r
-var description = "";\r
-try {\r
-var description = injectedScript._describe(object, abbreviate);\r
-return new InjectedScript.RemoteObject(objectId, type, description, hasChildren);\r
-} catch (e) {\r
-return InjectedScript.RemoteObject.fromException(e);\r
-}\r
-}\r
-\r
-InjectedScript.CallFrameProxy = function(id, callFrame)\r
-{\r
-this.id = id;\r
-this.type = callFrame.type;\r
-this.functionName = (this.type === "function" ? callFrame.functionName : "");\r
-this.sourceID = callFrame.sourceID;\r
-this.line = callFrame.line;\r
-this.scopeChain = this._wrapScopeChain(callFrame);\r
-this.worldId = injectedScriptId;\r
-}\r
-\r
-InjectedScript.CallFrameProxy.prototype = {\r
-_wrapScopeChain: function(callFrame)\r
-{\r
-const GLOBAL_SCOPE = 0;\r
-const LOCAL_SCOPE = 1;\r
-const WITH_SCOPE = 2;\r
-const CLOSURE_SCOPE = 3;\r
-const CATCH_SCOPE = 4;\r
-\r
-var scopeChain = callFrame.scopeChain;\r
-var scopeChainProxy = [];\r
-var foundLocalScope = false;\r
-for (var i = 0; i < scopeChain.length; i++) {\r
-var scopeType = callFrame.scopeType(i);\r
-var scopeObject = scopeChain[i];\r
-var scopeObjectProxy = injectedScript._wrapObject(scopeObject, "backtrace", true);\r
-\r
-switch(scopeType) {\r
-case LOCAL_SCOPE: {\r
-foundLocalScope = true;\r
-scopeObjectProxy.isLocal = true;\r
-scopeObjectProxy.thisObject = injectedScript._wrapObject(callFrame.thisObject, "backtrace", true);\r
-break;\r
-}\r
-case CLOSURE_SCOPE: {\r
-scopeObjectProxy.isClosure = true;\r
-break;\r
-}\r
-case WITH_SCOPE:\r
-case CATCH_SCOPE: {\r
-if (foundLocalScope && scopeObject instanceof inspectedWindow.Element)\r
-scopeObjectProxy.isElement = true;\r
-else if (foundLocalScope && scopeObject instanceof inspectedWindow.Document)\r
-scopeObjectProxy.isDocument = true;\r
-else\r
-scopeObjectProxy.isWithBlock = true;\r
-break;\r
-}\r
-}\r
-scopeChainProxy.push(scopeObjectProxy);\r
-}\r
-return scopeChainProxy;\r
-}\r
-}\r
-\r
-function CommandLineAPI()\r
-{\r
-for (var i = 0; i < 5; ++i)\r
-this.__defineGetter__("$" + i, injectedScript._bindToScript(injectedScript._inspectedNode, i));\r
-}\r
-\r
-CommandLineAPI.prototype = {\r
-\r
-\r
-$: function()\r
-{\r
-return document.getElementById.apply(document, arguments)\r
-},\r
-\r
-$$: function()\r
-{\r
-return document.querySelectorAll.apply(document, arguments)\r
-},\r
-\r
-$x: function(xpath, context)\r
-{\r
-var nodes = [];\r
-try {\r
-var doc = context || document;\r
-var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);\r
-var node;\r
-while (node = results.iterateNext())\r
-nodes.push(node);\r
-} catch (e) {\r
-}\r
-return nodes;\r
-},\r
-\r
-dir: function()\r
-{\r
-return console.dir.apply(console, arguments)\r
-},\r
-\r
-dirxml: function()\r
-{\r
-return console.dirxml.apply(console, arguments)\r
-},\r
-\r
-keys: function(object)\r
-{\r
-return Object.keys(object);\r
-},\r
-\r
-values: function(object)\r
-{\r
-var result = [];\r
-for (var key in object)\r
-result.push(object[key]);\r
-return result;\r
-},\r
-\r
-profile: function()\r
-{\r
-return console.profile.apply(console, arguments)\r
-},\r
-\r
-profileEnd: function()\r
-{\r
-return console.profileEnd.apply(console, arguments)\r
-},\r
-\r
-monitorEvents: function(object, types)\r
-{\r
-if (!object || !object.addEventListener || !object.removeEventListener)\r
-return;\r
-types = injectedScript._normalizeEventTypes(types);\r
-for (var i = 0; i < types.length; ++i) {\r
-object.removeEventListener(types[i], injectedScript._logEvent, false);\r
-object.addEventListener(types[i], injectedScript._logEvent, false);\r
-}\r
-},\r
-\r
-unmonitorEvents: function(object, types)\r
-{\r
-if (!object || !object.addEventListener || !object.removeEventListener)\r
-return;\r
-types = injectedScript._normalizeEventTypes(types);\r
-for (var i = 0; i < types.length; ++i)\r
-object.removeEventListener(types[i], injectedScript._logEvent, false);\r
-},\r
-\r
-inspect: function(object)\r
-{\r
-if (arguments.length === 0)\r
-return;\r
-\r
-inspectedWindow.console.log(object);\r
-if (injectedScript._type(object) === "node")\r
-InjectedScriptHost.pushNodePathToFrontend(object, false, true);\r
-else {\r
-switch (injectedScript._describe(object)) {\r
-case "Database":\r
-InjectedScriptHost.selectDatabase(object);\r
-break;\r
-case "Storage":\r
-InjectedScriptHost.selectDOMStorage(object);\r
-break;\r
-}\r
-}\r
-},\r
-\r
-copy: function(object)\r
-{\r
-if (injectedScript._type(object) === "node")\r
-object = object.outerHTML;\r
-InjectedScriptHost.copyText(object);\r
-},\r
-\r
-clear: function()\r
-{\r
-InjectedScriptHost.clearConsoleMessages();\r
-}\r
-}\r
-\r
-injectedScript._commandLineAPI = new CommandLineAPI();\r
-return injectedScript;\r
-});\r
-\r
-\r
-\r
-\r
-\r
-function InjectedScriptAccess(worldId) {\r
-this._worldId = worldId;\r
-}\r
-\r
-InjectedScriptAccess.get = function(worldId)\r
-{\r
-if (typeof worldId === "number")\r
-return new InjectedScriptAccess(worldId);\r
-\r
-console.assert(false, "Access to injected script with no id");\r
-}\r
-\r
-InjectedScriptAccess.getForNode = function(node)\r
-{\r
-\r
-return InjectedScriptAccess.get(-node.id);\r
-}\r
-\r
-InjectedScriptAccess.getForObjectId = function(objectId)\r
-{\r
-\r
-var tokens = objectId.split(":");\r
-return InjectedScriptAccess.get(parseInt(tokens[0]));\r
-}\r
-\r
-InjectedScriptAccess.getDefault = function()\r
-{\r
-return InjectedScriptAccess.get(0);\r
-}\r
-\r
-InjectedScriptAccess.prototype = {};\r
-\r
-InjectedScriptAccess._installHandler = function(methodName, async)\r
-{\r
-InjectedScriptAccess.prototype[methodName] = function()\r
-{\r
-var allArgs = Array.prototype.slice.call(arguments);\r
-var callback = allArgs[allArgs.length - 1];\r
-var argsString = JSON.stringify(Array.prototype.slice.call(allArgs, 0, allArgs.length - 1));\r
-\r
-function myCallback(result, isException)\r
-{\r
-if (!isException)\r
-callback(result);\r
-else\r
-WebInspector.console.addMessage(WebInspector.ConsoleMessage.createTextMessage("Error dispatching: " + methodName));\r
-}\r
-InspectorBackend.dispatchOnInjectedScript(this._worldId, methodName, argsString, myCallback);\r
-};\r
-}\r
-\r
-\r
-\r
-\r
-\r
-InjectedScriptAccess._installHandler("evaluate");\r
-InjectedScriptAccess._installHandler("evaluateInCallFrame");\r
-InjectedScriptAccess._installHandler("evaluateOnSelf");\r
-InjectedScriptAccess._installHandler("getCompletions");\r
-InjectedScriptAccess._installHandler("getProperties");\r
-InjectedScriptAccess._installHandler("getPrototypes");\r
-InjectedScriptAccess._installHandler("pushNodeToFrontend");\r
-InjectedScriptAccess._installHandler("resolveNode");\r
-InjectedScriptAccess._installHandler("getNodeProperties");\r
-InjectedScriptAccess._installHandler("setPropertyValue");\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TimelineAgent = function() {\r
-\r
-}\r
-\r
-\r
-WebInspector.TimelineAgent.RecordType = {\r
-EventDispatch : 0,\r
-Layout : 1,\r
-RecalculateStyles : 2,\r
-Paint : 3,\r
-ParseHTML : 4,\r
-TimerInstall : 5,\r
-TimerRemove : 6,\r
-TimerFire : 7,\r
-XHRReadyStateChange : 8,\r
-XHRLoad : 9,\r
-EvaluateScript : 10,\r
-MarkTimeline : 11,\r
-ResourceSendRequest : 12,\r
-ResourceReceiveResponse : 13,\r
-ResourceFinish : 14,\r
-FunctionCall : 15,\r
-ResourceReceiveData: 16,\r
-GCEvent : 17,\r
-MarkDOMContentEventType : 18,\r
-MarkLoadEventType : 19,\r
-ScheduleResourceRequest : 20\r
-};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TimelinePanel = function()\r
-{\r
-WebInspector.Panel.call(this, "timeline");\r
-\r
-this.element.appendChild(this._createTopPane());\r
-this.element.tabIndex = 0;\r
-\r
-this._sidebarBackgroundElement = document.createElement("div");\r
-this._sidebarBackgroundElement.className = "sidebar timeline-sidebar-background";\r
-this.element.appendChild(this._sidebarBackgroundElement);\r
-\r
-this._containerElement = document.createElement("div");\r
-this._containerElement.id = "timeline-container";\r
-this._containerElement.addEventListener("scroll", this._onScroll.bind(this), false);\r
-this.element.appendChild(this._containerElement);\r
-\r
-this.createSidebar(this._containerElement, this._containerElement);\r
-var itemsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RECORDS"), {}, true);\r
-itemsTreeElement.expanded = true;\r
-this.sidebarTree.appendChild(itemsTreeElement);\r
-\r
-this._sidebarListElement = document.createElement("div");\r
-this.sidebarElement.appendChild(this._sidebarListElement);\r
-\r
-this._containerContentElement = document.createElement("div");\r
-this._containerContentElement.id = "resources-container-content";\r
-this._containerElement.appendChild(this._containerContentElement);\r
-\r
-this._timelineGrid = new WebInspector.TimelineGrid();\r
-this._itemsGraphsElement = this._timelineGrid.itemsGraphsElement;\r
-this._itemsGraphsElement.id = "timeline-graphs";\r
-this._containerContentElement.appendChild(this._timelineGrid.element);\r
-\r
-this._topGapElement = document.createElement("div");\r
-this._topGapElement.className = "timeline-gap";\r
-this._itemsGraphsElement.appendChild(this._topGapElement);\r
-\r
-this._graphRowsElement = document.createElement("div");\r
-this._itemsGraphsElement.appendChild(this._graphRowsElement);\r
-\r
-this._bottomGapElement = document.createElement("div");\r
-this._bottomGapElement.className = "timeline-gap";\r
-this._itemsGraphsElement.appendChild(this._bottomGapElement);\r
-\r
-this._expandElements = document.createElement("div");\r
-this._expandElements.id = "orphan-expand-elements";\r
-this._itemsGraphsElement.appendChild(this._expandElements);\r
-\r
-this._rootRecord = this._createRootRecord();\r
-this._sendRequestRecords = {};\r
-this._scheduledResourceRequests = {};\r
-this._timerRecords = {};\r
-\r
-this._calculator = new WebInspector.TimelineCalculator();\r
-this._calculator._showShortEvents = false;\r
-var shortRecordThresholdTitle = Number.secondsToString(WebInspector.TimelinePanel.shortRecordThreshold, WebInspector.UIString);\r
-this._showShortRecordsTitleText = WebInspector.UIString("Show the records that are shorter than %s", shortRecordThresholdTitle);\r
-this._hideShortRecordsTitleText = WebInspector.UIString("Hide the records that are shorter than %s", shortRecordThresholdTitle);\r
-this._createStatusbarButtons();\r
-\r
-this._boundariesAreValid = true;\r
-this._scrollTop = 0;\r
-\r
-this._popoverHelper = new WebInspector.PopoverHelper(this._containerElement, this._getPopoverAnchor.bind(this), this._showPopover.bind(this), true);\r
-\r
-\r
-this.toggleFilterButton.toggled = true;\r
-this._calculator._showShortEvents = this.toggleFilterButton.toggled;\r
-this._markTimelineRecords = [];\r
-this._expandOffset = 15;\r
-\r
-InspectorBackend.registerDomainDispatcher("Timeline", this);\r
-}\r
-\r
-\r
-WebInspector.TimelinePanel.rowHeight = 18;\r
-WebInspector.TimelinePanel.shortRecordThreshold = 0.015;\r
-\r
-WebInspector.TimelinePanel.prototype = {\r
-_createTopPane: function() {\r
-var topPaneElement = document.createElement("div");\r
-topPaneElement.id = "timeline-overview-panel";\r
-\r
-this._topPaneSidebarElement = document.createElement("div");\r
-this._topPaneSidebarElement.id = "timeline-overview-sidebar";\r
-\r
-var overviewTreeElement = document.createElement("ol");\r
-overviewTreeElement.className = "sidebar-tree";\r
-this._topPaneSidebarElement.appendChild(overviewTreeElement);\r
-topPaneElement.appendChild(this._topPaneSidebarElement);\r
-\r
-var topPaneSidebarTree = new TreeOutline(overviewTreeElement);\r
-var timelinesOverviewItem = new WebInspector.SidebarTreeElement("resources-time-graph-sidebar-item", WebInspector.UIString("Timelines"));\r
-topPaneSidebarTree.appendChild(timelinesOverviewItem);\r
-timelinesOverviewItem.onselect = this._timelinesOverviewItemSelected.bind(this);\r
-timelinesOverviewItem.select(true);\r
-\r
-var memoryOverviewItem = new WebInspector.SidebarTreeElement("resources-size-graph-sidebar-item", WebInspector.UIString("Memory"));\r
-topPaneSidebarTree.appendChild(memoryOverviewItem);\r
-memoryOverviewItem.onselect = this._memoryOverviewItemSelected.bind(this);\r
-\r
-this._overviewPane = new WebInspector.TimelineOverviewPane(this.categories);\r
-this._overviewPane.addEventListener("window changed", this._windowChanged, this);\r
-this._overviewPane.addEventListener("filter changed", this._refresh, this);\r
-topPaneElement.appendChild(this._overviewPane.element);\r
-\r
-var separatorElement = document.createElement("div");\r
-separatorElement.id = "timeline-overview-separator";\r
-topPaneElement.appendChild(separatorElement);\r
-return topPaneElement;\r
-},\r
-\r
-get toolbarItemLabel()\r
-{\r
-return WebInspector.UIString("Timeline");\r
-},\r
-\r
-get statusBarItems()\r
-{\r
-return [this.toggleFilterButton.element, this.toggleTimelineButton.element, this.clearButton.element, this._overviewPane.statusBarFilters];\r
-},\r
-\r
-get categories()\r
-{\r
-if (!this._categories) {\r
-this._categories = {\r
-loading: new WebInspector.TimelineCategory("loading", WebInspector.UIString("Loading"), "rgb(47,102,236)"),\r
-scripting: new WebInspector.TimelineCategory("scripting", WebInspector.UIString("Scripting"), "rgb(157,231,119)"),\r
-rendering: new WebInspector.TimelineCategory("rendering", WebInspector.UIString("Rendering"), "rgb(164,60,255)")\r
-};\r
-}\r
-return this._categories;\r
-},\r
-\r
-get defaultFocusedElement()\r
-{\r
-return this.element;\r
-},\r
-\r
-get _recordStyles()\r
-{\r
-if (!this._recordStylesArray) {\r
-var recordTypes = WebInspector.TimelineAgent.RecordType;\r
-var recordStyles = {};\r
-recordStyles[recordTypes.EventDispatch] = { title: WebInspector.UIString("Event"), category: this.categories.scripting };\r
-recordStyles[recordTypes.Layout] = { title: WebInspector.UIString("Layout"), category: this.categories.rendering };\r
-recordStyles[recordTypes.RecalculateStyles] = { title: WebInspector.UIString("Recalculate Style"), category: this.categories.rendering };\r
-recordStyles[recordTypes.Paint] = { title: WebInspector.UIString("Paint"), category: this.categories.rendering };\r
-recordStyles[recordTypes.ParseHTML] = { title: WebInspector.UIString("Parse"), category: this.categories.loading };\r
-recordStyles[recordTypes.TimerInstall] = { title: WebInspector.UIString("Install Timer"), category: this.categories.scripting };\r
-recordStyles[recordTypes.TimerRemove] = { title: WebInspector.UIString("Remove Timer"), category: this.categories.scripting };\r
-recordStyles[recordTypes.TimerFire] = { title: WebInspector.UIString("Timer Fired"), category: this.categories.scripting };\r
-recordStyles[recordTypes.XHRReadyStateChange] = { title: WebInspector.UIString("XHR Ready State Change"), category: this.categories.scripting };\r
-recordStyles[recordTypes.XHRLoad] = { title: WebInspector.UIString("XHR Load"), category: this.categories.scripting };\r
-recordStyles[recordTypes.EvaluateScript] = { title: WebInspector.UIString("Evaluate Script"), category: this.categories.scripting };\r
-recordStyles[recordTypes.MarkTimeline] = { title: WebInspector.UIString("Mark"), category: this.categories.scripting };\r
-recordStyles[recordTypes.ResourceSendRequest] = { title: WebInspector.UIString("Send Request"), category: this.categories.loading };\r
-recordStyles[recordTypes.ResourceReceiveResponse] = { title: WebInspector.UIString("Receive Response"), category: this.categories.loading };\r
-recordStyles[recordTypes.ResourceFinish] = { title: WebInspector.UIString("Finish Loading"), category: this.categories.loading };\r
-recordStyles[recordTypes.FunctionCall] = { title: WebInspector.UIString("Function Call"), category: this.categories.scripting };\r
-recordStyles[recordTypes.ResourceReceiveData] = { title: WebInspector.UIString("Receive Data"), category: this.categories.loading };\r
-recordStyles[recordTypes.GCEvent] = { title: WebInspector.UIString("GC Event"), category: this.categories.scripting };\r
-recordStyles[recordTypes.MarkDOMContentEventType] = { title: WebInspector.UIString("DOMContent event"), category: this.categories.scripting };\r
-recordStyles[recordTypes.MarkLoadEventType] = { title: WebInspector.UIString("Load event"), category: this.categories.scripting };\r
-recordStyles[recordTypes.ScheduleResourceRequest] = { title: WebInspector.UIString("Schedule Request"), category: this.categories.loading };\r
-this._recordStylesArray = recordStyles;\r
-}\r
-return this._recordStylesArray;\r
-},\r
-\r
-_createStatusbarButtons: function()\r
-{\r
-this.toggleTimelineButton = new WebInspector.StatusBarButton(WebInspector.UIString("Record"), "record-profile-status-bar-item");\r
-this.toggleTimelineButton.addEventListener("click", this._toggleTimelineButtonClicked.bind(this), false);\r
-\r
-this.clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");\r
-this.clearButton.addEventListener("click", this._clearPanel.bind(this), false);\r
-\r
-this.toggleFilterButton = new WebInspector.StatusBarButton(this._hideShortRecordsTitleText, "timeline-filter-status-bar-item");\r
-this.toggleFilterButton.addEventListener("click", this._toggleFilterButtonClicked.bind(this), false);\r
-\r
-this.recordsCounter = document.createElement("span");\r
-this.recordsCounter.className = "timeline-records-counter";\r
-},\r
-\r
-_updateRecordsCounter: function()\r
-{\r
-this.recordsCounter.textContent = WebInspector.UIString("%d of %d captured records are visible", this._rootRecord._visibleRecordsCount, this._rootRecord._allRecordsCount);\r
-},\r
-\r
-_updateEventDividers: function()\r
-{\r
-this._timelineGrid.removeEventDividers();\r
-var clientWidth = this._graphRowsElement.offsetWidth - this._expandOffset;\r
-var dividers = [];\r
-for (var i = 0; i < this._markTimelineRecords.length; ++i) {\r
-var record = this._markTimelineRecords[i];\r
-var positions = this._calculator.computeBarGraphWindowPosition(record, clientWidth);\r
-var dividerPosition = Math.round(positions.left);\r
-if (dividerPosition < 0 || dividerPosition >= clientWidth || dividers[dividerPosition])\r
-continue;\r
-var divider = this._createEventDivider(record);\r
-divider.style.left = (dividerPosition + this._expandOffset) + "px";\r
-dividers[dividerPosition] = divider;\r
-}\r
-this._timelineGrid.addEventDividers(dividers);\r
-this._overviewPane.updateEventDividers(this._markTimelineRecords, this._createEventDivider.bind(this));\r
-},\r
-\r
-_createEventDivider: function(record)\r
-{\r
-var eventDivider = document.createElement("div");\r
-eventDivider.className = "resources-event-divider";\r
-var recordTypes = WebInspector.TimelineAgent.RecordType;\r
-\r
-var eventDividerPadding = document.createElement("div");\r
-eventDividerPadding.className = "resources-event-divider-padding";\r
-eventDividerPadding.title = record.title;\r
-\r
-if (record.type === recordTypes.MarkDOMContentEventType)\r
-eventDivider.className += " resources-blue-divider";\r
-else if (record.type === recordTypes.MarkLoadEventType)\r
-eventDivider.className += " resources-red-divider";\r
-else if (record.type === recordTypes.MarkTimeline) {\r
-eventDivider.className += " resources-orange-divider";\r
-eventDividerPadding.title = record.data.message;\r
-}\r
-eventDividerPadding.appendChild(eventDivider);\r
-return eventDividerPadding;\r
-},\r
-\r
-_timelinesOverviewItemSelected: function(event) {\r
-this._overviewPane.showTimelines();\r
-},\r
-\r
-_memoryOverviewItemSelected: function(event) {\r
-this._overviewPane.showMemoryGraph(this._rootRecord.children);\r
-},\r
-\r
-_toggleTimelineButtonClicked: function()\r
-{\r
-if (this.toggleTimelineButton.toggled)\r
-InspectorBackend.stopTimelineProfiler();\r
-else {\r
-this._clearPanel();\r
-InspectorBackend.startTimelineProfiler();\r
-}\r
-},\r
-\r
-_toggleFilterButtonClicked: function()\r
-{\r
-this.toggleFilterButton.toggled = !this.toggleFilterButton.toggled;\r
-this._calculator._showShortEvents = this.toggleFilterButton.toggled;\r
-this.toggleFilterButton.element.title = this._calculator._showShortEvents ? this._hideShortRecordsTitleText : this._showShortRecordsTitleText;\r
-this._scheduleRefresh(true);\r
-},\r
-\r
-timelineProfilerWasStarted: function()\r
-{\r
-this.toggleTimelineButton.toggled = true;\r
-},\r
-\r
-timelineProfilerWasStopped: function()\r
-{\r
-this.toggleTimelineButton.toggled = false;\r
-},\r
-\r
-addRecordToTimeline: function(record)\r
-{\r
-if (record.type == WebInspector.TimelineAgent.RecordType.ResourceSendRequest && record.data.isMainResource) {\r
-if (this._mainResourceIdentifier != record.data.identifier) {\r
-\r
-\r
-\r
-this._mainResourceIdentifier = record.data.identifier;\r
-this._clearPanel();\r
-}\r
-}\r
-this._innerAddRecordToTimeline(record, this._rootRecord);\r
-this._scheduleRefresh();\r
-},\r
-\r
-_findParentRecord: function(record)\r
-{\r
-var recordTypes = WebInspector.TimelineAgent.RecordType;\r
-var parentRecord;\r
-if (record.type === recordTypes.ResourceReceiveResponse ||\r
-record.type === recordTypes.ResourceFinish ||\r
-record.type === recordTypes.ResourceReceiveData)\r
-parentRecord = this._sendRequestRecords[record.data.identifier];\r
-else if (record.type === recordTypes.TimerFire)\r
-parentRecord = this._timerRecords[record.data.timerId];\r
-else if (record.type === recordTypes.ResourceSendRequest)\r
-parentRecord = this._scheduledResourceRequests[record.data.url];\r
-return parentRecord;\r
-},\r
-\r
-_innerAddRecordToTimeline: function(record, parentRecord)\r
-{\r
-var connectedToOldRecord = false;\r
-var recordTypes = WebInspector.TimelineAgent.RecordType;\r
-if (record.type === recordTypes.MarkDOMContentEventType || record.type === recordTypes.MarkLoadEventType)\r
-parentRecord = null; \r
-else if (parentRecord === this._rootRecord) {\r
-var newParentRecord = this._findParentRecord(record);\r
-if (newParentRecord) {\r
-parentRecord = newParentRecord;\r
-connectedToOldRecord = true;\r
-}\r
-}\r
-\r
-if (record.type == recordTypes.TimerFire && record.children && record.children.length) {\r
-var childRecord = record.children[0];\r
-if (childRecord.type === recordTypes.FunctionCall) {\r
-record.data.scriptName = childRecord.data.scriptName;\r
-record.data.scriptLine = childRecord.data.scriptLine;\r
-record.children.shift();\r
-record.children = childRecord.children.concat(record.children);\r
-}\r
-}\r
-\r
-var formattedRecord = new WebInspector.TimelinePanel.FormattedRecord(record, parentRecord, this);\r
-\r
-if (record.type === recordTypes.MarkDOMContentEventType || record.type === recordTypes.MarkLoadEventType) {\r
-this._markTimelineRecords.push(formattedRecord);\r
-return;\r
-}\r
-\r
-++this._rootRecord._allRecordsCount;\r
-formattedRecord.collapsed = (parentRecord === this._rootRecord);\r
-\r
-var childrenCount = record.children ? record.children.length : 0;\r
-for (var i = 0; i < childrenCount; ++i)\r
-this._innerAddRecordToTimeline(record.children[i], formattedRecord);\r
-\r
-formattedRecord._calculateAggregatedStats(this.categories);\r
-\r
-if (connectedToOldRecord) {\r
-var record = formattedRecord;\r
-do {\r
-var parent = record.parent;\r
-parent._cpuTime += formattedRecord._cpuTime;\r
-if (parent._lastChildEndTime < record._lastChildEndTime)\r
-parent._lastChildEndTime = record._lastChildEndTime;\r
-for (var category in formattedRecord._aggregatedStats)\r
-parent._aggregatedStats[category] += formattedRecord._aggregatedStats[category];\r
-record = parent;\r
-} while (record.parent);\r
-} else\r
-if (parentRecord !== this._rootRecord)\r
-parentRecord._selfTime -= formattedRecord.endTime - formattedRecord.startTime;\r
-\r
-\r
-if (record.type === recordTypes.MarkTimeline)\r
-this._markTimelineRecords.push(formattedRecord);\r
-},\r
-\r
-setSidebarWidth: function(width)\r
-{\r
-WebInspector.Panel.prototype.setSidebarWidth.call(this, width);\r
-this._sidebarBackgroundElement.style.width = width + "px";\r
-this._topPaneSidebarElement.style.width = width + "px";\r
-},\r
-\r
-updateMainViewWidth: function(width)\r
-{\r
-this._containerContentElement.style.left = width + "px";\r
-this._scheduleRefresh();\r
-this._overviewPane.updateMainViewWidth(width);\r
-},\r
-\r
-resize: function()\r
-{\r
-this._closeRecordDetails();\r
-this._scheduleRefresh();\r
-},\r
-\r
-_createRootRecord: function()\r
-{\r
-var rootRecord = {};\r
-rootRecord.children = [];\r
-rootRecord._visibleRecordsCount = 0;\r
-rootRecord._allRecordsCount = 0;\r
-rootRecord._aggregatedStats = {};\r
-return rootRecord;\r
-},\r
-\r
-_clearPanel: function()\r
-{\r
-this._markTimelineRecords = [];\r
-this._sendRequestRecords = {};\r
-this._scheduledResourceRequests = {};\r
-this._timerRecords = {};\r
-this._rootRecord = this._createRootRecord();\r
-this._boundariesAreValid = false;\r
-this._overviewPane.reset();\r
-this._adjustScrollPosition(0);\r
-this._refresh();\r
-this._closeRecordDetails();\r
-},\r
-\r
-show: function()\r
-{\r
-WebInspector.Panel.prototype.show.call(this);\r
-if (typeof this._scrollTop === "number")\r
-this._containerElement.scrollTop = this._scrollTop;\r
-this._refresh();\r
-WebInspector.drawer.currentPanelCounters = this.recordsCounter;\r
-},\r
-\r
-hide: function()\r
-{\r
-WebInspector.Panel.prototype.hide.call(this);\r
-this._closeRecordDetails();\r
-WebInspector.drawer.currentPanelCounters = null;\r
-},\r
-\r
-_onScroll: function(event)\r
-{\r
-this._closeRecordDetails();\r
-var scrollTop = this._containerElement.scrollTop;\r
-var dividersTop = Math.max(0, scrollTop);\r
-this._timelineGrid.setScrollAndDividerTop(scrollTop, dividersTop);\r
-this._scheduleRefresh(true);\r
-},\r
-\r
-_windowChanged: function()\r
-{\r
-this._closeRecordDetails();\r
-this._scheduleRefresh();\r
-},\r
-\r
-_scheduleRefresh: function(preserveBoundaries)\r
-{\r
-this._closeRecordDetails();\r
-this._boundariesAreValid &= preserveBoundaries;\r
-\r
-if (!this.visible)\r
-return;\r
-\r
-if (preserveBoundaries)\r
-this._refresh();\r
-else\r
-if (!this._refreshTimeout)\r
-this._refreshTimeout = setTimeout(this._refresh.bind(this), 100);\r
-},\r
-\r
-_refresh: function()\r
-{\r
-if (this._refreshTimeout) {\r
-clearTimeout(this._refreshTimeout);\r
-delete this._refreshTimeout;\r
-}\r
-\r
-this._overviewPane.update(this._rootRecord.children, this._calculator._showShortEvents);\r
-this._refreshRecords(!this._boundariesAreValid);\r
-this._updateRecordsCounter();\r
-if(!this._boundariesAreValid)\r
-this._updateEventDividers();\r
-this._boundariesAreValid = true;\r
-},\r
-\r
-_updateBoundaries: function()\r
-{\r
-this._calculator.reset();\r
-this._calculator.windowLeft = this._overviewPane.windowLeft;\r
-this._calculator.windowRight = this._overviewPane.windowRight;\r
-\r
-for (var i = 0; i < this._rootRecord.children.length; ++i)\r
-this._calculator.updateBoundaries(this._rootRecord.children[i]);\r
-\r
-this._calculator.calculateWindow();\r
-},\r
-\r
-_addToRecordsWindow: function(record, recordsWindow, parentIsCollapsed)\r
-{\r
-if (!this._calculator._showShortEvents && !record.isLong())\r
-return;\r
-var percentages = this._calculator.computeBarGraphPercentages(record);\r
-if (percentages.start < 100 && percentages.endWithChildren >= 0 && !record.category.hidden) {\r
-++this._rootRecord._visibleRecordsCount;\r
-++record.parent._invisibleChildrenCount;\r
-if (!parentIsCollapsed)\r
-recordsWindow.push(record);\r
-}\r
-\r
-var index = recordsWindow.length;\r
-record._invisibleChildrenCount = 0;\r
-for (var i = 0; i < record.children.length; ++i)\r
-this._addToRecordsWindow(record.children[i], recordsWindow, parentIsCollapsed || record.collapsed);\r
-record._visibleChildrenCount = recordsWindow.length - index;\r
-},\r
-\r
-_filterRecords: function()\r
-{\r
-var recordsInWindow = [];\r
-this._rootRecord._visibleRecordsCount = 0;\r
-for (var i = 0; i < this._rootRecord.children.length; ++i)\r
-this._addToRecordsWindow(this._rootRecord.children[i], recordsInWindow);\r
-return recordsInWindow;\r
-},\r
-\r
-_refreshRecords: function(updateBoundaries)\r
-{\r
-if (updateBoundaries)\r
-this._updateBoundaries();\r
-\r
-var recordsInWindow = this._filterRecords();\r
-\r
-\r
-this._scrollTop = this._containerElement.scrollTop;\r
-var visibleTop = this._scrollTop;\r
-var visibleBottom = visibleTop + this._containerElement.clientHeight;\r
-\r
-const rowHeight = WebInspector.TimelinePanel.rowHeight;\r
-\r
-\r
-var startIndex = Math.max(0, Math.min(Math.floor(visibleTop / rowHeight) - 1, recordsInWindow.length - 1));\r
-var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight));\r
-\r
-\r
-const top = (startIndex * rowHeight) + "px";\r
-this._topGapElement.style.height = top;\r
-this.sidebarElement.style.top = top;\r
-this.sidebarResizeElement.style.top = top;\r
-this._bottomGapElement.style.height = (recordsInWindow.length - endIndex) * rowHeight + "px";\r
-\r
-\r
-var listRowElement = this._sidebarListElement.firstChild;\r
-var width = this._graphRowsElement.offsetWidth;\r
-this._itemsGraphsElement.removeChild(this._graphRowsElement);\r
-var graphRowElement = this._graphRowsElement.firstChild;\r
-var scheduleRefreshCallback = this._scheduleRefresh.bind(this, true);\r
-this._itemsGraphsElement.removeChild(this._expandElements);\r
-this._expandElements.removeChildren();\r
-\r
-for (var i = 0; i < endIndex; ++i) {\r
-var record = recordsInWindow[i];\r
-var isEven = !(i % 2);\r
-\r
-if (i < startIndex) {\r
-var lastChildIndex = i + record._visibleChildrenCount;\r
-if (lastChildIndex >= startIndex && lastChildIndex < endIndex) {\r
-var expandElement = new WebInspector.TimelineExpandableElement(this._expandElements);\r
-expandElement._update(record, i, this._calculator.computeBarGraphWindowPosition(record, width - this._expandOffset));\r
-}\r
-} else {\r
-if (!listRowElement) {\r
-listRowElement = new WebInspector.TimelineRecordListRow().element;\r
-this._sidebarListElement.appendChild(listRowElement);\r
-}\r
-if (!graphRowElement) {\r
-graphRowElement = new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement, scheduleRefreshCallback, rowHeight).element;\r
-this._graphRowsElement.appendChild(graphRowElement);\r
-}\r
-\r
-listRowElement.row.update(record, isEven, this._calculator, visibleTop);\r
-graphRowElement.row.update(record, isEven, this._calculator, width, this._expandOffset, i);\r
-\r
-listRowElement = listRowElement.nextSibling;\r
-graphRowElement = graphRowElement.nextSibling;\r
-}\r
-}\r
-\r
-\r
-while (listRowElement) {\r
-var nextElement = listRowElement.nextSibling;\r
-listRowElement.row.dispose();\r
-listRowElement = nextElement;\r
-}\r
-while (graphRowElement) {\r
-var nextElement = graphRowElement.nextSibling;\r
-graphRowElement.row.dispose();\r
-graphRowElement = nextElement;\r
-}\r
-\r
-this._itemsGraphsElement.insertBefore(this._graphRowsElement, this._bottomGapElement);\r
-this._itemsGraphsElement.appendChild(this._expandElements);\r
-this.sidebarResizeElement.style.height = this.sidebarElement.clientHeight + "px";\r
-\r
-var timelinePaddingLeft = this._calculator.windowLeft === 0 ? this._expandOffset : 0;\r
-if (updateBoundaries)\r
-this._timelineGrid.updateDividers(true, this._calculator, timelinePaddingLeft);\r
-this._adjustScrollPosition((recordsInWindow.length + 1) * rowHeight);\r
-},\r
-\r
-_adjustScrollPosition: function(totalHeight)\r
-{\r
-\r
-if ((this._containerElement.scrollTop + this._containerElement.offsetHeight) > totalHeight + 1)\r
-this._containerElement.scrollTop = (totalHeight - this._containerElement.offsetHeight);\r
-},\r
-\r
-_getPopoverAnchor: function(element)\r
-{\r
-return element.enclosingNodeOrSelfWithClass("timeline-graph-bar") || element.enclosingNodeOrSelfWithClass("timeline-tree-item");\r
-},\r
-\r
-_showPopover: function(anchor)\r
-{\r
-var record = anchor.row._record;\r
-var popover = new WebInspector.Popover(record._generatePopupContent(this._calculator, this.categories));\r
-popover.show(anchor);\r
-return popover;\r
-},\r
-\r
-_closeRecordDetails: function()\r
-{\r
-this._popoverHelper.hidePopup();\r
-}\r
-}\r
-\r
-WebInspector.TimelinePanel.prototype.__proto__ = WebInspector.Panel.prototype;\r
-\r
-WebInspector.TimelineCategory = function(name, title, color)\r
-{\r
-this.name = name;\r
-this.title = title;\r
-this.color = color;\r
-}\r
-\r
-WebInspector.TimelineCalculator = function()\r
-{\r
-this.reset();\r
-this.windowLeft = 0.0;\r
-this.windowRight = 1.0;\r
-}\r
-\r
-WebInspector.TimelineCalculator.prototype = {\r
-computeBarGraphPercentages: function(record)\r
-{\r
-var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;\r
-var end = (record.startTime + record._selfTime - this.minimumBoundary) / this.boundarySpan * 100;\r
-var endWithChildren = (record._lastChildEndTime - this.minimumBoundary) / this.boundarySpan * 100;\r
-var cpuWidth = record._cpuTime / this.boundarySpan * 100;\r
-return {start: start, end: end, endWithChildren: endWithChildren, cpuWidth: cpuWidth};\r
-},\r
-\r
-computeBarGraphWindowPosition: function(record, clientWidth)\r
-{\r
-const minWidth = 5;\r
-const borderWidth = 4;\r
-var workingArea = clientWidth - minWidth - borderWidth;\r
-var percentages = this.computeBarGraphPercentages(record);\r
-var left = percentages.start / 100 * workingArea;\r
-var width = (percentages.end - percentages.start) / 100 * workingArea + minWidth;\r
-var widthWithChildren =  (percentages.endWithChildren - percentages.start) / 100 * workingArea;\r
-var cpuWidth = percentages.cpuWidth / 100 * workingArea + minWidth;\r
-if (percentages.endWithChildren > percentages.end)\r
-widthWithChildren += borderWidth + minWidth;\r
-return {left: left, width: width, widthWithChildren: widthWithChildren, cpuWidth: cpuWidth};\r
-},\r
-\r
-calculateWindow: function()\r
-{\r
-this.minimumBoundary = this._absoluteMinimumBoundary + this.windowLeft * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);\r
-this.maximumBoundary = this._absoluteMinimumBoundary + this.windowRight * (this._absoluteMaximumBoundary - this._absoluteMinimumBoundary);\r
-this.boundarySpan = this.maximumBoundary - this.minimumBoundary;\r
-},\r
-\r
-reset: function()\r
-{\r
-this._absoluteMinimumBoundary = -1;\r
-this._absoluteMaximumBoundary = -1;\r
-},\r
-\r
-updateBoundaries: function(record)\r
-{\r
-var lowerBound = record.startTime;\r
-if (this._absoluteMinimumBoundary === -1 || lowerBound < this._absoluteMinimumBoundary)\r
-this._absoluteMinimumBoundary = lowerBound;\r
-\r
-const minimumTimeFrame = 0.1;\r
-const minimumDeltaForZeroSizeEvents = 0.01;\r
-var upperBound = Math.max(record._lastChildEndTime + minimumDeltaForZeroSizeEvents, lowerBound + minimumTimeFrame);\r
-if (this._absoluteMaximumBoundary === -1 || upperBound > this._absoluteMaximumBoundary)\r
-this._absoluteMaximumBoundary = upperBound;\r
-},\r
-\r
-formatValue: function(value)\r
-{\r
-return Number.secondsToString(value + this.minimumBoundary - this._absoluteMinimumBoundary, WebInspector.UIString);\r
-}\r
-}\r
-\r
-\r
-WebInspector.TimelineRecordListRow = function()\r
-{\r
-this.element = document.createElement("div");\r
-this.element.row = this;\r
-this.element.style.cursor = "pointer";\r
-var iconElement = document.createElement("span");\r
-iconElement.className = "timeline-tree-icon";\r
-this.element.appendChild(iconElement);\r
-\r
-this._typeElement = document.createElement("span");\r
-this._typeElement.className = "type";\r
-this.element.appendChild(this._typeElement);\r
-\r
-var separatorElement = document.createElement("span");\r
-separatorElement.className = "separator";\r
-separatorElement.textContent = " ";\r
-\r
-this._dataElement = document.createElement("span");\r
-this._dataElement.className = "data dimmed";\r
-\r
-this.element.appendChild(separatorElement);\r
-this.element.appendChild(this._dataElement);\r
-}\r
-\r
-WebInspector.TimelineRecordListRow.prototype = {\r
-update: function(record, isEven, calculator, offset)\r
-{\r
-this._record = record;\r
-this._calculator = calculator;\r
-this._offset = offset;\r
-\r
-this.element.className = "timeline-tree-item timeline-category-" + record.category.name + (isEven ? " even" : "");\r
-this._typeElement.textContent = record.title;\r
-\r
-if (this._dataElement.firstChild)\r
-this._dataElement.removeChildren();\r
-if (record.details) {\r
-var detailsContainer = document.createElement("span");\r
-if (typeof record.details === "object") {\r
-detailsContainer.appendChild(document.createTextNode("("));\r
-detailsContainer.appendChild(record.details);\r
-detailsContainer.appendChild(document.createTextNode(")"));\r
-} else\r
-detailsContainer.textContent = "(" + record.details + ")";\r
-this._dataElement.appendChild(detailsContainer);\r
-}\r
-},\r
-\r
-dispose: function()\r
-{\r
-this.element.parentElement.removeChild(this.element);\r
-}\r
-}\r
-\r
-WebInspector.TimelineRecordGraphRow = function(graphContainer, scheduleRefresh)\r
-{\r
-this.element = document.createElement("div");\r
-this.element.row = this;\r
-\r
-this._barAreaElement = document.createElement("div");\r
-this._barAreaElement.className = "timeline-graph-bar-area";\r
-this.element.appendChild(this._barAreaElement);\r
-\r
-this._barWithChildrenElement = document.createElement("div");\r
-this._barWithChildrenElement.className = "timeline-graph-bar with-children";\r
-this._barWithChildrenElement.row = this;\r
-this._barAreaElement.appendChild(this._barWithChildrenElement);\r
-\r
-this._barCpuElement = document.createElement("div");\r
-this._barCpuElement.className = "timeline-graph-bar cpu"\r
-this._barCpuElement.row = this;\r
-this._barAreaElement.appendChild(this._barCpuElement);\r
-\r
-this._barElement = document.createElement("div");\r
-this._barElement.className = "timeline-graph-bar";\r
-this._barElement.row = this;\r
-this._barAreaElement.appendChild(this._barElement);\r
-\r
-this._expandElement = new WebInspector.TimelineExpandableElement(graphContainer);\r
-this._expandElement._element.addEventListener("click", this._onClick.bind(this));\r
-\r
-this._scheduleRefresh = scheduleRefresh;\r
-}\r
-\r
-WebInspector.TimelineRecordGraphRow.prototype = {\r
-update: function(record, isEven, calculator, clientWidth, expandOffset, index)\r
-{\r
-this._record = record;\r
-this.element.className = "timeline-graph-side timeline-category-" + record.category.name + (isEven ? " even" : "");\r
-var barPosition = calculator.computeBarGraphWindowPosition(record, clientWidth - expandOffset);\r
-this._barWithChildrenElement.style.left = barPosition.left + expandOffset + "px";\r
-this._barWithChildrenElement.style.width = barPosition.widthWithChildren + "px";\r
-this._barElement.style.left = barPosition.left + expandOffset + "px";\r
-this._barElement.style.width =  barPosition.width + "px";\r
-this._barCpuElement.style.left = barPosition.left + expandOffset + "px";\r
-this._barCpuElement.style.width = barPosition.cpuWidth + "px";\r
-this._expandElement._update(record, index, barPosition);\r
-},\r
-\r
-_onClick: function(event)\r
-{\r
-this._record.collapsed = !this._record.collapsed;\r
-this._scheduleRefresh();\r
-},\r
-\r
-dispose: function()\r
-{\r
-this.element.parentElement.removeChild(this.element);\r
-this._expandElement._dispose();\r
-}\r
-}\r
-\r
-WebInspector.TimelinePanel.FormattedRecord = function(record, parentRecord, panel)\r
-{\r
-var recordTypes = WebInspector.TimelineAgent.RecordType;\r
-var style = panel._recordStyles[record.type];\r
-\r
-this.parent = parentRecord;\r
-if (parentRecord)\r
-parentRecord.children.push(this);\r
-this.category = style.category;\r
-this.title = style.title;\r
-this.startTime = record.startTime / 1000;\r
-this.data = record.data;\r
-this.type = record.type;\r
-this.endTime = (typeof record.endTime !== "undefined") ? record.endTime / 1000 : this.startTime;\r
-this._selfTime = this.endTime - this.startTime;\r
-this._lastChildEndTime = this.endTime;\r
-this.originalRecordForTests = record;\r
-if (record.stackTrace && record.stackTrace.length)\r
-this.stackTrace = record.stackTrace;\r
-this.totalHeapSize = record.totalHeapSize;\r
-this.usedHeapSize = record.usedHeapSize;\r
-\r
-\r
-if (record.type === recordTypes.ResourceSendRequest) {\r
-panel._sendRequestRecords[record.data.identifier] = this;\r
-} else if (record.type === recordTypes.ScheduleResourceRequest) {\r
-panel._scheduledResourceRequests[record.data.url] = this;\r
-} else if (record.type === recordTypes.ResourceReceiveResponse) {\r
-var sendRequestRecord = panel._sendRequestRecords[record.data.identifier];\r
-if (sendRequestRecord) { \r
-record.data.url = sendRequestRecord.data.url;\r
-\r
-sendRequestRecord.details = this._getRecordDetails(sendRequestRecord, panel._sendRequestRecords);\r
-if (sendRequestRecord.parent !== panel._rootRecord && sendRequestRecord.parent.type === recordTypes.ScheduleResourceRequest)\r
-sendRequestRecord.parent.details = this._getRecordDetails(sendRequestRecord, panel._sendRequestRecords);\r
-}\r
-} else if (record.type === recordTypes.ResourceReceiveData) {\r
-var sendRequestRecord = panel._sendRequestRecords[record.data.identifier];\r
-if (sendRequestRecord) \r
-record.data.url = sendRequestRecord.data.url;\r
-} else if (record.type === recordTypes.ResourceFinish) {\r
-var sendRequestRecord = panel._sendRequestRecords[record.data.identifier];\r
-if (sendRequestRecord) \r
-record.data.url = sendRequestRecord.data.url;\r
-} else if (record.type === recordTypes.TimerInstall) {\r
-this.timeout = record.data.timeout;\r
-this.singleShot = record.data.singleShot;\r
-panel._timerRecords[record.data.timerId] = this;\r
-} else if (record.type === recordTypes.TimerFire) {\r
-var timerInstalledRecord = panel._timerRecords[record.data.timerId];\r
-if (timerInstalledRecord) {\r
-this.callSiteStackTrace = timerInstalledRecord.stackTrace;\r
-this.timeout = timerInstalledRecord.timeout;\r
-this.singleShot = timerInstalledRecord.singleShot;\r
-}\r
-}\r
-this.details = this._getRecordDetails(record, panel._sendRequestRecords);\r
-}\r
-\r
-WebInspector.TimelinePanel.FormattedRecord.prototype = {\r
-isLong: function()\r
-{\r
-return (this._lastChildEndTime - this.startTime) > WebInspector.TimelinePanel.shortRecordThreshold;\r
-},\r
-\r
-get children()\r
-{\r
-if (!this._children)\r
-this._children = [];\r
-return this._children;\r
-},\r
-\r
-_generateAggregatedInfo: function()\r
-{\r
-var cell = document.createElement("span");\r
-cell.className = "timeline-aggregated-info";\r
-for (var index in this._aggregatedStats) {\r
-var label = document.createElement("div");\r
-label.className = "timeline-aggregated-category timeline-" + index;\r
-cell.appendChild(label);\r
-var text = document.createElement("span");\r
-text.textContent = Number.secondsToString(this._aggregatedStats[index] + 0.0001, WebInspector.UIString);\r
-cell.appendChild(text);\r
-}\r
-return cell;\r
-},\r
-\r
-_generatePopupContent: function(calculator, categories)\r
-{\r
-var contentHelper = new WebInspector.TimelinePanel.PopupContentHelper(this.title);\r
-\r
-if (this._children && this._children.length) {\r
-contentHelper._appendTextRow(WebInspector.UIString("Self Time"), Number.secondsToString(this._selfTime + 0.0001, WebInspector.UIString));\r
-contentHelper._appendElementRow(WebInspector.UIString("Aggregated Time"), this._generateAggregatedInfo());\r
-}\r
-var text = WebInspector.UIString("%s (at %s)", Number.secondsToString(this._lastChildEndTime - this.startTime, WebInspector.UIString),\r
-calculator.formatValue(this.startTime - calculator.minimumBoundary));\r
-contentHelper._appendTextRow(WebInspector.UIString("Duration"), text);\r
-\r
-const recordTypes = WebInspector.TimelineAgent.RecordType;\r
-\r
-switch (this.type) {\r
-case recordTypes.GCEvent:\r
-contentHelper._appendTextRow(WebInspector.UIString("Collected"), Number.bytesToString(this.data.usedHeapSizeDelta, WebInspector.UIString));\r
-break;\r
-case recordTypes.TimerInstall:\r
-case recordTypes.TimerFire:\r
-case recordTypes.TimerRemove:\r
-contentHelper._appendTextRow(WebInspector.UIString("Timer ID"), this.data.timerId);\r
-if (typeof this.timeout === "number") {\r
-contentHelper._appendTextRow(WebInspector.UIString("Timeout"), Number.secondsToString(this.timeout / 1000, WebInspector.UIString));\r
-contentHelper._appendTextRow(WebInspector.UIString("Repeats"), !this.singleShot);\r
-}\r
-break;\r
-case recordTypes.FunctionCall:\r
-contentHelper._appendLinkRow(WebInspector.UIString("Location"), this.data.scriptName, this.data.scriptLine);\r
-break;\r
-case recordTypes.ScheduleResourceRequest:\r
-case recordTypes.ResourceSendRequest:\r
-case recordTypes.ResourceReceiveResponse:\r
-case recordTypes.ResourceReceiveData:\r
-case recordTypes.ResourceFinish:\r
-contentHelper._appendLinkRow(WebInspector.UIString("Resource"), this.data.url);\r
-if (this.data.requestMethod)\r
-contentHelper._appendTextRow(WebInspector.UIString("Request Method"), this.data.requestMethod);\r
-if (typeof this.data.statusCode === "number")\r
-contentHelper._appendTextRow(WebInspector.UIString("Status Code"), this.data.statusCode);\r
-if (this.data.mimeType)\r
-contentHelper._appendTextRow(WebInspector.UIString("MIME Type"), this.data.mimeType);\r
-if (typeof this.data.expectedContentLength === "number" && this.data.expectedContentLength !== -1)\r
-contentHelper._appendTextRow(WebInspector.UIString("Expected Content Length"), this.data.expectedContentLength);\r
-break;\r
-case recordTypes.EvaluateScript:\r
-if (this.data && this.data.url)\r
-contentHelper._appendLinkRow(WebInspector.UIString("Script"), this.data.url, this.data.lineNumber);\r
-break;\r
-case recordTypes.Paint:\r
-contentHelper._appendTextRow(WebInspector.UIString("Location"), WebInspector.UIString("(%d, %d)", this.data.x, this.data.y));\r
-contentHelper._appendTextRow(WebInspector.UIString("Dimensions"), WebInspector.UIString("%d × %d", this.data.width, this.data.height));\r
-case recordTypes.RecalculateStyles: \r
-break;\r
-default:\r
-if (this.details)\r
-contentHelper._appendTextRow(WebInspector.UIString("Details"), this.details);\r
-break;\r
-}\r
-\r
-if (this.data.scriptName && this.type !== recordTypes.FunctionCall)\r
-contentHelper._appendLinkRow(WebInspector.UIString("Function Call"), this.data.scriptName, this.data.scriptLine);\r
-\r
-if (this.usedHeapSize)\r
-contentHelper._appendTextRow(WebInspector.UIString("Used Heap Size"), WebInspector.UIString("%s of %s", Number.bytesToString(this.usedHeapSize, WebInspector.UIString), Number.bytesToString(this.totalHeapSize, WebInspector.UIString)));\r
-\r
-if (this.callSiteStackTrace && this.callSiteStackTrace.length)\r
-contentHelper._appendStackTrace(WebInspector.UIString("Call Site stack"), this.callSiteStackTrace);\r
-\r
-if (this.stackTrace)\r
-contentHelper._appendStackTrace(WebInspector.UIString("Call Stack"), this.stackTrace);\r
-\r
-return contentHelper._contentTable;\r
-},\r
-\r
-_getRecordDetails: function(record, sendRequestRecords)\r
-{\r
-switch (record.type) {\r
-case WebInspector.TimelineAgent.RecordType.GCEvent:\r
-return WebInspector.UIString("%s collected", Number.bytesToString(record.data.usedHeapSizeDelta, WebInspector.UIString));\r
-case WebInspector.TimelineAgent.RecordType.TimerFire:\r
-return record.data.scriptName ? WebInspector.linkifyResourceAsNode(record.data.scriptName, "scripts", record.data.scriptLine, "", "") : record.data.timerId;\r
-case WebInspector.TimelineAgent.RecordType.FunctionCall:\r
-return record.data.scriptName ? WebInspector.linkifyResourceAsNode(record.data.scriptName, "scripts", record.data.scriptLine, "", "") : null;\r
-case WebInspector.TimelineAgent.RecordType.EventDispatch:\r
-return record.data ? record.data.type : null;\r
-case WebInspector.TimelineAgent.RecordType.Paint:\r
-return record.data.width + "\u2009\u00d7\u2009" + record.data.height;\r
-case WebInspector.TimelineAgent.RecordType.TimerInstall:\r
-case WebInspector.TimelineAgent.RecordType.TimerRemove:\r
-return this.stackTrace ? WebInspector.linkifyResourceAsNode(this.stackTrace[0].scriptName, "scripts", this.stackTrace[0].lineNumber, "", "") : record.data.timerId;\r
-case WebInspector.TimelineAgent.RecordType.ParseHTML:\r
-case WebInspector.TimelineAgent.RecordType.RecalculateStyles:\r
-return this.stackTrace ? WebInspector.linkifyResourceAsNode(this.stackTrace[0].scriptName, "scripts", this.stackTrace[0].lineNumber, "", "") : null;\r
-case WebInspector.TimelineAgent.RecordType.EvaluateScript:\r
-return record.data.url ? WebInspector.linkifyResourceAsNode(record.data.url, "scripts", record.data.lineNumber, "", "") : null;\r
-case WebInspector.TimelineAgent.RecordType.XHRReadyStateChange:\r
-case WebInspector.TimelineAgent.RecordType.XHRLoad:\r
-case WebInspector.TimelineAgent.RecordType.ScheduleResourceRequest:\r
-case WebInspector.TimelineAgent.RecordType.ResourceSendRequest:\r
-case WebInspector.TimelineAgent.RecordType.ResourceReceiveData:\r
-case WebInspector.TimelineAgent.RecordType.ResourceReceiveResponse:\r
-case WebInspector.TimelineAgent.RecordType.ResourceFinish:\r
-return WebInspector.displayNameForURL(record.data.url);\r
-case WebInspector.TimelineAgent.RecordType.MarkTimeline:\r
-return record.data.message;\r
-default:\r
-return null;\r
-}\r
-},\r
-\r
-_calculateAggregatedStats: function(categories)\r
-{\r
-this._aggregatedStats = {};\r
-for (var category in categories)\r
-this._aggregatedStats[category] = 0;\r
-this._cpuTime = this._selfTime;\r
-\r
-if (this._children) {\r
-for (var index = this._children.length; index; --index) {\r
-var child = this._children[index - 1];\r
-this._aggregatedStats[child.category.name] += child._selfTime;\r
-for (var category in categories)\r
-this._aggregatedStats[category] += child._aggregatedStats[category];\r
-}\r
-for (var category in this._aggregatedStats)\r
-this._cpuTime += this._aggregatedStats[category];\r
-}\r
-}\r
-}\r
-\r
-WebInspector.TimelinePanel.PopupContentHelper = function(title)\r
-{\r
-this._contentTable = document.createElement("table");;\r
-var titleCell = this._createCell(WebInspector.UIString("%s - Details", title), "timeline-details-title");\r
-titleCell.colSpan = 2;\r
-var titleRow = document.createElement("tr");\r
-titleRow.appendChild(titleCell);\r
-this._contentTable.appendChild(titleRow);\r
-}\r
-\r
-WebInspector.TimelinePanel.PopupContentHelper.prototype = {\r
-_createCell: function(content, styleName)\r
-{\r
-var text = document.createElement("label");\r
-text.appendChild(document.createTextNode(content));\r
-var cell = document.createElement("td");\r
-cell.className = "timeline-details";\r
-if (styleName)\r
-cell.className += " " + styleName;\r
-cell.textContent = content;\r
-return cell;\r
-},\r
-\r
-_appendTextRow: function(title, content)\r
-{\r
-var row = document.createElement("tr");\r
-row.appendChild(this._createCell(title, "timeline-details-row-title"));\r
-row.appendChild(this._createCell(content, "timeline-details-row-data"));\r
-this._contentTable.appendChild(row);\r
-},\r
-\r
-_appendElementRow: function(title, content, titleStyle)\r
-{\r
-var row = document.createElement("tr");\r
-var titleCell = this._createCell(title, "timeline-details-row-title");\r
-if (titleStyle)\r
-titleCell.addStyleClass(titleStyle);\r
-row.appendChild(titleCell);\r
-var cell = document.createElement("td");\r
-cell.className = "timeline-details";\r
-cell.appendChild(content);\r
-row.appendChild(cell);\r
-this._contentTable.appendChild(row);\r
-},\r
-\r
-_appendLinkRow: function(title, scriptName, scriptLine)\r
-{\r
-var link = WebInspector.linkifyResourceAsNode(scriptName, "scripts", scriptLine, "timeline-details");\r
-this._appendElementRow(title, link);\r
-},\r
-\r
-_appendStackTrace: function(title, stackTrace)\r
-{\r
-this._appendTextRow("", "");\r
-var framesTable = document.createElement("table");\r
-for (var i = 0; i < stackTrace.length; ++i) {\r
-var stackFrame = stackTrace[i];\r
-var row = document.createElement("tr");\r
-row.className = "timeline-details";\r
-row.appendChild(this._createCell(stackFrame.functionName ? stackFrame.functionName : WebInspector.UIString("(anonymous function)"), "timeline-function-name"));\r
-row.appendChild(this._createCell(" @ "));\r
-var linkCell = document.createElement("td");\r
-linkCell.appendChild(WebInspector.linkifyResourceAsNode(stackFrame.scriptName, "scripts", stackFrame.lineNumber, "timeline-details"));\r
-row.appendChild(linkCell);\r
-framesTable.appendChild(row);\r
-}\r
-this._appendElementRow(title, framesTable, "timeline-stacktrace-title");\r
-}\r
-}\r
-\r
-WebInspector.TimelineExpandableElement = function(container)\r
-{\r
-this._element = document.createElement("div");\r
-this._element.className = "timeline-expandable";\r
-\r
-var leftBorder = document.createElement("div");\r
-leftBorder.className = "timeline-expandable-left";\r
-this._element.appendChild(leftBorder);\r
-\r
-container.appendChild(this._element);\r
-}\r
-\r
-WebInspector.TimelineExpandableElement.prototype = {\r
-_update: function(record, index, barPosition)\r
-{\r
-const rowHeight = WebInspector.TimelinePanel.rowHeight;\r
-if (record._visibleChildrenCount || record._invisibleChildrenCount) {\r
-this._element.style.top = index * rowHeight + "px";\r
-this._element.style.left = barPosition.left + "px";\r
-this._element.style.width = Math.max(12, barPosition.width + 25) + "px";\r
-if (!record.collapsed) {\r
-this._element.style.height = (record._visibleChildrenCount + 1) * rowHeight + "px";\r
-this._element.addStyleClass("timeline-expandable-expanded");\r
-this._element.removeStyleClass("timeline-expandable-collapsed");\r
-} else {\r
-this._element.style.height = rowHeight + "px";\r
-this._element.addStyleClass("timeline-expandable-collapsed");\r
-this._element.removeStyleClass("timeline-expandable-expanded");\r
-}\r
-this._element.removeStyleClass("hidden");\r
-} else\r
-this._element.addStyleClass("hidden");\r
-},\r
-\r
-_dispose: function()\r
-{\r
-this._element.parentElement.removeChild(this._element);\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TimelineOverviewPane = function(categories)\r
-{\r
-this._categories = categories;\r
-\r
-this.statusBarFilters = document.createElement("div");\r
-this.statusBarFilters.className = "status-bar-items";\r
-for (var categoryName in this._categories) {\r
-var category = this._categories[categoryName];\r
-this.statusBarFilters.appendChild(this._createTimelineCategoryStatusBarCheckbox(category, this._onCheckboxClicked.bind(this, category)));\r
-}\r
-\r
-this._overviewGrid = new WebInspector.TimelineGrid();\r
-this._overviewGrid.element.id = "timeline-overview-grid";\r
-this._overviewGrid.itemsGraphsElement.id = "timeline-overview-timelines";\r
-this._overviewGrid.element.addEventListener("mousedown", this._dragWindow.bind(this), true);\r
-\r
-this._heapGraph = new WebInspector.HeapGraph();\r
-this._heapGraph.element.id = "timeline-overview-memory";\r
-this._overviewGrid.element.insertBefore(this._heapGraph.element, this._overviewGrid.itemsGraphsElement);\r
-\r
-this.element = this._overviewGrid.element;\r
-\r
-this._categoryGraphs = {};\r
-var i = 0;\r
-for (var category in this._categories) {\r
-var categoryGraph = new WebInspector.TimelineCategoryGraph(this._categories[category], i++ % 2);\r
-this._categoryGraphs[category] = categoryGraph;\r
-this._overviewGrid.itemsGraphsElement.appendChild(categoryGraph.graphElement);\r
-}\r
-this._overviewGrid.setScrollAndDividerTop(0, 0);\r
-\r
-this._overviewWindowElement = document.createElement("div");\r
-this._overviewWindowElement.id = "timeline-overview-window";\r
-this._overviewGrid.element.appendChild(this._overviewWindowElement);\r
-\r
-this._overviewWindowBordersElement = document.createElement("div");\r
-this._overviewWindowBordersElement.className = "timeline-overview-window-rulers";\r
-this._overviewGrid.element.appendChild(this._overviewWindowBordersElement);\r
-\r
-var overviewDividersBackground = document.createElement("div");\r
-overviewDividersBackground.className = "timeline-overview-dividers-background";\r
-this._overviewGrid.element.appendChild(overviewDividersBackground);\r
-\r
-this._leftResizeElement = document.createElement("div");\r
-this._leftResizeElement.className = "timeline-window-resizer";\r
-this._leftResizeElement.style.left = 0;\r
-this._overviewGrid.element.appendChild(this._leftResizeElement);\r
-\r
-this._rightResizeElement = document.createElement("div");\r
-this._rightResizeElement.className = "timeline-window-resizer timeline-window-resizer-right";\r
-this._rightResizeElement.style.right = 0;\r
-this._overviewGrid.element.appendChild(this._rightResizeElement);\r
-\r
-this._overviewCalculator = new WebInspector.TimelineOverviewCalculator();\r
-\r
-this.windowLeft = 0.0;\r
-this.windowRight = 1.0;\r
-}\r
-\r
-WebInspector.TimelineOverviewPane.minSelectableSize = 12;\r
-\r
-WebInspector.TimelineOverviewPane.prototype = {\r
-showTimelines: function(event) {\r
-this._heapGraph.hide();\r
-this._overviewGrid.itemsGraphsElement.removeStyleClass("hidden");\r
-},\r
-\r
-showMemoryGraph: function(records) {\r
-this._heapGraph.show();\r
-this._heapGraph.update(records);\r
-this._overviewGrid.itemsGraphsElement.addStyleClass("hidden");\r
-},\r
-\r
-_onCheckboxClicked: function (category, event) {\r
-if (event.target.checked)\r
-category.hidden = false;\r
-else\r
-category.hidden = true;\r
-this._categoryGraphs[category.name].dimmed = !event.target.checked;\r
-this.dispatchEventToListeners("filter changed");\r
-},\r
-\r
-_forAllRecords: function(recordsArray, callback)\r
-{\r
-if (!recordsArray)\r
-return;\r
-for (var i = 0; i < recordsArray.length; ++i) {\r
-callback(recordsArray[i]);\r
-this._forAllRecords(recordsArray[i].children, callback);\r
-}\r
-},\r
-\r
-update: function(records, showShortEvents)\r
-{\r
-this._showShortEvents = showShortEvents;\r
-\r
-var timelines = {};\r
-for (var category in this._categories) {\r
-timelines[category] = [];\r
-this._categoryGraphs[category].clearChunks();\r
-}\r
-\r
-\r
-this._overviewCalculator.reset();\r
-this._forAllRecords(records, this._overviewCalculator.updateBoundaries.bind(this._overviewCalculator));\r
-\r
-function markTimeline(record)\r
-{\r
-if (!(this._showShortEvents || record.isLong()))\r
-return;\r
-var percentages = this._overviewCalculator.computeBarGraphPercentages(record);\r
-\r
-var end = Math.round(percentages.end);\r
-var categoryName = record.category.name;\r
-for (var j = Math.round(percentages.start); j <= end; ++j)\r
-timelines[categoryName][j] = true;\r
-}\r
-this._forAllRecords(records, markTimeline.bind(this));\r
-\r
-\r
-for (var category in this._categories) {\r
-var timeline = timelines[category];\r
-window.timelineSaved = timeline;\r
-var chunkStart = -1;\r
-for (var j = 0; j < 101; ++j) {\r
-if (timeline[j]) {\r
-if (chunkStart === -1)\r
-chunkStart = j;\r
-} else {\r
-if (chunkStart !== -1) {\r
-this._categoryGraphs[category].addChunk(chunkStart, j);\r
-chunkStart = -1;\r
-}\r
-}\r
-}\r
-if (chunkStart !== -1) {\r
-this._categoryGraphs[category].addChunk(chunkStart, 100);\r
-chunkStart = -1;\r
-}\r
-}\r
-\r
-this._heapGraph.setSize(this._overviewGrid.element.offsetWidth, 60);\r
-if (this._heapGraph.visible)\r
-this._heapGraph.update(records);\r
-\r
-this._overviewGrid.updateDividers(true, this._overviewCalculator);\r
-},\r
-\r
-updateEventDividers: function(records, dividerConstructor)\r
-{\r
-this._overviewGrid.removeEventDividers();\r
-var dividers = [];\r
-for (var i = 0; i < records.length; ++i) {\r
-var record = records[i];\r
-var positions = this._overviewCalculator.computeBarGraphPercentages(record);\r
-var dividerPosition = Math.round(positions.start * 10);\r
-if (dividers[dividerPosition])\r
-continue;\r
-var divider = dividerConstructor(record);\r
-divider.style.left = positions.start + "%";\r
-dividers[dividerPosition] = divider;\r
-}\r
-this._overviewGrid.addEventDividers(dividers);\r
-},\r
-\r
-updateMainViewWidth: function(width, records)\r
-{\r
-this._overviewGrid.element.style.left = width + "px";\r
-this.statusBarFilters.style.left = Math.max(155, width) + "px";\r
-},\r
-\r
-reset: function()\r
-{\r
-this.windowLeft = 0.0;\r
-this.windowRight = 1.0;\r
-this._overviewWindowElement.style.left = "0%";\r
-this._overviewWindowElement.style.width = "100%";\r
-this._overviewWindowBordersElement.style.left = "0%";\r
-this._overviewWindowBordersElement.style.right = "0%";\r
-this._leftResizeElement.style.left = "0%";\r
-this._rightResizeElement.style.left = "100%";\r
-this._overviewCalculator.reset();\r
-this._overviewGrid.updateDividers(true, this._overviewCalculator);\r
-},\r
-\r
-_resizeWindow: function(resizeElement, event)\r
-{\r
-WebInspector.elementDragStart(resizeElement, this._windowResizeDragging.bind(this, resizeElement), this._endWindowDragging.bind(this), event, "col-resize");\r
-},\r
-\r
-_windowResizeDragging: function(resizeElement, event)\r
-{\r
-if (resizeElement === this._leftResizeElement)\r
-this._resizeWindowLeft(event.pageX - this._overviewGrid.element.offsetLeft);\r
-else\r
-this._resizeWindowRight(event.pageX - this._overviewGrid.element.offsetLeft);\r
-event.preventDefault();\r
-},\r
-\r
-_dragWindow: function(event)\r
-{\r
-var node = event.target;\r
-while (node) {\r
-if (node === this._overviewGrid._dividersLabelBarElement) {\r
-WebInspector.elementDragStart(this._overviewWindowElement, this._windowDragging.bind(this, event.pageX,\r
-this._leftResizeElement.offsetLeft, this._rightResizeElement.offsetLeft), this._endWindowDragging.bind(this), event, "ew-resize");\r
-break;\r
-} else if (node === this._overviewGrid.element) {\r
-var position = event.pageX - this._overviewGrid.element.offsetLeft;\r
-this._overviewWindowSelector = new WebInspector.TimelinePanel.WindowSelector(this._overviewGrid.element, position, event);\r
-WebInspector.elementDragStart(null, this._windowSelectorDragging.bind(this), this._endWindowSelectorDragging.bind(this), event, "col-resize");\r
-break;\r
-} else if (node === this._leftResizeElement || node === this._rightResizeElement) {\r
-this._resizeWindow(node, event);\r
-break;\r
-}\r
-node = node.parentNode;\r
-}\r
-},\r
-\r
-_windowSelectorDragging: function(event)\r
-{\r
-this._overviewWindowSelector._updatePosition(event.pageX - this._overviewGrid.element.offsetLeft);\r
-event.preventDefault();\r
-},\r
-\r
-_endWindowSelectorDragging: function(event)\r
-{\r
-WebInspector.elementDragEnd(event);\r
-var window = this._overviewWindowSelector._close(event.pageX - this._overviewGrid.element.offsetLeft);\r
-delete this._overviewWindowSelector;\r
-if (window.end - window.start < WebInspector.TimelineOverviewPane.minSelectableSize)\r
-if (this._overviewGrid.itemsGraphsElement.offsetWidth - window.end > WebInspector.TimelineOverviewPane.minSelectableSize)\r
-window.end = window.start + WebInspector.TimelineOverviewPane.minSelectableSize;\r
-else\r
-window.start = window.end - WebInspector.TimelineOverviewPane.minSelectableSize;\r
-this._setWindowPosition(window.start, window.end);\r
-},\r
-\r
-_windowDragging: function(startX, windowLeft, windowRight, event)\r
-{\r
-var delta = event.pageX - startX;\r
-var start = windowLeft + delta;\r
-var end = windowRight + delta;\r
-var windowSize = windowRight - windowLeft;\r
-\r
-if (start < 0) {\r
-start = 0;\r
-end = windowSize;\r
-}\r
-\r
-if (end > this._overviewGrid.element.clientWidth) {\r
-end = this._overviewGrid.element.clientWidth;\r
-start = end - windowSize;\r
-}\r
-this._setWindowPosition(start, end);\r
-\r
-event.preventDefault();\r
-},\r
-\r
-_resizeWindowLeft: function(start)\r
-{\r
-\r
-if (start < 10)\r
-start = 0;\r
-else if (start > this._rightResizeElement.offsetLeft -  4)\r
-start = this._rightResizeElement.offsetLeft - 4;\r
-this._setWindowPosition(start, null);\r
-},\r
-\r
-_resizeWindowRight: function(end)\r
-{\r
-\r
-if (end > this._overviewGrid.element.clientWidth - 10)\r
-end = this._overviewGrid.element.clientWidth;\r
-else if (end < this._leftResizeElement.offsetLeft + WebInspector.TimelineOverviewPane.minSelectableSize)\r
-end = this._leftResizeElement.offsetLeft + WebInspector.TimelineOverviewPane.minSelectableSize;\r
-this._setWindowPosition(null, end);\r
-},\r
-\r
-_setWindowPosition: function(start, end)\r
-{\r
-const rulerAdjustment = 1 / this._overviewGrid.element.clientWidth;\r
-if (typeof start === "number") {\r
-this.windowLeft = start / this._overviewGrid.element.clientWidth;\r
-this._leftResizeElement.style.left = this.windowLeft * 100 + "%";\r
-this._overviewWindowElement.style.left = this.windowLeft * 100 + "%";\r
-this._overviewWindowBordersElement.style.left = (this.windowLeft - rulerAdjustment) * 100 + "%";\r
-}\r
-if (typeof end === "number") {\r
-this.windowRight = end / this._overviewGrid.element.clientWidth;\r
-this._rightResizeElement.style.left = this.windowRight * 100 + "%";\r
-}\r
-this._overviewWindowElement.style.width = (this.windowRight - this.windowLeft) * 100 + "%";\r
-this._overviewWindowBordersElement.style.right = (1 - this.windowRight + 2 * rulerAdjustment) * 100 + "%";\r
-this.dispatchEventToListeners("window changed");\r
-},\r
-\r
-_endWindowDragging: function(event)\r
-{\r
-WebInspector.elementDragEnd(event);\r
-},\r
-\r
-_createTimelineCategoryStatusBarCheckbox: function(category, onCheckboxClicked)\r
-{\r
-var labelContainer = document.createElement("div");\r
-labelContainer.addStyleClass("timeline-category-statusbar-item");\r
-labelContainer.addStyleClass("timeline-category-" + category.name);\r
-labelContainer.addStyleClass("status-bar-item");\r
-\r
-var label = document.createElement("label");\r
-var checkElement = document.createElement("input");\r
-checkElement.type = "checkbox";\r
-checkElement.className = "timeline-category-checkbox";\r
-checkElement.checked = true;\r
-checkElement.addEventListener("click", onCheckboxClicked);\r
-label.appendChild(checkElement);\r
-\r
-var typeElement = document.createElement("span");\r
-typeElement.className = "type";\r
-typeElement.textContent = category.title;\r
-label.appendChild(typeElement);\r
-\r
-labelContainer.appendChild(label);\r
-return labelContainer;\r
-}\r
-\r
-}\r
-\r
-WebInspector.TimelineOverviewPane.prototype.__proto__ = WebInspector.Object.prototype;\r
-\r
-\r
-WebInspector.TimelineOverviewCalculator = function()\r
-{\r
-}\r
-\r
-WebInspector.TimelineOverviewCalculator.prototype = {\r
-computeBarGraphPercentages: function(record)\r
-{\r
-var start = (record.startTime - this.minimumBoundary) / this.boundarySpan * 100;\r
-var end = (record.endTime - this.minimumBoundary) / this.boundarySpan * 100;\r
-return {start: start, end: end};\r
-},\r
-\r
-reset: function()\r
-{\r
-delete this.minimumBoundary;\r
-delete this.maximumBoundary;\r
-},\r
-\r
-updateBoundaries: function(record)\r
-{\r
-if (typeof this.minimumBoundary === "undefined" || record.startTime < this.minimumBoundary) {\r
-this.minimumBoundary = record.startTime;\r
-return true;\r
-}\r
-if (typeof this.maximumBoundary === "undefined" || record.endTime > this.maximumBoundary) {\r
-this.maximumBoundary = record.endTime;\r
-return true;\r
-}\r
-return false;\r
-},\r
-\r
-get boundarySpan()\r
-{\r
-return this.maximumBoundary - this.minimumBoundary;\r
-},\r
-\r
-formatValue: function(value)\r
-{\r
-return Number.secondsToString(value, WebInspector.UIString);\r
-}\r
-}\r
-\r
-\r
-WebInspector.TimelineCategoryGraph = function(category, isEven)\r
-{\r
-this._category = category;\r
-\r
-this._graphElement = document.createElement("div");\r
-this._graphElement.className = "timeline-graph-side timeline-overview-graph-side" + (isEven ? " even" : "");\r
-\r
-this._barAreaElement = document.createElement("div");\r
-this._barAreaElement.className = "timeline-graph-bar-area timeline-category-" + category.name;\r
-this._graphElement.appendChild(this._barAreaElement);\r
-}\r
-\r
-WebInspector.TimelineCategoryGraph.prototype = {\r
-get graphElement()\r
-{\r
-return this._graphElement;\r
-},\r
-\r
-addChunk: function(start, end)\r
-{\r
-var chunk = document.createElement("div");\r
-chunk.className = "timeline-graph-bar";\r
-this._barAreaElement.appendChild(chunk);\r
-chunk.style.setProperty("left", start + "%");\r
-chunk.style.setProperty("width", (end - start) + "%");\r
-},\r
-\r
-clearChunks: function()\r
-{\r
-this._barAreaElement.removeChildren();\r
-},\r
-\r
-set dimmed(dimmed)\r
-{\r
-if (dimmed)\r
-this._barAreaElement.removeStyleClass("timeline-category-" + this._category.name);\r
-else\r
-this._barAreaElement.addStyleClass("timeline-category-" + this._category.name);\r
-}\r
-}\r
-\r
-WebInspector.TimelinePanel.WindowSelector = function(parent, position, event)\r
-{\r
-this._startPosition = position;\r
-this._width = parent.offsetWidth;\r
-this._windowSelector = document.createElement("div");\r
-this._windowSelector.className = "timeline-window-selector";\r
-this._windowSelector.style.left = this._startPosition + "px";\r
-this._windowSelector.style.right = this._width - this._startPosition +  + "px";\r
-parent.appendChild(this._windowSelector);\r
-}\r
-\r
-WebInspector.TimelinePanel.WindowSelector.prototype = {\r
-_createSelectorElement: function(parent, left, width, height)\r
-{\r
-var selectorElement = document.createElement("div");\r
-selectorElement.className = "timeline-window-selector";\r
-selectorElement.style.left = left + "px";\r
-selectorElement.style.width = width + "px";\r
-selectorElement.style.top = "0px";\r
-selectorElement.style.height = height + "px";\r
-parent.appendChild(selectorElement);\r
-return selectorElement;\r
-},\r
-\r
-_close: function(position)\r
-{\r
-position = Math.max(0, Math.min(position, this._width));\r
-this._windowSelector.parentNode.removeChild(this._windowSelector);\r
-return this._startPosition < position ? {start: this._startPosition, end: position} : {start: position, end: this._startPosition};\r
-},\r
-\r
-_updatePosition: function(position)\r
-{\r
-position = Math.max(0, Math.min(position, this._width));\r
-if (position < this._startPosition) {\r
-this._windowSelector.style.left = position + "px";\r
-this._windowSelector.style.right = this._width - this._startPosition + "px";\r
-} else {\r
-this._windowSelector.style.left = this._startPosition + "px";\r
-this._windowSelector.style.right = this._width - position + "px";\r
-}\r
-}\r
-}\r
-\r
-WebInspector.HeapGraph = function() {\r
-this._canvas = document.createElement("canvas");\r
-\r
-this._maxHeapSizeLabel = document.createElement("div");\r
-this._maxHeapSizeLabel.addStyleClass("memory-graph-label");\r
-\r
-this._element = document.createElement("div");\r
-this._element.addStyleClass("hidden");\r
-this._element.appendChild(this._canvas);\r
-this._element.appendChild(this._maxHeapSizeLabel);\r
-}\r
-\r
-WebInspector.HeapGraph.prototype = {\r
-get element() {\r
-\r
-return this._element;\r
-},\r
-\r
-get visible() {\r
-return !this.element.hasStyleClass("hidden");\r
-},\r
-\r
-show: function() {\r
-this.element.removeStyleClass("hidden");\r
-},\r
-\r
-hide: function() {\r
-this.element.addStyleClass("hidden");\r
-},\r
-\r
-setSize: function(w, h) {\r
-this._canvas.width = w;\r
-this._canvas.height = h - 5;\r
-},\r
-\r
-update: function(records)\r
-{\r
-if (!records.length)\r
-return;\r
-\r
-var maxTotalHeapSize = 0;\r
-var minTime;\r
-var maxTime;\r
-this._forAllRecords(records, function(r) {\r
-if (r.totalHeapSize && r.totalHeapSize > maxTotalHeapSize)\r
-maxTotalHeapSize = r.totalHeapSize;\r
-\r
-if (typeof minTime === "undefined" || r.startTime < minTime)\r
-minTime = r.startTime;\r
-if (typeof maxTime === "undefined" || r.endTime > maxTime)\r
-maxTime = r.endTime;\r
-});\r
-\r
-var width = this._canvas.width;\r
-var height = this._canvas.height;\r
-var xFactor = width / (maxTime - minTime);\r
-var yFactor = height / maxTotalHeapSize;\r
-\r
-var histogram = new Array(width);\r
-this._forAllRecords(records, function(r) {\r
-if (!r.usedHeapSize)\r
-return;\r
-var x = Math.round((r.endTime - minTime) * xFactor);\r
-var y = Math.round(r.usedHeapSize * yFactor);\r
-histogram[x] = Math.max(histogram[x] || 0, y);\r
-});\r
-\r
-var ctx = this._canvas.getContext("2d");\r
-this._clear(ctx);\r
-\r
-\r
-height = height + 1;\r
-\r
-ctx.beginPath();\r
-var initialY = 0;\r
-for (var k = 0; k < histogram.length; k++) {\r
-if (histogram[k]) {\r
-initialY = histogram[k];\r
-break;\r
-}\r
-}\r
-ctx.moveTo(0, height - initialY);\r
-\r
-for (var x = 0; x < histogram.length; x++) {\r
-if (!histogram[x])\r
-continue;\r
-ctx.lineTo(x, height - histogram[x]);\r
-}\r
-\r
-ctx.lineWidth = 0.5;\r
-ctx.strokeStyle = "rgba(20,0,0,0.8)";\r
-ctx.stroke();\r
-\r
-ctx.fillStyle = "rgba(214,225,254, 0.8);";\r
-ctx.lineTo(width, 60);\r
-ctx.lineTo(0, 60);\r
-ctx.lineTo(0, height - initialY);\r
-ctx.fill();\r
-ctx.closePath();\r
-\r
-this._maxHeapSizeLabel.textContent = Number.bytesToString(maxTotalHeapSize);\r
-},\r
-\r
-_clear: function(ctx) {\r
-ctx.fillStyle = "rgba(255,255,255,0.8)";\r
-ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\r
-},\r
-\r
-_forAllRecords: WebInspector.TimelineOverviewPane.prototype._forAllRecords\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.TestController = function(callId)\r
-{\r
-this._callId = callId;\r
-this._waitUntilDone = false;\r
-this.results = [];\r
-}\r
-\r
-WebInspector.TestController.prototype = {\r
-waitUntilDone: function()\r
-{\r
-this._waitUntilDone = true;\r
-},\r
-\r
-notifyDone: function(result)\r
-{\r
-if (typeof result === "undefined" && this.results.length)\r
-result = this.results;\r
-var message = typeof result === "undefined" ? "\"<undefined>\"" : JSON.stringify(result);\r
-InspectorBackend.didEvaluateForTestInFrontend(this._callId, message);\r
-},\r
-\r
-runAfterPendingDispatches: function(callback)\r
-{\r
-if (WebInspector.pendingDispatches === 0) {\r
-callback();\r
-return;\r
-}\r
-setTimeout(this.runAfterPendingDispatches.bind(this), 0, callback);\r
-}\r
-}\r
-\r
-WebInspector.evaluateForTestInFrontend = function(callId, script)\r
-{\r
-var controller = new WebInspector.TestController(callId);\r
-function invokeMethod()\r
-{\r
-try {\r
-var result;\r
-if (window[script] && typeof window[script] === "function")\r
-result = window[script].call(WebInspector, controller);\r
-else\r
-result = window.eval(script);\r
-\r
-if (!controller._waitUntilDone)\r
-controller.notifyDone(result);\r
-} catch (e) {\r
-controller.notifyDone(e.toString());\r
-}\r
-}\r
-controller.runAfterPendingDispatches(invokeMethod);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.HelpScreen = function(title)\r
-{\r
-this._element = document.createElement("div");\r
-this._element.className = "help-window-outer";\r
-this._element.addEventListener("keydown", this._onKeyDown.bind(this), false);\r
-\r
-var mainWindow = this._element.createChild("div", "help-window-main");\r
-var captionWindow = mainWindow.createChild("div", "help-window-caption");\r
-var closeButton = captionWindow.createChild("button", "help-close-button");\r
-this.contentElement = mainWindow.createChild("div", "help-content");\r
-this.contentElement.tabIndex = 0;\r
-this.contentElement.addEventListener("blur", this._onBlur.bind(this), false);\r
-captionWindow.createChild("h1", "help-window-title").innerText = title;\r
-\r
-closeButton.innerText = "\u2716"; \r
-closeButton.addEventListener("click", this._hide.bind(this), false);\r
-this._closeKeys = [\r
-WebInspector.KeyboardShortcut.Keys.Enter.code,\r
-WebInspector.KeyboardShortcut.Keys.Esc.code,\r
-WebInspector.KeyboardShortcut.Keys.Space.code,\r
-];\r
-document.body.appendChild(this._element);\r
-}\r
-\r
-WebInspector.HelpScreen.prototype = {\r
-show: function()\r
-{\r
-if (this._isShown)\r
-return;\r
-\r
-this._element.style.visibility = "visible";\r
-this._isShown = true;\r
-this._previousFocusElement = WebInspector.currentFocusElement;\r
-WebInspector.currentFocusElement = this.contentElement;\r
-},\r
-\r
-_hide: function()\r
-{\r
-this._isShown = false;\r
-this._element.style.visibility = "hidden";\r
-WebInspector.currentFocusElement = this._previousFocusElement;\r
-},\r
-\r
-_onKeyDown: function(event)\r
-{\r
-if (this._isShown && this._closeKeys.indexOf(event.keyCode) >= 0) {\r
-this._hide();\r
-event.stopPropagation();\r
-}\r
-},\r
-\r
-_onBlur: function()\r
-{\r
-\r
-if (this._isShown)\r
-WebInspector.currentFocusElement = this.contentElement;\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.GoToLineDialog = function(view)\r
-{\r
-this._element = document.createElement("div");\r
-this._element.className = "go-to-line-dialog";\r
-this._element.addEventListener("keydown", this._onKeyDown.bind(this), false);\r
-this._closeKeys = [\r
-WebInspector.KeyboardShortcut.Keys.Enter.code,\r
-WebInspector.KeyboardShortcut.Keys.Esc.code,\r
-];\r
-\r
-var dialogWindow = this._element;\r
-\r
-dialogWindow.createChild("label").innerText = WebInspector.UIString("Go to line: ");\r
-\r
-this._input = dialogWindow.createChild("input");\r
-this._input.setAttribute("type", "text");\r
-this._input.setAttribute("size", 6);\r
-var linesCount = view.sourceFrame.textModel.linesCount;\r
-if (linesCount)\r
-this._input.setAttribute("title", WebInspector.UIString("1 - %d", linesCount));\r
-var blurHandler = this._onBlur.bind(this);\r
-this._input.addEventListener("blur", blurHandler, false);\r
-\r
-\r
-var go = dialogWindow.createChild("button");\r
-go.innerText = WebInspector.UIString("Go");\r
-go.addEventListener("click", this._onClick.bind(this), false);\r
-go.addEventListener("mousedown", function(e) {\r
-\r
-\r
-this._input.removeEventListener("blur", blurHandler, false);\r
-}.bind(this), false);\r
-\r
-this._view = view;\r
-view.element.appendChild(this._element);\r
-\r
-this._previousFocusElement = WebInspector.currentFocusElement;\r
-WebInspector.currentFocusElement = this._input;\r
-this._input.select();\r
-}\r
-\r
-WebInspector.GoToLineDialog.show = function(sourceView)\r
-{\r
-if (this._instance)\r
-return;\r
-this._instance = new WebInspector.GoToLineDialog(sourceView);\r
-}\r
-\r
-WebInspector.GoToLineDialog.prototype = {\r
-_hide: function()\r
-{\r
-if (this._isHiding)\r
-return;\r
-this._isHiding = true;\r
-\r
-WebInspector.currentFocusElement = this._previousFocusElement;\r
-WebInspector.GoToLineDialog._instance = null;\r
-this._element.parentElement.removeChild(this._element);\r
-},\r
-\r
-_onBlur: function(event)\r
-{\r
-this._hide();\r
-},\r
-\r
-_onKeyDown: function(event)\r
-{\r
-if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Tab.code) {\r
-event.preventDefault();\r
-return;\r
-}\r
-\r
-if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Enter.code)\r
-this._highlightSelectedLine();\r
-\r
-if (this._closeKeys.indexOf(event.keyCode) >= 0) {\r
-this._hide();\r
-event.stopPropagation();\r
-}\r
-},\r
-\r
-_onClick: function(event)\r
-{\r
-this._highlightSelectedLine();\r
-this._hide();\r
-},\r
-\r
-_highlightSelectedLine: function()\r
-{\r
-var value = this._input.value;\r
-var lineNumber = parseInt(value, 10);\r
-if (!isNaN(lineNumber) && lineNumber > 0) {\r
-lineNumber = Math.min(lineNumber, this._view.sourceFrame.textModel.linesCount);\r
-this._view.highlightLine(lineNumber);\r
-}\r
-}\r
-};\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.ShortcutsHelp = function()\r
-{\r
-this._sections = {};\r
-}\r
-\r
-WebInspector.ShortcutsHelp.prototype = {\r
-section: function(name)\r
-{\r
-var section = this._sections[name];\r
-if (!section)\r
-this._sections[name] = section = new WebInspector.ShortcutsSection(name);\r
-return section;\r
-},\r
-\r
-show: function()\r
-{\r
-if (!this._helpScreen) {\r
-this._helpScreen = new WebInspector.HelpScreen(WebInspector.UIString("Keyboard Shortcuts"));\r
-this._buildTable(this._helpScreen.contentElement, 2);\r
-}\r
-this._helpScreen.show();\r
-},\r
-\r
-_buildTable: function(parent, nColumns)\r
-{\r
-var height = 0;\r
-var orderedSections = [];\r
-for (var section in this._sections) {\r
-height += this._sections[section]._height;\r
-orderedSections.push(this._sections[section])\r
-}\r
-function compareSections(a, b)\r
-{\r
-return a.order - b.order;\r
-}\r
-orderedSections = orderedSections.sort(compareSections);\r
-\r
-const wrapAfter = height / nColumns;\r
-var table = document.createElement("table");\r
-table.className = "help-table";\r
-var row = table.createChild("tr");\r
-\r
-\r
-\r
-for (var section = 0; section < orderedSections.length;) {\r
-var td = row.createChild("td");\r
-td.style.width = (100 / nColumns) + "%";\r
-var column = td.createChild("table");\r
-for (var columnHeight = 0;\r
-columnHeight < wrapAfter && section < orderedSections.length;\r
-columnHeight += orderedSections[section]._height, section++) {\r
-orderedSections[section].renderSection(column);\r
-}\r
-}\r
-parent.appendChild(table);\r
-}\r
-};\r
-\r
-WebInspector.shortcutsHelp = new WebInspector.ShortcutsHelp();\r
-\r
-WebInspector.ShortcutsSection = function(name)\r
-{\r
-this.name = name;\r
-this._lines = [];\r
-this.order = ++WebInspector.ShortcutsSection._sequenceNumber;\r
-};\r
-\r
-WebInspector.ShortcutsSection._sequenceNumber = 0;\r
-\r
-WebInspector.ShortcutsSection.prototype = {\r
-addKey: function(key, description)\r
-{\r
-this.addLine(this._renderKey(key), description);\r
-},\r
-\r
-addRelatedKeys: function(keys, description)\r
-{\r
-this.addLine(this._renderSequence(keys,"/"), description);\r
-},\r
-\r
-addAlternateKeys: function(keys, description)\r
-{\r
-this.addLine(this._renderSequence(keys,WebInspector.UIString("or")), description);\r
-},\r
-\r
-addLine: function(htmlKey, description)\r
-{\r
-this._lines.push({ key: htmlKey, text: description })\r
-},\r
-\r
-renderSection: function(parent)\r
-{\r
-this._renderHeader(parent);\r
-\r
-for (var line = 0; line < this._lines.length; ++line) {\r
-var tr = parent.createChild("tr");\r
-tr.createChild("td", "help-key-cell").innerHTML = this._lines[line].key + " : ";\r
-tr.createChild("td").innerText = this._lines[line].text;\r
-}\r
-},\r
-\r
-_renderHeader: function(parent)\r
-{\r
-var trHead = parent.createChild("tr");\r
-\r
-trHead.createChild("th");\r
-trHead.createChild("th").innerText = this.name;\r
-},\r
-\r
-_renderSequence: function(sequence, delimiter)\r
-{\r
-var delimiterHtml = '<span class="help-key-delimiter">' + delimiter.escapeHTML() + '</span>'\r
-return sequence.map(this._renderKey).join(delimiterHtml);\r
-},\r
-\r
-_renderKey: function(key)\r
-{\r
-function renderLabel(label)\r
-{\r
-return '<span class="help-key monospace">' + label.escapeHTML() + '</span>';\r
-}\r
-return key.split(" + ").map(renderLabel).join('<span class="help-combine-keys">+</span>');\r
-},\r
-\r
-get _height()\r
-{\r
-return this._lines.length + 2; \r
-}\r
-};\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.HAREntry = function(resource)\r
-{\r
-this._resource = resource;\r
-}\r
-\r
-WebInspector.HAREntry.prototype = {\r
-build: function()\r
-{\r
-return {\r
-pageref: this._resource.documentURL,\r
-startedDateTime: new Date(this._resource.startTime * 1000),\r
-time: WebInspector.HAREntry._toMilliseconds(this._resource.duration),\r
-request: this._buildRequest(),\r
-response: this._buildResponse(),\r
-\r
-timings: this._buildTimings()\r
-};\r
-},\r
-\r
-_buildRequest: function()\r
-{\r
-var res = {\r
-method: this._resource.requestMethod,\r
-url: this._resource.url,\r
-\r
-headers: this._buildHeaders(this._resource.requestHeaders),\r
-headersSize: -1, \r
-bodySize: -1 \r
-};\r
-if (this._resource.queryParameters)\r
-res.queryString = this._buildParameters(this._resource.queryParameters);\r
-if (this._resource.requestFormData)\r
-res.postData = this._buildPostData();\r
-if (this._resource.requestCookies)\r
-res.cookies = this._buildCookies(this._resource.requestCookies);\r
-return res;\r
-},\r
-\r
-_buildResponse: function()\r
-{\r
-var res = {\r
-status: this._resource.statusCode,\r
-statusText: this._resource.statusText,\r
-\r
-headers: this._buildHeaders(this._resource.responseHeaders),\r
-content: this._buildContent(),\r
-redirectURL: this._resource.responseHeaderValue("Location") || "",\r
-headersSize: -1, \r
-bodySize: this._resource.resourceSize\r
-};\r
-if (this._resource.responseCookies)\r
-res.cookies = this._buildCookies(this._resource.responseCookies);\r
-return res;\r
-},\r
-\r
-_buildContent: function()\r
-{\r
-return {\r
-size: this._resource.resourceSize,\r
-\r
-mimeType: this._resource.mimeType,\r
-\r
-};\r
-},\r
-\r
-_buildTimings: function()\r
-{\r
-var waitForConnection = this._interval("connectStart", "connectEnd");\r
-var blocked;\r
-var connect;\r
-var dns = this._interval("dnsStart", "dnsEnd");\r
-var send = this._interval("sendStart", "sendEnd");\r
-var ssl = this._interval("sslStart", "sslEnd");\r
-\r
-if (ssl !== -1 && send !== -1)\r
-send -= ssl;\r
-\r
-if (this._resource.connectionReused) {\r
-connect = -1;\r
-blocked = waitForConnection;\r
-} else {\r
-blocked = 0;\r
-connect = waitForConnection;\r
-if (dns !== -1)\r
-connect -= dns;\r
-}\r
-\r
-return {\r
-blocked: blocked,\r
-dns: dns,\r
-connect: connect,\r
-send: send,\r
-wait: this._interval("sendEnd", "receiveHeadersEnd"),\r
-receive: WebInspector.HAREntry._toMilliseconds(this._resource.receiveDuration),\r
-ssl: ssl\r
-};\r
-},\r
-\r
-_buildHeaders: function(headers)\r
-{\r
-var result = [];\r
-for (var name in headers)\r
-result.push({ name: name, value: headers[name] });\r
-return result;\r
-},\r
-\r
-_buildPostData: function()\r
-{\r
-var res = {\r
-mimeType: this._resource.requestHeaderValue("Content-Type"),\r
-text: this._resource.requestFormData\r
-};\r
-if (this._resource.formParameters)\r
-res.params = this._buildParameters(this._resource.formParameters);\r
-return res;\r
-},\r
-\r
-_buildParameters: function(parameters)\r
-{\r
-return parameters.slice();\r
-},\r
-\r
-_buildCookies: function(cookies)\r
-{\r
-return cookies.map(this._buildCookie.bind(this));\r
-},\r
-\r
-_buildCookie: function(cookie)\r
-{\r
-\r
-return {\r
-name: cookie.name,\r
-value: cookie.value,\r
-path: cookie.path,\r
-domain: cookie.domain,\r
-expires: cookie.expires(new Date(this._resource.startTime * 1000)),\r
-httpOnly: cookie.httpOnly,\r
-secure: cookie.secure\r
-};\r
-},\r
-\r
-_interval: function(start, end)\r
-{\r
-var timing = this._resource.timing;\r
-if (!timing)\r
-return -1;\r
-var startTime = timing[start];\r
-return typeof startTime !== "number" || startTime === -1 ? -1 : Math.round(timing[end] - startTime);\r
-}\r
-}\r
-\r
-WebInspector.HAREntry._toMilliseconds = function(time)\r
-{\r
-return time === -1 ? -1 : Math.round(time * 1000);\r
-}\r
-\r
-WebInspector.HARLog = function()\r
-{\r
-this.includeResourceIds = false;\r
-}\r
-\r
-WebInspector.HARLog.prototype = {\r
-build: function()\r
-{\r
-var webKitVersion = /AppleWebKit\/([^ ]+)/.exec(window.navigator.userAgent);\r
-\r
-return {\r
-version: "1.2",\r
-creator: {\r
-name: "WebInspector",\r
-version: webKitVersion ? webKitVersion[1] : "n/a"\r
-},\r
-pages: this._buildPages(),\r
-entries: Object.keys(WebInspector.networkResources).map(this._convertResource.bind(this))\r
-}\r
-},\r
-\r
-_buildPages: function()\r
-{\r
-return [\r
-{\r
-startedDateTime: new Date(WebInspector.mainResource.startTime * 1000),\r
-id: WebInspector.mainResource.documentURL,\r
-title: "",\r
-pageTimings: this.buildMainResourceTimings()\r
-}\r
-];\r
-},\r
-\r
-buildMainResourceTimings: function()\r
-{\r
-return {\r
-onContentLoad: this._pageEventTime(WebInspector.mainResourceDOMContentTime),\r
-onLoad: this._pageEventTime(WebInspector.mainResourceLoadTime),\r
-}\r
-},\r
-\r
-_convertResource: function(id)\r
-{\r
-var entry = (new WebInspector.HAREntry(WebInspector.networkResources[id])).build();\r
-if (this.includeResourceIds)\r
-entry._resourceId = id;\r
-return entry;\r
-},\r
-\r
-_pageEventTime: function(time)\r
-{\r
-var startTime = WebInspector.mainResource.startTime;\r
-if (time === -1 || startTime === -1)\r
-return -1;\r
-return WebInspector.HAREntry._toMilliseconds(time - startTime);\r
-}\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.CookieParser = function()\r
-{\r
-}\r
-\r
-WebInspector.CookieParser.prototype = {\r
-get cookies()\r
-{\r
-return this._cookies;\r
-},\r
-\r
-parseCookie: function(cookieHeader)\r
-{\r
-if (!this._initialize(cookieHeader))\r
-return;\r
-\r
-for (var kv = this._extractKeyValue(); kv; kv = this._extractKeyValue()) {\r
-if (kv.key.charAt(0) === "$" && this._lastCookie)\r
-this._lastCookie.addAttribute(kv.key.slice(1), kv.value);\r
-else if (kv.key.toLowerCase() !== "$version" && typeof kv.value === "string")\r
-this._addCookie(kv, WebInspector.Cookie.Type.Request);\r
-this._advanceAndCheckCookieDelimiter();\r
-}\r
-this._flushCookie();\r
-return this._cookies;\r
-},\r
-\r
-parseSetCookie: function(setCookieHeader)\r
-{\r
-if (!this._initialize(setCookieHeader))\r
-return;\r
-for (var kv = this._extractKeyValue(); kv; kv = this._extractKeyValue()) {\r
-if (this._lastCookie)\r
-this._lastCookie.addAttribute(kv.key, kv.value);\r
-else \r
-this._addCookie(kv, WebInspector.Cookie.Type.Response);\r
-if (this._advanceAndCheckCookieDelimiter())\r
-this._flushCookie();\r
-}\r
-this._flushCookie();\r
-return this._cookies;\r
-},\r
-\r
-_initialize: function(headerValue)\r
-{\r
-this._input = headerValue;\r
-if (typeof headerValue !== "string")\r
-return false;\r
-this._cookies = [];\r
-this._lastCookie = null;\r
-this._originalInputLength = this._input.length;\r
-return true;\r
-},\r
-\r
-_flushCookie: function()\r
-{\r
-if (this._lastCookie)\r
-this._lastCookie.size = this._originalInputLength - this._input.length - this._lastCookiePosition;\r
-this._lastCookie = null;\r
-},\r
-\r
-_extractKeyValue: function()\r
-{\r
-if (!this._input || !this._input.length)\r
-return null;\r
-\r
-\r
-\r
-\r
-\r
-var keyValueMatch = /^[ \t]*([^\s=;]+)[ \t]*(?:=[ \t]*([^;\n]*))?/.exec(this._input);\r
-        if (!keyValueMatch) {\r
-            console.log("Failed parsing cookie header before: " + this._input);\r
-            return null;\r
-        }\r
-\r
-        var result = {\r
-            key: keyValueMatch[1],\r
-            value: keyValueMatch[2] && keyValueMatch[2].trim(),\r
-            position: this._originalInputLength - this._input.length\r
-        };\r
-        this._input = this._input.slice(keyValueMatch[0].length);\r
-        return result;\r
-    },\r
-\r
-    _advanceAndCheckCookieDelimiter: function()\r
-    {\r
-        var match = /^\s*[\n;]\s*/.exec(this._input);\r
-if (!match)\r
-return false;\r
-this._input = this._input.slice(match[0].length);\r
-return match[0].match("\n") !== null;\r
-},\r
-\r
-_addCookie: function(keyValue, type)\r
-{\r
-if (this._lastCookie)\r
-this._lastCookie.size = keyValue.position - this._lastCookiePosition;\r
-\r
-\r
-this._lastCookie = keyValue.value ? new WebInspector.Cookie(keyValue.key, keyValue.value, type) :\r
-new WebInspector.Cookie("", keyValue.key, type);\r
-this._lastCookiePosition = keyValue.position;\r
-this._cookies.push(this._lastCookie);\r
-}\r
-};\r
-\r
-WebInspector.CookieParser.parseCookie = function(header)\r
-{\r
-return (new WebInspector.CookieParser()).parseCookie(header);\r
-}\r
-\r
-WebInspector.CookieParser.parseSetCookie = function(header)\r
-{\r
-return (new WebInspector.CookieParser()).parseSetCookie(header);\r
-}\r
-\r
-WebInspector.Cookie = function(name, value, type)\r
-{\r
-this.name = name;\r
-this.value = value;\r
-this.type = type;\r
-this._attributes = {};\r
-}\r
-\r
-WebInspector.Cookie.prototype = {\r
-get httpOnly()\r
-{\r
-return "httponly" in this._attributes;\r
-},\r
-\r
-get secure()\r
-{\r
-return "secure" in this._attributes;\r
-},\r
-\r
-get session()\r
-{\r
-\r
-\r
-return  !("expries" in this._attributes || "max-age" in this._attributes);\r
-},\r
-\r
-get path()\r
-{\r
-return this._attributes.path;\r
-},\r
-\r
-get domain()\r
-{\r
-return this._attributes.domain;\r
-},\r
-\r
-expires: function(requestDate)\r
-{\r
-return this._attributes.expires ? new Date(this._attributes.expires) :\r
-(this._attributes["max-age"] ? new Date(requestDate.getTime() + 1000 * this._attributes["max-age"]) : null);\r
-},\r
-\r
-get attributes()\r
-{\r
-return this._attributes;\r
-},\r
-\r
-addAttribute: function(key, value)\r
-{\r
-this._attributes[key.toLowerCase()] = value;\r
-}\r
-}\r
-\r
-WebInspector.Cookie.Type = {\r
-Request: 0,\r
-Response: 1\r
-};\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-var context = {};  \r
-\r
-(function () {\r
-Preferences.ignoreWhitespace = false;\r
-Preferences.samplingCPUProfiler = true;\r
-Preferences.heapProfilerPresent = true;\r
-Preferences.debuggerAlwaysEnabled = true;\r
-Preferences.profilerAlwaysEnabled = true;\r
-Preferences.canEditScriptSource = true;\r
-Preferences.onlineDetectionEnabled = false;\r
-Preferences.nativeInstrumentationEnabled = true;\r
-Preferences.fileSystemEnabled = false;\r
-Preferences.resourceExportEnabled = true;\r
-Preferences.showTimingTab = true;\r
-Preferences.showCookiesTab = true;\r
-})();\r
-\r
-var devtools = devtools || {};\r
-\r
-devtools.domContentLoaded = function()\r
-{\r
-WebInspector.setAttachedWindow(WebInspector.queryParamsObject.docked === "true");\r
-if (WebInspector.queryParamsObject.toolbar_color && WebInspector.queryParamsObject.text_color)\r
-WebInspector.setToolbarColors(WebInspector.queryParamsObject.toolbar_color, WebInspector.queryParamsObject.text_color);\r
-}\r
-document.addEventListener("DOMContentLoaded", devtools.domContentLoaded, false);\r
-\r
-\r
-\r
-(function InterceptProfilesPanelEvents()\r
-{\r
-var oldShow = WebInspector.ProfilesPanel.prototype.show;\r
-WebInspector.ProfilesPanel.prototype.show = function()\r
-{\r
-this.enableToggleButton.visible = false;\r
-oldShow.call(this);\r
-\r
-\r
-WebInspector.ProfilesPanel.prototype.show = oldShow;\r
-};\r
-})();\r
-\r
-\r
-\r
-WebInspector.UIString = function(string)\r
-{\r
-return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));\r
-};\r
-\r
-\r
-\r
-(function()\r
-{\r
-var originalDragStart = WebInspector.elementDragStart;\r
-WebInspector.elementDragStart = function(element)\r
-{\r
-if (element) {\r
-var glassPane = document.createElement("div");\r
-glassPane.style.cssText = "position:absolute;width:100%;height:100%;opacity:0;z-index:1";\r
-glassPane.id = "glass-pane-for-drag";\r
-element.parentElement.appendChild(glassPane);\r
-}\r
-\r
-originalDragStart.apply(this, arguments);\r
-};\r
-\r
-var originalDragEnd = WebInspector.elementDragEnd;\r
-WebInspector.elementDragEnd = function()\r
-{\r
-originalDragEnd.apply(this, arguments);\r
-\r
-var glassPane = document.getElementById("glass-pane-for-drag");\r
-if (glassPane)\r
-glassPane.parentElement.removeChild(glassPane);\r
-};\r
-})();\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.runAfterPendingDispatchesQueue = [];\r
-\r
-WebInspector.TestController.prototype.runAfterPendingDispatches = function(callback)\r
-{\r
-WebInspector.runAfterPendingDispatchesQueue.push(callback);\r
-};\r
-\r
-WebInspector.queuesAreEmpty = function()\r
-{\r
-var copy = this.runAfterPendingDispatchesQueue.slice();\r
-this.runAfterPendingDispatchesQueue = [];\r
-for (var i = 0; i < copy.length; ++i)\r
-copy[i].call(this);\r
-};\r
-\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.setToolbarColors = function(backgroundColor, color)\r
-{\r
-if (!WebInspector._themeStyleElement) {\r
-WebInspector._themeStyleElement = document.createElement("style");\r
-document.head.appendChild(WebInspector._themeStyleElement);\r
-}\r
-WebInspector._themeStyleElement.textContent =\r
-"#toolbar {\\r
-             background-image: none !important;\\r
-             background-color: " + backgroundColor + " !important;\\r
-         }\\r
-         \\r
-         .toolbar-label {\\r
-             color: " + color + " !important;\\r
-             text-shadow: none;\\r
-         }";\r
-}\r
-\r
-WebInspector.resetToolbarColors = function()\r
-{\r
-if (WebInspector._themeStyleElement)\r
-WebInspector._themeStyleElement.textContent = "";\r
-\r
-}\r
-\r
-\r
-\r
-\r
-\r
-WebInspector.platformExtensionAPI = function(tabId)\r
-{\r
-function getTabId()\r
-{\r
-return tabId;\r
-}\r
-webInspector.inspectedWindow.__proto__.__defineGetter__("tabId", getTabId);\r
-}\r
-\r
-WebInspector.buildPlatformExtensionAPI = function()\r
-{\r
-return "(" + WebInspector.platformExtensionAPI + ")(" + WebInspector._inspectedTabId + ");";\r
-}\r
-\r
-WebInspector.setInspectedTabId = function(tabId)\r
-{\r
-WebInspector._inspectedTabId = tabId;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-if (window.domAutomationController) {\r
-\r
-var ___interactiveUiTestsMode = true;\r
-\r
-\r
-TestSuite = function()\r
-{\r
-this.controlTaken_ = false;\r
-this.timerId_ = -1;\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.fail = function(message)\r
-{\r
-if (this.controlTaken_)\r
-this.reportFailure_(message);\r
-else\r
-throw message;\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.assertEquals = function(expected, actual, opt_message)\r
-{\r
-if (expected !== actual) {\r
-var message = "Expected: '" + expected + "', but was '" + actual + "'";\r
-if (opt_message)\r
-message = opt_message + "(" + message + ")";\r
-this.fail(message);\r
-}\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.assertTrue = function(value, opt_message)\r
-{\r
-this.assertEquals(true, !!value, opt_message);\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.assertContains = function(string, substring)\r
-{\r
-if (string.indexOf(substring) === -1)\r
-this.fail("Expected to: '" + string + "' to contain '" + substring + "'");\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.takeControl = function()\r
-{\r
-this.controlTaken_ = true;\r
-\r
-var self = this;\r
-this.timerId_ = setTimeout(function() {\r
-self.reportFailure_("Timeout exceeded: 20 sec");\r
-}, 20000);\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.releaseControl = function()\r
-{\r
-if (this.timerId_ !== -1) {\r
-clearTimeout(this.timerId_);\r
-this.timerId_ = -1;\r
-}\r
-this.reportOk_();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.reportOk_ = function()\r
-{\r
-window.domAutomationController.send("[OK]");\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.reportFailure_ = function(error)\r
-{\r
-if (this.timerId_ !== -1) {\r
-clearTimeout(this.timerId_);\r
-this.timerId_ = -1;\r
-}\r
-window.domAutomationController.send("[FAILED] " + error);\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.runTest = function(testName)\r
-{\r
-try {\r
-this[testName]();\r
-if (!this.controlTaken_)\r
-this.reportOk_();\r
-} catch (e) {\r
-this.reportFailure_(e);\r
-}\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.showPanel = function(panelName)\r
-{\r
-\r
-var toolbar = document.getElementById("toolbar");\r
-var button = toolbar.getElementsByClassName(panelName)[0];\r
-button.click();\r
-this.assertEquals(WebInspector.panels[panelName], WebInspector.currentPanel);\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.addSniffer = function(receiver, methodName, override, opt_sticky)\r
-{\r
-var orig = receiver[methodName];\r
-if (typeof orig !== "function")\r
-this.fail("Cannot find method to override: " + methodName);\r
-var test = this;\r
-receiver[methodName] = function(var_args) {\r
-try {\r
-var result = orig.apply(this, arguments);\r
-} finally {\r
-if (!opt_sticky)\r
-receiver[methodName] = orig;\r
-}\r
-\r
-try {\r
-override.apply(this, arguments);\r
-} catch (e) {\r
-test.fail("Exception in overriden method '" + methodName + "': " + e);\r
-}\r
-return result;\r
-};\r
-};\r
-\r
-\r
-\r
-\r
-\r
-\r
-TestSuite.prototype.testEnableResourcesTab = function()\r
-{\r
-this.showPanel("resources");\r
-\r
-var test = this;\r
-this.addSniffer(WebInspector, "updateResource",\r
-function(payload) {\r
-test.assertEquals("simple_page.html", payload.lastPathComponent);\r
-WebInspector.panels.resources.refresh();\r
-WebInspector.panels.resources.revealAndSelectItem(WebInspector.resources[payload.id]);\r
-\r
-test.releaseControl();\r
-});\r
-\r
-\r
-\r
-WebInspector.panels.resources._enableResourceTracking();\r
-\r
-\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testProfilerTab = function()\r
-{\r
-this.showPanel("profiles");\r
-\r
-var panel = WebInspector.panels.profiles;\r
-var test = this;\r
-\r
-function findDisplayedNode() {\r
-var node = panel.visibleView.profileDataGridTree.children[0];\r
-if (!node) {\r
-\r
-window.setTimeout(findDisplayedNode, 100);\r
-return;\r
-}\r
-\r
-\r
-\r
-\r
-while (node) {\r
-if (node.functionName.indexOf("fib") !== -1)\r
-test.releaseControl();\r
-node = node.traverseNextNode(true, null, true);\r
-}\r
-\r
-test.fail();\r
-}\r
-\r
-function findVisibleView() {\r
-if (!panel.visibleView) {\r
-setTimeout(findVisibleView, 0);\r
-return;\r
-}\r
-setTimeout(findDisplayedNode, 0);\r
-}\r
-\r
-findVisibleView();\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testHeapProfiler = function()\r
-{\r
-this.showPanel("profiles");\r
-\r
-var panel = WebInspector.panels.profiles;\r
-var test = this;\r
-\r
-function findDisplayedNode() {\r
-var node = panel.visibleView.dataGrid.children[0];\r
-if (!node) {\r
-\r
-window.setTimeout(findDisplayedNode, 100);\r
-return;\r
-}\r
-\r
-\r
-\r
-while (node) {\r
-if (node.constructorName.indexOf("A") !== -1) {\r
-test.releaseControl();\r
-return;\r
-}\r
-node = node.traverseNextNode(false, null, true);\r
-}\r
-\r
-test.fail();\r
-}\r
-\r
-function findVisibleView() {\r
-if (!panel.visibleView) {\r
-setTimeout(findVisibleView, 0);\r
-return;\r
-}\r
-setTimeout(findDisplayedNode, 0);\r
-}\r
-\r
-WebInspector.HeapSnapshotProfileType.prototype.buttonClicked();\r
-findVisibleView();\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testShowScriptsTab = function()\r
-{\r
-this.showPanel("scripts");\r
-var test = this;\r
-\r
-this._waitUntilScriptsAreParsed(["debugger_test_page.html"],\r
-function() {\r
-test.releaseControl();\r
-});\r
-\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function()\r
-{\r
-var test = this;\r
-this.assertEquals(WebInspector.panels.elements, WebInspector.currentPanel, "Elements panel should be current one.");\r
-\r
-this.addSniffer(WebInspector.panels.scripts, "reset", waitUntilScriptIsParsed);\r
-\r
-\r
-test.evaluateInConsole_(\r
-"window.location.reload(true);",\r
-function(resultText) {});\r
-\r
-function waitUntilScriptIsParsed() {\r
-test.showPanel("scripts");\r
-test._waitUntilScriptsAreParsed(["debugger_test_page.html"],\r
-function() {\r
-test.releaseControl();\r
-});\r
-}\r
-\r
-\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testContentScriptIsPresent = function()\r
-{\r
-this.showPanel("scripts");\r
-var test = this;\r
-\r
-test._waitUntilScriptsAreParsed(\r
-["page_with_content_script.html", "simple_content_script.js"],\r
-function() {\r
-test.releaseControl();\r
-});\r
-\r
-\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()\r
-{\r
-var test = this;\r
-\r
-\r
-\r
-\r
-var expectedScriptsCount = 2;\r
-var parsedScripts = [];\r
-\r
-this.showPanel("scripts");\r
-\r
-\r
-function switchToElementsTab() {\r
-test.showPanel("elements");\r
-setTimeout(switchToScriptsTab, 0);\r
-}\r
-\r
-function switchToScriptsTab() {\r
-test.showPanel("scripts");\r
-setTimeout(checkScriptsPanel, 0);\r
-}\r
-\r
-function checkScriptsPanel() {\r
-test.assertTrue(!!WebInspector.panels.scripts.visibleView, "No visible script view.");\r
-test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]), "Some scripts are missing.");\r
-checkNoDuplicates();\r
-test.releaseControl();\r
-}\r
-\r
-function checkNoDuplicates() {\r
-var scriptSelect = document.getElementById("scripts-files");\r
-var options = scriptSelect.options;\r
-for (var i = 0; i < options.length; i++) {\r
-var scriptName = options[i].text;\r
-for (var j = i + 1; j < options.length; j++)\r
-test.assertTrue(scriptName !== options[j].text, "Found script duplicates: " + test.optionsToString_(options));\r
-}\r
-}\r
-\r
-test._waitUntilScriptsAreParsed(\r
-["debugger_test_page.html"],\r
-function() {\r
-checkNoDuplicates();\r
-setTimeout(switchToElementsTab, 0);\r
-});\r
-\r
-\r
-\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-\r
-TestSuite.prototype.testPauseWhenLoadingDevTools = function()\r
-{\r
-this.showPanel("scripts");\r
-var test = this;\r
-\r
-var expectations = {\r
-functionsOnStack: ["callDebugger"],\r
-lineNumber: 8,\r
-lineText: "  debugger;"\r
-};\r
-\r
-\r
-\r
-if (WebInspector.currentPanel.paused) {\r
-var callFrame = WebInspector.currentPanel.sidebarPanes.callstack.selectedCallFrame;\r
-this.assertEquals(expectations.functionsOnStack[0], callFrame.functionName);\r
-var callbackInvoked = false;\r
-this._checkSourceFrameWhenLoaded(expectations, function() {\r
-callbackInvoked = true;\r
-if (test.controlTaken_)\r
-test.releaseControl();\r
-});\r
-if (!callbackInvoked) {\r
-test.takeControl();\r
-}\r
-return;\r
-}\r
-\r
-this._waitForScriptPause(\r
-{\r
-functionsOnStack: ["callDebugger"],\r
-lineNumber: 8,\r
-lineText: "  debugger;"\r
-},\r
-function() {\r
-test.releaseControl();\r
-});\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-\r
-TestSuite.prototype.testPauseWhenScriptIsRunning = function()\r
-{\r
-this.showPanel("scripts");\r
-var test = this;\r
-\r
-test.evaluateInConsole_(\r
-'setTimeout("handleClick()" , 0)',\r
-function(resultText) {\r
-test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);\r
-testScriptPauseAfterDelay();\r
-});\r
-\r
-\r
-\r
-function testScriptPauseAfterDelay() {\r
-setTimeout(testScriptPause, 300);\r
-}\r
-\r
-function testScriptPause() {\r
-\r
-\r
-WebInspector.panels.scripts.pauseButton.click();\r
-\r
-test._waitForScriptPause(\r
-{\r
-functionsOnStack: ["handleClick", ""],\r
-lineNumber: 5,\r
-lineText: "  while(true) {"\r
-},\r
-function() {\r
-test.releaseControl();\r
-});\r
-}\r
-\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.optionsToString_ = function(options)\r
-{\r
-var names = [];\r
-for (var i = 0; i < options.length; i++)\r
-names.push('"' + options[i].text + '"');\r
-return names.join(",");\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.showMainPageScriptSource_ = function(scriptName, callback)\r
-{\r
-var test = this;\r
-\r
-var scriptSelect = document.getElementById("scripts-files");\r
-var options = scriptSelect.options;\r
-\r
-test.assertTrue(options.length, "Scripts list is empty");\r
-\r
-\r
-var scriptResource;\r
-if (options[scriptSelect.selectedIndex].text === scriptName)\r
-scriptResource = options[scriptSelect.selectedIndex].representedObject;\r
-else {\r
-var pageScriptIndex = -1;\r
-for (var i = 0; i < options.length; i++) {\r
-if (options[i].text === scriptName) {\r
-pageScriptIndex = i;\r
-break;\r
-}\r
-}\r
-test.assertTrue(-1 !== pageScriptIndex, "Script with url " + scriptName + " not found among " + test.optionsToString_(options));\r
-scriptResource = options[pageScriptIndex].representedObject;\r
-\r
-\r
-WebInspector.currentPanel._showScriptOrResource(scriptResource);\r
-test.assertEquals(pageScriptIndex, scriptSelect.selectedIndex, "Unexpected selected option index.");\r
-}\r
-\r
-test.assertTrue(scriptResource instanceof WebInspector.Resource,\r
-"Unexpected resource class.");\r
-test.assertTrue(!!scriptResource.url, "Resource URL is null.");\r
-test.assertTrue(scriptResource.url.search(scriptName + "$") !== -1, "Main HTML resource should be selected.");\r
-\r
-var scriptsPanel = WebInspector.panels.scripts;\r
-\r
-var view = scriptsPanel.visibleView;\r
-test.assertTrue(view instanceof WebInspector.SourceView);\r
-\r
-if (!view.sourceFrame._loaded) {\r
-test.addSniffer(view, "_sourceFrameSetupFinished", function(event) {\r
-callback(view, scriptResource.url);\r
-});\r
-} else\r
-callback(view, scriptResource.url);\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.evaluateInConsole_ = function(code, callback)\r
-{\r
-WebInspector.showConsole();\r
-WebInspector.console.prompt.text = code;\r
-WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));\r
-\r
-this.addSniffer(WebInspector.ConsoleView.prototype, "addMessage",\r
-function(commandResult) {\r
-callback(commandResult.toMessageElement().textContent);\r
-});\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testCompletionOnPause = function()\r
-{\r
-this.showPanel("scripts");\r
-var test = this;\r
-this._executeCodeWhenScriptsAreParsed("handleClick()", ["completion_on_pause.html"]);\r
-\r
-this._waitForScriptPause(\r
-{\r
-functionsOnStack: ["innerFunction", "handleClick", ""],\r
-lineNumber: 9,\r
-lineText: "    debugger;"\r
-},\r
-showConsole);\r
-\r
-function showConsole() {\r
-if (WebInspector.currentFocusElement === WebInspector.console.promptElement)\r
-testLocalsCompletion();\r
-else {\r
-test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion);\r
-WebInspector.showConsole();\r
-}\r
-}\r
-\r
-function testLocalsCompletion() {\r
-checkCompletions("th", ["parameter1", "closureLocal", "p", "createClosureLocal"], testThisCompletion);\r
-}\r
-\r
-function testThisCompletion() {\r
-checkCompletions("this.", ["field1", "field2", "m"], testFieldCompletion);\r
-}\r
-\r
-function testFieldCompletion() {\r
-checkCompletions("this.field1.", ["id", "name"], function() { test.releaseControl(); });\r
-}\r
-\r
-function checkCompletions(expression, expectedProperties, callback) {\r
-test.addSniffer(WebInspector.console, "_reportCompletions",\r
-function(bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix, result, isException) {\r
-test.assertTrue(!isException, "Exception while collecting completions");\r
-for (var i = 0; i < expectedProperties.length; i++) {\r
-var name = expectedProperties[i];\r
-test.assertTrue(result[name], "Name " + name + " not found among the completions: " + JSON.stringify(result));\r
-}\r
-setTimeout(callback, 0);\r
-});\r
-WebInspector.console.prompt.text = expression;\r
-WebInspector.console.prompt.autoCompleteSoon();\r
-}\r
-\r
-this.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype._checkExecutionLine = function(sourceFrame, lineNumber, lineContent)\r
-{\r
-this.assertEquals(lineNumber, sourceFrame.executionLine, "Unexpected execution line number.");\r
-this.assertEquals(lineContent, sourceFrame._textModel.line(lineNumber - 1), "Unexpected execution line text.");\r
-}\r
-\r
-\r
-\r
-TestSuite.prototype._scriptsAreParsed = function(expected)\r
-{\r
-var scriptSelect = document.getElementById("scripts-files");\r
-var options = scriptSelect.options;\r
-\r
-\r
-var missing = expected.slice(0);\r
-for (var i = 0 ; i < options.length; i++) {\r
-for (var j = 0; j < missing.length; j++) {\r
-if (options[i].text.search(missing[j]) !== -1) {\r
-missing.splice(j, 1);\r
-break;\r
-}\r
-}\r
-}\r
-return missing.length === 0;\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype._waitForScriptPause = function(expectations, callback)\r
-{\r
-var test = this;\r
-\r
-test.addSniffer(\r
-WebInspector.debuggerModel,\r
-"pausedScript",\r
-function(details) {\r
-var callFrames = details.callFrames;\r
-var functionsOnStack = [];\r
-for (var i = 0; i < callFrames.length; i++)\r
-functionsOnStack.push(callFrames[i].functionName);\r
-\r
-test.assertEquals(expectations.functionsOnStack.join(","), functionsOnStack.join(","), "Unexpected stack.");\r
-\r
-\r
-\r
-test._checkSourceFrameWhenLoaded(expectations, callback);\r
-});\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype._checkSourceFrameWhenLoaded = function(expectations, callback)\r
-{\r
-var test = this;\r
-\r
-var frame = WebInspector.currentPanel.visibleView.sourceFrame;\r
-if (frame._loaded)\r
-checkExecLine();\r
-else {\r
-setTimeout(function() {\r
-test._checkSourceFrameWhenLoaded(expectations, callback);\r
-}, 100);\r
-}\r
-function checkExecLine() {\r
-test._checkExecutionLine(frame, expectations.lineNumber, expectations.lineText);\r
-callback();\r
-}\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype._executeCodeWhenScriptsAreParsed = function(code, expectedScripts)\r
-{\r
-var test = this;\r
-\r
-function executeFunctionInInspectedPage() {\r
-\r
-\r
-test.evaluateInConsole_(\r
-'setTimeout("' + code + '" , 0)',\r
-function(resultText) {\r
-test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText + ". Code: " + code);\r
-});\r
-}\r
-\r
-test._waitUntilScriptsAreParsed(expectedScripts, executeFunctionInInspectedPage);\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callback)\r
-{\r
-var test = this;\r
-\r
-function waitForAllScripts() {\r
-if (test._scriptsAreParsed(expectedScripts))\r
-callback();\r
-else\r
-test.addSniffer(WebInspector.debuggerModel, "parsedScriptSource", waitForAllScripts);\r
-}\r
-\r
-waitForAllScripts();\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype._hookGetPropertiesCallback = function(hook, code)\r
-{\r
-var accessor = InjectedScriptAccess.prototype;\r
-var orig = accessor.getProperties;\r
-accessor.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate, callback) {\r
-orig.call(this, objectProxy, ignoreHasOwnProperty, abbreviate,\r
-function() {\r
-callback.apply(this, arguments);\r
-hook();\r
-});\r
-};\r
-try {\r
-code();\r
-} finally {\r
-accessor.getProperties = orig;\r
-}\r
-};\r
-\r
-\r
-\r
-TestSuite.prototype.testPauseInEval = function()\r
-{\r
-this.showPanel("scripts");\r
-\r
-var test = this;\r
-\r
-var pauseButton = document.getElementById("scripts-pause");\r
-pauseButton.click();\r
-\r
-devtools.tools.evaluateJavaScript("fib(10)");\r
-\r
-this.addSniffer(WebInspector.debuggerModel, "pausedScript",\r
-function() {\r
-test.releaseControl();\r
-});\r
-\r
-test.takeControl();\r
-};\r
-\r
-\r
-\r
-TestSuite.createKeyEvent = function(keyIdentifier)\r
-{\r
-var evt = document.createEvent("KeyboardEvent");\r
-evt.initKeyboardEvent("keydown", true  , true  , null  , keyIdentifier, "");\r
-return evt;\r
-};\r
-\r
-\r
-\r
-var uiTests = {};\r
-\r
-\r
-\r
-uiTests.runAllTests = function()\r
-{\r
-\r
-for (var name in TestSuite.prototype) {\r
-if (name.substring(0, 4) === "test" && typeof TestSuite.prototype[name] === "function")\r
-uiTests.runTest(name);\r
-}\r
-};\r
-\r
-\r
-\r
-uiTests.runTest = function(name)\r
-{\r
-if (uiTests._populatedInterface)\r
-new TestSuite().runTest(name);\r
-else\r
-uiTests._pendingTestName = name;\r
-};\r
-\r
-(function() {\r
-\r
-function runTests()\r
-{\r
-uiTests._populatedInterface = true;\r
-var name = uiTests._pendingTestName;\r
-delete uiTests._pendingTestName;\r
-if (name)\r
-new TestSuite().runTest(name);\r
-}\r
-\r
-var oldShowElementsPanel = WebInspector.showElementsPanel;\r
-WebInspector.showElementsPanel = function()\r
-{\r
-oldShowElementsPanel.call(this);\r
-runTests();\r
-}\r
-\r
-var oldShowPanel = WebInspector.showPanel;\r
-WebInspector.showPanel = function(name)\r
-{\r
-oldShowPanel.call(this, name);\r
-runTests();\r
-}\r
-\r
-})();\r
-\r
-}\r
-\r
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ElementsPanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ElementsPanel.js
new file mode 100644 (file)
index 0000000..af7e48a
--- /dev/null
@@ -0,0 +1,1551 @@
+WebInspector.DOMSyntaxHighlighter=function(mimeType,stripExtraWhitespace)
+{this._mimeType=mimeType;this._stripExtraWhitespace=stripExtraWhitespace;}
+WebInspector.DOMSyntaxHighlighter.prototype={createSpan:function(content,className)
+{var span=document.createElement("span");span.className="cm-"+className;if(this._stripExtraWhitespace&&className!=="whitespace")
+content=content.replace(/^[\n\r]*/,"").replace(/\s*$/,"");span.appendChild(document.createTextNode(content));return span;},syntaxHighlightNode:function(node)
+{var lines=node.textContent.split("\n");node.removeChildren();function processToken(token,tokenType,column,newColumn)
+{if(!tokenType)
+return;if(column>plainTextStart){var plainText=line.substring(plainTextStart,column);node.appendChild(document.createTextNode(plainText));}
+node.appendChild(this.createSpan(token,tokenType));plainTextStart=newColumn;}
+var tokenize=WebInspector.moduleManager.instance(WebInspector.TokenizerFactory).createTokenizer(this._mimeType);for(var i=lines[0].length?0:1;i<lines.length;++i){var line=lines[i];var plainTextStart=0;tokenize(line,processToken.bind(this));if(plainTextStart<line.length){var plainText=line.substring(plainTextStart,line.length);node.appendChild(document.createTextNode(plainText));}
+if(i<lines.length-1)
+node.appendChild(document.createElement("br"));}}};WebInspector.ElementsTreeOutline=function(omitRootDOMNode,selectEnabled,contextMenuCallback,setPseudoClassCallback)
+{this.element=document.createElement("ol");this.element.className="elements-tree-outline";this.element.addEventListener("mousedown",this._onmousedown.bind(this),false);this.element.addEventListener("mousemove",this._onmousemove.bind(this),false);this.element.addEventListener("mouseout",this._onmouseout.bind(this),false);this.element.addEventListener("dragstart",this._ondragstart.bind(this),false);this.element.addEventListener("dragover",this._ondragover.bind(this),false);this.element.addEventListener("dragleave",this._ondragleave.bind(this),false);this.element.addEventListener("drop",this._ondrop.bind(this),false);this.element.addEventListener("dragend",this._ondragend.bind(this),false);this.element.addEventListener("keydown",this._onkeydown.bind(this),false);TreeOutline.call(this,this.element);this._includeRootDOMNode=!omitRootDOMNode;this._selectEnabled=selectEnabled;this._rootDOMNode=null;this._selectedDOMNode=null;this._eventSupport=new WebInspector.Object();this._visible=false;this.element.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),true);this._contextMenuCallback=contextMenuCallback;this._setPseudoClassCallback=setPseudoClassCallback;this._createNodeDecorators();}
+WebInspector.ElementsTreeOutline.Events={SelectedNodeChanged:"SelectedNodeChanged",ElementsTreeUpdated:"ElementsTreeUpdated"}
+WebInspector.ElementsTreeOutline.MappedCharToEntity={"\u00a0":"nbsp","\u2002":"ensp","\u2003":"emsp","\u2009":"thinsp","\u200a":"#8202","\u200b":"#8203","\u200c":"zwnj","\u200d":"zwj","\u200e":"lrm","\u200f":"rlm","\u202a":"#8234","\u202b":"#8235","\u202c":"#8236","\u202d":"#8237","\u202e":"#8238"}
+WebInspector.ElementsTreeOutline.prototype={setVisibleWidth:function(width)
+{this._visibleWidth=width;if(this._multilineEditing)
+this._multilineEditing.setWidth(this._visibleWidth);},_createNodeDecorators:function()
+{this._nodeDecorators=[];this._nodeDecorators.push(new WebInspector.ElementsTreeOutline.PseudoStateDecorator());},wireToDomAgent:function()
+{this._elementsTreeUpdater=new WebInspector.ElementsTreeUpdater(this);},setVisible:function(visible)
+{this._visible=visible;if(!this._visible)
+return;this._updateModifiedNodes();if(this._selectedDOMNode)
+this._revealAndSelectNode(this._selectedDOMNode,false);},addEventListener:function(eventType,listener,thisObject)
+{this._eventSupport.addEventListener(eventType,listener,thisObject);},removeEventListener:function(eventType,listener,thisObject)
+{this._eventSupport.removeEventListener(eventType,listener,thisObject);},get rootDOMNode()
+{return this._rootDOMNode;},set rootDOMNode(x)
+{if(this._rootDOMNode===x)
+return;this._rootDOMNode=x;this._isXMLMimeType=x&&x.isXMLNode();this.update();},get isXMLMimeType()
+{return this._isXMLMimeType;},selectedDOMNode:function()
+{return this._selectedDOMNode;},selectDOMNode:function(node,focus)
+{if(this._selectedDOMNode===node){this._revealAndSelectNode(node,!focus);return;}
+this._selectedDOMNode=node;this._revealAndSelectNode(node,!focus);if(this._selectedDOMNode===node)
+this._selectedNodeChanged();},editing:function()
+{var node=this.selectedDOMNode();if(!node)
+return false;var treeElement=this.findTreeElement(node);if(!treeElement)
+return false;return treeElement._editing||false;},update:function()
+{var selectedNode=this.selectedTreeElement?this.selectedTreeElement._node:null;this.removeChildren();if(!this.rootDOMNode)
+return;var treeElement;if(this._includeRootDOMNode){treeElement=new WebInspector.ElementsTreeElement(this.rootDOMNode);treeElement.selectable=this._selectEnabled;this.appendChild(treeElement);}else{var node=this.rootDOMNode.firstChild;while(node){treeElement=new WebInspector.ElementsTreeElement(node);treeElement.selectable=this._selectEnabled;this.appendChild(treeElement);node=node.nextSibling;}}
+if(selectedNode)
+this._revealAndSelectNode(selectedNode,true);},updateSelection:function()
+{if(!this.selectedTreeElement)
+return;var element=this.treeOutline.selectedTreeElement;element.updateSelection();},updateOpenCloseTags:function(node)
+{var treeElement=this.findTreeElement(node);if(treeElement)
+treeElement.updateTitle();var children=treeElement.children;var closingTagElement=children[children.length-1];if(closingTagElement&&closingTagElement._elementCloseTag)
+closingTagElement.updateTitle();},_selectedNodeChanged:function()
+{this._eventSupport.dispatchEventToListeners(WebInspector.ElementsTreeOutline.Events.SelectedNodeChanged,this._selectedDOMNode);},_fireElementsTreeUpdated:function(nodes)
+{this._eventSupport.dispatchEventToListeners(WebInspector.ElementsTreeOutline.Events.ElementsTreeUpdated,nodes);},findTreeElement:function(node)
+{function isAncestorNode(ancestor,node)
+{return ancestor.isAncestor(node);}
+function parentNode(node)
+{return node.parentNode;}
+var treeElement=TreeOutline.prototype.findTreeElement.call(this,node,isAncestorNode,parentNode);if(!treeElement&&node.nodeType()===Node.TEXT_NODE){treeElement=TreeOutline.prototype.findTreeElement.call(this,node.parentNode,isAncestorNode,parentNode);}
+return treeElement;},createTreeElementFor:function(node)
+{var treeElement=this.findTreeElement(node);if(treeElement)
+return treeElement;if(!node.parentNode)
+return null;treeElement=this.createTreeElementFor(node.parentNode);return treeElement?treeElement._showChild(node):null;},set suppressRevealAndSelect(x)
+{if(this._suppressRevealAndSelect===x)
+return;this._suppressRevealAndSelect=x;},_revealAndSelectNode:function(node,omitFocus)
+{if(this._suppressRevealAndSelect)
+return;if(!this._includeRootDOMNode&&node===this.rootDOMNode&&this.rootDOMNode)
+node=this.rootDOMNode.firstChild;if(!node)
+return;var treeElement=this.createTreeElementFor(node);if(!treeElement)
+return;treeElement.revealAndSelect(omitFocus);},_treeElementFromEvent:function(event)
+{var scrollContainer=this.element.parentElement;var x=scrollContainer.totalOffsetLeft()+scrollContainer.offsetWidth-36;var y=event.pageY;var elementUnderMouse=this.treeElementFromPoint(x,y);var elementAboveMouse=this.treeElementFromPoint(x,y-2);var element;if(elementUnderMouse===elementAboveMouse)
+element=elementUnderMouse;else
+element=this.treeElementFromPoint(x,y+2);return element;},_onmousedown:function(event)
+{var element=this._treeElementFromEvent(event);if(!element||element.isEventWithinDisclosureTriangle(event))
+return;element.select();},_onmousemove:function(event)
+{var element=this._treeElementFromEvent(event);if(element&&this._previousHoveredElement===element)
+return;if(this._previousHoveredElement){this._previousHoveredElement.hovered=false;delete this._previousHoveredElement;}
+if(element){element.hovered=true;this._previousHoveredElement=element;}
+WebInspector.domModel.highlightDOMNode(element&&element._node?element._node.id:0);},_onmouseout:function(event)
+{var nodeUnderMouse=document.elementFromPoint(event.pageX,event.pageY);if(nodeUnderMouse&&nodeUnderMouse.isDescendant(this.element))
+return;if(this._previousHoveredElement){this._previousHoveredElement.hovered=false;delete this._previousHoveredElement;}
+WebInspector.domModel.hideDOMNodeHighlight();},_ondragstart:function(event)
+{if(!window.getSelection().isCollapsed)
+return false;if(event.target.nodeName==="A")
+return false;var treeElement=this._treeElementFromEvent(event);if(!treeElement)
+return false;if(!this._isValidDragSourceOrTarget(treeElement))
+return false;if(treeElement._node.nodeName()==="BODY"||treeElement._node.nodeName()==="HEAD")
+return false;event.dataTransfer.setData("text/plain",treeElement.listItemElement.textContent);event.dataTransfer.effectAllowed="copyMove";this._treeElementBeingDragged=treeElement;WebInspector.domModel.hideDOMNodeHighlight();return true;},_ondragover:function(event)
+{if(!this._treeElementBeingDragged)
+return false;var treeElement=this._treeElementFromEvent(event);if(!this._isValidDragSourceOrTarget(treeElement))
+return false;var node=treeElement._node;while(node){if(node===this._treeElementBeingDragged._node)
+return false;node=node.parentNode;}
+treeElement.updateSelection();treeElement.listItemElement.classList.add("elements-drag-over");this._dragOverTreeElement=treeElement;event.preventDefault();event.dataTransfer.dropEffect='move';return false;},_ondragleave:function(event)
+{this._clearDragOverTreeElementMarker();event.preventDefault();return false;},_isValidDragSourceOrTarget:function(treeElement)
+{if(!treeElement)
+return false;var node=treeElement.representedObject;if(!(node instanceof WebInspector.DOMNode))
+return false;if(!node.parentNode||node.parentNode.nodeType()!==Node.ELEMENT_NODE)
+return false;return true;},_ondrop:function(event)
+{event.preventDefault();var treeElement=this._treeElementFromEvent(event);if(treeElement)
+this._doMove(treeElement);},_doMove:function(treeElement)
+{if(!this._treeElementBeingDragged)
+return;var parentNode;var anchorNode;if(treeElement._elementCloseTag){parentNode=treeElement._node;}else{var dragTargetNode=treeElement._node;parentNode=dragTargetNode.parentNode;anchorNode=dragTargetNode;}
+var wasExpanded=this._treeElementBeingDragged.expanded;this._treeElementBeingDragged._node.moveTo(parentNode,anchorNode,this._selectNodeAfterEdit.bind(this,wasExpanded));delete this._treeElementBeingDragged;},_ondragend:function(event)
+{event.preventDefault();this._clearDragOverTreeElementMarker();delete this._treeElementBeingDragged;},_clearDragOverTreeElementMarker:function()
+{if(this._dragOverTreeElement){this._dragOverTreeElement.updateSelection();this._dragOverTreeElement.listItemElement.classList.remove("elements-drag-over");delete this._dragOverTreeElement;}},_onkeydown:function(event)
+{var keyboardEvent=(event);var node=(this.selectedDOMNode());console.assert(node);var treeElement=this.getCachedTreeElement(node);if(!treeElement)
+return;if(!treeElement._editing&&WebInspector.KeyboardShortcut.hasNoModifiers(keyboardEvent)&&keyboardEvent.keyCode===WebInspector.KeyboardShortcut.Keys.H.code){this._toggleHideShortcut(node);event.consume(true);return;}},_contextMenuEventFired:function(event)
+{var treeElement=this._treeElementFromEvent(event);if(!treeElement)
+return;var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(treeElement._node);contextMenu.show();},populateContextMenu:function(contextMenu,event)
+{var treeElement=this._treeElementFromEvent(event);if(!treeElement)
+return;var isPseudoElement=!!treeElement._node.pseudoType();var isTag=treeElement._node.nodeType()===Node.ELEMENT_NODE&&!isPseudoElement;var textNode=event.target.enclosingNodeOrSelfWithClass("webkit-html-text-node");if(textNode&&textNode.classList.contains("bogus"))
+textNode=null;var commentNode=event.target.enclosingNodeOrSelfWithClass("webkit-html-comment");contextMenu.appendApplicableItems(event.target);if(textNode){contextMenu.appendSeparator();treeElement._populateTextContextMenu(contextMenu,textNode);}else if(isTag){contextMenu.appendSeparator();treeElement._populateTagContextMenu(contextMenu,event);}else if(commentNode){contextMenu.appendSeparator();treeElement._populateNodeContextMenu(contextMenu,textNode);}else if(isPseudoElement){treeElement._populateScrollIntoView(contextMenu);}else if(treeElement._node.isShadowRoot()){this.treeOutline._populateContextMenu(contextMenu,treeElement._node);}},_updateModifiedNodes:function()
+{if(this._elementsTreeUpdater)
+this._elementsTreeUpdater._updateModifiedNodes();},_populateContextMenu:function(contextMenu,node)
+{if(this._contextMenuCallback)
+this._contextMenuCallback(contextMenu,node);},handleShortcut:function(event)
+{var node=this.selectedDOMNode();var treeElement=this.getCachedTreeElement(node);if(!node||!treeElement)
+return;if(event.keyIdentifier==="F2"&&treeElement.hasEditableNode()){this._toggleEditAsHTML(node);event.handled=true;return;}
+if(WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event)&&node.parentNode){if(event.keyIdentifier==="Up"&&node.previousSibling){node.moveTo(node.parentNode,node.previousSibling,this._selectNodeAfterEdit.bind(this,treeElement.expanded));event.handled=true;return;}
+if(event.keyIdentifier==="Down"&&node.nextSibling){node.moveTo(node.parentNode,node.nextSibling.nextSibling,this._selectNodeAfterEdit.bind(this,treeElement.expanded));event.handled=true;return;}}},_toggleEditAsHTML:function(node)
+{var treeElement=this.getCachedTreeElement(node);if(!treeElement)
+return;if(treeElement._editing&&treeElement._htmlEditElement&&WebInspector.isBeingEdited(treeElement._htmlEditElement))
+treeElement._editing.commit();else
+treeElement._editAsHTML();},_selectNodeAfterEdit:function(wasExpanded,error,nodeId)
+{if(error)
+return;this._updateModifiedNodes();var newNode=nodeId?WebInspector.domModel.nodeForId(nodeId):null;if(!newNode)
+return;this.selectDOMNode(newNode,true);var newTreeItem=this.findTreeElement(newNode);if(wasExpanded){if(newTreeItem)
+newTreeItem.expand();}
+return newTreeItem;},_toggleHideShortcut:function(node,userCallback)
+{var pseudoType=node.pseudoType();var effectiveNode=pseudoType?node.parentNode:node;if(!effectiveNode)
+return;function resolvedNode(object)
+{if(!object)
+return;function toggleClassAndInjectStyleRule(pseudoType)
+{const classNamePrefix="__web-inspector-hide";const classNameSuffix="-shortcut__";const styleTagId="__web-inspector-hide-shortcut-style__";const styleRules=".__web-inspector-hide-shortcut__, .__web-inspector-hide-shortcut__ * { visibility: hidden !important; } .__web-inspector-hidebefore-shortcut__::before { visibility: hidden !important; } .__web-inspector-hideafter-shortcut__::after { visibility: hidden !important; }";var className=classNamePrefix+(pseudoType||"")+classNameSuffix;this.classList.toggle(className);var style=document.head.querySelector("style#"+styleTagId);if(style)
+return;style=document.createElement("style");style.id=styleTagId;style.type="text/css";style.textContent=styleRules;document.head.appendChild(style);}
+object.callFunction(toggleClassAndInjectStyleRule,[{value:pseudoType}],userCallback);object.release();}
+WebInspector.RemoteObject.resolveNode(effectiveNode,"",resolvedNode);},__proto__:TreeOutline.prototype}
+WebInspector.ElementsTreeOutline.ElementDecorator=function()
+{}
+WebInspector.ElementsTreeOutline.ElementDecorator.prototype={decorate:function(node)
+{},decorateAncestor:function(node)
+{}}
+WebInspector.ElementsTreeOutline.PseudoStateDecorator=function()
+{WebInspector.ElementsTreeOutline.ElementDecorator.call(this);}
+WebInspector.ElementsTreeOutline.PseudoStateDecorator.PropertyName="pseudoState";WebInspector.ElementsTreeOutline.PseudoStateDecorator.prototype={decorate:function(node)
+{if(node.nodeType()!==Node.ELEMENT_NODE)
+return null;var propertyValue=node.getUserProperty(WebInspector.ElementsTreeOutline.PseudoStateDecorator.PropertyName);if(!propertyValue)
+return null;return WebInspector.UIString("Element state: %s",":"+propertyValue.join(", :"));},decorateAncestor:function(node)
+{if(node.nodeType()!==Node.ELEMENT_NODE)
+return null;var descendantCount=node.descendantUserPropertyCount(WebInspector.ElementsTreeOutline.PseudoStateDecorator.PropertyName);if(!descendantCount)
+return null;if(descendantCount===1)
+return WebInspector.UIString("%d descendant with forced state",descendantCount);return WebInspector.UIString("%d descendants with forced state",descendantCount);}}
+WebInspector.ElementsTreeElement=function(node,elementCloseTag)
+{TreeElement.call(this,"",node);this._node=node;this._elementCloseTag=elementCloseTag;this._updateHasChildren();if(this._node.nodeType()==Node.ELEMENT_NODE&&!elementCloseTag)
+this._canAddAttributes=true;this._searchQuery=null;this._expandedChildrenLimit=WebInspector.ElementsTreeElement.InitialChildrenLimit;}
+WebInspector.ElementsTreeElement.InitialChildrenLimit=500;WebInspector.ElementsTreeElement.ForbiddenClosingTagElements=["area","base","basefont","br","canvas","col","command","embed","frame","hr","img","input","keygen","link","meta","param","source"].keySet();WebInspector.ElementsTreeElement.EditTagBlacklist=["html","head","body"].keySet();WebInspector.ElementsTreeElement.prototype={highlightSearchResults:function(searchQuery)
+{if(this._searchQuery!==searchQuery){this._updateSearchHighlight(false);delete this._highlightResult;}
+this._searchQuery=searchQuery;this._searchHighlightsVisible=true;this.updateTitle(true);},hideSearchHighlights:function()
+{delete this._searchHighlightsVisible;this._updateSearchHighlight(false);},_updateSearchHighlight:function(show)
+{if(!this._highlightResult)
+return;function updateEntryShow(entry)
+{switch(entry.type){case"added":entry.parent.insertBefore(entry.node,entry.nextSibling);break;case"changed":entry.node.textContent=entry.newText;break;}}
+function updateEntryHide(entry)
+{switch(entry.type){case"added":entry.node.remove();break;case"changed":entry.node.textContent=entry.oldText;break;}}
+if(show){for(var i=0,size=this._highlightResult.length;i<size;++i)
+updateEntryShow(this._highlightResult[i]);}else{for(var i=(this._highlightResult.length-1);i>=0;--i)
+updateEntryHide(this._highlightResult[i]);}},get hovered()
+{return this._hovered;},set hovered(x)
+{if(this._hovered===x)
+return;this._hovered=x;if(this.listItemElement){if(x){this.updateSelection();this.listItemElement.classList.add("hovered");}else{this.listItemElement.classList.remove("hovered");}}},get expandedChildrenLimit()
+{return this._expandedChildrenLimit;},set expandedChildrenLimit(x)
+{if(this._expandedChildrenLimit===x)
+return;this._expandedChildrenLimit=x;if(this.treeOutline&&!this._updateChildrenInProgress)
+this._updateChildren(true);},get expandedChildCount()
+{var count=this.children.length;if(count&&this.children[count-1]._elementCloseTag)
+count--;if(count&&this.children[count-1].expandAllButton)
+count--;return count;},_showChild:function(child)
+{if(this._elementCloseTag)
+return null;var index=this._visibleChildren().indexOf(child);if(index===-1)
+return null;if(index>=this.expandedChildrenLimit){this._expandedChildrenLimit=index+1;this._updateChildren(true);}
+return this.expandedChildCount>index?this.children[index]:null;},updateSelection:function()
+{var listItemElement=this.listItemElement;if(!listItemElement)
+return;if(!this._readyToUpdateSelection){if(document.body.offsetWidth>0)
+this._readyToUpdateSelection=true;else{return;}}
+if(!this.selectionElement){this.selectionElement=document.createElement("div");this.selectionElement.className="selection selected";listItemElement.insertBefore(this.selectionElement,listItemElement.firstChild);}
+this.selectionElement.style.height=listItemElement.offsetHeight+"px";},onattach:function()
+{if(this._hovered){this.updateSelection();this.listItemElement.classList.add("hovered");}
+this.updateTitle();this._preventFollowingLinksOnDoubleClick();this.listItemElement.draggable=true;},_preventFollowingLinksOnDoubleClick:function()
+{var links=this.listItemElement.querySelectorAll("li .webkit-html-tag > .webkit-html-attribute > .webkit-html-external-link, li .webkit-html-tag > .webkit-html-attribute > .webkit-html-resource-link");if(!links)
+return;for(var i=0;i<links.length;++i)
+links[i].preventFollowOnDoubleClick=true;},onpopulate:function()
+{if(this.children.length||this._showInlineText()||this._elementCloseTag)
+return;this.updateChildren();},updateChildren:function(fullRefresh)
+{if(this._elementCloseTag)
+return;this._node.getChildNodes(this._updateChildren.bind(this,fullRefresh));},insertChildElement:function(child,index,closingTag)
+{var newElement=new WebInspector.ElementsTreeElement(child,closingTag);newElement.selectable=this.treeOutline._selectEnabled;this.insertChild(newElement,index);return newElement;},moveChild:function(child,targetIndex)
+{var wasSelected=child.selected;this.removeChild(child);this.insertChild(child,targetIndex);if(wasSelected)
+child.select();},_updateChildren:function(fullRefresh)
+{if(this._updateChildrenInProgress||!this.treeOutline._visible)
+return;this._updateChildrenInProgress=true;var selectedNode=this.treeOutline.selectedDOMNode();var originalScrollTop=0;if(fullRefresh){var treeOutlineContainerElement=this.treeOutline.element.parentNode;originalScrollTop=treeOutlineContainerElement.scrollTop;var selectedTreeElement=this.treeOutline.selectedTreeElement;if(selectedTreeElement&&selectedTreeElement.hasAncestor(this))
+this.select();this.removeChildren();}
+function updateChildrenOfNode()
+{var treeOutline=this.treeOutline;var visibleChildren=this._visibleChildren();var treeChildIndex=0;var elementToSelect=null;for(var i=0;i<visibleChildren.length;++i){var child=visibleChildren[i];var currentTreeElement=this.children[treeChildIndex];if(!currentTreeElement||currentTreeElement._node!==child){var existingTreeElement=null;for(var j=(treeChildIndex+1),size=this.expandedChildCount;j<size;++j){if(this.children[j]._node===child){existingTreeElement=this.children[j];break;}}
+if(existingTreeElement&&existingTreeElement.parent===this){this.moveChild(existingTreeElement,treeChildIndex);}else{if(treeChildIndex<this.expandedChildrenLimit){var newElement=this.insertChildElement(child,treeChildIndex);if(child===selectedNode)
+elementToSelect=newElement;if(this.expandedChildCount>this.expandedChildrenLimit)
+this.expandedChildrenLimit++;}}}
+++treeChildIndex;}
+return elementToSelect;}
+for(var i=(this.children.length-1);i>=0;--i){var currentChild=this.children[i];var currentNode=currentChild._node;if(!currentNode)
+continue;var currentParentNode=currentNode.parentNode;if(currentParentNode===this._node)
+continue;var selectedTreeElement=this.treeOutline.selectedTreeElement;if(selectedTreeElement&&(selectedTreeElement===currentChild||selectedTreeElement.hasAncestor(currentChild)))
+this.select();this.removeChildAtIndex(i);}
+var elementToSelect=updateChildrenOfNode.call(this);this.updateTitle();this._adjustCollapsedRange();var lastChild=this.children[this.children.length-1];if(this._node.nodeType()==Node.ELEMENT_NODE&&(!lastChild||!lastChild._elementCloseTag))
+this.insertChildElement(this._node,this.children.length,true);if(fullRefresh&&elementToSelect){elementToSelect.select();if(treeOutlineContainerElement&&originalScrollTop<=treeOutlineContainerElement.scrollHeight)
+treeOutlineContainerElement.scrollTop=originalScrollTop;}
+delete this._updateChildrenInProgress;},_adjustCollapsedRange:function()
+{var visibleChildren=this._visibleChildren();if(this.expandAllButtonElement&&this.expandAllButtonElement.__treeElement.parent)
+this.removeChild(this.expandAllButtonElement.__treeElement);const childNodeCount=visibleChildren.length;for(var i=this.expandedChildCount,limit=Math.min(this.expandedChildrenLimit,childNodeCount);i<limit;++i)
+this.insertChildElement(visibleChildren[i],i);const expandedChildCount=this.expandedChildCount;if(childNodeCount>this.expandedChildCount){var targetButtonIndex=expandedChildCount;if(!this.expandAllButtonElement){var button=document.createElement("button");button.className="show-all-nodes";button.value="";var item=new TreeElement(button,null,false);item.selectable=false;item.expandAllButton=true;this.insertChild(item,targetButtonIndex);this.expandAllButtonElement=item.listItemElement.firstChild;this.expandAllButtonElement.__treeElement=item;this.expandAllButtonElement.addEventListener("click",this.handleLoadAllChildren.bind(this),false);}else if(!this.expandAllButtonElement.__treeElement.parent)
+this.insertChild(this.expandAllButtonElement.__treeElement,targetButtonIndex);this.expandAllButtonElement.textContent=WebInspector.UIString("Show All Nodes (%d More)",childNodeCount-expandedChildCount);}else if(this.expandAllButtonElement)
+delete this.expandAllButtonElement;},handleLoadAllChildren:function()
+{this.expandedChildrenLimit=Math.max(this._visibleChildCount(),this.expandedChildrenLimit+WebInspector.ElementsTreeElement.InitialChildrenLimit);},expandRecursively:function()
+{function callback()
+{TreeElement.prototype.expandRecursively.call(this,Number.MAX_VALUE);}
+this._node.getSubtree(-1,callback.bind(this));},onexpand:function()
+{if(this._elementCloseTag)
+return;this.updateTitle();this.treeOutline.updateSelection();},oncollapse:function()
+{if(this._elementCloseTag)
+return;this.updateTitle();this.treeOutline.updateSelection();},onreveal:function()
+{if(this.listItemElement){var tagSpans=this.listItemElement.getElementsByClassName("webkit-html-tag-name");if(tagSpans.length)
+tagSpans[0].scrollIntoViewIfNeeded(true);else
+this.listItemElement.scrollIntoViewIfNeeded(true);}},onselect:function(selectedByUser)
+{this.treeOutline.suppressRevealAndSelect=true;this.treeOutline.selectDOMNode(this._node,selectedByUser);if(selectedByUser)
+WebInspector.domModel.highlightDOMNode(this._node.id);this.updateSelection();this.treeOutline.suppressRevealAndSelect=false;return true;},ondelete:function()
+{var startTagTreeElement=this.treeOutline.findTreeElement(this._node);startTagTreeElement?startTagTreeElement.remove():this.remove();return true;},onenter:function()
+{if(this._editing)
+return false;this._startEditing();return true;},selectOnMouseDown:function(event)
+{TreeElement.prototype.selectOnMouseDown.call(this,event);if(this._editing)
+return;if(this.treeOutline._showInElementsPanelEnabled){WebInspector.inspectorView.showPanel("elements");this.treeOutline.selectDOMNode(this._node,true);}
+if(event.detail>=2)
+event.preventDefault();},ondblclick:function(event)
+{if(this._editing||this._elementCloseTag)
+return false;if(this._startEditingTarget(event.target))
+return false;if(this.hasChildren&&!this.expanded)
+this.expand();return false;},hasEditableNode:function()
+{return!this.representedObject.isShadowRoot()&&!this.representedObject.ancestorUserAgentShadowRoot();},_insertInLastAttributePosition:function(tag,node)
+{if(tag.getElementsByClassName("webkit-html-attribute").length>0)
+tag.insertBefore(node,tag.lastChild);else{var nodeName=tag.textContent.match(/^<(.*?)>$/)[1];tag.textContent='';tag.appendChild(document.createTextNode('<'+nodeName));tag.appendChild(node);tag.appendChild(document.createTextNode('>'));}
+this.updateSelection();},_startEditingTarget:function(eventTarget)
+{if(this.treeOutline.selectedDOMNode()!=this._node)
+return;if(this._node.nodeType()!=Node.ELEMENT_NODE&&this._node.nodeType()!=Node.TEXT_NODE)
+return false;var textNode=eventTarget.enclosingNodeOrSelfWithClass("webkit-html-text-node");if(textNode)
+return this._startEditingTextNode(textNode);var attribute=eventTarget.enclosingNodeOrSelfWithClass("webkit-html-attribute");if(attribute)
+return this._startEditingAttribute(attribute,eventTarget);var tagName=eventTarget.enclosingNodeOrSelfWithClass("webkit-html-tag-name");if(tagName)
+return this._startEditingTagName(tagName);var newAttribute=eventTarget.enclosingNodeOrSelfWithClass("add-attribute");if(newAttribute)
+return this._addNewAttribute();return false;},_populateTagContextMenu:function(contextMenu,event)
+{var treeElement=this._elementCloseTag?this.treeOutline.findTreeElement(this._node):this;contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add attribute":"Add Attribute"),treeElement._addNewAttribute.bind(treeElement));var attribute=event.target.enclosingNodeOrSelfWithClass("webkit-html-attribute");var newAttribute=event.target.enclosingNodeOrSelfWithClass("add-attribute");if(attribute&&!newAttribute)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Edit attribute":"Edit Attribute"),this._startEditingAttribute.bind(this,attribute,event.target));contextMenu.appendSeparator();if(this.treeOutline._setPseudoClassCallback){var pseudoSubMenu=contextMenu.appendSubMenuItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Force element state":"Force Element State"));this._populateForcedPseudoStateItems(pseudoSubMenu);contextMenu.appendSeparator();}
+this._populateNodeContextMenu(contextMenu);this.treeOutline._populateContextMenu(contextMenu,this._node);this._populateScrollIntoView(contextMenu);},_populateScrollIntoView:function(contextMenu)
+{contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Scroll into view":"Scroll into View"),this._scrollIntoView.bind(this));},_populateForcedPseudoStateItems:function(subMenu)
+{const pseudoClasses=["active","hover","focus","visited"];var node=this._node;var forcedPseudoState=(node?node.getUserProperty("pseudoState"):null)||[];for(var i=0;i<pseudoClasses.length;++i){var pseudoClassForced=forcedPseudoState.indexOf(pseudoClasses[i])>=0;subMenu.appendCheckboxItem(":"+pseudoClasses[i],this.treeOutline._setPseudoClassCallback.bind(null,node.id,pseudoClasses[i],!pseudoClassForced),pseudoClassForced,false);}},_populateTextContextMenu:function(contextMenu,textNode)
+{contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Edit text":"Edit Text"),this._startEditingTextNode.bind(this,textNode));this._populateNodeContextMenu(contextMenu);},_populateNodeContextMenu:function(contextMenu)
+{var openTagElement=this.treeOutline.getCachedTreeElement(this.representedObject)||this;var isEditable=this.hasEditableNode();if(isEditable)
+contextMenu.appendItem(WebInspector.UIString("Edit as HTML"),openTagElement._editAsHTML.bind(openTagElement));var isShadowRoot=this.representedObject.isShadowRoot();if(!isShadowRoot)
+contextMenu.appendItem(WebInspector.UIString("Copy as HTML"),this._copyHTML.bind(this));if(this.representedObject.nodeType()===Node.ELEMENT_NODE)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy CSS path":"Copy CSS Path"),this._copyCSSPath.bind(this));if(!isShadowRoot)
+contextMenu.appendItem(WebInspector.UIString("Copy XPath"),this._copyXPath.bind(this));if(isEditable)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Delete node":"Delete Node"),this.remove.bind(this));},_startEditing:function()
+{if(this.treeOutline.selectedDOMNode()!==this._node)
+return;var listItem=this._listItemNode;if(this._canAddAttributes){var attribute=listItem.getElementsByClassName("webkit-html-attribute")[0];if(attribute)
+return this._startEditingAttribute(attribute,attribute.getElementsByClassName("webkit-html-attribute-value")[0]);return this._addNewAttribute();}
+if(this._node.nodeType()===Node.TEXT_NODE){var textNode=listItem.getElementsByClassName("webkit-html-text-node")[0];if(textNode)
+return this._startEditingTextNode(textNode);return;}},_addNewAttribute:function()
+{var container=document.createElement("span");this._buildAttributeDOM(container," ","");var attr=container.firstElementChild;attr.style.marginLeft="2px";attr.style.marginRight="2px";var tag=this.listItemElement.getElementsByClassName("webkit-html-tag")[0];this._insertInLastAttributePosition(tag,attr);attr.scrollIntoViewIfNeeded(true);return this._startEditingAttribute(attr,attr);},_triggerEditAttribute:function(attributeName)
+{var attributeElements=this.listItemElement.getElementsByClassName("webkit-html-attribute-name");for(var i=0,len=attributeElements.length;i<len;++i){if(attributeElements[i].textContent===attributeName){for(var elem=attributeElements[i].nextSibling;elem;elem=elem.nextSibling){if(elem.nodeType!==Node.ELEMENT_NODE)
+continue;if(elem.classList.contains("webkit-html-attribute-value"))
+return this._startEditingAttribute(elem.parentNode,elem);}}}},_startEditingAttribute:function(attribute,elementForSelection)
+{if(WebInspector.isBeingEdited(attribute))
+return true;var attributeNameElement=attribute.getElementsByClassName("webkit-html-attribute-name")[0];if(!attributeNameElement)
+return false;var attributeName=attributeNameElement.textContent;var attributeValueElement=attribute.getElementsByClassName("webkit-html-attribute-value")[0];function removeZeroWidthSpaceRecursive(node)
+{if(node.nodeType===Node.TEXT_NODE){node.nodeValue=node.nodeValue.replace(/\u200B/g,"");return;}
+if(node.nodeType!==Node.ELEMENT_NODE)
+return;for(var child=node.firstChild;child;child=child.nextSibling)
+removeZeroWidthSpaceRecursive(child);}
+var domNode;var listItemElement=attribute.enclosingNodeOrSelfWithNodeName("li");if(attributeName&&attributeValueElement&&listItemElement&&listItemElement.treeElement)
+domNode=listItemElement.treeElement.representedObject;var attributeValue=domNode?domNode.getAttribute(attributeName):undefined;if(typeof attributeValue!=="undefined")
+attributeValueElement.textContent=attributeValue;removeZeroWidthSpaceRecursive(attribute);var config=new WebInspector.InplaceEditor.Config(this._attributeEditingCommitted.bind(this),this._editingCancelled.bind(this),attributeName);function handleKeyDownEvents(event)
+{var isMetaOrCtrl=WebInspector.isMac()?event.metaKey&&!event.shiftKey&&!event.ctrlKey&&!event.altKey:event.ctrlKey&&!event.shiftKey&&!event.metaKey&&!event.altKey;if(isEnterKey(event)&&(event.isMetaOrCtrlForTest||!config.multiline||isMetaOrCtrl))
+return"commit";else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Esc.code||event.keyIdentifier==="U+001B")
+return"cancel";else if(event.keyIdentifier==="U+0009")
+return"move-"+(event.shiftKey?"backward":"forward");else{WebInspector.handleElementValueModifications(event,attribute);return"";}}
+config.customFinishHandler=handleKeyDownEvents;this._editing=WebInspector.InplaceEditor.startEditing(attribute,config);window.getSelection().setBaseAndExtent(elementForSelection,0,elementForSelection,1);return true;},_startEditingTextNode:function(textNodeElement)
+{if(WebInspector.isBeingEdited(textNodeElement))
+return true;var textNode=this._node;if(textNode.nodeType()===Node.ELEMENT_NODE&&textNode.firstChild)
+textNode=textNode.firstChild;var container=textNodeElement.enclosingNodeOrSelfWithClass("webkit-html-text-node");if(container)
+container.textContent=textNode.nodeValue();var config=new WebInspector.InplaceEditor.Config(this._textNodeEditingCommitted.bind(this,textNode),this._editingCancelled.bind(this));this._editing=WebInspector.InplaceEditor.startEditing(textNodeElement,config);window.getSelection().setBaseAndExtent(textNodeElement,0,textNodeElement,1);return true;},_startEditingTagName:function(tagNameElement)
+{if(!tagNameElement){tagNameElement=this.listItemElement.getElementsByClassName("webkit-html-tag-name")[0];if(!tagNameElement)
+return false;}
+var tagName=tagNameElement.textContent;if(WebInspector.ElementsTreeElement.EditTagBlacklist[tagName.toLowerCase()])
+return false;if(WebInspector.isBeingEdited(tagNameElement))
+return true;var closingTagElement=this._distinctClosingTagElement();function keyupListener(event)
+{if(closingTagElement)
+closingTagElement.textContent="</"+tagNameElement.textContent+">";}
+function editingComitted(element,newTagName)
+{tagNameElement.removeEventListener('keyup',keyupListener,false);this._tagNameEditingCommitted.apply(this,arguments);}
+function editingCancelled()
+{tagNameElement.removeEventListener('keyup',keyupListener,false);this._editingCancelled.apply(this,arguments);}
+tagNameElement.addEventListener('keyup',keyupListener,false);var config=new WebInspector.InplaceEditor.Config(editingComitted.bind(this),editingCancelled.bind(this),tagName);this._editing=WebInspector.InplaceEditor.startEditing(tagNameElement,config);window.getSelection().setBaseAndExtent(tagNameElement,0,tagNameElement,1);return true;},_startEditingAsHTML:function(commitCallback,error,initialValue)
+{if(error)
+return;if(this._editing)
+return;function consume(event)
+{if(event.eventPhase===Event.AT_TARGET)
+event.consume(true);}
+initialValue=this._convertWhitespaceToEntities(initialValue).text;this._htmlEditElement=document.createElement("div");this._htmlEditElement.className="source-code elements-tree-editor";var child=this.listItemElement.firstChild;while(child){child.style.display="none";child=child.nextSibling;}
+if(this._childrenListNode)
+this._childrenListNode.style.display="none";this.listItemElement.appendChild(this._htmlEditElement);this.treeOutline.childrenListElement.parentElement.addEventListener("mousedown",consume,false);this.updateSelection();function commit(element,newValue)
+{commitCallback(initialValue,newValue);dispose.call(this);}
+function dispose()
+{delete this._editing;delete this.treeOutline._multilineEditing;this.listItemElement.removeChild(this._htmlEditElement);delete this._htmlEditElement;if(this._childrenListNode)
+this._childrenListNode.style.removeProperty("display");var child=this.listItemElement.firstChild;while(child){child.style.removeProperty("display");child=child.nextSibling;}
+this.treeOutline.childrenListElement.parentElement.removeEventListener("mousedown",consume,false);this.updateSelection();this.treeOutline.element.focus();}
+var config=new WebInspector.InplaceEditor.Config(commit.bind(this),dispose.bind(this));config.setMultilineOptions(initialValue,{name:"xml",htmlMode:true},"web-inspector-html",WebInspector.settings.domWordWrap.get(),true);this._editing=WebInspector.InplaceEditor.startEditing(this._htmlEditElement,config);this._editing.setWidth(this.treeOutline._visibleWidth);this.treeOutline._multilineEditing=this._editing;},_attributeEditingCommitted:function(element,newText,oldText,attributeName,moveDirection)
+{delete this._editing;var treeOutline=this.treeOutline;function moveToNextAttributeIfNeeded(error)
+{if(error)
+this._editingCancelled(element,attributeName);if(!moveDirection)
+return;treeOutline._updateModifiedNodes();var attributes=this._node.attributes();for(var i=0;i<attributes.length;++i){if(attributes[i].name!==attributeName)
+continue;if(moveDirection==="backward"){if(i===0)
+this._startEditingTagName();else
+this._triggerEditAttribute(attributes[i-1].name);}else{if(i===attributes.length-1)
+this._addNewAttribute();else
+this._triggerEditAttribute(attributes[i+1].name);}
+return;}
+if(moveDirection==="backward"){if(newText===" "){if(attributes.length>0)
+this._triggerEditAttribute(attributes[attributes.length-1].name);}else{if(attributes.length>1)
+this._triggerEditAttribute(attributes[attributes.length-2].name);}}else if(moveDirection==="forward"){if(!/^\s*$/.test(newText))
+this._addNewAttribute();else
+this._startEditingTagName();}}
+if(!attributeName.trim()&&!newText.trim()){element.remove();moveToNextAttributeIfNeeded.call(this);return;}
+if(oldText!==newText){this._node.setAttribute(attributeName,newText,moveToNextAttributeIfNeeded.bind(this));return;}
+this.updateTitle();moveToNextAttributeIfNeeded.call(this);},_tagNameEditingCommitted:function(element,newText,oldText,tagName,moveDirection)
+{delete this._editing;var self=this;function cancel()
+{var closingTagElement=self._distinctClosingTagElement();if(closingTagElement)
+closingTagElement.textContent="</"+tagName+">";self._editingCancelled(element,tagName);moveToNextAttributeIfNeeded.call(self);}
+function moveToNextAttributeIfNeeded()
+{if(moveDirection!=="forward"){this._addNewAttribute();return;}
+var attributes=this._node.attributes();if(attributes.length>0)
+this._triggerEditAttribute(attributes[0].name);else
+this._addNewAttribute();}
+newText=newText.trim();if(newText===oldText){cancel();return;}
+var treeOutline=this.treeOutline;var wasExpanded=this.expanded;function changeTagNameCallback(error,nodeId)
+{if(error||!nodeId){cancel();return;}
+var newTreeItem=treeOutline._selectNodeAfterEdit(wasExpanded,error,nodeId);moveToNextAttributeIfNeeded.call(newTreeItem);}
+this._node.setNodeName(newText,changeTagNameCallback);},_textNodeEditingCommitted:function(textNode,element,newText)
+{delete this._editing;function callback()
+{this.updateTitle();}
+textNode.setNodeValue(newText,callback.bind(this));},_editingCancelled:function(element,context)
+{delete this._editing;this.updateTitle();},_distinctClosingTagElement:function()
+{if(this.expanded){var closers=this._childrenListNode.querySelectorAll(".close");return closers[closers.length-1];}
+var tags=this.listItemElement.getElementsByClassName("webkit-html-tag");return(tags.length===1?null:tags[tags.length-1]);},updateTitle:function(onlySearchQueryChanged)
+{if(this._editing)
+return;if(onlySearchQueryChanged){if(this._highlightResult)
+this._updateSearchHighlight(false);}else{var nodeInfo=this._nodeTitleInfo(WebInspector.linkifyURLAsNode);if(nodeInfo.shadowRoot)
+this.listItemElement.classList.add("shadow-root");var highlightElement=document.createElement("span");highlightElement.className="highlight";highlightElement.appendChild(nodeInfo.titleDOM);this.title=highlightElement;this._updateDecorations();delete this._highlightResult;}
+delete this.selectionElement;if(this.selected)
+this.updateSelection();this._preventFollowingLinksOnDoubleClick();this._highlightSearchResults();},_createDecoratorElement:function()
+{var node=this._node;var decoratorMessages=[];var parentDecoratorMessages=[];for(var i=0;i<this.treeOutline._nodeDecorators.length;++i){var decorator=this.treeOutline._nodeDecorators[i];var message=decorator.decorate(node);if(message){decoratorMessages.push(message);continue;}
+if(this.expanded||this._elementCloseTag)
+continue;message=decorator.decorateAncestor(node);if(message)
+parentDecoratorMessages.push(message)}
+if(!decoratorMessages.length&&!parentDecoratorMessages.length)
+return null;var decoratorElement=document.createElement("div");decoratorElement.classList.add("elements-gutter-decoration");if(!decoratorMessages.length)
+decoratorElement.classList.add("elements-has-decorated-children");decoratorElement.title=decoratorMessages.concat(parentDecoratorMessages).join("\n");return decoratorElement;},_updateDecorations:function()
+{if(this._decoratorElement)
+this._decoratorElement.remove();this._decoratorElement=this._createDecoratorElement();if(this._decoratorElement&&this.listItemElement)
+this.listItemElement.insertBefore(this._decoratorElement,this.listItemElement.firstChild);},_buildAttributeDOM:function(parentElement,name,value,forceValue,node,linkify)
+{var closingPunctuationRegex=/[\/;:\)\]\}]/g;var highlightIndex=0;var highlightCount;var additionalHighlightOffset=0;var result;function replacer(match,replaceOffset){while(highlightIndex<highlightCount&&result.entityRanges[highlightIndex].offset<replaceOffset){result.entityRanges[highlightIndex].offset+=additionalHighlightOffset;++highlightIndex;}
+additionalHighlightOffset+=1;return match+"\u200B";}
+function setValueWithEntities(element,value)
+{var attrValueElement=element.createChild("span","webkit-html-attribute-value");result=this._convertWhitespaceToEntities(value);highlightCount=result.entityRanges.length;value=result.text.replace(closingPunctuationRegex,replacer);while(highlightIndex<highlightCount){result.entityRanges[highlightIndex].offset+=additionalHighlightOffset;++highlightIndex;}
+attrValueElement.textContent=value;WebInspector.highlightRangesWithStyleClass(attrValueElement,result.entityRanges,"webkit-html-entity-value");}
+var hasText=(forceValue||value.length>0);var attrSpanElement=parentElement.createChild("span","webkit-html-attribute");var attrNameElement=attrSpanElement.createChild("span","webkit-html-attribute-name");attrNameElement.textContent=name;if(hasText)
+attrSpanElement.appendChild(document.createTextNode("=\u200B\""));if(linkify&&(name==="src"||name==="href")){var rewrittenHref=node.resolveURL(value);if(rewrittenHref===null){setValueWithEntities.call(this,attrSpanElement,value);}else{value=value.replace(closingPunctuationRegex,"$&\u200B");if(value.startsWith("data:"))
+value=value.trimMiddle(60);attrSpanElement.appendChild(linkify(rewrittenHref,value,"webkit-html-attribute-value",node.nodeName().toLowerCase()==="a"));}}else{setValueWithEntities.call(this,attrSpanElement,value);}
+if(hasText)
+attrSpanElement.appendChild(document.createTextNode("\""));},_buildPseudoElementDOM:function(parentElement,pseudoElementName)
+{var pseudoElement=parentElement.createChild("span","webkit-html-pseudo-element");pseudoElement.textContent="::"+pseudoElementName;parentElement.appendChild(document.createTextNode("\u200B"));},_buildTagDOM:function(parentElement,tagName,isClosingTag,isDistinctTreeElement,linkify)
+{var node=this._node;var classes=["webkit-html-tag"];if(isClosingTag&&isDistinctTreeElement)
+classes.push("close");var tagElement=parentElement.createChild("span",classes.join(" "));tagElement.appendChild(document.createTextNode("<"));var tagNameElement=tagElement.createChild("span",isClosingTag?"":"webkit-html-tag-name");tagNameElement.textContent=(isClosingTag?"/":"")+tagName;if(!isClosingTag&&node.hasAttributes()){var attributes=node.attributes();for(var i=0;i<attributes.length;++i){var attr=attributes[i];tagElement.appendChild(document.createTextNode(" "));this._buildAttributeDOM(tagElement,attr.name,attr.value,false,node,linkify);}}
+tagElement.appendChild(document.createTextNode(">"));parentElement.appendChild(document.createTextNode("\u200B"));},_convertWhitespaceToEntities:function(text)
+{var result="";var resultLength=0;var lastIndexAfterEntity=0;var entityRanges=[];var charToEntity=WebInspector.ElementsTreeOutline.MappedCharToEntity;for(var i=0,size=text.length;i<size;++i){var char=text.charAt(i);if(charToEntity[char]){result+=text.substring(lastIndexAfterEntity,i);var entityValue="&"+charToEntity[char]+";";entityRanges.push({offset:result.length,length:entityValue.length});result+=entityValue;lastIndexAfterEntity=i+1;}}
+if(result)
+result+=text.substring(lastIndexAfterEntity);return{text:result||text,entityRanges:entityRanges};},_nodeTitleInfo:function(linkify)
+{var node=this._node;var info={titleDOM:document.createDocumentFragment(),hasChildren:this.hasChildren};switch(node.nodeType()){case Node.ATTRIBUTE_NODE:this._buildAttributeDOM(info.titleDOM,node.name,node.value,true);break;case Node.ELEMENT_NODE:if(node.pseudoType()){this._buildPseudoElementDOM(info.titleDOM,node.pseudoType());info.hasChildren=false;break;}
+var tagName=node.nodeNameInCorrectCase();if(this._elementCloseTag){this._buildTagDOM(info.titleDOM,tagName,true,true);info.hasChildren=false;break;}
+this._buildTagDOM(info.titleDOM,tagName,false,false,linkify);var showInlineText=this._showInlineText()&&!this.hasChildren;if(!this.expanded&&!showInlineText&&(this.treeOutline.isXMLMimeType||!WebInspector.ElementsTreeElement.ForbiddenClosingTagElements[tagName])){if(this.hasChildren){var textNodeElement=info.titleDOM.createChild("span","webkit-html-text-node bogus");textNodeElement.textContent="\u2026";info.titleDOM.appendChild(document.createTextNode("\u200B"));}
+this._buildTagDOM(info.titleDOM,tagName,true,false);}
+if(showInlineText){var textNodeElement=info.titleDOM.createChild("span","webkit-html-text-node");var result=this._convertWhitespaceToEntities(node.firstChild.nodeValue());textNodeElement.textContent=result.text;WebInspector.highlightRangesWithStyleClass(textNodeElement,result.entityRanges,"webkit-html-entity-value");info.titleDOM.appendChild(document.createTextNode("\u200B"));this._buildTagDOM(info.titleDOM,tagName,true,false);info.hasChildren=false;}
+break;case Node.TEXT_NODE:if(node.parentNode&&node.parentNode.nodeName().toLowerCase()==="script"){var newNode=info.titleDOM.createChild("span","webkit-html-text-node webkit-html-js-node");newNode.textContent=node.nodeValue();var javascriptSyntaxHighlighter=new WebInspector.DOMSyntaxHighlighter("text/javascript",true);javascriptSyntaxHighlighter.syntaxHighlightNode(newNode);}else if(node.parentNode&&node.parentNode.nodeName().toLowerCase()==="style"){var newNode=info.titleDOM.createChild("span","webkit-html-text-node webkit-html-css-node");newNode.textContent=node.nodeValue();var cssSyntaxHighlighter=new WebInspector.DOMSyntaxHighlighter("text/css",true);cssSyntaxHighlighter.syntaxHighlightNode(newNode);}else{info.titleDOM.appendChild(document.createTextNode("\""));var textNodeElement=info.titleDOM.createChild("span","webkit-html-text-node");var result=this._convertWhitespaceToEntities(node.nodeValue());textNodeElement.textContent=result.text;WebInspector.highlightRangesWithStyleClass(textNodeElement,result.entityRanges,"webkit-html-entity-value");info.titleDOM.appendChild(document.createTextNode("\""));}
+break;case Node.COMMENT_NODE:var commentElement=info.titleDOM.createChild("span","webkit-html-comment");commentElement.appendChild(document.createTextNode("<!--"+node.nodeValue()+"-->"));break;case Node.DOCUMENT_TYPE_NODE:var docTypeElement=info.titleDOM.createChild("span","webkit-html-doctype");docTypeElement.appendChild(document.createTextNode("<!DOCTYPE "+node.nodeName()));if(node.publicId){docTypeElement.appendChild(document.createTextNode(" PUBLIC \""+node.publicId+"\""));if(node.systemId)
+docTypeElement.appendChild(document.createTextNode(" \""+node.systemId+"\""));}else if(node.systemId)
+docTypeElement.appendChild(document.createTextNode(" SYSTEM \""+node.systemId+"\""));if(node.internalSubset)
+docTypeElement.appendChild(document.createTextNode(" ["+node.internalSubset+"]"));docTypeElement.appendChild(document.createTextNode(">"));break;case Node.CDATA_SECTION_NODE:var cdataElement=info.titleDOM.createChild("span","webkit-html-text-node");cdataElement.appendChild(document.createTextNode("<![CDATA["+node.nodeValue()+"]]>"));break;case Node.DOCUMENT_FRAGMENT_NODE:var fragmentElement=info.titleDOM.createChild("span","webkit-html-fragment");if(node.isInShadowTree()){var shadowRootType=node.shadowRootType();if(shadowRootType){info.shadowRoot=true;fragmentElement.classList.add("shadow-root");}}
+fragmentElement.textContent=node.nodeNameInCorrectCase().collapseWhitespace();break;default:info.titleDOM.appendChild(document.createTextNode(node.nodeNameInCorrectCase().collapseWhitespace()));}
+return info;},_showInlineText:function()
+{if(this._node.importedDocument()||this._node.templateContent()||this._visibleShadowRoots().length>0||this._node.hasPseudoElements())
+return false;if(this._node.nodeType()!==Node.ELEMENT_NODE)
+return false;if(!this._node.firstChild||this._node.firstChild!==this._node.lastChild||this._node.firstChild.nodeType()!==Node.TEXT_NODE)
+return false;var textChild=this._node.firstChild;if(textChild.nodeValue().length<Preferences.maxInlineTextChildLength)
+return true;return false;},remove:function()
+{if(this._node.pseudoType())
+return;var parentElement=this.parent;if(!parentElement)
+return;var self=this;function removeNodeCallback(error,removedNodeId)
+{if(error)
+return;parentElement.removeChild(self);parentElement._adjustCollapsedRange();}
+if(!this._node.parentNode||this._node.parentNode.nodeType()===Node.DOCUMENT_NODE)
+return;this._node.removeNode(removeNodeCallback);},_editAsHTML:function()
+{var node=this._node;if(node.pseudoType())
+return;var treeOutline=this.treeOutline;var parentNode=node.parentNode;var index=node.index;var wasExpanded=this.expanded;function selectNode(error,nodeId)
+{if(error)
+return;treeOutline._updateModifiedNodes();var newNode=parentNode?parentNode.children()[index]||parentNode:null;if(!newNode)
+return;treeOutline.selectDOMNode(newNode,true);if(wasExpanded){var newTreeItem=treeOutline.findTreeElement(newNode);if(newTreeItem)
+newTreeItem.expand();}}
+function commitChange(initialValue,value)
+{if(initialValue!==value)
+node.setOuterHTML(value,selectNode);else
+return;}
+node.getOuterHTML(this._startEditingAsHTML.bind(this,commitChange));},_copyHTML:function()
+{this._node.copyNode();},_copyCSSPath:function()
+{InspectorFrontendHost.copyText(WebInspector.DOMPresentationUtils.cssPath(this._node,true));},_copyXPath:function()
+{InspectorFrontendHost.copyText(WebInspector.DOMPresentationUtils.xPath(this._node,true));},_highlightSearchResults:function()
+{if(!this._searchQuery||!this._searchHighlightsVisible)
+return;if(this._highlightResult){this._updateSearchHighlight(true);return;}
+var text=this.listItemElement.textContent;var regexObject=createPlainTextSearchRegex(this._searchQuery,"gi");var offset=0;var match=regexObject.exec(text);var matchRanges=[];while(match){matchRanges.push(new WebInspector.SourceRange(match.index,match[0].length));match=regexObject.exec(text);}
+if(!matchRanges.length)
+matchRanges.push(new WebInspector.SourceRange(0,text.length));this._highlightResult=[];WebInspector.highlightSearchResults(this.listItemElement,matchRanges,this._highlightResult);},_scrollIntoView:function()
+{function scrollIntoViewCallback(object)
+{function scrollIntoView()
+{this.scrollIntoViewIfNeeded(true);}
+if(object)
+object.callFunction(scrollIntoView);}
+WebInspector.RemoteObject.resolveNode(this._node,"",scrollIntoViewCallback);},_visibleShadowRoots:function()
+{var roots=this._node.shadowRoots();if(roots.length&&!WebInspector.settings.showUAShadowDOM.get()){roots=roots.filter(function(root){return root.shadowRootType()===WebInspector.DOMNode.ShadowRootTypes.Author;});}
+return roots;},_visibleChildren:function()
+{var visibleChildren=this._visibleShadowRoots();if(this._node.importedDocument())
+visibleChildren.push(this._node.importedDocument());if(this._node.templateContent())
+visibleChildren.push(this._node.templateContent());var pseudoElements=this._node.pseudoElements();if(pseudoElements[WebInspector.DOMNode.PseudoElementNames.Before])
+visibleChildren.push(pseudoElements[WebInspector.DOMNode.PseudoElementNames.Before]);if(this._node.childNodeCount())
+visibleChildren=visibleChildren.concat(this._node.children());if(pseudoElements[WebInspector.DOMNode.PseudoElementNames.After])
+visibleChildren.push(pseudoElements[WebInspector.DOMNode.PseudoElementNames.After]);return visibleChildren;},_visibleChildCount:function()
+{var childCount=this._node.childNodeCount()+this._visibleShadowRoots().length;if(this._node.importedDocument())
+++childCount;if(this._node.templateContent())
+++childCount;for(var pseudoType in this._node.pseudoElements())
+++childCount;return childCount;},_updateHasChildren:function()
+{this.hasChildren=!this._elementCloseTag&&!this._showInlineText()&&this._visibleChildCount()>0;},__proto__:TreeElement.prototype}
+WebInspector.ElementsTreeUpdater=function(treeOutline)
+{WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.NodeInserted,this._nodeInserted,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.NodeRemoved,this._nodeRemoved,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrModified,this._attributesUpdated,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrRemoved,this._attributesUpdated,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.CharacterDataModified,this._characterDataModified,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdated,this._documentUpdated,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.ChildNodeCountUpdated,this._childNodeCountUpdated,this);this._treeOutline=treeOutline;this._recentlyModifiedNodes=new Map();}
+WebInspector.ElementsTreeUpdater.prototype={_nodeModified:function(node,isUpdated,parentNode)
+{if(this._treeOutline._visible)
+this._updateModifiedNodesSoon();var entry=this._recentlyModifiedNodes.get(node);if(!entry){entry=new WebInspector.ElementsTreeUpdater.UpdateEntry(isUpdated,parentNode);this._recentlyModifiedNodes.put(node,entry);return;}
+entry.isUpdated|=isUpdated;if(parentNode)
+entry.parent=parentNode;},_documentUpdated:function(event)
+{var inspectedRootDocument=event.data;this._reset();if(!inspectedRootDocument)
+return;this._treeOutline.rootDOMNode=inspectedRootDocument;},_attributesUpdated:function(event)
+{this._nodeModified(event.data.node,true);},_characterDataModified:function(event)
+{this._nodeModified(event.data,true);},_nodeInserted:function(event)
+{this._nodeModified(event.data,false,event.data.parentNode);},_nodeRemoved:function(event)
+{this._nodeModified(event.data.node,false,event.data.parent);},_childNodeCountUpdated:function(event)
+{var treeElement=this._treeOutline.findTreeElement(event.data);if(treeElement){var oldHasChildren=treeElement.hasChildren;treeElement._updateHasChildren();if(treeElement.hasChildren!==oldHasChildren)
+treeElement.updateTitle();}},_updateModifiedNodesSoon:function()
+{if(this._updateModifiedNodesTimeout)
+return;this._updateModifiedNodesTimeout=setTimeout(this._updateModifiedNodes.bind(this),50);},_updateModifiedNodes:function()
+{if(this._updateModifiedNodesTimeout){clearTimeout(this._updateModifiedNodesTimeout);delete this._updateModifiedNodesTimeout;}
+var updatedParentTreeElements=[];var hidePanelWhileUpdating=this._recentlyModifiedNodes.size()>10;if(hidePanelWhileUpdating){var treeOutlineContainerElement=this._treeOutline.element.parentNode;var originalScrollTop=treeOutlineContainerElement?treeOutlineContainerElement.scrollTop:0;this._treeOutline.element.classList.add("hidden");}
+var nodes=this._recentlyModifiedNodes.keys();for(var i=0,size=nodes.length;i<size;++i){var node=nodes[i];var entry=this._recentlyModifiedNodes.get(node);var parent=entry.parent;if(parent===this._treeOutline._rootDOMNode){this._treeOutline.update();this._treeOutline.element.classList.remove("hidden");return;}
+if(entry.isUpdated){var nodeItem=this._treeOutline.findTreeElement(node);if(nodeItem)
+nodeItem.updateTitle();}
+var parentNodeItem=parent?this._treeOutline.findTreeElement(parent):null;if(parentNodeItem&&!parentNodeItem.alreadyUpdatedChildren){parentNodeItem.updateChildren();parentNodeItem.alreadyUpdatedChildren=true;updatedParentTreeElements.push(parentNodeItem);}}
+for(var i=0;i<updatedParentTreeElements.length;++i)
+delete updatedParentTreeElements[i].alreadyUpdatedChildren;if(hidePanelWhileUpdating){this._treeOutline.element.classList.remove("hidden");if(originalScrollTop)
+treeOutlineContainerElement.scrollTop=originalScrollTop;this._treeOutline.updateSelection();}
+this._recentlyModifiedNodes.clear();this._treeOutline._fireElementsTreeUpdated(nodes);},_reset:function()
+{this._treeOutline.rootDOMNode=null;this._treeOutline.selectDOMNode(null,false);WebInspector.domModel.hideDOMNodeHighlight();this._recentlyModifiedNodes.clear();}}
+WebInspector.ElementsTreeUpdater.UpdateEntry=function(isUpdated,parent)
+{this.isUpdated=isUpdated;if(parent)
+this.parent=parent;}
+WebInspector.ElementsTreeOutline.Renderer=function()
+{}
+WebInspector.ElementsTreeOutline.Renderer.prototype={render:function(object)
+{if(!(object instanceof WebInspector.DOMNode))
+return null;var treeOutline=new WebInspector.ElementsTreeOutline(false,false);treeOutline.rootDOMNode=(object);treeOutline.element.classList.add("outline-disclosure");if(!treeOutline.children[0].hasChildren)
+treeOutline.element.classList.add("single-node");treeOutline.setVisible(true);treeOutline.element.treeElementForTest=treeOutline.children[0];return treeOutline.element;}};WebInspector.EventListenersSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Event Listeners"));this.bodyElement.classList.add("events-pane");this.sections=[];var refreshButton=document.createElement("button");refreshButton.className="pane-title-button refresh";refreshButton.addEventListener("click",this._refreshButtonClicked.bind(this),false);refreshButton.title=WebInspector.UIString("Refresh");this.titleElement.appendChild(refreshButton);this.settingsSelectElement=document.createElement("select");this.settingsSelectElement.className="select-filter";var option=document.createElement("option");option.value="all";option.label=WebInspector.UIString("All Nodes");this.settingsSelectElement.appendChild(option);option=document.createElement("option");option.value="selected";option.label=WebInspector.UIString("Selected Node Only");this.settingsSelectElement.appendChild(option);var filter=WebInspector.settings.eventListenersFilter.get();if(filter==="all")
+this.settingsSelectElement[0].selected=true;else if(filter==="selected")
+this.settingsSelectElement[1].selected=true;this.settingsSelectElement.addEventListener("click",function(event){event.consume()},false);this.settingsSelectElement.addEventListener("change",this._changeSetting.bind(this),false);this.titleElement.appendChild(this.settingsSelectElement);this._linkifier=new WebInspector.Linkifier();}
+WebInspector.EventListenersSidebarPane._objectGroupName="event-listeners-sidebar-pane";WebInspector.EventListenersSidebarPane.prototype={update:function(node)
+{RuntimeAgent.releaseObjectGroup(WebInspector.EventListenersSidebarPane._objectGroupName);this._linkifier.reset();var body=this.bodyElement;body.removeChildren();this.sections=[];var self=this;function callback(error,eventListeners){if(error)
+return;var selectedNodeOnly="selected"===WebInspector.settings.eventListenersFilter.get();var sectionNames=[];var sectionMap={};for(var i=0;i<eventListeners.length;++i){var eventListener=eventListeners[i];if(selectedNodeOnly&&(node.id!==eventListener.nodeId))
+continue;eventListener.node=WebInspector.domModel.nodeForId(eventListener.nodeId);delete eventListener.nodeId;if(/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.handlerBody.toString()))
+continue;var type=eventListener.type;var section=sectionMap[type];if(!section){section=new WebInspector.EventListenersSection(type,node.id,self._linkifier);sectionMap[type]=section;sectionNames.push(type);self.sections.push(section);}
+section.addListener(eventListener);}
+if(sectionNames.length===0){var div=document.createElement("div");div.className="info";div.textContent=WebInspector.UIString("No Event Listeners");body.appendChild(div);return;}
+sectionNames.sort();for(var i=0;i<sectionNames.length;++i){var section=sectionMap[sectionNames[i]];body.appendChild(section.element);}}
+if(node)
+node.eventListeners(WebInspector.EventListenersSidebarPane._objectGroupName,callback);this._selectedNode=node;},willHide:function()
+{delete this._selectedNode;},_refreshButtonClicked:function()
+{if(!this._selectedNode)
+return;this.update(this._selectedNode);},_changeSetting:function()
+{var selectedOption=this.settingsSelectElement[this.settingsSelectElement.selectedIndex];WebInspector.settings.eventListenersFilter.set(selectedOption.value);this.update(this._selectedNode);},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.EventListenersSection=function(title,nodeId,linkifier)
+{this.eventListeners=[];this._nodeId=nodeId;this._linkifier=linkifier;WebInspector.PropertiesSection.call(this,title);this.propertiesElement.remove();delete this.propertiesElement;delete this.propertiesTreeOutline;this._eventBars=document.createElement("div");this._eventBars.className="event-bars";this.element.appendChild(this._eventBars);}
+WebInspector.EventListenersSection.prototype={addListener:function(eventListener)
+{var eventListenerBar=new WebInspector.EventListenerBar(eventListener,this._nodeId,this._linkifier);this._eventBars.appendChild(eventListenerBar.element);},__proto__:WebInspector.PropertiesSection.prototype}
+WebInspector.EventListenerBar=function(eventListener,nodeId,linkifier)
+{WebInspector.ObjectPropertiesSection.call(this,WebInspector.RemoteObject.fromPrimitiveValue(""));this.eventListener=eventListener;this._nodeId=nodeId;this._setNodeTitle();this._setFunctionSubtitle(linkifier);this.editable=false;this.element.className="event-bar";this.headerElement.classList.add("source-code");this.propertiesElement.className="event-properties properties-tree source-code";}
+WebInspector.EventListenerBar.prototype={update:function()
+{function updateWithNodeObject(nodeObject)
+{var properties=[];properties.push(WebInspector.RemoteObjectProperty.fromPrimitiveValue("type",this.eventListener.type));properties.push(WebInspector.RemoteObjectProperty.fromPrimitiveValue("useCapture",this.eventListener.useCapture));properties.push(WebInspector.RemoteObjectProperty.fromPrimitiveValue("isAttribute",this.eventListener.isAttribute));if(nodeObject)
+properties.push(new WebInspector.RemoteObjectProperty("node",nodeObject));if(typeof this.eventListener.handler!=="undefined"){var remoteObject=WebInspector.RemoteObject.fromPayload(this.eventListener.handler);properties.push(new WebInspector.RemoteObjectProperty("handler",remoteObject));}
+properties.push(WebInspector.RemoteObjectProperty.fromPrimitiveValue("listenerBody",this.eventListener.handlerBody));if(this.eventListener.sourceName)
+properties.push(WebInspector.RemoteObjectProperty.fromPrimitiveValue("sourceName",this.eventListener.sourceName));properties.push(WebInspector.RemoteObjectProperty.fromPrimitiveValue("lineNumber",this.eventListener.location.lineNumber+1));this.updateProperties(properties);}
+WebInspector.RemoteObject.resolveNode(this.eventListener.node,WebInspector.EventListenersSidebarPane._objectGroupName,updateWithNodeObject.bind(this));},_setNodeTitle:function()
+{var node=this.eventListener.node;if(!node)
+return;if(node.nodeType()===Node.DOCUMENT_NODE){this.titleElement.textContent="document";return;}
+if(node.id===this._nodeId){this.titleElement.textContent=WebInspector.DOMPresentationUtils.simpleSelector(node);return;}
+this.titleElement.removeChildren();this.titleElement.appendChild(WebInspector.DOMPresentationUtils.linkifyNodeReference(this.eventListener.node));},_setFunctionSubtitle:function(linkifier)
+{this.subtitleElement.removeChildren();var urlElement=linkifier.linkifyRawLocation(this.eventListener.location);if(!urlElement){var url=this.eventListener.sourceName;var lineNumber=this.eventListener.location.lineNumber;var columnNumber=0;urlElement=linkifier.linkifyLocation(url,lineNumber,columnNumber);}
+this.subtitleElement.appendChild(urlElement);},__proto__:WebInspector.ObjectPropertiesSection.prototype};WebInspector.MetricsSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Metrics"));WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._styleSheetOrMediaQueryResultChanged,this);WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged,this._styleSheetOrMediaQueryResultChanged,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrModified,this._attributesUpdated,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrRemoved,this._attributesUpdated,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameResized,this._frameResized,this);}
+WebInspector.MetricsSidebarPane.prototype={update:function(node)
+{if(node)
+this.node=node;this._innerUpdate();},_innerUpdate:function()
+{if(this._isEditingMetrics)
+return;var node=this.node;if(!node||node.nodeType()!==Node.ELEMENT_NODE){this.bodyElement.removeChildren();return;}
+function callback(style)
+{if(!style||this.node!==node)
+return;this._updateMetrics(style);}
+WebInspector.cssModel.getComputedStyleAsync(node.id,callback.bind(this));function inlineStyleCallback(style)
+{if(!style||this.node!==node)
+return;this.inlineStyle=style;}
+WebInspector.cssModel.getInlineStylesAsync(node.id,inlineStyleCallback.bind(this));},_styleSheetOrMediaQueryResultChanged:function()
+{this._innerUpdate();},_frameResized:function()
+{function refreshContents()
+{this._innerUpdate();delete this._activeTimer;}
+if(this._activeTimer)
+clearTimeout(this._activeTimer);this._activeTimer=setTimeout(refreshContents.bind(this),100);},_attributesUpdated:function(event)
+{if(this.node!==event.data.node)
+return;this._innerUpdate();},_getPropertyValueAsPx:function(style,propertyName)
+{return Number(style.getPropertyValue(propertyName).replace(/px$/,"")||0);},_getBox:function(computedStyle,componentName)
+{var suffix=componentName==="border"?"-width":"";var left=this._getPropertyValueAsPx(computedStyle,componentName+"-left"+suffix);var top=this._getPropertyValueAsPx(computedStyle,componentName+"-top"+suffix);var right=this._getPropertyValueAsPx(computedStyle,componentName+"-right"+suffix);var bottom=this._getPropertyValueAsPx(computedStyle,componentName+"-bottom"+suffix);return{left:left,top:top,right:right,bottom:bottom};},_highlightDOMNode:function(showHighlight,mode,event)
+{event.consume();var nodeId=showHighlight&&this.node?this.node.id:0;if(nodeId){if(this._highlightMode===mode)
+return;this._highlightMode=mode;WebInspector.domModel.highlightDOMNode(nodeId,mode);}else{delete this._highlightMode;WebInspector.domModel.hideDOMNodeHighlight();}
+for(var i=0;this._boxElements&&i<this._boxElements.length;++i){var element=this._boxElements[i];if(!nodeId||mode==="all"||element._name===mode)
+element.style.backgroundColor=element._backgroundColor;else
+element.style.backgroundColor="";}},_updateMetrics:function(style)
+{var metricsElement=document.createElement("div");metricsElement.className="metrics";var self=this;function createBoxPartElement(style,name,side,suffix)
+{var propertyName=(name!=="position"?name+"-":"")+side+suffix;var value=style.getPropertyValue(propertyName);if(value===""||(name!=="position"&&value==="0px"))
+value="\u2012";else if(name==="position"&&value==="auto")
+value="\u2012";value=value.replace(/px$/,"");value=Number.toFixedIfFloating(value);var element=document.createElement("div");element.className=side;element.textContent=value;element.addEventListener("dblclick",this.startEditing.bind(this,element,name,propertyName,style),false);return element;}
+function getContentAreaWidthPx(style)
+{var width=style.getPropertyValue("width").replace(/px$/,"");if(!isNaN(width)&&style.getPropertyValue("box-sizing")==="border-box"){var borderBox=self._getBox(style,"border");var paddingBox=self._getBox(style,"padding");width=width-borderBox.left-borderBox.right-paddingBox.left-paddingBox.right;}
+return Number.toFixedIfFloating(width);}
+function getContentAreaHeightPx(style)
+{var height=style.getPropertyValue("height").replace(/px$/,"");if(!isNaN(height)&&style.getPropertyValue("box-sizing")==="border-box"){var borderBox=self._getBox(style,"border");var paddingBox=self._getBox(style,"padding");height=height-borderBox.top-borderBox.bottom-paddingBox.top-paddingBox.bottom;}
+return Number.toFixedIfFloating(height);}
+var noMarginDisplayType={"table-cell":true,"table-column":true,"table-column-group":true,"table-footer-group":true,"table-header-group":true,"table-row":true,"table-row-group":true};var noPaddingDisplayType={"table-column":true,"table-column-group":true,"table-footer-group":true,"table-header-group":true,"table-row":true,"table-row-group":true};var noPositionType={"static":true};var boxes=["content","padding","border","margin","position"];var boxColors=[WebInspector.Color.PageHighlight.Content,WebInspector.Color.PageHighlight.Padding,WebInspector.Color.PageHighlight.Border,WebInspector.Color.PageHighlight.Margin,WebInspector.Color.fromRGBA([0,0,0,0])];var boxLabels=[WebInspector.UIString("content"),WebInspector.UIString("padding"),WebInspector.UIString("border"),WebInspector.UIString("margin"),WebInspector.UIString("position")];var previousBox=null;this._boxElements=[];for(var i=0;i<boxes.length;++i){var name=boxes[i];if(name==="margin"&&noMarginDisplayType[style.getPropertyValue("display")])
+continue;if(name==="padding"&&noPaddingDisplayType[style.getPropertyValue("display")])
+continue;if(name==="position"&&noPositionType[style.getPropertyValue("position")])
+continue;var boxElement=document.createElement("div");boxElement.className=name;boxElement._backgroundColor=boxColors[i].toString(WebInspector.Color.Format.RGBA);boxElement._name=name;boxElement.style.backgroundColor=boxElement._backgroundColor;boxElement.addEventListener("mouseover",this._highlightDOMNode.bind(this,true,name==="position"?"all":name),false);this._boxElements.push(boxElement);if(name==="content"){var widthElement=document.createElement("span");widthElement.textContent=getContentAreaWidthPx(style);widthElement.addEventListener("dblclick",this.startEditing.bind(this,widthElement,"width","width",style),false);var heightElement=document.createElement("span");heightElement.textContent=getContentAreaHeightPx(style);heightElement.addEventListener("dblclick",this.startEditing.bind(this,heightElement,"height","height",style),false);boxElement.appendChild(widthElement);boxElement.appendChild(document.createTextNode(" \u00D7 "));boxElement.appendChild(heightElement);}else{var suffix=(name==="border"?"-width":"");var labelElement=document.createElement("div");labelElement.className="label";labelElement.textContent=boxLabels[i];boxElement.appendChild(labelElement);boxElement.appendChild(createBoxPartElement.call(this,style,name,"top",suffix));boxElement.appendChild(document.createElement("br"));boxElement.appendChild(createBoxPartElement.call(this,style,name,"left",suffix));if(previousBox)
+boxElement.appendChild(previousBox);boxElement.appendChild(createBoxPartElement.call(this,style,name,"right",suffix));boxElement.appendChild(document.createElement("br"));boxElement.appendChild(createBoxPartElement.call(this,style,name,"bottom",suffix));}
+previousBox=boxElement;}
+metricsElement.appendChild(previousBox);metricsElement.addEventListener("mouseover",this._highlightDOMNode.bind(this,false,""),false);this.bodyElement.removeChildren();this.bodyElement.appendChild(metricsElement);},startEditing:function(targetElement,box,styleProperty,computedStyle)
+{if(WebInspector.isBeingEdited(targetElement))
+return;var context={box:box,styleProperty:styleProperty,computedStyle:computedStyle};var boundKeyDown=this._handleKeyDown.bind(this,context,styleProperty);context.keyDownHandler=boundKeyDown;targetElement.addEventListener("keydown",boundKeyDown,false);this._isEditingMetrics=true;var config=new WebInspector.InplaceEditor.Config(this.editingCommitted.bind(this),this.editingCancelled.bind(this),context);WebInspector.InplaceEditor.startEditing(targetElement,config);window.getSelection().setBaseAndExtent(targetElement,0,targetElement,1);},_handleKeyDown:function(context,styleProperty,event)
+{var element=event.currentTarget;function finishHandler(originalValue,replacementString)
+{this._applyUserInput(element,replacementString,originalValue,context,false);}
+function customNumberHandler(number)
+{if(styleProperty!=="margin"&&number<0)
+number=0;return number;}
+WebInspector.handleElementValueModifications(event,element,finishHandler.bind(this),undefined,customNumberHandler);},editingEnded:function(element,context)
+{delete this.originalPropertyData;delete this.previousPropertyDataCandidate;element.removeEventListener("keydown",context.keyDownHandler,false);delete this._isEditingMetrics;},editingCancelled:function(element,context)
+{if("originalPropertyData"in this&&this.inlineStyle){if(!this.originalPropertyData){var pastLastSourcePropertyIndex=this.inlineStyle.pastLastSourcePropertyIndex();if(pastLastSourcePropertyIndex)
+this.inlineStyle.allProperties[pastLastSourcePropertyIndex-1].setText("",false);}else
+this.inlineStyle.allProperties[this.originalPropertyData.index].setText(this.originalPropertyData.propertyText,false);}
+this.editingEnded(element,context);this.update();},_applyUserInput:function(element,userInput,previousContent,context,commitEditor)
+{if(!this.inlineStyle){return this.editingCancelled(element,context);}
+if(commitEditor&&userInput===previousContent)
+return this.editingCancelled(element,context);if(context.box!=="position"&&(!userInput||userInput==="\u2012"))
+userInput="0px";else if(context.box==="position"&&(!userInput||userInput==="\u2012"))
+userInput="auto";userInput=userInput.toLowerCase();if(/^\d+$/.test(userInput))
+userInput+="px";var styleProperty=context.styleProperty;var computedStyle=context.computedStyle;if(computedStyle.getPropertyValue("box-sizing")==="border-box"&&(styleProperty==="width"||styleProperty==="height")){if(!userInput.match(/px$/)){WebInspector.console.log("For elements with box-sizing: border-box, only absolute content area dimensions can be applied",WebInspector.ConsoleMessage.MessageLevel.Error,true);return;}
+var borderBox=this._getBox(computedStyle,"border");var paddingBox=this._getBox(computedStyle,"padding");var userValuePx=Number(userInput.replace(/px$/,""));if(isNaN(userValuePx))
+return;if(styleProperty==="width")
+userValuePx+=borderBox.left+borderBox.right+paddingBox.left+paddingBox.right;else
+userValuePx+=borderBox.top+borderBox.bottom+paddingBox.top+paddingBox.bottom;userInput=userValuePx+"px";}
+this.previousPropertyDataCandidate=null;var self=this;var callback=function(style){if(!style)
+return;self.inlineStyle=style;if(!("originalPropertyData"in self))
+self.originalPropertyData=self.previousPropertyDataCandidate;if(typeof self._highlightMode!=="undefined"){WebInspector.domModel.highlightDOMNode(self.node.id,self._highlightMode);}
+if(commitEditor){self.dispatchEventToListeners("metrics edited");self.update();}};var allProperties=this.inlineStyle.allProperties;for(var i=0;i<allProperties.length;++i){var property=allProperties[i];if(property.name!==context.styleProperty||property.inactive)
+continue;this.previousPropertyDataCandidate=property;property.setValue(userInput,commitEditor,true,callback);return;}
+this.inlineStyle.appendProperty(context.styleProperty,userInput,callback);},editingCommitted:function(element,userInput,previousContent,context)
+{this.editingEnded(element,context);this._applyUserInput(element,userInput,previousContent,context,true);},__proto__:WebInspector.SidebarPane.prototype};WebInspector.OverridesView=function()
+{WebInspector.VBox.call(this);this.registerRequiredCSS("overrides.css");this.registerRequiredCSS("helpScreen.css");this.element.classList.add("overrides-view");this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.shrinkableTabs=false;this._tabbedPane.verticalTabLayout=true;new WebInspector.OverridesView.DeviceTab().appendAsTab(this._tabbedPane);new WebInspector.OverridesView.ViewportTab().appendAsTab(this._tabbedPane);new WebInspector.OverridesView.UserAgentTab().appendAsTab(this._tabbedPane);new WebInspector.OverridesView.SensorsTab().appendAsTab(this._tabbedPane);this._lastSelectedTabSetting=WebInspector.settings.createSetting("lastSelectedEmulateTab","device");this._tabbedPane.selectTab(this._lastSelectedTabSetting.get());this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._tabbedPane.show(this.element);this._warningFooter=this.element.createChild("div","overrides-footer");this._overridesWarningUpdated();WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated,this._overridesWarningUpdated,this);}
+WebInspector.OverridesView.prototype={_tabSelected:function(event)
+{this._lastSelectedTabSetting.set(this._tabbedPane.selectedTabId);},_overridesWarningUpdated:function()
+{var message=WebInspector.overridesSupport.warningMessage();this._warningFooter.classList.toggle("hidden",!message);this._warningFooter.textContent=message;},__proto__:WebInspector.VBox.prototype}
+WebInspector.OverridesView.Tab=function(id,name,settings)
+{WebInspector.VBox.call(this);this._id=id;this._name=name;this._settings=settings;for(var i=0;i<settings.length;++i)
+settings[i].addChangeListener(this._updateActiveState,this);}
+WebInspector.OverridesView.Tab.prototype={appendAsTab:function(tabbedPane)
+{this._tabbedPane=tabbedPane;tabbedPane.appendTab(this._id,this._name,this);this._updateActiveState();},_updateActiveState:function()
+{var active=false;for(var i=0;!active&&i<this._settings.length;++i)
+active=this._settings[i].get();this._tabbedPane.element.classList.toggle("overrides-activate-"+this._id,active);this._tabbedPane.changeTabTitle(this._id,active?this._name+" \u2713":this._name);},_createInput:function(parentElement,id,defaultText,eventListener,numeric)
+{var element=parentElement.createChild("input");element.id=id;element.type="text";element.maxLength=12;element.style.width="80px";element.value=defaultText;element.align="right";if(numeric)
+element.className="numeric";element.addEventListener("input",eventListener,false);element.addEventListener("keydown",keyDownListener,false);function keyDownListener(event)
+{if(isEnterKey(event))
+eventListener(event);}
+return element;},_createNonPersistedCheckbox:function(title,callback)
+{var labelElement=document.createElement("label");var checkboxElement=labelElement.createChild("input");checkboxElement.type="checkbox";checkboxElement.checked=false;checkboxElement.addEventListener("click",onclick,false);labelElement.appendChild(document.createTextNode(title));return labelElement;function onclick()
+{callback(checkboxElement.checked);}},_createSettingCheckbox:function(name,setting,callback)
+{var checkbox=WebInspector.SettingsUI.createCheckbox(name,setting.get.bind(setting),listener,true);function listener(value)
+{if(setting.get()===value)
+return;setting.set(value);if(callback)
+callback(value);}
+setting.addChangeListener(changeListener);function changeListener()
+{if(checkbox.firstChild.checked!==setting.get())
+checkbox.firstChild.checked=setting.get();}
+return checkbox;},__proto__:WebInspector.VBox.prototype}
+WebInspector.OverridesView.DeviceTab=function()
+{WebInspector.OverridesView.Tab.call(this,"device",WebInspector.UIString("Device"),[]);this.element.classList.add("overrides-device");this._emulatedDeviceSetting=WebInspector.settings.createSetting("emulatedDevice","Google Nexus 4");this._emulateDeviceViewportSetting=WebInspector.settings.overrideDeviceMetrics;this._emulateDeviceUserAgentSetting=WebInspector.settings.overrideUserAgent;this._deviceSelectElement=this.element.createChild("select");var devices=WebInspector.OverridesView.DeviceTab._phones.concat(WebInspector.OverridesView.DeviceTab._tablets);devices.sort();var selectionRestored=false;for(var i=0;i<devices.length;++i){var device=devices[i];var option=new Option(device[0],device[0]);option._userAgent=device[1];option._metrics=device[2];this._deviceSelectElement.add(option);if(this._emulatedDeviceSetting.get()===device[0]){this._deviceSelectElement.selectedIndex=i;selectionRestored=true;}}
+if(!selectionRestored)
+this._deviceSelectElement.selectedIndex=devices.length-1;this._deviceSelectElement.addEventListener("change",this._deviceSelected.bind(this),false);this._deviceSelectElement.addEventListener("keypress",this._keyPressed.bind(this),false);this._deviceSelectElement.disabled=WebInspector.OverridesSupport.isInspectingDevice();var buttonsBar=this.element.createChild("div");var emulateButton=buttonsBar.createChild("button","settings-tab-text-button");emulateButton.textContent=WebInspector.UIString("Emulate");emulateButton.addEventListener("click",this._emulateButtonClicked.bind(this),false);emulateButton.disabled=WebInspector.OverridesSupport.isInspectingDevice();var resetButton=buttonsBar.createChild("button","settings-tab-text-button");resetButton.textContent=WebInspector.UIString("Reset");resetButton.addEventListener("click",this._resetButtonClicked.bind(this),false);this._resetButton=resetButton;this._viewportValueLabel=this.element.createChild("div","overrides-device-value-label");this._viewportValueLabel.textContent=WebInspector.UIString("Viewport:");this._viewportValueElement=this._viewportValueLabel.createChild("span","overrides-device-value");this._userAgentLabel=this.element.createChild("div","overrides-device-value-label");this._userAgentLabel.textContent=WebInspector.UIString("User agent:");this._userAgentValueElement=this._userAgentLabel.createChild("span","overrides-device-value");this._updateValueLabels();WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.HasActiveOverridesChanged,this._hasActiveOverridesChanged,this);this._hasActiveOverridesChanged();}
+WebInspector.OverridesView.DeviceTab._phones=[["Apple iPhone 3GS","Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5","320x480x1"],["Apple iPhone 4","Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5","640x960x2"],["Apple iPhone 5","Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53","640x1136x2"],["BlackBerry Z10","Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+","768x1280x2"],["BlackBerry Z30","Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+","720x1280x2"],["Google Nexus 4","Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19","768x1280x2"],["Google Nexus 5","Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19","1080x1920x3"],["Google Nexus S","Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Nexus S Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","480x800x1.5"],["HTC Evo, Touch HD, Desire HD, Desire","Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","480x800x1.5"],["HTC One X, EVO LTE","Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19","720x1280x2"],["HTC Sensation, Evo 3D","Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","540x960x1.5"],["LG Optimus 2X, Optimus 3D, Optimus Black","Mozilla/5.0 (Linux; U; Android 2.2; en-us; LG-P990/V08c Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2","480x800x1.5"],["LG Optimus G","Mozilla/5.0 (Linux; Android 4.0; LG-E975 Build/IMM76L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19","768x1280x2"],["LG Optimus LTE, Optimus 4X HD","Mozilla/5.0 (Linux; U; Android 2.3; en-us; LG-P930 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","720x1280x1.7"],["LG Optimus One","Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; LG-MS690 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","320x480x1.5"],["Motorola Defy, Droid, Droid X, Milestone","Mozilla/5.0 (Linux; U; Android 2.0; en-us; Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17","480x854x1.5"],["Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2","Mozilla/5.0 (Linux; U; Android 2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","540x960x1"],["Motorola Droid Razr HD","Mozilla/5.0 (Linux; U; Android 2.3; en-us; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","720x1280x1"],["Nokia C5, C6, C7, N97, N8, X7","NokiaN97/21.1.107 (SymbianOS/9.4; Series60/5.0 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebkit/525 (KHTML, like Gecko) BrowserNG/7.1.4","360x640x1"],["Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900","Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 820)","480x800x1.5"],["Samsung Galaxy Note 3","Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","1080x1920x2"],["Samsung Galaxy Note II","Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","720x1280x2"],["Samsung Galaxy Note","Mozilla/5.0 (Linux; U; Android 2.3; en-us; SAMSUNG-SGH-I717 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","800x1280x2"],["Samsung Galaxy S III, Galaxy Nexus","Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","720x1280x2"],["Samsung Galaxy S, S II, W","Mozilla/5.0 (Linux; U; Android 2.1; en-us; GT-I9000 Build/ECLAIR) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2","480x800x1.5"],["Samsung Galaxy S4","Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36","1080x1920x3"],["Sony Xperia S, Ion","Mozilla/5.0 (Linux; U; Android 4.0; en-us; LT28at Build/6.1.C.1.111) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","720x1280x2"],["Sony Xperia Sola, U","Mozilla/5.0 (Linux; U; Android 2.3; en-us; SonyEricssonST25i Build/6.0.B.1.564) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","480x854x1"],["Sony Xperia Z, Z1","Mozilla/5.0 (Linux; U; Android 4.2; en-us; SonyC6903 Build/14.1.G.1.518) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30","1080x1920x3"],];WebInspector.OverridesView.DeviceTab._tablets=[["Amazon Amazon Kindle Fire HD 7\u2033","Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire HD Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","1280x800x1.5"],["Amazon Amazon Kindle Fire HD 8.9\u2033","Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire HD Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","1920x1200x1.5"],["Amazon Amazon Kindle Fire","Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","1024x600x1"],["Apple iPad 1 / 2 / iPad Mini","Mozilla/5.0 (iPad; CPU OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5","1024x768x1"],["Apple iPad 3 / 4","Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53","2048x1536x2"],["BlackBerry PlayBook","Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+","1024x600x1"],["Google Nexus 10","Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36","2560x1600x2"],["Google Nexus 7 2","Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36","1920x1200x2"],["Google Nexus 7","Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36","1280x800x1.325"],["Motorola Xoom, Xyboard","Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2","1280x800x1"],["Samsung Galaxy Tab 7.7, 8.9, 10.1","Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","1280x800x1"],["Samsung Galaxy Tab","Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","1024x600x1"],];WebInspector.OverridesView.DeviceTab.prototype={_keyPressed:function(e)
+{if(e.keyCode===WebInspector.KeyboardShortcut.Keys.Enter.code)
+this._emulateButtonClicked();},_emulateButtonClicked:function()
+{var option=this._deviceSelectElement.options[this._deviceSelectElement.selectedIndex];WebInspector.overridesSupport.emulateDevice(option._metrics,option._userAgent);},_resetButtonClicked:function()
+{WebInspector.overridesSupport.reset();},_hasActiveOverridesChanged:function()
+{this._resetButton.disabled=!WebInspector.overridesSupport.hasActiveOverrides();},_deviceSelected:function()
+{var option=this._deviceSelectElement.options[this._deviceSelectElement.selectedIndex];this._emulatedDeviceSetting.set(option.value);this._updateValueLabels();},_updateValueLabels:function()
+{var option=this._deviceSelectElement.options[this._deviceSelectElement.selectedIndex];var metrics;if(option._metrics&&(metrics=WebInspector.OverridesSupport.DeviceMetrics.parseSetting(option._metrics)))
+this._viewportValueElement.textContent=WebInspector.UIString("%s \xD7 %s, devicePixelRatio = %s",metrics.width,metrics.height,metrics.deviceScaleFactor);else
+this._viewportValueElement.textContent="";this._userAgentValueElement.textContent=option._userAgent||"";},__proto__:WebInspector.OverridesView.Tab.prototype}
+WebInspector.OverridesView.ViewportTab=function()
+{WebInspector.OverridesView.Tab.call(this,"viewport",WebInspector.UIString("Screen"),[WebInspector.settings.overrideDeviceMetrics,WebInspector.settings.overrideCSSMedia]);this.element.classList.add("overrides-viewport");const metricsSetting=WebInspector.settings.deviceMetrics.get();var metrics=WebInspector.OverridesSupport.DeviceMetrics.parseSetting(metricsSetting);var checkbox=this._createSettingCheckbox(WebInspector.UIString("Emulate screen"),WebInspector.settings.overrideDeviceMetrics,this._onMetricsCheckboxClicked.bind(this));checkbox.firstChild.disabled=WebInspector.OverridesSupport.isInspectingDevice();WebInspector.settings.deviceMetrics.addChangeListener(this._updateDeviceMetricsElement,this);this.element.appendChild(checkbox);this.element.appendChild(this._createDeviceMetricsElement(metrics));this.element.appendChild(this._createMediaEmulationFragment());var footnote=this.element.createChild("p","help-footnote");var footnoteLink=footnote.createChild("a");footnoteLink.href="https://developers.google.com/chrome-developer-tools/docs/mobile-emulation";footnoteLink.target="_blank";footnoteLink.createTextChild(WebInspector.UIString("More information about screen emulation"));this._onMetricsCheckboxClicked(WebInspector.settings.overrideDeviceMetrics.get());}
+WebInspector.OverridesView.ViewportTab.prototype={_onMetricsCheckboxClicked:function(enabled)
+{if(enabled&&!this._widthOverrideElement.value)
+this._widthOverrideElement.focus();this._applyDeviceMetricsUserInput();},_applyDeviceMetricsUserInput:function()
+{this._muteRangeListener=true;this._widthRangeInput.value=this._widthOverrideElement.value;delete this._muteRangeListener;if(this._applyDeviceMetricsTimer)
+clearTimeout(this._applyDeviceMetricsTimer);this._applyDeviceMetricsTimer=setTimeout(this._doApplyDeviceMetricsUserInput.bind(this),50);},_doApplyDeviceMetricsUserInput:function()
+{delete this._applyDeviceMetricsTimer;this._setDeviceMetricsOverride(WebInspector.OverridesSupport.DeviceMetrics.parseUserInput(this._widthOverrideElement.value.trim(),this._heightOverrideElement.value.trim(),this._deviceScaleFactorOverrideElement.value.trim(),this._textAutosizingOverrideCheckbox.checked),true);},_setDeviceMetricsOverride:function(metrics,userInputModified)
+{function setValid(condition,element)
+{if(condition)
+element.classList.remove("error-input");else
+element.classList.add("error-input");}
+setValid(metrics&&metrics.isWidthValid(),this._widthOverrideElement);setValid(metrics&&metrics.isHeightValid(),this._heightOverrideElement);setValid(metrics&&metrics.isDeviceScaleFactorValid(),this._deviceScaleFactorOverrideElement);if(!metrics)
+return;if(!userInputModified){this._widthOverrideElement.value=metrics.widthToInput();this._heightOverrideElement.value=metrics.heightToInput();this._deviceScaleFactorOverrideElement.value=metrics.deviceScaleFactorToInput();this._textAutosizingOverrideCheckbox.checked=metrics.textAutosizing;}
+if(metrics.isValid()){var value=metrics.toSetting();if(value!==WebInspector.settings.deviceMetrics.get())
+WebInspector.settings.deviceMetrics.set(value);}},_createDeviceMetricsElement:function(metrics)
+{var fieldsetElement=WebInspector.SettingsUI.createSettingFieldset(WebInspector.settings.overrideDeviceMetrics);if(WebInspector.OverridesSupport.isInspectingDevice())
+fieldsetElement.disabled=true;fieldsetElement.id="metrics-override-section";function swapDimensionsClicked()
+{var widthValue=this._widthOverrideElement.value;this._widthOverrideElement.value=this._heightOverrideElement.value;this._heightOverrideElement.value=widthValue;this._applyDeviceMetricsUserInput();}
+var tableElement=fieldsetElement.createChild("table","nowrap");var rowElement=tableElement.createChild("tr");var cellElement=rowElement.createChild("td");cellElement.appendChild(document.createTextNode(WebInspector.UIString("Resolution:")));cellElement=rowElement.createChild("td");this._widthOverrideElement=this._createInput(cellElement,"metrics-override-width",String(metrics.width||screen.width),this._applyDeviceMetricsUserInput.bind(this),true);this._swapDimensionsElement=cellElement.createChild("button","overrides-swap");this._swapDimensionsElement.appendChild(document.createTextNode(" \u21C4 "));this._swapDimensionsElement.title=WebInspector.UIString("Swap dimensions");this._swapDimensionsElement.addEventListener("click",swapDimensionsClicked.bind(this),false);this._swapDimensionsElement.tabIndex=-1;this._heightOverrideElement=this._createInput(cellElement,"metrics-override-height",String(metrics.height||screen.height),this._applyDeviceMetricsUserInput.bind(this),true);rowElement=tableElement.createChild("tr");cellElement=rowElement.createChild("td");cellElement.colSpan=4;this._widthRangeInput=cellElement.createChild("input");this._widthRangeInput.type="range";this._widthRangeInput.min=100;this._widthRangeInput.max=2000;this._widthRangeInput.addEventListener("change",this._rangeValueChanged.bind(this),false);this._widthRangeInput.addEventListener("input",this._rangeValueChanged.bind(this),false);this._widthRangeInput.value=this._widthOverrideElement.value;rowElement=tableElement.createChild("tr");rowElement.title=WebInspector.UIString("Ratio between a device's physical pixels and device-independent pixels.");cellElement=rowElement.createChild("td");cellElement.appendChild(document.createTextNode(WebInspector.UIString("Device pixel ratio:")));cellElement=rowElement.createChild("td");this._deviceScaleFactorOverrideElement=this._createInput(cellElement,"metrics-override-device-scale",String(metrics.deviceScaleFactor||1),this._applyDeviceMetricsUserInput.bind(this),true);var textAutosizingOverrideElement=this._createNonPersistedCheckbox(WebInspector.UIString("Enable text autosizing "),this._applyDeviceMetricsUserInput.bind(this));textAutosizingOverrideElement.title=WebInspector.UIString("Text autosizing is the feature that boosts font sizes on mobile devices.");this._textAutosizingOverrideCheckbox=textAutosizingOverrideElement.firstChild;this._textAutosizingOverrideCheckbox.checked=metrics.textAutosizing;fieldsetElement.appendChild(textAutosizingOverrideElement);var checkbox=this._createSettingCheckbox(WebInspector.UIString("Emulate viewport"),WebInspector.settings.emulateViewport);fieldsetElement.appendChild(checkbox);checkbox=this._createSettingCheckbox(WebInspector.UIString("Shrink to fit"),WebInspector.settings.deviceFitWindow);fieldsetElement.appendChild(checkbox);return fieldsetElement;},_updateDeviceMetricsElement:function()
+{const metricsSetting=WebInspector.settings.deviceMetrics.get();var metrics=WebInspector.OverridesSupport.DeviceMetrics.parseSetting(metricsSetting);if(this._widthOverrideElement.value!==metrics.width)
+this._widthOverrideElement.value=metrics.width||screen.width;this._muteRangeListener=true;if(this._widthRangeInput.value!=metrics.width)
+this._widthRangeInput.value=metrics.width||screen.width;delete this._muteRangeListener;if(this._heightOverrideElement.value!==metrics.height)
+this._heightOverrideElement.value=metrics.height||screen.height;if(this._deviceScaleFactorOverrideElement.value!==metrics.deviceScaleFactor)
+this._deviceScaleFactorOverrideElement.value=metrics.deviceScaleFactor||1;if(this._textAutosizingOverrideCheckbox.checked!==metrics.textAutosizing)
+this._textAutosizingOverrideCheckbox.checked=metrics.textAutosizing||false;},_createMediaEmulationFragment:function()
+{var checkbox=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("CSS media"),WebInspector.settings.overrideCSSMedia,true);var fieldsetElement=WebInspector.SettingsUI.createSettingFieldset(WebInspector.settings.overrideCSSMedia);if(WebInspector.OverridesSupport.isInspectingDevice())
+fieldsetElement.disabled=true;var mediaSelectElement=fieldsetElement.createChild("select");var mediaTypes=WebInspector.CSSStyleModel.MediaTypes;var defaultMedia=WebInspector.settings.emulatedCSSMedia.get();for(var i=0;i<mediaTypes.length;++i){var mediaType=mediaTypes[i];if(mediaType==="all"){continue;}
+var option=document.createElement("option");option.text=mediaType;option.value=mediaType;mediaSelectElement.add(option);if(mediaType===defaultMedia)
+mediaSelectElement.selectedIndex=mediaSelectElement.options.length-1;}
+mediaSelectElement.addEventListener("change",this._emulateMediaChanged.bind(this,mediaSelectElement),false);var fragment=document.createDocumentFragment();fragment.appendChild(checkbox);fragment.appendChild(fieldsetElement);return fragment;},_emulateMediaChanged:function(select)
+{var media=select.options[select.selectedIndex].value;WebInspector.settings.emulatedCSSMedia.set(media);},_rangeValueChanged:function()
+{if(this._muteRangeListener)
+return;this._widthOverrideElement.value=this._widthRangeInput.value;this._applyDeviceMetricsUserInput();},__proto__:WebInspector.OverridesView.Tab.prototype}
+WebInspector.OverridesView.UserAgentTab=function()
+{WebInspector.OverridesView.Tab.call(this,"user-agent",WebInspector.UIString("User Agent"),[WebInspector.settings.overrideUserAgent]);this.element.classList.add("overrides-user-agent");var checkbox=this._createSettingCheckbox(WebInspector.UIString("Spoof user agent"),WebInspector.settings.overrideUserAgent);checkbox.firstChild.disabled=WebInspector.OverridesSupport.isInspectingDevice();this.element.appendChild(checkbox);this.element.appendChild(this._createUserAgentSelectRowElement());}
+WebInspector.OverridesView.UserAgentTab._userAgents=[["Android 4.0.2 \u2014 Galaxy Nexus","Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"],["Android 2.3 \u2014 Nexus S","Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"],["BlackBerry \u2014 BB10","Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+"],["BlackBerry \u2014 PlayBook 2.1","Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+"],["BlackBerry \u2014 9900","Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.187 Mobile Safari/534.11+"],["Chrome 31 \u2014 Mac","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"],["Chrome 31 \u2014 Windows","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"],["Chrome \u2014 Android Tablet","Mozilla/5.0 (Linux; Android 4.1.2; Nexus 7 Build/JZ054K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"],["Chrome \u2014 Android Mobile","Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"],["Firefox 14 \u2014 Android Mobile","Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0"],["Firefox 14 \u2014 Android Tablet","Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0"],["Firefox 4 \u2014 Mac","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"],["Firefox 4 \u2014 Windows","Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"],["Firefox 7 \u2014 Mac","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"],["Firefox 7 \u2014 Windows","Mozilla/5.0 (Windows NT 6.1; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"],["Internet Explorer 10","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"],["Internet Explorer 7","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"],["Internet Explorer 8","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"],["Internet Explorer 9","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"],["iPad \u2014 iOS 7","Mozilla/5.0 (iPad; CPU OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53"],["iPad \u2014 iOS 6","Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"],["iPhone \u2014 iOS 7","Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53"],["iPhone \u2014 iOS 6","Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"],["MeeGo \u2014 Nokia N9","Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13"],["Opera 18 \u2014 Mac","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"],["Opera 18 \u2014 Windows","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"],["Opera 12 \u2014 Mac","Opera/9.80 (Macintosh; Intel Mac OS X 10.9.1) Presto/2.12.388 Version/12.16"],["Opera 12 \u2014 Windows","Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.16"],];WebInspector.OverridesView.UserAgentTab.prototype={_createUserAgentSelectRowElement:function()
+{var userAgent=WebInspector.settings.userAgent.get();var userAgents=WebInspector.OverridesView.UserAgentTab._userAgents.concat([[WebInspector.UIString("Other"),"Other"]]);var fieldsetElement=WebInspector.SettingsUI.createSettingFieldset(WebInspector.settings.overrideUserAgent);if(WebInspector.OverridesSupport.isInspectingDevice())
+fieldsetElement.disabled=true;this._selectElement=fieldsetElement.createChild("select");fieldsetElement.createChild("br");this._otherUserAgentElement=fieldsetElement.createChild("input");this._otherUserAgentElement.type="text";this._otherUserAgentElement.value=userAgent;this._otherUserAgentElement.title=userAgent;var selectionRestored=false;for(var i=0;i<userAgents.length;++i){var agent=userAgents[i];var option=new Option(agent[0],agent[1]);option._metrics=agent[2]?agent[2]:"";this._selectElement.add(option);if(userAgent===agent[1]){this._selectElement.selectedIndex=i;selectionRestored=true;}}
+if(!selectionRestored){if(!userAgent)
+this._selectElement.selectedIndex=0;else
+this._selectElement.selectedIndex=userAgents.length-1;}
+this._selectElement.addEventListener("change",this._userAgentChanged.bind(this,true),false);WebInspector.settings.userAgent.addChangeListener(this._userAgentSettingChanged,this);fieldsetElement.addEventListener("dblclick",textDoubleClicked.bind(this),false);this._otherUserAgentElement.addEventListener("blur",textChanged.bind(this),false);function textDoubleClicked()
+{this._selectElement.selectedIndex=userAgents.length-1;this._userAgentChanged();}
+function textChanged()
+{if(WebInspector.settings.userAgent.get()!==this._otherUserAgentElement.value)
+WebInspector.settings.userAgent.set(this._otherUserAgentElement.value);}
+return fieldsetElement;},_userAgentChanged:function(isUserGesture)
+{var value=this._selectElement.options[this._selectElement.selectedIndex].value;if(value!=="Other"){WebInspector.settings.userAgent.set(value);this._otherUserAgentElement.value=value;this._otherUserAgentElement.title=value;this._otherUserAgentElement.disabled=true;}else{this._otherUserAgentElement.disabled=false;this._otherUserAgentElement.focus();}},_userAgentSettingChanged:function()
+{var value=WebInspector.settings.userAgent.get();var options=this._selectElement.options;var foundMatch=false;for(var i=0;i<options.length;++i){if(options[i].value===value){if(this._selectElement.selectedIndex!==i)
+this._selectElement.selectedIndex=i;foundMatch=true;break;}}
+this._otherUserAgentElement.disabled=foundMatch;if(!foundMatch)
+this._selectElement.selectedIndex=options.length-1;if(this._otherUserAgentElement.value!==value){this._otherUserAgentElement.value=value;this._otherUserAgentElement.title=value;}},__proto__:WebInspector.OverridesView.Tab.prototype}
+WebInspector.OverridesView.SensorsTab=function()
+{WebInspector.OverridesView.Tab.call(this,"sensors",WebInspector.UIString("Sensors"),[WebInspector.settings.emulateTouchEvents,WebInspector.settings.overrideGeolocation,WebInspector.settings.overrideDeviceOrientation]);this.element.classList.add("overrides-sensors");this.registerRequiredCSS("accelerometer.css");if(!WebInspector.OverridesSupport.isInspectingDevice())
+this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Emulate touch screen"),WebInspector.settings.emulateTouchEvents));this._appendGeolocationOverrideControl();this._apendDeviceOrientationOverrideControl();}
+WebInspector.OverridesView.SensorsTab.prototype={_appendGeolocationOverrideControl:function()
+{const geolocationSetting=WebInspector.settings.geolocationOverride.get();var geolocation=WebInspector.OverridesSupport.GeolocationPosition.parseSetting(geolocationSetting);this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Emulate geolocation coordinates"),WebInspector.settings.overrideGeolocation,this._geolocationOverrideCheckboxClicked.bind(this)));this.element.appendChild(this._createGeolocationOverrideElement(geolocation));this._geolocationOverrideCheckboxClicked(WebInspector.settings.overrideGeolocation.get());},_geolocationOverrideCheckboxClicked:function(enabled)
+{if(enabled&&!this._latitudeElement.value)
+this._latitudeElement.focus();},_applyGeolocationUserInput:function()
+{this._setGeolocationPosition(WebInspector.OverridesSupport.GeolocationPosition.parseUserInput(this._latitudeElement.value.trim(),this._longitudeElement.value.trim(),this._geolocationErrorElement.checked),true);},_setGeolocationPosition:function(geolocation,userInputModified)
+{if(!geolocation)
+return;if(!userInputModified){this._latitudeElement.value=geolocation.latitude;this._longitudeElement.value=geolocation.longitude;}
+var value=geolocation.toSetting();WebInspector.settings.geolocationOverride.set(value);},_createGeolocationOverrideElement:function(geolocation)
+{var fieldsetElement=WebInspector.SettingsUI.createSettingFieldset(WebInspector.settings.overrideGeolocation);fieldsetElement.id="geolocation-override-section";var tableElement=fieldsetElement.createChild("table");var rowElement=tableElement.createChild("tr");var cellElement=rowElement.createChild("td");cellElement=rowElement.createChild("td");cellElement.appendChild(document.createTextNode(WebInspector.UIString("Lat = ")));this._latitudeElement=this._createInput(cellElement,"geolocation-override-latitude",String(geolocation.latitude),this._applyGeolocationUserInput.bind(this),true);cellElement.appendChild(document.createTextNode(" , "));cellElement.appendChild(document.createTextNode(WebInspector.UIString("Lon = ")));this._longitudeElement=this._createInput(cellElement,"geolocation-override-longitude",String(geolocation.longitude),this._applyGeolocationUserInput.bind(this),true);rowElement=tableElement.createChild("tr");cellElement=rowElement.createChild("td");cellElement.colSpan=2;var geolocationErrorLabelElement=document.createElement("label");var geolocationErrorCheckboxElement=geolocationErrorLabelElement.createChild("input");geolocationErrorCheckboxElement.id="geolocation-error";geolocationErrorCheckboxElement.type="checkbox";geolocationErrorCheckboxElement.checked=!geolocation||geolocation.error;geolocationErrorCheckboxElement.addEventListener("click",this._applyGeolocationUserInput.bind(this),false);geolocationErrorLabelElement.appendChild(document.createTextNode(WebInspector.UIString("Emulate position unavailable")));this._geolocationErrorElement=geolocationErrorCheckboxElement;cellElement.appendChild(geolocationErrorLabelElement);return fieldsetElement;},_apendDeviceOrientationOverrideControl:function()
+{const deviceOrientationSetting=WebInspector.settings.deviceOrientationOverride.get();var deviceOrientation=WebInspector.OverridesSupport.DeviceOrientation.parseSetting(deviceOrientationSetting);this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Accelerometer"),WebInspector.settings.overrideDeviceOrientation,this._deviceOrientationOverrideCheckboxClicked.bind(this)));this.element.appendChild(this._createDeviceOrientationOverrideElement(deviceOrientation));this._deviceOrientationOverrideCheckboxClicked(WebInspector.settings.overrideDeviceOrientation.get());},_deviceOrientationOverrideCheckboxClicked:function(enabled)
+{if(enabled&&!this._alphaElement.value)
+this._alphaElement.focus();},_applyDeviceOrientationUserInput:function()
+{this._setDeviceOrientation(WebInspector.OverridesSupport.DeviceOrientation.parseUserInput(this._alphaElement.value.trim(),this._betaElement.value.trim(),this._gammaElement.value.trim()),WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserInput);},_resetDeviceOrientation:function()
+{this._setDeviceOrientation(new WebInspector.OverridesSupport.DeviceOrientation(0,0,0),WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.ResetButton);},_setDeviceOrientation:function(deviceOrientation,modificationSource)
+{if(!deviceOrientation)
+return;if(modificationSource!=WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserInput){this._alphaElement.value=deviceOrientation.alpha;this._betaElement.value=deviceOrientation.beta;this._gammaElement.value=deviceOrientation.gamma;}
+if(modificationSource!=WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserDrag)
+this._setBoxOrientation(deviceOrientation);var value=deviceOrientation.toSetting();WebInspector.settings.deviceOrientationOverride.set(value);},_createAxisInput:function(parentElement,id,label,defaultText)
+{var div=parentElement.createChild("div","accelerometer-axis-input-container");div.appendChild(document.createTextNode(label));return this._createInput(div,id,defaultText,this._applyDeviceOrientationUserInput.bind(this),true);},_createDeviceOrientationOverrideElement:function(deviceOrientation)
+{var fieldsetElement=WebInspector.SettingsUI.createSettingFieldset(WebInspector.settings.overrideDeviceOrientation);fieldsetElement.id="device-orientation-override-section";var tableElement=fieldsetElement.createChild("table");var rowElement=tableElement.createChild("tr");var cellElement=rowElement.createChild("td","accelerometer-inputs-cell");this._alphaElement=this._createAxisInput(cellElement,"device-orientation-override-alpha","\u03B1: ",String(deviceOrientation.alpha));this._betaElement=this._createAxisInput(cellElement,"device-orientation-override-beta","\u03B2: ",String(deviceOrientation.beta));this._gammaElement=this._createAxisInput(cellElement,"device-orientation-override-gamma","\u03B3: ",String(deviceOrientation.gamma));var resetButton=cellElement.createChild("button","settings-tab-text-button accelerometer-reset-button");resetButton.textContent=WebInspector.UIString("Reset");resetButton.addEventListener("click",this._resetDeviceOrientation.bind(this),false);this._stageElement=rowElement.createChild("td","accelerometer-stage");this._boxElement=this._stageElement.createChild("section","accelerometer-box");this._boxElement.createChild("section","front");this._boxElement.createChild("section","top");this._boxElement.createChild("section","back");this._boxElement.createChild("section","left");this._boxElement.createChild("section","right");this._boxElement.createChild("section","bottom");WebInspector.installDragHandle(this._stageElement,this._onBoxDragStart.bind(this),this._onBoxDrag.bind(this),this._onBoxDragEnd.bind(this),"move");this._setBoxOrientation(deviceOrientation);return fieldsetElement;},_setBoxOrientation:function(deviceOrientation)
+{var matrix=new WebKitCSSMatrix();this._boxMatrix=matrix.rotate(-deviceOrientation.beta,deviceOrientation.gamma,-deviceOrientation.alpha);this._boxElement.style.webkitTransform=this._boxMatrix.toString();},_onBoxDrag:function(event)
+{var mouseMoveVector=this._calculateRadiusVector(event.x,event.y);if(!mouseMoveVector)
+return true;event.consume(true);var axis=WebInspector.Geometry.crossProduct(this._mouseDownVector,mouseMoveVector);axis.normalize();var angle=WebInspector.Geometry.calculateAngle(this._mouseDownVector,mouseMoveVector);var matrix=new WebKitCSSMatrix();var rotationMatrix=matrix.rotateAxisAngle(axis.x,axis.y,axis.z,angle);this._currentMatrix=rotationMatrix.multiply(this._boxMatrix)
+this._boxElement.style.webkitTransform=this._currentMatrix;var eulerAngles=WebInspector.Geometry.EulerAngles.fromRotationMatrix(this._currentMatrix);var newOrientation=new WebInspector.OverridesSupport.DeviceOrientation(-eulerAngles.alpha,-eulerAngles.beta,eulerAngles.gamma);this._setDeviceOrientation(newOrientation,WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserDrag);return false;},_onBoxDragStart:function(event)
+{if(!WebInspector.settings.overrideDeviceOrientation.get())
+return false;this._mouseDownVector=this._calculateRadiusVector(event.x,event.y);if(!this._mouseDownVector)
+return false;event.consume(true);return true;},_onBoxDragEnd:function()
+{this._boxMatrix=this._currentMatrix;},_calculateRadiusVector:function(x,y)
+{var rect=this._stageElement.getBoundingClientRect();var radius=Math.max(rect.width,rect.height)/2;var sphereX=(x-rect.left-rect.width/2)/radius;var sphereY=(y-rect.top-rect.height/2)/radius;var sqrSum=sphereX*sphereX+sphereY*sphereY;if(sqrSum>0.5)
+return new WebInspector.Geometry.Vector(sphereX,sphereY,0.5/Math.sqrt(sqrSum));return new WebInspector.Geometry.Vector(sphereX,sphereY,Math.sqrt(1-sqrSum));},__proto__:WebInspector.OverridesView.Tab.prototype}
+WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource={UserInput:"userInput",UserDrag:"userDrag",ResetButton:"resetButton"};WebInspector.PlatformFontsSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Fonts"));this.element.classList.add("platform-fonts");WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrModified,this._onNodeChange.bind(this));WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrRemoved,this._onNodeChange.bind(this));WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.CharacterDataModified,this._onNodeChange.bind(this));this._sectionTitle=document.createElementWithClass("div","sidebar-separator");this.element.insertBefore(this._sectionTitle,this.bodyElement);this._sectionTitle.textContent=WebInspector.UIString("Rendered Fonts");this._fontStatsSection=this.bodyElement.createChild("div","stats-section");}
+WebInspector.PlatformFontsSidebarPane.prototype={_onNodeChange:function()
+{if(this._innerUpdateTimeout)
+return;this._innerUpdateTimeout=setTimeout(this._innerUpdate.bind(this),100);},update:function(node)
+{if(!node){delete this._node;return;}
+this._node=node;this._innerUpdate();},_innerUpdate:function()
+{if(this._innerUpdateTimeout){clearTimeout(this._innerUpdateTimeout);delete this._innerUpdateTimeout;}
+if(!this._node)
+return;WebInspector.cssModel.getPlatformFontsForNode(this._node.id,this._refreshUI.bind(this,this._node));},_refreshUI:function(node,cssFamilyName,platformFonts)
+{if(this._node!==node)
+return;this._fontStatsSection.removeChildren();var isEmptySection=!platformFonts||!platformFonts.length;this._sectionTitle.classList.toggle("hidden",isEmptySection);if(isEmptySection)
+return;platformFonts.sort(function(a,b){return b.glyphCount-a.glyphCount;});for(var i=0;i<platformFonts.length;++i){var fontStatElement=this._fontStatsSection.createChild("div","font-stats-item");var fontNameElement=fontStatElement.createChild("span","font-name");fontNameElement.textContent=platformFonts[i].familyName;var fontDelimeterElement=fontStatElement.createChild("span","delimeter");fontDelimeterElement.textContent="\u2014";var fontUsageElement=fontStatElement.createChild("span","font-usage");var usage=platformFonts[i].glyphCount;fontUsageElement.textContent=usage===1?WebInspector.UIString("%d glyph",usage):WebInspector.UIString("%d glyphs",usage);}},__proto__:WebInspector.SidebarPane.prototype};WebInspector.PropertiesSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Properties"));}
+WebInspector.PropertiesSidebarPane._objectGroupName="properties-sidebar-pane";WebInspector.PropertiesSidebarPane.prototype={update:function(node)
+{var body=this.bodyElement;if(!node){body.removeChildren();this.sections=[];return;}
+WebInspector.RemoteObject.resolveNode(node,WebInspector.PropertiesSidebarPane._objectGroupName,nodeResolved.bind(this));function nodeResolved(object)
+{if(!object)
+return;function protoList()
+{var proto=this;var result={};var counter=1;while(proto){result[counter++]=proto;proto=proto.__proto__;}
+return result;}
+object.callFunction(protoList,undefined,nodePrototypesReady.bind(this));object.release();}
+function nodePrototypesReady(object,wasThrown)
+{if(!object||wasThrown)
+return;object.getOwnProperties(fillSection.bind(this));}
+function fillSection(prototypes)
+{if(!prototypes)
+return;var body=this.bodyElement;body.removeChildren();this.sections=[];for(var i=0;i<prototypes.length;++i){if(!parseInt(prototypes[i].name,10))
+continue;var prototype=prototypes[i].value;var title=prototype.description;if(title.match(/Prototype$/))
+title=title.replace(/Prototype$/,"");var section=new WebInspector.ObjectPropertiesSection(prototype,title);this.sections.push(section);body.appendChild(section.element);}}},__proto__:WebInspector.SidebarPane.prototype};WebInspector.RenderingOptionsView=function()
+{WebInspector.VBox.call(this);this.registerRequiredCSS("helpScreen.css");this.element.classList.add("help-indent-labels");var div=this.element.createChild("div","settings-tab help-content help-container help-no-columns");div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show paint rectangles"),WebInspector.settings.showPaintRects));div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show composited layer borders"),WebInspector.settings.showDebugBorders));div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show FPS meter"),WebInspector.settings.showFPSCounter));div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Enable continuous page repainting"),WebInspector.settings.continuousPainting));var child=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show potential scroll bottlenecks"),WebInspector.settings.showScrollBottleneckRects);child.title=WebInspector.UIString("Shows areas of the page that slow down scrolling:\nTouch and mousewheel event listeners can delay scrolling.\nSome areas need to repaint their content when scrolled.");div.appendChild(child);}
+WebInspector.RenderingOptionsView.prototype={__proto__:WebInspector.VBox.prototype};WebInspector.StylesSidebarPane=function(computedStylePane,setPseudoClassCallback)
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Styles"));this._elementStateButton=document.createElement("button");this._elementStateButton.className="pane-title-button element-state";this._elementStateButton.title=WebInspector.UIString("Toggle Element State");this._elementStateButton.addEventListener("click",this._toggleElementStatePane.bind(this),false);this.titleElement.appendChild(this._elementStateButton);var addButton=document.createElement("button");addButton.className="pane-title-button add";addButton.id="add-style-button-test-id";addButton.title=WebInspector.UIString("New Style Rule");addButton.addEventListener("click",this._createNewRule.bind(this),false);this.titleElement.appendChild(addButton);this._computedStylePane=computedStylePane;computedStylePane.setHostingPane(this);this._setPseudoClassCallback=setPseudoClassCallback;this.element.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),true);WebInspector.settings.colorFormat.addChangeListener(this._colorFormatSettingChanged.bind(this));this._createElementStatePane();this.bodyElement.appendChild(this._elementStatePane);this._sectionsContainer=document.createElement("div");this.bodyElement.appendChild(this._sectionsContainer);this._spectrumHelper=new WebInspector.SpectrumPopupHelper();this._linkifier=new WebInspector.Linkifier(new WebInspector.Linkifier.DefaultCSSFormatter());WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetOrMediaQueryResultChanged,this);WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetOrMediaQueryResultChanged,this);WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._styleSheetOrMediaQueryResultChanged,this);WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged,this._styleSheetOrMediaQueryResultChanged,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrModified,this._attributeChanged,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.AttrRemoved,this._attributeChanged,this);WebInspector.settings.showUserAgentStyles.addChangeListener(this._showUserAgentStylesSettingChanged.bind(this));WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameResized,this._frameResized,this);this.element.classList.add("styles-pane");this.element.classList.toggle("show-user-styles",WebInspector.settings.showUserAgentStyles.get());this.element.addEventListener("mousemove",this._mouseMovedOverElement.bind(this),false);document.body.addEventListener("keydown",this._keyDown.bind(this),false);document.body.addEventListener("keyup",this._keyUp.bind(this),false);}
+WebInspector.StylesSidebarPane.PseudoIdNames=["","first-line","first-letter","before","after","selection","","-webkit-scrollbar","-webkit-file-upload-button","-webkit-input-placeholder","-webkit-slider-thumb","-webkit-search-cancel-button","-webkit-search-decoration","-webkit-search-results-decoration","-webkit-search-results-button","-webkit-media-controls-panel","-webkit-media-controls-play-button","-webkit-media-controls-mute-button","-webkit-media-controls-timeline","-webkit-media-controls-timeline-container","-webkit-media-controls-volume-slider","-webkit-media-controls-volume-slider-container","-webkit-media-controls-current-time-display","-webkit-media-controls-time-remaining-display","-webkit-media-controls-fullscreen-button","-webkit-media-controls-toggle-closed-captions-button","-webkit-media-controls-status-display","-webkit-scrollbar-thumb","-webkit-scrollbar-button","-webkit-scrollbar-track","-webkit-scrollbar-track-piece","-webkit-scrollbar-corner","-webkit-resizer","-webkit-inner-spin-button","-webkit-outer-spin-button"];WebInspector.StylesSidebarPane._colorRegex=/((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b\w+\b(?!-))/g;WebInspector.StylesSidebarPane.createExclamationMark=function(property)
+{var exclamationElement=document.createElement("div");exclamationElement.className="exclamation-mark"+(WebInspector.StylesSidebarPane._ignoreErrorsForProperty(property)?"":" warning-icon-small");exclamationElement.title=WebInspector.CSSMetadata.cssPropertiesMetainfo.keySet()[property.name.toLowerCase()]?WebInspector.UIString("Invalid property value."):WebInspector.UIString("Unknown property name.");return exclamationElement;}
+WebInspector.StylesSidebarPane._colorFormat=function(color)
+{const cf=WebInspector.Color.Format;var format;var formatSetting=WebInspector.settings.colorFormat.get();if(formatSetting===cf.Original)
+format=cf.Original;else if(formatSetting===cf.RGB)
+format=(color.hasAlpha()?cf.RGBA:cf.RGB);else if(formatSetting===cf.HSL)
+format=(color.hasAlpha()?cf.HSLA:cf.HSL);else if(!color.hasAlpha())
+format=(color.canBeShortHex()?cf.ShortHEX:cf.HEX);else
+format=cf.RGBA;return format;}
+WebInspector.StylesSidebarPane._ignoreErrorsForProperty=function(property){function hasUnknownVendorPrefix(string)
+{return!string.startsWith("-webkit-")&&/^[-_][\w\d]+-\w/.test(string);}
+var name=property.name.toLowerCase();if(name.charAt(0)==="_")
+return true;if(name==="filter")
+return true;if(name.startsWith("scrollbar-"))
+return true;if(hasUnknownVendorPrefix(name))
+return true;var value=property.value.toLowerCase();if(value.endsWith("\9"))
+return true;if(hasUnknownVendorPrefix(value))
+return true;return false;}
+WebInspector.StylesSidebarPane.prototype={_contextMenuEventFired:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems((event.target));contextMenu.show();},setFilterBoxContainers:function(matchedStylesElement,computedStylesElement)
+{matchedStylesElement.appendChild(this._createCSSFilterControl());this._computedStylePane.setFilterBoxContainer(computedStylesElement);},_createCSSFilterControl:function()
+{var filterInput=this._createPropertyFilterElement(false,searchHandler.bind(this));function searchHandler(regex)
+{this._filterRegex=regex;}
+return filterInput;},get _forcedPseudoClasses()
+{return this.node?(this.node.getUserProperty("pseudoState")||undefined):undefined;},_updateForcedPseudoStateInputs:function()
+{if(!this.node)
+return;var hasPseudoType=!!this.node.pseudoType();this._elementStateButton.classList.toggle("hidden",hasPseudoType);this._elementStatePane.classList.toggle("expanded",!hasPseudoType&&this._elementStateButton.classList.contains("toggled"));var nodePseudoState=this._forcedPseudoClasses;if(!nodePseudoState)
+nodePseudoState=[];var inputs=this._elementStatePane.inputs;for(var i=0;i<inputs.length;++i)
+inputs[i].checked=nodePseudoState.indexOf(inputs[i].state)>=0;},update:function(node,forceUpdate)
+{this._spectrumHelper.hide();this._discardElementUnderMouse();var refresh=false;if(forceUpdate)
+delete this.node;if(!forceUpdate&&(node===this.node))
+refresh=true;if(node&&node.nodeType()===Node.TEXT_NODE&&node.parentNode)
+node=node.parentNode;if(node&&node.nodeType()!==Node.ELEMENT_NODE)
+node=null;if(node)
+this.node=node;else
+node=this.node;this._updateForcedPseudoStateInputs();if(refresh)
+this._refreshUpdate();else
+this._rebuildUpdate();},_refreshUpdate:function(editedSection,forceFetchComputedStyle,userCallback)
+{var callbackWrapper=function()
+{if(this._filterRegex)
+this._updateFilter(false);if(userCallback)
+userCallback();}.bind(this);if(this._refreshUpdateInProgress){this._lastNodeForInnerRefresh=this.node;return;}
+var node=this._validateNode(userCallback);if(!node)
+return;function computedStyleCallback(computedStyle)
+{delete this._refreshUpdateInProgress;if(this._lastNodeForInnerRefresh){delete this._lastNodeForInnerRefresh;this._refreshUpdate(editedSection,forceFetchComputedStyle,callbackWrapper);return;}
+if(this.node===node&&computedStyle)
+this._innerRefreshUpdate(node,computedStyle,editedSection);callbackWrapper();}
+if(this._computedStylePane.isShowing()||forceFetchComputedStyle){this._refreshUpdateInProgress=true;WebInspector.cssModel.getComputedStyleAsync(node.id,computedStyleCallback.bind(this));}else{this._innerRefreshUpdate(node,null,editedSection);callbackWrapper();}},_rebuildUpdate:function()
+{if(this._rebuildUpdateInProgress){this._lastNodeForInnerRebuild=this.node;return;}
+var node=this._validateNode();if(!node)
+return;this._rebuildUpdateInProgress=true;var resultStyles={};function stylesCallback(matchedResult)
+{delete this._rebuildUpdateInProgress;var lastNodeForRebuild=this._lastNodeForInnerRebuild;if(lastNodeForRebuild){delete this._lastNodeForInnerRebuild;if(lastNodeForRebuild!==this.node){this._rebuildUpdate();return;}}
+if(matchedResult&&this.node===node){resultStyles.matchedCSSRules=matchedResult.matchedCSSRules;resultStyles.pseudoElements=matchedResult.pseudoElements;resultStyles.inherited=matchedResult.inherited;this._innerRebuildUpdate(node,resultStyles);}
+if(lastNodeForRebuild){this._rebuildUpdate();return;}}
+function inlineCallback(inlineStyle,attributesStyle)
+{resultStyles.inlineStyle=inlineStyle;resultStyles.attributesStyle=attributesStyle;}
+function computedCallback(computedStyle)
+{resultStyles.computedStyle=computedStyle;}
+if(this._computedStylePane.isShowing())
+WebInspector.cssModel.getComputedStyleAsync(node.id,computedCallback);WebInspector.cssModel.getInlineStylesAsync(node.id,inlineCallback);WebInspector.cssModel.getMatchedStylesAsync(node.id,true,true,stylesCallback.bind(this));},_validateNode:function(userCallback)
+{if(!this.node){this._sectionsContainer.removeChildren();this._computedStylePane.bodyElement.removeChildren();this.sections={};if(userCallback)
+userCallback();return null;}
+return this.node;},_styleSheetOrMediaQueryResultChanged:function()
+{if(this._userOperation||this._isEditingStyle)
+return;this._rebuildUpdate();},_frameResized:function()
+{function refreshContents()
+{this._rebuildUpdate();delete this._activeTimer;}
+if(this._activeTimer)
+clearTimeout(this._activeTimer);this._activeTimer=setTimeout(refreshContents.bind(this),100);},_attributeChanged:function(event)
+{if(this._isEditingStyle||this._userOperation)
+return;if(!this._canAffectCurrentStyles(event.data.node))
+return;this._rebuildUpdate();},_canAffectCurrentStyles:function(node)
+{return this.node&&(this.node===node||node.parentNode===this.node.parentNode||node.isAncestor(this.node));},_innerRefreshUpdate:function(node,computedStyle,editedSection)
+{for(var pseudoId in this.sections){var styleRules=this._refreshStyleRules(this.sections[pseudoId],computedStyle);var usedProperties={};this._markUsedProperties(styleRules,usedProperties);this._refreshSectionsForStyleRules(styleRules,usedProperties,editedSection);}
+if(computedStyle)
+this.sections[0][0].rebuildComputedTrace(this.sections[0]);this._nodeStylesUpdatedForTest(node,false);},_innerRebuildUpdate:function(node,styles)
+{this._sectionsContainer.removeChildren();this._computedStylePane.bodyElement.removeChildren();this._linkifier.reset();var styleRules=this._rebuildStyleRules(node,styles);var usedProperties={};this._markUsedProperties(styleRules,usedProperties);this.sections[0]=this._rebuildSectionsForStyleRules(styleRules,usedProperties,null);var anchorElement=this.sections[0].inheritedPropertiesSeparatorElement;if(styles.computedStyle)
+this.sections[0][0].rebuildComputedTrace(this.sections[0]);for(var i=0;i<styles.pseudoElements.length;++i){var pseudoElementCSSRules=styles.pseudoElements[i];styleRules=[];var pseudoId=pseudoElementCSSRules.pseudoId;var entry={isStyleSeparator:true,pseudoId:pseudoId};styleRules.push(entry);for(var j=pseudoElementCSSRules.rules.length-1;j>=0;--j){var rule=pseudoElementCSSRules.rules[j];styleRules.push({style:rule.style,selectorText:rule.selectorText,media:rule.media,sourceURL:rule.resourceURL(),rule:rule,editable:!!(rule.style&&rule.style.id)});}
+usedProperties={};this._markUsedProperties(styleRules,usedProperties);this.sections[pseudoId]=this._rebuildSectionsForStyleRules(styleRules,usedProperties,anchorElement);}
+if(this._filterRegex)
+this._updateFilter(false);this._nodeStylesUpdatedForTest(node,true);},_nodeStylesUpdatedForTest:function(node,rebuild)
+{},_refreshStyleRules:function(sections,computedStyle)
+{var nodeComputedStyle=computedStyle;var styleRules=[];for(var i=0;sections&&i<sections.length;++i){var section=sections[i];if(section.isBlank)
+continue;if(section.computedStyle)
+section.styleRule.style=nodeComputedStyle;var styleRule={section:section,style:section.styleRule.style,computedStyle:section.computedStyle,rule:section.rule,editable:!!(section.styleRule.style&&section.styleRule.style.id),isAttribute:section.styleRule.isAttribute,isInherited:section.styleRule.isInherited,parentNode:section.styleRule.parentNode};styleRules.push(styleRule);}
+return styleRules;},_rebuildStyleRules:function(node,styles)
+{var nodeComputedStyle=styles.computedStyle;this.sections={};var styleRules=[];function addAttributesStyle()
+{if(!styles.attributesStyle)
+return;var attrStyle={style:styles.attributesStyle,editable:false};attrStyle.selectorText=node.nodeNameInCorrectCase()+"["+WebInspector.UIString("Attributes Style")+"]";styleRules.push(attrStyle);}
+styleRules.push({computedStyle:true,selectorText:"",style:nodeComputedStyle,editable:false});if(!!node.pseudoType())
+styleRules.push({isStyleSeparator:true,isPlaceholder:true});if(styles.inlineStyle&&node.nodeType()===Node.ELEMENT_NODE){var inlineStyle={selectorText:"element.style",style:styles.inlineStyle,isAttribute:true};styleRules.push(inlineStyle);}
+var addedAttributesStyle;for(var i=styles.matchedCSSRules.length-1;i>=0;--i){var rule=styles.matchedCSSRules[i];if((rule.isUser||rule.isUserAgent)&&!addedAttributesStyle){addedAttributesStyle=true;addAttributesStyle();}
+styleRules.push({style:rule.style,selectorText:rule.selectorText,media:rule.media,sourceURL:rule.resourceURL(),rule:rule,editable:!!(rule.style&&rule.style.id)});}
+if(!addedAttributesStyle)
+addAttributesStyle();var parentNode=node.parentNode;function insertInheritedNodeSeparator(node)
+{var entry={};entry.isStyleSeparator=true;entry.node=node;styleRules.push(entry);}
+for(var parentOrdinal=0;parentOrdinal<styles.inherited.length;++parentOrdinal){var parentStyles=styles.inherited[parentOrdinal];var separatorInserted=false;if(parentStyles.inlineStyle){if(this._containsInherited(parentStyles.inlineStyle)){var inlineStyle={selectorText:WebInspector.UIString("Style Attribute"),style:parentStyles.inlineStyle,isAttribute:true,isInherited:true,parentNode:parentNode};if(!separatorInserted){insertInheritedNodeSeparator(parentNode);separatorInserted=true;}
+styleRules.push(inlineStyle);}}
+for(var i=parentStyles.matchedCSSRules.length-1;i>=0;--i){var rulePayload=parentStyles.matchedCSSRules[i];if(!this._containsInherited(rulePayload.style))
+continue;var rule=rulePayload;if(!separatorInserted){insertInheritedNodeSeparator(parentNode);separatorInserted=true;}
+styleRules.push({style:rule.style,selectorText:rule.selectorText,media:rule.media,sourceURL:rule.resourceURL(),rule:rule,isInherited:true,parentNode:parentNode,editable:!!(rule.style&&rule.style.id)});}
+parentNode=parentNode.parentNode;}
+return styleRules;},_markUsedProperties:function(styleRules,usedProperties)
+{var foundImportantProperties={};var propertyToEffectiveRule={};var inheritedPropertyToNode={};for(var i=0;i<styleRules.length;++i){var styleRule=styleRules[i];if(styleRule.computedStyle||styleRule.isStyleSeparator)
+continue;if(styleRule.section&&styleRule.section.noAffect)
+continue;styleRule.usedProperties={};var style=styleRule.style;var allProperties=style.allProperties;for(var j=0;j<allProperties.length;++j){var property=allProperties[j];if(!property.isLive||!property.parsedOk)
+continue;if(styleRule.isInherited&&!WebInspector.CSSMetadata.isPropertyInherited(property.name))
+continue;var canonicalName=WebInspector.CSSMetadata.canonicalPropertyName(property.name);if(foundImportantProperties.hasOwnProperty(canonicalName))
+continue;if(!property.important&&usedProperties.hasOwnProperty(canonicalName))
+continue;var isKnownProperty=propertyToEffectiveRule.hasOwnProperty(canonicalName);if(!isKnownProperty&&styleRule.isInherited&&!inheritedPropertyToNode[canonicalName])
+inheritedPropertyToNode[canonicalName]=styleRule.parentNode;if(property.important){if(styleRule.isInherited&&isKnownProperty&&styleRule.parentNode!==inheritedPropertyToNode[canonicalName])
+continue;foundImportantProperties[canonicalName]=true;if(isKnownProperty)
+delete propertyToEffectiveRule[canonicalName].usedProperties[canonicalName];}
+styleRule.usedProperties[canonicalName]=true;usedProperties[canonicalName]=true;propertyToEffectiveRule[canonicalName]=styleRule;}}},_refreshSectionsForStyleRules:function(styleRules,usedProperties,editedSection)
+{for(var i=0;i<styleRules.length;++i){var styleRule=styleRules[i];var section=styleRule.section;if(styleRule.computedStyle){section._usedProperties=usedProperties;section.update();}else{section._usedProperties=styleRule.usedProperties;section.update(section===editedSection);}}},_rebuildSectionsForStyleRules:function(styleRules,usedProperties,anchorElement)
+{var sections=[];for(var i=0;i<styleRules.length;++i){var styleRule=styleRules[i];if(styleRule.isStyleSeparator){var separatorElement=document.createElement("div");if(styleRule.isPlaceholder){separatorElement.className="styles-sidebar-placeholder";this._sectionsContainer.insertBefore(separatorElement,anchorElement);continue;}
+separatorElement.className="sidebar-separator";if(styleRule.node){var link=WebInspector.DOMPresentationUtils.linkifyNodeReference(styleRule.node);separatorElement.appendChild(document.createTextNode(WebInspector.UIString("Inherited from")+" "));separatorElement.appendChild(link);if(!sections.inheritedPropertiesSeparatorElement)
+sections.inheritedPropertiesSeparatorElement=separatorElement;}else if("pseudoId"in styleRule){var pseudoName=WebInspector.StylesSidebarPane.PseudoIdNames[styleRule.pseudoId];if(pseudoName)
+separatorElement.textContent=WebInspector.UIString("Pseudo ::%s element",pseudoName);else
+separatorElement.textContent=WebInspector.UIString("Pseudo element");}else
+separatorElement.textContent=styleRule.text;this._sectionsContainer.insertBefore(separatorElement,anchorElement);continue;}
+var computedStyle=styleRule.computedStyle;var editable=styleRule.editable;if(typeof editable==="undefined")
+editable=true;if(computedStyle)
+var section=new WebInspector.ComputedStylePropertiesSection(this,styleRule,usedProperties);else{var section=new WebInspector.StylePropertiesSection(this,styleRule,editable,styleRule.isInherited);section._markSelectorMatches();}
+section.expanded=true;if(computedStyle)
+this._computedStylePane.bodyElement.appendChild(section.element);else
+this._sectionsContainer.insertBefore(section.element,anchorElement);sections.push(section);}
+return sections;},_containsInherited:function(style)
+{var properties=style.allProperties;for(var i=0;i<properties.length;++i){var property=properties[i];if(property.isLive&&WebInspector.CSSMetadata.isPropertyInherited(property.name))
+return true;}
+return false;},_colorFormatSettingChanged:function(event)
+{for(var pseudoId in this.sections){var sections=this.sections[pseudoId];for(var i=0;i<sections.length;++i)
+sections[i].update(true);}},_createNewRule:function(event)
+{event.consume();this.expand();this.addBlankSection().startEditingSelector();},addBlankSection:function()
+{var blankSection=new WebInspector.BlankStylePropertiesSection(this,this.node?WebInspector.DOMPresentationUtils.simpleSelector(this.node):"");var elementStyleSection=this.sections[0][1];this._sectionsContainer.insertBefore(blankSection.element,elementStyleSection.element.nextSibling);this.sections[0].splice(2,0,blankSection);return blankSection;},removeSection:function(section)
+{for(var pseudoId in this.sections){var sections=this.sections[pseudoId];var index=sections.indexOf(section);if(index===-1)
+continue;sections.splice(index,1);section.element.remove();}},_toggleElementStatePane:function(event)
+{event.consume();var buttonToggled=!this._elementStateButton.classList.contains("toggled");if(buttonToggled)
+this.expand();this._elementStateButton.classList.toggle("toggled",buttonToggled);this._elementStatePane.classList.toggle("expanded",buttonToggled);},_createElementStatePane:function()
+{this._elementStatePane=document.createElement("div");this._elementStatePane.className="styles-element-state-pane source-code";var table=document.createElement("table");var inputs=[];this._elementStatePane.inputs=inputs;function clickListener(event)
+{var node=this._validateNode();if(!node)
+return;this._setPseudoClassCallback(node.id,event.target.state,event.target.checked);}
+function createCheckbox(state)
+{var td=document.createElement("td");var label=document.createElement("label");var input=document.createElement("input");input.type="checkbox";input.state=state;input.addEventListener("click",clickListener.bind(this),false);inputs.push(input);label.appendChild(input);label.appendChild(document.createTextNode(":"+state));td.appendChild(label);return td;}
+var tr=table.createChild("tr");tr.appendChild(createCheckbox.call(this,"active"));tr.appendChild(createCheckbox.call(this,"hover"));tr=table.createChild("tr");tr.appendChild(createCheckbox.call(this,"focus"));tr.appendChild(createCheckbox.call(this,"visited"));this._elementStatePane.appendChild(table);},filterRegex:function()
+{return this._filterRegex;},_createPropertyFilterElement:function(isComputedStyleFilter,filterCallback)
+{var input=document.createElement("input");input.type="text";input.placeholder=isComputedStyleFilter?WebInspector.UIString("Filter"):WebInspector.UIString("Find in Styles");var boundSearchHandler=searchHandler.bind(this);function searchHandler()
+{var regex=input.value?new RegExp(input.value.escapeForRegExp(),"i"):null;filterCallback(regex);input.parentNode.classList.toggle("styles-filter-engaged",!!input.value);this._updateFilter(isComputedStyleFilter);}
+input.addEventListener("input",boundSearchHandler,false);function keydownHandler(event)
+{var Esc="U+001B";if(event.keyIdentifier!==Esc||!input.value)
+return;event.consume(true);input.value="";boundSearchHandler();}
+input.addEventListener("keydown",keydownHandler,false);return input;},_updateFilter:function(isComputedStyleFilter)
+{for(var pseudoId in this.sections){var sections=this.sections[pseudoId];for(var i=0;i<sections.length;++i){var section=sections[i];if(isComputedStyleFilter!==!!section.computedStyle)
+continue;section._updateFilter();}}},_showUserAgentStylesSettingChanged:function(event)
+{var showStyles=(event.data);this.element.classList.toggle("show-user-styles",showStyles);},willHide:function()
+{this._spectrumHelper.hide();this._discardElementUnderMouse();},_discardElementUnderMouse:function()
+{if(this._elementUnderMouse)
+this._elementUnderMouse.classList.remove("styles-panel-hovered");delete this._elementUnderMouse;},_mouseMovedOverElement:function(e)
+{if(this._elementUnderMouse&&e.target!==this._elementUnderMouse)
+this._discardElementUnderMouse();this._elementUnderMouse=e.target;if(WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(e))
+this._elementUnderMouse.classList.add("styles-panel-hovered");},_keyDown:function(e)
+{if((!WebInspector.isMac()&&e.keyCode===WebInspector.KeyboardShortcut.Keys.Ctrl.code)||(WebInspector.isMac()&&e.keyCode===WebInspector.KeyboardShortcut.Keys.Meta.code)){if(this._elementUnderMouse)
+this._elementUnderMouse.classList.add("styles-panel-hovered");}},_keyUp:function(e)
+{if((!WebInspector.isMac()&&e.keyCode===WebInspector.KeyboardShortcut.Keys.Ctrl.code)||(WebInspector.isMac()&&e.keyCode===WebInspector.KeyboardShortcut.Keys.Meta.code)){this._discardElementUnderMouse();}},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.ComputedStyleSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Computed Style"));}
+WebInspector.ComputedStyleSidebarPane.prototype={setHostingPane:function(pane)
+{this._stylesSidebarPane=pane;},setFilterBoxContainer:function(element)
+{element.appendChild(this._stylesSidebarPane._createPropertyFilterElement(true,filterCallback.bind(this)));function filterCallback(regex)
+{this._filterRegex=regex;}},wasShown:function()
+{WebInspector.SidebarPane.prototype.wasShown.call(this);if(!this._hasFreshContent)
+this.prepareContent();},prepareContent:function(callback)
+{function wrappedCallback(){this._hasFreshContent=true;if(callback)
+callback();delete this._hasFreshContent;}
+this._stylesSidebarPane._refreshUpdate(null,true,wrappedCallback.bind(this));},filterRegex:function()
+{return this._filterRegex;},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.StylePropertiesSection=function(parentPane,styleRule,editable,isInherited)
+{WebInspector.PropertiesSection.call(this,"");this._parentPane=parentPane;this.styleRule=styleRule;this.rule=this.styleRule.rule;this.editable=editable;this.isInherited=isInherited;var extraClasses=(this.rule&&(this.rule.isUser||this.rule.isUserAgent)?" user-rule":"");this.element.className="styles-section matched-styles monospace"+extraClasses;this.propertiesElement.classList.remove("properties-tree");if(styleRule.media){for(var i=styleRule.media.length-1;i>=0;--i){var media=styleRule.media[i];var mediaDataElement=this.titleElement.createChild("div","media");var mediaText;switch(media.source){case WebInspector.CSSMedia.Source.LINKED_SHEET:case WebInspector.CSSMedia.Source.INLINE_SHEET:mediaText="media=\""+media.text+"\"";break;case WebInspector.CSSMedia.Source.MEDIA_RULE:mediaText="@media "+media.text;break;case WebInspector.CSSMedia.Source.IMPORT_RULE:mediaText="@import "+media.text;break;}
+if(media.sourceURL){var refElement=mediaDataElement.createChild("div","subtitle");var rawLocation;var mediaHeader;if(media.range){mediaHeader=media.header();if(mediaHeader){var lineNumber=media.lineNumberInSource();var columnNumber=media.columnNumberInSource();console.assert(typeof lineNumber!=="undefined"&&typeof columnNumber!=="undefined");rawLocation=new WebInspector.CSSLocation(media.sourceURL,lineNumber,columnNumber);}}
+var anchor;if(rawLocation)
+anchor=this._parentPane._linkifier.linkifyCSSLocation(mediaHeader.id,rawLocation);else{anchor=WebInspector.linkifyResourceAsNode(media.sourceURL,undefined,"subtitle",media.sourceURL);}
+anchor.style.float="right";refElement.appendChild(anchor);}
+var mediaTextElement=mediaDataElement.createChild("span");mediaTextElement.textContent=mediaText;mediaTextElement.title=media.text;}}
+var selectorContainer=document.createElement("div");this._selectorElement=document.createElement("span");this._selectorElement.textContent=styleRule.selectorText;selectorContainer.appendChild(this._selectorElement);var openBrace=document.createElement("span");openBrace.textContent=" {";selectorContainer.appendChild(openBrace);selectorContainer.addEventListener("mousedown",this._handleEmptySpaceMouseDown.bind(this),false);selectorContainer.addEventListener("click",this._handleSelectorContainerClick.bind(this),false);var closeBrace=document.createElement("div");closeBrace.textContent="}";this.element.appendChild(closeBrace);this._selectorElement.addEventListener("click",this._handleSelectorClick.bind(this),false);this.element.addEventListener("mousedown",this._handleEmptySpaceMouseDown.bind(this),false);this.element.addEventListener("click",this._handleEmptySpaceClick.bind(this),false);if(this.rule){if(this.rule.isUserAgent||this.rule.isUser)
+this.editable=false;else{if(this.rule.id)
+this.navigable=!!this.rule.resourceURL();}
+this.titleElement.classList.add("styles-selector");}
+this._usedProperties=styleRule.usedProperties;this._selectorRefElement=document.createElement("div");this._selectorRefElement.className="subtitle";this._updateRuleOrigin();selectorContainer.insertBefore(this._selectorRefElement,selectorContainer.firstChild);this.titleElement.appendChild(selectorContainer);this._selectorContainer=selectorContainer;if(isInherited)
+this.element.classList.add("styles-show-inherited");if(this.navigable)
+this.element.classList.add("navigable");if(!this.editable)
+this.element.classList.add("read-only");}
+WebInspector.StylePropertiesSection.prototype={get pane()
+{return this._parentPane;},collapse:function()
+{},handleClick:function()
+{},isPropertyInherited:function(propertyName)
+{if(this.isInherited){return!WebInspector.CSSMetadata.isPropertyInherited(propertyName);}
+return false;},isPropertyOverloaded:function(propertyName,isShorthand)
+{if(!this._usedProperties||this.noAffect)
+return false;if(this.isInherited&&!WebInspector.CSSMetadata.isPropertyInherited(propertyName)){return false;}
+var canonicalName=WebInspector.CSSMetadata.canonicalPropertyName(propertyName);var used=(canonicalName in this._usedProperties);if(used||!isShorthand)
+return!used;var longhandProperties=this.styleRule.style.longhandProperties(propertyName);for(var j=0;j<longhandProperties.length;++j){var individualProperty=longhandProperties[j];if(WebInspector.CSSMetadata.canonicalPropertyName(individualProperty.name)in this._usedProperties)
+return false;}
+return true;},nextEditableSibling:function()
+{var curSection=this;do{curSection=curSection.nextSibling;}while(curSection&&!curSection.editable);if(!curSection){curSection=this.firstSibling;while(curSection&&!curSection.editable)
+curSection=curSection.nextSibling;}
+return(curSection&&curSection.editable)?curSection:null;},previousEditableSibling:function()
+{var curSection=this;do{curSection=curSection.previousSibling;}while(curSection&&!curSection.editable);if(!curSection){curSection=this.lastSibling;while(curSection&&!curSection.editable)
+curSection=curSection.previousSibling;}
+return(curSection&&curSection.editable)?curSection:null;},update:function(full)
+{if(this.styleRule.selectorText)
+this._selectorElement.textContent=this.styleRule.selectorText;this._markSelectorMatches();if(full){this.propertiesTreeOutline.removeChildren();this.populated=false;}else{var child=this.propertiesTreeOutline.children[0];while(child){child.overloaded=this.isPropertyOverloaded(child.name,child.isShorthand);child=child.traverseNextTreeElement(false,null,true);}}
+this.afterUpdate();},afterUpdate:function()
+{if(this._afterUpdate){this._afterUpdate(this);delete this._afterUpdate;}},onpopulate:function()
+{var style=this.styleRule.style;var allProperties=style.allProperties;this.uniqueProperties=[];var styleHasEditableSource=this.editable&&!!style.range;if(styleHasEditableSource){for(var i=0;i<allProperties.length;++i){var property=allProperties[i];this.uniqueProperties.push(property);if(property.styleBased)
+continue;var isShorthand=!!WebInspector.CSSMetadata.cssPropertiesMetainfo.longhands(property.name);var inherited=this.isPropertyInherited(property.name);var overloaded=property.inactive||this.isPropertyOverloaded(property.name);var item=new WebInspector.StylePropertyTreeElement(this._parentPane,this.styleRule,style,property,isShorthand,inherited,overloaded);this.propertiesTreeOutline.appendChild(item);}
+return;}
+var generatedShorthands={};for(var i=0;i<allProperties.length;++i){var property=allProperties[i];this.uniqueProperties.push(property);var isShorthand=!!WebInspector.CSSMetadata.cssPropertiesMetainfo.longhands(property.name);var shorthands=isShorthand?null:WebInspector.CSSMetadata.cssPropertiesMetainfo.shorthands(property.name);var shorthandPropertyAvailable=false;for(var j=0;shorthands&&!shorthandPropertyAvailable&&j<shorthands.length;++j){var shorthand=shorthands[j];if(shorthand in generatedShorthands){shorthandPropertyAvailable=true;continue;}
+if(style.getLiveProperty(shorthand)){shorthandPropertyAvailable=true;continue;}
+if(!style.shorthandValue(shorthand)){shorthandPropertyAvailable=false;continue;}
+var shorthandProperty=new WebInspector.CSSProperty(style,style.allProperties.length,shorthand,style.shorthandValue(shorthand),false,false,true,true);var overloaded=property.inactive||this.isPropertyOverloaded(property.name,true);var item=new WebInspector.StylePropertyTreeElement(this._parentPane,this.styleRule,style,shorthandProperty,true,false,overloaded);this.propertiesTreeOutline.appendChild(item);generatedShorthands[shorthand]=shorthandProperty;shorthandPropertyAvailable=true;}
+if(shorthandPropertyAvailable)
+continue;var inherited=this.isPropertyInherited(property.name);var overloaded=property.inactive||this.isPropertyOverloaded(property.name,isShorthand);var item=new WebInspector.StylePropertyTreeElement(this._parentPane,this.styleRule,style,property,isShorthand,inherited,overloaded);this.propertiesTreeOutline.appendChild(item);}},_updateFilter:function()
+{if(this.styleRule.isAttribute)
+return;var regex=this._parentPane.filterRegex();var hideRule=regex&&!regex.test(this.element.textContent);this.element.classList.toggle("hidden",hideRule);if(hideRule)
+return;var children=this.propertiesTreeOutline.children;for(var i=0;i<children.length;++i)
+children[i]._updateFilter();if(this.styleRule.rule)
+this._markSelectorHighlights();},_markSelectorMatches:function()
+{var rule=this.styleRule.rule;if(!rule)
+return;var matchingSelectors=rule.matchingSelectors;if(this.noAffect||matchingSelectors)
+this._selectorElement.className="selector";if(!matchingSelectors)
+return;var selectors=rule.selectors;var fragment=document.createDocumentFragment();var currentMatch=0;for(var i=0;i<selectors.length;++i){if(i)
+fragment.appendChild(document.createTextNode(", "));var isSelectorMatching=matchingSelectors[currentMatch]===i;if(isSelectorMatching)
+++currentMatch;var rawLocation=new WebInspector.CSSLocation(rule.sourceURL,rule.lineNumberInSource(i),rule.columnNumberInSource(i));var matchingSelectorClass=isSelectorMatching?" selector-matches":"";var selectorElement=document.createElement("span");selectorElement.className="simple-selector"+matchingSelectorClass;if(rule.id)
+selectorElement._selectorIndex=i;selectorElement.textContent=selectors[i].value;fragment.appendChild(selectorElement);}
+this._selectorElement.removeChildren();this._selectorElement.appendChild(fragment);this._markSelectorHighlights();},_markSelectorHighlights:function()
+{var selectors=this._selectorElement.getElementsByClassName("simple-selector");var regex=this.pane.filterRegex();for(var i=0;i<selectors.length;++i){var selectorMatchesFilter=regex&&regex.test(selectors[i].textContent);selectors[i].classList.toggle("filter-match",selectorMatchesFilter);}},_checkWillCancelEditing:function()
+{var willCauseCancelEditing=this._willCauseCancelEditing;delete this._willCauseCancelEditing;return willCauseCancelEditing;},_handleSelectorContainerClick:function(event)
+{if(this._checkWillCancelEditing()||!this.editable)
+return;if(event.target===this._selectorContainer)
+this.addNewBlankProperty(0).startEditing();},addNewBlankProperty:function(index)
+{var style=this.styleRule.style;var property=style.newBlankProperty(index);var item=new WebInspector.StylePropertyTreeElement(this._parentPane,this.styleRule,style,property,false,false,false);index=property.index;this.propertiesTreeOutline.insertChild(item,index);item.listItemElement.textContent="";item._newProperty=true;item.updateTitle();return item;},_createRuleOriginNode:function()
+{function linkifyUncopyable(url,line)
+{var link=WebInspector.linkifyResourceAsNode(url,line,"",url+":"+(line+1));link.classList.add("webkit-html-resource-link");link.setAttribute("data-uncopyable",link.textContent);link.textContent="";return link;}
+if(this.styleRule.sourceURL){var firstMatchingIndex=this.styleRule.rule.matchingSelectors&&this.rule.matchingSelectors.length?this.rule.matchingSelectors[0]:0;var matchingSelectorLocation=new WebInspector.CSSLocation(this.styleRule.sourceURL,this.rule.lineNumberInSource(firstMatchingIndex),this.rule.columnNumberInSource(firstMatchingIndex));return this._parentPane._linkifier.linkifyCSSLocation(this.rule.id.styleSheetId,matchingSelectorLocation)||linkifyUncopyable(this.styleRule.sourceURL,this.rule.lineNumberInSource());}
+if(!this.rule)
+return document.createTextNode("");if(this.rule.isUserAgent)
+return document.createTextNode(WebInspector.UIString("user agent stylesheet"));if(this.rule.isUser)
+return document.createTextNode(WebInspector.UIString("user stylesheet"));if(this.rule.isViaInspector)
+return document.createTextNode(WebInspector.UIString("via inspector"));return document.createTextNode("");},_handleEmptySpaceMouseDown:function()
+{this._willCauseCancelEditing=this._parentPane._isEditingStyle;},_handleEmptySpaceClick:function(event)
+{if(!this.editable)
+return;if(!window.getSelection().isCollapsed)
+return;if(this._checkWillCancelEditing())
+return;if(event.target.classList.contains("header")||this.element.classList.contains("read-only")||event.target.enclosingNodeOrSelfWithClass("media")){event.consume();return;}
+this.expand();this.addNewBlankProperty().startEditing();},_handleSelectorClick:function(event)
+{if(WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event)&&this.navigable&&event.target.classList.contains("simple-selector")){var index=event.target._selectorIndex;var styleSheetHeader=WebInspector.cssModel.styleSheetHeaderForId(this.rule.id.styleSheetId);var uiLocation=styleSheetHeader.rawLocationToUILocation(this.rule.lineNumberInSource(index),this.rule.columnNumberInSource(index));WebInspector.Revealer.reveal(uiLocation);return;}
+this._startEditingOnMouseEvent();event.consume(true);},_startEditingOnMouseEvent:function()
+{if(!this.editable)
+return;if(!this.rule&&this.propertiesTreeOutline.children.length===0){this.expand();this.addNewBlankProperty().startEditing();return;}
+if(!this.rule)
+return;this.startEditingSelector();},startEditingSelector:function()
+{var element=this._selectorElement;if(WebInspector.isBeingEdited(element))
+return;element.scrollIntoViewIfNeeded(false);element.textContent=element.textContent;var config=new WebInspector.InplaceEditor.Config(this.editingSelectorCommitted.bind(this),this.editingSelectorCancelled.bind(this));WebInspector.InplaceEditor.startEditing(this._selectorElement,config);window.getSelection().setBaseAndExtent(element,0,element,1);this._parentPane._isEditingStyle=true;},_moveEditorFromSelector:function(moveDirection)
+{this._markSelectorMatches();if(!moveDirection)
+return;if(moveDirection==="forward"){this.expand();var firstChild=this.propertiesTreeOutline.children[0];while(firstChild&&firstChild.inherited)
+firstChild=firstChild.nextSibling;if(!firstChild)
+this.addNewBlankProperty().startEditing();else
+firstChild.startEditing(firstChild.nameElement);}else{var previousSection=this.previousEditableSibling();if(!previousSection)
+return;previousSection.expand();previousSection.addNewBlankProperty().startEditing();}},editingSelectorCommitted:function(element,newContent,oldContent,context,moveDirection)
+{this._editingSelectorEnded();if(newContent)
+newContent=newContent.trim();if(newContent===oldContent){this._selectorElement.textContent=newContent;this._moveEditorFromSelector(moveDirection);return;}
+var selectedNode=this._parentPane.node;function successCallback(newRule)
+{var doesAffectSelectedNode=newRule.matchingSelectors.length>0;if(!doesAffectSelectedNode){this.noAffect=true;this.element.classList.add("no-affect");}else{delete this.noAffect;this.element.classList.remove("no-affect");}
+this.rule=newRule;this.styleRule={section:this,style:newRule.style,selectorText:newRule.selectorText,media:newRule.media,sourceURL:newRule.resourceURL(),rule:newRule};this._parentPane.update(selectedNode);this._updateRuleOrigin();finishOperationAndMoveEditor.call(this,moveDirection);}
+function finishOperationAndMoveEditor(direction)
+{delete this._parentPane._userOperation;this._moveEditorFromSelector(direction);}
+this._parentPane._userOperation=true;WebInspector.cssModel.setRuleSelector(this.rule.id,selectedNode?selectedNode.id:0,newContent,successCallback.bind(this),finishOperationAndMoveEditor.bind(this,moveDirection));},_updateRuleOrigin:function()
+{this._selectorRefElement.removeChildren();this._selectorRefElement.appendChild(this._createRuleOriginNode());},_editingSelectorEnded:function()
+{delete this._parentPane._isEditingStyle;},editingSelectorCancelled:function()
+{this._editingSelectorEnded();this._markSelectorMatches();},__proto__:WebInspector.PropertiesSection.prototype}
+WebInspector.ComputedStylePropertiesSection=function(stylesPane,styleRule,usedProperties)
+{WebInspector.PropertiesSection.call(this,"");var subtitle=this.headerElement.createChild("div","sidebar-pane-subtitle vbox");var showInheritedCheckbox=new WebInspector.Checkbox(WebInspector.UIString("Show inherited properties"),"hbox");subtitle.appendChild(showInheritedCheckbox.element);this._hasFreshContent=false;function showInheritedToggleFunction()
+{var showInherited=showInheritedCheckbox.checked;WebInspector.settings.showInheritedComputedStyleProperties.set(showInherited);if(showInherited)
+this.element.classList.add("styles-show-inherited");else
+this.element.classList.remove("styles-show-inherited");}
+showInheritedCheckbox.addEventListener(showInheritedToggleFunction.bind(this));this.element.className="styles-section monospace read-only computed-style";if(WebInspector.settings.showInheritedComputedStyleProperties.get()){this.element.classList.add("styles-show-inherited");showInheritedCheckbox.checked=true;}
+this._stylesPane=stylesPane;this.styleRule=styleRule;this._usedProperties=usedProperties;this._alwaysShowComputedProperties={"display":true,"height":true,"width":true};this.computedStyle=true;this._propertyTreeElements={};this._expandedPropertyNames={};}
+WebInspector.ComputedStylePropertiesSection.prototype={collapse:function(dontRememberState)
+{},_isPropertyInherited:function(propertyName)
+{var canonicalName=WebInspector.CSSMetadata.canonicalPropertyName(propertyName);return!(canonicalName in this._usedProperties)&&!(canonicalName in this._alwaysShowComputedProperties);},update:function()
+{this._expandedPropertyNames={};for(var name in this._propertyTreeElements){if(this._propertyTreeElements[name].expanded)
+this._expandedPropertyNames[name]=true;}
+this._propertyTreeElements={};this.propertiesTreeOutline.removeChildren();this.populated=false;},_updateFilter:function()
+{var children=this.propertiesTreeOutline.children;for(var i=0;i<children.length;++i)
+children[i]._updateFilter();},onpopulate:function()
+{function sorter(a,b)
+{return a.name.compareTo(b.name);}
+var style=this.styleRule.style;if(!style)
+return;var uniqueProperties=[];var allProperties=style.allProperties;for(var i=0;i<allProperties.length;++i)
+uniqueProperties.push(allProperties[i]);uniqueProperties.sort(sorter);this._propertyTreeElements={};for(var i=0;i<uniqueProperties.length;++i){var property=uniqueProperties[i];var inherited=this._isPropertyInherited(property.name);var item=new WebInspector.ComputedStylePropertyTreeElement(this._stylesPane,this.styleRule,style,property,inherited);this.propertiesTreeOutline.appendChild(item);this._propertyTreeElements[property.name]=item;}},rebuildComputedTrace:function(sections)
+{for(var i=0;i<sections.length;++i){var section=sections[i];if(section.computedStyle||section.isBlank)
+continue;for(var j=0;j<section.uniqueProperties.length;++j){var property=section.uniqueProperties[j];if(property.disabled)
+continue;if(section.isInherited&&!WebInspector.CSSMetadata.isPropertyInherited(property.name))
+continue;var treeElement=this._propertyTreeElements[property.name.toLowerCase()];if(treeElement){var fragment=document.createDocumentFragment();var selector=fragment.createChild("span");selector.style.color="gray";selector.textContent=section.styleRule.selectorText;fragment.appendChild(document.createTextNode(" - "+property.value+" "));var subtitle=fragment.createChild("span");subtitle.style.float="right";subtitle.appendChild(section._createRuleOriginNode());var childElement=new TreeElement(fragment,null,false);treeElement.appendChild(childElement);if(property.inactive||section.isPropertyOverloaded(property.name))
+childElement.listItemElement.classList.add("overloaded");if(!property.parsedOk){childElement.listItemElement.classList.add("not-parsed-ok");childElement.listItemElement.insertBefore(WebInspector.StylesSidebarPane.createExclamationMark(property),childElement.listItemElement.firstChild);if(WebInspector.StylesSidebarPane._ignoreErrorsForProperty(property))
+childElement.listItemElement.classList.add("has-ignorable-error");}}}}
+for(var name in this._expandedPropertyNames){if(name in this._propertyTreeElements)
+this._propertyTreeElements[name].expand();}},__proto__:WebInspector.PropertiesSection.prototype}
+WebInspector.BlankStylePropertiesSection=function(stylesPane,defaultSelectorText)
+{WebInspector.StylePropertiesSection.call(this,stylesPane,{selectorText:defaultSelectorText,rule:{isViaInspector:true}},true,false);this.element.classList.add("blank-section");}
+WebInspector.BlankStylePropertiesSection.prototype={get isBlank()
+{return!this._normal;},expand:function()
+{if(!this.isBlank)
+WebInspector.StylePropertiesSection.prototype.expand.call(this);},editingSelectorCommitted:function(element,newContent,oldContent,context,moveDirection)
+{if(!this.isBlank){WebInspector.StylePropertiesSection.prototype.editingSelectorCommitted.call(this,element,newContent,oldContent,context,moveDirection);return;}
+function successCallback(newRule)
+{var doesSelectorAffectSelectedNode=newRule.matchingSelectors.length>0;var styleRule={section:this,style:newRule.style,selectorText:newRule.selectorText,sourceURL:newRule.resourceURL(),rule:newRule};this.makeNormal(styleRule);if(!doesSelectorAffectSelectedNode){this.noAffect=true;this.element.classList.add("no-affect");}
+this._updateRuleOrigin();this.expand();if(this.element.parentElement)
+this._moveEditorFromSelector(moveDirection);delete this._parentPane._userOperation;this._editingSelectorEnded();this._markSelectorMatches();}
+if(newContent)
+newContent=newContent.trim();this._parentPane._userOperation=true;WebInspector.cssModel.requestViaInspectorStylesheet(this.pane.node,viaInspectorCallback.bind(this));function viaInspectorCallback(styleSheetHeader)
+{if(!styleSheetHeader){this.editingSelectorCancelled();return;}
+WebInspector.cssModel.addRule(styleSheetHeader.id,this.pane.node,newContent,successCallback.bind(this),this.editingSelectorCancelled.bind(this));}},editingSelectorCancelled:function()
+{delete this._parentPane._userOperation;if(!this.isBlank){WebInspector.StylePropertiesSection.prototype.editingSelectorCancelled.call(this);return;}
+this._editingSelectorEnded();this.pane.removeSection(this);},makeNormal:function(styleRule)
+{this.element.classList.remove("blank-section");this.styleRule=styleRule;this.rule=styleRule.rule;this._normal=true;},__proto__:WebInspector.StylePropertiesSection.prototype}
+WebInspector.StylePropertyTreeElementBase=function(styleRule,style,property,inherited,overloaded,hasChildren)
+{this._styleRule=styleRule;this.style=style;this.property=property;this._inherited=inherited;this._overloaded=overloaded;TreeElement.call(this,"",null,hasChildren);this.selectable=false;}
+WebInspector.StylePropertyTreeElementBase.prototype={node:function()
+{return null;},editablePane:function()
+{return null;},parentPane:function()
+{throw"Not implemented";},get inherited()
+{return this._inherited;},hasIgnorableError:function()
+{return!this.parsedOk&&WebInspector.StylesSidebarPane._ignoreErrorsForProperty(this.property);},set inherited(x)
+{if(x===this._inherited)
+return;this._inherited=x;this.updateState();},get overloaded()
+{return this._overloaded;},set overloaded(x)
+{if(x===this._overloaded)
+return;this._overloaded=x;this.updateState();},get disabled()
+{return this.property.disabled;},get name()
+{if(!this.disabled||!this.property.text)
+return this.property.name;var text=this.property.text;var index=text.indexOf(":");if(index<1)
+return this.property.name;text=text.substring(0,index).trim();if(text.startsWith("/*"))
+text=text.substring(2).trim();return text;},get value()
+{if(!this.disabled||!this.property.text)
+return this.property.value;var match=this.property.text.match(/(.*);\s*/);if(!match||!match[1])
+return this.property.value;var text=match[1];var index=text.indexOf(":");if(index<1)
+return this.property.value;return text.substring(index+1).trim();},get parsedOk()
+{return this.property.parsedOk;},onattach:function()
+{this.updateTitle();},updateTitle:function()
+{var value=this.value;this.updateState();var nameElement=document.createElement("span");nameElement.className="webkit-css-property";nameElement.textContent=this.name;nameElement.title=this.property.propertyText;this.nameElement=nameElement;this._expandElement=document.createElement("span");this._expandElement.className="expand-element";var valueElement=document.createElement("span");valueElement.className="value";this.valueElement=valueElement;function processValue(regex,processor,nextProcessor,valueText)
+{var container=document.createDocumentFragment();var items=valueText.replace(regex,"\0$1\0").split("\0");for(var i=0;i<items.length;++i){if((i%2)===0){if(nextProcessor)
+container.appendChild(nextProcessor(items[i]));else
+container.appendChild(document.createTextNode(items[i]));}else{var processedNode=processor(items[i]);if(processedNode)
+container.appendChild(processedNode);}}
+return container;}
+function linkifyURL(url)
+{var hrefUrl=url;var match=hrefUrl.match(/['"]?([^'"]+)/);if(match)
+hrefUrl=match[1];var container=document.createDocumentFragment();container.appendChild(document.createTextNode("url("));if(this._styleRule.sourceURL)
+hrefUrl=WebInspector.ParsedURL.completeURL(this._styleRule.sourceURL,hrefUrl);else if(this.node())
+hrefUrl=this.node().resolveURL(hrefUrl);var hasResource=hrefUrl&&!!WebInspector.resourceForURL(hrefUrl);container.appendChild(WebInspector.linkifyURLAsNode(hrefUrl||url,url,undefined,!hasResource));container.appendChild(document.createTextNode(")"));return container;}
+if(value){var colorProcessor=processValue.bind(null,WebInspector.StylesSidebarPane._colorRegex,this._processColor.bind(this,nameElement,valueElement),null);valueElement.appendChild(processValue(/url\(\s*([^)]+)\s*\)/g,linkifyURL.bind(this),WebInspector.CSSMetadata.isColorAwareProperty(this.name)&&this.parsedOk?colorProcessor:null,value));}
+this.listItemElement.removeChildren();nameElement.normalize();valueElement.normalize();if(!this.treeOutline)
+return;if(this.disabled)
+this.listItemElement.createChild("span","styles-clipboard-only").createTextChild("/* ");this.listItemElement.appendChild(nameElement);this.listItemElement.appendChild(document.createTextNode(": "));this.listItemElement.appendChild(this._expandElement);this.listItemElement.appendChild(valueElement);this.listItemElement.appendChild(document.createTextNode(";"));if(this.disabled)
+this.listItemElement.createChild("span","styles-clipboard-only").createTextChild(" */");if(!this.parsedOk){this.hasChildren=false;this.listItemElement.classList.add("not-parsed-ok");this.listItemElement.insertBefore(WebInspector.StylesSidebarPane.createExclamationMark(this.property),this.listItemElement.firstChild);}
+if(this.property.inactive)
+this.listItemElement.classList.add("inactive");this._updateFilter();},_updateFilter:function()
+{var regEx=this.parentPane().filterRegex();this.listItemElement.classList.toggle("filter-match",!!regEx&&(regEx.test(this.property.name)||regEx.test(this.property.value)));},_processColor:function(nameElement,valueElement,text)
+{var color=WebInspector.Color.parse(text);if(!color)
+return document.createTextNode(text);var format=WebInspector.StylesSidebarPane._colorFormat(color);var spectrumHelper=this.editablePane()&&this.editablePane()._spectrumHelper;var spectrum=spectrumHelper?spectrumHelper.spectrum():null;var isEditable=!!(this._styleRule&&this._styleRule.editable!==false);var colorSwatch=new WebInspector.ColorSwatch(!isEditable);colorSwatch.setColorString(text);colorSwatch.element.addEventListener("click",swatchClick.bind(this),false);var scrollerElement;var boundSpectrumChanged=spectrumChanged.bind(this);var boundSpectrumHidden=spectrumHidden.bind(this);function spectrumChanged(e)
+{var colorString=(e.data);spectrum.displayText=colorString;colorValueElement.textContent=colorString;colorSwatch.setColorString(colorString);this.applyStyleText(nameElement.textContent+": "+valueElement.textContent,false,false,false);}
+function spectrumHidden(event)
+{if(scrollerElement)
+scrollerElement.removeEventListener("scroll",repositionSpectrum,false);var commitEdit=event.data;var propertyText=!commitEdit&&this.originalPropertyText?this.originalPropertyText:(nameElement.textContent+": "+valueElement.textContent);this.applyStyleText(propertyText,true,true,false);spectrum.removeEventListener(WebInspector.Spectrum.Events.ColorChanged,boundSpectrumChanged);spectrumHelper.removeEventListener(WebInspector.SpectrumPopupHelper.Events.Hidden,boundSpectrumHidden);delete this.editablePane()._isEditingStyle;delete this.originalPropertyText;}
+function repositionSpectrum()
+{spectrumHelper.reposition(colorSwatch.element);}
+function swatchClick(e)
+{e.consume(true);if(!spectrumHelper||e.shiftKey){changeColorDisplay();return;}
+if(!isEditable)
+return;var visible=spectrumHelper.toggle(colorSwatch.element,color,format);if(visible){spectrum.displayText=color.toString(format);this.originalPropertyText=this.property.propertyText;this.editablePane()._isEditingStyle=true;spectrum.addEventListener(WebInspector.Spectrum.Events.ColorChanged,boundSpectrumChanged);spectrumHelper.addEventListener(WebInspector.SpectrumPopupHelper.Events.Hidden,boundSpectrumHidden);scrollerElement=colorSwatch.element.enclosingNodeOrSelfWithClass("scroll-target");if(scrollerElement)
+scrollerElement.addEventListener("scroll",repositionSpectrum,false);else
+console.error("Unable to handle color picker scrolling");}}
+var colorValueElement=document.createElement("span");colorValueElement.textContent=color.toString(format);function nextFormat(curFormat)
+{var cf=WebInspector.Color.Format;switch(curFormat){case cf.Original:return!color.hasAlpha()?cf.RGB:cf.RGBA;case cf.RGB:case cf.RGBA:return!color.hasAlpha()?cf.HSL:cf.HSLA;case cf.HSL:case cf.HSLA:if(color.nickname())
+return cf.Nickname;if(!color.hasAlpha())
+return color.canBeShortHex()?cf.ShortHEX:cf.HEX;else
+return cf.Original;case cf.ShortHEX:return cf.HEX;case cf.HEX:return cf.Original;case cf.Nickname:if(!color.hasAlpha())
+return color.canBeShortHex()?cf.ShortHEX:cf.HEX;else
+return cf.Original;default:return cf.RGBA;}}
+function changeColorDisplay()
+{do{format=nextFormat(format);var currentValue=color.toString(format);}while(currentValue===colorValueElement.textContent);colorValueElement.textContent=currentValue;}
+var container=document.createElement("nobr");container.appendChild(colorSwatch.element);container.appendChild(colorValueElement);return container;},updateState:function()
+{if(!this.listItemElement)
+return;if(this.style.isPropertyImplicit(this.name))
+this.listItemElement.classList.add("implicit");else
+this.listItemElement.classList.remove("implicit");if(this.hasIgnorableError())
+this.listItemElement.classList.add("has-ignorable-error");else
+this.listItemElement.classList.remove("has-ignorable-error");if(this.inherited)
+this.listItemElement.classList.add("inherited");else
+this.listItemElement.classList.remove("inherited");if(this.overloaded)
+this.listItemElement.classList.add("overloaded");else
+this.listItemElement.classList.remove("overloaded");if(this.disabled)
+this.listItemElement.classList.add("disabled");else
+this.listItemElement.classList.remove("disabled");},__proto__:TreeElement.prototype}
+WebInspector.ComputedStylePropertyTreeElement=function(stylesPane,styleRule,style,property,inherited)
+{WebInspector.StylePropertyTreeElementBase.call(this,styleRule,style,property,inherited,false,false);this._stylesPane=stylesPane;}
+WebInspector.ComputedStylePropertyTreeElement.prototype={node:function()
+{return this._stylesPane.node;},editablePane:function()
+{return null;},parentPane:function()
+{return this._stylesPane._computedStylePane;},_updateFilter:function()
+{var regEx=this.parentPane().filterRegex();this.listItemElement.classList.toggle("hidden",!!regEx&&(!regEx.test(this.property.name)&&!regEx.test(this.property.value)));},__proto__:WebInspector.StylePropertyTreeElementBase.prototype}
+WebInspector.StylePropertyTreeElement=function(stylesPane,styleRule,style,property,isShorthand,inherited,overloaded)
+{WebInspector.StylePropertyTreeElementBase.call(this,styleRule,style,property,inherited,overloaded,isShorthand);this._parentPane=stylesPane;this.isShorthand=isShorthand;}
+WebInspector.StylePropertyTreeElement.prototype={node:function()
+{return this._parentPane.node;},editablePane:function()
+{return this._parentPane;},parentPane:function()
+{return this._parentPane;},section:function()
+{return this.treeOutline&&this.treeOutline.section;},_updatePane:function(userCallback)
+{var section=this.section();if(section&&section.pane)
+section.pane._refreshUpdate(section,false,userCallback);else{if(userCallback)
+userCallback();}},toggleEnabled:function(event)
+{var disabled=!event.target.checked;function callback(newStyle)
+{delete this._parentPane._userOperation;if(!newStyle)
+return;newStyle.parentRule=this.style.parentRule;this.style=newStyle;this._styleRule.style=newStyle;var section=this.section();if(section&&section.pane)
+section.pane.dispatchEventToListeners("style property toggled");this._updatePane();}
+this._parentPane._userOperation=true;this.property.setDisabled(disabled,callback.bind(this));event.consume();},onpopulate:function()
+{if(this.children.length||!this.isShorthand)
+return;var longhandProperties=this.style.longhandProperties(this.name);for(var i=0;i<longhandProperties.length;++i){var name=longhandProperties[i].name;var inherited=false;var overloaded=false;var section=this.section();if(section){inherited=section.isPropertyInherited(name);overloaded=section.isPropertyOverloaded(name);}
+var liveProperty=this.style.getLiveProperty(name);if(!liveProperty)
+continue;var item=new WebInspector.StylePropertyTreeElement(this._parentPane,this._styleRule,this.style,liveProperty,false,inherited,overloaded);this.appendChild(item);}},onattach:function()
+{WebInspector.StylePropertyTreeElementBase.prototype.onattach.call(this);this.listItemElement.addEventListener("mousedown",this._mouseDown.bind(this));this.listItemElement.addEventListener("mouseup",this._resetMouseDownElement.bind(this));this.listItemElement.addEventListener("click",this._mouseClick.bind(this));},_mouseDown:function(event)
+{if(this._parentPane){this._parentPane._mouseDownTreeElement=this;this._parentPane._mouseDownTreeElementIsName=this._isNameElement(event.target);this._parentPane._mouseDownTreeElementIsValue=this._isValueElement(event.target);}},_resetMouseDownElement:function()
+{if(this._parentPane){delete this._parentPane._mouseDownTreeElement;delete this._parentPane._mouseDownTreeElementIsName;delete this._parentPane._mouseDownTreeElementIsValue;}},updateTitle:function()
+{WebInspector.StylePropertyTreeElementBase.prototype.updateTitle.call(this);if(this.parsedOk&&this.section()&&this.parent.root){var enabledCheckboxElement=document.createElement("input");enabledCheckboxElement.className="enabled-button";enabledCheckboxElement.type="checkbox";enabledCheckboxElement.checked=!this.disabled;enabledCheckboxElement.addEventListener("click",this.toggleEnabled.bind(this),false);this.listItemElement.insertBefore(enabledCheckboxElement,this.listItemElement.firstChild);}},_mouseClick:function(event)
+{if(!window.getSelection().isCollapsed)
+return;event.consume(true);if(event.target===this.listItemElement){var section=this.section();if(!section||!section.editable)
+return;if(section._checkWillCancelEditing())
+return;section.addNewBlankProperty(this.property.index+1).startEditing();return;}
+if(WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event)&&this.section().navigable){this._navigateToSource(event.target);return;}
+this.startEditing(event.target);},_navigateToSource:function(element)
+{console.assert(this.section().navigable);var propertyNameClicked=element===this.nameElement;WebInspector.Revealer.reveal(this.property.uiLocation(propertyNameClicked));},_isNameElement:function(element)
+{return element.enclosingNodeOrSelfWithClass("webkit-css-property")===this.nameElement;},_isValueElement:function(element)
+{return!!element.enclosingNodeOrSelfWithClass("value");},startEditing:function(selectElement)
+{if(this.parent.isShorthand)
+return;if(selectElement===this._expandElement)
+return;var section=this.section();if(section&&!section.editable)
+return;if(!selectElement)
+selectElement=this.nameElement;else
+selectElement=selectElement.enclosingNodeOrSelfWithClass("webkit-css-property")||selectElement.enclosingNodeOrSelfWithClass("value");if(WebInspector.isBeingEdited(selectElement))
+return;var isEditingName=selectElement===this.nameElement;if(!isEditingName)
+this.valueElement.textContent=restoreURLs(this.valueElement.textContent,this.value);function restoreURLs(fieldValue,modelValue)
+{const urlRegex=/\b(url\([^)]*\))/g;var splitFieldValue=fieldValue.split(urlRegex);if(splitFieldValue.length===1)
+return fieldValue;var modelUrlRegex=new RegExp(urlRegex);for(var i=1;i<splitFieldValue.length;i+=2){var match=modelUrlRegex.exec(modelValue);if(match)
+splitFieldValue[i]=match[0];}
+return splitFieldValue.join("");}
+var context={expanded:this.expanded,hasChildren:this.hasChildren,isEditingName:isEditingName,previousContent:selectElement.textContent};this.hasChildren=false;if(selectElement.parentElement)
+selectElement.parentElement.classList.add("child-editing");selectElement.textContent=selectElement.textContent;function pasteHandler(context,event)
+{var data=event.clipboardData.getData("Text");if(!data)
+return;var colonIdx=data.indexOf(":");if(colonIdx<0)
+return;var name=data.substring(0,colonIdx).trim();var value=data.substring(colonIdx+1).trim();event.preventDefault();if(!("originalName"in context)){context.originalName=this.nameElement.textContent;context.originalValue=this.valueElement.textContent;}
+this.property.name=name;this.property.value=value;this.nameElement.textContent=name;this.valueElement.textContent=value;this.nameElement.normalize();this.valueElement.normalize();this.editingCommitted(event.target.textContent,context,"forward");}
+function blurListener(context,event)
+{var treeElement=this._parentPane._mouseDownTreeElement;var moveDirection="";if(treeElement===this){if(isEditingName&&this._parentPane._mouseDownTreeElementIsValue)
+moveDirection="forward";if(!isEditingName&&this._parentPane._mouseDownTreeElementIsName)
+moveDirection="backward";}
+this.editingCommitted(event.target.textContent,context,moveDirection);}
+delete this.originalPropertyText;this._parentPane._isEditingStyle=true;if(selectElement.parentElement)
+selectElement.parentElement.scrollIntoViewIfNeeded(false);var applyItemCallback=!isEditingName?this._applyFreeFlowStyleTextEdit.bind(this,true):undefined;this._prompt=new WebInspector.StylesSidebarPane.CSSPropertyPrompt(isEditingName?WebInspector.CSSMetadata.cssPropertiesMetainfo:WebInspector.CSSMetadata.keywordsForProperty(this.nameElement.textContent),this,isEditingName);if(applyItemCallback){this._prompt.addEventListener(WebInspector.TextPrompt.Events.ItemApplied,applyItemCallback,this);this._prompt.addEventListener(WebInspector.TextPrompt.Events.ItemAccepted,applyItemCallback,this);}
+var proxyElement=this._prompt.attachAndStartEditing(selectElement,blurListener.bind(this,context));proxyElement.addEventListener("keydown",this.editingNameValueKeyDown.bind(this,context),false);proxyElement.addEventListener("keypress",this.editingNameValueKeyPress.bind(this,context),false);if(isEditingName)
+proxyElement.addEventListener("paste",pasteHandler.bind(this,context),false);window.getSelection().setBaseAndExtent(selectElement,0,selectElement,1);},editingNameValueKeyDown:function(context,event)
+{if(event.handled)
+return;var isEditingName=context.isEditingName;var result;if(isEnterKey(event)){event.preventDefault();result="forward";}else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Esc.code||event.keyIdentifier==="U+001B")
+result="cancel";else if(!isEditingName&&this._newProperty&&event.keyCode===WebInspector.KeyboardShortcut.Keys.Backspace.code){var selection=window.getSelection();if(selection.isCollapsed&&!selection.focusOffset){event.preventDefault();result="backward";}}else if(event.keyIdentifier==="U+0009"){result=event.shiftKey?"backward":"forward";event.preventDefault();}
+if(result){switch(result){case"cancel":this.editingCancelled(null,context);break;case"forward":case"backward":this.editingCommitted(event.target.textContent,context,result);break;}
+event.consume();return;}
+if(!isEditingName)
+this._applyFreeFlowStyleTextEdit(false);},editingNameValueKeyPress:function(context,event)
+{function shouldCommitValueSemicolon(text,cursorPosition)
+{var openQuote="";for(var i=0;i<cursorPosition;++i){var ch=text[i];if(ch==="\\"&&openQuote!=="")
+++i;else if(!openQuote&&(ch==="\""||ch==="'"))
+openQuote=ch;else if(openQuote===ch)
+openQuote="";}
+return!openQuote;}
+var keyChar=String.fromCharCode(event.charCode);var isFieldInputTerminated=(context.isEditingName?keyChar===":":keyChar===";"&&shouldCommitValueSemicolon(event.target.textContent,event.target.selectionLeftOffset()));if(isFieldInputTerminated){event.consume(true);this.editingCommitted(event.target.textContent,context,"forward");return;}},_applyFreeFlowStyleTextEdit:function(now)
+{if(this._applyFreeFlowStyleTextEditTimer)
+clearTimeout(this._applyFreeFlowStyleTextEditTimer);function apply()
+{var valueText=this.valueElement.textContent;if(valueText.indexOf(";")===-1)
+this.applyStyleText(this.nameElement.textContent+": "+valueText,false,false,false);}
+if(now)
+apply.call(this);else
+this._applyFreeFlowStyleTextEditTimer=setTimeout(apply.bind(this),100);},kickFreeFlowStyleEditForTest:function()
+{this._applyFreeFlowStyleTextEdit(true);},editingEnded:function(context)
+{this._resetMouseDownElement();if(this._applyFreeFlowStyleTextEditTimer)
+clearTimeout(this._applyFreeFlowStyleTextEditTimer);this.hasChildren=context.hasChildren;if(context.expanded)
+this.expand();var editedElement=context.isEditingName?this.nameElement:this.valueElement;if(editedElement.parentElement)
+editedElement.parentElement.classList.remove("child-editing");delete this._parentPane._isEditingStyle;},editingCancelled:function(element,context)
+{this._removePrompt();this._revertStyleUponEditingCanceled(this.originalPropertyText);this.editingEnded(context);},_revertStyleUponEditingCanceled:function(originalPropertyText)
+{if(typeof originalPropertyText==="string"){delete this.originalPropertyText;this.applyStyleText(originalPropertyText,true,false,true);}else{if(this._newProperty)
+this.treeOutline.removeChild(this);else
+this.updateTitle();}},_findSibling:function(moveDirection)
+{var target=this;do{target=(moveDirection==="forward"?target.nextSibling:target.previousSibling);}while(target&&target.inherited);return target;},editingCommitted:function(userInput,context,moveDirection)
+{this._removePrompt();this.editingEnded(context);var isEditingName=context.isEditingName;var createNewProperty,moveToPropertyName,moveToSelector;var isDataPasted="originalName"in context;var isDirtyViaPaste=isDataPasted&&(this.nameElement.textContent!==context.originalName||this.valueElement.textContent!==context.originalValue);var isPropertySplitPaste=isDataPasted&&isEditingName&&this.valueElement.textContent!==context.originalValue;var moveTo=this;var moveToOther=(isEditingName^(moveDirection==="forward"));var abandonNewProperty=this._newProperty&&!userInput&&(moveToOther||isEditingName);if(moveDirection==="forward"&&(!isEditingName||isPropertySplitPaste)||moveDirection==="backward"&&isEditingName){moveTo=moveTo._findSibling(moveDirection);if(moveTo)
+moveToPropertyName=moveTo.name;else if(moveDirection==="forward"&&(!this._newProperty||userInput))
+createNewProperty=true;else if(moveDirection==="backward")
+moveToSelector=true;}
+var moveToIndex=moveTo&&this.treeOutline?this.treeOutline.children.indexOf(moveTo):-1;var blankInput=/^\s*$/.test(userInput);var shouldCommitNewProperty=this._newProperty&&(isPropertySplitPaste||moveToOther||(!moveDirection&&!isEditingName)||(isEditingName&&blankInput));var section=this.section();if(((userInput!==context.previousContent||isDirtyViaPaste)&&!this._newProperty)||shouldCommitNewProperty){section._afterUpdate=moveToNextCallback.bind(this,this._newProperty,!blankInput,section);var propertyText;if(blankInput||(this._newProperty&&/^\s*$/.test(this.valueElement.textContent)))
+propertyText="";else{if(isEditingName)
+propertyText=userInput+": "+this.property.value;else
+propertyText=this.property.name+": "+userInput;}
+this.applyStyleText(propertyText,true,true,false);}else{if(isEditingName)
+this.property.name=userInput;else
+this.property.value=userInput;if(!isDataPasted&&!this._newProperty)
+this.updateTitle();moveToNextCallback.call(this,this._newProperty,false,section);}
+function moveToNextCallback(alreadyNew,valueChanged,section)
+{if(!moveDirection)
+return;if(moveTo&&moveTo.parent){moveTo.startEditing(!isEditingName?moveTo.nameElement:moveTo.valueElement);return;}
+if(moveTo&&!moveTo.parent){var propertyElements=section.propertiesTreeOutline.children;if(moveDirection==="forward"&&blankInput&&!isEditingName)
+--moveToIndex;if(moveToIndex>=propertyElements.length&&!this._newProperty)
+createNewProperty=true;else{var treeElement=moveToIndex>=0?propertyElements[moveToIndex]:null;if(treeElement){var elementToEdit=!isEditingName||isPropertySplitPaste?treeElement.nameElement:treeElement.valueElement;if(alreadyNew&&blankInput)
+elementToEdit=moveDirection==="forward"?treeElement.nameElement:treeElement.valueElement;treeElement.startEditing(elementToEdit);return;}else if(!alreadyNew)
+moveToSelector=true;}}
+if(createNewProperty){if(alreadyNew&&!valueChanged&&(isEditingName^(moveDirection==="backward")))
+return;section.addNewBlankProperty().startEditing();return;}
+if(abandonNewProperty){moveTo=this._findSibling(moveDirection);var sectionToEdit=(moveTo||moveDirection==="backward")?section:section.nextEditableSibling();if(sectionToEdit){if(sectionToEdit.rule)
+sectionToEdit.startEditingSelector();else
+sectionToEdit._moveEditorFromSelector(moveDirection);}
+return;}
+if(moveToSelector){if(section.rule)
+section.startEditingSelector();else
+section._moveEditorFromSelector(moveDirection);}}},_removePrompt:function()
+{if(this._prompt){this._prompt.detach();delete this._prompt;}},_hasBeenModifiedIncrementally:function()
+{return typeof this.originalPropertyText==="string"||(!!this.property.propertyText&&this._newProperty);},applyStyleText:function(styleText,updateInterface,majorChange,isRevert)
+{function userOperationFinishedCallback(parentPane,updateInterface)
+{if(updateInterface)
+delete parentPane._userOperation;}
+if(!isRevert&&!updateInterface&&!this._hasBeenModifiedIncrementally()){this.originalPropertyText=this.property.propertyText;}
+if(!this.treeOutline)
+return;var section=this.section();styleText=styleText.replace(/\s/g," ").trim();var styleTextLength=styleText.length;if(!styleTextLength&&updateInterface&&!isRevert&&this._newProperty&&!this._hasBeenModifiedIncrementally()){this.parent.removeChild(this);section.afterUpdate();return;}
+var currentNode=this._parentPane.node;if(updateInterface)
+this._parentPane._userOperation=true;function callback(userCallback,originalPropertyText,newStyle)
+{if(!newStyle){if(updateInterface){this._revertStyleUponEditingCanceled(originalPropertyText);}
+userCallback();return;}
+if(this._newProperty)
+this._newPropertyInStyle=true;newStyle.parentRule=this.style.parentRule;this.style=newStyle;this.property=newStyle.propertyAt(this.property.index);this._styleRule.style=this.style;if(section&&section.pane)
+section.pane.dispatchEventToListeners("style edited");if(updateInterface&&currentNode===this.node()){this._updatePane(userCallback);return;}
+userCallback();}
+if(styleText.length&&!/;\s*$/.test(styleText))
+styleText+=";";var overwriteProperty=!!(!this._newProperty||this._newPropertyInStyle);this.property.setText(styleText,majorChange,overwriteProperty,callback.bind(this,userOperationFinishedCallback.bind(null,this._parentPane,updateInterface),this.originalPropertyText));},ondblclick:function()
+{return true;},isEventWithinDisclosureTriangle:function(event)
+{return event.target===this._expandElement;},__proto__:WebInspector.StylePropertyTreeElementBase.prototype}
+WebInspector.StylesSidebarPane.CSSPropertyPrompt=function(cssCompletions,sidebarPane,isEditingName)
+{WebInspector.TextPrompt.call(this,this._buildPropertyCompletions.bind(this),WebInspector.StyleValueDelimiters);this.setSuggestBoxEnabled("generic-suggest");this._cssCompletions=cssCompletions;this._sidebarPane=sidebarPane;this._isEditingName=isEditingName;if(!isEditingName)
+this.disableDefaultSuggestionForEmptyInput();}
+WebInspector.StylesSidebarPane.CSSPropertyPrompt.prototype={onKeyDown:function(event)
+{switch(event.keyIdentifier){case"Up":case"Down":case"PageUp":case"PageDown":if(this._handleNameOrValueUpDown(event)){event.preventDefault();return true;}
+break;case"Enter":if(this.autoCompleteElement&&!this.autoCompleteElement.textContent.length){this.tabKeyPressed();return true;}
+break;}
+return WebInspector.TextPrompt.prototype.onKeyDown.call(this,event);},onMouseWheel:function(event)
+{if(this._handleNameOrValueUpDown(event)){event.consume(true);return;}
+WebInspector.TextPrompt.prototype.onMouseWheel.call(this,event);},tabKeyPressed:function()
+{this.acceptAutoComplete();return false;},_handleNameOrValueUpDown:function(event)
+{function finishHandler(originalValue,replacementString)
+{this._sidebarPane.applyStyleText(this._sidebarPane.nameElement.textContent+": "+this._sidebarPane.valueElement.textContent,false,false,false);}
+if(!this._isEditingName&&WebInspector.handleElementValueModifications(event,this._sidebarPane.valueElement,finishHandler.bind(this),this._isValueSuggestion.bind(this)))
+return true;return false;},_isValueSuggestion:function(word)
+{if(!word)
+return false;word=word.toLowerCase();return this._cssCompletions.keySet().hasOwnProperty(word);},_buildPropertyCompletions:function(proxyElement,wordRange,force,completionsReadyCallback)
+{var prefix=wordRange.toString().toLowerCase();if(!prefix&&!force&&(this._isEditingName||proxyElement.textContent.length)){completionsReadyCallback([]);return;}
+var results=this._cssCompletions.startsWith(prefix);var selectedIndex=this._cssCompletions.mostUsedOf(results);completionsReadyCallback(results,selectedIndex);},__proto__:WebInspector.TextPrompt.prototype};WebInspector.ElementsPanel=function()
+{WebInspector.Panel.call(this,"elements");this.registerRequiredCSS("breadcrumbList.css");this.registerRequiredCSS("elementsPanel.css");this.registerRequiredCSS("textPrompt.css");this.setHideOnDetach();this._splitView=new WebInspector.SplitView(true,true,"elementsPanelSplitViewState",325,325);this._splitView.addEventListener(WebInspector.SplitView.Events.SidebarSizeChanged,this._updateTreeOutlineVisibleWidth.bind(this));this._splitView.show(this.element);this._searchableView=new WebInspector.SearchableView(this);this._searchableView.setMinimumSize(25,19);this._searchableView.show(this._splitView.mainElement());var stackElement=this._searchableView.element;this.contentElement=stackElement.createChild("div");this.contentElement.id="elements-content";this.contentElement.classList.add("outline-disclosure");this.contentElement.classList.add("source-code");if(!WebInspector.settings.domWordWrap.get())
+this.contentElement.classList.add("nowrap");WebInspector.settings.domWordWrap.addChangeListener(this._domWordWrapSettingChanged.bind(this));this.contentElement.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),true);this._splitView.sidebarElement().addEventListener("contextmenu",this._sidebarContextMenuEventFired.bind(this),false);this.treeOutline=new WebInspector.ElementsTreeOutline(true,true,this._populateContextMenu.bind(this),this._setPseudoClassForNodeId.bind(this));this.treeOutline.wireToDomAgent();this.treeOutline.addEventListener(WebInspector.ElementsTreeOutline.Events.SelectedNodeChanged,this._selectedNodeChanged,this);this.treeOutline.addEventListener(WebInspector.ElementsTreeOutline.Events.ElementsTreeUpdated,this._updateBreadcrumbIfNeeded,this);var crumbsContainer=stackElement.createChild("div");crumbsContainer.id="elements-crumbs";this.crumbsElement=crumbsContainer.createChild("div","crumbs");this.crumbsElement.addEventListener("mousemove",this._mouseMovedInCrumbs.bind(this),false);this.crumbsElement.addEventListener("mouseout",this._mouseMovedOutOfCrumbs.bind(this),false);this.sidebarPanes={};this.sidebarPanes.platformFonts=new WebInspector.PlatformFontsSidebarPane();this.sidebarPanes.computedStyle=new WebInspector.ComputedStyleSidebarPane();this.sidebarPanes.styles=new WebInspector.StylesSidebarPane(this.sidebarPanes.computedStyle,this._setPseudoClassForNodeId.bind(this));this._matchedStylesFilterBoxContainer=document.createElement("div");this._matchedStylesFilterBoxContainer.className="sidebar-pane-filter-box";this._computedStylesFilterBoxContainer=document.createElement("div");this._computedStylesFilterBoxContainer.className="sidebar-pane-filter-box";this.sidebarPanes.styles.setFilterBoxContainers(this._matchedStylesFilterBoxContainer,this._computedStylesFilterBoxContainer);this.sidebarPanes.metrics=new WebInspector.MetricsSidebarPane();this.sidebarPanes.properties=new WebInspector.PropertiesSidebarPane();this.sidebarPanes.domBreakpoints=WebInspector.domBreakpointsSidebarPane.createProxy(this);this.sidebarPanes.eventListeners=new WebInspector.EventListenersSidebarPane();this.sidebarPanes.styles.addEventListener(WebInspector.SidebarPane.EventTypes.wasShown,this.updateStyles.bind(this,false));this.sidebarPanes.metrics.addEventListener(WebInspector.SidebarPane.EventTypes.wasShown,this.updateMetrics.bind(this));this.sidebarPanes.platformFonts.addEventListener(WebInspector.SidebarPane.EventTypes.wasShown,this.updatePlatformFonts.bind(this));this.sidebarPanes.properties.addEventListener(WebInspector.SidebarPane.EventTypes.wasShown,this.updateProperties.bind(this));this.sidebarPanes.eventListeners.addEventListener(WebInspector.SidebarPane.EventTypes.wasShown,this.updateEventListeners.bind(this));this.sidebarPanes.styles.addEventListener("style edited",this._stylesPaneEdited,this);this.sidebarPanes.styles.addEventListener("style property toggled",this._stylesPaneEdited,this);this.sidebarPanes.metrics.addEventListener("metrics edited",this._metricsPaneEdited,this);this._extensionSidebarPanes=[];WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged,this._dockSideChanged.bind(this));WebInspector.settings.splitVerticallyWhenDockedToRight.addChangeListener(this._dockSideChanged.bind(this));this._dockSideChanged();this._popoverHelper=new WebInspector.PopoverHelper(this.element,this._getPopoverAnchor.bind(this),this._showPopover.bind(this));this._popoverHelper.setTimeout(0);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdated,this._documentUpdatedEvent,this);WebInspector.settings.showUAShadowDOM.addChangeListener(this._showUAShadowDOMChanged.bind(this));WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.ModelWasEnabled,this._updateSidebars,this);}
+WebInspector.ElementsPanel.prototype={_updateTreeOutlineVisibleWidth:function()
+{if(!this.treeOutline)
+return;var width=this._splitView.element.offsetWidth;if(this._splitView.isVertical())
+width-=this._splitView.sidebarSize();this.treeOutline.setVisibleWidth(width);this.treeOutline.updateSelection();this.updateBreadcrumbSizes();},defaultFocusedElement:function()
+{return this.treeOutline.element;},searchableView:function()
+{return this._searchableView;},wasShown:function()
+{if(this.treeOutline.element.parentElement!==this.contentElement)
+this.contentElement.appendChild(this.treeOutline.element);WebInspector.Panel.prototype.wasShown.call(this);this.updateBreadcrumb();this.treeOutline.updateSelection();this.treeOutline.setVisible(true);if(!this.treeOutline.rootDOMNode)
+if(WebInspector.domModel.existingDocument())
+this._documentUpdated(WebInspector.domModel.existingDocument());else
+WebInspector.domModel.requestDocument();},willHide:function()
+{WebInspector.domModel.hideDOMNodeHighlight();this.treeOutline.setVisible(false);this._popoverHelper.hidePopover();this.contentElement.removeChild(this.treeOutline.element);WebInspector.Panel.prototype.willHide.call(this);},onResize:function()
+{this._updateTreeOutlineVisibleWidth();},omitDefaultSelection:function()
+{this._omitDefaultSelection=true;},stopOmittingDefaultSelection:function()
+{delete this._omitDefaultSelection;},_setPseudoClassForNodeId:function(nodeId,pseudoClass,enable)
+{var node=WebInspector.domModel.nodeForId(nodeId);if(!node)
+return;var pseudoClasses=node.getUserProperty(WebInspector.ElementsTreeOutline.PseudoStateDecorator.PropertyName);if(enable){pseudoClasses=pseudoClasses||[];if(pseudoClasses.indexOf(pseudoClass)>=0)
+return;pseudoClasses.push(pseudoClass);node.setUserProperty(WebInspector.ElementsTreeOutline.PseudoStateDecorator.PropertyName,pseudoClasses);}else{if(!pseudoClasses||pseudoClasses.indexOf(pseudoClass)<0)
+return;pseudoClasses.remove(pseudoClass);if(!pseudoClasses.length)
+node.removeUserProperty(WebInspector.ElementsTreeOutline.PseudoStateDecorator.PropertyName);}
+this.treeOutline.updateOpenCloseTags(node);WebInspector.cssModel.forcePseudoState(node.id,node.getUserProperty(WebInspector.ElementsTreeOutline.PseudoStateDecorator.PropertyName));this._metricsPaneEdited();this._stylesPaneEdited();WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.ForcedElementState,selector:WebInspector.DOMPresentationUtils.fullQualifiedSelector(node,false),enabled:enable,state:pseudoClass});},_selectedNodeChanged:function()
+{var selectedNode=this.selectedDOMNode();if(!selectedNode&&this._lastValidSelectedNode)
+this._selectedPathOnReset=this._lastValidSelectedNode.path();this.updateBreadcrumb(false);this._updateSidebars();if(selectedNode){ConsoleAgent.addInspectedNode(selectedNode.id);this._lastValidSelectedNode=selectedNode;}
+WebInspector.notifications.dispatchEventToListeners(WebInspector.NotificationService.Events.SelectedNodeChanged);},_updateSidebars:function()
+{for(var pane in this.sidebarPanes)
+this.sidebarPanes[pane].needsUpdate=true;this.updateStyles(true);this.updateMetrics();this.updatePlatformFonts();this.updateProperties();this.updateEventListeners();},_reset:function()
+{delete this.currentQuery;},_documentUpdatedEvent:function(event)
+{this._documentUpdated(event.data);},_documentUpdated:function(inspectedRootDocument)
+{this._reset();this.searchCanceled();this.treeOutline.rootDOMNode=inspectedRootDocument;if(!inspectedRootDocument){if(this.isShowing())
+WebInspector.domModel.requestDocument();return;}
+WebInspector.domBreakpointsSidebarPane.restoreBreakpoints();function selectNode(candidateFocusNode)
+{if(!candidateFocusNode)
+candidateFocusNode=inspectedRootDocument.body||inspectedRootDocument.documentElement;if(!candidateFocusNode)
+return;this.selectDOMNode(candidateFocusNode);if(this.treeOutline.selectedTreeElement)
+this.treeOutline.selectedTreeElement.expand();}
+function selectLastSelectedNode(nodeId)
+{if(this.selectedDOMNode()){return;}
+var node=nodeId?WebInspector.domModel.nodeForId(nodeId):null;selectNode.call(this,node);}
+if(this._omitDefaultSelection)
+return;if(this._selectedPathOnReset)
+WebInspector.domModel.pushNodeByPathToFrontend(this._selectedPathOnReset,selectLastSelectedNode.bind(this));else
+selectNode.call(this,null);delete this._selectedPathOnReset;},searchCanceled:function()
+{delete this._searchQuery;this._hideSearchHighlights();this._searchableView.updateSearchMatchesCount(0);delete this._currentSearchResultIndex;delete this._searchResults;WebInspector.domModel.cancelSearch();},performSearch:function(query,shouldJump)
+{this.searchCanceled();const whitespaceTrimmedQuery=query.trim();if(!whitespaceTrimmedQuery.length)
+return;this._searchQuery=query;function resultCountCallback(resultCount)
+{this._searchableView.updateSearchMatchesCount(resultCount);if(!resultCount)
+return;this._searchResults=new Array(resultCount);this._currentSearchResultIndex=-1;if(shouldJump)
+this.jumpToNextSearchResult();}
+WebInspector.domModel.performSearch(whitespaceTrimmedQuery,resultCountCallback.bind(this));},_contextMenuEventFired:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);this.treeOutline.populateContextMenu(contextMenu,event);contextMenu.show();},_domWordWrapSettingChanged:function(event)
+{if(event.data)
+this.contentElement.classList.remove("nowrap");else
+this.contentElement.classList.add("nowrap");var selectedNode=this.selectedDOMNode();if(!selectedNode)
+return;var treeElement=this.treeOutline.findTreeElement(selectedNode);if(treeElement)
+treeElement.updateSelection();},switchToAndFocus:function(node)
+{this._searchableView.cancelSearch();WebInspector.inspectorView.setCurrentPanel(this);this.selectDOMNode(node,true);},_populateContextMenu:function(contextMenu,node)
+{contextMenu.appendSeparator();var pane=WebInspector.domBreakpointsSidebarPane;pane.populateNodeContextMenu(node,contextMenu);},_getPopoverAnchor:function(element)
+{var anchor=element.enclosingNodeOrSelfWithClass("webkit-html-resource-link");if(anchor){if(!anchor.href)
+return null;var resource=WebInspector.resourceTreeModel.resourceForURL(anchor.href);if(!resource||resource.type!==WebInspector.resourceTypes.Image)
+return null;anchor.removeAttribute("title");}
+return anchor;},_loadDimensionsForNode:function(treeElement,callback)
+{if(treeElement.treeOutline!==this.treeOutline){callback();return;}
+var node=(treeElement.representedObject);if(!node.nodeName()||node.nodeName().toLowerCase()!=="img"){callback();return;}
+WebInspector.RemoteObject.resolveNode(node,"",resolvedNode);function resolvedNode(object)
+{if(!object){callback();return;}
+object.callFunctionJSON(dimensions,undefined,callback);object.release();function dimensions()
+{return{offsetWidth:this.offsetWidth,offsetHeight:this.offsetHeight,naturalWidth:this.naturalWidth,naturalHeight:this.naturalHeight};}}},_showPopover:function(anchor,popover)
+{var listItem=anchor.enclosingNodeOrSelfWithNodeName("li");if(listItem&&listItem.treeElement)
+this._loadDimensionsForNode(listItem.treeElement,WebInspector.DOMPresentationUtils.buildImagePreviewContents.bind(WebInspector.DOMPresentationUtils,anchor.href,true,showPopover));else
+WebInspector.DOMPresentationUtils.buildImagePreviewContents(anchor.href,true,showPopover);function showPopover(contents)
+{if(!contents)
+return;popover.setCanShrink(false);popover.show(contents,anchor);}},jumpToNextSearchResult:function()
+{if(!this._searchResults)
+return;this._hideSearchHighlights();if(++this._currentSearchResultIndex>=this._searchResults.length)
+this._currentSearchResultIndex=0;this._highlightCurrentSearchResult();},jumpToPreviousSearchResult:function()
+{if(!this._searchResults)
+return;this._hideSearchHighlights();if(--this._currentSearchResultIndex<0)
+this._currentSearchResultIndex=(this._searchResults.length-1);this._highlightCurrentSearchResult();},_highlightCurrentSearchResult:function()
+{var index=this._currentSearchResultIndex;var searchResults=this._searchResults;var searchResult=searchResults[index];if(searchResult===null){this._searchableView.updateCurrentMatchIndex(index);return;}
+function searchCallback(node)
+{searchResults[index]=node;this._highlightCurrentSearchResult();}
+if(typeof searchResult==="undefined"){WebInspector.domModel.searchResult(index,searchCallback.bind(this));return;}
+this._searchableView.updateCurrentMatchIndex(index);var treeElement=this.treeOutline.findTreeElement(searchResult);if(treeElement){treeElement.highlightSearchResults(this._searchQuery);treeElement.reveal();var matches=treeElement.listItemElement.getElementsByClassName("highlighted-search-result");if(matches.length)
+matches[0].scrollIntoViewIfNeeded();}},_hideSearchHighlights:function()
+{if(!this._searchResults)
+return;var searchResult=this._searchResults[this._currentSearchResultIndex];if(!searchResult)
+return;var treeElement=this.treeOutline.findTreeElement(searchResult);if(treeElement)
+treeElement.hideSearchHighlights();},selectedDOMNode:function()
+{return this.treeOutline.selectedDOMNode();},selectDOMNode:function(node,focus)
+{this.treeOutline.selectDOMNode(node,focus);},_updateBreadcrumbIfNeeded:function(event)
+{var nodes=(event.data||[]);if(!nodes.length)
+return;var crumbs=this.crumbsElement;for(var crumb=crumbs.firstChild;crumb;crumb=crumb.nextSibling){if(nodes.indexOf(crumb.representedObject)!==-1){this.updateBreadcrumb(true);return;}}},_stylesPaneEdited:function()
+{this.sidebarPanes.metrics.needsUpdate=true;this.updateMetrics();this.sidebarPanes.platformFonts.needsUpdate=true;this.updatePlatformFonts();},_metricsPaneEdited:function()
+{this.sidebarPanes.styles.needsUpdate=true;this.updateStyles(true);},_mouseMovedInCrumbs:function(event)
+{var nodeUnderMouse=document.elementFromPoint(event.pageX,event.pageY);var crumbElement=nodeUnderMouse.enclosingNodeOrSelfWithClass("crumb");WebInspector.domModel.highlightDOMNode(crumbElement?crumbElement.representedObject.id:0);if("_mouseOutOfCrumbsTimeout"in this){clearTimeout(this._mouseOutOfCrumbsTimeout);delete this._mouseOutOfCrumbsTimeout;}},_mouseMovedOutOfCrumbs:function(event)
+{var nodeUnderMouse=document.elementFromPoint(event.pageX,event.pageY);if(nodeUnderMouse&&nodeUnderMouse.isDescendant(this.crumbsElement))
+return;WebInspector.domModel.hideDOMNodeHighlight();this._mouseOutOfCrumbsTimeout=setTimeout(this.updateBreadcrumbSizes.bind(this),1000);},updateBreadcrumb:function(forceUpdate)
+{if(!this.isShowing())
+return;var crumbs=this.crumbsElement;var handled=false;var crumb=crumbs.firstChild;while(crumb){if(crumb.representedObject===this.selectedDOMNode()){crumb.classList.add("selected");handled=true;}else{crumb.classList.remove("selected");}
+crumb=crumb.nextSibling;}
+if(handled&&!forceUpdate){this.updateBreadcrumbSizes();return;}
+crumbs.removeChildren();var panel=this;function selectCrumbFunction(event)
+{var crumb=event.currentTarget;if(crumb.classList.contains("collapsed")){if(crumb===panel.crumbsElement.firstChild){var currentCrumb=crumb;while(currentCrumb){var hidden=currentCrumb.classList.contains("hidden");var collapsed=currentCrumb.classList.contains("collapsed");if(!hidden&&!collapsed)
+break;crumb=currentCrumb;currentCrumb=currentCrumb.nextSibling;}}
+panel.updateBreadcrumbSizes(crumb);}else
+panel.selectDOMNode(crumb.representedObject,true);event.preventDefault();}
+for(var current=this.selectedDOMNode();current;current=current.parentNode){if(current.nodeType()===Node.DOCUMENT_NODE)
+continue;crumb=document.createElement("span");crumb.className="crumb";crumb.representedObject=current;crumb.addEventListener("mousedown",selectCrumbFunction,false);var crumbTitle="";switch(current.nodeType()){case Node.ELEMENT_NODE:if(current.pseudoType())
+crumbTitle="::"+current.pseudoType();else
+WebInspector.DOMPresentationUtils.decorateNodeLabel(current,crumb);break;case Node.TEXT_NODE:crumbTitle=WebInspector.UIString("(text)");break;case Node.COMMENT_NODE:crumbTitle="<!-->";break;case Node.DOCUMENT_TYPE_NODE:crumbTitle="<!DOCTYPE>";break;case Node.DOCUMENT_FRAGMENT_NODE:crumbTitle=current.shadowRootType()?"#shadow-root":current.nodeNameInCorrectCase();break;default:crumbTitle=current.nodeNameInCorrectCase();}
+if(!crumb.childNodes.length){var nameElement=document.createElement("span");nameElement.textContent=crumbTitle;crumb.appendChild(nameElement);crumb.title=crumbTitle;}
+if(current===this.selectedDOMNode())
+crumb.classList.add("selected");crumbs.insertBefore(crumb,crumbs.firstChild);}
+this.updateBreadcrumbSizes();},updateBreadcrumbSizes:function(focusedCrumb)
+{if(!this.isShowing())
+return;var crumbs=this.crumbsElement;if(!crumbs.firstChild)
+return;var selectedIndex=0;var focusedIndex=0;var selectedCrumb;for(var i=0;i<crumbs.childNodes.length;++i){var crumb=crumbs.childNodes[i];if(!selectedCrumb&&crumb.classList.contains("selected")){selectedCrumb=crumb;selectedIndex=i;}
+if(crumb===focusedCrumb)
+focusedIndex=i;crumb.classList.remove("compact","collapsed","hidden");}
+var contentElementWidth=this.contentElement.offsetWidth;var normalSizes=[];for(var i=0;i<crumbs.childNodes.length;++i){var crumb=crumbs.childNodes[i];normalSizes[i]=crumb.offsetWidth;}
+var compactSizes=[];for(var i=0;i<crumbs.childNodes.length;++i){var crumb=crumbs.childNodes[i];crumb.classList.add("compact");}
+for(var i=0;i<crumbs.childNodes.length;++i){var crumb=crumbs.childNodes[i];compactSizes[i]=crumb.offsetWidth;}
+crumbs.firstChild.classList.add("collapsed");var collapsedSize=crumbs.firstChild.offsetWidth;for(var i=0;i<crumbs.childNodes.length;++i){var crumb=crumbs.childNodes[i];crumb.classList.remove("compact","collapsed");}
+function crumbsAreSmallerThanContainer()
+{var totalSize=0;for(var i=0;i<crumbs.childNodes.length;++i){var crumb=crumbs.childNodes[i];if(crumb.classList.contains("hidden"))
+continue;if(crumb.classList.contains("collapsed")){totalSize+=collapsedSize;continue;}
+totalSize+=crumb.classList.contains("compact")?compactSizes[i]:normalSizes[i];}
+const rightPadding=10;return totalSize+rightPadding<contentElementWidth;}
+if(crumbsAreSmallerThanContainer())
+return;var BothSides=0;var AncestorSide=-1;var ChildSide=1;function makeCrumbsSmaller(shrinkingFunction,direction)
+{var significantCrumb=focusedCrumb||selectedCrumb;var significantIndex=significantCrumb===selectedCrumb?selectedIndex:focusedIndex;function shrinkCrumbAtIndex(index)
+{var shrinkCrumb=crumbs.childNodes[index];if(shrinkCrumb&&shrinkCrumb!==significantCrumb)
+shrinkingFunction(shrinkCrumb);if(crumbsAreSmallerThanContainer())
+return true;return false;}
+if(direction){var index=(direction>0?0:crumbs.childNodes.length-1);while(index!==significantIndex){if(shrinkCrumbAtIndex(index))
+return true;index+=(direction>0?1:-1);}}else{var startIndex=0;var endIndex=crumbs.childNodes.length-1;while(startIndex!=significantIndex||endIndex!=significantIndex){var startDistance=significantIndex-startIndex;var endDistance=endIndex-significantIndex;if(startDistance>=endDistance)
+var index=startIndex++;else
+var index=endIndex--;if(shrinkCrumbAtIndex(index))
+return true;}}
+return false;}
+function coalesceCollapsedCrumbs()
+{var crumb=crumbs.firstChild;var collapsedRun=false;var newStartNeeded=false;var newEndNeeded=false;while(crumb){var hidden=crumb.classList.contains("hidden");if(!hidden){var collapsed=crumb.classList.contains("collapsed");if(collapsedRun&&collapsed){crumb.classList.add("hidden");crumb.classList.remove("compact");crumb.classList.remove("collapsed");if(crumb.classList.contains("start")){crumb.classList.remove("start");newStartNeeded=true;}
+if(crumb.classList.contains("end")){crumb.classList.remove("end");newEndNeeded=true;}
+continue;}
+collapsedRun=collapsed;if(newEndNeeded){newEndNeeded=false;crumb.classList.add("end");}}else
+collapsedRun=true;crumb=crumb.nextSibling;}
+if(newStartNeeded){crumb=crumbs.lastChild;while(crumb){if(!crumb.classList.contains("hidden")){crumb.classList.add("start");break;}
+crumb=crumb.previousSibling;}}}
+function compact(crumb)
+{if(crumb.classList.contains("hidden"))
+return;crumb.classList.add("compact");}
+function collapse(crumb,dontCoalesce)
+{if(crumb.classList.contains("hidden"))
+return;crumb.classList.add("collapsed");crumb.classList.remove("compact");if(!dontCoalesce)
+coalesceCollapsedCrumbs();}
+if(!focusedCrumb){if(makeCrumbsSmaller(compact,ChildSide))
+return;if(makeCrumbsSmaller(collapse,ChildSide))
+return;}
+if(makeCrumbsSmaller(compact,focusedCrumb?BothSides:AncestorSide))
+return;if(makeCrumbsSmaller(collapse,focusedCrumb?BothSides:AncestorSide))
+return;if(!selectedCrumb)
+return;compact(selectedCrumb);if(crumbsAreSmallerThanContainer())
+return;collapse(selectedCrumb,true);},updateStyles:function(forceUpdate)
+{if(!WebInspector.cssModel.isEnabled())
+return;var stylesSidebarPane=this.sidebarPanes.styles;var computedStylePane=this.sidebarPanes.computedStyle;if((!stylesSidebarPane.isShowing()&&!computedStylePane.isShowing())||!stylesSidebarPane.needsUpdate)
+return;stylesSidebarPane.update(this.selectedDOMNode(),forceUpdate);stylesSidebarPane.needsUpdate=false;},updateMetrics:function()
+{if(!WebInspector.cssModel.isEnabled())
+return;var metricsSidebarPane=this.sidebarPanes.metrics;if(!metricsSidebarPane.isShowing()||!metricsSidebarPane.needsUpdate)
+return;metricsSidebarPane.update(this.selectedDOMNode());metricsSidebarPane.needsUpdate=false;},updatePlatformFonts:function()
+{if(!WebInspector.cssModel.isEnabled())
+return;var platformFontsSidebar=this.sidebarPanes.platformFonts;if(!platformFontsSidebar.isShowing()||!platformFontsSidebar.needsUpdate)
+return;platformFontsSidebar.update(this.selectedDOMNode());platformFontsSidebar.needsUpdate=false;},updateProperties:function()
+{var propertiesSidebarPane=this.sidebarPanes.properties;if(!propertiesSidebarPane.isShowing()||!propertiesSidebarPane.needsUpdate)
+return;propertiesSidebarPane.update(this.selectedDOMNode());propertiesSidebarPane.needsUpdate=false;},updateEventListeners:function()
+{var eventListenersSidebarPane=this.sidebarPanes.eventListeners;if(!eventListenersSidebarPane.isShowing()||!eventListenersSidebarPane.needsUpdate)
+return;eventListenersSidebarPane.update(this.selectedDOMNode());eventListenersSidebarPane.needsUpdate=false;},handleShortcut:function(event)
+{function handleUndoRedo()
+{if(WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event)&&!event.shiftKey&&event.keyIdentifier==="U+005A"){WebInspector.domModel.undo(this._updateSidebars.bind(this));event.handled=true;return;}
+var isRedoKey=WebInspector.isMac()?event.metaKey&&event.shiftKey&&event.keyIdentifier==="U+005A":event.ctrlKey&&event.keyIdentifier==="U+0059";if(isRedoKey){DOMAgent.redo(this._updateSidebars.bind(this));event.handled=true;}}
+if(!this.treeOutline.editing()){handleUndoRedo.call(this);if(event.handled)
+return;}
+this.treeOutline.handleShortcut(event);},handleCopyEvent:function(event)
+{var currentFocusElement=WebInspector.currentFocusElement();if(currentFocusElement&&WebInspector.isBeingEdited(currentFocusElement))
+return;if(!window.getSelection().isCollapsed)
+return;event.clipboardData.clearData();event.preventDefault();this.selectedDOMNode().copyNode();},_leaveUserAgentShadowDOM:function(node)
+{var userAgentShadowRoot=node.ancestorUserAgentShadowRoot();return userAgentShadowRoot?(userAgentShadowRoot.parentNode):node;},revealAndSelectNode:function(nodeId)
+{WebInspector.inspectorView.setCurrentPanel(this);var node=WebInspector.domModel.nodeForId(nodeId);if(!node)
+return;node=WebInspector.settings.showUAShadowDOM.get()?node:this._leaveUserAgentShadowDOM(node);WebInspector.domModel.highlightDOMNodeForTwoSeconds(nodeId);this.selectDOMNode(node,true);},appendApplicableItems:function(event,contextMenu,target)
+{function selectNode(nodeId)
+{if(nodeId)
+WebInspector.domModel.inspectElement(nodeId);}
+function revealElement(remoteObject)
+{remoteObject.pushNodeToFrontend(selectNode);}
+var commandCallback;if(target instanceof WebInspector.RemoteObject){var remoteObject=(target);if(remoteObject.subtype==="node")
+commandCallback=revealElement.bind(null,remoteObject);}else if(target instanceof WebInspector.DOMNode){var domNode=(target);if(domNode.id)
+commandCallback=WebInspector.domModel.inspectElement.bind(WebInspector.domModel,domNode.id);}
+if(!commandCallback)
+return;if(this.treeOutline.element.isAncestor(event.target))
+return;contextMenu.appendItem(WebInspector.useLowerCaseMenuTitles()?"Reveal in Elements panel":"Reveal in Elements Panel",commandCallback);},_sidebarContextMenuEventFired:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.show();},_dockSideChanged:function()
+{var vertically=WebInspector.dockController.isVertical()&&WebInspector.settings.splitVerticallyWhenDockedToRight.get();this._splitVertically(vertically);},_showUAShadowDOMChanged:function()
+{this.treeOutline.update();},_splitVertically:function(vertically)
+{if(this.sidebarPaneView&&vertically===!this._splitView.isVertical())
+return;if(this.sidebarPaneView){this.sidebarPaneView.detach();this._splitView.uninstallResizer(this.sidebarPaneView.headerElement());}
+this._splitView.setVertical(!vertically);var computedPane=new WebInspector.SidebarPane(WebInspector.UIString("Computed"));computedPane.element.classList.add("composite");computedPane.element.classList.add("fill");var expandComputed=computedPane.expand.bind(computedPane);computedPane.bodyElement.classList.add("metrics-and-computed");this.sidebarPanes.computedStyle.setExpandCallback(expandComputed);var matchedStylePanesWrapper=document.createElement("div");matchedStylePanesWrapper.className="style-panes-wrapper";var computedStylePanesWrapper=document.createElement("div");computedStylePanesWrapper.className="style-panes-wrapper";function showMetrics(inComputedStyle)
+{if(inComputedStyle)
+this.sidebarPanes.metrics.show(computedStylePanesWrapper,this.sidebarPanes.computedStyle.element);else
+this.sidebarPanes.metrics.show(matchedStylePanesWrapper);}
+function tabSelected(event)
+{var tabId=(event.data.tabId);if(tabId===computedPane.title())
+showMetrics.call(this,true);else if(tabId===stylesPane.title())
+showMetrics.call(this,false);}
+this.sidebarPaneView=new WebInspector.SidebarTabbedPane();if(vertically){this._splitView.installResizer(this.sidebarPaneView.headerElement());this.sidebarPanes.metrics.setExpandCallback(expandComputed);var compositePane=new WebInspector.SidebarPane(this.sidebarPanes.styles.title());compositePane.element.classList.add("composite");compositePane.element.classList.add("fill");var expandComposite=compositePane.expand.bind(compositePane);var splitView=new WebInspector.SplitView(true,true,"stylesPaneSplitViewState",0.5);splitView.show(compositePane.bodyElement);splitView.mainElement().appendChild(matchedStylePanesWrapper);splitView.sidebarElement().appendChild(computedStylePanesWrapper);this.sidebarPanes.styles.setExpandCallback(expandComposite);computedPane.show(computedStylePanesWrapper);computedPane.setExpandCallback(expandComposite);splitView.mainElement().appendChild(this._matchedStylesFilterBoxContainer);splitView.sidebarElement().appendChild(this._computedStylesFilterBoxContainer);this.sidebarPaneView.addPane(compositePane);}else{var stylesPane=new WebInspector.SidebarPane(this.sidebarPanes.styles.title());stylesPane.element.classList.add("composite");stylesPane.element.classList.add("fill");var expandStyles=stylesPane.expand.bind(stylesPane);stylesPane.bodyElement.classList.add("metrics-and-styles");stylesPane.bodyElement.appendChild(matchedStylePanesWrapper);computedPane.bodyElement.appendChild(computedStylePanesWrapper);this.sidebarPanes.styles.setExpandCallback(expandStyles);this.sidebarPanes.metrics.setExpandCallback(expandStyles);this.sidebarPaneView.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,tabSelected,this);stylesPane.bodyElement.appendChild(this._matchedStylesFilterBoxContainer);computedPane.bodyElement.appendChild(this._computedStylesFilterBoxContainer);this.sidebarPaneView.addPane(stylesPane);this.sidebarPaneView.addPane(computedPane);}
+this.sidebarPanes.styles.show(matchedStylePanesWrapper);this.sidebarPanes.computedStyle.show(computedStylePanesWrapper);matchedStylePanesWrapper.appendChild(this.sidebarPanes.styles.titleElement);showMetrics.call(this,vertically);this.sidebarPanes.platformFonts.show(computedStylePanesWrapper);this.sidebarPaneView.addPane(this.sidebarPanes.eventListeners);this.sidebarPaneView.addPane(this.sidebarPanes.domBreakpoints);this.sidebarPaneView.addPane(this.sidebarPanes.properties);this._extensionSidebarPanesContainer=this.sidebarPaneView;for(var i=0;i<this._extensionSidebarPanes.length;++i)
+this._extensionSidebarPanesContainer.addPane(this._extensionSidebarPanes[i]);this.sidebarPaneView.show(this._splitView.sidebarElement());this.sidebarPanes.styles.expand();},addExtensionSidebarPane:function(id,pane)
+{this._extensionSidebarPanes.push(pane);this._extensionSidebarPanesContainer.addPane(pane);},__proto__:WebInspector.Panel.prototype}
+WebInspector.ElementsPanel.ContextMenuProvider=function()
+{}
+WebInspector.ElementsPanel.ContextMenuProvider.prototype={appendApplicableItems:function(event,contextMenu,target)
+{(WebInspector.inspectorView.panel("elements")).appendApplicableItems(event,contextMenu,target);}}
+WebInspector.ElementsPanel.DOMNodeRevealer=function()
+{}
+WebInspector.ElementsPanel.DOMNodeRevealer.prototype={reveal:function(node)
+{if(!(node instanceof WebInspector.DOMNode))
+return;if(WebInspector.inspectElementModeController&&WebInspector.inspectElementModeController.enabled()){InspectorFrontendHost.bringToFront();WebInspector.inspectElementModeController.disable();}
+(WebInspector.inspectorView.panel("elements")).revealAndSelectNode(node.id);}}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ExtensionServer.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ExtensionServer.js
new file mode 100644 (file)
index 0000000..187da3b
--- /dev/null
@@ -0,0 +1,482 @@
+if(!window.InspectorExtensionRegistry){WebInspector.InspectorExtensionRegistryStub=function()
+{}
+WebInspector.InspectorExtensionRegistryStub.prototype={getExtensionsAsync:function()
+{}}
+var InspectorExtensionRegistry=new WebInspector.InspectorExtensionRegistryStub();};function defineCommonExtensionSymbols(apiPrivate)
+{if(!apiPrivate.audits)
+apiPrivate.audits={};apiPrivate.audits.Severity={Info:"info",Warning:"warning",Severe:"severe"};if(!apiPrivate.console)
+apiPrivate.console={};apiPrivate.console.Severity={Debug:"debug",Log:"log",Warning:"warning",Error:"error"};if(!apiPrivate.panels)
+apiPrivate.panels={};apiPrivate.panels.SearchAction={CancelSearch:"cancelSearch",PerformSearch:"performSearch",NextSearchResult:"nextSearchResult",PreviousSearchResult:"previousSearchResult"};apiPrivate.Events={AuditStarted:"audit-started-",ButtonClicked:"button-clicked-",ConsoleMessageAdded:"console-message-added",PanelObjectSelected:"panel-objectSelected-",NetworkRequestFinished:"network-request-finished",OpenResource:"open-resource",PanelSearch:"panel-search-",ResourceAdded:"resource-added",ResourceContentCommitted:"resource-content-committed",TimelineEventRecorded:"timeline-event-recorded",ViewShown:"view-shown-",ViewHidden:"view-hidden-"};apiPrivate.Commands={AddAuditCategory:"addAuditCategory",AddAuditResult:"addAuditResult",AddConsoleMessage:"addConsoleMessage",AddRequestHeaders:"addRequestHeaders",ApplyStyleSheet:"applyStyleSheet",CreatePanel:"createPanel",CreateSidebarPane:"createSidebarPane",CreateStatusBarButton:"createStatusBarButton",EvaluateOnInspectedPage:"evaluateOnInspectedPage",ForwardKeyboardEvent:"_forwardKeyboardEvent",GetConsoleMessages:"getConsoleMessages",GetHAR:"getHAR",GetPageResources:"getPageResources",GetRequestContent:"getRequestContent",GetResourceContent:"getResourceContent",InspectedURLChanged:"inspectedURLChanged",OpenResource:"openResource",Reload:"Reload",Subscribe:"subscribe",SetOpenResourceHandler:"setOpenResourceHandler",SetResourceContent:"setResourceContent",SetSidebarContent:"setSidebarContent",SetSidebarHeight:"setSidebarHeight",SetSidebarPage:"setSidebarPage",ShowPanel:"showPanel",StopAuditCategoryRun:"stopAuditCategoryRun",Unsubscribe:"unsubscribe",UpdateAuditProgress:"updateAuditProgress",UpdateButton:"updateButton"};}
+function injectedExtensionAPI(injectedScriptId)
+{var apiPrivate={};defineCommonExtensionSymbols(apiPrivate);var commands=apiPrivate.Commands;var events=apiPrivate.Events;var userAction=false;function EventSinkImpl(type,customDispatch)
+{this._type=type;this._listeners=[];this._customDispatch=customDispatch;}
+EventSinkImpl.prototype={addListener:function(callback)
+{if(typeof callback!=="function")
+throw"addListener: callback is not a function";if(this._listeners.length===0)
+extensionServer.sendRequest({command:commands.Subscribe,type:this._type});this._listeners.push(callback);extensionServer.registerHandler("notify-"+this._type,this._dispatch.bind(this));},removeListener:function(callback)
+{var listeners=this._listeners;for(var i=0;i<listeners.length;++i){if(listeners[i]===callback){listeners.splice(i,1);break;}}
+if(this._listeners.length===0)
+extensionServer.sendRequest({command:commands.Unsubscribe,type:this._type});},_fire:function(vararg)
+{var listeners=this._listeners.slice();for(var i=0;i<listeners.length;++i)
+listeners[i].apply(null,arguments);},_dispatch:function(request)
+{if(this._customDispatch)
+this._customDispatch.call(this,request);else
+this._fire.apply(this,request.arguments);}}
+function InspectorExtensionAPI()
+{this.audits=new Audits();this.inspectedWindow=new InspectedWindow();this.panels=new Panels();this.network=new Network();defineDeprecatedProperty(this,"webInspector","resources","network");this.timeline=new Timeline();this.console=new ConsoleAPI();}
+function ConsoleAPI()
+{this.onMessageAdded=new EventSink(events.ConsoleMessageAdded);}
+ConsoleAPI.prototype={getMessages:function(callback)
+{extensionServer.sendRequest({command:commands.GetConsoleMessages},callback);},addMessage:function(severity,text,url,line)
+{extensionServer.sendRequest({command:commands.AddConsoleMessage,severity:severity,text:text,url:url,line:line});},get Severity()
+{return apiPrivate.console.Severity;}}
+function Network()
+{function dispatchRequestEvent(message)
+{var request=message.arguments[1];request.__proto__=new Request(message.arguments[0]);this._fire(request);}
+this.onRequestFinished=new EventSink(events.NetworkRequestFinished,dispatchRequestEvent);defineDeprecatedProperty(this,"network","onFinished","onRequestFinished");this.onNavigated=new EventSink(events.InspectedURLChanged);}
+Network.prototype={getHAR:function(callback)
+{function callbackWrapper(result)
+{var entries=(result&&result.entries)||[];for(var i=0;i<entries.length;++i){entries[i].__proto__=new Request(entries[i]._requestId);delete entries[i]._requestId;}
+callback(result);}
+extensionServer.sendRequest({command:commands.GetHAR},callback&&callbackWrapper);},addRequestHeaders:function(headers)
+{extensionServer.sendRequest({command:commands.AddRequestHeaders,headers:headers,extensionId:window.location.hostname});}}
+function RequestImpl(id)
+{this._id=id;}
+RequestImpl.prototype={getContent:function(callback)
+{function callbackWrapper(response)
+{callback(response.content,response.encoding);}
+extensionServer.sendRequest({command:commands.GetRequestContent,id:this._id},callback&&callbackWrapper);}}
+function Panels()
+{var panels={elements:new ElementsPanel(),sources:new SourcesPanel(),};function panelGetter(name)
+{return panels[name];}
+for(var panel in panels)
+this.__defineGetter__(panel,panelGetter.bind(null,panel));this.applyStyleSheet=function(styleSheet){extensionServer.sendRequest({command:commands.ApplyStyleSheet,styleSheet:styleSheet});};}
+Panels.prototype={create:function(title,icon,page,callback)
+{var id="extension-panel-"+extensionServer.nextObjectId();var request={command:commands.CreatePanel,id:id,title:title,icon:icon,page:page};extensionServer.sendRequest(request,callback&&callback.bind(this,new ExtensionPanel(id)));},setOpenResourceHandler:function(callback)
+{var hadHandler=extensionServer.hasHandler(events.OpenResource);function callbackWrapper(message)
+{userAction=true;try{callback.call(null,new Resource(message.resource),message.lineNumber);}finally{userAction=false;}}
+if(!callback)
+extensionServer.unregisterHandler(events.OpenResource);else
+extensionServer.registerHandler(events.OpenResource,callbackWrapper);if(hadHandler===!callback)
+extensionServer.sendRequest({command:commands.SetOpenResourceHandler,"handlerPresent":!!callback});},openResource:function(url,lineNumber,callback)
+{extensionServer.sendRequest({command:commands.OpenResource,"url":url,"lineNumber":lineNumber},callback);},get SearchAction()
+{return apiPrivate.panels.SearchAction;}}
+function ExtensionViewImpl(id)
+{this._id=id;function dispatchShowEvent(message)
+{var frameIndex=message.arguments[0];if(typeof frameIndex==="number")
+this._fire(window.parent.frames[frameIndex]);else
+this._fire();}
+if(id){this.onShown=new EventSink(events.ViewShown+id,dispatchShowEvent);this.onHidden=new EventSink(events.ViewHidden+id);}}
+function PanelWithSidebarImpl(hostPanelName)
+{ExtensionViewImpl.call(this,null);this._hostPanelName=hostPanelName;this.onSelectionChanged=new EventSink(events.PanelObjectSelected+hostPanelName);}
+PanelWithSidebarImpl.prototype={createSidebarPane:function(title,callback)
+{var id="extension-sidebar-"+extensionServer.nextObjectId();var request={command:commands.CreateSidebarPane,panel:this._hostPanelName,id:id,title:title};function callbackWrapper()
+{callback(new ExtensionSidebarPane(id));}
+extensionServer.sendRequest(request,callback&&callbackWrapper);},__proto__:ExtensionViewImpl.prototype}
+function declareInterfaceClass(implConstructor)
+{return function()
+{var impl={__proto__:implConstructor.prototype};implConstructor.apply(impl,arguments);populateInterfaceClass(this,impl);}}
+function defineDeprecatedProperty(object,className,oldName,newName)
+{var warningGiven=false;function getter()
+{if(!warningGiven){console.warn(className+"."+oldName+" is deprecated. Use "+className+"."+newName+" instead");warningGiven=true;}
+return object[newName];}
+object.__defineGetter__(oldName,getter);}
+function extractCallbackArgument(args)
+{var lastArgument=args[args.length-1];return typeof lastArgument==="function"?lastArgument:undefined;}
+var AuditCategory=declareInterfaceClass(AuditCategoryImpl);var AuditResult=declareInterfaceClass(AuditResultImpl);var Button=declareInterfaceClass(ButtonImpl);var EventSink=declareInterfaceClass(EventSinkImpl);var ExtensionPanel=declareInterfaceClass(ExtensionPanelImpl);var ExtensionSidebarPane=declareInterfaceClass(ExtensionSidebarPaneImpl);var PanelWithSidebar=declareInterfaceClass(PanelWithSidebarImpl);var Request=declareInterfaceClass(RequestImpl);var Resource=declareInterfaceClass(ResourceImpl);var Timeline=declareInterfaceClass(TimelineImpl);function ElementsPanel()
+{PanelWithSidebar.call(this,"elements");}
+ElementsPanel.prototype={__proto__:PanelWithSidebar.prototype}
+function SourcesPanel()
+{PanelWithSidebar.call(this,"sources");}
+SourcesPanel.prototype={__proto__:PanelWithSidebar.prototype}
+function ExtensionPanelImpl(id)
+{ExtensionViewImpl.call(this,id);this.onSearch=new EventSink(events.PanelSearch+id);}
+ExtensionPanelImpl.prototype={createStatusBarButton:function(iconPath,tooltipText,disabled)
+{var id="button-"+extensionServer.nextObjectId();var request={command:commands.CreateStatusBarButton,panel:this._id,id:id,icon:iconPath,tooltip:tooltipText,disabled:!!disabled};extensionServer.sendRequest(request);return new Button(id);},show:function()
+{if(!userAction)
+return;var request={command:commands.ShowPanel,id:this._id};extensionServer.sendRequest(request);},__proto__:ExtensionViewImpl.prototype}
+function ExtensionSidebarPaneImpl(id)
+{ExtensionViewImpl.call(this,id);}
+ExtensionSidebarPaneImpl.prototype={setHeight:function(height)
+{extensionServer.sendRequest({command:commands.SetSidebarHeight,id:this._id,height:height});},setExpression:function(expression,rootTitle,evaluateOptions)
+{var request={command:commands.SetSidebarContent,id:this._id,expression:expression,rootTitle:rootTitle,evaluateOnPage:true,};if(typeof evaluateOptions==="object")
+request.evaluateOptions=evaluateOptions;extensionServer.sendRequest(request,extractCallbackArgument(arguments));},setObject:function(jsonObject,rootTitle,callback)
+{extensionServer.sendRequest({command:commands.SetSidebarContent,id:this._id,expression:jsonObject,rootTitle:rootTitle},callback);},setPage:function(page)
+{extensionServer.sendRequest({command:commands.SetSidebarPage,id:this._id,page:page});},__proto__:ExtensionViewImpl.prototype}
+function ButtonImpl(id)
+{this._id=id;this.onClicked=new EventSink(events.ButtonClicked+id);}
+ButtonImpl.prototype={update:function(iconPath,tooltipText,disabled)
+{var request={command:commands.UpdateButton,id:this._id,icon:iconPath,tooltip:tooltipText,disabled:!!disabled};extensionServer.sendRequest(request);}};function Audits()
+{}
+Audits.prototype={addCategory:function(displayName,resultCount)
+{var id="extension-audit-category-"+extensionServer.nextObjectId();if(typeof resultCount!=="undefined")
+console.warn("Passing resultCount to audits.addCategory() is deprecated. Use AuditResult.updateProgress() instead.");extensionServer.sendRequest({command:commands.AddAuditCategory,id:id,displayName:displayName,resultCount:resultCount});return new AuditCategory(id);}}
+function AuditCategoryImpl(id)
+{function dispatchAuditEvent(request)
+{var auditResult=new AuditResult(request.arguments[0]);try{this._fire(auditResult);}catch(e){console.error("Uncaught exception in extension audit event handler: "+e);auditResult.done();}}
+this._id=id;this.onAuditStarted=new EventSink(events.AuditStarted+id,dispatchAuditEvent);}
+function AuditResultImpl(id)
+{this._id=id;this.createURL=this._nodeFactory.bind(this,"url");this.createSnippet=this._nodeFactory.bind(this,"snippet");this.createText=this._nodeFactory.bind(this,"text");this.createObject=this._nodeFactory.bind(this,"object");this.createNode=this._nodeFactory.bind(this,"node");}
+AuditResultImpl.prototype={addResult:function(displayName,description,severity,details)
+{if(details&&!(details instanceof AuditResultNode))
+details=new AuditResultNode(details instanceof Array?details:[details]);var request={command:commands.AddAuditResult,resultId:this._id,displayName:displayName,description:description,severity:severity,details:details};extensionServer.sendRequest(request);},createResult:function()
+{return new AuditResultNode(Array.prototype.slice.call(arguments));},updateProgress:function(worked,totalWork)
+{extensionServer.sendRequest({command:commands.UpdateAuditProgress,resultId:this._id,progress:worked/totalWork});},done:function()
+{extensionServer.sendRequest({command:commands.StopAuditCategoryRun,resultId:this._id});},get Severity()
+{return apiPrivate.audits.Severity;},createResourceLink:function(url,lineNumber)
+{return{type:"resourceLink",arguments:[url,lineNumber&&lineNumber-1]};},_nodeFactory:function(type)
+{return{type:type,arguments:Array.prototype.slice.call(arguments,1)};}}
+function AuditResultNode(contents)
+{this.contents=contents;this.children=[];this.expanded=false;}
+AuditResultNode.prototype={addChild:function()
+{var node=new AuditResultNode(Array.prototype.slice.call(arguments));this.children.push(node);return node;}};function InspectedWindow()
+{function dispatchResourceEvent(message)
+{this._fire(new Resource(message.arguments[0]));}
+function dispatchResourceContentEvent(message)
+{this._fire(new Resource(message.arguments[0]),message.arguments[1]);}
+this.onResourceAdded=new EventSink(events.ResourceAdded,dispatchResourceEvent);this.onResourceContentCommitted=new EventSink(events.ResourceContentCommitted,dispatchResourceContentEvent);}
+InspectedWindow.prototype={reload:function(optionsOrUserAgent)
+{var options=null;if(typeof optionsOrUserAgent==="object")
+options=optionsOrUserAgent;else if(typeof optionsOrUserAgent==="string"){options={userAgent:optionsOrUserAgent};console.warn("Passing userAgent as string parameter to inspectedWindow.reload() is deprecated. "+"Use inspectedWindow.reload({ userAgent: value}) instead.");}
+extensionServer.sendRequest({command:commands.Reload,options:options});},eval:function(expression,evaluateOptions)
+{var callback=extractCallbackArgument(arguments);function callbackWrapper(result)
+{if(result.isError||result.isException)
+callback(undefined,result);else
+callback(result.value);}
+var request={command:commands.EvaluateOnInspectedPage,expression:expression};if(typeof evaluateOptions==="object")
+request.evaluateOptions=evaluateOptions;extensionServer.sendRequest(request,callback&&callbackWrapper);return null;},getResources:function(callback)
+{function wrapResource(resourceData)
+{return new Resource(resourceData);}
+function callbackWrapper(resources)
+{callback(resources.map(wrapResource));}
+extensionServer.sendRequest({command:commands.GetPageResources},callback&&callbackWrapper);}}
+function ResourceImpl(resourceData)
+{this._url=resourceData.url
+this._type=resourceData.type;}
+ResourceImpl.prototype={get url()
+{return this._url;},get type()
+{return this._type;},getContent:function(callback)
+{function callbackWrapper(response)
+{callback(response.content,response.encoding);}
+extensionServer.sendRequest({command:commands.GetResourceContent,url:this._url},callback&&callbackWrapper);},setContent:function(content,commit,callback)
+{extensionServer.sendRequest({command:commands.SetResourceContent,url:this._url,content:content,commit:commit},callback);}}
+function TimelineImpl()
+{this.onEventRecorded=new EventSink(events.TimelineEventRecorded);}
+var keyboardEventRequestQueue=[];var forwardTimer=null;function forwardKeyboardEvent(event)
+{const Esc="U+001B";if(!event.ctrlKey&&!event.altKey&&!event.metaKey&&!/^F\d+$/.test(event.keyIdentifier)&&event.keyIdentifier!==Esc)
+return;var requestPayload={eventType:event.type,ctrlKey:event.ctrlKey,altKey:event.altKey,metaKey:event.metaKey,keyIdentifier:event.keyIdentifier,location:event.location,keyCode:event.keyCode};keyboardEventRequestQueue.push(requestPayload);if(!forwardTimer)
+forwardTimer=setTimeout(forwardEventQueue,0);}
+function forwardEventQueue()
+{forwardTimer=null;var request={command:commands.ForwardKeyboardEvent,entries:keyboardEventRequestQueue};extensionServer.sendRequest(request);keyboardEventRequestQueue=[];}
+document.addEventListener("keydown",forwardKeyboardEvent,false);document.addEventListener("keypress",forwardKeyboardEvent,false);function ExtensionServerClient()
+{this._callbacks={};this._handlers={};this._lastRequestId=0;this._lastObjectId=0;this.registerHandler("callback",this._onCallback.bind(this));var channel=new MessageChannel();this._port=channel.port1;this._port.addEventListener("message",this._onMessage.bind(this),false);this._port.start();window.parent.postMessage("registerExtension",[channel.port2],"*");}
+ExtensionServerClient.prototype={sendRequest:function(message,callback)
+{if(typeof callback==="function")
+message.requestId=this._registerCallback(callback);this._port.postMessage(message);},hasHandler:function(command)
+{return!!this._handlers[command];},registerHandler:function(command,handler)
+{this._handlers[command]=handler;},unregisterHandler:function(command)
+{delete this._handlers[command];},nextObjectId:function()
+{return injectedScriptId+"_"+ ++this._lastObjectId;},_registerCallback:function(callback)
+{var id=++this._lastRequestId;this._callbacks[id]=callback;return id;},_onCallback:function(request)
+{if(request.requestId in this._callbacks){var callback=this._callbacks[request.requestId];delete this._callbacks[request.requestId];callback(request.result);}},_onMessage:function(event)
+{var request=event.data;var handler=this._handlers[request.command];if(handler)
+handler.call(this,request);}}
+function populateInterfaceClass(interface,implementation)
+{for(var member in implementation){if(member.charAt(0)==="_")
+continue;var descriptor=null;for(var owner=implementation;owner&&!descriptor;owner=owner.__proto__)
+descriptor=Object.getOwnPropertyDescriptor(owner,member);if(!descriptor)
+continue;if(typeof descriptor.value==="function")
+interface[member]=descriptor.value.bind(implementation);else if(typeof descriptor.get==="function")
+interface.__defineGetter__(member,descriptor.get.bind(implementation));else
+Object.defineProperty(interface,member,descriptor);}}
+if(!extensionServer)
+extensionServer=new ExtensionServerClient();return new InspectorExtensionAPI();}
+function platformExtensionAPI(coreAPI)
+{function getTabId()
+{return tabId;}
+chrome=window.chrome||{};var devtools_descriptor=Object.getOwnPropertyDescriptor(chrome,"devtools");if(!devtools_descriptor||devtools_descriptor.get)
+Object.defineProperty(chrome,"devtools",{value:{},enumerable:true});chrome.devtools.inspectedWindow={};chrome.devtools.inspectedWindow.__defineGetter__("tabId",getTabId);chrome.devtools.inspectedWindow.__proto__=coreAPI.inspectedWindow;chrome.devtools.network=coreAPI.network;chrome.devtools.panels=coreAPI.panels;if(extensionInfo.exposeExperimentalAPIs!==false){chrome.experimental=chrome.experimental||{};chrome.experimental.devtools=chrome.experimental.devtools||{};var properties=Object.getOwnPropertyNames(coreAPI);for(var i=0;i<properties.length;++i){var descriptor=Object.getOwnPropertyDescriptor(coreAPI,properties[i]);Object.defineProperty(chrome.experimental.devtools,properties[i],descriptor);}
+chrome.experimental.devtools.inspectedWindow=chrome.devtools.inspectedWindow;}
+if(extensionInfo.exposeWebInspectorNamespace)
+window.webInspector=coreAPI;}
+function buildPlatformExtensionAPI(extensionInfo)
+{return"var extensionInfo = "+JSON.stringify(extensionInfo)+";"+"var tabId = "+WebInspector._inspectedTabId+";"+
+platformExtensionAPI.toString();}
+function buildExtensionAPIInjectedScript(extensionInfo)
+{return"(function(injectedScriptId){ "+"var extensionServer;"+
+defineCommonExtensionSymbols.toString()+";"+
+injectedExtensionAPI.toString()+";"+
+buildPlatformExtensionAPI(extensionInfo)+";"+"platformExtensionAPI(injectedExtensionAPI(injectedScriptId));"+"return {};"+"})";};WebInspector.ExtensionAuditCategory=function(extensionOrigin,id,displayName,ruleCount)
+{this._extensionOrigin=extensionOrigin;this._id=id;this._displayName=displayName;this._ruleCount=ruleCount;}
+WebInspector.ExtensionAuditCategory.prototype={get id()
+{return this._id;},get displayName()
+{return this._displayName;},run:function(requests,ruleResultCallback,categoryDoneCallback,progress)
+{var results=new WebInspector.ExtensionAuditCategoryResults(this,ruleResultCallback,categoryDoneCallback,progress);WebInspector.extensionServer.startAuditRun(this,results);}}
+WebInspector.ExtensionAuditCategoryResults=function(category,ruleResultCallback,categoryDoneCallback,progress)
+{this._category=category;this._ruleResultCallback=ruleResultCallback;this._categoryDoneCallback=categoryDoneCallback;this._progress=progress;this._progress.setTotalWork(1);this._expectedResults=category._ruleCount;this._actualResults=0;this.id=category.id+"-"+ ++WebInspector.ExtensionAuditCategoryResults._lastId;}
+WebInspector.ExtensionAuditCategoryResults.prototype={done:function()
+{WebInspector.extensionServer.stopAuditRun(this);this._progress.done();this._categoryDoneCallback();},addResult:function(displayName,description,severity,details)
+{var result=new WebInspector.AuditRuleResult(displayName);result.addChild(description);result.severity=severity;if(details)
+this._addNode(result,details);this._addResult(result);},_addNode:function(parent,node)
+{var contents=WebInspector.auditFormatters.partiallyApply(WebInspector.ExtensionAuditFormatters,this,node.contents);var addedNode=parent.addChild(contents,node.expanded);if(node.children){for(var i=0;i<node.children.length;++i)
+this._addNode(addedNode,node.children[i]);}},_addResult:function(result)
+{this._ruleResultCallback(result);++this._actualResults;if(typeof this._expectedResults==="number"){this._progress.setWorked(this._actualResults/this._expectedResults);if(this._actualResults===this._expectedResults)
+this.done();}},updateProgress:function(progress)
+{this._progress.setWorked(progress);},evaluate:function(expression,evaluateOptions,callback)
+{function onEvaluate(error,result,wasThrown)
+{if(wasThrown)
+return;var object=WebInspector.RemoteObject.fromPayload(result);callback(object);}
+WebInspector.extensionServer.evaluate(expression,false,false,evaluateOptions,this._category._extensionOrigin,onEvaluate);}}
+WebInspector.ExtensionAuditFormatters={object:function(expression,title,evaluateOptions)
+{var parentElement=document.createElement("div");function onEvaluate(remoteObject)
+{var section=new WebInspector.ObjectPropertiesSection(remoteObject,title);section.expanded=true;section.editable=false;parentElement.appendChild(section.element);}
+this.evaluate(expression,evaluateOptions,onEvaluate);return parentElement;},node:function(expression,evaluateOptions)
+{var parentElement=document.createElement("div");function onNodeAvailable(nodeId)
+{if(!nodeId)
+return;var node=WebInspector.domModel.nodeForId(nodeId);var renderer=WebInspector.moduleManager.instance(WebInspector.Renderer,node);if(renderer)
+parentElement.appendChild(renderer.render(node));else
+console.error("No renderer for node found");}
+function onEvaluate(remoteObject)
+{remoteObject.pushNodeToFrontend(onNodeAvailable);}
+this.evaluate(expression,evaluateOptions,onEvaluate);return parentElement;}}
+WebInspector.ExtensionAuditCategoryResults._lastId=0;;WebInspector.ExtensionServer=function()
+{this._clientObjects={};this._handlers={};this._subscribers={};this._subscriptionStartHandlers={};this._subscriptionStopHandlers={};this._extraHeaders={};this._requests={};this._lastRequestId=0;this._registeredExtensions={};this._status=new WebInspector.ExtensionStatus();var commands=WebInspector.extensionAPI.Commands;this._registerHandler(commands.AddAuditCategory,this._onAddAuditCategory.bind(this));this._registerHandler(commands.AddAuditResult,this._onAddAuditResult.bind(this));this._registerHandler(commands.AddConsoleMessage,this._onAddConsoleMessage.bind(this));this._registerHandler(commands.AddRequestHeaders,this._onAddRequestHeaders.bind(this));this._registerHandler(commands.ApplyStyleSheet,this._onApplyStyleSheet.bind(this));this._registerHandler(commands.CreatePanel,this._onCreatePanel.bind(this));this._registerHandler(commands.CreateSidebarPane,this._onCreateSidebarPane.bind(this));this._registerHandler(commands.CreateStatusBarButton,this._onCreateStatusBarButton.bind(this));this._registerHandler(commands.EvaluateOnInspectedPage,this._onEvaluateOnInspectedPage.bind(this));this._registerHandler(commands.ForwardKeyboardEvent,this._onForwardKeyboardEvent.bind(this));this._registerHandler(commands.GetHAR,this._onGetHAR.bind(this));this._registerHandler(commands.GetConsoleMessages,this._onGetConsoleMessages.bind(this));this._registerHandler(commands.GetPageResources,this._onGetPageResources.bind(this));this._registerHandler(commands.GetRequestContent,this._onGetRequestContent.bind(this));this._registerHandler(commands.GetResourceContent,this._onGetResourceContent.bind(this));this._registerHandler(commands.Reload,this._onReload.bind(this));this._registerHandler(commands.SetOpenResourceHandler,this._onSetOpenResourceHandler.bind(this));this._registerHandler(commands.SetResourceContent,this._onSetResourceContent.bind(this));this._registerHandler(commands.SetSidebarHeight,this._onSetSidebarHeight.bind(this));this._registerHandler(commands.SetSidebarContent,this._onSetSidebarContent.bind(this));this._registerHandler(commands.SetSidebarPage,this._onSetSidebarPage.bind(this));this._registerHandler(commands.ShowPanel,this._onShowPanel.bind(this));this._registerHandler(commands.StopAuditCategoryRun,this._onStopAuditCategoryRun.bind(this));this._registerHandler(commands.Subscribe,this._onSubscribe.bind(this));this._registerHandler(commands.OpenResource,this._onOpenResource.bind(this));this._registerHandler(commands.Unsubscribe,this._onUnsubscribe.bind(this));this._registerHandler(commands.UpdateButton,this._onUpdateButton.bind(this));this._registerHandler(commands.UpdateAuditProgress,this._onUpdateAuditProgress.bind(this));window.addEventListener("message",this._onWindowMessage.bind(this),false);this._initExtensions();}
+WebInspector.ExtensionServer.prototype={hasExtensions:function()
+{return!!Object.keys(this._registeredExtensions).length;},notifySearchAction:function(panelId,action,searchString)
+{this._postNotification(WebInspector.extensionAPI.Events.PanelSearch+panelId,action,searchString);},notifyViewShown:function(identifier,frameIndex)
+{this._postNotification(WebInspector.extensionAPI.Events.ViewShown+identifier,frameIndex);},notifyViewHidden:function(identifier)
+{this._postNotification(WebInspector.extensionAPI.Events.ViewHidden+identifier);},notifyButtonClicked:function(identifier)
+{this._postNotification(WebInspector.extensionAPI.Events.ButtonClicked+identifier);},_inspectedURLChanged:function(event)
+{this._requests={};var url=event.data;this._postNotification(WebInspector.extensionAPI.Events.InspectedURLChanged,url);},startAuditRun:function(category,auditRun)
+{this._clientObjects[auditRun.id]=auditRun;this._postNotification("audit-started-"+category.id,auditRun.id);},stopAuditRun:function(auditRun)
+{delete this._clientObjects[auditRun.id];},hasSubscribers:function(type)
+{return!!this._subscribers[type];},_postNotification:function(type,vararg)
+{var subscribers=this._subscribers[type];if(!subscribers)
+return;var message={command:"notify-"+type,arguments:Array.prototype.slice.call(arguments,1)};for(var i=0;i<subscribers.length;++i)
+subscribers[i].postMessage(message);},_onSubscribe:function(message,port)
+{var subscribers=this._subscribers[message.type];if(subscribers)
+subscribers.push(port);else{this._subscribers[message.type]=[port];if(this._subscriptionStartHandlers[message.type])
+this._subscriptionStartHandlers[message.type]();}},_onUnsubscribe:function(message,port)
+{var subscribers=this._subscribers[message.type];if(!subscribers)
+return;subscribers.remove(port);if(!subscribers.length){delete this._subscribers[message.type];if(this._subscriptionStopHandlers[message.type])
+this._subscriptionStopHandlers[message.type]();}},_onAddRequestHeaders:function(message)
+{var id=message.extensionId;if(typeof id!=="string")
+return this._status.E_BADARGTYPE("extensionId",typeof id,"string");var extensionHeaders=this._extraHeaders[id];if(!extensionHeaders){extensionHeaders={};this._extraHeaders[id]=extensionHeaders;}
+for(var name in message.headers)
+extensionHeaders[name]=message.headers[name];var allHeaders=({});for(var extension in this._extraHeaders){var headers=this._extraHeaders[extension];for(name in headers){if(typeof headers[name]==="string")
+allHeaders[name]=headers[name];}}
+NetworkAgent.setExtraHTTPHeaders(allHeaders);},_onApplyStyleSheet:function(message)
+{if(!WebInspector.experimentsSettings.applyCustomStylesheet.isEnabled())
+return;var styleSheet=document.createElement("style");styleSheet.textContent=message.styleSheet;document.head.appendChild(styleSheet);},_onCreatePanel:function(message,port)
+{var id=message.id;if(id in this._clientObjects||id in WebInspector.panels)
+return this._status.E_EXISTS(id);var page=this._expandResourcePath(port._extensionOrigin,message.page);var panelDescriptor=new WebInspector.ExtensionServerPanelDescriptor(id,message.title,new WebInspector.ExtensionPanel(id,page));this._clientObjects[id]=panelDescriptor.panel();WebInspector.inspectorView.addPanel(panelDescriptor);return this._status.OK();},_onShowPanel:function(message)
+{WebInspector.inspectorView.showPanel(message.id);},_onCreateStatusBarButton:function(message,port)
+{var panel=this._clientObjects[message.panel];if(!panel||!(panel instanceof WebInspector.ExtensionPanel))
+return this._status.E_NOTFOUND(message.panel);var button=new WebInspector.ExtensionButton(message.id,this._expandResourcePath(port._extensionOrigin,message.icon),message.tooltip,message.disabled);this._clientObjects[message.id]=button;panel.addStatusBarItem(button.element);return this._status.OK();},_onUpdateButton:function(message,port)
+{var button=this._clientObjects[message.id];if(!button||!(button instanceof WebInspector.ExtensionButton))
+return this._status.E_NOTFOUND(message.id);button.update(this._expandResourcePath(port._extensionOrigin,message.icon),message.tooltip,message.disabled);return this._status.OK();},_onCreateSidebarPane:function(message)
+{var panel=WebInspector.inspectorView.panel(message.panel);if(!panel)
+return this._status.E_NOTFOUND(message.panel);if(!panel.addExtensionSidebarPane)
+return this._status.E_NOTSUPPORTED();var id=message.id;var sidebar=new WebInspector.ExtensionSidebarPane(message.title,id);this._clientObjects[id]=sidebar;panel.addExtensionSidebarPane(id,sidebar);return this._status.OK();},_onSetSidebarHeight:function(message)
+{var sidebar=this._clientObjects[message.id];if(!sidebar)
+return this._status.E_NOTFOUND(message.id);sidebar.setHeight(message.height);return this._status.OK();},_onSetSidebarContent:function(message,port)
+{var sidebar=this._clientObjects[message.id];if(!sidebar)
+return this._status.E_NOTFOUND(message.id);function callback(error)
+{var result=error?this._status.E_FAILED(error):this._status.OK();this._dispatchCallback(message.requestId,port,result);}
+if(message.evaluateOnPage)
+return sidebar.setExpression(message.expression,message.rootTitle,message.evaluateOptions,port._extensionOrigin,callback.bind(this));sidebar.setObject(message.expression,message.rootTitle,callback.bind(this));},_onSetSidebarPage:function(message,port)
+{var sidebar=this._clientObjects[message.id];if(!sidebar)
+return this._status.E_NOTFOUND(message.id);sidebar.setPage(this._expandResourcePath(port._extensionOrigin,message.page));},_onOpenResource:function(message)
+{var uiSourceCode=WebInspector.workspace.uiSourceCodeForURL(message.url);if(uiSourceCode){WebInspector.Revealer.reveal(new WebInspector.UILocation(uiSourceCode,message.lineNumber,0));return this._status.OK();}
+var resource=WebInspector.resourceForURL(message.url);if(resource){WebInspector.Revealer.reveal(resource,message.lineNumber);return this._status.OK();}
+var request=WebInspector.networkLog.requestForURL(message.url);if(request){WebInspector.Revealer.reveal(request);return this._status.OK();}
+return this._status.E_NOTFOUND(message.url);},_onSetOpenResourceHandler:function(message,port)
+{var name=this._registeredExtensions[port._extensionOrigin].name||("Extension "+port._extensionOrigin);if(message.handlerPresent)
+WebInspector.openAnchorLocationRegistry.registerHandler(name,this._handleOpenURL.bind(this,port));else
+WebInspector.openAnchorLocationRegistry.unregisterHandler(name);},_handleOpenURL:function(port,details)
+{var url=(details.url);var contentProvider=WebInspector.workspace.uiSourceCodeForOriginURL(url)||WebInspector.resourceForURL(url);if(!contentProvider)
+return false;var lineNumber=details.lineNumber;if(typeof lineNumber==="number")
+lineNumber+=1;port.postMessage({command:"open-resource",resource:this._makeResource(contentProvider),lineNumber:lineNumber});return true;},_onReload:function(message)
+{var options=(message.options||{});NetworkAgent.setUserAgentOverride(typeof options.userAgent==="string"?options.userAgent:"");var injectedScript;if(options.injectedScript)
+injectedScript="(function(){"+options.injectedScript+"})()";var preprocessingScript=options.preprocessingScript;WebInspector.resourceTreeModel.reloadPage(!!options.ignoreCache,injectedScript,preprocessingScript);return this._status.OK();},_onEvaluateOnInspectedPage:function(message,port)
+{function callback(error,resultPayload,wasThrown)
+{var result;if(error||!resultPayload)
+result=this._status.E_PROTOCOLERROR(error.toString());else if(wasThrown)
+result={isException:true,value:resultPayload.description};else
+result={value:resultPayload.value};this._dispatchCallback(message.requestId,port,result);}
+return this.evaluate(message.expression,true,true,message.evaluateOptions,port._extensionOrigin,callback.bind(this));},_onGetConsoleMessages:function()
+{return WebInspector.console.messages.map(this._makeConsoleMessage);},_onAddConsoleMessage:function(message)
+{function convertSeverity(level)
+{switch(level){case WebInspector.extensionAPI.console.Severity.Log:return WebInspector.ConsoleMessage.MessageLevel.Log;case WebInspector.extensionAPI.console.Severity.Warning:return WebInspector.ConsoleMessage.MessageLevel.Warning;case WebInspector.extensionAPI.console.Severity.Error:return WebInspector.ConsoleMessage.MessageLevel.Error;case WebInspector.extensionAPI.console.Severity.Debug:return WebInspector.ConsoleMessage.MessageLevel.Debug;}}
+var level=convertSeverity(message.severity);if(!level)
+return this._status.E_BADARG("message.severity",message.severity);var consoleMessage=new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.JS,level,message.text,WebInspector.ConsoleMessage.MessageType.Log,message.url,message.line);WebInspector.console.addMessage(consoleMessage);},_makeConsoleMessage:function(message)
+{function convertLevel(level)
+{if(!level)
+return;switch(level){case WebInspector.ConsoleMessage.MessageLevel.Log:return WebInspector.extensionAPI.console.Severity.Log;case WebInspector.ConsoleMessage.MessageLevel.Warning:return WebInspector.extensionAPI.console.Severity.Warning;case WebInspector.ConsoleMessage.MessageLevel.Error:return WebInspector.extensionAPI.console.Severity.Error;case WebInspector.ConsoleMessage.MessageLevel.Debug:return WebInspector.extensionAPI.console.Severity.Debug;default:return WebInspector.extensionAPI.console.Severity.Log;}}
+var result={severity:convertLevel(message.level),text:message.messageText,};if(message.url)
+result.url=message.url;if(message.line)
+result.line=message.line;return result;},_onGetHAR:function()
+{var requests=WebInspector.networkLog.requests;var harLog=(new WebInspector.HARLog(requests)).build();for(var i=0;i<harLog.entries.length;++i)
+harLog.entries[i]._requestId=this._requestId(requests[i]);return harLog;},_makeResource:function(contentProvider)
+{return{url:contentProvider.contentURL(),type:contentProvider.contentType().name()};},_onGetPageResources:function()
+{var resources={};function pushResourceData(contentProvider)
+{if(!resources[contentProvider.contentURL()])
+resources[contentProvider.contentURL()]=this._makeResource(contentProvider);}
+var uiSourceCodes=WebInspector.workspace.uiSourceCodesForProjectType(WebInspector.projectTypes.Network);uiSourceCodes.forEach(pushResourceData.bind(this));WebInspector.resourceTreeModel.forAllResources(pushResourceData.bind(this));return Object.values(resources);},_getResourceContent:function(contentProvider,message,port)
+{function onContentAvailable(content)
+{var response={encoding:(content===null)||contentProvider.contentType().isTextType()?"":"base64",content:content};this._dispatchCallback(message.requestId,port,response);}
+contentProvider.requestContent(onContentAvailable.bind(this));},_onGetRequestContent:function(message,port)
+{var request=this._requestById(message.id);if(!request)
+return this._status.E_NOTFOUND(message.id);this._getResourceContent(request,message,port);},_onGetResourceContent:function(message,port)
+{var url=(message.url);var contentProvider=WebInspector.workspace.uiSourceCodeForOriginURL(url)||WebInspector.resourceForURL(url);if(!contentProvider)
+return this._status.E_NOTFOUND(url);this._getResourceContent(contentProvider,message,port);},_onSetResourceContent:function(message,port)
+{function callbackWrapper(error)
+{var response=error?this._status.E_FAILED(error):this._status.OK();this._dispatchCallback(message.requestId,port,response);}
+var url=(message.url);var uiSourceCode=WebInspector.workspace.uiSourceCodeForOriginURL(url);if(!uiSourceCode){var resource=WebInspector.resourceTreeModel.resourceForURL(url);if(!resource)
+return this._status.E_NOTFOUND(url);return this._status.E_NOTSUPPORTED("Resource is not editable")}
+uiSourceCode.setWorkingCopy(message.content);if(message.commit)
+uiSourceCode.commitWorkingCopy(callbackWrapper.bind(this));else
+callbackWrapper.call(this,null);},_requestId:function(request)
+{if(!request._extensionRequestId){request._extensionRequestId=++this._lastRequestId;this._requests[request._extensionRequestId]=request;}
+return request._extensionRequestId;},_requestById:function(id)
+{return this._requests[id];},_onAddAuditCategory:function(message,port)
+{var category=new WebInspector.ExtensionAuditCategory(port._extensionOrigin,message.id,message.displayName,message.resultCount);if(WebInspector.inspectorView.panel("audits").getCategory(category.id))
+return this._status.E_EXISTS(category.id);this._clientObjects[message.id]=category;WebInspector.inspectorView.panel("audits").addCategory(category);},_onAddAuditResult:function(message)
+{var auditResult=this._clientObjects[message.resultId];if(!auditResult)
+return this._status.E_NOTFOUND(message.resultId);try{auditResult.addResult(message.displayName,message.description,message.severity,message.details);}catch(e){return e;}
+return this._status.OK();},_onUpdateAuditProgress:function(message)
+{var auditResult=this._clientObjects[message.resultId];if(!auditResult)
+return this._status.E_NOTFOUND(message.resultId);auditResult.updateProgress(Math.min(Math.max(0,message.progress),1));},_onStopAuditCategoryRun:function(message)
+{var auditRun=this._clientObjects[message.resultId];if(!auditRun)
+return this._status.E_NOTFOUND(message.resultId);auditRun.done();},_onForwardKeyboardEvent:function(message)
+{const Esc="U+001B";message.entries.forEach(handleEventEntry);function handleEventEntry(entry)
+{if(!entry.ctrlKey&&!entry.altKey&&!entry.metaKey&&!/^F\d+$/.test(entry.keyIdentifier)&&entry.keyIdentifier!==Esc)
+return;var event=new window.KeyboardEvent(entry.eventType,{keyIdentifier:entry.keyIdentifier,location:entry.location,ctrlKey:entry.ctrlKey,altKey:entry.altKey,shiftKey:entry.shiftKey,metaKey:entry.metaKey});event.__keyCode=keyCodeForEntry(entry);document.dispatchEvent(event);}
+function keyCodeForEntry(entry)
+{var keyCode=entry.keyCode;if(!keyCode){var match=entry.keyIdentifier.match(/^U\+([\dA-Fa-f]+)$/);if(match)
+keyCode=parseInt(match[1],16);}
+return keyCode||0;}},_dispatchCallback:function(requestId,port,result)
+{if(requestId)
+port.postMessage({command:"callback",requestId:requestId,result:result});},_initExtensions:function()
+{this._registerAutosubscriptionHandler(WebInspector.extensionAPI.Events.ConsoleMessageAdded,WebInspector.console,WebInspector.ConsoleModel.Events.MessageAdded,this._notifyConsoleMessageAdded);this._registerAutosubscriptionHandler(WebInspector.extensionAPI.Events.NetworkRequestFinished,WebInspector.networkManager,WebInspector.NetworkManager.EventTypes.RequestFinished,this._notifyRequestFinished);this._registerAutosubscriptionHandler(WebInspector.extensionAPI.Events.ResourceAdded,WebInspector.workspace,WebInspector.Workspace.Events.UISourceCodeAdded,this._notifyResourceAdded);function onElementsSubscriptionStarted()
+{WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,this._notifyElementsSelectionChanged,this);}
+function onElementsSubscriptionStopped()
+{WebInspector.notifications.removeEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,this._notifyElementsSelectionChanged,this);}
+this._registerSubscriptionHandler(WebInspector.extensionAPI.Events.PanelObjectSelected+"elements",onElementsSubscriptionStarted.bind(this),onElementsSubscriptionStopped.bind(this));this._registerAutosubscriptionHandler(WebInspector.extensionAPI.Events.PanelObjectSelected+"sources",WebInspector.notifications,WebInspector.SourceFrame.Events.SelectionChanged,this._notifySourceFrameSelectionChanged);this._registerResourceContentCommittedHandler(this._notifyUISourceCodeContentCommitted);function onTimelineSubscriptionStarted()
+{WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded,this._notifyTimelineEventRecorded,this);WebInspector.timelineManager.start();}
+function onTimelineSubscriptionStopped()
+{WebInspector.timelineManager.stop();WebInspector.timelineManager.removeEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded,this._notifyTimelineEventRecorded,this);}
+this._registerSubscriptionHandler(WebInspector.extensionAPI.Events.TimelineEventRecorded,onTimelineSubscriptionStarted.bind(this),onTimelineSubscriptionStopped.bind(this));WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._inspectedURLChanged,this);InspectorExtensionRegistry.getExtensionsAsync();},_makeSourceSelection:function(textRange)
+{var sourcesPanel=WebInspector.inspectorView.panel("sources");var selection={startLine:textRange.startLine,startColumn:textRange.startColumn,endLine:textRange.endLine,endColumn:textRange.endColumn,url:sourcesPanel.sourcesView().currentUISourceCode().uri()};return selection;},_notifySourceFrameSelectionChanged:function(event)
+{this._postNotification(WebInspector.extensionAPI.Events.PanelObjectSelected+"sources",this._makeSourceSelection(event.data));},_notifyConsoleMessageAdded:function(event)
+{this._postNotification(WebInspector.extensionAPI.Events.ConsoleMessageAdded,this._makeConsoleMessage(event.data));},_notifyResourceAdded:function(event)
+{var uiSourceCode=(event.data);this._postNotification(WebInspector.extensionAPI.Events.ResourceAdded,this._makeResource(uiSourceCode));},_notifyUISourceCodeContentCommitted:function(event)
+{var uiSourceCode=(event.data.uiSourceCode);var content=(event.data.content);this._postNotification(WebInspector.extensionAPI.Events.ResourceContentCommitted,this._makeResource(uiSourceCode),content);},_notifyRequestFinished:function(event)
+{var request=(event.data);this._postNotification(WebInspector.extensionAPI.Events.NetworkRequestFinished,this._requestId(request),(new WebInspector.HAREntry(request)).build());},_notifyElementsSelectionChanged:function()
+{this._postNotification(WebInspector.extensionAPI.Events.PanelObjectSelected+"elements");},_notifyTimelineEventRecorded:function(event)
+{this._postNotification(WebInspector.extensionAPI.Events.TimelineEventRecorded,event.data);},addExtensions:function(extensionInfos)
+{extensionInfos.forEach(this._addExtension,this);},_addExtension:function(extensionInfo)
+{const urlOriginRegExp=new RegExp("([^:]+:\/\/[^/]*)\/");var startPage=extensionInfo.startPage;var name=extensionInfo.name;try{var originMatch=urlOriginRegExp.exec(startPage);if(!originMatch){console.error("Skipping extension with invalid URL: "+startPage);return false;}
+var extensionOrigin=originMatch[1];if(!this._registeredExtensions[extensionOrigin]){InspectorFrontendHost.setInjectedScriptForOrigin(extensionOrigin,buildExtensionAPIInjectedScript(extensionInfo));this._registeredExtensions[extensionOrigin]={name:name};}
+var iframe=document.createElement("iframe");iframe.src=startPage;iframe.style.display="none";document.body.appendChild(iframe);}catch(e){console.error("Failed to initialize extension "+startPage+":"+e);return false;}
+return true;},_registerExtension:function(origin,port)
+{if(!this._registeredExtensions.hasOwnProperty(origin)){if(origin!==window.location.origin)
+console.error("Ignoring unauthorized client request from "+origin);return;}
+port._extensionOrigin=origin;port.addEventListener("message",this._onmessage.bind(this),false);port.start();},_onWindowMessage:function(event)
+{if(event.data==="registerExtension")
+this._registerExtension(event.origin,event.ports[0]);},_onmessage:function(event)
+{var message=event.data;var result;if(message.command in this._handlers)
+result=this._handlers[message.command](message,event.target);else
+result=this._status.E_NOTSUPPORTED(message.command);if(result&&message.requestId)
+this._dispatchCallback(message.requestId,event.target,result);},_registerHandler:function(command,callback)
+{console.assert(command);this._handlers[command]=callback;},_registerSubscriptionHandler:function(eventTopic,onSubscribeFirst,onUnsubscribeLast)
+{this._subscriptionStartHandlers[eventTopic]=onSubscribeFirst;this._subscriptionStopHandlers[eventTopic]=onUnsubscribeLast;},_registerAutosubscriptionHandler:function(eventTopic,eventTarget,frontendEventType,handler)
+{this._registerSubscriptionHandler(eventTopic,eventTarget.addEventListener.bind(eventTarget,frontendEventType,handler,this),eventTarget.removeEventListener.bind(eventTarget,frontendEventType,handler,this));},_registerResourceContentCommittedHandler:function(handler)
+{function addFirstEventListener()
+{WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted,handler,this);WebInspector.workspace.setHasResourceContentTrackingExtensions(true);}
+function removeLastEventListener()
+{WebInspector.workspace.setHasResourceContentTrackingExtensions(false);WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted,handler,this);}
+this._registerSubscriptionHandler(WebInspector.extensionAPI.Events.ResourceContentCommitted,addFirstEventListener.bind(this),removeLastEventListener.bind(this));},_expandResourcePath:function(extensionPath,resourcePath)
+{if(!resourcePath)
+return;return extensionPath+this._normalizePath(resourcePath);},_normalizePath:function(path)
+{var source=path.split("/");var result=[];for(var i=0;i<source.length;++i){if(source[i]===".")
+continue;if(source[i]==="")
+continue;if(source[i]==="..")
+result.pop();else
+result.push(source[i]);}
+return"/"+result.join("/");},evaluate:function(expression,exposeCommandLineAPI,returnByValue,options,securityOrigin,callback)
+{var contextId;function resolveURLToFrame(url)
+{var found;function hasMatchingURL(frame)
+{found=(frame.url===url)?frame:null;return found;}
+WebInspector.resourceTreeModel.frames().some(hasMatchingURL);return found;}
+if(typeof options==="object"){var frame=options.frameURL?resolveURLToFrame(options.frameURL):WebInspector.resourceTreeModel.mainFrame;if(!frame){if(options.frameURL)
+console.warn("evaluate: there is no frame with URL "+options.frameURL);else
+console.warn("evaluate: the main frame is not yet available");return this._status.E_NOTFOUND(options.frameURL||"<top>");}
+var contextSecurityOrigin;if(options.useContentScriptContext)
+contextSecurityOrigin=securityOrigin;else if(options.scriptExecutionContext)
+contextSecurityOrigin=options.scriptExecutionContext;var frameContextList=WebInspector.runtimeModel.contextListByFrame(frame);var context;if(contextSecurityOrigin){context=frameContextList.contextBySecurityOrigin(contextSecurityOrigin);if(!context){console.warn("The JavaScript context "+contextSecurityOrigin+" was not found in the frame "+frame.url)
+return this._status.E_NOTFOUND(contextSecurityOrigin)}}else{context=frameContextList.mainWorldContext();if(!context)
+return this._status.E_FAILED(frame.url+" has no execution context");}
+contextId=context.id;}
+RuntimeAgent.evaluate(expression,"extension",exposeCommandLineAPI,true,contextId,returnByValue,false,callback);}}
+WebInspector.ExtensionServerPanelDescriptor=function(name,title,panel)
+{this._name=name;this._title=title;this._panel=panel;}
+WebInspector.ExtensionServerPanelDescriptor.prototype={name:function()
+{return this._name;},title:function()
+{return this._title;},panel:function()
+{return this._panel;}}
+WebInspector.ExtensionStatus=function()
+{function makeStatus(code,description)
+{var details=Array.prototype.slice.call(arguments,2);var status={code:code,description:description,details:details};if(code!=="OK"){status.isError=true;console.log("Extension server error: "+String.vsprintf(description,details));}
+return status;}
+this.OK=makeStatus.bind(null,"OK","OK");this.E_EXISTS=makeStatus.bind(null,"E_EXISTS","Object already exists: %s");this.E_BADARG=makeStatus.bind(null,"E_BADARG","Invalid argument %s: %s");this.E_BADARGTYPE=makeStatus.bind(null,"E_BADARGTYPE","Invalid type for argument %s: got %s, expected %s");this.E_NOTFOUND=makeStatus.bind(null,"E_NOTFOUND","Object not found: %s");this.E_NOTSUPPORTED=makeStatus.bind(null,"E_NOTSUPPORTED","Object does not support requested operation: %s");this.E_PROTOCOLERROR=makeStatus.bind(null,"E_PROTOCOLERROR","Inspector protocol error: %s");this.E_FAILED=makeStatus.bind(null,"E_FAILED","Operation failed: %s");}
+WebInspector.ExtensionStatus.Record;WebInspector.extensionAPI={};defineCommonExtensionSymbols(WebInspector.extensionAPI);WebInspector.ExtensionPanel=function(id,pageURL)
+{WebInspector.Panel.call(this,id);this.setHideOnDetach();this.element.classList.add("extension-panel");this._panelStatusBarElement=this.element.createChild("div","panel-status-bar hidden");this._searchableView=new WebInspector.SearchableView(this);this._searchableView.show(this.element);var extensionView=new WebInspector.ExtensionView(id,pageURL,"extension panel");extensionView.show(this._searchableView.element);this.setDefaultFocusedElement(extensionView.defaultFocusedElement());}
+WebInspector.ExtensionPanel.prototype={defaultFocusedElement:function()
+{return WebInspector.View.prototype.defaultFocusedElement.call(this);},addStatusBarItem:function(element)
+{this._panelStatusBarElement.classList.remove("hidden");this._panelStatusBarElement.appendChild(element);},searchCanceled:function()
+{WebInspector.extensionServer.notifySearchAction(this.name,WebInspector.extensionAPI.panels.SearchAction.CancelSearch);this._searchableView.updateSearchMatchesCount(0);},searchableView:function()
+{return this._searchableView;},performSearch:function(query,shouldJump)
+{WebInspector.extensionServer.notifySearchAction(this.name,WebInspector.extensionAPI.panels.SearchAction.PerformSearch,query);},jumpToNextSearchResult:function()
+{WebInspector.extensionServer.notifySearchAction(this.name,WebInspector.extensionAPI.panels.SearchAction.NextSearchResult);},jumpToPreviousSearchResult:function()
+{WebInspector.extensionServer.notifySearchAction(this.name,WebInspector.extensionAPI.panels.SearchAction.PreviousSearchResult);},__proto__:WebInspector.Panel.prototype}
+WebInspector.ExtensionButton=function(id,iconURL,tooltip,disabled)
+{this._id=id;this.element=document.createElement("button");this.element.className="status-bar-item extension";this.element.addEventListener("click",this._onClicked.bind(this),false);this.update(iconURL,tooltip,disabled);}
+WebInspector.ExtensionButton.prototype={update:function(iconURL,tooltip,disabled)
+{if(typeof iconURL==="string")
+this.element.style.backgroundImage="url("+iconURL+")";if(typeof tooltip==="string")
+this.element.title=tooltip;if(typeof disabled==="boolean")
+this.element.disabled=disabled;},_onClicked:function()
+{WebInspector.extensionServer.notifyButtonClicked(this._id);}}
+WebInspector.ExtensionSidebarPane=function(title,id)
+{WebInspector.SidebarPane.call(this,title);this.setHideOnDetach();this._id=id;}
+WebInspector.ExtensionSidebarPane.prototype={setObject:function(object,title,callback)
+{this._createObjectPropertiesView();this._setObject(WebInspector.RemoteObject.fromLocalObject(object),title,callback);},setExpression:function(expression,title,evaluateOptions,securityOrigin,callback)
+{this._createObjectPropertiesView();WebInspector.extensionServer.evaluate(expression,true,false,evaluateOptions,securityOrigin,this._onEvaluate.bind(this,title,callback));},setPage:function(url)
+{if(this._objectPropertiesView){this._objectPropertiesView.detach();delete this._objectPropertiesView;}
+if(this._extensionView)
+this._extensionView.detach(true);this._extensionView=new WebInspector.ExtensionView(this._id,url,"extension fill");this._extensionView.show(this.bodyElement);if(!this.bodyElement.style.height)
+this.setHeight("150px");},setHeight:function(height)
+{this.bodyElement.style.height=height;},_onEvaluate:function(title,callback,error,result,wasThrown)
+{if(error)
+callback(error.toString());else
+this._setObject(WebInspector.RemoteObject.fromPayload(result),title,callback);},_createObjectPropertiesView:function()
+{if(this._objectPropertiesView)
+return;if(this._extensionView){this._extensionView.detach(true);delete this._extensionView;}
+this._objectPropertiesView=new WebInspector.ExtensionNotifierView(this._id);this._objectPropertiesView.show(this.bodyElement);},_setObject:function(object,title,callback)
+{if(!this._objectPropertiesView){callback("operation cancelled");return;}
+this._objectPropertiesView.element.removeChildren();var section=new WebInspector.ObjectPropertiesSection(object,title);if(!title)
+section.headerElement.classList.add("hidden");section.expanded=true;section.editable=false;this._objectPropertiesView.element.appendChild(section.element);callback();},__proto__:WebInspector.SidebarPane.prototype};WebInspector.ExtensionView=function(id,src,className)
+{WebInspector.View.call(this);this.element.className="extension-view fill";this._id=id;this._iframe=document.createElement("iframe");this._iframe.addEventListener("load",this._onLoad.bind(this),false);this._iframe.src=src;this._iframe.className=className;this.setDefaultFocusedElement(this._iframe);this.element.appendChild(this._iframe);}
+WebInspector.ExtensionView.prototype={wasShown:function()
+{if(typeof this._frameIndex==="number")
+WebInspector.extensionServer.notifyViewShown(this._id,this._frameIndex);},willHide:function()
+{if(typeof this._frameIndex==="number")
+WebInspector.extensionServer.notifyViewHidden(this._id);},_onLoad:function()
+{var frames=(window.frames);this._frameIndex=Array.prototype.indexOf.call(frames,this._iframe.contentWindow);if(this.isShowing())
+WebInspector.extensionServer.notifyViewShown(this._id,this._frameIndex);},__proto__:WebInspector.View.prototype}
+WebInspector.ExtensionNotifierView=function(id)
+{WebInspector.VBox.call(this);this._id=id;}
+WebInspector.ExtensionNotifierView.prototype={wasShown:function()
+{WebInspector.extensionServer.notifyViewShown(this._id);},willHide:function()
+{WebInspector.extensionServer.notifyViewHidden(this._id);},__proto__:WebInspector.VBox.prototype};
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/HeapSnapshotWorker.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/HeapSnapshotWorker.js
new file mode 100644 (file)
index 0000000..b9af26e
--- /dev/null
@@ -0,0 +1,872 @@
+WebInspector={};WebInspector.AllocationProfile=function(profile,liveObjectStats)
+{this._strings=profile.strings;this._liveObjectStats=liveObjectStats;this._nextNodeId=1;this._functionInfos=[]
+this._idToNode={};this._collapsedTopNodeIdToFunctionInfo={};this._traceTops=null;this._buildFunctionAllocationInfos(profile);this._traceTree=this._buildAllocationTree(profile,liveObjectStats);}
+WebInspector.AllocationProfile.prototype={_buildFunctionAllocationInfos:function(profile)
+{var strings=this._strings;var functionInfoFields=profile.snapshot.meta.trace_function_info_fields;var functionIdOffset=functionInfoFields.indexOf("function_id");var functionNameOffset=functionInfoFields.indexOf("name");var scriptNameOffset=functionInfoFields.indexOf("script_name");var scriptIdOffset=functionInfoFields.indexOf("script_id");var lineOffset=functionInfoFields.indexOf("line");var columnOffset=functionInfoFields.indexOf("column");var functionInfoFieldCount=functionInfoFields.length;var rawInfos=profile.trace_function_infos;var infoLength=rawInfos.length;var functionInfos=this._functionInfos=new Array(infoLength/functionInfoFieldCount);var index=0;for(var i=0;i<infoLength;i+=functionInfoFieldCount){functionInfos[index++]=new WebInspector.FunctionAllocationInfo(strings[rawInfos[i+functionNameOffset]],strings[rawInfos[i+scriptNameOffset]],rawInfos[i+scriptIdOffset],rawInfos[i+lineOffset],rawInfos[i+columnOffset]);}},_buildAllocationTree:function(profile,liveObjectStats)
+{var traceTreeRaw=profile.trace_tree;var functionInfos=this._functionInfos;var traceNodeFields=profile.snapshot.meta.trace_node_fields;var nodeIdOffset=traceNodeFields.indexOf("id");var functionInfoIndexOffset=traceNodeFields.indexOf("function_info_index");var allocationCountOffset=traceNodeFields.indexOf("count");var allocationSizeOffset=traceNodeFields.indexOf("size");var childrenOffset=traceNodeFields.indexOf("children");var nodeFieldCount=traceNodeFields.length;function traverseNode(rawNodeArray,nodeOffset,parent)
+{var functionInfo=functionInfos[rawNodeArray[nodeOffset+functionInfoIndexOffset]];var id=rawNodeArray[nodeOffset+nodeIdOffset];var stats=liveObjectStats[id];var liveCount=stats?stats.count:0;var liveSize=stats?stats.size:0;var result=new WebInspector.TopDownAllocationNode(id,functionInfo,rawNodeArray[nodeOffset+allocationCountOffset],rawNodeArray[nodeOffset+allocationSizeOffset],liveCount,liveSize,parent);functionInfo.addTraceTopNode(result);var rawChildren=rawNodeArray[nodeOffset+childrenOffset];for(var i=0;i<rawChildren.length;i+=nodeFieldCount){result.children.push(traverseNode(rawChildren,i,result));}
+return result;}
+return traverseNode(traceTreeRaw,0,null);},serializeTraceTops:function()
+{if(this._traceTops)
+return this._traceTops;var result=this._traceTops=[];var functionInfos=this._functionInfos;for(var i=0;i<functionInfos.length;i++){var info=functionInfos[i];if(info.totalCount===0)
+continue;var nodeId=this._nextNodeId++;result.push(this._serializeNode(nodeId,info,info.totalCount,info.totalSize,info.totalLiveCount,info.totalLiveSize,true));this._collapsedTopNodeIdToFunctionInfo[nodeId]=info;}
+result.sort(function(a,b){return b.size-a.size;});return result;},serializeCallers:function(nodeId)
+{var node=this._ensureBottomUpNode(nodeId);var nodesWithSingleCaller=[];while(node.callers().length===1){node=node.callers()[0];nodesWithSingleCaller.push(this._serializeCaller(node));}
+var branchingCallers=[];var callers=node.callers();for(var i=0;i<callers.length;i++){branchingCallers.push(this._serializeCaller(callers[i]));}
+return new WebInspector.HeapSnapshotCommon.AllocationNodeCallers(nodesWithSingleCaller,branchingCallers);},traceIds:function(allocationNodeId)
+{return this._ensureBottomUpNode(allocationNodeId).traceTopIds;},_ensureBottomUpNode:function(nodeId)
+{var node=this._idToNode[nodeId];if(!node){var functionInfo=this._collapsedTopNodeIdToFunctionInfo[nodeId];node=functionInfo.bottomUpRoot();delete this._collapsedTopNodeIdToFunctionInfo[nodeId];this._idToNode[nodeId]=node;}
+return node;},_serializeCaller:function(node)
+{var callerId=this._nextNodeId++;this._idToNode[callerId]=node;return this._serializeNode(callerId,node.functionInfo,node.allocationCount,node.allocationSize,node.liveCount,node.liveSize,node.hasCallers());},_serializeNode:function(nodeId,functionInfo,count,size,liveCount,liveSize,hasChildren)
+{return new WebInspector.HeapSnapshotCommon.SerializedAllocationNode(nodeId,functionInfo.functionName,functionInfo.scriptName,functionInfo.line,functionInfo.column,count,size,liveCount,liveSize,hasChildren);}}
+WebInspector.TopDownAllocationNode=function(id,functionInfo,count,size,liveCount,liveSize,parent)
+{this.id=id;this.functionInfo=functionInfo;this.allocationCount=count;this.allocationSize=size;this.liveCount=liveCount;this.liveSize=liveSize;this.parent=parent;this.children=[];}
+WebInspector.BottomUpAllocationNode=function(functionInfo)
+{this.functionInfo=functionInfo;this.allocationCount=0;this.allocationSize=0;this.liveCount=0;this.liveSize=0;this.traceTopIds=[];this._callers=[];}
+WebInspector.BottomUpAllocationNode.prototype={addCaller:function(traceNode)
+{var functionInfo=traceNode.functionInfo;var result;for(var i=0;i<this._callers.length;i++){var caller=this._callers[i];if(caller.functionInfo===functionInfo){result=caller;break;}}
+if(!result){result=new WebInspector.BottomUpAllocationNode(functionInfo);this._callers.push(result);}
+return result;},callers:function()
+{return this._callers;},hasCallers:function()
+{return this._callers.length>0;}}
+WebInspector.FunctionAllocationInfo=function(functionName,scriptName,scriptId,line,column)
+{this.functionName=functionName;this.scriptName=scriptName;this.scriptId=scriptId;this.line=line;this.column=column;this.totalCount=0;this.totalSize=0;this.totalLiveCount=0;this.totalLiveSize=0;this._traceTops=[];}
+WebInspector.FunctionAllocationInfo.prototype={addTraceTopNode:function(node)
+{if(node.allocationCount===0)
+return;this._traceTops.push(node);this.totalCount+=node.allocationCount;this.totalSize+=node.allocationSize;this.totalLiveCount+=node.liveCount;this.totalLiveSize+=node.liveSize;},bottomUpRoot:function()
+{if(!this._traceTops.length)
+return null;if(!this._bottomUpTree)
+this._buildAllocationTraceTree();return this._bottomUpTree;},_buildAllocationTraceTree:function()
+{this._bottomUpTree=new WebInspector.BottomUpAllocationNode(this);for(var i=0;i<this._traceTops.length;i++){var node=this._traceTops[i];var bottomUpNode=this._bottomUpTree;var count=node.allocationCount;var size=node.allocationSize;var liveCount=node.liveCount;var liveSize=node.liveSize;var traceId=node.id;while(true){bottomUpNode.allocationCount+=count;bottomUpNode.allocationSize+=size;bottomUpNode.liveCount+=liveCount;bottomUpNode.liveSize+=liveSize;bottomUpNode.traceTopIds.push(traceId);node=node.parent;if(node===null){break;}
+bottomUpNode=bottomUpNode.addCaller(node);}}}};WebInspector.HeapSnapshotItem=function(){}
+WebInspector.HeapSnapshotItem.prototype={itemIndex:function(){},serialize:function(){}};WebInspector.HeapSnapshotEdge=function(snapshot,edgeIndex)
+{this._snapshot=snapshot;this._edges=snapshot._containmentEdges;this.edgeIndex=edgeIndex||0;}
+WebInspector.HeapSnapshotEdge.Serialized=function(name,node,nodeIndex,type)
+{this.name=name;this.node=node;this.nodeIndex=nodeIndex;this.type=type;};WebInspector.HeapSnapshotEdge.prototype={clone:function()
+{return new WebInspector.HeapSnapshotEdge(this._snapshot,this.edgeIndex);},hasStringName:function()
+{throw new Error("Not implemented");},name:function()
+{throw new Error("Not implemented");},node:function()
+{return this._snapshot.createNode(this.nodeIndex());},nodeIndex:function()
+{return this._edges[this.edgeIndex+this._snapshot._edgeToNodeOffset];},toString:function()
+{return"HeapSnapshotEdge: "+this.name();},type:function()
+{return this._snapshot._edgeTypes[this._type()];},itemIndex:function()
+{return this.edgeIndex;},serialize:function()
+{var node=this.node();return new WebInspector.HeapSnapshotEdge.Serialized(this.name(),node.serialize(),this.nodeIndex(),this.type());},_type:function()
+{return this._edges[this.edgeIndex+this._snapshot._edgeTypeOffset];}};WebInspector.HeapSnapshotItemIterator=function(){}
+WebInspector.HeapSnapshotItemIterator.prototype={hasNext:function(){},item:function(){},next:function(){}};WebInspector.HeapSnapshotItemIndexProvider=function(){}
+WebInspector.HeapSnapshotItemIndexProvider.prototype={itemForIndex:function(newIndex){},};WebInspector.HeapSnapshotNodeIndexProvider=function(snapshot)
+{this._node=snapshot.createNode();}
+WebInspector.HeapSnapshotNodeIndexProvider.prototype={itemForIndex:function(index)
+{this._node.nodeIndex=index;return this._node;}};WebInspector.HeapSnapshotEdgeIndexProvider=function(snapshot)
+{this._edge=snapshot.createEdge(0);}
+WebInspector.HeapSnapshotEdgeIndexProvider.prototype={itemForIndex:function(index)
+{this._edge.edgeIndex=index;return this._edge;}};WebInspector.HeapSnapshotRetainerEdgeIndexProvider=function(snapshot)
+{this._retainerEdge=snapshot.createRetainingEdge(0);}
+WebInspector.HeapSnapshotRetainerEdgeIndexProvider.prototype={itemForIndex:function(index)
+{this._retainerEdge.setRetainerIndex(index);return this._retainerEdge;}};WebInspector.HeapSnapshotEdgeIterator=function(node)
+{this._sourceNode=node;this.edge=node._snapshot.createEdge(node._edgeIndexesStart());}
+WebInspector.HeapSnapshotEdgeIterator.prototype={hasNext:function()
+{return this.edge.edgeIndex<this._sourceNode._edgeIndexesEnd();},item:function()
+{return this.edge;},next:function()
+{this.edge.edgeIndex+=this.edge._snapshot._edgeFieldsCount;}};WebInspector.HeapSnapshotRetainerEdge=function(snapshot,retainerIndex)
+{this._snapshot=snapshot;this.setRetainerIndex(retainerIndex);}
+WebInspector.HeapSnapshotRetainerEdge.Serialized=function(name,node,nodeIndex,type){this.name=name;this.node=node;this.nodeIndex=nodeIndex;this.type=type;}
+WebInspector.HeapSnapshotRetainerEdge.prototype={clone:function()
+{return new WebInspector.HeapSnapshotRetainerEdge(this._snapshot,this.retainerIndex());},hasStringName:function()
+{return this._edge().hasStringName();},name:function()
+{return this._edge().name();},node:function()
+{return this._node();},nodeIndex:function()
+{return this._retainingNodeIndex;},retainerIndex:function()
+{return this._retainerIndex;},setRetainerIndex:function(retainerIndex)
+{if(retainerIndex===this._retainerIndex)
+return;this._retainerIndex=retainerIndex;this._globalEdgeIndex=this._snapshot._retainingEdges[retainerIndex];this._retainingNodeIndex=this._snapshot._retainingNodes[retainerIndex];this._edgeInstance=null;this._nodeInstance=null;},set edgeIndex(edgeIndex)
+{this.setRetainerIndex(edgeIndex);},_node:function()
+{if(!this._nodeInstance)
+this._nodeInstance=this._snapshot.createNode(this._retainingNodeIndex);return this._nodeInstance;},_edge:function()
+{if(!this._edgeInstance)
+this._edgeInstance=this._snapshot.createEdge(this._globalEdgeIndex);return this._edgeInstance;},toString:function()
+{return this._edge().toString();},itemIndex:function()
+{return this._retainerIndex;},serialize:function()
+{var node=this.node();return new WebInspector.HeapSnapshotRetainerEdge.Serialized(this.name(),node.serialize(),this.nodeIndex(),this.type());},type:function()
+{return this._edge().type();}}
+WebInspector.HeapSnapshotRetainerEdgeIterator=function(retainedNode)
+{var snapshot=retainedNode._snapshot;var retainedNodeOrdinal=retainedNode._ordinal();var retainerIndex=snapshot._firstRetainerIndex[retainedNodeOrdinal];this._retainersEnd=snapshot._firstRetainerIndex[retainedNodeOrdinal+1];this.retainer=snapshot.createRetainingEdge(retainerIndex);}
+WebInspector.HeapSnapshotRetainerEdgeIterator.prototype={hasNext:function()
+{return this.retainer.retainerIndex()<this._retainersEnd;},item:function()
+{return this.retainer;},next:function()
+{this.retainer.setRetainerIndex(this.retainer.retainerIndex()+1);}};WebInspector.HeapSnapshotNode=function(snapshot,nodeIndex)
+{this._snapshot=snapshot;this.nodeIndex=nodeIndex||0;}
+WebInspector.HeapSnapshotNode.Serialized=function(id,name,distance,nodeIndex,retainedSize,selfSize,type){this.id=id;this.name=name;this.distance=distance;this.nodeIndex=nodeIndex;this.retainedSize=retainedSize;this.selfSize=selfSize;this.type=type;}
+WebInspector.HeapSnapshotNode.prototype={distance:function()
+{return this._snapshot._nodeDistances[this.nodeIndex/this._snapshot._nodeFieldCount];},className:function()
+{throw new Error("Not implemented");},classIndex:function()
+{throw new Error("Not implemented");},dominatorIndex:function()
+{var nodeFieldCount=this._snapshot._nodeFieldCount;return this._snapshot._dominatorsTree[this.nodeIndex/this._snapshot._nodeFieldCount]*nodeFieldCount;},edges:function()
+{return new WebInspector.HeapSnapshotEdgeIterator(this);},edgesCount:function()
+{return(this._edgeIndexesEnd()-this._edgeIndexesStart())/this._snapshot._edgeFieldsCount;},id:function()
+{throw new Error("Not implemented");},isRoot:function()
+{return this.nodeIndex===this._snapshot._rootNodeIndex;},name:function()
+{return this._snapshot._strings[this._name()];},retainedSize:function()
+{return this._snapshot._retainedSizes[this._ordinal()];},retainers:function()
+{return new WebInspector.HeapSnapshotRetainerEdgeIterator(this);},retainersCount:function()
+{var snapshot=this._snapshot;var ordinal=this._ordinal();return snapshot._firstRetainerIndex[ordinal+1]-snapshot._firstRetainerIndex[ordinal];},selfSize:function()
+{var snapshot=this._snapshot;return snapshot._nodes[this.nodeIndex+snapshot._nodeSelfSizeOffset];},type:function()
+{return this._snapshot._nodeTypes[this._type()];},traceNodeId:function()
+{var snapshot=this._snapshot;return snapshot._nodes[this.nodeIndex+snapshot._nodeTraceNodeIdOffset];},itemIndex:function()
+{return this.nodeIndex;},serialize:function()
+{return new WebInspector.HeapSnapshotNode.Serialized(this.id(),this.name(),this.distance(),this.nodeIndex,this.retainedSize(),this.selfSize(),this.type());},_name:function()
+{var snapshot=this._snapshot;return snapshot._nodes[this.nodeIndex+snapshot._nodeNameOffset];},_edgeIndexesStart:function()
+{return this._snapshot._firstEdgeIndexes[this._ordinal()];},_edgeIndexesEnd:function()
+{return this._snapshot._firstEdgeIndexes[this._ordinal()+1];},_ordinal:function()
+{return this.nodeIndex/this._snapshot._nodeFieldCount;},_nextNodeIndex:function()
+{return this.nodeIndex+this._snapshot._nodeFieldCount;},_type:function()
+{var snapshot=this._snapshot;return snapshot._nodes[this.nodeIndex+snapshot._nodeTypeOffset];}};WebInspector.HeapSnapshotNodeIterator=function(node)
+{this.node=node;this._nodesLength=node._snapshot._nodes.length;}
+WebInspector.HeapSnapshotNodeIterator.prototype={hasNext:function()
+{return this.node.nodeIndex<this._nodesLength;},item:function()
+{return this.node;},next:function()
+{this.node.nodeIndex=this.node._nextNodeIndex();}}
+WebInspector.HeapSnapshotIndexRangeIterator=function(itemProvider,indexes)
+{this._itemProvider=itemProvider;this._indexes=indexes;this._position=0;}
+WebInspector.HeapSnapshotIndexRangeIterator.prototype={hasNext:function()
+{return this._position<this._indexes.length},item:function()
+{var index=this._indexes[this._position];return this._itemProvider.itemForIndex(index);},next:function()
+{++this._position;}}
+WebInspector.HeapSnapshotFilteredIterator=function(iterator,filter)
+{this._iterator=iterator;this._filter=filter;this._skipFilteredItems();}
+WebInspector.HeapSnapshotFilteredIterator.prototype={hasNext:function()
+{return this._iterator.hasNext();},item:function()
+{return this._iterator.item();},next:function()
+{this._iterator.next();this._skipFilteredItems();},_skipFilteredItems:function()
+{while(this._iterator.hasNext()&&!this._filter(this._iterator.item())){this._iterator.next();}}}
+WebInspector.HeapSnapshotProgress=function(dispatcher)
+{this._dispatcher=dispatcher;}
+WebInspector.HeapSnapshotProgress.prototype={updateStatus:function(status)
+{this._sendUpdateEvent(WebInspector.UIString(status));},updateProgress:function(title,value,total)
+{var percentValue=((total?(value/total):0)*100).toFixed(0);this._sendUpdateEvent(WebInspector.UIString(title,percentValue));},_sendUpdateEvent:function(text)
+{if(this._dispatcher)
+this._dispatcher.sendEvent(WebInspector.HeapSnapshotProgressEvent.Update,text);}}
+WebInspector.HeapSnapshot=function(profile,progress,showHiddenData)
+{this._nodes=profile.nodes;this._containmentEdges=profile.edges;this._metaNode=profile.snapshot.meta;this._strings=profile.strings;this._progress=progress;this._noDistance=-5;this._rootNodeIndex=0;if(profile.snapshot.root_index)
+this._rootNodeIndex=profile.snapshot.root_index;this._snapshotDiffs={};this._aggregatesForDiff=null;this._aggregates={};this._aggregatesSortedFlags={};this._showHiddenData=showHiddenData;this._init();if(profile.snapshot.trace_function_count){this._progress.updateStatus("Buiding allocation statistics\u2026");var nodes=this._nodes;var nodesLength=nodes.length;var nodeFieldCount=this._nodeFieldCount;var node=this.rootNode();var liveObjects={};for(var nodeIndex=0;nodeIndex<nodesLength;nodeIndex+=nodeFieldCount){node.nodeIndex=nodeIndex;var traceNodeId=node.traceNodeId();var stats=liveObjects[traceNodeId];if(!stats){liveObjects[traceNodeId]=stats={count:0,size:0,ids:[]};}
+stats.count++;stats.size+=node.selfSize();stats.ids.push(node.id());}
+this._allocationProfile=new WebInspector.AllocationProfile(profile,liveObjects);this._progress.updateStatus("Done");}}
+function HeapSnapshotMetainfo()
+{this.node_fields=[];this.node_types=[];this.edge_fields=[];this.edge_types=[];this.trace_function_info_fields=[];this.trace_node_fields=[];this.type_strings={};}
+function HeapSnapshotHeader()
+{this.title="";this.meta=new HeapSnapshotMetainfo();this.node_count=0;this.edge_count=0;}
+WebInspector.HeapSnapshot.prototype={_init:function()
+{var meta=this._metaNode;this._nodeTypeOffset=meta.node_fields.indexOf("type");this._nodeNameOffset=meta.node_fields.indexOf("name");this._nodeIdOffset=meta.node_fields.indexOf("id");this._nodeSelfSizeOffset=meta.node_fields.indexOf("self_size");this._nodeEdgeCountOffset=meta.node_fields.indexOf("edge_count");this._nodeTraceNodeIdOffset=meta.node_fields.indexOf("trace_node_id");this._nodeFieldCount=meta.node_fields.length;this._nodeTypes=meta.node_types[this._nodeTypeOffset];this._nodeHiddenType=this._nodeTypes.indexOf("hidden");this._nodeObjectType=this._nodeTypes.indexOf("object");this._nodeNativeType=this._nodeTypes.indexOf("native");this._nodeConsStringType=this._nodeTypes.indexOf("concatenated string");this._nodeSlicedStringType=this._nodeTypes.indexOf("sliced string");this._nodeCodeType=this._nodeTypes.indexOf("code");this._nodeSyntheticType=this._nodeTypes.indexOf("synthetic");this._edgeFieldsCount=meta.edge_fields.length;this._edgeTypeOffset=meta.edge_fields.indexOf("type");this._edgeNameOffset=meta.edge_fields.indexOf("name_or_index");this._edgeToNodeOffset=meta.edge_fields.indexOf("to_node");this._edgeTypes=meta.edge_types[this._edgeTypeOffset];this._edgeTypes.push("invisible");this._edgeElementType=this._edgeTypes.indexOf("element");this._edgeHiddenType=this._edgeTypes.indexOf("hidden");this._edgeInternalType=this._edgeTypes.indexOf("internal");this._edgeShortcutType=this._edgeTypes.indexOf("shortcut");this._edgeWeakType=this._edgeTypes.indexOf("weak");this._edgeInvisibleType=this._edgeTypes.indexOf("invisible");this.nodeCount=this._nodes.length/this._nodeFieldCount;this._edgeCount=this._containmentEdges.length/this._edgeFieldsCount;this._progress.updateStatus("Building edge indexes\u2026");this._buildEdgeIndexes();this._progress.updateStatus("Building retainers\u2026");this._buildRetainers();this._progress.updateStatus("Calculating node flags\u2026");this._calculateFlags();this._progress.updateStatus("Calculating distances\u2026");this._calculateDistances();this._progress.updateStatus("Building postorder index\u2026");var result=this._buildPostOrderIndex();this._progress.updateStatus("Building dominator tree\u2026");this._dominatorsTree=this._buildDominatorTree(result.postOrderIndex2NodeOrdinal,result.nodeOrdinal2PostOrderIndex);this._progress.updateStatus("Calculating retained sizes\u2026");this._calculateRetainedSizes(result.postOrderIndex2NodeOrdinal);this._progress.updateStatus("Buiding dominated nodes\u2026");this._buildDominatedNodes();this._progress.updateStatus("Calculating statistics\u2026");this._calculateStatistics();this._progress.updateStatus("Finished processing.");},_buildEdgeIndexes:function()
+{var nodes=this._nodes;var nodeCount=this.nodeCount;var firstEdgeIndexes=this._firstEdgeIndexes=new Uint32Array(nodeCount+1);var nodeFieldCount=this._nodeFieldCount;var edgeFieldsCount=this._edgeFieldsCount;var nodeEdgeCountOffset=this._nodeEdgeCountOffset;firstEdgeIndexes[nodeCount]=this._containmentEdges.length;for(var nodeOrdinal=0,edgeIndex=0;nodeOrdinal<nodeCount;++nodeOrdinal){firstEdgeIndexes[nodeOrdinal]=edgeIndex;edgeIndex+=nodes[nodeOrdinal*nodeFieldCount+nodeEdgeCountOffset]*edgeFieldsCount;}},_buildRetainers:function()
+{var retainingNodes=this._retainingNodes=new Uint32Array(this._edgeCount);var retainingEdges=this._retainingEdges=new Uint32Array(this._edgeCount);var firstRetainerIndex=this._firstRetainerIndex=new Uint32Array(this.nodeCount+1);var containmentEdges=this._containmentEdges;var edgeFieldsCount=this._edgeFieldsCount;var nodeFieldCount=this._nodeFieldCount;var edgeToNodeOffset=this._edgeToNodeOffset;var firstEdgeIndexes=this._firstEdgeIndexes;var nodeCount=this.nodeCount;for(var toNodeFieldIndex=edgeToNodeOffset,l=containmentEdges.length;toNodeFieldIndex<l;toNodeFieldIndex+=edgeFieldsCount){var toNodeIndex=containmentEdges[toNodeFieldIndex];if(toNodeIndex%nodeFieldCount)
+throw new Error("Invalid toNodeIndex "+toNodeIndex);++firstRetainerIndex[toNodeIndex/nodeFieldCount];}
+for(var i=0,firstUnusedRetainerSlot=0;i<nodeCount;i++){var retainersCount=firstRetainerIndex[i];firstRetainerIndex[i]=firstUnusedRetainerSlot;retainingNodes[firstUnusedRetainerSlot]=retainersCount;firstUnusedRetainerSlot+=retainersCount;}
+firstRetainerIndex[nodeCount]=retainingNodes.length;var nextNodeFirstEdgeIndex=firstEdgeIndexes[0];for(var srcNodeOrdinal=0;srcNodeOrdinal<nodeCount;++srcNodeOrdinal){var firstEdgeIndex=nextNodeFirstEdgeIndex;nextNodeFirstEdgeIndex=firstEdgeIndexes[srcNodeOrdinal+1];var srcNodeIndex=srcNodeOrdinal*nodeFieldCount;for(var edgeIndex=firstEdgeIndex;edgeIndex<nextNodeFirstEdgeIndex;edgeIndex+=edgeFieldsCount){var toNodeIndex=containmentEdges[edgeIndex+edgeToNodeOffset];if(toNodeIndex%nodeFieldCount)
+throw new Error("Invalid toNodeIndex "+toNodeIndex);var firstRetainerSlotIndex=firstRetainerIndex[toNodeIndex/nodeFieldCount];var nextUnusedRetainerSlotIndex=firstRetainerSlotIndex+(--retainingNodes[firstRetainerSlotIndex]);retainingNodes[nextUnusedRetainerSlotIndex]=srcNodeIndex;retainingEdges[nextUnusedRetainerSlotIndex]=edgeIndex;}}},createNode:function(nodeIndex)
+{throw new Error("Not implemented");},createEdge:function(edgeIndex)
+{throw new Error("Not implemented");},createRetainingEdge:function(retainerIndex)
+{throw new Error("Not implemented");},dispose:function()
+{delete this._nodes;delete this._strings;delete this._retainingEdges;delete this._retainingNodes;delete this._firstRetainerIndex;delete this._aggregates;delete this._aggregatesSortedFlags;delete this._dominatedNodes;delete this._firstDominatedNodeIndex;delete this._nodeDistances;delete this._dominatorsTree;},_allNodes:function()
+{return new WebInspector.HeapSnapshotNodeIterator(this.rootNode());},rootNode:function()
+{return this.createNode(this._rootNodeIndex);},get rootNodeIndex()
+{return this._rootNodeIndex;},get totalSize()
+{return this.rootNode().retainedSize();},_getDominatedIndex:function(nodeIndex)
+{if(nodeIndex%this._nodeFieldCount)
+throw new Error("Invalid nodeIndex: "+nodeIndex);return this._firstDominatedNodeIndex[nodeIndex/this._nodeFieldCount];},_dominatedNodesOfNode:function(node)
+{var dominatedIndexFrom=this._getDominatedIndex(node.nodeIndex);var dominatedIndexTo=this._getDominatedIndex(node._nextNodeIndex());return this._dominatedNodes.subarray(dominatedIndexFrom,dominatedIndexTo);},aggregatesWithFilter:function(nodeFilter)
+{var minNodeId=nodeFilter.minNodeId;var maxNodeId=nodeFilter.maxNodeId;var allocationNodeId=nodeFilter.allocationNodeId;var key;var filter;if(typeof allocationNodeId==="number"){filter=this._createAllocationStackFilter(allocationNodeId);}else if(typeof minNodeId==="number"&&typeof maxNodeId==="number"){key=minNodeId+".."+maxNodeId;filter=this._createNodeIdFilter(minNodeId,maxNodeId);}else{key="allObjects";}
+return this.aggregates(false,key,filter);},_createNodeIdFilter:function(minNodeId,maxNodeId)
+{function nodeIdFilter(node)
+{var id=node.id();return id>minNodeId&&id<=maxNodeId;}
+return nodeIdFilter;},_createAllocationStackFilter:function(bottomUpAllocationNodeId)
+{var traceIds=this._allocationProfile.traceIds(bottomUpAllocationNodeId);if(!traceIds.length)
+return undefined;var set={};for(var i=0;i<traceIds.length;i++)
+set[traceIds[i]]=true;function traceIdFilter(node)
+{return!!set[node.traceNodeId()];};return traceIdFilter;},aggregates:function(sortedIndexes,key,filter)
+{var aggregatesByClassName=key&&this._aggregates[key];if(!aggregatesByClassName){var aggregates=this._buildAggregates(filter);this._calculateClassesRetainedSize(aggregates.aggregatesByClassIndex,filter);aggregatesByClassName=aggregates.aggregatesByClassName;if(key)
+this._aggregates[key]=aggregatesByClassName;}
+if(sortedIndexes&&(!key||!this._aggregatesSortedFlags[key])){this._sortAggregateIndexes(aggregatesByClassName);if(key)
+this._aggregatesSortedFlags[key]=sortedIndexes;}
+return aggregatesByClassName;},allocationTracesTops:function()
+{return this._allocationProfile.serializeTraceTops();},allocationNodeCallers:function(nodeId)
+{return this._allocationProfile.serializeCallers(nodeId);},aggregatesForDiff:function()
+{if(this._aggregatesForDiff)
+return this._aggregatesForDiff;var aggregatesByClassName=this.aggregates(true,"allObjects");this._aggregatesForDiff={};var node=this.createNode();for(var className in aggregatesByClassName){var aggregate=aggregatesByClassName[className];var indexes=aggregate.idxs;var ids=new Array(indexes.length);var selfSizes=new Array(indexes.length);for(var i=0;i<indexes.length;i++){node.nodeIndex=indexes[i];ids[i]=node.id();selfSizes[i]=node.selfSize();}
+this._aggregatesForDiff[className]={indexes:indexes,ids:ids,selfSizes:selfSizes};}
+return this._aggregatesForDiff;},_isUserRoot:function(node)
+{return true;},forEachRoot:function(action,userRootsOnly)
+{for(var iter=this.rootNode().edges();iter.hasNext();iter.next()){var node=iter.edge.node();if(!userRootsOnly||this._isUserRoot(node))
+action(node);}},_calculateDistances:function()
+{var nodeFieldCount=this._nodeFieldCount;var nodeCount=this.nodeCount;var distances=this._nodeDistances=new Int32Array(nodeCount);var noDistance=this._noDistance;for(var i=0;i<nodeCount;++i)
+distances[i]=noDistance;var nodesToVisit=new Uint32Array(this.nodeCount);var nodesToVisitLength=0;function enqueueNode(distance,node)
+{var ordinal=node._ordinal();if(distances[ordinal]!==noDistance)
+return;distances[ordinal]=distance;nodesToVisit[nodesToVisitLength++]=node.nodeIndex;}
+this.forEachRoot(enqueueNode.bind(null,1),true);this._bfs(nodesToVisit,nodesToVisitLength,distances);nodesToVisitLength=0;this.forEachRoot(enqueueNode.bind(null,0),false);this._bfs(nodesToVisit,nodesToVisitLength,distances);},_bfs:function(nodesToVisit,nodesToVisitLength,distances)
+{var edgeFieldsCount=this._edgeFieldsCount;var nodeFieldCount=this._nodeFieldCount;var containmentEdges=this._containmentEdges;var firstEdgeIndexes=this._firstEdgeIndexes;var edgeToNodeOffset=this._edgeToNodeOffset;var edgeTypeOffset=this._edgeTypeOffset;var nodeCount=this.nodeCount;var containmentEdgesLength=containmentEdges.length;var edgeWeakType=this._edgeWeakType;var noDistance=this._noDistance;var index=0;while(index<nodesToVisitLength){var nodeIndex=nodesToVisit[index++];var nodeOrdinal=nodeIndex/nodeFieldCount;var distance=distances[nodeOrdinal]+1;var firstEdgeIndex=firstEdgeIndexes[nodeOrdinal];var edgesEnd=firstEdgeIndexes[nodeOrdinal+1];for(var edgeIndex=firstEdgeIndex;edgeIndex<edgesEnd;edgeIndex+=edgeFieldsCount){var edgeType=containmentEdges[edgeIndex+edgeTypeOffset];if(edgeType==edgeWeakType)
+continue;var childNodeIndex=containmentEdges[edgeIndex+edgeToNodeOffset];var childNodeOrdinal=childNodeIndex/nodeFieldCount;if(distances[childNodeOrdinal]!==noDistance)
+continue;distances[childNodeOrdinal]=distance;nodesToVisit[nodesToVisitLength++]=childNodeIndex;}}
+if(nodesToVisitLength>nodeCount)
+throw new Error("BFS failed. Nodes to visit ("+nodesToVisitLength+") is more than nodes count ("+nodeCount+")");},_buildAggregates:function(filter)
+{var aggregates={};var aggregatesByClassName={};var classIndexes=[];var nodes=this._nodes;var mapAndFlag=this.userObjectsMapAndFlag();var flags=mapAndFlag?mapAndFlag.map:null;var flag=mapAndFlag?mapAndFlag.flag:0;var nodesLength=nodes.length;var nodeNativeType=this._nodeNativeType;var nodeFieldCount=this._nodeFieldCount;var selfSizeOffset=this._nodeSelfSizeOffset;var nodeTypeOffset=this._nodeTypeOffset;var node=this.rootNode();var nodeDistances=this._nodeDistances;for(var nodeIndex=0;nodeIndex<nodesLength;nodeIndex+=nodeFieldCount){var nodeOrdinal=nodeIndex/nodeFieldCount;if(flags&&!(flags[nodeOrdinal]&flag))
+continue;node.nodeIndex=nodeIndex;if(filter&&!filter(node))
+continue;var selfSize=nodes[nodeIndex+selfSizeOffset];if(!selfSize&&nodes[nodeIndex+nodeTypeOffset]!==nodeNativeType)
+continue;var classIndex=node.classIndex();if(!(classIndex in aggregates)){var nodeType=node.type();var nameMatters=nodeType==="object"||nodeType==="native";var value={count:1,distance:nodeDistances[nodeOrdinal],self:selfSize,maxRet:0,type:nodeType,name:nameMatters?node.name():null,idxs:[nodeIndex]};aggregates[classIndex]=value;classIndexes.push(classIndex);aggregatesByClassName[node.className()]=value;}else{var clss=aggregates[classIndex];clss.distance=Math.min(clss.distance,nodeDistances[nodeOrdinal]);++clss.count;clss.self+=selfSize;clss.idxs.push(nodeIndex);}}
+for(var i=0,l=classIndexes.length;i<l;++i){var classIndex=classIndexes[i];aggregates[classIndex].idxs=aggregates[classIndex].idxs.slice();}
+return{aggregatesByClassName:aggregatesByClassName,aggregatesByClassIndex:aggregates};},_calculateClassesRetainedSize:function(aggregates,filter)
+{var rootNodeIndex=this._rootNodeIndex;var node=this.createNode(rootNodeIndex);var list=[rootNodeIndex];var sizes=[-1];var classes=[];var seenClassNameIndexes={};var nodeFieldCount=this._nodeFieldCount;var nodeTypeOffset=this._nodeTypeOffset;var nodeNativeType=this._nodeNativeType;var dominatedNodes=this._dominatedNodes;var nodes=this._nodes;var mapAndFlag=this.userObjectsMapAndFlag();var flags=mapAndFlag?mapAndFlag.map:null;var flag=mapAndFlag?mapAndFlag.flag:0;var firstDominatedNodeIndex=this._firstDominatedNodeIndex;while(list.length){var nodeIndex=list.pop();node.nodeIndex=nodeIndex;var classIndex=node.classIndex();var seen=!!seenClassNameIndexes[classIndex];var nodeOrdinal=nodeIndex/nodeFieldCount;var dominatedIndexFrom=firstDominatedNodeIndex[nodeOrdinal];var dominatedIndexTo=firstDominatedNodeIndex[nodeOrdinal+1];if(!seen&&(!flags||(flags[nodeOrdinal]&flag))&&(!filter||filter(node))&&(node.selfSize()||nodes[nodeIndex+nodeTypeOffset]===nodeNativeType)){aggregates[classIndex].maxRet+=node.retainedSize();if(dominatedIndexFrom!==dominatedIndexTo){seenClassNameIndexes[classIndex]=true;sizes.push(list.length);classes.push(classIndex);}}
+for(var i=dominatedIndexFrom;i<dominatedIndexTo;i++)
+list.push(dominatedNodes[i]);var l=list.length;while(sizes[sizes.length-1]===l){sizes.pop();classIndex=classes.pop();seenClassNameIndexes[classIndex]=false;}}},_sortAggregateIndexes:function(aggregates)
+{var nodeA=this.createNode();var nodeB=this.createNode();for(var clss in aggregates)
+aggregates[clss].idxs.sort(function(idxA,idxB){nodeA.nodeIndex=idxA;nodeB.nodeIndex=idxB;return nodeA.id()<nodeB.id()?-1:1;});},_buildPostOrderIndex:function()
+{var nodeFieldCount=this._nodeFieldCount;var nodes=this._nodes;var nodeCount=this.nodeCount;var rootNodeOrdinal=this._rootNodeIndex/nodeFieldCount;var edgeFieldsCount=this._edgeFieldsCount;var edgeTypeOffset=this._edgeTypeOffset;var edgeToNodeOffset=this._edgeToNodeOffset;var edgeShortcutType=this._edgeShortcutType;var firstEdgeIndexes=this._firstEdgeIndexes;var containmentEdges=this._containmentEdges;var containmentEdgesLength=this._containmentEdges.length;var mapAndFlag=this.userObjectsMapAndFlag();var flags=mapAndFlag?mapAndFlag.map:null;var flag=mapAndFlag?mapAndFlag.flag:0;var nodesToVisit=new Uint32Array(nodeCount);var postOrderIndex2NodeOrdinal=new Uint32Array(nodeCount);var nodeOrdinal2PostOrderIndex=new Uint32Array(nodeCount);var painted=new Uint8Array(nodeCount);var nodesToVisitLength=0;var postOrderIndex=0;var grey=1;var black=2;nodesToVisit[nodesToVisitLength++]=rootNodeOrdinal;painted[rootNodeOrdinal]=grey;while(nodesToVisitLength){var nodeOrdinal=nodesToVisit[nodesToVisitLength-1];if(painted[nodeOrdinal]===grey){painted[nodeOrdinal]=black;var nodeFlag=!flags||(flags[nodeOrdinal]&flag);var beginEdgeIndex=firstEdgeIndexes[nodeOrdinal];var endEdgeIndex=firstEdgeIndexes[nodeOrdinal+1];for(var edgeIndex=beginEdgeIndex;edgeIndex<endEdgeIndex;edgeIndex+=edgeFieldsCount){if(nodeOrdinal!==rootNodeOrdinal&&containmentEdges[edgeIndex+edgeTypeOffset]===edgeShortcutType)
+continue;var childNodeIndex=containmentEdges[edgeIndex+edgeToNodeOffset];var childNodeOrdinal=childNodeIndex/nodeFieldCount;var childNodeFlag=!flags||(flags[childNodeOrdinal]&flag);if(nodeOrdinal!==rootNodeOrdinal&&childNodeFlag&&!nodeFlag)
+continue;if(!painted[childNodeOrdinal]){painted[childNodeOrdinal]=grey;nodesToVisit[nodesToVisitLength++]=childNodeOrdinal;}}}else{nodeOrdinal2PostOrderIndex[nodeOrdinal]=postOrderIndex;postOrderIndex2NodeOrdinal[postOrderIndex++]=nodeOrdinal;--nodesToVisitLength;}}
+if(postOrderIndex!==nodeCount){console.log("Error: Corrupted snapshot. "+(nodeCount-postOrderIndex)+" nodes are unreachable from the root:");var dumpNode=this.rootNode();for(var i=0;i<nodeCount;++i){if(painted[i]!==black){nodeOrdinal2PostOrderIndex[i]=postOrderIndex;postOrderIndex2NodeOrdinal[postOrderIndex++]=i;dumpNode.nodeIndex=i*nodeFieldCount;console.log(JSON.stringify(dumpNode.serialize()));for(var retainers=dumpNode.retainers();retainers.hasNext();retainers=retainers.item().node().retainers())
+console.log("  edgeName: "+retainers.item().name()+" nodeClassName: "+retainers.item().node().className());}}}
+return{postOrderIndex2NodeOrdinal:postOrderIndex2NodeOrdinal,nodeOrdinal2PostOrderIndex:nodeOrdinal2PostOrderIndex};},_buildDominatorTree:function(postOrderIndex2NodeOrdinal,nodeOrdinal2PostOrderIndex)
+{var nodeFieldCount=this._nodeFieldCount;var nodes=this._nodes;var firstRetainerIndex=this._firstRetainerIndex;var retainingNodes=this._retainingNodes;var retainingEdges=this._retainingEdges;var edgeFieldsCount=this._edgeFieldsCount;var edgeTypeOffset=this._edgeTypeOffset;var edgeToNodeOffset=this._edgeToNodeOffset;var edgeShortcutType=this._edgeShortcutType;var firstEdgeIndexes=this._firstEdgeIndexes;var containmentEdges=this._containmentEdges;var containmentEdgesLength=this._containmentEdges.length;var rootNodeIndex=this._rootNodeIndex;var mapAndFlag=this.userObjectsMapAndFlag();var flags=mapAndFlag?mapAndFlag.map:null;var flag=mapAndFlag?mapAndFlag.flag:0;var nodesCount=postOrderIndex2NodeOrdinal.length;var rootPostOrderedIndex=nodesCount-1;var noEntry=nodesCount;var dominators=new Uint32Array(nodesCount);for(var i=0;i<rootPostOrderedIndex;++i)
+dominators[i]=noEntry;dominators[rootPostOrderedIndex]=rootPostOrderedIndex;var affected=new Uint8Array(nodesCount);var nodeOrdinal;{nodeOrdinal=this._rootNodeIndex/nodeFieldCount;var beginEdgeToNodeFieldIndex=firstEdgeIndexes[nodeOrdinal]+edgeToNodeOffset;var endEdgeToNodeFieldIndex=firstEdgeIndexes[nodeOrdinal+1];for(var toNodeFieldIndex=beginEdgeToNodeFieldIndex;toNodeFieldIndex<endEdgeToNodeFieldIndex;toNodeFieldIndex+=edgeFieldsCount){var childNodeOrdinal=containmentEdges[toNodeFieldIndex]/nodeFieldCount;affected[nodeOrdinal2PostOrderIndex[childNodeOrdinal]]=1;}}
+var changed=true;while(changed){changed=false;for(var postOrderIndex=rootPostOrderedIndex-1;postOrderIndex>=0;--postOrderIndex){if(affected[postOrderIndex]===0)
+continue;affected[postOrderIndex]=0;if(dominators[postOrderIndex]===rootPostOrderedIndex)
+continue;nodeOrdinal=postOrderIndex2NodeOrdinal[postOrderIndex];var nodeFlag=!flags||(flags[nodeOrdinal]&flag);var newDominatorIndex=noEntry;var beginRetainerIndex=firstRetainerIndex[nodeOrdinal];var endRetainerIndex=firstRetainerIndex[nodeOrdinal+1];for(var retainerIndex=beginRetainerIndex;retainerIndex<endRetainerIndex;++retainerIndex){var retainerEdgeIndex=retainingEdges[retainerIndex];var retainerEdgeType=containmentEdges[retainerEdgeIndex+edgeTypeOffset];var retainerNodeIndex=retainingNodes[retainerIndex];if(retainerNodeIndex!==rootNodeIndex&&retainerEdgeType===edgeShortcutType)
+continue;var retainerNodeOrdinal=retainerNodeIndex/nodeFieldCount;var retainerNodeFlag=!flags||(flags[retainerNodeOrdinal]&flag);if(retainerNodeIndex!==rootNodeIndex&&nodeFlag&&!retainerNodeFlag)
+continue;var retanerPostOrderIndex=nodeOrdinal2PostOrderIndex[retainerNodeOrdinal];if(dominators[retanerPostOrderIndex]!==noEntry){if(newDominatorIndex===noEntry)
+newDominatorIndex=retanerPostOrderIndex;else{while(retanerPostOrderIndex!==newDominatorIndex){while(retanerPostOrderIndex<newDominatorIndex)
+retanerPostOrderIndex=dominators[retanerPostOrderIndex];while(newDominatorIndex<retanerPostOrderIndex)
+newDominatorIndex=dominators[newDominatorIndex];}}
+if(newDominatorIndex===rootPostOrderedIndex)
+break;}}
+if(newDominatorIndex!==noEntry&&dominators[postOrderIndex]!==newDominatorIndex){dominators[postOrderIndex]=newDominatorIndex;changed=true;nodeOrdinal=postOrderIndex2NodeOrdinal[postOrderIndex];beginEdgeToNodeFieldIndex=firstEdgeIndexes[nodeOrdinal]+edgeToNodeOffset;endEdgeToNodeFieldIndex=firstEdgeIndexes[nodeOrdinal+1];for(var toNodeFieldIndex=beginEdgeToNodeFieldIndex;toNodeFieldIndex<endEdgeToNodeFieldIndex;toNodeFieldIndex+=edgeFieldsCount){var childNodeOrdinal=containmentEdges[toNodeFieldIndex]/nodeFieldCount;affected[nodeOrdinal2PostOrderIndex[childNodeOrdinal]]=1;}}}}
+var dominatorsTree=new Uint32Array(nodesCount);for(var postOrderIndex=0,l=dominators.length;postOrderIndex<l;++postOrderIndex){nodeOrdinal=postOrderIndex2NodeOrdinal[postOrderIndex];dominatorsTree[nodeOrdinal]=postOrderIndex2NodeOrdinal[dominators[postOrderIndex]];}
+return dominatorsTree;},_calculateRetainedSizes:function(postOrderIndex2NodeOrdinal)
+{var nodeCount=this.nodeCount;var nodes=this._nodes;var nodeSelfSizeOffset=this._nodeSelfSizeOffset;var nodeFieldCount=this._nodeFieldCount;var dominatorsTree=this._dominatorsTree;var retainedSizes=this._retainedSizes=new Float64Array(nodeCount);for(var nodeOrdinal=0;nodeOrdinal<nodeCount;++nodeOrdinal)
+retainedSizes[nodeOrdinal]=nodes[nodeOrdinal*nodeFieldCount+nodeSelfSizeOffset];for(var postOrderIndex=0;postOrderIndex<nodeCount-1;++postOrderIndex){var nodeOrdinal=postOrderIndex2NodeOrdinal[postOrderIndex];var dominatorOrdinal=dominatorsTree[nodeOrdinal];retainedSizes[dominatorOrdinal]+=retainedSizes[nodeOrdinal];}},_buildDominatedNodes:function()
+{var indexArray=this._firstDominatedNodeIndex=new Uint32Array(this.nodeCount+1);var dominatedNodes=this._dominatedNodes=new Uint32Array(this.nodeCount-1);var nodeFieldCount=this._nodeFieldCount;var dominatorsTree=this._dominatorsTree;var fromNodeOrdinal=0;var toNodeOrdinal=this.nodeCount;var rootNodeOrdinal=this._rootNodeIndex/nodeFieldCount;if(rootNodeOrdinal===fromNodeOrdinal)
+fromNodeOrdinal=1;else if(rootNodeOrdinal===toNodeOrdinal-1)
+toNodeOrdinal=toNodeOrdinal-1;else
+throw new Error("Root node is expected to be either first or last");for(var nodeOrdinal=fromNodeOrdinal;nodeOrdinal<toNodeOrdinal;++nodeOrdinal)
+++indexArray[dominatorsTree[nodeOrdinal]];var firstDominatedNodeIndex=0;for(var i=0,l=this.nodeCount;i<l;++i){var dominatedCount=dominatedNodes[firstDominatedNodeIndex]=indexArray[i];indexArray[i]=firstDominatedNodeIndex;firstDominatedNodeIndex+=dominatedCount;}
+indexArray[this.nodeCount]=dominatedNodes.length;for(var nodeOrdinal=fromNodeOrdinal;nodeOrdinal<toNodeOrdinal;++nodeOrdinal){var dominatorOrdinal=dominatorsTree[nodeOrdinal];var dominatedRefIndex=indexArray[dominatorOrdinal];dominatedRefIndex+=(--dominatedNodes[dominatedRefIndex]);dominatedNodes[dominatedRefIndex]=nodeOrdinal*nodeFieldCount;}},_calculateFlags:function()
+{throw new Error("Not implemented");},_calculateStatistics:function()
+{throw new Error("Not implemented");},userObjectsMapAndFlag:function()
+{throw new Error("Not implemented");},calculateSnapshotDiff:function(baseSnapshotId,baseSnapshotAggregates)
+{var snapshotDiff=this._snapshotDiffs[baseSnapshotId];if(snapshotDiff)
+return snapshotDiff;snapshotDiff={};var aggregates=this.aggregates(true,"allObjects");for(var className in baseSnapshotAggregates){var baseAggregate=baseSnapshotAggregates[className];var diff=this._calculateDiffForClass(baseAggregate,aggregates[className]);if(diff)
+snapshotDiff[className]=diff;}
+var emptyBaseAggregate=new WebInspector.HeapSnapshotCommon.AggregateForDiff();for(var className in aggregates){if(className in baseSnapshotAggregates)
+continue;snapshotDiff[className]=this._calculateDiffForClass(emptyBaseAggregate,aggregates[className]);}
+this._snapshotDiffs[baseSnapshotId]=snapshotDiff;return snapshotDiff;},_calculateDiffForClass:function(baseAggregate,aggregate)
+{var baseIds=baseAggregate.ids;var baseIndexes=baseAggregate.indexes;var baseSelfSizes=baseAggregate.selfSizes;var indexes=aggregate?aggregate.idxs:[];var i=0,l=baseIds.length;var j=0,m=indexes.length;var diff=new WebInspector.HeapSnapshotCommon.Diff();var nodeB=this.createNode(indexes[j]);while(i<l&&j<m){var nodeAId=baseIds[i];if(nodeAId<nodeB.id()){diff.deletedIndexes.push(baseIndexes[i]);diff.removedCount++;diff.removedSize+=baseSelfSizes[i];++i;}else if(nodeAId>nodeB.id()){diff.addedIndexes.push(indexes[j]);diff.addedCount++;diff.addedSize+=nodeB.selfSize();nodeB.nodeIndex=indexes[++j];}else{++i;nodeB.nodeIndex=indexes[++j];}}
+while(i<l){diff.deletedIndexes.push(baseIndexes[i]);diff.removedCount++;diff.removedSize+=baseSelfSizes[i];++i;}
+while(j<m){diff.addedIndexes.push(indexes[j]);diff.addedCount++;diff.addedSize+=nodeB.selfSize();nodeB.nodeIndex=indexes[++j];}
+diff.countDelta=diff.addedCount-diff.removedCount;diff.sizeDelta=diff.addedSize-diff.removedSize;if(!diff.addedCount&&!diff.removedCount)
+return null;return diff;},_nodeForSnapshotObjectId:function(snapshotObjectId)
+{for(var it=this._allNodes();it.hasNext();it.next()){if(it.node.id()===snapshotObjectId)
+return it.node;}
+return null;},nodeClassName:function(snapshotObjectId)
+{var node=this._nodeForSnapshotObjectId(snapshotObjectId);if(node)
+return node.className();return null;},idsOfObjectsWithName:function(name)
+{var ids=[];for(var it=this._allNodes();it.hasNext();it.next()){if(it.item().name()===name)
+ids.push(it.item().id());}
+return ids;},dominatorIdsForNode:function(snapshotObjectId)
+{var node=this._nodeForSnapshotObjectId(snapshotObjectId);if(!node)
+return null;var result=[];while(!node.isRoot()){result.push(node.id());node.nodeIndex=node.dominatorIndex();}
+return result;},createEdgesProvider:function(nodeIndex)
+{var node=this.createNode(nodeIndex);var filter=this.containmentEdgesFilter();var indexProvider=new WebInspector.HeapSnapshotEdgeIndexProvider(this);return new WebInspector.HeapSnapshotEdgesProvider(this,filter,node.edges(),indexProvider);},createEdgesProviderForTest:function(nodeIndex,filter)
+{var node=this.createNode(nodeIndex);var indexProvider=new WebInspector.HeapSnapshotEdgeIndexProvider(this);return new WebInspector.HeapSnapshotEdgesProvider(this,filter,node.edges(),indexProvider);},retainingEdgesFilter:function()
+{return null;},containmentEdgesFilter:function()
+{return null;},createRetainingEdgesProvider:function(nodeIndex)
+{var node=this.createNode(nodeIndex);var filter=this.retainingEdgesFilter();var indexProvider=new WebInspector.HeapSnapshotRetainerEdgeIndexProvider(this);return new WebInspector.HeapSnapshotEdgesProvider(this,filter,node.retainers(),indexProvider);},createAddedNodesProvider:function(baseSnapshotId,className)
+{var snapshotDiff=this._snapshotDiffs[baseSnapshotId];var diffForClass=snapshotDiff[className];return new WebInspector.HeapSnapshotNodesProvider(this,null,diffForClass.addedIndexes);},createDeletedNodesProvider:function(nodeIndexes)
+{return new WebInspector.HeapSnapshotNodesProvider(this,null,nodeIndexes);},classNodesFilter:function()
+{return null;},createNodesProviderForClass:function(className,nodeFilter)
+{return new WebInspector.HeapSnapshotNodesProvider(this,this.classNodesFilter(),this.aggregatesWithFilter(nodeFilter)[className].idxs);},createNodesProviderForDominator:function(nodeIndex)
+{var node=this.createNode(nodeIndex);return new WebInspector.HeapSnapshotNodesProvider(this,null,this._dominatedNodesOfNode(node));},_maxJsNodeId:function()
+{var nodeFieldCount=this._nodeFieldCount;var nodes=this._nodes;var nodesLength=nodes.length;var id=0;for(var nodeIndex=this._nodeIdOffset;nodeIndex<nodesLength;nodeIndex+=nodeFieldCount){var nextId=nodes[nodeIndex];if(nextId%2===0)
+continue;if(id<nextId)
+id=nextId;}
+return id;},updateStaticData:function()
+{return new WebInspector.HeapSnapshotCommon.StaticData(this.nodeCount,this._rootNodeIndex,this.totalSize,this._maxJsNodeId());}};WebInspector.HeapSnapshotItemProvider=function(iterator,indexProvider)
+{this._iterator=iterator;this._indexProvider=indexProvider;this._isEmpty=!iterator.hasNext();this._iterationOrder=null;this._currentComparator=null;this._sortedPrefixLength=0;this._sortedSuffixLength=0;}
+WebInspector.HeapSnapshotItemProvider.prototype={_createIterationOrder:function()
+{if(this._iterationOrder)
+return;this._iterationOrder=[];for(var iterator=this._iterator;iterator.hasNext();iterator.next())
+this._iterationOrder.push(iterator.item().itemIndex());},isEmpty:function()
+{return this._isEmpty;},serializeItemsRange:function(begin,end)
+{this._createIterationOrder();if(begin>end)
+throw new Error("Start position > end position: "+begin+" > "+end);if(end>this._iterationOrder.length)
+end=this._iterationOrder.length;if(this._sortedPrefixLength<end&&begin<this._iterationOrder.length-this._sortedSuffixLength){this.sort(this._currentComparator,this._sortedPrefixLength,this._iterationOrder.length-1-this._sortedSuffixLength,begin,end-1);if(begin<=this._sortedPrefixLength)
+this._sortedPrefixLength=end;if(end>=this._iterationOrder.length-this._sortedSuffixLength)
+this._sortedSuffixLength=this._iterationOrder.length-begin;}
+var position=begin;var count=end-begin;var result=new Array(count);var iterator=this._iterator;for(var i=0;i<count;++i){var itemIndex=this._iterationOrder[position++];var item=this._indexProvider.itemForIndex(itemIndex);result[i]=item.serialize();}
+return new WebInspector.HeapSnapshotCommon.ItemsRange(begin,end,this._iterationOrder.length,result);},sortAndRewind:function(comparator)
+{this._currentComparator=comparator;this._sortedPrefixLength=0;this._sortedSuffixLength=0;}}
+WebInspector.HeapSnapshotEdgesProvider=function(snapshot,filter,edgesIter,indexProvider)
+{this.snapshot=snapshot;if(filter)
+edgesIter=new WebInspector.HeapSnapshotFilteredIterator(edgesIter,filter);WebInspector.HeapSnapshotItemProvider.call(this,edgesIter,indexProvider);}
+WebInspector.HeapSnapshotEdgesProvider.prototype={sort:function(comparator,leftBound,rightBound,windowLeft,windowRight)
+{var fieldName1=comparator.fieldName1;var fieldName2=comparator.fieldName2;var ascending1=comparator.ascending1;var ascending2=comparator.ascending2;var edgeA=this._iterator.item().clone();var edgeB=edgeA.clone();var nodeA=this.snapshot.createNode();var nodeB=this.snapshot.createNode();function compareEdgeFieldName(ascending,indexA,indexB)
+{edgeA.edgeIndex=indexA;edgeB.edgeIndex=indexB;if(edgeB.name()==="__proto__")return-1;if(edgeA.name()==="__proto__")return 1;var result=edgeA.hasStringName()===edgeB.hasStringName()?(edgeA.name()<edgeB.name()?-1:(edgeA.name()>edgeB.name()?1:0)):(edgeA.hasStringName()?-1:1);return ascending?result:-result;}
+function compareNodeField(fieldName,ascending,indexA,indexB)
+{edgeA.edgeIndex=indexA;nodeA.nodeIndex=edgeA.nodeIndex();var valueA=nodeA[fieldName]();edgeB.edgeIndex=indexB;nodeB.nodeIndex=edgeB.nodeIndex();var valueB=nodeB[fieldName]();var result=valueA<valueB?-1:(valueA>valueB?1:0);return ascending?result:-result;}
+function compareEdgeAndNode(indexA,indexB){var result=compareEdgeFieldName(ascending1,indexA,indexB);if(result===0)
+result=compareNodeField(fieldName2,ascending2,indexA,indexB);if(result===0)
+return indexA-indexB;return result;}
+function compareNodeAndEdge(indexA,indexB){var result=compareNodeField(fieldName1,ascending1,indexA,indexB);if(result===0)
+result=compareEdgeFieldName(ascending2,indexA,indexB);if(result===0)
+return indexA-indexB;return result;}
+function compareNodeAndNode(indexA,indexB){var result=compareNodeField(fieldName1,ascending1,indexA,indexB);if(result===0)
+result=compareNodeField(fieldName2,ascending2,indexA,indexB);if(result===0)
+return indexA-indexB;return result;}
+if(fieldName1==="!edgeName")
+this._iterationOrder.sortRange(compareEdgeAndNode,leftBound,rightBound,windowLeft,windowRight);else if(fieldName2==="!edgeName")
+this._iterationOrder.sortRange(compareNodeAndEdge,leftBound,rightBound,windowLeft,windowRight);else
+this._iterationOrder.sortRange(compareNodeAndNode,leftBound,rightBound,windowLeft,windowRight);},__proto__:WebInspector.HeapSnapshotItemProvider.prototype}
+WebInspector.HeapSnapshotNodesProvider=function(snapshot,filter,nodeIndexes)
+{this.snapshot=snapshot;var indexProvider=new WebInspector.HeapSnapshotNodeIndexProvider(snapshot);var it=new WebInspector.HeapSnapshotIndexRangeIterator(indexProvider,nodeIndexes);if(filter)
+it=new WebInspector.HeapSnapshotFilteredIterator(it,filter);WebInspector.HeapSnapshotItemProvider.call(this,it,indexProvider);}
+WebInspector.HeapSnapshotNodesProvider.prototype={nodePosition:function(snapshotObjectId)
+{this._createIterationOrder();var node=this.snapshot.createNode();for(var i=0;i<this._iterationOrder.length;i++){node.nodeIndex=this._iterationOrder[i];if(node.id()===snapshotObjectId)
+break;}
+if(i===this._iterationOrder.length)
+return-1;var targetNodeIndex=this._iterationOrder[i];var smallerCount=0;var compare=this._buildCompareFunction(this._currentComparator);for(var i=0;i<this._iterationOrder.length;i++){if(compare(this._iterationOrder[i],targetNodeIndex)<0)
+++smallerCount;}
+return smallerCount;},_buildCompareFunction:function(comparator)
+{var nodeA=this.snapshot.createNode();var nodeB=this.snapshot.createNode();var fieldAccessor1=nodeA[comparator.fieldName1];var fieldAccessor2=nodeA[comparator.fieldName2];var ascending1=comparator.ascending1?1:-1;var ascending2=comparator.ascending2?1:-1;function sortByNodeField(fieldAccessor,ascending)
+{var valueA=fieldAccessor.call(nodeA);var valueB=fieldAccessor.call(nodeB);return valueA<valueB?-ascending:(valueA>valueB?ascending:0);}
+function sortByComparator(indexA,indexB)
+{nodeA.nodeIndex=indexA;nodeB.nodeIndex=indexB;var result=sortByNodeField(fieldAccessor1,ascending1);if(result===0)
+result=sortByNodeField(fieldAccessor2,ascending2);return result||indexA-indexB;}
+return sortByComparator;},sort:function(comparator,leftBound,rightBound,windowLeft,windowRight)
+{this._iterationOrder.sortRange(this._buildCompareFunction(comparator),leftBound,rightBound,windowLeft,windowRight);},__proto__:WebInspector.HeapSnapshotItemProvider.prototype};WebInspector.HeapSnapshotProgressEvent={Update:"ProgressUpdate"};WebInspector.HeapSnapshotCommon={}
+WebInspector.HeapSnapshotCommon.AllocationNodeCallers=function(nodesWithSingleCaller,branchingCallers)
+{this.nodesWithSingleCaller=nodesWithSingleCaller;this.branchingCallers=branchingCallers;}
+WebInspector.HeapSnapshotCommon.SerializedAllocationNode=function(nodeId,functionName,scriptName,line,column,count,size,liveCount,liveSize,hasChildren)
+{this.id=nodeId;this.name=functionName;this.scriptName=scriptName;this.line=line;this.column=column;this.count=count;this.size=size;this.liveCount=liveCount;this.liveSize=liveSize;this.hasChildren=hasChildren;}
+WebInspector.HeapSnapshotCommon.Aggregate=function()
+{this.count;this.distance;this.self;this.maxRet;this.type;this.name;this.idxs;}
+WebInspector.HeapSnapshotCommon.AggregateForDiff=function(){this.indexes=[];this.ids=[];this.selfSizes=[];}
+WebInspector.HeapSnapshotCommon.Diff=function()
+{this.addedCount=0;this.removedCount=0;this.addedSize=0;this.removedSize=0;this.deletedIndexes=[];this.addedIndexes=[];}
+WebInspector.HeapSnapshotCommon.DiffForClass=function()
+{this.addedCount;this.removedCount;this.addedSize;this.removedSize;this.deletedIndexes;this.addedIndexes;this.countDelta;this.sizeDelta;}
+WebInspector.HeapSnapshotCommon.ComparatorConfig=function()
+{this.fieldName1;this.ascending1;this.fieldName2;this.ascending2;}
+WebInspector.HeapSnapshotCommon.WorkerCommand=function()
+{this.callId;this.disposition;this.objectId;this.newObjectId;this.methodName;this.methodArguments;this.source;}
+WebInspector.HeapSnapshotCommon.ItemsRange=function(startPosition,endPosition,totalLength,items)
+{this.startPosition=startPosition;this.endPosition=endPosition;this.totalLength=totalLength;this.items=items;}
+WebInspector.HeapSnapshotCommon.StaticData=function(nodeCount,rootNodeIndex,totalSize,maxJSObjectId)
+{this.nodeCount=nodeCount;this.rootNodeIndex=rootNodeIndex;this.totalSize=totalSize;this.maxJSObjectId=maxJSObjectId;}
+WebInspector.HeapSnapshotCommon.Statistics=function()
+{this.total;this.v8heap;this.native;this.code;this.jsArrays;this.strings;}
+WebInspector.HeapSnapshotCommon.NodeFilter=function(minNodeId,maxNodeId)
+{this.minNodeId=minNodeId;this.maxNodeId=maxNodeId;this.allocationNodeId;}
+WebInspector.HeapSnapshotCommon.NodeFilter.prototype={equals:function(o)
+{return this.minNodeId===o.minNodeId&&this.maxNodeId===o.maxNodeId&&this.allocationNodeId===o.allocationNodeId;}};WebInspector.HeapSnapshotLoader=function(dispatcher)
+{this._reset();this._progress=new WebInspector.HeapSnapshotProgress(dispatcher);}
+WebInspector.HeapSnapshotLoader.prototype={dispose:function()
+{this._reset();},_reset:function()
+{this._json="";this._state="find-snapshot-info";this._snapshot={};},close:function()
+{if(this._json)
+this._parseStringsArray();},buildSnapshot:function(showHiddenData)
+{this._progress.updateStatus("Processing snapshot\u2026");var result=new WebInspector.JSHeapSnapshot(this._snapshot,this._progress,showHiddenData);this._reset();return result;},_parseUintArray:function()
+{var index=0;var char0="0".charCodeAt(0),char9="9".charCodeAt(0),closingBracket="]".charCodeAt(0);var length=this._json.length;while(true){while(index<length){var code=this._json.charCodeAt(index);if(char0<=code&&code<=char9)
+break;else if(code===closingBracket){this._json=this._json.slice(index+1);return false;}
+++index;}
+if(index===length){this._json="";return true;}
+var nextNumber=0;var startIndex=index;while(index<length){var code=this._json.charCodeAt(index);if(char0>code||code>char9)
+break;nextNumber*=10;nextNumber+=(code-char0);++index;}
+if(index===length){this._json=this._json.slice(startIndex);return true;}
+this._array[this._arrayIndex++]=nextNumber;}},_parseStringsArray:function()
+{this._progress.updateStatus("Parsing strings\u2026");var closingBracketIndex=this._json.lastIndexOf("]");if(closingBracketIndex===-1)
+throw new Error("Incomplete JSON");this._json=this._json.slice(0,closingBracketIndex+1);this._snapshot.strings=JSON.parse(this._json);},write:function(chunk)
+{this._json+=chunk;while(true){switch(this._state){case"find-snapshot-info":{var snapshotToken="\"snapshot\"";var snapshotTokenIndex=this._json.indexOf(snapshotToken);if(snapshotTokenIndex===-1)
+throw new Error("Snapshot token not found");this._json=this._json.slice(snapshotTokenIndex+snapshotToken.length+1);this._state="parse-snapshot-info";this._progress.updateStatus("Loading snapshot info\u2026");break;}
+case"parse-snapshot-info":{var closingBracketIndex=WebInspector.TextUtils.findBalancedCurlyBrackets(this._json);if(closingBracketIndex===-1)
+return;this._snapshot.snapshot=(JSON.parse(this._json.slice(0,closingBracketIndex)));this._json=this._json.slice(closingBracketIndex);this._state="find-nodes";break;}
+case"find-nodes":{var nodesToken="\"nodes\"";var nodesTokenIndex=this._json.indexOf(nodesToken);if(nodesTokenIndex===-1)
+return;var bracketIndex=this._json.indexOf("[",nodesTokenIndex);if(bracketIndex===-1)
+return;this._json=this._json.slice(bracketIndex+1);var node_fields_count=this._snapshot.snapshot.meta.node_fields.length;var nodes_length=this._snapshot.snapshot.node_count*node_fields_count;this._array=new Uint32Array(nodes_length);this._arrayIndex=0;this._state="parse-nodes";break;}
+case"parse-nodes":{var hasMoreData=this._parseUintArray();this._progress.updateProgress("Loading nodes\u2026 %d\%",this._arrayIndex,this._array.length);if(hasMoreData)
+return;this._snapshot.nodes=this._array;this._state="find-edges";this._array=null;break;}
+case"find-edges":{var edgesToken="\"edges\"";var edgesTokenIndex=this._json.indexOf(edgesToken);if(edgesTokenIndex===-1)
+return;var bracketIndex=this._json.indexOf("[",edgesTokenIndex);if(bracketIndex===-1)
+return;this._json=this._json.slice(bracketIndex+1);var edge_fields_count=this._snapshot.snapshot.meta.edge_fields.length;var edges_length=this._snapshot.snapshot.edge_count*edge_fields_count;this._array=new Uint32Array(edges_length);this._arrayIndex=0;this._state="parse-edges";break;}
+case"parse-edges":{var hasMoreData=this._parseUintArray();this._progress.updateProgress("Loading edges\u2026 %d\%",this._arrayIndex,this._array.length);if(hasMoreData)
+return;this._snapshot.edges=this._array;this._array=null;if(this._snapshot.snapshot.trace_function_count)
+this._state="find-trace-function-infos";else
+this._state="find-strings";break;}
+case"find-trace-function-infos":{var tracesToken="\"trace_function_infos\"";var tracesTokenIndex=this._json.indexOf(tracesToken);if(tracesTokenIndex===-1)
+return;var bracketIndex=this._json.indexOf("[",tracesTokenIndex);if(bracketIndex===-1)
+return;this._json=this._json.slice(bracketIndex+1);var trace_function_info_field_count=this._snapshot.snapshot.meta.trace_function_info_fields.length;var trace_function_info_length=this._snapshot.snapshot.trace_function_count*trace_function_info_field_count;this._array=new Uint32Array(trace_function_info_length);this._arrayIndex=0;this._state="parse-trace-function-infos";break;}
+case"parse-trace-function-infos":{if(this._parseUintArray())
+return;this._snapshot.trace_function_infos=this._array;this._array=null;this._state="find-trace-tree";break;}
+case"find-trace-tree":{var tracesToken="\"trace_tree\"";var tracesTokenIndex=this._json.indexOf(tracesToken);if(tracesTokenIndex===-1)
+return;var bracketIndex=this._json.indexOf("[",tracesTokenIndex);if(bracketIndex===-1)
+return;this._json=this._json.slice(bracketIndex);this._state="parse-trace-tree";break;}
+case"parse-trace-tree":{var stringsToken="\"strings\"";var stringsTokenIndex=this._json.indexOf(stringsToken);if(stringsTokenIndex===-1)
+return;var bracketIndex=this._json.lastIndexOf("]",stringsTokenIndex);this._snapshot.trace_tree=JSON.parse(this._json.substring(0,bracketIndex+1));this._json=this._json.slice(bracketIndex);this._state="find-strings";this._progress.updateStatus("Loading strings\u2026");break;}
+case"find-strings":{var stringsToken="\"strings\"";var stringsTokenIndex=this._json.indexOf(stringsToken);if(stringsTokenIndex===-1)
+return;var bracketIndex=this._json.indexOf("[",stringsTokenIndex);if(bracketIndex===-1)
+return;this._json=this._json.slice(bracketIndex);this._state="accumulate-strings";break;}
+case"accumulate-strings":return;}}}};;WebInspector.HeapSnapshotWorkerDispatcher=function(globalObject,postMessage)
+{this._objects=[];this._global=globalObject;this._postMessage=postMessage;}
+WebInspector.HeapSnapshotWorkerDispatcher.prototype={_findFunction:function(name)
+{var path=name.split(".");var result=this._global;for(var i=0;i<path.length;++i)
+result=result[path[i]];return result;},sendEvent:function(name,data)
+{this._postMessage({eventName:name,data:data});},dispatchMessage:function(event)
+{var data=(event.data);var response={callId:data.callId};try{switch(data.disposition){case"create":{var constructorFunction=this._findFunction(data.methodName);this._objects[data.objectId]=new constructorFunction(this);break;}
+case"dispose":{delete this._objects[data.objectId];break;}
+case"getter":{var object=this._objects[data.objectId];var result=object[data.methodName];response.result=result;break;}
+case"factory":{var object=this._objects[data.objectId];var result=object[data.methodName].apply(object,data.methodArguments);if(result)
+this._objects[data.newObjectId]=result;response.result=!!result;break;}
+case"method":{var object=this._objects[data.objectId];response.result=object[data.methodName].apply(object,data.methodArguments);break;}
+case"evaluateForTest":{try{response.result=eval(data.source)}catch(e){response.result=e.toString();}
+break;}}}catch(e){response.error=e.toString();response.errorCallStack=e.stack;if(data.methodName)
+response.errorMethodName=data.methodName;}
+this._postMessage(response);}};;WebInspector.JSHeapSnapshot=function(profile,progress,showHiddenData)
+{this._nodeFlags={canBeQueried:1,detachedDOMTreeNode:2,pageObject:4,visitedMarkerMask:0x0ffff,visitedMarker:0x10000};this._lazyStringCache={};WebInspector.HeapSnapshot.call(this,profile,progress,showHiddenData);}
+WebInspector.JSHeapSnapshot.prototype={createNode:function(nodeIndex)
+{return new WebInspector.JSHeapSnapshotNode(this,nodeIndex);},createEdge:function(edgeIndex)
+{return new WebInspector.JSHeapSnapshotEdge(this,edgeIndex);},createRetainingEdge:function(retainerIndex)
+{return new WebInspector.JSHeapSnapshotRetainerEdge(this,retainerIndex);},classNodesFilter:function()
+{function filter(node)
+{return node.isUserObject();}
+return this._showHiddenData?null:filter;},containmentEdgesFilter:function()
+{var showHiddenData=this._showHiddenData;function filter(edge){if(edge.isInvisible())
+return false;if(showHiddenData)
+return true;return!edge.isHidden()&&!edge.node().isHidden();}
+return filter;},retainingEdgesFilter:function()
+{var containmentEdgesFilter=this.containmentEdgesFilter();function filter(edge)
+{return containmentEdgesFilter(edge)&&!edge.node().isRoot()&&!edge.isWeak();}
+return filter;},dispose:function()
+{WebInspector.HeapSnapshot.prototype.dispose.call(this);delete this._flags;},_calculateFlags:function()
+{this._flags=new Uint32Array(this.nodeCount);this._markDetachedDOMTreeNodes();this._markQueriableHeapObjects();this._markPageOwnedNodes();},_isUserRoot:function(node)
+{return node.isUserRoot()||node.isDocumentDOMTreesRoot();},forEachRoot:function(action,userRootsOnly)
+{function getChildNodeByName(node,name)
+{for(var iter=node.edges();iter.hasNext();iter.next()){var child=iter.edge.node();if(child.name()===name)
+return child;}
+return null;}
+var visitedNodes={};function doAction(node)
+{var ordinal=node._ordinal();if(!visitedNodes[ordinal]){action(node);visitedNodes[ordinal]=true;}}
+var gcRoots=getChildNodeByName(this.rootNode(),"(GC roots)");if(!gcRoots)
+return;if(userRootsOnly){for(var iter=this.rootNode().edges();iter.hasNext();iter.next()){var node=iter.edge.node();if(this._isUserRoot(node))
+doAction(node);}}else{for(var iter=gcRoots.edges();iter.hasNext();iter.next()){var subRoot=iter.edge.node();for(var iter2=subRoot.edges();iter2.hasNext();iter2.next())
+doAction(iter2.edge.node());doAction(subRoot);}
+for(var iter=this.rootNode().edges();iter.hasNext();iter.next())
+doAction(iter.edge.node())}},userObjectsMapAndFlag:function()
+{return this._showHiddenData?null:{map:this._flags,flag:this._nodeFlags.pageObject};},_flagsOfNode:function(node)
+{return this._flags[node.nodeIndex/this._nodeFieldCount];},_markDetachedDOMTreeNodes:function()
+{var flag=this._nodeFlags.detachedDOMTreeNode;var detachedDOMTreesRoot;for(var iter=this.rootNode().edges();iter.hasNext();iter.next()){var node=iter.edge.node();if(node.name()==="(Detached DOM trees)"){detachedDOMTreesRoot=node;break;}}
+if(!detachedDOMTreesRoot)
+return;var detachedDOMTreeRE=/^Detached DOM tree/;for(var iter=detachedDOMTreesRoot.edges();iter.hasNext();iter.next()){var node=iter.edge.node();if(detachedDOMTreeRE.test(node.className())){for(var edgesIter=node.edges();edgesIter.hasNext();edgesIter.next())
+this._flags[edgesIter.edge.node().nodeIndex/this._nodeFieldCount]|=flag;}}},_markQueriableHeapObjects:function()
+{var flag=this._nodeFlags.canBeQueried;var hiddenEdgeType=this._edgeHiddenType;var internalEdgeType=this._edgeInternalType;var invisibleEdgeType=this._edgeInvisibleType;var weakEdgeType=this._edgeWeakType;var edgeToNodeOffset=this._edgeToNodeOffset;var edgeTypeOffset=this._edgeTypeOffset;var edgeFieldsCount=this._edgeFieldsCount;var containmentEdges=this._containmentEdges;var nodes=this._nodes;var nodeCount=this.nodeCount;var nodeFieldCount=this._nodeFieldCount;var firstEdgeIndexes=this._firstEdgeIndexes;var flags=this._flags;var list=[];for(var iter=this.rootNode().edges();iter.hasNext();iter.next()){if(iter.edge.node().isUserRoot())
+list.push(iter.edge.node().nodeIndex/nodeFieldCount);}
+while(list.length){var nodeOrdinal=list.pop();if(flags[nodeOrdinal]&flag)
+continue;flags[nodeOrdinal]|=flag;var beginEdgeIndex=firstEdgeIndexes[nodeOrdinal];var endEdgeIndex=firstEdgeIndexes[nodeOrdinal+1];for(var edgeIndex=beginEdgeIndex;edgeIndex<endEdgeIndex;edgeIndex+=edgeFieldsCount){var childNodeIndex=containmentEdges[edgeIndex+edgeToNodeOffset];var childNodeOrdinal=childNodeIndex/nodeFieldCount;if(flags[childNodeOrdinal]&flag)
+continue;var type=containmentEdges[edgeIndex+edgeTypeOffset];if(type===hiddenEdgeType||type===invisibleEdgeType||type===internalEdgeType||type===weakEdgeType)
+continue;list.push(childNodeOrdinal);}}},_markPageOwnedNodes:function()
+{var edgeShortcutType=this._edgeShortcutType;var edgeElementType=this._edgeElementType;var edgeToNodeOffset=this._edgeToNodeOffset;var edgeTypeOffset=this._edgeTypeOffset;var edgeFieldsCount=this._edgeFieldsCount;var edgeWeakType=this._edgeWeakType;var firstEdgeIndexes=this._firstEdgeIndexes;var containmentEdges=this._containmentEdges;var containmentEdgesLength=containmentEdges.length;var nodes=this._nodes;var nodeFieldCount=this._nodeFieldCount;var nodesCount=this.nodeCount;var flags=this._flags;var flag=this._nodeFlags.pageObject;var visitedMarker=this._nodeFlags.visitedMarker;var visitedMarkerMask=this._nodeFlags.visitedMarkerMask;var markerAndFlag=visitedMarker|flag;var nodesToVisit=new Uint32Array(nodesCount);var nodesToVisitLength=0;var rootNodeOrdinal=this._rootNodeIndex/nodeFieldCount;var node=this.rootNode();for(var edgeIndex=firstEdgeIndexes[rootNodeOrdinal],endEdgeIndex=firstEdgeIndexes[rootNodeOrdinal+1];edgeIndex<endEdgeIndex;edgeIndex+=edgeFieldsCount){var edgeType=containmentEdges[edgeIndex+edgeTypeOffset];var nodeIndex=containmentEdges[edgeIndex+edgeToNodeOffset];if(edgeType===edgeElementType){node.nodeIndex=nodeIndex;if(!node.isDocumentDOMTreesRoot())
+continue;}else if(edgeType!==edgeShortcutType)
+continue;var nodeOrdinal=nodeIndex/nodeFieldCount;nodesToVisit[nodesToVisitLength++]=nodeOrdinal;flags[nodeOrdinal]|=visitedMarker;}
+while(nodesToVisitLength){var nodeOrdinal=nodesToVisit[--nodesToVisitLength];flags[nodeOrdinal]|=flag;flags[nodeOrdinal]&=visitedMarkerMask;var beginEdgeIndex=firstEdgeIndexes[nodeOrdinal];var endEdgeIndex=firstEdgeIndexes[nodeOrdinal+1];for(var edgeIndex=beginEdgeIndex;edgeIndex<endEdgeIndex;edgeIndex+=edgeFieldsCount){var childNodeIndex=containmentEdges[edgeIndex+edgeToNodeOffset];var childNodeOrdinal=childNodeIndex/nodeFieldCount;if(flags[childNodeOrdinal]&markerAndFlag)
+continue;var type=containmentEdges[edgeIndex+edgeTypeOffset];if(type===edgeWeakType)
+continue;nodesToVisit[nodesToVisitLength++]=childNodeOrdinal;flags[childNodeOrdinal]|=visitedMarker;}}},_calculateStatistics:function()
+{var nodeFieldCount=this._nodeFieldCount;var nodes=this._nodes;var nodesLength=nodes.length;var nodeTypeOffset=this._nodeTypeOffset;var nodeSizeOffset=this._nodeSelfSizeOffset;;var nodeNativeType=this._nodeNativeType;var nodeCodeType=this._nodeCodeType;var nodeConsStringType=this._nodeConsStringType;var nodeSlicedStringType=this._nodeSlicedStringType;var sizeNative=0;var sizeCode=0;var sizeStrings=0;var sizeJSArrays=0;var node=this.rootNode();for(var nodeIndex=0;nodeIndex<nodesLength;nodeIndex+=nodeFieldCount){node.nodeIndex=nodeIndex;var nodeType=nodes[nodeIndex+nodeTypeOffset];var nodeSize=nodes[nodeIndex+nodeSizeOffset];if(nodeType===nodeNativeType)
+sizeNative+=nodeSize;else if(nodeType===nodeCodeType)
+sizeCode+=nodeSize;else if(nodeType===nodeConsStringType||nodeType===nodeSlicedStringType||node.type()==="string")
+sizeStrings+=nodeSize;else if(node.name()==="Array")
+sizeJSArrays+=this._calculateArraySize(node);}
+this._statistics=new WebInspector.HeapSnapshotCommon.Statistics();this._statistics.total=this.totalSize;this._statistics.v8heap=this.totalSize-sizeNative;this._statistics.native=sizeNative;this._statistics.code=sizeCode;this._statistics.jsArrays=sizeJSArrays;this._statistics.strings=sizeStrings;},_calculateArraySize:function(node)
+{var size=node.selfSize();var beginEdgeIndex=node._edgeIndexesStart();var endEdgeIndex=node._edgeIndexesEnd();var containmentEdges=this._containmentEdges;var strings=this._strings;var edgeToNodeOffset=this._edgeToNodeOffset;var edgeTypeOffset=this._edgeTypeOffset;var edgeNameOffset=this._edgeNameOffset;var edgeFieldsCount=this._edgeFieldsCount;var edgeInternalType=this._edgeInternalType;for(var edgeIndex=beginEdgeIndex;edgeIndex<endEdgeIndex;edgeIndex+=edgeFieldsCount){var edgeType=containmentEdges[edgeIndex+edgeTypeOffset];if(edgeType!==edgeInternalType)
+continue;var edgeName=strings[containmentEdges[edgeIndex+edgeNameOffset]];if(edgeName!=="elements")
+continue;var elementsNodeIndex=containmentEdges[edgeIndex+edgeToNodeOffset];node.nodeIndex=elementsNodeIndex;if(node.retainersCount()===1)
+size+=node.selfSize();break;}
+return size;},getStatistics:function()
+{return this._statistics;},__proto__:WebInspector.HeapSnapshot.prototype};WebInspector.JSHeapSnapshotNode=function(snapshot,nodeIndex)
+{WebInspector.HeapSnapshotNode.call(this,snapshot,nodeIndex)}
+WebInspector.JSHeapSnapshotNode.prototype={canBeQueried:function()
+{var flags=this._snapshot._flagsOfNode(this);return!!(flags&this._snapshot._nodeFlags.canBeQueried);},isUserObject:function()
+{var flags=this._snapshot._flagsOfNode(this);return!!(flags&this._snapshot._nodeFlags.pageObject);},name:function(){var snapshot=this._snapshot;if(this._type()===snapshot._nodeConsStringType){var string=snapshot._lazyStringCache[this.nodeIndex];if(typeof string==="undefined"){string=this._consStringName();snapshot._lazyStringCache[this.nodeIndex]=string;}
+return string;}
+return WebInspector.HeapSnapshotNode.prototype.name.call(this);},_consStringName:function()
+{var snapshot=this._snapshot;var consStringType=snapshot._nodeConsStringType;var edgeInternalType=snapshot._edgeInternalType;var edgeFieldsCount=snapshot._edgeFieldsCount;var edgeToNodeOffset=snapshot._edgeToNodeOffset;var edgeTypeOffset=snapshot._edgeTypeOffset;var edgeNameOffset=snapshot._edgeNameOffset;var strings=snapshot._strings;var edges=snapshot._containmentEdges;var firstEdgeIndexes=snapshot._firstEdgeIndexes;var nodeFieldCount=snapshot._nodeFieldCount;var nodeTypeOffset=snapshot._nodeTypeOffset;var nodeNameOffset=snapshot._nodeNameOffset;var nodes=snapshot._nodes;var nodesStack=[];nodesStack.push(this.nodeIndex);var name="";while(nodesStack.length&&name.length<1024){var nodeIndex=nodesStack.pop();if(nodes[nodeIndex+nodeTypeOffset]!==consStringType){name+=strings[nodes[nodeIndex+nodeNameOffset]];continue;}
+var nodeOrdinal=nodeIndex/nodeFieldCount;var beginEdgeIndex=firstEdgeIndexes[nodeOrdinal];var endEdgeIndex=firstEdgeIndexes[nodeOrdinal+1];var firstNodeIndex=0;var secondNodeIndex=0;for(var edgeIndex=beginEdgeIndex;edgeIndex<endEdgeIndex&&(!firstNodeIndex||!secondNodeIndex);edgeIndex+=edgeFieldsCount){var edgeType=edges[edgeIndex+edgeTypeOffset];if(edgeType===edgeInternalType){var edgeName=strings[edges[edgeIndex+edgeNameOffset]];if(edgeName==="first")
+firstNodeIndex=edges[edgeIndex+edgeToNodeOffset];else if(edgeName==="second")
+secondNodeIndex=edges[edgeIndex+edgeToNodeOffset];}}
+nodesStack.push(secondNodeIndex);nodesStack.push(firstNodeIndex);}
+return name;},className:function()
+{var type=this.type();switch(type){case"hidden":return"(system)";case"object":case"native":return this.name();case"code":return"(compiled code)";default:return"("+type+")";}},classIndex:function()
+{var snapshot=this._snapshot;var nodes=snapshot._nodes;var type=nodes[this.nodeIndex+snapshot._nodeTypeOffset];;if(type===snapshot._nodeObjectType||type===snapshot._nodeNativeType)
+return nodes[this.nodeIndex+snapshot._nodeNameOffset];return-1-type;},id:function()
+{var snapshot=this._snapshot;return snapshot._nodes[this.nodeIndex+snapshot._nodeIdOffset];},isHidden:function()
+{return this._type()===this._snapshot._nodeHiddenType;},isSynthetic:function()
+{return this._type()===this._snapshot._nodeSyntheticType;},isUserRoot:function()
+{return!this.isSynthetic();},isDocumentDOMTreesRoot:function()
+{return this.isSynthetic()&&this.name()==="(Document DOM trees)";},serialize:function()
+{var result=WebInspector.HeapSnapshotNode.prototype.serialize.call(this);var flags=this._snapshot._flagsOfNode(this);if(flags&this._snapshot._nodeFlags.canBeQueried)
+result.canBeQueried=true;if(flags&this._snapshot._nodeFlags.detachedDOMTreeNode)
+result.detachedDOMTreeNode=true;return result;},__proto__:WebInspector.HeapSnapshotNode.prototype};WebInspector.JSHeapSnapshotEdge=function(snapshot,edgeIndex)
+{WebInspector.HeapSnapshotEdge.call(this,snapshot,edgeIndex);}
+WebInspector.JSHeapSnapshotEdge.prototype={clone:function()
+{var snapshot=(this._snapshot);return new WebInspector.JSHeapSnapshotEdge(snapshot,this.edgeIndex);},hasStringName:function()
+{if(!this.isShortcut())
+return this._hasStringName();return isNaN(parseInt(this._name(),10));},isElement:function()
+{return this._type()===this._snapshot._edgeElementType;},isHidden:function()
+{return this._type()===this._snapshot._edgeHiddenType;},isWeak:function()
+{return this._type()===this._snapshot._edgeWeakType;},isInternal:function()
+{return this._type()===this._snapshot._edgeInternalType;},isInvisible:function()
+{return this._type()===this._snapshot._edgeInvisibleType;},isShortcut:function()
+{return this._type()===this._snapshot._edgeShortcutType;},name:function()
+{if(!this.isShortcut())
+return this._name();var numName=parseInt(this._name(),10);return isNaN(numName)?this._name():numName;},toString:function()
+{var name=this.name();switch(this.type()){case"context":return"->"+name;case"element":return"["+name+"]";case"weak":return"[["+name+"]]";case"property":return name.indexOf(" ")===-1?"."+name:"[\""+name+"\"]";case"shortcut":if(typeof name==="string")
+return name.indexOf(" ")===-1?"."+name:"[\""+name+"\"]";else
+return"["+name+"]";case"internal":case"hidden":case"invisible":return"{"+name+"}";};return"?"+name+"?";},_hasStringName:function()
+{return!this.isElement()&&!this.isHidden();},_name:function()
+{return this._hasStringName()?this._snapshot._strings[this._nameOrIndex()]:this._nameOrIndex();},_nameOrIndex:function()
+{return this._edges[this.edgeIndex+this._snapshot._edgeNameOffset];},_type:function()
+{return this._edges[this.edgeIndex+this._snapshot._edgeTypeOffset];},__proto__:WebInspector.HeapSnapshotEdge.prototype};WebInspector.JSHeapSnapshotRetainerEdge=function(snapshot,retainerIndex)
+{WebInspector.HeapSnapshotRetainerEdge.call(this,snapshot,retainerIndex);}
+WebInspector.JSHeapSnapshotRetainerEdge.prototype={clone:function()
+{var snapshot=(this._snapshot);return new WebInspector.JSHeapSnapshotRetainerEdge(snapshot,this.retainerIndex());},isHidden:function()
+{return this._edge().isHidden();},isInternal:function()
+{return this._edge().isInternal();},isInvisible:function()
+{return this._edge().isInvisible();},isShortcut:function()
+{return this._edge().isShortcut();},isWeak:function()
+{return this._edge().isWeak();},__proto__:WebInspector.HeapSnapshotRetainerEdge.prototype};WebInspector.TextUtils={isStopChar:function(char)
+{return(char>" "&&char<"0")||(char>"9"&&char<"A")||(char>"Z"&&char<"_")||(char>"_"&&char<"a")||(char>"z"&&char<="~");},isWordChar:function(char)
+{return!WebInspector.TextUtils.isStopChar(char)&&!WebInspector.TextUtils.isSpaceChar(char);},isSpaceChar:function(char)
+{return WebInspector.TextUtils._SpaceCharRegex.test(char);},isWord:function(word)
+{for(var i=0;i<word.length;++i){if(!WebInspector.TextUtils.isWordChar(word.charAt(i)))
+return false;}
+return true;},isOpeningBraceChar:function(char)
+{return char==="("||char==="{";},isClosingBraceChar:function(char)
+{return char===")"||char==="}";},isBraceChar:function(char)
+{return WebInspector.TextUtils.isOpeningBraceChar(char)||WebInspector.TextUtils.isClosingBraceChar(char);},textToWords:function(text)
+{var words=[];var startWord=-1;for(var i=0;i<text.length;++i){if(!WebInspector.TextUtils.isWordChar(text.charAt(i))){if(startWord!==-1)
+words.push(text.substring(startWord,i));startWord=-1;}else if(startWord===-1)
+startWord=i;}
+if(startWord!==-1)
+words.push(text.substring(startWord));return words;},findBalancedCurlyBrackets:function(source,startIndex,lastIndex){lastIndex=lastIndex||source.length;startIndex=startIndex||0;var counter=0;var inString=false;for(var index=startIndex;index<lastIndex;++index){var character=source[index];if(inString){if(character==="\\")
+++index;else if(character==="\"")
+inString=false;}else{if(character==="\"")
+inString=true;else if(character==="{")
+++counter;else if(character==="}"){if(--counter===0)
+return index+1;}}}
+return-1;}}
+WebInspector.TextUtils._SpaceCharRegex=/\s/;WebInspector.TextUtils.Indent={TwoSpaces:"  ",FourSpaces:"    ",EightSpaces:"        ",TabCharacter:"\t"};WebInspector.UIString=function(string,vararg)
+{return String.vsprintf(string,Array.prototype.slice.call(arguments,1));};Object.isEmpty=function(obj)
+{for(var i in obj)
+return false;return true;}
+Object.values=function(obj)
+{var result=Object.keys(obj);var length=result.length;for(var i=0;i<length;++i)
+result[i]=obj[result[i]];return result;}
+String.prototype.findAll=function(string)
+{var matches=[];var i=this.indexOf(string);while(i!==-1){matches.push(i);i=this.indexOf(string,i+string.length);}
+return matches;}
+String.prototype.lineEndings=function()
+{if(!this._lineEndings){this._lineEndings=this.findAll("\n");this._lineEndings.push(this.length);}
+return this._lineEndings;}
+String.prototype.lineCount=function()
+{var lineEndings=this.lineEndings();return lineEndings.length;}
+String.prototype.lineAt=function(lineNumber)
+{var lineEndings=this.lineEndings();var lineStart=lineNumber>0?lineEndings[lineNumber-1]+1:0;var lineEnd=lineEndings[lineNumber];var lineContent=this.substring(lineStart,lineEnd);if(lineContent.length>0&&lineContent.charAt(lineContent.length-1)==="\r")
+lineContent=lineContent.substring(0,lineContent.length-1);return lineContent;}
+String.prototype.escapeCharacters=function(chars)
+{var foundChar=false;for(var i=0;i<chars.length;++i){if(this.indexOf(chars.charAt(i))!==-1){foundChar=true;break;}}
+if(!foundChar)
+return String(this);var result="";for(var i=0;i<this.length;++i){if(chars.indexOf(this.charAt(i))!==-1)
+result+="\\";result+=this.charAt(i);}
+return result;}
+String.regexSpecialCharacters=function()
+{return"^[]{}()\\.^$*+?|-,";}
+String.prototype.escapeForRegExp=function()
+{return this.escapeCharacters(String.regexSpecialCharacters());}
+String.prototype.escapeHTML=function()
+{return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");}
+String.prototype.collapseWhitespace=function()
+{return this.replace(/[\s\xA0]+/g," ");}
+String.prototype.trimMiddle=function(maxLength)
+{if(this.length<=maxLength)
+return String(this);var leftHalf=maxLength>>1;var rightHalf=maxLength-leftHalf-1;return this.substr(0,leftHalf)+"\u2026"+this.substr(this.length-rightHalf,rightHalf);}
+String.prototype.trimEnd=function(maxLength)
+{if(this.length<=maxLength)
+return String(this);return this.substr(0,maxLength-1)+"\u2026";}
+String.prototype.trimURL=function(baseURLDomain)
+{var result=this.replace(/^(https|http|file):\/\//i,"");if(baseURLDomain)
+result=result.replace(new RegExp("^"+baseURLDomain.escapeForRegExp(),"i"),"");return result;}
+String.prototype.toTitleCase=function()
+{return this.substring(0,1).toUpperCase()+this.substring(1);}
+String.prototype.compareTo=function(other)
+{if(this>other)
+return 1;if(this<other)
+return-1;return 0;}
+function sanitizeHref(href)
+{return href&&href.trim().toLowerCase().startsWith("javascript:")?null:href;}
+String.prototype.removeURLFragment=function()
+{var fragmentIndex=this.indexOf("#");if(fragmentIndex==-1)
+fragmentIndex=this.length;return this.substring(0,fragmentIndex);}
+String.prototype.startsWith=function(substring)
+{return!this.lastIndexOf(substring,0);}
+String.prototype.endsWith=function(substring)
+{return this.indexOf(substring,this.length-substring.length)!==-1;}
+String.prototype.hashCode=function()
+{var result=0;for(var i=0;i<this.length;++i)
+result=result*3+this.charCodeAt(i);return result;}
+String.naturalOrderComparator=function(a,b)
+{var chunk=/^\d+|^\D+/;var chunka,chunkb,anum,bnum;while(1){if(a){if(!b)
+return 1;}else{if(b)
+return-1;else
+return 0;}
+chunka=a.match(chunk)[0];chunkb=b.match(chunk)[0];anum=!isNaN(chunka);bnum=!isNaN(chunkb);if(anum&&!bnum)
+return-1;if(bnum&&!anum)
+return 1;if(anum&&bnum){var diff=chunka-chunkb;if(diff)
+return diff;if(chunka.length!==chunkb.length){if(!+chunka&&!+chunkb)
+return chunka.length-chunkb.length;else
+return chunkb.length-chunka.length;}}else if(chunka!==chunkb)
+return(chunka<chunkb)?-1:1;a=a.substring(chunka.length);b=b.substring(chunkb.length);}}
+Number.constrain=function(num,min,max)
+{if(num<min)
+num=min;else if(num>max)
+num=max;return num;}
+Number.gcd=function(a,b)
+{if(b===0)
+return a;else
+return Number.gcd(b,a%b);}
+Number.toFixedIfFloating=function(value)
+{if(!value||isNaN(value))
+return value;var number=Number(value);return number%1?number.toFixed(3):String(number);}
+Date.prototype.toISO8601Compact=function()
+{function leadZero(x)
+{return(x>9?"":"0")+x;}
+return this.getFullYear()+
+leadZero(this.getMonth()+1)+
+leadZero(this.getDate())+"T"+
+leadZero(this.getHours())+
+leadZero(this.getMinutes())+
+leadZero(this.getSeconds());}
+Date.prototype.toConsoleTime=function()
+{function leadZero2(x)
+{return(x>9?"":"0")+x;}
+function leadZero3(x)
+{return(Array(4-x.toString().length)).join('0')+x;}
+return this.getFullYear()+"-"+
+leadZero2(this.getMonth()+1)+"-"+
+leadZero2(this.getDate())+" "+
+leadZero2(this.getHours())+":"+
+leadZero2(this.getMinutes())+":"+
+leadZero2(this.getSeconds())+"."+
+leadZero3(this.getMilliseconds());}
+Object.defineProperty(Array.prototype,"remove",{value:function(value,firstOnly)
+{var index=this.indexOf(value);if(index===-1)
+return;if(firstOnly){this.splice(index,1);return;}
+for(var i=index+1,n=this.length;i<n;++i){if(this[i]!==value)
+this[index++]=this[i];}
+this.length=index;}});Object.defineProperty(Array.prototype,"keySet",{value:function()
+{var keys={};for(var i=0;i<this.length;++i)
+keys[this[i]]=true;return keys;}});Object.defineProperty(Array.prototype,"rotate",{value:function(index)
+{var result=[];for(var i=index;i<index+this.length;++i)
+result.push(this[i%this.length]);return result;}});Object.defineProperty(Uint32Array.prototype,"sort",{value:Array.prototype.sort});(function(){var partition={value:function(comparator,left,right,pivotIndex)
+{function swap(array,i1,i2)
+{var temp=array[i1];array[i1]=array[i2];array[i2]=temp;}
+var pivotValue=this[pivotIndex];swap(this,right,pivotIndex);var storeIndex=left;for(var i=left;i<right;++i){if(comparator(this[i],pivotValue)<0){swap(this,storeIndex,i);++storeIndex;}}
+swap(this,right,storeIndex);return storeIndex;}};Object.defineProperty(Array.prototype,"partition",partition);Object.defineProperty(Uint32Array.prototype,"partition",partition);var sortRange={value:function(comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight)
+{function quickSortRange(array,comparator,left,right,sortWindowLeft,sortWindowRight)
+{if(right<=left)
+return;var pivotIndex=Math.floor(Math.random()*(right-left))+left;var pivotNewIndex=array.partition(comparator,left,right,pivotIndex);if(sortWindowLeft<pivotNewIndex)
+quickSortRange(array,comparator,left,pivotNewIndex-1,sortWindowLeft,sortWindowRight);if(pivotNewIndex<sortWindowRight)
+quickSortRange(array,comparator,pivotNewIndex+1,right,sortWindowLeft,sortWindowRight);}
+if(leftBound===0&&rightBound===(this.length-1)&&sortWindowLeft===0&&sortWindowRight>=rightBound)
+this.sort(comparator);else
+quickSortRange(this,comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight);return this;}}
+Object.defineProperty(Array.prototype,"sortRange",sortRange);Object.defineProperty(Uint32Array.prototype,"sortRange",sortRange);})();Object.defineProperty(Array.prototype,"stableSort",{value:function(comparator)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var indices=new Array(this.length);for(var i=0;i<this.length;++i)
+indices[i]=i;var self=this;function indexComparator(a,b)
+{var result=comparator(self[a],self[b]);return result?result:a-b;}
+indices.sort(indexComparator);for(var i=0;i<this.length;++i){if(indices[i]<0||i===indices[i])
+continue;var cyclical=i;var saved=this[i];while(true){var next=indices[cyclical];indices[cyclical]=-1;if(next===i){this[cyclical]=saved;break;}else{this[cyclical]=this[next];cyclical=next;}}}
+return this;}});Object.defineProperty(Array.prototype,"qselect",{value:function(k,comparator)
+{if(k<0||k>=this.length)
+return;if(!comparator)
+comparator=function(a,b){return a-b;}
+var low=0;var high=this.length-1;for(;;){var pivotPosition=this.partition(comparator,low,high,Math.floor((high+low)/2));if(pivotPosition===k)
+return this[k];else if(pivotPosition>k)
+high=pivotPosition-1;else
+low=pivotPosition+1;}}});Object.defineProperty(Array.prototype,"lowerBound",{value:function(object,comparator,left,right)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>0)
+l=m+1;else
+r=m;}
+return r;}});Object.defineProperty(Array.prototype,"upperBound",{value:function(object,comparator,left,right)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>=0)
+l=m+1;else
+r=m;}
+return r;}});Object.defineProperty(Array.prototype,"binaryIndexOf",{value:function(value,comparator)
+{var index=this.lowerBound(value,comparator);return index<this.length&&comparator(value,this[index])===0?index:-1;}});Object.defineProperty(Array.prototype,"select",{value:function(field)
+{var result=new Array(this.length);for(var i=0;i<this.length;++i)
+result[i]=this[i][field];return result;}});Object.defineProperty(Array.prototype,"peekLast",{value:function()
+{return this[this.length-1];}});(function(){function mergeOrIntersect(array1,array2,comparator,mergeNotIntersect)
+{var result=[];var i=0;var j=0;while(i<array1.length&&j<array2.length){var compareValue=comparator(array1[i],array2[j]);if(mergeNotIntersect||!compareValue)
+result.push(compareValue<=0?array1[i]:array2[j]);if(compareValue<=0)
+i++;if(compareValue>=0)
+j++;}
+if(mergeNotIntersect){while(i<array1.length)
+result.push(array1[i++]);while(j<array2.length)
+result.push(array2[j++]);}
+return result;}
+Object.defineProperty(Array.prototype,"intersectOrdered",{value:function(array,comparator)
+{return mergeOrIntersect(this,array,comparator,false);}});Object.defineProperty(Array.prototype,"mergeOrdered",{value:function(array,comparator)
+{return mergeOrIntersect(this,array,comparator,true);}});}());function insertionIndexForObjectInListSortedByFunction(object,list,comparator,insertionIndexAfter)
+{if(insertionIndexAfter)
+return list.upperBound(object,comparator);else
+return list.lowerBound(object,comparator);}
+String.sprintf=function(format,var_arg)
+{return String.vsprintf(format,Array.prototype.slice.call(arguments,1));}
+String.tokenizeFormatString=function(format,formatters)
+{var tokens=[];var substitutionIndex=0;function addStringToken(str)
+{tokens.push({type:"string",value:str});}
+function addSpecifierToken(specifier,precision,substitutionIndex)
+{tokens.push({type:"specifier",specifier:specifier,precision:precision,substitutionIndex:substitutionIndex});}
+function isDigit(c)
+{return!!/[0-9]/.exec(c);}
+var index=0;for(var precentIndex=format.indexOf("%",index);precentIndex!==-1;precentIndex=format.indexOf("%",index)){addStringToken(format.substring(index,precentIndex));index=precentIndex+1;if(isDigit(format[index])){var number=parseInt(format.substring(index),10);while(isDigit(format[index]))
+++index;if(number>0&&format[index]==="$"){substitutionIndex=(number-1);++index;}}
+var precision=-1;if(format[index]==="."){++index;precision=parseInt(format.substring(index),10);if(isNaN(precision))
+precision=0;while(isDigit(format[index]))
+++index;}
+if(!(format[index]in formatters)){addStringToken(format.substring(precentIndex,index+1));++index;continue;}
+addSpecifierToken(format[index],precision,substitutionIndex);++substitutionIndex;++index;}
+addStringToken(format.substring(index));return tokens;}
+String.standardFormatters={d:function(substitution)
+{return!isNaN(substitution)?substitution:0;},f:function(substitution,token)
+{if(substitution&&token.precision>-1)
+substitution=substitution.toFixed(token.precision);return!isNaN(substitution)?substitution:(token.precision>-1?Number(0).toFixed(token.precision):0);},s:function(substitution)
+{return substitution;}}
+String.vsprintf=function(format,substitutions)
+{return String.format(format,substitutions,String.standardFormatters,"",function(a,b){return a+b;}).formattedResult;}
+String.format=function(format,substitutions,formatters,initialValue,append)
+{if(!format||!substitutions||!substitutions.length)
+return{formattedResult:append(initialValue,format),unusedSubstitutions:substitutions};function prettyFunctionName()
+{return"String.format(\""+format+"\", \""+substitutions.join("\", \"")+"\")";}
+function warn(msg)
+{console.warn(prettyFunctionName()+": "+msg);}
+function error(msg)
+{console.error(prettyFunctionName()+": "+msg);}
+var result=initialValue;var tokens=String.tokenizeFormatString(format,formatters);var usedSubstitutionIndexes={};for(var i=0;i<tokens.length;++i){var token=tokens[i];if(token.type==="string"){result=append(result,token.value);continue;}
+if(token.type!=="specifier"){error("Unknown token type \""+token.type+"\" found.");continue;}
+if(token.substitutionIndex>=substitutions.length){error("not enough substitution arguments. Had "+substitutions.length+" but needed "+(token.substitutionIndex+1)+", so substitution was skipped.");result=append(result,"%"+(token.precision>-1?token.precision:"")+token.specifier);continue;}
+usedSubstitutionIndexes[token.substitutionIndex]=true;if(!(token.specifier in formatters)){warn("unsupported format character \u201C"+token.specifier+"\u201D. Treating as a string.");result=append(result,substitutions[token.substitutionIndex]);continue;}
+result=append(result,formatters[token.specifier](substitutions[token.substitutionIndex],token));}
+var unusedSubstitutions=[];for(var i=0;i<substitutions.length;++i){if(i in usedSubstitutionIndexes)
+continue;unusedSubstitutions.push(substitutions[i]);}
+return{formattedResult:result,unusedSubstitutions:unusedSubstitutions};}
+function createSearchRegex(query,caseSensitive,isRegex)
+{var regexFlags=caseSensitive?"g":"gi";var regexObject;if(isRegex){try{regexObject=new RegExp(query,regexFlags);}catch(e){}}
+if(!regexObject)
+regexObject=createPlainTextSearchRegex(query,regexFlags);return regexObject;}
+function createPlainTextSearchRegex(query,flags)
+{var regexSpecialCharacters=String.regexSpecialCharacters();var regex="";for(var i=0;i<query.length;++i){var c=query.charAt(i);if(regexSpecialCharacters.indexOf(c)!=-1)
+regex+="\\";regex+=c;}
+return new RegExp(regex,flags||"");}
+function countRegexMatches(regex,content)
+{var text=content;var result=0;var match;while(text&&(match=regex.exec(text))){if(match[0].length>0)
+++result;text=text.substring(match.index+1);}
+return result;}
+function numberToStringWithSpacesPadding(value,symbolsCount)
+{var numberString=value.toString();var paddingLength=Math.max(0,symbolsCount-numberString.length);var paddingString=Array(paddingLength+1).join("\u00a0");return paddingString+numberString;}
+var createObjectIdentifier=function()
+{return"_"+ ++createObjectIdentifier._last;}
+createObjectIdentifier._last=0;var Set=function()
+{this._set={};this._size=0;}
+Set.prototype={add:function(item)
+{var objectIdentifier=item.__identifier;if(!objectIdentifier){objectIdentifier=createObjectIdentifier();item.__identifier=objectIdentifier;}
+if(!this._set[objectIdentifier])
+++this._size;this._set[objectIdentifier]=item;},remove:function(item)
+{if(this._set[item.__identifier]){--this._size;delete this._set[item.__identifier];return true;}
+return false;},items:function()
+{var result=new Array(this._size);var i=0;for(var objectIdentifier in this._set)
+result[i++]=this._set[objectIdentifier];return result;},hasItem:function(item)
+{return!!this._set[item.__identifier];},size:function()
+{return this._size;},clear:function()
+{this._set={};this._size=0;}}
+var Map=function()
+{this._map={};this._size=0;}
+Map.prototype={put:function(key,value)
+{var objectIdentifier=key.__identifier;if(!objectIdentifier){objectIdentifier=createObjectIdentifier();key.__identifier=objectIdentifier;}
+if(!this._map[objectIdentifier])
+++this._size;this._map[objectIdentifier]=[key,value];},remove:function(key)
+{var result=this._map[key.__identifier];if(!result)
+return undefined;--this._size;delete this._map[key.__identifier];return result[1];},keys:function()
+{return this._list(0);},values:function()
+{return this._list(1);},_list:function(index)
+{var result=new Array(this._size);var i=0;for(var objectIdentifier in this._map)
+result[i++]=this._map[objectIdentifier][index];return result;},get:function(key)
+{var entry=this._map[key.__identifier];return entry?entry[1]:undefined;},contains:function(key)
+{var entry=this._map[key.__identifier];return!!entry;},size:function()
+{return this._size;},clear:function()
+{this._map={};this._size=0;}}
+var StringMap=function()
+{this._map={};this._size=0;}
+StringMap.prototype={put:function(key,value)
+{if(key==="__proto__"){if(!this._hasProtoKey){++this._size;this._hasProtoKey=true;}
+this._protoValue=value;return;}
+if(!Object.prototype.hasOwnProperty.call(this._map,key))
+++this._size;this._map[key]=value;},remove:function(key)
+{var result;if(key==="__proto__"){if(!this._hasProtoKey)
+return undefined;--this._size;delete this._hasProtoKey;result=this._protoValue;delete this._protoValue;return result;}
+if(!Object.prototype.hasOwnProperty.call(this._map,key))
+return undefined;--this._size;result=this._map[key];delete this._map[key];return result;},keys:function()
+{var result=Object.keys(this._map)||[];if(this._hasProtoKey)
+result.push("__proto__");return result;},values:function()
+{var result=Object.values(this._map);if(this._hasProtoKey)
+result.push(this._protoValue);return result;},get:function(key)
+{if(key==="__proto__")
+return this._protoValue;if(!Object.prototype.hasOwnProperty.call(this._map,key))
+return undefined;return this._map[key];},contains:function(key)
+{var result;if(key==="__proto__")
+return this._hasProtoKey;return Object.prototype.hasOwnProperty.call(this._map,key);},size:function()
+{return this._size;},clear:function()
+{this._map={};this._size=0;delete this._hasProtoKey;delete this._protoValue;}}
+var StringSet=function()
+{this._map=new StringMap();}
+StringSet.prototype={put:function(value)
+{this._map.put(value,true);},remove:function(value)
+{return!!this._map.remove(value);},values:function()
+{return this._map.keys();},contains:function(value)
+{return this._map.contains(value);},size:function()
+{return this._map.size();},clear:function()
+{this._map.clear();}}
+function loadXHR(url,async,callback)
+{function onReadyStateChanged()
+{if(xhr.readyState!==XMLHttpRequest.DONE)
+return;if(xhr.status===200){callback(xhr.responseText);return;}
+callback(null);}
+var xhr=new XMLHttpRequest();xhr.open("GET",url,async);if(async)
+xhr.onreadystatechange=onReadyStateChanged;xhr.send(null);if(!async){if(xhr.status===200)
+return xhr.responseText;return null;}
+return null;}
+var _importedScripts={};function importScript(scriptName)
+{if(_importedScripts[scriptName])
+return;var xhr=new XMLHttpRequest();_importedScripts[scriptName]=true;xhr.open("GET",scriptName,false);xhr.send(null);if(!xhr.responseText)
+throw"empty response arrived for script '"+scriptName+"'";var baseUrl=location.origin+location.pathname;baseUrl=baseUrl.substring(0,baseUrl.lastIndexOf("/"));var sourceURL=baseUrl+"/"+scriptName;self.eval(xhr.responseText+"\n//# sourceURL="+sourceURL);}
+var loadScript=importScript;function CallbackBarrier()
+{this._pendingIncomingCallbacksCount=0;}
+CallbackBarrier.prototype={createCallback:function(userCallback)
+{console.assert(!this._outgoingCallback,"CallbackBarrier.createCallback() is called after CallbackBarrier.callWhenDone()");++this._pendingIncomingCallbacksCount;return this._incomingCallback.bind(this,userCallback);},callWhenDone:function(callback)
+{console.assert(!this._outgoingCallback,"CallbackBarrier.callWhenDone() is called multiple times");this._outgoingCallback=callback;if(!this._pendingIncomingCallbacksCount)
+this._outgoingCallback();},_incomingCallback:function(userCallback)
+{console.assert(this._pendingIncomingCallbacksCount>0);if(userCallback){var args=Array.prototype.slice.call(arguments,1);userCallback.apply(null,args);}
+if(!--this._pendingIncomingCallbacksCount&&this._outgoingCallback)
+this._outgoingCallback();}}
+function suppressUnused(value)
+{};function postMessageWrapper(message)
+{postMessage(message);}
+var dispatcher=new WebInspector.HeapSnapshotWorkerDispatcher(this,postMessageWrapper);addEventListener("message",dispatcher.dispatchMessage.bind(dispatcher),false);
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/addIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/addIcon.png
new file mode 100644 (file)
index 0000000..f48f0ab
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/addIcon.png differ
index 50bad87..254fd5b 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/applicationCache.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/applicationCache.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/auditsIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/auditsIcon.png
deleted file mode 100644 (file)
index ebeafdc..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/auditsIcon.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 9363960..b1c0c19
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/back.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/back.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint.png
new file mode 100644 (file)
index 0000000..1eaea29
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointBorder.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointBorder.png
deleted file mode 100644 (file)
index 0b1b550..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointBorder.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional.png
new file mode 100644 (file)
index 0000000..8a22283
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalBorder.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalBorder.png
deleted file mode 100644 (file)
index 430e37e..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalBorder.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalCounterBorder.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalCounterBorder.png
deleted file mode 100644 (file)
index b4a5030..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditionalCounterBorder.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional_2x.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional_2x.png
new file mode 100644 (file)
index 0000000..851adfc
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointConditional_2x.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointCounterBorder.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointCounterBorder.png
deleted file mode 100644 (file)
index 8b77b61..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointCounterBorder.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint_2x.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint_2x.png
new file mode 100644 (file)
index 0000000..a227bac
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpoint_2x.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsActivateButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsActivateButtonGlyph.png
deleted file mode 100644 (file)
index ce49aac..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsActivateButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsDeactivateButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsDeactivateButtonGlyph.png
deleted file mode 100644 (file)
index 5c5fcf6..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/breakpointsDeactivateButtonGlyph.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 8349908..816a4ec
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/checker.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/checker.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/clearConsoleButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/clearConsoleButtonGlyph.png
deleted file mode 100755 (executable)
index b1f9465..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/clearConsoleButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/closeButtons.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/closeButtons.png
deleted file mode 100755 (executable)
index 28158a4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/closeButtons.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleButtonGlyph.png
deleted file mode 100755 (executable)
index d10d43c..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleIcon.png
deleted file mode 100644 (file)
index 94ffa95..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/consoleIcon.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 90c3c15..846db58
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/cookie.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/cookie.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 339efa6..39a8506
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/database.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/database.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 3718708..5508174
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/databaseTable.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/databaseTable.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerContinue.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerContinue.png
deleted file mode 100755 (executable)
index d90a855..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerContinue.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerPause.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerPause.png
deleted file mode 100755 (executable)
index 97f958a..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerPause.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepInto.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepInto.png
deleted file mode 100755 (executable)
index 277f126..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepInto.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOut.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOut.png
deleted file mode 100755 (executable)
index 3032e32..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOut.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOver.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOver.png
deleted file mode 100755 (executable)
index 7d47245..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/debuggerStepOver.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/deleteIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/deleteIcon.png
new file mode 100644 (file)
index 0000000..f0dd0db
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/deleteIcon.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDown.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDown.png
deleted file mode 100755 (executable)
index cffc835..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDown.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownBlack.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownBlack.png
deleted file mode 100755 (executable)
index 4b49c13..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownBlack.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownWhite.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownWhite.png
deleted file mode 100755 (executable)
index aebae12..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallDownWhite.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRight.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRight.png
deleted file mode 100755 (executable)
index a3102ea..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRight.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightBlack.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightBlack.png
deleted file mode 100755 (executable)
index 2c45859..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightBlack.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDown.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDown.png
deleted file mode 100755 (executable)
index 035c069..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDown.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png
deleted file mode 100755 (executable)
index 86f67bd..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownBlack.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png
deleted file mode 100755 (executable)
index 972d794..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightDownWhite.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightWhite.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightWhite.png
deleted file mode 100755 (executable)
index a10168f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/disclosureTriangleSmallRightWhite.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/dockButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/dockButtonGlyph.png
deleted file mode 100755 (executable)
index 7052f4b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/dockButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/domain.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/domain.png
new file mode 100644 (file)
index 0000000..68c75f3
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/domain.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/elementsIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/elementsIcon.png
deleted file mode 100755 (executable)
index fde3db9..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/elementsIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableOutlineButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableOutlineButtonGlyph.png
deleted file mode 100755 (executable)
index 85e0bd6..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableOutlineButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableSolidButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableSolidButtonGlyph.png
deleted file mode 100755 (executable)
index 25b2e96..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/enableSolidButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorIcon.png
deleted file mode 100755 (executable)
index c697263..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorMediumIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorMediumIcon.png
deleted file mode 100755 (executable)
index 6ca32bb..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorMediumIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorRedDot.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorRedDot.png
deleted file mode 100644 (file)
index 6f0b164..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/errorRedDot.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/excludeButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/excludeButtonGlyph.png
deleted file mode 100755 (executable)
index 5128576..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/excludeButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/fileSystem.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/fileSystem.png
new file mode 100644 (file)
index 0000000..f801ce6
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/fileSystem.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/focusButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/focusButtonGlyph.png
deleted file mode 100755 (executable)
index b71807c..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/focusButtonGlyph.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index ad70f3e..843392b
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/forward.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/forward.png differ
index 0d1953c..e17c829 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/frame.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/frame.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/gearButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/gearButtonGlyph.png
deleted file mode 100644 (file)
index 19659c9..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/gearButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeader.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeader.png
deleted file mode 100755 (executable)
index 6cbefb7..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeader.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderPressed.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderPressed.png
deleted file mode 100755 (executable)
index 1153506..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderPressed.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelected.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelected.png
deleted file mode 100755 (executable)
index 71d5af6..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelected.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelectedPressed.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelectedPressed.png
deleted file mode 100755 (executable)
index 7047dbe..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/glossyHeaderSelectedPressed.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/goArrow.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/goArrow.png
deleted file mode 100755 (executable)
index f318a56..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/goArrow.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 6426dbd..29fc042
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/graphLabelCalloutLeft.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/graphLabelCalloutLeft.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 8c87eae..6c56a2b
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/graphLabelCalloutRight.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/graphLabelCalloutRight.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDB.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDB.png
new file mode 100644 (file)
index 0000000..d9b3c02
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDB.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBIndex.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBIndex.png
new file mode 100644 (file)
index 0000000..b58959c
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBIndex.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBObjectStore.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBObjectStore.png
new file mode 100644 (file)
index 0000000..ce2396b
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/indexedDBObjectStore.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/largerResourcesButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/largerResourcesButtonGlyph.png
deleted file mode 100755 (executable)
index 71256d6..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/largerResourcesButtonGlyph.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 44a3019..003ac5d
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/localStorage.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/localStorage.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls.png
new file mode 100644 (file)
index 0000000..c314171
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls_2x.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls_2x.png
new file mode 100644 (file)
index 0000000..ae3f51f
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/navigationControls_2x.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/networkIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/networkIcon.png
deleted file mode 100644 (file)
index ba10bba..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/networkIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/nodeSearchButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/nodeSearchButtonGlyph.png
deleted file mode 100755 (executable)
index faf5df2..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/nodeSearchButtonGlyph.png and /dev/null differ
index f1c0047..ff25b0f 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneAddButtons.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneAddButtons.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrow.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrow.png
deleted file mode 100755 (executable)
index d55b865..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrow.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrowActive.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrowActive.png
deleted file mode 100755 (executable)
index ef3f259..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneBottomGrowActive.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneElementStateButtons.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneElementStateButtons.png
new file mode 100644 (file)
index 0000000..af8dac0
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneElementStateButtons.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneFilterButtons.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneFilterButtons.png
new file mode 100644 (file)
index 0000000..6c52820
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneFilterButtons.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneGrowHandleLine.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneGrowHandleLine.png
deleted file mode 100755 (executable)
index 4eaf61b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneGrowHandleLine.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneRefreshButtons.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneRefreshButtons.png
new file mode 100644 (file)
index 0000000..92ff209
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneRefreshButtons.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 36a6244..cb4f090
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneSettingsButtons.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/paneSettingsButtons.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/pauseOnExceptionButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/pauseOnExceptionButtonGlyph.png
deleted file mode 100755 (executable)
index c3cec5f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/pauseOnExceptionButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/percentButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/percentButtonGlyph.png
deleted file mode 100755 (executable)
index 0ace3b7..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/percentButtonGlyph.png and /dev/null differ
index ccefa16..8b98caf 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/popoverArrows.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/popoverArrows.png differ
index f20c988..5ebac2b 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/popoverBackground.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/popoverBackground.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 44616d4..ff78cb4
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileGroupIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileGroupIcon.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 8008f9b..c0c4600
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileIcon.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 7935520..e5c4ad5
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileSmallIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profileSmallIcon.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesIcon.png
deleted file mode 100755 (executable)
index ecd5b04..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesSilhouette.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesSilhouette.png
deleted file mode 100755 (executable)
index 42bb966..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/profilesSilhouette.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/programCounterBorder.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/programCounterBorder.png
deleted file mode 100644 (file)
index fed2f3e..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/programCounterBorder.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 609878f..5d50890
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/radioDot.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/radioDot.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordButtonGlyph.png
deleted file mode 100755 (executable)
index bfdad1a..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordToggledButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordToggledButtonGlyph.png
deleted file mode 100755 (executable)
index 2c22f87..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/recordToggledButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/reloadButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/reloadButtonGlyph.png
deleted file mode 100755 (executable)
index 28e047a..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/reloadButtonGlyph.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index aead6a7..18828d0
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceCSSIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceCSSIcon.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 1683a09..fdc10e4
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceDocumentIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceDocumentIcon.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 468ced9..64d9735
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceDocumentIconSmall.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceDocumentIconSmall.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 9ef6ed0..c1b7218
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceJSIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourceJSIcon.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 0ed37b6..8c82a4c
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcePlainIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcePlainIcon.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 0fa967d..0349c0d
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcePlainIconSmall.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcePlainIconSmall.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesIcon.png
deleted file mode 100755 (executable)
index 982424d..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesSizeGraphIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesSizeGraphIcon.png
deleted file mode 100755 (executable)
index e60dbe5..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesSizeGraphIcon.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index c6953e9..87de550
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesTimeGraphIcon.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/resourcesTimeGraphIcon.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsIcon.png
deleted file mode 100755 (executable)
index 213b31e..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsSilhouette.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsSilhouette.png
deleted file mode 100755 (executable)
index 206396f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/scriptsSilhouette.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchNext.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchNext.png
new file mode 100644 (file)
index 0000000..69e519e
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchNext.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchPrev.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchPrev.png
new file mode 100644 (file)
index 0000000..733d40b
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchPrev.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBlue.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBlue.png
deleted file mode 100755 (executable)
index 9c990f4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBlue.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBrightBlue.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBrightBlue.png
deleted file mode 100755 (executable)
index b1d8055..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallBrightBlue.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallGray.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallGray.png
deleted file mode 100755 (executable)
index 4f3c068..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallGray.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallWhite.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallWhite.png
deleted file mode 100755 (executable)
index 85f430d..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/searchSmallWhite.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segment.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segment.png
deleted file mode 100755 (executable)
index 759266e..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segment.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentChromium.png
deleted file mode 100755 (executable)
index f4248e1..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentEnd.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentEnd.png
deleted file mode 100755 (executable)
index 72672ff..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentEnd.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHover.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHover.png
deleted file mode 100755 (executable)
index c5017f4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHover.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverChromium.png
deleted file mode 100755 (executable)
index 0a743d9..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEnd.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEnd.png
deleted file mode 100755 (executable)
index d51363d..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEnd.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEndChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEndChromium.png
deleted file mode 100755 (executable)
index cf62072..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentHoverEndChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelected.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelected.png
deleted file mode 100755 (executable)
index c92f584..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelected.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedChromium.png
deleted file mode 100755 (executable)
index a1f7251..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEnd.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEnd.png
deleted file mode 100755 (executable)
index be5e085..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEnd.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEndChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEndChromium.png
deleted file mode 100755 (executable)
index 07641db..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/segmentSelectedEndChromium.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 4d50e35..732536f
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/sessionStorage.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/sessionStorage.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove.png
new file mode 100644 (file)
index 0000000..1c30a87
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove_2x.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove_2x.png
new file mode 100644 (file)
index 0000000..c5ff088
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/settingsListRemove_2x.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/spinner.gif b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/spinner.gif
deleted file mode 100644 (file)
index 5f68c02..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/spinner.gif and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDimple.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDimple.png
deleted file mode 100755 (executable)
index 584ffd4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDimple.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDividerBackground.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDividerBackground.png
deleted file mode 100755 (executable)
index 1120a7f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/splitviewDividerBackground.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackground.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackground.png
deleted file mode 100755 (executable)
index b466a49..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackground.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackgroundChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackgroundChromium.png
deleted file mode 100755 (executable)
index 7a760c1..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBackgroundChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackground.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackground.png
deleted file mode 100755 (executable)
index fb5c9e4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackground.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackgroundChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackgroundChromium.png
deleted file mode 100755 (executable)
index e3bc944..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarBottomBackgroundChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs.png
new file mode 100644 (file)
index 0000000..ad200ed
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs_2x.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs_2x.png
new file mode 100644 (file)
index 0000000..9c3bc9b
Binary files /dev/null and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonGlyphs_2x.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtons.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtons.png
deleted file mode 100755 (executable)
index e8090cb..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtons.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonsChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonsChromium.png
deleted file mode 100755 (executable)
index 136d5a8..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarButtonsChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButton.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButton.png
deleted file mode 100755 (executable)
index 9b3abdd..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButton.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonChromium.png
deleted file mode 100755 (executable)
index 5ff61d9..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonChromium.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelected.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelected.png
deleted file mode 100755 (executable)
index 8189c43..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelected.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelectedChromium.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelectedChromium.png
deleted file mode 100755 (executable)
index 3c0aeec..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarMenuButtonSelectedChromium.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index 56deeab..674b895
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarResizerHorizontal.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarResizerHorizontal.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 7fc1452..bf84d1e
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarResizerVertical.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/statusbarResizerVertical.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/successGreenDot.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/successGreenDot.png
deleted file mode 100644 (file)
index 8b9319c..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/successGreenDot.png and /dev/null differ
index a6ee561..492c53f 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbActiveHoriz.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbActiveHoriz.png differ
index a3eabe8..96d0745 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbActiveVert.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbActiveVert.png differ
index c16559a..caed321 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoriz.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoriz.png differ
index 0fe8d6a..6942e23 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoverHoriz.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoverHoriz.png differ
index 30e315a..125bf79 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoverVert.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbHoverVert.png differ
index 61fbc06..b90e94a 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbVert.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/thumbVert.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarBlue.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarBlue.png
deleted file mode 100644 (file)
index 22641b5..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarBlue.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGray.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGray.png
deleted file mode 100644 (file)
index f66cf43..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGray.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGreen.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGreen.png
deleted file mode 100644 (file)
index cc59082..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarGreen.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarOrange.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarOrange.png
deleted file mode 100644 (file)
index e5ae6f5..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarOrange.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarPurple.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarPurple.png
deleted file mode 100644 (file)
index f891252..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarPurple.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarRed.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarRed.png
deleted file mode 100644 (file)
index b850037..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarRed.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarYellow.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarYellow.png
deleted file mode 100644 (file)
index 2b3e9a7..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineBarYellow.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineCheckmarks.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineCheckmarks.png
deleted file mode 100644 (file)
index 9afa9bb..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineCheckmarks.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineDots.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineDots.png
deleted file mode 100644 (file)
index e9ba4d3..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineDots.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillOrange.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillOrange.png
deleted file mode 100755 (executable)
index 08a81e4..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillOrange.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillPurple.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillPurple.png
deleted file mode 100755 (executable)
index 565a05c..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillPurple.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillRed.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillRed.png
deleted file mode 100755 (executable)
index c3a1b9b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillRed.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillYellow.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillYellow.png
deleted file mode 100755 (executable)
index 780045b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineHollowPillYellow.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineIcon.png
deleted file mode 100755 (executable)
index 09bcf30..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelineIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillBlue.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillBlue.png
deleted file mode 100755 (executable)
index c897faa..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillBlue.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGray.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGray.png
deleted file mode 100755 (executable)
index 2128896..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGray.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGreen.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGreen.png
deleted file mode 100755 (executable)
index 9b66125..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillGreen.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillOrange.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillOrange.png
deleted file mode 100755 (executable)
index dd944fb..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillOrange.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillPurple.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillPurple.png
deleted file mode 100755 (executable)
index 21b96f7..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillPurple.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillRed.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillRed.png
deleted file mode 100755 (executable)
index f5e213b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillRed.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillYellow.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillYellow.png
deleted file mode 100755 (executable)
index ae2a5a2..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/timelinePillYellow.png and /dev/null differ
old mode 100755 (executable)
new mode 100644 (file)
index bd681f1..505daf2
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/toolbarItemSelected.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/toolbarItemSelected.png differ
index 517d306..d5356d3 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/trackHoriz.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/trackHoriz.png differ
index d49620d..e9eddfb 100644 (file)
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/trackVert.png and b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/trackVert.png differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleBlack.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleBlack.png
deleted file mode 100755 (executable)
index 0821112..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleBlack.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleWhite.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleWhite.png
deleted file mode 100755 (executable)
index 1667b51..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeDownTriangleWhite.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleBlack.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleBlack.png
deleted file mode 100755 (executable)
index 90de820..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleBlack.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleWhite.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleWhite.png
deleted file mode 100755 (executable)
index 2b6a82f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeRightTriangleWhite.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleBlack.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleBlack.png
deleted file mode 100755 (executable)
index ef69dbc..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleBlack.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleWhite.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleWhite.png
deleted file mode 100755 (executable)
index 43ce4be..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/treeUpTriangleWhite.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/undockButtonGlyph.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/undockButtonGlyph.png
deleted file mode 100755 (executable)
index eed2b65..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/undockButtonGlyph.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputIcon.png
deleted file mode 100755 (executable)
index 325023f..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputPreviousIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputPreviousIcon.png
deleted file mode 100755 (executable)
index 068d572..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputPreviousIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputResultIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputResultIcon.png
deleted file mode 100755 (executable)
index 794a5ca..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/userInputResultIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningIcon.png
deleted file mode 100755 (executable)
index d5e4c82..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningMediumIcon.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningMediumIcon.png
deleted file mode 100755 (executable)
index 291e111..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningMediumIcon.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningOrangeDot.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningOrangeDot.png
deleted file mode 100644 (file)
index 8c8b635..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningOrangeDot.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningsErrors.png b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningsErrors.png
deleted file mode 100755 (executable)
index 878b593..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Images/warningsErrors.png and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/LayersPanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/LayersPanel.js
new file mode 100644 (file)
index 0000000..b22ebe8
--- /dev/null
@@ -0,0 +1,188 @@
+WebInspector.LayerTree=function(model,treeOutline)
+{WebInspector.Object.call(this);this._model=model;this._treeOutline=treeOutline;this._treeOutline.childrenListElement.addEventListener("mousemove",this._onMouseMove.bind(this),false);this._treeOutline.childrenListElement.addEventListener("mouseout",this._onMouseMove.bind(this),false);this._treeOutline.childrenListElement.addEventListener("contextmenu",this._onContextMenu.bind(this),true);this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged,this._update.bind(this));this._lastHoveredNode=null;}
+WebInspector.LayerTree.Events={LayerHovered:"LayerHovered",LayerSelected:"LayerSelected"}
+WebInspector.LayerTree.prototype={selectLayer:function(layer)
+{this.hoverLayer(null);var node=layer&&this._treeOutline.getCachedTreeElement(layer);if(node)
+node.revealAndSelect(true);else if(this._treeOutline.selectedTreeElement)
+this._treeOutline.selectedTreeElement.deselect();},hoverLayer:function(layer)
+{var node=layer&&this._treeOutline.getCachedTreeElement(layer);if(node===this._lastHoveredNode)
+return;if(this._lastHoveredNode)
+this._lastHoveredNode.setHovered(false);if(node)
+node.setHovered(true);this._lastHoveredNode=node;},_update:function()
+{var seenLayers={};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===this._model.contentRoot()?this._treeOutline:this._treeOutline.getCachedTreeElement(layer.parent());if(!parent)
+console.assert(false,"Parent is not in the tree");if(!node){node=new WebInspector.LayerTreeElement(this,layer);parent.appendChild(node);}else{if(node.parent!==parent){node.parent.removeChild(node);parent.appendChild(node);}
+node._update();}}
+if(this._model.contentRoot())
+this._model.forEachLayer(updateLayer.bind(this),this._model.contentRoot());for(var node=(this._treeOutline.children[0]);node&&!node.root;){if(seenLayers[node.representedObject.id()]){node=node.traverseNextTreeElement(false);}else{var nextNode=node.nextSibling||node.parent;node.parent.removeChild(node);if(node===this._lastHoveredNode)
+this._lastHoveredNode=null;node=nextNode;}}},_onMouseMove:function(event)
+{var node=this._treeOutline.treeElementFromPoint(event.pageX,event.pageY);if(node===this._lastHoveredNode)
+return;this.dispatchEventToListeners(WebInspector.LayerTree.Events.LayerHovered,node&&node.representedObject);},_selectedNodeChanged:function(node)
+{var layer=(node.representedObject);this.dispatchEventToListeners(WebInspector.LayerTree.Events.LayerSelected,layer);},_onContextMenu:function(event)
+{var node=this._treeOutline.treeElementFromPoint(event.pageX,event.pageY);if(!node||!node.representedObject)
+return;var layer=(node.representedObject);if(!layer)
+return;var nodeId=layer.nodeIdForSelfOrAncestor();if(!nodeId)
+return;var domNode=WebInspector.domModel.nodeForId(nodeId);if(!domNode)
+return;var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(domNode);contextMenu.show();},__proto__:WebInspector.Object.prototype}
+WebInspector.LayerTreeElement=function(tree,layer)
+{TreeElement.call(this,"",layer);this._layerTree=tree;this._update();}
+WebInspector.LayerTreeElement.prototype={onattach:function()
+{var selection=document.createElement("div");selection.className="selection";this.listItemElement.insertBefore(selection,this.listItemElement.firstChild);},_update:function()
+{var layer=(this.representedObject);var nodeId=layer.nodeIdForSelfOrAncestor();var node=nodeId?WebInspector.domModel.nodeForId(nodeId):null;var title=document.createDocumentFragment();title.createChild("div","selection");title.appendChild(document.createTextNode(node?WebInspector.DOMPresentationUtils.simpleSelector(node):"#"+layer.id()));var details=title.createChild("span","dimmed");details.textContent=WebInspector.UIString(" (%d × %d)",layer.width(),layer.height());this.title=title;},onselect:function()
+{this._layerTree._selectedNodeChanged(this);return false;},setHovered:function(hovered)
+{this.listItemElement.classList.toggle("hovered",hovered);},__proto__:TreeElement.prototype};WebInspector.Layers3DView=function(model)
+{WebInspector.VBox.call(this);this.element.classList.add("layers-3d-view");this._emptyView=new WebInspector.EmptyView(WebInspector.UIString("Not in the composited mode.\nConsider forcing composited mode in Settings."));this._model=model;this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged,this._update,this);this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerPainted,this._onLayerPainted,this);this._rotatingContainerElement=this.element.createChild("div","fill rotating-container");this._transformController=new WebInspector.TransformController(this.element);this._transformController.addEventListener(WebInspector.TransformController.Events.TransformChanged,this._onTransformChanged,this);this.element.addEventListener("dblclick",this._onDoubleClick.bind(this),false);this.element.addEventListener("click",this._onClick.bind(this),false);this.element.addEventListener("mouseout",this._onMouseMove.bind(this),false);this.element.addEventListener("mousemove",this._onMouseMove.bind(this),false);this.element.addEventListener("contextmenu",this._onContextMenu.bind(this),false);this._elementsByLayerId={};this._scaleAdjustmentStylesheet=this.element.ownerDocument.head.createChild("style");this._scaleAdjustmentStylesheet.disabled=true;this._lastOutlinedElement={};this._layerImage=document.createElement("img");this._layerImage.style.width="100%";this._layerImage.style.height="100%";WebInspector.settings.showPaintRects.addChangeListener(this._update,this);}
+WebInspector.Layers3DView.OutlineType={Hovered:"hovered",Selected:"selected"}
+WebInspector.Layers3DView.Events={LayerHovered:"LayerHovered",LayerSelected:"LayerSelected",LayerSnapshotRequested:"LayerSnapshotRequested"}
+WebInspector.Layers3DView.PaintRectColors=[WebInspector.Color.fromRGBA([0,0x5F,0,0x3F]),WebInspector.Color.fromRGBA([0,0xAF,0,0x3F]),WebInspector.Color.fromRGBA([0,0xFF,0,0x3F])]
+WebInspector.Layers3DView.ScrollRectTitles={RepaintsOnScroll:WebInspector.UIString("repaints on scroll"),TouchEventHandler:WebInspector.UIString("touch event listener"),WheelEventHandler:WebInspector.UIString("mousewheel event listener")}
+WebInspector.Layers3DView.prototype={onResize:function()
+{this._update();},willHide:function()
+{this._scaleAdjustmentStylesheet.disabled=true;},wasShown:function()
+{this._scaleAdjustmentStylesheet.disabled=false;if(this._needsUpdate)
+this._update();},_setOutline:function(type,layer)
+{var element=layer?this._elementForLayer(layer):null;var previousElement=this._lastOutlinedElement[type];if(previousElement===element)
+return;this._lastOutlinedElement[type]=element;if(previousElement){previousElement.classList.remove(type);this._updateElementColor(previousElement);}
+if(element){element.classList.add(type);this._updateElementColor(element);}},hoverLayer:function(layer)
+{this._setOutline(WebInspector.Layers3DView.OutlineType.Hovered,layer);},selectLayer:function(layer)
+{this._setOutline(WebInspector.Layers3DView.OutlineType.Hovered,null);this._setOutline(WebInspector.Layers3DView.OutlineType.Selected,layer);},showImageForLayer:function(layer,imageURL)
+{var element=this._elementForLayer(layer);this._layerImage.removeAttribute("src");if(imageURL)
+this._layerImage.src=imageURL;element.appendChild(this._layerImage);},_scaleToFit:function()
+{var root=this._model.contentRoot();if(!root)
+return;const padding=40;var scaleX=this._clientWidth/(root.width()+2*padding);var scaleY=this._clientHeight/(root.height()+2*padding);var autoScale=Math.min(scaleX,scaleY);this._scale=autoScale*this._transformController.scale();this._paddingX=((this._clientWidth/autoScale-root.width())>>1)*this._scale;this._paddingY=((this._clientHeight/autoScale-root.height())>>1)*this._scale;const screenLayerSpacing=20;this._layerSpacing=screenLayerSpacing+"px";const screenLayerThickness=4;var layerThickness=screenLayerThickness+"px";var stylesheetContent=".layer-container .side-wall { height: "+layerThickness+"; width: "+layerThickness+"; } "+".layer-container .back-wall { -webkit-transform: translateZ(-"+layerThickness+"); } "+".layer-container { -webkit-transform: translateZ("+this._layerSpacing+"); }";var stylesheetTextNode=this._scaleAdjustmentStylesheet.firstChild;if(!stylesheetTextNode||stylesheetTextNode.nodeType!==Node.TEXT_NODE||stylesheetTextNode.nextSibling)
+this._scaleAdjustmentStylesheet.textContent=stylesheetContent;else
+stylesheetTextNode.nodeValue=stylesheetContent;var style=this._elementForLayer(root).style;style.left=Math.round(this._paddingX)+"px";style.top=Math.round(this._paddingY)+"px";style.webkitTransformOrigin="";},_onTransformChanged:function(event)
+{var changedTransforms=(event.data);if(changedTransforms&WebInspector.TransformController.TransformType.Scale)
+this._update();else
+this._updateTransform();},_updateTransform:function()
+{var root=this._model.contentRoot();if(!root)
+return;var offsetX=this._transformController.offsetX();var offsetY=this._transformController.offsetY();var style=this._rotatingContainerElement.style;style.webkitTransform="translateZ(10000px)"+" rotateX("+this._transformController.rotateX()+"deg) rotateY("+this._transformController.rotateY()+"deg)"+" translateX("+offsetX+"px) translateY("+offsetY+"px)";style.webkitTransformOrigin=Math.round(this._paddingX+offsetX+root.width()*this._scale/2)+"px "+Math.round(this._paddingY+offsetY+root.height()*this._scale/2)+"px";},_createScrollRectElement:function(layer)
+{var element=document.createElement("div");var parentLayerElement=this._elementsByLayerId[layer.id()];element.className="scroll-rect";parentLayerElement.appendChild(element);return element;},_updateScrollRectElement:function(rect,element)
+{var style=element.style;style.width=Math.round(rect.rect.width*this._scale)+"px";style.height=Math.round(rect.rect.height*this._scale)+"px";style.left=Math.round(rect.rect.x*this._scale)+"px";style.top=Math.round(rect.rect.y*this._scale)+"px";element.title=WebInspector.Layers3DView.ScrollRectTitles[rect.type];},_updateScrollRectsForLayer:function(layer)
+{var layerDetails=this._elementsByLayerId[layer.id()].__layerDetails;function removeElement(element)
+{element.remove()}
+if(layer.scrollRects().length!==layerDetails.scrollRectElements.length){layerDetails.scrollRectElements.forEach(removeElement);layerDetails.scrollRectElements=layer.scrollRects().map(this._createScrollRectElement.bind(this,layer));}
+for(var i=0;i<layer.scrollRects().length;++i)
+this._updateScrollRectElement(layer.scrollRects()[i],layerDetails.scrollRectElements[i]);},_update:function()
+{if(!this.isShowing()){this._needsUpdate=true;return;}
+if(!this._model.contentRoot()){this._emptyView.show(this.element);this._rotatingContainerElement.removeChildren();return;}
+this._emptyView.detach();function updateLayer(layer)
+{this._updateLayerElement(this._elementForLayer(layer));this._updateScrollRectsForLayer(layer);}
+this._clientWidth=this.element.clientWidth;this._clientHeight=this.element.clientHeight;for(var layerId in this._elementsByLayerId){if(this._model.layerById(layerId))
+continue;this._elementsByLayerId[layerId].remove();delete this._elementsByLayerId[layerId];}
+this._scaleToFit();this._updateTransform();this._model.forEachLayer(updateLayer.bind(this));this._needsUpdate=false;},_onLayerPainted:function(event)
+{var layer=(event.data);this._updatePaintRect(this._elementForLayer(layer));},_elementForLayer:function(layer)
+{var element=this._elementsByLayerId[layer.id()];if(element){element.__layerDetails.layer=layer;return element;}
+element=document.createElement("div");element.__layerDetails=new WebInspector.LayerDetails(layer,element.createChild("div","paint-rect"));["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;},_updateLayerElement:function(element)
+{var layer=element.__layerDetails.layer;var style=element.style;var contentRoot=(this._model.contentRoot());var isContentRoot=layer===contentRoot;var isRoot=layer===this._model.root();var parentElement;if(isContentRoot){parentElement=this._rotatingContainerElement;element.__layerDetails.depth=0;}else if(isRoot){parentElement=this._elementForLayer(contentRoot);element.__layerDetails.depth=undefined;}else{parentElement=this._elementForLayer(layer.parent());element.__layerDetails.depth=parentElement.__layerDetails.isAboveContentRoot()?undefined:parentElement.__layerDetails.depth+1;}
+if(!element.__layerDetails.isAboveContentRoot())
+element.className="layer-container";else
+element.className="layer-transparent";element.classList.toggle("invisible",layer.invisible());this._updateElementColor(element);if(parentElement!==element.parentElement)
+parentElement.appendChild(element);style.width=Math.round(layer.width()*this._scale)+"px";style.height=Math.round(layer.height()*this._scale)+"px";this._updatePaintRect(element);if(isContentRoot||isRoot)
+return;style.left=Math.round(layer.offsetX()*this._scale)+"px";style.top=Math.round(layer.offsetY()*this._scale)+"px";var transform=layer.transform();if(transform){transform=transform.slice();for(var i=12;i<15;++i)
+transform[i]*=this._scale;style.webkitTransform="matrix3d("+transform.map(toFixed5).join(",")+") translateZ("+this._layerSpacing+")";var anchor=layer.anchorPoint();style.webkitTransformOrigin=Math.round(anchor[0]*100)+"% "+Math.round(anchor[1]*100)+"% "+anchor[2];}else{style.webkitTransform="";style.webkitTransformOrigin="";}
+function toFixed5(x)
+{return x.toFixed(5);}},_updatePaintRect:function(element)
+{var details=element.__layerDetails;var paintRect=details.layer.lastPaintRect();var paintRectElement=details.paintRectElement;if(!paintRect||!WebInspector.settings.showPaintRects.get()){paintRectElement.classList.add("hidden");return;}
+paintRectElement.classList.remove("hidden");if(details.paintCount===details.layer.paintCount())
+return;details.paintCount=details.layer.paintCount();var style=paintRectElement.style;style.left=Math.round(paintRect.x*this._scale)+"px";style.top=Math.round(paintRect.y*this._scale)+"px";style.width=Math.round(paintRect.width*this._scale)+"px";style.height=Math.round(paintRect.height*this._scale)+"px";var color=WebInspector.Layers3DView.PaintRectColors[details.paintCount%WebInspector.Layers3DView.PaintRectColors.length];style.borderWidth=Math.ceil(1/this._scale)+"px";style.borderColor=color.toString(WebInspector.Color.Format.RGBA);},_updateElementColor:function(element)
+{var color;if(element===this._lastOutlinedElement[WebInspector.Layers3DView.OutlineType.Selected])
+color=WebInspector.Color.PageHighlight.Content.toString(WebInspector.Color.Format.RGBA)||"";else{const base=144;var component=base+20*((element.__layerDetails.depth-1)%5);color="rgba("+component+","+component+","+component+", 0.8)";}
+element.style.backgroundColor=color;},_layerFromEventPoint:function(event)
+{var element=this.element.ownerDocument.elementFromPoint(event.pageX,event.pageY);if(!element)
+return null;element=element.enclosingNodeOrSelfWithClass("layer-container");return element&&element.__layerDetails&&element.__layerDetails.layer;},_onContextMenu:function(event)
+{var layer=this._layerFromEventPoint(event);var nodeId=layer&&layer.nodeIdForSelfOrAncestor();if(!nodeId)
+return;var domNode=WebInspector.domModel.nodeForId(nodeId);if(!domNode)
+return;var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(domNode);contextMenu.show();},_onMouseMove:function(event)
+{if(event.which)
+return;this.dispatchEventToListeners(WebInspector.Layers3DView.Events.LayerHovered,this._layerFromEventPoint(event));},_onClick:function(event)
+{this.dispatchEventToListeners(WebInspector.Layers3DView.Events.LayerSelected,this._layerFromEventPoint(event));},_onDoubleClick:function(event)
+{var layer=this._layerFromEventPoint(event);if(layer)
+this.dispatchEventToListeners(WebInspector.Layers3DView.Events.LayerSnapshotRequested,layer);event.stopPropagation();},__proto__:WebInspector.VBox.prototype}
+WebInspector.LayerDetails=function(layer,paintRectElement)
+{this.layer=layer;this.depth=0;this.paintRectElement=paintRectElement;this.paintCount=0;this.scrollRectElements=[];}
+WebInspector.LayerDetails.prototype={isAboveContentRoot:function()
+{return this.depth===undefined;}};WebInspector.LayerDetailsView=function(model)
+{WebInspector.VBox.call(this);this.element.classList.add("layer-details-view");this._emptyView=new WebInspector.EmptyView(WebInspector.UIString("Select a layer to see its details"));this._createTable();this._model=model;this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged,this._onLayerTreeUpdated,this);this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerPainted,this._onLayerPainted,this);}
+WebInspector.LayerDetailsView.CompositingReasonDetail={"transform3D":WebInspector.UIString("Composition due to association with an element with a CSS 3D transform."),"video":WebInspector.UIString("Composition due to association with a <video> element."),"canvas":WebInspector.UIString("Composition due to the element being a <canvas> element."),"plugin":WebInspector.UIString("Composition due to association with a plugin."),"iFrame":WebInspector.UIString("Composition due to association with an <iframe> element."),"backfaceVisibilityHidden":WebInspector.UIString("Composition due to association with an element with a \"backface-visibility: hidden\" style."),"animation":WebInspector.UIString("Composition due to association with an animated element."),"filters":WebInspector.UIString("Composition due to association with an element with CSS filters applied."),"positionFixed":WebInspector.UIString("Composition due to association with an element with a \"position: fixed\" style."),"positionSticky":WebInspector.UIString("Composition due to association with an element with a \"position: sticky\" style."),"overflowScrollingTouch":WebInspector.UIString("Composition due to association with an element with a \"overflow-scrolling: touch\" style."),"blending":WebInspector.UIString("Composition due to association with an element that has blend mode other than \"normal\"."),"assumedOverlap":WebInspector.UIString("Composition due to association with an element that may overlap other composited elements."),"overlap":WebInspector.UIString("Composition due to association with an element overlapping other composited elements."),"negativeZIndexChildren":WebInspector.UIString("Composition due to association with an element with descendants that have a negative z-index."),"transformWithCompositedDescendants":WebInspector.UIString("Composition due to association with an element with composited descendants."),"opacityWithCompositedDescendants":WebInspector.UIString("Composition due to association with an element with opacity applied and composited descendants."),"maskWithCompositedDescendants":WebInspector.UIString("Composition due to association with a masked element and composited descendants."),"reflectionWithCompositedDescendants":WebInspector.UIString("Composition due to association with an element with a reflection and composited descendants."),"filterWithCompositedDescendants":WebInspector.UIString("Composition due to association with an element with CSS filters applied and composited descendants."),"blendingWithCompositedDescendants":WebInspector.UIString("Composition due to association with an element with CSS blending applied and composited descendants."),"clipsCompositingDescendants":WebInspector.UIString("Composition due to association with an element clipping compositing descendants."),"perspective":WebInspector.UIString("Composition due to association with an element with perspective applied."),"preserve3D":WebInspector.UIString("Composition due to association with an element with a \"transform-style: preserve-3d\" style."),"root":WebInspector.UIString("Root layer."),"layerForClip":WebInspector.UIString("Layer for clip."),"layerForScrollbar":WebInspector.UIString("Layer for scrollbar."),"layerForScrollingContainer":WebInspector.UIString("Layer for scrolling container."),"layerForForeground":WebInspector.UIString("Layer for foreground."),"layerForBackground":WebInspector.UIString("Layer for background."),"layerForMask":WebInspector.UIString("Layer for mask."),"layerForVideoOverlay":WebInspector.UIString("Layer for video overlay.")};WebInspector.LayerDetailsView.prototype={setLayer:function(layer)
+{this._layer=layer;if(this.isShowing())
+this._update();},wasShown:function()
+{WebInspector.View.prototype.wasShown.call(this);this._update();},_onLayerTreeUpdated:function()
+{if(this.isShowing())
+this._update();},_onLayerPainted:function(event)
+{var layer=(event.data);if(this._layer===layer)
+this._paintCountCell.textContent=layer.paintCount();},_update:function()
+{if(!this._layer){this._tableElement.remove();this._emptyView.show(this.element);return;}
+this._emptyView.detach();this.element.appendChild(this._tableElement);this._positionCell.textContent=WebInspector.UIString("%d,%d",this._layer.offsetX(),this._layer.offsetY());this._sizeCell.textContent=WebInspector.UIString("%d × %d",this._layer.width(),this._layer.height());this._paintCountCell.textContent=this._layer.paintCount();const bytesPerPixel=4;this._memoryEstimateCell.textContent=Number.bytesToString(this._layer.invisible()?0:this._layer.width()*this._layer.height()*bytesPerPixel);this._layer.requestCompositingReasons(this._updateCompositingReasons.bind(this));},_createTable:function()
+{this._tableElement=this.element.createChild("table");this._tbodyElement=this._tableElement.createChild("tbody");this._positionCell=this._createRow(WebInspector.UIString("Position in parent:"));this._sizeCell=this._createRow(WebInspector.UIString("Size:"));this._compositingReasonsCell=this._createRow(WebInspector.UIString("Compositing Reasons:"));this._memoryEstimateCell=this._createRow(WebInspector.UIString("Memory estimate:"));this._paintCountCell=this._createRow(WebInspector.UIString("Paint count:"));},_createRow:function(title)
+{var tr=this._tbodyElement.createChild("tr");var titleCell=tr.createChild("td");titleCell.textContent=title;return tr.createChild("td");},_updateCompositingReasons:function(compositingReasons)
+{if(!compositingReasons||!compositingReasons.length){this._compositingReasonsCell.textContent="n/a";return;}
+var fragment=document.createDocumentFragment();for(var i=0;i<compositingReasons.length;++i){if(i)
+fragment.appendChild(document.createTextNode(","));var span=document.createElement("span");span.title=WebInspector.LayerDetailsView.CompositingReasonDetail[compositingReasons[i]]||"";span.textContent=compositingReasons[i];fragment.appendChild(span);}
+this._compositingReasonsCell.removeChildren();this._compositingReasonsCell.appendChild(fragment);},__proto__:WebInspector.VBox.prototype};WebInspector.PaintProfilerView=function(model,layers3DView)
+{WebInspector.VBox.call(this);this.element.classList.add("paint-profiler-view");this._model=model;this._layers3DView=layers3DView;this._canvas=this.element.createChild("canvas","fill");this._context=this._canvas.getContext("2d");this._selectionWindow=new WebInspector.OverviewGrid.Window(this.element,this.element);this._selectionWindow.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged,this._onWindowChanged,this);this._innerBarWidth=4*window.devicePixelRatio;this._minBarHeight=4*window.devicePixelRatio;this._barPaddingWidth=2*window.devicePixelRatio;this._outerBarWidth=this._innerBarWidth+this._barPaddingWidth;this._reset();}
+WebInspector.PaintProfilerView.prototype={onResize:function()
+{this._update();},_update:function()
+{this._canvas.width=this.element.clientWidth*window.devicePixelRatio;this._canvas.height=this.element.clientHeight*window.devicePixelRatio;this._samplesPerBar=0;if(!this._profiles||!this._profiles.length)
+return;var maxBars=Math.floor((this._canvas.width-2*this._barPaddingWidth)/this._outerBarWidth);var sampleCount=this._profiles[0].length;this._samplesPerBar=Math.ceil(sampleCount/maxBars);var barCount=Math.floor(sampleCount/this._samplesPerBar);var maxBarTime=0;var barTimes=[];for(var i=0,lastBarIndex=0,lastBarTime=0;i<sampleCount;){for(var row=0;row<this._profiles.length;row++)
+lastBarTime+=this._profiles[row][i];++i;if(i-lastBarIndex==this._samplesPerBar||i==sampleCount){lastBarTime/=this._profiles.length*(i-lastBarIndex);barTimes.push(lastBarTime);if(lastBarTime>maxBarTime)
+maxBarTime=lastBarTime;lastBarTime=0;lastBarIndex=i;}}
+const paddingHeight=4*window.devicePixelRatio;var scale=(this._canvas.height-paddingHeight-this._minBarHeight)/maxBarTime;this._context.fillStyle="rgba(110, 180, 110, 0.7)";for(var i=0;i<barTimes.length;++i)
+this._renderBar(i,barTimes[i]*scale+this._minBarHeight);},_renderBar:function(index,height)
+{var x=this._barPaddingWidth+index*this._outerBarWidth;var y=this._canvas.height-height;this._context.fillRect(x,y,this._innerBarWidth,height);},_onWindowChanged:function()
+{if(this._updateImageTimer)
+return;this._updateImageTimer=setTimeout(this._updateImage.bind(this),100);},_updateImage:function()
+{delete this._updateImageTimer;if(!this._profiles||!this._profiles.length)
+return;var screenLeft=this._selectionWindow.windowLeft*this._canvas.width;var screenRight=this._selectionWindow.windowRight*this._canvas.width;var barLeft=Math.floor((screenLeft-this._barPaddingWidth)/this._outerBarWidth);var barRight=Math.floor((screenRight-this._barPaddingWidth+this._innerBarWidth)/this._outerBarWidth);var stepLeft=Math.max(0,barLeft*this._samplesPerBar);var stepRight=Math.min(barRight*this._samplesPerBar,this._profiles[0].length);this._snapshot.requestImage(stepLeft,stepRight,this._layers3DView.showImageForLayer.bind(this._layers3DView,this._layer));},_reset:function()
+{this._snapshot=null;this._profiles=null;this._selectionWindow.reset();},profile:function(layer)
+{this._reset();this._layer=layer;this._layer.requestSnapshot(onSnapshotDone.bind(this));function onSnapshotDone(snapshot)
+{this._snapshot=snapshot;if(!snapshot){this._profiles=null;this._update();return;}
+snapshot.requestImage(null,null,this._layers3DView.showImageForLayer.bind(this._layers3DView,this._layer));snapshot.profile(onProfileDone.bind(this));}
+function onProfileDone(profiles)
+{this._profiles=profiles;this._update();}},__proto__:WebInspector.VBox.prototype};;WebInspector.TransformController=function(element)
+{this.element=element;element.addEventListener("mousemove",this._onMouseMove.bind(this),false);element.addEventListener("mousedown",this._onMouseDown.bind(this),false);element.addEventListener("mouseup",this._onMouseUp.bind(this),false);element.addEventListener("mousewheel",this._onMouseWheel.bind(this),false);this.reset();}
+WebInspector.TransformController.Events={TransformChanged:"TransformChanged"}
+WebInspector.TransformController.TransformType={Offset:1<<0,Scale:1<<1,Rotation:1<<2}
+WebInspector.TransformController.prototype={_postChangeEvent:function(changeType)
+{this.dispatchEventToListeners(WebInspector.TransformController.Events.TransformChanged,changeType);},_onMouseMove:function(event)
+{if(event.which!==1)
+return;if(typeof this._originX!=="number")
+this._setReferencePoint(event);this._rotateX=this._oldRotateX+(this._originY-event.clientY)/2;this._rotateY=this._oldRotateY-(this._originX-event.clientX)/4;this._postChangeEvent(WebInspector.TransformController.TransformType.Rotation);},reset:function()
+{this._scale=1;this._offsetX=0;this._offsetY=0;this._rotateX=0;this._rotateY=0;},scale:function()
+{return this._scale;},offsetX:function()
+{return this._offsetX;},offsetY:function()
+{return this._offsetY;},rotateX:function()
+{return this._rotateX;},rotateY:function()
+{return this._rotateY;},_onMouseWheel:function(event)
+{if(event.shiftKey){const zoomFactor=1.1;const mouseWheelZoomSpeed=1/120;var scaleFactor=Math.pow(zoomFactor,event.wheelDeltaY*mouseWheelZoomSpeed);this._scale*=scaleFactor;this._offsetX-=(event.clientX-this.element.totalOffsetLeft()-this._offsetX)*(scaleFactor-1);this._offsetY-=(event.clientY-this.element.totalOffsetTop()-this._offsetY)*(scaleFactor-1);this._postChangeEvent(WebInspector.TransformController.TransformType.Scale|WebInspector.TransformController.TransformType.Offset);}else{this._offsetX+=event.wheelDeltaX;this._offsetY+=event.wheelDeltaY;this._postChangeEvent(WebInspector.TransformController.TransformType.Offset);}},_setReferencePoint:function(event)
+{this._originX=event.clientX;this._originY=event.clientY;this._oldRotateX=this._rotateX;this._oldRotateY=this._rotateY;},_resetReferencePoint:function()
+{delete this._originX;delete this._originY;delete this._oldRotateX;delete this._oldRotateY;},_onMouseDown:function(event)
+{if(event.which!==1)
+return;this._setReferencePoint(event);},_onMouseUp:function(event)
+{if(event.which!==1)
+return;this._resetReferencePoint();},__proto__:WebInspector.Object.prototype};WebInspector.LayersPanel=function()
+{WebInspector.PanelWithSidebarTree.call(this,"layers",225);this.registerRequiredCSS("layersPanel.css");this.sidebarElement().classList.add("outline-disclosure");this.sidebarTree.element.classList.remove("sidebar-tree");this._model=new WebInspector.LayerTreeModel();this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged,this._onLayerTreeUpdated,this);this._currentlySelectedLayer=null;this._currentlyHoveredLayer=null;this._layerTree=new WebInspector.LayerTree(this._model,this.sidebarTree);this._layerTree.addEventListener(WebInspector.LayerTree.Events.LayerSelected,this._onLayerSelected,this);this._layerTree.addEventListener(WebInspector.LayerTree.Events.LayerHovered,this._onLayerHovered,this);this._rightSplitView=new WebInspector.SplitView(false,true,"layerDetailsSplitViewState");this._rightSplitView.show(this.mainElement());this._layers3DView=new WebInspector.Layers3DView(this._model);this._layers3DView.show(this._rightSplitView.mainElement());this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.LayerSelected,this._onLayerSelected,this);this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.LayerHovered,this._onLayerHovered,this);this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.LayerSnapshotRequested,this._onSnapshotRequested,this);this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.show(this._rightSplitView.sidebarElement());this._layerDetailsView=new WebInspector.LayerDetailsView(this._model);this._tabbedPane.appendTab(WebInspector.LayersPanel.DetailsViewTabs.Details,WebInspector.UIString("Details"),this._layerDetailsView);this._paintProfilerView=new WebInspector.PaintProfilerView(this._model,this._layers3DView);this._tabbedPane.appendTab(WebInspector.LayersPanel.DetailsViewTabs.Profiler,WebInspector.UIString("Profiler"),this._paintProfilerView);}
+WebInspector.LayersPanel.DetailsViewTabs={Details:"details",Profiler:"profiler"};WebInspector.LayersPanel.prototype={wasShown:function()
+{WebInspector.Panel.prototype.wasShown.call(this);this.sidebarTree.element.focus();this._model.enable();},willHide:function()
+{this._model.disable();WebInspector.Panel.prototype.willHide.call(this);},_showSnapshot:function(snapshot)
+{this._model.setSnapshot(snapshot);},_onLayerTreeUpdated:function()
+{if(this._currentlySelectedLayer&&!this._model.layerById(this._currentlySelectedLayer.id()))
+this._selectLayer(null);if(this._currentlyHoveredLayer&&!this._model.layerById(this._currentlyHoveredLayer.id()))
+this._hoverLayer(null);},_onLayerSelected:function(event)
+{var layer=(event.data);this._selectLayer(layer);},_onLayerHovered:function(event)
+{var layer=(event.data);this._hoverLayer(layer);},_onSnapshotRequested:function(event)
+{var layer=(event.data);this._tabbedPane.selectTab(WebInspector.LayersPanel.DetailsViewTabs.Profiler);this._paintProfilerView.profile(layer);},_selectLayer:function(layer)
+{if(this._currentlySelectedLayer===layer)
+return;this._currentlySelectedLayer=layer;var nodeId=layer&&layer.nodeIdForSelfOrAncestor();if(nodeId)
+WebInspector.domModel.highlightDOMNodeForTwoSeconds(nodeId);else
+WebInspector.domModel.hideDOMNodeHighlight();this._layerTree.selectLayer(layer);this._layers3DView.selectLayer(layer);this._layerDetailsView.setLayer(layer);},_hoverLayer:function(layer)
+{if(this._currentlyHoveredLayer===layer)
+return;this._currentlyHoveredLayer=layer;var nodeId=layer&&layer.nodeIdForSelfOrAncestor();if(nodeId)
+WebInspector.domModel.highlightDOMNode(nodeId);else
+WebInspector.domModel.hideDOMNodeHighlight();this._layerTree.hoverLayer(layer);this._layers3DView.hoverLayer(layer);},__proto__:WebInspector.PanelWithSidebarTree.prototype}
+WebInspector.LayersPanel.LayerTreeRevealer=function()
+{}
+WebInspector.LayersPanel.LayerTreeRevealer.prototype={reveal:function(layerTree)
+{if(layerTree instanceof WebInspector.LayerTreeSnapshot)
+(WebInspector.inspectorView.showPanel("layers"))._showSnapshot(layerTree);}}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Main.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/Main.js
new file mode 100644 (file)
index 0000000..1038b64
--- /dev/null
@@ -0,0 +1,9149 @@
+Object.isEmpty=function(obj)
+{for(var i in obj)
+return false;return true;}
+Object.values=function(obj)
+{var result=Object.keys(obj);var length=result.length;for(var i=0;i<length;++i)
+result[i]=obj[result[i]];return result;}
+String.prototype.findAll=function(string)
+{var matches=[];var i=this.indexOf(string);while(i!==-1){matches.push(i);i=this.indexOf(string,i+string.length);}
+return matches;}
+String.prototype.lineEndings=function()
+{if(!this._lineEndings){this._lineEndings=this.findAll("\n");this._lineEndings.push(this.length);}
+return this._lineEndings;}
+String.prototype.lineCount=function()
+{var lineEndings=this.lineEndings();return lineEndings.length;}
+String.prototype.lineAt=function(lineNumber)
+{var lineEndings=this.lineEndings();var lineStart=lineNumber>0?lineEndings[lineNumber-1]+1:0;var lineEnd=lineEndings[lineNumber];var lineContent=this.substring(lineStart,lineEnd);if(lineContent.length>0&&lineContent.charAt(lineContent.length-1)==="\r")
+lineContent=lineContent.substring(0,lineContent.length-1);return lineContent;}
+String.prototype.escapeCharacters=function(chars)
+{var foundChar=false;for(var i=0;i<chars.length;++i){if(this.indexOf(chars.charAt(i))!==-1){foundChar=true;break;}}
+if(!foundChar)
+return String(this);var result="";for(var i=0;i<this.length;++i){if(chars.indexOf(this.charAt(i))!==-1)
+result+="\\";result+=this.charAt(i);}
+return result;}
+String.regexSpecialCharacters=function()
+{return"^[]{}()\\.^$*+?|-,";}
+String.prototype.escapeForRegExp=function()
+{return this.escapeCharacters(String.regexSpecialCharacters());}
+String.prototype.escapeHTML=function()
+{return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");}
+String.prototype.collapseWhitespace=function()
+{return this.replace(/[\s\xA0]+/g," ");}
+String.prototype.trimMiddle=function(maxLength)
+{if(this.length<=maxLength)
+return String(this);var leftHalf=maxLength>>1;var rightHalf=maxLength-leftHalf-1;return this.substr(0,leftHalf)+"\u2026"+this.substr(this.length-rightHalf,rightHalf);}
+String.prototype.trimEnd=function(maxLength)
+{if(this.length<=maxLength)
+return String(this);return this.substr(0,maxLength-1)+"\u2026";}
+String.prototype.trimURL=function(baseURLDomain)
+{var result=this.replace(/^(https|http|file):\/\//i,"");if(baseURLDomain)
+result=result.replace(new RegExp("^"+baseURLDomain.escapeForRegExp(),"i"),"");return result;}
+String.prototype.toTitleCase=function()
+{return this.substring(0,1).toUpperCase()+this.substring(1);}
+String.prototype.compareTo=function(other)
+{if(this>other)
+return 1;if(this<other)
+return-1;return 0;}
+function sanitizeHref(href)
+{return href&&href.trim().toLowerCase().startsWith("javascript:")?null:href;}
+String.prototype.removeURLFragment=function()
+{var fragmentIndex=this.indexOf("#");if(fragmentIndex==-1)
+fragmentIndex=this.length;return this.substring(0,fragmentIndex);}
+String.prototype.startsWith=function(substring)
+{return!this.lastIndexOf(substring,0);}
+String.prototype.endsWith=function(substring)
+{return this.indexOf(substring,this.length-substring.length)!==-1;}
+String.prototype.hashCode=function()
+{var result=0;for(var i=0;i<this.length;++i)
+result=result*3+this.charCodeAt(i);return result;}
+String.naturalOrderComparator=function(a,b)
+{var chunk=/^\d+|^\D+/;var chunka,chunkb,anum,bnum;while(1){if(a){if(!b)
+return 1;}else{if(b)
+return-1;else
+return 0;}
+chunka=a.match(chunk)[0];chunkb=b.match(chunk)[0];anum=!isNaN(chunka);bnum=!isNaN(chunkb);if(anum&&!bnum)
+return-1;if(bnum&&!anum)
+return 1;if(anum&&bnum){var diff=chunka-chunkb;if(diff)
+return diff;if(chunka.length!==chunkb.length){if(!+chunka&&!+chunkb)
+return chunka.length-chunkb.length;else
+return chunkb.length-chunka.length;}}else if(chunka!==chunkb)
+return(chunka<chunkb)?-1:1;a=a.substring(chunka.length);b=b.substring(chunkb.length);}}
+Number.constrain=function(num,min,max)
+{if(num<min)
+num=min;else if(num>max)
+num=max;return num;}
+Number.gcd=function(a,b)
+{if(b===0)
+return a;else
+return Number.gcd(b,a%b);}
+Number.toFixedIfFloating=function(value)
+{if(!value||isNaN(value))
+return value;var number=Number(value);return number%1?number.toFixed(3):String(number);}
+Date.prototype.toISO8601Compact=function()
+{function leadZero(x)
+{return(x>9?"":"0")+x;}
+return this.getFullYear()+
+leadZero(this.getMonth()+1)+
+leadZero(this.getDate())+"T"+
+leadZero(this.getHours())+
+leadZero(this.getMinutes())+
+leadZero(this.getSeconds());}
+Date.prototype.toConsoleTime=function()
+{function leadZero2(x)
+{return(x>9?"":"0")+x;}
+function leadZero3(x)
+{return(Array(4-x.toString().length)).join('0')+x;}
+return this.getFullYear()+"-"+
+leadZero2(this.getMonth()+1)+"-"+
+leadZero2(this.getDate())+" "+
+leadZero2(this.getHours())+":"+
+leadZero2(this.getMinutes())+":"+
+leadZero2(this.getSeconds())+"."+
+leadZero3(this.getMilliseconds());}
+Object.defineProperty(Array.prototype,"remove",{value:function(value,firstOnly)
+{var index=this.indexOf(value);if(index===-1)
+return;if(firstOnly){this.splice(index,1);return;}
+for(var i=index+1,n=this.length;i<n;++i){if(this[i]!==value)
+this[index++]=this[i];}
+this.length=index;}});Object.defineProperty(Array.prototype,"keySet",{value:function()
+{var keys={};for(var i=0;i<this.length;++i)
+keys[this[i]]=true;return keys;}});Object.defineProperty(Array.prototype,"rotate",{value:function(index)
+{var result=[];for(var i=index;i<index+this.length;++i)
+result.push(this[i%this.length]);return result;}});Object.defineProperty(Uint32Array.prototype,"sort",{value:Array.prototype.sort});(function(){var partition={value:function(comparator,left,right,pivotIndex)
+{function swap(array,i1,i2)
+{var temp=array[i1];array[i1]=array[i2];array[i2]=temp;}
+var pivotValue=this[pivotIndex];swap(this,right,pivotIndex);var storeIndex=left;for(var i=left;i<right;++i){if(comparator(this[i],pivotValue)<0){swap(this,storeIndex,i);++storeIndex;}}
+swap(this,right,storeIndex);return storeIndex;}};Object.defineProperty(Array.prototype,"partition",partition);Object.defineProperty(Uint32Array.prototype,"partition",partition);var sortRange={value:function(comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight)
+{function quickSortRange(array,comparator,left,right,sortWindowLeft,sortWindowRight)
+{if(right<=left)
+return;var pivotIndex=Math.floor(Math.random()*(right-left))+left;var pivotNewIndex=array.partition(comparator,left,right,pivotIndex);if(sortWindowLeft<pivotNewIndex)
+quickSortRange(array,comparator,left,pivotNewIndex-1,sortWindowLeft,sortWindowRight);if(pivotNewIndex<sortWindowRight)
+quickSortRange(array,comparator,pivotNewIndex+1,right,sortWindowLeft,sortWindowRight);}
+if(leftBound===0&&rightBound===(this.length-1)&&sortWindowLeft===0&&sortWindowRight>=rightBound)
+this.sort(comparator);else
+quickSortRange(this,comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight);return this;}}
+Object.defineProperty(Array.prototype,"sortRange",sortRange);Object.defineProperty(Uint32Array.prototype,"sortRange",sortRange);})();Object.defineProperty(Array.prototype,"stableSort",{value:function(comparator)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var indices=new Array(this.length);for(var i=0;i<this.length;++i)
+indices[i]=i;var self=this;function indexComparator(a,b)
+{var result=comparator(self[a],self[b]);return result?result:a-b;}
+indices.sort(indexComparator);for(var i=0;i<this.length;++i){if(indices[i]<0||i===indices[i])
+continue;var cyclical=i;var saved=this[i];while(true){var next=indices[cyclical];indices[cyclical]=-1;if(next===i){this[cyclical]=saved;break;}else{this[cyclical]=this[next];cyclical=next;}}}
+return this;}});Object.defineProperty(Array.prototype,"qselect",{value:function(k,comparator)
+{if(k<0||k>=this.length)
+return;if(!comparator)
+comparator=function(a,b){return a-b;}
+var low=0;var high=this.length-1;for(;;){var pivotPosition=this.partition(comparator,low,high,Math.floor((high+low)/2));if(pivotPosition===k)
+return this[k];else if(pivotPosition>k)
+high=pivotPosition-1;else
+low=pivotPosition+1;}}});Object.defineProperty(Array.prototype,"lowerBound",{value:function(object,comparator,left,right)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>0)
+l=m+1;else
+r=m;}
+return r;}});Object.defineProperty(Array.prototype,"upperBound",{value:function(object,comparator,left,right)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>=0)
+l=m+1;else
+r=m;}
+return r;}});Object.defineProperty(Array.prototype,"binaryIndexOf",{value:function(value,comparator)
+{var index=this.lowerBound(value,comparator);return index<this.length&&comparator(value,this[index])===0?index:-1;}});Object.defineProperty(Array.prototype,"select",{value:function(field)
+{var result=new Array(this.length);for(var i=0;i<this.length;++i)
+result[i]=this[i][field];return result;}});Object.defineProperty(Array.prototype,"peekLast",{value:function()
+{return this[this.length-1];}});(function(){function mergeOrIntersect(array1,array2,comparator,mergeNotIntersect)
+{var result=[];var i=0;var j=0;while(i<array1.length&&j<array2.length){var compareValue=comparator(array1[i],array2[j]);if(mergeNotIntersect||!compareValue)
+result.push(compareValue<=0?array1[i]:array2[j]);if(compareValue<=0)
+i++;if(compareValue>=0)
+j++;}
+if(mergeNotIntersect){while(i<array1.length)
+result.push(array1[i++]);while(j<array2.length)
+result.push(array2[j++]);}
+return result;}
+Object.defineProperty(Array.prototype,"intersectOrdered",{value:function(array,comparator)
+{return mergeOrIntersect(this,array,comparator,false);}});Object.defineProperty(Array.prototype,"mergeOrdered",{value:function(array,comparator)
+{return mergeOrIntersect(this,array,comparator,true);}});}());function insertionIndexForObjectInListSortedByFunction(object,list,comparator,insertionIndexAfter)
+{if(insertionIndexAfter)
+return list.upperBound(object,comparator);else
+return list.lowerBound(object,comparator);}
+String.sprintf=function(format,var_arg)
+{return String.vsprintf(format,Array.prototype.slice.call(arguments,1));}
+String.tokenizeFormatString=function(format,formatters)
+{var tokens=[];var substitutionIndex=0;function addStringToken(str)
+{tokens.push({type:"string",value:str});}
+function addSpecifierToken(specifier,precision,substitutionIndex)
+{tokens.push({type:"specifier",specifier:specifier,precision:precision,substitutionIndex:substitutionIndex});}
+function isDigit(c)
+{return!!/[0-9]/.exec(c);}
+var index=0;for(var precentIndex=format.indexOf("%",index);precentIndex!==-1;precentIndex=format.indexOf("%",index)){addStringToken(format.substring(index,precentIndex));index=precentIndex+1;if(isDigit(format[index])){var number=parseInt(format.substring(index),10);while(isDigit(format[index]))
+++index;if(number>0&&format[index]==="$"){substitutionIndex=(number-1);++index;}}
+var precision=-1;if(format[index]==="."){++index;precision=parseInt(format.substring(index),10);if(isNaN(precision))
+precision=0;while(isDigit(format[index]))
+++index;}
+if(!(format[index]in formatters)){addStringToken(format.substring(precentIndex,index+1));++index;continue;}
+addSpecifierToken(format[index],precision,substitutionIndex);++substitutionIndex;++index;}
+addStringToken(format.substring(index));return tokens;}
+String.standardFormatters={d:function(substitution)
+{return!isNaN(substitution)?substitution:0;},f:function(substitution,token)
+{if(substitution&&token.precision>-1)
+substitution=substitution.toFixed(token.precision);return!isNaN(substitution)?substitution:(token.precision>-1?Number(0).toFixed(token.precision):0);},s:function(substitution)
+{return substitution;}}
+String.vsprintf=function(format,substitutions)
+{return String.format(format,substitutions,String.standardFormatters,"",function(a,b){return a+b;}).formattedResult;}
+String.format=function(format,substitutions,formatters,initialValue,append)
+{if(!format||!substitutions||!substitutions.length)
+return{formattedResult:append(initialValue,format),unusedSubstitutions:substitutions};function prettyFunctionName()
+{return"String.format(\""+format+"\", \""+substitutions.join("\", \"")+"\")";}
+function warn(msg)
+{console.warn(prettyFunctionName()+": "+msg);}
+function error(msg)
+{console.error(prettyFunctionName()+": "+msg);}
+var result=initialValue;var tokens=String.tokenizeFormatString(format,formatters);var usedSubstitutionIndexes={};for(var i=0;i<tokens.length;++i){var token=tokens[i];if(token.type==="string"){result=append(result,token.value);continue;}
+if(token.type!=="specifier"){error("Unknown token type \""+token.type+"\" found.");continue;}
+if(token.substitutionIndex>=substitutions.length){error("not enough substitution arguments. Had "+substitutions.length+" but needed "+(token.substitutionIndex+1)+", so substitution was skipped.");result=append(result,"%"+(token.precision>-1?token.precision:"")+token.specifier);continue;}
+usedSubstitutionIndexes[token.substitutionIndex]=true;if(!(token.specifier in formatters)){warn("unsupported format character \u201C"+token.specifier+"\u201D. Treating as a string.");result=append(result,substitutions[token.substitutionIndex]);continue;}
+result=append(result,formatters[token.specifier](substitutions[token.substitutionIndex],token));}
+var unusedSubstitutions=[];for(var i=0;i<substitutions.length;++i){if(i in usedSubstitutionIndexes)
+continue;unusedSubstitutions.push(substitutions[i]);}
+return{formattedResult:result,unusedSubstitutions:unusedSubstitutions};}
+function createSearchRegex(query,caseSensitive,isRegex)
+{var regexFlags=caseSensitive?"g":"gi";var regexObject;if(isRegex){try{regexObject=new RegExp(query,regexFlags);}catch(e){}}
+if(!regexObject)
+regexObject=createPlainTextSearchRegex(query,regexFlags);return regexObject;}
+function createPlainTextSearchRegex(query,flags)
+{var regexSpecialCharacters=String.regexSpecialCharacters();var regex="";for(var i=0;i<query.length;++i){var c=query.charAt(i);if(regexSpecialCharacters.indexOf(c)!=-1)
+regex+="\\";regex+=c;}
+return new RegExp(regex,flags||"");}
+function countRegexMatches(regex,content)
+{var text=content;var result=0;var match;while(text&&(match=regex.exec(text))){if(match[0].length>0)
+++result;text=text.substring(match.index+1);}
+return result;}
+function numberToStringWithSpacesPadding(value,symbolsCount)
+{var numberString=value.toString();var paddingLength=Math.max(0,symbolsCount-numberString.length);var paddingString=Array(paddingLength+1).join("\u00a0");return paddingString+numberString;}
+var createObjectIdentifier=function()
+{return"_"+ ++createObjectIdentifier._last;}
+createObjectIdentifier._last=0;var Set=function()
+{this._set={};this._size=0;}
+Set.prototype={add:function(item)
+{var objectIdentifier=item.__identifier;if(!objectIdentifier){objectIdentifier=createObjectIdentifier();item.__identifier=objectIdentifier;}
+if(!this._set[objectIdentifier])
+++this._size;this._set[objectIdentifier]=item;},remove:function(item)
+{if(this._set[item.__identifier]){--this._size;delete this._set[item.__identifier];return true;}
+return false;},items:function()
+{var result=new Array(this._size);var i=0;for(var objectIdentifier in this._set)
+result[i++]=this._set[objectIdentifier];return result;},hasItem:function(item)
+{return!!this._set[item.__identifier];},size:function()
+{return this._size;},clear:function()
+{this._set={};this._size=0;}}
+var Map=function()
+{this._map={};this._size=0;}
+Map.prototype={put:function(key,value)
+{var objectIdentifier=key.__identifier;if(!objectIdentifier){objectIdentifier=createObjectIdentifier();key.__identifier=objectIdentifier;}
+if(!this._map[objectIdentifier])
+++this._size;this._map[objectIdentifier]=[key,value];},remove:function(key)
+{var result=this._map[key.__identifier];if(!result)
+return undefined;--this._size;delete this._map[key.__identifier];return result[1];},keys:function()
+{return this._list(0);},values:function()
+{return this._list(1);},_list:function(index)
+{var result=new Array(this._size);var i=0;for(var objectIdentifier in this._map)
+result[i++]=this._map[objectIdentifier][index];return result;},get:function(key)
+{var entry=this._map[key.__identifier];return entry?entry[1]:undefined;},contains:function(key)
+{var entry=this._map[key.__identifier];return!!entry;},size:function()
+{return this._size;},clear:function()
+{this._map={};this._size=0;}}
+var StringMap=function()
+{this._map={};this._size=0;}
+StringMap.prototype={put:function(key,value)
+{if(key==="__proto__"){if(!this._hasProtoKey){++this._size;this._hasProtoKey=true;}
+this._protoValue=value;return;}
+if(!Object.prototype.hasOwnProperty.call(this._map,key))
+++this._size;this._map[key]=value;},remove:function(key)
+{var result;if(key==="__proto__"){if(!this._hasProtoKey)
+return undefined;--this._size;delete this._hasProtoKey;result=this._protoValue;delete this._protoValue;return result;}
+if(!Object.prototype.hasOwnProperty.call(this._map,key))
+return undefined;--this._size;result=this._map[key];delete this._map[key];return result;},keys:function()
+{var result=Object.keys(this._map)||[];if(this._hasProtoKey)
+result.push("__proto__");return result;},values:function()
+{var result=Object.values(this._map);if(this._hasProtoKey)
+result.push(this._protoValue);return result;},get:function(key)
+{if(key==="__proto__")
+return this._protoValue;if(!Object.prototype.hasOwnProperty.call(this._map,key))
+return undefined;return this._map[key];},contains:function(key)
+{var result;if(key==="__proto__")
+return this._hasProtoKey;return Object.prototype.hasOwnProperty.call(this._map,key);},size:function()
+{return this._size;},clear:function()
+{this._map={};this._size=0;delete this._hasProtoKey;delete this._protoValue;}}
+var StringSet=function()
+{this._map=new StringMap();}
+StringSet.prototype={put:function(value)
+{this._map.put(value,true);},remove:function(value)
+{return!!this._map.remove(value);},values:function()
+{return this._map.keys();},contains:function(value)
+{return this._map.contains(value);},size:function()
+{return this._map.size();},clear:function()
+{this._map.clear();}}
+function loadXHR(url,async,callback)
+{function onReadyStateChanged()
+{if(xhr.readyState!==XMLHttpRequest.DONE)
+return;if(xhr.status===200){callback(xhr.responseText);return;}
+callback(null);}
+var xhr=new XMLHttpRequest();xhr.open("GET",url,async);if(async)
+xhr.onreadystatechange=onReadyStateChanged;xhr.send(null);if(!async){if(xhr.status===200)
+return xhr.responseText;return null;}
+return null;}
+var _importedScripts={};function importScript(scriptName)
+{if(_importedScripts[scriptName])
+return;var xhr=new XMLHttpRequest();_importedScripts[scriptName]=true;xhr.open("GET",scriptName,false);xhr.send(null);if(!xhr.responseText)
+throw"empty response arrived for script '"+scriptName+"'";var baseUrl=location.origin+location.pathname;baseUrl=baseUrl.substring(0,baseUrl.lastIndexOf("/"));var sourceURL=baseUrl+"/"+scriptName;self.eval(xhr.responseText+"\n//# sourceURL="+sourceURL);}
+var loadScript=importScript;function CallbackBarrier()
+{this._pendingIncomingCallbacksCount=0;}
+CallbackBarrier.prototype={createCallback:function(userCallback)
+{console.assert(!this._outgoingCallback,"CallbackBarrier.createCallback() is called after CallbackBarrier.callWhenDone()");++this._pendingIncomingCallbacksCount;return this._incomingCallback.bind(this,userCallback);},callWhenDone:function(callback)
+{console.assert(!this._outgoingCallback,"CallbackBarrier.callWhenDone() is called multiple times");this._outgoingCallback=callback;if(!this._pendingIncomingCallbacksCount)
+this._outgoingCallback();},_incomingCallback:function(userCallback)
+{console.assert(this._pendingIncomingCallbacksCount>0);if(userCallback){var args=Array.prototype.slice.call(arguments,1);userCallback.apply(null,args);}
+if(!--this._pendingIncomingCallbacksCount&&this._outgoingCallback)
+this._outgoingCallback();}}
+function suppressUnused(value)
+{}
+var allDescriptors=[{name:"main",extensions:[{type:"@WebInspector.ActionDelegate",bindings:[{platform:"windows,linux",shortcut:"F5 Ctrl+R"},{platform:"mac",shortcut:"Meta+R"}],className:"WebInspector.Main.ReloadActionDelegate"},{type:"@WebInspector.ActionDelegate",bindings:[{platform:"windows,linux",shortcut:"Shift+F5 Ctrl+F5 Ctrl+Shift+F5 Shift+Ctrl+R"},{platform:"mac",shortcut:"Shift+Meta+R"}],className:"WebInspector.Main.HardReloadActionDelegate"},{type:"@WebInspector.ActionDelegate",bindings:[{shortcut:"Esc"}],className:"WebInspector.InspectorView.DrawerToggleActionDelegate"},{type:"@WebInspector.ActionDelegate",bindings:[{shortcut:"Alt+R"}],className:"WebInspector.Main.DebugReloadActionDelegate"}]},{name:"elements",extensions:[{type:"@WebInspector.Panel",name:"elements",title:"Elements",order:0,className:"WebInspector.ElementsPanel"},{type:"@WebInspector.ContextMenu.Provider",contextTypes:["WebInspector.RemoteObject","WebInspector.DOMNode"],className:"WebInspector.ElementsPanel.ContextMenuProvider"},{type:"drawer-view",name:"emulation",title:"Emulation",order:"10",className:"WebInspector.OverridesView"},{type:"drawer-view",name:"rendering",title:"Rendering",order:"11",className:"WebInspector.RenderingOptionsView"},{type:"@WebInspector.Renderer",contextTypes:["WebInspector.DOMNode"],className:"WebInspector.ElementsTreeOutline.Renderer"},{type:"@WebInspector.Revealer",contextTypes:["WebInspector.DOMNode"],className:"WebInspector.ElementsPanel.DOMNodeRevealer"}],scripts:["ElementsPanel.js"]},{name:"network",extensions:[{type:"@WebInspector.Panel",name:"network",title:"Network",order:1,className:"WebInspector.NetworkPanel"},{type:"@WebInspector.ContextMenu.Provider",contextTypes:["WebInspector.NetworkRequest","WebInspector.Resource","WebInspector.UISourceCode"],className:"WebInspector.NetworkPanel.ContextMenuProvider"},{type:"@WebInspector.Revealer",contextTypes:["WebInspector.NetworkRequest"],className:"WebInspector.NetworkPanel.RequestRevealer"}],scripts:["NetworkPanel.js"]},{name:"codemirror",extensions:[{type:"@WebInspector.InplaceEditor",className:"WebInspector.CodeMirrorUtils"},{type:"@WebInspector.TokenizerFactory",className:"WebInspector.CodeMirrorUtils.TokenizerFactory"},],scripts:["CodeMirrorTextEditor.js"]},{name:"sources",extensions:[{type:"@WebInspector.Panel",name:"sources",title:"Sources",order:2,className:"WebInspector.SourcesPanel"},{type:"@WebInspector.ContextMenu.Provider",contextTypes:["WebInspector.UISourceCode","WebInspector.RemoteObject"],className:"WebInspector.SourcesPanel.ContextMenuProvider"},{type:"@WebInspector.SearchScope",className:"WebInspector.SourcesSearchScope"},{type:"drawer-view",name:"search",title:"Search",order:"1",className:"WebInspector.SearchView"},{type:"@WebInspector.DrawerEditor",className:"WebInspector.SourcesPanel.DrawerEditor"},{type:"@WebInspector.Revealer",contextTypes:["WebInspector.UILocation"],className:"WebInspector.SourcesPanel.UILocationRevealer"},{type:"@WebInspector.SourcesView.EditorAction",className:"WebInspector.InplaceFormatterEditorAction"},{type:"@WebInspector.SourcesView.EditorAction",className:"WebInspector.ScriptFormatterEditorAction"},{type:"navigator-view",name:"sources",title:"Sources",order:1,className:"WebInspector.SourcesNavigatorView"},{type:"navigator-view",name:"contentScripts",title:"Content scripts",order:2,className:"WebInspector.ContentScriptsNavigatorView"},{type:"navigator-view",name:"snippets",title:"Snippets",order:3,className:"WebInspector.SnippetsNavigatorView"},{type:"@WebInspector.ActionDelegate",bindings:[{platform:"mac",shortcut:"Meta+O Meta+P"},{platform:"windows,linux",shortcut:"Ctrl+O Ctrl+P"}],className:"WebInspector.SourcesPanel.ShowGoToSourceDialogActionDelegate"}],scripts:["SourcesPanel.js"]},{name:"timeline",extensions:[{type:"@WebInspector.Panel",name:"timeline",title:"Timeline",order:3,className:"WebInspector.TimelinePanel"}],scripts:["TimelinePanel.js"]},{name:"profiles",extensions:[{type:"@WebInspector.Panel",name:"profiles",title:"Profiles",order:4,className:"WebInspector.ProfilesPanel"},{type:"@WebInspector.ContextMenu.Provider",contextTypes:["WebInspector.RemoteObject"],className:"WebInspector.ProfilesPanel.ContextMenuProvider"}],scripts:["ProfilesPanel.js"]},{name:"resources",extensions:[{type:"@WebInspector.Panel",name:"resources",title:"Resources",order:5,className:"WebInspector.ResourcesPanel"},{type:"@WebInspector.Revealer",contextTypes:["WebInspector.Resource"],className:"WebInspector.ResourcesPanel.ResourceRevealer"}],scripts:["ResourcesPanel.js"]},{name:"audits",extensions:[{type:"@WebInspector.Panel",name:"audits",title:"Audits",order:6,className:"WebInspector.AuditsPanel"}],scripts:["AuditsPanel.js"]},{name:"console",extensions:[{type:"@WebInspector.Panel",name:"console",title:"Console",order:20,className:"WebInspector.ConsolePanel"},{type:"drawer-view",name:"console",title:"Console",order:"0",className:"WebInspector.ConsolePanel.WrapperView"},{type:"@WebInspector.Revealer",contextTypes:["WebInspector.ConsoleModel"],className:"WebInspector.ConsolePanel.ConsoleRevealer"},{type:"@WebInspector.ActionDelegate",bindings:[{shortcut:"Ctrl+`"}],className:"WebInspector.ConsoleView.ShowConsoleActionDelegate"}],scripts:["ConsolePanel.js"]},{name:"settings",extensions:[{type:"@WebInspector.ActionDelegate",bindings:[{shortcut:"F1 Shift+?"}],className:"WebInspector.SettingsController.SettingsScreenActionDelegate"}]},{name:"extensions",extensions:[{type:"@WebInspector.ExtensionServerAPI",className:"WebInspector.ExtensionServer"}],scripts:["ExtensionServer.js"]},{name:"layers",extensions:[{type:"@WebInspector.Panel",name:"layers",title:"Layers",order:7,className:"WebInspector.LayersPanel"},{type:"@WebInspector.Revealer",contextTypes:["WebInspector.LayerTreeSnapshot"],className:"WebInspector.LayersPanel.LayerTreeRevealer"}],scripts:["LayersPanel.js"]},{name:"handler-registry",extensions:[{type:"@WebInspector.ContextMenu.Provider",contextTypes:["WebInspector.UISourceCode","WebInspector.Resource","WebInspector.NetworkRequest","Node"],className:"WebInspector.HandlerRegistry.ContextMenuProvider"}]}];__whitespace={" ":true,"\t":true,"\n":true,"\f":true,"\r":true};difflib={defaultJunkFunction:function(c){return __whitespace.hasOwnProperty(c);},stripLinebreaks:function(str){return str.replace(/^[\n\r]*|[\n\r]*$/g,"");},stringAsLines:function(str){var lfpos=str.indexOf("\n");var crpos=str.indexOf("\r");var linebreak=((lfpos>-1&&crpos>-1)||crpos<0)?"\n":"\r";var lines=str.split(linebreak);for(var i=0;i<lines.length;i++){lines[i]=difflib.stripLinebreaks(lines[i]);}
+return lines;},__reduce:function(func,list,initial){if(initial!=null){var value=initial;var idx=0;}else if(list){var value=list[0];var idx=1;}else{return null;}
+for(;idx<list.length;idx++){value=func(value,list[idx]);}
+return value;},__ntuplecomp:function(a,b){var mlen=Math.max(a.length,b.length);for(var i=0;i<mlen;i++){if(a[i]<b[i])return-1;if(a[i]>b[i])return 1;}
+return a.length==b.length?0:(a.length<b.length?-1:1);},__calculate_ratio:function(matches,length){return length?2.0*matches/length:1.0;},__isindict:function(dict){return function(key){return dict.hasOwnProperty(key);};},__dictget:function(dict,key,defaultValue){return dict.hasOwnProperty(key)?dict[key]:defaultValue;},SequenceMatcher:function(a,b,isjunk){this.set_seqs=function(a,b){this.set_seq1(a);this.set_seq2(b);}
+this.set_seq1=function(a){if(a==this.a)return;this.a=a;this.matching_blocks=this.opcodes=null;}
+this.set_seq2=function(b){if(b==this.b)return;this.b=b;this.matching_blocks=this.opcodes=this.fullbcount=null;this.__chain_b();}
+this.__chain_b=function(){var b=this.b;var n=b.length;var b2j=this.b2j={};var populardict={};for(var i=0;i<b.length;i++){var elt=b[i];if(b2j.hasOwnProperty(elt)){var indices=b2j[elt];if(n>=200&&indices.length*100>n){populardict[elt]=1;delete b2j[elt];}else{indices.push(i);}}else{b2j[elt]=[i];}}
+for(var elt in populardict){if(populardict.hasOwnProperty(elt)){delete b2j[elt];}}
+var isjunk=this.isjunk;var junkdict={};if(isjunk){for(var elt in populardict){if(populardict.hasOwnProperty(elt)&&isjunk(elt)){junkdict[elt]=1;delete populardict[elt];}}
+for(var elt in b2j){if(b2j.hasOwnProperty(elt)&&isjunk(elt)){junkdict[elt]=1;delete b2j[elt];}}}
+this.isbjunk=difflib.__isindict(junkdict);this.isbpopular=difflib.__isindict(populardict);}
+this.find_longest_match=function(alo,ahi,blo,bhi){var a=this.a;var b=this.b;var b2j=this.b2j;var isbjunk=this.isbjunk;var besti=alo;var bestj=blo;var bestsize=0;var j=null;var j2len={};var nothing=[];for(var i=alo;i<ahi;i++){var newj2len={};var jdict=difflib.__dictget(b2j,a[i],nothing);for(var jkey in jdict){if(jdict.hasOwnProperty(jkey)){j=jdict[jkey];if(j<blo)continue;if(j>=bhi)break;newj2len[j]=k=difflib.__dictget(j2len,j-1,0)+1;if(k>bestsize){besti=i-k+1;bestj=j-k+1;bestsize=k;}}}
+j2len=newj2len;}
+while(besti>alo&&bestj>blo&&!isbjunk(b[bestj-1])&&a[besti-1]==b[bestj-1]){besti--;bestj--;bestsize++;}
+while(besti+bestsize<ahi&&bestj+bestsize<bhi&&!isbjunk(b[bestj+bestsize])&&a[besti+bestsize]==b[bestj+bestsize]){bestsize++;}
+while(besti>alo&&bestj>blo&&isbjunk(b[bestj-1])&&a[besti-1]==b[bestj-1]){besti--;bestj--;bestsize++;}
+while(besti+bestsize<ahi&&bestj+bestsize<bhi&&isbjunk(b[bestj+bestsize])&&a[besti+bestsize]==b[bestj+bestsize]){bestsize++;}
+return[besti,bestj,bestsize];}
+this.get_matching_blocks=function(){if(this.matching_blocks!=null)return this.matching_blocks;var la=this.a.length;var lb=this.b.length;var queue=[[0,la,0,lb]];var matching_blocks=[];var alo,ahi,blo,bhi,qi,i,j,k,x;while(queue.length){qi=queue.pop();alo=qi[0];ahi=qi[1];blo=qi[2];bhi=qi[3];x=this.find_longest_match(alo,ahi,blo,bhi);i=x[0];j=x[1];k=x[2];if(k){matching_blocks.push(x);if(alo<i&&blo<j)
+queue.push([alo,i,blo,j]);if(i+k<ahi&&j+k<bhi)
+queue.push([i+k,ahi,j+k,bhi]);}}
+matching_blocks.sort(difflib.__ntuplecomp);var i1=j1=k1=block=0;var non_adjacent=[];for(var idx in matching_blocks){if(matching_blocks.hasOwnProperty(idx)){block=matching_blocks[idx];i2=block[0];j2=block[1];k2=block[2];if(i1+k1==i2&&j1+k1==j2){k1+=k2;}else{if(k1)non_adjacent.push([i1,j1,k1]);i1=i2;j1=j2;k1=k2;}}}
+if(k1)non_adjacent.push([i1,j1,k1]);non_adjacent.push([la,lb,0]);this.matching_blocks=non_adjacent;return this.matching_blocks;}
+this.get_opcodes=function(){if(this.opcodes!=null)return this.opcodes;var i=0;var j=0;var answer=[];this.opcodes=answer;var block,ai,bj,size,tag;var blocks=this.get_matching_blocks();for(var idx in blocks){if(blocks.hasOwnProperty(idx)){block=blocks[idx];ai=block[0];bj=block[1];size=block[2];tag='';if(i<ai&&j<bj){tag='replace';}else if(i<ai){tag='delete';}else if(j<bj){tag='insert';}
+if(tag)answer.push([tag,i,ai,j,bj]);i=ai+size;j=bj+size;if(size)answer.push(['equal',ai,i,bj,j]);}}
+return answer;}
+this.get_grouped_opcodes=function(n){if(!n)n=3;var codes=this.get_opcodes();if(!codes)codes=[["equal",0,1,0,1]];var code,tag,i1,i2,j1,j2;if(codes[0][0]=='equal'){code=codes[0];tag=code[0];i1=code[1];i2=code[2];j1=code[3];j2=code[4];codes[0]=[tag,Math.max(i1,i2-n),i2,Math.max(j1,j2-n),j2];}
+if(codes[codes.length-1][0]=='equal'){code=codes[codes.length-1];tag=code[0];i1=code[1];i2=code[2];j1=code[3];j2=code[4];codes[codes.length-1]=[tag,i1,Math.min(i2,i1+n),j1,Math.min(j2,j1+n)];}
+var nn=n+n;var groups=[];for(var idx in codes){if(codes.hasOwnProperty(idx)){code=codes[idx];tag=code[0];i1=code[1];i2=code[2];j1=code[3];j2=code[4];if(tag=='equal'&&i2-i1>nn){groups.push([tag,i1,Math.min(i2,i1+n),j1,Math.min(j2,j1+n)]);i1=Math.max(i1,i2-n);j1=Math.max(j1,j2-n);}
+groups.push([tag,i1,i2,j1,j2]);}}
+if(groups&&groups[groups.length-1][0]=='equal')groups.pop();return groups;}
+this.ratio=function(){matches=difflib.__reduce(function(sum,triple){return sum+triple[triple.length-1];},this.get_matching_blocks(),0);return difflib.__calculate_ratio(matches,this.a.length+this.b.length);}
+this.quick_ratio=function(){var fullbcount,elt;if(this.fullbcount==null){this.fullbcount=fullbcount={};for(var i=0;i<this.b.length;i++){elt=this.b[i];fullbcount[elt]=difflib.__dictget(fullbcount,elt,0)+1;}}
+fullbcount=this.fullbcount;var avail={};var availhas=difflib.__isindict(avail);var matches=numb=0;for(var i=0;i<this.a.length;i++){elt=this.a[i];if(availhas(elt)){numb=avail[elt];}else{numb=difflib.__dictget(fullbcount,elt,0);}
+avail[elt]=numb-1;if(numb>0)matches++;}
+return difflib.__calculate_ratio(matches,this.a.length+this.b.length);}
+this.real_quick_ratio=function(){var la=this.a.length;var lb=this.b.length;return _calculate_ratio(Math.min(la,lb),la+lb);}
+this.isjunk=isjunk?isjunk:difflib.defaultJunkFunction;this.a=this.b=null;this.set_seqs(a,b);}}
+Node.prototype.rangeOfWord=function(offset,stopCharacters,stayWithinNode,direction)
+{var startNode;var startOffset=0;var endNode;var endOffset=0;if(!stayWithinNode)
+stayWithinNode=this;if(!direction||direction==="backward"||direction==="both"){var node=this;while(node){if(node===stayWithinNode){if(!startNode)
+startNode=stayWithinNode;break;}
+if(node.nodeType===Node.TEXT_NODE){var start=(node===this?(offset-1):(node.nodeValue.length-1));for(var i=start;i>=0;--i){if(stopCharacters.indexOf(node.nodeValue[i])!==-1){startNode=node;startOffset=i+1;break;}}}
+if(startNode)
+break;node=node.traversePreviousNode(stayWithinNode);}
+if(!startNode){startNode=stayWithinNode;startOffset=0;}}else{startNode=this;startOffset=offset;}
+if(!direction||direction==="forward"||direction==="both"){node=this;while(node){if(node===stayWithinNode){if(!endNode)
+endNode=stayWithinNode;break;}
+if(node.nodeType===Node.TEXT_NODE){var start=(node===this?offset:0);for(var i=start;i<node.nodeValue.length;++i){if(stopCharacters.indexOf(node.nodeValue[i])!==-1){endNode=node;endOffset=i;break;}}}
+if(endNode)
+break;node=node.traverseNextNode(stayWithinNode);}
+if(!endNode){endNode=stayWithinNode;endOffset=stayWithinNode.nodeType===Node.TEXT_NODE?stayWithinNode.nodeValue.length:stayWithinNode.childNodes.length;}}else{endNode=this;endOffset=offset;}
+var result=this.ownerDocument.createRange();result.setStart(startNode,startOffset);result.setEnd(endNode,endOffset);return result;}
+Node.prototype.traverseNextTextNode=function(stayWithin)
+{var node=this.traverseNextNode(stayWithin);if(!node)
+return;while(node&&node.nodeType!==Node.TEXT_NODE)
+node=node.traverseNextNode(stayWithin);return node;}
+Node.prototype.rangeBoundaryForOffset=function(offset)
+{var node=this.traverseNextTextNode(this);while(node&&offset>node.nodeValue.length){offset-=node.nodeValue.length;node=node.traverseNextTextNode(this);}
+if(!node)
+return{container:this,offset:0};return{container:node,offset:offset};}
+Element.prototype.removeMatchingStyleClasses=function(classNameRegex)
+{var regex=new RegExp("(^|\\s+)"+classNameRegex+"($|\\s+)");if(regex.test(this.className))
+this.className=this.className.replace(regex," ");}
+Element.prototype.positionAt=function(x,y,relativeTo)
+{var shift={x:0,y:0};if(relativeTo)
+shift=relativeTo.boxInWindow(this.ownerDocument.defaultView);if(typeof x==="number")
+this.style.setProperty("left",(shift.x+x)+"px");else
+this.style.removeProperty("left");if(typeof y==="number")
+this.style.setProperty("top",(shift.y+y)+"px");else
+this.style.removeProperty("top");}
+Element.prototype.isScrolledToBottom=function()
+{return Math.abs(this.scrollTop+this.clientHeight-this.scrollHeight)<=1;}
+function removeSubsequentNodes(fromNode,toNode)
+{for(var node=fromNode;node&&node!==toNode;){var nodeToRemove=node;node=node.nextSibling;nodeToRemove.remove();}}
+function Size(width,height)
+{this.width=width;this.height=height;}
+Size.prototype.isEqual=function(size)
+{return!!size&&this.width===size.width&&this.height===size.height;};Element.prototype.measurePreferredSize=function(containerElement)
+{containerElement=containerElement||document.body;containerElement.appendChild(this);this.positionAt(0,0);var result=new Size(this.offsetWidth,this.offsetHeight);this.positionAt(undefined,undefined);this.remove();return result;}
+Element.prototype.containsEventPoint=function(event)
+{var box=this.getBoundingClientRect();return box.left<event.x&&event.x<box.right&&box.top<event.y&&event.y<box.bottom;}
+Node.prototype.enclosingNodeOrSelfWithNodeNameInArray=function(nameArray)
+{for(var node=this;node&&node!==this.ownerDocument;node=node.parentNode)
+for(var i=0;i<nameArray.length;++i)
+if(node.nodeName.toLowerCase()===nameArray[i].toLowerCase())
+return node;return null;}
+Node.prototype.enclosingNodeOrSelfWithNodeName=function(nodeName)
+{return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);}
+Node.prototype.enclosingNodeOrSelfWithClass=function(className,stayWithin)
+{for(var node=this;node&&node!==stayWithin&&node!==this.ownerDocument;node=node.parentNode)
+if(node.nodeType===Node.ELEMENT_NODE&&node.classList.contains(className))
+return node;return null;}
+Element.prototype.query=function(query)
+{return this.ownerDocument.evaluate(query,this,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;}
+Element.prototype.removeChildren=function()
+{if(this.firstChild)
+this.textContent="";}
+Element.prototype.isInsertionCaretInside=function()
+{var selection=window.getSelection();if(!selection.rangeCount||!selection.isCollapsed)
+return false;var selectionRange=selection.getRangeAt(0);return selectionRange.startContainer.isSelfOrDescendant(this);}
+Document.prototype.createElementWithClass=function(elementName,className)
+{var element=this.createElement(elementName);if(className)
+element.className=className;return element;}
+Element.prototype.createChild=function(elementName,className)
+{var element=this.ownerDocument.createElementWithClass(elementName,className);this.appendChild(element);return element;}
+DocumentFragment.prototype.createChild=Element.prototype.createChild;Element.prototype.createTextChild=function(text)
+{var element=this.ownerDocument.createTextNode(text);this.appendChild(element);return element;}
+DocumentFragment.prototype.createTextChild=Element.prototype.createTextChild;Element.prototype.totalOffsetLeft=function()
+{return this.totalOffset().left;}
+Element.prototype.totalOffsetTop=function()
+{return this.totalOffset().top;}
+Element.prototype.totalOffset=function()
+{var rect=this.getBoundingClientRect();return{left:rect.left,top:rect.top};}
+Element.prototype.scrollOffset=function()
+{var curLeft=0;var curTop=0;for(var element=this;element;element=element.scrollParent){curLeft+=element.scrollLeft;curTop+=element.scrollTop;}
+return{left:curLeft,top:curTop};}
+function AnchorBox(x,y,width,height)
+{this.x=x||0;this.y=y||0;this.width=width||0;this.height=height||0;}
+AnchorBox.prototype.relativeTo=function(box)
+{return new AnchorBox(this.x-box.x,this.y-box.y,this.width,this.height);};AnchorBox.prototype.relativeToElement=function(element)
+{return this.relativeTo(element.boxInWindow(element.ownerDocument.defaultView));};Element.prototype.offsetRelativeToWindow=function(targetWindow)
+{var elementOffset=new AnchorBox();var curElement=this;var curWindow=this.ownerDocument.defaultView;while(curWindow&&curElement){elementOffset.x+=curElement.totalOffsetLeft();elementOffset.y+=curElement.totalOffsetTop();if(curWindow===targetWindow)
+break;curElement=curWindow.frameElement;curWindow=curWindow.parent;}
+return elementOffset;}
+Element.prototype.boxInWindow=function(targetWindow)
+{targetWindow=targetWindow||this.ownerDocument.defaultView;var anchorBox=this.offsetRelativeToWindow(window);anchorBox.width=Math.min(this.offsetWidth,window.innerWidth-anchorBox.x);anchorBox.height=Math.min(this.offsetHeight,window.innerHeight-anchorBox.y);return anchorBox;}
+Element.prototype.setTextAndTitle=function(text)
+{this.textContent=text;this.title=text;}
+KeyboardEvent.prototype.__defineGetter__("data",function()
+{switch(this.type){case"keypress":if(!this.ctrlKey&&!this.metaKey)
+return String.fromCharCode(this.charCode);else
+return"";case"keydown":case"keyup":if(!this.ctrlKey&&!this.metaKey&&!this.altKey)
+return String.fromCharCode(this.which);else
+return"";}});Event.prototype.consume=function(preventDefault)
+{this.stopImmediatePropagation();if(preventDefault)
+this.preventDefault();this.handled=true;}
+Text.prototype.select=function(start,end)
+{start=start||0;end=end||this.textContent.length;if(start<0)
+start=end+start;var selection=this.ownerDocument.defaultView.getSelection();selection.removeAllRanges();var range=this.ownerDocument.createRange();range.setStart(this,start);range.setEnd(this,end);selection.addRange(range);return this;}
+Element.prototype.selectionLeftOffset=function()
+{var selection=window.getSelection();if(!selection.containsNode(this,true))
+return null;var leftOffset=selection.anchorOffset;var node=selection.anchorNode;while(node!==this){while(node.previousSibling){node=node.previousSibling;leftOffset+=node.textContent.length;}
+node=node.parentNode;}
+return leftOffset;}
+Node.prototype.isAncestor=function(node)
+{if(!node)
+return false;var currentNode=node.parentNode;while(currentNode){if(this===currentNode)
+return true;currentNode=currentNode.parentNode;}
+return false;}
+Node.prototype.isDescendant=function(descendant)
+{return!!descendant&&descendant.isAncestor(this);}
+Node.prototype.isSelfOrAncestor=function(node)
+{return!!node&&(node===this||this.isAncestor(node));}
+Node.prototype.isSelfOrDescendant=function(node)
+{return!!node&&(node===this||this.isDescendant(node));}
+Node.prototype.traverseNextNode=function(stayWithin)
+{var node=this.firstChild;if(node)
+return node;if(stayWithin&&this===stayWithin)
+return null;node=this.nextSibling;if(node)
+return node;node=this;while(node&&!node.nextSibling&&(!stayWithin||!node.parentNode||node.parentNode!==stayWithin))
+node=node.parentNode;if(!node)
+return null;return node.nextSibling;}
+Node.prototype.traversePreviousNode=function(stayWithin)
+{if(stayWithin&&this===stayWithin)
+return null;var node=this.previousSibling;while(node&&node.lastChild)
+node=node.lastChild;if(node)
+return node;return this.parentNode;}
+Node.prototype.setTextContentTruncatedIfNeeded=function(text,placeholder)
+{const maxTextContentLength=65535;if(typeof text==="string"&&text.length>maxTextContentLength){this.textContent=typeof placeholder==="string"?placeholder:text.trimEnd(maxTextContentLength);return true;}
+this.textContent=text;return false;}
+function isEnterKey(event){return event.keyCode!==229&&event.keyIdentifier==="Enter";}
+function consumeEvent(e)
+{e.consume();}
+function TreeOutline(listNode,nonFocusable)
+{this.children=[];this.selectedTreeElement=null;this._childrenListNode=listNode;this.childrenListElement=this._childrenListNode;this._childrenListNode.removeChildren();this.expandTreeElementsWhenArrowing=false;this.root=true;this.hasChildren=false;this.expanded=true;this.selected=false;this.treeOutline=this;this.comparator=null;this.setFocusable(!nonFocusable);this._childrenListNode.addEventListener("keydown",this._treeKeyDown.bind(this),true);this._treeElementsMap=new Map();this._expandedStateMap=new Map();this.element=listNode;}
+TreeOutline.prototype.setFocusable=function(focusable)
+{if(focusable)
+this._childrenListNode.setAttribute("tabIndex",0);else
+this._childrenListNode.removeAttribute("tabIndex");}
+TreeOutline.prototype.appendChild=function(child)
+{var insertionIndex;if(this.treeOutline.comparator)
+insertionIndex=insertionIndexForObjectInListSortedByFunction(child,this.children,this.treeOutline.comparator);else
+insertionIndex=this.children.length;this.insertChild(child,insertionIndex);}
+TreeOutline.prototype.insertBeforeChild=function(child,beforeChild)
+{if(!child)
+throw("child can't be undefined or null");if(!beforeChild)
+throw("beforeChild can't be undefined or null");var childIndex=this.children.indexOf(beforeChild);if(childIndex===-1)
+throw("beforeChild not found in this node's children");this.insertChild(child,childIndex);}
+TreeOutline.prototype.insertChild=function(child,index)
+{if(!child)
+throw("child can't be undefined or null");var previousChild=(index>0?this.children[index-1]:null);if(previousChild){previousChild.nextSibling=child;child.previousSibling=previousChild;}else{child.previousSibling=null;}
+var nextChild=this.children[index];if(nextChild){nextChild.previousSibling=child;child.nextSibling=nextChild;}else{child.nextSibling=null;}
+this.children.splice(index,0,child);this.hasChildren=true;child.parent=this;child.treeOutline=this.treeOutline;child.treeOutline._rememberTreeElement(child);var current=child.children[0];while(current){current.treeOutline=this.treeOutline;current.treeOutline._rememberTreeElement(current);current=current.traverseNextTreeElement(false,child,true);}
+if(child.hasChildren&&typeof(child.treeOutline._expandedStateMap.get(child.representedObject))!=="undefined")
+child.expanded=child.treeOutline._expandedStateMap.get(child.representedObject);if(!this._childrenListNode){this._childrenListNode=this.treeOutline._childrenListNode.ownerDocument.createElement("ol");this._childrenListNode.parentTreeElement=this;this._childrenListNode.classList.add("children");if(this.hidden)
+this._childrenListNode.classList.add("hidden");}
+child._attach();}
+TreeOutline.prototype.removeChildAtIndex=function(childIndex)
+{if(childIndex<0||childIndex>=this.children.length)
+throw("childIndex out of range");var child=this.children[childIndex];this.children.splice(childIndex,1);var parent=child.parent;if(child.deselect()){if(child.previousSibling)
+child.previousSibling.select();else if(child.nextSibling)
+child.nextSibling.select();else
+parent.select();}
+if(child.previousSibling)
+child.previousSibling.nextSibling=child.nextSibling;if(child.nextSibling)
+child.nextSibling.previousSibling=child.previousSibling;if(child.treeOutline){child.treeOutline._forgetTreeElement(child);child.treeOutline._forgetChildrenRecursive(child);}
+child._detach();child.treeOutline=null;child.parent=null;child.nextSibling=null;child.previousSibling=null;}
+TreeOutline.prototype.removeChild=function(child)
+{if(!child)
+throw("child can't be undefined or null");var childIndex=this.children.indexOf(child);if(childIndex===-1)
+throw("child not found in this node's children");this.removeChildAtIndex.call(this,childIndex);}
+TreeOutline.prototype.removeChildren=function()
+{for(var i=0;i<this.children.length;++i){var child=this.children[i];child.deselect();if(child.treeOutline){child.treeOutline._forgetTreeElement(child);child.treeOutline._forgetChildrenRecursive(child);}
+child._detach();child.treeOutline=null;child.parent=null;child.nextSibling=null;child.previousSibling=null;}
+this.children=[];}
+TreeOutline.prototype._rememberTreeElement=function(element)
+{if(!this._treeElementsMap.get(element.representedObject))
+this._treeElementsMap.put(element.representedObject,[]);var elements=this._treeElementsMap.get(element.representedObject);if(elements.indexOf(element)!==-1)
+return;elements.push(element);}
+TreeOutline.prototype._forgetTreeElement=function(element)
+{if(this._treeElementsMap.get(element.representedObject)){var elements=this._treeElementsMap.get(element.representedObject);elements.remove(element,true);if(!elements.length)
+this._treeElementsMap.remove(element.representedObject);}}
+TreeOutline.prototype._forgetChildrenRecursive=function(parentElement)
+{var child=parentElement.children[0];while(child){this._forgetTreeElement(child);child=child.traverseNextTreeElement(false,parentElement,true);}}
+TreeOutline.prototype.getCachedTreeElement=function(representedObject)
+{if(!representedObject)
+return null;var elements=this._treeElementsMap.get(representedObject);if(elements&&elements.length)
+return elements[0];return null;}
+TreeOutline.prototype.findTreeElement=function(representedObject,isAncestor,getParent)
+{if(!representedObject)
+return null;var cachedElement=this.getCachedTreeElement(representedObject);if(cachedElement)
+return cachedElement;var ancestors=[];for(var currentObject=getParent(representedObject);currentObject;currentObject=getParent(currentObject)){ancestors.push(currentObject);if(this.getCachedTreeElement(currentObject))
+break;}
+if(!currentObject)
+return null;for(var i=ancestors.length-1;i>=0;--i){var treeElement=this.getCachedTreeElement(ancestors[i]);if(treeElement)
+treeElement.onpopulate();}
+return this.getCachedTreeElement(representedObject);}
+TreeOutline.prototype.treeElementFromPoint=function(x,y)
+{var node=this._childrenListNode.ownerDocument.elementFromPoint(x,y);if(!node)
+return null;var listNode=node.enclosingNodeOrSelfWithNodeNameInArray(["ol","li"]);if(listNode)
+return listNode.parentTreeElement||listNode.treeElement;return null;}
+TreeOutline.prototype._treeKeyDown=function(event)
+{if(event.target!==this._childrenListNode)
+return;if(!this.selectedTreeElement||event.shiftKey||event.metaKey||event.ctrlKey)
+return;var handled=false;var nextSelectedElement;if(event.keyIdentifier==="Up"&&!event.altKey){nextSelectedElement=this.selectedTreeElement.traversePreviousTreeElement(true);while(nextSelectedElement&&!nextSelectedElement.selectable)
+nextSelectedElement=nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);handled=nextSelectedElement?true:false;}else if(event.keyIdentifier==="Down"&&!event.altKey){nextSelectedElement=this.selectedTreeElement.traverseNextTreeElement(true);while(nextSelectedElement&&!nextSelectedElement.selectable)
+nextSelectedElement=nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);handled=nextSelectedElement?true:false;}else if(event.keyIdentifier==="Left"){if(this.selectedTreeElement.expanded){if(event.altKey)
+this.selectedTreeElement.collapseRecursively();else
+this.selectedTreeElement.collapse();handled=true;}else if(this.selectedTreeElement.parent&&!this.selectedTreeElement.parent.root){handled=true;if(this.selectedTreeElement.parent.selectable){nextSelectedElement=this.selectedTreeElement.parent;while(nextSelectedElement&&!nextSelectedElement.selectable)
+nextSelectedElement=nextSelectedElement.parent;handled=nextSelectedElement?true:false;}else if(this.selectedTreeElement.parent)
+this.selectedTreeElement.parent.collapse();}}else if(event.keyIdentifier==="Right"){if(!this.selectedTreeElement.revealed()){this.selectedTreeElement.reveal();handled=true;}else if(this.selectedTreeElement.hasChildren){handled=true;if(this.selectedTreeElement.expanded){nextSelectedElement=this.selectedTreeElement.children[0];while(nextSelectedElement&&!nextSelectedElement.selectable)
+nextSelectedElement=nextSelectedElement.nextSibling;handled=nextSelectedElement?true:false;}else{if(event.altKey)
+this.selectedTreeElement.expandRecursively();else
+this.selectedTreeElement.expand();}}}else if(event.keyCode===8||event.keyCode===46)
+handled=this.selectedTreeElement.ondelete();else if(isEnterKey(event))
+handled=this.selectedTreeElement.onenter();else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Space.code)
+handled=this.selectedTreeElement.onspace();if(nextSelectedElement){nextSelectedElement.reveal();nextSelectedElement.select(false,true);}
+if(handled)
+event.consume(true);}
+TreeOutline.prototype.expand=function()
+{}
+TreeOutline.prototype.collapse=function()
+{}
+TreeOutline.prototype.revealed=function()
+{return true;}
+TreeOutline.prototype.reveal=function()
+{}
+TreeOutline.prototype.select=function()
+{}
+TreeOutline.prototype.revealAndSelect=function(omitFocus)
+{}
+function TreeElement(title,representedObject,hasChildren)
+{this._title=title;this.representedObject=(representedObject||{});this.root=false;this._hidden=false;this._selectable=true;this.expanded=false;this.selected=false;this.hasChildren=hasChildren;this.children=[];this.treeOutline=null;this.parent=null;this.previousSibling=null;this.nextSibling=null;this._listItemNode=null;}
+TreeElement.prototype={arrowToggleWidth:10,get selectable(){if(this._hidden)
+return false;return this._selectable;},set selectable(x){this._selectable=x;},get listItemElement(){return this._listItemNode;},get childrenListElement(){return this._childrenListNode;},get title(){return this._title;},set title(x){this._title=x;this._setListItemNodeContent();},get tooltip(){return this._tooltip;},set tooltip(x){this._tooltip=x;if(this._listItemNode)
+this._listItemNode.title=x?x:"";},get hasChildren(){return this._hasChildren;},set hasChildren(x){if(this._hasChildren===x)
+return;this._hasChildren=x;if(!this._listItemNode)
+return;if(x)
+this._listItemNode.classList.add("parent");else{this._listItemNode.classList.remove("parent");this.collapse();}},get hidden(){return this._hidden;},set hidden(x){if(this._hidden===x)
+return;this._hidden=x;if(x){if(this._listItemNode)
+this._listItemNode.classList.add("hidden");if(this._childrenListNode)
+this._childrenListNode.classList.add("hidden");}else{if(this._listItemNode)
+this._listItemNode.classList.remove("hidden");if(this._childrenListNode)
+this._childrenListNode.classList.remove("hidden");}},get shouldRefreshChildren(){return this._shouldRefreshChildren;},set shouldRefreshChildren(x){this._shouldRefreshChildren=x;if(x&&this.expanded)
+this.expand();},_setListItemNodeContent:function()
+{if(!this._listItemNode)
+return;if(typeof this._title==="string")
+this._listItemNode.textContent=this._title;else{this._listItemNode.removeChildren();if(this._title)
+this._listItemNode.appendChild(this._title);}}}
+TreeElement.prototype.appendChild=TreeOutline.prototype.appendChild;TreeElement.prototype.insertChild=TreeOutline.prototype.insertChild;TreeElement.prototype.insertBeforeChild=TreeOutline.prototype.insertBeforeChild;TreeElement.prototype.removeChild=TreeOutline.prototype.removeChild;TreeElement.prototype.removeChildAtIndex=TreeOutline.prototype.removeChildAtIndex;TreeElement.prototype.removeChildren=TreeOutline.prototype.removeChildren;TreeElement.prototype._attach=function()
+{if(!this._listItemNode||this.parent._shouldRefreshChildren){if(this._listItemNode&&this._listItemNode.parentNode)
+this._listItemNode.parentNode.removeChild(this._listItemNode);this._listItemNode=this.treeOutline._childrenListNode.ownerDocument.createElement("li");this._listItemNode.treeElement=this;this._setListItemNodeContent();this._listItemNode.title=this._tooltip?this._tooltip:"";if(this.hidden)
+this._listItemNode.classList.add("hidden");if(this.hasChildren)
+this._listItemNode.classList.add("parent");if(this.expanded)
+this._listItemNode.classList.add("expanded");if(this.selected)
+this._listItemNode.classList.add("selected");this._listItemNode.addEventListener("mousedown",TreeElement.treeElementMouseDown,false);this._listItemNode.addEventListener("click",TreeElement.treeElementToggled,false);this._listItemNode.addEventListener("dblclick",TreeElement.treeElementDoubleClicked,false);this.onattach();}
+var nextSibling=null;if(this.nextSibling&&this.nextSibling._listItemNode&&this.nextSibling._listItemNode.parentNode===this.parent._childrenListNode)
+nextSibling=this.nextSibling._listItemNode;this.parent._childrenListNode.insertBefore(this._listItemNode,nextSibling);if(this._childrenListNode)
+this.parent._childrenListNode.insertBefore(this._childrenListNode,this._listItemNode.nextSibling);if(this.selected)
+this.select();if(this.expanded)
+this.expand();}
+TreeElement.prototype._detach=function()
+{if(this._listItemNode&&this._listItemNode.parentNode)
+this._listItemNode.parentNode.removeChild(this._listItemNode);if(this._childrenListNode&&this._childrenListNode.parentNode)
+this._childrenListNode.parentNode.removeChild(this._childrenListNode);}
+TreeElement.treeElementMouseDown=function(event)
+{var element=event.currentTarget;if(!element||!element.treeElement||!element.treeElement.selectable)
+return;if(element.treeElement.isEventWithinDisclosureTriangle(event))
+return;element.treeElement.selectOnMouseDown(event);}
+TreeElement.treeElementToggled=function(event)
+{var element=event.currentTarget;if(!element||!element.treeElement)
+return;var toggleOnClick=element.treeElement.toggleOnClick&&!element.treeElement.selectable;var isInTriangle=element.treeElement.isEventWithinDisclosureTriangle(event);if(!toggleOnClick&&!isInTriangle)
+return;if(element.treeElement.expanded){if(event.altKey)
+element.treeElement.collapseRecursively();else
+element.treeElement.collapse();}else{if(event.altKey)
+element.treeElement.expandRecursively();else
+element.treeElement.expand();}
+event.consume();}
+TreeElement.treeElementDoubleClicked=function(event)
+{var element=event.currentTarget;if(!element||!element.treeElement)
+return;var handled=element.treeElement.ondblclick.call(element.treeElement,event);if(handled)
+return;if(element.treeElement.hasChildren&&!element.treeElement.expanded)
+element.treeElement.expand();}
+TreeElement.prototype.collapse=function()
+{if(this._listItemNode)
+this._listItemNode.classList.remove("expanded");if(this._childrenListNode)
+this._childrenListNode.classList.remove("expanded");this.expanded=false;if(this.treeOutline)
+this.treeOutline._expandedStateMap.put(this.representedObject,false);this.oncollapse();}
+TreeElement.prototype.collapseRecursively=function()
+{var item=this;while(item){if(item.expanded)
+item.collapse();item=item.traverseNextTreeElement(false,this,true);}}
+TreeElement.prototype.expand=function()
+{if(!this.hasChildren||(this.expanded&&!this._shouldRefreshChildren&&this._childrenListNode))
+return;this.expanded=true;if(this.treeOutline)
+this.treeOutline._expandedStateMap.put(this.representedObject,true);if(this.treeOutline&&(!this._childrenListNode||this._shouldRefreshChildren)){if(this._childrenListNode&&this._childrenListNode.parentNode)
+this._childrenListNode.parentNode.removeChild(this._childrenListNode);this._childrenListNode=this.treeOutline._childrenListNode.ownerDocument.createElement("ol");this._childrenListNode.parentTreeElement=this;this._childrenListNode.classList.add("children");if(this.hidden)
+this._childrenListNode.classList.add("hidden");this.onpopulate();for(var i=0;i<this.children.length;++i)
+this.children[i]._attach();delete this._shouldRefreshChildren;}
+if(this._listItemNode){this._listItemNode.classList.add("expanded");if(this._childrenListNode&&this._childrenListNode.parentNode!=this._listItemNode.parentNode)
+this.parent._childrenListNode.insertBefore(this._childrenListNode,this._listItemNode.nextSibling);}
+if(this._childrenListNode)
+this._childrenListNode.classList.add("expanded");this.onexpand();}
+TreeElement.prototype.expandRecursively=function(maxDepth)
+{var item=this;var info={};var depth=0;if(isNaN(maxDepth))
+maxDepth=3;while(item){if(depth<maxDepth)
+item.expand();item=item.traverseNextTreeElement(false,this,(depth>=maxDepth),info);depth+=info.depthChange;}}
+TreeElement.prototype.hasAncestor=function(ancestor){if(!ancestor)
+return false;var currentNode=this.parent;while(currentNode){if(ancestor===currentNode)
+return true;currentNode=currentNode.parent;}
+return false;}
+TreeElement.prototype.reveal=function()
+{var currentAncestor=this.parent;while(currentAncestor&&!currentAncestor.root){if(!currentAncestor.expanded)
+currentAncestor.expand();currentAncestor=currentAncestor.parent;}
+this.onreveal();}
+TreeElement.prototype.revealed=function()
+{var currentAncestor=this.parent;while(currentAncestor&&!currentAncestor.root){if(!currentAncestor.expanded)
+return false;currentAncestor=currentAncestor.parent;}
+return true;}
+TreeElement.prototype.selectOnMouseDown=function(event)
+{if(this.select(false,true))
+event.consume(true);}
+TreeElement.prototype.select=function(omitFocus,selectedByUser)
+{if(!this.treeOutline||!this.selectable||this.selected)
+return false;if(this.treeOutline.selectedTreeElement)
+this.treeOutline.selectedTreeElement.deselect();this.selected=true;if(!omitFocus)
+this.treeOutline._childrenListNode.focus();if(!this.treeOutline)
+return false;this.treeOutline.selectedTreeElement=this;if(this._listItemNode)
+this._listItemNode.classList.add("selected");return this.onselect(selectedByUser);}
+TreeElement.prototype.revealAndSelect=function(omitFocus)
+{this.reveal();this.select(omitFocus);}
+TreeElement.prototype.deselect=function(supressOnDeselect)
+{if(!this.treeOutline||this.treeOutline.selectedTreeElement!==this||!this.selected)
+return false;this.selected=false;this.treeOutline.selectedTreeElement=null;if(this._listItemNode)
+this._listItemNode.classList.remove("selected");return true;}
+TreeElement.prototype.onpopulate=function(){}
+TreeElement.prototype.onenter=function(){return false;}
+TreeElement.prototype.ondelete=function(){return false;}
+TreeElement.prototype.onspace=function(){return false;}
+TreeElement.prototype.onattach=function(){}
+TreeElement.prototype.onexpand=function(){}
+TreeElement.prototype.oncollapse=function(){}
+TreeElement.prototype.ondblclick=function(e){return false;}
+TreeElement.prototype.onreveal=function(){}
+TreeElement.prototype.onselect=function(selectedByUser){return false;}
+TreeElement.prototype.traverseNextTreeElement=function(skipUnrevealed,stayWithin,dontPopulate,info)
+{if(!dontPopulate&&this.hasChildren)
+this.onpopulate();if(info)
+info.depthChange=0;var element=skipUnrevealed?(this.revealed()?this.children[0]:null):this.children[0];if(element&&(!skipUnrevealed||(skipUnrevealed&&this.expanded))){if(info)
+info.depthChange=1;return element;}
+if(this===stayWithin)
+return null;element=skipUnrevealed?(this.revealed()?this.nextSibling:null):this.nextSibling;if(element)
+return element;element=this;while(element&&!element.root&&!(skipUnrevealed?(element.revealed()?element.nextSibling:null):element.nextSibling)&&element.parent!==stayWithin){if(info)
+info.depthChange-=1;element=element.parent;}
+if(!element)
+return null;return(skipUnrevealed?(element.revealed()?element.nextSibling:null):element.nextSibling);}
+TreeElement.prototype.traversePreviousTreeElement=function(skipUnrevealed,dontPopulate)
+{var element=skipUnrevealed?(this.revealed()?this.previousSibling:null):this.previousSibling;if(!dontPopulate&&element&&element.hasChildren)
+element.onpopulate();while(element&&(skipUnrevealed?(element.revealed()&&element.expanded?element.children[element.children.length-1]:null):element.children[element.children.length-1])){if(!dontPopulate&&element.hasChildren)
+element.onpopulate();element=(skipUnrevealed?(element.revealed()&&element.expanded?element.children[element.children.length-1]:null):element.children[element.children.length-1]);}
+if(element)
+return element;if(!this.parent||this.parent.root)
+return null;return this.parent;}
+TreeElement.prototype.isEventWithinDisclosureTriangle=function(event)
+{var paddingLeftValue=window.getComputedStyle(this._listItemNode).getPropertyCSSValue("padding-left");var computedLeftPadding=paddingLeftValue?paddingLeftValue.getFloatValue(CSSPrimitiveValue.CSS_PX):0;var left=this._listItemNode.totalOffsetLeft()+computedLeftPadding;return event.pageX>=left&&event.pageX<=left+this.arrowToggleWidth&&this.hasChildren;}
+window.WebInspector={_queryParamsObject:{}}
+WebInspector.Events={InspectorLoaded:"InspectorLoaded"}
+WebInspector.queryParam=function(name)
+{return WebInspector._queryParamsObject.hasOwnProperty(name)?WebInspector._queryParamsObject[name]:null;}
+{(function parseQueryParameters()
+{var queryParams=window.location.search;if(!queryParams)
+return;var params=queryParams.substring(1).split("&");for(var i=0;i<params.length;++i){var pair=params[i].split("=");WebInspector._queryParamsObject[pair[0]]=pair[1];}
+var settingsParam=WebInspector.queryParam("settings");if(settingsParam){try{var settings=JSON.parse(window.decodeURI(settingsParam));for(var key in settings)
+window.localStorage[key]=settings[key];}catch(e){}}})();}
+WebInspector.Main=function()
+{var boundListener=windowLoaded.bind(this);function windowLoaded()
+{this._loaded();window.removeEventListener("DOMContentLoaded",boundListener,false);}
+window.addEventListener("DOMContentLoaded",boundListener,false);}
+WebInspector.Main.prototype={_registerModules:function()
+{var configuration;if(!Capabilities.isMainFrontend){configuration=["main","sources","timeline","profiles","console","codemirror"];}else{configuration=["main","elements","network","sources","timeline","profiles","resources","audits","console","codemirror","extensions","settings"];if(WebInspector.experimentsSettings.layersPanel.isEnabled())
+configuration.push("layers");}
+WebInspector.moduleManager.registerModules(configuration);},_createGlobalStatusBarItems:function()
+{if(WebInspector.inspectElementModeController)
+WebInspector.inspectorView.appendToLeftToolbar(WebInspector.inspectElementModeController.toggleSearchButton.element);WebInspector.inspectorView.appendToRightToolbar(WebInspector.settingsController.statusBarItem);if(WebInspector.dockController.element)
+WebInspector.inspectorView.appendToRightToolbar(WebInspector.dockController.element);if(this._screencastController)
+WebInspector.inspectorView.appendToRightToolbar(this._screencastController.statusBarItem());},_createRootView:function()
+{var rootView=new WebInspector.RootView();this._rootSplitView=new WebInspector.SplitView(false,true,WebInspector.dockController.canDock()?"InspectorView.splitViewState":"InspectorView.dummySplitViewState",300,300);this._rootSplitView.show(rootView.element);WebInspector.inspectorView.show(this._rootSplitView.sidebarElement());var inspectedPagePlaceholder=new WebInspector.InspectedPagePlaceholder();inspectedPagePlaceholder.show(this._rootSplitView.mainElement());WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged,this._updateRootSplitViewOnDockSideChange,this);this._updateRootSplitViewOnDockSideChange();rootView.attachToBody();},_updateRootSplitViewOnDockSideChange:function()
+{var dockSide=WebInspector.dockController.dockSide();if(dockSide===WebInspector.DockController.State.Undocked){this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(),false);this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(),false);this._rootSplitView.hideMain();return;}
+this._rootSplitView.setVertical(dockSide===WebInspector.DockController.State.DockedToLeft||dockSide===WebInspector.DockController.State.DockedToRight);this._rootSplitView.setSecondIsSidebar(dockSide===WebInspector.DockController.State.DockedToRight||dockSide===WebInspector.DockController.State.DockedToBottom);this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(),true);this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(),dockSide===WebInspector.DockController.State.DockedToBottom);this._rootSplitView.showBoth();},_calculateWorkerInspectorTitle:function()
+{var expression="location.href";if(WebInspector.queryParam("isSharedWorker"))
+expression+=" + (this.name ? ' (' + this.name + ')' : '')";RuntimeAgent.invoke_evaluate({expression:expression,doNotPauseOnExceptionsAndMuteConsole:true,returnByValue:true},evalCallback);function evalCallback(error,result,wasThrown)
+{if(error||wasThrown){console.error(error);return;}
+InspectorFrontendHost.inspectedURLChanged(result.value);}},_loadCompletedForWorkers:function()
+{if(WebInspector.queryParam("workerPaused")){DebuggerAgent.pause();RuntimeAgent.run(calculateTitle.bind(this));}else if(!Capabilities.isMainFrontend){calculateTitle.call(this);}
+function calculateTitle()
+{this._calculateWorkerInspectorTitle();}},_resetErrorAndWarningCounts:function()
+{WebInspector.inspectorView.setErrorAndWarningCounts(0,0);},_updateErrorAndWarningCounts:function()
+{var errors=WebInspector.console.errors;var warnings=WebInspector.console.warnings;WebInspector.inspectorView.setErrorAndWarningCounts(errors,warnings);},_debuggerPaused:function()
+{WebInspector.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused,this._debuggerPaused,this);WebInspector.inspectorView.showPanel("sources");},_loaded:function()
+{if(!InspectorFrontendHost.sendMessageToEmbedder){var helpScreen=new WebInspector.HelpScreen(WebInspector.UIString("Incompatible Chrome version"));var p=helpScreen.contentElement.createChild("p","help-section");p.textContent=WebInspector.UIString("Please upgrade to a newer Chrome version (you might need a Dev or Canary build).");helpScreen.showModal();return;}
+InspectorBackend.loadFromJSONIfNeeded("../protocol.json");WebInspector.dockController=new WebInspector.DockController(!!WebInspector.queryParam("can_dock"));var onConnectionReady=this._doLoadedDone.bind(this);var workerId=WebInspector.queryParam("dedicatedWorkerId");if(workerId){new WebInspector.ExternalWorkerConnection(workerId,onConnectionReady);return;}
+var ws;if(WebInspector.queryParam("ws")){ws="ws://"+WebInspector.queryParam("ws");}else if(WebInspector.queryParam("page")){var page=WebInspector.queryParam("page");var host=WebInspector.queryParam("host")||window.location.host;ws="ws://"+host+"/devtools/page/"+page;}
+if(ws){document.body.classList.add("remote");new InspectorBackendClass.WebSocketConnection(ws,onConnectionReady);return;}
+if(!InspectorFrontendHost.isStub){new InspectorBackendClass.MainConnection(onConnectionReady);return;}
+InspectorFrontendAPI.dispatchQueryParameters(WebInspector.queryParam("dispatch"));new InspectorBackendClass.StubConnection(onConnectionReady);},_doLoadedDone:function(connection)
+{connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected,onDisconnected);function onDisconnected(event)
+{if(WebInspector._disconnectedScreenWithReasonWasShown)
+return;new WebInspector.RemoteDebuggingTerminatedScreen(event.data.reason).showModal();}
+InspectorBackend.setConnection(connection);WebInspector.installPortStyles();if(WebInspector.queryParam("toolbarColor")&&WebInspector.queryParam("textColor"))
+WebInspector.setToolbarColors(WebInspector.queryParam("toolbarColor"),WebInspector.queryParam("textColor"));WebInspector.targetManager=new WebInspector.TargetManager();WebInspector.targetManager.createTarget(connection,this._doLoadedDoneWithCapabilities.bind(this));},_doLoadedDoneWithCapabilities:function(mainTarget)
+{new WebInspector.VersionController().updateVersion();WebInspector.shortcutsScreen=new WebInspector.ShortcutsScreen();this._registerShortcuts();WebInspector.shortcutsScreen.section(WebInspector.UIString("Console"));WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));WebInspector.ShortcutsScreen.registerShortcuts();if(WebInspector.experimentsSettings.workersInMainWindow.isEnabled())
+new WebInspector.WorkerTargetManager(mainTarget,WebInspector.targetManager);WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._resetErrorAndWarningCounts,this);WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,this._updateErrorAndWarningCounts,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused,this._debuggerPaused,this);WebInspector.networkLog=new WebInspector.NetworkLog();WebInspector.zoomManager=new WebInspector.ZoomManager();WebInspector.advancedSearchController=new WebInspector.AdvancedSearchController();InspectorBackend.registerInspectorDispatcher(this);WebInspector.isolatedFileSystemManager=new WebInspector.IsolatedFileSystemManager();WebInspector.isolatedFileSystemDispatcher=new WebInspector.IsolatedFileSystemDispatcher(WebInspector.isolatedFileSystemManager);WebInspector.workspace=new WebInspector.Workspace(WebInspector.isolatedFileSystemManager.mapping());WebInspector.cssModel=new WebInspector.CSSStyleModel(WebInspector.workspace);WebInspector.timelineManager=new WebInspector.TimelineManager();WebInspector.tracingAgent=new WebInspector.TracingAgent();if(Capabilities.isMainFrontend){WebInspector.inspectElementModeController=new WebInspector.InspectElementModeController();WebInspector.workerFrontendManager=new WebInspector.WorkerFrontendManager();}else{mainTarget.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerDisconnected,onWorkerDisconnected);}
+function onWorkerDisconnected()
+{var screen=new WebInspector.WorkerTerminatedScreen();var listener=hideScreen.bind(null,screen);mainTarget.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,listener);function hideScreen(screen)
+{mainTarget.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,listener);screen.hide();}
+screen.showModal();}
+WebInspector.settingsController=new WebInspector.SettingsController();WebInspector.domBreakpointsSidebarPane=new WebInspector.DOMBreakpointsSidebarPane();var autoselectPanel=WebInspector.UIString("a panel chosen automatically");var openAnchorLocationSetting=WebInspector.settings.createSetting("openLinkHandler",autoselectPanel);WebInspector.openAnchorLocationRegistry=new WebInspector.HandlerRegistry(openAnchorLocationSetting);WebInspector.openAnchorLocationRegistry.registerHandler(autoselectPanel,function(){return false;});WebInspector.Linkifier.setLinkHandler(new WebInspector.HandlerRegistry.LinkHandler());new WebInspector.WorkspaceController(WebInspector.workspace);WebInspector.fileSystemWorkspaceProvider=new WebInspector.FileSystemWorkspaceProvider(WebInspector.isolatedFileSystemManager,WebInspector.workspace);WebInspector.networkWorkspaceProvider=new WebInspector.SimpleWorkspaceProvider(WebInspector.workspace,WebInspector.projectTypes.Network);new WebInspector.NetworkUISourceCodeProvider(WebInspector.networkWorkspaceProvider,WebInspector.workspace);WebInspector.breakpointManager=new WebInspector.BreakpointManager(WebInspector.settings.breakpoints,WebInspector.debuggerModel,WebInspector.workspace);WebInspector.scriptSnippetModel=new WebInspector.ScriptSnippetModel(WebInspector.workspace);WebInspector.overridesSupport=new WebInspector.OverridesSupport();WebInspector.overridesSupport.applyInitialOverrides();new WebInspector.DebuggerScriptMapping(WebInspector.debuggerModel,WebInspector.workspace,WebInspector.networkWorkspaceProvider);WebInspector.liveEditSupport=new WebInspector.LiveEditSupport(WebInspector.workspace);new WebInspector.CSSStyleSheetMapping(WebInspector.cssModel,WebInspector.workspace,WebInspector.networkWorkspaceProvider);new WebInspector.PresentationConsoleMessageHelper(WebInspector.workspace);WebInspector.settings.initializeBackendSettings();this._registerModules();WebInspector.KeyboardShortcut.registerActions();WebInspector.panels={};WebInspector.inspectorView=new WebInspector.InspectorView();if(mainTarget.canScreencast)
+this._screencastController=new WebInspector.ScreencastController();else
+this._createRootView();this._createGlobalStatusBarItems();this._addMainEventListeners(document);function onResize()
+{if(WebInspector.settingsController)
+WebInspector.settingsController.resize();}
+window.addEventListener("resize",onResize,true);var errorWarningCount=document.getElementById("error-warning-count");function showConsole()
+{WebInspector.console.show();}
+errorWarningCount.addEventListener("click",showConsole,false);this._updateErrorAndWarningCounts();WebInspector.extensionServerProxy.setFrontendReady();WebInspector.databaseModel=new WebInspector.DatabaseModel();WebInspector.domStorageModel=new WebInspector.DOMStorageModel();WebInspector.cpuProfilerModel=new WebInspector.CPUProfilerModel();InspectorAgent.enable(inspectorAgentEnableCallback.bind(this));function inspectorAgentEnableCallback()
+{WebInspector.inspectorView.showInitialPanel();if(WebInspector.overridesSupport.hasActiveOverrides())
+WebInspector.inspectorView.showViewInDrawer("emulation",true);WebInspector.settings.showMetricsRulers.addChangeListener(showRulersChanged);function showRulersChanged()
+{PageAgent.setShowViewportSizeOnResize(true,WebInspector.settings.showMetricsRulers.get());}
+showRulersChanged();if(this._screencastController)
+this._screencastController.initialize();}
+this._loadCompletedForWorkers();InspectorFrontendAPI.loadCompleted();WebInspector.notifications.dispatchEventToListeners(WebInspector.NotificationService.Events.InspectorLoaded);},_documentClick:function(event)
+{var anchor=event.target.enclosingNodeOrSelfWithNodeName("a");if(!anchor||!anchor.href||(anchor.target==="_blank"))
+return;event.consume(true);function followLink()
+{if(WebInspector.isBeingEdited(event.target))
+return;if(WebInspector.openAnchorLocationRegistry.dispatch({url:anchor.href,lineNumber:anchor.lineNumber}))
+return;var uiSourceCode=WebInspector.workspace.uiSourceCodeForURL(anchor.href);if(uiSourceCode){WebInspector.Revealer.reveal(new WebInspector.UILocation(uiSourceCode,anchor.lineNumber||0,anchor.columnNumber||0));return;}
+var resource=WebInspector.resourceForURL(anchor.href);if(resource){WebInspector.Revealer.reveal(resource);return;}
+var request=WebInspector.networkLog.requestForURL(anchor.href);if(request){WebInspector.Revealer.reveal(request);return;}
+InspectorFrontendHost.openInNewTab(anchor.href);}
+if(WebInspector.followLinkTimeout)
+clearTimeout(WebInspector.followLinkTimeout);if(anchor.preventFollowOnDoubleClick){if(event.detail===1)
+WebInspector.followLinkTimeout=setTimeout(followLink,333);return;}
+followLink();},_registerShortcuts:function()
+{var shortcut=WebInspector.KeyboardShortcut;var section=WebInspector.shortcutsScreen.section(WebInspector.UIString("All Panels"));var keys=[shortcut.makeDescriptor("[",shortcut.Modifiers.CtrlOrMeta),shortcut.makeDescriptor("]",shortcut.Modifiers.CtrlOrMeta)];section.addRelatedKeys(keys,WebInspector.UIString("Go to the panel to the left/right"));keys=[shortcut.makeDescriptor("[",shortcut.Modifiers.CtrlOrMeta|shortcut.Modifiers.Alt),shortcut.makeDescriptor("]",shortcut.Modifiers.CtrlOrMeta|shortcut.Modifiers.Alt)];section.addRelatedKeys(keys,WebInspector.UIString("Go back/forward in panel history"));var toggleConsoleLabel=WebInspector.UIString("Show console");section.addKey(shortcut.makeDescriptor(shortcut.Keys.Tilde,shortcut.Modifiers.Ctrl),toggleConsoleLabel);var doNotOpenDrawerOnEsc=WebInspector.experimentsSettings.doNotOpenDrawerOnEsc.isEnabled();var toggleDrawerLabel=doNotOpenDrawerOnEsc?WebInspector.UIString("Hide drawer"):WebInspector.UIString("Toggle drawer");section.addKey(shortcut.makeDescriptor(shortcut.Keys.Esc),toggleDrawerLabel);section.addKey(shortcut.makeDescriptor("f",shortcut.Modifiers.CtrlOrMeta),WebInspector.UIString("Search"));var advancedSearchShortcut=WebInspector.AdvancedSearchController.createShortcut();section.addKey(advancedSearchShortcut,WebInspector.UIString("Search across all sources"));var inspectElementModeShortcut=WebInspector.InspectElementModeController.createShortcut();section.addKey(inspectElementModeShortcut,WebInspector.UIString("Select node to inspect"));var openResourceShortcut=WebInspector.KeyboardShortcut.makeDescriptor("o",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);section.addKey(openResourceShortcut,WebInspector.UIString("Go to source"));if(WebInspector.isMac()){keys=[shortcut.makeDescriptor("g",shortcut.Modifiers.Meta),shortcut.makeDescriptor("g",shortcut.Modifiers.Meta|shortcut.Modifiers.Shift)];section.addRelatedKeys(keys,WebInspector.UIString("Find next/previous"));}},_handleZoomEvent:function(event)
+{switch(event.keyCode){case 107:case 187:InspectorFrontendHost.zoomIn();return true;case 109:case 189:InspectorFrontendHost.zoomOut();return true;case 48:case 96:if(!event.shiftKey){InspectorFrontendHost.resetZoom();return true;}
+break;}
+return false;},_postDocumentKeyDown:function(event)
+{if(event.handled)
+return;if(!WebInspector.Dialog.currentInstance()&&WebInspector.inspectorView.currentPanel()){WebInspector.inspectorView.currentPanel().handleShortcut(event);if(event.handled){event.consume(true);return;}}
+if(!WebInspector.Dialog.currentInstance()&&WebInspector.advancedSearchController.handleShortcut(event))
+return;if(!WebInspector.Dialog.currentInstance()&&WebInspector.inspectElementModeController&&WebInspector.inspectElementModeController.handleShortcut(event))
+return;var isValidZoomShortcut=WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event)&&!event.altKey&&!InspectorFrontendHost.isStub;if(!WebInspector.Dialog.currentInstance()&&isValidZoomShortcut&&this._handleZoomEvent(event)){event.consume(true);return;}
+WebInspector.KeyboardShortcut.handleShortcut(event);},_documentCanCopy:function(event)
+{if(WebInspector.inspectorView.currentPanel()&&WebInspector.inspectorView.currentPanel()["handleCopyEvent"])
+event.preventDefault();},_documentCopy:function(event)
+{if(WebInspector.inspectorView.currentPanel()&&WebInspector.inspectorView.currentPanel()["handleCopyEvent"])
+WebInspector.inspectorView.currentPanel()["handleCopyEvent"](event);},_contextMenuEventFired:function(event)
+{if(event.handled||event.target.classList.contains("popup-glasspane"))
+event.preventDefault();},_inspectNodeRequested:function(event)
+{this._updateFocusedNode(event.data);},_updateFocusedNode:function(nodeId)
+{var node=WebInspector.domModel.nodeForId(nodeId);console.assert(node);WebInspector.Revealer.reveal(node);},_addMainEventListeners:function(doc)
+{doc.addEventListener("keydown",this._postDocumentKeyDown.bind(this),false);doc.addEventListener("beforecopy",this._documentCanCopy.bind(this),true);doc.addEventListener("copy",this._documentCopy.bind(this),false);doc.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),true);doc.addEventListener("click",this._documentClick.bind(this),false);},inspect:function(payload,hints)
+{var object=WebInspector.RemoteObject.fromPayload(payload);if(object.subtype==="node"){object.pushNodeToFrontend(callback);var elementsPanel=(WebInspector.inspectorView.panel("elements"));elementsPanel.omitDefaultSelection();WebInspector.inspectorView.setCurrentPanel(elementsPanel);return;}
+function callback(nodeId)
+{elementsPanel.stopOmittingDefaultSelection();WebInspector.Revealer.reveal(WebInspector.domModel.nodeForId(nodeId));if(!WebInspector.inspectorView.drawerVisible()&&!WebInspector._notFirstInspectElement)
+InspectorFrontendHost.inspectElementCompleted();WebInspector._notFirstInspectElement=true;object.release();}
+if(object.type==="function"){DebuggerAgent.getFunctionDetails(object.objectId,didGetDetails);return;}
+function didGetDetails(error,response)
+{object.release();if(error){console.error(error);return;}
+var uiLocation=WebInspector.debuggerModel.rawLocationToUILocation(response.location);if(!uiLocation)
+return;(WebInspector.inspectorView.panel("sources")).showUILocation(uiLocation,true);}
+if(hints.copyToClipboard)
+InspectorFrontendHost.copyText(object.value);object.release();},detached:function(reason)
+{WebInspector._disconnectedScreenWithReasonWasShown=true;new WebInspector.RemoteDebuggingTerminatedScreen(reason).showModal();},targetCrashed:function()
+{(new WebInspector.HelpScreenUntilReload(WebInspector.UIString("Inspected target crashed"),WebInspector.UIString("Inspected target has crashed. Once it reloads we will attach to it automatically."))).showModal();},evaluateForTestInFrontend:function(callId,script)
+{WebInspector.evaluateForTestInFrontend(callId,script);}}
+WebInspector.reload=function()
+{InspectorAgent.reset();window.location.reload();}
+WebInspector.Main.ReloadActionDelegate=function()
+{}
+WebInspector.Main.ReloadActionDelegate.prototype={handleAction:function()
+{if(!WebInspector.Dialog.currentInstance()){WebInspector.debuggerModel.skipAllPauses(true,true);WebInspector.resourceTreeModel.reloadPage(false);}
+return true;}}
+WebInspector.Main.HardReloadActionDelegate=function()
+{}
+WebInspector.Main.HardReloadActionDelegate.prototype={handleAction:function()
+{if(!WebInspector.Dialog.currentInstance()){WebInspector.debuggerModel.skipAllPauses(true,true);WebInspector.resourceTreeModel.reloadPage(true);}
+return true;}}
+WebInspector.Main.DebugReloadActionDelegate=function()
+{}
+WebInspector.Main.DebugReloadActionDelegate.prototype={handleAction:function()
+{WebInspector.reload();return true;}}
+new WebInspector.Main();window.DEBUG=true;WebInspector.__defineGetter__("inspectedPageURL",function()
+{return WebInspector.resourceTreeModel.inspectedPageURL();});WebInspector.panel=function(name)
+{return WebInspector.inspectorView.panel(name);}
+WebInspector.ModuleManager=function(descriptors)
+{this._modules=[];this._modulesMap={};this._extensions=[];this._cachedTypeClasses={};this._descriptorsMap={};for(var i=0;i<descriptors.length;++i)
+this._descriptorsMap[descriptors[i]["name"]]=descriptors[i];}
+WebInspector.ModuleManager.prototype={registerModules:function(configuration)
+{for(var i=0;i<configuration.length;++i)
+this.registerModule(configuration[i]);},registerModule:function(moduleName)
+{if(!this._descriptorsMap[moduleName])
+throw new Error("Module is not defined: "+moduleName+" "+new Error().stack);var module=new WebInspector.ModuleManager.Module(this,this._descriptorsMap[moduleName]);this._modules.push(module);this._modulesMap[moduleName]=module;},loadModule:function(moduleName)
+{this._modulesMap[moduleName]._load();},extensions:function(type,context)
+{function filter(extension)
+{if(extension._type!==type&&extension._typeClass()!==type)
+return false;return!context||extension.isApplicable(context);}
+return this._extensions.filter(filter);},extension:function(type,context)
+{return this.extensions(type,context)[0]||null;},instances:function(type,context)
+{function instantiate(extension)
+{return extension.instance();}
+return this.extensions(type,context).filter(instantiate).map(instantiate);},instance:function(type,context)
+{var extension=this.extension(type,context);return extension?extension.instance():null;},orderComparator:function(type,nameProperty,orderProperty)
+{var extensions=this.extensions(type);var orderForName={};for(var i=0;i<extensions.length;++i){var descriptor=extensions[i].descriptor();orderForName[descriptor[nameProperty]]=descriptor[orderProperty];}
+function result(name1,name2)
+{if(name1 in orderForName&&name2 in orderForName)
+return orderForName[name1]-orderForName[name2];if(name1 in orderForName)
+return-1;if(name2 in orderForName)
+return 1;return name1.compareTo(name2);}
+return result;},resolve:function(typeName)
+{if(!this._cachedTypeClasses[typeName]){try{this._cachedTypeClasses[typeName]=(window.eval(typeName.substring(1)));}catch(e){}}
+return this._cachedTypeClasses[typeName];}}
+WebInspector.ModuleManager.ModuleDescriptor=function()
+{this.name;this.extensions;this.scripts;}
+WebInspector.ModuleManager.ExtensionDescriptor=function()
+{this.type;this.className;this.contextTypes;}
+WebInspector.ModuleManager.Module=function(manager,descriptor)
+{this._manager=manager;this._descriptor=descriptor;this._name=descriptor.name;var extensions=(descriptor.extensions);for(var i=0;extensions&&i<extensions.length;++i)
+this._manager._extensions.push(new WebInspector.ModuleManager.Extension(this,extensions[i]));this._loaded=false;}
+WebInspector.ModuleManager.Module.prototype={name:function()
+{return this._name;},_load:function()
+{if(this._loaded)
+return;if(this._isLoading){var oldStackTraceLimit=Error.stackTraceLimit;Error.stackTraceLimit=50;console.assert(false,"Module "+this._name+" is loaded from itself: "+new Error().stack);Error.stackTraceLimit=oldStackTraceLimit;return;}
+this._isLoading=true;var scripts=this._descriptor.scripts;for(var i=0;scripts&&i<scripts.length;++i)
+loadScript(scripts[i]);this._isLoading=false;this._loaded=true;}}
+WebInspector.ModuleManager.Extension=function(module,descriptor)
+{this._module=module;this._descriptor=descriptor;this._type=descriptor.type;this._hasTypeClass=!!this._type.startsWith("@");this._className=descriptor.className||null;}
+WebInspector.ModuleManager.Extension.prototype={descriptor:function()
+{return this._descriptor;},module:function()
+{return this._module;},_typeClass:function()
+{if(!this._hasTypeClass)
+return null;return this._module._manager.resolve(this._type);},isApplicable:function(context)
+{var contextTypes=(this._descriptor.contextTypes);if(!contextTypes)
+return true;for(var i=0;i<contextTypes.length;++i){var contextType=(window.eval(contextTypes[i]));if(context instanceof contextType)
+return true;}
+return false;},instance:function()
+{if(!this._className)
+return null;if(!this._instance){this._module._load();var constructorFunction=window.eval(this._className);if(!(constructorFunction instanceof Function))
+return null;this._instance=new constructorFunction();}
+return this._instance;}}
+WebInspector.Renderer=function()
+{}
+WebInspector.Renderer.prototype={render:function(object){}}
+WebInspector.Revealer=function()
+{}
+WebInspector.Revealer.reveal=function(revealable,lineNumber)
+{if(!revealable)
+return;var revealer=WebInspector.moduleManager.instance(WebInspector.Revealer,revealable);if(revealer)
+revealer.reveal(revealable,lineNumber);}
+WebInspector.Revealer.prototype={reveal:function(object){}}
+WebInspector.ActionDelegate=function()
+{}
+WebInspector.ActionDelegate.prototype={handleAction:function(event){}}
+WebInspector.moduleManager=new WebInspector.ModuleManager(allDescriptors);WebInspector.platform=function()
+{if(!WebInspector._platform)
+WebInspector._platform=InspectorFrontendHost.platform();return WebInspector._platform;}
+WebInspector.isMac=function()
+{if(typeof WebInspector._isMac==="undefined")
+WebInspector._isMac=WebInspector.platform()==="mac";return WebInspector._isMac;}
+WebInspector.isWin=function()
+{if(typeof WebInspector._isWin==="undefined")
+WebInspector._isWin=WebInspector.platform()==="windows";return WebInspector._isWin;}
+WebInspector.PlatformFlavor={WindowsVista:"windows-vista",MacTiger:"mac-tiger",MacLeopard:"mac-leopard",MacSnowLeopard:"mac-snowleopard",MacLion:"mac-lion"}
+WebInspector.platformFlavor=function()
+{function detectFlavor()
+{const userAgent=navigator.userAgent;if(WebInspector.platform()==="windows"){var match=userAgent.match(/Windows NT (\d+)\.(?:\d+)/);if(match&&match[1]>=6)
+return WebInspector.PlatformFlavor.WindowsVista;return null;}else if(WebInspector.platform()==="mac"){var match=userAgent.match(/Mac OS X\s*(?:(\d+)_(\d+))?/);if(!match||match[1]!=10)
+return WebInspector.PlatformFlavor.MacSnowLeopard;switch(Number(match[2])){case 4:return WebInspector.PlatformFlavor.MacTiger;case 5:return WebInspector.PlatformFlavor.MacLeopard;case 6:return WebInspector.PlatformFlavor.MacSnowLeopard;case 7:return WebInspector.PlatformFlavor.MacLion;case 8:case 9:default:return"";}}}
+if(!WebInspector._platformFlavor)
+WebInspector._platformFlavor=detectFlavor();return WebInspector._platformFlavor;}
+WebInspector.port=function()
+{if(!WebInspector._port)
+WebInspector._port=InspectorFrontendHost.port();return WebInspector._port;}
+WebInspector.fontFamily=function()
+{if(WebInspector._fontFamily)
+return WebInspector._fontFamily;switch(WebInspector.platform()){case"linux":WebInspector._fontFamily="Ubuntu, Arial, sans-serif";break;case"mac":WebInspector._fontFamily="'Lucida Grande', sans-serif";break;case"windows":WebInspector._fontFamily="'Segoe UI', Tahoma, sans-serif";break;}
+return WebInspector._fontFamily;}
+WebInspector.Geometry={};WebInspector.Geometry._Eps=1e-5;WebInspector.Geometry.Vector=function(x,y,z)
+{this.x=x;this.y=y;this.z=z;}
+WebInspector.Geometry.Vector.prototype={length:function()
+{return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);},normalize:function()
+{var length=this.length();if(length<=WebInspector.Geometry._Eps)
+return;this.x/=length;this.y/=length;this.z/=length;}}
+WebInspector.Geometry.EulerAngles=function(alpha,beta,gamma)
+{this.alpha=alpha;this.beta=beta;this.gamma=gamma;}
+WebInspector.Geometry.EulerAngles.fromRotationMatrix=function(rotationMatrix)
+{var beta=Math.atan2(rotationMatrix.m23,rotationMatrix.m33);var gamma=Math.atan2(-rotationMatrix.m13,Math.sqrt(rotationMatrix.m11*rotationMatrix.m11+rotationMatrix.m12*rotationMatrix.m12));var alpha=Math.atan2(rotationMatrix.m12,rotationMatrix.m11);return new WebInspector.Geometry.EulerAngles(WebInspector.Geometry.radToDeg(alpha),WebInspector.Geometry.radToDeg(beta),WebInspector.Geometry.radToDeg(gamma));}
+WebInspector.Geometry.scalarProduct=function(u,v)
+{return u.x*v.x+u.y*v.y+u.z*v.z;}
+WebInspector.Geometry.crossProduct=function(u,v)
+{var x=u.y*v.z-u.z*v.y;var y=u.z*v.x-u.x*v.z;var z=u.x*v.y-u.y*v.x;return new WebInspector.Geometry.Vector(x,y,z);}
+WebInspector.Geometry.calculateAngle=function(u,v)
+{var uLength=u.length();var vLength=v.length();if(uLength<=WebInspector.Geometry._Eps||vLength<=WebInspector.Geometry._Eps)
+return 0;var cos=WebInspector.Geometry.scalarProduct(u,v)/uLength/vLength;if(Math.abs(cos)>1)
+return 0;return WebInspector.Geometry.radToDeg(Math.acos(cos));}
+WebInspector.Geometry.radToDeg=function(rad)
+{return rad*180/Math.PI;}
+WebInspector.UIString=function(string,vararg)
+{return String.vsprintf(string,Array.prototype.slice.call(arguments,1));}
+WebInspector.Object=function(){}
+WebInspector.Object.prototype={addEventListener:function(eventType,listener,thisObject)
+{if(!listener)
+console.assert(false);if(!this._listeners)
+this._listeners={};if(!this._listeners[eventType])
+this._listeners[eventType]=[];this._listeners[eventType].push({thisObject:thisObject,listener:listener});},removeEventListener:function(eventType,listener,thisObject)
+{console.assert(listener);if(!this._listeners||!this._listeners[eventType])
+return;var listeners=this._listeners[eventType];for(var i=0;i<listeners.length;++i){if(listener&&listeners[i].listener===listener&&listeners[i].thisObject===thisObject)
+listeners.splice(i,1);else if(!listener&&thisObject&&listeners[i].thisObject===thisObject)
+listeners.splice(i,1);}
+if(!listeners.length)
+delete this._listeners[eventType];},removeAllListeners:function()
+{delete this._listeners;},hasEventListeners:function(eventType)
+{if(!this._listeners||!this._listeners[eventType])
+return false;return true;},dispatchEventToListeners:function(eventType,eventData)
+{if(!this._listeners||!this._listeners[eventType])
+return false;var event=new WebInspector.Event(this,eventType,eventData);var listeners=this._listeners[eventType].slice(0);for(var i=0;i<listeners.length;++i){listeners[i].listener.call(listeners[i].thisObject,event);if(event._stoppedPropagation)
+break;}
+return event.defaultPrevented;}}
+WebInspector.Event=function(target,type,data)
+{this.target=target;this.type=type;this.data=data;this.defaultPrevented=false;this._stoppedPropagation=false;}
+WebInspector.Event.prototype={stopPropagation:function()
+{this._stoppedPropagation=true;},preventDefault:function()
+{this.defaultPrevented=true;},consume:function(preventDefault)
+{this.stopPropagation();if(preventDefault)
+this.preventDefault();}}
+WebInspector.EventTarget=function()
+{}
+WebInspector.EventTarget.prototype={addEventListener:function(eventType,listener,thisObject){},removeEventListener:function(eventType,listener,thisObject){},removeAllListeners:function(){},hasEventListeners:function(eventType){},dispatchEventToListeners:function(eventType,eventData){},}
+function InspectorBackendClass()
+{this._connection=null;this._agentPrototypes={};this._dispatcherPrototypes={};this._initialized=false;this._enums={};this._initProtocolAgentsConstructor();}
+InspectorBackendClass.prototype={_initProtocolAgentsConstructor:function()
+{window.Protocol={};window.Protocol.Agents=function(agentsMap){this._agentsMap=agentsMap;};},_addAgentGetterMethodToProtocolAgentsPrototype:function(domain)
+{var upperCaseLength=0;while(upperCaseLength<domain.length&&domain[upperCaseLength].toLowerCase()!==domain[upperCaseLength])
+++upperCaseLength;var methodName=domain.substr(0,upperCaseLength).toLowerCase()+domain.slice(upperCaseLength)+"Agent";function agentGetter()
+{return this._agentsMap[domain];}
+window.Protocol.Agents.prototype[methodName]=agentGetter;function registerDispatcher(dispatcher)
+{this.registerDispatcher(domain,dispatcher)}
+window.Protocol.Agents.prototype["register"+domain+"Dispatcher"]=registerDispatcher;},connection:function()
+{if(!this._connection)
+throw"Main connection was not initialized";return this._connection;},setConnection:function(connection)
+{this._connection=connection;this._connection.registerAgentsOn(window);for(var type in this._enums){var domainAndMethod=type.split(".");window[domainAndMethod[0]+"Agent"][domainAndMethod[1]]=this._enums[type];}},_agentPrototype:function(domain)
+{if(!this._agentPrototypes[domain]){this._agentPrototypes[domain]=new InspectorBackendClass.AgentPrototype(domain);this._addAgentGetterMethodToProtocolAgentsPrototype(domain);}
+return this._agentPrototypes[domain];},_dispatcherPrototype:function(domain)
+{if(!this._dispatcherPrototypes[domain])
+this._dispatcherPrototypes[domain]=new InspectorBackendClass.DispatcherPrototype();return this._dispatcherPrototypes[domain];},registerCommand:function(method,signature,replyArgs,hasErrorData)
+{var domainAndMethod=method.split(".");this._agentPrototype(domainAndMethod[0]).registerCommand(domainAndMethod[1],signature,replyArgs,hasErrorData);this._initialized=true;},registerEnum:function(type,values)
+{this._enums[type]=values;this._initialized=true;},registerEvent:function(eventName,params)
+{var domain=eventName.split(".")[0];this._dispatcherPrototype(domain).registerEvent(eventName,params);this._initialized=true;},registerDomainDispatcher:function(domain,dispatcher)
+{this._connection.registerDispatcher(domain,dispatcher);},loadFromJSONIfNeeded:function(jsonUrl)
+{if(this._initialized)
+return;var xhr=new XMLHttpRequest();xhr.open("GET",jsonUrl,false);xhr.send(null);var schema=JSON.parse(xhr.responseText);var code=InspectorBackendClass._generateCommands(schema);eval(code);},wrapClientCallback:function(clientCallback,errorPrefix,constructor,defaultValue)
+{function callbackWrapper(error,value)
+{if(error){console.error(errorPrefix+error);clientCallback(defaultValue);return;}
+if(constructor)
+clientCallback(new constructor(value));else
+clientCallback(value);}
+return callbackWrapper;}}
+InspectorBackendClass._generateCommands=function(schema){var jsTypes={integer:"number",array:"object"};var rawTypes={};var result=[];var domains=schema["domains"]||[];for(var i=0;i<domains.length;++i){var domain=domains[i];for(var j=0;domain.types&&j<domain.types.length;++j){var type=domain.types[j];rawTypes[domain.domain+"."+type.id]=jsTypes[type.type]||type.type;}}
+function toUpperCase(groupIndex,group0,group1)
+{return[group0,group1][groupIndex].toUpperCase();}
+function generateEnum(enumName,items)
+{var members=[]
+for(var m=0;m<items.length;++m){var value=items[m];var name=value.replace(/-(\w)/g,toUpperCase.bind(null,1)).toTitleCase();name=name.replace(/HTML|XML|WML|API/ig,toUpperCase.bind(null,0));members.push(name+": \""+value+"\"");}
+return"InspectorBackend.registerEnum(\""+enumName+"\", {"+members.join(", ")+"});";}
+for(var i=0;i<domains.length;++i){var domain=domains[i];var types=domain["types"]||[];for(var j=0;j<types.length;++j){var type=types[j];if((type["type"]==="string")&&type["enum"])
+result.push(generateEnum(domain.domain+"."+type.id,type["enum"]));else if(type["type"]==="object"){var properties=type["properties"]||[];for(var k=0;k<properties.length;++k){var property=properties[k];if((property["type"]==="string")&&property["enum"])
+result.push(generateEnum(domain.domain+"."+type.id+property["name"].toTitleCase(),property["enum"]));}}}
+var commands=domain["commands"]||[];for(var j=0;j<commands.length;++j){var command=commands[j];var parameters=command["parameters"];var paramsText=[];for(var k=0;parameters&&k<parameters.length;++k){var parameter=parameters[k];var type;if(parameter.type)
+type=jsTypes[parameter.type]||parameter.type;else{var ref=parameter["$ref"];if(ref.indexOf(".")!==-1)
+type=rawTypes[ref];else
+type=rawTypes[domain.domain+"."+ref];}
+var text="{\"name\": \""+parameter.name+"\", \"type\": \""+type+"\", \"optional\": "+(parameter.optional?"true":"false")+"}";paramsText.push(text);}
+var returnsText=[];var returns=command["returns"]||[];for(var k=0;k<returns.length;++k){var parameter=returns[k];returnsText.push("\""+parameter.name+"\"");}
+var hasErrorData=String(Boolean(command.error));result.push("InspectorBackend.registerCommand(\""+domain.domain+"."+command.name+"\", ["+paramsText.join(", ")+"], ["+returnsText.join(", ")+"], "+hasErrorData+");");}
+for(var j=0;domain.events&&j<domain.events.length;++j){var event=domain.events[j];var paramsText=[];for(var k=0;event.parameters&&k<event.parameters.length;++k){var parameter=event.parameters[k];paramsText.push("\""+parameter.name+"\"");}
+result.push("InspectorBackend.registerEvent(\""+domain.domain+"."+event.name+"\", ["+paramsText.join(", ")+"]);");}
+result.push("InspectorBackend.register"+domain.domain+"Dispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, \""+domain.domain+"\");");}
+return result.join("\n");}
+InspectorBackendClass.Connection=function()
+{this._lastMessageId=1;this._pendingResponsesCount=0;this._agents={};this._dispatchers={};this._callbacks={};this._initialize(InspectorBackend._agentPrototypes,InspectorBackend._dispatcherPrototypes);}
+InspectorBackendClass.Connection.Events={Disconnected:"Disconnected",}
+InspectorBackendClass.Connection.prototype={_initialize:function(agentPrototypes,dispatcherPrototypes)
+{for(var domain in agentPrototypes){this._agents[domain]=Object.create(agentPrototypes[domain]);this._agents[domain].setConnection(this);}
+for(var domain in dispatcherPrototypes)
+this._dispatchers[domain]=Object.create(dispatcherPrototypes[domain])},registerAgentsOn:function(object)
+{for(var domain in this._agents)
+object[domain+"Agent"]=this._agents[domain];},nextMessageId:function()
+{return this._lastMessageId++;},agent:function(domain)
+{return this._agents[domain];},agentsMap:function()
+{return this._agents;},_wrapCallbackAndSendMessageObject:function(domain,method,params,callback)
+{var messageObject={};messageObject.method=method;if(params)
+messageObject.params=params;var wrappedCallback=this._wrap(callback,domain,method);var messageId=this.nextMessageId();messageObject.id=messageId;if(InspectorBackendClass.Options.dumpInspectorProtocolMessages)
+console.log("frontend: "+JSON.stringify(messageObject));this.sendMessage(messageObject);++this._pendingResponsesCount;this._callbacks[messageId]=wrappedCallback;},_wrap:function(callback,domain,method)
+{if(!callback)
+callback=function(){};callback.methodName=method;callback.domain=domain;if(InspectorBackendClass.Options.dumpInspectorTimeStats)
+callback.sendRequestTime=Date.now();return callback;},sendMessage:function(messageObject)
+{throw"Not implemented";},reportProtocolError:function(messageObject)
+{console.error("Protocol Error: the message with wrong id. Message =  "+JSON.stringify(messageObject));},dispatch:function(message)
+{if(InspectorBackendClass.Options.dumpInspectorProtocolMessages)
+console.log("backend: "+((typeof message==="string")?message:JSON.stringify(message)));var messageObject=((typeof message==="string")?JSON.parse(message):message);if("id"in messageObject){var callback=this._callbacks[messageObject.id];if(!callback){this.reportProtocolError(messageObject);return;}
+var processingStartTime;if(InspectorBackendClass.Options.dumpInspectorTimeStats)
+processingStartTime=Date.now();this.agent(callback.domain).dispatchResponse(messageObject.id,messageObject,callback.methodName,callback);--this._pendingResponsesCount;delete this._callbacks[messageObject.id];if(InspectorBackendClass.Options.dumpInspectorTimeStats)
+console.log("time-stats: "+callback.methodName+" = "+(processingStartTime-callback.sendRequestTime)+" + "+(Date.now()-processingStartTime));if(this._scripts&&!this._pendingResponsesCount)
+this.runAfterPendingDispatches();return;}else{var method=messageObject.method.split(".");var domainName=method[0];if(!(domainName in this._dispatchers)){console.error("Protocol Error: the message "+messageObject.method+" is for non-existing domain '"+domainName+"'");return;}
+this._dispatchers[domainName].dispatch(method[1],messageObject);}},registerDispatcher:function(domain,dispatcher)
+{if(!this._dispatchers[domain])
+return;this._dispatchers[domain].setDomainDispatcher(dispatcher);},runAfterPendingDispatches:function(script)
+{if(!this._scripts)
+this._scripts=[];if(script)
+this._scripts.push(script);if(!this._pendingResponsesCount){var scripts=this._scripts;this._scripts=[]
+for(var id=0;id<scripts.length;++id)
+scripts[id].call(this);}},fireDisconnected:function(reason)
+{this.dispatchEventToListeners(InspectorBackendClass.Connection.Events.Disconnected,{reason:reason});},__proto__:WebInspector.Object.prototype}
+InspectorBackendClass.MainConnection=function(onConnectionReady)
+{InspectorBackendClass.Connection.call(this);onConnectionReady(this);}
+InspectorBackendClass.MainConnection.prototype={sendMessage:function(messageObject)
+{var message=JSON.stringify(messageObject);InspectorFrontendHost.sendMessageToBackend(message);},__proto__:InspectorBackendClass.Connection.prototype}
+InspectorBackendClass.WebSocketConnection=function(url,onConnectionReady)
+{InspectorBackendClass.Connection.call(this);this._socket=new WebSocket(url);this._socket.onmessage=this._onMessage.bind(this);this._socket.onerror=this._onError.bind(this);this._socket.onopen=onConnectionReady.bind(null,this);this._socket.onclose=this.fireDisconnected.bind(this,"websocket_closed");}
+InspectorBackendClass.WebSocketConnection.prototype={_onMessage:function(message)
+{var data=(message.data)
+this.dispatch(data);},_onError:function(error)
+{console.error(error);},sendMessage:function(messageObject)
+{var message=JSON.stringify(messageObject);this._socket.send(message);},__proto__:InspectorBackendClass.Connection.prototype}
+InspectorBackendClass.StubConnection=function(onConnectionReady)
+{InspectorBackendClass.Connection.call(this);onConnectionReady(this);}
+InspectorBackendClass.StubConnection.prototype={sendMessage:function(messageObject)
+{var message=JSON.stringify(messageObject);setTimeout(this._echoResponse.bind(this,messageObject),0);},_echoResponse:function(messageObject)
+{this.dispatch(messageObject)},__proto__:InspectorBackendClass.Connection.prototype}
+InspectorBackendClass.AgentPrototype=function(domain)
+{this._replyArgs={};this._hasErrorData={};this._domain=domain;}
+InspectorBackendClass.AgentPrototype.prototype={setConnection:function(connection)
+{this._connection=connection;},registerCommand:function(methodName,signature,replyArgs,hasErrorData)
+{var domainAndMethod=this._domain+"."+methodName;function sendMessage(vararg)
+{var params=[domainAndMethod,signature].concat(Array.prototype.slice.call(arguments));InspectorBackendClass.AgentPrototype.prototype._sendMessageToBackend.apply(this,params);}
+this[methodName]=sendMessage;function invoke(vararg)
+{var params=[domainAndMethod].concat(Array.prototype.slice.call(arguments));InspectorBackendClass.AgentPrototype.prototype._invoke.apply(this,params);}
+this["invoke_"+methodName]=invoke;this._replyArgs[domainAndMethod]=replyArgs;if(hasErrorData)
+this._hasErrorData[domainAndMethod]=true;},_sendMessageToBackend:function(method,signature,vararg)
+{var args=Array.prototype.slice.call(arguments,2);var callback=(args.length&&typeof args[args.length-1]==="function")?args.pop():null;var params={};var hasParams=false;for(var i=0;i<signature.length;++i){var param=signature[i];var paramName=param["name"];var typeName=param["type"];var optionalFlag=param["optional"];if(!args.length&&!optionalFlag){console.error("Protocol Error: Invalid number of arguments for method '"+method+"' call. It must have the following arguments '"+JSON.stringify(signature)+"'.");return;}
+var value=args.shift();if(optionalFlag&&typeof value==="undefined"){continue;}
+if(typeof value!==typeName){console.error("Protocol Error: Invalid type of argument '"+paramName+"' for method '"+method+"' call. It must be '"+typeName+"' but it is '"+typeof value+"'.");return;}
+params[paramName]=value;hasParams=true;}
+if(args.length===1&&!callback&&(typeof args[0]!=="undefined")){console.error("Protocol Error: Optional callback argument for method '"+method+"' call must be a function but its type is '"+typeof args[0]+"'.");return;}
+this._connection._wrapCallbackAndSendMessageObject(this._domain,method,hasParams?params:null,callback);},_invoke:function(method,args,callback)
+{this._connection._wrapCallbackAndSendMessageObject(this._domain,method,args,callback);},dispatchResponse:function(messageId,messageObject,methodName,callback)
+{if(messageObject.error&&messageObject.error.code!==-32000)
+console.error("Request with id = "+messageObject.id+" failed. "+JSON.stringify(messageObject.error));var argumentsArray=[];argumentsArray[0]=messageObject.error?messageObject.error.message:null;if(this._hasErrorData[methodName])
+argumentsArray[1]=messageObject.error?messageObject.error.data:null;if(messageObject.result){var paramNames=this._replyArgs[methodName]||[];for(var i=0;i<paramNames.length;++i)
+argumentsArray.push(messageObject.result[paramNames[i]]);}
+callback.apply(null,argumentsArray);}}
+InspectorBackendClass.DispatcherPrototype=function()
+{this._eventArgs={};this._dispatcher=null;}
+InspectorBackendClass.DispatcherPrototype.prototype={registerEvent:function(eventName,params)
+{this._eventArgs[eventName]=params},setDomainDispatcher:function(dispatcher)
+{this._dispatcher=dispatcher;},dispatch:function(functionName,messageObject)
+{if(!this._dispatcher)
+return;if(!(functionName in this._dispatcher)){console.error("Protocol Error: Attempted to dispatch an unimplemented method '"+messageObject.method+"'");return;}
+if(!this._eventArgs[messageObject.method]){console.error("Protocol Error: Attempted to dispatch an unspecified method '"+messageObject.method+"'");return;}
+var params=[];if(messageObject.params){var paramNames=this._eventArgs[messageObject.method];for(var i=0;i<paramNames.length;++i)
+params.push(messageObject.params[paramNames[i]]);}
+var processingStartTime;if(InspectorBackendClass.Options.dumpInspectorTimeStats)
+processingStartTime=Date.now();this._dispatcher[functionName].apply(this._dispatcher,params);if(InspectorBackendClass.Options.dumpInspectorTimeStats)
+console.log("time-stats: "+messageObject.method+" = "+(Date.now()-processingStartTime));}}
+InspectorBackendClass.Options={dumpInspectorTimeStats:false,dumpInspectorProtocolMessages:false}
+InspectorBackend=new InspectorBackendClass();InspectorBackend.registerInspectorDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Inspector");InspectorBackend.registerEvent("Inspector.evaluateForTestInFrontend",["testCallId","script"]);InspectorBackend.registerEvent("Inspector.inspect",["object","hints"]);InspectorBackend.registerEvent("Inspector.detached",["reason"]);InspectorBackend.registerEvent("Inspector.targetCrashed",[]);InspectorBackend.registerCommand("Inspector.enable",[],[],false);InspectorBackend.registerCommand("Inspector.disable",[],[],false);InspectorBackend.registerCommand("Inspector.reset",[],[],false);InspectorBackend.registerMemoryDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Memory");InspectorBackend.registerCommand("Memory.getDOMCounters",[],["documents","nodes","jsEventListeners"],false);InspectorBackend.registerPageDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Page");InspectorBackend.registerEnum("Page.ResourceType",{Document:"Document",Stylesheet:"Stylesheet",Image:"Image",Font:"Font",Script:"Script",XHR:"XHR",WebSocket:"WebSocket",Other:"Other"});InspectorBackend.registerEnum("Page.UsageItemId",{Filesystem:"filesystem",Database:"database",Appcache:"appcache",Indexeddatabase:"indexeddatabase"});InspectorBackend.registerEvent("Page.domContentEventFired",["timestamp"]);InspectorBackend.registerEvent("Page.loadEventFired",["timestamp"]);InspectorBackend.registerEvent("Page.frameAttached",["frameId","parentFrameId"]);InspectorBackend.registerEvent("Page.frameNavigated",["frame"]);InspectorBackend.registerEvent("Page.frameDetached",["frameId"]);InspectorBackend.registerEvent("Page.frameStartedLoading",["frameId"]);InspectorBackend.registerEvent("Page.frameStoppedLoading",["frameId"]);InspectorBackend.registerEvent("Page.frameScheduledNavigation",["frameId","delay"]);InspectorBackend.registerEvent("Page.frameClearedScheduledNavigation",["frameId"]);InspectorBackend.registerEvent("Page.frameResized",[]);InspectorBackend.registerEvent("Page.javascriptDialogOpening",["message"]);InspectorBackend.registerEvent("Page.javascriptDialogClosed",[]);InspectorBackend.registerEvent("Page.scriptsEnabled",["isEnabled"]);InspectorBackend.registerEvent("Page.screencastFrame",["data","metadata"]);InspectorBackend.registerEvent("Page.screencastVisibilityChanged",["visible"]);InspectorBackend.registerCommand("Page.enable",[],[],false);InspectorBackend.registerCommand("Page.disable",[],[],false);InspectorBackend.registerCommand("Page.addScriptToEvaluateOnLoad",[{"name":"scriptSource","type":"string","optional":false}],["identifier"],false);InspectorBackend.registerCommand("Page.removeScriptToEvaluateOnLoad",[{"name":"identifier","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.reload",[{"name":"ignoreCache","type":"boolean","optional":true},{"name":"scriptToEvaluateOnLoad","type":"string","optional":true},{"name":"scriptPreprocessor","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Page.navigate",[{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.getNavigationHistory",[],["currentIndex","entries"],false);InspectorBackend.registerCommand("Page.navigateToHistoryEntry",[{"name":"entryId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Page.getCookies",[],["cookies"],false);InspectorBackend.registerCommand("Page.deleteCookie",[{"name":"cookieName","type":"string","optional":false},{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.getResourceTree",[],["frameTree"],false);InspectorBackend.registerCommand("Page.getResourceContent",[{"name":"frameId","type":"string","optional":false},{"name":"url","type":"string","optional":false}],["content","base64Encoded"],false);InspectorBackend.registerCommand("Page.searchInResource",[{"name":"frameId","type":"string","optional":false},{"name":"url","type":"string","optional":false},{"name":"query","type":"string","optional":false},{"name":"caseSensitive","type":"boolean","optional":true},{"name":"isRegex","type":"boolean","optional":true}],["result"],false);InspectorBackend.registerCommand("Page.setDocumentContent",[{"name":"frameId","type":"string","optional":false},{"name":"html","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.setDeviceMetricsOverride",[{"name":"width","type":"number","optional":false},{"name":"height","type":"number","optional":false},{"name":"deviceScaleFactor","type":"number","optional":false},{"name":"emulateViewport","type":"boolean","optional":false},{"name":"fitWindow","type":"boolean","optional":false},{"name":"textAutosizing","type":"boolean","optional":true},{"name":"fontScaleFactor","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Page.setShowPaintRects",[{"name":"result","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.setShowDebugBorders",[{"name":"show","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.setShowFPSCounter",[{"name":"show","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.setContinuousPaintingEnabled",[{"name":"enabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.setShowScrollBottleneckRects",[{"name":"show","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.getScriptExecutionStatus",[],["result"],false);InspectorBackend.registerCommand("Page.setScriptExecutionDisabled",[{"name":"value","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.setGeolocationOverride",[{"name":"latitude","type":"number","optional":true},{"name":"longitude","type":"number","optional":true},{"name":"accuracy","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Page.clearGeolocationOverride",[],[],false);InspectorBackend.registerCommand("Page.setDeviceOrientationOverride",[{"name":"alpha","type":"number","optional":false},{"name":"beta","type":"number","optional":false},{"name":"gamma","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Page.clearDeviceOrientationOverride",[],[],false);InspectorBackend.registerCommand("Page.setTouchEmulationEnabled",[{"name":"enabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Page.setEmulatedMedia",[{"name":"media","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Page.captureScreenshot",[],["data"],false);InspectorBackend.registerCommand("Page.canScreencast",[],["result"],false);InspectorBackend.registerCommand("Page.startScreencast",[{"name":"format","type":"string","optional":true},{"name":"quality","type":"number","optional":true},{"name":"maxWidth","type":"number","optional":true},{"name":"maxHeight","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Page.stopScreencast",[],[],false);InspectorBackend.registerCommand("Page.handleJavaScriptDialog",[{"name":"accept","type":"boolean","optional":false},{"name":"promptText","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Page.setShowViewportSizeOnResize",[{"name":"show","type":"boolean","optional":false},{"name":"showGrid","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Page.queryUsageAndQuota",[{"name":"securityOrigin","type":"string","optional":false}],["quota","usage"],false);InspectorBackend.registerRuntimeDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Runtime");InspectorBackend.registerEnum("Runtime.RemoteObjectType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean"});InspectorBackend.registerEnum("Runtime.RemoteObjectSubtype",{Array:"array",Null:"null",Node:"node",Regexp:"regexp",Date:"date"});InspectorBackend.registerEnum("Runtime.PropertyPreviewType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean",Accessor:"accessor"});InspectorBackend.registerEnum("Runtime.PropertyPreviewSubtype",{Array:"array",Null:"null",Node:"node",Regexp:"regexp",Date:"date"});InspectorBackend.registerEnum("Runtime.CallArgumentType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean"});InspectorBackend.registerEvent("Runtime.executionContextCreated",["context"]);InspectorBackend.registerCommand("Runtime.evaluate",[{"name":"expression","type":"string","optional":false},{"name":"objectGroup","type":"string","optional":true},{"name":"includeCommandLineAPI","type":"boolean","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true},{"name":"contextId","type":"number","optional":true},{"name":"returnByValue","type":"boolean","optional":true},{"name":"generatePreview","type":"boolean","optional":true}],["result","wasThrown"],false);InspectorBackend.registerCommand("Runtime.callFunctionOn",[{"name":"objectId","type":"string","optional":false},{"name":"functionDeclaration","type":"string","optional":false},{"name":"arguments","type":"object","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true},{"name":"returnByValue","type":"boolean","optional":true},{"name":"generatePreview","type":"boolean","optional":true}],["result","wasThrown"],false);InspectorBackend.registerCommand("Runtime.getProperties",[{"name":"objectId","type":"string","optional":false},{"name":"ownProperties","type":"boolean","optional":true},{"name":"accessorPropertiesOnly","type":"boolean","optional":true}],["result","internalProperties"],false);InspectorBackend.registerCommand("Runtime.releaseObject",[{"name":"objectId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Runtime.releaseObjectGroup",[{"name":"objectGroup","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Runtime.run",[],[],false);InspectorBackend.registerCommand("Runtime.enable",[],[],false);InspectorBackend.registerCommand("Runtime.disable",[],[],false);InspectorBackend.registerConsoleDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Console");InspectorBackend.registerEnum("Console.ConsoleMessageSource",{XML:"xml",Javascript:"javascript",Network:"network",ConsoleAPI:"console-api",Storage:"storage",Appcache:"appcache",Rendering:"rendering",Css:"css",Security:"security",Other:"other",Deprecation:"deprecation"});InspectorBackend.registerEnum("Console.ConsoleMessageLevel",{Log:"log",Warning:"warning",Error:"error",Debug:"debug",Info:"info"});InspectorBackend.registerEnum("Console.ConsoleMessageType",{Log:"log",Dir:"dir",DirXML:"dirxml",Table:"table",Trace:"trace",Clear:"clear",StartGroup:"startGroup",StartGroupCollapsed:"startGroupCollapsed",EndGroup:"endGroup",Assert:"assert",Profile:"profile",ProfileEnd:"profileEnd"});InspectorBackend.registerEvent("Console.messageAdded",["message"]);InspectorBackend.registerEvent("Console.messageRepeatCountUpdated",["count","timestamp"]);InspectorBackend.registerEvent("Console.messagesCleared",[]);InspectorBackend.registerCommand("Console.enable",[],[],false);InspectorBackend.registerCommand("Console.disable",[],[],false);InspectorBackend.registerCommand("Console.clearMessages",[],[],false);InspectorBackend.registerCommand("Console.setMonitoringXHREnabled",[{"name":"enabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Console.addInspectedNode",[{"name":"nodeId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Console.addInspectedHeapObject",[{"name":"heapObjectId","type":"number","optional":false}],[],false);InspectorBackend.registerNetworkDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Network");InspectorBackend.registerEnum("Network.InitiatorType",{Parser:"parser",Script:"script",Other:"other"});InspectorBackend.registerEvent("Network.requestWillBeSent",["requestId","frameId","loaderId","documentURL","request","timestamp","initiator","redirectResponse"]);InspectorBackend.registerEvent("Network.requestServedFromCache",["requestId"]);InspectorBackend.registerEvent("Network.responseReceived",["requestId","frameId","loaderId","timestamp","type","response"]);InspectorBackend.registerEvent("Network.dataReceived",["requestId","timestamp","dataLength","encodedDataLength"]);InspectorBackend.registerEvent("Network.loadingFinished",["requestId","timestamp","encodedDataLength"]);InspectorBackend.registerEvent("Network.loadingFailed",["requestId","timestamp","errorText","canceled"]);InspectorBackend.registerEvent("Network.webSocketWillSendHandshakeRequest",["requestId","timestamp","request"]);InspectorBackend.registerEvent("Network.webSocketHandshakeResponseReceived",["requestId","timestamp","response"]);InspectorBackend.registerEvent("Network.webSocketCreated",["requestId","url"]);InspectorBackend.registerEvent("Network.webSocketClosed",["requestId","timestamp"]);InspectorBackend.registerEvent("Network.webSocketFrameReceived",["requestId","timestamp","response"]);InspectorBackend.registerEvent("Network.webSocketFrameError",["requestId","timestamp","errorMessage"]);InspectorBackend.registerEvent("Network.webSocketFrameSent",["requestId","timestamp","response"]);InspectorBackend.registerCommand("Network.enable",[],[],false);InspectorBackend.registerCommand("Network.disable",[],[],false);InspectorBackend.registerCommand("Network.setUserAgentOverride",[{"name":"userAgent","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Network.setExtraHTTPHeaders",[{"name":"headers","type":"object","optional":false}],[],false);InspectorBackend.registerCommand("Network.getResponseBody",[{"name":"requestId","type":"string","optional":false}],["body","base64Encoded"],false);InspectorBackend.registerCommand("Network.replayXHR",[{"name":"requestId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Network.canClearBrowserCache",[],["result"],false);InspectorBackend.registerCommand("Network.clearBrowserCache",[],[],false);InspectorBackend.registerCommand("Network.canClearBrowserCookies",[],["result"],false);InspectorBackend.registerCommand("Network.clearBrowserCookies",[],[],false);InspectorBackend.registerCommand("Network.setCacheDisabled",[{"name":"cacheDisabled","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Network.loadResourceForFrontend",[{"name":"frameId","type":"string","optional":false},{"name":"url","type":"string","optional":false},{"name":"requestHeaders","type":"object","optional":true}],["statusCode","responseHeaders","content"],false);InspectorBackend.registerDatabaseDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Database");InspectorBackend.registerEvent("Database.addDatabase",["database"]);InspectorBackend.registerCommand("Database.enable",[],[],false);InspectorBackend.registerCommand("Database.disable",[],[],false);InspectorBackend.registerCommand("Database.getDatabaseTableNames",[{"name":"databaseId","type":"string","optional":false}],["tableNames"],false);InspectorBackend.registerCommand("Database.executeSQL",[{"name":"databaseId","type":"string","optional":false},{"name":"query","type":"string","optional":false}],["columnNames","values","sqlError"],false);InspectorBackend.registerIndexedDBDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"IndexedDB");InspectorBackend.registerEnum("IndexedDB.KeyType",{Number:"number",String:"string",Date:"date",Array:"array"});InspectorBackend.registerEnum("IndexedDB.KeyPathType",{Null:"null",String:"string",Array:"array"});InspectorBackend.registerCommand("IndexedDB.enable",[],[],false);InspectorBackend.registerCommand("IndexedDB.disable",[],[],false);InspectorBackend.registerCommand("IndexedDB.requestDatabaseNames",[{"name":"securityOrigin","type":"string","optional":false}],["databaseNames"],false);InspectorBackend.registerCommand("IndexedDB.requestDatabase",[{"name":"securityOrigin","type":"string","optional":false},{"name":"databaseName","type":"string","optional":false}],["databaseWithObjectStores"],false);InspectorBackend.registerCommand("IndexedDB.requestData",[{"name":"securityOrigin","type":"string","optional":false},{"name":"databaseName","type":"string","optional":false},{"name":"objectStoreName","type":"string","optional":false},{"name":"indexName","type":"string","optional":false},{"name":"skipCount","type":"number","optional":false},{"name":"pageSize","type":"number","optional":false},{"name":"keyRange","type":"object","optional":true}],["objectStoreDataEntries","hasMore"],false);InspectorBackend.registerCommand("IndexedDB.clearObjectStore",[{"name":"securityOrigin","type":"string","optional":false},{"name":"databaseName","type":"string","optional":false},{"name":"objectStoreName","type":"string","optional":false}],[],false);InspectorBackend.registerDOMStorageDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"DOMStorage");InspectorBackend.registerEvent("DOMStorage.domStorageItemsCleared",["storageId"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemRemoved",["storageId","key"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemAdded",["storageId","key","newValue"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemUpdated",["storageId","key","oldValue","newValue"]);InspectorBackend.registerCommand("DOMStorage.enable",[],[],false);InspectorBackend.registerCommand("DOMStorage.disable",[],[],false);InspectorBackend.registerCommand("DOMStorage.getDOMStorageItems",[{"name":"storageId","type":"object","optional":false}],["entries"],false);InspectorBackend.registerCommand("DOMStorage.setDOMStorageItem",[{"name":"storageId","type":"object","optional":false},{"name":"key","type":"string","optional":false},{"name":"value","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMStorage.removeDOMStorageItem",[{"name":"storageId","type":"object","optional":false},{"name":"key","type":"string","optional":false}],[],false);InspectorBackend.registerApplicationCacheDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"ApplicationCache");InspectorBackend.registerEvent("ApplicationCache.applicationCacheStatusUpdated",["frameId","manifestURL","status"]);InspectorBackend.registerEvent("ApplicationCache.networkStateUpdated",["isNowOnline"]);InspectorBackend.registerCommand("ApplicationCache.getFramesWithManifests",[],["frameIds"],false);InspectorBackend.registerCommand("ApplicationCache.enable",[],[],false);InspectorBackend.registerCommand("ApplicationCache.getManifestForFrame",[{"name":"frameId","type":"string","optional":false}],["manifestURL"],false);InspectorBackend.registerCommand("ApplicationCache.getApplicationCacheForFrame",[{"name":"frameId","type":"string","optional":false}],["applicationCache"],false);InspectorBackend.registerFileSystemDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"FileSystem");InspectorBackend.registerCommand("FileSystem.enable",[],[],false);InspectorBackend.registerCommand("FileSystem.disable",[],[],false);InspectorBackend.registerCommand("FileSystem.requestFileSystemRoot",[{"name":"origin","type":"string","optional":false},{"name":"type","type":"string","optional":false}],["errorCode","root"],false);InspectorBackend.registerCommand("FileSystem.requestDirectoryContent",[{"name":"url","type":"string","optional":false}],["errorCode","entries"],false);InspectorBackend.registerCommand("FileSystem.requestMetadata",[{"name":"url","type":"string","optional":false}],["errorCode","metadata"],false);InspectorBackend.registerCommand("FileSystem.requestFileContent",[{"name":"url","type":"string","optional":false},{"name":"readAsText","type":"boolean","optional":false},{"name":"start","type":"number","optional":true},{"name":"end","type":"number","optional":true},{"name":"charset","type":"string","optional":true}],["errorCode","content","charset"],false);InspectorBackend.registerCommand("FileSystem.deleteEntry",[{"name":"url","type":"string","optional":false}],["errorCode"],false);InspectorBackend.registerDOMDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"DOM");InspectorBackend.registerEnum("DOM.PseudoType",{Before:"before",After:"after"});InspectorBackend.registerEnum("DOM.ShadowRootType",{UserAgent:"user-agent",Author:"author"});InspectorBackend.registerEvent("DOM.documentUpdated",[]);InspectorBackend.registerEvent("DOM.inspectNodeRequested",["nodeId"]);InspectorBackend.registerEvent("DOM.setChildNodes",["parentId","nodes"]);InspectorBackend.registerEvent("DOM.attributeModified",["nodeId","name","value"]);InspectorBackend.registerEvent("DOM.attributeRemoved",["nodeId","name"]);InspectorBackend.registerEvent("DOM.inlineStyleInvalidated",["nodeIds"]);InspectorBackend.registerEvent("DOM.characterDataModified",["nodeId","characterData"]);InspectorBackend.registerEvent("DOM.childNodeCountUpdated",["nodeId","childNodeCount"]);InspectorBackend.registerEvent("DOM.childNodeInserted",["parentNodeId","previousNodeId","node"]);InspectorBackend.registerEvent("DOM.childNodeRemoved",["parentNodeId","nodeId"]);InspectorBackend.registerEvent("DOM.shadowRootPushed",["hostId","root"]);InspectorBackend.registerEvent("DOM.shadowRootPopped",["hostId","rootId"]);InspectorBackend.registerEvent("DOM.pseudoElementAdded",["parentId","pseudoElement"]);InspectorBackend.registerEvent("DOM.pseudoElementRemoved",["parentId","pseudoElementId"]);InspectorBackend.registerCommand("DOM.getDocument",[],["root"],false);InspectorBackend.registerCommand("DOM.requestChildNodes",[{"name":"nodeId","type":"number","optional":false},{"name":"depth","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("DOM.querySelector",[{"name":"nodeId","type":"number","optional":false},{"name":"selector","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.querySelectorAll",[{"name":"nodeId","type":"number","optional":false},{"name":"selector","type":"string","optional":false}],["nodeIds"],false);InspectorBackend.registerCommand("DOM.setNodeName",[{"name":"nodeId","type":"number","optional":false},{"name":"name","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.setNodeValue",[{"name":"nodeId","type":"number","optional":false},{"name":"value","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.removeNode",[{"name":"nodeId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("DOM.setAttributeValue",[{"name":"nodeId","type":"number","optional":false},{"name":"name","type":"string","optional":false},{"name":"value","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.setAttributesAsText",[{"name":"nodeId","type":"number","optional":false},{"name":"text","type":"string","optional":false},{"name":"name","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("DOM.removeAttribute",[{"name":"nodeId","type":"number","optional":false},{"name":"name","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.getEventListenersForNode",[{"name":"nodeId","type":"number","optional":false},{"name":"objectGroup","type":"string","optional":true}],["listeners"],false);InspectorBackend.registerCommand("DOM.getOuterHTML",[{"name":"nodeId","type":"number","optional":false}],["outerHTML"],false);InspectorBackend.registerCommand("DOM.setOuterHTML",[{"name":"nodeId","type":"number","optional":false},{"name":"outerHTML","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.performSearch",[{"name":"query","type":"string","optional":false}],["searchId","resultCount"],false);InspectorBackend.registerCommand("DOM.getSearchResults",[{"name":"searchId","type":"string","optional":false},{"name":"fromIndex","type":"number","optional":false},{"name":"toIndex","type":"number","optional":false}],["nodeIds"],false);InspectorBackend.registerCommand("DOM.discardSearchResults",[{"name":"searchId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.requestNode",[{"name":"objectId","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.setInspectModeEnabled",[{"name":"enabled","type":"boolean","optional":false},{"name":"inspectUAShadowDOM","type":"boolean","optional":true},{"name":"highlightConfig","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.highlightRect",[{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"width","type":"number","optional":false},{"name":"height","type":"number","optional":false},{"name":"color","type":"object","optional":true},{"name":"outlineColor","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.highlightQuad",[{"name":"quad","type":"object","optional":false},{"name":"color","type":"object","optional":true},{"name":"outlineColor","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.highlightNode",[{"name":"highlightConfig","type":"object","optional":false},{"name":"nodeId","type":"number","optional":true},{"name":"objectId","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("DOM.hideHighlight",[],[],false);InspectorBackend.registerCommand("DOM.highlightFrame",[{"name":"frameId","type":"string","optional":false},{"name":"contentColor","type":"object","optional":true},{"name":"contentOutlineColor","type":"object","optional":true}],[],false);InspectorBackend.registerCommand("DOM.pushNodeByPathToFrontend",[{"name":"path","type":"string","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.pushNodesByBackendIdsToFrontend",[{"name":"backendNodeIds","type":"object","optional":false}],["nodeIds"],false);InspectorBackend.registerCommand("DOM.releaseBackendNodeIds",[{"name":"nodeGroup","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOM.resolveNode",[{"name":"nodeId","type":"number","optional":false},{"name":"objectGroup","type":"string","optional":true}],["object"],false);InspectorBackend.registerCommand("DOM.getAttributes",[{"name":"nodeId","type":"number","optional":false}],["attributes"],false);InspectorBackend.registerCommand("DOM.moveTo",[{"name":"nodeId","type":"number","optional":false},{"name":"targetNodeId","type":"number","optional":false},{"name":"insertBeforeNodeId","type":"number","optional":true}],["nodeId"],false);InspectorBackend.registerCommand("DOM.undo",[],[],false);InspectorBackend.registerCommand("DOM.redo",[],[],false);InspectorBackend.registerCommand("DOM.markUndoableState",[],[],false);InspectorBackend.registerCommand("DOM.focus",[{"name":"nodeId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("DOM.setFileInputFiles",[{"name":"nodeId","type":"number","optional":false},{"name":"files","type":"object","optional":false}],[],false);InspectorBackend.registerCommand("DOM.getBoxModel",[{"name":"nodeId","type":"number","optional":false}],["model"],false);InspectorBackend.registerCommand("DOM.getNodeForLocation",[{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false}],["nodeId"],false);InspectorBackend.registerCommand("DOM.getRelayoutBoundary",[{"name":"nodeId","type":"number","optional":false}],["nodeId"],false);InspectorBackend.registerCSSDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"CSS");InspectorBackend.registerEnum("CSS.StyleSheetOrigin",{User:"user",UserAgent:"user-agent",Inspector:"inspector",Regular:"regular"});InspectorBackend.registerEnum("CSS.CSSMediaSource",{MediaRule:"mediaRule",ImportRule:"importRule",LinkedSheet:"linkedSheet",InlineSheet:"inlineSheet"});InspectorBackend.registerEvent("CSS.mediaQueryResultChanged",[]);InspectorBackend.registerEvent("CSS.styleSheetChanged",["styleSheetId"]);InspectorBackend.registerEvent("CSS.styleSheetAdded",["header"]);InspectorBackend.registerEvent("CSS.styleSheetRemoved",["styleSheetId"]);InspectorBackend.registerCommand("CSS.enable",[],[],false);InspectorBackend.registerCommand("CSS.disable",[],[],false);InspectorBackend.registerCommand("CSS.getMatchedStylesForNode",[{"name":"nodeId","type":"number","optional":false},{"name":"includePseudo","type":"boolean","optional":true},{"name":"includeInherited","type":"boolean","optional":true}],["matchedCSSRules","pseudoElements","inherited"],false);InspectorBackend.registerCommand("CSS.getInlineStylesForNode",[{"name":"nodeId","type":"number","optional":false}],["inlineStyle","attributesStyle"],false);InspectorBackend.registerCommand("CSS.getComputedStyleForNode",[{"name":"nodeId","type":"number","optional":false}],["computedStyle"],false);InspectorBackend.registerCommand("CSS.getPlatformFontsForNode",[{"name":"nodeId","type":"number","optional":false}],["cssFamilyName","fonts"],false);InspectorBackend.registerCommand("CSS.getStyleSheetText",[{"name":"styleSheetId","type":"string","optional":false}],["text"],false);InspectorBackend.registerCommand("CSS.setStyleSheetText",[{"name":"styleSheetId","type":"string","optional":false},{"name":"text","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("CSS.setPropertyText",[{"name":"styleId","type":"object","optional":false},{"name":"propertyIndex","type":"number","optional":false},{"name":"text","type":"string","optional":false},{"name":"overwrite","type":"boolean","optional":false}],["style"],false);InspectorBackend.registerCommand("CSS.setRuleSelector",[{"name":"ruleId","type":"object","optional":false},{"name":"selector","type":"string","optional":false}],["rule"],false);InspectorBackend.registerCommand("CSS.createStyleSheet",[{"name":"frameId","type":"string","optional":false}],["styleSheetId"],false);InspectorBackend.registerCommand("CSS.addRule",[{"name":"styleSheetId","type":"string","optional":false},{"name":"selector","type":"string","optional":false}],["rule"],false);InspectorBackend.registerCommand("CSS.forcePseudoState",[{"name":"nodeId","type":"number","optional":false},{"name":"forcedPseudoClasses","type":"object","optional":false}],[],false);InspectorBackend.registerTimelineDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Timeline");InspectorBackend.registerEvent("Timeline.eventRecorded",["record"]);InspectorBackend.registerEvent("Timeline.progress",["count"]);InspectorBackend.registerEvent("Timeline.started",["consoleTimeline"]);InspectorBackend.registerEvent("Timeline.stopped",["consoleTimeline"]);InspectorBackend.registerCommand("Timeline.enable",[],[],false);InspectorBackend.registerCommand("Timeline.disable",[],[],false);InspectorBackend.registerCommand("Timeline.start",[{"name":"maxCallStackDepth","type":"number","optional":true},{"name":"bufferEvents","type":"boolean","optional":true},{"name":"liveEvents","type":"string","optional":true},{"name":"includeCounters","type":"boolean","optional":true},{"name":"includeGPUEvents","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Timeline.stop",[],["events"],false);InspectorBackend.registerDebuggerDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Debugger");InspectorBackend.registerEnum("Debugger.ScopeType",{Global:"global",Local:"local",With:"with",Closure:"closure",Catch:"catch"});InspectorBackend.registerEvent("Debugger.globalObjectCleared",[]);InspectorBackend.registerEvent("Debugger.scriptParsed",["scriptId","url","startLine","startColumn","endLine","endColumn","isContentScript","sourceMapURL","hasSourceURL"]);InspectorBackend.registerEvent("Debugger.scriptFailedToParse",["url","scriptSource","startLine","errorLine","errorMessage"]);InspectorBackend.registerEvent("Debugger.breakpointResolved",["breakpointId","location"]);InspectorBackend.registerEvent("Debugger.paused",["callFrames","reason","data","hitBreakpoints","asyncStackTrace"]);InspectorBackend.registerEvent("Debugger.resumed",[]);InspectorBackend.registerCommand("Debugger.enable",[],[],false);InspectorBackend.registerCommand("Debugger.disable",[],[],false);InspectorBackend.registerCommand("Debugger.setBreakpointsActive",[{"name":"active","type":"boolean","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.setSkipAllPauses",[{"name":"skipped","type":"boolean","optional":false},{"name":"untilReload","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.setBreakpointByUrl",[{"name":"lineNumber","type":"number","optional":false},{"name":"url","type":"string","optional":true},{"name":"urlRegex","type":"string","optional":true},{"name":"columnNumber","type":"number","optional":true},{"name":"condition","type":"string","optional":true},{"name":"isAntibreakpoint","type":"boolean","optional":true}],["breakpointId","locations"],false);InspectorBackend.registerCommand("Debugger.setBreakpoint",[{"name":"location","type":"object","optional":false},{"name":"condition","type":"string","optional":true}],["breakpointId","actualLocation"],false);InspectorBackend.registerCommand("Debugger.removeBreakpoint",[{"name":"breakpointId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.continueToLocation",[{"name":"location","type":"object","optional":false},{"name":"interstatementLocation","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.stepOver",[{"name":"callFrameId","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.stepInto",[],[],false);InspectorBackend.registerCommand("Debugger.stepOut",[{"name":"callFrameId","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.pause",[],[],false);InspectorBackend.registerCommand("Debugger.resume",[],[],false);InspectorBackend.registerCommand("Debugger.searchInContent",[{"name":"scriptId","type":"string","optional":false},{"name":"query","type":"string","optional":false},{"name":"caseSensitive","type":"boolean","optional":true},{"name":"isRegex","type":"boolean","optional":true}],["result"],false);InspectorBackend.registerCommand("Debugger.canSetScriptSource",[],["result"],false);InspectorBackend.registerCommand("Debugger.setScriptSource",[{"name":"scriptId","type":"string","optional":false},{"name":"scriptSource","type":"string","optional":false},{"name":"preview","type":"boolean","optional":true}],["callFrames","result","asyncStackTrace"],true);InspectorBackend.registerCommand("Debugger.restartFrame",[{"name":"callFrameId","type":"string","optional":false}],["callFrames","result","asyncStackTrace"],false);InspectorBackend.registerCommand("Debugger.getScriptSource",[{"name":"scriptId","type":"string","optional":false}],["scriptSource"],false);InspectorBackend.registerCommand("Debugger.getFunctionDetails",[{"name":"functionId","type":"string","optional":false}],["details"],false);InspectorBackend.registerCommand("Debugger.setPauseOnExceptions",[{"name":"state","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Debugger.evaluateOnCallFrame",[{"name":"callFrameId","type":"string","optional":false},{"name":"expression","type":"string","optional":false},{"name":"objectGroup","type":"string","optional":true},{"name":"includeCommandLineAPI","type":"boolean","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true},{"name":"returnByValue","type":"boolean","optional":true},{"name":"generatePreview","type":"boolean","optional":true}],["result","wasThrown"],false);InspectorBackend.registerCommand("Debugger.compileScript",[{"name":"expression","type":"string","optional":false},{"name":"sourceURL","type":"string","optional":false}],["scriptId","syntaxErrorMessage"],false);InspectorBackend.registerCommand("Debugger.runScript",[{"name":"scriptId","type":"string","optional":false},{"name":"contextId","type":"number","optional":true},{"name":"objectGroup","type":"string","optional":true},{"name":"doNotPauseOnExceptionsAndMuteConsole","type":"boolean","optional":true}],["result","wasThrown"],false);InspectorBackend.registerCommand("Debugger.setOverlayMessage",[{"name":"message","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.setVariableValue",[{"name":"scopeNumber","type":"number","optional":false},{"name":"variableName","type":"string","optional":false},{"name":"newValue","type":"object","optional":false},{"name":"callFrameId","type":"string","optional":true},{"name":"functionObjectId","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.getStepInPositions",[{"name":"callFrameId","type":"string","optional":false}],["stepInPositions"],false);InspectorBackend.registerCommand("Debugger.getBacktrace",[],["callFrames","asyncStackTrace"],false);InspectorBackend.registerCommand("Debugger.skipStackFrames",[{"name":"script","type":"string","optional":true}],[],false);InspectorBackend.registerCommand("Debugger.setAsyncCallStackDepth",[{"name":"maxDepth","type":"number","optional":false}],[],false);InspectorBackend.registerDOMDebuggerDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"DOMDebugger");InspectorBackend.registerEnum("DOMDebugger.DOMBreakpointType",{SubtreeModified:"subtree-modified",AttributeModified:"attribute-modified",NodeRemoved:"node-removed"});InspectorBackend.registerCommand("DOMDebugger.setDOMBreakpoint",[{"name":"nodeId","type":"number","optional":false},{"name":"type","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeDOMBreakpoint",[{"name":"nodeId","type":"number","optional":false},{"name":"type","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.setEventListenerBreakpoint",[{"name":"eventName","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeEventListenerBreakpoint",[{"name":"eventName","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.setInstrumentationBreakpoint",[{"name":"eventName","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeInstrumentationBreakpoint",[{"name":"eventName","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.setXHRBreakpoint",[{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("DOMDebugger.removeXHRBreakpoint",[{"name":"url","type":"string","optional":false}],[],false);InspectorBackend.registerProfilerDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Profiler");InspectorBackend.registerEvent("Profiler.consoleProfileStarted",["id","location","title"]);InspectorBackend.registerEvent("Profiler.consoleProfileFinished",["id","location","profile","title"]);InspectorBackend.registerCommand("Profiler.enable",[],[],false);InspectorBackend.registerCommand("Profiler.disable",[],[],false);InspectorBackend.registerCommand("Profiler.setSamplingInterval",[{"name":"interval","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Profiler.start",[],[],false);InspectorBackend.registerCommand("Profiler.stop",[],["profile"],false);InspectorBackend.registerHeapProfilerDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"HeapProfiler");InspectorBackend.registerEvent("HeapProfiler.addHeapSnapshotChunk",["chunk"]);InspectorBackend.registerEvent("HeapProfiler.resetProfiles",[]);InspectorBackend.registerEvent("HeapProfiler.reportHeapSnapshotProgress",["done","total","finished"]);InspectorBackend.registerEvent("HeapProfiler.lastSeenObjectId",["lastSeenObjectId","timestamp"]);InspectorBackend.registerEvent("HeapProfiler.heapStatsUpdate",["statsUpdate"]);InspectorBackend.registerCommand("HeapProfiler.enable",[],[],false);InspectorBackend.registerCommand("HeapProfiler.disable",[],[],false);InspectorBackend.registerCommand("HeapProfiler.startTrackingHeapObjects",[{"name":"trackAllocations","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("HeapProfiler.stopTrackingHeapObjects",[{"name":"reportProgress","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("HeapProfiler.takeHeapSnapshot",[{"name":"reportProgress","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("HeapProfiler.collectGarbage",[],[],false);InspectorBackend.registerCommand("HeapProfiler.getObjectByHeapObjectId",[{"name":"objectId","type":"string","optional":false},{"name":"objectGroup","type":"string","optional":true}],["result"],false);InspectorBackend.registerCommand("HeapProfiler.getHeapObjectId",[{"name":"objectId","type":"string","optional":false}],["heapSnapshotObjectId"],false);InspectorBackend.registerWorkerDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Worker");InspectorBackend.registerEvent("Worker.workerCreated",["workerId","url","inspectorConnected"]);InspectorBackend.registerEvent("Worker.workerTerminated",["workerId"]);InspectorBackend.registerEvent("Worker.dispatchMessageFromWorker",["workerId","message"]);InspectorBackend.registerEvent("Worker.disconnectedFromWorker",[]);InspectorBackend.registerCommand("Worker.enable",[],[],false);InspectorBackend.registerCommand("Worker.disable",[],[],false);InspectorBackend.registerCommand("Worker.sendMessageToWorker",[{"name":"workerId","type":"number","optional":false},{"name":"message","type":"object","optional":false}],[],false);InspectorBackend.registerCommand("Worker.canInspectWorkers",[],["result"],false);InspectorBackend.registerCommand("Worker.connectToWorker",[{"name":"workerId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Worker.disconnectFromWorker",[{"name":"workerId","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("Worker.setAutoconnectToWorkers",[{"name":"value","type":"boolean","optional":false}],[],false);InspectorBackend.registerCanvasDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Canvas");InspectorBackend.registerEnum("Canvas.CallArgumentType",{Object:"object",Function:"function",Undefined:"undefined",String:"string",Number:"number",Boolean:"boolean"});InspectorBackend.registerEnum("Canvas.CallArgumentSubtype",{Array:"array",Null:"null",Node:"node",Regexp:"regexp",Date:"date"});InspectorBackend.registerEvent("Canvas.contextCreated",["frameId"]);InspectorBackend.registerEvent("Canvas.traceLogsRemoved",["frameId","traceLogId"]);InspectorBackend.registerCommand("Canvas.enable",[],[],false);InspectorBackend.registerCommand("Canvas.disable",[],[],false);InspectorBackend.registerCommand("Canvas.dropTraceLog",[{"name":"traceLogId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Canvas.hasUninstrumentedCanvases",[],["result"],false);InspectorBackend.registerCommand("Canvas.captureFrame",[{"name":"frameId","type":"string","optional":true}],["traceLogId"],false);InspectorBackend.registerCommand("Canvas.startCapturing",[{"name":"frameId","type":"string","optional":true}],["traceLogId"],false);InspectorBackend.registerCommand("Canvas.stopCapturing",[{"name":"traceLogId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Canvas.getTraceLog",[{"name":"traceLogId","type":"string","optional":false},{"name":"startOffset","type":"number","optional":true},{"name":"maxLength","type":"number","optional":true}],["traceLog"],false);InspectorBackend.registerCommand("Canvas.replayTraceLog",[{"name":"traceLogId","type":"string","optional":false},{"name":"stepNo","type":"number","optional":false}],["resourceState","replayTime"],false);InspectorBackend.registerCommand("Canvas.getResourceState",[{"name":"traceLogId","type":"string","optional":false},{"name":"resourceId","type":"string","optional":false}],["resourceState"],false);InspectorBackend.registerCommand("Canvas.evaluateTraceLogCallArgument",[{"name":"traceLogId","type":"string","optional":false},{"name":"callIndex","type":"number","optional":false},{"name":"argumentIndex","type":"number","optional":false},{"name":"objectGroup","type":"string","optional":true}],["result","resourceState"],false);InspectorBackend.registerInputDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Input");InspectorBackend.registerEnum("Input.TouchPointState",{TouchPressed:"touchPressed",TouchReleased:"touchReleased",TouchMoved:"touchMoved",TouchStationary:"touchStationary",TouchCancelled:"touchCancelled"});InspectorBackend.registerCommand("Input.dispatchKeyEvent",[{"name":"type","type":"string","optional":false},{"name":"modifiers","type":"number","optional":true},{"name":"timestamp","type":"number","optional":true},{"name":"text","type":"string","optional":true},{"name":"unmodifiedText","type":"string","optional":true},{"name":"keyIdentifier","type":"string","optional":true},{"name":"windowsVirtualKeyCode","type":"number","optional":true},{"name":"nativeVirtualKeyCode","type":"number","optional":true},{"name":"macCharCode","type":"number","optional":true},{"name":"autoRepeat","type":"boolean","optional":true},{"name":"isKeypad","type":"boolean","optional":true},{"name":"isSystemKey","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Input.dispatchMouseEvent",[{"name":"type","type":"string","optional":false},{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"modifiers","type":"number","optional":true},{"name":"timestamp","type":"number","optional":true},{"name":"button","type":"string","optional":true},{"name":"clickCount","type":"number","optional":true},{"name":"deviceSpace","type":"boolean","optional":true}],[],false);InspectorBackend.registerCommand("Input.dispatchTouchEvent",[{"name":"type","type":"string","optional":false},{"name":"touchPoints","type":"object","optional":false},{"name":"modifiers","type":"number","optional":true},{"name":"timestamp","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Input.dispatchGestureEvent",[{"name":"type","type":"string","optional":false},{"name":"x","type":"number","optional":false},{"name":"y","type":"number","optional":false},{"name":"timestamp","type":"number","optional":true},{"name":"deltaX","type":"number","optional":true},{"name":"deltaY","type":"number","optional":true},{"name":"pinchScale","type":"number","optional":true}],[],false);InspectorBackend.registerLayerTreeDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"LayerTree");InspectorBackend.registerEnum("LayerTree.ScrollRectType",{RepaintsOnScroll:"RepaintsOnScroll",TouchEventHandler:"TouchEventHandler",WheelEventHandler:"WheelEventHandler"});InspectorBackend.registerEvent("LayerTree.layerTreeDidChange",["layers"]);InspectorBackend.registerEvent("LayerTree.layerPainted",["layerId","clip"]);InspectorBackend.registerCommand("LayerTree.enable",[],[],false);InspectorBackend.registerCommand("LayerTree.disable",[],[],false);InspectorBackend.registerCommand("LayerTree.compositingReasons",[{"name":"layerId","type":"string","optional":false}],["compositingReasons"],false);InspectorBackend.registerCommand("LayerTree.makeSnapshot",[{"name":"layerId","type":"string","optional":false}],["snapshotId"],false);InspectorBackend.registerCommand("LayerTree.releaseSnapshot",[{"name":"snapshotId","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("LayerTree.profileSnapshot",[{"name":"snapshotId","type":"string","optional":false},{"name":"minRepeatCount","type":"number","optional":true},{"name":"minDuration","type":"number","optional":true}],["timings"],false);InspectorBackend.registerCommand("LayerTree.replaySnapshot",[{"name":"snapshotId","type":"string","optional":false},{"name":"fromStep","type":"number","optional":true},{"name":"toStep","type":"number","optional":true}],["dataURL"],false);InspectorBackend.registerGeolocationDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Geolocation");InspectorBackend.registerCommand("Geolocation.setGeolocationOverride",[{"name":"latitude","type":"number","optional":true},{"name":"longitude","type":"number","optional":true},{"name":"accuracy","type":"number","optional":true}],[],false);InspectorBackend.registerCommand("Geolocation.clearGeolocationOverride",[],[],false);InspectorBackend.registerDeviceOrientationDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"DeviceOrientation");InspectorBackend.registerCommand("DeviceOrientation.setDeviceOrientationOverride",[{"name":"alpha","type":"number","optional":false},{"name":"beta","type":"number","optional":false},{"name":"gamma","type":"number","optional":false}],[],false);InspectorBackend.registerCommand("DeviceOrientation.clearDeviceOrientationOverride",[],[],false);InspectorBackend.registerTracingDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Tracing");InspectorBackend.registerEvent("Tracing.dataCollected",["value"]);InspectorBackend.registerEvent("Tracing.tracingComplete",[]);InspectorBackend.registerCommand("Tracing.start",[{"name":"categories","type":"string","optional":false},{"name":"options","type":"string","optional":false}],[],false);InspectorBackend.registerCommand("Tracing.end",[],[],false);InspectorBackend.registerPowerDispatcher=InspectorBackend.registerDomainDispatcher.bind(InspectorBackend,"Power");InspectorBackend.registerEvent("Power.dataAvailable",["value"]);InspectorBackend.registerCommand("Power.start",[],[],false);InspectorBackend.registerCommand("Power.end",[],[],false);InspectorBackend.registerCommand("Power.canProfilePower",[],["result"],false);var InspectorFrontendAPI={_pendingCommands:[],showConsole:function()
+{InspectorFrontendAPI._runOnceLoaded(function(){WebInspector.inspectorView.showPanel("console");});},enterInspectElementMode:function()
+{InspectorFrontendAPI._runOnceLoaded(function(){WebInspector.inspectorView.showPanel("elements");if(WebInspector.inspectElementModeController)
+WebInspector.inspectElementModeController.toggleSearch();});},revealSourceLine:function(url,lineNumber,columnNumber)
+{InspectorFrontendAPI._runOnceLoaded(function(){var uiSourceCode=WebInspector.workspace.uiSourceCodeForURL(url);if(uiSourceCode){WebInspector.Revealer.reveal(new WebInspector.UILocation(uiSourceCode,lineNumber,columnNumber));return;}
+function listener(event)
+{var uiSourceCode=(event.data);if(uiSourceCode.url===url){WebInspector.Revealer.reveal(new WebInspector.UILocation(uiSourceCode,lineNumber,columnNumber));WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,listener);}}
+WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,listener);});},setToolbarColors:function(backgroundColor,color)
+{WebInspector.setToolbarColors(backgroundColor,color);},loadTimelineFromURL:function(url)
+{InspectorFrontendAPI._runOnceLoaded(function(){(WebInspector.inspectorView.showPanel("timeline")).loadFromURL(url);});},setUseSoftMenu:function(useSoftMenu)
+{WebInspector.ContextMenu.setUseSoftMenu(useSoftMenu);},dispatchMessage:function(messageObject)
+{InspectorBackend.connection().dispatch(messageObject);},contextMenuItemSelected:function(id)
+{WebInspector.contextMenuItemSelected(id);},contextMenuCleared:function()
+{WebInspector.contextMenuCleared();},fileSystemsLoaded:function(fileSystems)
+{WebInspector.isolatedFileSystemDispatcher.fileSystemsLoaded(fileSystems);},fileSystemRemoved:function(fileSystemPath)
+{WebInspector.isolatedFileSystemDispatcher.fileSystemRemoved(fileSystemPath);},fileSystemAdded:function(errorMessage,fileSystem)
+{WebInspector.isolatedFileSystemDispatcher.fileSystemAdded(errorMessage,fileSystem);},indexingTotalWorkCalculated:function(requestId,fileSystemPath,totalWork)
+{var projectDelegate=WebInspector.fileSystemWorkspaceProvider.delegate(fileSystemPath);projectDelegate.indexingTotalWorkCalculated(requestId,totalWork);},indexingWorked:function(requestId,fileSystemPath,worked)
+{var projectDelegate=WebInspector.fileSystemWorkspaceProvider.delegate(fileSystemPath);projectDelegate.indexingWorked(requestId,worked);},indexingDone:function(requestId,fileSystemPath)
+{var projectDelegate=WebInspector.fileSystemWorkspaceProvider.delegate(fileSystemPath);projectDelegate.indexingDone(requestId);},searchCompleted:function(requestId,fileSystemPath,files)
+{var projectDelegate=WebInspector.fileSystemWorkspaceProvider.delegate(fileSystemPath);projectDelegate.searchCompleted(requestId,files);},savedURL:function(url)
+{WebInspector.fileManager.savedURL(url);},canceledSaveURL:function(url)
+{WebInspector.fileManager.canceledSaveURL(url);},appendedToURL:function(url)
+{WebInspector.fileManager.appendedToURL(url);},embedderMessageAck:function(id,error)
+{InspectorFrontendHost.embedderMessageAck(id,error);},loadCompleted:function()
+{InspectorFrontendAPI._isLoaded=true;for(var i=0;i<InspectorFrontendAPI._pendingCommands.length;++i)
+InspectorFrontendAPI._pendingCommands[i]();InspectorFrontendAPI._pendingCommands=[];if(window.opener)
+window.opener.postMessage(["loadCompleted"],"*");},dispatchQueryParameters:function(dispatchParameter)
+{if(dispatchParameter)
+InspectorFrontendAPI._dispatch(JSON.parse(window.decodeURI(dispatchParameter)));},evaluateForTest:function(callId,script)
+{WebInspector.evaluateForTestInFrontend(callId,script);},dispatchMessageAsync:function(messageObject)
+{WebInspector.dispatch(messageObject);},_dispatch:function(signature)
+{InspectorFrontendAPI._runOnceLoaded(function(){var methodName=signature.shift();return InspectorFrontendAPI[methodName].apply(InspectorFrontendAPI,signature);});},_runOnceLoaded:function(command)
+{if(InspectorFrontendAPI._isLoaded){command();return;}
+InspectorFrontendAPI._pendingCommands.push(command);}}
+function onMessageFromOpener(event)
+{if(event.source===window.opener)
+InspectorFrontendAPI._dispatch(event.data);}
+if(window.opener&&window.dispatchStandaloneTestRunnerMessages)
+window.addEventListener("message",onMessageFromOpener,true);WebInspector.Target=function(connection,callback)
+{Protocol.Agents.call(this,connection.agentsMap());this._connection=connection;this.isMainFrontend=false;this.pageAgent().canScreencast(this._initializeCapability.bind(this,"canScreencast",null));if(WebInspector.experimentsSettings.powerProfiler.isEnabled())
+this.powerAgent().canProfilePower(this._initializeCapability.bind(this,"canProfilePower",null));this.workerAgent().canInspectWorkers(this._initializeCapability.bind(this,"isMainFrontend",this._loadedWithCapabilities.bind(this,callback)));}
+WebInspector.Target.prototype={_initializeCapability:function(name,callback,error,result)
+{this[name]=result;if(!Capabilities[name])
+Capabilities[name]=result;if(callback)
+callback();},_loadedWithCapabilities:function(callback)
+{this.consoleModel=new WebInspector.ConsoleModel(this);if(!WebInspector.console)
+WebInspector.console=this.consoleModel;this.networkManager=new WebInspector.NetworkManager(this);if(!WebInspector.networkManager)
+WebInspector.networkManager=this.networkManager;this.resourceTreeModel=new WebInspector.ResourceTreeModel(this);if(!WebInspector.resourceTreeModel)
+WebInspector.resourceTreeModel=this.resourceTreeModel;this.debuggerModel=new WebInspector.DebuggerModel(this);if(!WebInspector.debuggerModel)
+WebInspector.debuggerModel=this.debuggerModel;this.runtimeModel=new WebInspector.RuntimeModel(this);if(!WebInspector.runtimeModel)
+WebInspector.runtimeModel=this.runtimeModel;this.domModel=new WebInspector.DOMModel();if(!WebInspector.domModel)
+WebInspector.domModel=this.domModel;this.workerManager=new WebInspector.WorkerManager(this,this.isMainFrontend);if(!WebInspector.workerManager)
+WebInspector.workerManager=this.workerManager;if(this.canProfilePower)
+WebInspector.powerProfiler=new WebInspector.PowerProfiler();if(callback)
+callback(this);},registerDispatcher:function(domain,dispatcher)
+{this._connection.registerDispatcher(domain,dispatcher);},isWorkerTarget:function()
+{return!this.isMainFrontend;},__proto__:Protocol.Agents.prototype}
+WebInspector.TargetManager=function()
+{WebInspector.Object.call(this);this._targets=[];}
+WebInspector.TargetManager.Events={TargetAdded:"TargetAdded",}
+WebInspector.TargetManager.prototype={createTarget:function(connection,callback)
+{var target=new WebInspector.Target(connection,callbackWrapper.bind(this));function callbackWrapper(newTarget)
+{if(callback)
+callback(newTarget);this._targets.push(newTarget);this.dispatchEventToListeners(WebInspector.TargetManager.Events.TargetAdded,newTarget);}},targets:function()
+{return this._targets;},mainTarget:function()
+{return this._targets[0];},__proto__:WebInspector.Object.prototype}
+WebInspector.targetManager;WebInspector.NotificationService=function(){}
+WebInspector.NotificationService.prototype={__proto__:WebInspector.Object.prototype}
+WebInspector.NotificationService.Events={InspectorLoaded:"InspectorLoaded",SelectedNodeChanged:"SelectedNodeChanged"}
+WebInspector.notifications=new WebInspector.NotificationService();var Preferences={maxInlineTextChildLength:80,minSidebarWidth:100,minSidebarHeight:75,applicationTitle:"Developer Tools - %s"}
+var Capabilities={isMainFrontend:false,canProfilePower:false,}
+WebInspector.Settings=function()
+{this._eventSupport=new WebInspector.Object();this._registry=({});this.colorFormat=this.createSetting("colorFormat","original");this.consoleHistory=this.createSetting("consoleHistory",[]);this.domWordWrap=this.createSetting("domWordWrap",true);this.eventListenersFilter=this.createSetting("eventListenersFilter","all");this.lastViewedScriptFile=this.createSetting("lastViewedScriptFile","application");this.monitoringXHREnabled=this.createSetting("monitoringXHREnabled",false);this.preserveConsoleLog=this.createSetting("preserveConsoleLog",false);this.consoleTimestampsEnabled=this.createSetting("consoleTimestampsEnabled",false);this.resourcesLargeRows=this.createSetting("resourcesLargeRows",true);this.resourcesSortOptions=this.createSetting("resourcesSortOptions",{timeOption:"responseTime",sizeOption:"transferSize"});this.resourceViewTab=this.createSetting("resourceViewTab","preview");this.showInheritedComputedStyleProperties=this.createSetting("showInheritedComputedStyleProperties",false);this.showUserAgentStyles=this.createSetting("showUserAgentStyles",true);this.watchExpressions=this.createSetting("watchExpressions",[]);this.breakpoints=this.createSetting("breakpoints",[]);this.eventListenerBreakpoints=this.createSetting("eventListenerBreakpoints",[]);this.domBreakpoints=this.createSetting("domBreakpoints",[]);this.xhrBreakpoints=this.createSetting("xhrBreakpoints",[]);this.jsSourceMapsEnabled=this.createSetting("sourceMapsEnabled",true);this.cssSourceMapsEnabled=this.createSetting("cssSourceMapsEnabled",true);this.cacheDisabled=this.createSetting("cacheDisabled",false);this.overrideUserAgent=this.createSetting("overrideUserAgent",false);this.userAgent=this.createSetting("userAgent","");this.overrideDeviceMetrics=this.createSetting("overrideDeviceMetrics",false);this.deviceMetrics=this.createSetting("deviceMetrics","");this.deviceFitWindow=this.createSetting("deviceFitWindow",true);this.emulateViewport=this.createSetting("emulateViewport",false);this.emulateTouchEvents=this.createSetting("emulateTouchEvents",false);this.showUAShadowDOM=this.createSetting("showUAShadowDOM",false);this.savedURLs=this.createSetting("savedURLs",{});this.javaScriptDisabled=this.createSetting("javaScriptDisabled",false);this.overrideGeolocation=this.createSetting("overrideGeolocation",false);this.geolocationOverride=this.createSetting("geolocationOverride","");this.overrideDeviceOrientation=this.createSetting("overrideDeviceOrientation",false);this.deviceOrientationOverride=this.createSetting("deviceOrientationOverride","");this.showAdvancedHeapSnapshotProperties=this.createSetting("showAdvancedHeapSnapshotProperties",false);this.highResolutionCpuProfiling=this.createSetting("highResolutionCpuProfiling",false);this.searchInContentScripts=this.createSetting("searchInContentScripts",false);this.textEditorIndent=this.createSetting("textEditorIndent","    ");this.textEditorAutoDetectIndent=this.createSetting("textEditorAutoIndentIndent",true);this.textEditorAutocompletion=this.createSetting("textEditorAutocompletion",true);this.textEditorBracketMatching=this.createSetting("textEditorBracketMatching",true);this.cssReloadEnabled=this.createSetting("cssReloadEnabled",false);this.timelineCaptureStacks=this.createSetting("timelineCaptureStacks",true);this.timelineLiveUpdate=this.createSetting("timelineLiveUpdate",true);this.showMetricsRulers=this.createSetting("showMetricsRulers",false);this.overrideCSSMedia=this.createSetting("overrideCSSMedia",false);this.emulatedCSSMedia=this.createSetting("emulatedCSSMedia","print");this.workerInspectorWidth=this.createSetting("workerInspectorWidth",600);this.workerInspectorHeight=this.createSetting("workerInspectorHeight",600);this.messageURLFilters=this.createSetting("messageURLFilters",{});this.networkHideDataURL=this.createSetting("networkHideDataURL",false);this.networkResourceTypeFilters=this.createSetting("networkResourceTypeFilters",{});this.messageLevelFilters=this.createSetting("messageLevelFilters",{});this.splitVerticallyWhenDockedToRight=this.createSetting("splitVerticallyWhenDockedToRight",true);this.visiblePanels=this.createSetting("visiblePanels",{});this.shortcutPanelSwitch=this.createSetting("shortcutPanelSwitch",false);this.showWhitespacesInEditor=this.createSetting("showWhitespacesInEditor",false);this.skipStackFramesSwitch=this.createSetting("skipStackFramesSwitch",false);this.skipStackFramesPattern=this.createRegExpSetting("skipStackFramesPattern","");this.pauseOnExceptionEnabled=this.createSetting("pauseOnExceptionEnabled",false);this.pauseOnCaughtException=this.createSetting("pauseOnCaughtException",false);this.enableAsyncStackTraces=this.createSetting("enableAsyncStackTraces",false);}
+WebInspector.Settings.prototype={createSetting:function(key,defaultValue)
+{if(!this._registry[key])
+this._registry[key]=new WebInspector.Setting(key,defaultValue,this._eventSupport,window.localStorage);return this._registry[key];},createRegExpSetting:function(key,defaultValue,regexFlags)
+{if(!this._registry[key])
+this._registry[key]=new WebInspector.RegExpSetting(key,defaultValue,this._eventSupport,window.localStorage,regexFlags);return this._registry[key];},createBackendSetting:function(key,defaultValue,setterCallback)
+{if(!this._registry[key])
+this._registry[key]=new WebInspector.BackendSetting(key,defaultValue,this._eventSupport,window.localStorage,setterCallback);return this._registry[key];},initializeBackendSettings:function()
+{this.showPaintRects=WebInspector.settings.createBackendSetting("showPaintRects",false,PageAgent.setShowPaintRects.bind(PageAgent));this.showDebugBorders=WebInspector.settings.createBackendSetting("showDebugBorders",false,PageAgent.setShowDebugBorders.bind(PageAgent));this.continuousPainting=WebInspector.settings.createBackendSetting("continuousPainting",false,PageAgent.setContinuousPaintingEnabled.bind(PageAgent));this.showFPSCounter=WebInspector.settings.createBackendSetting("showFPSCounter",false,PageAgent.setShowFPSCounter.bind(PageAgent));this.showScrollBottleneckRects=WebInspector.settings.createBackendSetting("showScrollBottleneckRects",false,PageAgent.setShowScrollBottleneckRects.bind(PageAgent));}}
+WebInspector.Setting=function(name,defaultValue,eventSupport,storage)
+{this._name=name;this._defaultValue=defaultValue;this._eventSupport=eventSupport;this._storage=storage;}
+WebInspector.Setting.prototype={addChangeListener:function(listener,thisObject)
+{this._eventSupport.addEventListener(this._name,listener,thisObject);},removeChangeListener:function(listener,thisObject)
+{this._eventSupport.removeEventListener(this._name,listener,thisObject);},get name()
+{return this._name;},get:function()
+{if(typeof this._value!=="undefined")
+return this._value;this._value=this._defaultValue;if(this._storage&&this._name in this._storage){try{this._value=JSON.parse(this._storage[this._name]);}catch(e){delete this._storage[this._name];}}
+return this._value;},set:function(value)
+{this._value=value;if(this._storage){try{this._storage[this._name]=JSON.stringify(value);}catch(e){console.error("Error saving setting with name:"+this._name);}}
+this._eventSupport.dispatchEventToListeners(this._name,value);}}
+WebInspector.RegExpSetting=function(name,defaultValue,eventSupport,storage,regexFlags)
+{WebInspector.Setting.call(this,name,defaultValue,eventSupport,storage);this._regexFlags=regexFlags;}
+WebInspector.RegExpSetting.prototype={set:function(value)
+{delete this._regex;WebInspector.Setting.prototype.set.call(this,value);},asRegExp:function()
+{if(typeof this._regex!=="undefined")
+return this._regex;this._regex=null;try{this._regex=new RegExp(this.get(),this._regexFlags||"");}catch(e){}
+return this._regex;},__proto__:WebInspector.Setting.prototype}
+WebInspector.BackendSetting=function(name,defaultValue,eventSupport,storage,setterCallback)
+{WebInspector.Setting.call(this,name,defaultValue,eventSupport,storage);this._setterCallback=setterCallback;var currentValue=this.get();if(currentValue!==defaultValue)
+this.set(currentValue);}
+WebInspector.BackendSetting.prototype={set:function(value)
+{function callback(error)
+{if(error){WebInspector.console.log("Error applying setting "+this._name+": "+error);this._eventSupport.dispatchEventToListeners(this._name,this._value);return;}
+WebInspector.Setting.prototype.set.call(this,value);}
+this._setterCallback(value,callback.bind(this));},__proto__:WebInspector.Setting.prototype}
+WebInspector.ExperimentsSettings=function(experimentsEnabled)
+{this._experimentsEnabled=experimentsEnabled;this._setting=WebInspector.settings.createSetting("experiments",{});this._experiments=[];this._enabledForTest={};this.fileSystemInspection=this._createExperiment("fileSystemInspection","FileSystem inspection");this.canvasInspection=this._createExperiment("canvasInspection ","Canvas inspection");this.frameworksDebuggingSupport=this._createExperiment("frameworksDebuggingSupport","Enable frameworks debugging support");this.layersPanel=this._createExperiment("layersPanel","Show Layers panel");this.doNotOpenDrawerOnEsc=this._createExperiment("doNotOpenDrawerWithEsc","Do not open drawer on Esc");this.showEditorInDrawer=this._createExperiment("showEditorInDrawer","Show editor in drawer");this.gpuTimeline=this._createExperiment("gpuTimeline","Show GPU data on timeline");this.applyCustomStylesheet=this._createExperiment("applyCustomStylesheet","Allow custom UI themes");this.workersInMainWindow=this._createExperiment("workersInMainWindow","Show workers in main window");this.dockToLeft=this._createExperiment("dockToLeft","Enable dock to left mode");this.allocationProfiler=this._createExperiment("allocationProfiler","Enable JavaScript heap allocation profiler");this.timelineFlameChart=this._createExperiment("timelineFlameChart","Enable FlameChart mode in Timeline");this.heapSnapshotStatistics=this._createExperiment("heapSnapshotStatistics","Show memory breakdown statistics in heap snapshots");this.timelineNoLiveUpdate=this._createExperiment("timelineNoLiveUpdate","Timeline w/o live update");this.powerProfiler=this._createExperiment("powerProfiler","Enable power mode in Timeline");this._cleanUpSetting();}
+WebInspector.ExperimentsSettings.prototype={get experiments()
+{return this._experiments.slice();},get experimentsEnabled()
+{return this._experimentsEnabled;},_createExperiment:function(experimentName,experimentTitle)
+{var experiment=new WebInspector.Experiment(this,experimentName,experimentTitle);this._experiments.push(experiment);return experiment;},isEnabled:function(experimentName)
+{if(this._enabledForTest[experimentName])
+return true;if(!this.experimentsEnabled)
+return false;var experimentsSetting=this._setting.get();return experimentsSetting[experimentName];},setEnabled:function(experimentName,enabled)
+{var experimentsSetting=this._setting.get();experimentsSetting[experimentName]=enabled;this._setting.set(experimentsSetting);},_enableForTest:function(experimentName)
+{this._enabledForTest[experimentName]=true;},_cleanUpSetting:function()
+{var experimentsSetting=this._setting.get();var cleanedUpExperimentSetting={};for(var i=0;i<this._experiments.length;++i){var experimentName=this._experiments[i].name;if(experimentsSetting[experimentName])
+cleanedUpExperimentSetting[experimentName]=true;}
+this._setting.set(cleanedUpExperimentSetting);}}
+WebInspector.Experiment=function(experimentsSettings,name,title)
+{this._name=name;this._title=title;this._experimentsSettings=experimentsSettings;}
+WebInspector.Experiment.prototype={get name()
+{return this._name;},get title()
+{return this._title;},isEnabled:function()
+{return this._experimentsSettings.isEnabled(this._name);},setEnabled:function(enabled)
+{this._experimentsSettings.setEnabled(this._name,enabled);},enableForTest:function()
+{this._experimentsSettings._enableForTest(this._name);}}
+WebInspector.VersionController=function()
+{}
+WebInspector.VersionController.currentVersion=7;WebInspector.VersionController.prototype={updateVersion:function()
+{var versionSetting=WebInspector.settings.createSetting("inspectorVersion",0);var currentVersion=WebInspector.VersionController.currentVersion;var oldVersion=versionSetting.get();var methodsToRun=this._methodsToRunToUpdateVersion(oldVersion,currentVersion);for(var i=0;i<methodsToRun.length;++i)
+this[methodsToRun[i]].call(this);versionSetting.set(currentVersion);},_methodsToRunToUpdateVersion:function(oldVersion,currentVersion)
+{var result=[];for(var i=oldVersion;i<currentVersion;++i)
+result.push("_updateVersionFrom"+i+"To"+(i+1));return result;},_updateVersionFrom0To1:function()
+{this._clearBreakpointsWhenTooMany(WebInspector.settings.breakpoints,500000);},_updateVersionFrom1To2:function()
+{var versionSetting=WebInspector.settings.createSetting("previouslyViewedFiles",[]);versionSetting.set([]);},_updateVersionFrom2To3:function()
+{var fileSystemMappingSetting=WebInspector.settings.createSetting("fileSystemMapping",{});fileSystemMappingSetting.set({});if(window.localStorage)
+delete window.localStorage["fileMappingEntries"];},_updateVersionFrom3To4:function()
+{var advancedMode=WebInspector.settings.createSetting("showHeaSnapshotObjectsHiddenProperties",false).get();WebInspector.settings.showAdvancedHeapSnapshotProperties.set(advancedMode);},_updateVersionFrom4To5:function()
+{if(!window.localStorage)
+return;var settingNames={"FileSystemViewSidebarWidth":"fileSystemViewSplitViewState","canvasProfileViewReplaySplitLocation":"canvasProfileViewReplaySplitViewState","canvasProfileViewSplitLocation":"canvasProfileViewSplitViewState","elementsSidebarWidth":"elementsPanelSplitViewState","StylesPaneSplitRatio":"stylesPaneSplitViewState","heapSnapshotRetainersViewSize":"heapSnapshotSplitViewState","InspectorView.splitView":"InspectorView.splitViewState","InspectorView.screencastSplitView":"InspectorView.screencastSplitViewState","Inspector.drawerSplitView":"Inspector.drawerSplitViewState","layerDetailsSplitView":"layerDetailsSplitViewState","networkSidebarWidth":"networkPanelSplitViewState","sourcesSidebarWidth":"sourcesPanelSplitViewState","scriptsPanelNavigatorSidebarWidth":"sourcesPanelNavigatorSplitViewState","sourcesPanelSplitSidebarRatio":"sourcesPanelDebuggerSidebarSplitViewState","timeline-details":"timelinePanelDetailsSplitViewState","timeline-split":"timelinePanelRecorsSplitViewState","timeline-view":"timelinePanelTimelineStackSplitViewState","auditsSidebarWidth":"auditsPanelSplitViewState","layersSidebarWidth":"layersPanelSplitViewState","profilesSidebarWidth":"profilesPanelSplitViewState","resourcesSidebarWidth":"resourcesPanelSplitViewState"};for(var oldName in settingNames){var newName=settingNames[oldName];var oldNameH=oldName+"H";var newValue=null;var oldSetting=WebInspector.settings.createSetting(oldName,undefined).get();if(oldSetting){newValue=newValue||{};newValue.vertical={};newValue.vertical.size=oldSetting;delete window.localStorage[oldName];}
+var oldSettingH=WebInspector.settings.createSetting(oldNameH,undefined).get();if(oldSettingH){newValue=newValue||{};newValue.horizontal={};newValue.horizontal.size=oldSettingH;delete window.localStorage[oldNameH];}
+var newSetting=WebInspector.settings.createSetting(newName,{});if(newValue)
+newSetting.set(newValue);}},_updateVersionFrom5To6:function()
+{if(!window.localStorage)
+return;var settingNames={"debuggerSidebarHidden":"sourcesPanelSplitViewState","navigatorHidden":"sourcesPanelNavigatorSplitViewState","WebInspector.Drawer.showOnLoad":"Inspector.drawerSplitViewState"};for(var oldName in settingNames){var newName=settingNames[oldName];var oldSetting=WebInspector.settings.createSetting(oldName,undefined).get();var invert="WebInspector.Drawer.showOnLoad"===oldName;var hidden=!!oldSetting!==invert;delete window.localStorage[oldName];var showMode=hidden?"OnlyMain":"Both";var newSetting=WebInspector.settings.createSetting(newName,null);var newValue=newSetting.get()||{};newValue.vertical=newValue.vertical||{};newValue.vertical.showMode=showMode;newValue.horizontal=newValue.horizontal||{};newValue.horizontal.showMode=showMode;newSetting.set(newValue);}},_updateVersionFrom6To7:function()
+{if(!window.localStorage)
+return;var settingNames={"sourcesPanelNavigatorSplitViewState":"sourcesPanelNavigatorSplitViewState","elementsPanelSplitViewState":"elementsPanelSplitViewState","canvasProfileViewReplaySplitViewState":"canvasProfileViewReplaySplitViewState","editorInDrawerSplitViewState":"editorInDrawerSplitViewState","stylesPaneSplitViewState":"stylesPaneSplitViewState","sourcesPanelDebuggerSidebarSplitViewState":"sourcesPanelDebuggerSidebarSplitViewState"};for(var name in settingNames){if(!(name in window.localStorage))
+continue;var setting=WebInspector.settings.createSetting(name,undefined);var value=setting.get();if(!value)
+continue;if(value.vertical&&value.vertical.size&&value.vertical.size<1)
+value.vertical.size=0;if(value.horizontal&&value.horizontal.size&&value.horizontal.size<1)
+value.horizontal.size=0;setting.set(value);}},_clearBreakpointsWhenTooMany:function(breakpointsSetting,maxBreakpointsCount)
+{if(breakpointsSetting.get().length>maxBreakpointsCount)
+breakpointsSetting.set([]);}}
+WebInspector.settings=new WebInspector.Settings();WebInspector.experimentsSettings=new WebInspector.ExperimentsSettings(WebInspector.queryParam("experiments")!==null);WebInspector.PauseOnExceptionStateSetting=function()
+{WebInspector.settings.pauseOnExceptionEnabled.addChangeListener(this._enabledChanged,this);WebInspector.settings.pauseOnCaughtException.addChangeListener(this._pauseOnCaughtChanged,this);this._name="pauseOnExceptionStateString";this._eventSupport=new WebInspector.Object();this._value=this._calculateValue();}
+WebInspector.PauseOnExceptionStateSetting.prototype={addChangeListener:function(listener,thisObject)
+{this._eventSupport.addEventListener(this._name,listener,thisObject);},removeChangeListener:function(listener,thisObject)
+{this._eventSupport.removeEventListener(this._name,listener,thisObject);},get:function()
+{return this._value;},_calculateValue:function()
+{if(!WebInspector.settings.pauseOnExceptionEnabled.get())
+return"none";return"all";},_enabledChanged:function(event)
+{this._fireChangedIfNeeded();},_pauseOnCaughtChanged:function(event)
+{this._fireChangedIfNeeded();},_fireChangedIfNeeded:function()
+{var newValue=this._calculateValue();if(newValue===this._value)
+return;this._value=newValue;this._eventSupport.dispatchEventToListeners(this._name,this._value);}}
+WebInspector.settings.pauseOnExceptionStateString=new WebInspector.PauseOnExceptionStateSetting();WebInspector.SettingsUI={}
+WebInspector.SettingsUI.createCheckbox=function(name,getter,setter,omitParagraphElement,inputElement,tooltip)
+{var input=inputElement||document.createElement("input");input.type="checkbox";input.name=name;input.checked=getter();function listener()
+{setter(input.checked);}
+input.addEventListener("change",listener,false);var label=document.createElement("label");label.appendChild(input);label.createTextChild(name);if(tooltip)
+label.title=tooltip;if(omitParagraphElement)
+return label;var p=document.createElement("p");p.appendChild(label);return p;}
+WebInspector.SettingsUI.createSettingCheckbox=function(name,setting,omitParagraphElement,inputElement,tooltip)
+{return WebInspector.SettingsUI.createCheckbox(name,setting.get.bind(setting),setting.set.bind(setting),omitParagraphElement,inputElement,tooltip);}
+WebInspector.SettingsUI.createSettingFieldset=function(setting)
+{var fieldset=document.createElement("fieldset");fieldset.disabled=!setting.get();setting.addChangeListener(settingChanged);return fieldset;function settingChanged()
+{fieldset.disabled=!setting.get();}}
+WebInspector.View=function()
+{this.element=document.createElement("div");this.element.className="view";this.element.__view=this;this._visible=true;this._isRoot=false;this._isShowing=false;this._children=[];this._hideOnDetach=false;this._cssFiles=[];this._notificationDepth=0;}
+WebInspector.View._cssFileToVisibleViewCount={};WebInspector.View._cssFileToStyleElement={};WebInspector.View._cssUnloadTimeout=2000;WebInspector.View._buildSourceURL=function(cssFile)
+{return"\n/*# sourceURL="+WebInspector.ParsedURL.completeURL(window.location.href,cssFile)+" */";}
+WebInspector.View.createStyleElement=function(cssFile)
+{var styleElement;var xhr=new XMLHttpRequest();xhr.open("GET",cssFile,false);xhr.send(null);styleElement=document.createElement("style");styleElement.type="text/css";styleElement.textContent=xhr.responseText+WebInspector.View._buildSourceURL(cssFile);document.head.insertBefore(styleElement,document.head.firstChild);return styleElement;}
+WebInspector.View.prototype={markAsRoot:function()
+{WebInspector.View._assert(!this.element.parentElement,"Attempt to mark as root attached node");this._isRoot=true;},makeLayoutBoundary:function()
+{this._isLayoutBoundary=true;},parentView:function()
+{return this._parentView;},isShowing:function()
+{return this._isShowing;},setHideOnDetach:function()
+{this._hideOnDetach=true;},_inNotification:function()
+{return!!this._notificationDepth||(this._parentView&&this._parentView._inNotification());},_parentIsShowing:function()
+{if(this._isRoot)
+return true;return this._parentView&&this._parentView.isShowing();},_callOnVisibleChildren:function(method)
+{var copy=this._children.slice();for(var i=0;i<copy.length;++i){if(copy[i]._parentView===this&&copy[i]._visible)
+method.call(copy[i]);}},_processWillShow:function()
+{this._loadCSSIfNeeded();this._callOnVisibleChildren(this._processWillShow);this._isShowing=true;},_processWasShown:function()
+{if(this._inNotification())
+return;this.restoreScrollPositions();this._notify(this.wasShown);this._notify(this.onResize);this._callOnVisibleChildren(this._processWasShown);},_processWillHide:function()
+{if(this._inNotification())
+return;this.storeScrollPositions();this._callOnVisibleChildren(this._processWillHide);this._notify(this.willHide);this._isShowing=false;},_processWasHidden:function()
+{this._disableCSSIfNeeded();this._callOnVisibleChildren(this._processWasHidden);},_processOnResize:function()
+{if(this._inNotification())
+return;if(!this.isShowing())
+return;this._notify(this.onResize);this._callOnVisibleChildren(this._processOnResize);},_processDiscardCachedSize:function()
+{if(this._isLayoutBoundary){this.element.style.removeProperty("width");this.element.style.removeProperty("height");}
+this._callOnVisibleChildren(this._processDiscardCachedSize);},_cacheSize:function()
+{this._prepareCacheSize();this._applyCacheSize();},_prepareCacheSize:function()
+{if(this._isLayoutBoundary){this._cachedOffsetWidth=this.element.offsetWidth;this._cachedOffsetHeight=this.element.offsetHeight;}
+this._callOnVisibleChildren(this._prepareCacheSize);},_applyCacheSize:function()
+{if(this._isLayoutBoundary){this.element.style.setProperty("width",this._cachedOffsetWidth+"px");this.element.style.setProperty("height",this._cachedOffsetHeight+"px");delete this._cachedOffsetWidth;delete this._cachedOffsetHeight;}
+this._callOnVisibleChildren(this._applyCacheSize);},_notify:function(notification)
+{++this._notificationDepth;try{notification.call(this);}finally{--this._notificationDepth;}},wasShown:function()
+{},willHide:function()
+{},onResize:function()
+{},onLayout:function()
+{},show:function(parentElement,insertBefore)
+{WebInspector.View._assert(parentElement,"Attempt to attach view with no parent element");if(this.element.parentElement!==parentElement){if(this.element.parentElement)
+this.detach();var currentParent=parentElement;while(currentParent&&!currentParent.__view)
+currentParent=currentParent.parentElement;if(currentParent){this._parentView=currentParent.__view;this._parentView._children.push(this);this._isRoot=false;}else
+WebInspector.View._assert(this._isRoot,"Attempt to attach view to orphan node");}else if(this._visible){return;}
+this._visible=true;if(this._parentIsShowing())
+this._processWillShow();this.element.classList.add("visible");if(this.element.parentElement!==parentElement){WebInspector.View._incrementViewCounter(parentElement,this.element);if(insertBefore)
+WebInspector.View._originalInsertBefore.call(parentElement,this.element,insertBefore);else
+WebInspector.View._originalAppendChild.call(parentElement,this.element);}
+if(this._parentIsShowing()){this._processWasShown();this._cacheSize();}
+if(this._parentView&&this._hasNonZeroMinimumSize())
+this._parentView.invalidateMinimumSize();},detach:function(overrideHideOnDetach)
+{var parentElement=this.element.parentElement;if(!parentElement)
+return;if(this._parentIsShowing()){this._processDiscardCachedSize();this._processWillHide();}
+if(this._hideOnDetach&&!overrideHideOnDetach){this.element.classList.remove("visible");this._visible=false;if(this._parentIsShowing())
+this._processWasHidden();if(this._parentView&&this._hasNonZeroMinimumSize())
+this._parentView.invalidateMinimumSize();return;}
+WebInspector.View._decrementViewCounter(parentElement,this.element);WebInspector.View._originalRemoveChild.call(parentElement,this.element);this._visible=false;if(this._parentIsShowing())
+this._processWasHidden();if(this._parentView){var childIndex=this._parentView._children.indexOf(this);WebInspector.View._assert(childIndex>=0,"Attempt to remove non-child view");this._parentView._children.splice(childIndex,1);var parent=this._parentView;this._parentView=null;if(this._hasNonZeroMinimumSize())
+parent.invalidateMinimumSize();}else
+WebInspector.View._assert(this._isRoot,"Removing non-root view from DOM");},detachChildViews:function()
+{var children=this._children.slice();for(var i=0;i<children.length;++i)
+children[i].detach();},elementsToRestoreScrollPositionsFor:function()
+{return[this.element];},storeScrollPositions:function()
+{var elements=this.elementsToRestoreScrollPositionsFor();for(var i=0;i<elements.length;++i){var container=elements[i];container._scrollTop=container.scrollTop;container._scrollLeft=container.scrollLeft;}},restoreScrollPositions:function()
+{var elements=this.elementsToRestoreScrollPositionsFor();for(var i=0;i<elements.length;++i){var container=elements[i];if(container._scrollTop)
+container.scrollTop=container._scrollTop;if(container._scrollLeft)
+container.scrollLeft=container._scrollLeft;}},doResize:function()
+{if(!this.isShowing())
+return;this._processDiscardCachedSize();if(!this._inNotification())
+this._callOnVisibleChildren(this._processOnResize);this._cacheSize();},doLayout:function()
+{if(!this.isShowing())
+return;this._notify(this.onLayout);this.doResize();},registerRequiredCSS:function(cssFile)
+{if(window.flattenImports)
+cssFile=cssFile.split("/").reverse()[0];this._cssFiles.push(cssFile);},_loadCSSIfNeeded:function()
+{for(var i=0;i<this._cssFiles.length;++i){var cssFile=this._cssFiles[i];var viewsWithCSSFile=WebInspector.View._cssFileToVisibleViewCount[cssFile];WebInspector.View._cssFileToVisibleViewCount[cssFile]=(viewsWithCSSFile||0)+1;if(!viewsWithCSSFile)
+this._doLoadCSS(cssFile);}},_doLoadCSS:function(cssFile)
+{var styleElement=WebInspector.View._cssFileToStyleElement[cssFile];if(styleElement){styleElement.disabled=false;return;}
+styleElement=WebInspector.View.createStyleElement(cssFile);WebInspector.View._cssFileToStyleElement[cssFile]=styleElement;},_disableCSSIfNeeded:function()
+{var scheduleUnload=!!WebInspector.View._cssUnloadTimer;for(var i=0;i<this._cssFiles.length;++i){var cssFile=this._cssFiles[i];if(!--WebInspector.View._cssFileToVisibleViewCount[cssFile])
+scheduleUnload=true;}
+function doUnloadCSS()
+{delete WebInspector.View._cssUnloadTimer;for(cssFile in WebInspector.View._cssFileToVisibleViewCount){if(WebInspector.View._cssFileToVisibleViewCount.hasOwnProperty(cssFile)&&!WebInspector.View._cssFileToVisibleViewCount[cssFile])
+WebInspector.View._cssFileToStyleElement[cssFile].disabled=true;}}
+if(scheduleUnload){if(WebInspector.View._cssUnloadTimer)
+clearTimeout(WebInspector.View._cssUnloadTimer);WebInspector.View._cssUnloadTimer=setTimeout(doUnloadCSS,WebInspector.View._cssUnloadTimeout)}},printViewHierarchy:function()
+{var lines=[];this._collectViewHierarchy("",lines);console.log(lines.join("\n"));},_collectViewHierarchy:function(prefix,lines)
+{lines.push(prefix+"["+this.element.className+"]"+(this._children.length?" {":""));for(var i=0;i<this._children.length;++i)
+this._children[i]._collectViewHierarchy(prefix+"    ",lines);if(this._children.length)
+lines.push(prefix+"}");},defaultFocusedElement:function()
+{return this._defaultFocusedElement||this.element;},setDefaultFocusedElement:function(element)
+{this._defaultFocusedElement=element;},focus:function()
+{var element=this.defaultFocusedElement();if(!element||element.isAncestor(document.activeElement))
+return;WebInspector.setCurrentFocusElement(element);},measurePreferredSize:function()
+{this._loadCSSIfNeeded();WebInspector.View._originalAppendChild.call(document.body,this.element);this.element.positionAt(0,0);var result=new Size(this.element.offsetWidth,this.element.offsetHeight);this.element.positionAt(undefined,undefined);WebInspector.View._originalRemoveChild.call(document.body,this.element);this._disableCSSIfNeeded();return result;},calculateMinimumSize:function()
+{return new Size(0,0);},minimumSize:function()
+{if(typeof this._minimumSize!=="undefined")
+return this._minimumSize;if(typeof this._cachedMinimumSize==="undefined")
+this._cachedMinimumSize=this.calculateMinimumSize();return this._cachedMinimumSize;},setMinimumSize:function(width,height)
+{this._minimumSize=new Size(width,height);this.invalidateMinimumSize();},_hasNonZeroMinimumSize:function()
+{var size=this.minimumSize();return size.width||size.height;},invalidateMinimumSize:function()
+{var cached=this._cachedMinimumSize;delete this._cachedMinimumSize;var actual=this.minimumSize();if(!actual.isEqual(cached)&&this._parentView)
+this._parentView.invalidateMinimumSize();else
+this.doLayout();},__proto__:WebInspector.Object.prototype}
+WebInspector.View._originalAppendChild=Element.prototype.appendChild;WebInspector.View._originalInsertBefore=Element.prototype.insertBefore;WebInspector.View._originalRemoveChild=Element.prototype.removeChild;WebInspector.View._originalRemoveChildren=Element.prototype.removeChildren;WebInspector.View._incrementViewCounter=function(parentElement,childElement)
+{var count=(childElement.__viewCounter||0)+(childElement.__view?1:0);if(!count)
+return;while(parentElement){parentElement.__viewCounter=(parentElement.__viewCounter||0)+count;parentElement=parentElement.parentElement;}}
+WebInspector.View._decrementViewCounter=function(parentElement,childElement)
+{var count=(childElement.__viewCounter||0)+(childElement.__view?1:0);if(!count)
+return;while(parentElement){parentElement.__viewCounter-=count;parentElement=parentElement.parentElement;}}
+WebInspector.View._assert=function(condition,message)
+{if(!condition){console.trace();throw new Error(message);}}
+WebInspector.VBox=function()
+{WebInspector.View.call(this);this.element.classList.add("vbox");};WebInspector.VBox.prototype={calculateMinimumSize:function()
+{var width=0;var height=0;function updateForChild()
+{var size=this.minimumSize();width=Math.max(width,size.width);height+=size.height;}
+this._callOnVisibleChildren(updateForChild);return new Size(width,height);},__proto__:WebInspector.View.prototype};WebInspector.HBox=function()
+{WebInspector.View.call(this);this.element.classList.add("hbox");};WebInspector.HBox.prototype={calculateMinimumSize:function()
+{var width=0;var height=0;function updateForChild()
+{var size=this.minimumSize();width+=size.width;height=Math.max(height,size.height);}
+this._callOnVisibleChildren(updateForChild);return new Size(width,height);},__proto__:WebInspector.View.prototype};WebInspector.VBoxWithResizeCallback=function(resizeCallback)
+{WebInspector.VBox.call(this);this._resizeCallback=resizeCallback;}
+WebInspector.VBoxWithResizeCallback.prototype={onResize:function()
+{this._resizeCallback();},__proto__:WebInspector.VBox.prototype}
+Element.prototype.appendChild=function(child)
+{WebInspector.View._assert(!child.__view||child.parentElement===this,"Attempt to add view via regular DOM operation.");return WebInspector.View._originalAppendChild.call(this,child);}
+Element.prototype.insertBefore=function(child,anchor)
+{WebInspector.View._assert(!child.__view||child.parentElement===this,"Attempt to add view via regular DOM operation.");return WebInspector.View._originalInsertBefore.call(this,child,anchor);}
+Element.prototype.removeChild=function(child)
+{WebInspector.View._assert(!child.__viewCounter&&!child.__view,"Attempt to remove element containing view via regular DOM operation");return WebInspector.View._originalRemoveChild.call(this,child);}
+Element.prototype.removeChildren=function()
+{WebInspector.View._assert(!this.__viewCounter,"Attempt to remove element containing view via regular DOM operation");WebInspector.View._originalRemoveChildren.call(this);}
+WebInspector.installDragHandle=function(element,elementDragStart,elementDrag,elementDragEnd,cursor,hoverCursor)
+{element.addEventListener("mousedown",WebInspector.elementDragStart.bind(WebInspector,elementDragStart,elementDrag,elementDragEnd,cursor),false);if(hoverCursor!==null)
+element.style.cursor=hoverCursor||cursor;}
+WebInspector.elementDragStart=function(elementDragStart,elementDrag,elementDragEnd,cursor,event)
+{if(event.button||(WebInspector.isMac()&&event.ctrlKey))
+return;if(WebInspector._elementDraggingEventListener)
+return;if(elementDragStart&&!elementDragStart((event)))
+return;if(WebInspector._elementDraggingGlassPane){WebInspector._elementDraggingGlassPane.dispose();delete WebInspector._elementDraggingGlassPane;}
+var targetDocument=event.target.ownerDocument;WebInspector._elementDraggingEventListener=elementDrag;WebInspector._elementEndDraggingEventListener=elementDragEnd;WebInspector._mouseOutWhileDraggingTargetDocument=targetDocument;targetDocument.addEventListener("mousemove",WebInspector._elementDragMove,true);targetDocument.addEventListener("mouseup",WebInspector._elementDragEnd,true);targetDocument.addEventListener("mouseout",WebInspector._mouseOutWhileDragging,true);targetDocument.body.style.cursor=cursor;event.preventDefault();}
+WebInspector._mouseOutWhileDragging=function()
+{WebInspector._unregisterMouseOutWhileDragging();WebInspector._elementDraggingGlassPane=new WebInspector.GlassPane();}
+WebInspector._unregisterMouseOutWhileDragging=function()
+{if(!WebInspector._mouseOutWhileDraggingTargetDocument)
+return;WebInspector._mouseOutWhileDraggingTargetDocument.removeEventListener("mouseout",WebInspector._mouseOutWhileDragging,true);delete WebInspector._mouseOutWhileDraggingTargetDocument;}
+WebInspector._elementDragMove=function(event)
+{if(WebInspector._elementDraggingEventListener((event)))
+WebInspector._cancelDragEvents(event);}
+WebInspector._cancelDragEvents=function(event)
+{var targetDocument=event.target.ownerDocument;targetDocument.removeEventListener("mousemove",WebInspector._elementDragMove,true);targetDocument.removeEventListener("mouseup",WebInspector._elementDragEnd,true);WebInspector._unregisterMouseOutWhileDragging();targetDocument.body.style.removeProperty("cursor");if(WebInspector._elementDraggingGlassPane)
+WebInspector._elementDraggingGlassPane.dispose();delete WebInspector._elementDraggingGlassPane;delete WebInspector._elementDraggingEventListener;delete WebInspector._elementEndDraggingEventListener;}
+WebInspector._elementDragEnd=function(event)
+{var elementDragEnd=WebInspector._elementEndDraggingEventListener;WebInspector._cancelDragEvents((event));event.preventDefault();if(elementDragEnd)
+elementDragEnd((event));}
+WebInspector.GlassPane=function()
+{this.element=document.createElement("div");this.element.style.cssText="position:absolute;top:0;bottom:0;left:0;right:0;background-color:transparent;z-index:1000;";this.element.id="glass-pane";document.body.appendChild(this.element);WebInspector._glassPane=this;}
+WebInspector.GlassPane.prototype={dispose:function()
+{delete WebInspector._glassPane;if(WebInspector.HelpScreen.isVisible())
+WebInspector.HelpScreen.focus();else
+WebInspector.inspectorView.focus();this.element.remove();}}
+WebInspector.isBeingEdited=function(element)
+{if(element.classList.contains("text-prompt")||element.nodeName==="INPUT"||element.nodeName==="TEXTAREA")
+return true;if(!WebInspector.__editingCount)
+return false;while(element){if(element.__editing)
+return true;element=element.parentElement;}
+return false;}
+WebInspector.markBeingEdited=function(element,value)
+{if(value){if(element.__editing)
+return false;element.classList.add("being-edited");element.__editing=true;WebInspector.__editingCount=(WebInspector.__editingCount||0)+1;}else{if(!element.__editing)
+return false;element.classList.remove("being-edited");delete element.__editing;--WebInspector.__editingCount;}
+return true;}
+WebInspector.CSSNumberRegex=/^(-?(?:\d+(?:\.\d+)?|\.\d+))$/;WebInspector.StyleValueDelimiters=" \xA0\t\n\"':;,/()";WebInspector._valueModificationDirection=function(event)
+{var direction=null;if(event.type==="mousewheel"){if(event.wheelDeltaY>0)
+direction="Up";else if(event.wheelDeltaY<0)
+direction="Down";}else{if(event.keyIdentifier==="Up"||event.keyIdentifier==="PageUp")
+direction="Up";else if(event.keyIdentifier==="Down"||event.keyIdentifier==="PageDown")
+direction="Down";}
+return direction;}
+WebInspector._modifiedHexValue=function(hexString,event)
+{var direction=WebInspector._valueModificationDirection(event);if(!direction)
+return hexString;var number=parseInt(hexString,16);if(isNaN(number)||!isFinite(number))
+return hexString;var maxValue=Math.pow(16,hexString.length)-1;var arrowKeyOrMouseWheelEvent=(event.keyIdentifier==="Up"||event.keyIdentifier==="Down"||event.type==="mousewheel");var delta;if(arrowKeyOrMouseWheelEvent)
+delta=(direction==="Up")?1:-1;else
+delta=(event.keyIdentifier==="PageUp")?16:-16;if(event.shiftKey)
+delta*=16;var result=number+delta;if(result<0)
+result=0;else if(result>maxValue)
+return hexString;var resultString=result.toString(16).toUpperCase();for(var i=0,lengthDelta=hexString.length-resultString.length;i<lengthDelta;++i)
+resultString="0"+resultString;return resultString;}
+WebInspector._modifiedFloatNumber=function(number,event)
+{var direction=WebInspector._valueModificationDirection(event);if(!direction)
+return number;var arrowKeyOrMouseWheelEvent=(event.keyIdentifier==="Up"||event.keyIdentifier==="Down"||event.type==="mousewheel");var changeAmount=1;if(event.shiftKey&&!arrowKeyOrMouseWheelEvent)
+changeAmount=100;else if(event.shiftKey||!arrowKeyOrMouseWheelEvent)
+changeAmount=10;else if(event.altKey)
+changeAmount=0.1;if(direction==="Down")
+changeAmount*=-1;var result=Number((number+changeAmount).toFixed(6));if(!String(result).match(WebInspector.CSSNumberRegex))
+return null;return result;}
+WebInspector.handleElementValueModifications=function(event,element,finishHandler,suggestionHandler,customNumberHandler)
+{var arrowKeyOrMouseWheelEvent=(event.keyIdentifier==="Up"||event.keyIdentifier==="Down"||event.type==="mousewheel");var pageKeyPressed=(event.keyIdentifier==="PageUp"||event.keyIdentifier==="PageDown");if(!arrowKeyOrMouseWheelEvent&&!pageKeyPressed)
+return false;var selection=window.getSelection();if(!selection.rangeCount)
+return false;var selectionRange=selection.getRangeAt(0);if(!selectionRange.commonAncestorContainer.isSelfOrDescendant(element))
+return false;var originalValue=element.textContent;var wordRange=selectionRange.startContainer.rangeOfWord(selectionRange.startOffset,WebInspector.StyleValueDelimiters,element);var wordString=wordRange.toString();if(suggestionHandler&&suggestionHandler(wordString))
+return false;var replacementString;var prefix,suffix,number;var matches;matches=/(.*#)([\da-fA-F]+)(.*)/.exec(wordString);if(matches&&matches.length){prefix=matches[1];suffix=matches[3];number=WebInspector._modifiedHexValue(matches[2],event);if(customNumberHandler)
+number=customNumberHandler(number);replacementString=prefix+number+suffix;}else{matches=/(.*?)(-?(?:\d+(?:\.\d+)?|\.\d+))(.*)/.exec(wordString);if(matches&&matches.length){prefix=matches[1];suffix=matches[3];number=WebInspector._modifiedFloatNumber(parseFloat(matches[2]),event);if(number===null)
+return false;if(customNumberHandler)
+number=customNumberHandler(number);replacementString=prefix+number+suffix;}}
+if(replacementString){var replacementTextNode=document.createTextNode(replacementString);wordRange.deleteContents();wordRange.insertNode(replacementTextNode);var finalSelectionRange=document.createRange();finalSelectionRange.setStart(replacementTextNode,0);finalSelectionRange.setEnd(replacementTextNode,replacementString.length);selection.removeAllRanges();selection.addRange(finalSelectionRange);event.handled=true;event.preventDefault();if(finishHandler)
+finishHandler(originalValue,replacementString);return true;}
+return false;}
+Number.preciseMillisToString=function(ms,precision)
+{precision=precision||0;var format="%."+precision+"f\u2009ms";return WebInspector.UIString(format,ms);}
+Number.millisToString=function(ms,higherResolution)
+{if(!isFinite(ms))
+return"-";if(ms===0)
+return"0";if(higherResolution&&ms<1000)
+return WebInspector.UIString("%.3f\u2009ms",ms);else if(ms<1000)
+return WebInspector.UIString("%.0f\u2009ms",ms);var seconds=ms/1000;if(seconds<60)
+return WebInspector.UIString("%.2f\u2009s",seconds);var minutes=seconds/60;if(minutes<60)
+return WebInspector.UIString("%.1f\u2009min",minutes);var hours=minutes/60;if(hours<24)
+return WebInspector.UIString("%.1f\u2009hrs",hours);var days=hours/24;return WebInspector.UIString("%.1f\u2009days",days);}
+Number.secondsToString=function(seconds,higherResolution)
+{if(!isFinite(seconds))
+return"-";return Number.millisToString(seconds*1000,higherResolution);}
+Number.bytesToString=function(bytes)
+{if(bytes<1024)
+return WebInspector.UIString("%.0f\u2009B",bytes);var kilobytes=bytes/1024;if(kilobytes<100)
+return WebInspector.UIString("%.1f\u2009KB",kilobytes);if(kilobytes<1024)
+return WebInspector.UIString("%.0f\u2009KB",kilobytes);var megabytes=kilobytes/1024;if(megabytes<100)
+return WebInspector.UIString("%.1f\u2009MB",megabytes);else
+return WebInspector.UIString("%.0f\u2009MB",megabytes);}
+Number.withThousandsSeparator=function(num)
+{var str=num+"";var re=/(\d+)(\d{3})/;while(str.match(re))
+str=str.replace(re,"$1\u2009$2");return str;}
+WebInspector.useLowerCaseMenuTitles=function()
+{return WebInspector.platform()==="windows";}
+WebInspector.formatLocalized=function(format,substitutions,formatters,initialValue,append)
+{return String.format(WebInspector.UIString(format),substitutions,formatters,initialValue,append);}
+WebInspector.openLinkExternallyLabel=function()
+{return WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Open link in new tab":"Open Link in New Tab");}
+WebInspector.copyLinkAddressLabel=function()
+{return WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy link address":"Copy Link Address");}
+WebInspector.installPortStyles=function()
+{var platform=WebInspector.platform();document.body.classList.add("platform-"+platform);var flavor=WebInspector.platformFlavor();if(flavor)
+document.body.classList.add("platform-"+flavor);var port=WebInspector.port();document.body.classList.add("port-"+port);}
+WebInspector._windowFocused=function(event)
+{if(event.target.document.nodeType===Node.DOCUMENT_NODE)
+document.body.classList.remove("inactive");}
+WebInspector._windowBlurred=function(event)
+{if(event.target.document.nodeType===Node.DOCUMENT_NODE)
+document.body.classList.add("inactive");}
+WebInspector.previousFocusElement=function()
+{return WebInspector._previousFocusElement;}
+WebInspector.currentFocusElement=function()
+{return WebInspector._currentFocusElement;}
+WebInspector._focusChanged=function(event)
+{WebInspector.setCurrentFocusElement(event.target);}
+WebInspector._documentBlurred=function(event)
+{if(!event.relatedTarget&&document.activeElement===document.body)
+WebInspector.setCurrentFocusElement(null);}
+WebInspector._textInputTypes=["text","search","tel","url","email","password"].keySet();WebInspector._isTextEditingElement=function(element)
+{if(element instanceof HTMLInputElement)
+return element.type in WebInspector._textInputTypes;if(element instanceof HTMLTextAreaElement)
+return true;return false;}
+WebInspector.setCurrentFocusElement=function(x)
+{if(WebInspector._glassPane&&x&&!WebInspector._glassPane.element.isAncestor(x))
+return;if(WebInspector._currentFocusElement!==x)
+WebInspector._previousFocusElement=WebInspector._currentFocusElement;WebInspector._currentFocusElement=x;if(WebInspector._currentFocusElement){WebInspector._currentFocusElement.focus();var selection=window.getSelection();if(!WebInspector._isTextEditingElement(WebInspector._currentFocusElement)&&selection.isCollapsed&&!WebInspector._currentFocusElement.isInsertionCaretInside()){var selectionRange=WebInspector._currentFocusElement.ownerDocument.createRange();selectionRange.setStart(WebInspector._currentFocusElement,0);selectionRange.setEnd(WebInspector._currentFocusElement,0);selection.removeAllRanges();selection.addRange(selectionRange);}}else if(WebInspector._previousFocusElement)
+WebInspector._previousFocusElement.blur();}
+WebInspector.restoreFocusFromElement=function(element)
+{if(element&&element.isSelfOrAncestor(WebInspector.currentFocusElement()))
+WebInspector.setCurrentFocusElement(WebInspector.previousFocusElement());}
+WebInspector.setToolbarColors=function(backgroundColor,color)
+{if(!WebInspector._themeStyleElement){WebInspector._themeStyleElement=document.createElement("style");document.head.appendChild(WebInspector._themeStyleElement);}
+var parsedColor=WebInspector.Color.parse(color);var shadowColor=parsedColor?parsedColor.invert().setAlpha(0.33).toString(WebInspector.Color.Format.RGBA):"white";var prefix=WebInspector.isMac()?"body:not(.undocked)":"";WebInspector._themeStyleElement.textContent=String.sprintf("%s .toolbar-background {\
+                 background-image: none !important;\
+                 background-color: %s !important;\
+                 color: %s !important;\
+             }",prefix,backgroundColor,color)+
+String.sprintf("%s .toolbar-background button.status-bar-item .glyph, %s .toolbar-background button.status-bar-item .long-click-glyph {\
+                 background-color: %s;\
+             }",prefix,prefix,color)+
+String.sprintf("%s .toolbar-background button.status-bar-item .glyph.shadow, %s .toolbar-background button.status-bar-item .long-click-glyph.shadow {\
+                 background-color: %s;\
+             }",prefix,prefix,shadowColor);}
+WebInspector.resetToolbarColors=function()
+{if(WebInspector._themeStyleElement)
+WebInspector._themeStyleElement.textContent="";}
+WebInspector.highlightSearchResult=function(element,offset,length,domChanges)
+{var result=WebInspector.highlightSearchResults(element,[new WebInspector.SourceRange(offset,length)],domChanges);return result.length?result[0]:null;}
+WebInspector.highlightSearchResults=function(element,resultRanges,changes)
+{return WebInspector.highlightRangesWithStyleClass(element,resultRanges,"highlighted-search-result",changes);}
+WebInspector.runCSSAnimationOnce=function(element,className)
+{function animationEndCallback()
+{element.classList.remove(className);element.removeEventListener("animationend",animationEndCallback,false);}
+if(element.classList.contains(className))
+element.classList.remove(className);element.addEventListener("animationend",animationEndCallback,false);element.classList.add(className);}
+WebInspector.highlightRangesWithStyleClass=function(element,resultRanges,styleClass,changes)
+{changes=changes||[];var highlightNodes=[];var lineText=element.textContent;var ownerDocument=element.ownerDocument;var textNodeSnapshot=ownerDocument.evaluate(".//text()",element,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);var snapshotLength=textNodeSnapshot.snapshotLength;if(snapshotLength===0)
+return highlightNodes;var nodeRanges=[];var rangeEndOffset=0;for(var i=0;i<snapshotLength;++i){var range={};range.offset=rangeEndOffset;range.length=textNodeSnapshot.snapshotItem(i).textContent.length;rangeEndOffset=range.offset+range.length;nodeRanges.push(range);}
+var startIndex=0;for(var i=0;i<resultRanges.length;++i){var startOffset=resultRanges[i].offset;var endOffset=startOffset+resultRanges[i].length;while(startIndex<snapshotLength&&nodeRanges[startIndex].offset+nodeRanges[startIndex].length<=startOffset)
+startIndex++;var endIndex=startIndex;while(endIndex<snapshotLength&&nodeRanges[endIndex].offset+nodeRanges[endIndex].length<endOffset)
+endIndex++;if(endIndex===snapshotLength)
+break;var highlightNode=ownerDocument.createElement("span");highlightNode.className=styleClass;highlightNode.textContent=lineText.substring(startOffset,endOffset);var lastTextNode=textNodeSnapshot.snapshotItem(endIndex);var lastText=lastTextNode.textContent;lastTextNode.textContent=lastText.substring(endOffset-nodeRanges[endIndex].offset);changes.push({node:lastTextNode,type:"changed",oldText:lastText,newText:lastTextNode.textContent});if(startIndex===endIndex){lastTextNode.parentElement.insertBefore(highlightNode,lastTextNode);changes.push({node:highlightNode,type:"added",nextSibling:lastTextNode,parent:lastTextNode.parentElement});highlightNodes.push(highlightNode);var prefixNode=ownerDocument.createTextNode(lastText.substring(0,startOffset-nodeRanges[startIndex].offset));lastTextNode.parentElement.insertBefore(prefixNode,highlightNode);changes.push({node:prefixNode,type:"added",nextSibling:highlightNode,parent:lastTextNode.parentElement});}else{var firstTextNode=textNodeSnapshot.snapshotItem(startIndex);var firstText=firstTextNode.textContent;var anchorElement=firstTextNode.nextSibling;firstTextNode.parentElement.insertBefore(highlightNode,anchorElement);changes.push({node:highlightNode,type:"added",nextSibling:anchorElement,parent:firstTextNode.parentElement});highlightNodes.push(highlightNode);firstTextNode.textContent=firstText.substring(0,startOffset-nodeRanges[startIndex].offset);changes.push({node:firstTextNode,type:"changed",oldText:firstText,newText:firstTextNode.textContent});for(var j=startIndex+1;j<endIndex;j++){var textNode=textNodeSnapshot.snapshotItem(j);var text=textNode.textContent;textNode.textContent="";changes.push({node:textNode,type:"changed",oldText:text,newText:textNode.textContent});}}
+startIndex=endIndex;nodeRanges[startIndex].offset=endOffset;nodeRanges[startIndex].length=lastTextNode.textContent.length;}
+return highlightNodes;}
+WebInspector.applyDomChanges=function(domChanges)
+{for(var i=0,size=domChanges.length;i<size;++i){var entry=domChanges[i];switch(entry.type){case"added":entry.parent.insertBefore(entry.node,entry.nextSibling);break;case"changed":entry.node.textContent=entry.newText;break;}}}
+WebInspector.revertDomChanges=function(domChanges)
+{for(var i=domChanges.length-1;i>=0;--i){var entry=domChanges[i];switch(entry.type){case"added":entry.node.remove();break;case"changed":entry.node.textContent=entry.oldText;break;}}}
+WebInspector._coalescingLevel=0;WebInspector.startBatchUpdate=function()
+{if(!WebInspector._coalescingLevel)
+WebInspector._postUpdateHandlers=new Map();WebInspector._coalescingLevel++;}
+WebInspector.endBatchUpdate=function()
+{if(--WebInspector._coalescingLevel)
+return;var handlers=WebInspector._postUpdateHandlers;delete WebInspector._postUpdateHandlers;window.requestAnimationFrame(function(){if(WebInspector._coalescingLevel)
+return;var keys=handlers.keys();for(var i=0;i<keys.length;++i){var object=keys[i];var methods=handlers.get(object).keys();for(var j=0;j<methods.length;++j)
+methods[j].call(object);}});}
+WebInspector.invokeOnceAfterBatchUpdate=function(object,method)
+{if(!WebInspector._coalescingLevel){window.requestAnimationFrame(function(){if(!WebInspector._coalescingLevel)
+method.call(object);});return;}
+var methods=WebInspector._postUpdateHandlers.get(object);if(!methods){methods=new Map();WebInspector._postUpdateHandlers.put(object,methods);}
+methods.put(method);};(function(){function windowLoaded()
+{window.addEventListener("focus",WebInspector._windowFocused,false);window.addEventListener("blur",WebInspector._windowBlurred,false);document.addEventListener("focus",WebInspector._focusChanged,true);document.addEventListener("blur",WebInspector._documentBlurred,true);window.removeEventListener("DOMContentLoaded",windowLoaded,false);}
+window.addEventListener("DOMContentLoaded",windowLoaded,false);})();WebInspector.HelpScreen=function(title)
+{WebInspector.VBox.call(this);this.markAsRoot();this.registerRequiredCSS("helpScreen.css");this.element.classList.add("help-window-outer");this.element.addEventListener("keydown",this._onKeyDown.bind(this),false);this.element.tabIndex=0;if(title){var mainWindow=this.element.createChild("div","help-window-main");var captionWindow=mainWindow.createChild("div","help-window-caption");captionWindow.appendChild(this._createCloseButton());this.contentElement=mainWindow.createChild("div","help-content");captionWindow.createChild("h1","help-window-title").textContent=title;}}
+WebInspector.HelpScreen._visibleScreen=null;WebInspector.HelpScreen.isVisible=function()
+{return!!WebInspector.HelpScreen._visibleScreen;}
+WebInspector.HelpScreen.focus=function()
+{WebInspector.HelpScreen._visibleScreen.element.focus();}
+WebInspector.HelpScreen.prototype={_createCloseButton:function()
+{var closeButton=document.createElement("div");closeButton.className="help-close-button close-button-gray";closeButton.addEventListener("click",this.hide.bind(this),false);return closeButton;},showModal:function()
+{var visibleHelpScreen=WebInspector.HelpScreen._visibleScreen;if(visibleHelpScreen===this)
+return;if(visibleHelpScreen)
+visibleHelpScreen.hide();WebInspector.HelpScreen._visibleScreen=this;this.show(WebInspector.inspectorView.element);this.focus();},hide:function()
+{if(!this.isShowing())
+return;WebInspector.HelpScreen._visibleScreen=null;WebInspector.restoreFocusFromElement(this.element);this.detach();},isClosingKey:function(keyCode)
+{return[WebInspector.KeyboardShortcut.Keys.Enter.code,WebInspector.KeyboardShortcut.Keys.Esc.code,WebInspector.KeyboardShortcut.Keys.Space.code,].indexOf(keyCode)>=0;},_onKeyDown:function(event)
+{if(this.isShowing()&&this.isClosingKey(event.keyCode)){this.hide();event.consume();}},__proto__:WebInspector.VBox.prototype}
+WebInspector.RemoteDebuggingTerminatedScreen=function(reason)
+{WebInspector.HelpScreen.call(this,WebInspector.UIString("Detached from the target"));var p=this.contentElement.createChild("p");p.classList.add("help-section");p.createChild("span").textContent=WebInspector.UIString("Remote debugging has been terminated with reason: ");p.createChild("span","error-message").textContent=reason;p.createChild("br");p.createChild("span").textContent=WebInspector.UIString("Please re-attach to the new target.");}
+WebInspector.RemoteDebuggingTerminatedScreen.prototype={__proto__:WebInspector.HelpScreen.prototype}
+WebInspector.WorkerTerminatedScreen=function()
+{WebInspector.HelpScreen.call(this,WebInspector.UIString("Inspected worker terminated"));var p=this.contentElement.createChild("p");p.classList.add("help-section");p.textContent=WebInspector.UIString("Inspected worker has terminated. Once it restarts we will attach to it automatically.");}
+WebInspector.WorkerTerminatedScreen.prototype={__proto__:WebInspector.HelpScreen.prototype}
+if(!window.InspectorFrontendHost){WebInspector.InspectorFrontendHostStub=function()
+{this.isStub=true;}
+WebInspector.InspectorFrontendHostStub.prototype={getSelectionBackgroundColor:function()
+{return"#6e86ff";},getSelectionForegroundColor:function()
+{return"#ffffff";},platform:function()
+{var match=navigator.userAgent.match(/Windows NT/);if(match)
+return"windows";match=navigator.userAgent.match(/Mac OS X/);if(match)
+return"mac";return"linux";},port:function()
+{return"unknown";},bringToFront:function()
+{this._windowVisible=true;},closeWindow:function()
+{this._windowVisible=false;},setIsDocked:function(isDocked)
+{},setContentsResizingStrategy:function(insets,minSize)
+{},inspectElementCompleted:function()
+{},moveWindowBy:function(x,y)
+{},setInjectedScriptForOrigin:function(origin,script)
+{},inspectedURLChanged:function(url)
+{document.title=WebInspector.UIString(Preferences.applicationTitle,url);},copyText:function(text)
+{WebInspector.console.log("Clipboard is not enabled in hosted mode. Please inspect using chrome://inspect",WebInspector.ConsoleMessage.MessageLevel.Error,true);},openInNewTab:function(url)
+{window.open(url,"_blank");},save:function(url,content,forceSaveAs)
+{WebInspector.console.log("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect",WebInspector.ConsoleMessage.MessageLevel.Error,true);WebInspector.fileManager.canceledSaveURL(url);},append:function(url,content)
+{WebInspector.console.log("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect",WebInspector.ConsoleMessage.MessageLevel.Error,true);},sendMessageToBackend:function(message)
+{},sendMessageToEmbedder:function(message)
+{},recordActionTaken:function(actionCode)
+{},recordPanelShown:function(panelCode)
+{},requestFileSystems:function()
+{},addFileSystem:function()
+{},removeFileSystem:function(fileSystemPath)
+{},isolatedFileSystem:function(fileSystemId,registeredName)
+{return null;},upgradeDraggedFileSystemPermissions:function(domFileSystem)
+{},indexPath:function(requestId,fileSystemPath)
+{},stopIndexing:function(requestId)
+{},searchInPath:function(requestId,fileSystemPath,query)
+{},setZoomFactor:function(zoom)
+{},zoomFactor:function()
+{return 1;},zoomIn:function()
+{},zoomOut:function()
+{},resetZoom:function()
+{},isUnderTest:function()
+{return false;}}
+InspectorFrontendHost=new WebInspector.InspectorFrontendHostStub();}
+WebInspector.FileManager=function()
+{this._saveCallbacks={};}
+WebInspector.FileManager.EventTypes={SavedURL:"SavedURL",AppendedToURL:"AppendedToURL"}
+WebInspector.FileManager.prototype={canSave:function()
+{return true;},save:function(url,content,forceSaveAs,callback)
+{var savedURLs=WebInspector.settings.savedURLs.get();delete savedURLs[url];WebInspector.settings.savedURLs.set(savedURLs);this._saveCallbacks[url]=callback||null;InspectorFrontendHost.save(url,content,forceSaveAs);},savedURL:function(url)
+{var savedURLs=WebInspector.settings.savedURLs.get();savedURLs[url]=true;WebInspector.settings.savedURLs.set(savedURLs);this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.SavedURL,url);this._invokeSaveCallback(url,true);},_invokeSaveCallback:function(url,accepted)
+{var callback=this._saveCallbacks[url];delete this._saveCallbacks[url];if(callback)
+callback(accepted);},canceledSaveURL:function(url)
+{this._invokeSaveCallback(url,false);},isURLSaved:function(url)
+{var savedURLs=WebInspector.settings.savedURLs.get();return savedURLs[url];},append:function(url,content)
+{InspectorFrontendHost.append(url,content);},close:function(url)
+{},appendedToURL:function(url)
+{this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.AppendedToURL,url);},__proto__:WebInspector.Object.prototype}
+WebInspector.fileManager=new WebInspector.FileManager();WebInspector.Checkbox=function(label,className,tooltip)
+{this.element=document.createElement('label');this._inputElement=document.createElement('input');this._inputElement.type="checkbox";this.element.className=className;this.element.appendChild(this._inputElement);this.element.appendChild(document.createTextNode(label));if(tooltip)
+this.element.title=tooltip;}
+WebInspector.Checkbox.prototype={set checked(checked)
+{this._inputElement.checked=checked;},get checked()
+{return this._inputElement.checked;},addEventListener:function(listener)
+{function listenerWrapper(event)
+{if(listener)
+listener(event);event.consume();return true;}
+this._inputElement.addEventListener("click",listenerWrapper,false);this.element.addEventListener("click",listenerWrapper,false);}}
+WebInspector.ContextMenuItem=function(topLevelMenu,type,label,disabled,checked)
+{this._type=type;this._label=label;this._disabled=disabled;this._checked=checked;this._contextMenu=topLevelMenu;if(type==="item"||type==="checkbox")
+this._id=topLevelMenu.nextId();}
+WebInspector.ContextMenuItem.prototype={id:function()
+{return this._id;},type:function()
+{return this._type;},isEnabled:function()
+{return!this._disabled;},setEnabled:function(enabled)
+{this._disabled=!enabled;},_buildDescriptor:function()
+{switch(this._type){case"item":return{type:"item",id:this._id,label:this._label,enabled:!this._disabled};case"separator":return{type:"separator"};case"checkbox":return{type:"checkbox",id:this._id,label:this._label,checked:!!this._checked,enabled:!this._disabled};}}}
+WebInspector.ContextSubMenuItem=function(topLevelMenu,label,disabled)
+{WebInspector.ContextMenuItem.call(this,topLevelMenu,"subMenu",label,disabled);this._items=[];}
+WebInspector.ContextSubMenuItem.prototype={appendItem:function(label,handler,disabled)
+{var item=new WebInspector.ContextMenuItem(this._contextMenu,"item",label,disabled);this._pushItem(item);this._contextMenu._setHandler(item.id(),handler);return item;},appendSubMenuItem:function(label,disabled)
+{var item=new WebInspector.ContextSubMenuItem(this._contextMenu,label,disabled);this._pushItem(item);return item;},appendCheckboxItem:function(label,handler,checked,disabled)
+{var item=new WebInspector.ContextMenuItem(this._contextMenu,"checkbox",label,disabled,checked);this._pushItem(item);this._contextMenu._setHandler(item.id(),handler);return item;},appendSeparator:function()
+{if(this._items.length)
+this._pendingSeparator=true;},_pushItem:function(item)
+{if(this._pendingSeparator){this._items.push(new WebInspector.ContextMenuItem(this._contextMenu,"separator"));delete this._pendingSeparator;}
+this._items.push(item);},isEmpty:function()
+{return!this._items.length;},_buildDescriptor:function()
+{var result={type:"subMenu",label:this._label,enabled:!this._disabled,subItems:[]};for(var i=0;i<this._items.length;++i)
+result.subItems.push(this._items[i]._buildDescriptor());return result;},__proto__:WebInspector.ContextMenuItem.prototype}
+WebInspector.ContextMenu=function(event){WebInspector.ContextSubMenuItem.call(this,this,"");this._event=event;this._handlers={};this._id=0;}
+WebInspector.ContextMenu.setUseSoftMenu=function(useSoftMenu)
+{WebInspector.ContextMenu._useSoftMenu=useSoftMenu;}
+WebInspector.ContextMenu.prototype={nextId:function()
+{return this._id++;},show:function()
+{var menuObject=this._buildDescriptor();if(menuObject.length){WebInspector._contextMenu=this;if(WebInspector.ContextMenu._useSoftMenu){var softMenu=new WebInspector.SoftContextMenu(menuObject);softMenu.show(this._event);}else{InspectorFrontendHost.showContextMenu(this._event,menuObject);}
+this._event.consume();}},_setHandler:function(id,handler)
+{if(handler)
+this._handlers[id]=handler;},_buildDescriptor:function()
+{var result=[];for(var i=0;i<this._items.length;++i)
+result.push(this._items[i]._buildDescriptor());return result;},_itemSelected:function(id)
+{if(this._handlers[id])
+this._handlers[id].call(this);},appendApplicableItems:function(target)
+{WebInspector.moduleManager.extensions(WebInspector.ContextMenu.Provider,target).forEach(processProviders.bind(this));function processProviders(extension)
+{var provider=(extension.instance());this.appendSeparator();provider.appendApplicableItems(this._event,this,target);this.appendSeparator();}},__proto__:WebInspector.ContextSubMenuItem.prototype}
+WebInspector.ContextMenu.Provider=function(){}
+WebInspector.ContextMenu.Provider.prototype={appendApplicableItems:function(event,contextMenu,target){}}
+WebInspector.contextMenuItemSelected=function(id)
+{if(WebInspector._contextMenu)
+WebInspector._contextMenu._itemSelected(id);}
+WebInspector.contextMenuCleared=function()
+{}
+WebInspector.SoftContextMenu=function(items,parentMenu)
+{this._items=items;this._parentMenu=parentMenu;}
+WebInspector.SoftContextMenu.prototype={show:function(event)
+{this._x=event.x;this._y=event.y;this._time=new Date().getTime();var absoluteX=event.pageX;var absoluteY=event.pageY;var targetElement=event.target;while(targetElement&&window!==targetElement.ownerDocument.defaultView){var frameElement=targetElement.ownerDocument.defaultView.frameElement;absoluteY+=frameElement.totalOffsetTop();absoluteX+=frameElement.totalOffsetLeft();targetElement=frameElement;}
+var targetRect;this._contextMenuElement=document.createElement("div");this._contextMenuElement.className="soft-context-menu";this._contextMenuElement.tabIndex=0;this._contextMenuElement.style.top=absoluteY+"px";this._contextMenuElement.style.left=absoluteX+"px";this._contextMenuElement.addEventListener("mouseup",consumeEvent,false);this._contextMenuElement.addEventListener("keydown",this._menuKeyDown.bind(this),false);for(var i=0;i<this._items.length;++i)
+this._contextMenuElement.appendChild(this._createMenuItem(this._items[i]));if(!this._parentMenu){this._glassPaneElement=document.createElement("div");this._glassPaneElement.className="soft-context-menu-glass-pane";this._glassPaneElement.tabIndex=0;this._glassPaneElement.addEventListener("mouseup",this._glassPaneMouseUp.bind(this),false);this._glassPaneElement.appendChild(this._contextMenuElement);document.body.appendChild(this._glassPaneElement);this._focus();}else
+this._parentMenu._parentGlassPaneElement().appendChild(this._contextMenuElement);if(document.body.offsetWidth<this._contextMenuElement.offsetLeft+this._contextMenuElement.offsetWidth)
+this._contextMenuElement.style.left=(absoluteX-this._contextMenuElement.offsetWidth)+"px";if(document.body.offsetHeight<this._contextMenuElement.offsetTop+this._contextMenuElement.offsetHeight)
+this._contextMenuElement.style.top=(document.body.offsetHeight-this._contextMenuElement.offsetHeight)+"px";event.consume(true);},_parentGlassPaneElement:function()
+{if(this._glassPaneElement)
+return this._glassPaneElement;if(this._parentMenu)
+return this._parentMenu._parentGlassPaneElement();return null;},_createMenuItem:function(item)
+{if(item.type==="separator")
+return this._createSeparator();if(item.type==="subMenu")
+return this._createSubMenu(item);var menuItemElement=document.createElement("div");menuItemElement.className="soft-context-menu-item";var checkMarkElement=document.createElement("span");checkMarkElement.textContent="\u2713 ";checkMarkElement.className="soft-context-menu-item-checkmark";if(!item.checked)
+checkMarkElement.style.opacity="0";menuItemElement.appendChild(checkMarkElement);menuItemElement.appendChild(document.createTextNode(item.label));menuItemElement.addEventListener("mousedown",this._menuItemMouseDown.bind(this),false);menuItemElement.addEventListener("mouseup",this._menuItemMouseUp.bind(this),false);menuItemElement.addEventListener("mouseover",this._menuItemMouseOver.bind(this),false);menuItemElement.addEventListener("mouseout",this._menuItemMouseOut.bind(this),false);menuItemElement._actionId=item.id;return menuItemElement;},_createSubMenu:function(item)
+{var menuItemElement=document.createElement("div");menuItemElement.className="soft-context-menu-item";menuItemElement._subItems=item.subItems;var checkMarkElement=document.createElement("span");checkMarkElement.textContent="\u2713 ";checkMarkElement.className="soft-context-menu-item-checkmark";checkMarkElement.style.opacity="0";menuItemElement.appendChild(checkMarkElement);var subMenuArrowElement=document.createElement("span");subMenuArrowElement.textContent="\u25B6";subMenuArrowElement.className="soft-context-menu-item-submenu-arrow";menuItemElement.appendChild(document.createTextNode(item.label));menuItemElement.appendChild(subMenuArrowElement);menuItemElement.addEventListener("mousedown",this._menuItemMouseDown.bind(this),false);menuItemElement.addEventListener("mouseup",this._menuItemMouseUp.bind(this),false);menuItemElement.addEventListener("mouseover",this._menuItemMouseOver.bind(this),false);menuItemElement.addEventListener("mouseout",this._menuItemMouseOut.bind(this),false);return menuItemElement;},_createSeparator:function()
+{var separatorElement=document.createElement("div");separatorElement.className="soft-context-menu-separator";separatorElement._isSeparator=true;separatorElement.addEventListener("mouseover",this._hideSubMenu.bind(this),false);separatorElement.createChild("div","separator-line");return separatorElement;},_menuItemMouseDown:function(event)
+{event.consume(true);},_menuItemMouseUp:function(event)
+{this._triggerAction(event.target,event);event.consume();},_focus:function()
+{this._contextMenuElement.focus();},_triggerAction:function(menuItemElement,event)
+{if(!menuItemElement._subItems){this._discardMenu(true,event);if(typeof menuItemElement._actionId!=="undefined"){WebInspector.contextMenuItemSelected(menuItemElement._actionId);delete menuItemElement._actionId;}
+return;}
+this._showSubMenu(menuItemElement,event);event.consume();},_showSubMenu:function(menuItemElement,event)
+{if(menuItemElement._subMenuTimer){clearTimeout(menuItemElement._subMenuTimer);delete menuItemElement._subMenuTimer;}
+if(this._subMenu)
+return;this._subMenu=new WebInspector.SoftContextMenu(menuItemElement._subItems,this);this._subMenu.show(this._buildMouseEventForSubMenu(menuItemElement));},_buildMouseEventForSubMenu:function(subMenuItemElement)
+{var subMenuOffset={x:subMenuItemElement.offsetWidth-3,y:subMenuItemElement.offsetTop-1};var targetX=this._x+subMenuOffset.x;var targetY=this._y+subMenuOffset.y;var targetPageX=parseInt(this._contextMenuElement.style.left,10)+subMenuOffset.x;var targetPageY=parseInt(this._contextMenuElement.style.top,10)+subMenuOffset.y;return{x:targetX,y:targetY,pageX:targetPageX,pageY:targetPageY,consume:function(){}};},_hideSubMenu:function()
+{if(!this._subMenu)
+return;this._subMenu._discardSubMenus();this._focus();},_menuItemMouseOver:function(event)
+{this._highlightMenuItem(event.target);},_menuItemMouseOut:function(event)
+{if(!this._subMenu||!event.relatedTarget){this._highlightMenuItem(null);return;}
+var relatedTarget=event.relatedTarget;if(this._contextMenuElement.isSelfOrAncestor(relatedTarget)||relatedTarget.classList.contains("soft-context-menu-glass-pane"))
+this._highlightMenuItem(null);},_highlightMenuItem:function(menuItemElement)
+{if(this._highlightedMenuItemElement===menuItemElement)
+return;this._hideSubMenu();if(this._highlightedMenuItemElement){this._highlightedMenuItemElement.classList.remove("soft-context-menu-item-mouse-over");if(this._highlightedMenuItemElement._subItems&&this._highlightedMenuItemElement._subMenuTimer){clearTimeout(this._highlightedMenuItemElement._subMenuTimer);delete this._highlightedMenuItemElement._subMenuTimer;}}
+this._highlightedMenuItemElement=menuItemElement;if(this._highlightedMenuItemElement){this._highlightedMenuItemElement.classList.add("soft-context-menu-item-mouse-over");this._contextMenuElement.focus();if(this._highlightedMenuItemElement._subItems&&!this._highlightedMenuItemElement._subMenuTimer)
+this._highlightedMenuItemElement._subMenuTimer=setTimeout(this._showSubMenu.bind(this,this._highlightedMenuItemElement,this._buildMouseEventForSubMenu(this._highlightedMenuItemElement)),150);}},_highlightPrevious:function()
+{var menuItemElement=this._highlightedMenuItemElement?this._highlightedMenuItemElement.previousSibling:this._contextMenuElement.lastChild;while(menuItemElement&&menuItemElement._isSeparator)
+menuItemElement=menuItemElement.previousSibling;if(menuItemElement)
+this._highlightMenuItem(menuItemElement);},_highlightNext:function()
+{var menuItemElement=this._highlightedMenuItemElement?this._highlightedMenuItemElement.nextSibling:this._contextMenuElement.firstChild;while(menuItemElement&&menuItemElement._isSeparator)
+menuItemElement=menuItemElement.nextSibling;if(menuItemElement)
+this._highlightMenuItem(menuItemElement);},_menuKeyDown:function(event)
+{switch(event.keyIdentifier){case"Up":this._highlightPrevious();break;case"Down":this._highlightNext();break;case"Left":if(this._parentMenu){this._highlightMenuItem(null);this._parentMenu._focus();}
+break;case"Right":if(!this._highlightedMenuItemElement)
+break;if(this._highlightedMenuItemElement._subItems){this._showSubMenu(this._highlightedMenuItemElement,this._buildMouseEventForSubMenu(this._highlightedMenuItemElement));this._subMenu._focus();this._subMenu._highlightNext();}
+break;case"U+001B":this._discardMenu(true,event);break;case"Enter":if(!isEnterKey(event))
+break;case"U+0020":if(this._highlightedMenuItemElement)
+this._triggerAction(this._highlightedMenuItemElement,event);break;}
+event.consume(true);},_glassPaneMouseUp:function(event)
+{if(event.x===this._x&&event.y===this._y&&new Date().getTime()-this._time<300)
+return;this._discardMenu(true,event);event.consume();},_discardMenu:function(closeParentMenus,event)
+{if(this._subMenu&&!closeParentMenus)
+return;if(this._glassPaneElement){var glassPane=this._glassPaneElement;delete this._glassPaneElement;document.body.removeChild(glassPane);if(this._parentMenu){delete this._parentMenu._subMenu;if(closeParentMenus)
+this._parentMenu._discardMenu(closeParentMenus,event);}
+if(event)
+event.consume(true);}else if(this._parentMenu&&this._contextMenuElement.parentElement){this._discardSubMenus();if(closeParentMenus)
+this._parentMenu._discardMenu(closeParentMenus,event);if(event)
+event.consume(true);}},_discardSubMenus:function()
+{if(this._subMenu)
+this._subMenu._discardSubMenus();this._contextMenuElement.remove();if(this._parentMenu)
+delete this._parentMenu._subMenu;}}
+if(!InspectorFrontendHost.showContextMenu){InspectorFrontendHost.showContextMenu=function(event,items)
+{new WebInspector.SoftContextMenu(items).show(event);}}
+WebInspector.KeyboardShortcut=function()
+{}
+WebInspector.KeyboardShortcut.Modifiers={None:0,Shift:1,Ctrl:2,Alt:4,Meta:8,get CtrlOrMeta()
+{return WebInspector.isMac()?this.Meta:this.Ctrl;}};WebInspector.KeyboardShortcut.Key;WebInspector.KeyboardShortcut.Keys={Backspace:{code:8,name:"\u21a4"},Tab:{code:9,name:{mac:"\u21e5",other:"Tab"}},Enter:{code:13,name:{mac:"\u21a9",other:"Enter"}},Ctrl:{code:17,name:"Ctrl"},Esc:{code:27,name:{mac:"\u238b",other:"Esc"}},Space:{code:32,name:"Space"},PageUp:{code:33,name:{mac:"\u21de",other:"PageUp"}},PageDown:{code:34,name:{mac:"\u21df",other:"PageDown"}},End:{code:35,name:{mac:"\u2197",other:"End"}},Home:{code:36,name:{mac:"\u2196",other:"Home"}},Left:{code:37,name:"\u2190"},Up:{code:38,name:"\u2191"},Right:{code:39,name:"\u2192"},Down:{code:40,name:"\u2193"},Delete:{code:46,name:"Del"},Zero:{code:48,name:"0"},H:{code:72,name:"H"},Meta:{code:91,name:"Meta"},F1:{code:112,name:"F1"},F2:{code:113,name:"F2"},F3:{code:114,name:"F3"},F4:{code:115,name:"F4"},F5:{code:116,name:"F5"},F6:{code:117,name:"F6"},F7:{code:118,name:"F7"},F8:{code:119,name:"F8"},F9:{code:120,name:"F9"},F10:{code:121,name:"F10"},F11:{code:122,name:"F11"},F12:{code:123,name:"F12"},Semicolon:{code:186,name:";"},Plus:{code:187,name:"+"},Comma:{code:188,name:","},Minus:{code:189,name:"-"},Period:{code:190,name:"."},Slash:{code:191,name:"/"},QuestionMark:{code:191,name:"?"},Apostrophe:{code:192,name:"`"},Tilde:{code:192,name:"Tilde"},Backslash:{code:220,name:"\\"},SingleQuote:{code:222,name:"\'"},get CtrlOrMeta()
+{return WebInspector.isMac()?this.Meta:this.Ctrl;},};WebInspector.KeyboardShortcut.KeyBindings={};(function(){for(var key in WebInspector.KeyboardShortcut.Keys){var descriptor=WebInspector.KeyboardShortcut.Keys[key];if(typeof descriptor==="object"&&descriptor["code"]){var name=typeof descriptor["name"]==="string"?descriptor["name"]:key;WebInspector.KeyboardShortcut.KeyBindings[name]={code:descriptor["code"]};}}})();WebInspector.KeyboardShortcut.makeKey=function(keyCode,modifiers)
+{if(typeof keyCode==="string")
+keyCode=keyCode.charCodeAt(0)-(/^[a-z]/.test(keyCode)?32:0);modifiers=modifiers||WebInspector.KeyboardShortcut.Modifiers.None;return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode,modifiers);}
+WebInspector.KeyboardShortcut.makeKeyFromEvent=function(keyboardEvent)
+{var modifiers=WebInspector.KeyboardShortcut.Modifiers.None;if(keyboardEvent.shiftKey)
+modifiers|=WebInspector.KeyboardShortcut.Modifiers.Shift;if(keyboardEvent.ctrlKey)
+modifiers|=WebInspector.KeyboardShortcut.Modifiers.Ctrl;if(keyboardEvent.altKey)
+modifiers|=WebInspector.KeyboardShortcut.Modifiers.Alt;if(keyboardEvent.metaKey)
+modifiers|=WebInspector.KeyboardShortcut.Modifiers.Meta;function keyCodeForEvent(keyboardEvent)
+{return keyboardEvent.keyCode||keyboardEvent["__keyCode"];}
+return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCodeForEvent(keyboardEvent),modifiers);}
+WebInspector.KeyboardShortcut.eventHasCtrlOrMeta=function(event)
+{return WebInspector.isMac()?event.metaKey&&!event.ctrlKey:event.ctrlKey&&!event.metaKey;}
+WebInspector.KeyboardShortcut.hasNoModifiers=function(event)
+{return!event.ctrlKey&&!event.shiftKey&&!event.altKey&&!event.metaKey;}
+WebInspector.KeyboardShortcut.Descriptor;WebInspector.KeyboardShortcut.makeDescriptor=function(key,modifiers)
+{return{key:WebInspector.KeyboardShortcut.makeKey(typeof key==="string"?key:key.code,modifiers),name:WebInspector.KeyboardShortcut.shortcutToString(key,modifiers)};}
+WebInspector.KeyboardShortcut.makeKeyFromBindingShortcut=function(shortcut)
+{var parts=shortcut.split(/\+(?!$)/);var modifiers=0;for(var i=0;i<parts.length;++i){if(typeof WebInspector.KeyboardShortcut.Modifiers[parts[i]]!=="undefined"){modifiers|=WebInspector.KeyboardShortcut.Modifiers[parts[i]];continue;}
+console.assert(i===parts.length-1,"Modifiers-only shortcuts are not allowed (encountered <"+shortcut+">)");var key=WebInspector.KeyboardShortcut.Keys[parts[i]]||WebInspector.KeyboardShortcut.KeyBindings[parts[i]];if(key&&key.shiftKey)
+modifiers|=WebInspector.KeyboardShortcut.Modifiers.Shift;return WebInspector.KeyboardShortcut.makeKey(key?key.code:parts[i].toLowerCase(),modifiers)}
+console.assert(false);return 0;}
+WebInspector.KeyboardShortcut.shortcutToString=function(key,modifiers)
+{return WebInspector.KeyboardShortcut._modifiersToString(modifiers)+WebInspector.KeyboardShortcut._keyName(key);}
+WebInspector.KeyboardShortcut._keyName=function(key)
+{if(typeof key==="string")
+return key.toUpperCase();if(typeof key.name==="string")
+return key.name;return key.name[WebInspector.platform()]||key.name.other||'';}
+WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers=function(keyCode,modifiers)
+{return(keyCode&255)|(modifiers<<8);};WebInspector.KeyboardShortcut._modifiersToString=function(modifiers)
+{const cmdKey="\u2318";const optKey="\u2325";const shiftKey="\u21e7";const ctrlKey="\u2303";var isMac=WebInspector.isMac();var res="";if(modifiers&WebInspector.KeyboardShortcut.Modifiers.Ctrl)
+res+=isMac?ctrlKey:"Ctrl + ";if(modifiers&WebInspector.KeyboardShortcut.Modifiers.Alt)
+res+=isMac?optKey:"Alt + ";if(modifiers&WebInspector.KeyboardShortcut.Modifiers.Shift)
+res+=isMac?shiftKey:"Shift + ";if(modifiers&WebInspector.KeyboardShortcut.Modifiers.Meta)
+res+=isMac?cmdKey:"Win + ";return res;};WebInspector.KeyboardShortcut.handleShortcut=function(event)
+{var key=WebInspector.KeyboardShortcut.makeKeyFromEvent(event);var extensions=WebInspector.KeyboardShortcut._keysToActionExtensions[key];if(!extensions)
+return;function handler(extension)
+{var result=extension.instance().handleAction(event);if(result)
+event.consume(true);delete WebInspector.KeyboardShortcut._pendingActionTimer;return result;}
+for(var i=0;i<extensions.length;++i){var ident=event.keyIdentifier;if(/^F\d+|Control|Shift|Alt|Meta|Win|U\+001B$/.test(ident)||event.ctrlKey||event.altKey||event.metaKey){if(handler(extensions[i]))
+return;}else{WebInspector.KeyboardShortcut._pendingActionTimer=setTimeout(handler.bind(null,extensions[i]),0);break;}}}
+WebInspector.KeyboardShortcut.SelectAll=WebInspector.KeyboardShortcut.makeKey("a",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);WebInspector.KeyboardShortcut._onKeyPress=function(event)
+{if(!WebInspector.KeyboardShortcut._pendingActionTimer)
+return;var target=event.target;if(WebInspector.isBeingEdited(event.target)){clearTimeout(WebInspector.KeyboardShortcut._pendingActionTimer);delete WebInspector.KeyboardShortcut._pendingActionTimer;}}
+WebInspector.KeyboardShortcut.registerActions=function()
+{document.addEventListener("keypress",WebInspector.KeyboardShortcut._onKeyPress,true);WebInspector.KeyboardShortcut._keysToActionExtensions={};var extensions=WebInspector.moduleManager.extensions(WebInspector.ActionDelegate);extensions.forEach(registerBindings);function registerBindings(extension)
+{var bindings=extension.descriptor().bindings;for(var i=0;bindings&&i<bindings.length;++i){if(!platformMatches(bindings[i].platform))
+continue;var shortcuts=bindings[i].shortcut.split(/\s+/);shortcuts.forEach(registerShortcut.bind(null,extension));}}
+function registerShortcut(extension,shortcut)
+{var key=WebInspector.KeyboardShortcut.makeKeyFromBindingShortcut(shortcut);if(!key)
+return;if(WebInspector.KeyboardShortcut._keysToActionExtensions[key])
+WebInspector.KeyboardShortcut._keysToActionExtensions[key].push(extension);else
+WebInspector.KeyboardShortcut._keysToActionExtensions[key]=[extension];}
+function platformMatches(platformsString)
+{if(!platformsString)
+return true;var platforms=platformsString.split(",");var isMatch=false;var currentPlatform=WebInspector.platform();for(var i=0;!isMatch&&i<platforms.length;++i)
+isMatch=platforms[i]===currentPlatform;return isMatch;}}
+WebInspector.SuggestBoxDelegate=function()
+{}
+WebInspector.SuggestBoxDelegate.prototype={applySuggestion:function(suggestion,isIntermediateSuggestion){},acceptSuggestion:function(){},}
+WebInspector.SuggestBox=function(suggestBoxDelegate,anchorElement,className,maxItemsHeight)
+{this._suggestBoxDelegate=suggestBoxDelegate;this._anchorElement=anchorElement;this._length=0;this._selectedIndex=-1;this._selectedElement=null;this._maxItemsHeight=maxItemsHeight;this._bodyElement=anchorElement.ownerDocument.body;this._element=anchorElement.ownerDocument.createElement("div");this._element.className="suggest-box "+(className||"");this._element.addEventListener("mousedown",this._onBoxMouseDown.bind(this),true);this.containerElement=this._element.createChild("div","container");this.contentElement=this.containerElement.createChild("div","content");}
+WebInspector.SuggestBox.prototype={visible:function()
+{return!!this._element.parentElement;},setPosition:function(anchorBox)
+{this._updateBoxPosition(anchorBox);},_updateBoxPosition:function(anchorBox)
+{this._anchorBox=anchorBox;anchorBox=anchorBox||this._anchorElement.boxInWindow(window);var container=WebInspector.Dialog.modalHostView().element;anchorBox=anchorBox.relativeToElement(container);var totalWidth=container.offsetWidth;var totalHeight=container.offsetHeight;this.contentElement.style.display="inline-block";document.body.appendChild(this.contentElement);this.contentElement.positionAt(0,0);var contentWidth=this.contentElement.offsetWidth;var contentHeight=this.contentElement.offsetHeight;this.contentElement.style.display="block";this.containerElement.appendChild(this.contentElement);const spacer=6;const suggestBoxPaddingX=21;const suggestBoxPaddingY=2;var maxWidth=totalWidth-anchorBox.x-spacer;var width=Math.min(contentWidth,maxWidth-suggestBoxPaddingX)+suggestBoxPaddingX;var paddedWidth=contentWidth+suggestBoxPaddingX;var boxX=anchorBox.x;if(width<paddedWidth){maxWidth=totalWidth-spacer;width=Math.min(contentWidth,maxWidth-suggestBoxPaddingX)+suggestBoxPaddingX;boxX=totalWidth-width;}
+var boxY;var aboveHeight=anchorBox.y;var underHeight=totalHeight-anchorBox.y-anchorBox.height;var maxHeight=this._maxItemsHeight?contentHeight*this._maxItemsHeight/this._length:Math.max(underHeight,aboveHeight)-spacer;var height=Math.min(contentHeight,maxHeight-suggestBoxPaddingY)+suggestBoxPaddingY;if(underHeight>=aboveHeight){boxY=anchorBox.y+anchorBox.height;this._element.classList.remove("above-anchor");this._element.classList.add("under-anchor");}else{boxY=anchorBox.y-height;this._element.classList.remove("under-anchor");this._element.classList.add("above-anchor");}
+this._element.positionAt(boxX,boxY,container);this._element.style.width=width+"px";this._element.style.height=height+"px";},_onBoxMouseDown:function(event)
+{event.preventDefault();},hide:function()
+{if(!this.visible())
+return;this._element.remove();delete this._selectedElement;this._selectedIndex=-1;},removeFromElement:function()
+{this.hide();},_applySuggestion:function(isIntermediateSuggestion)
+{if(!this.visible()||!this._selectedElement)
+return false;var suggestion=this._selectedElement.textContent;if(!suggestion)
+return false;this._suggestBoxDelegate.applySuggestion(suggestion,isIntermediateSuggestion);return true;},acceptSuggestion:function()
+{var result=this._applySuggestion();this.hide();if(!result)
+return false;this._suggestBoxDelegate.acceptSuggestion();return true;},_selectClosest:function(shift,isCircular)
+{if(!this._length)
+return false;if(this._selectedIndex===-1&&shift<0)
+shift+=1;var index=this._selectedIndex+shift;if(isCircular)
+index=(this._length+index)%this._length;else
+index=Number.constrain(index,0,this._length-1);this._selectItem(index);this._applySuggestion(true);return true;},_onItemMouseDown:function(event)
+{this._selectedElement=event.currentTarget;this.acceptSuggestion();event.consume(true);},_createItemElement:function(prefix,text)
+{var element=document.createElement("div");element.className="suggest-box-content-item source-code";element.tabIndex=-1;if(prefix&&prefix.length&&!text.indexOf(prefix)){var prefixElement=element.createChild("span","prefix");prefixElement.textContent=prefix;var suffixElement=element.createChild("span","suffix");suffixElement.textContent=text.substring(prefix.length);}else{var suffixElement=element.createChild("span","suffix");suffixElement.textContent=text;}
+element.addEventListener("mousedown",this._onItemMouseDown.bind(this),false);return element;},_updateItems:function(items,selectedIndex,userEnteredText)
+{this._length=items.length;this.contentElement.removeChildren();for(var i=0;i<items.length;++i){var item=items[i];var currentItemElement=this._createItemElement(userEnteredText,item);this.contentElement.appendChild(currentItemElement);}
+this._selectedElement=null;if(typeof selectedIndex==="number")
+this._selectItem(selectedIndex);},_selectItem:function(index)
+{if(this._selectedElement)
+this._selectedElement.classList.remove("selected");this._selectedIndex=index;if(index<0)
+return;this._selectedElement=this.contentElement.children[index];this._selectedElement.classList.add("selected");this._selectedElement.scrollIntoViewIfNeeded(false);},_canShowBox:function(completions,canShowForSingleItem,userEnteredText)
+{if(!completions||!completions.length)
+return false;if(completions.length>1)
+return true;return canShowForSingleItem&&completions[0]!==userEnteredText;},_rememberRowCountPerViewport:function()
+{if(!this.contentElement.firstChild)
+return;this._rowCountPerViewport=Math.floor(this.containerElement.offsetHeight/this.contentElement.firstChild.offsetHeight);},updateSuggestions:function(anchorBox,completions,selectedIndex,canShowForSingleItem,userEnteredText)
+{if(this._canShowBox(completions,canShowForSingleItem,userEnteredText)){this._updateItems(completions,selectedIndex,userEnteredText);this._updateBoxPosition(anchorBox);if(!this.visible())
+this._bodyElement.appendChild(this._element);this._rememberRowCountPerViewport();}else
+this.hide();},keyPressed:function(event)
+{switch(event.keyIdentifier){case"Up":return this.upKeyPressed();case"Down":return this.downKeyPressed();case"PageUp":return this.pageUpKeyPressed();case"PageDown":return this.pageDownKeyPressed();case"Enter":return this.enterKeyPressed();}
+return false;},upKeyPressed:function()
+{return this._selectClosest(-1,true);},downKeyPressed:function()
+{return this._selectClosest(1,true);},pageUpKeyPressed:function()
+{return this._selectClosest(-this._rowCountPerViewport,false);},pageDownKeyPressed:function()
+{return this._selectClosest(this._rowCountPerViewport,false);},enterKeyPressed:function()
+{var hasSelectedItem=!!this._selectedElement;this.acceptSuggestion();return hasSelectedItem;}}
+WebInspector.TextPrompt=function(completions,stopCharacters)
+{this._proxyElement;this._proxyElementDisplay="inline-block";this._loadCompletions=completions;this._completionStopCharacters=stopCharacters||" =:[({;,!+-*/&|^<>.";}
+WebInspector.TextPrompt.Events={ItemApplied:"text-prompt-item-applied",ItemAccepted:"text-prompt-item-accepted"};WebInspector.TextPrompt.prototype={get proxyElement()
+{return this._proxyElement;},setSuggestBoxEnabled:function(className)
+{this._suggestBoxClassName=className;},renderAsBlock:function()
+{this._proxyElementDisplay="block";},attach:function(element)
+{return this._attachInternal(element);},attachAndStartEditing:function(element,blurListener)
+{this._attachInternal(element);this._startEditing(blurListener);return this.proxyElement;},_attachInternal:function(element)
+{if(this.proxyElement)
+throw"Cannot attach an attached TextPrompt";this._element=element;this._boundOnKeyDown=this.onKeyDown.bind(this);this._boundOnMouseWheel=this.onMouseWheel.bind(this);this._boundSelectStart=this._selectStart.bind(this);this._boundHideSuggestBox=this.hideSuggestBox.bind(this);this._proxyElement=element.ownerDocument.createElement("span");this._proxyElement.style.display=this._proxyElementDisplay;element.parentElement.insertBefore(this.proxyElement,element);this.proxyElement.appendChild(element);this._element.classList.add("text-prompt");this._element.addEventListener("keydown",this._boundOnKeyDown,false);this._element.addEventListener("mousewheel",this._boundOnMouseWheel,false);this._element.addEventListener("selectstart",this._boundSelectStart,false);this._element.addEventListener("blur",this._boundHideSuggestBox,false);if(typeof this._suggestBoxClassName==="string")
+this._suggestBox=new WebInspector.SuggestBox(this,this._element,this._suggestBoxClassName);return this.proxyElement;},detach:function()
+{this._removeFromElement();this.proxyElement.parentElement.insertBefore(this._element,this.proxyElement);this.proxyElement.remove();delete this._proxyElement;this._element.classList.remove("text-prompt");this._element.removeEventListener("keydown",this._boundOnKeyDown,false);this._element.removeEventListener("mousewheel",this._boundOnMouseWheel,false);this._element.removeEventListener("selectstart",this._boundSelectStart,false);WebInspector.restoreFocusFromElement(this._element);},get text()
+{return this._element.textContent;},set text(x)
+{this._removeSuggestionAids();if(!x){this._element.removeChildren();this._element.appendChild(document.createElement("br"));}else
+this._element.textContent=x;this.moveCaretToEndOfPrompt();this._element.scrollIntoView();},_removeFromElement:function()
+{this.clearAutoComplete(true);this._element.removeEventListener("keydown",this._boundOnKeyDown,false);this._element.removeEventListener("selectstart",this._boundSelectStart,false);this._element.removeEventListener("blur",this._boundHideSuggestBox,false);if(this._isEditing)
+this._stopEditing();if(this._suggestBox)
+this._suggestBox.removeFromElement();},_startEditing:function(blurListener)
+{this._isEditing=true;this._element.classList.add("editing");if(blurListener){this._blurListener=blurListener;this._element.addEventListener("blur",this._blurListener,false);}
+this._oldTabIndex=this._element.tabIndex;if(this._element.tabIndex<0)
+this._element.tabIndex=0;WebInspector.setCurrentFocusElement(this._element);if(!this.text)
+this._updateAutoComplete();},_stopEditing:function()
+{this._element.tabIndex=this._oldTabIndex;if(this._blurListener)
+this._element.removeEventListener("blur",this._blurListener,false);this._element.classList.remove("editing");delete this._isEditing;},_removeSuggestionAids:function()
+{this.clearAutoComplete();this.hideSuggestBox();},_selectStart:function()
+{if(this._selectionTimeout)
+clearTimeout(this._selectionTimeout);this._removeSuggestionAids();function moveBackIfOutside()
+{delete this._selectionTimeout;if(!this.isCaretInsidePrompt()&&window.getSelection().isCollapsed){this.moveCaretToEndOfPrompt();this.autoCompleteSoon();}}
+this._selectionTimeout=setTimeout(moveBackIfOutside.bind(this),100);},defaultKeyHandler:function(event,force)
+{this._updateAutoComplete(force);return false;},_updateAutoComplete:function(force)
+{this.clearAutoComplete();this.autoCompleteSoon(force);},onMouseWheel:function(event)
+{},onKeyDown:function(event)
+{var handled=false;var invokeDefault=true;switch(event.keyIdentifier){case"U+0009":handled=this.tabKeyPressed(event);break;case"Left":case"Home":this._removeSuggestionAids();invokeDefault=false;break;case"Right":case"End":if(this.isCaretAtEndOfPrompt())
+handled=this.acceptAutoComplete();else
+this._removeSuggestionAids();invokeDefault=false;break;case"U+001B":if(this.isSuggestBoxVisible()){this._removeSuggestionAids();handled=true;}
+break;case"U+0020":if(event.ctrlKey&&!event.metaKey&&!event.altKey&&!event.shiftKey){this.defaultKeyHandler(event,true);handled=true;}
+break;case"Alt":case"Meta":case"Shift":case"Control":invokeDefault=false;break;}
+if(!handled&&this.isSuggestBoxVisible())
+handled=this._suggestBox.keyPressed(event);if(!handled&&invokeDefault)
+handled=this.defaultKeyHandler(event);if(handled)
+event.consume(true);return handled;},acceptAutoComplete:function()
+{var result=false;if(this.isSuggestBoxVisible())
+result=this._suggestBox.acceptSuggestion();if(!result)
+result=this._acceptSuggestionInternal();return result;},clearAutoComplete:function(includeTimeout)
+{if(includeTimeout&&this._completeTimeout){clearTimeout(this._completeTimeout);delete this._completeTimeout;}
+delete this._waitingForCompletions;if(!this.autoCompleteElement)
+return;this.autoCompleteElement.remove();delete this.autoCompleteElement;if(!this._userEnteredRange||!this._userEnteredText)
+return;this._userEnteredRange.deleteContents();this._element.normalize();var userTextNode=document.createTextNode(this._userEnteredText);this._userEnteredRange.insertNode(userTextNode);var selectionRange=document.createRange();selectionRange.setStart(userTextNode,this._userEnteredText.length);selectionRange.setEnd(userTextNode,this._userEnteredText.length);var selection=window.getSelection();selection.removeAllRanges();selection.addRange(selectionRange);delete this._userEnteredRange;delete this._userEnteredText;},autoCompleteSoon:function(force)
+{var immediately=this.isSuggestBoxVisible()||force;if(!this._completeTimeout)
+this._completeTimeout=setTimeout(this.complete.bind(this,force),immediately?0:250);},complete:function(force,reverse)
+{this.clearAutoComplete(true);var selection=window.getSelection();if(!selection.rangeCount)
+return;var selectionRange=selection.getRangeAt(0);var shouldExit;if(!force&&!this.isCaretAtEndOfPrompt()&&!this.isSuggestBoxVisible())
+shouldExit=true;else if(!selection.isCollapsed)
+shouldExit=true;else if(!force){var wordSuffixRange=selectionRange.startContainer.rangeOfWord(selectionRange.endOffset,this._completionStopCharacters,this._element,"forward");if(wordSuffixRange.toString().length)
+shouldExit=true;}
+if(shouldExit){this.hideSuggestBox();return;}
+var wordPrefixRange=selectionRange.startContainer.rangeOfWord(selectionRange.startOffset,this._completionStopCharacters,this._element,"backward");this._waitingForCompletions=true;this._loadCompletions(this.proxyElement,wordPrefixRange,force,this._completionsReady.bind(this,selection,wordPrefixRange,!!reverse));},disableDefaultSuggestionForEmptyInput:function()
+{this._disableDefaultSuggestionForEmptyInput=true;},_boxForAnchorAtStart:function(selection,textRange)
+{var rangeCopy=selection.getRangeAt(0).cloneRange();var anchorElement=document.createElement("span");anchorElement.textContent="\u200B";textRange.insertNode(anchorElement);var box=anchorElement.boxInWindow(window);anchorElement.remove();selection.removeAllRanges();selection.addRange(rangeCopy);return box;},_buildCommonPrefix:function(completions,wordPrefixLength)
+{var commonPrefix=completions[0];for(var i=0;i<completions.length;++i){var completion=completions[i];var lastIndex=Math.min(commonPrefix.length,completion.length);for(var j=wordPrefixLength;j<lastIndex;++j){if(commonPrefix[j]!==completion[j]){commonPrefix=commonPrefix.substr(0,j);break;}}}
+return commonPrefix;},_completionsReady:function(selection,originalWordPrefixRange,reverse,completions,selectedIndex)
+{if(!this._waitingForCompletions||!completions.length){this.hideSuggestBox();return;}
+delete this._waitingForCompletions;var selectionRange=selection.getRangeAt(0);var fullWordRange=document.createRange();fullWordRange.setStart(originalWordPrefixRange.startContainer,originalWordPrefixRange.startOffset);fullWordRange.setEnd(selectionRange.endContainer,selectionRange.endOffset);if(originalWordPrefixRange.toString()+selectionRange.toString()!==fullWordRange.toString())
+return;selectedIndex=(this._disableDefaultSuggestionForEmptyInput&&!this.text)?-1:(selectedIndex||0);this._userEnteredRange=fullWordRange;this._userEnteredText=fullWordRange.toString();if(this._suggestBox)
+this._suggestBox.updateSuggestions(this._boxForAnchorAtStart(selection,fullWordRange),completions,selectedIndex,!this.isCaretAtEndOfPrompt(),this._userEnteredText);if(selectedIndex===-1)
+return;var wordPrefixLength=originalWordPrefixRange.toString().length;this._commonPrefix=this._buildCommonPrefix(completions,wordPrefixLength);if(this.isCaretAtEndOfPrompt()){this._userEnteredRange.deleteContents();this._element.normalize();var finalSelectionRange=document.createRange();var completionText=completions[selectedIndex];var prefixText=completionText.substring(0,wordPrefixLength);var suffixText=completionText.substring(wordPrefixLength);var prefixTextNode=document.createTextNode(prefixText);fullWordRange.insertNode(prefixTextNode);this.autoCompleteElement=document.createElement("span");this.autoCompleteElement.className="auto-complete-text";this.autoCompleteElement.textContent=suffixText;prefixTextNode.parentNode.insertBefore(this.autoCompleteElement,prefixTextNode.nextSibling);finalSelectionRange.setStart(prefixTextNode,wordPrefixLength);finalSelectionRange.setEnd(prefixTextNode,wordPrefixLength);selection.removeAllRanges();selection.addRange(finalSelectionRange);this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemApplied);}},_completeCommonPrefix:function()
+{if(!this.autoCompleteElement||!this._commonPrefix||!this._userEnteredText||!this._commonPrefix.startsWith(this._userEnteredText))
+return;if(!this.isSuggestBoxVisible()){this.acceptAutoComplete();return;}
+this.autoCompleteElement.textContent=this._commonPrefix.substring(this._userEnteredText.length);this._acceptSuggestionInternal(true);},applySuggestion:function(completionText,isIntermediateSuggestion)
+{this._applySuggestion(completionText,isIntermediateSuggestion);},_applySuggestion:function(completionText,isIntermediateSuggestion,originalPrefixRange)
+{var wordPrefixLength;if(originalPrefixRange)
+wordPrefixLength=originalPrefixRange.toString().length;else
+wordPrefixLength=this._userEnteredText?this._userEnteredText.length:0;this._userEnteredRange.deleteContents();this._element.normalize();var finalSelectionRange=document.createRange();var completionTextNode=document.createTextNode(completionText);this._userEnteredRange.insertNode(completionTextNode);if(this.autoCompleteElement){this.autoCompleteElement.remove();delete this.autoCompleteElement;}
+if(isIntermediateSuggestion)
+finalSelectionRange.setStart(completionTextNode,wordPrefixLength);else
+finalSelectionRange.setStart(completionTextNode,completionText.length);finalSelectionRange.setEnd(completionTextNode,completionText.length);var selection=window.getSelection();selection.removeAllRanges();selection.addRange(finalSelectionRange);if(isIntermediateSuggestion)
+this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemApplied,{itemText:completionText});},acceptSuggestion:function()
+{this._acceptSuggestionInternal();},_acceptSuggestionInternal:function(prefixAccepted)
+{if(this._isAcceptingSuggestion)
+return false;if(!this.autoCompleteElement||!this.autoCompleteElement.parentNode)
+return false;var text=this.autoCompleteElement.textContent;var textNode=document.createTextNode(text);this.autoCompleteElement.parentNode.replaceChild(textNode,this.autoCompleteElement);delete this.autoCompleteElement;var finalSelectionRange=document.createRange();finalSelectionRange.setStart(textNode,text.length);finalSelectionRange.setEnd(textNode,text.length);var selection=window.getSelection();selection.removeAllRanges();selection.addRange(finalSelectionRange);if(!prefixAccepted){this.hideSuggestBox();this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemAccepted);}else
+this.autoCompleteSoon(true);return true;},hideSuggestBox:function()
+{if(this.isSuggestBoxVisible())
+this._suggestBox.hide();},isSuggestBoxVisible:function()
+{return this._suggestBox&&this._suggestBox.visible();},isCaretInsidePrompt:function()
+{return this._element.isInsertionCaretInside();},isCaretAtEndOfPrompt:function()
+{var selection=window.getSelection();if(!selection.rangeCount||!selection.isCollapsed)
+return false;var selectionRange=selection.getRangeAt(0);var node=selectionRange.startContainer;if(!node.isSelfOrDescendant(this._element))
+return false;if(node.nodeType===Node.TEXT_NODE&&selectionRange.startOffset<node.nodeValue.length)
+return false;var foundNextText=false;while(node){if(node.nodeType===Node.TEXT_NODE&&node.nodeValue.length){if(foundNextText&&(!this.autoCompleteElement||!this.autoCompleteElement.isAncestor(node)))
+return false;foundNextText=true;}
+node=node.traverseNextNode(this._element);}
+return true;},isCaretOnFirstLine:function()
+{var selection=window.getSelection();var focusNode=selection.focusNode;if(!focusNode||focusNode.nodeType!==Node.TEXT_NODE||focusNode.parentNode!==this._element)
+return true;if(focusNode.textContent.substring(0,selection.focusOffset).indexOf("\n")!==-1)
+return false;focusNode=focusNode.previousSibling;while(focusNode){if(focusNode.nodeType!==Node.TEXT_NODE)
+return true;if(focusNode.textContent.indexOf("\n")!==-1)
+return false;focusNode=focusNode.previousSibling;}
+return true;},isCaretOnLastLine:function()
+{var selection=window.getSelection();var focusNode=selection.focusNode;if(!focusNode||focusNode.nodeType!==Node.TEXT_NODE||focusNode.parentNode!==this._element)
+return true;if(focusNode.textContent.substring(selection.focusOffset).indexOf("\n")!==-1)
+return false;focusNode=focusNode.nextSibling;while(focusNode){if(focusNode.nodeType!==Node.TEXT_NODE)
+return true;if(focusNode.textContent.indexOf("\n")!==-1)
+return false;focusNode=focusNode.nextSibling;}
+return true;},moveCaretToEndOfPrompt:function()
+{var selection=window.getSelection();var selectionRange=document.createRange();var offset=this._element.childNodes.length;selectionRange.setStart(this._element,offset);selectionRange.setEnd(this._element,offset);selection.removeAllRanges();selection.addRange(selectionRange);},tabKeyPressed:function(event)
+{this._completeCommonPrefix();return true;},__proto__:WebInspector.Object.prototype}
+WebInspector.TextPromptWithHistory=function(completions,stopCharacters)
+{WebInspector.TextPrompt.call(this,completions,stopCharacters);this._data=[];this._historyOffset=1;this._coalesceHistoryDupes=true;}
+WebInspector.TextPromptWithHistory.prototype={get historyData()
+{return this._data;},setCoalesceHistoryDupes:function(x)
+{this._coalesceHistoryDupes=x;},setHistoryData:function(data)
+{this._data=[].concat(data);this._historyOffset=1;},pushHistoryItem:function(text)
+{if(this._uncommittedIsTop){this._data.pop();delete this._uncommittedIsTop;}
+this._historyOffset=1;if(this._coalesceHistoryDupes&&text===this._currentHistoryItem())
+return;this._data.push(text);},_pushCurrentText:function()
+{if(this._uncommittedIsTop)
+this._data.pop();this._uncommittedIsTop=true;this.clearAutoComplete(true);this._data.push(this.text);},_previous:function()
+{if(this._historyOffset>this._data.length)
+return undefined;if(this._historyOffset===1)
+this._pushCurrentText();++this._historyOffset;return this._currentHistoryItem();},_next:function()
+{if(this._historyOffset===1)
+return undefined;--this._historyOffset;return this._currentHistoryItem();},_currentHistoryItem:function()
+{return this._data[this._data.length-this._historyOffset];},defaultKeyHandler:function(event,force)
+{var newText;var isPrevious;switch(event.keyIdentifier){case"Up":if(!this.isCaretOnFirstLine())
+break;newText=this._previous();isPrevious=true;break;case"Down":if(!this.isCaretOnLastLine())
+break;newText=this._next();break;case"U+0050":if(WebInspector.isMac()&&event.ctrlKey&&!event.metaKey&&!event.altKey&&!event.shiftKey){newText=this._previous();isPrevious=true;}
+break;case"U+004E":if(WebInspector.isMac()&&event.ctrlKey&&!event.metaKey&&!event.altKey&&!event.shiftKey)
+newText=this._next();break;}
+if(newText!==undefined){event.consume(true);this.text=newText;if(isPrevious){var firstNewlineIndex=this.text.indexOf("\n");if(firstNewlineIndex===-1)
+this.moveCaretToEndOfPrompt();else{var selection=window.getSelection();var selectionRange=document.createRange();selectionRange.setStart(this._element.firstChild,firstNewlineIndex);selectionRange.setEnd(this._element.firstChild,firstNewlineIndex);selection.removeAllRanges();selection.addRange(selectionRange);}}
+return true;}
+return WebInspector.TextPrompt.prototype.defaultKeyHandler.apply(this,arguments);},__proto__:WebInspector.TextPrompt.prototype}
+WebInspector.Popover=function(popoverHelper)
+{WebInspector.View.call(this);this.markAsRoot();this.element.className="popover custom-popup-vertical-scroll custom-popup-horizontal-scroll";this._popupArrowElement=document.createElement("div");this._popupArrowElement.className="arrow";this.element.appendChild(this._popupArrowElement);this._contentDiv=document.createElement("div");this._contentDiv.className="content";this.element.appendChild(this._contentDiv);this._popoverHelper=popoverHelper;}
+WebInspector.Popover.prototype={show:function(element,anchor,preferredWidth,preferredHeight,arrowDirection)
+{this._innerShow(null,element,anchor,preferredWidth,preferredHeight,arrowDirection);},showView:function(view,anchor,preferredWidth,preferredHeight)
+{this._innerShow(view,view.element,anchor,preferredWidth,preferredHeight);},_innerShow:function(view,contentElement,anchor,preferredWidth,preferredHeight,arrowDirection)
+{if(this._disposed)
+return;this.contentElement=contentElement;if(WebInspector.Popover._popover)
+WebInspector.Popover._popover.detach();WebInspector.Popover._popover=this;var preferredSize=view?view.measurePreferredSize():this.contentElement.measurePreferredSize();preferredWidth=preferredWidth||preferredSize.width;preferredHeight=preferredHeight||preferredSize.height;WebInspector.View.prototype.show.call(this,document.body);if(view)
+view.show(this._contentDiv);else
+this._contentDiv.appendChild(this.contentElement);this._positionElement(anchor,preferredWidth,preferredHeight,arrowDirection);if(this._popoverHelper){this._contentDiv.addEventListener("mousemove",this._popoverHelper._killHidePopoverTimer.bind(this._popoverHelper),true);this.element.addEventListener("mouseout",this._popoverHelper._popoverMouseOut.bind(this._popoverHelper),true);}},hide:function()
+{this.detach();delete WebInspector.Popover._popover;},get disposed()
+{return this._disposed;},dispose:function()
+{if(this.isShowing())
+this.hide();this._disposed=true;},setCanShrink:function(canShrink)
+{this._hasFixedHeight=!canShrink;this._contentDiv.classList.add("fixed-height");},_positionElement:function(anchorElement,preferredWidth,preferredHeight,arrowDirection)
+{const borderWidth=25;const scrollerWidth=this._hasFixedHeight?0:11;const arrowHeight=15;const arrowOffset=10;const borderRadius=10;preferredWidth=Math.max(preferredWidth,50);const container=WebInspector.Dialog.modalHostView().element;const totalWidth=container.offsetWidth;const totalHeight=container.offsetHeight;var anchorBox=anchorElement instanceof AnchorBox?anchorElement:anchorElement.boxInWindow(window);anchorBox=anchorBox.relativeToElement(container);var newElementPosition={x:0,y:0,width:preferredWidth+scrollerWidth,height:preferredHeight};var verticalAlignment;var roomAbove=anchorBox.y;var roomBelow=totalHeight-anchorBox.y-anchorBox.height;if((roomAbove>roomBelow)||(arrowDirection===WebInspector.Popover.Orientation.Bottom)){if((anchorBox.y>newElementPosition.height+arrowHeight+borderRadius)||(arrowDirection===WebInspector.Popover.Orientation.Bottom))
+newElementPosition.y=anchorBox.y-newElementPosition.height-arrowHeight;else{newElementPosition.y=borderRadius;newElementPosition.height=anchorBox.y-borderRadius*2-arrowHeight;if(this._hasFixedHeight&&newElementPosition.height<preferredHeight){newElementPosition.y=borderRadius;newElementPosition.height=preferredHeight;}}
+verticalAlignment=WebInspector.Popover.Orientation.Bottom;}else{newElementPosition.y=anchorBox.y+anchorBox.height+arrowHeight;if((newElementPosition.y+newElementPosition.height+borderRadius>=totalHeight)&&(arrowDirection!==WebInspector.Popover.Orientation.Top)){newElementPosition.height=totalHeight-borderRadius-newElementPosition.y;if(this._hasFixedHeight&&newElementPosition.height<preferredHeight){newElementPosition.y=totalHeight-preferredHeight-borderRadius;newElementPosition.height=preferredHeight;}}
+verticalAlignment=WebInspector.Popover.Orientation.Top;}
+var horizontalAlignment;if(anchorBox.x+newElementPosition.width<totalWidth){newElementPosition.x=Math.max(borderRadius,anchorBox.x-borderRadius-arrowOffset);horizontalAlignment="left";}else if(newElementPosition.width+borderRadius*2<totalWidth){newElementPosition.x=totalWidth-newElementPosition.width-borderRadius;horizontalAlignment="right";var arrowRightPosition=Math.max(0,totalWidth-anchorBox.x-anchorBox.width-borderRadius-arrowOffset);arrowRightPosition+=anchorBox.width/2;arrowRightPosition=Math.min(arrowRightPosition,newElementPosition.width-borderRadius-arrowOffset);this._popupArrowElement.style.right=arrowRightPosition+"px";}else{newElementPosition.x=borderRadius;newElementPosition.width=totalWidth-borderRadius*2;newElementPosition.height+=scrollerWidth;horizontalAlignment="left";if(verticalAlignment===WebInspector.Popover.Orientation.Bottom)
+newElementPosition.y-=scrollerWidth;this._popupArrowElement.style.left=Math.max(0,anchorBox.x-borderRadius*2-arrowOffset)+"px";this._popupArrowElement.style.left+=anchorBox.width/2;}
+this.element.className="popover custom-popup-vertical-scroll custom-popup-horizontal-scroll "+verticalAlignment+"-"+horizontalAlignment+"-arrow";this.element.positionAt(newElementPosition.x-borderWidth,newElementPosition.y-borderWidth,container);this.element.style.width=newElementPosition.width+borderWidth*2+"px";this.element.style.height=newElementPosition.height+borderWidth*2+"px";},__proto__:WebInspector.View.prototype}
+WebInspector.PopoverHelper=function(panelElement,getAnchor,showPopover,onHide,disableOnClick)
+{this._panelElement=panelElement;this._getAnchor=getAnchor;this._showPopover=showPopover;this._onHide=onHide;this._disableOnClick=!!disableOnClick;panelElement.addEventListener("mousedown",this._mouseDown.bind(this),false);panelElement.addEventListener("mousemove",this._mouseMove.bind(this),false);panelElement.addEventListener("mouseout",this._mouseOut.bind(this),false);this.setTimeout(1000);}
+WebInspector.PopoverHelper.prototype={setTimeout:function(timeout)
+{this._timeout=timeout;},_eventInHoverElement:function(event)
+{if(!this._hoverElement)
+return false;var box=this._hoverElement instanceof AnchorBox?this._hoverElement:this._hoverElement.boxInWindow();return(box.x<=event.clientX&&event.clientX<=box.x+box.width&&box.y<=event.clientY&&event.clientY<=box.y+box.height);},_mouseDown:function(event)
+{if(this._disableOnClick||!this._eventInHoverElement(event))
+this.hidePopover();else{this._killHidePopoverTimer();this._handleMouseAction(event,true);}},_mouseMove:function(event)
+{if(this._eventInHoverElement(event))
+return;this._startHidePopoverTimer();this._handleMouseAction(event,false);},_popoverMouseOut:function(event)
+{if(!this.isPopoverVisible())
+return;if(event.relatedTarget&&!event.relatedTarget.isSelfOrDescendant(this._popover._contentDiv))
+this._startHidePopoverTimer();},_mouseOut:function(event)
+{if(!this.isPopoverVisible())
+return;if(!this._eventInHoverElement(event))
+this._startHidePopoverTimer();},_startHidePopoverTimer:function()
+{if(!this._popover||this._hidePopoverTimer)
+return;function doHide()
+{this._hidePopover();delete this._hidePopoverTimer;}
+this._hidePopoverTimer=setTimeout(doHide.bind(this),this._timeout/2);},_handleMouseAction:function(event,isMouseDown)
+{this._resetHoverTimer();if(event.which&&this._disableOnClick)
+return;this._hoverElement=this._getAnchor(event.target,event);if(!this._hoverElement)
+return;const toolTipDelay=isMouseDown?0:(this._popup?this._timeout*0.6:this._timeout);this._hoverTimer=setTimeout(this._mouseHover.bind(this,this._hoverElement),toolTipDelay);},_resetHoverTimer:function()
+{if(this._hoverTimer){clearTimeout(this._hoverTimer);delete this._hoverTimer;}},isPopoverVisible:function()
+{return!!this._popover;},hidePopover:function()
+{this._resetHoverTimer();this._hidePopover();},_hidePopover:function()
+{if(!this._popover)
+return;if(this._onHide)
+this._onHide();this._popover.dispose();delete this._popover;this._hoverElement=null;},_mouseHover:function(element)
+{delete this._hoverTimer;this._hidePopover();this._popover=new WebInspector.Popover(this);this._showPopover(element,this._popover);},_killHidePopoverTimer:function()
+{if(this._hidePopoverTimer){clearTimeout(this._hidePopoverTimer);delete this._hidePopoverTimer;this._resetHoverTimer();}}}
+WebInspector.Popover.Orientation={Top:"top",Bottom:"bottom"}
+WebInspector.Placard=function(title,subtitle)
+{this.element=document.createElementWithClass("div","placard");this.element.placard=this;this.subtitleElement=this.element.createChild("div","subtitle");this.titleElement=this.element.createChild("div","title");this.title=title;this.subtitle=subtitle;this.selected=false;}
+WebInspector.Placard.prototype={get title()
+{return this._title;},set title(x)
+{if(this._title===x)
+return;this._title=x;this.titleElement.textContent=x;},get subtitle()
+{return this._subtitle;},set subtitle(x)
+{if(this._subtitle===x)
+return;this._subtitle=x;this.subtitleElement.textContent=x;},get selected()
+{return this._selected;},set selected(x)
+{if(x)
+this.select();else
+this.deselect();},select:function()
+{if(this._selected)
+return;this._selected=true;this.element.classList.add("selected");},deselect:function()
+{if(!this._selected)
+return;this._selected=false;this.element.classList.remove("selected");},toggleSelected:function()
+{this.selected=!this.selected;},discard:function()
+{}}
+WebInspector.TabbedPane=function()
+{WebInspector.VBox.call(this);this.element.classList.add("tabbed-pane");this._headerElement=this.element.createChild("div","tabbed-pane-header");this._headerContentsElement=this._headerElement.createChild("div","tabbed-pane-header-contents");this._tabsElement=this._headerContentsElement.createChild("div","tabbed-pane-header-tabs");this._contentElement=this.element.createChild("div","tabbed-pane-content scroll-target");this._tabs=[];this._tabsHistory=[];this._tabsById={};this._dropDownButton=this._createDropDownButton();}
+WebInspector.TabbedPane.EventTypes={TabSelected:"TabSelected",TabClosed:"TabClosed"}
+WebInspector.TabbedPane.prototype={get visibleView()
+{return this._currentTab?this._currentTab.view:null;},get selectedTabId()
+{return this._currentTab?this._currentTab.id:null;},set shrinkableTabs(shrinkableTabs)
+{this._shrinkableTabs=shrinkableTabs;},set verticalTabLayout(verticalTabLayout)
+{this._verticalTabLayout=verticalTabLayout;this.invalidateMinimumSize();},set closeableTabs(closeableTabs)
+{this._closeableTabs=closeableTabs;},setRetainTabOrder:function(retainTabOrder,tabOrderComparator)
+{this._retainTabOrder=retainTabOrder;this._tabOrderComparator=tabOrderComparator;},defaultFocusedElement:function()
+{return this.visibleView?this.visibleView.defaultFocusedElement():null;},focus:function()
+{if(this.visibleView)
+this.visibleView.focus();else
+WebInspector.View.prototype.focus.call(this);},headerElement:function()
+{return this._headerElement;},isTabCloseable:function(id)
+{var tab=this._tabsById[id];return tab?tab.isCloseable():false;},setTabDelegate:function(delegate)
+{var tabs=this._tabs.slice();for(var i=0;i<tabs.length;++i)
+tabs[i].setDelegate(delegate);this._delegate=delegate;},appendTab:function(id,tabTitle,view,tabTooltip,userGesture,isCloseable)
+{isCloseable=typeof isCloseable==="boolean"?isCloseable:this._closeableTabs;var tab=new WebInspector.TabbedPaneTab(this,id,tabTitle,isCloseable,view,tabTooltip);tab.setDelegate(this._delegate);this._tabsById[id]=tab;function comparator(tab1,tab2)
+{return this._tabOrderComparator(tab1.id,tab2.id);}
+if(this._retainTabOrder&&this._tabOrderComparator)
+this._tabs.splice(insertionIndexForObjectInListSortedByFunction(tab,this._tabs,comparator.bind(this)),0,tab);else
+this._tabs.push(tab);this._tabsHistory.push(tab);if(this._tabsHistory[0]===tab&&this.isShowing())
+this.selectTab(tab.id,userGesture);this._updateTabElements();},closeTab:function(id,userGesture)
+{this.closeTabs([id],userGesture);},closeTabs:function(ids,userGesture)
+{for(var i=0;i<ids.length;++i)
+this._innerCloseTab(ids[i],userGesture);this._updateTabElements();if(this._tabsHistory.length)
+this.selectTab(this._tabsHistory[0].id,false);},_innerCloseTab:function(id,userGesture)
+{if(!this._tabsById[id])
+return;if(userGesture&&!this._tabsById[id]._closeable)
+return;if(this._currentTab&&this._currentTab.id===id)
+this._hideCurrentTab();var tab=this._tabsById[id];delete this._tabsById[id];this._tabsHistory.splice(this._tabsHistory.indexOf(tab),1);this._tabs.splice(this._tabs.indexOf(tab),1);if(tab._shown)
+this._hideTabElement(tab);var eventData={tabId:id,view:tab.view,isUserGesture:userGesture};this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabClosed,eventData);return true;},hasTab:function(tabId)
+{return!!this._tabsById[tabId];},allTabs:function()
+{var result=[];var tabs=this._tabs.slice();for(var i=0;i<tabs.length;++i)
+result.push(tabs[i].id);return result;},otherTabs:function(id)
+{var result=[];var tabs=this._tabs.slice();for(var i=0;i<tabs.length;++i){if(tabs[i].id!==id)
+result.push(tabs[i].id);}
+return result;},selectTab:function(id,userGesture)
+{var tab=this._tabsById[id];if(!tab)
+return;if(this._currentTab&&this._currentTab.id===id)
+return;this._hideCurrentTab();this._showTab(tab);this._currentTab=tab;this._tabsHistory.splice(this._tabsHistory.indexOf(tab),1);this._tabsHistory.splice(0,0,tab);this._updateTabElements();var eventData={tabId:id,view:tab.view,isUserGesture:userGesture};this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabSelected,eventData);},lastOpenedTabIds:function(tabsCount)
+{function tabToTabId(tab){return tab.id;}
+return this._tabsHistory.slice(0,tabsCount).map(tabToTabId);},setTabIcon:function(id,iconClass,iconTooltip)
+{var tab=this._tabsById[id];if(tab._setIconClass(iconClass,iconTooltip))
+this._updateTabElements();},changeTabTitle:function(id,tabTitle)
+{var tab=this._tabsById[id];if(tab.title===tabTitle)
+return;tab.title=tabTitle;this._updateTabElements();},changeTabView:function(id,view)
+{var tab=this._tabsById[id];if(this._currentTab&&this._currentTab.id===tab.id){if(tab.view!==view)
+this._hideTab(tab);tab.view=view;this._showTab(tab);}else
+tab.view=view;},changeTabTooltip:function(id,tabTooltip)
+{var tab=this._tabsById[id];tab.tooltip=tabTooltip;},onResize:function()
+{this._updateTabElements();},headerResized:function()
+{this._updateTabElements();},wasShown:function()
+{var effectiveTab=this._currentTab||this._tabsHistory[0];if(effectiveTab)
+this.selectTab(effectiveTab.id);this.invalidateMinimumSize();},calculateMinimumSize:function()
+{var size=WebInspector.VBox.prototype.calculateMinimumSize.call(this);if(this._verticalTabLayout)
+size.width+=this._headerElement.offsetWidth;else
+size.height+=this._headerElement.offsetHeight;return size;},_updateTabElements:function()
+{WebInspector.invokeOnceAfterBatchUpdate(this,this._innerUpdateTabElements);},setPlaceholderText:function(text)
+{this._noTabsMessage=text;},_innerUpdateTabElements:function()
+{if(!this.isShowing())
+return;if(!this._tabs.length){this._contentElement.classList.add("has-no-tabs");if(this._noTabsMessage&&!this._noTabsMessageElement){this._noTabsMessageElement=this._contentElement.createChild("div","tabbed-pane-placeholder fill");this._noTabsMessageElement.textContent=this._noTabsMessage;}}else{this._contentElement.classList.remove("has-no-tabs");if(this._noTabsMessageElement){this._noTabsMessageElement.remove();delete this._noTabsMessageElement;}}
+if(!this._measuredDropDownButtonWidth)
+this._measureDropDownButton();this._updateWidths();this._updateTabsDropDown();},_showTabElement:function(index,tab)
+{if(index>=this._tabsElement.children.length)
+this._tabsElement.appendChild(tab.tabElement);else
+this._tabsElement.insertBefore(tab.tabElement,this._tabsElement.children[index]);tab._shown=true;},_hideTabElement:function(tab)
+{this._tabsElement.removeChild(tab.tabElement);tab._shown=false;},_createDropDownButton:function()
+{var dropDownContainer=document.createElement("div");dropDownContainer.classList.add("tabbed-pane-header-tabs-drop-down-container");var dropDownButton=dropDownContainer.createChild("div","tabbed-pane-header-tabs-drop-down");dropDownButton.appendChild(document.createTextNode("\u00bb"));this._dropDownMenu=new WebInspector.DropDownMenu();this._dropDownMenu.addEventListener(WebInspector.DropDownMenu.Events.ItemSelected,this._dropDownMenuItemSelected,this);dropDownButton.appendChild(this._dropDownMenu.element);return dropDownContainer;},_dropDownMenuItemSelected:function(event)
+{var tabId=(event.data);this.selectTab(tabId,true);},_totalWidth:function()
+{return this._headerContentsElement.getBoundingClientRect().width;},_updateTabsDropDown:function()
+{var tabsToShowIndexes=this._tabsToShowIndexes(this._tabs,this._tabsHistory,this._totalWidth(),this._measuredDropDownButtonWidth);for(var i=0;i<this._tabs.length;++i){if(this._tabs[i]._shown&&tabsToShowIndexes.indexOf(i)===-1)
+this._hideTabElement(this._tabs[i]);}
+for(var i=0;i<tabsToShowIndexes.length;++i){var tab=this._tabs[tabsToShowIndexes[i]];if(!tab._shown)
+this._showTabElement(i,tab);}
+this._populateDropDownFromIndex();},_populateDropDownFromIndex:function()
+{if(this._dropDownButton.parentElement)
+this._headerContentsElement.removeChild(this._dropDownButton);this._dropDownMenu.clear();var tabsToShow=[];for(var i=0;i<this._tabs.length;++i){if(!this._tabs[i]._shown)
+tabsToShow.push(this._tabs[i]);continue;}
+function compareFunction(tab1,tab2)
+{return tab1.title.localeCompare(tab2.title);}
+if(!this._retainTabOrder)
+tabsToShow.sort(compareFunction);var selectedId=null;for(var i=0;i<tabsToShow.length;++i){var tab=tabsToShow[i];this._dropDownMenu.addItem(tab.id,tab.title);if(this._tabsHistory[0]===tab)
+selectedId=tab.id;}
+if(tabsToShow.length){this._headerContentsElement.appendChild(this._dropDownButton);this._dropDownMenu.selectItem(selectedId);}},_measureDropDownButton:function()
+{this._dropDownButton.classList.add("measuring");this._headerContentsElement.appendChild(this._dropDownButton);this._measuredDropDownButtonWidth=this._dropDownButton.getBoundingClientRect().width;this._headerContentsElement.removeChild(this._dropDownButton);this._dropDownButton.classList.remove("measuring");},_updateWidths:function()
+{var measuredWidths=this._measureWidths();var maxWidth=this._shrinkableTabs?this._calculateMaxWidth(measuredWidths.slice(),this._totalWidth()):Number.MAX_VALUE;var i=0;for(var tabId in this._tabs){var tab=this._tabs[tabId];tab.setWidth(this._verticalTabLayout?-1:Math.min(maxWidth,measuredWidths[i++]));}},_measureWidths:function()
+{this._tabsElement.style.setProperty("width","2000px");var measuringTabElements=[];for(var tabId in this._tabs){var tab=this._tabs[tabId];if(typeof tab._measuredWidth==="number")
+continue;var measuringTabElement=tab._createTabElement(true);measuringTabElement.__tab=tab;measuringTabElements.push(measuringTabElement);this._tabsElement.appendChild(measuringTabElement);}
+for(var i=0;i<measuringTabElements.length;++i)
+measuringTabElements[i].__tab._measuredWidth=measuringTabElements[i].getBoundingClientRect().width;for(var i=0;i<measuringTabElements.length;++i)
+measuringTabElements[i].remove();var measuredWidths=[];for(var tabId in this._tabs)
+measuredWidths.push(this._tabs[tabId]._measuredWidth);this._tabsElement.style.removeProperty("width");return measuredWidths;},_calculateMaxWidth:function(measuredWidths,totalWidth)
+{if(!measuredWidths.length)
+return 0;measuredWidths.sort(function(x,y){return x-y});var totalMeasuredWidth=0;for(var i=0;i<measuredWidths.length;++i)
+totalMeasuredWidth+=measuredWidths[i];if(totalWidth>=totalMeasuredWidth)
+return measuredWidths[measuredWidths.length-1];var totalExtraWidth=0;for(var i=measuredWidths.length-1;i>0;--i){var extraWidth=measuredWidths[i]-measuredWidths[i-1];totalExtraWidth+=(measuredWidths.length-i)*extraWidth;if(totalWidth+totalExtraWidth>=totalMeasuredWidth)
+return measuredWidths[i-1]+(totalWidth+totalExtraWidth-totalMeasuredWidth)/(measuredWidths.length-i);}
+return totalWidth/measuredWidths.length;},_tabsToShowIndexes:function(tabsOrdered,tabsHistory,totalWidth,measuredDropDownButtonWidth)
+{var tabsToShowIndexes=[];var totalTabsWidth=0;var tabCount=tabsOrdered.length;for(var i=0;i<tabCount;++i){var tab=this._retainTabOrder?tabsOrdered[i]:tabsHistory[i];totalTabsWidth+=tab.width();var minimalRequiredWidth=totalTabsWidth;if(i!==tabCount-1)
+minimalRequiredWidth+=measuredDropDownButtonWidth;if(!this._verticalTabLayout&&minimalRequiredWidth>totalWidth)
+break;tabsToShowIndexes.push(tabsOrdered.indexOf(tab));}
+tabsToShowIndexes.sort(function(x,y){return x-y});return tabsToShowIndexes;},_hideCurrentTab:function()
+{if(!this._currentTab)
+return;this._hideTab(this._currentTab);delete this._currentTab;},_showTab:function(tab)
+{tab.tabElement.classList.add("selected");tab.view.show(this._contentElement);},_hideTab:function(tab)
+{tab.tabElement.classList.remove("selected");tab.view.detach();},elementsToRestoreScrollPositionsFor:function()
+{return[this._contentElement];},_insertBefore:function(tab,index)
+{this._tabsElement.insertBefore(tab._tabElement,this._tabsElement.childNodes[index]);var oldIndex=this._tabs.indexOf(tab);this._tabs.splice(oldIndex,1);if(oldIndex<index)
+--index;this._tabs.splice(index,0,tab);},__proto__:WebInspector.VBox.prototype}
+WebInspector.TabbedPaneTab=function(tabbedPane,id,title,closeable,view,tooltip)
+{this._closeable=closeable;this._tabbedPane=tabbedPane;this._id=id;this._title=title;this._tooltip=tooltip;this._view=view;this._shown=false;this._measuredWidth;this._tabElement;}
+WebInspector.TabbedPaneTab.prototype={get id()
+{return this._id;},get title()
+{return this._title;},set title(title)
+{if(title===this._title)
+return;this._title=title;if(this._titleElement)
+this._titleElement.textContent=title;delete this._measuredWidth;},iconClass:function()
+{return this._iconClass;},isCloseable:function()
+{return this._closeable;},_setIconClass:function(iconClass,iconTooltip)
+{if(iconClass===this._iconClass&&iconTooltip===this._iconTooltip)
+return false;this._iconClass=iconClass;this._iconTooltip=iconTooltip;if(this._iconElement)
+this._iconElement.remove();if(this._iconClass&&this._tabElement)
+this._iconElement=this._createIconElement(this._tabElement,this._titleElement);delete this._measuredWidth;return true;},get view()
+{return this._view;},set view(view)
+{this._view=view;},get tooltip()
+{return this._tooltip;},set tooltip(tooltip)
+{this._tooltip=tooltip;if(this._titleElement)
+this._titleElement.title=tooltip||"";},get tabElement()
+{if(!this._tabElement)
+this._tabElement=this._createTabElement(false);return this._tabElement;},width:function()
+{return this._width;},setWidth:function(width)
+{this.tabElement.style.width=width===-1?"":(width+"px");this._width=width;},setDelegate:function(delegate)
+{this._delegate=delegate;},_createIconElement:function(tabElement,titleElement)
+{var iconElement=document.createElement("span");iconElement.className="tabbed-pane-header-tab-icon "+this._iconClass;if(this._iconTooltip)
+iconElement.title=this._iconTooltip;tabElement.insertBefore(iconElement,titleElement);return iconElement;},_createTabElement:function(measuring)
+{var tabElement=document.createElement("div");tabElement.classList.add("tabbed-pane-header-tab");tabElement.id="tab-"+this._id;tabElement.tabIndex=-1;tabElement.selectTabForTest=this._tabbedPane.selectTab.bind(this._tabbedPane,this.id,true);var titleElement=tabElement.createChild("span","tabbed-pane-header-tab-title");titleElement.textContent=this.title;titleElement.title=this.tooltip||"";if(this._iconClass)
+this._createIconElement(tabElement,titleElement);if(!measuring)
+this._titleElement=titleElement;if(this._closeable)
+tabElement.createChild("div","close-button-gray");if(measuring){tabElement.classList.add("measuring");}else{tabElement.addEventListener("click",this._tabClicked.bind(this),false);tabElement.addEventListener("mousedown",this._tabMouseDown.bind(this),false);tabElement.addEventListener("mouseup",this._tabMouseUp.bind(this),false);if(this._closeable){tabElement.addEventListener("contextmenu",this._tabContextMenu.bind(this),false);WebInspector.installDragHandle(tabElement,this._startTabDragging.bind(this),this._tabDragging.bind(this),this._endTabDragging.bind(this),"pointer");}}
+return tabElement;},_tabClicked:function(event)
+{var middleButton=event.button===1;var shouldClose=this._closeable&&(middleButton||event.target.classList.contains("close-button-gray"));if(!shouldClose){this._tabbedPane.focus();return;}
+this._closeTabs([this.id]);event.consume(true);},_tabMouseDown:function(event)
+{if(event.target.classList.contains("close-button-gray")||event.button===1)
+return;this._tabbedPane.selectTab(this.id,true);},_tabMouseUp:function(event)
+{if(event.button===1)
+event.consume(true);},_closeTabs:function(ids)
+{if(this._delegate){this._delegate.closeTabs(this._tabbedPane,ids);return;}
+this._tabbedPane.closeTabs(ids,true);},_tabContextMenu:function(event)
+{function close()
+{this._closeTabs([this.id]);}
+function closeOthers()
+{this._closeTabs(this._tabbedPane.otherTabs(this.id));}
+function closeAll()
+{this._closeTabs(this._tabbedPane.allTabs());}
+var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Close"),close.bind(this));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Close others":"Close Others"),closeOthers.bind(this));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Close all":"Close All"),closeAll.bind(this));contextMenu.show();},_startTabDragging:function(event)
+{if(event.target.classList.contains("close-button-gray"))
+return false;this._dragStartX=event.pageX;return true;},_tabDragging:function(event)
+{var tabElements=this._tabbedPane._tabsElement.childNodes;for(var i=0;i<tabElements.length;++i){var tabElement=tabElements[i];if(tabElement===this._tabElement)
+continue;var intersects=tabElement.offsetLeft+tabElement.clientWidth>this._tabElement.offsetLeft&&this._tabElement.offsetLeft+this._tabElement.clientWidth>tabElement.offsetLeft;if(!intersects)
+continue;if(Math.abs(event.pageX-this._dragStartX)<tabElement.clientWidth/2+5)
+break;if(event.pageX-this._dragStartX>0){tabElement=tabElement.nextSibling;++i;}
+var oldOffsetLeft=this._tabElement.offsetLeft;this._tabbedPane._insertBefore(this,i);this._dragStartX+=this._tabElement.offsetLeft-oldOffsetLeft;break;}
+if(!this._tabElement.previousSibling&&event.pageX-this._dragStartX<0){this._tabElement.style.setProperty("left","0px");return;}
+if(!this._tabElement.nextSibling&&event.pageX-this._dragStartX>0){this._tabElement.style.setProperty("left","0px");return;}
+this._tabElement.style.setProperty("position","relative");this._tabElement.style.setProperty("left",(event.pageX-this._dragStartX)+"px");},_endTabDragging:function(event)
+{this._tabElement.style.removeProperty("position");this._tabElement.style.removeProperty("left");delete this._dragStartX;}}
+WebInspector.TabbedPaneTabDelegate=function()
+{}
+WebInspector.TabbedPaneTabDelegate.prototype={closeTabs:function(tabbedPane,ids){}}
+WebInspector.ExtensibleTabbedPaneController=function(tabbedPane,extensionPoint,viewCallback)
+{this._tabbedPane=tabbedPane;this._extensionPoint=extensionPoint;this._viewCallback=viewCallback;this._tabbedPane.setRetainTabOrder(true,WebInspector.moduleManager.orderComparator(extensionPoint,"name","order"));this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._views=new StringMap();this._initialize();}
+WebInspector.ExtensibleTabbedPaneController.prototype={_initialize:function()
+{this._extensions={};var extensions=WebInspector.moduleManager.extensions(this._extensionPoint);for(var i=0;i<extensions.length;++i){var descriptor=extensions[i].descriptor();var id=descriptor["name"];var title=WebInspector.UIString(descriptor["title"]);var settingName=descriptor["setting"];var setting=settingName?(WebInspector.settings[settingName]):null;this._extensions[id]=extensions[i];if(setting){setting.addChangeListener(this._toggleSettingBasedView.bind(this,id,title,setting));if(setting.get())
+this._tabbedPane.appendTab(id,title,new WebInspector.View());}else{this._tabbedPane.appendTab(id,title,new WebInspector.View());}}},_toggleSettingBasedView:function(id,title,setting)
+{this._tabbedPane.closeTab(id);if(setting.get())
+this._tabbedPane.appendTab(id,title,new WebInspector.View());},_tabSelected:function(event)
+{var tabId=this._tabbedPane.selectedTabId;var view=this._viewForId(tabId);if(view)
+this._tabbedPane.changeTabView(tabId,view);},_viewForId:function(id)
+{if(this._views.contains(id))
+return(this._views.get(id));var view=this._extensions[id]?(this._extensions[id].instance()):null;this._views.put(id,view);if(this._viewCallback&&view)
+this._viewCallback(id,view);return view;}}
+WebInspector.ViewportControl=function(provider)
+{this.element=document.createElement("div");this.element.className="fill";this.element.style.overflow="auto";this._topGapElement=this.element.createChild("div");this._contentElement=this.element.createChild("div");this._bottomGapElement=this.element.createChild("div");this._provider=provider;this.element.addEventListener("scroll",this._onScroll.bind(this),false);this._firstVisibleIndex=0;this._lastVisibleIndex=-1;}
+WebInspector.ViewportControl.Provider=function()
+{}
+WebInspector.ViewportControl.Provider.prototype={itemCount:function(){return 0;},itemElement:function(index){return null;}}
+WebInspector.ViewportControl.prototype={contentElement:function()
+{return this._contentElement;},refresh:function()
+{if(!this.element.clientHeight)
+return;this._contentElement.style.setProperty("height","100000px");this._contentElement.removeChildren();var itemCount=this._provider.itemCount();if(!itemCount){this._firstVisibleIndex=-1;this._lastVisibleIndex=-1;return;}
+if(!this._rowHeight){var firstElement=this._provider.itemElement(0);this._rowHeight=firstElement.measurePreferredSize(this._contentElement).height;}
+var visibleFrom=this.element.scrollTop;var visibleTo=visibleFrom+this.element.clientHeight;this._firstVisibleIndex=Math.floor(visibleFrom/this._rowHeight);this._lastVisibleIndex=Math.min(Math.ceil(visibleTo/this._rowHeight),itemCount)-1;this._topGapElement.style.height=(this._rowHeight*this._firstVisibleIndex)+"px";this._bottomGapElement.style.height=(this._rowHeight*(itemCount-this._lastVisibleIndex-1))+"px";for(var i=this._firstVisibleIndex;i<=this._lastVisibleIndex;++i)
+this._contentElement.appendChild(this._provider.itemElement(i));this._contentElement.style.removeProperty("height");},_onScroll:function(event)
+{this.refresh();},rowsPerViewport:function()
+{return Math.floor(this.element.clientHeight/this._rowHeight);},firstVisibleIndex:function()
+{return this._firstVisibleIndex;},lastVisibleIndex:function()
+{return this._lastVisibleIndex;},renderedElementAt:function(index)
+{if(index<this._firstVisibleIndex)
+return null;if(index>this._lastVisibleIndex)
+return null;return this._contentElement.childNodes[index-this._firstVisibleIndex];},scrollItemIntoView:function(index,makeLast)
+{if(index>this._firstVisibleIndex&&index<this._lastVisibleIndex)
+return;if(makeLast)
+this.element.scrollTop=this._rowHeight*(index+1)-this.element.clientHeight;else
+this.element.scrollTop=this._rowHeight*index;}}
+WebInspector.Drawer=function(splitView)
+{WebInspector.VBox.call(this);this.element.id="drawer-contents";this._splitView=splitView;splitView.hideDefaultResizer();this.show(splitView.sidebarElement());this._drawerEditorSplitView=new WebInspector.SplitView(true,true,"editorInDrawerSplitViewState",0.5,0.5);this._drawerEditorSplitView.hideSidebar();this._drawerEditorSplitView.addEventListener(WebInspector.SplitView.Events.ShowModeChanged,this._drawerEditorSplitViewShowModeChanged,this);this._drawerEditorShownSetting=WebInspector.settings.createSetting("drawerEditorShown",true);this._drawerEditorSplitView.show(this.element);this._toggleDrawerButton=new WebInspector.StatusBarButton(WebInspector.UIString("Show drawer."),"console-status-bar-item");this._toggleDrawerButton.addEventListener("click",this.toggle,this);this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.element.id="drawer-tabbed-pane";this._tabbedPane.closeableTabs=false;this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);new WebInspector.ExtensibleTabbedPaneController(this._tabbedPane,"drawer-view");this._toggleDrawerEditorButton=this._drawerEditorSplitView.createShowHideSidebarButton("editor in drawer","drawer-editor-show-hide-button");this._tabbedPane.element.appendChild(this._toggleDrawerEditorButton.element);if(!WebInspector.experimentsSettings.showEditorInDrawer.isEnabled())
+this.setDrawerEditorAvailable(false);splitView.installResizer(this._tabbedPane.headerElement());this._lastSelectedViewSetting=WebInspector.settings.createSetting("WebInspector.Drawer.lastSelectedView","console");this._tabbedPane.show(this._drawerEditorSplitView.mainElement());}
+WebInspector.Drawer.prototype={toggleButtonElement:function()
+{return this._toggleDrawerButton.element;},closeView:function(id)
+{this._tabbedPane.closeTab(id);},showView:function(id,immediate)
+{if(!this._tabbedPane.hasTab(id)){this._innerShow(immediate);return;}
+this._innerShow(immediate);this._tabbedPane.selectTab(id,true);this._lastSelectedViewSetting.set(id);},showCloseableView:function(id,title,view)
+{if(!this._tabbedPane.hasTab(id)){this._tabbedPane.appendTab(id,title,view,undefined,false,true);}else{this._tabbedPane.changeTabView(id,view);this._tabbedPane.changeTabTitle(id,title);}
+this._innerShow();this._tabbedPane.selectTab(id,true);},showDrawer:function()
+{this.showView(this._lastSelectedViewSetting.get());},wasShown:function()
+{this.showView(this._lastSelectedViewSetting.get());this._toggleDrawerButton.toggled=true;this._toggleDrawerButton.title=WebInspector.UIString("Hide drawer.");this._ensureDrawerEditorExistsIfNeeded();},willHide:function()
+{this._toggleDrawerButton.toggled=false;this._toggleDrawerButton.title=WebInspector.UIString("Show drawer.");},_innerShow:function(immediate)
+{if(this.isShowing())
+return;this._splitView.showBoth(!immediate);if(this._visibleView())
+this._visibleView().focus();},closeDrawer:function()
+{if(!this.isShowing())
+return;WebInspector.restoreFocusFromElement(this.element);this._splitView.hideSidebar(true);},_visibleView:function()
+{return this._tabbedPane.visibleView;},_tabSelected:function(event)
+{var tabId=this._tabbedPane.selectedTabId;if(event.data["isUserGesture"]&&!this._tabbedPane.isTabCloseable(tabId))
+this._lastSelectedViewSetting.set(tabId);},toggle:function()
+{if(this._toggleDrawerButton.toggled)
+this.closeDrawer();else
+this.showDrawer();},visible:function()
+{return this._toggleDrawerButton.toggled;},selectedViewId:function()
+{return this._tabbedPane.selectedTabId;},_drawerEditorSplitViewShowModeChanged:function(event)
+{var mode=(event.data);var shown=mode===WebInspector.SplitView.ShowMode.Both;if(this._isHidingDrawerEditor)
+return;this._drawerEditorShownSetting.set(shown);if(!shown)
+return;this._ensureDrawerEditor();this._drawerEditor.view().show(this._drawerEditorSplitView.sidebarElement());},initialPanelShown:function()
+{this._initialPanelWasShown=true;this._ensureDrawerEditorExistsIfNeeded();},_ensureDrawerEditorExistsIfNeeded:function()
+{if(!this._initialPanelWasShown||!this.isShowing()||!this._drawerEditorShownSetting.get()||!WebInspector.experimentsSettings.showEditorInDrawer.isEnabled())
+return;this._ensureDrawerEditor();},_ensureDrawerEditor:function()
+{if(this._drawerEditor)
+return;this._drawerEditor=WebInspector.moduleManager.instance(WebInspector.DrawerEditor);this._drawerEditor.installedIntoDrawer();},setDrawerEditorAvailable:function(available)
+{if(!WebInspector.experimentsSettings.showEditorInDrawer.isEnabled())
+available=false;this._toggleDrawerEditorButton.element.classList.toggle("hidden",!available);},showDrawerEditor:function()
+{if(!WebInspector.experimentsSettings.showEditorInDrawer.isEnabled())
+return;this._splitView.showBoth();this._drawerEditorSplitView.showBoth();},hideDrawerEditor:function()
+{this._isHidingDrawerEditor=true;this._drawerEditorSplitView.hideSidebar();this._isHidingDrawerEditor=false;},isDrawerEditorShown:function()
+{return this._drawerEditorShownSetting.get();},__proto__:WebInspector.VBox.prototype}
+WebInspector.Drawer.ViewFactory=function()
+{}
+WebInspector.Drawer.ViewFactory.prototype={createView:function(){}}
+WebInspector.Drawer.SingletonViewFactory=function(constructor)
+{this._constructor=constructor;}
+WebInspector.Drawer.SingletonViewFactory.prototype={createView:function()
+{if(!this._instance)
+this._instance=(new this._constructor());return this._instance;}}
+WebInspector.DrawerEditor=function()
+{}
+WebInspector.DrawerEditor.prototype={view:function(){},installedIntoDrawer:function(){},}
+WebInspector.ConsoleModel=function(target)
+{this.messages=[];this.warnings=0;this.errors=0;this._target=target;this._consoleAgent=target.consoleAgent();target.registerConsoleDispatcher(new WebInspector.ConsoleDispatcher(this));this._enableAgent();}
+WebInspector.ConsoleModel.Events={ConsoleCleared:"ConsoleCleared",MessageAdded:"MessageAdded",CommandEvaluated:"CommandEvaluated",}
+WebInspector.ConsoleModel.prototype={_enableAgent:function()
+{if(WebInspector.settings.monitoringXHREnabled.get())
+this._consoleAgent.setMonitoringXHREnabled(true);this._enablingConsole=true;function callback()
+{delete this._enablingConsole;}
+this._consoleAgent.enable(callback.bind(this));},enablingConsole:function()
+{return!!this._enablingConsole;},addMessage:function(msg,isFromBackend)
+{if(isFromBackend&&WebInspector.SourceMap.hasSourceMapRequestHeader(msg.request))
+return;msg.index=this.messages.length;this.messages.push(msg);this._incrementErrorWarningCount(msg);this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageAdded,msg);},evaluateCommand:function(text,useCommandLineAPI)
+{this.show();var commandMessage=new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.JS,null,text,WebInspector.ConsoleMessage.MessageType.Command);this.addMessage(commandMessage);function printResult(result,wasThrown,valueResult)
+{if(!result)
+return;this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.CommandEvaluated,{result:result,wasThrown:wasThrown,text:text,commandMessage:commandMessage});}
+this._target.runtimeModel.evaluate(text,"console",useCommandLineAPI,false,false,true,printResult.bind(this));WebInspector.userMetrics.ConsoleEvaluated.record();},show:function()
+{WebInspector.Revealer.reveal(this);},evaluate:function(expression)
+{this.evaluateCommand(expression,false);},log:function(messageText,messageLevel,showConsole)
+{var message=new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.Other,messageLevel||WebInspector.ConsoleMessage.MessageLevel.Debug,messageText);this.addMessage(message);if(showConsole)
+this.show();},showErrorMessage:function(error)
+{this.log(error,WebInspector.ConsoleMessage.MessageLevel.Error,true);},_incrementErrorWarningCount:function(msg)
+{switch(msg.level){case WebInspector.ConsoleMessage.MessageLevel.Warning:this.warnings++;break;case WebInspector.ConsoleMessage.MessageLevel.Error:this.errors++;break;}},requestClearMessages:function()
+{this._consoleAgent.clearMessages();this.clearMessages();},clearMessages:function()
+{this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.ConsoleCleared);this.messages=[];this.errors=0;this.warnings=0;},__proto__:WebInspector.Object.prototype}
+WebInspector.ConsoleMessage=function(source,level,messageText,type,url,line,column,requestId,parameters,stackTrace,timestamp,isOutdated)
+{this.source=source;this.level=level;this.messageText=messageText;this.type=type||WebInspector.ConsoleMessage.MessageType.Log;this.url=url||null;this.line=line||0;this.column=column||0;this.parameters=parameters;this.stackTrace=stackTrace;this.timestamp=timestamp||Date.now();this.isOutdated=isOutdated;this.request=requestId?WebInspector.networkLog.requestForId(requestId):null;}
+WebInspector.ConsoleMessage.prototype={isGroupMessage:function()
+{return this.type===WebInspector.ConsoleMessage.MessageType.StartGroup||this.type===WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed||this.type===WebInspector.ConsoleMessage.MessageType.EndGroup;},isErrorOrWarning:function()
+{return(this.level===WebInspector.ConsoleMessage.MessageLevel.Warning||this.level===WebInspector.ConsoleMessage.MessageLevel.Error);},clone:function()
+{return new WebInspector.ConsoleMessage(this.source,this.level,this.messageText,this.type,this.url,this.line,this.column,this.request?this.request.requestId:undefined,this.parameters,this.stackTrace,this.timestamp,this.isOutdated);},isEqual:function(msg)
+{if(!msg||WebInspector.settings.consoleTimestampsEnabled.get())
+return false;if(this.stackTrace){if(!msg.stackTrace||this.stackTrace.length!==msg.stackTrace.length)
+return false;for(var i=0;i<msg.stackTrace.length;++i){if(this.stackTrace[i].url!==msg.stackTrace[i].url||this.stackTrace[i].functionName!==msg.stackTrace[i].functionName||this.stackTrace[i].lineNumber!==msg.stackTrace[i].lineNumber||this.stackTrace[i].columnNumber!==msg.stackTrace[i].columnNumber)
+return false;}}
+if(this.parameters){if(!msg.parameters||this.parameters.length!==msg.parameters.length)
+return false;for(var i=0;i<msg.parameters.length;++i){if(this.parameters[i].type!==msg.parameters[i].type||msg.parameters[i].type==="object"||this.parameters[i].value!==msg.parameters[i].value)
+return false;}}
+return(this.source===msg.source)&&(this.type===msg.type)&&(this.level===msg.level)&&(this.line===msg.line)&&(this.url===msg.url)&&(this.messageText===msg.messageText)&&(this.request===msg.request);}}
+WebInspector.ConsoleMessage.MessageSource={XML:"xml",JS:"javascript",Network:"network",ConsoleAPI:"console-api",Storage:"storage",AppCache:"appcache",Rendering:"rendering",CSS:"css",Security:"security",Other:"other",Deprecation:"deprecation"}
+WebInspector.ConsoleMessage.MessageType={Log:"log",Dir:"dir",DirXML:"dirxml",Table:"table",Trace:"trace",Clear:"clear",StartGroup:"startGroup",StartGroupCollapsed:"startGroupCollapsed",EndGroup:"endGroup",Assert:"assert",Result:"result",Profile:"profile",ProfileEnd:"profileEnd",Command:"command"}
+WebInspector.ConsoleMessage.MessageLevel={Log:"log",Info:"info",Warning:"warning",Error:"error",Debug:"debug"}
+WebInspector.ConsoleDispatcher=function(console)
+{this._console=console;}
+WebInspector.ConsoleDispatcher.prototype={messageAdded:function(payload)
+{var consoleMessage=new WebInspector.ConsoleMessage(payload.source,payload.level,payload.text,payload.type,payload.url,payload.line,payload.column,payload.networkRequestId,payload.parameters,payload.stackTrace,payload.timestamp*1000,this._console._enablingConsole);this._console.addMessage(consoleMessage,true);},messageRepeatCountUpdated:function(count)
+{},messagesCleared:function()
+{if(!WebInspector.settings.preserveConsoleLog.get())
+this._console.clearMessages();}}
+WebInspector.console;WebInspector.Panel=function(name)
+{WebInspector.VBox.call(this);WebInspector.panels[name]=this;this.element.classList.add("panel");this.element.classList.add(name);this._panelName=name;this._shortcuts=({});}
+WebInspector.Panel.counterRightMargin=25;WebInspector.Panel.prototype={get name()
+{return this._panelName;},reset:function()
+{},defaultFocusedElement:function()
+{return this.element;},searchableView:function()
+{return null;},replaceSelectionWith:function(text)
+{},replaceAllWith:function(query,text)
+{},get statusBarItems()
+{},elementsToRestoreScrollPositionsFor:function()
+{return[];},handleShortcut:function(event)
+{var shortcutKey=WebInspector.KeyboardShortcut.makeKeyFromEvent(event);var handler=this._shortcuts[shortcutKey];if(handler&&handler(event)){event.handled=true;return;}
+var searchableView=this.searchableView();if(!searchableView)
+return;function handleSearchShortcuts(shortcuts,handler)
+{for(var i=0;i<shortcuts.length;++i){if(shortcuts[i].key!==shortcutKey)
+continue;return handler.call(searchableView);}
+return false;}
+if(handleSearchShortcuts(WebInspector.SearchableView.findShortcuts(),searchableView.handleFindShortcut))
+event.handled=true;else if(handleSearchShortcuts(WebInspector.SearchableView.cancelSearchShortcuts(),searchableView.handleCancelSearchShortcut))
+event.handled=true;},registerShortcuts:function(keys,handler)
+{for(var i=0;i<keys.length;++i)
+this._shortcuts[keys[i].key]=handler;},__proto__:WebInspector.VBox.prototype}
+WebInspector.PanelWithSidebarTree=function(name,defaultWidth)
+{WebInspector.Panel.call(this,name);this._panelSplitView=new WebInspector.SplitView(true,false,this._panelName+"PanelSplitViewState",defaultWidth||200);this._panelSplitView.show(this.element);var sidebarView=new WebInspector.VBox();sidebarView.setMinimumSize(Preferences.minSidebarWidth,25);sidebarView.show(this._panelSplitView.sidebarElement());this._sidebarElement=sidebarView.element;this._sidebarElement.classList.add("sidebar");var sidebarTreeElement=this._sidebarElement.createChild("ol","sidebar-tree");this.sidebarTree=new TreeOutline(sidebarTreeElement);}
+WebInspector.PanelWithSidebarTree.prototype={sidebarElement:function()
+{return this._sidebarElement;},mainElement:function()
+{return this._panelSplitView.mainElement();},defaultFocusedElement:function()
+{return this.sidebarTree.element||this.element;},__proto__:WebInspector.Panel.prototype}
+WebInspector.PanelDescriptor=function()
+{}
+WebInspector.PanelDescriptor.prototype={name:function(){},title:function(){},panel:function(){}}
+WebInspector.ModuleManagerExtensionPanelDescriptor=function(extension)
+{this._name=extension.descriptor()["name"];this._title=WebInspector.UIString(extension.descriptor()["title"]);this._extension=extension;}
+WebInspector.ModuleManagerExtensionPanelDescriptor.prototype={name:function()
+{return this._name;},title:function()
+{return this._title;},panel:function()
+{return(this._extension.instance());}}
+WebInspector.InspectorView=function()
+{WebInspector.VBox.call(this);WebInspector.Dialog.setModalHostView(this);this.setMinimumSize(180,72);this._drawerSplitView=new WebInspector.SplitView(false,true,"Inspector.drawerSplitViewState",200,200);this._drawerSplitView.hideSidebar();this._drawerSplitView.enableShowModeSaving();this._drawerSplitView.show(this.element);this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.setRetainTabOrder(true,WebInspector.moduleManager.orderComparator(WebInspector.Panel,"name","order"));this._tabbedPane.show(this._drawerSplitView.mainElement());this._drawer=new WebInspector.Drawer(this._drawerSplitView);this._toolbarElement=document.createElement("div");this._toolbarElement.className="toolbar toolbar-background";var headerElement=this._tabbedPane.headerElement();headerElement.parentElement.insertBefore(this._toolbarElement,headerElement);this._leftToolbarElement=this._toolbarElement.createChild("div","toolbar-controls-left");this._toolbarElement.appendChild(headerElement);this._rightToolbarElement=this._toolbarElement.createChild("div","toolbar-controls-right");this._errorWarningCountElement=this._rightToolbarElement.createChild("div","hidden");this._errorWarningCountElement.id="error-warning-count";this._closeButtonToolbarItem=document.createElementWithClass("div","toolbar-close-button-item");var closeButtonElement=this._closeButtonToolbarItem.createChild("div","close-button");closeButtonElement.addEventListener("click",InspectorFrontendHost.closeWindow.bind(InspectorFrontendHost),true);this._rightToolbarElement.appendChild(this._closeButtonToolbarItem);this.appendToRightToolbar(this._drawer.toggleButtonElement());this._history=[];this._historyIterator=-1;document.addEventListener("keydown",this._keyDown.bind(this),false);document.addEventListener("keypress",this._keyPress.bind(this),false);this._panelDescriptors={};this._openBracketIdentifiers=["U+005B","U+00DB"].keySet();this._closeBracketIdentifiers=["U+005D","U+00DD"].keySet();this._lastActivePanelSetting=WebInspector.settings.createSetting("lastActivePanel","elements");this._loadPanelDesciptors();};WebInspector.InspectorView.prototype={_loadPanelDesciptors:function()
+{WebInspector.startBatchUpdate();WebInspector.moduleManager.extensions(WebInspector.Panel).forEach(processPanelExtensions.bind(this));function processPanelExtensions(extension)
+{this.addPanel(new WebInspector.ModuleManagerExtensionPanelDescriptor(extension));}
+WebInspector.endBatchUpdate();},appendToLeftToolbar:function(element)
+{this._leftToolbarElement.appendChild(element);},appendToRightToolbar:function(element)
+{this._rightToolbarElement.insertBefore(element,this._closeButtonToolbarItem);},addPanel:function(panelDescriptor)
+{var panelName=panelDescriptor.name();this._panelDescriptors[panelName]=panelDescriptor;this._tabbedPane.appendTab(panelName,panelDescriptor.title(),new WebInspector.View());if(this._lastActivePanelSetting.get()===panelName)
+this._tabbedPane.selectTab(panelName);},panel:function(panelName)
+{var panelDescriptor=this._panelDescriptors[panelName];var panelOrder=this._tabbedPane.allTabs();if(!panelDescriptor&&panelOrder.length)
+panelDescriptor=this._panelDescriptors[panelOrder[0]];return panelDescriptor?panelDescriptor.panel():null;},showPanel:function(panelName)
+{var panel=this.panel(panelName);if(panel)
+this.setCurrentPanel(panel);return panel;},currentPanel:function()
+{return this._currentPanel;},showInitialPanel:function()
+{this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._tabSelected();this._drawer.initialPanelShown();},showDrawerEditor:function()
+{this._drawer.showDrawerEditor();},isDrawerEditorShown:function()
+{return this._drawer.isDrawerEditorShown();},hideDrawerEditor:function()
+{this._drawer.hideDrawerEditor();},setDrawerEditorAvailable:function(available)
+{this._drawer.setDrawerEditorAvailable(available);},_tabSelected:function()
+{var panelName=this._tabbedPane.selectedTabId;var panel=this._panelDescriptors[this._tabbedPane.selectedTabId].panel();this._tabbedPane.changeTabView(panelName,panel);this._currentPanel=panel;this._lastActivePanelSetting.set(panel.name);this._pushToHistory(panel.name);WebInspector.userMetrics.panelShown(panel.name);panel.focus();},setCurrentPanel:function(x)
+{if(this._currentPanel===x)
+return;this._tabbedPane.changeTabView(x.name,x);this._tabbedPane.selectTab(x.name);},closeViewInDrawer:function(id)
+{this._drawer.closeView(id);},showCloseableViewInDrawer:function(id,title,view)
+{this._drawer.showCloseableView(id,title,view);},showDrawer:function()
+{this._drawer.showDrawer();},drawerVisible:function()
+{return this._drawer.isShowing();},showViewInDrawer:function(id,immediate)
+{this._drawer.showView(id,immediate);},selectedViewInDrawer:function()
+{return this._drawer.selectedViewId();},closeDrawer:function()
+{this._drawer.closeDrawer();},defaultFocusedElement:function()
+{return this._currentPanel?this._currentPanel.defaultFocusedElement():null;},_keyPress:function(event)
+{if(event.charCode<32&&WebInspector.isWin())
+return;clearTimeout(this._keyDownTimer);delete this._keyDownTimer;},_keyDown:function(event)
+{if(!WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event))
+return;var keyboardEvent=(event);var panelShortcutEnabled=WebInspector.settings.shortcutPanelSwitch.get();if(panelShortcutEnabled&&!event.shiftKey&&!event.altKey){var panelIndex=-1;if(event.keyCode>0x30&&event.keyCode<0x3A)
+panelIndex=event.keyCode-0x31;else if(event.keyCode>0x60&&event.keyCode<0x6A&&keyboardEvent.location===KeyboardEvent.DOM_KEY_LOCATION_NUMPAD)
+panelIndex=event.keyCode-0x61;if(panelIndex!==-1){var panelName=this._tabbedPane.allTabs()[panelIndex];if(panelName){if(!WebInspector.Dialog.currentInstance())
+this.showPanel(panelName);event.consume(true);}
+return;}}
+if(!WebInspector.isWin()||(!this._openBracketIdentifiers[event.keyIdentifier]&&!this._closeBracketIdentifiers[event.keyIdentifier])){this._keyDownInternal(event);return;}
+this._keyDownTimer=setTimeout(this._keyDownInternal.bind(this,event),0);},_keyDownInternal:function(event)
+{var direction=0;if(this._openBracketIdentifiers[event.keyIdentifier])
+direction=-1;if(this._closeBracketIdentifiers[event.keyIdentifier])
+direction=1;if(!direction)
+return;if(!event.shiftKey&&!event.altKey){if(!WebInspector.Dialog.currentInstance())
+this._changePanelInDirection(direction);event.consume(true);return;}
+if(event.altKey&&this._moveInHistory(direction))
+event.consume(true)},_changePanelInDirection:function(direction)
+{var panelOrder=this._tabbedPane.allTabs();var index=panelOrder.indexOf(this.currentPanel().name);index=(index+panelOrder.length+direction)%panelOrder.length;this.showPanel(panelOrder[index]);},_moveInHistory:function(move)
+{var newIndex=this._historyIterator+move;if(newIndex>=this._history.length||newIndex<0)
+return false;this._inHistory=true;this._historyIterator=newIndex;if(!WebInspector.Dialog.currentInstance())
+this.setCurrentPanel(WebInspector.panels[this._history[this._historyIterator]]);delete this._inHistory;return true;},_pushToHistory:function(panelName)
+{if(this._inHistory)
+return;this._history.splice(this._historyIterator+1,this._history.length-this._historyIterator-1);if(!this._history.length||this._history[this._history.length-1]!==panelName)
+this._history.push(panelName);this._historyIterator=this._history.length-1;},onResize:function()
+{WebInspector.Dialog.modalHostRepositioned();},topResizerElement:function()
+{return this._tabbedPane.headerElement();},_createImagedCounterElementIfNeeded:function(count,id,styleName)
+{if(!count)
+return;var imageElement=this._errorWarningCountElement.createChild("div",styleName);var counterElement=this._errorWarningCountElement.createChild("span");counterElement.id=id;counterElement.textContent=count;},setErrorAndWarningCounts:function(errors,warnings)
+{if(this._errors===errors&&this._warnings===warnings)
+return;this._errors=errors;this._warnings=warnings;this._errorWarningCountElement.classList.toggle("hidden",!errors&&!warnings);this._errorWarningCountElement.removeChildren();this._createImagedCounterElementIfNeeded(errors,"error-count","error-icon-small");this._createImagedCounterElementIfNeeded(warnings,"warning-count","warning-icon-small");var errorString=errors?WebInspector.UIString("%d error%s",errors,errors>1?"s":""):"";var warningString=warnings?WebInspector.UIString("%d warning%s",warnings,warnings>1?"s":""):"";var commaString=errors&&warnings?", ":"";this._errorWarningCountElement.title=errorString+commaString+warningString;this._tabbedPane.headerResized();},__proto__:WebInspector.VBox.prototype};WebInspector.inspectorView;WebInspector.InspectorView.DrawerToggleActionDelegate=function()
+{}
+WebInspector.InspectorView.DrawerToggleActionDelegate.prototype={handleAction:function()
+{if(WebInspector.inspectorView.drawerVisible()){WebInspector.inspectorView.closeDrawer();return true;}
+if(!WebInspector.experimentsSettings.doNotOpenDrawerOnEsc.isEnabled()){WebInspector.inspectorView.showDrawer();return true;}
+return false;}}
+WebInspector.RootView=function()
+{WebInspector.VBox.call(this);this.markAsRoot();this.element.classList.add("root-view");this.element.setAttribute("spellcheck",false);window.addEventListener("resize",this.doResize.bind(this),true);this._onScrollBound=this._onScroll.bind(this);};WebInspector.RootView.prototype={attachToBody:function()
+{this.doResize();this.show(document.body);},_onScroll:function()
+{if(document.body.scrollTop!==0)
+document.body.scrollTop=0;if(document.body.scrollLeft!==0)
+document.body.scrollLeft=0;},doResize:function()
+{var size=this.minimumSize();var right=Math.min(0,window.innerWidth-size.width);this.element.style.right=right+"px";var bottom=Math.min(0,window.innerHeight-size.height);this.element.style.bottom=bottom+"px";if(window.innerWidth<size.width||window.innerHeight<size.height)
+window.addEventListener("scroll",this._onScrollBound,false);else
+window.removeEventListener("scroll",this._onScrollBound,false);WebInspector.VBox.prototype.doResize.call(this);this._onScroll();},__proto__:WebInspector.VBox.prototype};WebInspector.InspectedPagePlaceholder=function()
+{WebInspector.View.call(this);WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._onZoomChanged,this);this._margins={top:false,right:false,bottom:false,left:false};this.setMinimumSize(WebInspector.InspectedPagePlaceholder.Constraints.Width,WebInspector.InspectedPagePlaceholder.Constraints.Height);};WebInspector.InspectedPagePlaceholder.Constraints={Width:50,Height:50};WebInspector.InspectedPagePlaceholder.MarginValue=3;WebInspector.InspectedPagePlaceholder.prototype={_findMargins:function()
+{var margins={top:false,right:false,bottom:false,left:false};var adjacent={top:true,right:true,bottom:true,left:true};var view=this;while(view.parentView()){var parent=view.parentView();if(parent instanceof WebInspector.SplitView){var side=parent.sidebarSide();if(adjacent[side]&&!parent.hasCustomResizer())
+margins[side]=true;adjacent[side]=false;}
+view=parent;}
+if(this._margins.top!==margins.top||this._margins.left!==margins.left||this._margins.right!==margins.right||this._margins.bottom!==margins.bottom){this._margins=margins;this._updateMarginValue();}},_updateMarginValue:function()
+{var marginValue=Math.round(WebInspector.InspectedPagePlaceholder.MarginValue/WebInspector.zoomManager.zoomFactor())+"px ";var margins=this._margins.top?marginValue:"0 ";margins+=this._margins.right?marginValue:"0 ";margins+=this._margins.bottom?marginValue:"0 ";margins+=this._margins.left?marginValue:"0 ";this.element.style.margin=margins;},_onZoomChanged:function()
+{this._updateMarginValue();this._scheduleUpdate();},onResize:function()
+{this._findMargins();this._scheduleUpdate();},_scheduleUpdate:function()
+{var dockSide=WebInspector.dockController.dockSide();if(dockSide!==WebInspector.DockController.State.Undocked){if(this._updateId)
+window.cancelAnimationFrame(this._updateId);this._updateId=window.requestAnimationFrame(this._update.bind(this));}},_update:function()
+{delete this._updateId;var zoomFactor=WebInspector.zoomManager.zoomFactor();var marginValue=WebInspector.InspectedPagePlaceholder.MarginValue;var insets={top:this._margins.top?marginValue:0,left:this._margins.left?marginValue:0,right:this._margins.right?marginValue:0,bottom:this._margins.bottom?marginValue:0};var minSize={width:WebInspector.InspectedPagePlaceholder.Constraints.Width-Math.round(insets.left*zoomFactor)-Math.round(insets.right*zoomFactor),height:WebInspector.InspectedPagePlaceholder.Constraints.Height-Math.round(insets.top*zoomFactor)-Math.round(insets.bottom*zoomFactor)};var view=this;while(view){if((view instanceof WebInspector.SplitView)&&view.sidebarSide())
+insets[view.sidebarSide()]+=view.preferredSidebarSize();view=view.parentView();}
+var roundedInsets={top:Math.ceil(insets.top),left:Math.ceil(insets.left),right:Math.ceil(insets.right),bottom:Math.ceil(insets.bottom)};InspectorFrontendHost.setContentsResizingStrategy(roundedInsets,minSize);},__proto__:WebInspector.View.prototype};WebInspector.AdvancedSearchController=function()
+{this._shortcut=WebInspector.AdvancedSearchController.createShortcut();this._searchId=0;WebInspector.settings.advancedSearchConfig=WebInspector.settings.createSetting("advancedSearchConfig",new WebInspector.SearchConfig("",true,false));WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,this._frameNavigated,this);}
+WebInspector.AdvancedSearchController.createShortcut=function()
+{if(WebInspector.isMac())
+return WebInspector.KeyboardShortcut.makeDescriptor("f",WebInspector.KeyboardShortcut.Modifiers.Meta|WebInspector.KeyboardShortcut.Modifiers.Alt);else
+return WebInspector.KeyboardShortcut.makeDescriptor("f",WebInspector.KeyboardShortcut.Modifiers.Ctrl|WebInspector.KeyboardShortcut.Modifiers.Shift);}
+WebInspector.AdvancedSearchController.prototype={handleShortcut:function(event)
+{if(WebInspector.KeyboardShortcut.makeKeyFromEvent(event)===this._shortcut.key){if(!this._searchView||!this._searchView.isShowing()||this._searchView._search!==document.activeElement){WebInspector.inspectorView.showPanel("sources");this.show();}else{WebInspector.inspectorView.closeDrawer();}
+event.consume(true);return true;}
+return false;},_frameNavigated:function()
+{this.resetSearch();},show:function()
+{var selection=window.getSelection();var queryCandidate;if(selection.rangeCount)
+queryCandidate=selection.toString().replace(/\r?\n.*/,"");if(!this._searchView||!this._searchView.isShowing())
+WebInspector.inspectorView.showViewInDrawer("search");if(queryCandidate)
+this._searchView._search.value=queryCandidate;this._searchView.focus();this.startIndexing();},_onIndexingFinished:function(finished)
+{delete this._isIndexing;this._searchView.indexingFinished(finished);if(!finished)
+delete this._pendingSearchConfig;if(!this._pendingSearchConfig)
+return;var searchConfig=this._pendingSearchConfig
+delete this._pendingSearchConfig;this._innerStartSearch(searchConfig);},startIndexing:function()
+{this._isIndexing=true;this._currentSearchScope=this._searchScopes()[0];if(this._progressIndicator)
+this._progressIndicator.done();this._progressIndicator=new WebInspector.ProgressIndicator();this._searchView.indexingStarted(this._progressIndicator);this._currentSearchScope.performIndexing(this._progressIndicator,this._onIndexingFinished.bind(this));},_onSearchResult:function(searchId,searchResult)
+{if(searchId!==this._searchId)
+return;this._searchView.addSearchResult(searchResult);if(!searchResult.searchMatches.length)
+return;if(!this._searchResultsPane)
+this._searchResultsPane=this._currentSearchScope.createSearchResultsPane(this._searchConfig);this._searchView.resultsPane=this._searchResultsPane;this._searchResultsPane.addSearchResult(searchResult);},_onSearchFinished:function(searchId,finished)
+{if(searchId!==this._searchId)
+return;if(!this._searchResultsPane)
+this._searchView.nothingFound();this._searchView.searchFinished(finished);delete this._searchConfig;},startSearch:function(searchConfig)
+{this.resetSearch();++this._searchId;if(!this._isIndexing)
+this.startIndexing();this._pendingSearchConfig=searchConfig;},_innerStartSearch:function(searchConfig)
+{this._searchConfig=searchConfig;this._currentSearchScope=this._searchScopes()[0];if(this._progressIndicator)
+this._progressIndicator.done();this._progressIndicator=new WebInspector.ProgressIndicator();this._searchView.searchStarted(this._progressIndicator);this._currentSearchScope.performSearch(searchConfig,this._progressIndicator,this._onSearchResult.bind(this,this._searchId),this._onSearchFinished.bind(this,this._searchId));},resetSearch:function()
+{this.stopSearch();if(this._searchResultsPane){this._searchView.resetResults();delete this._searchResultsPane;}},stopSearch:function()
+{if(this._progressIndicator)
+this._progressIndicator.cancel();if(this._currentSearchScope)
+this._currentSearchScope.stopSearch();delete this._searchConfig;},_searchScopes:function()
+{return(WebInspector.moduleManager.instances(WebInspector.SearchScope));}}
+WebInspector.SearchView=function(controller)
+{WebInspector.VBox.call(this);this._controller=WebInspector.advancedSearchController;WebInspector.advancedSearchController._searchView=this;this.element.classList.add("search-view");this._searchPanelElement=this.element.createChild("div","search-drawer-header");this._searchPanelElement.addEventListener("keydown",this._onKeyDown.bind(this),false);this._searchResultsElement=this.element.createChild("div");this._searchResultsElement.className="search-results";this._search=this._searchPanelElement.createChild("input");this._search.placeholder=WebInspector.UIString("Search sources");this._search.setAttribute("type","text");this._search.classList.add("search-config-search");this._search.setAttribute("results","0");this._search.setAttribute("size",30);this._ignoreCaseLabel=this._searchPanelElement.createChild("label");this._ignoreCaseLabel.classList.add("search-config-label");this._ignoreCaseCheckbox=this._ignoreCaseLabel.createChild("input");this._ignoreCaseCheckbox.setAttribute("type","checkbox");this._ignoreCaseCheckbox.classList.add("search-config-checkbox");this._ignoreCaseLabel.appendChild(document.createTextNode(WebInspector.UIString("Ignore case")));this._regexLabel=this._searchPanelElement.createChild("label");this._regexLabel.classList.add("search-config-label");this._regexCheckbox=this._regexLabel.createChild("input");this._regexCheckbox.setAttribute("type","checkbox");this._regexCheckbox.classList.add("search-config-checkbox");this._regexLabel.appendChild(document.createTextNode(WebInspector.UIString("Regular expression")));this._searchStatusBarElement=this.element.createChild("div","search-status-bar-summary");this._searchMessageElement=this._searchStatusBarElement.createChild("span");this._searchResultsMessageElement=document.createElement("span");this._load();}
+WebInspector.SearchView.maxQueriesCount=20;WebInspector.SearchView.prototype={get searchConfig()
+{return new WebInspector.SearchConfig(this._search.value,this._ignoreCaseCheckbox.checked,this._regexCheckbox.checked);},set resultsPane(resultsPane)
+{this.resetResults();this._searchResultsElement.appendChild(resultsPane.element);},searchStarted:function(progressIndicator)
+{this.resetResults();this._resetCounters();this._searchMessageElement.textContent=WebInspector.UIString("Searching...");progressIndicator.show(this._searchStatusBarElement);this._updateSearchResultsMessage();if(!this._searchingView)
+this._searchingView=new WebInspector.EmptyView(WebInspector.UIString("Searching..."));this._searchingView.show(this._searchResultsElement);},indexingStarted:function(progressIndicator)
+{this._searchMessageElement.textContent=WebInspector.UIString("Indexing...");progressIndicator.show(this._searchStatusBarElement);},indexingFinished:function(finished)
+{this._searchMessageElement.textContent=finished?"":WebInspector.UIString("Indexing interrupted.");},_updateSearchResultsMessage:function()
+{if(this._searchMatchesCount&&this._searchResultsCount)
+this._searchResultsMessageElement.textContent=WebInspector.UIString("Found %d matches in %d files.",this._searchMatchesCount,this._nonEmptySearchResultsCount);else
+this._searchResultsMessageElement.textContent="";},resetResults:function()
+{if(this._searchingView)
+this._searchingView.detach();if(this._notFoundView)
+this._notFoundView.detach();this._searchResultsElement.removeChildren();},_resetCounters:function()
+{this._searchMatchesCount=0;this._searchResultsCount=0;this._nonEmptySearchResultsCount=0;},nothingFound:function()
+{this.resetResults();if(!this._notFoundView)
+this._notFoundView=new WebInspector.EmptyView(WebInspector.UIString("No matches found."));this._notFoundView.show(this._searchResultsElement);this._searchResultsMessageElement.textContent=WebInspector.UIString("No matches found.");},addSearchResult:function(searchResult)
+{this._searchMatchesCount+=searchResult.searchMatches.length;this._searchResultsCount++;if(searchResult.searchMatches.length)
+this._nonEmptySearchResultsCount++;this._updateSearchResultsMessage();},searchFinished:function(finished)
+{this._searchMessageElement.textContent=finished?WebInspector.UIString("Search finished."):WebInspector.UIString("Search interrupted.");},focus:function()
+{WebInspector.setCurrentFocusElement(this._search);this._search.select();},willHide:function()
+{this._controller.stopSearch();},_onKeyDown:function(event)
+{switch(event.keyCode){case WebInspector.KeyboardShortcut.Keys.Enter.code:this._onAction();break;}},_save:function()
+{WebInspector.settings.advancedSearchConfig.set(this.searchConfig);},_load:function()
+{var searchConfig=WebInspector.settings.advancedSearchConfig.get();this._search.value=searchConfig.query;this._ignoreCaseCheckbox.checked=searchConfig.ignoreCase;this._regexCheckbox.checked=searchConfig.isRegex;},_onAction:function()
+{var searchConfig=this.searchConfig;if(!searchConfig.query||!searchConfig.query.length)
+return;this._save();this._controller.startSearch(searchConfig);},__proto__:WebInspector.VBox.prototype}
+WebInspector.SearchConfig=function(query,ignoreCase,isRegex)
+{this.query=query;this.ignoreCase=ignoreCase;this.isRegex=isRegex;this._parse();}
+WebInspector.SearchConfig.prototype={_parse:function()
+{var filePattern="file:(([^\\\\ ]|\\\\.)+)";var quotedPattern="\"(([^\\\\\"]|\\\\.)+)\"";var unquotedPattern="(([^\\\\ ]|\\\\.)+)";var pattern="("+filePattern+")|("+quotedPattern+")|("+unquotedPattern+")";var regexp=new RegExp(pattern,"g");var queryParts=this.query.match(regexp)||[];this._fileQueries=[];this._queries=[];for(var i=0;i<queryParts.length;++i){var queryPart=queryParts[i];if(!queryPart)
+continue;if(queryPart.startsWith("file:")){this._fileQueries.push(this._parseFileQuery(queryPart));continue;}
+if(queryPart.startsWith("\"")){if(!queryPart.endsWith("\""))
+continue;this._queries.push(this._parseQuotedQuery(queryPart));continue;}
+this._queries.push(this._parseUnquotedQuery(queryPart));}},fileQueries:function()
+{return this._fileQueries;},queries:function()
+{return this._queries;},_parseUnquotedQuery:function(query)
+{return query.replace(/\\(.)/g,"$1");},_parseQuotedQuery:function(query)
+{return query.substring(1,query.length-1).replace(/\\(.)/g,"$1");},_parseFileQuery:function(query)
+{query=query.substr("file:".length);var result="";for(var i=0;i<query.length;++i){var char=query[i];if(char==="*"){result+=".*";}else if(char==="\\"){++i;var nextChar=query[i];if(nextChar===" ")
+result+=" ";}else{if(String.regexSpecialCharacters().indexOf(query.charAt(i))!==-1)
+result+="\\";result+=query.charAt(i);}}
+return result;}}
+WebInspector.SearchScope=function()
+{}
+WebInspector.SearchScope.prototype={performSearch:function(searchConfig,progress,searchResultCallback,searchFinishedCallback){},performIndexing:function(progressIndicator,callback){},stopSearch:function(){},createSearchResultsPane:function(searchConfig){}}
+WebInspector.SearchResultsPane=function(searchConfig)
+{this._searchConfig=searchConfig;this.element=document.createElement("div");}
+WebInspector.SearchResultsPane.prototype={get searchConfig()
+{return this._searchConfig;},addSearchResult:function(searchResult){}}
+WebInspector.FileBasedSearchResultsPane=function(searchConfig)
+{WebInspector.SearchResultsPane.call(this,searchConfig);this._searchResults=[];this.element.id="search-results-pane-file-based";this._treeOutlineElement=document.createElement("ol");this._treeOutlineElement.className="search-results-outline-disclosure";this.element.appendChild(this._treeOutlineElement);this._treeOutline=new TreeOutline(this._treeOutlineElement);this._matchesExpandedCount=0;}
+WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount=20;WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce=20;WebInspector.FileBasedSearchResultsPane.prototype={_createAnchor:function(uiSourceCode,lineNumber,columnNumber)
+{return WebInspector.Linkifier.linkifyUsingRevealer(new WebInspector.UILocation(uiSourceCode,lineNumber,columnNumber),"",uiSourceCode.url,lineNumber);},addSearchResult:function(searchResult)
+{this._searchResults.push(searchResult);var uiSourceCode=searchResult.uiSourceCode;if(!uiSourceCode)
+return;var searchMatches=searchResult.searchMatches;var fileTreeElement=this._addFileTreeElement(uiSourceCode.fullDisplayName(),searchMatches.length,this._searchResults.length-1);},_fileTreeElementExpanded:function(searchResult,fileTreeElement)
+{if(fileTreeElement._initialized)
+return;var toIndex=Math.min(searchResult.searchMatches.length,WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce);if(toIndex<searchResult.searchMatches.length){this._appendSearchMatches(fileTreeElement,searchResult,0,toIndex-1);this._appendShowMoreMatchesElement(fileTreeElement,searchResult,toIndex-1);}else
+this._appendSearchMatches(fileTreeElement,searchResult,0,toIndex);fileTreeElement._initialized=true;},_appendSearchMatches:function(fileTreeElement,searchResult,fromIndex,toIndex)
+{var uiSourceCode=searchResult.uiSourceCode;var searchMatches=searchResult.searchMatches;var queries=this._searchConfig.queries();var regexes=[];for(var i=0;i<queries.length;++i)
+regexes.push(createSearchRegex(queries[i],!this._searchConfig.ignoreCase,this._searchConfig.isRegex));for(var i=fromIndex;i<toIndex;++i){var lineNumber=searchMatches[i].lineNumber;var lineContent=searchMatches[i].lineContent;var matchRanges=[];for(var j=0;j<regexes.length;++j)
+matchRanges=matchRanges.concat(this._regexMatchRanges(lineContent,regexes[j]));var anchor=this._createAnchor(uiSourceCode,lineNumber,matchRanges[0].offset);var numberString=numberToStringWithSpacesPadding(lineNumber+1,4);var lineNumberSpan=document.createElement("span");lineNumberSpan.classList.add("search-match-line-number");lineNumberSpan.textContent=numberString;anchor.appendChild(lineNumberSpan);var contentSpan=this._createContentSpan(lineContent,matchRanges);anchor.appendChild(contentSpan);var searchMatchElement=new TreeElement("");searchMatchElement.selectable=false;fileTreeElement.appendChild(searchMatchElement);searchMatchElement.listItemElement.className="search-match source-code";searchMatchElement.listItemElement.appendChild(anchor);}},_appendShowMoreMatchesElement:function(fileTreeElement,searchResult,startMatchIndex)
+{var matchesLeftCount=searchResult.searchMatches.length-startMatchIndex;var showMoreMatchesText=WebInspector.UIString("Show all matches (%d more).",matchesLeftCount);var showMoreMatchesElement=new TreeElement(showMoreMatchesText);fileTreeElement.appendChild(showMoreMatchesElement);showMoreMatchesElement.listItemElement.classList.add("show-more-matches");showMoreMatchesElement.onselect=this._showMoreMatchesElementSelected.bind(this,searchResult,startMatchIndex,showMoreMatchesElement);},_showMoreMatchesElementSelected:function(searchResult,startMatchIndex,showMoreMatchesElement)
+{var fileTreeElement=showMoreMatchesElement.parent;fileTreeElement.removeChild(showMoreMatchesElement);this._appendSearchMatches(fileTreeElement,searchResult,startMatchIndex,searchResult.searchMatches.length);return false;},_addFileTreeElement:function(fileName,searchMatchesCount,searchResultIndex)
+{var fileTreeElement=new TreeElement("",null,true);fileTreeElement.toggleOnClick=true;fileTreeElement.selectable=false;this._treeOutline.appendChild(fileTreeElement);fileTreeElement.listItemElement.classList.add("search-result");var fileNameSpan=document.createElement("span");fileNameSpan.className="search-result-file-name";fileNameSpan.textContent=fileName;fileTreeElement.listItemElement.appendChild(fileNameSpan);var matchesCountSpan=document.createElement("span");matchesCountSpan.className="search-result-matches-count";if(searchMatchesCount===1)
+matchesCountSpan.textContent=WebInspector.UIString("(%d match)",searchMatchesCount);else
+matchesCountSpan.textContent=WebInspector.UIString("(%d matches)",searchMatchesCount);fileTreeElement.listItemElement.appendChild(matchesCountSpan);var searchResult=this._searchResults[searchResultIndex];fileTreeElement.onexpand=this._fileTreeElementExpanded.bind(this,searchResult,fileTreeElement);if(this._matchesExpandedCount<WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount)
+fileTreeElement.expand();this._matchesExpandedCount+=searchResult.searchMatches.length;return fileTreeElement;},_regexMatchRanges:function(lineContent,regex)
+{regex.lastIndex=0;var match;var offset=0;var matchRanges=[];while((regex.lastIndex<lineContent.length)&&(match=regex.exec(lineContent)))
+matchRanges.push(new WebInspector.SourceRange(match.index,match[0].length));return matchRanges;},_createContentSpan:function(lineContent,matchRanges)
+{var contentSpan=document.createElement("span");contentSpan.className="search-match-content";contentSpan.textContent=lineContent;WebInspector.highlightRangesWithStyleClass(contentSpan,matchRanges,"highlighted-match");return contentSpan;},__proto__:WebInspector.SearchResultsPane.prototype}
+WebInspector.FileBasedSearchResultsPane.SearchResult=function(uiSourceCode,searchMatches){this.uiSourceCode=uiSourceCode;this.searchMatches=searchMatches;}
+WebInspector.advancedSearchController;WebInspector.TimelineGrid=function()
+{this.element=document.createElement("div");this._dividersElement=this.element.createChild("div","resources-dividers");this._gridHeaderElement=document.createElement("div");this._gridHeaderElement.id="timeline-grid-header";this._eventDividersElement=this._gridHeaderElement.createChild("div","resources-event-dividers");this._dividersLabelBarElement=this._gridHeaderElement.createChild("div","resources-dividers-label-bar");this.element.appendChild(this._gridHeaderElement);this._leftCurtainElement=this.element.createChild("div","timeline-cpu-curtain-left");this._rightCurtainElement=this.element.createChild("div","timeline-cpu-curtain-right");}
+WebInspector.TimelineGrid.calculateDividerOffsets=function(calculator,clientWidth)
+{const minGridSlicePx=64;const gridFreeZoneAtLeftPx=50;var dividersCount=clientWidth/minGridSlicePx;var gridSliceTime=calculator.boundarySpan()/dividersCount;var pixelsPerTime=clientWidth/calculator.boundarySpan();var logGridSliceTime=Math.ceil(Math.log(gridSliceTime)/Math.LN10);gridSliceTime=Math.pow(10,logGridSliceTime);if(gridSliceTime*pixelsPerTime>=5*minGridSlicePx)
+gridSliceTime=gridSliceTime/5;if(gridSliceTime*pixelsPerTime>=2*minGridSlicePx)
+gridSliceTime=gridSliceTime/2;var firstDividerTime=Math.ceil((calculator.minimumBoundary()-calculator.zeroTime())/gridSliceTime)*gridSliceTime+calculator.zeroTime();var lastDividerTime=calculator.maximumBoundary();if(calculator.paddingLeft()>0)
+lastDividerTime=lastDividerTime+minGridSlicePx/pixelsPerTime;dividersCount=Math.ceil((lastDividerTime-firstDividerTime)/gridSliceTime);var skipLeftmostDividers=calculator.paddingLeft()===0;if(!gridSliceTime)
+dividersCount=0;var offsets=[];for(var i=0;i<dividersCount;++i){var left=calculator.computePosition(firstDividerTime+gridSliceTime*i);if(skipLeftmostDividers&&left<gridFreeZoneAtLeftPx)
+continue;offsets.push(firstDividerTime+gridSliceTime*i);}
+return{offsets:offsets,precision:Math.max(0,-Math.floor(Math.log(gridSliceTime*1.01)/Math.LN10))};}
+WebInspector.TimelineGrid.drawCanvasGrid=function(canvas,calculator,dividerOffsets)
+{var context=canvas.getContext("2d");context.save();var ratio=window.devicePixelRatio;context.scale(ratio,ratio);context.translate(0.5,0.5);var printDeltas=!!dividerOffsets;var width=canvas.width/window.devicePixelRatio;var height=canvas.height/window.devicePixelRatio;var precision=0;if(!dividerOffsets){var dividersData=WebInspector.TimelineGrid.calculateDividerOffsets(calculator,width);dividerOffsets=dividersData.offsets;precision=dividersData.precision;}
+context.fillStyle="#333";context.strokeStyle="rgba(0, 0, 0, 0.1)";context.textBaseline="hanging";context.font=(printDeltas?"italic bold 11px ":" 11px ")+WebInspector.fontFamily();context.lineWidth=1;const minWidthForTitle=60;var lastPosition=0;var time=0;var lastTime=0;var paddingRight=4;var paddingTop=3;for(var i=0;i<dividerOffsets.length;++i){time=dividerOffsets[i];var position=calculator.computePosition(time);context.beginPath();if(position-lastPosition>minWidthForTitle){if(!printDeltas||i!==0){var text=printDeltas?calculator.formatTime(calculator.zeroTime()+time-lastTime):calculator.formatTime(time,precision);var textWidth=context.measureText(text).width;var textPosition=printDeltas?(position+lastPosition-textWidth)/2:position-textWidth-paddingRight;context.fillText(text,textPosition,paddingTop);}}
+context.moveTo(position,0);context.lineTo(position,height);context.stroke();lastTime=time;lastPosition=position;}
+context.restore();},WebInspector.TimelineGrid.prototype={get dividersElement()
+{return this._dividersElement;},get dividersLabelBarElement()
+{return this._dividersLabelBarElement;},removeDividers:function()
+{this._dividersElement.removeChildren();this._dividersLabelBarElement.removeChildren();},updateDividers:function(calculator,dividerOffsets,printDeltas)
+{var precision=0;if(!dividerOffsets){var dividersData=WebInspector.TimelineGrid.calculateDividerOffsets(calculator,this._dividersElement.clientWidth);dividerOffsets=dividersData.offsets;precision=dividersData.precision;printDeltas=false;}
+var dividersElementClientWidth=this._dividersElement.clientWidth;var divider=this._dividersElement.firstChild;var dividerLabelBar=this._dividersLabelBarElement.firstChild;const minWidthForTitle=60;var lastPosition=0;var lastTime=0;for(var i=0;i<dividerOffsets.length;++i){if(!divider){divider=document.createElement("div");divider.className="resources-divider";this._dividersElement.appendChild(divider);dividerLabelBar=document.createElement("div");dividerLabelBar.className="resources-divider";var label=document.createElement("div");label.className="resources-divider-label";dividerLabelBar._labelElement=label;dividerLabelBar.appendChild(label);this._dividersLabelBarElement.appendChild(dividerLabelBar);}
+var time=dividerOffsets[i];var position=calculator.computePosition(time);if(position-lastPosition>minWidthForTitle)
+dividerLabelBar._labelElement.textContent=printDeltas?calculator.formatTime(time-lastTime):calculator.formatTime(time,precision);else
+dividerLabelBar._labelElement.textContent="";if(printDeltas)
+dividerLabelBar._labelElement.style.width=Math.ceil(position-lastPosition)+"px";else
+dividerLabelBar._labelElement.style.removeProperty("width");lastPosition=position;lastTime=time;var percentLeft=100*position/dividersElementClientWidth;divider.style.left=percentLeft+"%";dividerLabelBar.style.left=percentLeft+"%";divider=divider.nextSibling;dividerLabelBar=dividerLabelBar.nextSibling;}
+while(divider){var nextDivider=divider.nextSibling;this._dividersElement.removeChild(divider);divider=nextDivider;}
+while(dividerLabelBar){var nextDivider=dividerLabelBar.nextSibling;this._dividersLabelBarElement.removeChild(dividerLabelBar);dividerLabelBar=nextDivider;}
+return true;},addEventDivider:function(divider)
+{this._eventDividersElement.appendChild(divider);},addEventDividers:function(dividers)
+{this._gridHeaderElement.removeChild(this._eventDividersElement);for(var i=0;i<dividers.length;++i){if(dividers[i])
+this._eventDividersElement.appendChild(dividers[i]);}
+this._gridHeaderElement.appendChild(this._eventDividersElement);},removeEventDividers:function()
+{this._eventDividersElement.removeChildren();},hideEventDividers:function()
+{this._eventDividersElement.classList.add("hidden");},showEventDividers:function()
+{this._eventDividersElement.classList.remove("hidden");},hideDividers:function()
+{this._dividersElement.classList.add("hidden");},showDividers:function()
+{this._dividersElement.classList.remove("hidden");},hideCurtains:function()
+{this._leftCurtainElement.classList.add("hidden");this._rightCurtainElement.classList.add("hidden");},showCurtains:function(gapOffset,gapWidth)
+{this._leftCurtainElement.style.width=gapOffset+"px";this._leftCurtainElement.classList.remove("hidden");this._rightCurtainElement.style.left=(gapOffset+gapWidth)+"px";this._rightCurtainElement.classList.remove("hidden");},setScrollAndDividerTop:function(scrollTop,dividersTop)
+{this._dividersLabelBarElement.style.top=scrollTop+"px";this._eventDividersElement.style.top=scrollTop+"px";this._leftCurtainElement.style.top=scrollTop+"px";this._rightCurtainElement.style.top=scrollTop+"px";}}
+WebInspector.TimelineGrid.Calculator=function(){}
+WebInspector.TimelineGrid.Calculator.prototype={paddingLeft:function(){},computePosition:function(time){},formatTime:function(time,precision){},minimumBoundary:function(){},zeroTime:function(){},maximumBoundary:function(){},boundarySpan:function(){}}
+WebInspector.OverviewGrid=function(prefix)
+{this.element=document.createElement("div");this.element.id=prefix+"-overview-container";this._grid=new WebInspector.TimelineGrid();this._grid.element.id=prefix+"-overview-grid";this._grid.setScrollAndDividerTop(0,0);this.element.appendChild(this._grid.element);this._window=new WebInspector.OverviewGrid.Window(this.element,this._grid.dividersLabelBarElement);}
+WebInspector.OverviewGrid.prototype={clientWidth:function()
+{return this.element.clientWidth;},updateDividers:function(calculator)
+{this._grid.updateDividers(calculator);},addEventDividers:function(dividers)
+{this._grid.addEventDividers(dividers);},removeEventDividers:function()
+{this._grid.removeEventDividers();},setWindowPosition:function(start,end)
+{this._window._setWindowPosition(start,end);},reset:function()
+{this._window.reset();},windowLeft:function()
+{return this._window.windowLeft;},windowRight:function()
+{return this._window.windowRight;},setWindow:function(left,right)
+{this._window._setWindow(left,right);},addEventListener:function(eventType,listener,thisObject)
+{this._window.addEventListener(eventType,listener,thisObject);},zoom:function(zoomFactor,referencePoint)
+{this._window._zoom(zoomFactor,referencePoint);},setResizeEnabled:function(enabled)
+{this._window._setEnabled(!!enabled);}}
+WebInspector.OverviewGrid.MinSelectableSize=14;WebInspector.OverviewGrid.WindowScrollSpeedFactor=.3;WebInspector.OverviewGrid.ResizerOffset=3.5;WebInspector.OverviewGrid.Window=function(parentElement,dividersLabelBarElement)
+{this._parentElement=parentElement;this._dividersLabelBarElement=dividersLabelBarElement;WebInspector.installDragHandle(this._parentElement,this._startWindowSelectorDragging.bind(this),this._windowSelectorDragging.bind(this),this._endWindowSelectorDragging.bind(this),"ew-resize",null);WebInspector.installDragHandle(this._dividersLabelBarElement,this._startWindowDragging.bind(this),this._windowDragging.bind(this),null,"move");this.windowLeft=0.0;this.windowRight=1.0;this._parentElement.addEventListener("mousewheel",this._onMouseWheel.bind(this),true);this._parentElement.addEventListener("dblclick",this._resizeWindowMaximum.bind(this),true);this._overviewWindowElement=parentElement.createChild("div","overview-grid-window");this._overviewWindowBordersElement=parentElement.createChild("div","overview-grid-window-rulers");parentElement.createChild("div","overview-grid-dividers-background");this._leftResizeElement=parentElement.createChild("div","overview-grid-window-resizer");this._leftResizeElement.style.left=0;WebInspector.installDragHandle(this._leftResizeElement,this._resizerElementStartDragging.bind(this),this._leftResizeElementDragging.bind(this),null,"ew-resize");this._rightResizeElement=parentElement.createChild("div","overview-grid-window-resizer overview-grid-window-resizer-right");this._rightResizeElement.style.right=0;WebInspector.installDragHandle(this._rightResizeElement,this._resizerElementStartDragging.bind(this),this._rightResizeElementDragging.bind(this),null,"ew-resize");this._setEnabled(true);}
+WebInspector.OverviewGrid.Events={WindowChanged:"WindowChanged"}
+WebInspector.OverviewGrid.Window.prototype={reset:function()
+{this.windowLeft=0.0;this.windowRight=1.0;this._overviewWindowElement.style.left="0%";this._overviewWindowElement.style.width="100%";this._overviewWindowBordersElement.style.left="0%";this._overviewWindowBordersElement.style.right="0%";this._leftResizeElement.style.left="0%";this._rightResizeElement.style.left="100%";this._setEnabled(true);},_setEnabled:function(enabled)
+{enabled=!!enabled;if(this._enabled===enabled)
+return;this._enabled=enabled;},_resizerElementStartDragging:function(event)
+{if(!this._enabled)
+return false;this._resizerParentOffsetLeft=event.pageX-event.offsetX-event.target.offsetLeft;event.preventDefault();return true;},_leftResizeElementDragging:function(event)
+{this._resizeWindowLeft(event.pageX-this._resizerParentOffsetLeft);event.preventDefault();},_rightResizeElementDragging:function(event)
+{this._resizeWindowRight(event.pageX-this._resizerParentOffsetLeft);event.preventDefault();},_startWindowSelectorDragging:function(event)
+{if(!this._enabled)
+return false;this._offsetLeft=this._parentElement.totalOffsetLeft();var position=event.x-this._offsetLeft;this._overviewWindowSelector=new WebInspector.OverviewGrid.WindowSelector(this._parentElement,position);return true;},_windowSelectorDragging:function(event)
+{this._overviewWindowSelector._updatePosition(event.x-this._offsetLeft);event.preventDefault();},_endWindowSelectorDragging:function(event)
+{var window=this._overviewWindowSelector._close(event.x-this._offsetLeft);delete this._overviewWindowSelector;if(window.end===window.start){var middle=window.end;window.start=Math.max(0,middle-WebInspector.OverviewGrid.MinSelectableSize/2);window.end=Math.min(this._parentElement.clientWidth,middle+WebInspector.OverviewGrid.MinSelectableSize/2);}else if(window.end-window.start<WebInspector.OverviewGrid.MinSelectableSize){if(this._parentElement.clientWidth-window.end>WebInspector.OverviewGrid.MinSelectableSize)
+window.end=window.start+WebInspector.OverviewGrid.MinSelectableSize;else
+window.start=window.end-WebInspector.OverviewGrid.MinSelectableSize;}
+this._setWindowPosition(window.start,window.end);},_startWindowDragging:function(event)
+{this._dragStartPoint=event.pageX;this._dragStartLeft=this.windowLeft;this._dragStartRight=this.windowRight;return true;},_windowDragging:function(event)
+{event.preventDefault();var delta=(event.pageX-this._dragStartPoint)/this._parentElement.clientWidth;if(this._dragStartLeft+delta<0)
+delta=-this._dragStartLeft;if(this._dragStartRight+delta>1)
+delta=1-this._dragStartRight;this._setWindow(this._dragStartLeft+delta,this._dragStartRight+delta);},_resizeWindowLeft:function(start)
+{if(start<10)
+start=0;else if(start>this._rightResizeElement.offsetLeft-4)
+start=this._rightResizeElement.offsetLeft-4;this._setWindowPosition(start,null);},_resizeWindowRight:function(end)
+{if(end>this._parentElement.clientWidth-10)
+end=this._parentElement.clientWidth;else if(end<this._leftResizeElement.offsetLeft+WebInspector.OverviewGrid.MinSelectableSize)
+end=this._leftResizeElement.offsetLeft+WebInspector.OverviewGrid.MinSelectableSize;this._setWindowPosition(null,end);},_resizeWindowMaximum:function()
+{this._setWindowPosition(0,this._parentElement.clientWidth);},_setWindow:function(windowLeft,windowRight)
+{var left=windowLeft;var right=windowRight;var width=windowRight-windowLeft;var widthInPixels=width*this._parentElement.clientWidth;var minWidthInPixels=WebInspector.OverviewGrid.MinSelectableSize/2;if(widthInPixels<minWidthInPixels){var factor=minWidthInPixels/widthInPixels;left=((windowRight+windowLeft)-width*factor)/2;right=((windowRight+windowLeft)+width*factor)/2;}
+this.windowLeft=windowLeft;this._leftResizeElement.style.left=left*100+"%";this.windowRight=windowRight;this._rightResizeElement.style.left=right*100+"%";this._overviewWindowElement.style.left=left*100+"%";this._overviewWindowBordersElement.style.left=left*100+"%";this._overviewWindowElement.style.width=(right-left)*100+"%";this._overviewWindowBordersElement.style.right=(1-right)*100+"%";this.dispatchEventToListeners(WebInspector.OverviewGrid.Events.WindowChanged);},_setWindowPosition:function(start,end)
+{var clientWidth=this._parentElement.clientWidth;var windowLeft=typeof start==="number"?start/clientWidth:this.windowLeft;var windowRight=typeof end==="number"?end/clientWidth:this.windowRight;this._setWindow(windowLeft,windowRight);},_onMouseWheel:function(event)
+{if(typeof event.wheelDeltaY==="number"&&event.wheelDeltaY){const zoomFactor=1.1;const mouseWheelZoomSpeed=1/120;var reference=event.offsetX/event.target.clientWidth;this._zoom(Math.pow(zoomFactor,-event.wheelDeltaY*mouseWheelZoomSpeed),reference);}
+if(typeof event.wheelDeltaX==="number"&&event.wheelDeltaX){var offset=Math.round(event.wheelDeltaX*WebInspector.OverviewGrid.WindowScrollSpeedFactor);var windowLeft=this._leftResizeElement.offsetLeft+WebInspector.OverviewGrid.ResizerOffset;var windowRight=this._rightResizeElement.offsetLeft+WebInspector.OverviewGrid.ResizerOffset;if(windowLeft-offset<0)
+offset=windowLeft;if(windowRight-offset>this._parentElement.clientWidth)
+offset=windowRight-this._parentElement.clientWidth;this._setWindowPosition(windowLeft-offset,windowRight-offset);event.preventDefault();}},_zoom:function(factor,reference)
+{var left=this.windowLeft;var right=this.windowRight;var windowSize=right-left;var newWindowSize=factor*windowSize;if(newWindowSize>1){newWindowSize=1;factor=newWindowSize/windowSize;}
+left=reference+(left-reference)*factor;left=Number.constrain(left,0,1-newWindowSize);right=reference+(right-reference)*factor;right=Number.constrain(right,newWindowSize,1);this._setWindow(left,right);},__proto__:WebInspector.Object.prototype}
+WebInspector.OverviewGrid.WindowSelector=function(parent,position)
+{this._startPosition=position;this._width=parent.offsetWidth;this._windowSelector=document.createElement("div");this._windowSelector.className="overview-grid-window-selector";this._windowSelector.style.left=this._startPosition+"px";this._windowSelector.style.right=this._width-this._startPosition+"px";parent.appendChild(this._windowSelector);}
+WebInspector.OverviewGrid.WindowSelector.prototype={_close:function(position)
+{position=Math.max(0,Math.min(position,this._width));this._windowSelector.remove();return this._startPosition<position?{start:this._startPosition,end:position}:{start:position,end:this._startPosition};},_updatePosition:function(position)
+{position=Math.max(0,Math.min(position,this._width));if(position<this._startPosition){this._windowSelector.style.left=position+"px";this._windowSelector.style.right=this._width-this._startPosition+"px";}else{this._windowSelector.style.left=this._startPosition+"px";this._windowSelector.style.right=this._width-position+"px";}}}
+WebInspector.ContentProvider=function(){}
+WebInspector.ContentProvider.prototype={contentURL:function(){},contentType:function(){},requestContent:function(callback){},searchInContent:function(query,caseSensitive,isRegex,callback){}}
+WebInspector.ContentProvider.SearchMatch=function(lineNumber,lineContent){this.lineNumber=lineNumber;this.lineContent=lineContent;}
+WebInspector.ContentProvider.performSearchInContent=function(content,query,caseSensitive,isRegex)
+{var regex=createSearchRegex(query,caseSensitive,isRegex);var contentString=new String(content);var result=[];for(var i=0;i<contentString.lineCount();++i){var lineContent=contentString.lineAt(i);regex.lastIndex=0;if(regex.exec(lineContent))
+result.push(new WebInspector.ContentProvider.SearchMatch(i,lineContent));}
+return result;}
+WebInspector.Resource=function(request,url,documentURL,frameId,loaderId,type,mimeType,isHidden)
+{this._request=request;this.url=url;this._documentURL=documentURL;this._frameId=frameId;this._loaderId=loaderId;this._type=type||WebInspector.resourceTypes.Other;this._mimeType=mimeType;this._isHidden=isHidden;this._content;this._contentEncoded;this._pendingContentCallbacks=[];if(this._request&&!this._request.finished)
+this._request.addEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._requestFinished,this);}
+WebInspector.Resource.Events={MessageAdded:"message-added",MessagesCleared:"messages-cleared",}
+WebInspector.Resource.prototype={get request()
+{return this._request;},get url()
+{return this._url;},set url(x)
+{this._url=x;this._parsedURL=new WebInspector.ParsedURL(x);},get parsedURL()
+{return this._parsedURL;},get documentURL()
+{return this._documentURL;},get frameId()
+{return this._frameId;},get loaderId()
+{return this._loaderId;},get displayName()
+{return this._parsedURL.displayName;},get type()
+{return this._request?this._request.type:this._type;},get mimeType()
+{return this._request?this._request.mimeType:this._mimeType;},get messages()
+{return this._messages||[];},addMessage:function(msg)
+{if(!msg.isErrorOrWarning()||!msg.messageText)
+return;if(!this._messages)
+this._messages=[];this._messages.push(msg);this.dispatchEventToListeners(WebInspector.Resource.Events.MessageAdded,msg);},get errors()
+{return this._errors||0;},set errors(x)
+{this._errors=x;},get warnings()
+{return this._warnings||0;},set warnings(x)
+{this._warnings=x;},clearErrorsAndWarnings:function()
+{this._messages=[];this._warnings=0;this._errors=0;this.dispatchEventToListeners(WebInspector.Resource.Events.MessagesCleared);},get content()
+{return this._content;},get contentEncoded()
+{return this._contentEncoded;},contentURL:function()
+{return this._url;},contentType:function()
+{return this.type;},requestContent:function(callback)
+{if(typeof this._content!=="undefined"){callback(this._content);return;}
+this._pendingContentCallbacks.push(callback);if(!this._request||this._request.finished)
+this._innerRequestContent();},canonicalMimeType:function()
+{return this.type.canonicalMimeType()||this.mimeType;},searchInContent:function(query,caseSensitive,isRegex,callback)
+{function callbackWrapper(error,searchMatches)
+{callback(searchMatches||[]);}
+if(this.type===WebInspector.resourceTypes.Document){callback([]);return;}
+if(this.frameId)
+PageAgent.searchInResource(this.frameId,this.url,query,caseSensitive,isRegex,callbackWrapper);else
+callback([]);},populateImageSource:function(image)
+{function onResourceContent(content)
+{var imageSrc=WebInspector.contentAsDataURL(this._content,this.mimeType,this._contentEncoded);if(imageSrc===null)
+imageSrc=this.url;image.src=imageSrc;}
+this.requestContent(onResourceContent.bind(this));},_requestFinished:function()
+{this._request.removeEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._requestFinished,this);if(this._pendingContentCallbacks.length)
+this._innerRequestContent();},_innerRequestContent:function()
+{if(this._contentRequested)
+return;this._contentRequested=true;function contentLoaded(error,content,contentEncoded)
+{if(error||content===null){replyWithContent.call(this,null,false);return;}
+replyWithContent.call(this,content,contentEncoded);}
+function replyWithContent(content,contentEncoded)
+{this._content=content;this._contentEncoded=contentEncoded;var callbacks=this._pendingContentCallbacks.slice();for(var i=0;i<callbacks.length;++i)
+callbacks[i](this._content);this._pendingContentCallbacks.length=0;delete this._contentRequested;}
+function resourceContentLoaded(error,content,contentEncoded)
+{contentLoaded.call(this,error,content,contentEncoded);}
+if(this.request){this.request.requestContent(requestContentLoaded.bind(this));return;}
+function requestContentLoaded(content)
+{contentLoaded.call(this,null,content,this.request.contentEncoded);}
+PageAgent.getResourceContent(this.frameId,this.url,resourceContentLoaded.bind(this));},isHidden:function()
+{return!!this._isHidden;},__proto__:WebInspector.Object.prototype}
+WebInspector.NetworkRequest=function(requestId,url,documentURL,frameId,loaderId)
+{this._requestId=requestId;this.url=url;this._documentURL=documentURL;this._frameId=frameId;this._loaderId=loaderId;this._startTime=-1;this._endTime=-1;this.statusCode=0;this.statusText="";this.requestMethod="";this.requestTime=0;this._type=WebInspector.resourceTypes.Other;this._contentEncoded=false;this._pendingContentCallbacks=[];this._frames=[];this._responseHeaderValues={};this._remoteAddress="";}
+WebInspector.NetworkRequest.Events={FinishedLoading:"FinishedLoading",TimingChanged:"TimingChanged",RemoteAddressChanged:"RemoteAddressChanged",RequestHeadersChanged:"RequestHeadersChanged",ResponseHeadersChanged:"ResponseHeadersChanged",}
+WebInspector.NetworkRequest.InitiatorType={Other:"other",Parser:"parser",Redirect:"redirect",Script:"script"}
+WebInspector.NetworkRequest.NameValue;WebInspector.NetworkRequest.prototype={get requestId()
+{return this._requestId;},set requestId(requestId)
+{this._requestId=requestId;},get url()
+{return this._url;},set url(x)
+{if(this._url===x)
+return;this._url=x;this._parsedURL=new WebInspector.ParsedURL(x);delete this._queryString;delete this._parsedQueryParameters;delete this._name;delete this._path;},get documentURL()
+{return this._documentURL;},get parsedURL()
+{return this._parsedURL;},get frameId()
+{return this._frameId;},get loaderId()
+{return this._loaderId;},setRemoteAddress:function(ip,port)
+{this._remoteAddress=ip+":"+port;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RemoteAddressChanged,this);},remoteAddress:function()
+{return this._remoteAddress;},get startTime()
+{return this._startTime||-1;},set startTime(x)
+{this._startTime=x;},get responseReceivedTime()
+{return this._responseReceivedTime||-1;},set responseReceivedTime(x)
+{this._responseReceivedTime=x;},get endTime()
+{return this._endTime||-1;},set endTime(x)
+{if(this.timing&&this.timing.requestTime){this._endTime=Math.max(x,this.responseReceivedTime);}else{this._endTime=x;if(this._responseReceivedTime>x)
+this._responseReceivedTime=x;}
+this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.TimingChanged,this);},get duration()
+{if(this._endTime===-1||this._startTime===-1)
+return-1;return this._endTime-this._startTime;},get latency()
+{if(this._responseReceivedTime===-1||this._startTime===-1)
+return-1;return this._responseReceivedTime-this._startTime;},get resourceSize()
+{return this._resourceSize||0;},set resourceSize(x)
+{this._resourceSize=x;},get transferSize()
+{return this._transferSize||0;},increaseTransferSize:function(x)
+{this._transferSize=(this._transferSize||0)+x;},setTransferSize:function(x)
+{this._transferSize=x;},get finished()
+{return this._finished;},set finished(x)
+{if(this._finished===x)
+return;this._finished=x;if(x){this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.FinishedLoading,this);if(this._pendingContentCallbacks.length)
+this._innerRequestContent();}},get failed()
+{return this._failed;},set failed(x)
+{this._failed=x;},get canceled()
+{return this._canceled;},set canceled(x)
+{this._canceled=x;},get cached()
+{return!!this._cached&&!this._transferSize;},set cached(x)
+{this._cached=x;if(x)
+delete this._timing;},get timing()
+{return this._timing;},set timing(x)
+{if(x&&!this._cached){this._startTime=x.requestTime;this._responseReceivedTime=x.requestTime+x.receiveHeadersEnd/1000.0;this._timing=x;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.TimingChanged,this);}},get mimeType()
+{return this._mimeType;},set mimeType(x)
+{this._mimeType=x;},get displayName()
+{return this._parsedURL.displayName;},name:function()
+{if(this._name)
+return this._name;this._parseNameAndPathFromURL();return this._name;},path:function()
+{if(this._path)
+return this._path;this._parseNameAndPathFromURL();return this._path;},_parseNameAndPathFromURL:function()
+{if(this._parsedURL.isDataURL()){this._name=this._parsedURL.dataURLDisplayName();this._path="";}else if(this._parsedURL.isAboutBlank()){this._name=this._parsedURL.url;this._path="";}else{this._path=this._parsedURL.host+this._parsedURL.folderPathComponents;this._path=this._path.trimURL(WebInspector.resourceTreeModel.inspectedPageDomain());if(this._parsedURL.lastPathComponent||this._parsedURL.queryParams)
+this._name=this._parsedURL.lastPathComponent+(this._parsedURL.queryParams?"?"+this._parsedURL.queryParams:"");else if(this._parsedURL.folderPathComponents){this._name=this._parsedURL.folderPathComponents.substring(this._parsedURL.folderPathComponents.lastIndexOf("/")+1)+"/";this._path=this._path.substring(0,this._path.lastIndexOf("/"));}else{this._name=this._parsedURL.host;this._path="";}}},get folder()
+{var path=this._parsedURL.path;var indexOfQuery=path.indexOf("?");if(indexOfQuery!==-1)
+path=path.substring(0,indexOfQuery);var lastSlashIndex=path.lastIndexOf("/");return lastSlashIndex!==-1?path.substring(0,lastSlashIndex):"";},get type()
+{return this._type;},set type(x)
+{this._type=x;},get domain()
+{return this._parsedURL.host;},get scheme()
+{return this._parsedURL.scheme;},get redirectSource()
+{if(this.redirects&&this.redirects.length>0)
+return this.redirects[this.redirects.length-1];return this._redirectSource;},set redirectSource(x)
+{this._redirectSource=x;delete this._initiatorInfo;},requestHeaders:function()
+{return this._requestHeaders||[];},setRequestHeaders:function(headers)
+{this._requestHeaders=headers;delete this._requestCookies;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);},requestHeadersText:function()
+{return this._requestHeadersText;},setRequestHeadersText:function(text)
+{this._requestHeadersText=text;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);},requestHeaderValue:function(headerName)
+{return this._headerValue(this.requestHeaders(),headerName);},get requestCookies()
+{if(!this._requestCookies)
+this._requestCookies=WebInspector.CookieParser.parseCookie(this.requestHeaderValue("Cookie"));return this._requestCookies;},get requestFormData()
+{return this._requestFormData;},set requestFormData(x)
+{this._requestFormData=x;delete this._parsedFormParameters;},requestHttpVersion:function()
+{var headersText=this.requestHeadersText();if(!headersText){return this.requestHeaderValue(":version");}
+var firstLine=headersText.split(/\r\n/)[0];var match=firstLine.match(/(HTTP\/\d+\.\d+)$/);return match?match[1]:undefined;},get responseHeaders()
+{return this._responseHeaders||[];},set responseHeaders(x)
+{this._responseHeaders=x;delete this._sortedResponseHeaders;delete this._responseCookies;this._responseHeaderValues={};this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);},get responseHeadersText()
+{return this._responseHeadersText;},set responseHeadersText(x)
+{this._responseHeadersText=x;this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);},get sortedResponseHeaders()
+{if(this._sortedResponseHeaders!==undefined)
+return this._sortedResponseHeaders;this._sortedResponseHeaders=this.responseHeaders.slice();this._sortedResponseHeaders.sort(function(a,b){return a.name.toLowerCase().compareTo(b.name.toLowerCase());});return this._sortedResponseHeaders;},responseHeaderValue:function(headerName)
+{var value=this._responseHeaderValues[headerName];if(value===undefined){value=this._headerValue(this.responseHeaders,headerName);this._responseHeaderValues[headerName]=(value!==undefined)?value:null;}
+return(value!==null)?value:undefined;},get responseCookies()
+{if(!this._responseCookies)
+this._responseCookies=WebInspector.CookieParser.parseSetCookie(this.responseHeaderValue("Set-Cookie"));return this._responseCookies;},queryString:function()
+{if(this._queryString!==undefined)
+return this._queryString;var queryString=null;var url=this.url;var questionMarkPosition=url.indexOf("?");if(questionMarkPosition!==-1){queryString=url.substring(questionMarkPosition+1);var hashSignPosition=queryString.indexOf("#");if(hashSignPosition!==-1)
+queryString=queryString.substring(0,hashSignPosition);}
+this._queryString=queryString;return this._queryString;},get queryParameters()
+{if(this._parsedQueryParameters)
+return this._parsedQueryParameters;var queryString=this.queryString();if(!queryString)
+return null;this._parsedQueryParameters=this._parseParameters(queryString);return this._parsedQueryParameters;},get formParameters()
+{if(this._parsedFormParameters)
+return this._parsedFormParameters;if(!this.requestFormData)
+return null;var requestContentType=this.requestContentType();if(!requestContentType||!requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))
+return null;this._parsedFormParameters=this._parseParameters(this.requestFormData);return this._parsedFormParameters;},get responseHttpVersion()
+{var headersText=this._responseHeadersText;if(!headersText){return this.responseHeaderValue(":version");}
+var match=headersText.match(/^(HTTP\/\d+\.\d+)/);return match?match[1]:undefined;},_parseParameters:function(queryString)
+{function parseNameValue(pair)
+{var splitPair=pair.split("=",2);return{name:splitPair[0],value:splitPair[1]||""};}
+return queryString.split("&").map(parseNameValue);},_headerValue:function(headers,headerName)
+{headerName=headerName.toLowerCase();var values=[];for(var i=0;i<headers.length;++i){if(headers[i].name.toLowerCase()===headerName)
+values.push(headers[i].value);}
+if(!values.length)
+return undefined;if(headerName==="set-cookie")
+return values.join("\n");return values.join(", ");},get content()
+{return this._content;},contentError:function()
+{return this._contentError;},get contentEncoded()
+{return this._contentEncoded;},contentURL:function()
+{return this._url;},contentType:function()
+{return this._type;},requestContent:function(callback)
+{if(this.type===WebInspector.resourceTypes.WebSocket){callback(null);return;}
+if(typeof this._content!=="undefined"){callback(this.content||null);return;}
+this._pendingContentCallbacks.push(callback);if(this.finished)
+this._innerRequestContent();},searchInContent:function(query,caseSensitive,isRegex,callback)
+{callback([]);},isHttpFamily:function()
+{return!!this.url.match(/^https?:/i);},requestContentType:function()
+{return this.requestHeaderValue("Content-Type");},isPingRequest:function()
+{return"text/ping"===this.requestContentType();},hasErrorStatusCode:function()
+{return this.statusCode>=400;},populateImageSource:function(image)
+{function onResourceContent(content)
+{var imageSrc=this.asDataURL();if(imageSrc===null)
+imageSrc=this.url;image.src=imageSrc;}
+this.requestContent(onResourceContent.bind(this));},asDataURL:function()
+{return WebInspector.contentAsDataURL(this._content,this.mimeType,this._contentEncoded);},_innerRequestContent:function()
+{if(this._contentRequested)
+return;this._contentRequested=true;function onResourceContent(error,content,contentEncoded)
+{this._content=error?null:content;this._contentError=error;this._contentEncoded=contentEncoded;var callbacks=this._pendingContentCallbacks.slice();for(var i=0;i<callbacks.length;++i)
+callbacks[i](this._content);this._pendingContentCallbacks.length=0;delete this._contentRequested;}
+NetworkAgent.getResponseBody(this._requestId,onResourceContent.bind(this));},initiatorInfo:function()
+{if(this._initiatorInfo)
+return this._initiatorInfo;var type=WebInspector.NetworkRequest.InitiatorType.Other;var url="";var lineNumber=-Infinity;var columnNumber=-Infinity;if(this.redirectSource){type=WebInspector.NetworkRequest.InitiatorType.Redirect;url=this.redirectSource.url;}else if(this.initiator){if(this.initiator.type===NetworkAgent.InitiatorType.Parser){type=WebInspector.NetworkRequest.InitiatorType.Parser;url=this.initiator.url;lineNumber=this.initiator.lineNumber;}else if(this.initiator.type===NetworkAgent.InitiatorType.Script){var topFrame=this.initiator.stackTrace[0];if(topFrame.url){type=WebInspector.NetworkRequest.InitiatorType.Script;url=topFrame.url;lineNumber=topFrame.lineNumber;columnNumber=topFrame.columnNumber;}}}
+this._initiatorInfo={type:type,url:url,source:WebInspector.displayNameForURL(url),lineNumber:lineNumber,columnNumber:columnNumber};return this._initiatorInfo;},frames:function()
+{return this._frames;},frame:function(position)
+{return this._frames[position];},addFrameError:function(errorMessage,time)
+{this._pushFrame({errorMessage:errorMessage,time:time});},addFrame:function(response,time,sent)
+{response.time=time;if(sent)
+response.sent=sent;this._pushFrame(response);},_pushFrame:function(frameOrError)
+{if(this._frames.length>=100)
+this._frames.splice(0,10);this._frames.push(frameOrError);},__proto__:WebInspector.Object.prototype}
+WebInspector.UISourceCode=function(project,parentPath,name,originURL,url,contentType,isEditable)
+{this._project=project;this._parentPath=parentPath;this._name=name;this._originURL=originURL;this._url=url;this._contentType=contentType;this._isEditable=isEditable;this._requestContentCallbacks=[];this._consoleMessages=[];this.history=[];if(this.isEditable()&&this._url)
+this._restoreRevisionHistory();}
+WebInspector.UISourceCode.Events={WorkingCopyChanged:"WorkingCopyChanged",WorkingCopyCommitted:"WorkingCopyCommitted",TitleChanged:"TitleChanged",SavedStateUpdated:"SavedStateUpdated",ConsoleMessageAdded:"ConsoleMessageAdded",ConsoleMessageRemoved:"ConsoleMessageRemoved",ConsoleMessagesCleared:"ConsoleMessagesCleared",SourceMappingChanged:"SourceMappingChanged",}
+WebInspector.UISourceCode.prototype={get url()
+{return this._url;},name:function()
+{return this._name;},parentPath:function()
+{return this._parentPath;},path:function()
+{return this._parentPath?this._parentPath+"/"+this._name:this._name;},fullDisplayName:function()
+{return this._project.displayName()+"/"+(this._parentPath?this._parentPath+"/":"")+this.displayName(true);},displayName:function(skipTrim)
+{var displayName=this.name()||WebInspector.UIString("(index)");return skipTrim?displayName:displayName.trimEnd(100);},uri:function()
+{var path=this.path();if(!this._project.id())
+return path;if(!path)
+return this._project.id();return this._project.id()+"/"+path;},originURL:function()
+{return this._originURL;},canRename:function()
+{return this._project.canRename();},rename:function(newName,callback)
+{this._project.rename(this,newName,innerCallback.bind(this));function innerCallback(success,newName,newURL,newOriginURL,newContentType)
+{if(success)
+this._updateName((newName),(newURL),(newOriginURL),(newContentType));callback(success);}},remove:function()
+{this._project.deleteFile(this.path());},_updateName:function(name,url,originURL,contentType)
+{var oldURI=this.uri();this._name=name;if(url)
+this._url=url;if(originURL)
+this._originURL=originURL;if(contentType)
+this._contentType=contentType;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.TitleChanged,oldURI);},contentURL:function()
+{return this.originURL();},contentType:function()
+{return this._contentType;},scriptFile:function()
+{return this._scriptFile;},setScriptFile:function(scriptFile)
+{this._scriptFile=scriptFile;},project:function()
+{return this._project;},requestMetadata:function(callback)
+{this._project.requestMetadata(this,callback);},requestContent:function(callback)
+{if(this._content||this._contentLoaded){callback(this._content);return;}
+this._requestContentCallbacks.push(callback);if(this._requestContentCallbacks.length===1)
+this._project.requestFileContent(this,this._fireContentAvailable.bind(this));},checkContentUpdated:function(callback)
+{if(!this._project.canSetFileContent())
+return;if(this._checkingContent)
+return;this._checkingContent=true;this._project.requestFileContent(this,contentLoaded.bind(this));function contentLoaded(updatedContent)
+{if(updatedContent===null){var workingCopy=this.workingCopy();this._commitContent("",false);this.setWorkingCopy(workingCopy);delete this._checkingContent;if(callback)
+callback();return;}
+if(typeof this._lastAcceptedContent==="string"&&this._lastAcceptedContent===updatedContent){delete this._checkingContent;if(callback)
+callback();return;}
+if(this._content===updatedContent){delete this._lastAcceptedContent;delete this._checkingContent;if(callback)
+callback();return;}
+if(!this.isDirty()){this._commitContent(updatedContent,false);delete this._checkingContent;if(callback)
+callback();return;}
+var shouldUpdate=window.confirm(WebInspector.UIString("This file was changed externally. Would you like to reload it?"));if(shouldUpdate)
+this._commitContent(updatedContent,false);else
+this._lastAcceptedContent=updatedContent;delete this._checkingContent;if(callback)
+callback();}},requestOriginalContent:function(callback)
+{this._project.requestFileContent(this,callback);},_commitContent:function(content,shouldSetContentInProject)
+{delete this._lastAcceptedContent;this._content=content;this._contentLoaded=true;var lastRevision=this.history.length?this.history[this.history.length-1]:null;if(!lastRevision||lastRevision._content!==this._content){var revision=new WebInspector.Revision(this,this._content,new Date());this.history.push(revision);revision._persist();}
+this._innerResetWorkingCopy();this._hasCommittedChanges=true;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyCommitted);if(this._url&&WebInspector.fileManager.isURLSaved(this._url))
+this._saveURLWithFileManager(false,this._content);if(shouldSetContentInProject)
+this._project.setFileContent(this,this._content,function(){});},_saveURLWithFileManager:function(forceSaveAs,content)
+{WebInspector.fileManager.save(this._url,(content),forceSaveAs,callback.bind(this));WebInspector.fileManager.close(this._url);function callback(accepted)
+{if(!accepted)
+return;this._savedWithFileManager=true;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.SavedStateUpdated);}},saveToFileSystem:function(forceSaveAs)
+{if(this.isDirty()){this._saveURLWithFileManager(forceSaveAs,this.workingCopy());this.commitWorkingCopy(function(){});return;}
+this.requestContent(this._saveURLWithFileManager.bind(this,forceSaveAs));},hasUnsavedCommittedChanges:function()
+{if(this._savedWithFileManager||this.project().canSetFileContent()||!this._isEditable)
+return false;if(this._project.workspace().hasResourceContentTrackingExtensions())
+return false;return!!this._hasCommittedChanges;},addRevision:function(content)
+{this._commitContent(content,true);},_restoreRevisionHistory:function()
+{if(!window.localStorage)
+return;var registry=WebInspector.Revision._revisionHistoryRegistry();var historyItems=registry[this.url];if(!historyItems)
+return;function filterOutStale(historyItem)
+{if(!WebInspector.resourceTreeModel.mainFrame)
+return false;return historyItem.loaderId===WebInspector.resourceTreeModel.mainFrame.loaderId;}
+historyItems=historyItems.filter(filterOutStale);if(!historyItems.length)
+return;for(var i=0;i<historyItems.length;++i){var content=window.localStorage[historyItems[i].key];var timestamp=new Date(historyItems[i].timestamp);var revision=new WebInspector.Revision(this,content,timestamp);this.history.push(revision);}
+this._content=this.history[this.history.length-1].content;this._hasCommittedChanges=true;this._contentLoaded=true;},_clearRevisionHistory:function()
+{if(!window.localStorage)
+return;var registry=WebInspector.Revision._revisionHistoryRegistry();var historyItems=registry[this.url];for(var i=0;historyItems&&i<historyItems.length;++i)
+delete window.localStorage[historyItems[i].key];delete registry[this.url];window.localStorage["revision-history"]=JSON.stringify(registry);},revertToOriginal:function()
+{function callback(content)
+{if(typeof content!=="string")
+return;this.addRevision(content);}
+this.requestOriginalContent(callback.bind(this));WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.ApplyOriginalContent,url:this.url});},revertAndClearHistory:function(callback)
+{function revert(content)
+{if(typeof content!=="string")
+return;this.addRevision(content);this._clearRevisionHistory();this.history=[];callback(this);}
+this.requestOriginalContent(revert.bind(this));WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.RevertRevision,url:this.url});},isEditable:function()
+{return this._isEditable;},workingCopy:function()
+{if(this._workingCopyGetter){this._workingCopy=this._workingCopyGetter();delete this._workingCopyGetter;}
+if(this.isDirty())
+return this._workingCopy;return this._content;},resetWorkingCopy:function()
+{this._innerResetWorkingCopy();this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);},_innerResetWorkingCopy:function()
+{delete this._workingCopy;delete this._workingCopyGetter;},setWorkingCopy:function(newWorkingCopy)
+{this._workingCopy=newWorkingCopy;delete this._workingCopyGetter;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);},setWorkingCopyGetter:function(workingCopyGetter)
+{this._workingCopyGetter=workingCopyGetter;this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);},removeWorkingCopyGetter:function()
+{if(!this._workingCopyGetter)
+return;this._workingCopy=this._workingCopyGetter();delete this._workingCopyGetter;},commitWorkingCopy:function(callback)
+{if(!this.isDirty()){callback(null);return;}
+this._commitContent(this.workingCopy(),true);callback(null);WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.FileSaved,url:this.url});},isDirty:function()
+{return typeof this._workingCopy!=="undefined"||typeof this._workingCopyGetter!=="undefined";},highlighterType:function()
+{var lastIndexOfDot=this._name.lastIndexOf(".");var extension=lastIndexOfDot!==-1?this._name.substr(lastIndexOfDot+1):"";var indexOfQuestionMark=extension.indexOf("?");if(indexOfQuestionMark!==-1)
+extension=extension.substr(0,indexOfQuestionMark);var mimeType=WebInspector.ResourceType.mimeTypesForExtensions[extension.toLowerCase()];return mimeType||this.contentType().canonicalMimeType();},content:function()
+{return this._content;},searchInContent:function(query,caseSensitive,isRegex,callback)
+{var content=this.content();if(content){var provider=new WebInspector.StaticContentProvider(this.contentType(),content);provider.searchInContent(query,caseSensitive,isRegex,callback);return;}
+this._project.searchInFileContent(this,query,caseSensitive,isRegex,callback);},_fireContentAvailable:function(content)
+{this._contentLoaded=true;this._content=content;var callbacks=this._requestContentCallbacks.slice();this._requestContentCallbacks=[];for(var i=0;i<callbacks.length;++i)
+callbacks[i](content);},contentLoaded:function()
+{return this._contentLoaded;},uiLocationToRawLocation:function(lineNumber,columnNumber)
+{if(!this._sourceMapping)
+return null;return this._sourceMapping.uiLocationToRawLocation(this,lineNumber,columnNumber);},consoleMessages:function()
+{return this._consoleMessages;},consoleMessageAdded:function(message)
+{this._consoleMessages.push(message);this.dispatchEventToListeners(WebInspector.UISourceCode.Events.ConsoleMessageAdded,message);},consoleMessageRemoved:function(message)
+{this._consoleMessages.remove(message);this.dispatchEventToListeners(WebInspector.UISourceCode.Events.ConsoleMessageRemoved,message);},consoleMessagesCleared:function()
+{this._consoleMessages=[];this.dispatchEventToListeners(WebInspector.UISourceCode.Events.ConsoleMessagesCleared);},hasSourceMapping:function()
+{return!!this._sourceMapping;},setSourceMapping:function(sourceMapping)
+{if(this._sourceMapping===sourceMapping)
+return;this._sourceMapping=sourceMapping;var data={};data.isIdentity=this._sourceMapping&&this._sourceMapping.isIdentity();this.dispatchEventToListeners(WebInspector.UISourceCode.Events.SourceMappingChanged,data);},__proto__:WebInspector.Object.prototype}
+WebInspector.UILocation=function(uiSourceCode,lineNumber,columnNumber)
+{this.uiSourceCode=uiSourceCode;this.lineNumber=lineNumber;this.columnNumber=columnNumber;}
+WebInspector.UILocation.prototype={uiLocationToRawLocation:function()
+{return this.uiSourceCode.uiLocationToRawLocation(this.lineNumber,this.columnNumber);},url:function()
+{return this.uiSourceCode.contentURL();},linkText:function()
+{var linkText=this.uiSourceCode.displayName();if(typeof this.lineNumber==="number")
+linkText+=":"+(this.lineNumber+1);return linkText;}}
+WebInspector.RawLocation=function()
+{}
+WebInspector.LiveLocation=function(rawLocation,updateDelegate)
+{this._rawLocation=rawLocation;this._updateDelegate=updateDelegate;}
+WebInspector.LiveLocation.prototype={update:function()
+{var uiLocation=this.uiLocation();if(!uiLocation)
+return;if(this._updateDelegate(uiLocation))
+this.dispose();},rawLocation:function()
+{return this._rawLocation;},uiLocation:function()
+{throw"Not implemented";},dispose:function()
+{}}
+WebInspector.Revision=function(uiSourceCode,content,timestamp)
+{this._uiSourceCode=uiSourceCode;this._content=content;this._timestamp=timestamp;}
+WebInspector.Revision._revisionHistoryRegistry=function()
+{if(!WebInspector.Revision._revisionHistoryRegistryObject){if(window.localStorage){var revisionHistory=window.localStorage["revision-history"];try{WebInspector.Revision._revisionHistoryRegistryObject=revisionHistory?JSON.parse(revisionHistory):{};}catch(e){WebInspector.Revision._revisionHistoryRegistryObject={};}}else
+WebInspector.Revision._revisionHistoryRegistryObject={};}
+return WebInspector.Revision._revisionHistoryRegistryObject;}
+WebInspector.Revision.filterOutStaleRevisions=function()
+{if(!window.localStorage)
+return;var registry=WebInspector.Revision._revisionHistoryRegistry();var filteredRegistry={};for(var url in registry){var historyItems=registry[url];var filteredHistoryItems=[];for(var i=0;historyItems&&i<historyItems.length;++i){var historyItem=historyItems[i];if(historyItem.loaderId===WebInspector.resourceTreeModel.mainFrame.loaderId){filteredHistoryItems.push(historyItem);filteredRegistry[url]=filteredHistoryItems;}else
+delete window.localStorage[historyItem.key];}}
+WebInspector.Revision._revisionHistoryRegistryObject=filteredRegistry;function persist()
+{window.localStorage["revision-history"]=JSON.stringify(filteredRegistry);}
+setTimeout(persist,0);}
+WebInspector.Revision.prototype={get uiSourceCode()
+{return this._uiSourceCode;},get timestamp()
+{return this._timestamp;},get content()
+{return this._content||null;},revertToThis:function()
+{function revert(content)
+{if(this._uiSourceCode._content!==content)
+this._uiSourceCode.addRevision(content);}
+this.requestContent(revert.bind(this));},contentURL:function()
+{return this._uiSourceCode.originURL();},contentType:function()
+{return this._uiSourceCode.contentType();},requestContent:function(callback)
+{callback(this._content||"");},searchInContent:function(query,caseSensitive,isRegex,callback)
+{callback([]);},_persist:function()
+{if(this._uiSourceCode.project().type()===WebInspector.projectTypes.FileSystem)
+return;if(!window.localStorage)
+return;var url=this.contentURL();if(!url||url.startsWith("inspector://"))
+return;var loaderId=WebInspector.resourceTreeModel.mainFrame.loaderId;var timestamp=this.timestamp.getTime();var key="revision-history|"+url+"|"+loaderId+"|"+timestamp;var registry=WebInspector.Revision._revisionHistoryRegistry();var historyItems=registry[url];if(!historyItems){historyItems=[];registry[url]=historyItems;}
+historyItems.push({url:url,loaderId:loaderId,timestamp:timestamp,key:key});function persist()
+{window.localStorage[key]=this._content;window.localStorage["revision-history"]=JSON.stringify(registry);}
+setTimeout(persist.bind(this),0);}}
+WebInspector.CSSStyleModel=function(workspace)
+{this._workspace=workspace;this._pendingCommandsMajorState=[];this._styleLoader=new WebInspector.CSSStyleModel.ComputedStyleLoader(this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.UndoRedoRequested,this._undoRedoRequested,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.UndoRedoCompleted,this._undoRedoCompleted,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameCreatedOrNavigated,this._mainFrameCreatedOrNavigated,this);InspectorBackend.registerCSSDispatcher(new WebInspector.CSSDispatcher(this));CSSAgent.enable(this._wasEnabled.bind(this));this._resetStyleSheets();}
+WebInspector.CSSStyleModel.parseRuleMatchArrayPayload=function(matchArray)
+{if(!matchArray)
+return[];var result=[];for(var i=0;i<matchArray.length;++i)
+result.push(WebInspector.CSSRule.parsePayload(matchArray[i].rule,matchArray[i].matchingSelectors));return result;}
+WebInspector.CSSStyleModel.Events={ModelWasEnabled:"ModelWasEnabled",StyleSheetAdded:"StyleSheetAdded",StyleSheetChanged:"StyleSheetChanged",StyleSheetRemoved:"StyleSheetRemoved",MediaQueryResultChanged:"MediaQueryResultChanged",}
+WebInspector.CSSStyleModel.MediaTypes=["all","braille","embossed","handheld","print","projection","screen","speech","tty","tv"];WebInspector.CSSStyleModel.prototype={isEnabled:function()
+{return this._isEnabled;},_wasEnabled:function()
+{this._isEnabled=true;this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.ModelWasEnabled);},getMatchedStylesAsync:function(nodeId,needPseudo,needInherited,userCallback)
+{function callback(userCallback,error,matchedPayload,pseudoPayload,inheritedPayload)
+{if(error){if(userCallback)
+userCallback(null);return;}
+var result={};result.matchedCSSRules=WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(matchedPayload);result.pseudoElements=[];if(pseudoPayload){for(var i=0;i<pseudoPayload.length;++i){var entryPayload=pseudoPayload[i];result.pseudoElements.push({pseudoId:entryPayload.pseudoId,rules:WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(entryPayload.matches)});}}
+result.inherited=[];if(inheritedPayload){for(var i=0;i<inheritedPayload.length;++i){var entryPayload=inheritedPayload[i];var entry={};if(entryPayload.inlineStyle)
+entry.inlineStyle=WebInspector.CSSStyleDeclaration.parsePayload(entryPayload.inlineStyle);if(entryPayload.matchedCSSRules)
+entry.matchedCSSRules=WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(entryPayload.matchedCSSRules);result.inherited.push(entry);}}
+if(userCallback)
+userCallback(result);}
+CSSAgent.getMatchedStylesForNode(nodeId,needPseudo,needInherited,callback.bind(null,userCallback));},getComputedStyleAsync:function(nodeId,userCallback)
+{this._styleLoader.getComputedStyle(nodeId,userCallback);},getPlatformFontsForNode:function(nodeId,callback)
+{function platformFontsCallback(error,cssFamilyName,fonts)
+{if(error)
+callback(null,null);else
+callback(cssFamilyName,fonts);}
+CSSAgent.getPlatformFontsForNode(nodeId,platformFontsCallback);},allStyleSheets:function()
+{var values=Object.values(this._styleSheetIdToHeader);function styleSheetComparator(a,b)
+{if(a.sourceURL<b.sourceURL)
+return-1;else if(a.sourceURL>b.sourceURL)
+return 1;return a.startLine-b.startLine||a.startColumn-b.startColumn;}
+values.sort(styleSheetComparator);return values;},getInlineStylesAsync:function(nodeId,userCallback)
+{function callback(userCallback,error,inlinePayload,attributesStylePayload)
+{if(error||!inlinePayload)
+userCallback(null,null);else
+userCallback(WebInspector.CSSStyleDeclaration.parsePayload(inlinePayload),attributesStylePayload?WebInspector.CSSStyleDeclaration.parsePayload(attributesStylePayload):null);}
+CSSAgent.getInlineStylesForNode(nodeId,callback.bind(null,userCallback));},forcePseudoState:function(nodeId,forcedPseudoClasses,userCallback)
+{CSSAgent.forcePseudoState(nodeId,forcedPseudoClasses||[],userCallback);},setRuleSelector:function(ruleId,nodeId,newSelector,successCallback,failureCallback)
+{function callback(nodeId,successCallback,failureCallback,newSelector,error,rulePayload)
+{this._pendingCommandsMajorState.pop();if(error){failureCallback();return;}
+WebInspector.domModel.markUndoableState();this._computeMatchingSelectors(rulePayload,nodeId,successCallback,failureCallback);}
+this._pendingCommandsMajorState.push(true);CSSAgent.setRuleSelector(ruleId,newSelector,callback.bind(this,nodeId,successCallback,failureCallback,newSelector));},_computeMatchingSelectors:function(rulePayload,nodeId,successCallback,failureCallback)
+{var ownerDocumentId=this._ownerDocumentId(nodeId);if(!ownerDocumentId){failureCallback();return;}
+var rule=WebInspector.CSSRule.parsePayload(rulePayload);var matchingSelectors=[];var allSelectorsBarrier=new CallbackBarrier();for(var i=0;i<rule.selectors.length;++i){var selector=rule.selectors[i];var boundCallback=allSelectorsBarrier.createCallback(selectorQueried.bind(null,i,nodeId,matchingSelectors));WebInspector.domModel.querySelectorAll(ownerDocumentId,selector.value,boundCallback);}
+allSelectorsBarrier.callWhenDone(function(){rule.matchingSelectors=matchingSelectors;successCallback(rule);});function selectorQueried(index,nodeId,matchingSelectors,matchingNodeIds)
+{if(!matchingNodeIds)
+return;if(matchingNodeIds.indexOf(nodeId)!==-1)
+matchingSelectors.push(index);}},addRule:function(styleSheetId,node,selector,successCallback,failureCallback)
+{this._pendingCommandsMajorState.push(true);CSSAgent.addRule(styleSheetId,selector,callback.bind(this));function callback(error,rulePayload)
+{this._pendingCommandsMajorState.pop();if(error){failureCallback();}else{WebInspector.domModel.markUndoableState();this._computeMatchingSelectors(rulePayload,node.id,successCallback,failureCallback);}}},requestViaInspectorStylesheet:function(node,callback)
+{var frameId=node.frameId()||WebInspector.resourceTreeModel.mainFrame.id;for(var styleSheetId in this._styleSheetIdToHeader){var styleSheetHeader=this._styleSheetIdToHeader[styleSheetId];if(styleSheetHeader.frameId===frameId&&styleSheetHeader.isViaInspector()){callback(styleSheetHeader);return;}}
+function innerCallback(error,styleSheetId)
+{if(error){console.error(error);callback(null);}
+callback(this._styleSheetIdToHeader[styleSheetId]);}
+CSSAgent.createStyleSheet(frameId,innerCallback.bind(this));},mediaQueryResultChanged:function()
+{this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged);},styleSheetHeaderForId:function(id)
+{return this._styleSheetIdToHeader[id];},styleSheetHeaders:function()
+{return Object.values(this._styleSheetIdToHeader);},_ownerDocumentId:function(nodeId)
+{var node=WebInspector.domModel.nodeForId(nodeId);if(!node)
+return null;return node.ownerDocument?node.ownerDocument.id:null;},_fireStyleSheetChanged:function(styleSheetId)
+{if(!this._pendingCommandsMajorState.length)
+return;var majorChange=this._pendingCommandsMajorState[this._pendingCommandsMajorState.length-1];if(!styleSheetId||!this.hasEventListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged))
+return;this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged,{styleSheetId:styleSheetId,majorChange:majorChange});},_styleSheetAdded:function(header)
+{console.assert(!this._styleSheetIdToHeader[header.styleSheetId]);var styleSheetHeader=new WebInspector.CSSStyleSheetHeader(header);this._styleSheetIdToHeader[header.styleSheetId]=styleSheetHeader;var url=styleSheetHeader.resourceURL();if(!this._styleSheetIdsForURL[url])
+this._styleSheetIdsForURL[url]={};var frameIdToStyleSheetIds=this._styleSheetIdsForURL[url];var styleSheetIds=frameIdToStyleSheetIds[styleSheetHeader.frameId];if(!styleSheetIds){styleSheetIds=[];frameIdToStyleSheetIds[styleSheetHeader.frameId]=styleSheetIds;}
+styleSheetIds.push(styleSheetHeader.id);this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetAdded,styleSheetHeader);},_styleSheetRemoved:function(id)
+{var header=this._styleSheetIdToHeader[id];console.assert(header);if(!header)
+return;delete this._styleSheetIdToHeader[id];var url=header.resourceURL();var frameIdToStyleSheetIds=this._styleSheetIdsForURL[url];frameIdToStyleSheetIds[header.frameId].remove(id);if(!frameIdToStyleSheetIds[header.frameId].length){delete frameIdToStyleSheetIds[header.frameId];if(!Object.keys(this._styleSheetIdsForURL[url]).length)
+delete this._styleSheetIdsForURL[url];}
+this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,header);},styleSheetIdsForURL:function(url)
+{var frameIdToStyleSheetIds=this._styleSheetIdsForURL[url];if(!frameIdToStyleSheetIds)
+return[];var result=[];for(var frameId in frameIdToStyleSheetIds)
+result=result.concat(frameIdToStyleSheetIds[frameId]);return result;},styleSheetIdsByFrameIdForURL:function(url)
+{var styleSheetIdsForFrame=this._styleSheetIdsForURL[url];if(!styleSheetIdsForFrame)
+return{};return styleSheetIdsForFrame;},setStyleSheetText:function(styleSheetId,newText,majorChange,userCallback)
+{var header=this._styleSheetIdToHeader[styleSheetId];console.assert(header);this._pendingCommandsMajorState.push(majorChange);header.setContent(newText,callback.bind(this));function callback(error)
+{this._pendingCommandsMajorState.pop();if(!error&&majorChange)
+WebInspector.domModel.markUndoableState();if(!error&&userCallback)
+userCallback(error);}},_undoRedoRequested:function()
+{this._pendingCommandsMajorState.push(true);},_undoRedoCompleted:function()
+{this._pendingCommandsMajorState.pop();},_mainFrameCreatedOrNavigated:function()
+{this._resetStyleSheets();},_resetStyleSheets:function()
+{this._styleSheetIdsForURL={};this._styleSheetIdToHeader={};},updateLocations:function()
+{var headers=Object.values(this._styleSheetIdToHeader);for(var i=0;i<headers.length;++i)
+headers[i].updateLocations();},createLiveLocation:function(styleSheetId,rawLocation,updateDelegate)
+{if(!rawLocation)
+return null;var header=styleSheetId?this.styleSheetHeaderForId(styleSheetId):null;return new WebInspector.CSSStyleModel.LiveLocation(this,header,rawLocation,updateDelegate);},rawLocationToUILocation:function(rawLocation)
+{var frameIdToSheetIds=this._styleSheetIdsForURL[rawLocation.url];if(!frameIdToSheetIds)
+return null;var styleSheetIds=[];for(var frameId in frameIdToSheetIds)
+styleSheetIds=styleSheetIds.concat(frameIdToSheetIds[frameId]);var uiLocation;for(var i=0;!uiLocation&&i<styleSheetIds.length;++i){var header=this.styleSheetHeaderForId(styleSheetIds[i]);console.assert(header);uiLocation=header.rawLocationToUILocation(rawLocation.lineNumber,rawLocation.columnNumber);}
+return uiLocation||null;},__proto__:WebInspector.Object.prototype}
+WebInspector.CSSStyleModel.LiveLocation=function(model,header,rawLocation,updateDelegate)
+{WebInspector.LiveLocation.call(this,rawLocation,updateDelegate);this._model=model;if(!header)
+this._clearStyleSheet();else
+this._setStyleSheet(header);}
+WebInspector.CSSStyleModel.LiveLocation.prototype={_styleSheetAdded:function(event)
+{console.assert(!this._header);var header=(event.data);if(header.sourceURL&&header.sourceURL===this.rawLocation().url)
+this._setStyleSheet(header);},_styleSheetRemoved:function(event)
+{console.assert(this._header);var header=(event.data);if(this._header!==header)
+return;this._header._removeLocation(this);this._clearStyleSheet();},_setStyleSheet:function(header)
+{this._header=header;this._header.addLiveLocation(this);this._model.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);this._model.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);},_clearStyleSheet:function()
+{delete this._header;this._model.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);this._model.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);},uiLocation:function()
+{var cssLocation=(this.rawLocation());if(this._header)
+return this._header.rawLocationToUILocation(cssLocation.lineNumber,cssLocation.columnNumber);var uiSourceCode=WebInspector.workspace.uiSourceCodeForURL(cssLocation.url);if(!uiSourceCode)
+return null;return new WebInspector.UILocation(uiSourceCode,cssLocation.lineNumber,cssLocation.columnNumber);},dispose:function()
+{WebInspector.LiveLocation.prototype.dispose.call(this);this._model.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);this._model.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);},__proto__:WebInspector.LiveLocation.prototype}
+WebInspector.CSSLocation=function(url,lineNumber,columnNumber)
+{this.url=url;this.lineNumber=lineNumber;this.columnNumber=columnNumber||0;}
+WebInspector.CSSStyleDeclaration=function(payload)
+{this.id=payload.styleId;this.width=payload.width;this.height=payload.height;this.range=payload.range;this._shorthandValues=WebInspector.CSSStyleDeclaration.buildShorthandValueMap(payload.shorthandEntries);this._livePropertyMap={};this._allProperties=[];this.__disabledProperties={};var payloadPropertyCount=payload.cssProperties.length;for(var i=0;i<payloadPropertyCount;++i){var property=WebInspector.CSSProperty.parsePayload(this,i,payload.cssProperties[i]);this._allProperties.push(property);}
+this._computeActiveProperties();var propertyIndex=0;for(var i=0;i<this._allProperties.length;++i){var property=this._allProperties[i];if(property.disabled)
+this.__disabledProperties[i]=property;if(!property.active&&!property.styleBased)
+continue;var name=property.name;this[propertyIndex]=name;this._livePropertyMap[name]=property;++propertyIndex;}
+this.length=propertyIndex;if("cssText"in payload)
+this.cssText=payload.cssText;}
+WebInspector.CSSStyleDeclaration.buildShorthandValueMap=function(shorthandEntries)
+{var result={};for(var i=0;i<shorthandEntries.length;++i)
+result[shorthandEntries[i].name]=shorthandEntries[i].value;return result;}
+WebInspector.CSSStyleDeclaration.parsePayload=function(payload)
+{return new WebInspector.CSSStyleDeclaration(payload);}
+WebInspector.CSSStyleDeclaration.parseComputedStylePayload=function(payload)
+{var newPayload=({cssProperties:[],shorthandEntries:[],width:"",height:""});if(payload)
+newPayload.cssProperties=(payload);return new WebInspector.CSSStyleDeclaration(newPayload);}
+WebInspector.CSSStyleDeclaration.prototype={_computeActiveProperties:function()
+{var activeProperties={};for(var i=this._allProperties.length-1;i>=0;--i){var property=this._allProperties[i];if(property.styleBased||property.disabled)
+continue;property._setActive(false);if(!property.parsedOk)
+continue;var canonicalName=WebInspector.CSSMetadata.canonicalPropertyName(property.name);var activeProperty=activeProperties[canonicalName];if(!activeProperty||(!activeProperty.important&&property.important))
+activeProperties[canonicalName]=property;}
+for(var propertyName in activeProperties){var property=activeProperties[propertyName];property._setActive(true);}},get allProperties()
+{return this._allProperties;},getLiveProperty:function(name)
+{return this._livePropertyMap[name]||null;},getPropertyValue:function(name)
+{var property=this._livePropertyMap[name];return property?property.value:"";},isPropertyImplicit:function(name)
+{var property=this._livePropertyMap[name];return property?property.implicit:"";},longhandProperties:function(name)
+{var longhands=WebInspector.CSSMetadata.cssPropertiesMetainfo.longhands(name);var result=[];for(var i=0;longhands&&i<longhands.length;++i){var property=this._livePropertyMap[longhands[i]];if(property)
+result.push(property);}
+return result;},shorthandValue:function(shorthandProperty)
+{return this._shorthandValues[shorthandProperty];},propertyAt:function(index)
+{return(index<this.allProperties.length)?this.allProperties[index]:null;},pastLastSourcePropertyIndex:function()
+{for(var i=this.allProperties.length-1;i>=0;--i){if(this.allProperties[i].range)
+return i+1;}
+return 0;},newBlankProperty:function(index)
+{index=(typeof index==="undefined")?this.pastLastSourcePropertyIndex():index;var property=new WebInspector.CSSProperty(this,index,"","",false,false,true,false,"");property._setActive(true);return property;},insertPropertyAt:function(index,name,value,userCallback)
+{function callback(error,payload)
+{WebInspector.cssModel._pendingCommandsMajorState.pop();if(!userCallback)
+return;if(error){console.error(error);userCallback(null);}else
+userCallback(WebInspector.CSSStyleDeclaration.parsePayload(payload));}
+if(!this.id)
+throw"No style id";WebInspector.cssModel._pendingCommandsMajorState.push(true);CSSAgent.setPropertyText(this.id,index,name+": "+value+";",false,callback);},appendProperty:function(name,value,userCallback)
+{this.insertPropertyAt(this.allProperties.length,name,value,userCallback);},}
+WebInspector.CSSRule=function(payload,matchingSelectors)
+{this.id=payload.ruleId;if(matchingSelectors)
+this.matchingSelectors=matchingSelectors;this.selectors=payload.selectorList.selectors;this.selectorText=this.selectors.select("value").join(", ");var firstRange=this.selectors[0].range;if(firstRange){var lastRange=this.selectors.peekLast().range;this.selectorRange=new WebInspector.TextRange(firstRange.startLine,firstRange.startColumn,lastRange.endLine,lastRange.endColumn);}
+this.sourceURL=payload.sourceURL;this.origin=payload.origin;this.style=WebInspector.CSSStyleDeclaration.parsePayload(payload.style);this.style.parentRule=this;if(payload.media)
+this.media=WebInspector.CSSMedia.parseMediaArrayPayload(payload.media);this._setRawLocationAndFrameId();}
+WebInspector.CSSRule.parsePayload=function(payload,matchingIndices)
+{return new WebInspector.CSSRule(payload,matchingIndices);}
+WebInspector.CSSRule.prototype={_setRawLocationAndFrameId:function()
+{if(!this.id)
+return;var styleSheetHeader=WebInspector.cssModel.styleSheetHeaderForId(this.id.styleSheetId);this.frameId=styleSheetHeader.frameId;var url=styleSheetHeader.resourceURL();if(!url)
+return;this.rawLocation=new WebInspector.CSSLocation(url,this.lineNumberInSource(0),this.columnNumberInSource(0));},resourceURL:function()
+{if(!this.id)
+return"";var styleSheetHeader=WebInspector.cssModel.styleSheetHeaderForId(this.id.styleSheetId);return styleSheetHeader.resourceURL();},lineNumberInSource:function(selectorIndex)
+{var selector=this.selectors[selectorIndex];if(!selector||!selector.range)
+return 0;var styleSheetHeader=WebInspector.cssModel.styleSheetHeaderForId(this.id.styleSheetId);return styleSheetHeader.lineNumberInSource(selector.range.startLine);},columnNumberInSource:function(selectorIndex)
+{var selector=this.selectors[selectorIndex];if(!selector||!selector.range)
+return undefined;var styleSheetHeader=WebInspector.cssModel.styleSheetHeaderForId(this.id.styleSheetId);console.assert(styleSheetHeader);return styleSheetHeader.columnNumberInSource(selector.range.startLine,selector.range.startColumn);},get isUserAgent()
+{return this.origin==="user-agent";},get isUser()
+{return this.origin==="user";},get isViaInspector()
+{return this.origin==="inspector";},get isRegular()
+{return this.origin==="regular";}}
+WebInspector.CSSProperty=function(ownerStyle,index,name,value,important,disabled,parsedOk,implicit,text,range)
+{this.ownerStyle=ownerStyle;this.index=index;this.name=name;this.value=value;this.important=important;this.disabled=disabled;this.parsedOk=parsedOk;this.implicit=implicit;this.text=text;this.range=range;}
+WebInspector.CSSProperty.parsePayload=function(ownerStyle,index,payload)
+{var result=new WebInspector.CSSProperty(ownerStyle,index,payload.name,payload.value,payload.important||false,payload.disabled||false,("parsedOk"in payload)?!!payload.parsedOk:true,!!payload.implicit,payload.text,payload.range);return result;}
+WebInspector.CSSProperty.prototype={_setActive:function(active)
+{this._active=active;},get propertyText()
+{if(this.text!==undefined)
+return this.text;if(this.name==="")
+return"";return this.name+": "+this.value+(this.important?" !important":"")+";";},get isLive()
+{return this.active||this.styleBased;},get active()
+{return typeof this._active==="boolean"&&this._active;},get styleBased()
+{return!this.range;},get inactive()
+{return typeof this._active==="boolean"&&!this._active;},setText:function(propertyText,majorChange,overwrite,userCallback)
+{function enabledCallback(style)
+{if(userCallback)
+userCallback(style);}
+function callback(error,stylePayload)
+{WebInspector.cssModel._pendingCommandsMajorState.pop();if(!error){if(majorChange)
+WebInspector.domModel.markUndoableState();var style=WebInspector.CSSStyleDeclaration.parsePayload(stylePayload);var newProperty=style.allProperties[this.index];if(newProperty&&this.disabled&&!propertyText.match(/^\s*$/)){newProperty.setDisabled(false,enabledCallback);return;}
+if(userCallback)
+userCallback(style);}else{if(userCallback)
+userCallback(null);}}
+if(!this.ownerStyle)
+throw"No ownerStyle for property";if(!this.ownerStyle.id)
+throw"No owner style id";WebInspector.cssModel._pendingCommandsMajorState.push(majorChange);CSSAgent.setPropertyText(this.ownerStyle.id,this.index,propertyText,overwrite,callback.bind(this));},setValue:function(newValue,majorChange,overwrite,userCallback)
+{var text=this.name+": "+newValue+(this.important?" !important":"")+";"
+this.setText(text,majorChange,overwrite,userCallback);},setDisabled:function(disabled,userCallback)
+{if(!this.ownerStyle&&userCallback)
+userCallback(null);if(disabled===this.disabled){if(userCallback)
+userCallback(this.ownerStyle);return;}
+if(disabled)
+this.setText("/* "+this.text+" */",true,true,userCallback);else
+this.setText(this.text.substring(2,this.text.length-2).trim(),true,true,userCallback);},uiLocation:function(forName)
+{if(!this.range||!this.ownerStyle||!this.ownerStyle.parentRule)
+return null;var url=this.ownerStyle.parentRule.resourceURL();if(!url)
+return null;var range=this.range;var line=forName?range.startLine:range.endLine;var column=forName?range.startColumn:range.endColumn-(this.text&&this.text.endsWith(";")?2:1);var rawLocation=new WebInspector.CSSLocation(url,line,column);return WebInspector.cssModel.rawLocationToUILocation(rawLocation);}}
+WebInspector.CSSMedia=function(payload)
+{this.text=payload.text;this.source=payload.source;this.sourceURL=payload.sourceURL||"";this.range=payload.range?WebInspector.TextRange.fromObject(payload.range):null;this.parentStyleSheetId=payload.parentStyleSheetId;}
+WebInspector.CSSMedia.Source={LINKED_SHEET:"linkedSheet",INLINE_SHEET:"inlineSheet",MEDIA_RULE:"mediaRule",IMPORT_RULE:"importRule"};WebInspector.CSSMedia.parsePayload=function(payload)
+{return new WebInspector.CSSMedia(payload);}
+WebInspector.CSSMedia.parseMediaArrayPayload=function(payload)
+{var result=[];for(var i=0;i<payload.length;++i)
+result.push(WebInspector.CSSMedia.parsePayload(payload[i]));return result;}
+WebInspector.CSSMedia.prototype={lineNumberInSource:function()
+{if(!this.range)
+return undefined;var header=this.header();if(!header)
+return undefined;return header.lineNumberInSource(this.range.startLine);},columnNumberInSource:function()
+{if(!this.range)
+return undefined;var header=this.header();if(!header)
+return undefined;return header.columnNumberInSource(this.range.startLine,this.range.startColumn);},header:function()
+{return this.parentStyleSheetId?WebInspector.cssModel.styleSheetHeaderForId(this.parentStyleSheetId):null;}}
+WebInspector.CSSStyleSheetHeader=function(payload)
+{this.id=payload.styleSheetId;this.frameId=payload.frameId;this.sourceURL=payload.sourceURL;this.hasSourceURL=!!payload.hasSourceURL;this.sourceMapURL=payload.sourceMapURL;this.origin=payload.origin;this.title=payload.title;this.disabled=payload.disabled;this.isInline=payload.isInline;this.startLine=payload.startLine;this.startColumn=payload.startColumn;this._locations=new Set();this._sourceMappings=[];}
+WebInspector.CSSStyleSheetHeader.prototype={resourceURL:function()
+{return this.isViaInspector()?this._viaInspectorResourceURL():this.sourceURL;},addLiveLocation:function(location)
+{this._locations.add(location);location.update();},updateLocations:function()
+{var items=this._locations.items();for(var i=0;i<items.length;++i)
+items[i].update();},_removeLocation:function(location)
+{this._locations.remove(location);},rawLocationToUILocation:function(lineNumber,columnNumber)
+{var uiLocation=null;var rawLocation=new WebInspector.CSSLocation(this.resourceURL(),lineNumber,columnNumber);for(var i=this._sourceMappings.length-1;!uiLocation&&i>=0;--i)
+uiLocation=this._sourceMappings[i].rawLocationToUILocation(rawLocation);return uiLocation;},pushSourceMapping:function(sourceMapping)
+{this._sourceMappings.push(sourceMapping);this.updateLocations();},_viaInspectorResourceURL:function()
+{var frame=WebInspector.resourceTreeModel.frameForId(this.frameId);console.assert(frame);var parsedURL=new WebInspector.ParsedURL(frame.url);var fakeURL="inspector://"+parsedURL.host+parsedURL.folderPathComponents;if(!fakeURL.endsWith("/"))
+fakeURL+="/";fakeURL+="inspector-stylesheet";return fakeURL;},lineNumberInSource:function(lineNumberInStyleSheet)
+{return this.startLine+lineNumberInStyleSheet;},columnNumberInSource:function(lineNumberInStyleSheet,columnNumberInStyleSheet)
+{return(lineNumberInStyleSheet?0:this.startColumn)+columnNumberInStyleSheet;},contentURL:function()
+{return this.resourceURL();},contentType:function()
+{return WebInspector.resourceTypes.Stylesheet;},_trimSourceURL:function(text)
+{var sourceURLRegex=/\n[\040\t]*\/\*[#@][\040\t]sourceURL=[\040\t]*([^\s]*)[\040\t]*\*\/[\040\t]*$/mg;return text.replace(sourceURLRegex,"");},requestContent:function(callback)
+{CSSAgent.getStyleSheetText(this.id,textCallback.bind(this));function textCallback(error,text)
+{if(error){WebInspector.console.log("Failed to get text for stylesheet "+this.id+": "+error);text="";}
+text=this._trimSourceURL(text);callback(text);}},searchInContent:function(query,caseSensitive,isRegex,callback)
+{function performSearch(content)
+{callback(WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex));}
+this.requestContent(performSearch);},setContent:function(newText,callback)
+{newText=this._trimSourceURL(newText);if(this.hasSourceURL)
+newText+="\n/*# sourceURL="+this.sourceURL+" */";CSSAgent.setStyleSheetText(this.id,newText,callback);},isViaInspector:function()
+{return this.origin==="inspector";},}
+WebInspector.CSSDispatcher=function(cssModel)
+{this._cssModel=cssModel;}
+WebInspector.CSSDispatcher.prototype={mediaQueryResultChanged:function()
+{this._cssModel.mediaQueryResultChanged();},styleSheetChanged:function(styleSheetId)
+{this._cssModel._fireStyleSheetChanged(styleSheetId);},styleSheetAdded:function(header)
+{this._cssModel._styleSheetAdded(header);},styleSheetRemoved:function(id)
+{this._cssModel._styleSheetRemoved(id);},}
+WebInspector.CSSStyleModel.ComputedStyleLoader=function(cssModel)
+{this._cssModel=cssModel;this._nodeIdToCallbackData={};}
+WebInspector.CSSStyleModel.ComputedStyleLoader.prototype={getComputedStyle:function(nodeId,userCallback)
+{if(this._nodeIdToCallbackData[nodeId]){this._nodeIdToCallbackData[nodeId].push(userCallback);return;}
+this._nodeIdToCallbackData[nodeId]=[userCallback];CSSAgent.getComputedStyleForNode(nodeId,resultCallback.bind(this,nodeId));function resultCallback(nodeId,error,computedPayload)
+{var computedStyle=(error||!computedPayload)?null:WebInspector.CSSStyleDeclaration.parseComputedStylePayload(computedPayload);var callbacks=this._nodeIdToCallbackData[nodeId];if(!callbacks)
+return;delete this._nodeIdToCallbackData[nodeId];for(var i=0;i<callbacks.length;++i)
+callbacks[i](computedStyle);}}}
+WebInspector.cssModel;WebInspector.CSSParser=function()
+{this._worker=new Worker("ScriptFormatterWorker.js");this._worker.onmessage=this._onRuleChunk.bind(this);this._rules=[];}
+WebInspector.CSSParser.Events={RulesParsed:"RulesParsed"}
+WebInspector.CSSParser.prototype={fetchAndParse:function(styleSheetHeader,callback)
+{this._lock();this._finishedCallback=callback;styleSheetHeader.requestContent(this._innerParse.bind(this));},parse:function(text,callback)
+{this._lock();this._finishedCallback=callback;this._innerParse(text);},dispose:function()
+{if(this._worker){this._worker.terminate();delete this._worker;}},rules:function()
+{return this._rules;},_lock:function()
+{console.assert(!this._parsingStyleSheet,"Received request to parse stylesheet before previous was completed.");this._parsingStyleSheet=true;},_unlock:function()
+{delete this._parsingStyleSheet;},_innerParse:function(text)
+{this._rules=[];this._worker.postMessage({method:"parseCSS",params:{content:text}});},_onRuleChunk:function(event)
+{var data=(event.data);var chunk=data.chunk;for(var i=0;i<chunk.length;++i)
+this._rules.push(chunk[i]);if(data.isLastChunk)
+this._onFinishedParsing();this.dispatchEventToListeners(WebInspector.CSSParser.Events.RulesParsed);},_onFinishedParsing:function()
+{this._unlock();if(this._finishedCallback)
+this._finishedCallback(this._rules);},__proto__:WebInspector.Object.prototype,}
+WebInspector.CSSParser.DataChunk;WebInspector.CSSParser.StyleRule;WebInspector.CSSParser.AtRule;WebInspector.CSSParser.Rule;WebInspector.CSSParser.Property;WebInspector.NetworkManager=function(target)
+{WebInspector.Object.call(this);this._dispatcher=new WebInspector.NetworkDispatcher(this);this._target=target;this._networkAgent=target.networkAgent();target.registerNetworkDispatcher(this._dispatcher);if(WebInspector.settings.cacheDisabled.get())
+this._networkAgent.setCacheDisabled(true);this._networkAgent.enable();WebInspector.settings.cacheDisabled.addChangeListener(this._cacheDisabledSettingChanged,this);}
+WebInspector.NetworkManager.EventTypes={RequestStarted:"RequestStarted",RequestUpdated:"RequestUpdated",RequestFinished:"RequestFinished",RequestUpdateDropped:"RequestUpdateDropped"}
+WebInspector.NetworkManager._MIMETypes={"text/html":{"document":true},"text/xml":{"document":true},"text/plain":{"document":true},"application/xhtml+xml":{"document":true},"text/css":{"stylesheet":true},"text/xsl":{"stylesheet":true},"image/jpg":{"image":true},"image/jpeg":{"image":true},"image/pjpeg":{"image":true},"image/png":{"image":true},"image/gif":{"image":true},"image/bmp":{"image":true},"image/svg+xml":{"image":true,"font":true,"document":true},"image/vnd.microsoft.icon":{"image":true},"image/webp":{"image":true},"image/x-icon":{"image":true},"image/x-xbitmap":{"image":true},"font/ttf":{"font":true},"font/otf":{"font":true},"font/woff":{"font":true},"font/woff2":{"font":true},"font/truetype":{"font":true},"font/opentype":{"font":true},"application/octet-stream":{"font":true,"image":true},"application/font-woff":{"font":true},"application/x-font-woff":{"font":true},"application/x-font-type1":{"font":true},"application/x-font-ttf":{"font":true},"application/x-truetype-font":{"font":true},"text/javascript":{"script":true},"text/ecmascript":{"script":true},"application/javascript":{"script":true},"application/ecmascript":{"script":true},"application/x-javascript":{"script":true},"application/json":{"script":true},"text/javascript1.1":{"script":true},"text/javascript1.2":{"script":true},"text/javascript1.3":{"script":true},"text/jscript":{"script":true},"text/livescript":{"script":true},}
+WebInspector.NetworkManager.prototype={inflightRequestForURL:function(url)
+{return this._dispatcher._inflightRequestsByURL[url];},_cacheDisabledSettingChanged:function(event)
+{var enabled=(event.data);this._networkAgent.setCacheDisabled(enabled);},__proto__:WebInspector.Object.prototype}
+WebInspector.NetworkDispatcher=function(manager)
+{this._manager=manager;this._inflightRequestsById={};this._inflightRequestsByURL={};}
+WebInspector.NetworkDispatcher.prototype={_headersMapToHeadersArray:function(headersMap)
+{var result=[];for(var name in headersMap){var values=headersMap[name].split("\n");for(var i=0;i<values.length;++i)
+result.push({name:name,value:values[i]});}
+return result;},_updateNetworkRequestWithRequest:function(networkRequest,request)
+{networkRequest.requestMethod=request.method;networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.headers));networkRequest.requestFormData=request.postData;},_updateNetworkRequestWithResponse:function(networkRequest,response)
+{if(!response)
+return;if(response.url&&networkRequest.url!==response.url)
+networkRequest.url=response.url;networkRequest.mimeType=response.mimeType;networkRequest.statusCode=response.status;networkRequest.statusText=response.statusText;networkRequest.responseHeaders=this._headersMapToHeadersArray(response.headers);if(response.encodedDataLength>=0)
+networkRequest.setTransferSize(response.encodedDataLength);if(response.headersText)
+networkRequest.responseHeadersText=response.headersText;if(response.requestHeaders){networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.requestHeaders));networkRequest.setRequestHeadersText(response.requestHeadersText||"");}
+networkRequest.connectionReused=response.connectionReused;networkRequest.connectionId=response.connectionId;if(response.remoteIPAddress)
+networkRequest.setRemoteAddress(response.remoteIPAddress,response.remotePort||-1);if(response.fromDiskCache)
+networkRequest.cached=true;else
+networkRequest.timing=response.timing;if(!this._mimeTypeIsConsistentWithType(networkRequest)){this._manager._target.consoleModel.addMessage(new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.Network,WebInspector.ConsoleMessage.MessageLevel.Log,WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s: \"%s\".",networkRequest.type.title(),networkRequest.mimeType,networkRequest.url),WebInspector.ConsoleMessage.MessageType.Log,"",0,0,networkRequest.requestId));}},_mimeTypeIsConsistentWithType:function(networkRequest)
+{if(networkRequest.hasErrorStatusCode()||networkRequest.statusCode===304||networkRequest.statusCode===204)
+return true;if(typeof networkRequest.type==="undefined"||networkRequest.type===WebInspector.resourceTypes.Other||networkRequest.type===WebInspector.resourceTypes.XHR||networkRequest.type===WebInspector.resourceTypes.WebSocket)
+return true;if(!networkRequest.mimeType)
+return true;if(networkRequest.mimeType in WebInspector.NetworkManager._MIMETypes)
+return networkRequest.type.name()in WebInspector.NetworkManager._MIMETypes[networkRequest.mimeType];return false;},_isNull:function(response)
+{if(!response)
+return true;return!response.status&&!response.mimeType&&(!response.headers||!Object.keys(response.headers).length);},requestWillBeSent:function(requestId,frameId,loaderId,documentURL,request,time,initiator,redirectResponse)
+{var networkRequest=this._inflightRequestsById[requestId];if(networkRequest){if(!redirectResponse)
+return;this.responseReceived(requestId,frameId,loaderId,time,PageAgent.ResourceType.Other,redirectResponse);networkRequest=this._appendRedirect(requestId,time,request.url);}else
+networkRequest=this._createNetworkRequest(requestId,frameId,loaderId,request.url,documentURL,initiator);networkRequest.hasNetworkData=true;this._updateNetworkRequestWithRequest(networkRequest,request);networkRequest.startTime=time;this._startNetworkRequest(networkRequest);},requestServedFromCache:function(requestId)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.cached=true;},responseReceived:function(requestId,frameId,loaderId,time,resourceType,response)
+{if(this._isNull(response))
+return;var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest){var eventData={};eventData.url=response.url;eventData.frameId=frameId;eventData.loaderId=loaderId;eventData.resourceType=resourceType;eventData.mimeType=response.mimeType;this._manager.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped,eventData);return;}
+networkRequest.responseReceivedTime=time;networkRequest.type=WebInspector.resourceTypes[resourceType];this._updateNetworkRequestWithResponse(networkRequest,response);this._updateNetworkRequest(networkRequest);},dataReceived:function(requestId,time,dataLength,encodedDataLength)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.resourceSize+=dataLength;if(encodedDataLength!=-1)
+networkRequest.increaseTransferSize(encodedDataLength);networkRequest.endTime=time;this._updateNetworkRequest(networkRequest);},loadingFinished:function(requestId,finishTime,encodedDataLength)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;this._finishNetworkRequest(networkRequest,finishTime,encodedDataLength);},loadingFailed:function(requestId,time,localizedDescription,canceled)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.failed=true;networkRequest.canceled=canceled;networkRequest.localizedFailDescription=localizedDescription;this._finishNetworkRequest(networkRequest,time,-1);},webSocketCreated:function(requestId,requestURL)
+{var networkRequest=new WebInspector.NetworkRequest(requestId,requestURL,"","","");networkRequest.type=WebInspector.resourceTypes.WebSocket;this._startNetworkRequest(networkRequest);},webSocketWillSendHandshakeRequest:function(requestId,time,request)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.requestMethod="GET";networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.headers));networkRequest.startTime=time;this._updateNetworkRequest(networkRequest);},webSocketHandshakeResponseReceived:function(requestId,time,response)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.statusCode=response.status;networkRequest.statusText=response.statusText;networkRequest.responseHeaders=this._headersMapToHeadersArray(response.headers);networkRequest.responseHeadersText=response.headersText;if(response.requestHeaders)
+networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.requestHeaders));if(response.requestHeadersText)
+networkRequest.setRequestHeadersText(response.requestHeadersText);networkRequest.responseReceivedTime=time;this._updateNetworkRequest(networkRequest);},webSocketFrameReceived:function(requestId,time,response)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.addFrame(response,time);networkRequest.responseReceivedTime=time;this._updateNetworkRequest(networkRequest);},webSocketFrameSent:function(requestId,time,response)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.addFrame(response,time,true);networkRequest.responseReceivedTime=time;this._updateNetworkRequest(networkRequest);},webSocketFrameError:function(requestId,time,errorMessage)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;networkRequest.addFrameError(errorMessage,time);networkRequest.responseReceivedTime=time;this._updateNetworkRequest(networkRequest);},webSocketClosed:function(requestId,time)
+{var networkRequest=this._inflightRequestsById[requestId];if(!networkRequest)
+return;this._finishNetworkRequest(networkRequest,time,-1);},_appendRedirect:function(requestId,time,redirectURL)
+{var originalNetworkRequest=this._inflightRequestsById[requestId];var previousRedirects=originalNetworkRequest.redirects||[];originalNetworkRequest.requestId="redirected:"+requestId+"."+previousRedirects.length;delete originalNetworkRequest.redirects;if(previousRedirects.length>0)
+originalNetworkRequest.redirectSource=previousRedirects[previousRedirects.length-1];this._finishNetworkRequest(originalNetworkRequest,time,-1);var newNetworkRequest=this._createNetworkRequest(requestId,originalNetworkRequest.frameId,originalNetworkRequest.loaderId,redirectURL,originalNetworkRequest.documentURL,originalNetworkRequest.initiator);newNetworkRequest.redirects=previousRedirects.concat(originalNetworkRequest);return newNetworkRequest;},_startNetworkRequest:function(networkRequest)
+{this._inflightRequestsById[networkRequest.requestId]=networkRequest;this._inflightRequestsByURL[networkRequest.url]=networkRequest;this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestStarted,networkRequest);},_updateNetworkRequest:function(networkRequest)
+{this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdated,networkRequest);},_finishNetworkRequest:function(networkRequest,finishTime,encodedDataLength)
+{networkRequest.endTime=finishTime;networkRequest.finished=true;if(encodedDataLength>=0)
+networkRequest.setTransferSize(encodedDataLength);this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestFinished,networkRequest);delete this._inflightRequestsById[networkRequest.requestId];delete this._inflightRequestsByURL[networkRequest.url];},_dispatchEventToListeners:function(eventType,networkRequest)
+{this._manager.dispatchEventToListeners(eventType,networkRequest);},_createNetworkRequest:function(requestId,frameId,loaderId,url,documentURL,initiator)
+{var networkRequest=new WebInspector.NetworkRequest(requestId,url,documentURL,frameId,loaderId);networkRequest.initiator=initiator;return networkRequest;}}
+WebInspector.networkManager;WebInspector.NetworkLog=function()
+{this._requests=[];this._requestForId={};WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted,this._onRequestStarted,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._onMainFrameNavigated,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._onLoad,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded,this._onDOMContentLoaded,this);}
+WebInspector.NetworkLog.prototype={get requests()
+{return this._requests;},requestForURL:function(url)
+{for(var i=0;i<this._requests.length;++i){if(this._requests[i].url===url)
+return this._requests[i];}
+return null;},pageLoadForRequest:function(request)
+{return request.__page;},_onMainFrameNavigated:function(event)
+{var mainFrame=event.data;this._currentPageLoad=null;var oldRequests=this._requests.splice(0,this._requests.length);this._requestForId={};for(var i=0;i<oldRequests.length;++i){var request=oldRequests[i];if(request.loaderId===mainFrame.loaderId){if(!this._currentPageLoad)
+this._currentPageLoad=new WebInspector.PageLoad(request);this._requests.push(request);this._requestForId[request.requestId]=request;request.__page=this._currentPageLoad;}}},_onRequestStarted:function(event)
+{var request=(event.data);this._requests.push(request);this._requestForId[request.requestId]=request;request.__page=this._currentPageLoad;},_onDOMContentLoaded:function(event)
+{if(this._currentPageLoad)
+this._currentPageLoad.contentLoadTime=event.data;},_onLoad:function(event)
+{if(this._currentPageLoad)
+this._currentPageLoad.loadTime=event.data;},requestForId:function(requestId)
+{return this._requestForId[requestId];}}
+WebInspector.networkLog;WebInspector.PageLoad=function(mainRequest)
+{this.id=++WebInspector.PageLoad._lastIdentifier;this.url=mainRequest.url;this.startTime=mainRequest.startTime;}
+WebInspector.PageLoad._lastIdentifier=0;WebInspector.ResourceTreeModel=function(target)
+{target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished,this._onRequestFinished,this);target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped,this._onRequestUpdateDropped,this);target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,this._consoleMessageAdded,this);target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._consoleCleared,this);this._agent=target.pageAgent();this._agent.enable();this._fetchResourceTree();target.registerPageDispatcher(new WebInspector.PageDispatcher(this));this._pendingConsoleMessages={};this._securityOriginFrameCount={};this._inspectedPageURL="";}
+WebInspector.ResourceTreeModel.EventTypes={FrameAdded:"FrameAdded",FrameNavigated:"FrameNavigated",FrameDetached:"FrameDetached",FrameResized:"FrameResized",MainFrameNavigated:"MainFrameNavigated",MainFrameCreatedOrNavigated:"MainFrameCreatedOrNavigated",ResourceAdded:"ResourceAdded",WillLoadCachedResources:"WillLoadCachedResources",CachedResourcesLoaded:"CachedResourcesLoaded",DOMContentLoaded:"DOMContentLoaded",Load:"Load",WillReloadPage:"WillReloadPage",InspectedURLChanged:"InspectedURLChanged",SecurityOriginAdded:"SecurityOriginAdded",SecurityOriginRemoved:"SecurityOriginRemoved",ScreencastFrame:"ScreencastFrame",ScreencastVisibilityChanged:"ScreencastVisibilityChanged"}
+WebInspector.ResourceTreeModel.prototype={_fetchResourceTree:function()
+{this._frames={};delete this._cachedResourcesProcessed;this._agent.getResourceTree(this._processCachedResources.bind(this));},_processCachedResources:function(error,mainFramePayload)
+{if(error){console.error(JSON.stringify(error));return;}
+this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources);this._inspectedPageURL=mainFramePayload.frame.url;this._addFramesRecursively(null,mainFramePayload);this._dispatchInspectedURLChanged();this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded);this._cachedResourcesProcessed=true;},inspectedPageURL:function()
+{return this._inspectedPageURL;},inspectedPageDomain:function()
+{var parsedURL=this._inspectedPageURL?this._inspectedPageURL.asParsedURL():null;return parsedURL?parsedURL.host:"";},cachedResourcesLoaded:function()
+{return this._cachedResourcesProcessed;},_dispatchInspectedURLChanged:function()
+{InspectorFrontendHost.inspectedURLChanged(this._inspectedPageURL);this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._inspectedPageURL);},_addFrame:function(frame,aboutToNavigate)
+{this._frames[frame.id]=frame;if(frame.isMainFrame())
+this.mainFrame=frame;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameAdded,frame);if(!aboutToNavigate)
+this._addSecurityOrigin(frame.securityOrigin);if(frame.isMainFrame())
+this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.MainFrameCreatedOrNavigated,frame);},_addSecurityOrigin:function(securityOrigin)
+{if(!this._securityOriginFrameCount[securityOrigin]){this._securityOriginFrameCount[securityOrigin]=1;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded,securityOrigin);return;}
+this._securityOriginFrameCount[securityOrigin]+=1;},_removeSecurityOrigin:function(securityOrigin)
+{if(typeof securityOrigin==="undefined")
+return;if(this._securityOriginFrameCount[securityOrigin]===1){delete this._securityOriginFrameCount[securityOrigin];this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved,securityOrigin);return;}
+this._securityOriginFrameCount[securityOrigin]-=1;},securityOrigins:function()
+{return Object.keys(this._securityOriginFrameCount);},_handleMainFrameDetached:function(mainFrame)
+{function removeOriginForFrame(frame)
+{for(var i=0;i<frame.childFrames.length;++i)
+removeOriginForFrame.call(this,frame.childFrames[i]);if(!frame.isMainFrame())
+this._removeSecurityOrigin(frame.securityOrigin);}
+removeOriginForFrame.call(this,WebInspector.resourceTreeModel.mainFrame);},_frameAttached:function(frameId,parentFrameId)
+{if(!this._cachedResourcesProcessed)
+return null;if(this._frames[frameId])
+return null;var parentFrame=parentFrameId?this._frames[parentFrameId]:null;var frame=new WebInspector.ResourceTreeFrame(this,parentFrame,frameId);if(frame.isMainFrame()&&this.mainFrame){this._handleMainFrameDetached(this.mainFrame);this._frameDetached(this.mainFrame.id);}
+this._addFrame(frame,true);return frame;},_frameNavigated:function(framePayload)
+{if(!this._cachedResourcesProcessed)
+return;var frame=this._frames[framePayload.id];if(!frame){console.assert(!framePayload.parentId,"Main frame shouldn't have parent frame id.");frame=this._frameAttached(framePayload.id,framePayload.parentId||"");console.assert(frame);}
+this._removeSecurityOrigin(frame.securityOrigin);frame._navigate(framePayload);var addedOrigin=frame.securityOrigin;if(frame.isMainFrame())
+this._inspectedPageURL=frame.url;this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,frame);if(frame.isMainFrame()){this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,frame);this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.MainFrameCreatedOrNavigated,frame);}
+if(addedOrigin)
+this._addSecurityOrigin(addedOrigin);var resources=frame.resources();for(var i=0;i<resources.length;++i)
+this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,resources[i]);if(frame.isMainFrame())
+this._dispatchInspectedURLChanged();},_frameDetached:function(frameId)
+{if(!this._cachedResourcesProcessed)
+return;var frame=this._frames[frameId];if(!frame)
+return;this._removeSecurityOrigin(frame.securityOrigin);if(frame.parentFrame)
+frame.parentFrame._removeChildFrame(frame);else
+frame._remove();},_onRequestFinished:function(event)
+{if(!this._cachedResourcesProcessed)
+return;var request=(event.data);if(request.failed||request.type===WebInspector.resourceTypes.XHR)
+return;var frame=this._frames[request.frameId];if(frame){var resource=frame._addRequest(request);this._addPendingConsoleMessagesToResource(resource);}},_onRequestUpdateDropped:function(event)
+{if(!this._cachedResourcesProcessed)
+return;var frameId=event.data.frameId;var frame=this._frames[frameId];if(!frame)
+return;var url=event.data.url;if(frame._resourcesMap[url])
+return;var resource=new WebInspector.Resource(null,url,frame.url,frameId,event.data.loaderId,WebInspector.resourceTypes[event.data.resourceType],event.data.mimeType);frame.addResource(resource);},frameForId:function(frameId)
+{return this._frames[frameId];},forAllResources:function(callback)
+{if(this.mainFrame)
+return this.mainFrame._callForFrameResources(callback);return false;},frames:function()
+{return Object.values(this._frames);},_consoleMessageAdded:function(event)
+{var msg=(event.data);var resource=msg.url?this.resourceForURL(msg.url):null;if(resource)
+this._addConsoleMessageToResource(msg,resource);else
+this._addPendingConsoleMessage(msg);},_addPendingConsoleMessage:function(msg)
+{if(!msg.url)
+return;if(!this._pendingConsoleMessages[msg.url])
+this._pendingConsoleMessages[msg.url]=[];this._pendingConsoleMessages[msg.url].push(msg);},_addPendingConsoleMessagesToResource:function(resource)
+{var messages=this._pendingConsoleMessages[resource.url];if(messages){for(var i=0;i<messages.length;i++)
+this._addConsoleMessageToResource(messages[i],resource);delete this._pendingConsoleMessages[resource.url];}},_addConsoleMessageToResource:function(msg,resource)
+{switch(msg.level){case WebInspector.ConsoleMessage.MessageLevel.Warning:resource.warnings++;break;case WebInspector.ConsoleMessage.MessageLevel.Error:resource.errors++;break;}
+resource.addMessage(msg);},_consoleCleared:function()
+{function callback(resource)
+{resource.clearErrorsAndWarnings();}
+this._pendingConsoleMessages={};this.forAllResources(callback);},resourceForURL:function(url)
+{return this.mainFrame?this.mainFrame.resourceForURL(url):null;},_addFramesRecursively:function(parentFrame,frameTreePayload)
+{var framePayload=frameTreePayload.frame;var frame=new WebInspector.ResourceTreeFrame(this,parentFrame,framePayload.id,framePayload);this._addFrame(frame);var frameResource=this._createResourceFromFramePayload(framePayload,framePayload.url,WebInspector.resourceTypes.Document,framePayload.mimeType);if(frame.isMainFrame())
+this._inspectedPageURL=frameResource.url;frame.addResource(frameResource);for(var i=0;frameTreePayload.childFrames&&i<frameTreePayload.childFrames.length;++i)
+this._addFramesRecursively(frame,frameTreePayload.childFrames[i]);for(var i=0;i<frameTreePayload.resources.length;++i){var subresource=frameTreePayload.resources[i];var resource=this._createResourceFromFramePayload(framePayload,subresource.url,WebInspector.resourceTypes[subresource.type],subresource.mimeType);frame.addResource(resource);}},_createResourceFromFramePayload:function(frame,url,type,mimeType)
+{return new WebInspector.Resource(null,url,frame.url,frame.id,frame.loaderId,type,mimeType);},reloadPage:function(ignoreCache,scriptToEvaluateOnLoad,scriptPreprocessor)
+{this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage);this._agent.reload(ignoreCache,scriptToEvaluateOnLoad,scriptPreprocessor);},__proto__:WebInspector.Object.prototype}
+WebInspector.ResourceTreeFrame=function(model,parentFrame,frameId,payload)
+{this._model=model;this._parentFrame=parentFrame;this._id=frameId;this._url="";if(payload){this._loaderId=payload.loaderId;this._name=payload.name;this._url=payload.url;this._securityOrigin=payload.securityOrigin;this._mimeType=payload.mimeType;}
+this._childFrames=[];this._resourcesMap={};if(this._parentFrame)
+this._parentFrame._childFrames.push(this);}
+WebInspector.ResourceTreeFrame.prototype={get id()
+{return this._id;},get name()
+{return this._name||"";},get url()
+{return this._url;},get securityOrigin()
+{return this._securityOrigin;},get loaderId()
+{return this._loaderId;},get parentFrame()
+{return this._parentFrame;},get childFrames()
+{return this._childFrames;},isMainFrame:function()
+{return!this._parentFrame;},_navigate:function(framePayload)
+{this._loaderId=framePayload.loaderId;this._name=framePayload.name;this._url=framePayload.url;this._securityOrigin=framePayload.securityOrigin;this._mimeType=framePayload.mimeType;var mainResource=this._resourcesMap[this._url];this._resourcesMap={};this._removeChildFrames();if(mainResource&&mainResource.loaderId===this._loaderId)
+this.addResource(mainResource);},get mainResource()
+{return this._resourcesMap[this._url];},_removeChildFrame:function(frame)
+{this._childFrames.remove(frame);frame._remove();},_removeChildFrames:function()
+{var frames=this._childFrames;this._childFrames=[];for(var i=0;i<frames.length;++i)
+frames[i]._remove();},_remove:function()
+{this._removeChildFrames();delete this._model._frames[this.id];this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameDetached,this);},addResource:function(resource)
+{if(this._resourcesMap[resource.url]===resource){return;}
+this._resourcesMap[resource.url]=resource;this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,resource);},_addRequest:function(request)
+{var resource=this._resourcesMap[request.url];if(resource&&resource.request===request){return resource;}
+resource=new WebInspector.Resource(request,request.url,request.documentURL,request.frameId,request.loaderId,request.type,request.mimeType);this._resourcesMap[resource.url]=resource;this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,resource);return resource;},resources:function()
+{var result=[];for(var url in this._resourcesMap)
+result.push(this._resourcesMap[url]);return result;},resourceForURL:function(url)
+{var result;function filter(resource)
+{if(resource.url===url){result=resource;return true;}}
+this._callForFrameResources(filter);return result||null;},_callForFrameResources:function(callback)
+{for(var url in this._resourcesMap){if(callback(this._resourcesMap[url]))
+return true;}
+for(var i=0;i<this._childFrames.length;++i){if(this._childFrames[i]._callForFrameResources(callback))
+return true;}
+return false;},displayName:function()
+{if(!this._parentFrame)
+return WebInspector.UIString("<top frame>");var subtitle=new WebInspector.ParsedURL(this._url).displayName;if(subtitle){if(!this._name)
+return subtitle;return this._name+"( "+subtitle+" )";}
+return WebInspector.UIString("<iframe>");}}
+WebInspector.PageDispatcher=function(resourceTreeModel)
+{this._resourceTreeModel=resourceTreeModel;}
+WebInspector.PageDispatcher.prototype={domContentEventFired:function(time)
+{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded,time);},loadEventFired:function(time)
+{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.Load,time);},frameAttached:function(frameId,parentFrameId)
+{this._resourceTreeModel._frameAttached(frameId,parentFrameId);},frameNavigated:function(frame)
+{this._resourceTreeModel._frameNavigated(frame);},frameDetached:function(frameId)
+{this._resourceTreeModel._frameDetached(frameId);},frameStartedLoading:function(frameId)
+{},frameStoppedLoading:function(frameId)
+{},frameScheduledNavigation:function(frameId,delay)
+{},frameClearedScheduledNavigation:function(frameId)
+{},frameResized:function()
+{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameResized,null);},javascriptDialogOpening:function(message)
+{},javascriptDialogClosed:function()
+{},scriptsEnabled:function(isEnabled)
+{WebInspector.settings.javaScriptDisabled.set(!isEnabled);},screencastFrame:function(data,metadata)
+{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ScreencastFrame,{data:data,metadata:metadata});},screencastVisibilityChanged:function(visible)
+{this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ScreencastVisibilityChanged,{visible:visible});}}
+WebInspector.resourceTreeModel;WebInspector.ParsedURL=function(url)
+{this.isValid=false;this.url=url;this.scheme="";this.host="";this.port="";this.path="";this.queryParams="";this.fragment="";this.folderPathComponents="";this.lastPathComponent="";var match=url.match(/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);if(match){this.isValid=true;this.scheme=match[1].toLowerCase();this.host=match[2];this.port=match[3];this.path=match[4]||"/";this.fragment=match[5];}else{if(this.url.startsWith("data:")){this.scheme="data";return;}
+if(this.url==="about:blank"){this.scheme="about";return;}
+this.path=this.url;}
+var path=this.path;var indexOfQuery=path.indexOf("?");if(indexOfQuery!==-1){this.queryParams=path.substring(indexOfQuery+1)
+path=path.substring(0,indexOfQuery);}
+var lastSlashIndex=path.lastIndexOf("/");if(lastSlashIndex!==-1){this.folderPathComponents=path.substring(0,lastSlashIndex);this.lastPathComponent=path.substring(lastSlashIndex+1);}else
+this.lastPathComponent=path;}
+WebInspector.ParsedURL.splitURL=function(url)
+{var parsedURL=new WebInspector.ParsedURL(url);var origin;var folderPath;var name;if(parsedURL.isValid){origin=parsedURL.scheme+"://"+parsedURL.host;if(parsedURL.port)
+origin+=":"+parsedURL.port;folderPath=parsedURL.folderPathComponents;name=parsedURL.lastPathComponent;if(parsedURL.queryParams)
+name+="?"+parsedURL.queryParams;}else{origin="";folderPath="";name=url;}
+var result=[origin];var splittedPath=folderPath.split("/");for(var i=1;i<splittedPath.length;++i)
+result.push(splittedPath[i]);result.push(name);return result;}
+WebInspector.ParsedURL.normalizePath=function(path)
+{if(path.indexOf("..")===-1&&path.indexOf('.')===-1)
+return path;var normalizedSegments=[];var segments=path.split("/");for(var i=0;i<segments.length;i++){var segment=segments[i];if(segment===".")
+continue;else if(segment==="..")
+normalizedSegments.pop();else if(segment)
+normalizedSegments.push(segment);}
+var normalizedPath=normalizedSegments.join("/");if(normalizedPath[normalizedPath.length-1]==="/")
+return normalizedPath;if(path[0]==="/"&&normalizedPath)
+normalizedPath="/"+normalizedPath;if((path[path.length-1]==="/")||(segments[segments.length-1]===".")||(segments[segments.length-1]===".."))
+normalizedPath=normalizedPath+"/";return normalizedPath;}
+WebInspector.ParsedURL.completeURL=function(baseURL,href)
+{if(href){var trimmedHref=href.trim();if(trimmedHref.startsWith("data:")||trimmedHref.startsWith("blob:")||trimmedHref.startsWith("javascript:"))
+return href;var parsedHref=trimmedHref.asParsedURL();if(parsedHref&&parsedHref.scheme)
+return trimmedHref;}else{return baseURL;}
+var parsedURL=baseURL.asParsedURL();if(parsedURL){if(parsedURL.isDataURL())
+return href;var path=href;var query=path.indexOf("?");var postfix="";if(query!==-1){postfix=path.substring(query);path=path.substring(0,query);}else{var fragment=path.indexOf("#");if(fragment!==-1){postfix=path.substring(fragment);path=path.substring(0,fragment);}}
+if(!path){var basePath=parsedURL.path;if(postfix.charAt(0)==="?"){var baseQuery=parsedURL.path.indexOf("?");if(baseQuery!==-1)
+basePath=basePath.substring(0,baseQuery);}
+return parsedURL.scheme+"://"+parsedURL.host+(parsedURL.port?(":"+parsedURL.port):"")+basePath+postfix;}else if(path.charAt(0)!=="/"){var prefix=parsedURL.path;var prefixQuery=prefix.indexOf("?");if(prefixQuery!==-1)
+prefix=prefix.substring(0,prefixQuery);prefix=prefix.substring(0,prefix.lastIndexOf("/"))+"/";path=prefix+path;}else if(path.length>1&&path.charAt(1)==="/"){return parsedURL.scheme+":"+path+postfix;}
+return parsedURL.scheme+"://"+parsedURL.host+(parsedURL.port?(":"+parsedURL.port):"")+WebInspector.ParsedURL.normalizePath(path)+postfix;}
+return null;}
+WebInspector.ParsedURL.prototype={get displayName()
+{if(this._displayName)
+return this._displayName;if(this.isDataURL())
+return this.dataURLDisplayName();if(this.isAboutBlank())
+return this.url;this._displayName=this.lastPathComponent;if(!this._displayName)
+this._displayName=(this.host||"")+"/";if(this._displayName==="/")
+this._displayName=this.url;return this._displayName;},dataURLDisplayName:function()
+{if(this._dataURLDisplayName)
+return this._dataURLDisplayName;if(!this.isDataURL())
+return"";this._dataURLDisplayName=this.url.trimEnd(20);return this._dataURLDisplayName;},isAboutBlank:function()
+{return this.url==="about:blank";},isDataURL:function()
+{return this.scheme==="data";}}
+String.prototype.asParsedURL=function()
+{var parsedURL=new WebInspector.ParsedURL(this.toString());if(parsedURL.isValid)
+return parsedURL;return null;}
+WebInspector.resourceForURL=function(url)
+{return WebInspector.resourceTreeModel.resourceForURL(url);}
+WebInspector.forAllResources=function(callback)
+{WebInspector.resourceTreeModel.forAllResources(callback);}
+WebInspector.displayNameForURL=function(url)
+{if(!url)
+return"";var resource=WebInspector.resourceForURL(url);if(resource)
+return resource.displayName;var uiSourceCode=WebInspector.workspace.uiSourceCodeForURL(url);if(uiSourceCode)
+return uiSourceCode.displayName();if(!WebInspector.resourceTreeModel.inspectedPageURL())
+return url.trimURL("");var parsedURL=WebInspector.resourceTreeModel.inspectedPageURL().asParsedURL();var lastPathComponent=parsedURL?parsedURL.lastPathComponent:parsedURL;var index=WebInspector.resourceTreeModel.inspectedPageURL().indexOf(lastPathComponent);if(index!==-1&&index+lastPathComponent.length===WebInspector.resourceTreeModel.inspectedPageURL().length){var baseURL=WebInspector.resourceTreeModel.inspectedPageURL().substring(0,index);if(url.startsWith(baseURL))
+return url.substring(index);}
+if(!parsedURL)
+return url;var displayName=url.trimURL(parsedURL.host);return displayName==="/"?parsedURL.host+"/":displayName;}
+WebInspector.linkifyStringAsFragmentWithCustomLinkifier=function(string,linkifier)
+{var container=document.createDocumentFragment();var linkStringRegEx=/(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|data:|www\.)[\w$\-_+*'=\|\/\\(){}[\]^%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({^%@&#~]/;var lineColumnRegEx=/:(\d+)(:(\d+))?$/;while(string){var linkString=linkStringRegEx.exec(string);if(!linkString)
+break;linkString=linkString[0];var linkIndex=string.indexOf(linkString);var nonLink=string.substring(0,linkIndex);container.appendChild(document.createTextNode(nonLink));var title=linkString;var realURL=(linkString.startsWith("www.")?"http://"+linkString:linkString);var lineColumnMatch=lineColumnRegEx.exec(realURL);var lineNumber;var columnNumber;if(lineColumnMatch){realURL=realURL.substring(0,realURL.length-lineColumnMatch[0].length);lineNumber=parseInt(lineColumnMatch[1],10);lineNumber=isNaN(lineNumber)?undefined:lineNumber-1;if(typeof(lineColumnMatch[3])==="string"){columnNumber=parseInt(lineColumnMatch[3],10);columnNumber=isNaN(columnNumber)?undefined:columnNumber-1;}}
+var linkNode=linkifier(title,realURL,lineNumber,columnNumber);container.appendChild(linkNode);string=string.substring(linkIndex+linkString.length,string.length);}
+if(string)
+container.appendChild(document.createTextNode(string));return container;}
+WebInspector.linkifyStringAsFragment=function(string)
+{function linkifier(title,url,lineNumber,columnNumber)
+{var isExternal=!WebInspector.resourceForURL(url)&&!WebInspector.workspace.uiSourceCodeForURL(url);var urlNode=WebInspector.linkifyURLAsNode(url,title,undefined,isExternal);if(typeof lineNumber!=="undefined"){urlNode.lineNumber=lineNumber;if(typeof columnNumber!=="undefined")
+urlNode.columnNumber=columnNumber;}
+return urlNode;}
+return WebInspector.linkifyStringAsFragmentWithCustomLinkifier(string,linkifier);}
+WebInspector.linkifyURLAsNode=function(url,linkText,classes,isExternal,tooltipText)
+{if(!linkText)
+linkText=url;classes=(classes?classes+" ":"");classes+=isExternal?"webkit-html-external-link":"webkit-html-resource-link";var a=document.createElement("a");var href=sanitizeHref(url);if(href!==null)
+a.href=href;a.className=classes;if(typeof tooltipText==="undefined")
+a.title=url;else if(typeof tooltipText!=="string"||tooltipText.length)
+a.title=tooltipText;a.textContent=linkText.trimMiddle(WebInspector.Linkifier.MaxLengthForDisplayedURLs);if(isExternal)
+a.setAttribute("target","_blank");return a;}
+WebInspector.formatLinkText=function(url,lineNumber)
+{var text=url?WebInspector.displayNameForURL(url):WebInspector.UIString("(program)");if(typeof lineNumber==="number")
+text+=":"+(lineNumber+1);return text;}
+WebInspector.linkifyResourceAsNode=function(url,lineNumber,classes,tooltipText)
+{var linkText=WebInspector.formatLinkText(url,lineNumber);var anchor=WebInspector.linkifyURLAsNode(url,linkText,classes,false,tooltipText);anchor.lineNumber=lineNumber;return anchor;}
+WebInspector.linkifyRequestAsNode=function(request)
+{var anchor=WebInspector.linkifyURLAsNode(request.url);anchor.requestId=request.requestId;return anchor;}
+WebInspector.contentAsDataURL=function(content,mimeType,contentEncoded)
+{const maxDataUrlSize=1024*1024;if(content===null||content.length>maxDataUrlSize)
+return null;return"data:"+mimeType+(contentEncoded?";base64,":",")+content;}
+WebInspector.ResourceType=function(name,title,categoryTitle,color,isTextType)
+{this._name=name;this._title=title;this._categoryTitle=categoryTitle;this._color=color;this._isTextType=isTextType;}
+WebInspector.ResourceType.prototype={name:function()
+{return this._name;},title:function()
+{return this._title;},categoryTitle:function()
+{return this._categoryTitle;},color:function()
+{return this._color;},isTextType:function()
+{return this._isTextType;},toString:function()
+{return this._name;},canonicalMimeType:function()
+{if(this===WebInspector.resourceTypes.Document)
+return"text/html";if(this===WebInspector.resourceTypes.Script)
+return"text/javascript";if(this===WebInspector.resourceTypes.Stylesheet)
+return"text/css";return"";}}
+WebInspector.resourceTypes={Document:new WebInspector.ResourceType("document","Document","Documents","rgb(47,102,236)",true),Stylesheet:new WebInspector.ResourceType("stylesheet","Stylesheet","Stylesheets","rgb(157,231,119)",true),Image:new WebInspector.ResourceType("image","Image","Images","rgb(164,60,255)",false),Script:new WebInspector.ResourceType("script","Script","Scripts","rgb(255,121,0)",true),XHR:new WebInspector.ResourceType("xhr","XHR","XHR","rgb(231,231,10)",true),Font:new WebInspector.ResourceType("font","Font","Fonts","rgb(255,82,62)",false),WebSocket:new WebInspector.ResourceType("websocket","WebSocket","WebSockets","rgb(186,186,186)",false),Other:new WebInspector.ResourceType("other","Other","Other","rgb(186,186,186)",false)}
+WebInspector.ResourceType.mimeTypesForExtensions={"js":"text/javascript","css":"text/css","html":"text/html","htm":"text/html","xml":"application/xml","xsl":"application/xml","asp":"application/x-aspx","aspx":"application/x-aspx","jsp":"application/x-jsp","c":"text/x-c++src","cc":"text/x-c++src","cpp":"text/x-c++src","h":"text/x-c++src","m":"text/x-c++src","mm":"text/x-c++src","coffee":"text/x-coffeescript","dart":"text/javascript","ts":"text/typescript","json":"application/json","gyp":"application/json","gypi":"application/json","cs":"text/x-csharp","java":"text/x-java","php":"text/x-php","phtml":"application/x-httpd-php","py":"text/x-python","sh":"text/x-sh","scss":"text/x-scss"}
+WebInspector.TimelineManager=function()
+{WebInspector.Object.call(this);this._dispatcher=new WebInspector.TimelineDispatcher(this);this._enablementCount=0;TimelineAgent.enable();}
+WebInspector.TimelineManager.EventTypes={TimelineStarted:"TimelineStarted",TimelineStopped:"TimelineStopped",TimelineEventRecorded:"TimelineEventRecorded",TimelineProgress:"TimelineProgress"}
+WebInspector.TimelineManager.prototype={isStarted:function()
+{return this._dispatcher.isStarted();},start:function(maxCallStackDepth,bufferEvents,liveEvents,includeCounters,includeGPUEvents,callback)
+{this._enablementCount++;if(this._enablementCount===1)
+TimelineAgent.start(maxCallStackDepth,bufferEvents,liveEvents,includeCounters,includeGPUEvents,callback);else if(callback)
+callback(null);},stop:function(callback)
+{this._enablementCount--;if(this._enablementCount<0){console.error("WebInspector.TimelineManager start/stop calls are unbalanced "+new Error().stack);return;}
+if(!this._enablementCount)
+TimelineAgent.stop(callback);else if(callback)
+callback(null);},__proto__:WebInspector.Object.prototype}
+WebInspector.TimelineDispatcher=function(manager)
+{this._manager=manager;InspectorBackend.registerTimelineDispatcher(this);}
+WebInspector.TimelineDispatcher.prototype={eventRecorded:function(record)
+{this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded,record);},isStarted:function()
+{return!!this._started;},started:function(consoleTimeline)
+{if(consoleTimeline){WebInspector.moduleManager.loadModule("timeline");}
+this._started=true;this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineStarted,consoleTimeline);},stopped:function(consoleTimeline)
+{this._started=false;this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineStopped,consoleTimeline);},progress:function(count)
+{this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineProgress,count);}}
+WebInspector.timelineManager;WebInspector.PowerProfiler=function()
+{WebInspector.Object.call(this);this._dispatcher=new WebInspector.PowerDispatcher(this);}
+WebInspector.PowerProfiler.EventTypes={PowerEventRecorded:"PowerEventRecorded"}
+WebInspector.PowerProfiler.prototype={startProfile:function()
+{PowerAgent.start();},stopProfile:function()
+{PowerAgent.end();},__proto__:WebInspector.Object.prototype}
+WebInspector.PowerDispatcher=function(profiler)
+{this._profiler=profiler;InspectorBackend.registerPowerDispatcher(this);}
+WebInspector.PowerDispatcher.prototype={dataAvailable:function(events)
+{for(var i=0;i<events.length;++i)
+this._profiler.dispatchEventToListeners(WebInspector.PowerProfiler.EventTypes.PowerEventRecorded,events[i]);}}
+WebInspector.powerProfiler;WebInspector.OverridesSupport=function()
+{WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._onMainFrameNavigated.bind(this),this);this._deviceMetricsOverrideEnabled=false;this._emulateViewportEnabled=false;this._userAgent="";this.maybeHasActiveOverridesChanged();WebInspector.settings.overrideUserAgent.addChangeListener(this._userAgentChanged,this);WebInspector.settings.userAgent.addChangeListener(this._userAgentChanged,this);WebInspector.settings.overrideDeviceMetrics.addChangeListener(this._deviceMetricsChanged,this);WebInspector.settings.deviceMetrics.addChangeListener(this._deviceMetricsChanged,this);WebInspector.settings.emulateViewport.addChangeListener(this._deviceMetricsChanged,this);WebInspector.settings.deviceFitWindow.addChangeListener(this._deviceMetricsChanged,this);WebInspector.settings.overrideGeolocation.addChangeListener(this._geolocationPositionChanged,this);WebInspector.settings.geolocationOverride.addChangeListener(this._geolocationPositionChanged,this);WebInspector.settings.overrideDeviceOrientation.addChangeListener(this._deviceOrientationChanged,this);WebInspector.settings.deviceOrientationOverride.addChangeListener(this._deviceOrientationChanged,this);WebInspector.settings.emulateTouchEvents.addChangeListener(this._emulateTouchEventsChanged,this);WebInspector.settings.overrideCSSMedia.addChangeListener(this._cssMediaChanged,this);WebInspector.settings.emulatedCSSMedia.addChangeListener(this._cssMediaChanged,this);}
+WebInspector.OverridesSupport.isInspectingDevice=function()
+{return!!WebInspector.queryParam("remoteFrontend");}
+WebInspector.OverridesSupport.Events={OverridesWarningUpdated:"OverridesWarningUpdated",HasActiveOverridesChanged:"HasActiveOverridesChanged",}
+WebInspector.OverridesSupport.DeviceMetrics=function(width,height,deviceScaleFactor,textAutosizing)
+{this.width=width;this.height=height;this.deviceScaleFactor=deviceScaleFactor;this.textAutosizing=textAutosizing;}
+WebInspector.OverridesSupport.DeviceMetrics.parseSetting=function(value)
+{var width=0;var height=0;var deviceScaleFactor=1;var textAutosizing=true;if(value){var splitMetrics=value.split("x");if(splitMetrics.length>=3){width=parseInt(splitMetrics[0],10);height=parseInt(splitMetrics[1],10);deviceScaleFactor=parseFloat(splitMetrics[2]);if(splitMetrics.length==4)
+textAutosizing=splitMetrics[3]==1;}}
+return new WebInspector.OverridesSupport.DeviceMetrics(width,height,deviceScaleFactor,textAutosizing);}
+WebInspector.OverridesSupport.DeviceMetrics.parseUserInput=function(widthString,heightString,deviceScaleFactorString,textAutosizing)
+{function isUserInputValid(value,isInteger)
+{if(!value)
+return true;return isInteger?/^[0]*[1-9][\d]*$/.test(value):/^[0]*([1-9][\d]*(\.\d+)?|\.\d+)$/.test(value);}
+if(!widthString^!heightString)
+return null;var isWidthValid=isUserInputValid(widthString,true);var isHeightValid=isUserInputValid(heightString,true);var isDeviceScaleFactorValid=isUserInputValid(deviceScaleFactorString,false);if(!isWidthValid&&!isHeightValid&&!isDeviceScaleFactorValid)
+return null;var width=isWidthValid?parseInt(widthString||"0",10):-1;var height=isHeightValid?parseInt(heightString||"0",10):-1;var deviceScaleFactor=isDeviceScaleFactorValid?parseFloat(deviceScaleFactorString):-1;return new WebInspector.OverridesSupport.DeviceMetrics(width,height,deviceScaleFactor,textAutosizing);}
+WebInspector.OverridesSupport.DeviceMetrics.prototype={isValid:function()
+{return this.isWidthValid()&&this.isHeightValid()&&this.isDeviceScaleFactorValid();},isWidthValid:function()
+{return this.width>=0;},isHeightValid:function()
+{return this.height>=0;},isDeviceScaleFactorValid:function()
+{return this.deviceScaleFactor>0;},toSetting:function()
+{if(!this.isValid())
+return"";return this.width&&this.height?this.width+"x"+this.height+"x"+this.deviceScaleFactor+"x"+(this.textAutosizing?"1":"0"):"";},widthToInput:function()
+{return this.isWidthValid()&&this.width?String(this.width):"";},heightToInput:function()
+{return this.isHeightValid()&&this.height?String(this.height):"";},deviceScaleFactorToInput:function()
+{return this.isDeviceScaleFactorValid()&&this.deviceScaleFactor?String(this.deviceScaleFactor):"";},fontScaleFactor:function()
+{if(this.isValid()){var minWidth=Math.min(this.width,this.height)/this.deviceScaleFactor;var kMinFSM=1.05;var kWidthForMinFSM=320;var kMaxFSM=1.3;var kWidthForMaxFSM=800;if(minWidth<=kWidthForMinFSM)
+return kMinFSM;if(minWidth>=kWidthForMaxFSM)
+return kMaxFSM;var ratio=(minWidth-kWidthForMinFSM)/(kWidthForMaxFSM-kWidthForMinFSM);return ratio*(kMaxFSM-kMinFSM)+kMinFSM;}
+return 1;}}
+WebInspector.OverridesSupport.GeolocationPosition=function(latitude,longitude,error)
+{this.latitude=latitude;this.longitude=longitude;this.error=error;}
+WebInspector.OverridesSupport.GeolocationPosition.prototype={toSetting:function()
+{return(typeof this.latitude==="number"&&typeof this.longitude==="number"&&typeof this.error==="string")?this.latitude+"@"+this.longitude+":"+this.error:"";}}
+WebInspector.OverridesSupport.GeolocationPosition.parseSetting=function(value)
+{if(value){var splitError=value.split(":");if(splitError.length===2){var splitPosition=splitError[0].split("@")
+if(splitPosition.length===2)
+return new WebInspector.OverridesSupport.GeolocationPosition(parseFloat(splitPosition[0]),parseFloat(splitPosition[1]),splitError[1]);}}
+return new WebInspector.OverridesSupport.GeolocationPosition(0,0,"");}
+WebInspector.OverridesSupport.GeolocationPosition.parseUserInput=function(latitudeString,longitudeString,errorStatus)
+{function isUserInputValid(value)
+{if(!value)
+return true;return/^[-]?[0-9]*[.]?[0-9]*$/.test(value);}
+if(!latitudeString^!latitudeString)
+return null;var isLatitudeValid=isUserInputValid(latitudeString);var isLongitudeValid=isUserInputValid(longitudeString);if(!isLatitudeValid&&!isLongitudeValid)
+return null;var latitude=isLatitudeValid?parseFloat(latitudeString):-1;var longitude=isLongitudeValid?parseFloat(longitudeString):-1;return new WebInspector.OverridesSupport.GeolocationPosition(latitude,longitude,errorStatus?"PositionUnavailable":"");}
+WebInspector.OverridesSupport.GeolocationPosition.clearGeolocationOverride=function()
+{GeolocationAgent.clearGeolocationOverride();}
+WebInspector.OverridesSupport.DeviceOrientation=function(alpha,beta,gamma)
+{this.alpha=alpha;this.beta=beta;this.gamma=gamma;}
+WebInspector.OverridesSupport.DeviceOrientation.prototype={toSetting:function()
+{return JSON.stringify(this);}}
+WebInspector.OverridesSupport.DeviceOrientation.parseSetting=function(value)
+{if(value){var jsonObject=JSON.parse(value);return new WebInspector.OverridesSupport.DeviceOrientation(jsonObject.alpha,jsonObject.beta,jsonObject.gamma);}
+return new WebInspector.OverridesSupport.DeviceOrientation(0,0,0);}
+WebInspector.OverridesSupport.DeviceOrientation.parseUserInput=function(alphaString,betaString,gammaString)
+{function isUserInputValid(value)
+{if(!value)
+return true;return/^[-]?[0-9]*[.]?[0-9]*$/.test(value);}
+if(!alphaString^!betaString^!gammaString)
+return null;var isAlphaValid=isUserInputValid(alphaString);var isBetaValid=isUserInputValid(betaString);var isGammaValid=isUserInputValid(gammaString);if(!isAlphaValid&&!isBetaValid&&!isGammaValid)
+return null;var alpha=isAlphaValid?parseFloat(alphaString):-1;var beta=isBetaValid?parseFloat(betaString):-1;var gamma=isGammaValid?parseFloat(gammaString):-1;return new WebInspector.OverridesSupport.DeviceOrientation(alpha,beta,gamma);}
+WebInspector.OverridesSupport.DeviceOrientation.clearDeviceOrientationOverride=function()
+{PageAgent.clearDeviceOrientationOverride();}
+WebInspector.OverridesSupport.prototype={emulateDevice:function(deviceMetrics,userAgent)
+{this._deviceMetricsChangedListenerMuted=true;this._userAgentChangedListenerMuted=true;WebInspector.settings.deviceMetrics.set(deviceMetrics);WebInspector.settings.userAgent.set(userAgent);WebInspector.settings.overrideDeviceMetrics.set(true);WebInspector.settings.overrideUserAgent.set(true);WebInspector.settings.emulateTouchEvents.set(true);WebInspector.settings.emulateViewport.set(true);delete this._deviceMetricsChangedListenerMuted;delete this._userAgentChangedListenerMuted;this._deviceMetricsChanged();this._userAgentChanged();},reset:function()
+{this._deviceMetricsChangedListenerMuted=true;this._userAgentChangedListenerMuted=true;WebInspector.settings.overrideDeviceMetrics.set(false);WebInspector.settings.overrideUserAgent.set(false);WebInspector.settings.emulateTouchEvents.set(false);WebInspector.settings.overrideDeviceOrientation.set(false);WebInspector.settings.overrideGeolocation.set(false);WebInspector.settings.overrideCSSMedia.set(false);WebInspector.settings.emulateViewport.set(false);WebInspector.settings.deviceMetrics.set("");delete this._deviceMetricsChangedListenerMuted;delete this._userAgentChangedListenerMuted;this._deviceMetricsChanged();this._userAgentChanged();},applyInitialOverrides:function()
+{if(WebInspector.settings.overrideDeviceOrientation.get())
+this._deviceOrientationChanged();if(WebInspector.settings.overrideGeolocation.get())
+this._geolocationPositionChanged();if(WebInspector.settings.emulateTouchEvents.get())
+this._emulateTouchEventsChanged();if(WebInspector.settings.overrideCSSMedia.get())
+this._cssMediaChanged();if(WebInspector.settings.overrideDeviceMetrics.get())
+this._deviceMetricsChanged();if(WebInspector.settings.overrideUserAgent.get())
+this._userAgentChanged();},_userAgentChanged:function()
+{if(WebInspector.OverridesSupport.isInspectingDevice()||this._userAgentChangedListenerMuted)
+return;var userAgent=WebInspector.settings.overrideUserAgent.get()?WebInspector.settings.userAgent.get():"";NetworkAgent.setUserAgentOverride(userAgent);this._updateUserAgentWarningMessage(this._userAgent!==userAgent?WebInspector.UIString("You might need to reload the page for proper user agent spoofing and viewport rendering."):"");this._userAgent=userAgent;this.maybeHasActiveOverridesChanged();},_deviceMetricsChanged:function()
+{if(this._deviceMetricsChangedListenerMuted)
+return;var metrics=WebInspector.OverridesSupport.DeviceMetrics.parseSetting(WebInspector.settings.overrideDeviceMetrics.get()?WebInspector.settings.deviceMetrics.get():"");if(!metrics.isValid())
+return;var dipWidth=Math.round(metrics.width/metrics.deviceScaleFactor);var dipHeight=Math.round(metrics.height/metrics.deviceScaleFactor);var metricsOverrideEnabled=!!(dipWidth&&dipHeight);if(metricsOverrideEnabled&&WebInspector.OverridesSupport.isInspectingDevice()){this._updateDeviceMetricsWarningMessage(WebInspector.UIString("Screen emulation on the device is not available."));return;}
+PageAgent.setDeviceMetricsOverride(dipWidth,dipHeight,metricsOverrideEnabled?metrics.deviceScaleFactor:0,WebInspector.settings.emulateViewport.get(),WebInspector.settings.deviceFitWindow.get(),metrics.textAutosizing,metrics.fontScaleFactor(),apiCallback.bind(this));this.maybeHasActiveOverridesChanged();function apiCallback(error)
+{if(error){this._updateDeviceMetricsWarningMessage(WebInspector.UIString("Screen emulation is not available on this page."));return;}
+var viewportEnabled=WebInspector.settings.emulateViewport.get();this._updateDeviceMetricsWarningMessage(this._deviceMetricsOverrideEnabled!==metricsOverrideEnabled||(metricsOverrideEnabled&&this._emulateViewportEnabled!=viewportEnabled)?WebInspector.UIString("You might need to reload the page for proper user agent spoofing and viewport rendering."):"");this._deviceMetricsOverrideEnabled=metricsOverrideEnabled;this._emulateViewportEnabled=viewportEnabled;this._deviceMetricsOverrideAppliedForTest();}},_deviceMetricsOverrideAppliedForTest:function()
+{},_geolocationPositionChanged:function()
+{if(!WebInspector.settings.overrideGeolocation.get()){GeolocationAgent.clearGeolocationOverride();return;}
+var geolocation=WebInspector.OverridesSupport.GeolocationPosition.parseSetting(WebInspector.settings.geolocationOverride.get());if(geolocation.error)
+GeolocationAgent.setGeolocationOverride();else
+GeolocationAgent.setGeolocationOverride(geolocation.latitude,geolocation.longitude,150);this.maybeHasActiveOverridesChanged();},_deviceOrientationChanged:function()
+{if(!WebInspector.settings.overrideDeviceOrientation.get()){PageAgent.clearDeviceOrientationOverride();return;}
+var deviceOrientation=WebInspector.OverridesSupport.DeviceOrientation.parseSetting(WebInspector.settings.deviceOrientationOverride.get());PageAgent.setDeviceOrientationOverride(deviceOrientation.alpha,deviceOrientation.beta,deviceOrientation.gamma);this.maybeHasActiveOverridesChanged();},_emulateTouchEventsChanged:function()
+{if(WebInspector.OverridesSupport.isInspectingDevice()&&WebInspector.settings.emulateTouchEvents.get())
+return;WebInspector.domModel.emulateTouchEventObjects(WebInspector.settings.emulateTouchEvents.get());this.maybeHasActiveOverridesChanged();},_cssMediaChanged:function()
+{PageAgent.setEmulatedMedia(WebInspector.settings.overrideCSSMedia.get()?WebInspector.settings.emulatedCSSMedia.get():"");WebInspector.cssModel.mediaQueryResultChanged();this.maybeHasActiveOverridesChanged();},hasActiveOverrides:function()
+{return this._hasActiveOverrides;},maybeHasActiveOverridesChanged:function()
+{var hasActiveOverrides=WebInspector.settings.overrideUserAgent.get()||WebInspector.settings.overrideDeviceMetrics.get()||WebInspector.settings.overrideGeolocation.get()||WebInspector.settings.overrideDeviceOrientation.get()||WebInspector.settings.emulateTouchEvents.get()||WebInspector.settings.overrideCSSMedia.get();if(this._hasActiveOverrides!==hasActiveOverrides){this._hasActiveOverrides=hasActiveOverrides;this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.HasActiveOverridesChanged);}},_onMainFrameNavigated:function()
+{this._deviceMetricsChanged();this._updateUserAgentWarningMessage("");},_updateDeviceMetricsWarningMessage:function(warningMessage)
+{this._deviceMetricsWarningMessage=warningMessage;this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.OverridesWarningUpdated);},_updateUserAgentWarningMessage:function(warningMessage)
+{this._userAgentWarningMessage=warningMessage;this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.OverridesWarningUpdated);},warningMessage:function()
+{return this._deviceMetricsWarningMessage||this._userAgentWarningMessage||"";},__proto__:WebInspector.Object.prototype}
+WebInspector.overridesSupport;WebInspector.Database=function(model,id,domain,name,version)
+{this._model=model;this._id=id;this._domain=domain;this._name=name;this._version=version;}
+WebInspector.Database.prototype={get id()
+{return this._id;},get name()
+{return this._name;},set name(x)
+{this._name=x;},get version()
+{return this._version;},set version(x)
+{this._version=x;},get domain()
+{return this._domain;},set domain(x)
+{this._domain=x;},getTableNames:function(callback)
+{function sortingCallback(error,names)
+{if(!error)
+callback(names.sort());}
+DatabaseAgent.getDatabaseTableNames(this._id,sortingCallback);},executeSql:function(query,onSuccess,onError)
+{function callback(error,columnNames,values,errorObj)
+{if(error){onError(error);return;}
+if(errorObj){var message;if(errorObj.message)
+message=errorObj.message;else if(errorObj.code==2)
+message=WebInspector.UIString("Database no longer has expected version.");else
+message=WebInspector.UIString("An unexpected error %s occurred.",errorObj.code);onError(message);return;}
+onSuccess(columnNames,values);}
+DatabaseAgent.executeSQL(this._id,query,callback);}}
+WebInspector.DatabaseModel=function()
+{this._databases=[];InspectorBackend.registerDatabaseDispatcher(new WebInspector.DatabaseDispatcher(this));DatabaseAgent.enable();}
+WebInspector.DatabaseModel.Events={DatabaseAdded:"DatabaseAdded"}
+WebInspector.DatabaseModel.prototype={databases:function()
+{var result=[];for(var databaseId in this._databases)
+result.push(this._databases[databaseId]);return result;},databaseForId:function(databaseId)
+{return this._databases[databaseId];},_addDatabase:function(database)
+{this._databases.push(database);this.dispatchEventToListeners(WebInspector.DatabaseModel.Events.DatabaseAdded,database);},__proto__:WebInspector.Object.prototype}
+WebInspector.DatabaseDispatcher=function(model)
+{this._model=model;}
+WebInspector.DatabaseDispatcher.prototype={addDatabase:function(payload)
+{this._model._addDatabase(new WebInspector.Database(this._model,payload.id,payload.domain,payload.name,payload.version));}}
+WebInspector.databaseModel;WebInspector.DOMStorage=function(securityOrigin,isLocalStorage)
+{this._securityOrigin=securityOrigin;this._isLocalStorage=isLocalStorage;}
+WebInspector.DOMStorage.storageId=function(securityOrigin,isLocalStorage)
+{return{securityOrigin:securityOrigin,isLocalStorage:isLocalStorage};}
+WebInspector.DOMStorage.Events={DOMStorageItemsCleared:"DOMStorageItemsCleared",DOMStorageItemRemoved:"DOMStorageItemRemoved",DOMStorageItemAdded:"DOMStorageItemAdded",DOMStorageItemUpdated:"DOMStorageItemUpdated"}
+WebInspector.DOMStorage.prototype={get id()
+{return WebInspector.DOMStorage.storageId(this._securityOrigin,this._isLocalStorage);},get securityOrigin()
+{return this._securityOrigin;},get isLocalStorage()
+{return this._isLocalStorage;},getItems:function(callback)
+{DOMStorageAgent.getDOMStorageItems(this.id,callback);},setItem:function(key,value)
+{DOMStorageAgent.setDOMStorageItem(this.id,key,value);},removeItem:function(key)
+{DOMStorageAgent.removeDOMStorageItem(this.id,key);},__proto__:WebInspector.Object.prototype}
+WebInspector.DOMStorageModel=function()
+{this._storages={};InspectorBackend.registerDOMStorageDispatcher(new WebInspector.DOMStorageDispatcher(this));DOMStorageAgent.enable();WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded,this._securityOriginAdded,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved,this._securityOriginRemoved,this);}
+WebInspector.DOMStorageModel.Events={DOMStorageAdded:"DOMStorageAdded",DOMStorageRemoved:"DOMStorageRemoved"}
+WebInspector.DOMStorageModel.prototype={_securityOriginAdded:function(event)
+{var securityOrigin=(event.data);var localStorageKey=this._storageKey(securityOrigin,true);console.assert(!this._storages[localStorageKey]);var localStorage=new WebInspector.DOMStorage(securityOrigin,true);this._storages[localStorageKey]=localStorage;this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageAdded,localStorage);var sessionStorageKey=this._storageKey(securityOrigin,false);console.assert(!this._storages[sessionStorageKey]);var sessionStorage=new WebInspector.DOMStorage(securityOrigin,false);this._storages[sessionStorageKey]=sessionStorage;this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageAdded,sessionStorage);},_securityOriginRemoved:function(event)
+{var securityOrigin=(event.data);var localStorageKey=this._storageKey(securityOrigin,true);var localStorage=this._storages[localStorageKey];console.assert(localStorage);delete this._storages[localStorageKey];this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageRemoved,localStorage);var sessionStorageKey=this._storageKey(securityOrigin,false);var sessionStorage=this._storages[sessionStorageKey];console.assert(sessionStorage);delete this._storages[sessionStorageKey];this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageRemoved,sessionStorage);},_storageKey:function(securityOrigin,isLocalStorage)
+{return JSON.stringify(WebInspector.DOMStorage.storageId(securityOrigin,isLocalStorage));},_domStorageItemsCleared:function(storageId)
+{var domStorage=this.storageForId(storageId);if(!domStorage)
+return;var eventData={};domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemsCleared,eventData);},_domStorageItemRemoved:function(storageId,key)
+{var domStorage=this.storageForId(storageId);if(!domStorage)
+return;var eventData={key:key};domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemRemoved,eventData);},_domStorageItemAdded:function(storageId,key,value)
+{var domStorage=this.storageForId(storageId);if(!domStorage)
+return;var eventData={key:key,value:value};domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemAdded,eventData);},_domStorageItemUpdated:function(storageId,key,oldValue,value)
+{var domStorage=this.storageForId(storageId);if(!domStorage)
+return;var eventData={key:key,oldValue:oldValue,value:value};domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemUpdated,eventData);},storageForId:function(storageId)
+{return this._storages[JSON.stringify(storageId)];},storages:function()
+{var result=[];for(var id in this._storages)
+result.push(this._storages[id]);return result;},__proto__:WebInspector.Object.prototype}
+WebInspector.DOMStorageDispatcher=function(model)
+{this._model=model;}
+WebInspector.DOMStorageDispatcher.prototype={domStorageItemsCleared:function(storageId)
+{this._model._domStorageItemsCleared(storageId);},domStorageItemRemoved:function(storageId,key)
+{this._model._domStorageItemRemoved(storageId,key);},domStorageItemAdded:function(storageId,key,value)
+{this._model._domStorageItemAdded(storageId,key,value);},domStorageItemUpdated:function(storageId,key,oldValue,value)
+{this._model._domStorageItemUpdated(storageId,key,oldValue,value);},}
+WebInspector.domStorageModel;WebInspector.DataGrid=function(columnsArray,editCallback,deleteCallback,refreshCallback,contextMenuCallback)
+{WebInspector.View.call(this);this.registerRequiredCSS("dataGrid.css");this.element.className="data-grid";this.element.tabIndex=0;this.element.addEventListener("keydown",this._keyDown.bind(this),false);this._headerTable=document.createElement("table");this._headerTable.className="header";this._headerTableHeaders={};this._dataTable=document.createElement("table");this._dataTable.className="data";this._dataTable.addEventListener("mousedown",this._mouseDownInDataTable.bind(this),true);this._dataTable.addEventListener("click",this._clickInDataTable.bind(this),true);this._dataTable.addEventListener("contextmenu",this._contextMenuInDataTable.bind(this),true);if(editCallback)
+this._dataTable.addEventListener("dblclick",this._ondblclick.bind(this),false);this._editCallback=editCallback;this._deleteCallback=deleteCallback;this._refreshCallback=refreshCallback;this._contextMenuCallback=contextMenuCallback;this._scrollContainer=document.createElement("div");this._scrollContainer.className="data-container";this._scrollContainer.appendChild(this._dataTable);this.element.appendChild(this._headerTable);this.element.appendChild(this._scrollContainer);var headerRow=document.createElement("tr");var columnGroup=document.createElement("colgroup");columnGroup.span=columnsArray.length;var fillerRow=document.createElement("tr");fillerRow.className="filler";this._columnsArray=columnsArray;this.columns={};for(var i=0;i<columnsArray.length;++i){var column=columnsArray[i];column.ordinal=i;var columnIdentifier=column.identifier=column.id||i;this.columns[columnIdentifier]=column;if(column.disclosure)
+this.disclosureColumnIdentifier=columnIdentifier;var col=document.createElement("col");if(column.width)
+col.style.width=column.width;column.element=col;columnGroup.appendChild(col);var cell=document.createElement("th");cell.className=columnIdentifier+"-column";cell.columnIdentifier=columnIdentifier;this._headerTableHeaders[columnIdentifier]=cell;var div=document.createElement("div");if(column.titleDOMFragment)
+div.appendChild(column.titleDOMFragment);else
+div.textContent=column.title;cell.appendChild(div);if(column.sort){cell.classList.add("sort-"+column.sort);this._sortColumnCell=cell;}
+if(column.sortable){cell.addEventListener("click",this._clickInHeaderCell.bind(this),false);cell.classList.add("sortable");}
+headerRow.appendChild(cell);fillerRow.createChild("td",columnIdentifier+"-column");}
+headerRow.createChild("th","corner");fillerRow.createChild("td","corner");columnGroup.createChild("col","corner");this._headerTableColumnGroup=columnGroup;this._headerTable.appendChild(this._headerTableColumnGroup);this.headerTableBody.appendChild(headerRow);this._dataTableColumnGroup=columnGroup.cloneNode(true);this._dataTable.appendChild(this._dataTableColumnGroup);this.dataTableBody.appendChild(fillerRow);this.selectedNode=null;this.expandNodesWhenArrowing=false;this.setRootNode(new WebInspector.DataGridNode());this.indentWidth=15;this.resizers=[];this._columnWidthsInitialized=false;}
+WebInspector.DataGrid.ColumnDescriptor;WebInspector.DataGrid.Events={SelectedNode:"SelectedNode",DeselectedNode:"DeselectedNode",SortingChanged:"SortingChanged",ColumnsResized:"ColumnsResized"}
+WebInspector.DataGrid.Order={Ascending:"ascending",Descending:"descending"}
+WebInspector.DataGrid.Align={Center:"center",Right:"right"}
+WebInspector.DataGrid.createSortableDataGrid=function(columnNames,values)
+{var numColumns=columnNames.length;if(!numColumns)
+return null;var columns=[];for(var i=0;i<columnNames.length;++i)
+columns.push({title:columnNames[i],width:columnNames[i].length,sortable:true});var nodes=[];for(var i=0;i<values.length/numColumns;++i){var data={};for(var j=0;j<columnNames.length;++j)
+data[j]=values[numColumns*i+j];var node=new WebInspector.DataGridNode(data,false);node.selectable=false;nodes.push(node);}
+var dataGrid=new WebInspector.DataGrid(columns);var length=nodes.length;for(var i=0;i<length;++i)
+dataGrid.rootNode().appendChild(nodes[i]);dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged,sortDataGrid);function sortDataGrid()
+{var nodes=dataGrid._rootNode.children.slice();var sortColumnIdentifier=dataGrid.sortColumnIdentifier();var sortDirection=dataGrid.isSortOrderAscending()?1:-1;var columnIsNumeric=true;for(var i=0;i<nodes.length;i++){var value=nodes[i].data[sortColumnIdentifier];value=value instanceof Node?Number(value.textContent):Number(value);if(isNaN(value)){columnIsNumeric=false;break;}}
+function comparator(dataGridNode1,dataGridNode2)
+{var item1=dataGridNode1.data[sortColumnIdentifier];var item2=dataGridNode2.data[sortColumnIdentifier];item1=item1 instanceof Node?item1.textContent:String(item1);item2=item2 instanceof Node?item2.textContent:String(item2);var comparison;if(columnIsNumeric){var number1=parseFloat(item1);var number2=parseFloat(item2);comparison=number1<number2?-1:(number1>number2?1:0);}else
+comparison=item1<item2?-1:(item1>item2?1:0);return sortDirection*comparison;}
+nodes.sort(comparator);dataGrid.rootNode().removeChildren();for(var i=0;i<nodes.length;i++)
+dataGrid._rootNode.appendChild(nodes[i]);}
+return dataGrid;}
+WebInspector.DataGrid.prototype={setRootNode:function(rootNode)
+{if(this._rootNode){this._rootNode.removeChildren();this._rootNode.dataGrid=null;this._rootNode._isRoot=false;}
+this._rootNode=rootNode;rootNode._isRoot=true;rootNode.hasChildren=false;rootNode._expanded=true;rootNode._revealed=true;rootNode.dataGrid=this;},rootNode:function()
+{return this._rootNode;},_ondblclick:function(event)
+{if(this._editing||this._editingNode)
+return;var columnIdentifier=this.columnIdentifierFromNode(event.target);if(!columnIdentifier||!this.columns[columnIdentifier].editable)
+return;this._startEditing(event.target);},_startEditingColumnOfDataGridNode:function(node,columnOrdinal)
+{this._editing=true;this._editingNode=node;this._editingNode.select();var element=this._editingNode._element.children[columnOrdinal];WebInspector.InplaceEditor.startEditing(element,this._startEditingConfig(element));window.getSelection().setBaseAndExtent(element,0,element,1);},_startEditing:function(target)
+{var element=target.enclosingNodeOrSelfWithNodeName("td");if(!element)
+return;this._editingNode=this.dataGridNodeFromNode(target);if(!this._editingNode){if(!this.creationNode)
+return;this._editingNode=this.creationNode;}
+if(this._editingNode.isCreationNode)
+return this._startEditingColumnOfDataGridNode(this._editingNode,this._nextEditableColumn(-1));this._editing=true;WebInspector.InplaceEditor.startEditing(element,this._startEditingConfig(element));window.getSelection().setBaseAndExtent(element,0,element,1);},renderInline:function()
+{this.element.classList.add("inline");},_startEditingConfig:function(element)
+{return new WebInspector.InplaceEditor.Config(this._editingCommitted.bind(this),this._editingCancelled.bind(this),element.textContent);},_editingCommitted:function(element,newText,oldText,context,moveDirection)
+{var columnIdentifier=this.columnIdentifierFromNode(element);if(!columnIdentifier){this._editingCancelled(element);return;}
+var columnOrdinal=this.columns[columnIdentifier].ordinal;var textBeforeEditing=this._editingNode.data[columnIdentifier];var currentEditingNode=this._editingNode;function moveToNextIfNeeded(wasChange){if(!moveDirection)
+return;if(moveDirection==="forward"){var firstEditableColumn=this._nextEditableColumn(-1);if(currentEditingNode.isCreationNode&&columnOrdinal===firstEditableColumn&&!wasChange)
+return;var nextEditableColumn=this._nextEditableColumn(columnOrdinal);if(nextEditableColumn!==-1)
+return this._startEditingColumnOfDataGridNode(currentEditingNode,nextEditableColumn);var nextDataGridNode=currentEditingNode.traverseNextNode(true,null,true);if(nextDataGridNode)
+return this._startEditingColumnOfDataGridNode(nextDataGridNode,firstEditableColumn);if(currentEditingNode.isCreationNode&&wasChange){this.addCreationNode(false);return this._startEditingColumnOfDataGridNode(this.creationNode,firstEditableColumn);}
+return;}
+if(moveDirection==="backward"){var prevEditableColumn=this._nextEditableColumn(columnOrdinal,true);if(prevEditableColumn!==-1)
+return this._startEditingColumnOfDataGridNode(currentEditingNode,prevEditableColumn);var lastEditableColumn=this._nextEditableColumn(this._columnsArray.length,true);var nextDataGridNode=currentEditingNode.traversePreviousNode(true,true);if(nextDataGridNode)
+return this._startEditingColumnOfDataGridNode(nextDataGridNode,lastEditableColumn);return;}}
+if(textBeforeEditing==newText){this._editingCancelled(element);moveToNextIfNeeded.call(this,false);return;}
+this._editingNode.data[columnIdentifier]=newText;this._editCallback(this._editingNode,columnIdentifier,textBeforeEditing,newText);if(this._editingNode.isCreationNode)
+this.addCreationNode(false);this._editingCancelled(element);moveToNextIfNeeded.call(this,true);},_editingCancelled:function(element)
+{delete this._editing;this._editingNode=null;},_nextEditableColumn:function(columnOrdinal,moveBackward)
+{var increment=moveBackward?-1:1;var columns=this._columnsArray;for(var i=columnOrdinal+increment;(i>=0)&&(i<columns.length);i+=increment){if(columns[i].editable)
+return i;}
+return-1;},sortColumnIdentifier:function()
+{if(!this._sortColumnCell)
+return null;return this._sortColumnCell.columnIdentifier;},sortOrder:function()
+{if(!this._sortColumnCell||this._sortColumnCell.classList.contains("sort-ascending"))
+return WebInspector.DataGrid.Order.Ascending;if(this._sortColumnCell.classList.contains("sort-descending"))
+return WebInspector.DataGrid.Order.Descending;return null;},isSortOrderAscending:function()
+{return!this._sortColumnCell||this._sortColumnCell.classList.contains("sort-ascending");},get headerTableBody()
+{if("_headerTableBody"in this)
+return this._headerTableBody;this._headerTableBody=this._headerTable.getElementsByTagName("tbody")[0];if(!this._headerTableBody){this._headerTableBody=this.element.ownerDocument.createElement("tbody");this._headerTable.insertBefore(this._headerTableBody,this._headerTable.tFoot);}
+return this._headerTableBody;},get dataTableBody()
+{if("_dataTableBody"in this)
+return this._dataTableBody;this._dataTableBody=this._dataTable.getElementsByTagName("tbody")[0];if(!this._dataTableBody){this._dataTableBody=this.element.ownerDocument.createElement("tbody");this._dataTable.insertBefore(this._dataTableBody,this._dataTable.tFoot);}
+return this._dataTableBody;},_autoSizeWidths:function(widths,minPercent,maxPercent)
+{if(minPercent)
+minPercent=Math.min(minPercent,Math.floor(100/widths.length));var totalWidth=0;for(var i=0;i<widths.length;++i)
+totalWidth+=widths[i];var totalPercentWidth=0;for(var i=0;i<widths.length;++i){var width=Math.round(100*widths[i]/totalWidth);if(minPercent&&width<minPercent)
+width=minPercent;else if(maxPercent&&width>maxPercent)
+width=maxPercent;totalPercentWidth+=width;widths[i]=width;}
+var recoupPercent=totalPercentWidth-100;while(minPercent&&recoupPercent>0){for(var i=0;i<widths.length;++i){if(widths[i]>minPercent){--widths[i];--recoupPercent;if(!recoupPercent)
+break;}}}
+while(maxPercent&&recoupPercent<0){for(var i=0;i<widths.length;++i){if(widths[i]<maxPercent){++widths[i];++recoupPercent;if(!recoupPercent)
+break;}}}
+return widths;},autoSizeColumns:function(minPercent,maxPercent,maxDescentLevel)
+{var widths=[];for(var i=0;i<this._columnsArray.length;++i)
+widths.push((this._columnsArray[i].title||"").length);maxDescentLevel=maxDescentLevel||0;var children=this._enumerateChildren(this._rootNode,[],maxDescentLevel+1);for(var i=0;i<children.length;++i){var node=children[i];for(var j=0;j<this._columnsArray.length;++j){var text=node.data[this._columnsArray[j].identifier]||"";if(text.length>widths[j])
+widths[j]=text.length;}}
+widths=this._autoSizeWidths(widths,minPercent,maxPercent);for(var i=0;i<this._columnsArray.length;++i)
+this._columnsArray[i].element.style.width=widths[i]+"%";this._columnWidthsInitialized=false;this.updateWidths();},_enumerateChildren:function(rootNode,result,maxLevel)
+{if(!rootNode._isRoot)
+result.push(rootNode);if(!maxLevel)
+return;for(var i=0;i<rootNode.children.length;++i)
+this._enumerateChildren(rootNode.children[i],result,maxLevel-1);return result;},onResize:function()
+{this.updateWidths();},updateWidths:function()
+{var headerTableColumns=this._headerTableColumnGroup.children;var tableWidth=this._dataTable.offsetWidth;var numColumns=headerTableColumns.length-1;if(!this._columnWidthsInitialized&&this.element.offsetWidth){for(var i=0;i<numColumns;i++){var columnWidth=this.headerTableBody.rows[0].cells[i].offsetWidth;var percentWidth=(100*columnWidth/tableWidth)+"%";this._headerTableColumnGroup.children[i].style.width=percentWidth;this._dataTableColumnGroup.children[i].style.width=percentWidth;}
+this._columnWidthsInitialized=true;}
+this._positionResizers();this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);},setName:function(name)
+{this._columnWeightsSetting=WebInspector.settings.createSetting("dataGrid-"+name+"-columnWeights",{});this._loadColumnWeights();},_loadColumnWeights:function()
+{if(!this._columnWeightsSetting)
+return;var weights=this._columnWeightsSetting.get();for(var i=0;i<this._columnsArray.length;++i){var column=this._columnsArray[i];var weight=weights[column.identifier];if(weight)
+column.weight=weight;}
+this.applyColumnWeights();},_saveColumnWeights:function()
+{if(!this._columnWeightsSetting)
+return;var weights={};for(var i=0;i<this._columnsArray.length;++i){var column=this._columnsArray[i];weights[column.identifier]=column.weight;}
+this._columnWeightsSetting.set(weights);},wasShown:function()
+{this._loadColumnWeights();},applyColumnWeights:function()
+{var sumOfWeights=0.0;for(var i=0;i<this._columnsArray.length;++i){var column=this._columnsArray[i];if(this.isColumnVisible(column))
+sumOfWeights+=column.weight;}
+for(var i=0;i<this._columnsArray.length;++i){var column=this._columnsArray[i];var width=this.isColumnVisible(column)?(100*column.weight/sumOfWeights)+"%":"0%";this._headerTableColumnGroup.children[i].style.width=width;this._dataTableColumnGroup.children[i].style.width=width;}
+this._positionResizers();this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);},isColumnVisible:function(column)
+{return!column.hidden;},setColumnVisible:function(columnIdentifier,visible)
+{if(visible===!this.columns[columnIdentifier].hidden)
+return;this.columns[columnIdentifier].hidden=!visible;this.element.classList.toggle("hide-"+columnIdentifier+"-column",!visible);},get scrollContainer()
+{return this._scrollContainer;},isScrolledToLastRow:function()
+{return this._scrollContainer.isScrolledToBottom();},scrollToLastRow:function()
+{this._scrollContainer.scrollTop=this._scrollContainer.scrollHeight-this._scrollContainer.offsetHeight;},_positionResizers:function()
+{var headerTableColumns=this._headerTableColumnGroup.children;var numColumns=headerTableColumns.length-1;var left=[];var previousResizer=null;for(var i=0;i<numColumns-1;i++){left[i]=(left[i-1]||0)+this.headerTableBody.rows[0].cells[i].offsetWidth;}
+for(var i=0;i<numColumns-1;i++){var resizer=this.resizers[i];if(!resizer){resizer=document.createElement("div");resizer.classList.add("data-grid-resizer");WebInspector.installDragHandle(resizer,this._startResizerDragging.bind(this),this._resizerDragging.bind(this),this._endResizerDragging.bind(this),"col-resize");this.element.appendChild(resizer);this.resizers[i]=resizer;}
+if(!this._columnsArray[i].hidden){resizer.style.removeProperty("display");if(resizer._position!==left[i]){resizer._position=left[i];resizer.style.left=left[i]+"px";}
+resizer.leftNeighboringColumnIndex=i;if(previousResizer)
+previousResizer.rightNeighboringColumnIndex=i;previousResizer=resizer;}else{if(previousResizer&&previousResizer._position!==left[i]){previousResizer._position=left[i];previousResizer.style.left=left[i]+"px";}
+if(resizer.style.getPropertyValue("display")!=="none")
+resizer.style.setProperty("display","none");resizer.leftNeighboringColumnIndex=0;resizer.rightNeighboringColumnIndex=0;}}
+if(previousResizer)
+previousResizer.rightNeighboringColumnIndex=numColumns-1;},addCreationNode:function(hasChildren)
+{if(this.creationNode)
+this.creationNode.makeNormal();var emptyData={};for(var column in this.columns)
+emptyData[column]=null;this.creationNode=new WebInspector.CreationDataGridNode(emptyData,hasChildren);this.rootNode().appendChild(this.creationNode);},sortNodes:function(comparator,reverseMode)
+{function comparatorWrapper(a,b)
+{if(a._dataGridNode._data.summaryRow)
+return 1;if(b._dataGridNode._data.summaryRow)
+return-1;var aDataGirdNode=a._dataGridNode;var bDataGirdNode=b._dataGridNode;return reverseMode?comparator(bDataGirdNode,aDataGirdNode):comparator(aDataGirdNode,bDataGirdNode);}
+var tbody=this.dataTableBody;var tbodyParent=tbody.parentElement;tbodyParent.removeChild(tbody);var childNodes=tbody.childNodes;var fillerRow=childNodes[childNodes.length-1];var sortedRows=Array.prototype.slice.call(childNodes,0,childNodes.length-1);sortedRows.sort(comparatorWrapper);var sortedRowsLength=sortedRows.length;tbody.removeChildren();var previousSiblingNode=null;for(var i=0;i<sortedRowsLength;++i){var row=sortedRows[i];var node=row._dataGridNode;node.previousSibling=previousSiblingNode;if(previousSiblingNode)
+previousSiblingNode.nextSibling=node;tbody.appendChild(row);previousSiblingNode=node;}
+if(previousSiblingNode)
+previousSiblingNode.nextSibling=null;tbody.appendChild(fillerRow);tbodyParent.appendChild(tbody);},_keyDown:function(event)
+{if(!this.selectedNode||event.shiftKey||event.metaKey||event.ctrlKey||this._editing)
+return;var handled=false;var nextSelectedNode;if(event.keyIdentifier==="Up"&&!event.altKey){nextSelectedNode=this.selectedNode.traversePreviousNode(true);while(nextSelectedNode&&!nextSelectedNode.selectable)
+nextSelectedNode=nextSelectedNode.traversePreviousNode(true);handled=nextSelectedNode?true:false;}else if(event.keyIdentifier==="Down"&&!event.altKey){nextSelectedNode=this.selectedNode.traverseNextNode(true);while(nextSelectedNode&&!nextSelectedNode.selectable)
+nextSelectedNode=nextSelectedNode.traverseNextNode(true);handled=nextSelectedNode?true:false;}else if(event.keyIdentifier==="Left"){if(this.selectedNode.expanded){if(event.altKey)
+this.selectedNode.collapseRecursively();else
+this.selectedNode.collapse();handled=true;}else if(this.selectedNode.parent&&!this.selectedNode.parent._isRoot){handled=true;if(this.selectedNode.parent.selectable){nextSelectedNode=this.selectedNode.parent;handled=nextSelectedNode?true:false;}else if(this.selectedNode.parent)
+this.selectedNode.parent.collapse();}}else if(event.keyIdentifier==="Right"){if(!this.selectedNode.revealed){this.selectedNode.reveal();handled=true;}else if(this.selectedNode.hasChildren){handled=true;if(this.selectedNode.expanded){nextSelectedNode=this.selectedNode.children[0];handled=nextSelectedNode?true:false;}else{if(event.altKey)
+this.selectedNode.expandRecursively();else
+this.selectedNode.expand();}}}else if(event.keyCode===8||event.keyCode===46){if(this._deleteCallback){handled=true;this._deleteCallback(this.selectedNode);this.changeNodeAfterDeletion();}}else if(isEnterKey(event)){if(this._editCallback){handled=true;this._startEditing(this.selectedNode._element.children[this._nextEditableColumn(-1)]);}}
+if(nextSelectedNode){nextSelectedNode.reveal();nextSelectedNode.select();}
+if(handled)
+event.consume(true);},changeNodeAfterDeletion:function()
+{var nextSelectedNode=this.selectedNode.traverseNextNode(true);while(nextSelectedNode&&!nextSelectedNode.selectable)
+nextSelectedNode=nextSelectedNode.traverseNextNode(true);if(!nextSelectedNode||nextSelectedNode.isCreationNode){nextSelectedNode=this.selectedNode.traversePreviousNode(true);while(nextSelectedNode&&!nextSelectedNode.selectable)
+nextSelectedNode=nextSelectedNode.traversePreviousNode(true);}
+if(nextSelectedNode){nextSelectedNode.reveal();nextSelectedNode.select();}},dataGridNodeFromNode:function(target)
+{var rowElement=target.enclosingNodeOrSelfWithNodeName("tr");return rowElement&&rowElement._dataGridNode;},columnIdentifierFromNode:function(target)
+{var cellElement=target.enclosingNodeOrSelfWithNodeName("td");return cellElement&&cellElement.columnIdentifier_;},_clickInHeaderCell:function(event)
+{var cell=event.target.enclosingNodeOrSelfWithNodeName("th");if(!cell||(typeof cell.columnIdentifier==="undefined")||!cell.classList.contains("sortable"))
+return;var sortOrder=WebInspector.DataGrid.Order.Ascending;if((cell===this._sortColumnCell)&&this.isSortOrderAscending())
+sortOrder=WebInspector.DataGrid.Order.Descending;if(this._sortColumnCell)
+this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+");this._sortColumnCell=cell;cell.classList.add("sort-"+sortOrder);this.dispatchEventToListeners(WebInspector.DataGrid.Events.SortingChanged);},markColumnAsSortedBy:function(columnIdentifier,sortOrder)
+{if(this._sortColumnCell)
+this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+");this._sortColumnCell=this._headerTableHeaders[columnIdentifier];this._sortColumnCell.classList.add("sort-"+sortOrder);},headerTableHeader:function(columnIdentifier)
+{return this._headerTableHeaders[columnIdentifier];},_mouseDownInDataTable:function(event)
+{var gridNode=this.dataGridNodeFromNode(event.target);if(!gridNode||!gridNode.selectable)
+return;if(gridNode.isEventWithinDisclosureTriangle(event))
+return;if(event.metaKey){if(gridNode.selected)
+gridNode.deselect();else
+gridNode.select();}else
+gridNode.select();},_contextMenuInDataTable:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);var gridNode=this.dataGridNodeFromNode(event.target);if(this._refreshCallback&&(!gridNode||gridNode!==this.creationNode))
+contextMenu.appendItem(WebInspector.UIString("Refresh"),this._refreshCallback.bind(this));if(gridNode&&gridNode.selectable&&!gridNode.isEventWithinDisclosureTriangle(event)){if(this._editCallback){if(gridNode===this.creationNode)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add new":"Add New"),this._startEditing.bind(this,event.target));else{var columnIdentifier=this.columnIdentifierFromNode(event.target);if(columnIdentifier&&this.columns[columnIdentifier].editable)
+contextMenu.appendItem(WebInspector.UIString("Edit \"%s\"",this.columns[columnIdentifier].title),this._startEditing.bind(this,event.target));}}
+if(this._deleteCallback&&gridNode!==this.creationNode)
+contextMenu.appendItem(WebInspector.UIString("Delete"),this._deleteCallback.bind(this,gridNode));if(this._contextMenuCallback)
+this._contextMenuCallback(contextMenu,gridNode);}
+contextMenu.show();},_clickInDataTable:function(event)
+{var gridNode=this.dataGridNodeFromNode(event.target);if(!gridNode||!gridNode.hasChildren)
+return;if(!gridNode.isEventWithinDisclosureTriangle(event))
+return;if(gridNode.expanded){if(event.altKey)
+gridNode.collapseRecursively();else
+gridNode.collapse();}else{if(event.altKey)
+gridNode.expandRecursively();else
+gridNode.expand();}},get resizeMethod()
+{if(typeof this._resizeMethod==="undefined")
+return WebInspector.DataGrid.ResizeMethod.Nearest;return this._resizeMethod;},set resizeMethod(method)
+{this._resizeMethod=method;},_startResizerDragging:function(event)
+{this._currentResizer=event.target;return!!this._currentResizer.rightNeighboringColumnIndex;},_resizerDragging:function(event)
+{var resizer=this._currentResizer;if(!resizer)
+return;var tableWidth=this._dataTable.offsetWidth;var dragPoint=event.clientX-this.element.totalOffsetLeft();var leftCellIndex=resizer.leftNeighboringColumnIndex;var rightCellIndex=resizer.rightNeighboringColumnIndex;var firstRowCells=this.headerTableBody.rows[0].cells;var leftEdgeOfPreviousColumn=0;for(var i=0;i<leftCellIndex;i++)
+leftEdgeOfPreviousColumn+=firstRowCells[i].offsetWidth;if(this.resizeMethod==WebInspector.DataGrid.ResizeMethod.Last){rightCellIndex=this.resizers.length;}else if(this.resizeMethod==WebInspector.DataGrid.ResizeMethod.First){leftEdgeOfPreviousColumn+=firstRowCells[leftCellIndex].offsetWidth-firstRowCells[0].offsetWidth;leftCellIndex=0;}
+var rightEdgeOfNextColumn=leftEdgeOfPreviousColumn+firstRowCells[leftCellIndex].offsetWidth+firstRowCells[rightCellIndex].offsetWidth;var leftMinimum=leftEdgeOfPreviousColumn+this.ColumnResizePadding;var rightMaximum=rightEdgeOfNextColumn-this.ColumnResizePadding;if(leftMinimum>rightMaximum)
+return;dragPoint=Number.constrain(dragPoint,leftMinimum,rightMaximum);resizer.style.left=(dragPoint-this.CenterResizerOverBorderAdjustment)+"px";var percentLeftColumn=(100*(dragPoint-leftEdgeOfPreviousColumn)/tableWidth)+"%";this._headerTableColumnGroup.children[leftCellIndex].style.width=percentLeftColumn;this._dataTableColumnGroup.children[leftCellIndex].style.width=percentLeftColumn;var percentRightColumn=(100*(rightEdgeOfNextColumn-dragPoint)/tableWidth)+"%";this._headerTableColumnGroup.children[rightCellIndex].style.width=percentRightColumn;this._dataTableColumnGroup.children[rightCellIndex].style.width=percentRightColumn;var leftColumn=this._columnsArray[leftCellIndex];var rightColumn=this._columnsArray[rightCellIndex];if(leftColumn.weight||rightColumn.weight){var sumOfWeights=leftColumn.weight+rightColumn.weight;var delta=rightEdgeOfNextColumn-leftEdgeOfPreviousColumn;leftColumn.weight=(dragPoint-leftEdgeOfPreviousColumn)*sumOfWeights/delta;rightColumn.weight=(rightEdgeOfNextColumn-dragPoint)*sumOfWeights/delta;}
+this._positionResizers();event.preventDefault();this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);},_endResizerDragging:function(event)
+{this._currentResizer=null;this._saveColumnWeights();this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);},defaultAttachLocation:function()
+{return this.dataTableBody.firstChild;},ColumnResizePadding:24,CenterResizerOverBorderAdjustment:3,__proto__:WebInspector.View.prototype}
+WebInspector.DataGrid.ResizeMethod={Nearest:"nearest",First:"first",Last:"last"}
+WebInspector.DataGridNode=function(data,hasChildren)
+{this._expanded=false;this._selected=false;this._shouldRefreshChildren=true;this._data=data||{};this.hasChildren=hasChildren||false;this.children=[];this.dataGrid=null;this.parent=null;this.previousSibling=null;this.nextSibling=null;this.disclosureToggleWidth=10;}
+WebInspector.DataGridNode.prototype={selectable:true,_isRoot:false,get element()
+{if(this._element)
+return this._element;if(!this.dataGrid)
+return null;this._element=document.createElement("tr");this._element._dataGridNode=this;if(this.hasChildren)
+this._element.classList.add("parent");if(this.expanded)
+this._element.classList.add("expanded");if(this.selected)
+this._element.classList.add("selected");if(this.revealed)
+this._element.classList.add("revealed");this.createCells();this._element.createChild("td","corner");return this._element;},createCells:function()
+{var columnsArray=this.dataGrid._columnsArray;for(var i=0;i<columnsArray.length;++i){var cell=this.createCell(columnsArray[i].identifier);this._element.appendChild(cell);}},get data()
+{return this._data;},set data(x)
+{this._data=x||{};this.refresh();},get revealed()
+{if("_revealed"in this)
+return this._revealed;var currentAncestor=this.parent;while(currentAncestor&&!currentAncestor._isRoot){if(!currentAncestor.expanded){this._revealed=false;return false;}
+currentAncestor=currentAncestor.parent;}
+this._revealed=true;return true;},set hasChildren(x)
+{if(this._hasChildren===x)
+return;this._hasChildren=x;if(!this._element)
+return;this._element.classList.toggle("parent",this._hasChildren);this._element.classList.toggle("expanded",this._hasChildren&&this.expanded);},get hasChildren()
+{return this._hasChildren;},set revealed(x)
+{if(this._revealed===x)
+return;this._revealed=x;if(this._element)
+this._element.classList.toggle("revealed",this._revealed);for(var i=0;i<this.children.length;++i)
+this.children[i].revealed=x&&this.expanded;},get depth()
+{if("_depth"in this)
+return this._depth;if(this.parent&&!this.parent._isRoot)
+this._depth=this.parent.depth+1;else
+this._depth=0;return this._depth;},get leftPadding()
+{if(typeof this._leftPadding==="number")
+return this._leftPadding;this._leftPadding=this.depth*this.dataGrid.indentWidth;return this._leftPadding;},get shouldRefreshChildren()
+{return this._shouldRefreshChildren;},set shouldRefreshChildren(x)
+{this._shouldRefreshChildren=x;if(x&&this.expanded)
+this.expand();},get selected()
+{return this._selected;},set selected(x)
+{if(x)
+this.select();else
+this.deselect();},get expanded()
+{return this._expanded;},set expanded(x)
+{if(x)
+this.expand();else
+this.collapse();},refresh:function()
+{if(!this._element||!this.dataGrid)
+return;this._element.removeChildren();this.createCells();this._element.createChild("td","corner");},createTD:function(columnIdentifier)
+{var cell=document.createElement("td");cell.className=columnIdentifier+"-column";cell.columnIdentifier_=columnIdentifier;var alignment=this.dataGrid.columns[columnIdentifier].align;if(alignment)
+cell.classList.add(alignment);return cell;},createCell:function(columnIdentifier)
+{var cell=this.createTD(columnIdentifier);var data=this.data[columnIdentifier];var div=document.createElement("div");if(data instanceof Node)
+div.appendChild(data);else{div.textContent=data;if(this.dataGrid.columns[columnIdentifier].longText)
+div.title=data;}
+cell.appendChild(div);if(columnIdentifier===this.dataGrid.disclosureColumnIdentifier){cell.classList.add("disclosure");if(this.leftPadding)
+cell.style.setProperty("padding-left",this.leftPadding+"px");}
+return cell;},nodeSelfHeight:function()
+{return 16;},appendChild:function(child)
+{this.insertChild(child,this.children.length);},insertChild:function(child,index)
+{if(!child)
+throw("insertChild: Node can't be undefined or null.");if(child.parent===this)
+throw("insertChild: Node is already a child of this node.");if(child.parent)
+child.parent.removeChild(child);this.children.splice(index,0,child);this.hasChildren=true;child.parent=this;child.dataGrid=this.dataGrid;child._recalculateSiblings(index);delete child._depth;delete child._revealed;delete child._attached;child._shouldRefreshChildren=true;var current=child.children[0];while(current){current.dataGrid=this.dataGrid;delete current._depth;delete current._revealed;delete current._attached;current._shouldRefreshChildren=true;current=current.traverseNextNode(false,child,true);}
+if(this.expanded)
+child._attach();if(!this.revealed)
+child.revealed=false;},removeChild:function(child)
+{if(!child)
+throw("removeChild: Node can't be undefined or null.");if(child.parent!==this)
+throw("removeChild: Node is not a child of this node.");child.deselect();child._detach();this.children.remove(child,true);if(child.previousSibling)
+child.previousSibling.nextSibling=child.nextSibling;if(child.nextSibling)
+child.nextSibling.previousSibling=child.previousSibling;child.dataGrid=null;child.parent=null;child.nextSibling=null;child.previousSibling=null;if(this.children.length<=0)
+this.hasChildren=false;},removeChildren:function()
+{for(var i=0;i<this.children.length;++i){var child=this.children[i];child.deselect();child._detach();child.dataGrid=null;child.parent=null;child.nextSibling=null;child.previousSibling=null;}
+this.children=[];this.hasChildren=false;},_recalculateSiblings:function(myIndex)
+{if(!this.parent)
+return;var previousChild=(myIndex>0?this.parent.children[myIndex-1]:null);if(previousChild){previousChild.nextSibling=this;this.previousSibling=previousChild;}else
+this.previousSibling=null;var nextChild=this.parent.children[myIndex+1];if(nextChild){nextChild.previousSibling=this;this.nextSibling=nextChild;}else
+this.nextSibling=null;},collapse:function()
+{if(this._isRoot)
+return;if(this._element)
+this._element.classList.remove("expanded");this._expanded=false;for(var i=0;i<this.children.length;++i)
+this.children[i].revealed=false;},collapseRecursively:function()
+{var item=this;while(item){if(item.expanded)
+item.collapse();item=item.traverseNextNode(false,this,true);}},populate:function(){},expand:function()
+{if(!this.hasChildren||this.expanded)
+return;if(this._isRoot)
+return;if(this.revealed&&!this._shouldRefreshChildren)
+for(var i=0;i<this.children.length;++i)
+this.children[i].revealed=true;if(this._shouldRefreshChildren){for(var i=0;i<this.children.length;++i)
+this.children[i]._detach();this.populate();if(this._attached){for(var i=0;i<this.children.length;++i){var child=this.children[i];if(this.revealed)
+child.revealed=true;child._attach();}}
+delete this._shouldRefreshChildren;}
+if(this._element)
+this._element.classList.add("expanded");this._expanded=true;},expandRecursively:function()
+{var item=this;while(item){item.expand();item=item.traverseNextNode(false,this);}},reveal:function()
+{if(this._isRoot)
+return;var currentAncestor=this.parent;while(currentAncestor&&!currentAncestor._isRoot){if(!currentAncestor.expanded)
+currentAncestor.expand();currentAncestor=currentAncestor.parent;}
+this.element.scrollIntoViewIfNeeded(false);},select:function(supressSelectedEvent)
+{if(!this.dataGrid||!this.selectable||this.selected)
+return;if(this.dataGrid.selectedNode)
+this.dataGrid.selectedNode.deselect();this._selected=true;this.dataGrid.selectedNode=this;if(this._element)
+this._element.classList.add("selected");if(!supressSelectedEvent)
+this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.SelectedNode);},revealAndSelect:function()
+{if(this._isRoot)
+return;this.reveal();this.select();},deselect:function(supressDeselectedEvent)
+{if(!this.dataGrid||this.dataGrid.selectedNode!==this||!this.selected)
+return;this._selected=false;this.dataGrid.selectedNode=null;if(this._element)
+this._element.classList.remove("selected");if(!supressDeselectedEvent)
+this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.DeselectedNode);},traverseNextNode:function(skipHidden,stayWithin,dontPopulate,info)
+{if(!dontPopulate&&this.hasChildren)
+this.populate();if(info)
+info.depthChange=0;var node=(!skipHidden||this.revealed)?this.children[0]:null;if(node&&(!skipHidden||this.expanded)){if(info)
+info.depthChange=1;return node;}
+if(this===stayWithin)
+return null;node=(!skipHidden||this.revealed)?this.nextSibling:null;if(node)
+return node;node=this;while(node&&!node._isRoot&&!((!skipHidden||node.revealed)?node.nextSibling:null)&&node.parent!==stayWithin){if(info)
+info.depthChange-=1;node=node.parent;}
+if(!node)
+return null;return(!skipHidden||node.revealed)?node.nextSibling:null;},traversePreviousNode:function(skipHidden,dontPopulate)
+{var node=(!skipHidden||this.revealed)?this.previousSibling:null;if(!dontPopulate&&node&&node.hasChildren)
+node.populate();while(node&&((!skipHidden||(node.revealed&&node.expanded))?node.children[node.children.length-1]:null)){if(!dontPopulate&&node.hasChildren)
+node.populate();node=((!skipHidden||(node.revealed&&node.expanded))?node.children[node.children.length-1]:null);}
+if(node)
+return node;if(!this.parent||this.parent._isRoot)
+return null;return this.parent;},isEventWithinDisclosureTriangle:function(event)
+{if(!this.hasChildren)
+return false;var cell=event.target.enclosingNodeOrSelfWithNodeName("td");if(!cell.classList.contains("disclosure"))
+return false;var left=cell.totalOffsetLeft()+this.leftPadding;return event.pageX>=left&&event.pageX<=left+this.disclosureToggleWidth;},_attach:function()
+{if(!this.dataGrid||this._attached)
+return;this._attached=true;var nextNode=null;var previousNode=this.traversePreviousNode(true,true);if(previousNode&&previousNode.element.parentNode&&previousNode.element.nextSibling)
+nextNode=previousNode.element.nextSibling;if(!nextNode)
+nextNode=this.dataGrid.defaultAttachLocation();this.dataGrid.dataTableBody.insertBefore(this.element,nextNode);if(this.expanded)
+for(var i=0;i<this.children.length;++i)
+this.children[i]._attach();},_detach:function()
+{if(!this._attached)
+return;this._attached=false;if(this._element)
+this._element.remove();for(var i=0;i<this.children.length;++i)
+this.children[i]._detach();this.wasDetached();},wasDetached:function()
+{},savePosition:function()
+{if(this._savedPosition)
+return;if(!this.parent)
+throw("savePosition: Node must have a parent.");this._savedPosition={parent:this.parent,index:this.parent.children.indexOf(this)};},restorePosition:function()
+{if(!this._savedPosition)
+return;if(this.parent!==this._savedPosition.parent)
+this._savedPosition.parent.insertChild(this,this._savedPosition.index);delete this._savedPosition;},__proto__:WebInspector.Object.prototype}
+WebInspector.CreationDataGridNode=function(data,hasChildren)
+{WebInspector.DataGridNode.call(this,data,hasChildren);this.isCreationNode=true;}
+WebInspector.CreationDataGridNode.prototype={makeNormal:function()
+{delete this.isCreationNode;delete this.makeNormal;},__proto__:WebInspector.DataGridNode.prototype}
+WebInspector.ShowMoreDataGridNode=function(callback,startPosition,endPosition,chunkSize)
+{WebInspector.DataGridNode.call(this,{summaryRow:true},false);this._callback=callback;this._startPosition=startPosition;this._endPosition=endPosition;this._chunkSize=chunkSize;this.showNext=document.createElement("button");this.showNext.setAttribute("type","button");this.showNext.addEventListener("click",this._showNextChunk.bind(this),false);this.showNext.textContent=WebInspector.UIString("Show %d before",this._chunkSize);this.showAll=document.createElement("button");this.showAll.setAttribute("type","button");this.showAll.addEventListener("click",this._showAll.bind(this),false);this.showLast=document.createElement("button");this.showLast.setAttribute("type","button");this.showLast.addEventListener("click",this._showLastChunk.bind(this),false);this.showLast.textContent=WebInspector.UIString("Show %d after",this._chunkSize);this._updateLabels();this.selectable=false;}
+WebInspector.ShowMoreDataGridNode.prototype={_showNextChunk:function()
+{this._callback(this._startPosition,this._startPosition+this._chunkSize);},_showAll:function()
+{this._callback(this._startPosition,this._endPosition);},_showLastChunk:function()
+{this._callback(this._endPosition-this._chunkSize,this._endPosition);},_updateLabels:function()
+{var totalSize=this._endPosition-this._startPosition;if(totalSize>this._chunkSize){this.showNext.classList.remove("hidden");this.showLast.classList.remove("hidden");}else{this.showNext.classList.add("hidden");this.showLast.classList.add("hidden");}
+this.showAll.textContent=WebInspector.UIString("Show all %d",totalSize);},createCells:function()
+{var cell=document.createElement("td");if(this.depth)
+cell.style.setProperty("padding-left",(this.depth*this.dataGrid.indentWidth)+"px");cell.appendChild(this.showNext);cell.appendChild(this.showAll);cell.appendChild(this.showLast);this._element.appendChild(cell);var columns=this.dataGrid.columns;var count=0;for(var c in columns)
+++count;while(--count>0){cell=document.createElement("td");this._element.appendChild(cell);}},setStartPosition:function(from)
+{this._startPosition=from;this._updateLabels();},setEndPosition:function(to)
+{this._endPosition=to;this._updateLabels();},nodeSelfHeight:function()
+{return 32;},dispose:function()
+{},__proto__:WebInspector.DataGridNode.prototype}
+WebInspector.CookiesTable=function(expandable,refreshCallback,selectedCallback)
+{WebInspector.VBox.call(this);var readOnly=expandable;this._refreshCallback=refreshCallback;var columns=[{id:"name",title:WebInspector.UIString("Name"),sortable:true,disclosure:expandable,sort:WebInspector.DataGrid.Order.Ascending,longText:true,weight:24},{id:"value",title:WebInspector.UIString("Value"),sortable:true,longText:true,weight:34},{id:"domain",title:WebInspector.UIString("Domain"),sortable:true,weight:7},{id:"path",title:WebInspector.UIString("Path"),sortable:true,weight:7},{id:"expires",title:WebInspector.UIString("Expires / Max-Age"),sortable:true,weight:7},{id:"size",title:WebInspector.UIString("Size"),sortable:true,align:WebInspector.DataGrid.Align.Right,weight:7},{id:"httpOnly",title:WebInspector.UIString("HTTP"),sortable:true,align:WebInspector.DataGrid.Align.Center,weight:7},{id:"secure",title:WebInspector.UIString("Secure"),sortable:true,align:WebInspector.DataGrid.Align.Center,weight:7}];if(readOnly)
+this._dataGrid=new WebInspector.DataGrid(columns);else
+this._dataGrid=new WebInspector.DataGrid(columns,undefined,this._onDeleteCookie.bind(this),refreshCallback,this._onContextMenu.bind(this));this._dataGrid.setName("cookiesTable");this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged,this._rebuildTable,this);if(selectedCallback)
+this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,selectedCallback,this);this._nextSelectedCookie=(null);this._dataGrid.show(this.element);this._data=[];}
+WebInspector.CookiesTable.prototype={_clearAndRefresh:function(domain)
+{this.clear(domain);this._refresh();},_onContextMenu:function(contextMenu,node)
+{if(node===this._dataGrid.creationNode)
+return;var cookie=node.cookie;var domain=cookie.domain();if(domain)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Clear all from \"%s\"":"Clear All from \"%s\"",domain),this._clearAndRefresh.bind(this,domain));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Clear all":"Clear All"),this._clearAndRefresh.bind(this,null));},setCookies:function(cookies)
+{this.setCookieFolders([{cookies:cookies}]);},setCookieFolders:function(cookieFolders)
+{this._data=cookieFolders;this._rebuildTable();},selectedCookie:function()
+{var node=this._dataGrid.selectedNode;return node?node.cookie:null;},clear:function(domain)
+{for(var i=0,length=this._data.length;i<length;++i){var cookies=this._data[i].cookies;for(var j=0,cookieCount=cookies.length;j<cookieCount;++j){if(!domain||cookies[j].domain()===domain)
+cookies[j].remove();}}},_rebuildTable:function()
+{var selectedCookie=this._nextSelectedCookie||this.selectedCookie();this._nextSelectedCookie=null;this._dataGrid.rootNode().removeChildren();for(var i=0;i<this._data.length;++i){var item=this._data[i];if(item.folderName){var groupData={name:item.folderName,value:"",domain:"",path:"",expires:"",size:this._totalSize(item.cookies),httpOnly:"",secure:""};var groupNode=new WebInspector.DataGridNode(groupData);groupNode.selectable=true;this._dataGrid.rootNode().appendChild(groupNode);groupNode.element.classList.add("row-group");this._populateNode(groupNode,item.cookies,selectedCookie);groupNode.expand();}else
+this._populateNode(this._dataGrid.rootNode(),item.cookies,selectedCookie);}},_populateNode:function(parentNode,cookies,selectedCookie)
+{parentNode.removeChildren();if(!cookies)
+return;this._sortCookies(cookies);for(var i=0;i<cookies.length;++i){var cookie=cookies[i];var cookieNode=this._createGridNode(cookie);parentNode.appendChild(cookieNode);if(selectedCookie&&selectedCookie.name()===cookie.name()&&selectedCookie.domain()===cookie.domain()&&selectedCookie.path()===cookie.path())
+cookieNode.select();}},_totalSize:function(cookies)
+{var totalSize=0;for(var i=0;cookies&&i<cookies.length;++i)
+totalSize+=cookies[i].size();return totalSize;},_sortCookies:function(cookies)
+{var sortDirection=this._dataGrid.isSortOrderAscending()?1:-1;function compareTo(getter,cookie1,cookie2)
+{return sortDirection*(getter.apply(cookie1)+"").compareTo(getter.apply(cookie2)+"")}
+function numberCompare(getter,cookie1,cookie2)
+{return sortDirection*(getter.apply(cookie1)-getter.apply(cookie2));}
+function expiresCompare(cookie1,cookie2)
+{if(cookie1.session()!==cookie2.session())
+return sortDirection*(cookie1.session()?1:-1);if(cookie1.session())
+return 0;if(cookie1.maxAge()&&cookie2.maxAge())
+return sortDirection*(cookie1.maxAge()-cookie2.maxAge());if(cookie1.expires()&&cookie2.expires())
+return sortDirection*(cookie1.expires()-cookie2.expires());return sortDirection*(cookie1.expires()?1:-1);}
+var comparator;switch(this._dataGrid.sortColumnIdentifier()){case"name":comparator=compareTo.bind(null,WebInspector.Cookie.prototype.name);break;case"value":comparator=compareTo.bind(null,WebInspector.Cookie.prototype.value);break;case"domain":comparator=compareTo.bind(null,WebInspector.Cookie.prototype.domain);break;case"path":comparator=compareTo.bind(null,WebInspector.Cookie.prototype.path);break;case"expires":comparator=expiresCompare;break;case"size":comparator=numberCompare.bind(null,WebInspector.Cookie.prototype.size);break;case"httpOnly":comparator=compareTo.bind(null,WebInspector.Cookie.prototype.httpOnly);break;case"secure":comparator=compareTo.bind(null,WebInspector.Cookie.prototype.secure);break;default:compareTo.bind(null,WebInspector.Cookie.prototype.name);}
+cookies.sort(comparator);},_createGridNode:function(cookie)
+{var data={};data.name=cookie.name();data.value=cookie.value();if(cookie.type()===WebInspector.Cookie.Type.Request){data.domain=WebInspector.UIString("N/A");data.path=WebInspector.UIString("N/A");data.expires=WebInspector.UIString("N/A");}else{data.domain=cookie.domain()||"";data.path=cookie.path()||"";if(cookie.maxAge())
+data.expires=Number.secondsToString(parseInt(cookie.maxAge(),10));else if(cookie.expires())
+data.expires=new Date(cookie.expires()).toGMTString();else
+data.expires=WebInspector.UIString("Session");}
+data.size=cookie.size();const checkmark="\u2713";data.httpOnly=(cookie.httpOnly()?checkmark:"");data.secure=(cookie.secure()?checkmark:"");var node=new WebInspector.DataGridNode(data);node.cookie=cookie;node.selectable=true;return node;},_onDeleteCookie:function(node)
+{var cookie=node.cookie;var neighbour=node.traverseNextNode()||node.traversePreviousNode();if(neighbour)
+this._nextSelectedCookie=neighbour.cookie;cookie.remove();this._refresh();},_refresh:function()
+{if(this._refreshCallback)
+this._refreshCallback();},__proto__:WebInspector.VBox.prototype}
+WebInspector.CookieItemsView=function(treeElement,cookieDomain)
+{WebInspector.VBox.call(this);this.element.classList.add("storage-view");this._deleteButton=new WebInspector.StatusBarButton(WebInspector.UIString("Delete"),"delete-storage-status-bar-item");this._deleteButton.visible=false;this._deleteButton.addEventListener("click",this._deleteButtonClicked,this);this._clearButton=new WebInspector.StatusBarButton(WebInspector.UIString("Clear"),"clear-storage-status-bar-item");this._clearButton.visible=false;this._clearButton.addEventListener("click",this._clearButtonClicked,this);this._refreshButton=new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"),"refresh-storage-status-bar-item");this._refreshButton.addEventListener("click",this._refreshButtonClicked,this);this._treeElement=treeElement;this._cookieDomain=cookieDomain;this._emptyView=new WebInspector.EmptyView(WebInspector.UIString("This site has no cookies."));this._emptyView.show(this.element);this.element.addEventListener("contextmenu",this._contextMenu.bind(this),true);}
+WebInspector.CookieItemsView.prototype={get statusBarItems()
+{return[this._refreshButton.element,this._clearButton.element,this._deleteButton.element];},wasShown:function()
+{this._update();},willHide:function()
+{this._deleteButton.visible=false;},_update:function()
+{WebInspector.Cookies.getCookiesAsync(this._updateWithCookies.bind(this));},_updateWithCookies:function(allCookies)
+{this._cookies=this._filterCookiesForDomain(allCookies);if(!this._cookies.length){this._emptyView.show(this.element);this._clearButton.visible=false;this._deleteButton.visible=false;if(this._cookiesTable)
+this._cookiesTable.detach();return;}
+if(!this._cookiesTable)
+this._cookiesTable=new WebInspector.CookiesTable(false,this._update.bind(this),this._showDeleteButton.bind(this));this._cookiesTable.setCookies(this._cookies);this._emptyView.detach();this._cookiesTable.show(this.element);this._treeElement.subtitle=String.sprintf(WebInspector.UIString("%d cookies (%s)"),this._cookies.length,Number.bytesToString(this._totalSize));this._clearButton.visible=true;this._deleteButton.visible=!!this._cookiesTable.selectedCookie();},_filterCookiesForDomain:function(allCookies)
+{var cookies=[];var resourceURLsForDocumentURL=[];this._totalSize=0;function populateResourcesForDocuments(resource)
+{var url=resource.documentURL.asParsedURL();if(url&&url.host==this._cookieDomain)
+resourceURLsForDocumentURL.push(resource.url);}
+WebInspector.forAllResources(populateResourcesForDocuments.bind(this));for(var i=0;i<allCookies.length;++i){var pushed=false;var size=allCookies[i].size();for(var j=0;j<resourceURLsForDocumentURL.length;++j){var resourceURL=resourceURLsForDocumentURL[j];if(WebInspector.Cookies.cookieMatchesResourceURL(allCookies[i],resourceURL)){this._totalSize+=size;if(!pushed){pushed=true;cookies.push(allCookies[i]);}}}}
+return cookies;},clear:function()
+{this._cookiesTable.clear();this._update();},_clearButtonClicked:function()
+{this.clear();},_showDeleteButton:function()
+{this._deleteButton.visible=true;},_deleteButtonClicked:function()
+{var selectedCookie=this._cookiesTable.selectedCookie();if(selectedCookie){selectedCookie.remove();this._update();}},_refreshButtonClicked:function(event)
+{this._update();},_contextMenu:function(event)
+{if(!this._cookies.length){var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Refresh"),this._update.bind(this));contextMenu.show();}},__proto__:WebInspector.VBox.prototype}
+WebInspector.ApplicationCacheModel=function()
+{ApplicationCacheAgent.enable();InspectorBackend.registerApplicationCacheDispatcher(new WebInspector.ApplicationCacheDispatcher(this));WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,this._frameNavigated,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached,this._frameDetached,this);this._statuses={};this._manifestURLsByFrame={};this._mainFrameNavigated();this._onLine=true;}
+WebInspector.ApplicationCacheModel.EventTypes={FrameManifestStatusUpdated:"FrameManifestStatusUpdated",FrameManifestAdded:"FrameManifestAdded",FrameManifestRemoved:"FrameManifestRemoved",NetworkStateChanged:"NetworkStateChanged"}
+WebInspector.ApplicationCacheModel.prototype={_frameNavigated:function(event)
+{var frame=(event.data);if(frame.isMainFrame()){this._mainFrameNavigated();return;}
+ApplicationCacheAgent.getManifestForFrame(frame.id,this._manifestForFrameLoaded.bind(this,frame.id));},_frameDetached:function(event)
+{var frame=(event.data);this._frameManifestRemoved(frame.id);},_mainFrameNavigated:function()
+{ApplicationCacheAgent.getFramesWithManifests(this._framesWithManifestsLoaded.bind(this));},_manifestForFrameLoaded:function(frameId,error,manifestURL)
+{if(error){console.error(error);return;}
+if(!manifestURL)
+this._frameManifestRemoved(frameId);},_framesWithManifestsLoaded:function(error,framesWithManifests)
+{if(error){console.error(error);return;}
+for(var i=0;i<framesWithManifests.length;++i)
+this._frameManifestUpdated(framesWithManifests[i].frameId,framesWithManifests[i].manifestURL,framesWithManifests[i].status);},_frameManifestUpdated:function(frameId,manifestURL,status)
+{if(status===applicationCache.UNCACHED){this._frameManifestRemoved(frameId);return;}
+if(!manifestURL)
+return;if(this._manifestURLsByFrame[frameId]&&manifestURL!==this._manifestURLsByFrame[frameId])
+this._frameManifestRemoved(frameId);var statusChanged=this._statuses[frameId]!==status;this._statuses[frameId]=status;if(!this._manifestURLsByFrame[frameId]){this._manifestURLsByFrame[frameId]=manifestURL;this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestAdded,frameId);}
+if(statusChanged)
+this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestStatusUpdated,frameId);},_frameManifestRemoved:function(frameId)
+{if(!this._manifestURLsByFrame[frameId])
+return;var manifestURL=this._manifestURLsByFrame[frameId];delete this._manifestURLsByFrame[frameId];delete this._statuses[frameId];this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestRemoved,frameId);},frameManifestURL:function(frameId)
+{return this._manifestURLsByFrame[frameId]||"";},frameManifestStatus:function(frameId)
+{return this._statuses[frameId]||applicationCache.UNCACHED;},get onLine()
+{return this._onLine;},_statusUpdated:function(frameId,manifestURL,status)
+{this._frameManifestUpdated(frameId,manifestURL,status);},requestApplicationCache:function(frameId,callback)
+{function callbackWrapper(error,applicationCache)
+{if(error){console.error(error);callback(null);return;}
+callback(applicationCache);}
+ApplicationCacheAgent.getApplicationCacheForFrame(frameId,callbackWrapper);},_networkStateUpdated:function(isNowOnline)
+{this._onLine=isNowOnline;this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.NetworkStateChanged,isNowOnline);},__proto__:WebInspector.Object.prototype}
+WebInspector.ApplicationCacheDispatcher=function(applicationCacheModel)
+{this._applicationCacheModel=applicationCacheModel;}
+WebInspector.ApplicationCacheDispatcher.prototype={applicationCacheStatusUpdated:function(frameId,manifestURL,status)
+{this._applicationCacheModel._statusUpdated(frameId,manifestURL,status);},networkStateUpdated:function(isNowOnline)
+{this._applicationCacheModel._networkStateUpdated(isNowOnline);}}
+WebInspector.IndexedDBModel=function()
+{IndexedDBAgent.enable();WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded,this._securityOriginAdded,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved,this._securityOriginRemoved,this);this._databases=new Map();this._databaseNamesBySecurityOrigin={};this._reset();}
+WebInspector.IndexedDBModel.KeyTypes={NumberType:"number",StringType:"string",DateType:"date",ArrayType:"array"};WebInspector.IndexedDBModel.KeyPathTypes={NullType:"null",StringType:"string",ArrayType:"array"};WebInspector.IndexedDBModel.keyFromIDBKey=function(idbKey)
+{if(typeof(idbKey)==="undefined"||idbKey===null)
+return null;var key={};switch(typeof(idbKey)){case"number":key.number=idbKey;key.type=WebInspector.IndexedDBModel.KeyTypes.NumberType;break;case"string":key.string=idbKey;key.type=WebInspector.IndexedDBModel.KeyTypes.StringType;break;case"object":if(idbKey instanceof Date){key.date=idbKey.getTime();key.type=WebInspector.IndexedDBModel.KeyTypes.DateType;}else if(idbKey instanceof Array){key.array=[];for(var i=0;i<idbKey.length;++i)
+key.array.push(WebInspector.IndexedDBModel.keyFromIDBKey(idbKey[i]));key.type=WebInspector.IndexedDBModel.KeyTypes.ArrayType;}
+break;default:return null;}
+return key;}
+WebInspector.IndexedDBModel.keyRangeFromIDBKeyRange=function(idbKeyRange)
+{var IDBKeyRange=window.IDBKeyRange||window.webkitIDBKeyRange;if(typeof(idbKeyRange)==="undefined"||idbKeyRange===null)
+return null;var keyRange={};keyRange.lower=WebInspector.IndexedDBModel.keyFromIDBKey(idbKeyRange.lower);keyRange.upper=WebInspector.IndexedDBModel.keyFromIDBKey(idbKeyRange.upper);keyRange.lowerOpen=idbKeyRange.lowerOpen;keyRange.upperOpen=idbKeyRange.upperOpen;return keyRange;}
+WebInspector.IndexedDBModel.idbKeyPathFromKeyPath=function(keyPath)
+{var idbKeyPath;switch(keyPath.type){case WebInspector.IndexedDBModel.KeyPathTypes.NullType:idbKeyPath=null;break;case WebInspector.IndexedDBModel.KeyPathTypes.StringType:idbKeyPath=keyPath.string;break;case WebInspector.IndexedDBModel.KeyPathTypes.ArrayType:idbKeyPath=keyPath.array;break;}
+return idbKeyPath;}
+WebInspector.IndexedDBModel.keyPathStringFromIDBKeyPath=function(idbKeyPath)
+{if(typeof idbKeyPath==="string")
+return"\""+idbKeyPath+"\"";if(idbKeyPath instanceof Array)
+return"[\""+idbKeyPath.join("\", \"")+"\"]";return null;}
+WebInspector.IndexedDBModel.EventTypes={DatabaseAdded:"DatabaseAdded",DatabaseRemoved:"DatabaseRemoved",DatabaseLoaded:"DatabaseLoaded"}
+WebInspector.IndexedDBModel.prototype={_reset:function()
+{for(var securityOrigin in this._databaseNamesBySecurityOrigin)
+this._removeOrigin(securityOrigin);var securityOrigins=WebInspector.resourceTreeModel.securityOrigins();for(var i=0;i<securityOrigins.length;++i)
+this._addOrigin(securityOrigins[i]);},refreshDatabaseNames:function()
+{for(var securityOrigin in this._databaseNamesBySecurityOrigin)
+this._loadDatabaseNames(securityOrigin);},refreshDatabase:function(databaseId)
+{this._loadDatabase(databaseId);},clearObjectStore:function(databaseId,objectStoreName,callback)
+{IndexedDBAgent.clearObjectStore(databaseId.securityOrigin,databaseId.name,objectStoreName,callback);},_securityOriginAdded:function(event)
+{var securityOrigin=(event.data);this._addOrigin(securityOrigin);},_securityOriginRemoved:function(event)
+{var securityOrigin=(event.data);this._removeOrigin(securityOrigin);},_addOrigin:function(securityOrigin)
+{console.assert(!this._databaseNamesBySecurityOrigin[securityOrigin]);this._databaseNamesBySecurityOrigin[securityOrigin]=[];this._loadDatabaseNames(securityOrigin);},_removeOrigin:function(securityOrigin)
+{console.assert(this._databaseNamesBySecurityOrigin[securityOrigin]);for(var i=0;i<this._databaseNamesBySecurityOrigin[securityOrigin].length;++i)
+this._databaseRemoved(securityOrigin,this._databaseNamesBySecurityOrigin[securityOrigin][i]);delete this._databaseNamesBySecurityOrigin[securityOrigin];},_updateOriginDatabaseNames:function(securityOrigin,databaseNames)
+{var newDatabaseNames={};for(var i=0;i<databaseNames.length;++i)
+newDatabaseNames[databaseNames[i]]=true;var oldDatabaseNames={};for(var i=0;i<this._databaseNamesBySecurityOrigin[securityOrigin].length;++i)
+oldDatabaseNames[this._databaseNamesBySecurityOrigin[securityOrigin][i]]=true;this._databaseNamesBySecurityOrigin[securityOrigin]=databaseNames;for(var databaseName in oldDatabaseNames){if(!newDatabaseNames[databaseName])
+this._databaseRemoved(securityOrigin,databaseName);}
+for(var databaseName in newDatabaseNames){if(!oldDatabaseNames[databaseName])
+this._databaseAdded(securityOrigin,databaseName);}},_databaseAdded:function(securityOrigin,databaseName)
+{var databaseId=new WebInspector.IndexedDBModel.DatabaseId(securityOrigin,databaseName);this.dispatchEventToListeners(WebInspector.IndexedDBModel.EventTypes.DatabaseAdded,databaseId);},_databaseRemoved:function(securityOrigin,databaseName)
+{var databaseId=new WebInspector.IndexedDBModel.DatabaseId(securityOrigin,databaseName);this.dispatchEventToListeners(WebInspector.IndexedDBModel.EventTypes.DatabaseRemoved,databaseId);},_loadDatabaseNames:function(securityOrigin)
+{function callback(error,databaseNames)
+{if(error){console.error("IndexedDBAgent error: "+error);return;}
+if(!this._databaseNamesBySecurityOrigin[securityOrigin])
+return;this._updateOriginDatabaseNames(securityOrigin,databaseNames);}
+IndexedDBAgent.requestDatabaseNames(securityOrigin,callback.bind(this));},_loadDatabase:function(databaseId)
+{function callback(error,databaseWithObjectStores)
+{if(error){console.error("IndexedDBAgent error: "+error);return;}
+if(!this._databaseNamesBySecurityOrigin[databaseId.securityOrigin])
+return;var databaseModel=new WebInspector.IndexedDBModel.Database(databaseId,databaseWithObjectStores.version,databaseWithObjectStores.intVersion);this._databases.put(databaseId,databaseModel);for(var i=0;i<databaseWithObjectStores.objectStores.length;++i){var objectStore=databaseWithObjectStores.objectStores[i];var objectStoreIDBKeyPath=WebInspector.IndexedDBModel.idbKeyPathFromKeyPath(objectStore.keyPath);var objectStoreModel=new WebInspector.IndexedDBModel.ObjectStore(objectStore.name,objectStoreIDBKeyPath,objectStore.autoIncrement);for(var j=0;j<objectStore.indexes.length;++j){var index=objectStore.indexes[j];var indexIDBKeyPath=WebInspector.IndexedDBModel.idbKeyPathFromKeyPath(index.keyPath);var indexModel=new WebInspector.IndexedDBModel.Index(index.name,indexIDBKeyPath,index.unique,index.multiEntry);objectStoreModel.indexes[indexModel.name]=indexModel;}
+databaseModel.objectStores[objectStoreModel.name]=objectStoreModel;}
+this.dispatchEventToListeners(WebInspector.IndexedDBModel.EventTypes.DatabaseLoaded,databaseModel);}
+IndexedDBAgent.requestDatabase(databaseId.securityOrigin,databaseId.name,callback.bind(this));},loadObjectStoreData:function(databaseId,objectStoreName,idbKeyRange,skipCount,pageSize,callback)
+{this._requestData(databaseId,databaseId.name,objectStoreName,"",idbKeyRange,skipCount,pageSize,callback);},loadIndexData:function(databaseId,objectStoreName,indexName,idbKeyRange,skipCount,pageSize,callback)
+{this._requestData(databaseId,databaseId.name,objectStoreName,indexName,idbKeyRange,skipCount,pageSize,callback);},_requestData:function(databaseId,databaseName,objectStoreName,indexName,idbKeyRange,skipCount,pageSize,callback)
+{function innerCallback(error,dataEntries,hasMore)
+{if(error){console.error("IndexedDBAgent error: "+error);return;}
+if(!this._databaseNamesBySecurityOrigin[databaseId.securityOrigin])
+return;var entries=[];for(var i=0;i<dataEntries.length;++i){var key=WebInspector.RemoteObject.fromLocalObject(JSON.parse(dataEntries[i].key));var primaryKey=WebInspector.RemoteObject.fromLocalObject(JSON.parse(dataEntries[i].primaryKey));var value=WebInspector.RemoteObject.fromLocalObject(JSON.parse(dataEntries[i].value));entries.push(new WebInspector.IndexedDBModel.Entry(key,primaryKey,value));}
+callback(entries,hasMore);}
+var keyRange=WebInspector.IndexedDBModel.keyRangeFromIDBKeyRange(idbKeyRange);IndexedDBAgent.requestData(databaseId.securityOrigin,databaseName,objectStoreName,indexName,skipCount,pageSize,keyRange?keyRange:undefined,innerCallback.bind(this));},__proto__:WebInspector.Object.prototype}
+WebInspector.IndexedDBModel.Entry=function(key,primaryKey,value)
+{this.key=key;this.primaryKey=primaryKey;this.value=value;}
+WebInspector.IndexedDBModel.DatabaseId=function(securityOrigin,name)
+{this.securityOrigin=securityOrigin;this.name=name;}
+WebInspector.IndexedDBModel.DatabaseId.prototype={equals:function(databaseId)
+{return this.name===databaseId.name&&this.securityOrigin===databaseId.securityOrigin;},}
+WebInspector.IndexedDBModel.Database=function(databaseId,version,intVersion)
+{this.databaseId=databaseId;this.version=version;this.intVersion=intVersion;this.objectStores={};}
+WebInspector.IndexedDBModel.ObjectStore=function(name,keyPath,autoIncrement)
+{this.name=name;this.keyPath=keyPath;this.autoIncrement=autoIncrement;this.indexes={};}
+WebInspector.IndexedDBModel.ObjectStore.prototype={get keyPathString()
+{return WebInspector.IndexedDBModel.keyPathStringFromIDBKeyPath(this.keyPath);}}
+WebInspector.IndexedDBModel.Index=function(name,keyPath,unique,multiEntry)
+{this.name=name;this.keyPath=keyPath;this.unique=unique;this.multiEntry=multiEntry;}
+WebInspector.IndexedDBModel.Index.prototype={get keyPathString()
+{return WebInspector.IndexedDBModel.keyPathStringFromIDBKeyPath(this.keyPath);}}
+WebInspector.Spectrum=function()
+{WebInspector.VBox.call(this);this.registerRequiredCSS("spectrum.css");this.element.classList.add("spectrum-container");this.element.tabIndex=0;var topElement=this.element.createChild("div","spectrum-top");topElement.createChild("div","spectrum-fill");var topInnerElement=topElement.createChild("div","spectrum-top-inner fill");this._draggerElement=topInnerElement.createChild("div","spectrum-color");this._dragHelperElement=this._draggerElement.createChild("div","spectrum-sat fill").createChild("div","spectrum-val fill").createChild("div","spectrum-dragger");this._sliderElement=topInnerElement.createChild("div","spectrum-hue");this.slideHelper=this._sliderElement.createChild("div","spectrum-slider");var rangeContainer=this.element.createChild("div","spectrum-range-container");var alphaLabel=rangeContainer.createChild("label");alphaLabel.textContent=WebInspector.UIString("\u03B1:");this._alphaElement=rangeContainer.createChild("input","spectrum-range");this._alphaElement.setAttribute("type","range");this._alphaElement.setAttribute("min","0");this._alphaElement.setAttribute("max","100");this._alphaElement.addEventListener("input",alphaDrag.bind(this),false);this._alphaElement.addEventListener("change",alphaDrag.bind(this),false);var swatchElement=document.createElement("span");swatchElement.className="swatch";this._swatchInnerElement=swatchElement.createChild("span","swatch-inner");var displayContainer=this.element.createChild("div");displayContainer.appendChild(swatchElement);this._displayElement=displayContainer.createChild("span","source-code spectrum-display-value");WebInspector.Spectrum.draggable(this._sliderElement,hueDrag.bind(this));WebInspector.Spectrum.draggable(this._draggerElement,colorDrag.bind(this),colorDragStart.bind(this));function hueDrag(element,dragX,dragY)
+{this._hsv[0]=(this.slideHeight-dragY)/this.slideHeight;this._onchange();}
+var initialHelperOffset;function colorDragStart()
+{initialHelperOffset={x:this._dragHelperElement.offsetLeft,y:this._dragHelperElement.offsetTop};}
+function colorDrag(element,dragX,dragY,event)
+{if(event.shiftKey){if(Math.abs(dragX-initialHelperOffset.x)>=Math.abs(dragY-initialHelperOffset.y))
+dragY=initialHelperOffset.y;else
+dragX=initialHelperOffset.x;}
+this._hsv[1]=dragX/this.dragWidth;this._hsv[2]=(this.dragHeight-dragY)/this.dragHeight;this._onchange();}
+function alphaDrag()
+{this._hsv[3]=this._alphaElement.value/100;this._onchange();}};WebInspector.Spectrum.Events={ColorChanged:"ColorChanged"};WebInspector.Spectrum.draggable=function(element,onmove,onstart,onstop){var doc=document;var dragging;var offset;var scrollOffset;var maxHeight;var maxWidth;function consume(e)
+{e.consume(true);}
+function move(e)
+{if(dragging){var dragX=Math.max(0,Math.min(e.pageX-offset.left+scrollOffset.left,maxWidth));var dragY=Math.max(0,Math.min(e.pageY-offset.top+scrollOffset.top,maxHeight));if(onmove)
+onmove(element,dragX,dragY,(e));}}
+function start(e)
+{var mouseEvent=(e);var rightClick=mouseEvent.which?(mouseEvent.which===3):(mouseEvent.button===2);if(!rightClick&&!dragging){if(onstart)
+onstart(element,mouseEvent);dragging=true;maxHeight=element.clientHeight;maxWidth=element.clientWidth;scrollOffset=element.scrollOffset();offset=element.totalOffset();doc.addEventListener("selectstart",consume,false);doc.addEventListener("dragstart",consume,false);doc.addEventListener("mousemove",move,false);doc.addEventListener("mouseup",stop,false);move(mouseEvent);consume(mouseEvent);}}
+function stop(e)
+{if(dragging){doc.removeEventListener("selectstart",consume,false);doc.removeEventListener("dragstart",consume,false);doc.removeEventListener("mousemove",move,false);doc.removeEventListener("mouseup",stop,false);if(onstop)
+onstop(element,(e));}
+dragging=false;}
+element.addEventListener("mousedown",start,false);};WebInspector.Spectrum.prototype={setColor:function(color)
+{this._hsv=color.hsva();},color:function()
+{return WebInspector.Color.fromHSVA(this._hsv);},_colorString:function()
+{var cf=WebInspector.Color.Format;var format=this._originalFormat;var color=this.color();var originalFormatString=color.toString(this._originalFormat);if(originalFormatString)
+return originalFormatString;if(color.hasAlpha()){if(format===cf.HSLA||format===cf.HSL)
+return color.toString(cf.HSLA);else
+return color.toString(cf.RGBA);}
+if(format===cf.ShortHEX)
+return color.toString(cf.HEX);console.assert(format===cf.Nickname);return color.toString(cf.RGB);},set displayText(text)
+{this._displayElement.textContent=text;},_onchange:function()
+{this._updateUI();this.dispatchEventToListeners(WebInspector.Spectrum.Events.ColorChanged,this._colorString());},_updateHelperLocations:function()
+{var h=this._hsv[0];var s=this._hsv[1];var v=this._hsv[2];var dragX=s*this.dragWidth;var dragY=this.dragHeight-(v*this.dragHeight);dragX=Math.max(-this._dragHelperElementHeight,Math.min(this.dragWidth-this._dragHelperElementHeight,dragX-this._dragHelperElementHeight));dragY=Math.max(-this._dragHelperElementHeight,Math.min(this.dragHeight-this._dragHelperElementHeight,dragY-this._dragHelperElementHeight));this._dragHelperElement.positionAt(dragX,dragY);var slideY=this.slideHeight-((h*this.slideHeight)+this.slideHelperHeight);this.slideHelper.style.top=slideY+"px";this._alphaElement.value=this._hsv[3]*100;},_updateUI:function()
+{this._updateHelperLocations();this._draggerElement.style.backgroundColor=WebInspector.Color.fromHSVA([this._hsv[0],1,1,1]).toString(WebInspector.Color.Format.RGB);this._swatchInnerElement.style.backgroundColor=this.color().toString(WebInspector.Color.Format.RGBA);this._alphaElement.value=this._hsv[3]*100;},wasShown:function()
+{this.slideHeight=this._sliderElement.offsetHeight;this.dragWidth=this._draggerElement.offsetWidth;this.dragHeight=this._draggerElement.offsetHeight;this._dragHelperElementHeight=this._dragHelperElement.offsetHeight/2;this.slideHelperHeight=this.slideHelper.offsetHeight/2;this._updateUI();},__proto__:WebInspector.VBox.prototype}
+WebInspector.SpectrumPopupHelper=function()
+{this._spectrum=new WebInspector.Spectrum();this._spectrum.element.addEventListener("keydown",this._onKeyDown.bind(this),false);this._popover=new WebInspector.Popover();this._popover.setCanShrink(false);this._popover.element.addEventListener("mousedown",consumeEvent,false);this._hideProxy=this.hide.bind(this,true);}
+WebInspector.SpectrumPopupHelper.Events={Hidden:"Hidden"};WebInspector.SpectrumPopupHelper.prototype={spectrum:function()
+{return this._spectrum;},toggle:function(element,color,format)
+{if(this._popover.isShowing())
+this.hide(true);else
+this.show(element,color,format);return this._popover.isShowing();},show:function(element,color,format)
+{if(this._popover.isShowing()){if(this._anchorElement===element)
+return false;this.hide(true);}
+this._anchorElement=element;this._spectrum.setColor(color);this._spectrum._originalFormat=format!==WebInspector.Color.Format.Original?format:color.format();this.reposition(element);document.addEventListener("mousedown",this._hideProxy,false);window.addEventListener("blur",this._hideProxy,false);return true;},reposition:function(element)
+{if(!this._previousFocusElement)
+this._previousFocusElement=WebInspector.currentFocusElement();this._popover.showView(this._spectrum,element);WebInspector.setCurrentFocusElement(this._spectrum.element);},hide:function(commitEdit)
+{if(!this._popover.isShowing())
+return;this._popover.hide();document.removeEventListener("mousedown",this._hideProxy,false);window.removeEventListener("blur",this._hideProxy,false);this.dispatchEventToListeners(WebInspector.SpectrumPopupHelper.Events.Hidden,!!commitEdit);WebInspector.setCurrentFocusElement(this._previousFocusElement);delete this._previousFocusElement;delete this._anchorElement;},_onKeyDown:function(event)
+{if(event.keyIdentifier==="Enter"){this.hide(true);event.consume(true);return;}
+if(event.keyIdentifier==="U+001B"){this.hide(false);event.consume(true);}},__proto__:WebInspector.Object.prototype}
+WebInspector.ColorSwatch=function(readOnly)
+{this.element=document.createElement("span");this._swatchInnerElement=this.element.createChild("span","swatch-inner");var shiftClickMessage=WebInspector.UIString("Shift-click to change color format.");this.element.title=readOnly?shiftClickMessage:String.sprintf("%s\n%s",WebInspector.UIString("Click to open a colorpicker."),shiftClickMessage);this.element.className="swatch";this.element.addEventListener("mousedown",consumeEvent,false);this.element.addEventListener("dblclick",consumeEvent,false);}
+WebInspector.ColorSwatch.prototype={setColorString:function(colorString)
+{this._swatchInnerElement.style.backgroundColor=colorString;}}
+WebInspector.SidebarPane=function(title)
+{WebInspector.View.call(this);this.setMinimumSize(25,0);this.element.className="sidebar-pane";this.titleElement=document.createElement("div");this.titleElement.className="sidebar-pane-toolbar";this.bodyElement=this.element.createChild("div","body");this._title=title;this._expandCallback=null;}
+WebInspector.SidebarPane.EventTypes={wasShown:"wasShown"}
+WebInspector.SidebarPane.prototype={title:function()
+{return this._title;},prepareContent:function(callback)
+{if(callback)
+callback();},expand:function()
+{this.prepareContent(this.onContentReady.bind(this));},onContentReady:function()
+{if(this._expandCallback)
+this._expandCallback();else
+this._expandPending=true;},setExpandCallback:function(callback)
+{this._expandCallback=callback;if(this._expandPending){delete this._expandPending;this._expandCallback();}},wasShown:function()
+{WebInspector.View.prototype.wasShown.call(this);this.dispatchEventToListeners(WebInspector.SidebarPane.EventTypes.wasShown);},__proto__:WebInspector.View.prototype}
+WebInspector.SidebarPaneTitle=function(container,pane)
+{this._pane=pane;this.element=container.createChild("div","sidebar-pane-title");this.element.textContent=pane.title();this.element.tabIndex=0;this.element.addEventListener("click",this._toggleExpanded.bind(this),false);this.element.addEventListener("keydown",this._onTitleKeyDown.bind(this),false);this.element.appendChild(this._pane.titleElement);this._pane.setExpandCallback(this._expand.bind(this));}
+WebInspector.SidebarPaneTitle.prototype={_expand:function()
+{this.element.classList.add("expanded");this._pane.show(this.element.parentNode,this.element.nextSibling);},_collapse:function()
+{this.element.classList.remove("expanded");if(this._pane.element.parentNode==this.element.parentNode)
+this._pane.detach();},_toggleExpanded:function()
+{if(this.element.classList.contains("expanded"))
+this._collapse();else
+this._pane.expand();},_onTitleKeyDown:function(event)
+{if(isEnterKey(event)||event.keyCode===WebInspector.KeyboardShortcut.Keys.Space.code)
+this._toggleExpanded();}}
+WebInspector.SidebarPaneStack=function()
+{WebInspector.View.call(this);this.setMinimumSize(25,0);this.element.className="sidebar-pane-stack";this.registerRequiredCSS("sidebarPane.css");}
+WebInspector.SidebarPaneStack.prototype={addPane:function(pane)
+{new WebInspector.SidebarPaneTitle(this.element,pane);},__proto__:WebInspector.View.prototype}
+WebInspector.SidebarTabbedPane=function()
+{WebInspector.TabbedPane.call(this);this.setRetainTabOrder(true);this.element.classList.add("sidebar-tabbed-pane");this.registerRequiredCSS("sidebarPane.css");}
+WebInspector.SidebarTabbedPane.prototype={addPane:function(pane)
+{var title=pane.title();this.appendTab(title,title,pane);pane.element.appendChild(pane.titleElement);pane.setExpandCallback(this.selectTab.bind(this,title));},__proto__:WebInspector.TabbedPane.prototype}
+WebInspector.DOMPresentationUtils={}
+WebInspector.DOMPresentationUtils.decorateNodeLabel=function(node,parentElement)
+{var title=node.nodeNameInCorrectCase();var nameElement=document.createElement("span");nameElement.textContent=title;parentElement.appendChild(nameElement);var idAttribute=node.getAttribute("id");if(idAttribute){var idElement=document.createElement("span");parentElement.appendChild(idElement);var part="#"+idAttribute;title+=part;idElement.appendChild(document.createTextNode(part));nameElement.className="extra";}
+var classAttribute=node.getAttribute("class");if(classAttribute){var classes=classAttribute.split(/\s+/);var foundClasses={};if(classes.length){var classesElement=document.createElement("span");classesElement.className="extra";parentElement.appendChild(classesElement);for(var i=0;i<classes.length;++i){var className=classes[i];if(className&&!(className in foundClasses)){var part="."+className;title+=part;classesElement.appendChild(document.createTextNode(part));foundClasses[className]=true;}}}}
+parentElement.title=title;}
+WebInspector.DOMPresentationUtils.createSpansForNodeTitle=function(container,nodeTitle)
+{var match=nodeTitle.match(/([^#.]+)(#[^.]+)?(\..*)?/);container.createChild("span","webkit-html-tag-name").textContent=match[1];if(match[2])
+container.createChild("span","webkit-html-attribute-value").textContent=match[2];if(match[3])
+container.createChild("span","webkit-html-attribute-name").textContent=match[3];}
+WebInspector.DOMPresentationUtils.linkifyNodeReference=function(node)
+{var link=document.createElement("span");link.className="node-link";WebInspector.DOMPresentationUtils.decorateNodeLabel(node,link);link.addEventListener("click",WebInspector.domModel.inspectElement.bind(WebInspector.domModel,node.id),false);link.addEventListener("mouseover",WebInspector.domModel.highlightDOMNode.bind(WebInspector.domModel,node.id,"",undefined),false);link.addEventListener("mouseout",WebInspector.domModel.hideDOMNodeHighlight.bind(WebInspector.domModel),false);return link;}
+WebInspector.DOMPresentationUtils.linkifyNodeById=function(nodeId)
+{var node=WebInspector.domModel.nodeForId(nodeId);if(!node)
+return document.createTextNode(WebInspector.UIString("<node>"));return WebInspector.DOMPresentationUtils.linkifyNodeReference(node);}
+WebInspector.DOMPresentationUtils.buildImagePreviewContents=function(imageURL,showDimensions,userCallback,precomputedDimensions)
+{var resource=WebInspector.resourceTreeModel.resourceForURL(imageURL);if(!resource){userCallback();return;}
+var imageElement=document.createElement("img");imageElement.addEventListener("load",buildContent,false);imageElement.addEventListener("error",errorCallback,false);resource.populateImageSource(imageElement);function errorCallback()
+{userCallback();}
+function buildContent()
+{var container=document.createElement("table");container.className="image-preview-container";var naturalWidth=precomputedDimensions?precomputedDimensions.naturalWidth:imageElement.naturalWidth;var naturalHeight=precomputedDimensions?precomputedDimensions.naturalHeight:imageElement.naturalHeight;var offsetWidth=precomputedDimensions?precomputedDimensions.offsetWidth:naturalWidth;var offsetHeight=precomputedDimensions?precomputedDimensions.offsetHeight:naturalHeight;var description;if(showDimensions){if(offsetHeight===naturalHeight&&offsetWidth===naturalWidth)
+description=WebInspector.UIString("%d \xd7 %d pixels",offsetWidth,offsetHeight);else
+description=WebInspector.UIString("%d \xd7 %d pixels (Natural: %d \xd7 %d pixels)",offsetWidth,offsetHeight,naturalWidth,naturalHeight);}
+container.createChild("tr").createChild("td","image-container").appendChild(imageElement);if(description)
+container.createChild("tr").createChild("td").createChild("span","description").textContent=description;userCallback(container);}}
+WebInspector.DOMPresentationUtils.fullQualifiedSelector=function(node,justSelector)
+{if(node.nodeType()!==Node.ELEMENT_NODE)
+return node.localName()||node.nodeName().toLowerCase();return WebInspector.DOMPresentationUtils.cssPath(node,justSelector);}
+WebInspector.DOMPresentationUtils.simpleSelector=function(node)
+{var lowerCaseName=node.localName()||node.nodeName().toLowerCase();if(node.nodeType()!==Node.ELEMENT_NODE)
+return lowerCaseName;if(lowerCaseName==="input"&&node.getAttribute("type")&&!node.getAttribute("id")&&!node.getAttribute("class"))
+return lowerCaseName+"[type=\""+node.getAttribute("type")+"\"]";if(node.getAttribute("id"))
+return lowerCaseName+"#"+node.getAttribute("id");if(node.getAttribute("class"))
+return lowerCaseName+"."+node.getAttribute("class").trim().replace(/\s+/g,".");return lowerCaseName;}
+WebInspector.DOMPresentationUtils.cssPath=function(node,optimized)
+{if(node.nodeType()!==Node.ELEMENT_NODE)
+return"";var steps=[];var contextNode=node;while(contextNode){var step=WebInspector.DOMPresentationUtils._cssPathStep(contextNode,!!optimized,contextNode===node);if(!step)
+break;steps.push(step);if(step.optimized)
+break;contextNode=contextNode.parentNode;}
+steps.reverse();return steps.join(" > ");}
+WebInspector.DOMPresentationUtils._cssPathStep=function(node,optimized,isTargetNode)
+{if(node.nodeType()!==Node.ELEMENT_NODE)
+return null;var id=node.getAttribute("id");if(optimized){if(id)
+return new WebInspector.DOMNodePathStep(idSelector(id),true);var nodeNameLower=node.nodeName().toLowerCase();if(nodeNameLower==="body"||nodeNameLower==="head"||nodeNameLower==="html")
+return new WebInspector.DOMNodePathStep(node.nodeNameInCorrectCase(),true);}
+var nodeName=node.nodeNameInCorrectCase();if(id)
+return new WebInspector.DOMNodePathStep(nodeName+idSelector(id),true);var parent=node.parentNode;if(!parent||parent.nodeType()===Node.DOCUMENT_NODE)
+return new WebInspector.DOMNodePathStep(nodeName,true);function prefixedElementClassNames(node)
+{var classAttribute=node.getAttribute("class");if(!classAttribute)
+return[];return classAttribute.split(/\s+/g).filter(Boolean).map(function(name){return"$"+name;});}
+function idSelector(id)
+{return"#"+escapeIdentifierIfNeeded(id);}
+function escapeIdentifierIfNeeded(ident)
+{if(isCSSIdentifier(ident))
+return ident;var shouldEscapeFirst=/^(?:[0-9]|-[0-9-]?)/.test(ident);var lastIndex=ident.length-1;return ident.replace(/./g,function(c,i){return((shouldEscapeFirst&&i===0)||!isCSSIdentChar(c))?escapeAsciiChar(c,i===lastIndex):c;});}
+function escapeAsciiChar(c,isLast)
+{return"\\"+toHexByte(c)+(isLast?"":" ");}
+function toHexByte(c)
+{var hexByte=c.charCodeAt(0).toString(16);if(hexByte.length===1)
+hexByte="0"+hexByte;return hexByte;}
+function isCSSIdentChar(c)
+{if(/[a-zA-Z0-9_-]/.test(c))
+return true;return c.charCodeAt(0)>=0xA0;}
+function isCSSIdentifier(value)
+{return/^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value);}
+var prefixedOwnClassNamesArray=prefixedElementClassNames(node);var needsClassNames=false;var needsNthChild=false;var ownIndex=-1;var elementIndex=-1;var siblings=parent.children();for(var i=0;(ownIndex===-1||!needsNthChild)&&i<siblings.length;++i){var sibling=siblings[i];if(sibling.nodeType()!==Node.ELEMENT_NODE)
+continue;elementIndex+=1;if(sibling===node){ownIndex=elementIndex;continue;}
+if(needsNthChild)
+continue;if(sibling.nodeNameInCorrectCase()!==nodeName)
+continue;needsClassNames=true;var ownClassNames=prefixedOwnClassNamesArray.keySet();var ownClassNameCount=0;for(var name in ownClassNames)
+++ownClassNameCount;if(ownClassNameCount===0){needsNthChild=true;continue;}
+var siblingClassNamesArray=prefixedElementClassNames(sibling);for(var j=0;j<siblingClassNamesArray.length;++j){var siblingClass=siblingClassNamesArray[j];if(!ownClassNames.hasOwnProperty(siblingClass))
+continue;delete ownClassNames[siblingClass];if(!--ownClassNameCount){needsNthChild=true;break;}}}
+var result=nodeName;if(isTargetNode&&nodeName.toLowerCase()==="input"&&node.getAttribute("type")&&!node.getAttribute("id")&&!node.getAttribute("class"))
+result+="[type=\""+node.getAttribute("type")+"\"]";if(needsNthChild){result+=":nth-child("+(ownIndex+1)+")";}else if(needsClassNames){for(var prefixedName in prefixedOwnClassNamesArray.keySet())
+result+="."+escapeIdentifierIfNeeded(prefixedName.substr(1));}
+return new WebInspector.DOMNodePathStep(result,false);}
+WebInspector.DOMPresentationUtils.xPath=function(node,optimized)
+{if(node.nodeType()===Node.DOCUMENT_NODE)
+return"/";var steps=[];var contextNode=node;while(contextNode){var step=WebInspector.DOMPresentationUtils._xPathValue(contextNode,optimized);if(!step)
+break;steps.push(step);if(step.optimized)
+break;contextNode=contextNode.parentNode;}
+steps.reverse();return(steps.length&&steps[0].optimized?"":"/")+steps.join("/");}
+WebInspector.DOMPresentationUtils._xPathValue=function(node,optimized)
+{var ownValue;var ownIndex=WebInspector.DOMPresentationUtils._xPathIndex(node);if(ownIndex===-1)
+return null;switch(node.nodeType()){case Node.ELEMENT_NODE:if(optimized&&node.getAttribute("id"))
+return new WebInspector.DOMNodePathStep("//*[@id=\""+node.getAttribute("id")+"\"]",true);ownValue=node.localName();break;case Node.ATTRIBUTE_NODE:ownValue="@"+node.nodeName();break;case Node.TEXT_NODE:case Node.CDATA_SECTION_NODE:ownValue="text()";break;case Node.PROCESSING_INSTRUCTION_NODE:ownValue="processing-instruction()";break;case Node.COMMENT_NODE:ownValue="comment()";break;case Node.DOCUMENT_NODE:ownValue="";break;default:ownValue="";break;}
+if(ownIndex>0)
+ownValue+="["+ownIndex+"]";return new WebInspector.DOMNodePathStep(ownValue,node.nodeType()===Node.DOCUMENT_NODE);},WebInspector.DOMPresentationUtils._xPathIndex=function(node)
+{function areNodesSimilar(left,right)
+{if(left===right)
+return true;if(left.nodeType()===Node.ELEMENT_NODE&&right.nodeType()===Node.ELEMENT_NODE)
+return left.localName()===right.localName();if(left.nodeType()===right.nodeType())
+return true;var leftType=left.nodeType()===Node.CDATA_SECTION_NODE?Node.TEXT_NODE:left.nodeType();var rightType=right.nodeType()===Node.CDATA_SECTION_NODE?Node.TEXT_NODE:right.nodeType();return leftType===rightType;}
+var siblings=node.parentNode?node.parentNode.children():null;if(!siblings)
+return 0;var hasSameNamedElements;for(var i=0;i<siblings.length;++i){if(areNodesSimilar(node,siblings[i])&&siblings[i]!==node){hasSameNamedElements=true;break;}}
+if(!hasSameNamedElements)
+return 0;var ownIndex=1;for(var i=0;i<siblings.length;++i){if(areNodesSimilar(node,siblings[i])){if(siblings[i]===node)
+return ownIndex;++ownIndex;}}
+return-1;}
+WebInspector.DOMNodePathStep=function(value,optimized)
+{this.value=value;this.optimized=optimized||false;}
+WebInspector.DOMNodePathStep.prototype={toString:function()
+{return this.value;}}
+WebInspector.SidebarSectionTreeElement=function(title,representedObject,hasChildren)
+{TreeElement.call(this,title.escapeHTML(),representedObject||{},hasChildren);this.expand();}
+WebInspector.SidebarSectionTreeElement.prototype={selectable:false,collapse:function()
+{},get smallChildren()
+{return this._smallChildren;},set smallChildren(x)
+{if(this._smallChildren===x)
+return;this._smallChildren=x;this._childrenListNode.classList.toggle("small",this._smallChildren);},onattach:function()
+{this._listItemNode.classList.add("sidebar-tree-section");},onreveal:function()
+{if(this.listItemElement)
+this.listItemElement.scrollIntoViewIfNeeded(false);},__proto__:TreeElement.prototype}
+WebInspector.SidebarTreeElement=function(className,title,subtitle,representedObject,hasChildren)
+{TreeElement.call(this,"",representedObject,hasChildren);if(hasChildren){this.disclosureButton=document.createElement("button");this.disclosureButton.className="disclosure-button";}
+this.iconElement=document.createElementWithClass("div","icon");this.statusElement=document.createElementWithClass("div","status");this.titlesElement=document.createElementWithClass("div","titles");this.titleContainer=this.titlesElement.createChild("span","title-container");this.titleElement=this.titleContainer.createChild("span","title");this.subtitleElement=this.titlesElement.createChild("span","subtitle");this.className=className;this.mainTitle=title;this.subtitle=subtitle;}
+WebInspector.SidebarTreeElement.prototype={get small()
+{return this._small;},set small(x)
+{this._small=x;if(this._listItemNode)
+this._listItemNode.classList.toggle("small",this._small);},get mainTitle()
+{return this._mainTitle;},set mainTitle(x)
+{this._mainTitle=x;this.refreshTitles();},get subtitle()
+{return this._subtitle;},set subtitle(x)
+{this._subtitle=x;this.refreshTitles();},set wait(x)
+{this._listItemNode.classList.toggle("wait",x);},refreshTitles:function()
+{var mainTitle=this.mainTitle;if(this.titleElement.textContent!==mainTitle)
+this.titleElement.textContent=mainTitle;var subtitle=this.subtitle;if(subtitle){if(this.subtitleElement.textContent!==subtitle)
+this.subtitleElement.textContent=subtitle;this.titlesElement.classList.remove("no-subtitle");}else{this.subtitleElement.textContent="";this.titlesElement.classList.add("no-subtitle");}},isEventWithinDisclosureTriangle:function(event)
+{return event.target===this.disclosureButton;},onattach:function()
+{this._listItemNode.classList.add("sidebar-tree-item");if(this.className)
+this._listItemNode.classList.add(this.className);if(this.small)
+this._listItemNode.classList.add("small");if(this.hasChildren&&this.disclosureButton)
+this._listItemNode.appendChild(this.disclosureButton);this._listItemNode.appendChild(this.iconElement);this._listItemNode.appendChild(this.statusElement);this._listItemNode.appendChild(this.titlesElement);},onreveal:function()
+{if(this._listItemNode)
+this._listItemNode.scrollIntoViewIfNeeded(false);},__proto__:TreeElement.prototype}
+WebInspector.Section=function(title,subtitle)
+{this.element=document.createElement("div");this.element.className="section";this.element._section=this;this.headerElement=document.createElement("div");this.headerElement.className="header";this.titleElement=document.createElement("div");this.titleElement.className="title";this.subtitleElement=document.createElement("div");this.subtitleElement.className="subtitle";this.headerElement.appendChild(this.subtitleElement);this.headerElement.appendChild(this.titleElement);this.headerElement.addEventListener("click",this.handleClick.bind(this),false);this.element.appendChild(this.headerElement);this.title=title;this.subtitle=subtitle;this._expanded=false;}
+WebInspector.Section.prototype={get title()
+{return this._title;},set title(x)
+{if(this._title===x)
+return;this._title=x;if(x instanceof Node){this.titleElement.removeChildren();this.titleElement.appendChild(x);}else
+this.titleElement.textContent=x;},get subtitle()
+{return this._subtitle;},set subtitle(x)
+{if(this._subtitle===x)
+return;this._subtitle=x;this.subtitleElement.textContent=x;},get subtitleAsTextForTest()
+{var result=this.subtitleElement.textContent;var child=this.subtitleElement.querySelector("[data-uncopyable]");if(child){var linkData=child.getAttribute("data-uncopyable");if(linkData)
+result+=linkData;}
+return result;},get expanded()
+{return this._expanded;},set expanded(x)
+{if(x)
+this.expand();else
+this.collapse();},get populated()
+{return this._populated;},set populated(x)
+{this._populated=x;if(!x&&this._expanded){this.onpopulate();this._populated=true;}},onpopulate:function()
+{},get firstSibling()
+{var parent=this.element.parentElement;if(!parent)
+return null;var childElement=parent.firstChild;while(childElement){if(childElement._section)
+return childElement._section;childElement=childElement.nextSibling;}
+return null;},get lastSibling()
+{var parent=this.element.parentElement;if(!parent)
+return null;var childElement=parent.lastChild;while(childElement){if(childElement._section)
+return childElement._section;childElement=childElement.previousSibling;}
+return null;},get nextSibling()
+{var curElement=this.element;do{curElement=curElement.nextSibling;}while(curElement&&!curElement._section);return curElement?curElement._section:null;},get previousSibling()
+{var curElement=this.element;do{curElement=curElement.previousSibling;}while(curElement&&!curElement._section);return curElement?curElement._section:null;},expand:function()
+{if(this._expanded)
+return;this._expanded=true;this.element.classList.add("expanded");if(!this._populated){this.onpopulate();this._populated=true;}},collapse:function()
+{if(!this._expanded)
+return;this._expanded=false;this.element.classList.remove("expanded");},toggleExpanded:function()
+{this.expanded=!this.expanded;},handleClick:function(event)
+{this.toggleExpanded();event.consume();}}
+WebInspector.PropertiesSection=function(title,subtitle)
+{WebInspector.Section.call(this,title,subtitle);this.headerElement.classList.add("monospace");this.propertiesElement=document.createElement("ol");this.propertiesElement.className="properties properties-tree monospace";this.propertiesTreeOutline=new TreeOutline(this.propertiesElement,true);this.propertiesTreeOutline.setFocusable(false);this.propertiesTreeOutline.section=this;this.element.appendChild(this.propertiesElement);}
+WebInspector.PropertiesSection.prototype={__proto__:WebInspector.Section.prototype}
+WebInspector.RemoteObject=function(){}
+WebInspector.RemoteObject.prototype={get type()
+{throw"Not implemented";},get subtype()
+{throw"Not implemented";},get description()
+{throw"Not implemented";},get hasChildren()
+{throw"Not implemented";},arrayLength:function()
+{throw"Not implemented";},getOwnProperties:function(callback)
+{throw"Not implemented";},getAllProperties:function(accessorPropertiesOnly,callback)
+{throw"Not implemented";},callFunction:function(functionDeclaration,args,callback)
+{throw"Not implemented";},callFunctionJSON:function(functionDeclaration,args,callback)
+{throw"Not implemented";},target:function()
+{throw"Not implemented";}}
+WebInspector.RemoteObject.fromPrimitiveValue=function(value,target)
+{if(!target)
+target=WebInspector.targetManager.mainTarget();return new WebInspector.RemoteObjectImpl(target,undefined,typeof value,undefined,value);}
+WebInspector.RemoteObject.fromLocalObject=function(value)
+{return new WebInspector.LocalJSONObject(value);}
+WebInspector.RemoteObject.resolveNode=function(node,objectGroup,callback)
+{function mycallback(error,object)
+{if(!callback)
+return;if(error||!object)
+callback(null);else
+callback(WebInspector.RemoteObject.fromPayload(object));}
+DOMAgent.resolveNode(node.id,objectGroup,mycallback);}
+WebInspector.RemoteObject.fromPayload=function(payload,target)
+{if(!target)
+target=WebInspector.targetManager.mainTarget();console.assert(typeof payload==="object","Remote object payload should only be an object");return new WebInspector.RemoteObjectImpl(target,payload.objectId,payload.type,payload.subtype,payload.value,payload.description,payload.preview);}
+WebInspector.RemoteObject.type=function(remoteObject)
+{if(remoteObject===null)
+return"null";var type=typeof remoteObject;if(type!=="object"&&type!=="function")
+return type;return remoteObject.type;}
+WebInspector.RemoteObject.toCallArgument=function(remoteObject)
+{var type=(remoteObject.type);var value=remoteObject.value;if(type==="number"){switch(remoteObject.description){case"NaN":case"Infinity":case"-Infinity":case"-0":value=remoteObject.description;break;}}
+return{value:value,objectId:remoteObject.objectId,type:type};}
+WebInspector.RemoteObjectImpl=function(target,objectId,type,subtype,value,description,preview)
+{WebInspector.RemoteObject.call(this);this._target=target;this._runtimeAgent=target.runtimeAgent();this._domModel=target.domModel;this._type=type;this._subtype=subtype;if(objectId){this._objectId=objectId;this._description=description;this._hasChildren=true;this._preview=preview;}else{console.assert(type!=="object"||value===null);this._description=description||(value+"");this._hasChildren=false;if(type==="number"&&typeof value!=="number")
+this.value=Number(value);else
+this.value=value;}}
+WebInspector.RemoteObjectImpl.prototype={get objectId()
+{return this._objectId;},get type()
+{return this._type;},get subtype()
+{return this._subtype;},get description()
+{return this._description;},get hasChildren()
+{return this._hasChildren;},get preview()
+{return this._preview;},getOwnProperties:function(callback)
+{this.doGetProperties(true,false,callback);},getAllProperties:function(accessorPropertiesOnly,callback)
+{this.doGetProperties(false,accessorPropertiesOnly,callback);},getProperty:function(propertyPath,callback)
+{function remoteFunction(arrayStr)
+{var result=this;var properties=JSON.parse(arrayStr);for(var i=0,n=properties.length;i<n;++i)
+result=result[properties[i]];return result;}
+var args=[{value:JSON.stringify(propertyPath)}];this.callFunction(remoteFunction,args,callback);},doGetProperties:function(ownProperties,accessorPropertiesOnly,callback)
+{if(!this._objectId){callback(null,null);return;}
+function remoteObjectBinder(error,properties,internalProperties)
+{if(error){callback(null,null);return;}
+var result=[];for(var i=0;properties&&i<properties.length;++i){var property=properties[i];result.push(new WebInspector.RemoteObjectProperty(property.name,null,property));}
+var internalPropertiesResult=null;if(internalProperties){internalPropertiesResult=[];for(var i=0;i<internalProperties.length;i++){var property=internalProperties[i];if(!property.value)
+continue;internalPropertiesResult.push(new WebInspector.RemoteObjectProperty(property.name,WebInspector.RemoteObject.fromPayload(property.value)));}}
+callback(result,internalPropertiesResult);}
+this._runtimeAgent.getProperties(this._objectId,ownProperties,accessorPropertiesOnly,remoteObjectBinder);},setPropertyValue:function(name,value,callback)
+{if(!this._objectId){callback("Can't set a property of non-object.");return;}
+this._runtimeAgent.invoke_evaluate({expression:value,doNotPauseOnExceptionsAndMuteConsole:true},evaluatedCallback.bind(this));function evaluatedCallback(error,result,wasThrown)
+{if(error||wasThrown){callback(error||result.description);return;}
+this.doSetObjectPropertyValue(result,name,callback);if(result.objectId)
+this._runtimeAgent.releaseObject(result.objectId);}},doSetObjectPropertyValue:function(result,name,callback)
+{var setPropertyValueFunction="function(a, b) { this[a] = b; }";var argv=[{value:name},WebInspector.RemoteObject.toCallArgument(result)]
+this._runtimeAgent.callFunctionOn(this._objectId,setPropertyValueFunction,argv,true,undefined,undefined,propertySetCallback);function propertySetCallback(error,result,wasThrown)
+{if(error||wasThrown){callback(error||result.description);return;}
+callback();}},pushNodeToFrontend:function(callback)
+{if(this._objectId)
+this._domModel.pushNodeToFrontend(this._objectId,callback);else
+callback(0);},highlightAsDOMNode:function()
+{this._domModel.highlightDOMNode(undefined,undefined,this._objectId);},hideDOMNodeHighlight:function()
+{this._domModel.hideDOMNodeHighlight();},callFunction:function(functionDeclaration,args,callback)
+{function mycallback(error,result,wasThrown)
+{if(!callback)
+return;if(error)
+callback(null,false);else
+callback(WebInspector.RemoteObject.fromPayload(result),wasThrown);}
+this._runtimeAgent.callFunctionOn(this._objectId,functionDeclaration.toString(),args,true,undefined,undefined,mycallback);},callFunctionJSON:function(functionDeclaration,args,callback)
+{function mycallback(error,result,wasThrown)
+{callback((error||wasThrown)?null:result.value);}
+this._runtimeAgent.callFunctionOn(this._objectId,functionDeclaration.toString(),args,true,true,false,mycallback);},release:function()
+{if(!this._objectId)
+return;this._runtimeAgent.releaseObject(this._objectId);},arrayLength:function()
+{if(this.subtype!=="array")
+return 0;var matches=this._description.match(/\[([0-9]+)\]/);if(!matches)
+return 0;return parseInt(matches[1],10);},target:function()
+{return this._target;},__proto__:WebInspector.RemoteObject.prototype};WebInspector.RemoteObject.loadFromObject=function(object,flattenProtoChain,callback)
+{if(flattenProtoChain)
+object.getAllProperties(false,callback);else
+WebInspector.RemoteObject.loadFromObjectPerProto(object,callback);};WebInspector.RemoteObject.loadFromObjectPerProto=function(object,callback)
+{var savedOwnProperties;var savedAccessorProperties;var savedInternalProperties;var resultCounter=2;function processCallback()
+{if(--resultCounter)
+return;if(savedOwnProperties&&savedAccessorProperties){var combinedList=savedAccessorProperties.slice(0);for(var i=0;i<savedOwnProperties.length;i++){var property=savedOwnProperties[i];if(!property.isAccessorProperty())
+combinedList.push(property);}
+return callback(combinedList,savedInternalProperties?savedInternalProperties:null);}else{callback(null,null);}}
+function allAccessorPropertiesCallback(properties,internalProperties)
+{savedAccessorProperties=properties;processCallback();}
+function ownPropertiesCallback(properties,internalProperties)
+{savedOwnProperties=properties;savedInternalProperties=internalProperties;processCallback();}
+object.getAllProperties(true,allAccessorPropertiesCallback);object.getOwnProperties(ownPropertiesCallback);};WebInspector.ScopeRemoteObject=function(target,objectId,scopeRef,type,subtype,value,description,preview)
+{WebInspector.RemoteObjectImpl.call(this,target,objectId,type,subtype,value,description,preview);this._scopeRef=scopeRef;this._savedScopeProperties=undefined;this._debuggerAgent=target.debuggerAgent();};WebInspector.ScopeRemoteObject.fromPayload=function(payload,scopeRef,target)
+{if(!target)
+target=WebInspector.targetManager.mainTarget();if(scopeRef)
+return new WebInspector.ScopeRemoteObject(target,payload.objectId,scopeRef,payload.type,payload.subtype,payload.value,payload.description,payload.preview);else
+return new WebInspector.RemoteObjectImpl(target,payload.objectId,payload.type,payload.subtype,payload.value,payload.description,payload.preview);}
+WebInspector.ScopeRemoteObject.prototype={doGetProperties:function(ownProperties,accessorPropertiesOnly,callback)
+{if(accessorPropertiesOnly){callback([],[]);return;}
+if(this._savedScopeProperties){callback(this._savedScopeProperties.slice(),[]);return;}
+function wrappedCallback(properties,internalProperties)
+{if(this._scopeRef&&properties instanceof Array)
+this._savedScopeProperties=properties.slice();callback(properties,internalProperties);}
+WebInspector.RemoteObjectImpl.prototype.doGetProperties.call(this,ownProperties,accessorPropertiesOnly,wrappedCallback.bind(this));},doSetObjectPropertyValue:function(result,name,callback)
+{this._debuggerAgent.setVariableValue(this._scopeRef.number,name,WebInspector.RemoteObject.toCallArgument(result),this._scopeRef.callFrameId,this._scopeRef.functionId,setVariableValueCallback.bind(this));function setVariableValueCallback(error)
+{if(error){callback(error);return;}
+if(this._savedScopeProperties){for(var i=0;i<this._savedScopeProperties.length;i++){if(this._savedScopeProperties[i].name===name)
+this._savedScopeProperties[i].value=WebInspector.RemoteObject.fromPayload(result);}}
+callback();}},__proto__:WebInspector.RemoteObjectImpl.prototype};WebInspector.ScopeRef=function(number,callFrameId,functionId)
+{this.number=number;this.callFrameId=callFrameId;this.functionId=functionId;}
+WebInspector.RemoteObjectProperty=function(name,value,descriptor)
+{this.name=name;this.enumerable=descriptor?!!descriptor.enumerable:true;this.writable=descriptor?!!descriptor.writable:true;if(value===null&&descriptor){if(descriptor.value)
+this.value=WebInspector.RemoteObject.fromPayload(descriptor.value)
+if(descriptor.get&&descriptor.get.type!=="undefined")
+this.getter=WebInspector.RemoteObject.fromPayload(descriptor.get);if(descriptor.set&&descriptor.set.type!=="undefined")
+this.setter=WebInspector.RemoteObject.fromPayload(descriptor.set);}else{this.value=value;}
+if(descriptor){this.isOwn=descriptor.isOwn;this.wasThrown=!!descriptor.wasThrown;}}
+WebInspector.RemoteObjectProperty.prototype={isAccessorProperty:function()
+{return!!(this.getter||this.setter);}};WebInspector.RemoteObjectProperty.fromPrimitiveValue=function(name,value)
+{return new WebInspector.RemoteObjectProperty(name,WebInspector.RemoteObject.fromPrimitiveValue(value));}
+WebInspector.RemoteObjectProperty.fromScopeValue=function(name,value)
+{var result=new WebInspector.RemoteObjectProperty(name,value);result.writable=false;return result;}
+WebInspector.LocalJSONObject=function(value)
+{WebInspector.RemoteObject.call(this);this._value=value;}
+WebInspector.LocalJSONObject.prototype={get description()
+{if(this._cachedDescription)
+return this._cachedDescription;function formatArrayItem(property)
+{return property.value.description;}
+function formatObjectItem(property)
+{return property.name+":"+property.value.description;}
+if(this.type==="object"){switch(this.subtype){case"array":this._cachedDescription=this._concatenate("[","]",formatArrayItem);break;case"date":this._cachedDescription=""+this._value;break;case"null":this._cachedDescription="null";break;default:this._cachedDescription=this._concatenate("{","}",formatObjectItem);}}else
+this._cachedDescription=String(this._value);return this._cachedDescription;},_concatenate:function(prefix,suffix,formatProperty)
+{const previewChars=100;var buffer=prefix;var children=this._children();for(var i=0;i<children.length;++i){var itemDescription=formatProperty(children[i]);if(buffer.length+itemDescription.length>previewChars){buffer+=",\u2026";break;}
+if(i)
+buffer+=", ";buffer+=itemDescription;}
+buffer+=suffix;return buffer;},get type()
+{return typeof this._value;},get subtype()
+{if(this._value===null)
+return"null";if(this._value instanceof Array)
+return"array";if(this._value instanceof Date)
+return"date";return undefined;},get hasChildren()
+{if((typeof this._value!=="object")||(this._value===null))
+return false;return!!Object.keys((this._value)).length;},getOwnProperties:function(callback)
+{callback(this._children());},getAllProperties:function(accessorPropertiesOnly,callback)
+{if(accessorPropertiesOnly)
+callback([],null);else
+callback(this._children(),null);},_children:function()
+{if(!this.hasChildren)
+return[];var value=(this._value);function buildProperty(propName)
+{return new WebInspector.RemoteObjectProperty(propName,new WebInspector.LocalJSONObject(this._value[propName]));}
+if(!this._cachedChildren)
+this._cachedChildren=Object.keys(value).map(buildProperty.bind(this));return this._cachedChildren;},isError:function()
+{return false;},arrayLength:function()
+{return this._value instanceof Array?this._value.length:0;},callFunction:function(functionDeclaration,args,callback)
+{var target=(this._value);var rawArgs=args?args.map(function(arg){return arg.value;}):[];var result;var wasThrown=false;try{result=functionDeclaration.apply(target,rawArgs);}catch(e){wasThrown=true;}
+if(!callback)
+return;callback(WebInspector.RemoteObject.fromLocalObject(result),wasThrown);},callFunctionJSON:function(functionDeclaration,args,callback)
+{var target=(this._value);var rawArgs=args?args.map(function(arg){return arg.value;}):[];var result;try{result=functionDeclaration.apply(target,rawArgs);}catch(e){result=null;}
+callback(result);},__proto__:WebInspector.RemoteObject.prototype}
+WebInspector.ObjectPropertiesSection=function(object,title,subtitle,emptyPlaceholder,ignoreHasOwnProperty,extraProperties,treeElementConstructor)
+{this.emptyPlaceholder=(emptyPlaceholder||WebInspector.UIString("No Properties"));this.object=object;this.ignoreHasOwnProperty=ignoreHasOwnProperty;this.extraProperties=extraProperties;this.treeElementConstructor=treeElementConstructor||WebInspector.ObjectPropertyTreeElement;this.editable=true;this.skipProto=false;WebInspector.PropertiesSection.call(this,title||"",subtitle);}
+WebInspector.ObjectPropertiesSection._arrayLoadThreshold=100;WebInspector.ObjectPropertiesSection.prototype={enableContextMenu:function()
+{this.element.addEventListener("contextmenu",this._contextMenuEventFired.bind(this),false);},_contextMenuEventFired:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(this.object);contextMenu.show();},onpopulate:function()
+{this.update();},update:function()
+{if(this.object.arrayLength()>WebInspector.ObjectPropertiesSection._arrayLoadThreshold){this.propertiesTreeOutline.removeChildren();WebInspector.ArrayGroupingTreeElement._populateArray(this.propertiesTreeOutline,this.object,0,this.object.arrayLength()-1);return;}
+function callback(properties,internalProperties)
+{if(!properties)
+return;this.updateProperties(properties,internalProperties);}
+WebInspector.RemoteObject.loadFromObject(this.object,!!this.ignoreHasOwnProperty,callback.bind(this));},updateProperties:function(properties,internalProperties,rootTreeElementConstructor,rootPropertyComparer)
+{if(!rootTreeElementConstructor)
+rootTreeElementConstructor=this.treeElementConstructor;if(!rootPropertyComparer)
+rootPropertyComparer=WebInspector.ObjectPropertiesSection.CompareProperties;if(this.extraProperties){for(var i=0;i<this.extraProperties.length;++i)
+properties.push(this.extraProperties[i]);}
+this.propertiesTreeOutline.removeChildren();WebInspector.ObjectPropertyTreeElement.populateWithProperties(this.propertiesTreeOutline,properties,internalProperties,rootTreeElementConstructor,rootPropertyComparer,this.skipProto,this.object);this.propertiesForTest=properties;if(!this.propertiesTreeOutline.children.length){var title=document.createElement("div");title.className="info";title.textContent=this.emptyPlaceholder;var infoElement=new TreeElement(title,null,false);this.propertiesTreeOutline.appendChild(infoElement);}},__proto__:WebInspector.PropertiesSection.prototype}
+WebInspector.ObjectPropertiesSection.CompareProperties=function(propertyA,propertyB)
+{var a=propertyA.name;var b=propertyB.name;if(a==="__proto__")
+return 1;if(b==="__proto__")
+return-1;return String.naturalOrderComparator(a,b);}
+WebInspector.ObjectPropertyTreeElement=function(property)
+{this.property=property;TreeElement.call(this,"",null,false);this.toggleOnClick=true;this.selectable=false;}
+WebInspector.ObjectPropertyTreeElement.prototype={onpopulate:function()
+{var propertyValue=(this.property.value);console.assert(propertyValue);WebInspector.ObjectPropertyTreeElement.populate(this,propertyValue);},ondblclick:function(event)
+{if(this.property.writable||this.property.setter)
+this.startEditing(event);return false;},onattach:function()
+{this.update();},update:function()
+{this.nameElement=document.createElement("span");this.nameElement.className="name";var name=this.property.name;if(/^\s|\s$|^$|\n/.test(name))
+name="\""+name.replace(/\n/g,"\u21B5")+"\"";this.nameElement.textContent=name;if(!this.property.enumerable)
+this.nameElement.classList.add("dimmed");if(this.property.isAccessorProperty())
+this.nameElement.classList.add("properties-accessor-property-name");var separatorElement=document.createElement("span");separatorElement.className="separator";separatorElement.textContent=": ";if(this.property.value){this.valueElement=document.createElement("span");this.valueElement.className="value";var description=this.property.value.description;var valueText;if(this.property.wasThrown){valueText="[Exception: "+description+"]";}else if(this.property.value.type==="string"&&typeof description==="string"){valueText="\""+description.replace(/\n/g,"\u21B5")+"\"";this.valueElement._originalTextContent="\""+description+"\"";}else if(this.property.value.type==="function"&&typeof description==="string"){valueText=/.*/.exec(description)[0].replace(/ +$/g,"");this.valueElement._originalTextContent=description;}else if(this.property.value.type!=="object"||this.property.value.subtype!=="node"){valueText=description;}
+this.valueElement.setTextContentTruncatedIfNeeded(valueText||"");if(this.property.wasThrown)
+this.valueElement.classList.add("error");if(this.property.value.subtype)
+this.valueElement.classList.add("console-formatted-"+this.property.value.subtype);else if(this.property.value.type)
+this.valueElement.classList.add("console-formatted-"+this.property.value.type);this.valueElement.addEventListener("contextmenu",this._contextMenuFired.bind(this,this.property.value),false);if(this.property.value.type==="object"&&this.property.value.subtype==="node"&&this.property.value.description){WebInspector.DOMPresentationUtils.createSpansForNodeTitle(this.valueElement,this.property.value.description);this.valueElement.addEventListener("mousemove",this._mouseMove.bind(this,this.property.value),false);this.valueElement.addEventListener("mouseout",this._mouseOut.bind(this,this.property.value),false);}else{this.valueElement.title=description||"";}
+this.listItemElement.removeChildren();this.hasChildren=this.property.value.hasChildren&&!this.property.wasThrown;}else{if(this.property.getter){this.valueElement=WebInspector.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan(this.property.parentObject,[this.property.name],this._onInvokeGetterClick.bind(this));}else{this.valueElement=document.createElement("span");this.valueElement.className="console-formatted-undefined";this.valueElement.textContent=WebInspector.UIString("<unreadable>");this.valueElement.title=WebInspector.UIString("No property getter");}}
+this.listItemElement.appendChild(this.nameElement);this.listItemElement.appendChild(separatorElement);this.listItemElement.appendChild(this.valueElement);},_contextMenuFired:function(value,event)
+{var contextMenu=new WebInspector.ContextMenu(event);this.populateContextMenu(contextMenu);contextMenu.appendApplicableItems(value);contextMenu.show();},populateContextMenu:function(contextMenu)
+{},_mouseMove:function(event)
+{this.property.value.highlightAsDOMNode();},_mouseOut:function(event)
+{this.property.value.hideDOMNodeHighlight();},updateSiblings:function()
+{if(this.parent.root)
+this.treeOutline.section.update();else
+this.parent.shouldRefreshChildren=true;},renderPromptAsBlock:function()
+{return false;},elementAndValueToEdit:function(event)
+{return[this.valueElement,(typeof this.valueElement._originalTextContent==="string")?this.valueElement._originalTextContent:undefined];},startEditing:function(event)
+{var elementAndValueToEdit=this.elementAndValueToEdit(event);var elementToEdit=elementAndValueToEdit[0];var valueToEdit=elementAndValueToEdit[1];if(WebInspector.isBeingEdited(elementToEdit)||!this.treeOutline.section.editable||this._readOnly)
+return;if(typeof valueToEdit!=="undefined")
+elementToEdit.setTextContentTruncatedIfNeeded(valueToEdit,WebInspector.UIString("<string is too large to edit>"));var context={expanded:this.expanded,elementToEdit:elementToEdit,previousContent:elementToEdit.textContent};this.hasChildren=false;this.listItemElement.classList.add("editing-sub-part");this._prompt=new WebInspector.ObjectPropertyPrompt(this.editingCommitted.bind(this,null,elementToEdit.textContent,context.previousContent,context),this.editingCancelled.bind(this,null,context),this.renderPromptAsBlock());function blurListener()
+{this.editingCommitted(null,elementToEdit.textContent,context.previousContent,context);}
+var proxyElement=this._prompt.attachAndStartEditing(elementToEdit,blurListener.bind(this));window.getSelection().setBaseAndExtent(elementToEdit,0,elementToEdit,1);proxyElement.addEventListener("keydown",this._promptKeyDown.bind(this,context),false);},isEditing:function()
+{return!!this._prompt;},editingEnded:function(context)
+{this._prompt.detach();delete this._prompt;this.listItemElement.scrollLeft=0;this.listItemElement.classList.remove("editing-sub-part");if(context.expanded)
+this.expand();},editingCancelled:function(element,context)
+{this.editingEnded(context);this.update();},editingCommitted:function(element,userInput,previousContent,context)
+{if(userInput===previousContent){this.editingCancelled(element,context);return;}
+this.editingEnded(context);this.applyExpression(userInput,true);},_promptKeyDown:function(context,event)
+{if(isEnterKey(event)){event.consume(true);this.editingCommitted(null,context.elementToEdit.textContent,context.previousContent,context);return;}
+if(event.keyIdentifier==="U+001B"){event.consume();this.editingCancelled(null,context);return;}},applyExpression:function(expression,updateInterface)
+{expression=expression.trim();var expressionLength=expression.length;function callback(error)
+{if(!updateInterface)
+return;if(error)
+this.update();if(!expressionLength){this.parent.removeChild(this);}else{this.updateSiblings();}};this.property.parentObject.setPropertyValue(this.property.name,expression.trim(),callback.bind(this));},propertyPath:function()
+{if("_cachedPropertyPath"in this)
+return this._cachedPropertyPath;var current=this;var result;do{if(current.property){if(result)
+result=current.property.name+"."+result;else
+result=current.property.name;}
+current=current.parent;}while(current&&!current.root);this._cachedPropertyPath=result;return result;},_onInvokeGetterClick:function(result,wasThrown)
+{if(!result)
+return;this.property.value=result;this.property.wasThrown=wasThrown;this.update();this.shouldRefreshChildren=true;},__proto__:TreeElement.prototype}
+WebInspector.ObjectPropertyTreeElement.populate=function(treeElement,value){if(treeElement.children.length&&!treeElement.shouldRefreshChildren)
+return;if(value.arrayLength()>WebInspector.ObjectPropertiesSection._arrayLoadThreshold){treeElement.removeChildren();WebInspector.ArrayGroupingTreeElement._populateArray(treeElement,value,0,value.arrayLength()-1);return;}
+function callback(properties,internalProperties)
+{treeElement.removeChildren();if(!properties)
+return;if(!internalProperties)
+internalProperties=[];WebInspector.ObjectPropertyTreeElement.populateWithProperties(treeElement,properties,internalProperties,treeElement.treeOutline.section.treeElementConstructor,WebInspector.ObjectPropertiesSection.CompareProperties,treeElement.treeOutline.section.skipProto,value);}
+WebInspector.RemoteObject.loadFromObjectPerProto(value,callback);}
+WebInspector.ObjectPropertyTreeElement.populateWithProperties=function(treeElement,properties,internalProperties,treeElementConstructor,comparator,skipProto,value){properties.sort(comparator);for(var i=0;i<properties.length;++i){var property=properties[i];if(skipProto&&property.name==="__proto__")
+continue;if(property.isAccessorProperty()){if(property.name!=="__proto__"&&property.getter){property.parentObject=value;treeElement.appendChild(new treeElementConstructor(property));}
+if(property.isOwn){if(property.getter){var getterProperty=new WebInspector.RemoteObjectProperty("get "+property.name,property.getter);getterProperty.parentObject=value;treeElement.appendChild(new treeElementConstructor(getterProperty));}
+if(property.setter){var setterProperty=new WebInspector.RemoteObjectProperty("set "+property.name,property.setter);setterProperty.parentObject=value;treeElement.appendChild(new treeElementConstructor(setterProperty));}}}else{property.parentObject=value;treeElement.appendChild(new treeElementConstructor(property));}}
+if(value&&value.type==="function"){var hasTargetFunction=false;if(internalProperties){for(var i=0;i<internalProperties.length;i++){if(internalProperties[i].name=="[[TargetFunction]]"){hasTargetFunction=true;break;}}}
+if(!hasTargetFunction)
+treeElement.appendChild(new WebInspector.FunctionScopeMainTreeElement(value));}
+if(internalProperties){for(var i=0;i<internalProperties.length;i++){internalProperties[i].parentObject=value;treeElement.appendChild(new treeElementConstructor(internalProperties[i]));}}}
+WebInspector.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan=function(object,propertyPath,callback)
+{var rootElement=document.createElement("span");var element=rootElement.createChild("span","properties-calculate-value-button");element.textContent=WebInspector.UIString("(...)");element.title=WebInspector.UIString("Invoke property getter");element.addEventListener("click",onInvokeGetterClick,false);function onInvokeGetterClick(event)
+{event.consume();object.getProperty(propertyPath,callback);}
+return rootElement;}
+WebInspector.FunctionScopeMainTreeElement=function(remoteObject)
+{TreeElement.call(this,"<function scope>",null,false);this.toggleOnClick=true;this.selectable=false;this._remoteObject=remoteObject;this.hasChildren=true;}
+WebInspector.FunctionScopeMainTreeElement.prototype={onpopulate:function()
+{if(this.children.length&&!this.shouldRefreshChildren)
+return;function didGetDetails(error,response)
+{if(error){console.error(error);return;}
+this.removeChildren();var scopeChain=response.scopeChain;if(!scopeChain)
+return;for(var i=0;i<scopeChain.length;++i){var scope=scopeChain[i];var title=null;var isTrueObject;switch(scope.type){case DebuggerAgent.ScopeType.Local:title=WebInspector.UIString("Local");isTrueObject=false;break;case DebuggerAgent.ScopeType.Closure:title=WebInspector.UIString("Closure");isTrueObject=false;break;case DebuggerAgent.ScopeType.Catch:title=WebInspector.UIString("Catch");isTrueObject=false;break;case DebuggerAgent.ScopeType.With:title=WebInspector.UIString("With Block");isTrueObject=true;break;case DebuggerAgent.ScopeType.Global:title=WebInspector.UIString("Global");isTrueObject=true;break;default:console.error("Unknown scope type: "+scope.type);continue;}
+var scopeRef=isTrueObject?undefined:new WebInspector.ScopeRef(i,undefined,this._remoteObject.objectId);var remoteObject=WebInspector.ScopeRemoteObject.fromPayload(scope.object,scopeRef);if(isTrueObject){var property=WebInspector.RemoteObjectProperty.fromScopeValue(title,remoteObject);property.parentObject=null;this.appendChild(new this.treeOutline.section.treeElementConstructor(property));}else{var scopeTreeElement=new WebInspector.ScopeTreeElement(title,null,remoteObject);this.appendChild(scopeTreeElement);}}}
+DebuggerAgent.getFunctionDetails(this._remoteObject.objectId,didGetDetails.bind(this));},__proto__:TreeElement.prototype}
+WebInspector.ScopeTreeElement=function(title,subtitle,remoteObject)
+{TreeElement.call(this,title,null,false);this.toggleOnClick=true;this.selectable=false;this._remoteObject=remoteObject;this.hasChildren=true;}
+WebInspector.ScopeTreeElement.prototype={onpopulate:function()
+{WebInspector.ObjectPropertyTreeElement.populate(this,this._remoteObject);},__proto__:TreeElement.prototype}
+WebInspector.ArrayGroupingTreeElement=function(object,fromIndex,toIndex,propertyCount)
+{TreeElement.call(this,String.sprintf("[%d \u2026 %d]",fromIndex,toIndex),undefined,true);this._fromIndex=fromIndex;this._toIndex=toIndex;this._object=object;this._readOnly=true;this._propertyCount=propertyCount;this._populated=false;}
+WebInspector.ArrayGroupingTreeElement._bucketThreshold=100;WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold=250000;WebInspector.ArrayGroupingTreeElement._populateArray=function(treeElement,object,fromIndex,toIndex)
+{WebInspector.ArrayGroupingTreeElement._populateRanges(treeElement,object,fromIndex,toIndex,true);}
+WebInspector.ArrayGroupingTreeElement._populateRanges=function(treeElement,object,fromIndex,toIndex,topLevel)
+{object.callFunctionJSON(packRanges,[{value:fromIndex},{value:toIndex},{value:WebInspector.ArrayGroupingTreeElement._bucketThreshold},{value:WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold}],callback);function packRanges(fromIndex,toIndex,bucketThreshold,sparseIterationThreshold)
+{var ownPropertyNames=null;function doLoop(iterationCallback)
+{if(toIndex-fromIndex<sparseIterationThreshold){for(var i=fromIndex;i<=toIndex;++i){if(i in this)
+iterationCallback(i);}}else{ownPropertyNames=ownPropertyNames||Object.getOwnPropertyNames(this);for(var i=0;i<ownPropertyNames.length;++i){var name=ownPropertyNames[i];var index=name>>>0;if(String(index)===name&&fromIndex<=index&&index<=toIndex)
+iterationCallback(index);}}}
+var count=0;function countIterationCallback()
+{++count;}
+doLoop.call(this,countIterationCallback);var bucketSize=count;if(count<=bucketThreshold)
+bucketSize=count;else
+bucketSize=Math.pow(bucketThreshold,Math.ceil(Math.log(count)/Math.log(bucketThreshold))-1);var ranges=[];count=0;var groupStart=-1;var groupEnd=0;function loopIterationCallback(i)
+{if(groupStart===-1)
+groupStart=i;groupEnd=i;if(++count===bucketSize){ranges.push([groupStart,groupEnd,count]);count=0;groupStart=-1;}}
+doLoop.call(this,loopIterationCallback);if(count>0)
+ranges.push([groupStart,groupEnd,count]);return ranges;}
+function callback(ranges)
+{if(ranges.length==1)
+WebInspector.ArrayGroupingTreeElement._populateAsFragment(treeElement,object,ranges[0][0],ranges[0][1]);else{for(var i=0;i<ranges.length;++i){var fromIndex=ranges[i][0];var toIndex=ranges[i][1];var count=ranges[i][2];if(fromIndex==toIndex)
+WebInspector.ArrayGroupingTreeElement._populateAsFragment(treeElement,object,fromIndex,toIndex);else
+treeElement.appendChild(new WebInspector.ArrayGroupingTreeElement(object,fromIndex,toIndex,count));}}
+if(topLevel)
+WebInspector.ArrayGroupingTreeElement._populateNonIndexProperties(treeElement,object);}}
+WebInspector.ArrayGroupingTreeElement._populateAsFragment=function(treeElement,object,fromIndex,toIndex)
+{object.callFunction(buildArrayFragment,[{value:fromIndex},{value:toIndex},{value:WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold}],processArrayFragment.bind(this));function buildArrayFragment(fromIndex,toIndex,sparseIterationThreshold)
+{var result=Object.create(null);if(toIndex-fromIndex<sparseIterationThreshold){for(var i=fromIndex;i<=toIndex;++i){if(i in this)
+result[i]=this[i];}}else{var ownPropertyNames=Object.getOwnPropertyNames(this);for(var i=0;i<ownPropertyNames.length;++i){var name=ownPropertyNames[i];var index=name>>>0;if(String(index)===name&&fromIndex<=index&&index<=toIndex)
+result[index]=this[index];}}
+return result;}
+function processArrayFragment(arrayFragment,wasThrown)
+{if(!arrayFragment||wasThrown)
+return;arrayFragment.getAllProperties(false,processProperties.bind(this));}
+function processProperties(properties,internalProperties)
+{if(!properties)
+return;properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);for(var i=0;i<properties.length;++i){properties[i].parentObject=this._object;var childTreeElement=new treeElement.treeOutline.section.treeElementConstructor(properties[i]);childTreeElement._readOnly=true;treeElement.appendChild(childTreeElement);}}}
+WebInspector.ArrayGroupingTreeElement._populateNonIndexProperties=function(treeElement,object)
+{object.callFunction(buildObjectFragment,undefined,processObjectFragment.bind(this));function buildObjectFragment()
+{var result=Object.create(this.__proto__);var names=Object.getOwnPropertyNames(this);for(var i=0;i<names.length;++i){var name=names[i];if(String(name>>>0)===name&&name>>>0!==0xffffffff)
+continue;var descriptor=Object.getOwnPropertyDescriptor(this,name);if(descriptor)
+Object.defineProperty(result,name,descriptor);}
+return result;}
+function processObjectFragment(arrayFragment,wasThrown)
+{if(!arrayFragment||wasThrown)
+return;arrayFragment.getOwnProperties(processProperties.bind(this));}
+function processProperties(properties,internalProperties)
+{if(!properties)
+return;properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);for(var i=0;i<properties.length;++i){properties[i].parentObject=this._object;var childTreeElement=new treeElement.treeOutline.section.treeElementConstructor(properties[i]);childTreeElement._readOnly=true;treeElement.appendChild(childTreeElement);}}}
+WebInspector.ArrayGroupingTreeElement.prototype={onpopulate:function()
+{if(this._populated)
+return;this._populated=true;if(this._propertyCount>=WebInspector.ArrayGroupingTreeElement._bucketThreshold){WebInspector.ArrayGroupingTreeElement._populateRanges(this,this._object,this._fromIndex,this._toIndex,false);return;}
+WebInspector.ArrayGroupingTreeElement._populateAsFragment(this,this._object,this._fromIndex,this._toIndex);},onattach:function()
+{this.listItemElement.classList.add("name");},__proto__:TreeElement.prototype}
+WebInspector.ObjectPropertyPrompt=function(commitHandler,cancelHandler,renderAsBlock)
+{WebInspector.TextPrompt.call(this,WebInspector.runtimeModel.completionsForTextPrompt.bind(WebInspector.runtimeModel));this.setSuggestBoxEnabled("generic-suggest");if(renderAsBlock)
+this.renderAsBlock();}
+WebInspector.ObjectPropertyPrompt.prototype={__proto__:WebInspector.TextPrompt.prototype}
+WebInspector.ObjectPopoverHelper=function(panelElement,getAnchor,queryObject,onHide,disableOnClick)
+{WebInspector.PopoverHelper.call(this,panelElement,getAnchor,this._showObjectPopover.bind(this),this._onHideObjectPopover.bind(this),disableOnClick);this._queryObject=queryObject;this._onHideCallback=onHide;this._popoverObjectGroup="popover";panelElement.addEventListener("scroll",this.hidePopover.bind(this),true);};WebInspector.ObjectPopoverHelper.prototype={setRemoteObjectFormatter:function(formatter)
+{this._remoteObjectFormatter=formatter;},_showObjectPopover:function(element,popover)
+{function didGetDetails(anchorElement,popoverContentElement,error,response)
+{if(error){console.error(error);return;}
+var container=document.createElement("div");container.className="inline-block";var title=container.createChild("div","function-popover-title source-code");var functionName=title.createChild("span","function-name");functionName.textContent=response.functionName||WebInspector.UIString("(anonymous function)");this._linkifier=new WebInspector.Linkifier();var rawLocation=(response.location);var link=this._linkifier.linkifyRawLocation(rawLocation,"function-location-link");if(link)
+title.appendChild(link);container.appendChild(popoverContentElement);popover.show(container,anchorElement);}
+function showObjectPopover(result,wasThrown,anchorOverride)
+{if(popover.disposed)
+return;if(wasThrown){this.hidePopover();return;}
+var anchorElement=anchorOverride||element;var description=(this._remoteObjectFormatter&&this._remoteObjectFormatter(result))||result.description;var popoverContentElement=null;if(result.type!=="object"){popoverContentElement=document.createElement("span");popoverContentElement.className="monospace console-formatted-"+result.type;popoverContentElement.style.whiteSpace="pre";popoverContentElement.textContent=description;if(result.type==="function"){DebuggerAgent.getFunctionDetails(result.objectId,didGetDetails.bind(this,anchorElement,popoverContentElement));return;}
+if(result.type==="string")
+popoverContentElement.textContent="\""+popoverContentElement.textContent+"\"";popover.show(popoverContentElement,anchorElement);}else{if(result.subtype==="node")
+result.highlightAsDOMNode();popoverContentElement=document.createElement("div");this._titleElement=document.createElement("div");this._titleElement.className="source-frame-popover-title monospace";this._titleElement.textContent=description;popoverContentElement.appendChild(this._titleElement);var section=new WebInspector.ObjectPropertiesSection(result);if(description.substr(0,4)==="HTML"){this._sectionUpdateProperties=section.updateProperties.bind(section);section.updateProperties=this._updateHTMLId.bind(this);}
+section.expanded=true;section.element.classList.add("source-frame-popover-tree");section.headerElement.classList.add("hidden");popoverContentElement.appendChild(section.element);const popoverWidth=300;const popoverHeight=250;popover.show(popoverContentElement,anchorElement,popoverWidth,popoverHeight);}}
+this._queryObject(element,showObjectPopover.bind(this),this._popoverObjectGroup);},_onHideObjectPopover:function()
+{WebInspector.domModel.hideDOMNodeHighlight();if(this._linkifier){this._linkifier.reset();delete this._linkifier;}
+if(this._onHideCallback)
+this._onHideCallback();RuntimeAgent.releaseObjectGroup(this._popoverObjectGroup);},_updateHTMLId:function(properties,rootTreeElementConstructor,rootPropertyComparer)
+{for(var i=0;i<properties.length;++i){if(properties[i].name==="id"){if(properties[i].value.description)
+this._titleElement.textContent+="#"+properties[i].value.description;break;}}
+this._sectionUpdateProperties(properties,rootTreeElementConstructor,rootPropertyComparer);},__proto__:WebInspector.PopoverHelper.prototype}
+WebInspector.NativeBreakpointsSidebarPane=function(title)
+{WebInspector.SidebarPane.call(this,title);this.registerRequiredCSS("breakpointsList.css");this.listElement=document.createElement("ol");this.listElement.className="breakpoint-list";this.emptyElement=document.createElement("div");this.emptyElement.className="info";this.emptyElement.textContent=WebInspector.UIString("No Breakpoints");this.bodyElement.appendChild(this.emptyElement);}
+WebInspector.NativeBreakpointsSidebarPane.prototype={_addListElement:function(element,beforeElement)
+{if(beforeElement)
+this.listElement.insertBefore(element,beforeElement);else{if(!this.listElement.firstChild){this.bodyElement.removeChild(this.emptyElement);this.bodyElement.appendChild(this.listElement);}
+this.listElement.appendChild(element);}},_removeListElement:function(element)
+{this.listElement.removeChild(element);if(!this.listElement.firstChild){this.bodyElement.removeChild(this.listElement);this.bodyElement.appendChild(this.emptyElement);}},_reset:function()
+{this.listElement.removeChildren();if(this.listElement.parentElement){this.bodyElement.removeChild(this.listElement);this.bodyElement.appendChild(this.emptyElement);}},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.DOMBreakpointsSidebarPane=function()
+{WebInspector.NativeBreakpointsSidebarPane.call(this,WebInspector.UIString("DOM Breakpoints"));this._breakpointElements={};this._breakpointTypes={SubtreeModified:"subtree-modified",AttributeModified:"attribute-modified",NodeRemoved:"node-removed"};this._breakpointTypeLabels={};this._breakpointTypeLabels[this._breakpointTypes.SubtreeModified]=WebInspector.UIString("Subtree Modified");this._breakpointTypeLabels[this._breakpointTypes.AttributeModified]=WebInspector.UIString("Attribute Modified");this._breakpointTypeLabels[this._breakpointTypes.NodeRemoved]=WebInspector.UIString("Node Removed");this._contextMenuLabels={};this._contextMenuLabels[this._breakpointTypes.SubtreeModified]=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Subtree modifications":"Subtree Modifications");this._contextMenuLabels[this._breakpointTypes.AttributeModified]=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Attributes modifications":"Attributes Modifications");this._contextMenuLabels[this._breakpointTypes.NodeRemoved]=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Node removal":"Node Removal");WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._inspectedURLChanged,this);WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.NodeRemoved,this._nodeRemoved,this);}
+WebInspector.DOMBreakpointsSidebarPane.prototype={_inspectedURLChanged:function(event)
+{this._breakpointElements={};this._reset();var url=(event.data);this._inspectedURL=url.removeURLFragment();},populateNodeContextMenu:function(node,contextMenu)
+{if(node.pseudoType())
+return;var nodeBreakpoints={};for(var id in this._breakpointElements){var element=this._breakpointElements[id];if(element._node===node)
+nodeBreakpoints[element._type]=true;}
+function toggleBreakpoint(type)
+{if(!nodeBreakpoints[type])
+this._setBreakpoint(node,type,true);else
+this._removeBreakpoint(node,type);this._saveBreakpoints();}
+var breakPointSubMenu=contextMenu.appendSubMenuItem(WebInspector.UIString("Break on..."));for(var key in this._breakpointTypes){var type=this._breakpointTypes[key];var label=this._contextMenuLabels[type];breakPointSubMenu.appendCheckboxItem(label,toggleBreakpoint.bind(this,type),nodeBreakpoints[type]);}},createBreakpointHitStatusMessage:function(auxData,callback)
+{if(auxData.type===this._breakpointTypes.SubtreeModified){var targetNodeObject=WebInspector.RemoteObject.fromPayload(auxData["targetNode"]);targetNodeObject.pushNodeToFrontend(didPushNodeToFrontend.bind(this));}else
+this._doCreateBreakpointHitStatusMessage(auxData,null,callback);function didPushNodeToFrontend(targetNodeId)
+{if(targetNodeId)
+targetNodeObject.release();this._doCreateBreakpointHitStatusMessage(auxData,targetNodeId,callback);}},_doCreateBreakpointHitStatusMessage:function(auxData,targetNodeId,callback)
+{var message;var typeLabel=this._breakpointTypeLabels[auxData.type];var linkifiedNode=WebInspector.DOMPresentationUtils.linkifyNodeById(auxData.nodeId);var substitutions=[typeLabel,linkifiedNode];var targetNode="";if(targetNodeId)
+targetNode=WebInspector.DOMPresentationUtils.linkifyNodeById(targetNodeId);if(auxData.type===this._breakpointTypes.SubtreeModified){if(auxData.insertion){if(targetNodeId!==auxData.nodeId){message="Paused on a \"%s\" breakpoint set on %s, because a new child was added to its descendant %s.";substitutions.push(targetNode);}else
+message="Paused on a \"%s\" breakpoint set on %s, because a new child was added to that node.";}else{message="Paused on a \"%s\" breakpoint set on %s, because its descendant %s was removed.";substitutions.push(targetNode);}}else
+message="Paused on a \"%s\" breakpoint set on %s.";var element=document.createElement("span");var formatters={s:function(substitution)
+{return substitution;}};function append(a,b)
+{if(typeof b==="string")
+b=document.createTextNode(b);element.appendChild(b);}
+WebInspector.formatLocalized(message,substitutions,formatters,"",append);callback(element);},_nodeRemoved:function(event)
+{var node=event.data.node;this._removeBreakpointsForNode(event.data.node);var children=node.children();if(!children)
+return;for(var i=0;i<children.length;++i)
+this._removeBreakpointsForNode(children[i]);this._saveBreakpoints();},_removeBreakpointsForNode:function(node)
+{for(var id in this._breakpointElements){var element=this._breakpointElements[id];if(element._node===node)
+this._removeBreakpoint(element._node,element._type);}},_setBreakpoint:function(node,type,enabled)
+{var breakpointId=this._createBreakpointId(node.id,type);if(breakpointId in this._breakpointElements)
+return;var element=document.createElement("li");element._node=node;element._type=type;element.addEventListener("contextmenu",this._contextMenu.bind(this,node,type),true);var checkboxElement=document.createElement("input");checkboxElement.className="checkbox-elem";checkboxElement.type="checkbox";checkboxElement.checked=enabled;checkboxElement.addEventListener("click",this._checkboxClicked.bind(this,node,type),false);element._checkboxElement=checkboxElement;element.appendChild(checkboxElement);var labelElement=document.createElement("span");element.appendChild(labelElement);var linkifiedNode=WebInspector.DOMPresentationUtils.linkifyNodeById(node.id);linkifiedNode.classList.add("monospace");labelElement.appendChild(linkifiedNode);var description=document.createElement("div");description.className="source-text";description.textContent=this._breakpointTypeLabels[type];labelElement.appendChild(description);var currentElement=this.listElement.firstChild;while(currentElement){if(currentElement._type&&currentElement._type<element._type)
+break;currentElement=currentElement.nextSibling;}
+this._addListElement(element,currentElement);this._breakpointElements[breakpointId]=element;if(enabled)
+DOMDebuggerAgent.setDOMBreakpoint(node.id,type);},_removeAllBreakpoints:function()
+{for(var id in this._breakpointElements){var element=this._breakpointElements[id];this._removeBreakpoint(element._node,element._type);}
+this._saveBreakpoints();},_removeBreakpoint:function(node,type)
+{var breakpointId=this._createBreakpointId(node.id,type);var element=this._breakpointElements[breakpointId];if(!element)
+return;this._removeListElement(element);delete this._breakpointElements[breakpointId];if(element._checkboxElement.checked)
+DOMDebuggerAgent.removeDOMBreakpoint(node.id,type);},_contextMenu:function(node,type,event)
+{var contextMenu=new WebInspector.ContextMenu(event);function removeBreakpoint()
+{this._removeBreakpoint(node,type);this._saveBreakpoints();}
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove breakpoint":"Remove Breakpoint"),removeBreakpoint.bind(this));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove all DOM breakpoints":"Remove All DOM Breakpoints"),this._removeAllBreakpoints.bind(this));contextMenu.show();},_checkboxClicked:function(node,type,event)
+{if(event.target.checked)
+DOMDebuggerAgent.setDOMBreakpoint(node.id,type);else
+DOMDebuggerAgent.removeDOMBreakpoint(node.id,type);this._saveBreakpoints();},highlightBreakpoint:function(auxData)
+{var breakpointId=this._createBreakpointId(auxData.nodeId,auxData.type);var element=this._breakpointElements[breakpointId];if(!element)
+return;this.expand();element.classList.add("breakpoint-hit");this._highlightedElement=element;},clearBreakpointHighlight:function()
+{if(this._highlightedElement){this._highlightedElement.classList.remove("breakpoint-hit");delete this._highlightedElement;}},_createBreakpointId:function(nodeId,type)
+{return nodeId+":"+type;},_saveBreakpoints:function()
+{var breakpoints=[];var storedBreakpoints=WebInspector.settings.domBreakpoints.get();for(var i=0;i<storedBreakpoints.length;++i){var breakpoint=storedBreakpoints[i];if(breakpoint.url!==this._inspectedURL)
+breakpoints.push(breakpoint);}
+for(var id in this._breakpointElements){var element=this._breakpointElements[id];breakpoints.push({url:this._inspectedURL,path:element._node.path(),type:element._type,enabled:element._checkboxElement.checked});}
+WebInspector.settings.domBreakpoints.set(breakpoints);},restoreBreakpoints:function()
+{var pathToBreakpoints={};function didPushNodeByPathToFrontend(path,nodeId)
+{var node=nodeId?WebInspector.domModel.nodeForId(nodeId):null;if(!node)
+return;var breakpoints=pathToBreakpoints[path];for(var i=0;i<breakpoints.length;++i)
+this._setBreakpoint(node,breakpoints[i].type,breakpoints[i].enabled);}
+var breakpoints=WebInspector.settings.domBreakpoints.get();for(var i=0;i<breakpoints.length;++i){var breakpoint=breakpoints[i];if(breakpoint.url!==this._inspectedURL)
+continue;var path=breakpoint.path;if(!pathToBreakpoints[path]){pathToBreakpoints[path]=[];WebInspector.domModel.pushNodeByPathToFrontend(path,didPushNodeByPathToFrontend.bind(this,path));}
+pathToBreakpoints[path].push(breakpoint);}},createProxy:function(panel)
+{var proxy=new WebInspector.DOMBreakpointsSidebarPane.Proxy(this,panel);if(!this._proxies)
+this._proxies=[];this._proxies.push(proxy);return proxy;},onContentReady:function()
+{for(var i=0;i!=this._proxies.length;i++)
+this._proxies[i].onContentReady();},__proto__:WebInspector.NativeBreakpointsSidebarPane.prototype}
+WebInspector.DOMBreakpointsSidebarPane.Proxy=function(pane,panel)
+{WebInspector.View._assert(!pane.titleElement.firstChild,"Cannot create proxy for a sidebar pane with a toolbar");WebInspector.SidebarPane.call(this,pane.title());this.registerRequiredCSS("breakpointsList.css");this._wrappedPane=pane;this._panel=panel;this.bodyElement.remove();this.bodyElement=this._wrappedPane.bodyElement;}
+WebInspector.DOMBreakpointsSidebarPane.Proxy.prototype={expand:function()
+{this._wrappedPane.expand();},onContentReady:function()
+{if(this._panel.isShowing())
+this._reattachBody();WebInspector.SidebarPane.prototype.onContentReady.call(this);},wasShown:function()
+{WebInspector.SidebarPane.prototype.wasShown.call(this);this._reattachBody();},_reattachBody:function()
+{if(this.bodyElement.parentNode!==this.element)
+this.element.appendChild(this.bodyElement);},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.domBreakpointsSidebarPane;WebInspector.Color=function(rgba,format,originalText)
+{this._rgba=rgba;this._originalText=originalText||null;this._format=format||null;if(typeof this._rgba[3]==="undefined")
+this._rgba[3]=1;for(var i=0;i<4;++i){if(this._rgba[i]<0)
+this._rgba[i]=0;if(this._rgba[i]>1)
+this._rgba[i]=1;}}
+WebInspector.Color.parse=function(text)
+{var value=text.toLowerCase().replace(/\s+/g,"");var simple=/^(?:#([0-9a-f]{3,6})|rgb\(([^)]+)\)|(\w+)|hsl\(([^)]+)\))$/i;var match=value.match(simple);if(match){if(match[1]){var hex=match[1].toUpperCase();var format;if(hex.length===3){format=WebInspector.Color.Format.ShortHEX;hex=hex.charAt(0)+hex.charAt(0)+hex.charAt(1)+hex.charAt(1)+hex.charAt(2)+hex.charAt(2);}else
+format=WebInspector.Color.Format.HEX;var r=parseInt(hex.substring(0,2),16);var g=parseInt(hex.substring(2,4),16);var b=parseInt(hex.substring(4,6),16);return new WebInspector.Color([r/255,g/255,b/255,1],format,text);}
+if(match[2]){var rgbString=match[2].split(/\s*,\s*/);var rgba=[WebInspector.Color._parseRgbNumeric(rgbString[0]),WebInspector.Color._parseRgbNumeric(rgbString[1]),WebInspector.Color._parseRgbNumeric(rgbString[2]),1];return new WebInspector.Color(rgba,WebInspector.Color.Format.RGB,text);}
+if(match[3]){var nickname=match[3].toLowerCase();if(nickname in WebInspector.Color.Nicknames){var rgba=WebInspector.Color.Nicknames[nickname];var color=WebInspector.Color.fromRGBA(rgba);color._format=WebInspector.Color.Format.Nickname;color._originalText=nickname;return color;}
+return null;}
+if(match[4]){var hslString=match[4].replace(/%/g,"").split(/\s*,\s*/);var hsla=[WebInspector.Color._parseHueNumeric(hslString[0]),WebInspector.Color._parseSatLightNumeric(hslString[1]),WebInspector.Color._parseSatLightNumeric(hslString[2]),1];var rgba=WebInspector.Color._hsl2rgb(hsla);return new WebInspector.Color(rgba,WebInspector.Color.Format.HSL,text);}
+return null;}
+var advanced=/^(?:rgba\(([^)]+)\)|hsla\(([^)]+)\))$/;match=value.match(advanced);if(match){if(match[1]){var rgbaString=match[1].split(/\s*,\s*/);var rgba=[WebInspector.Color._parseRgbNumeric(rgbaString[0]),WebInspector.Color._parseRgbNumeric(rgbaString[1]),WebInspector.Color._parseRgbNumeric(rgbaString[2]),WebInspector.Color._parseAlphaNumeric(rgbaString[3])];return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA,text);}
+if(match[2]){var hslaString=match[2].replace(/%/g,"").split(/\s*,\s*/);var hsla=[WebInspector.Color._parseHueNumeric(hslaString[0]),WebInspector.Color._parseSatLightNumeric(hslaString[1]),WebInspector.Color._parseSatLightNumeric(hslaString[2]),WebInspector.Color._parseAlphaNumeric(hslaString[3])];var rgba=WebInspector.Color._hsl2rgb(hsla);return new WebInspector.Color(rgba,WebInspector.Color.Format.HSLA,text);}}
+return null;}
+WebInspector.Color.fromRGBA=function(rgba)
+{return new WebInspector.Color([rgba[0]/255,rgba[1]/255,rgba[2]/255,rgba[3]]);}
+WebInspector.Color.fromHSVA=function(hsva)
+{var h=hsva[0];var s=hsva[1];var v=hsva[2];var t=(2-s)*v;if(v===0||s===0)
+s=0;else
+s*=v/(t<1?t:2-t);var hsla=[h,s,t/2,hsva[3]];return new WebInspector.Color(WebInspector.Color._hsl2rgb(hsla),WebInspector.Color.Format.HSLA);}
+WebInspector.Color.prototype={format:function()
+{return this._format;},hsla:function()
+{if(this._hsla)
+return this._hsla;var r=this._rgba[0];var g=this._rgba[1];var b=this._rgba[2];var max=Math.max(r,g,b);var min=Math.min(r,g,b);var diff=max-min;var add=max+min;if(min===max)
+var h=0;else if(r===max)
+var h=((1/6*(g-b)/diff)+1)%1;else if(g===max)
+var h=(1/6*(b-r)/diff)+1/3;else
+var h=(1/6*(r-g)/diff)+2/3;var l=0.5*add;if(l===0)
+var s=0;else if(l===1)
+var s=1;else if(l<=0.5)
+var s=diff/add;else
+var s=diff/(2-add);this._hsla=[h,s,l,this._rgba[3]];return this._hsla;},hsva:function()
+{var hsla=this.hsla();var h=hsla[0];var s=hsla[1];var l=hsla[2];s*=l<0.5?l:1-l;return[h,s!==0?2*s/(l+s):0,(l+s),hsla[3]];},hasAlpha:function()
+{return this._rgba[3]!==1;},canBeShortHex:function()
+{if(this.hasAlpha())
+return false;for(var i=0;i<3;++i){var c=Math.round(this._rgba[i]*255);if(c%17)
+return false;}
+return true;},toString:function(format)
+{if(!format)
+format=this._format;function toRgbValue(value)
+{return Math.round(value*255);}
+function toHexValue(value)
+{var hex=Math.round(value*255).toString(16);return hex.length===1?"0"+hex:hex;}
+function toShortHexValue(value)
+{return(Math.round(value*255)/17).toString(16);}
+switch(format){case WebInspector.Color.Format.Original:return this._originalText;case WebInspector.Color.Format.RGB:if(this.hasAlpha())
+return null;return String.sprintf("rgb(%d, %d, %d)",toRgbValue(this._rgba[0]),toRgbValue(this._rgba[1]),toRgbValue(this._rgba[2]));case WebInspector.Color.Format.RGBA:return String.sprintf("rgba(%d, %d, %d, %f)",toRgbValue(this._rgba[0]),toRgbValue(this._rgba[1]),toRgbValue(this._rgba[2]),this._rgba[3]);case WebInspector.Color.Format.HSL:if(this.hasAlpha())
+return null;var hsl=this.hsla();return String.sprintf("hsl(%d, %d%, %d%)",Math.round(hsl[0]*360),Math.round(hsl[1]*100),Math.round(hsl[2]*100));case WebInspector.Color.Format.HSLA:var hsla=this.hsla();return String.sprintf("hsla(%d, %d%, %d%, %f)",Math.round(hsla[0]*360),Math.round(hsla[1]*100),Math.round(hsla[2]*100),hsla[3]);case WebInspector.Color.Format.HEX:if(this.hasAlpha())
+return null;return String.sprintf("#%s%s%s",toHexValue(this._rgba[0]),toHexValue(this._rgba[1]),toHexValue(this._rgba[2])).toUpperCase();case WebInspector.Color.Format.ShortHEX:if(!this.canBeShortHex())
+return null;return String.sprintf("#%s%s%s",toShortHexValue(this._rgba[0]),toShortHexValue(this._rgba[1]),toShortHexValue(this._rgba[2])).toUpperCase();case WebInspector.Color.Format.Nickname:return this.nickname();}
+return this._originalText;},_canonicalRGBA:function()
+{var rgba=new Array(3);for(var i=0;i<3;++i)
+rgba[i]=Math.round(this._rgba[i]*255);if(this._rgba[3]!==1)
+rgba.push(this._rgba[3]);return rgba;},nickname:function()
+{if(!WebInspector.Color._rgbaToNickname){WebInspector.Color._rgbaToNickname={};for(var nickname in WebInspector.Color.Nicknames){var rgba=WebInspector.Color.Nicknames[nickname];WebInspector.Color._rgbaToNickname[rgba]=nickname;}}
+return WebInspector.Color._rgbaToNickname[this._canonicalRGBA()]||null;},toProtocolRGBA:function()
+{var rgba=this._canonicalRGBA();var result={r:rgba[0],g:rgba[1],b:rgba[2]};if(rgba[3]!==1)
+result.a=rgba[3];return result;},invert:function()
+{var rgba=[];rgba[0]=1-this._rgba[0];rgba[1]=1-this._rgba[1];rgba[2]=1-this._rgba[2];rgba[3]=this._rgba[3];return new WebInspector.Color(rgba);},setAlpha:function(alpha)
+{var rgba=this._rgba.slice();rgba[3]=alpha;return new WebInspector.Color(rgba);}}
+WebInspector.Color._parseRgbNumeric=function(value)
+{var parsed=parseInt(value,10);if(value.indexOf("%")!==-1)
+parsed/=100;else
+parsed/=255;return parsed;}
+WebInspector.Color._parseHueNumeric=function(value)
+{return isNaN(value)?0:(parseFloat(value)/360)%1;}
+WebInspector.Color._parseSatLightNumeric=function(value)
+{return parseFloat(value)/100;}
+WebInspector.Color._parseAlphaNumeric=function(value)
+{return isNaN(value)?0:parseFloat(value);}
+WebInspector.Color._hsl2rgb=function(hsl)
+{var h=hsl[0];var s=hsl[1];var l=hsl[2];function hue2rgb(p,q,h)
+{if(h<0)
+h+=1;else if(h>1)
+h-=1;if((h*6)<1)
+return p+(q-p)*h*6;else if((h*2)<1)
+return q;else if((h*3)<2)
+return p+(q-p)*((2/3)-h)*6;else
+return p;}
+if(s<0)
+s=0;if(l<=0.5)
+var q=l*(1+s);else
+var q=l+s-(l*s);var p=2*l-q;var tr=h+(1/3);var tg=h;var tb=h-(1/3);var r=hue2rgb(p,q,tr);var g=hue2rgb(p,q,tg);var b=hue2rgb(p,q,tb);return[r,g,b,hsl[3]];}
+WebInspector.Color.Nicknames={"aliceblue":[240,248,255],"antiquewhite":[250,235,215],"aquamarine":[127,255,212],"azure":[240,255,255],"beige":[245,245,220],"bisque":[255,228,196],"black":[0,0,0],"blanchedalmond":[255,235,205],"blue":[0,0,255],"blueviolet":[138,43,226],"brown":[165,42,42],"burlywood":[222,184,135],"cadetblue":[95,158,160],"chartreuse":[127,255,0],"chocolate":[210,105,30],"coral":[255,127,80],"cornflowerblue":[100,149,237],"cornsilk":[255,248,220],"crimson":[237,20,61],"cyan":[0,255,255],"darkblue":[0,0,139],"darkcyan":[0,139,139],"darkgoldenrod":[184,134,11],"darkgray":[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],"darkseagreen":[143,188,143],"darkslateblue":[72,61,139],"darkslategray":[47,79,79],"darkturquoise":[0,206,209],"darkviolet":[148,0,211],"deeppink":[255,20,147],"deepskyblue":[0,191,255],"dimgray":[105,105,105],"dodgerblue":[30,144,255],"firebrick":[178,34,34],"floralwhite":[255,250,240],"forestgreen":[34,139,34],"gainsboro":[220,220,220],"ghostwhite":[248,248,255],"gold":[255,215,0],"goldenrod":[218,165,32],"gray":[128,128,128],"green":[0,128,0],"greenyellow":[173,255,47],"honeydew":[240,255,240],"hotpink":[255,105,180],"indianred":[205,92,92],"indigo":[75,0,130],"ivory":[255,255,240],"khaki":[240,230,140],"lavender":[230,230,250],"lavenderblush":[255,240,245],"lawngreen":[124,252,0],"lemonchiffon":[255,250,205],"lightblue":[173,216,230],"lightcoral":[240,128,128],"lightcyan":[224,255,255],"lightgoldenrodyellow":[250,250,210],"lightgreen":[144,238,144],"lightgrey":[211,211,211],"lightpink":[255,182,193],"lightsalmon":[255,160,122],"lightseagreen":[32,178,170],"lightskyblue":[135,206,250],"lightslategray":[119,136,153],"lightsteelblue":[176,196,222],"lightyellow":[255,255,224],"lime":[0,255,0],"limegreen":[50,205,50],"linen":[250,240,230],"magenta":[255,0,255],"maroon":[128,0,0],"mediumaquamarine":[102,205,170],"mediumblue":[0,0,205],"mediumorchid":[186,85,211],"mediumpurple":[147,112,219],"mediumseagreen":[60,179,113],"mediumslateblue":[123,104,238],"mediumspringgreen":[0,250,154],"mediumturquoise":[72,209,204],"mediumvioletred":[199,21,133],"midnightblue":[25,25,112],"mintcream":[245,255,250],"mistyrose":[255,228,225],"moccasin":[255,228,181],"navajowhite":[255,222,173],"navy":[0,0,128],"oldlace":[253,245,230],"olive":[128,128,0],"olivedrab":[107,142,35],"orange":[255,165,0],"orangered":[255,69,0],"orchid":[218,112,214],"palegoldenrod":[238,232,170],"palegreen":[152,251,152],"paleturquoise":[175,238,238],"palevioletred":[219,112,147],"papayawhip":[255,239,213],"peachpuff":[255,218,185],"peru":[205,133,63],"pink":[255,192,203],"plum":[221,160,221],"powderblue":[176,224,230],"purple":[128,0,128],"red":[255,0,0],"rosybrown":[188,143,143],"royalblue":[65,105,225],"saddlebrown":[139,69,19],"salmon":[250,128,114],"sandybrown":[244,164,96],"seagreen":[46,139,87],"seashell":[255,245,238],"sienna":[160,82,45],"silver":[192,192,192],"skyblue":[135,206,235],"slateblue":[106,90,205],"slategray":[112,128,144],"snow":[255,250,250],"springgreen":[0,255,127],"steelblue":[70,130,180],"tan":[210,180,140],"teal":[0,128,128],"thistle":[216,191,216],"tomato":[255,99,71],"turquoise":[64,224,208],"violet":[238,130,238],"wheat":[245,222,179],"white":[255,255,255],"whitesmoke":[245,245,245],"yellow":[255,255,0],"yellowgreen":[154,205,50],"transparent":[0,0,0,0],};WebInspector.Color.PageHighlight={Content:WebInspector.Color.fromRGBA([111,168,220,.66]),ContentLight:WebInspector.Color.fromRGBA([111,168,220,.5]),ContentOutline:WebInspector.Color.fromRGBA([9,83,148]),Padding:WebInspector.Color.fromRGBA([147,196,125,.55]),PaddingLight:WebInspector.Color.fromRGBA([147,196,125,.4]),Border:WebInspector.Color.fromRGBA([255,229,153,.66]),BorderLight:WebInspector.Color.fromRGBA([255,229,153,.5]),Margin:WebInspector.Color.fromRGBA([246,178,107,.66]),MarginLight:WebInspector.Color.fromRGBA([246,178,107,.5]),EventTarget:WebInspector.Color.fromRGBA([255,196,196,.66])}
+WebInspector.Color.Format={Original:"original",Nickname:"nickname",HEX:"hex",ShortHEX:"shorthex",RGB:"rgb",RGBA:"rgba",HSL:"hsl",HSLA:"hsla"}
+WebInspector.CSSMetadata=function(properties)
+{this._values=([]);this._longhands={};this._shorthands={};for(var i=0;i<properties.length;++i){var property=properties[i];if(typeof property==="string"){this._values.push(property);continue;}
+var propertyName=property.name;this._values.push(propertyName);var longhands=properties[i].longhands;if(longhands){this._longhands[propertyName]=longhands;for(var j=0;j<longhands.length;++j){var longhandName=longhands[j];var shorthands=this._shorthands[longhandName];if(!shorthands){shorthands=[];this._shorthands[longhandName]=shorthands;}
+shorthands.push(propertyName);}}}
+this._values.sort();}
+WebInspector.CSSMetadata.cssPropertiesMetainfo=new WebInspector.CSSMetadata([]);WebInspector.CSSMetadata.isColorAwareProperty=function(propertyName)
+{return WebInspector.CSSMetadata._colorAwareProperties[propertyName]===true;}
+WebInspector.CSSMetadata.colors=function()
+{if(!WebInspector.CSSMetadata._colorsKeySet)
+WebInspector.CSSMetadata._colorsKeySet=WebInspector.CSSMetadata._colors.keySet();return WebInspector.CSSMetadata._colorsKeySet;}
+WebInspector.CSSMetadata.InheritedProperties=["azimuth","border-collapse","border-spacing","caption-side","color","cursor","direction","elevation","empty-cells","font-family","font-size","font-style","font-variant","font-weight","font","letter-spacing","line-height","list-style-image","list-style-position","list-style-type","list-style","orphans","pitch-range","pitch","quotes","resize","richness","speak-header","speak-numeral","speak-punctuation","speak","speech-rate","stress","text-align","text-indent","text-transform","text-shadow","visibility","voice-family","volume","white-space","widows","word-spacing","zoom"].keySet();WebInspector.CSSMetadata.NonStandardInheritedProperties=["-webkit-font-smoothing"].keySet();WebInspector.CSSMetadata.canonicalPropertyName=function(name)
+{if(!name||name.length<9||name.charAt(0)!=="-")
+return name.toLowerCase();var match=name.match(/(?:-webkit-)(.+)/);var propertiesSet=WebInspector.CSSMetadata.cssPropertiesMetainfoKeySet();var hasSupportedProperties=WebInspector.CSSMetadata.cssPropertiesMetainfo._values.length>0;if(!match||(hasSupportedProperties&&!propertiesSet.hasOwnProperty(match[1].toLowerCase())))
+return name.toLowerCase();return match[1].toLowerCase();}
+WebInspector.CSSMetadata.isPropertyInherited=function(propertyName)
+{return!!(WebInspector.CSSMetadata.InheritedProperties[WebInspector.CSSMetadata.canonicalPropertyName(propertyName)]||WebInspector.CSSMetadata.NonStandardInheritedProperties[propertyName.toLowerCase()]);}
+WebInspector.CSSMetadata._colors=["aqua","black","blue","fuchsia","gray","green","lime","maroon","navy","olive","orange","purple","red","silver","teal","white","yellow","transparent","currentcolor","grey","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen"];WebInspector.CSSMetadata._colorAwareProperties=["background","background-color","background-image","border","border-color","border-top","border-right","border-bottom","border-left","border-top-color","border-right-color","border-bottom-color","border-left-color","box-shadow","color","fill","outline","outline-color","stroke","text-line-through-color","text-overline-color","text-shadow","text-underline-color","-webkit-box-shadow","-webkit-column-rule-color","-webkit-text-decoration-color","-webkit-text-emphasis","-webkit-text-emphasis-color"].keySet();WebInspector.CSSMetadata._propertyDataMap={"table-layout":{values:["auto","fixed"]},"visibility":{values:["hidden","visible","collapse"]},"background-repeat":{values:["repeat","repeat-x","repeat-y","no-repeat","space","round"]},"content":{values:["list-item","close-quote","no-close-quote","no-open-quote","open-quote"]},"list-style-image":{values:["none"]},"clear":{values:["none","left","right","both"]},"text-underline-mode":{values:["continuous","skip-white-space"]},"overflow-x":{values:["hidden","auto","visible","overlay","scroll"]},"stroke-linejoin":{values:["round","miter","bevel"]},"baseline-shift":{values:["baseline","sub","super"]},"border-bottom-width":{values:["medium","thick","thin"]},"marquee-speed":{values:["normal","slow","fast"]},"margin-top-collapse":{values:["collapse","separate","discard"]},"max-height":{values:["none"]},"box-orient":{values:["horizontal","vertical","inline-axis","block-axis"],},"font-stretch":{values:["normal","wider","narrower","ultra-condensed","extra-condensed","condensed","semi-condensed","semi-expanded","expanded","extra-expanded","ultra-expanded"]},"text-underline-style":{values:["none","dotted","dashed","solid","double","dot-dash","dot-dot-dash","wave"]},"text-overline-mode":{values:["continuous","skip-white-space"]},"-webkit-background-composite":{values:["highlight","clear","copy","source-over","source-in","source-out","source-atop","destination-over","destination-in","destination-out","destination-atop","xor","plus-darker","plus-lighter"]},"border-left-width":{values:["medium","thick","thin"]},"box-shadow":{values:["inset","none"]},"-webkit-writing-mode":{values:["lr","rl","tb","lr-tb","rl-tb","tb-rl","horizontal-tb","vertical-rl","vertical-lr","horizontal-bt"]},"text-line-through-mode":{values:["continuous","skip-white-space"]},"border-collapse":{values:["collapse","separate"]},"page-break-inside":{values:["auto","avoid"]},"border-top-width":{values:["medium","thick","thin"]},"outline-color":{values:["invert"]},"text-line-through-style":{values:["none","dotted","dashed","solid","double","dot-dash","dot-dot-dash","wave"]},"outline-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"cursor":{values:["none","copy","auto","crosshair","default","pointer","move","vertical-text","cell","context-menu","alias","progress","no-drop","not-allowed","-webkit-zoom-in","-webkit-zoom-out","e-resize","ne-resize","nw-resize","n-resize","se-resize","sw-resize","s-resize","w-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","col-resize","row-resize","text","wait","help","all-scroll","-webkit-grab","-webkit-grabbing"]},"border-width":{values:["medium","thick","thin"]},"border-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"size":{values:["a3","a4","a5","b4","b5","landscape","ledger","legal","letter","portrait"]},"background-size":{values:["contain","cover"]},"direction":{values:["ltr","rtl"]},"marquee-direction":{values:["left","right","auto","reverse","forwards","backwards","ahead","up","down"]},"enable-background":{values:["accumulate","new"]},"float":{values:["none","left","right"]},"overflow-y":{values:["hidden","auto","visible","overlay","scroll"]},"margin-bottom-collapse":{values:["collapse","separate","discard"]},"box-reflect":{values:["left","right","above","below"]},"overflow":{values:["hidden","auto","visible","overlay","scroll"]},"text-rendering":{values:["auto","optimizeSpeed","optimizeLegibility","geometricPrecision"]},"text-align":{values:["-webkit-auto","start","end","left","right","center","justify","-webkit-left","-webkit-right","-webkit-center"]},"list-style-position":{values:["outside","inside","hanging"]},"margin-bottom":{values:["auto"]},"color-interpolation":{values:["linearrgb"]},"background-origin":{values:["border-box","content-box","padding-box"]},"word-wrap":{values:["normal","break-word"]},"font-weight":{values:["normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900"]},"margin-before-collapse":{values:["collapse","separate","discard"]},"text-overline-width":{values:["normal","medium","auto","thick","thin"]},"text-transform":{values:["none","capitalize","uppercase","lowercase"]},"border-right-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"border-left-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"-webkit-text-emphasis":{values:["circle","filled","open","dot","double-circle","triangle","sesame"]},"font-style":{values:["italic","oblique","normal"]},"speak":{values:["none","normal","spell-out","digits","literal-punctuation","no-punctuation"]},"color-rendering":{values:["auto","optimizeSpeed","optimizeQuality"]},"list-style-type":{values:["none","inline","disc","circle","square","decimal","decimal-leading-zero","arabic-indic","binary","bengali","cambodian","khmer","devanagari","gujarati","gurmukhi","kannada","lower-hexadecimal","lao","malayalam","mongolian","myanmar","octal","oriya","persian","urdu","telugu","tibetan","thai","upper-hexadecimal","lower-roman","upper-roman","lower-greek","lower-alpha","lower-latin","upper-alpha","upper-latin","afar","ethiopic-halehame-aa-et","ethiopic-halehame-aa-er","amharic","ethiopic-halehame-am-et","amharic-abegede","ethiopic-abegede-am-et","cjk-earthly-branch","cjk-heavenly-stem","ethiopic","ethiopic-halehame-gez","ethiopic-abegede","ethiopic-abegede-gez","hangul-consonant","hangul","lower-norwegian","oromo","ethiopic-halehame-om-et","sidama","ethiopic-halehame-sid-et","somali","ethiopic-halehame-so-et","tigre","ethiopic-halehame-tig","tigrinya-er","ethiopic-halehame-ti-er","tigrinya-er-abegede","ethiopic-abegede-ti-er","tigrinya-et","ethiopic-halehame-ti-et","tigrinya-et-abegede","ethiopic-abegede-ti-et","upper-greek","upper-norwegian","asterisks","footnotes","hebrew","armenian","lower-armenian","upper-armenian","georgian","cjk-ideographic","hiragana","katakana","hiragana-iroha","katakana-iroha"]},"-webkit-text-combine":{values:["none","horizontal"]},"outline":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"font":{values:["caption","icon","menu","message-box","small-caption","-webkit-mini-control","-webkit-small-control","-webkit-control","status-bar","italic","oblique","small-caps","normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900","xx-small","x-small","small","medium","large","x-large","xx-large","-webkit-xxx-large","smaller","larger","serif","sans-serif","cursive","fantasy","monospace","-webkit-body","-webkit-pictograph"]},"dominant-baseline":{values:["middle","auto","central","text-before-edge","text-after-edge","ideographic","alphabetic","hanging","mathematical","use-script","no-change","reset-size"]},"display":{values:["none","inline","block","list-item","run-in","compact","inline-block","table","inline-table","table-row-group","table-header-group","table-footer-group","table-row","table-column-group","table-column","table-cell","table-caption","-webkit-box","-webkit-inline-box","flex","inline-flex","grid","inline-grid"]},"-webkit-text-emphasis-position":{values:["over","under"]},"image-rendering":{values:["auto","optimizeSpeed","optimizeQuality"]},"alignment-baseline":{values:["baseline","middle","auto","before-edge","after-edge","central","text-before-edge","text-after-edge","ideographic","alphabetic","hanging","mathematical"]},"outline-width":{values:["medium","thick","thin"]},"text-line-through-width":{values:["normal","medium","auto","thick","thin"]},"box-align":{values:["baseline","center","stretch","start","end"]},"border-right-width":{values:["medium","thick","thin"]},"border-top-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"line-height":{values:["normal"]},"text-overflow":{values:["clip","ellipsis"]},"overflow-wrap":{values:["normal","break-word"]},"box-direction":{values:["normal","reverse"]},"margin-after-collapse":{values:["collapse","separate","discard"]},"page-break-before":{values:["left","right","auto","always","avoid"]},"border-image":{values:["repeat","stretch"]},"text-decoration":{values:["blink","line-through","overline","underline"]},"position":{values:["absolute","fixed","relative","static"]},"font-family":{values:["serif","sans-serif","cursive","fantasy","monospace","-webkit-body","-webkit-pictograph"]},"text-overflow-mode":{values:["clip","ellipsis"]},"border-bottom-style":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"unicode-bidi":{values:["normal","bidi-override","embed","isolate","isolate-override","plaintext"]},"clip-rule":{values:["nonzero","evenodd"]},"margin-left":{values:["auto"]},"margin-top":{values:["auto"]},"zoom":{values:["normal","document","reset"]},"text-overline-style":{values:["none","dotted","dashed","solid","double","dot-dash","dot-dot-dash","wave"]},"max-width":{values:["none"]},"caption-side":{values:["top","bottom"]},"empty-cells":{values:["hide","show"]},"pointer-events":{values:["none","all","auto","visible","visiblepainted","visiblefill","visiblestroke","painted","fill","stroke","bounding-box"]},"letter-spacing":{values:["normal"]},"background-clip":{values:["border-box","content-box","padding-box"]},"-webkit-font-smoothing":{values:["none","auto","antialiased","subpixel-antialiased"]},"border":{values:["none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},"font-size":{values:["xx-small","x-small","small","medium","large","x-large","xx-large","-webkit-xxx-large","smaller","larger"]},"font-variant":{values:["small-caps","normal"]},"vertical-align":{values:["baseline","middle","sub","super","text-top","text-bottom","top","bottom","-webkit-baseline-middle"]},"marquee-style":{values:["none","scroll","slide","alternate"]},"white-space":{values:["normal","nowrap","pre","pre-line","pre-wrap"]},"text-underline-width":{values:["normal","medium","auto","thick","thin"]},"box-lines":{values:["single","multiple"]},"page-break-after":{values:["left","right","auto","always","avoid"]},"clip-path":{values:["none"]},"margin":{values:["auto"]},"marquee-repetition":{values:["infinite"]},"margin-right":{values:["auto"]},"word-break":{values:["normal","break-all","break-word"]},"word-spacing":{values:["normal"]},"-webkit-text-emphasis-style":{values:["circle","filled","open","dot","double-circle","triangle","sesame"]},"-webkit-transform":{values:["scale","scaleX","scaleY","scale3d","rotate","rotateX","rotateY","rotateZ","rotate3d","skew","skewX","skewY","translate","translateX","translateY","translateZ","translate3d","matrix","matrix3d","perspective"]},"image-resolution":{values:["from-image","snap"]},"box-sizing":{values:["content-box","padding-box","border-box"]},"clip":{values:["auto"]},"resize":{values:["none","both","horizontal","vertical"]},"align-content":{values:["flex-start","flex-end","center","space-between","space-around","stretch"]},"align-items":{values:["flex-start","flex-end","center","baseline","stretch"]},"align-self":{values:["auto","flex-start","flex-end","center","baseline","stretch"]},"flex-direction":{values:["row","row-reverse","column","column-reverse"]},"justify-content":{values:["flex-start","flex-end","center","space-between","space-around"]},"flex-wrap":{values:["nowrap","wrap","wrap-reverse"]},"-webkit-animation-timing-function":{values:["ease","linear","ease-in","ease-out","ease-in-out","step-start","step-end","steps","cubic-bezier"]},"-webkit-animation-direction":{values:["normal","reverse","alternate","alternate-reverse"]},"-webkit-animation-play-state":{values:["running","paused"]},"-webkit-animation-fill-mode":{values:["none","forwards","backwards","both"]},"-webkit-backface-visibility":{values:["visible","hidden"]},"-webkit-box-decoration-break":{values:["slice","clone"]},"-webkit-column-break-after":{values:["auto","always","avoid","left","right","page","column","avoid-page","avoid-column"]},"-webkit-column-break-before":{values:["auto","always","avoid","left","right","page","column","avoid-page","avoid-column"]},"-webkit-column-break-inside":{values:["auto","avoid","avoid-page","avoid-column"]},"-webkit-column-span":{values:["none","all"]},"-webkit-column-count":{values:["auto"]},"-webkit-column-gap":{values:["normal"]},"-webkit-line-break":{values:["auto","loose","normal","strict"]},"-webkit-perspective":{values:["none"]},"-webkit-perspective-origin":{values:["left","center","right","top","bottom"]},"text-align-last":{values:["auto","start","end","left","right","center","justify"]},"-webkit-text-decoration-line":{values:["none","underline","overline","line-through","blink"]},"-webkit-text-decoration-style":{values:["solid","double","dotted","dashed","wavy"]},"-webkit-text-decoration-skip":{values:["none","objects","spaces","ink","edges","box-decoration"]},"-webkit-transform-origin":{values:["left","center","right","top","bottom"]},"-webkit-transform-style":{values:["flat","preserve-3d"]},"-webkit-transition-timing-function":{values:["ease","linear","ease-in","ease-out","ease-in-out","step-start","step-end","steps","cubic-bezier"]},"-webkit-flex":{m:"flexbox"},"-webkit-flex-basis":{m:"flexbox"},"-webkit-flex-flow":{m:"flexbox"},"-webkit-flex-grow":{m:"flexbox"},"-webkit-flex-shrink":{m:"flexbox"},"-webkit-animation":{m:"animations"},"-webkit-animation-delay":{m:"animations"},"-webkit-animation-duration":{m:"animations"},"-webkit-animation-iteration-count":{m:"animations"},"-webkit-animation-name":{m:"animations"},"-webkit-column-rule":{m:"multicol"},"-webkit-column-rule-color":{m:"multicol",a:"crc"},"-webkit-column-rule-style":{m:"multicol",a:"crs"},"-webkit-column-rule-width":{m:"multicol",a:"crw"},"-webkit-column-width":{m:"multicol",a:"cw"},"-webkit-columns":{m:"multicol"},"-webkit-order":{m:"flexbox"},"-webkit-text-decoration-color":{m:"text-decor"},"-webkit-text-emphasis-color":{m:"text-decor"},"-webkit-transition":{m:"transitions"},"-webkit-transition-delay":{m:"transitions"},"-webkit-transition-duration":{m:"transitions"},"-webkit-transition-property":{m:"transitions"},"background":{m:"background"},"background-attachment":{m:"background"},"background-color":{m:"background"},"background-image":{m:"background"},"background-position":{m:"background"},"background-position-x":{m:"background"},"background-position-y":{m:"background"},"background-repeat-x":{m:"background"},"background-repeat-y":{m:"background"},"border-top":{m:"background"},"border-right":{m:"background"},"border-bottom":{m:"background"},"border-left":{m:"background"},"border-radius":{m:"background"},"bottom":{m:"visuren"},"color":{m:"color",a:"foreground"},"counter-increment":{m:"generate"},"counter-reset":{m:"generate"},"grid-template-columns":{m:"grid"},"grid-template-rows":{m:"grid"},"height":{m:"box"},"image-orientation":{m:"images"},"left":{m:"visuren"},"list-style":{m:"lists"},"min-height":{m:"box"},"min-width":{m:"box"},"opacity":{m:"color",a:"transparency"},"orphans":{m:"page"},"outline-offset":{m:"ui"},"padding":{m:"box",a:"padding1"},"padding-bottom":{m:"box"},"padding-left":{m:"box"},"padding-right":{m:"box"},"padding-top":{m:"box"},"page":{m:"page"},"quotes":{m:"generate"},"right":{m:"visuren"},"tab-size":{m:"text"},"text-indent":{m:"text"},"text-shadow":{m:"text-decor"},"top":{m:"visuren"},"unicode-range":{m:"fonts",a:"descdef-unicode-range"},"widows":{m:"page"},"width":{m:"box"},"z-index":{m:"visuren"}}
+WebInspector.CSSMetadata.keywordsForProperty=function(propertyName)
+{var acceptedKeywords=["inherit","initial"];var descriptor=WebInspector.CSSMetadata.descriptor(propertyName);if(descriptor&&descriptor.values)
+acceptedKeywords.push.apply(acceptedKeywords,descriptor.values);if(propertyName in WebInspector.CSSMetadata._colorAwareProperties)
+acceptedKeywords.push.apply(acceptedKeywords,WebInspector.CSSMetadata._colors);return new WebInspector.CSSMetadata(acceptedKeywords);}
+WebInspector.CSSMetadata.descriptor=function(propertyName)
+{if(!propertyName)
+return null;var unprefixedName=propertyName.replace(/^-webkit-/,"");var entry=WebInspector.CSSMetadata._propertyDataMap[propertyName];if(!entry&&unprefixedName!==propertyName)
+entry=WebInspector.CSSMetadata._propertyDataMap[unprefixedName];return entry||null;}
+WebInspector.CSSMetadata.initializeWithSupportedProperties=function(properties)
+{WebInspector.CSSMetadata.cssPropertiesMetainfo=new WebInspector.CSSMetadata(properties);}
+WebInspector.CSSMetadata.cssPropertiesMetainfoKeySet=function()
+{if(!WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet)
+WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet=WebInspector.CSSMetadata.cssPropertiesMetainfo.keySet();return WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet;}
+WebInspector.CSSMetadata.Weight={"-webkit-animation":1,"-webkit-animation-duration":1,"-webkit-animation-iteration-count":1,"-webkit-animation-name":1,"-webkit-animation-timing-function":1,"-webkit-appearance":1,"-webkit-background-clip":2,"-webkit-border-horizontal-spacing":1,"-webkit-border-vertical-spacing":1,"-webkit-box-shadow":24,"-webkit-font-smoothing":2,"-webkit-transform":1,"-webkit-transition":8,"-webkit-transition-delay":7,"-webkit-transition-duration":7,"-webkit-transition-property":7,"-webkit-transition-timing-function":6,"-webkit-user-select":1,"background":222,"background-attachment":144,"background-clip":143,"background-color":222,"background-image":201,"background-origin":142,"background-size":25,"border":121,"border-bottom":121,"border-bottom-color":121,"border-bottom-left-radius":50,"border-bottom-right-radius":50,"border-bottom-style":114,"border-bottom-width":120,"border-collapse":3,"border-left":95,"border-left-color":95,"border-left-style":89,"border-left-width":94,"border-radius":50,"border-right":93,"border-right-color":93,"border-right-style":88,"border-right-width":93,"border-top":111,"border-top-color":111,"border-top-left-radius":49,"border-top-right-radius":49,"border-top-style":104,"border-top-width":109,"bottom":16,"box-shadow":25,"box-sizing":2,"clear":23,"color":237,"cursor":34,"direction":4,"display":210,"fill":2,"filter":1,"float":105,"font":174,"font-family":25,"font-size":174,"font-style":9,"font-weight":89,"height":161,"left":54,"letter-spacing":3,"line-height":75,"list-style":17,"list-style-image":8,"list-style-position":8,"list-style-type":17,"margin":241,"margin-bottom":226,"margin-left":225,"margin-right":213,"margin-top":241,"max-height":5,"max-width":11,"min-height":9,"min-width":6,"opacity":24,"outline":10,"outline-color":10,"outline-style":10,"outline-width":10,"overflow":57,"overflow-x":56,"overflow-y":57,"padding":216,"padding-bottom":208,"padding-left":216,"padding-right":206,"padding-top":216,"position":136,"resize":1,"right":29,"stroke":1,"stroke-width":1,"table-layout":1,"text-align":66,"text-decoration":53,"text-indent":9,"text-overflow":8,"text-shadow":19,"text-transform":5,"top":71,"unicode-bidi":1,"vertical-align":37,"visibility":11,"white-space":24,"width":255,"word-wrap":6,"z-index":32,"zoom":10};WebInspector.CSSMetadata.prototype={startsWith:function(prefix)
+{var firstIndex=this._firstIndexOfPrefix(prefix);if(firstIndex===-1)
+return[];var results=[];while(firstIndex<this._values.length&&this._values[firstIndex].startsWith(prefix))
+results.push(this._values[firstIndex++]);return results;},mostUsedOf:function(properties)
+{var maxWeight=0;var index=0;for(var i=0;i<properties.length;i++){var weight=WebInspector.CSSMetadata.Weight[properties[i]];if(weight>maxWeight){maxWeight=weight;index=i;}}
+return index;},_firstIndexOfPrefix:function(prefix)
+{if(!this._values.length)
+return-1;if(!prefix)
+return 0;var maxIndex=this._values.length-1;var minIndex=0;var foundIndex;do{var middleIndex=(maxIndex+minIndex)>>1;if(this._values[middleIndex].startsWith(prefix)){foundIndex=middleIndex;break;}
+if(this._values[middleIndex]<prefix)
+minIndex=middleIndex+1;else
+maxIndex=middleIndex-1;}while(minIndex<=maxIndex);if(foundIndex===undefined)
+return-1;while(foundIndex&&this._values[foundIndex-1].startsWith(prefix))
+foundIndex--;return foundIndex;},keySet:function()
+{if(!this._keySet)
+this._keySet=this._values.keySet();return this._keySet;},next:function(str,prefix)
+{return this._closest(str,prefix,1);},previous:function(str,prefix)
+{return this._closest(str,prefix,-1);},_closest:function(str,prefix,shift)
+{if(!str)
+return"";var index=this._values.indexOf(str);if(index===-1)
+return"";if(!prefix){index=(index+this._values.length+shift)%this._values.length;return this._values[index];}
+var propertiesWithPrefix=this.startsWith(prefix);var j=propertiesWithPrefix.indexOf(str);j=(j+propertiesWithPrefix.length+shift)%propertiesWithPrefix.length;return propertiesWithPrefix[j];},longhands:function(shorthand)
+{return this._longhands[shorthand];},shorthands:function(longhand)
+{return this._shorthands[longhand];}}
+WebInspector.CSSMetadata.initializeWithSupportedProperties([]);WebInspector.CSSMetadata.initializeWithSupportedProperties([{"name":"-webkit-animation-iteration-count"},{"name":"-webkit-logical-height"},{"name":"-webkit-text-emphasis-position"},{"name":"-webkit-text-emphasis-style"},{"name":"text-underline-position"},{"longhands":["-webkit-column-rule-width","-webkit-column-rule-style","-webkit-column-rule-color"],"name":"-webkit-column-rule"},{"name":"buffered-rendering"},{"name":"-webkit-appearance"},{"name":"outline-width"},{"name":"alignment-baseline"},{"name":"glyph-orientation-vertical"},{"name":"text-line-through-color"},{"longhands":["-webkit-border-after-width","-webkit-border-after-style","-webkit-border-after-color"],"name":"-webkit-border-after"},{"name":"-webkit-column-break-inside"},{"name":"-webkit-print-color-adjust"},{"name":"list-style-type"},{"name":"page-break-before"},{"name":"flood-color"},{"name":"text-anchor"},{"name":"-webkit-padding-start"},{"name":"-webkit-column-rule-color"},{"name":"padding-left"},{"name":"shape-outside"},{"name":"-webkit-margin-before"},{"name":"-webkit-background-composite"},{"name":"perspective"},{"name":"-webkit-animation-play-state"},{"name":"border-image-repeat"},{"name":"-webkit-font-size-delta"},{"name":"border-right-style"},{"name":"border-left-style"},{"longhands":["flex-direction","flex-wrap"],"name":"flex-flow"},{"name":"outline-color"},{"name":"flex-grow"},{"name":"max-width"},{"longhands":["grid-column-start","grid-column-end"],"name":"grid-column"},{"name":"animation-duration"},{"longhands":["-webkit-column-width","-webkit-column-count"],"name":"-webkit-columns"},{"name":"-webkit-box-flex-group"},{"name":"-webkit-animation-delay"},{"name":"flex-shrink"},{"name":"text-rendering"},{"name":"align-items"},{"name":"border-collapse"},{"name":"-webkit-mask-position-x"},{"name":"-webkit-mask-position-y"},{"name":"outline-style"},{"name":"-webkit-margin-bottom-collapse"},{"name":"color-interpolation-filters"},{"name":"kerning"},{"name":"font-variant"},{"name":"-webkit-animation-fill-mode"},{"longhands":["border-right-width","border-right-style","border-right-color"],"name":"border-right"},{"name":"touch-action-delay"},{"name":"visibility"},{"name":"-internal-marquee-speed"},{"name":"-webkit-border-before-style"},{"name":"resize"},{"name":"-webkit-rtl-ordering"},{"name":"-webkit-box-ordinal-group"},{"name":"paint-order"},{"name":"stroke-linecap"},{"name":"animation-direction"},{"name":"-internal-marquee-direction"},{"name":"-webkit-background-size"},{"name":"border-top-left-radius"},{"name":"-webkit-column-width"},{"name":"-webkit-box-align"},{"name":"-webkit-padding-after"},{"longhands":["list-style-type","list-style-position","list-style-image"],"name":"list-style"},{"name":"-webkit-mask-repeat-y"},{"name":"-webkit-margin-before-collapse"},{"name":"stroke"},{"name":"text-decoration-line"},{"name":"-webkit-font-feature-settings"},{"name":"-webkit-mask-repeat-x"},{"name":"padding-bottom"},{"name":"font-style"},{"name":"-webkit-transition-delay"},{"longhands":["background-repeat-x","background-repeat-y"],"name":"background-repeat"},{"name":"flex-basis"},{"name":"-webkit-margin-after"},{"longhands":["-webkit-transform-origin-x","-webkit-transform-origin-y","-webkit-transform-origin-z"],"name":"-webkit-transform-origin"},{"name":"border-image-slice"},{"name":"vector-effect"},{"name":"-webkit-animation-timing-function"},{"name":"text-underline-style"},{"name":"-webkit-border-after-style"},{"name":"-webkit-perspective-origin-x"},{"name":"-webkit-perspective-origin-y"},{"longhands":["outline-color","outline-style","outline-width"],"name":"outline"},{"name":"table-layout"},{"longhands":["text-decoration-line","text-decoration-style","text-decoration-color"],"name":"text-decoration"},{"name":"transition-duration"},{"name":"order"},{"name":"-webkit-box-orient"},{"name":"counter-reset"},{"name":"flood-opacity"},{"name":"flex-direction"},{"name":"-webkit-text-stroke-width"},{"name":"min-height"},{"longhands":["-webkit-mask-box-image-source","-webkit-mask-box-image-slice","-webkit-mask-box-image-width","-webkit-mask-box-image-outset","-webkit-mask-box-image-repeat"],"name":"-webkit-mask-box-image"},{"name":"left"},{"longhands":["-webkit-mask-image","-webkit-mask-position-x","-webkit-mask-position-y","-webkit-mask-size","-webkit-mask-repeat-x","-webkit-mask-repeat-y","-webkit-mask-origin","-webkit-mask-clip"],"name":"-webkit-mask"},{"name":"-webkit-border-after-width"},{"name":"stroke-width"},{"name":"-webkit-box-decoration-break"},{"longhands":["-webkit-mask-position-x","-webkit-mask-position-y"],"name":"-webkit-mask-position"},{"name":"background-origin"},{"name":"-webkit-border-start-color"},{"name":"grid-auto-flow"},{"name":"-webkit-background-clip"},{"name":"-webkit-border-horizontal-spacing"},{"longhands":["border-top-left-radius","border-top-right-radius","border-bottom-right-radius","border-bottom-left-radius"],"name":"border-radius"},{"longhands":["flex-grow","flex-shrink","flex-basis"],"name":"flex"},{"name":"text-indent"},{"name":"text-transform"},{"name":"text-line-through-mode"},{"name":"font-size"},{"name":"-webkit-animation-name"},{"longhands":["-webkit-text-stroke-width","-webkit-text-stroke-color"],"name":"-webkit-text-stroke"},{"name":"padding-top"},{"name":"-webkit-border-end-width"},{"name":"-webkit-text-combine"},{"name":"grid-template-rows"},{"name":"content"},{"name":"padding-right"},{"name":"-webkit-transform"},{"name":"marker-mid"},{"name":"-webkit-min-logical-width"},{"name":"clip-rule"},{"name":"text-overline-width"},{"name":"font-family"},{"longhands":["transition-property","transition-duration","transition-timing-function","transition-delay"],"name":"transition"},{"name":"-webkit-border-fit"},{"name":"filter"},{"name":"border-right-width"},{"name":"-webkit-mask-composite"},{"name":"-webkit-line-box-contain"},{"name":"color-interpolation"},{"name":"border-top-style"},{"name":"fill-opacity"},{"name":"marker-start"},{"name":"border-bottom-width"},{"longhands":["-webkit-text-emphasis-style","-webkit-text-emphasis-color"],"name":"-webkit-text-emphasis"},{"longhands":["grid-row-start","grid-column-start","grid-row-end","grid-column-end"],"name":"grid-area"},{"name":"size"},{"name":"background-clip"},{"name":"-webkit-text-fill-color"},{"name":"top"},{"name":"-webkit-box-reflect"},{"longhands":["border-top-width","border-right-width","border-bottom-width","border-left-width"],"name":"border-width"},{"name":"-webkit-column-rule-style"},{"name":"-webkit-column-count"},{"name":"animation-play-state"},{"longhands":["padding-top","padding-right","padding-bottom","padding-left"],"name":"padding"},{"name":"dominant-baseline"},{"name":"background-attachment"},{"name":"-webkit-box-flex"},{"name":"-webkit-border-start-width"},{"name":"isolation"},{"name":"color-rendering"},{"name":"border-left-width"},{"name":"grid-column-end"},{"name":"background-blend-mode"},{"name":"vertical-align"},{"name":"-webkit-max-logical-height"},{"name":"grid-auto-rows"},{"name":"shape-padding"},{"name":"-internal-marquee-increment"},{"name":"margin-left"},{"name":"animation-name"},{"name":"border-image-source"},{"longhands":["border-top-color","border-top-style","border-top-width","border-right-color","border-right-style","border-right-width","border-bottom-color","border-bottom-style","border-bottom-width","border-left-color","border-left-style","border-left-width"],"name":"border"},{"name":"-webkit-transition-timing-function"},{"name":"-webkit-wrap-flow"},{"name":"margin-bottom"},{"name":"unicode-range"},{"longhands":["animation-name","animation-duration","animation-timing-function","animation-delay","animation-iteration-count","animation-direction","animation-fill-mode","animation-play-state"],"name":"animation"},{"name":"glyph-orientation-horizontal"},{"name":"font-weight"},{"name":"shape-margin"},{"name":"-webkit-margin-end"},{"name":"object-position"},{"name":"page-break-after"},{"name":"transition-property"},{"name":"white-space"},{"name":"-webkit-border-after-color"},{"name":"-webkit-transform-origin-x"},{"name":"-webkit-max-logical-width"},{"name":"-webkit-border-before-color"},{"name":"font-kerning"},{"name":"clear"},{"name":"animation-timing-function"},{"longhands":["border-top-left-radius","border-top-right-radius","border-bottom-right-radius","border-bottom-left-radius"],"name":"-webkit-border-radius"},{"name":"text-underline-mode"},{"name":"-webkit-text-decorations-in-effect"},{"name":"-webkit-animation-direction"},{"name":"justify-self"},{"name":"transition-timing-function"},{"name":"counter-increment"},{"name":"-webkit-transform-style"},{"name":"grid-auto-columns"},{"longhands":["font-family","font-size","font-style","font-variant","font-weight","line-height"],"name":"font"},{"name":"flex-wrap"},{"name":"grid-row-start"},{"name":"list-style-image"},{"name":"-webkit-tap-highlight-color"},{"name":"-webkit-text-emphasis-color"},{"longhands":["border-left-width","border-left-style","border-left-color"],"name":"border-left"},{"name":"-webkit-border-end-color"},{"name":"-internal-callback"},{"name":"box-shadow"},{"name":"align-self"},{"longhands":["border-bottom-width","border-bottom-style","border-bottom-color"],"name":"border-bottom"},{"longhands":["-webkit-border-horizontal-spacing","-webkit-border-vertical-spacing"],"name":"border-spacing"},{"name":"text-underline-color"},{"name":"text-line-through-style"},{"name":"-webkit-column-span"},{"name":"grid-row-end"},{"longhands":["-webkit-border-end-width","-webkit-border-end-style","-webkit-border-end-color"],"name":"-webkit-border-end"},{"name":"perspective-origin"},{"name":"page-break-inside"},{"name":"orphans"},{"name":"-webkit-border-start-style"},{"name":"scroll-behavior"},{"name":"-webkit-hyphenate-character"},{"name":"column-fill"},{"name":"tab-size"},{"name":"border-bottom-color"},{"name":"border-bottom-right-radius"},{"name":"line-height"},{"name":"stroke-linejoin"},{"name":"text-align-last"},{"name":"text-overline-mode"},{"name":"word-spacing"},{"name":"transform-style"},{"name":"-webkit-app-region"},{"name":"-webkit-border-end-style"},{"name":"-webkit-transform-origin-z"},{"name":"-webkit-aspect-ratio"},{"name":"-webkit-transform-origin-y"},{"name":"background-repeat-x"},{"name":"background-repeat-y"},{"longhands":["grid-row-start","grid-row-end"],"name":"grid-row"},{"name":"-webkit-ruby-position"},{"name":"-webkit-logical-width"},{"longhands":["border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat"],"name":"border-image"},{"name":"caption-side"},{"name":"mask-source-type"},{"name":"-webkit-mask-box-image-slice"},{"name":"-webkit-border-image"},{"name":"-webkit-text-security"},{"name":"-webkit-mask-box-image-repeat"},{"longhands":["-webkit-mask-repeat-x","-webkit-mask-repeat-y"],"name":"-webkit-mask-repeat"},{"name":"baseline-shift"},{"name":"text-justify"},{"name":"text-decoration-color"},{"name":"color"},{"name":"shape-image-threshold"},{"longhands":["min-height","max-height"],"name":"height"},{"name":"margin-right"},{"name":"color-profile"},{"name":"speak"},{"name":"border-bottom-left-radius"},{"name":"-webkit-column-break-after"},{"name":"-webkit-font-smoothing"},{"name":"clip"},{"name":"-webkit-line-break"},{"name":"fill-rule"},{"name":"-webkit-margin-start"},{"name":"min-width"},{"name":"-webkit-column-gap"},{"name":"empty-cells"},{"name":"direction"},{"name":"clip-path"},{"name":"-webkit-wrap-through"},{"name":"justify-content"},{"name":"z-index"},{"name":"background-position-y"},{"name":"text-decoration-style"},{"name":"grid-template-areas"},{"name":"-webkit-min-logical-height"},{"name":"-webkit-user-select"},{"name":"cursor"},{"name":"-webkit-mask-box-image-source"},{"longhands":["margin-top","margin-right","margin-bottom","margin-left"],"name":"margin"},{"longhands":["-webkit-animation-name","-webkit-animation-duration","-webkit-animation-timing-function","-webkit-animation-delay","-webkit-animation-iteration-count","-webkit-animation-direction","-webkit-animation-fill-mode","-webkit-animation-play-state"],"name":"-webkit-animation"},{"name":"letter-spacing"},{"name":"orientation"},{"name":"will-change"},{"name":"mix-blend-mode"},{"name":"text-line-through-width"},{"name":"-webkit-highlight"},{"name":"transform-origin"},{"name":"font-variant-ligatures"},{"name":"-webkit-animation-duration"},{"name":"text-overline-color"},{"name":"-webkit-mask-origin"},{"name":"-webkit-clip-path"},{"name":"word-break"},{"longhands":["-webkit-border-before-width","-webkit-border-before-style","-webkit-border-before-color"],"name":"-webkit-border-before"},{"name":"text-overflow"},{"name":"-webkit-locale"},{"name":"font-stretch"},{"name":"border-top-right-radius"},{"name":"border-image-outset"},{"name":"fill"},{"name":"touch-action"},{"name":"border-right-color"},{"name":"min-zoom"},{"name":"-webkit-border-before-width"},{"name":"backface-visibility"},{"name":"background-image"},{"name":"-webkit-transition-property"},{"name":"writing-mode"},{"name":"stroke-opacity"},{"name":"box-sizing"},{"name":"margin-top"},{"name":"position"},{"name":"enable-background"},{"name":"list-style-position"},{"name":"-webkit-box-pack"},{"name":"quotes"},{"longhands":["border-top-width","border-top-style","border-top-color"],"name":"border-top"},{"longhands":["-webkit-transition-property","-webkit-transition-duration","-webkit-transition-timing-function","-webkit-transition-delay"],"name":"-webkit-transition"},{"name":"-webkit-column-break-before"},{"name":"lighting-color"},{"name":"background-size"},{"name":"-webkit-mask-size"},{"name":"animation-fill-mode"},{"name":"-webkit-filter"},{"name":"word-wrap"},{"name":"max-zoom"},{"name":"text-overline-style"},{"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"],"name":"background"},{"name":"-webkit-padding-before"},{"name":"grid-column-start"},{"name":"text-align"},{"name":"marker-end"},{"name":"zoom"},{"longhands":["-webkit-margin-before-collapse","-webkit-margin-after-collapse"],"name":"-webkit-margin-collapse"},{"name":"-webkit-margin-top-collapse"},{"name":"page"},{"name":"right"},{"name":"-webkit-user-modify"},{"longhands":["marker-start","marker-mid","marker-end"],"name":"marker"},{"name":"mask-type"},{"name":"-webkit-transition-duration"},{"name":"-webkit-writing-mode"},{"name":"border-top-width"},{"name":"bottom"},{"name":"-webkit-user-drag"},{"name":"-webkit-border-vertical-spacing"},{"name":"background-color"},{"name":"-webkit-backface-visibility"},{"name":"-webkit-padding-end"},{"longhands":["-webkit-border-start-width","-webkit-border-start-style","-webkit-border-start-color"],"name":"-webkit-border-start"},{"name":"animation-delay"},{"name":"unicode-bidi"},{"name":"text-shadow"},{"name":"-webkit-box-direction"},{"name":"image-rendering"},{"name":"src"},{"name":"-internal-marquee-repetition"},{"name":"pointer-events"},{"name":"border-image-width"},{"name":"-webkit-mask-clip"},{"name":"-webkit-mask-image"},{"name":"float"},{"name":"max-height"},{"name":"outline-offset"},{"name":"-webkit-box-shadow"},{"name":"overflow-wrap"},{"name":"-internal-marquee-style"},{"name":"transform"},{"longhands":["min-width","max-width"],"name":"width"},{"name":"stroke-miterlimit"},{"name":"stop-opacity"},{"name":"border-top-color"},{"longhands":["background-position-x","background-position-y"],"name":"background-position"},{"name":"object-fit"},{"name":"-webkit-mask-box-image-width"},{"name":"-webkit-background-origin"},{"name":"transition-delay"},{"longhands":["border-top-style","border-right-style","border-bottom-style","border-left-style"],"name":"border-style"},{"name":"animation-iteration-count"},{"name":"-webkit-margin-after-collapse"},{"longhands":["overflow-x","overflow-y"],"name":"overflow"},{"name":"user-zoom"},{"name":"grid-template-columns"},{"name":"-webkit-perspective-origin"},{"name":"display"},{"name":"-webkit-column-rule-width"},{"name":"-webkit-box-lines"},{"longhands":["border-top-color","border-right-color","border-bottom-color","border-left-color"],"name":"border-color"},{"name":"stroke-dashoffset"},{"name":"widows"},{"name":"border-left-color"},{"name":"overflow-y"},{"name":"overflow-x"},{"name":"shape-rendering"},{"name":"opacity"},{"name":"-webkit-perspective"},{"name":"text-underline-width"},{"name":"-webkit-text-stroke-color"},{"name":"-webkit-text-orientation"},{"name":"-webkit-mask-box-image-outset"},{"name":"align-content"},{"name":"border-bottom-style"},{"name":"mask"},{"name":"background-position-x"},{"name":"stop-color"},{"name":"stroke-dasharray"},{"name":"-webkit-line-clamp"}]);WebInspector.StatusBarItem=function(elementType)
+{this.element=document.createElement(elementType);this._enabled=true;this._visible=true;}
+WebInspector.StatusBarItem.prototype={setEnabled:function(value)
+{if(this._enabled===value)
+return;this._enabled=value;this._applyEnabledState();},_applyEnabledState:function()
+{this.element.disabled=!this._enabled;},get visible()
+{return this._visible;},set visible(x)
+{if(this._visible===x)
+return;this.element.classList.toggle("hidden",!x);this._visible=x;},__proto__:WebInspector.Object.prototype}
+WebInspector.StatusBarText=function(text,className)
+{WebInspector.StatusBarItem.call(this,"span");this.element.className="status-bar-item status-bar-text";if(className)
+this.element.classList.add(className);this.element.textContent=text;}
+WebInspector.StatusBarText.prototype={setText:function(text)
+{this.element.textContent=text;},__proto__:WebInspector.StatusBarItem.prototype}
+WebInspector.StatusBarInput=function(placeholder,width)
+{WebInspector.StatusBarItem.call(this,"input");this.element.className="status-bar-item";this.element.addEventListener("input",this._onChangeCallback.bind(this),false);if(width)
+this.element.style.width=width+"px";if(placeholder)
+this.element.setAttribute("placeholder",placeholder);}
+WebInspector.StatusBarInput.prototype={setOnChangeHandler:function(handler)
+{this._onChangeHandler=handler;},setValue:function(value)
+{this.element.value=value;this._onChangeCallback();},_onChangeCallback:function()
+{this._onChangeHandler&&this._onChangeHandler(this.element.value);},__proto__:WebInspector.StatusBarItem.prototype}
+WebInspector.StatusBarButton=function(title,className,states)
+{WebInspector.StatusBarItem.call(this,"button");this.element.className=className+" status-bar-item";this.element.addEventListener("click",this._clicked.bind(this),false);this.glyph=document.createElement("div");this.glyph.className="glyph";this.element.appendChild(this.glyph);this.glyphShadow=document.createElement("div");this.glyphShadow.className="glyph shadow";this.element.appendChild(this.glyphShadow);this.states=states;if(!states)
+this.states=2;if(states==2)
+this._state=false;else
+this._state=0;this.title=title;this.className=className;}
+WebInspector.StatusBarButton.prototype={_clicked:function()
+{this.dispatchEventToListeners("click");if(this._longClickInterval){clearInterval(this._longClickInterval);delete this._longClickInterval;}},_applyEnabledState:function()
+{this.element.disabled=!this._enabled;if(this._longClickInterval){clearInterval(this._longClickInterval);delete this._longClickInterval;}},enabled:function()
+{return this._enabled;},get title()
+{return this._title;},set title(x)
+{if(this._title===x)
+return;this._title=x;this.element.title=x;},get state()
+{return this._state;},set state(x)
+{if(this._state===x)
+return;if(this.states===2)
+this.element.classList.toggle("toggled-on",x);else{this.element.classList.remove("toggled-"+this._state);if(x!==0)
+this.element.classList.add("toggled-"+x);}
+this._state=x;},get toggled()
+{if(this.states!==2)
+throw("Only used toggled when there are 2 states, otherwise, use state");return this.state;},set toggled(x)
+{if(this.states!==2)
+throw("Only used toggled when there are 2 states, otherwise, use state");this.state=x;},makeLongClickEnabled:function()
+{var boundMouseDown=mouseDown.bind(this);var boundMouseUp=mouseUp.bind(this);this.element.addEventListener("mousedown",boundMouseDown,false);this.element.addEventListener("mouseout",boundMouseUp,false);this.element.addEventListener("mouseup",boundMouseUp,false);var longClicks=0;this._longClickData={mouseUp:boundMouseUp,mouseDown:boundMouseDown};function mouseDown(e)
+{if(e.which!==1)
+return;longClicks=0;this._longClickInterval=setInterval(longClicked.bind(this),200);}
+function mouseUp(e)
+{if(e.which!==1)
+return;if(this._longClickInterval){clearInterval(this._longClickInterval);delete this._longClickInterval;}}
+function longClicked()
+{++longClicks;this.dispatchEventToListeners(longClicks===1?"longClickDown":"longClickPress");}},unmakeLongClickEnabled:function()
+{if(!this._longClickData)
+return;this.element.removeEventListener("mousedown",this._longClickData.mouseDown,false);this.element.removeEventListener("mouseout",this._longClickData.mouseUp,false);this.element.removeEventListener("mouseup",this._longClickData.mouseUp,false);delete this._longClickData;},setLongClickOptionsEnabled:function(buttonsProvider)
+{if(buttonsProvider){if(!this._longClickOptionsData){this.makeLongClickEnabled();this.longClickGlyph=document.createElement("div");this.longClickGlyph.className="fill long-click-glyph";this.element.appendChild(this.longClickGlyph);this.longClickGlyphShadow=document.createElement("div");this.longClickGlyphShadow.className="fill long-click-glyph shadow";this.element.appendChild(this.longClickGlyphShadow);var longClickDownListener=this._showOptions.bind(this);this.addEventListener("longClickDown",longClickDownListener,this);this._longClickOptionsData={glyphElement:this.longClickGlyph,glyphShadowElement:this.longClickGlyphShadow,longClickDownListener:longClickDownListener};}
+this._longClickOptionsData.buttonsProvider=buttonsProvider;}else{if(!this._longClickOptionsData)
+return;this.element.removeChild(this._longClickOptionsData.glyphElement);this.element.removeChild(this._longClickOptionsData.glyphShadowElement);this.removeEventListener("longClickDown",this._longClickOptionsData.longClickDownListener,this);delete this._longClickOptionsData;this.unmakeLongClickEnabled();}},_showOptions:function()
+{var buttons=this._longClickOptionsData.buttonsProvider();var mainButtonClone=new WebInspector.StatusBarButton(this.title,this.className,this.states);mainButtonClone.addEventListener("click",this._clicked,this);mainButtonClone.state=this.state;buttons.push(mainButtonClone);document.documentElement.addEventListener("mouseup",mouseUp,false);var optionsGlassPane=new WebInspector.GlassPane();var optionsBarElement=optionsGlassPane.element.createChild("div","alternate-status-bar-buttons-bar");const buttonHeight=23;var hostButtonPosition=this.element.totalOffset();var topNotBottom=hostButtonPosition.top+buttonHeight*buttons.length<document.documentElement.offsetHeight;if(topNotBottom)
+buttons=buttons.reverse();optionsBarElement.style.height=(buttonHeight*buttons.length)+"px";if(topNotBottom)
+optionsBarElement.style.top=(hostButtonPosition.top+1)+"px";else
+optionsBarElement.style.top=(hostButtonPosition.top-(buttonHeight*(buttons.length-1)))+"px";optionsBarElement.style.left=(hostButtonPosition.left+1)+"px";for(var i=0;i<buttons.length;++i){buttons[i].element.addEventListener("mousemove",mouseOver,false);buttons[i].element.addEventListener("mouseout",mouseOut,false);optionsBarElement.appendChild(buttons[i].element);}
+var hostButtonIndex=topNotBottom?0:buttons.length-1;buttons[hostButtonIndex].element.classList.add("emulate-active");function mouseOver(e)
+{if(e.which!==1)
+return;var buttonElement=e.target.enclosingNodeOrSelfWithClass("status-bar-item");buttonElement.classList.add("emulate-active");}
+function mouseOut(e)
+{if(e.which!==1)
+return;var buttonElement=e.target.enclosingNodeOrSelfWithClass("status-bar-item");buttonElement.classList.remove("emulate-active");}
+function mouseUp(e)
+{if(e.which!==1)
+return;optionsGlassPane.dispose();document.documentElement.removeEventListener("mouseup",mouseUp,false);for(var i=0;i<buttons.length;++i){if(buttons[i].element.classList.contains("emulate-active")){buttons[i].element.classList.remove("emulate-active");buttons[i]._clicked();break;}}}},__proto__:WebInspector.StatusBarItem.prototype}
+WebInspector.StatusBarComboBox=function(changeHandler,className)
+{WebInspector.StatusBarItem.call(this,"span");this.element.className="status-bar-select-container";this._selectElement=this.element.createChild("select","status-bar-item");this.element.createChild("div","status-bar-select-arrow");if(changeHandler)
+this._selectElement.addEventListener("change",changeHandler,false);if(className)
+this._selectElement.classList.add(className);}
+WebInspector.StatusBarComboBox.prototype={selectElement:function()
+{return this._selectElement;},size:function()
+{return this._selectElement.childElementCount;},addOption:function(option)
+{this._selectElement.appendChild(option);},createOption:function(label,title,value)
+{var option=this._selectElement.createChild("option");option.text=label;if(title)
+option.title=title;if(typeof value!=="undefined")
+option.value=value;return option;},_applyEnabledState:function()
+{this._selectElement.disabled=!this._enabled;},removeOption:function(option)
+{this._selectElement.removeChild(option);},removeOptions:function()
+{this._selectElement.removeChildren();},selectedOption:function()
+{if(this._selectElement.selectedIndex>=0)
+return this._selectElement[this._selectElement.selectedIndex];return null;},select:function(option)
+{this._selectElement.selectedIndex=Array.prototype.indexOf.call(this._selectElement,option);},setSelectedIndex:function(index)
+{this._selectElement.selectedIndex=index;},selectedIndex:function()
+{return this._selectElement.selectedIndex;},__proto__:WebInspector.StatusBarItem.prototype}
+WebInspector.StatusBarCheckbox=function(title)
+{WebInspector.StatusBarItem.call(this,"label");this.element.classList.add("status-bar-item","checkbox");this._checkbox=this.element.createChild("input");this._checkbox.type="checkbox";this.element.createTextChild(title);}
+WebInspector.StatusBarCheckbox.prototype={checked:function()
+{return this._checkbox.checked;},__proto__:WebInspector.StatusBarItem.prototype}
+WebInspector.StatusBarStatesSettingButton=function(className,states,titles,currentStateSetting,lastStateSetting,stateChangedCallback)
+{WebInspector.StatusBarButton.call(this,"",className,states.length);var onClickBound=this._onClick.bind(this);this.addEventListener("click",onClickBound,this);this._states=states;this._buttons=[];for(var index=0;index<states.length;index++){var button=new WebInspector.StatusBarButton(titles[index],className,states.length);button.state=this._states[index];button.addEventListener("click",onClickBound,this);this._buttons.push(button);}
+this._currentStateSetting=currentStateSetting;this._lastStateSetting=lastStateSetting;this._stateChangedCallback=stateChangedCallback;this.setLongClickOptionsEnabled(this._createOptions.bind(this));this._currentState=null;this.toggleState(this._defaultState());}
+WebInspector.StatusBarStatesSettingButton.prototype={_onClick:function(e)
+{this.toggleState(e.target.state);},toggleState:function(state)
+{if(this._currentState===state)
+return;if(this._currentState)
+this._lastStateSetting.set(this._currentState);this._currentState=state;this._currentStateSetting.set(this._currentState);if(this._stateChangedCallback)
+this._stateChangedCallback(state);var defaultState=this._defaultState();this.state=defaultState;this.title=this._buttons[this._states.indexOf(defaultState)].title;},_defaultState:function()
+{if(!this._currentState){var state=this._currentStateSetting.get();return this._states.indexOf(state)>=0?state:this._states[0];}
+var lastState=this._lastStateSetting.get();if(lastState&&this._states.indexOf(lastState)>=0&&lastState!=this._currentState)
+return lastState;if(this._states.length>1&&this._currentState===this._states[0])
+return this._states[1];return this._states[0];},_createOptions:function()
+{var options=[];for(var index=0;index<this._states.length;index++){if(this._states[index]!==this.state&&this._states[index]!==this._currentState)
+options.push(this._buttons[index]);}
+return options;},__proto__:WebInspector.StatusBarButton.prototype}
+WebInspector.DropDownMenu=function()
+{this.element=document.createElementWithClass("select","drop-down-menu");this.element.addEventListener("mousedown",this._onBeforeMouseDown.bind(this),true);this.element.addEventListener("mousedown",consumeEvent,false);this.element.addEventListener("change",this._onChange.bind(this),false);}
+WebInspector.DropDownMenu.Events={BeforeShow:"BeforeShow",ItemSelected:"ItemSelected"}
+WebInspector.DropDownMenu.prototype={_onBeforeMouseDown:function()
+{this.dispatchEventToListeners(WebInspector.DropDownMenu.Events.BeforeShow,null);},_onChange:function()
+{var options=this.element.options;var selectedOption=options[this.element.selectedIndex];this.dispatchEventToListeners(WebInspector.DropDownMenu.Events.ItemSelected,selectedOption.id);},addItem:function(id,title)
+{var option=new Option(title);option.id=id;this.element.appendChild(option);},selectItem:function(id)
+{var children=this.element.children;for(var i=0;i<children.length;++i){var child=children[i];if(child.id===id){this.element.selectedIndex=i;return;}}
+this.element.selectedIndex=-1;},clear:function()
+{this.element.removeChildren();},__proto__:WebInspector.Object.prototype}
+WebInspector.CompletionDictionary=function(){}
+WebInspector.CompletionDictionary.prototype={addWord:function(word){},removeWord:function(word){},hasWord:function(word){},wordsWithPrefix:function(prefix){},wordCount:function(word){},reset:function(){}}
+WebInspector.SampleCompletionDictionary=function(){this._words={};}
+WebInspector.SampleCompletionDictionary.prototype={addWord:function(word)
+{if(!this._words[word])
+this._words[word]=1;else
+++this._words[word];},removeWord:function(word)
+{if(!this._words[word])
+return;if(this._words[word]===1)
+delete this._words[word];else
+--this._words[word];},wordsWithPrefix:function(prefix)
+{var words=[];for(var i in this._words){if(i.startsWith(prefix))
+words.push(i);}
+return words;},hasWord:function(word)
+{return!!this._words[word];},wordCount:function(word)
+{return this._words[word]?this._words[word]:0;},reset:function()
+{this._words={};}}
+WebInspector.InplaceEditor=function()
+{};WebInspector.InplaceEditor.startEditing=function(element,config)
+{if(config.multiline)
+return WebInspector.moduleManager.instance(WebInspector.InplaceEditor).startEditing(element,config);if(!WebInspector.InplaceEditor._defaultInstance)
+WebInspector.InplaceEditor._defaultInstance=new WebInspector.InplaceEditor();return WebInspector.InplaceEditor._defaultInstance.startEditing(element,config);}
+WebInspector.InplaceEditor.prototype={editorContent:function(editingContext){var element=editingContext.element;if(element.tagName==="INPUT"&&element.type==="text")
+return element.value;return element.textContent;},setUpEditor:function(editingContext)
+{var element=editingContext.element;element.classList.add("editing");var oldTabIndex=element.getAttribute("tabIndex");if(typeof oldTabIndex!=="number"||oldTabIndex<0)
+element.tabIndex=0;WebInspector.setCurrentFocusElement(element);editingContext.oldTabIndex=oldTabIndex;},closeEditor:function(editingContext)
+{var element=editingContext.element;element.classList.remove("editing");if(typeof editingContext.oldTabIndex!=="number")
+element.removeAttribute("tabIndex");else
+element.tabIndex=editingContext.oldTabIndex;element.scrollTop=0;element.scrollLeft=0;},cancelEditing:function(editingContext)
+{var element=editingContext.element;if(element.tagName==="INPUT"&&element.type==="text")
+element.value=editingContext.oldText;else
+element.textContent=editingContext.oldText;},augmentEditingHandle:function(editingContext,handle)
+{},startEditing:function(element,config)
+{if(!WebInspector.markBeingEdited(element,true))
+return null;config=config||new WebInspector.InplaceEditor.Config(function(){},function(){});var editingContext={element:element,config:config};var committedCallback=config.commitHandler;var cancelledCallback=config.cancelHandler;var pasteCallback=config.pasteHandler;var context=config.context;var isMultiline=config.multiline||false;var moveDirection="";var self=this;function consumeCopy(e)
+{e.consume();}
+this.setUpEditor(editingContext);editingContext.oldText=isMultiline?config.initialValue:this.editorContent(editingContext);function blurEventListener(e){if(!isMultiline||!e||!e.relatedTarget||!e.relatedTarget.isSelfOrDescendant(element))
+editingCommitted.call(element);}
+function cleanUpAfterEditing()
+{WebInspector.markBeingEdited(element,false);element.removeEventListener("blur",blurEventListener,isMultiline);element.removeEventListener("keydown",keyDownEventListener,true);if(pasteCallback)
+element.removeEventListener("paste",pasteEventListener,true);WebInspector.restoreFocusFromElement(element);self.closeEditor(editingContext);}
+function editingCancelled()
+{self.cancelEditing(editingContext);cleanUpAfterEditing();cancelledCallback(this,context);}
+function editingCommitted()
+{cleanUpAfterEditing();committedCallback(this,self.editorContent(editingContext),editingContext.oldText,context,moveDirection);}
+function defaultFinishHandler(event)
+{var isMetaOrCtrl=WebInspector.isMac()?event.metaKey&&!event.shiftKey&&!event.ctrlKey&&!event.altKey:event.ctrlKey&&!event.shiftKey&&!event.metaKey&&!event.altKey;if(isEnterKey(event)&&(event.isMetaOrCtrlForTest||!isMultiline||isMetaOrCtrl))
+return"commit";else if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Esc.code||event.keyIdentifier==="U+001B")
+return"cancel";else if(!isMultiline&&event.keyIdentifier==="U+0009")
+return"move-"+(event.shiftKey?"backward":"forward");}
+function handleEditingResult(result,event)
+{if(result==="commit"){editingCommitted.call(element);event.consume(true);}else if(result==="cancel"){editingCancelled.call(element);event.consume(true);}else if(result&&result.startsWith("move-")){moveDirection=result.substring(5);if(event.keyIdentifier!=="U+0009")
+blurEventListener();}}
+function pasteEventListener(event)
+{var result=pasteCallback(event);handleEditingResult(result,event);}
+function keyDownEventListener(event)
+{var handler=config.customFinishHandler||defaultFinishHandler;var result=handler(event);handleEditingResult(result,event);}
+element.addEventListener("blur",blurEventListener,isMultiline);element.addEventListener("keydown",keyDownEventListener,true);if(pasteCallback)
+element.addEventListener("paste",pasteEventListener,true);var handle={cancel:editingCancelled.bind(element),commit:editingCommitted.bind(element)};this.augmentEditingHandle(editingContext,handle);return handle;}}
+WebInspector.InplaceEditor.Config=function(commitHandler,cancelHandler,context)
+{this.commitHandler=commitHandler;this.cancelHandler=cancelHandler
+this.context=context;this.pasteHandler;this.multiline;this.customFinishHandler;}
+WebInspector.InplaceEditor.Config.prototype={setPasteHandler:function(pasteHandler)
+{this.pasteHandler=pasteHandler;},setMultilineOptions:function(initialValue,mode,theme,lineWrapping,smartIndent)
+{this.multiline=true;this.initialValue=initialValue;this.mode=mode;this.theme=theme;this.lineWrapping=lineWrapping;this.smartIndent=smartIndent;},setCustomFinishHandler:function(customFinishHandler)
+{this.customFinishHandler=customFinishHandler;}}
+WebInspector.TextEditor=function(){};WebInspector.TextEditor.Events={GutterClick:"gutterClick"};WebInspector.TextEditor.GutterClickEventData;WebInspector.TextEditor.prototype={undo:function(){},redo:function(){},isClean:function(){},markClean:function(){},indent:function(){},cursorPositionToCoordinates:function(lineNumber,column){return null;},coordinatesToCursorPosition:function(x,y){return null;},tokenAtTextPosition:function(lineNumber,column){return null;},setMimeType:function(mimeType){},setReadOnly:function(readOnly){},readOnly:function(){},defaultFocusedElement:function(){},highlightRange:function(range,cssClass){},removeHighlight:function(highlightDescriptor){},addBreakpoint:function(lineNumber,disabled,conditional){},removeBreakpoint:function(lineNumber){},setExecutionLine:function(lineNumber){},clearExecutionLine:function(){},addDecoration:function(lineNumber,element){},removeDecoration:function(lineNumber,element){},highlightSearchResults:function(regex,range){},revealPosition:function(lineNumber,columnNumber,shouldHighlight){},clearPositionHighlight:function(){},elementsToRestoreScrollPositionsFor:function(){},inheritScrollPositions:function(textEditor){},beginUpdates:function(){},endUpdates:function(){},onResize:function(){},editRange:function(range,text){},scrollToLine:function(lineNumber){},firstVisibleLine:function(){},lastVisibleLine:function(){},selection:function(){},lastSelection:function(){},setSelection:function(textRange){},copyRange:function(range){},setText:function(text){},text:function(){},range:function(){},line:function(lineNumber){},get linesCount(){},setAttribute:function(line,name,value){},getAttribute:function(line,name){},removeAttribute:function(line,name){},wasShown:function(){},willHide:function(){},setCompletionDictionary:function(dictionary){},textEditorPositionHandle:function(lineNumber,columnNumber){}}
+WebInspector.TextEditorPositionHandle=function()
+{}
+WebInspector.TextEditorPositionHandle.prototype={resolve:function(){},equal:function(positionHandle){}}
+WebInspector.TextEditorDelegate=function()
+{}
+WebInspector.TextEditorDelegate.prototype={onTextChanged:function(oldRange,newRange){},selectionChanged:function(textRange){},scrollChanged:function(lineNumber){},editorFocused:function(){},populateLineGutterContextMenu:function(contextMenu,lineNumber){},populateTextAreaContextMenu:function(contextMenu,lineNumber){},createLink:function(hrefValue,isExternal){},onJumpToPosition:function(from,to){}}
+WebInspector.TokenizerFactory=function(){}
+WebInspector.TokenizerFactory.prototype={createTokenizer:function(mimeType){}}
+WebInspector.SourceFrame=function(contentProvider)
+{WebInspector.VBox.call(this);this.element.classList.add("script-view");this._url=contentProvider.contentURL();this._contentProvider=contentProvider;var textEditorDelegate=new WebInspector.TextEditorDelegateForSourceFrame(this);WebInspector.moduleManager.loadModule("codemirror");this._textEditor=new WebInspector.CodeMirrorTextEditor(this._url,textEditorDelegate);this._currentSearchResultIndex=-1;this._searchResults=[];this._messages=[];this._rowMessages={};this._messageBubbles={};this._textEditor.setReadOnly(!this.canEditSource());this._shortcuts={};this.element.addEventListener("keydown",this._handleKeyDown.bind(this),false);this._sourcePosition=new WebInspector.StatusBarText("","source-frame-cursor-position");}
+WebInspector.SourceFrame.createSearchRegex=function(query,modifiers)
+{var regex;modifiers=modifiers||"";try{if(/^\/.+\/$/.test(query)){regex=new RegExp(query.substring(1,query.length-1),modifiers);regex.__fromRegExpQuery=true;}}catch(e){}
+if(!regex)
+regex=createPlainTextSearchRegex(query,"i"+modifiers);return regex;}
+WebInspector.SourceFrame.Events={ScrollChanged:"ScrollChanged",SelectionChanged:"SelectionChanged",JumpHappened:"JumpHappened"}
+WebInspector.SourceFrame.prototype={addShortcut:function(key,handler)
+{this._shortcuts[key]=handler;},wasShown:function()
+{this._ensureContentLoaded();this._textEditor.show(this.element);this._editorAttached=true;this._wasShownOrLoaded();},_isEditorShowing:function()
+{return this.isShowing()&&this._editorAttached;},willHide:function()
+{WebInspector.View.prototype.willHide.call(this);this._clearPositionToReveal();},statusBarText:function()
+{return this._sourcePosition.element;},statusBarItems:function()
+{return[];},defaultFocusedElement:function()
+{return this._textEditor.defaultFocusedElement();},get loaded()
+{return this._loaded;},hasContent:function()
+{return true;},get textEditor()
+{return this._textEditor;},_ensureContentLoaded:function()
+{if(!this._contentRequested){this._contentRequested=true;this._contentProvider.requestContent(this.setContent.bind(this));}},addMessage:function(msg)
+{this._messages.push(msg);if(this.loaded)
+this.addMessageToSource(msg.line-1,msg);},clearMessages:function()
+{for(var line in this._messageBubbles){var bubble=this._messageBubbles[line];var lineNumber=parseInt(line,10);this._textEditor.removeDecoration(lineNumber,bubble);}
+this._messages=[];this._rowMessages={};this._messageBubbles={};},revealPosition:function(line,column,shouldHighlight)
+{this._clearLineToScrollTo();this._clearSelectionToSet();this._positionToReveal={line:line,column:column,shouldHighlight:shouldHighlight};this._innerRevealPositionIfNeeded();},_innerRevealPositionIfNeeded:function()
+{if(!this._positionToReveal)
+return;if(!this.loaded||!this._isEditorShowing())
+return;this._textEditor.revealPosition(this._positionToReveal.line,this._positionToReveal.column,this._positionToReveal.shouldHighlight);delete this._positionToReveal;},_clearPositionToReveal:function()
+{this._textEditor.clearPositionHighlight();delete this._positionToReveal;},scrollToLine:function(line)
+{this._clearPositionToReveal();this._lineToScrollTo=line;this._innerScrollToLineIfNeeded();},_innerScrollToLineIfNeeded:function()
+{if(typeof this._lineToScrollTo==="number"){if(this.loaded&&this._isEditorShowing()){this._textEditor.scrollToLine(this._lineToScrollTo);delete this._lineToScrollTo;}}},_clearLineToScrollTo:function()
+{delete this._lineToScrollTo;},selection:function()
+{return this.textEditor.selection();},setSelection:function(textRange)
+{this._selectionToSet=textRange;this._innerSetSelectionIfNeeded();},_innerSetSelectionIfNeeded:function()
+{if(this._selectionToSet&&this.loaded&&this._isEditorShowing()){this._textEditor.setSelection(this._selectionToSet);delete this._selectionToSet;}},_clearSelectionToSet:function()
+{delete this._selectionToSet;},_wasShownOrLoaded:function()
+{this._innerRevealPositionIfNeeded();this._innerSetSelectionIfNeeded();this._innerScrollToLineIfNeeded();},onTextChanged:function(oldRange,newRange)
+{if(this._searchResultsChangedCallback&&!this._isReplacing)
+this._searchResultsChangedCallback();this.clearMessages();},_simplifyMimeType:function(content,mimeType)
+{if(!mimeType)
+return"";if(mimeType.indexOf("javascript")>=0||mimeType.indexOf("jscript")>=0||mimeType.indexOf("ecmascript")>=0)
+return"text/javascript";if(mimeType==="text/x-php"&&content.match(/\<\?.*\?\>/g))
+return"application/x-httpd-php";return mimeType;},setHighlighterType:function(highlighterType)
+{this._highlighterType=highlighterType;this._updateHighlighterType("");},_updateHighlighterType:function(content)
+{this._textEditor.setMimeType(this._simplifyMimeType(content,this._highlighterType));},setContent:function(content)
+{if(!this._loaded){this._loaded=true;this._textEditor.setText(content||"");this._textEditor.markClean();}else{var firstLine=this._textEditor.firstVisibleLine();var selection=this._textEditor.selection();this._textEditor.setText(content||"");this._textEditor.scrollToLine(firstLine);this._textEditor.setSelection(selection);}
+this._updateHighlighterType(content||"");this._textEditor.beginUpdates();this._setTextEditorDecorations();this._wasShownOrLoaded();if(this._delayedFindSearchMatches){this._delayedFindSearchMatches();delete this._delayedFindSearchMatches;}
+this.onTextEditorContentLoaded();this._textEditor.endUpdates();},onTextEditorContentLoaded:function(){},_setTextEditorDecorations:function()
+{this._rowMessages={};this._messageBubbles={};this._textEditor.beginUpdates();this._addExistingMessagesToSource();this._textEditor.endUpdates();},performSearch:function(query,shouldJump,callback,currentMatchChangedCallback,searchResultsChangedCallback)
+{function doFindSearchMatches(query)
+{this._currentSearchResultIndex=-1;this._searchResults=[];var regex=WebInspector.SourceFrame.createSearchRegex(query);this._searchRegex=regex;this._searchResults=this._collectRegexMatches(regex);if(!this._searchResults.length)
+this._textEditor.cancelSearchResultsHighlight();else if(shouldJump)
+this.jumpToNextSearchResult();else
+this._textEditor.highlightSearchResults(regex,null);callback(this,this._searchResults.length);}
+this._resetSearch();this._currentSearchMatchChangedCallback=currentMatchChangedCallback;this._searchResultsChangedCallback=searchResultsChangedCallback;if(this.loaded)
+doFindSearchMatches.call(this,query);else
+this._delayedFindSearchMatches=doFindSearchMatches.bind(this,query);this._ensureContentLoaded();},_editorFocused:function()
+{if(!this._searchResults.length)
+return;this._currentSearchResultIndex=-1;if(this._currentSearchMatchChangedCallback)
+this._currentSearchMatchChangedCallback(this._currentSearchResultIndex);this._textEditor.highlightSearchResults(this._searchRegex,null);},_searchResultAfterSelectionIndex:function(selection)
+{if(!selection)
+return 0;for(var i=0;i<this._searchResults.length;++i){if(this._searchResults[i].compareTo(selection)>=0)
+return i;}
+return 0;},_resetSearch:function()
+{delete this._delayedFindSearchMatches;delete this._currentSearchMatchChangedCallback;delete this._searchResultsChangedCallback;this._currentSearchResultIndex=-1;this._searchResults=[];delete this._searchRegex;},searchCanceled:function()
+{var range=this._currentSearchResultIndex!==-1?this._searchResults[this._currentSearchResultIndex]:null;this._resetSearch();if(!this.loaded)
+return;this._textEditor.cancelSearchResultsHighlight();if(range)
+this._textEditor.setSelection(range);},hasSearchResults:function()
+{return this._searchResults.length>0;},jumpToFirstSearchResult:function()
+{this.jumpToSearchResult(0);},jumpToLastSearchResult:function()
+{this.jumpToSearchResult(this._searchResults.length-1);},jumpToNextSearchResult:function()
+{var currentIndex=this._searchResultAfterSelectionIndex(this._textEditor.selection());var nextIndex=this._currentSearchResultIndex===-1?currentIndex:currentIndex+1;this.jumpToSearchResult(nextIndex);},jumpToPreviousSearchResult:function()
+{var currentIndex=this._searchResultAfterSelectionIndex(this._textEditor.selection());this.jumpToSearchResult(currentIndex-1);},showingFirstSearchResult:function()
+{return this._searchResults.length&&this._currentSearchResultIndex===0;},showingLastSearchResult:function()
+{return this._searchResults.length&&this._currentSearchResultIndex===(this._searchResults.length-1);},get currentSearchResultIndex()
+{return this._currentSearchResultIndex;},jumpToSearchResult:function(index)
+{if(!this.loaded||!this._searchResults.length)
+return;this._currentSearchResultIndex=(index+this._searchResults.length)%this._searchResults.length;if(this._currentSearchMatchChangedCallback)
+this._currentSearchMatchChangedCallback(this._currentSearchResultIndex);this._textEditor.highlightSearchResults(this._searchRegex,this._searchResults[this._currentSearchResultIndex]);},replaceSelectionWith:function(text)
+{var range=this._searchResults[this._currentSearchResultIndex];if(!range)
+return;this._textEditor.highlightSearchResults(this._searchRegex,null);this._isReplacing=true;var newRange=this._textEditor.editRange(range,text);delete this._isReplacing;this._textEditor.setSelection(newRange.collapseToEnd());},replaceAllWith:function(query,replacement)
+{this._textEditor.highlightSearchResults(this._searchRegex,null);var text=this._textEditor.text();var range=this._textEditor.range();var regex=WebInspector.SourceFrame.createSearchRegex(query,"g");if(regex.__fromRegExpQuery)
+text=text.replace(regex,replacement);else
+text=text.replace(regex,function(){return replacement;});this._isReplacing=true;this._textEditor.editRange(range,text);delete this._isReplacing;},_collectRegexMatches:function(regexObject)
+{var ranges=[];for(var i=0;i<this._textEditor.linesCount;++i){var line=this._textEditor.line(i);var offset=0;do{var match=regexObject.exec(line);if(match){if(match[0].length)
+ranges.push(new WebInspector.TextRange(i,offset+match.index,i,offset+match.index+match[0].length));offset+=match.index+1;line=line.substring(match.index+1);}}while(match&&line);}
+return ranges;},_addExistingMessagesToSource:function()
+{var length=this._messages.length;for(var i=0;i<length;++i)
+this.addMessageToSource(this._messages[i].line-1,this._messages[i]);},addMessageToSource:function(lineNumber,msg)
+{if(lineNumber>=this._textEditor.linesCount)
+lineNumber=this._textEditor.linesCount-1;if(lineNumber<0)
+lineNumber=0;var rowMessages=this._rowMessages[lineNumber];if(!rowMessages){rowMessages=[];this._rowMessages[lineNumber]=rowMessages;}
+for(var i=0;i<rowMessages.length;++i){if(rowMessages[i].consoleMessage.isEqual(msg)){rowMessages[i].repeatCount++;this._updateMessageRepeatCount(rowMessages[i]);return;}}
+var rowMessage={consoleMessage:msg};rowMessages.push(rowMessage);this._textEditor.beginUpdates();var messageBubbleElement=this._messageBubbles[lineNumber];if(!messageBubbleElement){messageBubbleElement=document.createElement("div");messageBubbleElement.className="webkit-html-message-bubble";this._messageBubbles[lineNumber]=messageBubbleElement;this._textEditor.addDecoration(lineNumber,messageBubbleElement);}
+var imageElement=document.createElement("div");switch(msg.level){case WebInspector.ConsoleMessage.MessageLevel.Error:messageBubbleElement.classList.add("webkit-html-error-message");imageElement.className="error-icon-small";break;case WebInspector.ConsoleMessage.MessageLevel.Warning:messageBubbleElement.classList.add("webkit-html-warning-message");imageElement.className="warning-icon-small";break;}
+var messageLineElement=document.createElement("div");messageLineElement.className="webkit-html-message-line";messageBubbleElement.appendChild(messageLineElement);messageLineElement.appendChild(imageElement);messageLineElement.appendChild(document.createTextNode(msg.messageText));rowMessage.element=messageLineElement;rowMessage.repeatCount=1;this._updateMessageRepeatCount(rowMessage);this._textEditor.endUpdates();},_updateMessageRepeatCount:function(rowMessage)
+{if(rowMessage.repeatCount<2)
+return;if(!rowMessage.repeatCountElement){var repeatCountElement=document.createElement("span");rowMessage.element.appendChild(repeatCountElement);rowMessage.repeatCountElement=repeatCountElement;}
+rowMessage.repeatCountElement.textContent=WebInspector.UIString(" (repeated %d times)",rowMessage.repeatCount);},removeMessageFromSource:function(lineNumber,msg)
+{if(lineNumber>=this._textEditor.linesCount)
+lineNumber=this._textEditor.linesCount-1;if(lineNumber<0)
+lineNumber=0;var rowMessages=this._rowMessages[lineNumber];for(var i=0;rowMessages&&i<rowMessages.length;++i){var rowMessage=rowMessages[i];if(rowMessage.consoleMessage!==msg)
+continue;var messageLineElement=rowMessage.element;var messageBubbleElement=messageLineElement.parentElement;messageBubbleElement.removeChild(messageLineElement);rowMessages.remove(rowMessage);if(!rowMessages.length)
+delete this._rowMessages[lineNumber];if(!messageBubbleElement.childElementCount){this._textEditor.removeDecoration(lineNumber,messageBubbleElement);delete this._messageBubbles[lineNumber];}
+break;}},populateLineGutterContextMenu:function(contextMenu,lineNumber)
+{},populateTextAreaContextMenu:function(contextMenu,lineNumber)
+{},onJumpToPosition:function(from,to)
+{this.dispatchEventToListeners(WebInspector.SourceFrame.Events.JumpHappened,{from:from,to:to});},inheritScrollPositions:function(sourceFrame)
+{this._textEditor.inheritScrollPositions(sourceFrame._textEditor);},canEditSource:function()
+{return false;},selectionChanged:function(textRange)
+{this._updateSourcePosition(textRange);this.dispatchEventToListeners(WebInspector.SourceFrame.Events.SelectionChanged,textRange);WebInspector.notifications.dispatchEventToListeners(WebInspector.SourceFrame.Events.SelectionChanged,textRange);},_updateSourcePosition:function(textRange)
+{if(!textRange)
+return;if(textRange.isEmpty()){this._sourcePosition.setText(WebInspector.UIString("Line %d, Column %d",textRange.endLine+1,textRange.endColumn+1));return;}
+textRange=textRange.normalize();var selectedText=this._textEditor.copyRange(textRange);if(textRange.startLine===textRange.endLine)
+this._sourcePosition.setText(WebInspector.UIString("%d characters selected",selectedText.length));else
+this._sourcePosition.setText(WebInspector.UIString("%d lines, %d characters selected",textRange.endLine-textRange.startLine+1,selectedText.length));},scrollChanged:function(lineNumber)
+{this.dispatchEventToListeners(WebInspector.SourceFrame.Events.ScrollChanged,lineNumber);},_handleKeyDown:function(e)
+{var shortcutKey=WebInspector.KeyboardShortcut.makeKeyFromEvent(e);var handler=this._shortcuts[shortcutKey];if(handler&&handler())
+e.consume(true);},__proto__:WebInspector.VBox.prototype}
+WebInspector.TextEditorDelegateForSourceFrame=function(sourceFrame)
+{this._sourceFrame=sourceFrame;}
+WebInspector.TextEditorDelegateForSourceFrame.prototype={onTextChanged:function(oldRange,newRange)
+{this._sourceFrame.onTextChanged(oldRange,newRange);},selectionChanged:function(textRange)
+{this._sourceFrame.selectionChanged(textRange);},scrollChanged:function(lineNumber)
+{this._sourceFrame.scrollChanged(lineNumber);},editorFocused:function()
+{this._sourceFrame._editorFocused();},populateLineGutterContextMenu:function(contextMenu,lineNumber)
+{this._sourceFrame.populateLineGutterContextMenu(contextMenu,lineNumber);},populateTextAreaContextMenu:function(contextMenu,lineNumber)
+{this._sourceFrame.populateTextAreaContextMenu(contextMenu,lineNumber);},createLink:function(hrefValue,isExternal)
+{var targetLocation=WebInspector.ParsedURL.completeURL(this._sourceFrame._url,hrefValue);return WebInspector.linkifyURLAsNode(targetLocation||hrefValue,hrefValue,undefined,isExternal);},onJumpToPosition:function(from,to)
+{this._sourceFrame.onJumpToPosition(from,to);}}
+WebInspector.ResourceView=function(resource)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("resourceView.css");this.element.classList.add("resource-view");this.resource=resource;}
+WebInspector.ResourceView.prototype={hasContent:function()
+{return false;},__proto__:WebInspector.VBox.prototype}
+WebInspector.ResourceView.hasTextContent=function(resource)
+{if(resource.type.isTextType())
+return true;if(resource.type===WebInspector.resourceTypes.Other)
+return!!resource.content&&!resource.contentEncoded;return false;}
+WebInspector.ResourceView.nonSourceViewForResource=function(resource)
+{switch(resource.type){case WebInspector.resourceTypes.Image:return new WebInspector.ImageView(resource);case WebInspector.resourceTypes.Font:return new WebInspector.FontView(resource);default:return new WebInspector.ResourceView(resource);}}
+WebInspector.ResourceSourceFrame=function(resource)
+{this._resource=resource;WebInspector.SourceFrame.call(this,resource);}
+WebInspector.ResourceSourceFrame.prototype={get resource()
+{return this._resource;},populateTextAreaContextMenu:function(contextMenu,lineNumber)
+{contextMenu.appendApplicableItems(this._resource);},__proto__:WebInspector.SourceFrame.prototype}
+WebInspector.ResourceSourceFrameFallback=function(resource)
+{WebInspector.VBox.call(this);this._resource=resource;this.element.classList.add("script-view");this._content=this.element.createChild("div","script-view-fallback monospace");}
+WebInspector.ResourceSourceFrameFallback.prototype={wasShown:function()
+{if(!this._contentRequested){this._contentRequested=true;this._resource.requestContent(this._contentLoaded.bind(this));}},_contentLoaded:function(content)
+{this._content.textContent=content;},__proto__:WebInspector.VBox.prototype}
+WebInspector.FontView=function(resource)
+{WebInspector.ResourceView.call(this,resource);this.element.classList.add("font");}
+WebInspector.FontView._fontPreviewLines=["ABCDEFGHIJKLM","NOPQRSTUVWXYZ","abcdefghijklm","nopqrstuvwxyz","1234567890"];WebInspector.FontView._fontId=0;WebInspector.FontView._measureFontSize=50;WebInspector.FontView.prototype={hasContent:function()
+{return true;},_createContentIfNeeded:function()
+{if(this.fontPreviewElement)
+return;var uniqueFontName="WebInspectorFontPreview"+(++WebInspector.FontView._fontId);this.fontStyleElement=document.createElement("style");this.fontStyleElement.textContent="@font-face { font-family: \""+uniqueFontName+"\"; src: url("+this.resource.url+"); }";document.head.appendChild(this.fontStyleElement);var fontPreview=document.createElement("div");for(var i=0;i<WebInspector.FontView._fontPreviewLines.length;++i){if(i>0)
+fontPreview.appendChild(document.createElement("br"));fontPreview.appendChild(document.createTextNode(WebInspector.FontView._fontPreviewLines[i]));}
+this.fontPreviewElement=fontPreview.cloneNode(true);this.fontPreviewElement.style.setProperty("font-family",uniqueFontName);this.fontPreviewElement.style.setProperty("visibility","hidden");this._dummyElement=fontPreview;this._dummyElement.style.visibility="hidden";this._dummyElement.style.zIndex="-1";this._dummyElement.style.display="inline";this._dummyElement.style.position="absolute";this._dummyElement.style.setProperty("font-family",uniqueFontName);this._dummyElement.style.setProperty("font-size",WebInspector.FontView._measureFontSize+"px");this.element.appendChild(this.fontPreviewElement);},wasShown:function()
+{this._createContentIfNeeded();this.updateFontPreviewSize();},onResize:function()
+{if(this._inResize)
+return;this._inResize=true;try{this.updateFontPreviewSize();}finally{delete this._inResize;}},_measureElement:function()
+{this.element.appendChild(this._dummyElement);var result={width:this._dummyElement.offsetWidth,height:this._dummyElement.offsetHeight};this.element.removeChild(this._dummyElement);return result;},updateFontPreviewSize:function()
+{if(!this.fontPreviewElement||!this.isShowing())
+return;this.fontPreviewElement.style.removeProperty("visibility");var dimension=this._measureElement();const height=dimension.height;const width=dimension.width;const containerWidth=this.element.offsetWidth-50;const containerHeight=this.element.offsetHeight-30;if(!height||!width||!containerWidth||!containerHeight){this.fontPreviewElement.style.removeProperty("font-size");return;}
+var widthRatio=containerWidth/width;var heightRatio=containerHeight/height;var finalFontSize=Math.floor(WebInspector.FontView._measureFontSize*Math.min(widthRatio,heightRatio))-2;this.fontPreviewElement.style.setProperty("font-size",finalFontSize+"px",null);},__proto__:WebInspector.ResourceView.prototype}
+WebInspector.ImageView=function(resource)
+{WebInspector.ResourceView.call(this,resource);this.element.classList.add("image");}
+WebInspector.ImageView.prototype={hasContent:function()
+{return true;},wasShown:function()
+{this._createContentIfNeeded();},_createContentIfNeeded:function()
+{if(this._container)
+return;var imageContainer=document.createElement("div");imageContainer.className="image";this.element.appendChild(imageContainer);var imagePreviewElement=document.createElement("img");imagePreviewElement.classList.add("resource-image-view");imageContainer.appendChild(imagePreviewElement);imagePreviewElement.addEventListener("contextmenu",this._contextMenu.bind(this),true);this._container=document.createElement("div");this._container.className="info";this.element.appendChild(this._container);var imageNameElement=document.createElement("h1");imageNameElement.className="title";imageNameElement.textContent=this.resource.displayName;this._container.appendChild(imageNameElement);var infoListElement=document.createElement("dl");infoListElement.className="infoList";this.resource.populateImageSource(imagePreviewElement);function onImageLoad()
+{var content=this.resource.content;if(content)
+var resourceSize=this._base64ToSize(content);else
+var resourceSize=this.resource.resourceSize;var imageProperties=[{name:WebInspector.UIString("Dimensions"),value:WebInspector.UIString("%d × %d",imagePreviewElement.naturalWidth,imagePreviewElement.naturalHeight)},{name:WebInspector.UIString("File size"),value:Number.bytesToString(resourceSize)},{name:WebInspector.UIString("MIME type"),value:this.resource.mimeType}];infoListElement.removeChildren();for(var i=0;i<imageProperties.length;++i){var dt=document.createElement("dt");dt.textContent=imageProperties[i].name;infoListElement.appendChild(dt);var dd=document.createElement("dd");dd.textContent=imageProperties[i].value;infoListElement.appendChild(dd);}
+var dt=document.createElement("dt");dt.textContent=WebInspector.UIString("URL");infoListElement.appendChild(dt);var dd=document.createElement("dd");var externalResource=true;dd.appendChild(WebInspector.linkifyURLAsNode(this.resource.url,undefined,undefined,externalResource));infoListElement.appendChild(dd);this._container.appendChild(infoListElement);}
+imagePreviewElement.addEventListener("load",onImageLoad.bind(this),false);this._imagePreviewElement=imagePreviewElement;},_base64ToSize:function(content)
+{if(!content.length)
+return 0;var size=(content.length||0)*3/4;if(content.length>0&&content[content.length-1]==="=")
+size--;if(content.length>1&&content[content.length-2]==="=")
+size--;return size;},_contextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy image URL":"Copy Image URL"),this._copyImageURL.bind(this));if(this._imagePreviewElement.src)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy image as Data URL":"Copy Image As Data URL"),this._copyImageAsDataURL.bind(this));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Open image in new tab":"Open Image in New Tab"),this._openInNewTab.bind(this));contextMenu.show();},_copyImageAsDataURL:function()
+{InspectorFrontendHost.copyText(this._imagePreviewElement.src);},_copyImageURL:function()
+{InspectorFrontendHost.copyText(this.resource.url);},_openInNewTab:function()
+{InspectorFrontendHost.openInNewTab(this.resource.url);},__proto__:WebInspector.ResourceView.prototype}
+WebInspector.SplitView=function(isVertical,secondIsSidebar,settingName,defaultSidebarWidth,defaultSidebarHeight)
+{WebInspector.View.call(this);this.registerRequiredCSS("splitView.css");this.element.classList.add("split-view");this._mainView=new WebInspector.VBox();this._mainView.makeLayoutBoundary();this._mainElement=this._mainView.element;this._mainElement.className="split-view-contents scroll-target split-view-main vbox";this._sidebarView=new WebInspector.VBox();this._sidebarView.makeLayoutBoundary();this._sidebarElement=this._sidebarView.element;this._sidebarElement.className="split-view-contents scroll-target split-view-sidebar vbox";this._resizerElement=this.element.createChild("div","split-view-resizer");this._resizerElement.createChild("div","split-view-resizer-border");if(secondIsSidebar){this._mainView.show(this.element);this._sidebarView.show(this.element);}else{this._sidebarView.show(this.element);this._mainView.show(this.element);}
+this._onDragStartBound=this._onDragStart.bind(this);this._resizerElements=[];this._resizable=true;this._defaultSidebarWidth=defaultSidebarWidth||200;this._defaultSidebarHeight=defaultSidebarHeight||this._defaultSidebarWidth;this._settingName=settingName;this.setSecondIsSidebar(secondIsSidebar);this._innerSetVertical(isVertical);this._showMode=WebInspector.SplitView.ShowMode.Both;this.installResizer(this._resizerElement);}
+WebInspector.SplitView.SettingForOrientation;WebInspector.SplitView.ShowMode={Both:"Both",OnlyMain:"OnlyMain",OnlySidebar:"OnlySidebar"}
+WebInspector.SplitView.Events={SidebarSizeChanged:"SidebarSizeChanged",ShowModeChanged:"ShowModeChanged"}
+WebInspector.SplitView.MinPadding=20;WebInspector.SplitView.prototype={isVertical:function()
+{return this._isVertical;},setVertical:function(isVertical)
+{if(this._isVertical===isVertical)
+return;this._innerSetVertical(isVertical);if(this.isShowing())
+this._updateLayout();},_innerSetVertical:function(isVertical)
+{this.element.classList.remove(this._isVertical?"hbox":"vbox");this._isVertical=isVertical;this.element.classList.add(this._isVertical?"hbox":"vbox");delete this._resizerElementSize;this._sidebarSize=-1;this._restoreSidebarSizeFromSettings();if(this._shouldSaveShowMode)
+this._restoreAndApplyShowModeFromSettings();this._updateShowHideSidebarButton();this._updateResizersClass();this.invalidateMinimumSize();},_updateLayout:function(animate)
+{delete this._totalSize;this._innerSetSidebarSize(this._preferredSidebarSize(),!!animate);},mainElement:function()
+{return this._mainElement;},sidebarElement:function()
+{return this._sidebarElement;},isSidebarSecond:function()
+{return this._secondIsSidebar;},enableShowModeSaving:function()
+{this._shouldSaveShowMode=true;this._restoreAndApplyShowModeFromSettings();},showMode:function()
+{return this._showMode;},setSecondIsSidebar:function(secondIsSidebar)
+{this._mainElement.classList.toggle("split-view-contents-first",secondIsSidebar);this._mainElement.classList.toggle("split-view-contents-second",!secondIsSidebar);this._sidebarElement.classList.toggle("split-view-contents-first",!secondIsSidebar);this._sidebarElement.classList.toggle("split-view-contents-second",secondIsSidebar);if(secondIsSidebar){if(this._sidebarElement.parentElement&&this._sidebarElement.nextSibling)
+this.element.appendChild(this._sidebarElement);}else{if(this._mainElement.parentElement&&this._mainElement.nextSibling)
+this.element.appendChild(this._mainElement);}
+this._secondIsSidebar=secondIsSidebar;},sidebarSide:function()
+{if(this._showMode!==WebInspector.SplitView.ShowMode.Both)
+return null;return this._isVertical?(this._secondIsSidebar?"right":"left"):(this._secondIsSidebar?"bottom":"top");},preferredSidebarSize:function()
+{return this._preferredSidebarSize();},resizerElement:function()
+{return this._resizerElement;},hideMain:function(animate)
+{this._showOnly(this._sidebarView,this._mainView,animate);this._updateShowMode(WebInspector.SplitView.ShowMode.OnlySidebar);},hideSidebar:function(animate)
+{this._showOnly(this._mainView,this._sidebarView,animate);this._updateShowMode(WebInspector.SplitView.ShowMode.OnlyMain);},detachChildViews:function()
+{this._mainView.detachChildViews();this._sidebarView.detachChildViews();},_showOnly:function(sideToShow,sideToHide,animate)
+{this._cancelAnimation();function callback()
+{sideToShow.show(this.element);sideToHide.detach();sideToShow.element.classList.add("maximized");sideToHide.element.classList.remove("maximized");this._resizerElement.classList.add("hidden");this._removeAllLayoutProperties();}
+if(animate){this._animate(true,callback.bind(this));}else{callback.call(this);this.doResize();}
+this._sidebarSize=-1;this.setResizable(false);},_removeAllLayoutProperties:function()
+{this._sidebarElement.style.removeProperty("flexBasis");this._resizerElement.style.removeProperty("left");this._resizerElement.style.removeProperty("right");this._resizerElement.style.removeProperty("top");this._resizerElement.style.removeProperty("bottom");this._resizerElement.style.removeProperty("margin-left");this._resizerElement.style.removeProperty("margin-right");this._resizerElement.style.removeProperty("margin-top");this._resizerElement.style.removeProperty("margin-bottom");},showBoth:function(animate)
+{if(this._showMode===WebInspector.SplitView.ShowMode.Both)
+animate=false;this._cancelAnimation();this._mainElement.classList.remove("maximized");this._sidebarElement.classList.remove("maximized");this._resizerElement.classList.remove("hidden");this._mainView.show(this.element);this._sidebarView.show(this.element);this.setSecondIsSidebar(this._secondIsSidebar);this._sidebarSize=-1;this.setResizable(true);this._updateShowMode(WebInspector.SplitView.ShowMode.Both);this._updateLayout(animate);},setResizable:function(resizable)
+{this._resizable=resizable;this._updateResizersClass();},setSidebarSize:function(size)
+{this._savedSidebarSize=size;this._saveSetting();this._innerSetSidebarSize(size,false);},sidebarSize:function()
+{return Math.max(0,this._sidebarSize);},totalSize:function()
+{if(!this._totalSize)
+this._totalSize=this._isVertical?this.element.offsetWidth:this.element.offsetHeight;return this._totalSize*WebInspector.zoomManager.zoomFactor();},_updateShowMode:function(showMode)
+{this._showMode=showMode;this._saveShowModeToSettings();this._updateShowHideSidebarButton();this.dispatchEventToListeners(WebInspector.SplitView.Events.ShowModeChanged,showMode);this.invalidateMinimumSize();},_innerSetSidebarSize:function(size,animate)
+{if(this._showMode!==WebInspector.SplitView.ShowMode.Both||!this.isShowing())
+return;size=this._applyConstraints(size);if(this._sidebarSize===size)
+return;this._removeAllLayoutProperties();var sizeValue=(size/WebInspector.zoomManager.zoomFactor())+"px";this.sidebarElement().style.flexBasis=sizeValue;if(!this._resizerElementSize)
+this._resizerElementSize=this._isVertical?this._resizerElement.offsetWidth:this._resizerElement.offsetHeight;if(this._isVertical){if(this._secondIsSidebar){this._resizerElement.style.right=sizeValue;this._resizerElement.style.marginRight=-this._resizerElementSize/2+"px";}else{this._resizerElement.style.left=sizeValue;this._resizerElement.style.marginLeft=-this._resizerElementSize/2+"px";}}else{if(this._secondIsSidebar){this._resizerElement.style.bottom=sizeValue;this._resizerElement.style.marginBottom=-this._resizerElementSize/2+"px";}else{this._resizerElement.style.top=sizeValue;this._resizerElement.style.marginTop=-this._resizerElementSize/2+"px";}}
+this._sidebarSize=size;if(animate){this._animate(false);}else{this.doResize();this.dispatchEventToListeners(WebInspector.SplitView.Events.SidebarSizeChanged,this.sidebarSize());}},_animate:function(reverse,callback)
+{var animationTime=50;this._animationCallback=callback;var animatedMarginPropertyName;if(this._isVertical)
+animatedMarginPropertyName=this._secondIsSidebar?"margin-right":"margin-left";else
+animatedMarginPropertyName=this._secondIsSidebar?"margin-bottom":"margin-top";var zoomFactor=WebInspector.zoomManager.zoomFactor();var marginFrom=reverse?"0":"-"+(this._sidebarSize/zoomFactor)+"px";var marginTo=reverse?"-"+(this._sidebarSize/zoomFactor)+"px":"0";this.element.style.setProperty(animatedMarginPropertyName,marginFrom);if(!reverse){suppressUnused(this._mainElement.offsetWidth);suppressUnused(this._sidebarElement.offsetWidth);}
+if(!reverse)
+this._sidebarView.doResize();this.element.style.setProperty("transition",animatedMarginPropertyName+" "+animationTime+"ms linear");var boundAnimationFrame;var startTime;function animationFrame()
+{delete this._animationFrameHandle;if(!startTime){this.element.style.setProperty(animatedMarginPropertyName,marginTo);startTime=window.performance.now();}else if(window.performance.now()<startTime+animationTime){this._mainView.doResize();}else{this._cancelAnimation();this._mainView.doResize();this.dispatchEventToListeners(WebInspector.SplitView.Events.SidebarSizeChanged,this.sidebarSize());return;}
+this._animationFrameHandle=window.requestAnimationFrame(boundAnimationFrame);}
+boundAnimationFrame=animationFrame.bind(this);this._animationFrameHandle=window.requestAnimationFrame(boundAnimationFrame);},_cancelAnimation:function()
+{this.element.style.removeProperty("margin-top");this.element.style.removeProperty("margin-right");this.element.style.removeProperty("margin-bottom");this.element.style.removeProperty("margin-left");this.element.style.removeProperty("transition");if(this._animationFrameHandle){window.cancelAnimationFrame(this._animationFrameHandle);delete this._animationFrameHandle;}
+if(this._animationCallback){this._animationCallback();delete this._animationCallback;}},_applyConstraints:function(sidebarSize)
+{var totalSize=this.totalSize();var size=this._sidebarView.minimumSize();var from=this.isVertical()?size.width:size.height;if(!from)
+from=WebInspector.SplitView.MinPadding;size=this._mainView.minimumSize();var minMainSize=this.isVertical()?size.width:size.height;if(!minMainSize)
+minMainSize=WebInspector.SplitView.MinPadding;var to=totalSize-minMainSize;if(from<=to)
+return Number.constrain(sidebarSize,from,to);return Math.max(0,to);},wasShown:function()
+{this._forceUpdateLayout();WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._onZoomChanged,this);},willHide:function()
+{WebInspector.zoomManager.removeEventListener(WebInspector.ZoomManager.Events.ZoomChanged,this._onZoomChanged,this);},onResize:function()
+{this._updateLayout();},onLayout:function()
+{this._updateLayout();},calculateMinimumSize:function()
+{if(this._showMode===WebInspector.SplitView.ShowMode.OnlyMain)
+return this._mainView.minimumSize();if(this._showMode===WebInspector.SplitView.ShowMode.OnlySidebar)
+return this._sidebarView.minimumSize();var mainSize=this._mainView.minimumSize();var sidebarSize=this._sidebarView.minimumSize();var min=WebInspector.SplitView.MinPadding;if(this._isVertical)
+return new Size((mainSize.width||min)+(sidebarSize.width||min),Math.max(mainSize.height,sidebarSize.height));else
+return new Size(Math.max(mainSize.width,sidebarSize.width),(mainSize.height||min)+(sidebarSize.height||min));},_startResizerDragging:function(event)
+{if(!this._resizable)
+return false;var dipEventPosition=(this._isVertical?event.pageX:event.pageY)*WebInspector.zoomManager.zoomFactor();this._dragOffset=(this._secondIsSidebar?this.totalSize()-this._sidebarSize:this._sidebarSize)-dipEventPosition;return true;},_resizerDragging:function(event)
+{var dipEventPosition=(this._isVertical?event.pageX:event.pageY)*WebInspector.zoomManager.zoomFactor();var newOffset=dipEventPosition+this._dragOffset;var newSize=(this._secondIsSidebar?this.totalSize()-newOffset:newOffset);var constrainedSize=this._applyConstraints(newSize);this._savedSidebarSize=constrainedSize;this._saveSetting();this._innerSetSidebarSize(constrainedSize,false);event.preventDefault();},_endResizerDragging:function(event)
+{delete this._dragOffset;},hideDefaultResizer:function()
+{this.uninstallResizer(this._resizerElement);},installResizer:function(resizerElement)
+{resizerElement.addEventListener("mousedown",this._onDragStartBound,false);resizerElement.classList.toggle("ew-resizer-widget",this._isVertical&&this._resizable);resizerElement.classList.toggle("ns-resizer-widget",!this._isVertical&&this._resizable);if(this._resizerElements.indexOf(resizerElement)===-1)
+this._resizerElements.push(resizerElement);},uninstallResizer:function(resizerElement)
+{resizerElement.removeEventListener("mousedown",this._onDragStartBound,false);resizerElement.classList.remove("ew-resizer-widget");resizerElement.classList.remove("ns-resizer-widget");this._resizerElements.remove(resizerElement);},hasCustomResizer:function()
+{return this._resizerElements.length>1||(this._resizerElements.length==1&&this._resizerElements[0]!==this._resizerElement);},toggleResizer:function(resizer,on)
+{if(on)
+this.installResizer(resizer);else
+this.uninstallResizer(resizer);},_updateResizersClass:function()
+{for(var i=0;i<this._resizerElements.length;++i){this._resizerElements[i].classList.toggle("ew-resizer-widget",this._isVertical&&this._resizable);this._resizerElements[i].classList.toggle("ns-resizer-widget",!this._isVertical&&this._resizable);}},_onDragStart:function(event)
+{if(this._resizerElements.indexOf(event.target)===-1)
+return;WebInspector.elementDragStart(this._startResizerDragging.bind(this),this._resizerDragging.bind(this),this._endResizerDragging.bind(this),this._isVertical?"ew-resize":"ns-resize",event);},_setting:function()
+{if(!this._settingName)
+return null;if(!WebInspector.settings[this._settingName])
+WebInspector.settings[this._settingName]=WebInspector.settings.createSetting(this._settingName,{});return WebInspector.settings[this._settingName];},_settingForOrientation:function()
+{var state=this._setting()?this._setting().get():{};return this._isVertical?state.vertical:state.horizontal;},_preferredSidebarSize:function()
+{var size=this._savedSidebarSize;if(!size){size=this._isVertical?this._defaultSidebarWidth:this._defaultSidebarHeight;if(0<size&&size<1)
+size*=this.totalSize();}
+return size;},_restoreSidebarSizeFromSettings:function()
+{var settingForOrientation=this._settingForOrientation();this._savedSidebarSize=settingForOrientation?settingForOrientation.size:0;},_restoreAndApplyShowModeFromSettings:function()
+{var orientationState=this._settingForOrientation();this._savedShowMode=orientationState?orientationState.showMode:WebInspector.SplitView.ShowMode.Both;this._showMode=this._savedShowMode;switch(this._savedShowMode){case WebInspector.SplitView.ShowMode.Both:this.showBoth();break;case WebInspector.SplitView.ShowMode.OnlyMain:this.hideSidebar();break;case WebInspector.SplitView.ShowMode.OnlySidebar:this.hideMain();break;}},_saveShowModeToSettings:function()
+{this._savedShowMode=this._showMode;this._saveSetting();},_saveSetting:function()
+{var setting=this._setting();if(!setting)
+return;var state=setting.get();var orientationState=(this._isVertical?state.vertical:state.horizontal)||{};orientationState.size=this._savedSidebarSize;if(this._shouldSaveShowMode)
+orientationState.showMode=this._savedShowMode;if(this._isVertical)
+state.vertical=orientationState;else
+state.horizontal=orientationState;setting.set(state);},_forceUpdateLayout:function()
+{this._sidebarSize=-1;this._updateLayout();},_onZoomChanged:function(event)
+{this._forceUpdateLayout();},createShowHideSidebarButton:function(title,className)
+{console.assert(this.isVertical(),"Buttons for split view with horizontal split are not supported yet.");this._showHideSidebarButtonTitle=WebInspector.UIString(title);this._showHideSidebarButton=new WebInspector.StatusBarButton("","sidebar-show-hide-button "+className,3);this._showHideSidebarButton.addEventListener("click",buttonClicked.bind(this));this._updateShowHideSidebarButton();function buttonClicked(event)
+{if(this._showMode!==WebInspector.SplitView.ShowMode.Both)
+this.showBoth(true);else
+this.hideSidebar(true);}
+return this._showHideSidebarButton;},_updateShowHideSidebarButton:function()
+{if(!this._showHideSidebarButton)
+return;var sidebarHidden=this._showMode===WebInspector.SplitView.ShowMode.OnlyMain;this._showHideSidebarButton.state=sidebarHidden?"show":"hide";this._showHideSidebarButton.element.classList.toggle("top-sidebar-show-hide-button",!this.isVertical()&&!this.isSidebarSecond());this._showHideSidebarButton.element.classList.toggle("right-sidebar-show-hide-button",this.isVertical()&&this.isSidebarSecond());this._showHideSidebarButton.element.classList.toggle("bottom-sidebar-show-hide-button",!this.isVertical()&&this.isSidebarSecond());this._showHideSidebarButton.element.classList.toggle("left-sidebar-show-hide-button",this.isVertical()&&!this.isSidebarSecond());this._showHideSidebarButton.title=sidebarHidden?WebInspector.UIString("Show %s",this._showHideSidebarButtonTitle):WebInspector.UIString("Hide %s",this._showHideSidebarButtonTitle);},__proto__:WebInspector.View.prototype}
+WebInspector.StackView=function(isVertical)
+{WebInspector.VBox.call(this);this._isVertical=isVertical;this._currentSplitView=null;}
+WebInspector.StackView.prototype={appendView:function(view,sidebarSizeSettingName,defaultSidebarWidth,defaultSidebarHeight)
+{var splitView=new WebInspector.SplitView(this._isVertical,true,sidebarSizeSettingName,defaultSidebarWidth,defaultSidebarHeight);view.show(splitView.mainElement());splitView.hideSidebar();if(!this._currentSplitView){splitView.show(this.element);}else{splitView.show(this._currentSplitView.sidebarElement());this._currentSplitView.showBoth();}
+this._currentSplitView=splitView;return splitView;},detachChildViews:function()
+{WebInspector.View.prototype.detachChildViews.call(this);this._currentSplitView=null;},__proto__:WebInspector.VBox.prototype}
+WebInspector.ExtensionServerAPI=function(){}
+WebInspector.ExtensionServerAPI.prototype={addExtensions:function(descriptors){}}
+WebInspector.ExtensionServerProxy=function()
+{}
+WebInspector.ExtensionServerProxy._ensureExtensionServer=function()
+{if(!WebInspector.extensionServer)
+WebInspector.extensionServer=WebInspector.moduleManager.instance(WebInspector.ExtensionServerAPI);},WebInspector.ExtensionServerProxy.prototype={setFrontendReady:function()
+{this._frontendReady=true;this._pushExtensionsToServer();},_addExtensions:function(extensions)
+{if(extensions.length===0)
+return;console.assert(!this._pendingExtensions);this._pendingExtensions=extensions;this._pushExtensionsToServer();},_pushExtensionsToServer:function()
+{if(!this._frontendReady||!this._pendingExtensions)
+return;WebInspector.ExtensionServerProxy._ensureExtensionServer();WebInspector.extensionServer.addExtensions(this._pendingExtensions);delete this._pendingExtensions;}}
+WebInspector.extensionServerProxy=new WebInspector.ExtensionServerProxy();WebInspector.addExtensions=function(extensions)
+{WebInspector.extensionServerProxy._addExtensions(extensions);}
+WebInspector.setInspectedTabId=function(tabId)
+{WebInspector._inspectedTabId=tabId;}
+WebInspector.EmptyView=function(text)
+{WebInspector.VBox.call(this);this._text=text;}
+WebInspector.EmptyView.prototype={wasShown:function()
+{this.element.classList.add("empty-view");this.element.textContent=this._text;},set text(text)
+{this._text=text;if(this.isShowing())
+this.element.textContent=this._text;},__proto__:WebInspector.VBox.prototype}
+window.requestFileSystem=window.requestFileSystem||window.webkitRequestFileSystem;WebInspector.TempFile=function(dirPath,name,callback)
+{this._fileEntry=null;this._writer=null;function didInitFs(fs)
+{fs.root.getDirectory(dirPath,{create:true},didGetDir.bind(this),errorHandler);}
+function didGetDir(dir)
+{dir.getFile(name,{create:true},didCreateFile.bind(this),errorHandler);}
+function didCreateFile(fileEntry)
+{this._fileEntry=fileEntry;fileEntry.createWriter(didCreateWriter.bind(this),errorHandler);}
+function didCreateWriter(writer)
+{function didTruncate(e)
+{this._writer=writer;writer.onwrite=null;writer.onerror=null;callback(this);}
+function onTruncateError(e)
+{WebInspector.console.log("Failed to truncate temp file "+e.code+" : "+e.message,WebInspector.ConsoleMessage.MessageLevel.Error);callback(null);}
+if(writer.length){writer.onwrite=didTruncate.bind(this);writer.onerror=onTruncateError;writer.truncate(0);}else{this._writer=writer;callback(this);}}
+function errorHandler(e)
+{WebInspector.console.log("Failed to create temp file "+e.code+" : "+e.message,WebInspector.ConsoleMessage.MessageLevel.Error);callback(null);}
+function didClearTempStorage()
+{window.requestFileSystem(window.TEMPORARY,10,didInitFs.bind(this),errorHandler);}
+WebInspector.TempFile._ensureTempStorageCleared(didClearTempStorage.bind(this));}
+WebInspector.TempFile.prototype={write:function(data,callback)
+{var blob=new Blob([data],{type:'text/plain'});this._writer.onerror=function(e)
+{WebInspector.console.log("Failed to write into a temp file: "+e.message,WebInspector.ConsoleMessage.MessageLevel.Error);callback(false);}
+this._writer.onwrite=function(e)
+{callback(true);}
+this._writer.write(blob);},finishWriting:function()
+{this._writer=null;},read:function(callback)
+{function didGetFile(file)
+{var reader=new FileReader();reader.onloadend=function(e)
+{callback((this.result));}
+reader.onerror=function(error)
+{WebInspector.console.log("Failed to read from temp file: "+error.message,WebInspector.ConsoleMessage.MessageLevel.Error);}
+reader.readAsText(file);}
+function didFailToGetFile(error)
+{WebInspector.console.log("Failed to load temp file: "+error.message,WebInspector.ConsoleMessage.MessageLevel.Error);callback(null);}
+this._fileEntry.file(didGetFile,didFailToGetFile);},writeToOutputSteam:function(outputStream,delegate)
+{function didGetFile(file)
+{var reader=new WebInspector.ChunkedFileReader(file,10*1000*1000,delegate);reader.start(outputStream);}
+function didFailToGetFile(error)
+{WebInspector.console.log("Failed to load temp file: "+error.message,WebInspector.ConsoleMessage.MessageLevel.Error);outputStream.close();}
+this._fileEntry.file(didGetFile,didFailToGetFile);},remove:function()
+{if(this._fileEntry)
+this._fileEntry.remove(function(){});}}
+WebInspector.BufferedTempFileWriter=function(dirPath,name)
+{this._chunks=[];this._tempFile=null;this._isWriting=false;this._finishCallback=null;this._isFinished=false;new WebInspector.TempFile(dirPath,name,this._didCreateTempFile.bind(this));}
+WebInspector.BufferedTempFileWriter.prototype={write:function(data)
+{if(!this._chunks)
+return;if(this._finishCallback)
+throw new Error("Now writes are allowed after close.");this._chunks.push(data);if(this._tempFile&&!this._isWriting)
+this._writeNextChunk();},close:function(callback)
+{this._finishCallback=callback;if(this._isFinished)
+callback(this._tempFile);else if(!this._isWriting&&!this._chunks.length)
+this._notifyFinished();},_didCreateTempFile:function(tempFile)
+{this._tempFile=tempFile;if(!tempFile){this._chunks=null;this._notifyFinished();return;}
+if(this._chunks.length)
+this._writeNextChunk();},_writeNextChunk:function()
+{var chunkSize=0;var endIndex=0;for(;endIndex<this._chunks.length;endIndex++){chunkSize+=this._chunks[endIndex].length;if(chunkSize>10*1000*1000)
+break;}
+var chunk=this._chunks.slice(0,endIndex+1).join("");this._chunks.splice(0,endIndex+1);this._isWriting=true;this._tempFile.write(chunk,this._didWriteChunk.bind(this));},_didWriteChunk:function(success)
+{this._isWriting=false;if(!success){this._tempFile=null;this._chunks=null;this._notifyFinished();return;}
+if(this._chunks.length)
+this._writeNextChunk();else if(this._finishCallback)
+this._notifyFinished();},_notifyFinished:function()
+{this._isFinished=true;if(this._tempFile)
+this._tempFile.finishWriting();if(this._finishCallback)
+this._finishCallback(this._tempFile);}}
+WebInspector.TempStorageCleaner=function()
+{this._worker=new SharedWorker("TempStorageSharedWorker.js","TempStorage");this._callbacks=[];this._worker.port.onmessage=this._handleMessage.bind(this);this._worker.port.onerror=this._handleError.bind(this);}
+WebInspector.TempStorageCleaner.prototype={ensureStorageCleared:function(callback)
+{if(this._callbacks)
+this._callbacks.push(callback);else
+callback();},_handleMessage:function(event)
+{if(event.data.type==="tempStorageCleared"){if(event.data.error)
+WebInspector.console.log(event.data.error,WebInspector.ConsoleMessage.MessageLevel.Error);this._notifyCallbacks();}},_handleError:function(event)
+{WebInspector.console.log(WebInspector.UIString("Failed to clear temp storage: %s",event.data),WebInspector.ConsoleMessage.MessageLevel.Error);this._notifyCallbacks();},_notifyCallbacks:function()
+{var callbacks=this._callbacks;this._callbacks=null;for(var i=0;i<callbacks.length;i++)
+callbacks[i]();}}
+WebInspector.TempFile._ensureTempStorageCleared=function(callback)
+{if(!WebInspector.TempFile._storageCleaner)
+WebInspector.TempFile._storageCleaner=new WebInspector.TempStorageCleaner();WebInspector.TempFile._storageCleaner.ensureStorageCleared(callback);}
+WebInspector.TextRange=function(startLine,startColumn,endLine,endColumn)
+{this.startLine=startLine;this.startColumn=startColumn;this.endLine=endLine;this.endColumn=endColumn;}
+WebInspector.TextRange.createFromLocation=function(line,column)
+{return new WebInspector.TextRange(line,column,line,column);}
+WebInspector.TextRange.fromObject=function(serializedTextRange)
+{return new WebInspector.TextRange(serializedTextRange.startLine,serializedTextRange.startColumn,serializedTextRange.endLine,serializedTextRange.endColumn);}
+WebInspector.TextRange.prototype={isEmpty:function()
+{return this.startLine===this.endLine&&this.startColumn===this.endColumn;},immediatelyPrecedes:function(range)
+{if(!range)
+return false;return this.endLine===range.startLine&&this.endColumn===range.startColumn;},immediatelyFollows:function(range)
+{if(!range)
+return false;return range.immediatelyPrecedes(this);},get linesCount()
+{return this.endLine-this.startLine;},collapseToEnd:function()
+{return new WebInspector.TextRange(this.endLine,this.endColumn,this.endLine,this.endColumn);},normalize:function()
+{if(this.startLine>this.endLine||(this.startLine===this.endLine&&this.startColumn>this.endColumn))
+return new WebInspector.TextRange(this.endLine,this.endColumn,this.startLine,this.startColumn);else
+return this.clone();},clone:function()
+{return new WebInspector.TextRange(this.startLine,this.startColumn,this.endLine,this.endColumn);},serializeToObject:function()
+{var serializedTextRange={};serializedTextRange.startLine=this.startLine;serializedTextRange.startColumn=this.startColumn;serializedTextRange.endLine=this.endLine;serializedTextRange.endColumn=this.endColumn;return serializedTextRange;},compareTo:function(other)
+{if(this.startLine>other.startLine)
+return 1;if(this.startLine<other.startLine)
+return-1;if(this.startColumn>other.startColumn)
+return 1;if(this.startColumn<other.startColumn)
+return-1;return 0;},equal:function(other)
+{return this.startLine===other.startLine&&this.endLine===other.endLine&&this.startColumn===other.startColumn&&this.endColumn===other.endColumn;},shift:function(lineOffset)
+{return new WebInspector.TextRange(this.startLine+lineOffset,this.startColumn,this.endLine+lineOffset,this.endColumn);},toString:function()
+{return JSON.stringify(this);}}
+WebInspector.SourceRange=function(offset,length)
+{this.offset=offset;this.length=length;}
+WebInspector.TextUtils={isStopChar:function(char)
+{return(char>" "&&char<"0")||(char>"9"&&char<"A")||(char>"Z"&&char<"_")||(char>"_"&&char<"a")||(char>"z"&&char<="~");},isWordChar:function(char)
+{return!WebInspector.TextUtils.isStopChar(char)&&!WebInspector.TextUtils.isSpaceChar(char);},isSpaceChar:function(char)
+{return WebInspector.TextUtils._SpaceCharRegex.test(char);},isWord:function(word)
+{for(var i=0;i<word.length;++i){if(!WebInspector.TextUtils.isWordChar(word.charAt(i)))
+return false;}
+return true;},isOpeningBraceChar:function(char)
+{return char==="("||char==="{";},isClosingBraceChar:function(char)
+{return char===")"||char==="}";},isBraceChar:function(char)
+{return WebInspector.TextUtils.isOpeningBraceChar(char)||WebInspector.TextUtils.isClosingBraceChar(char);},textToWords:function(text)
+{var words=[];var startWord=-1;for(var i=0;i<text.length;++i){if(!WebInspector.TextUtils.isWordChar(text.charAt(i))){if(startWord!==-1)
+words.push(text.substring(startWord,i));startWord=-1;}else if(startWord===-1)
+startWord=i;}
+if(startWord!==-1)
+words.push(text.substring(startWord));return words;},findBalancedCurlyBrackets:function(source,startIndex,lastIndex){lastIndex=lastIndex||source.length;startIndex=startIndex||0;var counter=0;var inString=false;for(var index=startIndex;index<lastIndex;++index){var character=source[index];if(inString){if(character==="\\")
+++index;else if(character==="\"")
+inString=false;}else{if(character==="\"")
+inString=true;else if(character==="{")
+++counter;else if(character==="}"){if(--counter===0)
+return index+1;}}}
+return-1;}}
+WebInspector.TextUtils._SpaceCharRegex=/\s/;WebInspector.TextUtils.Indent={TwoSpaces:"  ",FourSpaces:"    ",EightSpaces:"        ",TabCharacter:"\t"}
+WebInspector.FileSystemModel=function()
+{WebInspector.Object.call(this);this._fileSystemsForOrigin={};WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded,this._securityOriginAdded,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved,this._securityOriginRemoved,this);FileSystemAgent.enable();this._reset();}
+WebInspector.FileSystemModel.prototype={_reset:function()
+{for(var securityOrigin in this._fileSystemsForOrigin)
+this._removeOrigin(securityOrigin);var securityOrigins=WebInspector.resourceTreeModel.securityOrigins();for(var i=0;i<securityOrigins.length;++i)
+this._addOrigin(securityOrigins[i]);},_securityOriginAdded:function(event)
+{var securityOrigin=(event.data);this._addOrigin(securityOrigin);},_securityOriginRemoved:function(event)
+{var securityOrigin=(event.data);this._removeOrigin(securityOrigin);},_addOrigin:function(securityOrigin)
+{this._fileSystemsForOrigin[securityOrigin]={};var types=["persistent","temporary"];for(var i=0;i<types.length;++i)
+this._requestFileSystemRoot(securityOrigin,types[i],this._fileSystemRootReceived.bind(this,securityOrigin,types[i],this._fileSystemsForOrigin[securityOrigin]));},_removeOrigin:function(securityOrigin)
+{for(var type in this._fileSystemsForOrigin[securityOrigin]){var fileSystem=this._fileSystemsForOrigin[securityOrigin][type];delete this._fileSystemsForOrigin[securityOrigin][type];this._fileSystemRemoved(fileSystem);}
+delete this._fileSystemsForOrigin[securityOrigin];},_requestFileSystemRoot:function(origin,type,callback)
+{function innerCallback(error,errorCode,backendRootEntry)
+{if(error){callback(FileError.SECURITY_ERR);return;}
+callback(errorCode,backendRootEntry);}
+FileSystemAgent.requestFileSystemRoot(origin,type,innerCallback);},_fileSystemAdded:function(fileSystem)
+{this.dispatchEventToListeners(WebInspector.FileSystemModel.EventTypes.FileSystemAdded,fileSystem);},_fileSystemRemoved:function(fileSystem)
+{this.dispatchEventToListeners(WebInspector.FileSystemModel.EventTypes.FileSystemRemoved,fileSystem);},refreshFileSystemList:function()
+{this._reset();},_fileSystemRootReceived:function(origin,type,store,errorCode,backendRootEntry)
+{if(!errorCode&&backendRootEntry&&this._fileSystemsForOrigin[origin]===store){var fileSystem=new WebInspector.FileSystemModel.FileSystem(this,origin,type,backendRootEntry);store[type]=fileSystem;this._fileSystemAdded(fileSystem);}},requestDirectoryContent:function(directory,callback)
+{this._requestDirectoryContent(directory.url,this._directoryContentReceived.bind(this,directory,callback));},_requestDirectoryContent:function(url,callback)
+{function innerCallback(error,errorCode,backendEntries)
+{if(error){callback(FileError.SECURITY_ERR);return;}
+if(errorCode!==0){callback(errorCode);return;}
+callback(errorCode,backendEntries);}
+FileSystemAgent.requestDirectoryContent(url,innerCallback);},_directoryContentReceived:function(parentDirectory,callback,errorCode,backendEntries)
+{if(!backendEntries){callback(errorCode);return;}
+var entries=[];for(var i=0;i<backendEntries.length;++i){if(backendEntries[i].isDirectory)
+entries.push(new WebInspector.FileSystemModel.Directory(this,parentDirectory.fileSystem,backendEntries[i]));else
+entries.push(new WebInspector.FileSystemModel.File(this,parentDirectory.fileSystem,backendEntries[i]));}
+callback(errorCode,entries);},requestMetadata:function(entry,callback)
+{function innerCallback(error,errorCode,metadata)
+{if(error){callback(FileError.SECURITY_ERR);return;}
+callback(errorCode,metadata);}
+FileSystemAgent.requestMetadata(entry.url,innerCallback);},requestFileContent:function(file,readAsText,start,end,charset,callback)
+{this._requestFileContent(file.url,readAsText,start,end,charset,callback);},_requestFileContent:function(url,readAsText,start,end,charset,callback)
+{function innerCallback(error,errorCode,content,charset)
+{if(error){if(callback)
+callback(FileError.SECURITY_ERR);return;}
+if(callback)
+callback(errorCode,content,charset);}
+FileSystemAgent.requestFileContent(url,readAsText,start,end,charset,innerCallback);},deleteEntry:function(entry,callback)
+{var fileSystemModel=this;if(entry===entry.fileSystem.root)
+this._deleteEntry(entry.url,hookFileSystemDeletion);else
+this._deleteEntry(entry.url,callback);function hookFileSystemDeletion(errorCode)
+{callback(errorCode);if(!errorCode)
+fileSystemModel._removeFileSystem(entry.fileSystem);}},_deleteEntry:function(url,callback)
+{function innerCallback(error,errorCode)
+{if(error){if(callback)
+callback(FileError.SECURITY_ERR);return;}
+if(callback)
+callback(errorCode);}
+FileSystemAgent.deleteEntry(url,innerCallback);},_removeFileSystem:function(fileSystem)
+{var origin=fileSystem.origin;var type=fileSystem.type;if(this._fileSystemsForOrigin[origin]&&this._fileSystemsForOrigin[origin][type]){delete this._fileSystemsForOrigin[origin][type];this._fileSystemRemoved(fileSystem);if(Object.isEmpty(this._fileSystemsForOrigin[origin]))
+delete this._fileSystemsForOrigin[origin];}},__proto__:WebInspector.Object.prototype}
+WebInspector.FileSystemModel.EventTypes={FileSystemAdded:"FileSystemAdded",FileSystemRemoved:"FileSystemRemoved"}
+WebInspector.FileSystemModel.FileSystem=function(fileSystemModel,origin,type,backendRootEntry)
+{this.origin=origin;this.type=type;this.root=new WebInspector.FileSystemModel.Directory(fileSystemModel,this,backendRootEntry);}
+WebInspector.FileSystemModel.FileSystem.prototype={get name()
+{return"filesystem:"+this.origin+"/"+this.type;}}
+WebInspector.FileSystemModel.Entry=function(fileSystemModel,fileSystem,backendEntry)
+{this._fileSystemModel=fileSystemModel;this._fileSystem=fileSystem;this._url=backendEntry.url;this._name=backendEntry.name;this._isDirectory=backendEntry.isDirectory;}
+WebInspector.FileSystemModel.Entry.compare=function(x,y)
+{if(x.isDirectory!=y.isDirectory)
+return y.isDirectory?1:-1;return x.name.compareTo(y.name);}
+WebInspector.FileSystemModel.Entry.prototype={get fileSystemModel()
+{return this._fileSystemModel;},get fileSystem()
+{return this._fileSystem;},get url()
+{return this._url;},get name()
+{return this._name;},get isDirectory()
+{return this._isDirectory;},requestMetadata:function(callback)
+{this.fileSystemModel.requestMetadata(this,callback);},deleteEntry:function(callback)
+{this.fileSystemModel.deleteEntry(this,callback);}}
+WebInspector.FileSystemModel.Directory=function(fileSystemModel,fileSystem,backendEntry)
+{WebInspector.FileSystemModel.Entry.call(this,fileSystemModel,fileSystem,backendEntry);}
+WebInspector.FileSystemModel.Directory.prototype={requestDirectoryContent:function(callback)
+{this.fileSystemModel.requestDirectoryContent(this,callback);},__proto__:WebInspector.FileSystemModel.Entry.prototype}
+WebInspector.FileSystemModel.File=function(fileSystemModel,fileSystem,backendEntry)
+{WebInspector.FileSystemModel.Entry.call(this,fileSystemModel,fileSystem,backendEntry);this._mimeType=backendEntry.mimeType;this._resourceType=WebInspector.resourceTypes[backendEntry.resourceType];this._isTextFile=backendEntry.isTextFile;}
+WebInspector.FileSystemModel.File.prototype={get mimeType()
+{return this._mimeType;},get resourceType()
+{return this._resourceType;},get isTextFile()
+{return this._isTextFile;},requestFileContent:function(readAsText,start,end,charset,callback)
+{this.fileSystemModel.requestFileContent(this,readAsText,start,end,charset,callback);},__proto__:WebInspector.FileSystemModel.Entry.prototype}
+WebInspector.OutputStreamDelegate=function()
+{}
+WebInspector.OutputStreamDelegate.prototype={onTransferStarted:function(){},onTransferFinished:function(){},onChunkTransferred:function(reader){},onError:function(reader,event){},}
+WebInspector.OutputStream=function()
+{}
+WebInspector.OutputStream.prototype={write:function(data,callback){},close:function(){}}
+WebInspector.ChunkedReader=function()
+{}
+WebInspector.ChunkedReader.prototype={fileSize:function(){},loadedSize:function(){},fileName:function(){},cancel:function(){}}
+WebInspector.ChunkedFileReader=function(file,chunkSize,delegate)
+{this._file=file;this._fileSize=file.size;this._loadedSize=0;this._chunkSize=chunkSize;this._delegate=delegate;this._isCanceled=false;}
+WebInspector.ChunkedFileReader.prototype={start:function(output)
+{this._output=output;this._reader=new FileReader();this._reader.onload=this._onChunkLoaded.bind(this);this._reader.onerror=this._delegate.onError.bind(this._delegate,this);this._delegate.onTransferStarted();this._loadChunk();},cancel:function()
+{this._isCanceled=true;},loadedSize:function()
+{return this._loadedSize;},fileSize:function()
+{return this._fileSize;},fileName:function()
+{return this._file.name;},_onChunkLoaded:function(event)
+{if(this._isCanceled)
+return;if(event.target.readyState!==FileReader.DONE)
+return;var data=event.target.result;this._loadedSize+=data.length;this._output.write(data);if(this._isCanceled)
+return;this._delegate.onChunkTransferred(this);if(this._loadedSize===this._fileSize){this._file=null;this._reader=null;this._output.close();this._delegate.onTransferFinished();return;}
+this._loadChunk();},_loadChunk:function()
+{var chunkStart=this._loadedSize;var chunkEnd=Math.min(this._fileSize,chunkStart+this._chunkSize)
+var nextPart=this._file.slice(chunkStart,chunkEnd);this._reader.readAsText(nextPart);}}
+WebInspector.ChunkedXHRReader=function(url,delegate)
+{this._url=url;this._delegate=delegate;this._fileSize=0;this._loadedSize=0;this._isCanceled=false;}
+WebInspector.ChunkedXHRReader.prototype={start:function(output)
+{this._output=output;this._xhr=new XMLHttpRequest();this._xhr.open("GET",this._url,true);this._xhr.onload=this._onLoad.bind(this);this._xhr.onprogress=this._onProgress.bind(this);this._xhr.onerror=this._delegate.onError.bind(this._delegate,this);this._xhr.send(null);this._delegate.onTransferStarted();},cancel:function()
+{this._isCanceled=true;this._xhr.abort();},loadedSize:function()
+{return this._loadedSize;},fileSize:function()
+{return this._fileSize;},fileName:function()
+{return this._url;},_onProgress:function(event)
+{if(this._isCanceled)
+return;if(event.lengthComputable)
+this._fileSize=event.total;var data=this._xhr.responseText.substring(this._loadedSize);if(!data.length)
+return;this._loadedSize+=data.length;this._output.write(data);if(this._isCanceled)
+return;this._delegate.onChunkTransferred(this);},_onLoad:function(event)
+{this._onProgress(event);if(this._isCanceled)
+return;this._output.close();this._delegate.onTransferFinished();}}
+WebInspector.createFileSelectorElement=function(callback){var fileSelectorElement=document.createElement("input");fileSelectorElement.type="file";fileSelectorElement.style.display="none";fileSelectorElement.setAttribute("tabindex",-1);fileSelectorElement.onchange=onChange;function onChange(event)
+{callback(fileSelectorElement.files[0]);};return fileSelectorElement;}
+WebInspector.FileOutputStream=function()
+{}
+WebInspector.FileOutputStream.prototype={open:function(fileName,callback)
+{this._closed=false;this._writeCallbacks=[];this._fileName=fileName;function callbackWrapper(accepted)
+{if(accepted)
+WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.AppendedToURL,this._onAppendDone,this);callback(accepted);}
+WebInspector.fileManager.save(this._fileName,"",true,callbackWrapper.bind(this));},write:function(data,callback)
+{this._writeCallbacks.push(callback);WebInspector.fileManager.append(this._fileName,data);},close:function()
+{this._closed=true;if(this._writeCallbacks.length)
+return;WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL,this._onAppendDone,this);WebInspector.fileManager.close(this._fileName);},_onAppendDone:function(event)
+{if(event.data!==this._fileName)
+return;var callback=this._writeCallbacks.shift();if(callback)
+callback(this);if(!this._writeCallbacks.length){if(this._closed){WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL,this._onAppendDone,this);WebInspector.fileManager.close(this._fileName);}}}}
+WebInspector.DebuggerModel=function(target)
+{target.registerDebuggerDispatcher(new WebInspector.DebuggerDispatcher(this));this._agent=target.debuggerAgent();this._target=target;this._debuggerPausedDetails=null;this._scripts={};this._scriptsBySourceURL=new StringMap();this._breakpointsActive=true;WebInspector.settings.pauseOnExceptionEnabled.addChangeListener(this._pauseOnExceptionStateChanged,this);WebInspector.settings.pauseOnCaughtException.addChangeListener(this._pauseOnExceptionStateChanged,this);WebInspector.settings.enableAsyncStackTraces.addChangeListener(this._asyncStackTracesStateChanged,this);this.enableDebugger();this.applySkipStackFrameSettings();}
+WebInspector.DebuggerModel.PauseOnExceptionsState={DontPauseOnExceptions:"none",PauseOnAllExceptions:"all",PauseOnUncaughtExceptions:"uncaught"};WebInspector.DebuggerModel.Location=function(scriptId,lineNumber,columnNumber)
+{this.scriptId=scriptId;this.lineNumber=lineNumber;this.columnNumber=columnNumber;}
+WebInspector.DebuggerModel.Events={DebuggerWasEnabled:"DebuggerWasEnabled",DebuggerWasDisabled:"DebuggerWasDisabled",DebuggerPaused:"DebuggerPaused",DebuggerResumed:"DebuggerResumed",ParsedScriptSource:"ParsedScriptSource",FailedToParseScriptSource:"FailedToParseScriptSource",BreakpointResolved:"BreakpointResolved",GlobalObjectCleared:"GlobalObjectCleared",CallFrameSelected:"CallFrameSelected",ConsoleCommandEvaluatedInSelectedCallFrame:"ConsoleCommandEvaluatedInSelectedCallFrame",BreakpointsActiveStateChanged:"BreakpointsActiveStateChanged"}
+WebInspector.DebuggerModel.BreakReason={DOM:"DOM",EventListener:"EventListener",XHR:"XHR",Exception:"exception",Assert:"assert",CSPViolation:"CSPViolation",DebugCommand:"debugCommand"}
+WebInspector.DebuggerModel.prototype={debuggerEnabled:function()
+{return!!this._debuggerEnabled;},enableDebugger:function()
+{if(this._debuggerEnabled)
+return;this._agent.enable(this._debuggerWasEnabled.bind(this));},disableDebugger:function()
+{if(!this._debuggerEnabled)
+return;this._agent.disable(this._debuggerWasDisabled.bind(this));},skipAllPauses:function(skip,untilReload)
+{if(this._skipAllPausesTimeout){clearTimeout(this._skipAllPausesTimeout);delete this._skipAllPausesTimeout;}
+this._agent.setSkipAllPauses(skip,untilReload);},skipAllPausesUntilReloadOrTimeout:function(timeout)
+{if(this._skipAllPausesTimeout)
+clearTimeout(this._skipAllPausesTimeout);this._agent.setSkipAllPauses(true,true);this._skipAllPausesTimeout=setTimeout(this.skipAllPauses.bind(this,false),timeout);},_debuggerWasEnabled:function()
+{this._debuggerEnabled=true;this._pauseOnExceptionStateChanged();this._asyncStackTracesStateChanged();this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerWasEnabled);},_pauseOnExceptionStateChanged:function()
+{var state;if(!WebInspector.settings.pauseOnExceptionEnabled.get()){state=WebInspector.DebuggerModel.PauseOnExceptionsState.DontPauseOnExceptions;}else if(WebInspector.settings.pauseOnCaughtException.get()){state=WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnAllExceptions;}else{state=WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnUncaughtExceptions;}
+this._agent.setPauseOnExceptions(state);},_asyncStackTracesStateChanged:function()
+{const maxAsyncStackChainDepth=4;var enabled=WebInspector.settings.enableAsyncStackTraces.get();this._agent.setAsyncCallStackDepth(enabled?maxAsyncStackChainDepth:0);},_debuggerWasDisabled:function()
+{this._debuggerEnabled=false;this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerWasDisabled);},continueToLocation:function(rawLocation)
+{this._agent.continueToLocation(rawLocation);},stepInto:function()
+{function callback()
+{this._agent.stepInto();}
+this._agent.setOverlayMessage(undefined,callback.bind(this));},stepOver:function()
+{function callback()
+{this._agent.stepOver();}
+this._agent.setOverlayMessage(undefined,callback.bind(this));},stepOut:function()
+{function callback()
+{this._agent.stepOut();}
+this._agent.setOverlayMessage(undefined,callback.bind(this));},resume:function()
+{function callback()
+{this._agent.resume();}
+this._agent.setOverlayMessage(undefined,callback.bind(this));},setBreakpointByScriptLocation:function(rawLocation,condition,callback)
+{var script=this.scriptForId(rawLocation.scriptId);if(script.sourceURL)
+this.setBreakpointByURL(script.sourceURL,rawLocation.lineNumber,rawLocation.columnNumber,condition,callback);else
+this.setBreakpointBySourceId(rawLocation,condition,callback);},setBreakpointByURL:function(url,lineNumber,columnNumber,condition,callback)
+{var minColumnNumber=0;var scripts=this._scriptsBySourceURL.get(url)||[];for(var i=0,l=scripts.length;i<l;++i){var script=scripts[i];if(lineNumber===script.lineOffset)
+minColumnNumber=minColumnNumber?Math.min(minColumnNumber,script.columnOffset):script.columnOffset;}
+columnNumber=Math.max(columnNumber,minColumnNumber);function didSetBreakpoint(error,breakpointId,locations)
+{if(callback){var rawLocations=(locations);callback(error?null:breakpointId,rawLocations);}}
+this._agent.setBreakpointByUrl(lineNumber,url,undefined,columnNumber,condition,undefined,didSetBreakpoint);WebInspector.userMetrics.ScriptsBreakpointSet.record();},setBreakpointBySourceId:function(rawLocation,condition,callback)
+{function didSetBreakpoint(error,breakpointId,actualLocation)
+{if(callback){var rawLocation=(actualLocation);callback(error?null:breakpointId,[rawLocation]);}}
+this._agent.setBreakpoint(rawLocation,condition,didSetBreakpoint);WebInspector.userMetrics.ScriptsBreakpointSet.record();},removeBreakpoint:function(breakpointId,callback)
+{this._agent.removeBreakpoint(breakpointId,innerCallback);function innerCallback(error)
+{if(error)
+console.error("Failed to remove breakpoint: "+error);if(callback)
+callback();}},_breakpointResolved:function(breakpointId,location)
+{this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.BreakpointResolved,{breakpointId:breakpointId,location:location});},_globalObjectCleared:function()
+{this._setDebuggerPausedDetails(null);this._reset();this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.GlobalObjectCleared);},_reset:function()
+{this._scripts={};this._scriptsBySourceURL.clear();},get scripts()
+{return this._scripts;},scriptForId:function(scriptId)
+{return this._scripts[scriptId]||null;},scriptsForSourceURL:function(sourceURL)
+{if(!sourceURL)
+return[];return this._scriptsBySourceURL.get(sourceURL)||[];},setScriptSource:function(scriptId,newSource,callback)
+{this._scripts[scriptId].editSource(newSource,this._didEditScriptSource.bind(this,scriptId,newSource,callback));},_didEditScriptSource:function(scriptId,newSource,callback,error,errorData,callFrames,asyncStackTrace,needsStepIn)
+{callback(error,errorData);if(needsStepIn)
+this.stepInto();else if(!error&&callFrames&&callFrames.length)
+this._pausedScript(callFrames,this._debuggerPausedDetails.reason,this._debuggerPausedDetails.auxData,this._debuggerPausedDetails.breakpointIds,asyncStackTrace);},get callFrames()
+{return this._debuggerPausedDetails?this._debuggerPausedDetails.callFrames:null;},debuggerPausedDetails:function()
+{return this._debuggerPausedDetails;},_setDebuggerPausedDetails:function(debuggerPausedDetails)
+{if(this._debuggerPausedDetails)
+this._debuggerPausedDetails.dispose();this._debuggerPausedDetails=debuggerPausedDetails;if(this._debuggerPausedDetails)
+this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerPaused,this._debuggerPausedDetails);if(debuggerPausedDetails){this.setSelectedCallFrame(debuggerPausedDetails.callFrames[0]);this._agent.setOverlayMessage(WebInspector.UIString("Paused in debugger"));}else{this.setSelectedCallFrame(null);this._agent.setOverlayMessage();}},_pausedScript:function(callFrames,reason,auxData,breakpointIds,asyncStackTrace)
+{this._setDebuggerPausedDetails(new WebInspector.DebuggerPausedDetails(this,callFrames,reason,auxData,breakpointIds,asyncStackTrace));},_resumedScript:function()
+{this._setDebuggerPausedDetails(null);this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerResumed);},_parsedScriptSource:function(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,isContentScript,sourceMapURL,hasSourceURL)
+{var script=new WebInspector.Script(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,isContentScript,sourceMapURL,hasSourceURL);this._registerScript(script);this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ParsedScriptSource,script);},_registerScript:function(script)
+{this._scripts[script.scriptId]=script;if(script.isAnonymousScript())
+return;var scripts=this._scriptsBySourceURL.get(script.sourceURL);if(!scripts){scripts=[];this._scriptsBySourceURL.put(script.sourceURL,scripts);}
+scripts.push(script);},createRawLocation:function(script,lineNumber,columnNumber)
+{if(script.sourceURL)
+return this.createRawLocationByURL(script.sourceURL,lineNumber,columnNumber)
+return new WebInspector.DebuggerModel.Location(script.scriptId,lineNumber,columnNumber);},createRawLocationByURL:function(sourceURL,lineNumber,columnNumber)
+{var closestScript=null;var scripts=this._scriptsBySourceURL.get(sourceURL)||[];for(var i=0,l=scripts.length;i<l;++i){var script=scripts[i];if(!closestScript)
+closestScript=script;if(script.lineOffset>lineNumber||(script.lineOffset===lineNumber&&script.columnOffset>columnNumber))
+continue;if(script.endLine<lineNumber||(script.endLine===lineNumber&&script.endColumn<=columnNumber))
+continue;closestScript=script;break;}
+return closestScript?new WebInspector.DebuggerModel.Location(closestScript.scriptId,lineNumber,columnNumber):null;},isPaused:function()
+{return!!this.debuggerPausedDetails();},setSelectedCallFrame:function(callFrame)
+{this._selectedCallFrame=callFrame;if(!this._selectedCallFrame)
+return;this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.CallFrameSelected,callFrame);},selectedCallFrame:function()
+{return this._selectedCallFrame;},evaluateOnSelectedCallFrame:function(code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback)
+{function didEvaluate(result,wasThrown)
+{if(!result)
+callback(null,false);else if(returnByValue)
+callback(null,!!wasThrown,wasThrown?null:result);else
+callback(WebInspector.RemoteObject.fromPayload(result,this._target),!!wasThrown);if(objectGroup==="console")
+this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ConsoleCommandEvaluatedInSelectedCallFrame);}
+this.selectedCallFrame().evaluate(code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,didEvaluate.bind(this));},getSelectedCallFrameVariables:function(callback)
+{var result={this:true};var selectedCallFrame=this._selectedCallFrame;if(!selectedCallFrame)
+callback(result);var pendingRequests=0;function propertiesCollected(properties)
+{for(var i=0;properties&&i<properties.length;++i)
+result[properties[i].name]=true;if(--pendingRequests==0)
+callback(result);}
+for(var i=0;i<selectedCallFrame.scopeChain.length;++i){var scope=selectedCallFrame.scopeChain[i];var object=WebInspector.RemoteObject.fromPayload(scope.object,this._target);pendingRequests++;object.getAllProperties(false,propertiesCollected);}},setBreakpointsActive:function(active)
+{if(this._breakpointsActive===active)
+return;this._breakpointsActive=active;this._agent.setBreakpointsActive(active);this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.BreakpointsActiveStateChanged,active);},breakpointsActive:function()
+{return this._breakpointsActive;},createLiveLocation:function(rawLocation,updateDelegate)
+{var script=this._scripts[rawLocation.scriptId];return script.createLiveLocation(rawLocation,updateDelegate);},rawLocationToUILocation:function(rawLocation)
+{var script=this._scripts[rawLocation.scriptId];if(!script)
+return null;return script.rawLocationToUILocation(rawLocation.lineNumber,rawLocation.columnNumber);},callStackModified:function(newCallFrames,details,asyncStackTrace)
+{if(details&&details["stack_update_needs_step_in"])
+this.stepInto();else if(newCallFrames&&newCallFrames.length)
+this._pausedScript(newCallFrames,this._debuggerPausedDetails.reason,this._debuggerPausedDetails.auxData,this._debuggerPausedDetails.breakpointIds,asyncStackTrace);},applySkipStackFrameSettings:function()
+{if(!WebInspector.experimentsSettings.frameworksDebuggingSupport.isEnabled())
+return;var settings=WebInspector.settings;var patternParameter=settings.skipStackFramesSwitch.get()?settings.skipStackFramesPattern.get():undefined;this._agent.skipStackFrames(patternParameter);},__proto__:WebInspector.Object.prototype}
+WebInspector.DebuggerEventTypes={JavaScriptPause:0,JavaScriptBreakpoint:1,NativeBreakpoint:2};WebInspector.DebuggerDispatcher=function(debuggerModel)
+{this._debuggerModel=debuggerModel;}
+WebInspector.DebuggerDispatcher.prototype={paused:function(callFrames,reason,auxData,breakpointIds,asyncStackTrace)
+{this._debuggerModel._pausedScript(callFrames,reason,auxData,breakpointIds||[],asyncStackTrace);},resumed:function()
+{this._debuggerModel._resumedScript();},globalObjectCleared:function()
+{this._debuggerModel._globalObjectCleared();},scriptParsed:function(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,isContentScript,sourceMapURL,hasSourceURL)
+{this._debuggerModel._parsedScriptSource(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,!!isContentScript,sourceMapURL,hasSourceURL);},scriptFailedToParse:function(sourceURL,source,startingLine,errorLine,errorMessage)
+{},breakpointResolved:function(breakpointId,location)
+{this._debuggerModel._breakpointResolved(breakpointId,location);}}
+WebInspector.DebuggerModel.CallFrame=function(debuggerModel,script,payload,isAsync)
+{this._debuggerModel=debuggerModel;this._debuggerAgent=debuggerModel._agent;this._script=script;this._payload=payload;this._locations=[];this._isAsync=isAsync;}
+WebInspector.DebuggerModel.CallFrame.fromPayloadArray=function(debuggerModel,callFrames,isAsync)
+{var result=[];for(var i=0;i<callFrames.length;++i){var callFrame=callFrames[i];var script=debuggerModel.scriptForId(callFrame.location.scriptId);if(script)
+result.push(new WebInspector.DebuggerModel.CallFrame(debuggerModel,script,callFrame,isAsync));}
+return result;}
+WebInspector.DebuggerModel.CallFrame.prototype={get script()
+{return this._script;},get type()
+{return this._payload.type;},get id()
+{return this._payload.callFrameId;},get scopeChain()
+{return this._payload.scopeChain;},get this()
+{return this._payload.this;},get returnValue()
+{return this._payload.returnValue;},get functionName()
+{return this._payload.functionName;},get location()
+{var rawLocation=(this._payload.location);return rawLocation;},isAsync:function()
+{return!!this._isAsync;},evaluate:function(code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback)
+{function didEvaluateOnCallFrame(error,result,wasThrown)
+{if(error){console.error(error);callback(null,false);return;}
+callback(result,wasThrown);}
+this._debuggerAgent.evaluateOnCallFrame(this._payload.callFrameId,code,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,didEvaluateOnCallFrame);},restart:function(callback)
+{function protocolCallback(error,callFrames,details,asyncStackTrace)
+{if(!error)
+this._debuggerModel.callStackModified(callFrames,details,asyncStackTrace);if(callback)
+callback(error);}
+this._debuggerAgent.restartFrame(this._payload.callFrameId,protocolCallback.bind(this));},createLiveLocation:function(updateDelegate)
+{var location=this._script.createLiveLocation(this.location,updateDelegate);this._locations.push(location);return location;},dispose:function()
+{for(var i=0;i<this._locations.length;++i)
+this._locations[i].dispose();this._locations=[];}}
+WebInspector.DebuggerModel.StackTrace=function(callFrames,asyncStackTrace,description)
+{this.callFrames=callFrames;this.asyncStackTrace=asyncStackTrace;this.description=description;}
+WebInspector.DebuggerModel.StackTrace.fromPayload=function(debuggerModel,payload,isAsync)
+{if(!payload)
+return null;var callFrames=WebInspector.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel,payload.callFrames,isAsync);if(!callFrames.length)
+return null;var asyncStackTrace=WebInspector.DebuggerModel.StackTrace.fromPayload(debuggerModel,payload.asyncStackTrace,true);return new WebInspector.DebuggerModel.StackTrace(callFrames,asyncStackTrace,payload.description);}
+WebInspector.DebuggerModel.StackTrace.prototype={dispose:function()
+{for(var i=0;i<this.callFrames.length;++i)
+this.callFrames[i].dispose();if(this.asyncStackTrace)
+this.asyncStackTrace.dispose();}}
+WebInspector.DebuggerPausedDetails=function(debuggerModel,callFrames,reason,auxData,breakpointIds,asyncStackTrace)
+{this.callFrames=WebInspector.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel,callFrames);this.reason=reason;this.auxData=auxData;this.breakpointIds=breakpointIds;this.asyncStackTrace=WebInspector.DebuggerModel.StackTrace.fromPayload(debuggerModel,asyncStackTrace,true);}
+WebInspector.DebuggerPausedDetails.prototype={dispose:function()
+{for(var i=0;i<this.callFrames.length;++i)
+this.callFrames[i].dispose();if(this.asyncStackTrace)
+this.asyncStackTrace.dispose();}}
+WebInspector.debuggerModel;function SourceMapV3()
+{this.version;this.file;this.sources;this.sections;this.mappings;this.sourceRoot;}
+SourceMapV3.Section=function()
+{this.map;this.offset;}
+SourceMapV3.Offset=function()
+{this.line;this.column;}
+WebInspector.SourceMap=function(sourceMappingURL,payload)
+{if(!WebInspector.SourceMap.prototype._base64Map){const base64Digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";WebInspector.SourceMap.prototype._base64Map={};for(var i=0;i<base64Digits.length;++i)
+WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)]=i;}
+this._sourceMappingURL=sourceMappingURL;this._reverseMappingsBySourceURL={};this._mappings=[];this._sources={};this._sourceContentByURL={};this._parseMappingPayload(payload);}
+WebInspector.SourceMap._sourceMapRequestHeaderName="X-Source-Map-Request-From";WebInspector.SourceMap._sourceMapRequestHeaderValue="inspector";WebInspector.SourceMap.hasSourceMapRequestHeader=function(request)
+{return request&&request.requestHeaderValue(WebInspector.SourceMap._sourceMapRequestHeaderName)===WebInspector.SourceMap._sourceMapRequestHeaderValue;}
+WebInspector.SourceMap.load=function(sourceMapURL,compiledURL,callback)
+{var headers={};headers[WebInspector.SourceMap._sourceMapRequestHeaderName]=WebInspector.SourceMap._sourceMapRequestHeaderValue;NetworkAgent.loadResourceForFrontend(WebInspector.resourceTreeModel.mainFrame.id,sourceMapURL,headers,contentLoaded);function contentLoaded(error,statusCode,headers,content)
+{if(error||!content||statusCode>=400){callback(null);return;}
+if(content.slice(0,3)===")]}")
+content=content.substring(content.indexOf('\n'));try{var payload=(JSON.parse(content));var baseURL=sourceMapURL.startsWith("data:")?compiledURL:sourceMapURL;callback(new WebInspector.SourceMap(baseURL,payload));}catch(e){console.error(e.message);callback(null);}}}
+WebInspector.SourceMap.prototype={url:function()
+{return this._sourceMappingURL;},sources:function()
+{return Object.keys(this._sources);},sourceContent:function(sourceURL)
+{return this._sourceContentByURL[sourceURL];},sourceContentProvider:function(sourceURL,contentType)
+{var sourceContent=this.sourceContent(sourceURL);if(sourceContent)
+return new WebInspector.StaticContentProvider(contentType,sourceContent);return new WebInspector.CompilerSourceMappingContentProvider(sourceURL,contentType);},_parseMappingPayload:function(mappingPayload)
+{if(mappingPayload.sections)
+this._parseSections(mappingPayload.sections);else
+this._parseMap(mappingPayload,0,0);},_parseSections:function(sections)
+{for(var i=0;i<sections.length;++i){var section=sections[i];this._parseMap(section.map,section.offset.line,section.offset.column);}},findEntry:function(lineNumber,columnNumber)
+{var first=0;var count=this._mappings.length;while(count>1){var step=count>>1;var middle=first+step;var mapping=this._mappings[middle];if(lineNumber<mapping[0]||(lineNumber===mapping[0]&&columnNumber<mapping[1]))
+count=step;else{first=middle;count-=step;}}
+var entry=this._mappings[first];if(!first&&entry&&(lineNumber<entry[0]||(lineNumber===entry[0]&&columnNumber<entry[1])))
+return null;return entry;},findEntryReversed:function(sourceURL,lineNumber)
+{var mappings=this._reverseMappingsBySourceURL[sourceURL];for(;lineNumber<mappings.length;++lineNumber){var mapping=mappings[lineNumber];if(mapping)
+return mapping;}
+return this._mappings[0];},_parseMap:function(map,lineNumber,columnNumber)
+{var sourceIndex=0;var sourceLineNumber=0;var sourceColumnNumber=0;var nameIndex=0;var sources=[];var originalToCanonicalURLMap={};for(var i=0;i<map.sources.length;++i){var originalSourceURL=map.sources[i];var sourceRoot=map.sourceRoot||"";if(sourceRoot&&!sourceRoot.endsWith("/"))
+sourceRoot+="/";var href=sourceRoot+originalSourceURL;var url=WebInspector.ParsedURL.completeURL(this._sourceMappingURL,href)||href;originalToCanonicalURLMap[originalSourceURL]=url;sources.push(url);this._sources[url]=true;if(map.sourcesContent&&map.sourcesContent[i])
+this._sourceContentByURL[url]=map.sourcesContent[i];}
+var stringCharIterator=new WebInspector.SourceMap.StringCharIterator(map.mappings);var sourceURL=sources[sourceIndex];while(true){if(stringCharIterator.peek()===",")
+stringCharIterator.next();else{while(stringCharIterator.peek()===";"){lineNumber+=1;columnNumber=0;stringCharIterator.next();}
+if(!stringCharIterator.hasNext())
+break;}
+columnNumber+=this._decodeVLQ(stringCharIterator);if(this._isSeparator(stringCharIterator.peek())){this._mappings.push([lineNumber,columnNumber]);continue;}
+var sourceIndexDelta=this._decodeVLQ(stringCharIterator);if(sourceIndexDelta){sourceIndex+=sourceIndexDelta;sourceURL=sources[sourceIndex];}
+sourceLineNumber+=this._decodeVLQ(stringCharIterator);sourceColumnNumber+=this._decodeVLQ(stringCharIterator);if(!this._isSeparator(stringCharIterator.peek()))
+nameIndex+=this._decodeVLQ(stringCharIterator);this._mappings.push([lineNumber,columnNumber,sourceURL,sourceLineNumber,sourceColumnNumber]);}
+for(var i=0;i<this._mappings.length;++i){var mapping=this._mappings[i];var url=mapping[2];if(!url)
+continue;if(!this._reverseMappingsBySourceURL[url])
+this._reverseMappingsBySourceURL[url]=[];var reverseMappings=this._reverseMappingsBySourceURL[url];var sourceLine=mapping[3];if(!reverseMappings[sourceLine])
+reverseMappings[sourceLine]=[mapping[0],mapping[1]];}},_isSeparator:function(char)
+{return char===","||char===";";},_decodeVLQ:function(stringCharIterator)
+{var result=0;var shift=0;do{var digit=this._base64Map[stringCharIterator.next()];result+=(digit&this._VLQ_BASE_MASK)<<shift;shift+=this._VLQ_BASE_SHIFT;}while(digit&this._VLQ_CONTINUATION_MASK);var negative=result&1;result>>=1;return negative?-result:result;},_VLQ_BASE_SHIFT:5,_VLQ_BASE_MASK:(1<<5)-1,_VLQ_CONTINUATION_MASK:1<<5}
+WebInspector.SourceMap.StringCharIterator=function(string)
+{this._string=string;this._position=0;}
+WebInspector.SourceMap.StringCharIterator.prototype={next:function()
+{return this._string.charAt(this._position++);},peek:function()
+{return this._string.charAt(this._position);},hasNext:function()
+{return this._position<this._string.length;}}
+WebInspector.SourceMapping=function()
+{}
+WebInspector.SourceMapping.prototype={rawLocationToUILocation:function(rawLocation){},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber){},isIdentity:function(){}}
+WebInspector.ScriptSourceMapping=function()
+{}
+WebInspector.ScriptSourceMapping.prototype={addScript:function(script){}}
+WebInspector.LayerTreeModel=function()
+{WebInspector.Object.call(this);this._layersById={};this._lastPaintRectByLayerId={};this._backendNodeIdToNodeId={};InspectorBackend.registerLayerTreeDispatcher(new WebInspector.LayerTreeDispatcher(this));WebInspector.domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdated,this._onDocumentUpdated,this);}
+WebInspector.LayerTreeModel.Events={LayerTreeChanged:"LayerTreeChanged",LayerPainted:"LayerPainted",}
+WebInspector.LayerTreeModel.prototype={disable:function()
+{if(!this._enabled)
+return;this._enabled=false;this._backendNodeIdToNodeId={};LayerTreeAgent.disable();},enable:function(callback)
+{if(this._enabled)
+return;this._enabled=true;LayerTreeAgent.enable();},setSnapshot:function(snapshot)
+{this.disable();this._resolveNodesAndRepopulate(snapshot.layers);},root:function()
+{return this._root;},contentRoot:function()
+{return this._contentRoot;},forEachLayer:function(callback,root)
+{if(!root){root=this.root();if(!root)
+return false;}
+return callback(root)||root.children().some(this.forEachLayer.bind(this,callback));},layerById:function(id)
+{return this._layersById[id]||null;},_resolveNodesAndRepopulate:function(payload)
+{if(payload)
+this._resolveBackendNodeIdsForLayers(payload,onBackendNodeIdsResolved.bind(this));else
+onBackendNodeIdsResolved.call(this);function onBackendNodeIdsResolved()
+{this._repopulate(payload||[]);this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTreeChanged);}},_repopulate:function(layers)
+{this._root=null;this._contentRoot=null;if(!layers)
+return;var oldLayersById=this._layersById;this._layersById={};for(var i=0;i<layers.length;++i){var layerId=layers[i].layerId;var layer=oldLayersById[layerId];if(layer)
+layer._reset(layers[i]);else
+layer=new WebInspector.Layer(layers[i]);this._layersById[layerId]=layer;if(layers[i].backendNodeId){layer._setNodeId(this._backendNodeIdToNodeId[layers[i].backendNodeId]);if(!this._contentRoot)
+this._contentRoot=layer;}
+var lastPaintRect=this._lastPaintRectByLayerId[layerId];if(lastPaintRect)
+layer._lastPaintRect=lastPaintRect;var parentId=layer.parentId();if(parentId){var parent=this._layersById[parentId];if(!parent)
+console.assert(parent,"missing parent "+parentId+" for layer "+layerId);parent.addChild(layer);}else{if(this._root)
+console.assert(false,"Multiple root layers");this._root=layer;}}
+this._lastPaintRectByLayerId={};},_layerTreeChanged:function(layers)
+{if(!this._enabled)
+return;this._resolveNodesAndRepopulate(layers);},_resolveBackendNodeIdsForLayers:function(layers,callback)
+{var idsToResolve={};var requestedIds=[];for(var i=0;i<layers.length;++i){var backendNodeId=layers[i].backendNodeId;if(!backendNodeId||idsToResolve[backendNodeId]||(this._backendNodeIdToNodeId[backendNodeId]&&WebInspector.domModel.nodeForId(this._backendNodeIdToNodeId[backendNodeId]))){continue;}
+idsToResolve[backendNodeId]=true;requestedIds.push(backendNodeId);}
+if(!requestedIds.length){callback();return;}
+WebInspector.domModel.pushNodesByBackendIdsToFrontend(requestedIds,populateBackendNodeIdMap.bind(this));function populateBackendNodeIdMap(nodeIds)
+{if(nodeIds){for(var i=0;i<requestedIds.length;++i){var nodeId=nodeIds[i];if(nodeId)
+this._backendNodeIdToNodeId[requestedIds[i]]=nodeId;}}
+callback();}},_layerPainted:function(layerId,clipRect)
+{var layer=this._layersById[layerId];if(!layer){this._lastPaintRectByLayerId[layerId]=clipRect;return;}
+layer._didPaint(clipRect);this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerPainted,layer);},_onDocumentUpdated:function()
+{this.disable();this.enable();},__proto__:WebInspector.Object.prototype}
+WebInspector.Layer=function(layerPayload)
+{this._scrollRects=[];this._reset(layerPayload);}
+WebInspector.Layer.prototype={id:function()
+{return this._layerPayload.layerId;},parentId:function()
+{return this._layerPayload.parentLayerId;},parent:function()
+{return this._parent;},isRoot:function()
+{return!this.parentId();},children:function()
+{return this._children;},addChild:function(child)
+{if(child._parent)
+console.assert(false,"Child already has a parent");this._children.push(child);child._parent=this;},_setNodeId:function(nodeId)
+{this._nodeId=nodeId;},nodeId:function()
+{return this._nodeId;},nodeIdForSelfOrAncestor:function()
+{for(var layer=this;layer;layer=layer._parent){var nodeId=layer._nodeId;if(nodeId)
+return nodeId;}
+return null;},offsetX:function()
+{return this._layerPayload.offsetX;},offsetY:function()
+{return this._layerPayload.offsetY;},width:function()
+{return this._layerPayload.width;},height:function()
+{return this._layerPayload.height;},transform:function()
+{return this._layerPayload.transform;},anchorPoint:function()
+{return[this._layerPayload.anchorX||0,this._layerPayload.anchorY||0,this._layerPayload.anchorZ||0,];},invisible:function()
+{return this._layerPayload.invisible;},paintCount:function()
+{return this._paintCount||this._layerPayload.paintCount;},lastPaintRect:function()
+{return this._lastPaintRect;},scrollRects:function()
+{return this._scrollRects;},requestCompositingReasons:function(callback)
+{var wrappedCallback=InspectorBackend.wrapClientCallback(callback,"LayerTreeAgent.reasonsForCompositingLayer(): ",undefined,[]);LayerTreeAgent.compositingReasons(this.id(),wrappedCallback);},requestSnapshot:function(callback)
+{var wrappedCallback=InspectorBackend.wrapClientCallback(callback,"LayerTreeAgent.makeSnapshot(): ",WebInspector.PaintProfilerSnapshot);LayerTreeAgent.makeSnapshot(this.id(),wrappedCallback);},_didPaint:function(rect)
+{this._lastPaintRect=rect;this._paintCount=this.paintCount()+1;this._image=null;},_reset:function(layerPayload)
+{this._children=[];this._parent=null;this._paintCount=0;this._layerPayload=layerPayload;this._image=null;this._nodeId=0;this._scrollRects=this._layerPayload.scrollRects||[];}}
+WebInspector.LayerTreeSnapshot=function(layers)
+{this.layers=layers;}
+WebInspector.LayerTreeDispatcher=function(layerTreeModel)
+{this._layerTreeModel=layerTreeModel;}
+WebInspector.LayerTreeDispatcher.prototype={layerTreeDidChange:function(layers)
+{this._layerTreeModel._layerTreeChanged(layers);},layerPainted:function(layerId,clipRect)
+{this._layerTreeModel._layerPainted(layerId,clipRect);}}
+WebInspector.Script=function(scriptId,sourceURL,startLine,startColumn,endLine,endColumn,isContentScript,sourceMapURL,hasSourceURL)
+{this.scriptId=scriptId;this.sourceURL=sourceURL;this.lineOffset=startLine;this.columnOffset=startColumn;this.endLine=endLine;this.endColumn=endColumn;this.isContentScript=isContentScript;this.sourceMapURL=sourceMapURL;this.hasSourceURL=hasSourceURL;this._locations=new Set();this._sourceMappings=[];}
+WebInspector.Script.Events={ScriptEdited:"ScriptEdited",}
+WebInspector.Script.snippetSourceURLPrefix="snippets:///";WebInspector.Script._trimSourceURLComment=function(source)
+{var sourceURLRegex=/\n[\040\t]*\/\/[@#]\ssourceURL=\s*(\S*?)\s*$/mg;return source.replace(sourceURLRegex,"");},WebInspector.Script.prototype={contentURL:function()
+{return this.sourceURL;},contentType:function()
+{return WebInspector.resourceTypes.Script;},requestContent:function(callback)
+{if(this._source){callback(this._source);return;}
+function didGetScriptSource(error,source)
+{this._source=WebInspector.Script._trimSourceURLComment(error?"":source);callback(this._source);}
+if(this.scriptId){DebuggerAgent.getScriptSource(this.scriptId,didGetScriptSource.bind(this));}else
+callback("");},searchInContent:function(query,caseSensitive,isRegex,callback)
+{function innerCallback(error,searchMatches)
+{if(error)
+console.error(error);var result=[];for(var i=0;i<searchMatches.length;++i){var searchMatch=new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber,searchMatches[i].lineContent);result.push(searchMatch);}
+callback(result||[]);}
+if(this.scriptId){DebuggerAgent.searchInContent(this.scriptId,query,caseSensitive,isRegex,innerCallback);}else
+callback([]);},_appendSourceURLCommentIfNeeded:function(source)
+{if(!this.hasSourceURL)
+return source;return source+"\n //# sourceURL="+this.sourceURL;},editSource:function(newSource,callback)
+{function didEditScriptSource(error,errorData,callFrames,debugData,asyncStackTrace)
+{if(!error)
+this._source=newSource;var needsStepIn=!!debugData&&debugData["stack_update_needs_step_in"]===true;callback(error,errorData,callFrames,asyncStackTrace,needsStepIn);if(!error)
+this.dispatchEventToListeners(WebInspector.Script.Events.ScriptEdited,newSource);}
+newSource=WebInspector.Script._trimSourceURLComment(newSource);newSource=this._appendSourceURLCommentIfNeeded(newSource);if(this.scriptId)
+DebuggerAgent.setScriptSource(this.scriptId,newSource,undefined,didEditScriptSource.bind(this));else
+callback("Script failed to parse");},isInlineScript:function()
+{var startsAtZero=!this.lineOffset&&!this.columnOffset;return!!this.sourceURL&&!startsAtZero;},isAnonymousScript:function()
+{return!this.sourceURL;},isSnippet:function()
+{return!!this.sourceURL&&this.sourceURL.startsWith(WebInspector.Script.snippetSourceURLPrefix);},rawLocationToUILocation:function(lineNumber,columnNumber)
+{var uiLocation;var rawLocation=new WebInspector.DebuggerModel.Location(this.scriptId,lineNumber,columnNumber||0);for(var i=this._sourceMappings.length-1;!uiLocation&&i>=0;--i)
+uiLocation=this._sourceMappings[i].rawLocationToUILocation(rawLocation);console.assert(uiLocation,"Script raw location can not be mapped to any ui location.");return(uiLocation);},pushSourceMapping:function(sourceMapping)
+{this._sourceMappings.push(sourceMapping);this.updateLocations();},popSourceMapping:function()
+{var sourceMapping=this._sourceMappings.pop();this.updateLocations();return sourceMapping;},updateLocations:function()
+{var items=this._locations.items();for(var i=0;i<items.length;++i)
+items[i].update();},createLiveLocation:function(rawLocation,updateDelegate)
+{console.assert(rawLocation.scriptId===this.scriptId);var location=new WebInspector.Script.Location(this,rawLocation,updateDelegate);this._locations.add(location);location.update();return location;},__proto__:WebInspector.Object.prototype}
+WebInspector.Script.Location=function(script,rawLocation,updateDelegate)
+{WebInspector.LiveLocation.call(this,rawLocation,updateDelegate);this._script=script;}
+WebInspector.Script.Location.prototype={uiLocation:function()
+{var debuggerModelLocation=(this.rawLocation());return this._script.rawLocationToUILocation(debuggerModelLocation.lineNumber,debuggerModelLocation.columnNumber);},dispose:function()
+{WebInspector.LiveLocation.prototype.dispose.call(this);this._script._locations.remove(this);},__proto__:WebInspector.LiveLocation.prototype}
+WebInspector.LinkifierFormatter=function()
+{}
+WebInspector.LinkifierFormatter.prototype={formatLiveAnchor:function(anchor,uiLocation){}}
+WebInspector.Linkifier=function(formatter)
+{this._formatter=formatter||new WebInspector.Linkifier.DefaultFormatter(WebInspector.Linkifier.MaxLengthForDisplayedURLs);this._liveLocations=[];}
+WebInspector.Linkifier.setLinkHandler=function(handler)
+{WebInspector.Linkifier._linkHandler=handler;}
+WebInspector.Linkifier.handleLink=function(url,lineNumber)
+{if(!WebInspector.Linkifier._linkHandler)
+return false;return WebInspector.Linkifier._linkHandler.handleLink(url,lineNumber)}
+WebInspector.Linkifier.linkifyUsingRevealer=function(revealable,text,fallbackHref,fallbackLineNumber,title,classes)
+{var a=document.createElement("a");a.className=(classes||"")+" webkit-html-resource-link";a.textContent=text.trimMiddle(WebInspector.Linkifier.MaxLengthForDisplayedURLs);a.title=title||text;if(fallbackHref){a.href=fallbackHref;a.lineNumber=fallbackLineNumber;}
+function clickHandler(event)
+{event.consume(true);if(fallbackHref&&WebInspector.Linkifier.handleLink(fallbackHref,fallbackLineNumber))
+return;WebInspector.Revealer.reveal(this);}
+a.addEventListener("click",clickHandler.bind(revealable),false);return a;}
+WebInspector.Linkifier.prototype={linkifyLocation:function(sourceURL,lineNumber,columnNumber,classes)
+{var rawLocation=WebInspector.debuggerModel.createRawLocationByURL(sourceURL,lineNumber,columnNumber||0);if(!rawLocation)
+return WebInspector.linkifyResourceAsNode(sourceURL,lineNumber,classes);return this.linkifyRawLocation(rawLocation,classes);},linkifyRawLocation:function(rawLocation,classes)
+{var script=WebInspector.debuggerModel.scriptForId(rawLocation.scriptId);if(!script)
+return null;var anchor=this._createAnchor(classes);var liveLocation=script.createLiveLocation(rawLocation,this._updateAnchor.bind(this,anchor));this._liveLocations.push(liveLocation);return anchor;},linkifyCSSLocation:function(styleSheetId,rawLocation,classes)
+{var anchor=this._createAnchor(classes);var liveLocation=WebInspector.cssModel.createLiveLocation(styleSheetId,rawLocation,this._updateAnchor.bind(this,anchor));if(!liveLocation)
+return null;this._liveLocations.push(liveLocation);return anchor;},_createAnchor:function(classes)
+{var anchor=document.createElement("a");anchor.className=(classes||"")+" webkit-html-resource-link";function clickHandler(event)
+{event.consume(true);if(!anchor.__uiLocation)
+return;if(WebInspector.Linkifier.handleLink(anchor.__uiLocation.url(),anchor.__uiLocation.lineNumber))
+return;WebInspector.Revealer.reveal(anchor.__uiLocation);}
+anchor.addEventListener("click",clickHandler,false);return anchor;},reset:function()
+{for(var i=0;i<this._liveLocations.length;++i)
+this._liveLocations[i].dispose();this._liveLocations=[];},_updateAnchor:function(anchor,uiLocation)
+{anchor.__uiLocation=uiLocation;this._formatter.formatLiveAnchor(anchor,uiLocation);}}
+WebInspector.Linkifier.DefaultFormatter=function(maxLength)
+{this._maxLength=maxLength;}
+WebInspector.Linkifier.DefaultFormatter.prototype={formatLiveAnchor:function(anchor,uiLocation)
+{var text=uiLocation.linkText();if(this._maxLength)
+text=text.trimMiddle(this._maxLength);anchor.textContent=text;var titleText=uiLocation.uiSourceCode.originURL();if(typeof uiLocation.lineNumber==="number")
+titleText+=":"+(uiLocation.lineNumber+1);anchor.title=titleText;}}
+WebInspector.Linkifier.DefaultCSSFormatter=function()
+{WebInspector.Linkifier.DefaultFormatter.call(this,WebInspector.Linkifier.DefaultCSSFormatter.MaxLengthForDisplayedURLs);}
+WebInspector.Linkifier.DefaultCSSFormatter.MaxLengthForDisplayedURLs=30;WebInspector.Linkifier.DefaultCSSFormatter.prototype={formatLiveAnchor:function(anchor,uiLocation)
+{WebInspector.Linkifier.DefaultFormatter.prototype.formatLiveAnchor.call(this,anchor,uiLocation);anchor.classList.add("webkit-html-resource-link");anchor.setAttribute("data-uncopyable",anchor.textContent);anchor.textContent="";},__proto__:WebInspector.Linkifier.DefaultFormatter.prototype}
+WebInspector.Linkifier.MaxLengthForDisplayedURLs=150;WebInspector.Linkifier.LinkHandler=function()
+{}
+WebInspector.Linkifier.LinkHandler.prototype={handleLink:function(url,lineNumber){}}
+WebInspector.Linkifier.liveLocationText=function(scriptId,lineNumber,columnNumber)
+{var script=WebInspector.debuggerModel.scriptForId(scriptId);if(!script)
+return"";var uiLocation=script.rawLocationToUILocation(lineNumber,columnNumber);return uiLocation.linkText();}
+WebInspector.DebuggerScriptMapping=function(debuggerModel,workspace,networkWorkspaceProvider)
+{this._defaultMapping=new WebInspector.DefaultScriptMapping(debuggerModel,workspace);this._resourceMapping=new WebInspector.ResourceScriptMapping(debuggerModel,workspace);this._compilerMapping=new WebInspector.CompilerScriptMapping(debuggerModel,workspace,networkWorkspaceProvider);this._snippetMapping=WebInspector.scriptSnippetModel.scriptMapping;WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource,this._parsedScriptSource,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource,this._parsedScriptSource,this);}
+WebInspector.DebuggerScriptMapping.prototype={_parsedScriptSource:function(event)
+{var script=(event.data);this._defaultMapping.addScript(script);if(script.isSnippet()){this._snippetMapping.addScript(script);return;}
+this._resourceMapping.addScript(script);if(WebInspector.settings.jsSourceMapsEnabled.get())
+this._compilerMapping.addScript(script);}}
+WebInspector.PresentationConsoleMessageHelper=function(workspace)
+{this._pendingConsoleMessages={};this._presentationConsoleMessages=[];this._workspace=workspace;WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,this._consoleMessageAdded,this);WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared,this._consoleCleared,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource,this._parsedScriptSource,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource,this._parsedScriptSource,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
+WebInspector.PresentationConsoleMessageHelper.prototype={_consoleMessageAdded:function(event)
+{var message=(event.data);if(!message.url||!message.isErrorOrWarning())
+return;var rawLocation=this._rawLocation(message);if(rawLocation)
+this._addConsoleMessageToScript(message,rawLocation);else
+this._addPendingConsoleMessage(message);},_rawLocation:function(message)
+{var lineNumber=message.stackTrace?message.stackTrace[0].lineNumber-1:message.line-1;var columnNumber=message.stackTrace&&message.stackTrace[0].columnNumber?message.stackTrace[0].columnNumber-1:0;return WebInspector.debuggerModel.createRawLocationByURL(message.url,lineNumber,columnNumber);},_addConsoleMessageToScript:function(message,rawLocation)
+{this._presentationConsoleMessages.push(new WebInspector.PresentationConsoleMessage(message,rawLocation));},_addPendingConsoleMessage:function(message)
+{if(!message.url)
+return;if(!this._pendingConsoleMessages[message.url])
+this._pendingConsoleMessages[message.url]=[];this._pendingConsoleMessages[message.url].push(message);},_parsedScriptSource:function(event)
+{var script=(event.data);var messages=this._pendingConsoleMessages[script.sourceURL];if(!messages)
+return;var pendingMessages=[];for(var i=0;i<messages.length;i++){var message=messages[i];var rawLocation=this._rawLocation(message);if(script.scriptId===rawLocation.scriptId)
+this._addConsoleMessageToScript(message,rawLocation);else
+pendingMessages.push(message);}
+if(pendingMessages.length)
+this._pendingConsoleMessages[script.sourceURL]=pendingMessages;else
+delete this._pendingConsoleMessages[script.sourceURL];},_consoleCleared:function()
+{this._pendingConsoleMessages={};for(var i=0;i<this._presentationConsoleMessages.length;++i)
+this._presentationConsoleMessages[i].dispose();this._presentationConsoleMessages=[];var uiSourceCodes=this._workspace.uiSourceCodes();for(var i=0;i<uiSourceCodes.length;++i)
+uiSourceCodes[i].consoleMessagesCleared();},_debuggerReset:function()
+{this._pendingConsoleMessages={};this._presentationConsoleMessages=[];}}
+WebInspector.PresentationConsoleMessage=function(message,rawLocation)
+{this.originalMessage=message;this._liveLocation=WebInspector.debuggerModel.createLiveLocation(rawLocation,this._updateLocation.bind(this));}
+WebInspector.PresentationConsoleMessage.prototype={_updateLocation:function(uiLocation)
+{if(this._uiLocation)
+this._uiLocation.uiSourceCode.consoleMessageRemoved(this);this._uiLocation=uiLocation;this._uiLocation.uiSourceCode.consoleMessageAdded(this);},get lineNumber()
+{return this._uiLocation.lineNumber;},dispose:function()
+{this._liveLocation.dispose();}}
+WebInspector.FileSystemProjectDelegate=function(isolatedFileSystem,workspace)
+{this._fileSystem=isolatedFileSystem;this._normalizedFileSystemPath=this._fileSystem.path();if(WebInspector.isWin())
+this._normalizedFileSystemPath=this._normalizedFileSystemPath.replace(/\\/g,"/");this._fileSystemURL="file://"+this._normalizedFileSystemPath+"/";this._workspace=workspace;this._searchCallbacks={};this._indexingCallbacks={};this._indexingProgresses={};}
+WebInspector.FileSystemProjectDelegate._scriptExtensions=["js","java","coffee","ts","dart"].keySet();WebInspector.FileSystemProjectDelegate._styleSheetExtensions=["css","scss","sass","less"].keySet();WebInspector.FileSystemProjectDelegate._documentExtensions=["htm","html","asp","aspx","phtml","jsp"].keySet();WebInspector.FileSystemProjectDelegate.projectId=function(fileSystemPath)
+{return"filesystem:"+fileSystemPath;}
+WebInspector.FileSystemProjectDelegate._lastRequestId=0;WebInspector.FileSystemProjectDelegate.prototype={id:function()
+{return WebInspector.FileSystemProjectDelegate.projectId(this._fileSystem.path());},type:function()
+{return WebInspector.projectTypes.FileSystem;},fileSystemPath:function()
+{return this._fileSystem.path();},displayName:function()
+{return this._normalizedFileSystemPath.substr(this._normalizedFileSystemPath.lastIndexOf("/")+1);},_filePathForPath:function(path)
+{return"/"+path;},requestFileContent:function(path,callback)
+{var filePath=this._filePathForPath(path);this._fileSystem.requestFileContent(filePath,callback);},requestMetadata:function(path,callback)
+{var filePath=this._filePathForPath(path);this._fileSystem.requestMetadata(filePath,callback);},canSetFileContent:function()
+{return true;},setFileContent:function(path,newContent,callback)
+{var filePath=this._filePathForPath(path);this._fileSystem.setFileContent(filePath,newContent,callback.bind(this,""));},canRename:function()
+{return true;},rename:function(path,newName,callback)
+{var filePath=this._filePathForPath(path);this._fileSystem.renameFile(filePath,newName,innerCallback.bind(this));function innerCallback(success,newName)
+{if(!success){callback(false,newName);return;}
+var validNewName=(newName);console.assert(validNewName);var slash=filePath.lastIndexOf("/");var parentPath=filePath.substring(0,slash);filePath=parentPath+"/"+validNewName;var newURL=this._workspace.urlForPath(this._fileSystem.path(),filePath);var extension=this._extensionForPath(validNewName);var newOriginURL=this._fileSystemURL+filePath
+var newContentType=this._contentTypeForExtension(extension);callback(true,validNewName,newURL,newOriginURL,newContentType);}},searchInFileContent:function(path,query,caseSensitive,isRegex,callback)
+{var filePath=this._filePathForPath(path);this._fileSystem.requestFileContent(filePath,contentCallback);function contentCallback(content)
+{var result=[];if(content!==null)
+result=WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex);callback(result);}},findFilesMatchingSearchRequest:function(queries,fileQueries,caseSensitive,isRegex,progress,callback)
+{var result=null;var queriesToRun=queries.slice();if(!queriesToRun.length)
+queriesToRun.push("");progress.setTotalWork(queriesToRun.length);searchNextQuery.call(this);function searchNextQuery()
+{if(!queriesToRun.length){matchFileQueries.call(null,result);return;}
+var query=queriesToRun.shift();this._searchInPath(isRegex?"":query,progress,innerCallback.bind(this));}
+function innerCallback(files)
+{files=files.sort();progress.worked(1);if(!result)
+result=files;else
+result=result.intersectOrdered(files,String.naturalOrderComparator);searchNextQuery.call(this);}
+function matchFileQueries(files)
+{var fileRegexes=[];for(var i=0;i<fileQueries.length;++i)
+fileRegexes.push(new RegExp(fileQueries[i],caseSensitive?"":"i"));function filterOutNonMatchingFiles(file)
+{for(var i=0;i<fileRegexes.length;++i){if(!file.match(fileRegexes[i]))
+return false;}
+return true;}
+files=files.filter(filterOutNonMatchingFiles);progress.done();callback(files);}},_searchInPath:function(query,progress,callback)
+{var requestId=++WebInspector.FileSystemProjectDelegate._lastRequestId;this._searchCallbacks[requestId]=innerCallback.bind(this);InspectorFrontendHost.searchInPath(requestId,this._fileSystem.path(),query);function innerCallback(files)
+{function trimAndNormalizeFileSystemPath(fullPath)
+{var trimmedPath=fullPath.substr(this._fileSystem.path().length+1);if(WebInspector.isWin())
+trimmedPath=trimmedPath.replace(/\\/g,"/");return trimmedPath;}
+files=files.map(trimAndNormalizeFileSystemPath.bind(this));progress.worked(1);callback(files);}},searchCompleted:function(requestId,files)
+{if(!this._searchCallbacks[requestId])
+return;var callback=this._searchCallbacks[requestId];delete this._searchCallbacks[requestId];callback(files);},indexContent:function(progress,callback)
+{var requestId=++WebInspector.FileSystemProjectDelegate._lastRequestId;this._indexingCallbacks[requestId]=callback;this._indexingProgresses[requestId]=progress;progress.setTotalWork(1);progress.addEventListener(WebInspector.Progress.Events.Canceled,this._indexingCanceled.bind(this,requestId));InspectorFrontendHost.indexPath(requestId,this._fileSystem.path());},_indexingCanceled:function(requestId)
+{if(!this._indexingProgresses[requestId])
+return;InspectorFrontendHost.stopIndexing(requestId);delete this._indexingProgresses[requestId];delete this._indexingCallbacks[requestId];},indexingTotalWorkCalculated:function(requestId,totalWork)
+{if(!this._indexingProgresses[requestId])
+return;var progress=this._indexingProgresses[requestId];progress.setTotalWork(totalWork);},indexingWorked:function(requestId,worked)
+{if(!this._indexingProgresses[requestId])
+return;var progress=this._indexingProgresses[requestId];progress.worked(worked);},indexingDone:function(requestId)
+{if(!this._indexingProgresses[requestId])
+return;var progress=this._indexingProgresses[requestId];var callback=this._indexingCallbacks[requestId];delete this._indexingProgresses[requestId];delete this._indexingCallbacks[requestId];progress.done();callback.call();},_extensionForPath:function(path)
+{var extensionIndex=path.lastIndexOf(".");if(extensionIndex===-1)
+return"";return path.substring(extensionIndex+1).toLowerCase();},_contentTypeForExtension:function(extension)
+{if(WebInspector.FileSystemProjectDelegate._scriptExtensions[extension])
+return WebInspector.resourceTypes.Script;if(WebInspector.FileSystemProjectDelegate._styleSheetExtensions[extension])
+return WebInspector.resourceTypes.Stylesheet;if(WebInspector.FileSystemProjectDelegate._documentExtensions[extension])
+return WebInspector.resourceTypes.Document;return WebInspector.resourceTypes.Other;},populate:function()
+{this._fileSystem.requestFilesRecursive("",this._addFile.bind(this));},refresh:function(path)
+{this._fileSystem.requestFilesRecursive(path,this._addFile.bind(this));},excludeFolder:function(path)
+{WebInspector.isolatedFileSystemManager.mapping().addExcludedFolder(this._fileSystem.path(),path);},createFile:function(path,name,content,callback)
+{this._fileSystem.createFile(path,name,innerCallback.bind(this));var createFilePath;function innerCallback(filePath)
+{if(!filePath){callback(null);return;}
+createFilePath=filePath;if(!content){contentSet.call(this);return;}
+this._fileSystem.setFileContent(filePath,content,contentSet.bind(this));}
+function contentSet()
+{this._addFile(createFilePath);callback(createFilePath);}},deleteFile:function(path)
+{this._fileSystem.deleteFile(path);this._removeFile(path);},remove:function()
+{WebInspector.isolatedFileSystemManager.removeFileSystem(this._fileSystem.path());},_addFile:function(filePath)
+{if(!filePath)
+console.assert(false);var slash=filePath.lastIndexOf("/");var parentPath=filePath.substring(0,slash);var name=filePath.substring(slash+1);var url=this._workspace.urlForPath(this._fileSystem.path(),filePath);var extension=this._extensionForPath(name);var contentType=this._contentTypeForExtension(extension);var fileDescriptor=new WebInspector.FileDescriptor(parentPath,name,this._fileSystemURL+filePath,url,contentType,true);this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded,fileDescriptor);},_removeFile:function(path)
+{this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved,path);},reset:function()
+{this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.Reset,null);},__proto__:WebInspector.Object.prototype}
+WebInspector.fileSystemProjectDelegate;WebInspector.FileSystemWorkspaceProvider=function(isolatedFileSystemManager,workspace)
+{this._isolatedFileSystemManager=isolatedFileSystemManager;this._workspace=workspace;this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,this._fileSystemAdded,this);this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,this._fileSystemRemoved,this);this._projectDelegates={};}
+WebInspector.FileSystemWorkspaceProvider.prototype={_fileSystemAdded:function(event)
+{var fileSystem=(event.data);var projectId=WebInspector.FileSystemProjectDelegate.projectId(fileSystem.path());var projectDelegate=new WebInspector.FileSystemProjectDelegate(fileSystem,this._workspace)
+this._projectDelegates[projectDelegate.id()]=projectDelegate;console.assert(!this._workspace.project(projectDelegate.id()));this._workspace.addProject(projectDelegate);projectDelegate.populate();},_fileSystemRemoved:function(event)
+{var fileSystem=(event.data);var projectId=WebInspector.FileSystemProjectDelegate.projectId(fileSystem.path());this._workspace.removeProject(projectId);delete this._projectDelegates[projectId];},fileSystemPath:function(uiSourceCode)
+{var projectDelegate=this._projectDelegates[uiSourceCode.project().id()];return projectDelegate.fileSystemPath();},delegate:function(fileSystemPath)
+{var projectId=WebInspector.FileSystemProjectDelegate.projectId(fileSystemPath);return this._projectDelegates[projectId];}}
+WebInspector.fileSystemWorkspaceProvider;WebInspector.FileSystemMapping=function()
+{WebInspector.Object.call(this);this._fileSystemMappingSetting=WebInspector.settings.createSetting("fileSystemMapping",{});this._excludedFoldersSetting=WebInspector.settings.createSetting("workspaceExcludedFolders",{});var defaultCommonExcludedFolders=["/\\.git/","/\\.sass-cache/","/\\.hg/","/\\.idea/","/\\.svn/","/\\.cache/","/\\.project/"];var defaultWinExcludedFolders=["/Thumbs.db$","/ehthumbs.db$","/Desktop.ini$","/\\$RECYCLE.BIN/"];var defaultMacExcludedFolders=["/\\.DS_Store$","/\\.Trashes$","/\\.Spotlight-V100$","/\\.AppleDouble$","/\\.LSOverride$","/Icon$","/\\._.*$"];var defaultLinuxExcludedFolders=["/.*~$"];var defaultExcludedFolders=defaultCommonExcludedFolders;if(WebInspector.isWin())
+defaultExcludedFolders=defaultExcludedFolders.concat(defaultWinExcludedFolders);else if(WebInspector.isMac())
+defaultExcludedFolders=defaultExcludedFolders.concat(defaultMacExcludedFolders);else
+defaultExcludedFolders=defaultExcludedFolders.concat(defaultLinuxExcludedFolders);var defaultExcludedFoldersPattern=defaultExcludedFolders.join("|");WebInspector.settings.workspaceFolderExcludePattern=WebInspector.settings.createRegExpSetting("workspaceFolderExcludePattern",defaultExcludedFoldersPattern,WebInspector.isWin()?"i":"");this._fileSystemMappings={};this._excludedFolders={};this._loadFromSettings();}
+WebInspector.FileSystemMapping.Events={FileMappingAdded:"FileMappingAdded",FileMappingRemoved:"FileMappingRemoved",ExcludedFolderAdded:"ExcludedFolderAdded",ExcludedFolderRemoved:"ExcludedFolderRemoved"}
+WebInspector.FileSystemMapping.prototype={_loadFromSettings:function()
+{var savedMapping=this._fileSystemMappingSetting.get();this._fileSystemMappings={};for(var fileSystemPath in savedMapping){var savedFileSystemMappings=savedMapping[fileSystemPath];this._fileSystemMappings[fileSystemPath]=[];var fileSystemMappings=this._fileSystemMappings[fileSystemPath];for(var i=0;i<savedFileSystemMappings.length;++i){var savedEntry=savedFileSystemMappings[i];var entry=new WebInspector.FileSystemMapping.Entry(savedEntry.fileSystemPath,savedEntry.urlPrefix,savedEntry.pathPrefix);fileSystemMappings.push(entry);}}
+var savedExcludedFolders=this._excludedFoldersSetting.get();this._excludedFolders={};for(var fileSystemPath in savedExcludedFolders){var savedExcludedFoldersForPath=savedExcludedFolders[fileSystemPath];this._excludedFolders[fileSystemPath]=[];var excludedFolders=this._excludedFolders[fileSystemPath];for(var i=0;i<savedExcludedFoldersForPath.length;++i){var savedEntry=savedExcludedFoldersForPath[i];var entry=new WebInspector.FileSystemMapping.ExcludedFolderEntry(savedEntry.fileSystemPath,savedEntry.path);excludedFolders.push(entry);}}
+this._rebuildIndexes();},_saveToSettings:function()
+{var savedMapping=this._fileSystemMappings;this._fileSystemMappingSetting.set(savedMapping);var savedExcludedFolders=this._excludedFolders;this._excludedFoldersSetting.set(savedExcludedFolders);this._rebuildIndexes();},_rebuildIndexes:function()
+{this._mappingForURLPrefix={};this._urlPrefixes=[];for(var fileSystemPath in this._fileSystemMappings){var fileSystemMapping=this._fileSystemMappings[fileSystemPath];for(var i=0;i<fileSystemMapping.length;++i){var entry=fileSystemMapping[i];this._mappingForURLPrefix[entry.urlPrefix]=entry;this._urlPrefixes.push(entry.urlPrefix);}}
+this._urlPrefixes.sort();},addFileSystem:function(fileSystemPath)
+{if(this._fileSystemMappings[fileSystemPath])
+return;this._fileSystemMappings[fileSystemPath]=[];this._saveToSettings();},removeFileSystem:function(fileSystemPath)
+{if(!this._fileSystemMappings[fileSystemPath])
+return;delete this._fileSystemMappings[fileSystemPath];delete this._excludedFolders[fileSystemPath];this._saveToSettings();},addFileMapping:function(fileSystemPath,urlPrefix,pathPrefix)
+{var entry=new WebInspector.FileSystemMapping.Entry(fileSystemPath,urlPrefix,pathPrefix);this._fileSystemMappings[fileSystemPath].push(entry);this._saveToSettings();this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingAdded,entry);},removeFileMapping:function(fileSystemPath,urlPrefix,pathPrefix)
+{var entry=this._mappingEntryForPathPrefix(fileSystemPath,pathPrefix);if(!entry)
+return;this._fileSystemMappings[fileSystemPath].remove(entry);this._saveToSettings();this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingRemoved,entry);},addExcludedFolder:function(fileSystemPath,excludedFolderPath)
+{if(!this._excludedFolders[fileSystemPath])
+this._excludedFolders[fileSystemPath]=[];var entry=new WebInspector.FileSystemMapping.ExcludedFolderEntry(fileSystemPath,excludedFolderPath);this._excludedFolders[fileSystemPath].push(entry);this._saveToSettings();this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.ExcludedFolderAdded,entry);},removeExcludedFolder:function(fileSystemPath,path)
+{var entry=this._excludedFolderEntryForPath(fileSystemPath,path);if(!entry)
+return;this._excludedFolders[fileSystemPath].remove(entry);this._saveToSettings();this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.ExcludedFolderRemoved,entry);},fileSystemPaths:function()
+{return Object.keys(this._fileSystemMappings);},_mappingEntryForURL:function(url)
+{for(var i=this._urlPrefixes.length-1;i>=0;--i){var urlPrefix=this._urlPrefixes[i];if(url.startsWith(urlPrefix))
+return this._mappingForURLPrefix[urlPrefix];}
+return null;},_excludedFolderEntryForPath:function(fileSystemPath,path)
+{var entries=this._excludedFolders[fileSystemPath];if(!entries)
+return null;for(var i=0;i<entries.length;++i){if(entries[i].path===path)
+return entries[i];}
+return null;},_mappingEntryForPath:function(fileSystemPath,filePath)
+{var entries=this._fileSystemMappings[fileSystemPath];if(!entries)
+return null;var entry=null;for(var i=0;i<entries.length;++i){var pathPrefix=entries[i].pathPrefix;if(entry&&entry.pathPrefix.length>pathPrefix.length)
+continue;if(filePath.startsWith(pathPrefix.substr(1)))
+entry=entries[i];}
+return entry;},_mappingEntryForPathPrefix:function(fileSystemPath,pathPrefix)
+{var entries=this._fileSystemMappings[fileSystemPath];for(var i=0;i<entries.length;++i){if(pathPrefix===entries[i].pathPrefix)
+return entries[i];}
+return null;},isFileExcluded:function(fileSystemPath,folderPath)
+{var excludedFolders=this._excludedFolders[fileSystemPath]||[];for(var i=0;i<excludedFolders.length;++i){var entry=excludedFolders[i];if(entry.path===folderPath)
+return true;}
+var regex=WebInspector.settings.workspaceFolderExcludePattern.asRegExp();return regex&&regex.test(folderPath);},excludedFolders:function(fileSystemPath)
+{var excludedFolders=this._excludedFolders[fileSystemPath];return excludedFolders?excludedFolders.slice():[];},mappingEntries:function(fileSystemPath)
+{return this._fileSystemMappings[fileSystemPath].slice();},hasMappingForURL:function(url)
+{return!!this._mappingEntryForURL(url);},fileForURL:function(url)
+{var entry=this._mappingEntryForURL(url);if(!entry)
+return null;var file={};file.fileSystemPath=entry.fileSystemPath;file.filePath=entry.pathPrefix.substr(1)+url.substr(entry.urlPrefix.length);return file;},urlForPath:function(fileSystemPath,filePath)
+{var entry=this._mappingEntryForPath(fileSystemPath,filePath);if(!entry)
+return"";return entry.urlPrefix+filePath.substring(entry.pathPrefix.length-1);},removeMappingForURL:function(url)
+{var entry=this._mappingEntryForURL(url);if(!entry)
+return;this._fileSystemMappings[entry.fileSystemPath].remove(entry);this._saveToSettings();},addMappingForResource:function(url,fileSystemPath,filePath)
+{var commonPathSuffixLength=0;var normalizedFilePath="/"+filePath;for(var i=0;i<normalizedFilePath.length;++i){var filePathCharacter=normalizedFilePath[normalizedFilePath.length-1-i];var urlCharacter=url[url.length-1-i];if(filePathCharacter!==urlCharacter)
+break;if(filePathCharacter==="/")
+commonPathSuffixLength=i;}
+var pathPrefix=normalizedFilePath.substr(0,normalizedFilePath.length-commonPathSuffixLength);var urlPrefix=url.substr(0,url.length-commonPathSuffixLength);this.addFileMapping(fileSystemPath,urlPrefix,pathPrefix);},__proto__:WebInspector.Object.prototype}
+WebInspector.FileSystemMapping.Entry=function(fileSystemPath,urlPrefix,pathPrefix)
+{this.fileSystemPath=fileSystemPath;this.urlPrefix=urlPrefix;this.pathPrefix=pathPrefix;}
+WebInspector.FileSystemMapping.ExcludedFolderEntry=function(fileSystemPath,path)
+{this.fileSystemPath=fileSystemPath;this.path=path;}
+WebInspector.IsolatedFileSystem=function(manager,path,name,rootURL)
+{this._manager=manager;this._path=path;this._name=name;this._rootURL=rootURL;}
+WebInspector.IsolatedFileSystem.errorMessage=function(error)
+{var msg;switch(error.code){case FileError.QUOTA_EXCEEDED_ERR:msg="QUOTA_EXCEEDED_ERR";break;case FileError.NOT_FOUND_ERR:msg="NOT_FOUND_ERR";break;case FileError.SECURITY_ERR:msg="SECURITY_ERR";break;case FileError.INVALID_MODIFICATION_ERR:msg="INVALID_MODIFICATION_ERR";break;case FileError.INVALID_STATE_ERR:msg="INVALID_STATE_ERR";break;default:msg=WebInspector.UIString("Unknown Error");break;};return WebInspector.UIString("File system error: %s",msg);}
+WebInspector.IsolatedFileSystem.prototype={path:function()
+{return this._path;},name:function()
+{return this._name;},rootURL:function()
+{return this._rootURL;},_requestFileSystem:function(callback)
+{this._manager.requestDOMFileSystem(this._path,callback);},requestFilesRecursive:function(path,callback)
+{this._requestFileSystem(fileSystemLoaded.bind(this));var domFileSystem;function fileSystemLoaded(fs)
+{domFileSystem=(fs);console.assert(domFileSystem);this._requestEntries(domFileSystem,path,innerCallback.bind(this));}
+function innerCallback(entries)
+{for(var i=0;i<entries.length;++i){var entry=entries[i];if(!entry.isDirectory){if(this._manager.mapping().isFileExcluded(this._path,entry.fullPath))
+continue;callback(entry.fullPath.substr(1));}
+else{if(this._manager.mapping().isFileExcluded(this._path,entry.fullPath+"/"))
+continue;this._requestEntries(domFileSystem,entry.fullPath,innerCallback.bind(this));}}}},createFile:function(path,name,callback)
+{this._requestFileSystem(fileSystemLoaded.bind(this));var newFileIndex=1;if(!name)
+name="NewFile";var nameCandidate;function fileSystemLoaded(fs)
+{var domFileSystem=(fs);console.assert(domFileSystem);domFileSystem.root.getDirectory(path,null,dirEntryLoaded.bind(this),errorHandler.bind(this));}
+function dirEntryLoaded(dirEntry)
+{var nameCandidate=name;if(newFileIndex>1)
+nameCandidate+=newFileIndex;++newFileIndex;dirEntry.getFile(nameCandidate,{create:true,exclusive:true},fileCreated,fileCreationError.bind(this));function fileCreated(entry)
+{callback(entry.fullPath.substr(1));}
+function fileCreationError(error)
+{if(error.code===FileError.INVALID_MODIFICATION_ERR){dirEntryLoaded.call(this,dirEntry);return;}
+var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when testing if file exists '"+(this._path+"/"+path+"/"+nameCandidate)+"'");callback(null);}}
+function errorHandler(error)
+{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);var filePath=this._path+"/"+path;if(nameCandidate)
+filePath+="/"+nameCandidate;console.error(errorMessage+" when getting content for file '"+(filePath)+"'");callback(null);}},deleteFile:function(path)
+{this._requestFileSystem(fileSystemLoaded.bind(this));function fileSystemLoaded(fs)
+{var domFileSystem=(fs);console.assert(domFileSystem);domFileSystem.root.getFile(path,null,fileEntryLoaded.bind(this),errorHandler.bind(this));}
+function fileEntryLoaded(fileEntry)
+{fileEntry.remove(fileEntryRemoved,errorHandler.bind(this));}
+function fileEntryRemoved()
+{}
+function errorHandler(error)
+{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when deleting file '"+(this._path+"/"+path)+"'");}},requestMetadata:function(path,callback)
+{this._requestFileSystem(fileSystemLoaded);function fileSystemLoaded(fs)
+{var domFileSystem=(fs);console.assert(domFileSystem);domFileSystem.root.getFile(path,null,fileEntryLoaded,errorHandler);}
+function fileEntryLoaded(entry)
+{entry.getMetadata(successHandler,errorHandler);}
+function successHandler(metadata)
+{callback(metadata.modificationTime,metadata.size);}
+function errorHandler(error)
+{callback(null,null);}},requestFileContent:function(path,callback)
+{this._requestFileSystem(fileSystemLoaded.bind(this));function fileSystemLoaded(fs)
+{var domFileSystem=(fs);console.assert(domFileSystem);domFileSystem.root.getFile(path,null,fileEntryLoaded.bind(this),errorHandler.bind(this));}
+function fileEntryLoaded(entry)
+{entry.file(fileLoaded,errorHandler.bind(this));}
+function fileLoaded(file)
+{var reader=new FileReader();reader.onloadend=readerLoadEnd;reader.readAsText(file);}
+function readerLoadEnd()
+{callback((this.result));}
+function errorHandler(error)
+{if(error.code===FileError.NOT_FOUND_ERR){callback(null);return;}
+var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when getting content for file '"+(this._path+"/"+path)+"'");callback(null);}},setFileContent:function(path,content,callback)
+{this._requestFileSystem(fileSystemLoaded.bind(this));function fileSystemLoaded(fs)
+{var domFileSystem=(fs);console.assert(domFileSystem);domFileSystem.root.getFile(path,{create:true},fileEntryLoaded.bind(this),errorHandler.bind(this));}
+function fileEntryLoaded(entry)
+{entry.createWriter(fileWriterCreated.bind(this),errorHandler.bind(this));}
+function fileWriterCreated(fileWriter)
+{fileWriter.onerror=errorHandler.bind(this);fileWriter.onwriteend=fileTruncated;fileWriter.truncate(0);function fileTruncated()
+{fileWriter.onwriteend=writerEnd;var blob=new Blob([content],{type:"text/plain"});fileWriter.write(blob);}}
+function writerEnd()
+{callback();}
+function errorHandler(error)
+{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when setting content for file '"+(this._path+"/"+path)+"'");callback();}},renameFile:function(path,newName,callback)
+{newName=newName?newName.trim():newName;if(!newName||newName.indexOf("/")!==-1){callback(false);return;}
+var fileEntry;var dirEntry;var newFileEntry;this._requestFileSystem(fileSystemLoaded.bind(this));function fileSystemLoaded(fs)
+{var domFileSystem=(fs);console.assert(domFileSystem);domFileSystem.root.getFile(path,null,fileEntryLoaded.bind(this),errorHandler.bind(this));}
+function fileEntryLoaded(entry)
+{if(entry.name===newName){callback(false);return;}
+fileEntry=entry;fileEntry.getParent(dirEntryLoaded.bind(this),errorHandler.bind(this));}
+function dirEntryLoaded(entry)
+{dirEntry=entry;dirEntry.getFile(newName,null,newFileEntryLoaded,newFileEntryLoadErrorHandler.bind(this));}
+function newFileEntryLoaded(entry)
+{callback(false);}
+function newFileEntryLoadErrorHandler(error)
+{if(error.code!==FileError.NOT_FOUND_ERR){callback(false);return;}
+fileEntry.moveTo(dirEntry,newName,fileRenamed,errorHandler.bind(this));}
+function fileRenamed(entry)
+{callback(true,entry.name);}
+function errorHandler(error)
+{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when renaming file '"+(this._path+"/"+path)+"' to '"+newName+"'");callback(false);}},_readDirectory:function(dirEntry,callback)
+{var dirReader=dirEntry.createReader();var entries=[];function innerCallback(results)
+{if(!results.length)
+callback(entries.sort());else{entries=entries.concat(toArray(results));dirReader.readEntries(innerCallback,errorHandler);}}
+function toArray(list)
+{return Array.prototype.slice.call(list||[],0);}
+dirReader.readEntries(innerCallback,errorHandler);function errorHandler(error)
+{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when reading directory '"+dirEntry.fullPath+"'");callback([]);}},_requestEntries:function(domFileSystem,path,callback)
+{domFileSystem.root.getDirectory(path,null,innerCallback.bind(this),errorHandler);function innerCallback(dirEntry)
+{this._readDirectory(dirEntry,callback)}
+function errorHandler(error)
+{var errorMessage=WebInspector.IsolatedFileSystem.errorMessage(error);console.error(errorMessage+" when requesting entry '"+path+"'");callback([]);}}}
+WebInspector.IsolatedFileSystemManager=function()
+{this._fileSystems={};this._pendingFileSystemRequests={};this._fileSystemMapping=new WebInspector.FileSystemMapping();this._requestFileSystems();}
+WebInspector.IsolatedFileSystemManager.FileSystem;WebInspector.IsolatedFileSystemManager.Events={FileSystemAdded:"FileSystemAdded",FileSystemRemoved:"FileSystemRemoved"}
+WebInspector.IsolatedFileSystemManager.prototype={mapping:function()
+{return this._fileSystemMapping;},_requestFileSystems:function()
+{console.assert(!this._loaded);InspectorFrontendHost.requestFileSystems();},addFileSystem:function()
+{InspectorFrontendHost.addFileSystem();},removeFileSystem:function(fileSystemPath)
+{InspectorFrontendHost.removeFileSystem(fileSystemPath);},_fileSystemsLoaded:function(fileSystems)
+{var addedFileSystemPaths={};for(var i=0;i<fileSystems.length;++i){this._innerAddFileSystem(fileSystems[i]);addedFileSystemPaths[fileSystems[i].fileSystemPath]=true;}
+var fileSystemPaths=this._fileSystemMapping.fileSystemPaths();for(var i=0;i<fileSystemPaths.length;++i){var fileSystemPath=fileSystemPaths[i];if(!addedFileSystemPaths[fileSystemPath])
+this._fileSystemRemoved(fileSystemPath);}
+this._loaded=true;this._processPendingFileSystemRequests();},_innerAddFileSystem:function(fileSystem)
+{var fileSystemPath=fileSystem.fileSystemPath;this._fileSystemMapping.addFileSystem(fileSystemPath);var isolatedFileSystem=new WebInspector.IsolatedFileSystem(this,fileSystemPath,fileSystem.fileSystemName,fileSystem.rootURL);this._fileSystems[fileSystemPath]=isolatedFileSystem;this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,isolatedFileSystem);},_processPendingFileSystemRequests:function()
+{for(var fileSystemPath in this._pendingFileSystemRequests){var callbacks=this._pendingFileSystemRequests[fileSystemPath];for(var i=0;i<callbacks.length;++i)
+callbacks[i](this._isolatedFileSystem(fileSystemPath));}
+delete this._pendingFileSystemRequests;},_fileSystemAdded:function(errorMessage,fileSystem)
+{var fileSystemPath;if(errorMessage)
+WebInspector.console.showErrorMessage(errorMessage)
+else if(fileSystem){this._innerAddFileSystem(fileSystem);fileSystemPath=fileSystem.fileSystemPath;}},_fileSystemRemoved:function(fileSystemPath)
+{this._fileSystemMapping.removeFileSystem(fileSystemPath);var isolatedFileSystem=this._fileSystems[fileSystemPath];delete this._fileSystems[fileSystemPath];if(isolatedFileSystem)
+this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,isolatedFileSystem);},_isolatedFileSystem:function(fileSystemPath)
+{var fileSystem=this._fileSystems[fileSystemPath];if(!fileSystem)
+return null;if(!InspectorFrontendHost.isolatedFileSystem)
+return null;return InspectorFrontendHost.isolatedFileSystem(fileSystem.name(),fileSystem.rootURL());},requestDOMFileSystem:function(fileSystemPath,callback)
+{if(!this._loaded){if(!this._pendingFileSystemRequests[fileSystemPath])
+this._pendingFileSystemRequests[fileSystemPath]=this._pendingFileSystemRequests[fileSystemPath]||[];this._pendingFileSystemRequests[fileSystemPath].push(callback);return;}
+callback(this._isolatedFileSystem(fileSystemPath));},__proto__:WebInspector.Object.prototype}
+WebInspector.isolatedFileSystemManager;WebInspector.IsolatedFileSystemDispatcher=function(IsolatedFileSystemManager)
+{this._IsolatedFileSystemManager=IsolatedFileSystemManager;}
+WebInspector.IsolatedFileSystemDispatcher.prototype={fileSystemsLoaded:function(fileSystems)
+{this._IsolatedFileSystemManager._fileSystemsLoaded(fileSystems);},fileSystemRemoved:function(fileSystemPath)
+{this._IsolatedFileSystemManager._fileSystemRemoved(fileSystemPath);},fileSystemAdded:function(errorMessage,fileSystem)
+{this._IsolatedFileSystemManager._fileSystemAdded(errorMessage,fileSystem);}}
+WebInspector.isolatedFileSystemDispatcher;WebInspector.FileDescriptor=function(parentPath,name,originURL,url,contentType,isEditable,isContentScript)
+{this.parentPath=parentPath;this.name=name;this.originURL=originURL;this.url=url;this.contentType=contentType;this.isEditable=isEditable;this.isContentScript=isContentScript||false;}
+WebInspector.ProjectDelegate=function(){}
+WebInspector.ProjectDelegate.Events={FileAdded:"FileAdded",FileRemoved:"FileRemoved",Reset:"Reset",}
+WebInspector.ProjectDelegate.prototype={id:function(){},type:function(){},displayName:function(){},requestMetadata:function(path,callback){},requestFileContent:function(path,callback){},canSetFileContent:function(){},setFileContent:function(path,newContent,callback){},canRename:function(){},rename:function(path,newName,callback){},refresh:function(path){},excludeFolder:function(path){},createFile:function(path,name,content,callback){},deleteFile:function(path){},remove:function(){},searchInFileContent:function(path,query,caseSensitive,isRegex,callback){},findFilesMatchingSearchRequest:function(queries,fileQueries,caseSensitive,isRegex,progress,callback){},indexContent:function(progress,callback){}}
+WebInspector.Project=function(workspace,projectDelegate)
+{this._uiSourceCodesMap={};this._uiSourceCodesList=[];this._workspace=workspace;this._projectDelegate=projectDelegate;this._displayName=this._projectDelegate.displayName();this._projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileAdded,this._fileAdded,this);this._projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileRemoved,this._fileRemoved,this);this._projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.Reset,this._reset,this);}
+WebInspector.Project.prototype={id:function()
+{return this._projectDelegate.id();},type:function()
+{return this._projectDelegate.type();},displayName:function()
+{return this._displayName;},isServiceProject:function()
+{return this._projectDelegate.type()===WebInspector.projectTypes.Debugger||this._projectDelegate.type()===WebInspector.projectTypes.Formatter||this._projectDelegate.type()===WebInspector.projectTypes.LiveEdit;},_fileAdded:function(event)
+{var fileDescriptor=(event.data);var path=fileDescriptor.parentPath?fileDescriptor.parentPath+"/"+fileDescriptor.name:fileDescriptor.name;var uiSourceCode=this.uiSourceCode(path);if(uiSourceCode)
+return;uiSourceCode=new WebInspector.UISourceCode(this,fileDescriptor.parentPath,fileDescriptor.name,fileDescriptor.originURL,fileDescriptor.url,fileDescriptor.contentType,fileDescriptor.isEditable);uiSourceCode.isContentScript=fileDescriptor.isContentScript;this._uiSourceCodesMap[path]={uiSourceCode:uiSourceCode,index:this._uiSourceCodesList.length};this._uiSourceCodesList.push(uiSourceCode);this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeAdded,uiSourceCode);},_fileRemoved:function(event)
+{var path=(event.data);this._removeFile(path);},_removeFile:function(path)
+{var uiSourceCode=this.uiSourceCode(path);if(!uiSourceCode)
+return;var entry=this._uiSourceCodesMap[path];var movedUISourceCode=this._uiSourceCodesList[this._uiSourceCodesList.length-1];this._uiSourceCodesList[entry.index]=movedUISourceCode;var movedEntry=this._uiSourceCodesMap[movedUISourceCode.path()];movedEntry.index=entry.index;this._uiSourceCodesList.splice(this._uiSourceCodesList.length-1,1);delete this._uiSourceCodesMap[path];this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeRemoved,entry.uiSourceCode);},_reset:function()
+{this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectWillReset,this);this._uiSourceCodesMap={};this._uiSourceCodesList=[];},workspace:function()
+{return this._workspace;},uiSourceCode:function(path)
+{var entry=this._uiSourceCodesMap[path];return entry?entry.uiSourceCode:null;},uiSourceCodeForOriginURL:function(originURL)
+{for(var i=0;i<this._uiSourceCodesList.length;++i){var uiSourceCode=this._uiSourceCodesList[i];if(uiSourceCode.originURL()===originURL)
+return uiSourceCode;}
+return null;},uiSourceCodes:function()
+{return this._uiSourceCodesList;},requestMetadata:function(uiSourceCode,callback)
+{this._projectDelegate.requestMetadata(uiSourceCode.path(),callback);},requestFileContent:function(uiSourceCode,callback)
+{this._projectDelegate.requestFileContent(uiSourceCode.path(),callback);},canSetFileContent:function()
+{return this._projectDelegate.canSetFileContent();},setFileContent:function(uiSourceCode,newContent,callback)
+{this._projectDelegate.setFileContent(uiSourceCode.path(),newContent,onSetContent.bind(this));function onSetContent(content)
+{this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeContentCommitted,{uiSourceCode:uiSourceCode,content:newContent});callback(content);}},canRename:function()
+{return this._projectDelegate.canRename();},rename:function(uiSourceCode,newName,callback)
+{if(newName===uiSourceCode.name()){callback(true,uiSourceCode.name(),uiSourceCode.url,uiSourceCode.originURL(),uiSourceCode.contentType());return;}
+this._projectDelegate.rename(uiSourceCode.path(),newName,innerCallback.bind(this));function innerCallback(success,newName,newURL,newOriginURL,newContentType)
+{if(!success||!newName){callback(false);return;}
+var oldPath=uiSourceCode.path();var newPath=uiSourceCode.parentPath()?uiSourceCode.parentPath()+"/"+newName:newName;this._uiSourceCodesMap[newPath]=this._uiSourceCodesMap[oldPath];delete this._uiSourceCodesMap[oldPath];callback(true,newName,newURL,newOriginURL,newContentType);}},refresh:function(path)
+{this._projectDelegate.refresh(path);},excludeFolder:function(path)
+{this._projectDelegate.excludeFolder(path);var uiSourceCodes=this._uiSourceCodesList.slice();for(var i=0;i<uiSourceCodes.length;++i){var uiSourceCode=uiSourceCodes[i];if(uiSourceCode.path().startsWith(path.substr(1)))
+this._removeFile(uiSourceCode.path());}},createFile:function(path,name,content,callback)
+{this._projectDelegate.createFile(path,name,content,innerCallback);function innerCallback(filePath)
+{callback(filePath);}},deleteFile:function(path)
+{this._projectDelegate.deleteFile(path);},remove:function()
+{this._projectDelegate.remove();},searchInFileContent:function(uiSourceCode,query,caseSensitive,isRegex,callback)
+{this._projectDelegate.searchInFileContent(uiSourceCode.path(),query,caseSensitive,isRegex,callback);},findFilesMatchingSearchRequest:function(queries,fileQueries,caseSensitive,isRegex,progress,callback)
+{this._projectDelegate.findFilesMatchingSearchRequest(queries,fileQueries,caseSensitive,isRegex,progress,callback);},indexContent:function(progress,callback)
+{this._projectDelegate.indexContent(progress,callback);},dispose:function()
+{this._projectDelegate.reset();}}
+WebInspector.projectTypes={Debugger:"debugger",Formatter:"formatter",LiveEdit:"liveedit",Network:"network",Snippets:"snippets",FileSystem:"filesystem"}
+WebInspector.Workspace=function(fileSystemMapping)
+{this._fileSystemMapping=fileSystemMapping;this._projects={};this._hasResourceContentTrackingExtensions=false;}
+WebInspector.Workspace.Events={UISourceCodeAdded:"UISourceCodeAdded",UISourceCodeRemoved:"UISourceCodeRemoved",UISourceCodeContentCommitted:"UISourceCodeContentCommitted",ProjectWillReset:"ProjectWillReset"}
+WebInspector.Workspace.prototype={unsavedSourceCodes:function()
+{function filterUnsaved(sourceCode)
+{return sourceCode.isDirty();}
+return this.uiSourceCodes().filter(filterUnsaved);},uiSourceCode:function(projectId,path)
+{var project=this._projects[projectId];return project?project.uiSourceCode(path):null;},uiSourceCodeForOriginURL:function(originURL)
+{var networkProjects=this.projectsForType(WebInspector.projectTypes.Network)
+for(var i=0;i<networkProjects.length;++i){var project=networkProjects[i];var uiSourceCode=project.uiSourceCodeForOriginURL(originURL);if(uiSourceCode)
+return uiSourceCode;}
+return null;},uiSourceCodesForProjectType:function(type)
+{var result=[];for(var projectName in this._projects){var project=this._projects[projectName];if(project.type()===type)
+result=result.concat(project.uiSourceCodes());}
+return result;},addProject:function(projectDelegate)
+{var projectId=projectDelegate.id();this._projects[projectId]=new WebInspector.Project(this,projectDelegate);return this._projects[projectId];},removeProject:function(projectId)
+{var project=this._projects[projectId];if(!project)
+return;project.dispose();delete this._projects[projectId];},project:function(projectId)
+{return this._projects[projectId];},projects:function()
+{return Object.values(this._projects);},projectsForType:function(type)
+{function filterByType(project)
+{return project.type()===type;}
+return this.projects().filter(filterByType);},uiSourceCodes:function()
+{var result=[];for(var projectId in this._projects){var project=this._projects[projectId];result=result.concat(project.uiSourceCodes());}
+return result;},hasMappingForURL:function(url)
+{return this._fileSystemMapping.hasMappingForURL(url);},_networkUISourceCodeForURL:function(url)
+{var splitURL=WebInspector.ParsedURL.splitURL(url);var projectId=WebInspector.SimpleProjectDelegate.projectId(splitURL[0],WebInspector.projectTypes.Network);var project=this.project(projectId);return project?project.uiSourceCode(splitURL.slice(1).join("/")):null;},uiSourceCodeForURL:function(url)
+{var file=this._fileSystemMapping.fileForURL(url);if(!file)
+return this._networkUISourceCodeForURL(url);var projectId=WebInspector.FileSystemProjectDelegate.projectId(file.fileSystemPath);var project=this.project(projectId);return project?project.uiSourceCode(file.filePath):null;},urlForPath:function(fileSystemPath,filePath)
+{return this._fileSystemMapping.urlForPath(fileSystemPath,filePath);},addMapping:function(networkUISourceCode,uiSourceCode,fileSystemWorkspaceProvider)
+{var url=networkUISourceCode.url;var path=uiSourceCode.path();var fileSystemPath=fileSystemWorkspaceProvider.fileSystemPath(uiSourceCode);this._fileSystemMapping.addMappingForResource(url,fileSystemPath,path);},removeMapping:function(uiSourceCode)
+{this._fileSystemMapping.removeMappingForURL(uiSourceCode.url);},setHasResourceContentTrackingExtensions:function(hasExtensions)
+{this._hasResourceContentTrackingExtensions=hasExtensions;},hasResourceContentTrackingExtensions:function()
+{return this._hasResourceContentTrackingExtensions;},__proto__:WebInspector.Object.prototype}
+WebInspector.workspace;WebInspector.WorkspaceController=function(workspace)
+{this._workspace=workspace;WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._inspectedURLChanged,this);window.addEventListener("focus",this._windowFocused.bind(this),false);}
+WebInspector.WorkspaceController.prototype={_inspectedURLChanged:function(event)
+{WebInspector.Revision.filterOutStaleRevisions();},_windowFocused:function(event)
+{if(this._fileSystemRefreshTimeout)
+return;this._fileSystemRefreshTimeout=setTimeout(refreshFileSystems.bind(this),1000);function refreshFileSystems()
+{delete this._fileSystemRefreshTimeout;var projects=this._workspace.projects();for(var i=0;i<projects.length;++i)
+projects[i].refresh("/");}}}
+WebInspector.ContentProviderBasedProjectDelegate=function(type)
+{this._type=type;this._contentProviders={};this._isContentScriptMap={};}
+WebInspector.ContentProviderBasedProjectDelegate.prototype={id:function()
+{return"";},type:function()
+{return this._type;},displayName:function()
+{return"";},requestMetadata:function(path,callback)
+{callback(null,null);},requestFileContent:function(path,callback)
+{var contentProvider=this._contentProviders[path];contentProvider.requestContent(callback);function innerCallback(content,encoded,mimeType)
+{callback(content);}},canSetFileContent:function()
+{return false;},setFileContent:function(path,newContent,callback)
+{callback(null);},canRename:function()
+{return false;},rename:function(path,newName,callback)
+{this.performRename(path,newName,innerCallback.bind(this));function innerCallback(success,newName)
+{if(success)
+this._updateName(path,(newName));callback(success,newName);}},refresh:function(path)
+{},excludeFolder:function(path)
+{},createFile:function(path,name,content,callback)
+{},deleteFile:function(path)
+{},remove:function()
+{},performRename:function(path,newName,callback)
+{callback(false);},_updateName:function(path,newName)
+{var oldPath=path;var copyOfPath=path.split("/");copyOfPath[copyOfPath.length-1]=newName;var newPath=copyOfPath.join("/");this._contentProviders[newPath]=this._contentProviders[oldPath];delete this._contentProviders[oldPath];},searchInFileContent:function(path,query,caseSensitive,isRegex,callback)
+{var contentProvider=this._contentProviders[path];contentProvider.searchInContent(query,caseSensitive,isRegex,callback);},findFilesMatchingSearchRequest:function(queries,fileQueries,caseSensitive,isRegex,progress,callback)
+{var result=[];var paths=Object.keys(this._contentProviders);var totalCount=paths.length;if(totalCount===0){setTimeout(doneCallback,0);return;}
+function filterOutContentScripts(path)
+{return!this._isContentScriptMap[path];}
+if(!WebInspector.settings.searchInContentScripts.get())
+paths=paths.filter(filterOutContentScripts.bind(this));var fileRegexes=[];for(var i=0;i<fileQueries.length;++i)
+fileRegexes.push(new RegExp(fileQueries[i],caseSensitive?"":"i"));function filterOutNonMatchingFiles(file)
+{for(var i=0;i<fileRegexes.length;++i){if(!file.match(fileRegexes[i]))
+return false;}
+return true;}
+paths=paths.filter(filterOutNonMatchingFiles);var barrier=new CallbackBarrier();progress.setTotalWork(paths.length);for(var i=0;i<paths.length;++i)
+searchInContent.call(this,paths[i],barrier.createCallback(searchInContentCallback.bind(null,paths[i])));barrier.callWhenDone(doneCallback);function searchInContent(path,callback)
+{var queriesToRun=queries.slice();searchNextQuery.call(this);function searchNextQuery()
+{if(!queriesToRun.length){callback(true);return;}
+var query=queriesToRun.shift();this._contentProviders[path].searchInContent(query,caseSensitive,isRegex,contentCallback.bind(this));}
+function contentCallback(searchMatches)
+{if(!searchMatches.length){callback(false);return;}
+searchNextQuery.call(this);}}
+function searchInContentCallback(path,matches)
+{if(matches)
+result.push(path);progress.worked(1);}
+function doneCallback()
+{callback(result);progress.done();}},indexContent:function(progress,callback)
+{setTimeout(innerCallback,0);function innerCallback()
+{progress.done();callback();}},addContentProvider:function(parentPath,name,url,contentProvider,isEditable,isContentScript)
+{var path=parentPath?parentPath+"/"+name:name;if(this._contentProviders[path])
+return path;var fileDescriptor=new WebInspector.FileDescriptor(parentPath,name,url,url,contentProvider.contentType(),isEditable,isContentScript);this._contentProviders[path]=contentProvider;this._isContentScriptMap[path]=isContentScript||false;this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded,fileDescriptor);return path;},removeFile:function(path)
+{delete this._contentProviders[path];delete this._isContentScriptMap[path];this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved,path);},contentProviders:function()
+{return this._contentProviders;},reset:function()
+{this._contentProviders={};this._isContentScriptMap={};this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.Reset,null);},__proto__:WebInspector.Object.prototype}
+WebInspector.SimpleProjectDelegate=function(name,type)
+{WebInspector.ContentProviderBasedProjectDelegate.call(this,type);this._name=name;this._lastUniqueSuffix=0;}
+WebInspector.SimpleProjectDelegate.projectId=function(name,type)
+{var typePrefix=type!==WebInspector.projectTypes.Network?(type+":"):"";return typePrefix+name;}
+WebInspector.SimpleProjectDelegate.prototype={id:function()
+{return WebInspector.SimpleProjectDelegate.projectId(this._name,this.type());},displayName:function()
+{if(typeof this._displayName!=="undefined")
+return this._displayName;if(!this._name){this._displayName=this.type()!==WebInspector.projectTypes.Snippets?WebInspector.UIString("(no domain)"):"";return this._displayName;}
+var parsedURL=new WebInspector.ParsedURL(this._name);if(parsedURL.isValid){this._displayName=parsedURL.host+(parsedURL.port?(":"+parsedURL.port):"");if(!this._displayName)
+this._displayName=this._name;}
+else
+this._displayName=this._name;return this._displayName;},addFile:function(parentPath,name,forceUniquePath,url,contentProvider,isEditable,isContentScript)
+{if(forceUniquePath)
+name=this._ensureUniqueName(parentPath,name);return this.addContentProvider(parentPath,name,url,contentProvider,isEditable,isContentScript);},_ensureUniqueName:function(parentPath,name)
+{var path=parentPath?parentPath+"/"+name:name;var uniquePath=path;var suffix="";var contentProviders=this.contentProviders();while(contentProviders[uniquePath]){suffix=" ("+(++this._lastUniqueSuffix)+")";uniquePath=path+suffix;}
+return name+suffix;},__proto__:WebInspector.ContentProviderBasedProjectDelegate.prototype}
+WebInspector.SimpleWorkspaceProvider=function(workspace,type)
+{this._workspace=workspace;this._type=type;this._simpleProjectDelegates={};}
+WebInspector.SimpleWorkspaceProvider.prototype={_projectDelegate:function(projectName)
+{if(this._simpleProjectDelegates[projectName])
+return this._simpleProjectDelegates[projectName];var simpleProjectDelegate=new WebInspector.SimpleProjectDelegate(projectName,this._type);this._simpleProjectDelegates[projectName]=simpleProjectDelegate;this._workspace.addProject(simpleProjectDelegate);return simpleProjectDelegate;},addFileForURL:function(url,contentProvider,isEditable,isContentScript)
+{return this._innerAddFileForURL(url,contentProvider,isEditable,false,isContentScript);},addUniqueFileForURL:function(url,contentProvider,isEditable,isContentScript)
+{return this._innerAddFileForURL(url,contentProvider,isEditable,true,isContentScript);},_innerAddFileForURL:function(url,contentProvider,isEditable,forceUnique,isContentScript)
+{var splitURL=WebInspector.ParsedURL.splitURL(url);var projectName=splitURL[0];var parentPath=splitURL.slice(1,splitURL.length-1).join("/");var name=splitURL[splitURL.length-1];var projectDelegate=this._projectDelegate(projectName);var path=projectDelegate.addFile(parentPath,name,forceUnique,url,contentProvider,isEditable,isContentScript);var uiSourceCode=(this._workspace.uiSourceCode(projectDelegate.id(),path));console.assert(uiSourceCode);return uiSourceCode;},reset:function()
+{for(var projectName in this._simpleProjectDelegates)
+this._simpleProjectDelegates[projectName].reset();this._simpleProjectDelegates={};},__proto__:WebInspector.Object.prototype}
+WebInspector.BreakpointManager=function(breakpointStorage,debuggerModel,workspace)
+{this._storage=new WebInspector.BreakpointManager.Storage(this,breakpointStorage);this._debuggerModel=debuggerModel;this._workspace=workspace;this._breakpointForDebuggerId={};this._breakpointsForUISourceCode=new Map();this._breakpointsForPrimaryUISourceCode=new Map();this._sourceFilesWithRestoredBreakpoints={};this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved,this._breakpointResolved,this);this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillReset,this._projectWillReset,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);}
+WebInspector.BreakpointManager.Events={BreakpointAdded:"breakpoint-added",BreakpointRemoved:"breakpoint-removed"}
+WebInspector.BreakpointManager._sourceFileId=function(uiSourceCode)
+{if(!uiSourceCode.url)
+return"";return uiSourceCode.uri();}
+WebInspector.BreakpointManager._breakpointStorageId=function(sourceFileId,lineNumber,columnNumber)
+{if(!sourceFileId)
+return"";return sourceFileId+":"+lineNumber+":"+columnNumber;}
+WebInspector.BreakpointManager.prototype={_provisionalBreakpointsForSourceFileId:function(sourceFileId)
+{var result=new StringMap();for(var debuggerId in this._breakpointForDebuggerId){var breakpoint=this._breakpointForDebuggerId[debuggerId];if(breakpoint._sourceFileId===sourceFileId)
+result.put(breakpoint._breakpointStorageId(),breakpoint);}
+return result;},removeProvisionalBreakpointsForTest:function()
+{for(var debuggerId in this._breakpointForDebuggerId)
+this._debuggerModel.removeBreakpoint(debuggerId);},_restoreBreakpoints:function(uiSourceCode)
+{var sourceFileId=WebInspector.BreakpointManager._sourceFileId(uiSourceCode);if(!sourceFileId||this._sourceFilesWithRestoredBreakpoints[sourceFileId])
+return;this._sourceFilesWithRestoredBreakpoints[sourceFileId]=true;this._storage.mute();var breakpointItems=this._storage.breakpointItems(uiSourceCode);var provisionalBreakpoints=this._provisionalBreakpointsForSourceFileId(sourceFileId);for(var i=0;i<breakpointItems.length;++i){var breakpointItem=breakpointItems[i];var itemStorageId=WebInspector.BreakpointManager._breakpointStorageId(breakpointItem.sourceFileId,breakpointItem.lineNumber,breakpointItem.columnNumber);var provisionalBreakpoint=provisionalBreakpoints.get(itemStorageId);if(provisionalBreakpoint){if(!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
+this._breakpointsForPrimaryUISourceCode.put(uiSourceCode,[]);this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(provisionalBreakpoint);provisionalBreakpoint._updateInDebugger();}else{this._innerSetBreakpoint(uiSourceCode,breakpointItem.lineNumber,breakpointItem.columnNumber,breakpointItem.condition,breakpointItem.enabled);}}
+this._storage.unmute();},_uiSourceCodeAdded:function(event)
+{var uiSourceCode=(event.data);this._restoreBreakpoints(uiSourceCode);if(uiSourceCode.contentType()===WebInspector.resourceTypes.Script||uiSourceCode.contentType()===WebInspector.resourceTypes.Document)
+uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged,this._uiSourceCodeMappingChanged,this);},_uiSourceCodeRemoved:function(event)
+{var uiSourceCode=(event.data);this._removeUISourceCode(uiSourceCode);},_uiSourceCodeMappingChanged:function(event)
+{var uiSourceCode=(event.target);var isIdentity=(event.data.isIdentity);if(isIdentity)
+return;var breakpoints=this._breakpointsForPrimaryUISourceCode.get(uiSourceCode)||[];for(var i=0;i<breakpoints.length;++i)
+breakpoints[i]._updateInDebugger();},_removeUISourceCode:function(uiSourceCode)
+{var breakpoints=this._breakpointsForPrimaryUISourceCode.get(uiSourceCode)||[];for(var i=0;i<breakpoints.length;++i)
+breakpoints[i]._resetLocations();var sourceFileId=WebInspector.BreakpointManager._sourceFileId(uiSourceCode);delete this._sourceFilesWithRestoredBreakpoints[sourceFileId];uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged,this._uiSourceCodeMappingChanged,this);this._breakpointsForPrimaryUISourceCode.remove(uiSourceCode);},setBreakpoint:function(uiSourceCode,lineNumber,columnNumber,condition,enabled)
+{this._debuggerModel.setBreakpointsActive(true);return this._innerSetBreakpoint(uiSourceCode,lineNumber,columnNumber,condition,enabled);},_innerSetBreakpoint:function(uiSourceCode,lineNumber,columnNumber,condition,enabled)
+{var breakpoint=this.findBreakpoint(uiSourceCode,lineNumber,columnNumber);if(breakpoint){breakpoint._updateBreakpoint(condition,enabled);return breakpoint;}
+var projectId=uiSourceCode.project().id();var path=uiSourceCode.path();var sourceFileId=WebInspector.BreakpointManager._sourceFileId(uiSourceCode);breakpoint=new WebInspector.BreakpointManager.Breakpoint(this,projectId,path,sourceFileId,lineNumber,columnNumber,condition,enabled);if(!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
+this._breakpointsForPrimaryUISourceCode.put(uiSourceCode,[]);this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(breakpoint);return breakpoint;},findBreakpoint:function(uiSourceCode,lineNumber,columnNumber)
+{var breakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var lineBreakpoints=breakpoints?breakpoints.get(String(lineNumber)):null;var columnBreakpoints=lineBreakpoints?lineBreakpoints.get(String(columnNumber)):null;return columnBreakpoints?columnBreakpoints[0]:null;},findBreakpointOnLine:function(uiSourceCode,lineNumber)
+{var breakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var lineBreakpoints=breakpoints?breakpoints.get(String(lineNumber)):null;return lineBreakpoints?lineBreakpoints.values()[0][0]:null;},breakpointsForUISourceCode:function(uiSourceCode)
+{var result=[];var uiSourceCodeBreakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var breakpoints=uiSourceCodeBreakpoints?uiSourceCodeBreakpoints.values():[];for(var i=0;i<breakpoints.length;++i){var lineBreakpoints=breakpoints[i];var columnBreakpointArrays=lineBreakpoints?lineBreakpoints.values():[];result=result.concat.apply(result,columnBreakpointArrays);}
+return result;},allBreakpoints:function()
+{var result=[];var uiSourceCodes=this._breakpointsForUISourceCode.keys();for(var i=0;i<uiSourceCodes.length;++i)
+result=result.concat(this.breakpointsForUISourceCode(uiSourceCodes[i]));return result;},breakpointLocationsForUISourceCode:function(uiSourceCode)
+{var uiSourceCodeBreakpoints=this._breakpointsForUISourceCode.get(uiSourceCode);var lineNumbers=uiSourceCodeBreakpoints?uiSourceCodeBreakpoints.keys():[];var result=[];for(var i=0;i<lineNumbers.length;++i){var lineBreakpoints=uiSourceCodeBreakpoints.get(lineNumbers[i]);var columnNumbers=lineBreakpoints.keys();for(var j=0;j<columnNumbers.length;++j){var columnBreakpoints=lineBreakpoints.get(columnNumbers[j]);var lineNumber=parseInt(lineNumbers[i],10);var columnNumber=parseInt(columnNumbers[j],10);for(var k=0;k<columnBreakpoints.length;++k){var breakpoint=columnBreakpoints[k];var uiLocation=new WebInspector.UILocation(uiSourceCode,lineNumber,columnNumber);result.push({breakpoint:breakpoint,uiLocation:uiLocation});}}}
+return result;},allBreakpointLocations:function()
+{var result=[];var uiSourceCodes=this._breakpointsForUISourceCode.keys();for(var i=0;i<uiSourceCodes.length;++i)
+result=result.concat(this.breakpointLocationsForUISourceCode(uiSourceCodes[i]));return result;},toggleAllBreakpoints:function(toggleState)
+{var breakpoints=this.allBreakpoints();for(var i=0;i<breakpoints.length;++i)
+breakpoints[i].setEnabled(toggleState);},removeAllBreakpoints:function()
+{var breakpoints=this.allBreakpoints();for(var i=0;i<breakpoints.length;++i)
+breakpoints[i].remove();},_projectWillReset:function(event)
+{var project=(event.data);var uiSourceCodes=project.uiSourceCodes();for(var i=0;i<uiSourceCodes.length;++i)
+this._removeUISourceCode(uiSourceCodes[i]);},_breakpointResolved:function(event)
+{var breakpointId=(event.data.breakpointId);var location=(event.data.location);var breakpoint=this._breakpointForDebuggerId[breakpointId];if(!breakpoint)
+return;breakpoint._addResolvedLocation(location);},_removeBreakpoint:function(breakpoint,removeFromStorage)
+{var uiSourceCode=breakpoint.uiSourceCode();var breakpoints=uiSourceCode?this._breakpointsForPrimaryUISourceCode.get(uiSourceCode)||[]:[];var index=breakpoints.indexOf(breakpoint);if(index>-1)
+breakpoints.splice(index,1);if(removeFromStorage)
+this._storage._removeBreakpoint(breakpoint);},_uiLocationAdded:function(breakpoint,uiLocation)
+{var breakpoints=this._breakpointsForUISourceCode.get(uiLocation.uiSourceCode);if(!breakpoints){breakpoints=new StringMap();this._breakpointsForUISourceCode.put(uiLocation.uiSourceCode,breakpoints);}
+var lineBreakpoints=breakpoints.get(String(uiLocation.lineNumber));if(!lineBreakpoints){lineBreakpoints=new StringMap();breakpoints.put(String(uiLocation.lineNumber),lineBreakpoints);}
+var columnBreakpoints=lineBreakpoints.get(String(uiLocation.columnNumber));if(!columnBreakpoints){columnBreakpoints=[];lineBreakpoints.put(String(uiLocation.columnNumber),columnBreakpoints);}
+columnBreakpoints.push(breakpoint);this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointAdded,{breakpoint:breakpoint,uiLocation:uiLocation});},_uiLocationRemoved:function(breakpoint,uiLocation)
+{var breakpoints=this._breakpointsForUISourceCode.get(uiLocation.uiSourceCode);if(!breakpoints)
+return;var lineBreakpoints=breakpoints.get(String(uiLocation.lineNumber));if(!lineBreakpoints)
+return;var columnBreakpoints=lineBreakpoints.get(String(uiLocation.columnNumber));if(!columnBreakpoints)
+return;columnBreakpoints.remove(breakpoint);if(!columnBreakpoints.length)
+lineBreakpoints.remove(String(uiLocation.columnNumber));if(!lineBreakpoints.size())
+breakpoints.remove(String(uiLocation.lineNumber));if(!breakpoints.size())
+this._breakpointsForUISourceCode.remove(uiLocation.uiSourceCode);this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointRemoved,{breakpoint:breakpoint,uiLocation:uiLocation});},__proto__:WebInspector.Object.prototype}
+WebInspector.BreakpointManager.Breakpoint=function(breakpointManager,projectId,path,sourceFileId,lineNumber,columnNumber,condition,enabled)
+{this._breakpointManager=breakpointManager;this._projectId=projectId;this._path=path;this._lineNumber=lineNumber;this._columnNumber=columnNumber;this._sourceFileId=sourceFileId;this._liveLocations=[];this._uiLocations={};this._condition;this._enabled;this._updateBreakpoint(condition,enabled);}
+WebInspector.BreakpointManager.Breakpoint.prototype={projectId:function()
+{return this._projectId;},path:function()
+{return this._path;},lineNumber:function()
+{return this._lineNumber;},columnNumber:function()
+{return this._columnNumber;},uiSourceCode:function()
+{return this._breakpointManager._workspace.uiSourceCode(this._projectId,this._path);},_addResolvedLocation:function(location)
+{this._liveLocations.push(this._breakpointManager._debuggerModel.createLiveLocation(location,this._locationUpdated.bind(this,location)));},_locationUpdated:function(location,uiLocation)
+{var stringifiedLocation=location.scriptId+":"+location.lineNumber+":"+location.columnNumber;var oldUILocation=(this._uiLocations[stringifiedLocation]);if(oldUILocation)
+this._breakpointManager._uiLocationRemoved(this,oldUILocation);if(this._uiLocations[""]){var defaultLocation=this._uiLocations[""];delete this._uiLocations[""];this._breakpointManager._uiLocationRemoved(this,defaultLocation);}
+this._uiLocations[stringifiedLocation]=uiLocation;this._breakpointManager._uiLocationAdded(this,uiLocation);},enabled:function()
+{return this._enabled;},setEnabled:function(enabled)
+{this._updateBreakpoint(this._condition,enabled);},condition:function()
+{return this._condition;},setCondition:function(condition)
+{this._updateBreakpoint(condition,this._enabled);},_updateBreakpoint:function(condition,enabled)
+{if(this._enabled===enabled&&this._condition===condition)
+return;this._removeFromDebugger();this._enabled=enabled;this._condition=condition;this._breakpointManager._storage._updateBreakpoint(this);this._fakeBreakpointAtPrimaryLocation();this._updateInDebugger();},_updateInDebugger:function()
+{var uiSourceCode=this.uiSourceCode();if(!uiSourceCode)
+return;var scriptFile=uiSourceCode&&uiSourceCode.scriptFile();if(this._enabled&&!(scriptFile&&scriptFile.hasDivergedFromVM()))
+this._setInDebugger();},remove:function(keepInStorage)
+{var removeFromStorage=!keepInStorage;this._resetLocations();this._removeFromDebugger();this._breakpointManager._removeBreakpoint(this,removeFromStorage);},_setInDebugger:function()
+{this._removeFromDebugger();var uiSourceCode=this._breakpointManager._workspace.uiSourceCode(this._projectId,this._path);if(!uiSourceCode)
+return;var rawLocation=uiSourceCode.uiLocationToRawLocation(this._lineNumber,this._columnNumber);var debuggerModelLocation=(rawLocation);if(debuggerModelLocation)
+this._breakpointManager._debuggerModel.setBreakpointByScriptLocation(debuggerModelLocation,this._condition,this._didSetBreakpointInDebugger.bind(this));else if(uiSourceCode.url)
+this._breakpointManager._debuggerModel.setBreakpointByURL(uiSourceCode.url,this._lineNumber,this._columnNumber,this._condition,this._didSetBreakpointInDebugger.bind(this));},_didSetBreakpointInDebugger:function(breakpointId,locations)
+{if(!breakpointId){this._resetLocations();this._breakpointManager._removeBreakpoint(this,false);return;}
+this._debuggerId=breakpointId;this._breakpointManager._breakpointForDebuggerId[breakpointId]=this;if(!locations.length){this._fakeBreakpointAtPrimaryLocation();return;}
+this._resetLocations();for(var i=0;i<locations.length;++i){var script=this._breakpointManager._debuggerModel.scriptForId(locations[i].scriptId);var uiLocation=script.rawLocationToUILocation(locations[i].lineNumber,locations[i].columnNumber);if(this._breakpointManager.findBreakpoint(uiLocation.uiSourceCode,uiLocation.lineNumber,uiLocation.columnNumber)){this.remove();return;}}
+for(var i=0;i<locations.length;++i)
+this._addResolvedLocation(locations[i]);},_removeFromDebugger:function()
+{if(!this._debuggerId)
+return;this._breakpointManager._debuggerModel.removeBreakpoint(this._debuggerId,this._didRemoveFromDebugger.bind(this));},_didRemoveFromDebugger:function()
+{delete this._breakpointManager._breakpointForDebuggerId[this._debuggerId];delete this._debuggerId;},_resetLocations:function()
+{for(var stringifiedLocation in this._uiLocations)
+this._breakpointManager._uiLocationRemoved(this,this._uiLocations[stringifiedLocation]);for(var i=0;i<this._liveLocations.length;++i)
+this._liveLocations[i].dispose();this._liveLocations=[];this._uiLocations={};},_breakpointStorageId:function()
+{return WebInspector.BreakpointManager._breakpointStorageId(this._sourceFileId,this._lineNumber,this._columnNumber);},_fakeBreakpointAtPrimaryLocation:function()
+{this._resetLocations();var uiSourceCode=this._breakpointManager._workspace.uiSourceCode(this._projectId,this._path);if(!uiSourceCode)
+return;var uiLocation=new WebInspector.UILocation(uiSourceCode,this._lineNumber,this._columnNumber);this._uiLocations[""]=uiLocation;this._breakpointManager._uiLocationAdded(this,uiLocation);}}
+WebInspector.BreakpointManager.Storage=function(breakpointManager,setting)
+{this._breakpointManager=breakpointManager;this._setting=setting;var breakpoints=this._setting.get();this._breakpoints={};for(var i=0;i<breakpoints.length;++i){var breakpoint=(breakpoints[i]);breakpoint.columnNumber=breakpoint.columnNumber||0;this._breakpoints[breakpoint.sourceFileId+":"+breakpoint.lineNumber+":"+breakpoint.columnNumber]=breakpoint;}}
+WebInspector.BreakpointManager.Storage.prototype={mute:function()
+{this._muted=true;},unmute:function()
+{delete this._muted;},breakpointItems:function(uiSourceCode)
+{var result=[];var sourceFileId=WebInspector.BreakpointManager._sourceFileId(uiSourceCode);for(var id in this._breakpoints){var breakpoint=this._breakpoints[id];if(breakpoint.sourceFileId===sourceFileId)
+result.push(breakpoint);}
+return result;},_updateBreakpoint:function(breakpoint)
+{if(this._muted||!breakpoint._breakpointStorageId())
+return;this._breakpoints[breakpoint._breakpointStorageId()]=new WebInspector.BreakpointManager.Storage.Item(breakpoint);this._save();},_removeBreakpoint:function(breakpoint)
+{if(this._muted)
+return;delete this._breakpoints[breakpoint._breakpointStorageId()];this._save();},_save:function()
+{var breakpointsArray=[];for(var id in this._breakpoints)
+breakpointsArray.push(this._breakpoints[id]);this._setting.set(breakpointsArray);}}
+WebInspector.BreakpointManager.Storage.Item=function(breakpoint)
+{this.sourceFileId=breakpoint._sourceFileId;this.lineNumber=breakpoint.lineNumber();this.columnNumber=breakpoint.columnNumber();this.condition=breakpoint.condition();this.enabled=breakpoint.enabled();}
+WebInspector.breakpointManager;WebInspector.ConcatenatedScriptsContentProvider=function(scripts)
+{this._scripts=scripts;}
+WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag="<script>";WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag="</script>";WebInspector.ConcatenatedScriptsContentProvider.prototype={_sortedScripts:function()
+{if(this._sortedScriptsArray)
+return this._sortedScriptsArray;this._sortedScriptsArray=[];var scripts=this._scripts.slice();scripts.sort(function(x,y){return x.lineOffset-y.lineOffset||x.columnOffset-y.columnOffset;});var scriptOpenTagLength=WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag.length;var scriptCloseTagLength=WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag.length;this._sortedScriptsArray.push(scripts[0]);for(var i=1;i<scripts.length;++i){var previousScript=this._sortedScriptsArray[this._sortedScriptsArray.length-1];var lineNumber=previousScript.endLine;var columnNumber=previousScript.endColumn+scriptCloseTagLength+scriptOpenTagLength;if(lineNumber<scripts[i].lineOffset||(lineNumber===scripts[i].lineOffset&&columnNumber<=scripts[i].columnOffset))
+this._sortedScriptsArray.push(scripts[i]);}
+return this._sortedScriptsArray;},contentURL:function()
+{return"";},contentType:function()
+{return WebInspector.resourceTypes.Document;},requestContent:function(callback)
+{var scripts=this._sortedScripts();var sources=[];function didRequestSource(content)
+{sources.push(content);if(sources.length==scripts.length)
+callback(this._concatenateScriptsContent(scripts,sources));}
+for(var i=0;i<scripts.length;++i)
+scripts[i].requestContent(didRequestSource.bind(this));},searchInContent:function(query,caseSensitive,isRegex,callback)
+{var results={};var scripts=this._sortedScripts();var scriptsLeft=scripts.length;function maybeCallback()
+{if(scriptsLeft)
+return;var result=[];for(var i=0;i<scripts.length;++i)
+result=result.concat(results[scripts[i].scriptId]);callback(result);}
+function searchCallback(script,searchMatches)
+{results[script.scriptId]=[];for(var i=0;i<searchMatches.length;++i){var searchMatch=new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber+script.lineOffset,searchMatches[i].lineContent);results[script.scriptId].push(searchMatch);}
+scriptsLeft--;maybeCallback();}
+maybeCallback();for(var i=0;i<scripts.length;++i)
+scripts[i].searchInContent(query,caseSensitive,isRegex,searchCallback.bind(null,scripts[i]));},_concatenateScriptsContent:function(scripts,sources)
+{var content="";var lineNumber=0;var columnNumber=0;var scriptOpenTag=WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag;var scriptCloseTag=WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag;for(var i=0;i<scripts.length;++i){for(var newLinesCount=scripts[i].lineOffset-lineNumber;newLinesCount>0;--newLinesCount){columnNumber=0;content+="\n";}
+for(var spacesCount=scripts[i].columnOffset-columnNumber-scriptOpenTag.length;spacesCount>0;--spacesCount)
+content+=" ";content+=scriptOpenTag;content+=sources[i];content+=scriptCloseTag;lineNumber=scripts[i].endLine;columnNumber=scripts[i].endColumn+scriptCloseTag.length;}
+return content;}}
+WebInspector.CompilerSourceMappingContentProvider=function(sourceURL,contentType)
+{this._sourceURL=sourceURL;this._contentType=contentType;}
+WebInspector.CompilerSourceMappingContentProvider.prototype={contentURL:function()
+{return this._sourceURL;},contentType:function()
+{return this._contentType;},requestContent:function(callback)
+{NetworkAgent.loadResourceForFrontend(WebInspector.resourceTreeModel.mainFrame.id,this._sourceURL,undefined,contentLoaded.bind(this));function contentLoaded(error,statusCode,headers,content)
+{if(error||statusCode>=400){console.error("Could not load content for "+this._sourceURL+" : "+(error||("HTTP status code: "+statusCode)));callback(null);return;}
+callback(content);}},searchInContent:function(query,caseSensitive,isRegex,callback)
+{this.requestContent(contentLoaded);function contentLoaded(content)
+{if(typeof content!=="string"){callback([]);return;}
+callback(WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex));}}}
+WebInspector.StaticContentProvider=function(contentType,content)
+{this._content=content;this._contentType=contentType;}
+WebInspector.StaticContentProvider.prototype={contentURL:function()
+{return"";},contentType:function()
+{return this._contentType;},requestContent:function(callback)
+{callback(this._content);},searchInContent:function(query,caseSensitive,isRegex,callback)
+{function performSearch()
+{callback(WebInspector.ContentProvider.performSearchInContent(this._content,query,caseSensitive,isRegex));}
+window.setTimeout(performSearch.bind(this),0);}}
+WebInspector.DefaultScriptMapping=function(debuggerModel,workspace)
+{this._debuggerModel=debuggerModel;this._projectDelegate=new WebInspector.DebuggerProjectDelegate();this._workspace=workspace;this._workspace.addProject(this._projectDelegate);debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);this._debuggerReset();}
+WebInspector.DefaultScriptMapping.prototype={rawLocationToUILocation:function(rawLocation)
+{var debuggerModelLocation=(rawLocation);var script=this._debuggerModel.scriptForId(debuggerModelLocation.scriptId);var uiSourceCode=this._uiSourceCodeForScriptId[script.scriptId];var lineNumber=debuggerModelLocation.lineNumber;var columnNumber=debuggerModelLocation.columnNumber||0;return new WebInspector.UILocation(uiSourceCode,lineNumber,columnNumber);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{var scriptId=this._scriptIdForUISourceCode.get(uiSourceCode);var script=this._debuggerModel.scriptForId(scriptId);return this._debuggerModel.createRawLocation(script,lineNumber,columnNumber);},addScript:function(script)
+{var path=this._projectDelegate.addScript(script);var uiSourceCode=this._workspace.uiSourceCode(this._projectDelegate.id(),path);if(!uiSourceCode){console.assert(uiSourceCode);return;}
+this._uiSourceCodeForScriptId[script.scriptId]=uiSourceCode;this._scriptIdForUISourceCode.put(uiSourceCode,script.scriptId);uiSourceCode.setSourceMapping(this);script.pushSourceMapping(this);script.addEventListener(WebInspector.Script.Events.ScriptEdited,this._scriptEdited.bind(this,script.scriptId));},isIdentity:function()
+{return true;},_scriptEdited:function(scriptId,event)
+{var content=(event.data);this._uiSourceCodeForScriptId[scriptId].addRevision(content);},_debuggerReset:function()
+{this._uiSourceCodeForScriptId={};this._scriptIdForUISourceCode=new Map();this._projectDelegate.reset();}}
+WebInspector.DebuggerProjectDelegate=function()
+{WebInspector.ContentProviderBasedProjectDelegate.call(this,WebInspector.projectTypes.Debugger);}
+WebInspector.DebuggerProjectDelegate.prototype={id:function()
+{return"debugger:";},displayName:function()
+{return"debugger";},addScript:function(script)
+{var contentProvider=script.isInlineScript()?new WebInspector.ConcatenatedScriptsContentProvider([script]):script;var splitURL=WebInspector.ParsedURL.splitURL(script.sourceURL);var name=splitURL[splitURL.length-1];name="VM"+script.scriptId+(name?" "+name:"");return this.addContentProvider("",name,script.sourceURL,contentProvider,false,script.isContentScript);},__proto__:WebInspector.ContentProviderBasedProjectDelegate.prototype}
+WebInspector.ResourceScriptMapping=function(debuggerModel,workspace)
+{this._debuggerModel=debuggerModel;this._workspace=workspace;this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAddedToWorkspace,this);this._boundURLs=new StringSet();debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
+WebInspector.ResourceScriptMapping.prototype={rawLocationToUILocation:function(rawLocation)
+{var debuggerModelLocation=(rawLocation);var script=this._debuggerModel.scriptForId(debuggerModelLocation.scriptId);var uiSourceCode=this._workspaceUISourceCodeForScript(script);if(!uiSourceCode)
+return null;var scriptFile=uiSourceCode.scriptFile();if(scriptFile&&((scriptFile.hasDivergedFromVM()&&!scriptFile.isMergingToVM())||scriptFile.isDivergingFromVM()))
+return null;return new WebInspector.UILocation(uiSourceCode,debuggerModelLocation.lineNumber,debuggerModelLocation.columnNumber||0);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{var scripts=this._scriptsForUISourceCode(uiSourceCode);console.assert(scripts.length);return this._debuggerModel.createRawLocation(scripts[0],lineNumber,columnNumber);},addScript:function(script)
+{if(script.isAnonymousScript())
+return;script.pushSourceMapping(this);var uiSourceCode=this._workspaceUISourceCodeForScript(script);if(!uiSourceCode)
+return;this._bindUISourceCodeToScripts(uiSourceCode,[script]);},isIdentity:function()
+{return true;},_uiSourceCodeAddedToWorkspace:function(event)
+{var uiSourceCode=(event.data);if(uiSourceCode.project().isServiceProject())
+return;if(!uiSourceCode.url)
+return;var scripts=this._scriptsForUISourceCode(uiSourceCode);if(!scripts.length)
+return;this._bindUISourceCodeToScripts(uiSourceCode,scripts);},_hasMergedToVM:function(uiSourceCode)
+{var scripts=this._scriptsForUISourceCode(uiSourceCode);if(!scripts.length)
+return;for(var i=0;i<scripts.length;++i)
+scripts[i].updateLocations();},_hasDivergedFromVM:function(uiSourceCode)
+{var scripts=this._scriptsForUISourceCode(uiSourceCode);if(!scripts.length)
+return;for(var i=0;i<scripts.length;++i)
+scripts[i].updateLocations();},_workspaceUISourceCodeForScript:function(script)
+{if(script.isAnonymousScript())
+return null;return this._workspace.uiSourceCodeForURL(script.sourceURL);},_scriptsForUISourceCode:function(uiSourceCode)
+{if(!uiSourceCode.url)
+return[];return this._debuggerModel.scriptsForSourceURL(uiSourceCode.url);},_bindUISourceCodeToScripts:function(uiSourceCode,scripts)
+{console.assert(scripts.length);var scriptFile=new WebInspector.ResourceScriptFile(this,uiSourceCode,scripts);uiSourceCode.setScriptFile(scriptFile);for(var i=0;i<scripts.length;++i)
+scripts[i].updateLocations();uiSourceCode.setSourceMapping(this);this._boundURLs.put(uiSourceCode.url);},_unbindUISourceCode:function(uiSourceCode)
+{var scriptFile=(uiSourceCode.scriptFile());if(scriptFile){scriptFile.dispose();uiSourceCode.setScriptFile(null);}
+uiSourceCode.setSourceMapping(null);},_debuggerReset:function()
+{var boundURLs=this._boundURLs.values();for(var i=0;i<boundURLs.length;++i)
+{var uiSourceCode=this._workspace.uiSourceCodeForURL(boundURLs[i]);if(!uiSourceCode)
+continue;this._unbindUISourceCode(uiSourceCode);}
+this._boundURLs.clear();},}
+WebInspector.ScriptFile=function()
+{}
+WebInspector.ScriptFile.Events={DidMergeToVM:"DidMergeToVM",DidDivergeFromVM:"DidDivergeFromVM",}
+WebInspector.ScriptFile.prototype={hasDivergedFromVM:function(){return false;},isDivergingFromVM:function(){return false;},isMergingToVM:function(){return false;},checkMapping:function(){},}
+WebInspector.ResourceScriptFile=function(resourceScriptMapping,uiSourceCode,scripts)
+{console.assert(scripts.length);WebInspector.ScriptFile.call(this);this._resourceScriptMapping=resourceScriptMapping;this._uiSourceCode=uiSourceCode;if(this._uiSourceCode.contentType()===WebInspector.resourceTypes.Script)
+this._script=scripts[0];this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._update();}
+WebInspector.ResourceScriptFile.prototype={_workingCopyCommitted:function(event)
+{function innerCallback(error,errorData)
+{if(error){this._update();WebInspector.LiveEditSupport.logDetailedError(error,errorData,this._script);return;}
+this._scriptSource=source;this._update();WebInspector.LiveEditSupport.logSuccess();}
+if(!this._script)
+return;var source=this._uiSourceCode.workingCopy();this._resourceScriptMapping._debuggerModel.setScriptSource(this._script.scriptId,source,innerCallback.bind(this));},_isDiverged:function()
+{if(this._uiSourceCode.isDirty())
+return true;if(!this._script)
+return false;if(typeof this._scriptSource==="undefined")
+return false;return this._uiSourceCode.workingCopy()!==this._scriptSource;},_workingCopyChanged:function(event)
+{this._update();},_update:function()
+{if(this._isDiverged()&&!this._hasDivergedFromVM)
+this._divergeFromVM();else if(!this._isDiverged()&&this._hasDivergedFromVM)
+this._mergeToVM();},_divergeFromVM:function()
+{this._isDivergingFromVM=true;this._resourceScriptMapping._hasDivergedFromVM(this._uiSourceCode);delete this._isDivergingFromVM;this._hasDivergedFromVM=true;this.dispatchEventToListeners(WebInspector.ScriptFile.Events.DidDivergeFromVM,this._uiSourceCode);},_mergeToVM:function()
+{delete this._hasDivergedFromVM;this._isMergingToVM=true;this._resourceScriptMapping._hasMergedToVM(this._uiSourceCode);delete this._isMergingToVM;this.dispatchEventToListeners(WebInspector.ScriptFile.Events.DidMergeToVM,this._uiSourceCode);},hasDivergedFromVM:function()
+{return this._hasDivergedFromVM;},isDivergingFromVM:function()
+{return this._isDivergingFromVM;},isMergingToVM:function()
+{return this._isMergingToVM;},checkMapping:function()
+{if(!this._script)
+return;if(typeof this._scriptSource!=="undefined")
+return;this._script.requestContent(callback.bind(this));function callback(source)
+{this._scriptSource=source;this._update();}},dispose:function()
+{this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);},__proto__:WebInspector.Object.prototype}
+WebInspector.CompilerScriptMapping=function(debuggerModel,workspace,networkWorkspaceProvider)
+{this._debuggerModel=debuggerModel;this._workspace=workspace;this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAddedToWorkspace,this);this._networkWorkspaceProvider=networkWorkspaceProvider;this._sourceMapForSourceMapURL={};this._pendingSourceMapLoadingCallbacks={};this._sourceMapForScriptId={};this._scriptForSourceMap=new Map();this._sourceMapForURL=new StringMap();debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
+WebInspector.CompilerScriptMapping.prototype={rawLocationToUILocation:function(rawLocation)
+{var debuggerModelLocation=(rawLocation);var sourceMap=this._sourceMapForScriptId[debuggerModelLocation.scriptId];if(!sourceMap)
+return null;var lineNumber=debuggerModelLocation.lineNumber;var columnNumber=debuggerModelLocation.columnNumber||0;var entry=sourceMap.findEntry(lineNumber,columnNumber);if(!entry||entry.length===2)
+return null;var url=(entry[2]);var uiSourceCode=this._workspace.uiSourceCodeForURL(url);if(!uiSourceCode)
+return null;return new WebInspector.UILocation(uiSourceCode,(entry[3]),(entry[4]));},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{if(!uiSourceCode.url)
+return null;var sourceMap=this._sourceMapForURL.get(uiSourceCode.url);if(!sourceMap)
+return null;var script=(this._scriptForSourceMap.get(sourceMap));console.assert(script);var entry=sourceMap.findEntryReversed(uiSourceCode.url,lineNumber);return this._debuggerModel.createRawLocation(script,(entry[0]),(entry[1]));},addScript:function(script)
+{script.pushSourceMapping(this);this.loadSourceMapForScript(script,sourceMapLoaded.bind(this));function sourceMapLoaded(sourceMap)
+{if(!sourceMap)
+return;if(this._scriptForSourceMap.get(sourceMap)){this._sourceMapForScriptId[script.scriptId]=sourceMap;script.updateLocations();return;}
+this._sourceMapForScriptId[script.scriptId]=sourceMap;this._scriptForSourceMap.put(sourceMap,script);var sourceURLs=sourceMap.sources();for(var i=0;i<sourceURLs.length;++i){var sourceURL=sourceURLs[i];if(this._sourceMapForURL.get(sourceURL))
+continue;this._sourceMapForURL.put(sourceURL,sourceMap);if(!this._workspace.hasMappingForURL(sourceURL)&&!this._workspace.uiSourceCodeForURL(sourceURL)){var contentProvider=sourceMap.sourceContentProvider(sourceURL,WebInspector.resourceTypes.Script);this._networkWorkspaceProvider.addFileForURL(sourceURL,contentProvider,true);}
+var uiSourceCode=this._workspace.uiSourceCodeForURL(sourceURL);if(uiSourceCode){this._bindUISourceCode(uiSourceCode);uiSourceCode.isContentScript=script.isContentScript;}else{WebInspector.console.showErrorMessage(WebInspector.UIString("Failed to locate workspace file mapped to URL %s from source map %s",sourceURL,sourceMap.url()));}}
+script.updateLocations();}},isIdentity:function()
+{return false;},_bindUISourceCode:function(uiSourceCode)
+{uiSourceCode.setSourceMapping(this);},_unbindUISourceCode:function(uiSourceCode)
+{uiSourceCode.setSourceMapping(null);},_uiSourceCodeAddedToWorkspace:function(event)
+{var uiSourceCode=(event.data);if(!uiSourceCode.url||!this._sourceMapForURL.get(uiSourceCode.url))
+return;this._bindUISourceCode(uiSourceCode);},loadSourceMapForScript:function(script,callback)
+{if(!script.sourceMapURL){callback(null);return;}
+var scriptURL=WebInspector.ParsedURL.completeURL(WebInspector.resourceTreeModel.inspectedPageURL(),script.sourceURL);if(!scriptURL){callback(null);return;}
+var sourceMapURL=WebInspector.ParsedURL.completeURL(scriptURL,script.sourceMapURL);if(!sourceMapURL){callback(null);return;}
+var sourceMap=this._sourceMapForSourceMapURL[sourceMapURL];if(sourceMap){callback(sourceMap);return;}
+var pendingCallbacks=this._pendingSourceMapLoadingCallbacks[sourceMapURL];if(pendingCallbacks){pendingCallbacks.push(callback);return;}
+pendingCallbacks=[callback];this._pendingSourceMapLoadingCallbacks[sourceMapURL]=pendingCallbacks;WebInspector.SourceMap.load(sourceMapURL,scriptURL,sourceMapLoaded.bind(this));function sourceMapLoaded(sourceMap)
+{var url=(sourceMapURL);var callbacks=this._pendingSourceMapLoadingCallbacks[url];delete this._pendingSourceMapLoadingCallbacks[url];if(!callbacks)
+return;if(sourceMap)
+this._sourceMapForSourceMapURL[url]=sourceMap;for(var i=0;i<callbacks.length;++i)
+callbacks[i](sourceMap);}},_debuggerReset:function()
+{function unbindUISourceCodesForSourceMap(sourceMap)
+{var sourceURLs=sourceMap.sources();for(var i=0;i<sourceURLs.length;++i){var sourceURL=sourceURLs[i];var uiSourceCode=this._workspace.uiSourceCodeForURL(sourceURL);if(!uiSourceCode)
+continue;this._unbindUISourceCode(uiSourceCode);}}
+this._sourceMapForURL.values().forEach(unbindUISourceCodesForSourceMap.bind(this));this._sourceMapForSourceMapURL={};this._pendingSourceMapLoadingCallbacks={};this._sourceMapForScriptId={};this._scriptForSourceMap.clear();this._sourceMapForURL.clear();}}
+WebInspector.LiveEditSupport=function(workspace)
+{this._workspaceProvider=new WebInspector.SimpleWorkspaceProvider(workspace,WebInspector.projectTypes.LiveEdit);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);this._debuggerReset();}
+WebInspector.LiveEditSupport.prototype={uiSourceCodeForLiveEdit:function(uiSourceCode)
+{var rawLocation=uiSourceCode.uiLocationToRawLocation(0,0);var debuggerModelLocation=(rawLocation);var script=WebInspector.debuggerModel.scriptForId(debuggerModelLocation.scriptId);var uiLocation=script.rawLocationToUILocation(0,0);if(uiLocation.uiSourceCode!==uiSourceCode)
+return uiLocation.uiSourceCode;if(this._uiSourceCodeForScriptId[script.scriptId])
+return this._uiSourceCodeForScriptId[script.scriptId];console.assert(!script.isInlineScript());var liveEditUISourceCode=this._workspaceProvider.addUniqueFileForURL(script.sourceURL,script,true,script.isContentScript);liveEditUISourceCode.setScriptFile(new WebInspector.LiveEditScriptFile(uiSourceCode,liveEditUISourceCode,script.scriptId));this._uiSourceCodeForScriptId[script.scriptId]=liveEditUISourceCode;this._scriptIdForUISourceCode.put(liveEditUISourceCode,script.scriptId);return liveEditUISourceCode;},_debuggerReset:function()
+{this._uiSourceCodeForScriptId={};this._scriptIdForUISourceCode=new Map();this._workspaceProvider.reset();},}
+WebInspector.LiveEditSupport.logDetailedError=function(error,errorData,contextScript)
+{var warningLevel=WebInspector.ConsoleMessage.MessageLevel.Warning;if(!errorData){if(error)
+WebInspector.console.log(WebInspector.UIString("LiveEdit failed: %s",error),warningLevel,false);return;}
+var compileError=errorData.compileError;if(compileError){var location=contextScript?WebInspector.UIString(" at %s:%d:%d",contextScript.sourceURL,compileError.lineNumber,compileError.columnNumber):"";var message=WebInspector.UIString("LiveEdit compile failed: %s%s",compileError.message,location);WebInspector.console.log(message,WebInspector.ConsoleMessage.MessageLevel.Error,false);}else{WebInspector.console.log(WebInspector.UIString("Unknown LiveEdit error: %s; %s",JSON.stringify(errorData),error),warningLevel,false);}}
+WebInspector.LiveEditSupport.logSuccess=function()
+{WebInspector.console.log(WebInspector.UIString("Recompilation and update succeeded."),WebInspector.ConsoleMessage.MessageLevel.Debug,false);}
+WebInspector.LiveEditScriptFile=function(uiSourceCode,liveEditUISourceCode,scriptId)
+{WebInspector.ScriptFile.call(this);this._uiSourceCode=uiSourceCode;this._liveEditUISourceCode=liveEditUISourceCode;this._scriptId=scriptId;this._liveEditUISourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);}
+WebInspector.LiveEditScriptFile.prototype={_workingCopyCommitted:function(event)
+{function innerCallback(error,errorData)
+{if(error){var script=WebInspector.debuggerModel.scriptForId(this._scriptId);WebInspector.LiveEditSupport.logDetailedError(error,errorData,script);return;}
+WebInspector.LiveEditSupport.logSuccess();}
+var script=WebInspector.debuggerModel.scriptForId(this._scriptId);WebInspector.debuggerModel.setScriptSource(script.scriptId,this._liveEditUISourceCode.workingCopy(),innerCallback.bind(this));},hasDivergedFromVM:function()
+{return true;},isDivergingFromVM:function()
+{return false;},isMergingToVM:function()
+{return false;},checkMapping:function()
+{},__proto__:WebInspector.Object.prototype}
+WebInspector.liveEditSupport;WebInspector.CSSStyleSheetMapping=function(cssModel,workspace,networkWorkspaceProvider)
+{this._cssModel=cssModel;this._workspace=workspace;this._stylesSourceMapping=new WebInspector.StylesSourceMapping(cssModel,workspace);this._sassSourceMapping=new WebInspector.SASSSourceMapping(cssModel,workspace,networkWorkspaceProvider);cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved,this._styleSheetRemoved,this);}
+WebInspector.CSSStyleSheetMapping.prototype={_styleSheetAdded:function(event)
+{var header=(event.data);this._stylesSourceMapping.addHeader(header);this._sassSourceMapping.addHeader(header);},_styleSheetRemoved:function(event)
+{var header=(event.data);this._stylesSourceMapping.removeHeader(header);this._sassSourceMapping.removeHeader(header);}}
+WebInspector.SASSSourceMapping=function(cssModel,workspace,networkWorkspaceProvider)
+{this.pollPeriodMs=5000;this.pollIntervalMs=200;this._cssModel=cssModel;this._workspace=workspace;this._networkWorkspaceProvider=networkWorkspaceProvider;this._addingRevisionCounter=0;this._reset();WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.SavedURL,this._fileSaveFinished,this);WebInspector.settings.cssSourceMapsEnabled.addChangeListener(this._toggleSourceMapSupport,this)
+this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._styleSheetChanged,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted,this._uiSourceCodeContentCommitted,this);this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillReset,this._reset,this);}
+WebInspector.SASSSourceMapping.prototype={_styleSheetChanged:function(event)
+{var id=(event.data.styleSheetId);if(this._addingRevisionCounter){--this._addingRevisionCounter;return;}
+var header=this._cssModel.styleSheetHeaderForId(id);if(!header)
+return;this.removeHeader(header);},_toggleSourceMapSupport:function(event)
+{var enabled=(event.data);var headers=this._cssModel.styleSheetHeaders();for(var i=0;i<headers.length;++i){if(enabled)
+this.addHeader(headers[i]);else
+this.removeHeader(headers[i]);}},_fileSaveFinished:function(event)
+{var sassURL=(event.data);this._sassFileSaved(sassURL,false);},_headerValue:function(headerName,headers)
+{headerName=headerName.toLowerCase();var value=null;for(var name in headers){if(name.toLowerCase()===headerName){value=headers[name];break;}}
+return value;},_lastModified:function(headers)
+{var lastModifiedHeader=this._headerValue("last-modified",headers);if(!lastModifiedHeader)
+return null;var lastModified=new Date(lastModifiedHeader);if(isNaN(lastModified.getTime()))
+return null;return lastModified;},_checkLastModified:function(headers,url)
+{var lastModified=this._lastModified(headers);if(lastModified)
+return lastModified;var etagMessage=this._headerValue("etag",headers)?", \"ETag\" response header found instead":"";var message=String.sprintf("The \"Last-Modified\" response header is missing or invalid for %s%s. The CSS auto-reload functionality will not work correctly.",url,etagMessage);WebInspector.console.log(message);return null;},_sassFileSaved:function(sassURL,wasLoadedFromFileSystem)
+{var cssURLs=this._cssURLsForSASSURL[sassURL];if(!cssURLs)
+return;if(!WebInspector.settings.cssReloadEnabled.get())
+return;var sassFile=this._workspace.uiSourceCodeForURL(sassURL);console.assert(sassFile);if(wasLoadedFromFileSystem)
+sassFile.requestMetadata(metadataReceived.bind(this));else
+NetworkAgent.loadResourceForFrontend(WebInspector.resourceTreeModel.mainFrame.id,sassURL,undefined,sassLoadedViaNetwork.bind(this));function sassLoadedViaNetwork(error,statusCode,headers,content)
+{if(error||statusCode>=400){console.error("Could not load content for "+sassURL+" : "+(error||("HTTP status code: "+statusCode)));return;}
+var lastModified=this._checkLastModified(headers,sassURL);if(!lastModified)
+return;metadataReceived.call(this,lastModified);}
+function metadataReceived(timestamp)
+{if(!timestamp)
+return;var now=Date.now();var deadlineMs=now+this.pollPeriodMs;var pollData=this._pollDataForSASSURL[sassURL];if(pollData){var dataByURL=pollData.dataByURL;for(var url in dataByURL)
+clearTimeout(dataByURL[url].timer);}
+pollData={dataByURL:{},deadlineMs:deadlineMs,sassTimestamp:timestamp};this._pollDataForSASSURL[sassURL]=pollData;for(var i=0;i<cssURLs.length;++i){pollData.dataByURL[cssURLs[i]]={previousPoll:now};this._pollCallback(cssURLs[i],sassURL,false);}}},_pollCallback:function(cssURL,sassURL,stopPolling)
+{var now;var pollData=this._pollDataForSASSURL[sassURL];if(!pollData)
+return;if(stopPolling||(now=new Date().getTime())>pollData.deadlineMs){delete pollData.dataByURL[cssURL];if(!Object.keys(pollData.dataByURL).length)
+delete this._pollDataForSASSURL[sassURL];return;}
+var nextPoll=this.pollIntervalMs+pollData.dataByURL[cssURL].previousPoll;var remainingTimeoutMs=Math.max(0,nextPoll-now);pollData.dataByURL[cssURL].previousPoll=now+remainingTimeoutMs;pollData.dataByURL[cssURL].timer=setTimeout(this._reloadCSS.bind(this,cssURL,sassURL,this._pollCallback.bind(this)),remainingTimeoutMs);},_reloadCSS:function(cssURL,sassURL,callback)
+{var cssUISourceCode=this._workspace.uiSourceCodeForURL(cssURL);if(!cssUISourceCode){WebInspector.console.log(WebInspector.UIString("%s resource missing. Please reload the page.",cssURL));callback(cssURL,sassURL,true);return;}
+if(this._workspace.hasMappingForURL(sassURL))
+this._reloadCSSFromFileSystem(cssUISourceCode,sassURL,callback);else
+this._reloadCSSFromNetwork(cssUISourceCode,sassURL,callback);},_reloadCSSFromNetwork:function(cssUISourceCode,sassURL,callback)
+{var cssURL=cssUISourceCode.url;var data=this._pollDataForSASSURL[sassURL];if(!data){callback(cssURL,sassURL,true);return;}
+var headers={"if-modified-since":new Date(data.sassTimestamp.getTime()-1000).toUTCString()};NetworkAgent.loadResourceForFrontend(WebInspector.resourceTreeModel.mainFrame.id,cssURL,headers,contentLoaded.bind(this));function contentLoaded(error,statusCode,headers,content)
+{if(error||statusCode>=400){console.error("Could not load content for "+cssURL+" : "+(error||("HTTP status code: "+statusCode)));callback(cssURL,sassURL,true);return;}
+if(!this._pollDataForSASSURL[sassURL]){callback(cssURL,sassURL,true);return;}
+if(statusCode===304){callback(cssURL,sassURL,false);return;}
+var lastModified=this._checkLastModified(headers,cssURL);if(!lastModified){callback(cssURL,sassURL,true);return;}
+if(lastModified.getTime()<data.sassTimestamp.getTime()){callback(cssURL,sassURL,false);return;}
+this._updateCSSRevision(cssUISourceCode,content,sassURL,callback);}},_updateCSSRevision:function(cssUISourceCode,content,sassURL,callback)
+{++this._addingRevisionCounter;cssUISourceCode.addRevision(content);this._cssUISourceCodeUpdated(cssUISourceCode.url,sassURL,callback);},_reloadCSSFromFileSystem:function(cssUISourceCode,sassURL,callback)
+{cssUISourceCode.requestMetadata(metadataCallback.bind(this));function metadataCallback(timestamp)
+{var cssURL=cssUISourceCode.url;if(!timestamp){callback(cssURL,sassURL,false);return;}
+var cssTimestamp=timestamp.getTime();var pollData=this._pollDataForSASSURL[sassURL];if(!pollData){callback(cssURL,sassURL,true);return;}
+if(cssTimestamp<pollData.sassTimestamp.getTime()){callback(cssURL,sassURL,false);return;}
+cssUISourceCode.requestOriginalContent(contentCallback.bind(this));function contentCallback(content)
+{if(content===null)
+return;this._updateCSSRevision(cssUISourceCode,content,sassURL,callback);}}},_cssUISourceCodeUpdated:function(cssURL,sassURL,callback)
+{var completeSourceMapURL=this._completeSourceMapURLForCSSURL[cssURL];if(!completeSourceMapURL)
+return;var ids=this._cssModel.styleSheetIdsForURL(cssURL);if(!ids)
+return;var headers=[];for(var i=0;i<ids.length;++i)
+headers.push(this._cssModel.styleSheetHeaderForId(ids[i]));for(var i=0;i<ids.length;++i)
+this._loadSourceMapAndBindUISourceCode(headers,true,completeSourceMapURL);callback(cssURL,sassURL,true);},addHeader:function(header)
+{if(!header.sourceMapURL||!header.sourceURL||header.isInline||!WebInspector.settings.cssSourceMapsEnabled.get())
+return;var completeSourceMapURL=WebInspector.ParsedURL.completeURL(header.sourceURL,header.sourceMapURL);if(!completeSourceMapURL)
+return;this._completeSourceMapURLForCSSURL[header.sourceURL]=completeSourceMapURL;this._loadSourceMapAndBindUISourceCode([header],false,completeSourceMapURL);},removeHeader:function(header)
+{var sourceURL=header.sourceURL;if(!sourceURL||!header.sourceMapURL||header.isInline||!this._completeSourceMapURLForCSSURL[sourceURL])
+return;delete this._sourceMapByStyleSheetURL[sourceURL];delete this._completeSourceMapURLForCSSURL[sourceURL];for(var sassURL in this._cssURLsForSASSURL){var urls=this._cssURLsForSASSURL[sassURL];urls.remove(sourceURL);if(!urls.length)
+delete this._cssURLsForSASSURL[sassURL];}
+var completeSourceMapURL=WebInspector.ParsedURL.completeURL(sourceURL,header.sourceMapURL);if(completeSourceMapURL)
+delete this._sourceMapByURL[completeSourceMapURL];header.updateLocations();},_loadSourceMapAndBindUISourceCode:function(headersWithSameSourceURL,forceRebind,completeSourceMapURL)
+{console.assert(headersWithSameSourceURL.length);var sourceURL=headersWithSameSourceURL[0].sourceURL;this._loadSourceMapForStyleSheet(completeSourceMapURL,sourceURL,forceRebind,sourceMapLoaded.bind(this));function sourceMapLoaded(sourceMap)
+{if(!sourceMap)
+return;this._sourceMapByStyleSheetURL[sourceURL]=sourceMap;for(var i=0;i<headersWithSameSourceURL.length;++i){if(forceRebind)
+headersWithSameSourceURL[i].updateLocations();else
+this._bindUISourceCode(headersWithSameSourceURL[i],sourceMap);}}},_addCSSURLforSASSURL:function(cssURL,sassURL)
+{var cssURLs;if(this._cssURLsForSASSURL.hasOwnProperty(sassURL))
+cssURLs=this._cssURLsForSASSURL[sassURL];else{cssURLs=[];this._cssURLsForSASSURL[sassURL]=cssURLs;}
+if(cssURLs.indexOf(cssURL)===-1)
+cssURLs.push(cssURL);},_loadSourceMapForStyleSheet:function(completeSourceMapURL,completeStyleSheetURL,forceReload,callback)
+{var sourceMap=this._sourceMapByURL[completeSourceMapURL];if(sourceMap&&!forceReload){callback(sourceMap);return;}
+var pendingCallbacks=this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];if(pendingCallbacks){pendingCallbacks.push(callback);return;}
+pendingCallbacks=[callback];this._pendingSourceMapLoadingCallbacks[completeSourceMapURL]=pendingCallbacks;WebInspector.SourceMap.load(completeSourceMapURL,completeStyleSheetURL,sourceMapLoaded.bind(this));function sourceMapLoaded(sourceMap)
+{var callbacks=this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];delete this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];if(!callbacks)
+return;if(sourceMap)
+this._sourceMapByURL[completeSourceMapURL]=sourceMap;else
+delete this._sourceMapByURL[completeSourceMapURL];for(var i=0;i<callbacks.length;++i)
+callbacks[i](sourceMap);}},_bindUISourceCode:function(header,sourceMap)
+{header.pushSourceMapping(this);var rawURL=header.sourceURL;var sources=sourceMap.sources();for(var i=0;i<sources.length;++i){var url=sources[i];this._addCSSURLforSASSURL(rawURL,url);if(!this._workspace.hasMappingForURL(url)&&!this._workspace.uiSourceCodeForURL(url)){var contentProvider=sourceMap.sourceContentProvider(url,WebInspector.resourceTypes.Stylesheet);this._networkWorkspaceProvider.addFileForURL(url,contentProvider,true);}}},rawLocationToUILocation:function(rawLocation)
+{var location=(rawLocation);var entry;var sourceMap=this._sourceMapByStyleSheetURL[location.url];if(!sourceMap)
+return null;entry=sourceMap.findEntry(location.lineNumber,location.columnNumber);if(!entry||entry.length===2)
+return null;var uiSourceCode=this._workspace.uiSourceCodeForURL(entry[2]);if(!uiSourceCode)
+return null;return new WebInspector.UILocation(uiSourceCode,entry[3],entry[4]);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{return new WebInspector.CSSLocation(uiSourceCode.url||"",lineNumber,columnNumber);},isIdentity:function()
+{return false;},_uiSourceCodeAdded:function(event)
+{var uiSourceCode=(event.data);var cssURLs=this._cssURLsForSASSURL[uiSourceCode.url];if(!cssURLs)
+return;for(var i=0;i<cssURLs.length;++i){var ids=this._cssModel.styleSheetIdsForURL(cssURLs[i]);for(var j=0;j<ids.length;++j){var header=this._cssModel.styleSheetHeaderForId(ids[j]);console.assert(header);header.updateLocations();}}},_uiSourceCodeContentCommitted:function(event)
+{var uiSourceCode=(event.data.uiSourceCode);if(uiSourceCode.project().type()===WebInspector.projectTypes.FileSystem)
+this._sassFileSaved(uiSourceCode.url,true);},_reset:function()
+{this._addingRevisionCounter=0;this._completeSourceMapURLForCSSURL={};this._cssURLsForSASSURL={};this._pendingSourceMapLoadingCallbacks={};this._pollDataForSASSURL={};this._sourceMapByURL={};this._sourceMapByStyleSheetURL={};}}
+WebInspector.DOMNode=function(domModel,doc,isInShadowTree,payload){this._domModel=domModel;this.ownerDocument=doc;this._isInShadowTree=isInShadowTree;this.id=payload.nodeId;domModel._idToDOMNode[this.id]=this;this._nodeType=payload.nodeType;this._nodeName=payload.nodeName;this._localName=payload.localName;this._nodeValue=payload.nodeValue;this._pseudoType=payload.pseudoType;this._shadowRootType=payload.shadowRootType;this._frameId=payload.frameId||null;this._shadowRoots=[];this._attributes=[];this._attributesMap={};if(payload.attributes)
+this._setAttributesPayload(payload.attributes);this._userProperties={};this._descendantUserPropertyCounters={};this._childNodeCount=payload.childNodeCount||0;this._children=null;this.nextSibling=null;this.previousSibling=null;this.firstChild=null;this.lastChild=null;this.parentNode=null;if(payload.shadowRoots){for(var i=0;i<payload.shadowRoots.length;++i){var root=payload.shadowRoots[i];var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,root);this._shadowRoots.push(node);node.parentNode=this;}}
+if(payload.templateContent){this._templateContent=new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,payload.templateContent);this._templateContent.parentNode=this;}
+if(payload.importedDocument){this._importedDocument=new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,payload.importedDocument);this._importedDocument.parentNode=this;}
+if(payload.children)
+this._setChildrenPayload(payload.children);this._setPseudoElements(payload.pseudoElements);if(payload.contentDocument){this._contentDocument=new WebInspector.DOMDocument(domModel,payload.contentDocument);this._children=[this._contentDocument];this._renumber();}
+if(this._nodeType===Node.ELEMENT_NODE){if(this.ownerDocument&&!this.ownerDocument.documentElement&&this._nodeName==="HTML")
+this.ownerDocument.documentElement=this;if(this.ownerDocument&&!this.ownerDocument.body&&this._nodeName==="BODY")
+this.ownerDocument.body=this;}else if(this._nodeType===Node.DOCUMENT_TYPE_NODE){this.publicId=payload.publicId;this.systemId=payload.systemId;this.internalSubset=payload.internalSubset;}else if(this._nodeType===Node.ATTRIBUTE_NODE){this.name=payload.name;this.value=payload.value;}}
+WebInspector.DOMNode.PseudoElementNames={Before:"before",After:"after"}
+WebInspector.DOMNode.ShadowRootTypes={UserAgent:"user-agent",Author:"author"}
+WebInspector.DOMNode.prototype={children:function()
+{return this._children?this._children.slice():null;},hasAttributes:function()
+{return this._attributes.length>0;},childNodeCount:function()
+{return this._childNodeCount;},hasShadowRoots:function()
+{return!!this._shadowRoots.length;},shadowRoots:function()
+{return this._shadowRoots.slice();},templateContent:function()
+{return this._templateContent;},importedDocument:function()
+{return this._importedDocument;},nodeType:function()
+{return this._nodeType;},nodeName:function()
+{return this._nodeName;},pseudoType:function()
+{return this._pseudoType;},hasPseudoElements:function()
+{return Object.keys(this._pseudoElements).length!==0;},pseudoElements:function()
+{return this._pseudoElements;},isInShadowTree:function()
+{return this._isInShadowTree;},ancestorUserAgentShadowRoot:function()
+{if(!this._isInShadowTree)
+return null;var current=this;while(!current.isShadowRoot())
+current=current.parentNode;return current.shadowRootType()===WebInspector.DOMNode.ShadowRootTypes.UserAgent?current:null;},isShadowRoot:function()
+{return!!this._shadowRootType;},shadowRootType:function()
+{return this._shadowRootType||null;},nodeNameInCorrectCase:function()
+{var shadowRootType=this.shadowRootType();if(shadowRootType)
+return"#shadow-root"+(shadowRootType===WebInspector.DOMNode.ShadowRootTypes.UserAgent?" (user-agent)":"");return this.isXMLNode()?this.nodeName():this.nodeName().toLowerCase();},setNodeName:function(name,callback)
+{DOMAgent.setNodeName(this.id,name,WebInspector.domModel._markRevision(this,callback));},localName:function()
+{return this._localName;},nodeValue:function()
+{return this._nodeValue;},setNodeValue:function(value,callback)
+{DOMAgent.setNodeValue(this.id,value,WebInspector.domModel._markRevision(this,callback));},getAttribute:function(name)
+{var attr=this._attributesMap[name];return attr?attr.value:undefined;},setAttribute:function(name,text,callback)
+{DOMAgent.setAttributesAsText(this.id,text,name,WebInspector.domModel._markRevision(this,callback));},setAttributeValue:function(name,value,callback)
+{DOMAgent.setAttributeValue(this.id,name,value,WebInspector.domModel._markRevision(this,callback));},attributes:function()
+{return this._attributes;},removeAttribute:function(name,callback)
+{function mycallback(error)
+{if(!error){delete this._attributesMap[name];for(var i=0;i<this._attributes.length;++i){if(this._attributes[i].name===name){this._attributes.splice(i,1);break;}}}
+WebInspector.domModel._markRevision(this,callback)(error);}
+DOMAgent.removeAttribute(this.id,name,mycallback.bind(this));},getChildNodes:function(callback)
+{if(this._children){if(callback)
+callback(this.children());return;}
+function mycallback(error)
+{if(callback)
+callback(error?null:this.children());}
+DOMAgent.requestChildNodes(this.id,undefined,mycallback.bind(this));},getSubtree:function(depth,callback)
+{function mycallback(error)
+{if(callback)
+callback(error?null:this._children);}
+DOMAgent.requestChildNodes(this.id,depth,mycallback.bind(this));},getOuterHTML:function(callback)
+{DOMAgent.getOuterHTML(this.id,callback);},setOuterHTML:function(html,callback)
+{DOMAgent.setOuterHTML(this.id,html,WebInspector.domModel._markRevision(this,callback));},removeNode:function(callback)
+{DOMAgent.removeNode(this.id,WebInspector.domModel._markRevision(this,callback));},copyNode:function()
+{function copy(error,text)
+{if(!error)
+InspectorFrontendHost.copyText(text);}
+DOMAgent.getOuterHTML(this.id,copy);},eventListeners:function(objectGroupId,callback)
+{DOMAgent.getEventListenersForNode(this.id,objectGroupId,callback);},path:function()
+{function canPush(node)
+{return node&&("index"in node||(node.isShadowRoot()&&node.parentNode))&&node._nodeName.length;}
+var path=[];var node=this;while(canPush(node)){var index=typeof node.index==="number"?node.index:(node.shadowRootType()===WebInspector.DOMNode.ShadowRootTypes.UserAgent?"u":"a");path.push([index,node._nodeName]);node=node.parentNode;}
+path.reverse();return path.join(",");},isAncestor:function(node)
+{if(!node)
+return false;var currentNode=node.parentNode;while(currentNode){if(this===currentNode)
+return true;currentNode=currentNode.parentNode;}
+return false;},isDescendant:function(descendant)
+{return descendant!==null&&descendant.isAncestor(this);},frameId:function()
+{var node=this;while(!node._frameId&&node.parentNode)
+node=node.parentNode;return node._frameId;},_setAttributesPayload:function(attrs)
+{var attributesChanged=!this._attributes||attrs.length!==this._attributes.length*2;var oldAttributesMap=this._attributesMap||{};this._attributes=[];this._attributesMap={};for(var i=0;i<attrs.length;i+=2){var name=attrs[i];var value=attrs[i+1];this._addAttribute(name,value);if(attributesChanged)
+continue;if(!oldAttributesMap[name]||oldAttributesMap[name].value!==value)
+attributesChanged=true;}
+return attributesChanged;},_insertChild:function(prev,payload)
+{var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payload);this._children.splice(this._children.indexOf(prev)+1,0,node);this._renumber();return node;},_removeChild:function(node)
+{if(node.pseudoType()){delete this._pseudoElements[node.pseudoType()];}else{var shadowRootIndex=this._shadowRoots.indexOf(node);if(shadowRootIndex!==-1)
+this._shadowRoots.splice(shadowRootIndex,1);else
+this._children.splice(this._children.indexOf(node),1);}
+node.parentNode=null;node._updateChildUserPropertyCountsOnRemoval(this);this._renumber();},_setChildrenPayload:function(payloads)
+{if(this._contentDocument)
+return;this._children=[];for(var i=0;i<payloads.length;++i){var payload=payloads[i];var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payload);this._children.push(node);}
+this._renumber();},_setPseudoElements:function(payloads)
+{this._pseudoElements={};if(!payloads)
+return;for(var i=0;i<payloads.length;++i){var node=new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payloads[i]);node.parentNode=this;this._pseudoElements[node.pseudoType()]=node;}},_renumber:function()
+{this._childNodeCount=this._children.length;if(this._childNodeCount==0){this.firstChild=null;this.lastChild=null;return;}
+this.firstChild=this._children[0];this.lastChild=this._children[this._childNodeCount-1];for(var i=0;i<this._childNodeCount;++i){var child=this._children[i];child.index=i;child.nextSibling=i+1<this._childNodeCount?this._children[i+1]:null;child.previousSibling=i-1>=0?this._children[i-1]:null;child.parentNode=this;}},_addAttribute:function(name,value)
+{var attr={name:name,value:value,_node:this};this._attributesMap[name]=attr;this._attributes.push(attr);},_setAttribute:function(name,value)
+{var attr=this._attributesMap[name];if(attr)
+attr.value=value;else
+this._addAttribute(name,value);},_removeAttribute:function(name)
+{var attr=this._attributesMap[name];if(attr){this._attributes.remove(attr);delete this._attributesMap[name];}},moveTo:function(targetNode,anchorNode,callback)
+{DOMAgent.moveTo(this.id,targetNode.id,anchorNode?anchorNode.id:undefined,WebInspector.domModel._markRevision(this,callback));},isXMLNode:function()
+{return!!this.ownerDocument&&!!this.ownerDocument.xmlVersion;},_updateChildUserPropertyCountsOnRemoval:function(parentNode)
+{var result={};if(this._userProperties){for(var name in this._userProperties)
+result[name]=(result[name]||0)+1;}
+if(this._descendantUserPropertyCounters){for(var name in this._descendantUserPropertyCounters){var counter=this._descendantUserPropertyCounters[name];result[name]=(result[name]||0)+counter;}}
+for(var name in result)
+parentNode._updateDescendantUserPropertyCount(name,-result[name]);},_updateDescendantUserPropertyCount:function(name,delta)
+{if(!this._descendantUserPropertyCounters.hasOwnProperty(name))
+this._descendantUserPropertyCounters[name]=0;this._descendantUserPropertyCounters[name]+=delta;if(!this._descendantUserPropertyCounters[name])
+delete this._descendantUserPropertyCounters[name];if(this.parentNode)
+this.parentNode._updateDescendantUserPropertyCount(name,delta);},setUserProperty:function(name,value)
+{if(value===null){this.removeUserProperty(name);return;}
+if(this.parentNode&&!this._userProperties.hasOwnProperty(name))
+this.parentNode._updateDescendantUserPropertyCount(name,1);this._userProperties[name]=value;},removeUserProperty:function(name)
+{if(!this._userProperties.hasOwnProperty(name))
+return;delete this._userProperties[name];if(this.parentNode)
+this.parentNode._updateDescendantUserPropertyCount(name,-1);},getUserProperty:function(name)
+{return(this._userProperties&&this._userProperties[name])||null;},descendantUserPropertyCount:function(name)
+{return this._descendantUserPropertyCounters&&this._descendantUserPropertyCounters[name]?this._descendantUserPropertyCounters[name]:0;},resolveURL:function(url)
+{if(!url)
+return url;for(var frameOwnerCandidate=this;frameOwnerCandidate;frameOwnerCandidate=frameOwnerCandidate.parentNode){if(frameOwnerCandidate.baseURL)
+return WebInspector.ParsedURL.completeURL(frameOwnerCandidate.baseURL,url);}
+return null;}}
+WebInspector.DOMDocument=function(domModel,payload)
+{WebInspector.DOMNode.call(this,domModel,this,false,payload);this.documentURL=payload.documentURL||"";this.baseURL=payload.baseURL||"";this.xmlVersion=payload.xmlVersion;this._listeners={};}
+WebInspector.DOMDocument.prototype={__proto__:WebInspector.DOMNode.prototype}
+WebInspector.DOMModel=function(){this._idToDOMNode={};this._document=null;this._attributeLoadNodeIds={};InspectorBackend.registerDOMDispatcher(new WebInspector.DOMDispatcher(this));this._defaultHighlighter=new WebInspector.DefaultDOMNodeHighlighter();this._highlighter=this._defaultHighlighter;}
+WebInspector.DOMModel.Events={AttrModified:"AttrModified",AttrRemoved:"AttrRemoved",CharacterDataModified:"CharacterDataModified",NodeInserted:"NodeInserted",NodeRemoved:"NodeRemoved",DocumentUpdated:"DocumentUpdated",ChildNodeCountUpdated:"ChildNodeCountUpdated",UndoRedoRequested:"UndoRedoRequested",UndoRedoCompleted:"UndoRedoCompleted",}
+WebInspector.DOMModel.prototype={requestDocument:function(callback)
+{if(this._document){if(callback)
+callback(this._document);return;}
+if(this._pendingDocumentRequestCallbacks){this._pendingDocumentRequestCallbacks.push(callback);return;}
+this._pendingDocumentRequestCallbacks=[callback];function onDocumentAvailable(error,root)
+{if(!error)
+this._setDocument(root);for(var i=0;i<this._pendingDocumentRequestCallbacks.length;++i){var callback=this._pendingDocumentRequestCallbacks[i];if(callback)
+callback(this._document);}
+delete this._pendingDocumentRequestCallbacks;}
+DOMAgent.getDocument(onDocumentAvailable.bind(this));},existingDocument:function()
+{return this._document;},pushNodeToFrontend:function(objectId,callback)
+{this._dispatchWhenDocumentAvailable(DOMAgent.requestNode.bind(DOMAgent,objectId),callback);},pushNodeByPathToFrontend:function(path,callback)
+{this._dispatchWhenDocumentAvailable(DOMAgent.pushNodeByPathToFrontend.bind(DOMAgent,path),callback);},pushNodesByBackendIdsToFrontend:function(backendNodeIds,callback)
+{this._dispatchWhenDocumentAvailable(DOMAgent.pushNodesByBackendIdsToFrontend.bind(DOMAgent,backendNodeIds),callback);},_wrapClientCallback:function(callback)
+{if(!callback)
+return;return function(error,result)
+{callback(error?null:result);}},_dispatchWhenDocumentAvailable:function(func,callback)
+{var callbackWrapper=this._wrapClientCallback(callback);function onDocumentAvailable()
+{if(this._document)
+func(callbackWrapper);else{if(callbackWrapper)
+callbackWrapper("No document");}}
+this.requestDocument(onDocumentAvailable.bind(this));},_attributeModified:function(nodeId,name,value)
+{var node=this._idToDOMNode[nodeId];if(!node)
+return;node._setAttribute(name,value);this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrModified,{node:node,name:name});},_attributeRemoved:function(nodeId,name)
+{var node=this._idToDOMNode[nodeId];if(!node)
+return;node._removeAttribute(name);this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrRemoved,{node:node,name:name});},_inlineStyleInvalidated:function(nodeIds)
+{for(var i=0;i<nodeIds.length;++i)
+this._attributeLoadNodeIds[nodeIds[i]]=true;if("_loadNodeAttributesTimeout"in this)
+return;this._loadNodeAttributesTimeout=setTimeout(this._loadNodeAttributes.bind(this),20);},_loadNodeAttributes:function()
+{function callback(nodeId,error,attributes)
+{if(error){return;}
+var node=this._idToDOMNode[nodeId];if(node){if(node._setAttributesPayload(attributes))
+this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrModified,{node:node,name:"style"});}}
+delete this._loadNodeAttributesTimeout;for(var nodeId in this._attributeLoadNodeIds){var nodeIdAsNumber=parseInt(nodeId,10);DOMAgent.getAttributes(nodeIdAsNumber,callback.bind(this,nodeIdAsNumber));}
+this._attributeLoadNodeIds={};},_characterDataModified:function(nodeId,newValue)
+{var node=this._idToDOMNode[nodeId];node._nodeValue=newValue;this.dispatchEventToListeners(WebInspector.DOMModel.Events.CharacterDataModified,node);},nodeForId:function(nodeId)
+{return this._idToDOMNode[nodeId]||null;},_documentUpdated:function()
+{this._setDocument(null);},_setDocument:function(payload)
+{this._idToDOMNode={};if(payload&&"nodeId"in payload)
+this._document=new WebInspector.DOMDocument(this,payload);else
+this._document=null;this.dispatchEventToListeners(WebInspector.DOMModel.Events.DocumentUpdated,this._document);},_setDetachedRoot:function(payload)
+{if(payload.nodeName==="#document")
+new WebInspector.DOMDocument(this,payload);else
+new WebInspector.DOMNode(this,null,false,payload);},_setChildNodes:function(parentId,payloads)
+{if(!parentId&&payloads.length){this._setDetachedRoot(payloads[0]);return;}
+var parent=this._idToDOMNode[parentId];parent._setChildrenPayload(payloads);},_childNodeCountUpdated:function(nodeId,newValue)
+{var node=this._idToDOMNode[nodeId];node._childNodeCount=newValue;this.dispatchEventToListeners(WebInspector.DOMModel.Events.ChildNodeCountUpdated,node);},_childNodeInserted:function(parentId,prevId,payload)
+{var parent=this._idToDOMNode[parentId];var prev=this._idToDOMNode[prevId];var node=parent._insertChild(prev,payload);this._idToDOMNode[node.id]=node;this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted,node);},_childNodeRemoved:function(parentId,nodeId)
+{var parent=this._idToDOMNode[parentId];var node=this._idToDOMNode[nodeId];parent._removeChild(node);this._unbind(node);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved,{node:node,parent:parent});},_shadowRootPushed:function(hostId,root)
+{var host=this._idToDOMNode[hostId];if(!host)
+return;var node=new WebInspector.DOMNode(this,host.ownerDocument,true,root);node.parentNode=host;this._idToDOMNode[node.id]=node;host._shadowRoots.push(node);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted,node);},_shadowRootPopped:function(hostId,rootId)
+{var host=this._idToDOMNode[hostId];if(!host)
+return;var root=this._idToDOMNode[rootId];if(!root)
+return;host._removeChild(root);this._unbind(root);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved,{node:root,parent:host});},_pseudoElementAdded:function(parentId,pseudoElement)
+{var parent=this._idToDOMNode[parentId];if(!parent)
+return;var node=new WebInspector.DOMNode(this,parent.ownerDocument,false,pseudoElement);node.parentNode=parent;this._idToDOMNode[node.id]=node;console.assert(!parent._pseudoElements[node.pseudoType()]);parent._pseudoElements[node.pseudoType()]=node;this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted,node);},_pseudoElementRemoved:function(parentId,pseudoElementId)
+{var parent=this._idToDOMNode[parentId];if(!parent)
+return;var pseudoElement=this._idToDOMNode[pseudoElementId];if(!pseudoElement)
+return;parent._removeChild(pseudoElement);this._unbind(pseudoElement);this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved,{node:pseudoElement,parent:parent});},_unbind:function(node)
+{delete this._idToDOMNode[node.id];for(var i=0;node._children&&i<node._children.length;++i)
+this._unbind(node._children[i]);for(var i=0;i<node._shadowRoots.length;++i)
+this._unbind(node._shadowRoots[i]);var pseudoElements=node.pseudoElements();for(var id in pseudoElements)
+this._unbind(pseudoElements[id]);if(node._templateContent)
+this._unbind(node._templateContent);},inspectElement:function(nodeId)
+{WebInspector.Revealer.reveal(this.nodeForId(nodeId));},_inspectNodeRequested:function(nodeId)
+{this.inspectElement(nodeId);},performSearch:function(query,searchCallback)
+{this.cancelSearch();function callback(error,searchId,resultsCount)
+{this._searchId=searchId;searchCallback(resultsCount);}
+DOMAgent.performSearch(query,callback.bind(this));},searchResult:function(index,callback)
+{if(this._searchId)
+DOMAgent.getSearchResults(this._searchId,index,index+1,searchResultsCallback.bind(this));else
+callback(null);function searchResultsCallback(error,nodeIds)
+{if(error){console.error(error);callback(null);return;}
+if(nodeIds.length!=1)
+return;callback(this.nodeForId(nodeIds[0]));}},cancelSearch:function()
+{if(this._searchId){DOMAgent.discardSearchResults(this._searchId);delete this._searchId;}},querySelector:function(nodeId,selectors,callback)
+{DOMAgent.querySelector(nodeId,selectors,this._wrapClientCallback(callback));},querySelectorAll:function(nodeId,selectors,callback)
+{DOMAgent.querySelectorAll(nodeId,selectors,this._wrapClientCallback(callback));},highlightDOMNode:function(nodeId,mode,objectId)
+{if(this._hideDOMNodeHighlightTimeout){clearTimeout(this._hideDOMNodeHighlightTimeout);delete this._hideDOMNodeHighlightTimeout;}
+this._highlighter.highlightDOMNode(nodeId||0,this._buildHighlightConfig(mode),objectId);},hideDOMNodeHighlight:function()
+{this.highlightDOMNode(0);},highlightDOMNodeForTwoSeconds:function(nodeId)
+{this.highlightDOMNode(nodeId);this._hideDOMNodeHighlightTimeout=setTimeout(this.hideDOMNodeHighlight.bind(this),2000);},setInspectModeEnabled:function(enabled,inspectUAShadowDOM,callback)
+{function onDocumentAvailable()
+{this._highlighter.setInspectModeEnabled(enabled,inspectUAShadowDOM,this._buildHighlightConfig(),callback);}
+this.requestDocument(onDocumentAvailable.bind(this));},_buildHighlightConfig:function(mode)
+{mode=mode||"all";var highlightConfig={showInfo:mode==="all",showRulers:WebInspector.settings.showMetricsRulers.get()};if(mode==="all"||mode==="content")
+highlightConfig.contentColor=WebInspector.Color.PageHighlight.Content.toProtocolRGBA();if(mode==="all"||mode==="padding")
+highlightConfig.paddingColor=WebInspector.Color.PageHighlight.Padding.toProtocolRGBA();if(mode==="all"||mode==="border")
+highlightConfig.borderColor=WebInspector.Color.PageHighlight.Border.toProtocolRGBA();if(mode==="all"||mode==="margin")
+highlightConfig.marginColor=WebInspector.Color.PageHighlight.Margin.toProtocolRGBA();if(mode==="all")
+highlightConfig.eventTargetColor=WebInspector.Color.PageHighlight.EventTarget.toProtocolRGBA();return highlightConfig;},_markRevision:function(node,callback)
+{function wrapperFunction(error)
+{if(!error)
+this.markUndoableState();if(callback)
+callback.apply(this,arguments);}
+return wrapperFunction.bind(this);},emulateTouchEventObjects:function(emulationEnabled)
+{const injectedFunction=function(){const touchEvents=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];var recepients=[window.__proto__,document.__proto__];for(var i=0;i<touchEvents.length;++i){for(var j=0;j<recepients.length;++j){if(!(touchEvents[i]in recepients[j]))
+Object.defineProperty(recepients[j],touchEvents[i],{value:null,writable:true,configurable:true,enumerable:true});}}}
+if(emulationEnabled&&!this._addTouchEventsScriptInjecting){this._addTouchEventsScriptInjecting=true;PageAgent.addScriptToEvaluateOnLoad("("+injectedFunction.toString()+")()",scriptAddedCallback.bind(this));}else{if(typeof this._addTouchEventsScriptId!=="undefined"){PageAgent.removeScriptToEvaluateOnLoad(this._addTouchEventsScriptId);delete this._addTouchEventsScriptId;}}
+function scriptAddedCallback(error,scriptId)
+{delete this._addTouchEventsScriptInjecting;if(error)
+return;this._addTouchEventsScriptId=scriptId;}
+PageAgent.setTouchEmulationEnabled(emulationEnabled);},markUndoableState:function()
+{DOMAgent.markUndoableState();},undo:function(callback)
+{function mycallback(error)
+{this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoCompleted);callback(error);}
+this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoRequested);DOMAgent.undo(callback);},redo:function(callback)
+{function mycallback(error)
+{this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoCompleted);callback(error);}
+this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoRequested);DOMAgent.redo(callback);},setHighlighter:function(highlighter)
+{this._highlighter=highlighter||this._defaultHighlighter;},__proto__:WebInspector.Object.prototype}
+WebInspector.DOMDispatcher=function(domModel)
+{this._domModel=domModel;}
+WebInspector.DOMDispatcher.prototype={documentUpdated:function()
+{this._domModel._documentUpdated();},inspectNodeRequested:function(nodeId)
+{this._domModel._inspectNodeRequested(nodeId);},attributeModified:function(nodeId,name,value)
+{this._domModel._attributeModified(nodeId,name,value);},attributeRemoved:function(nodeId,name)
+{this._domModel._attributeRemoved(nodeId,name);},inlineStyleInvalidated:function(nodeIds)
+{this._domModel._inlineStyleInvalidated(nodeIds);},characterDataModified:function(nodeId,characterData)
+{this._domModel._characterDataModified(nodeId,characterData);},setChildNodes:function(parentId,payloads)
+{this._domModel._setChildNodes(parentId,payloads);},childNodeCountUpdated:function(nodeId,childNodeCount)
+{this._domModel._childNodeCountUpdated(nodeId,childNodeCount);},childNodeInserted:function(parentNodeId,previousNodeId,payload)
+{this._domModel._childNodeInserted(parentNodeId,previousNodeId,payload);},childNodeRemoved:function(parentNodeId,nodeId)
+{this._domModel._childNodeRemoved(parentNodeId,nodeId);},shadowRootPushed:function(hostId,root)
+{this._domModel._shadowRootPushed(hostId,root);},shadowRootPopped:function(hostId,rootId)
+{this._domModel._shadowRootPopped(hostId,rootId);},pseudoElementAdded:function(parentId,pseudoElement)
+{this._domModel._pseudoElementAdded(parentId,pseudoElement);},pseudoElementRemoved:function(parentId,pseudoElementId)
+{this._domModel._pseudoElementRemoved(parentId,pseudoElementId);}}
+WebInspector.DOMNodeHighlighter=function(){}
+WebInspector.DOMNodeHighlighter.prototype={highlightDOMNode:function(nodeId,config,objectId){},setInspectModeEnabled:function(enabled,inspectUAShadowDOM,config,callback){}}
+WebInspector.DefaultDOMNodeHighlighter=function(){}
+WebInspector.DefaultDOMNodeHighlighter.prototype={highlightDOMNode:function(nodeId,config,objectId)
+{if(objectId||nodeId)
+DOMAgent.highlightNode(config,objectId?undefined:nodeId,objectId);else
+DOMAgent.hideHighlight();},setInspectModeEnabled:function(enabled,inspectUAShadowDOM,config,callback)
+{DOMAgent.setInspectModeEnabled(enabled,inspectUAShadowDOM,config,callback);}}
+WebInspector.domModel;WebInspector.evaluateForTestInFrontend=function(callId,script)
+{if(!InspectorFrontendHost.isUnderTest())
+return;function invokeMethod()
+{var message;try{script=script+"//# sourceURL=evaluateInWebInspector"+callId+".js";var result=window.eval(script);message=typeof result==="undefined"?"\"<undefined>\"":JSON.stringify(result);}catch(e){message=e.toString();}
+RuntimeAgent.evaluate("didEvaluateForTestInFrontend("+callId+", "+message+")","test");}
+InspectorBackend.connection().runAfterPendingDispatches(invokeMethod);}
+WebInspector.Dialog=function(relativeToElement,delegate)
+{this._delegate=delegate;this._relativeToElement=relativeToElement;this._glassPane=new WebInspector.GlassPane();this._glassPane.element.tabIndex=0;this._glassPane.element.addEventListener("focus",this._onGlassPaneFocus.bind(this),false);this._element=this._glassPane.element.createChild("div");this._element.tabIndex=0;this._element.addEventListener("focus",this._onFocus.bind(this),false);this._element.addEventListener("keydown",this._onKeyDown.bind(this),false);this._closeKeys=[WebInspector.KeyboardShortcut.Keys.Enter.code,WebInspector.KeyboardShortcut.Keys.Esc.code,];delegate.show(this._element);this._position();this._delegate.focus();}
+WebInspector.Dialog.currentInstance=function()
+{return WebInspector.Dialog._instance;}
+WebInspector.Dialog.show=function(relativeToElement,delegate)
+{if(WebInspector.Dialog._instance)
+return;WebInspector.Dialog._instance=new WebInspector.Dialog(relativeToElement,delegate);}
+WebInspector.Dialog.hide=function()
+{if(!WebInspector.Dialog._instance)
+return;WebInspector.Dialog._instance._hide();}
+WebInspector.Dialog.prototype={_hide:function()
+{if(this._isHiding)
+return;this._isHiding=true;this._delegate.willHide();delete WebInspector.Dialog._instance;this._glassPane.dispose();},_onGlassPaneFocus:function(event)
+{this._hide();},_onFocus:function(event)
+{this._delegate.focus();},_position:function()
+{this._delegate.position(this._element,this._relativeToElement);},_onKeyDown:function(event)
+{if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Tab.code){event.preventDefault();return;}
+if(event.keyCode===WebInspector.KeyboardShortcut.Keys.Enter.code)
+this._delegate.onEnter();if(this._closeKeys.indexOf(event.keyCode)>=0){this._hide();event.consume(true);}}};WebInspector.DialogDelegate=function()
+{this.element;}
+WebInspector.DialogDelegate.prototype={show:function(element)
+{element.appendChild(this.element);this.element.classList.add("dialog-contents");element.classList.add("dialog");},position:function(element,relativeToElement)
+{var container=WebInspector.Dialog._modalHostView.element;var box=relativeToElement.boxInWindow(window).relativeToElement(container);var positionX=box.x+(relativeToElement.offsetWidth-element.offsetWidth)/2;positionX=Number.constrain(positionX,0,container.offsetWidth-element.offsetWidth);var positionY=box.y+(relativeToElement.offsetHeight-element.offsetHeight)/2;positionY=Number.constrain(positionY,0,container.offsetHeight-element.offsetHeight);element.style.position="absolute";element.positionAt(positionX,positionY,container);},focus:function(){},onEnter:function(){},willHide:function(){},__proto__:WebInspector.Object.prototype}
+WebInspector.Dialog._modalHostView=null;WebInspector.Dialog.setModalHostView=function(view)
+{WebInspector.Dialog._modalHostView=view;};WebInspector.Dialog.modalHostView=function()
+{return WebInspector.Dialog._modalHostView;};WebInspector.Dialog.modalHostRepositioned=function()
+{if(WebInspector.Dialog._instance)
+WebInspector.Dialog._instance._position();};WebInspector.GoToLineDialog=function(sourceFrame)
+{WebInspector.DialogDelegate.call(this);this.element=document.createElement("div");this.element.className="go-to-line-dialog";this.element.createChild("label").textContent=WebInspector.UIString("Go to line: ");this._input=this.element.createChild("input");this._input.setAttribute("type","text");this._input.setAttribute("size",6);this._goButton=this.element.createChild("button");this._goButton.textContent=WebInspector.UIString("Go");this._goButton.addEventListener("click",this._onGoClick.bind(this),false);this._sourceFrame=sourceFrame;}
+WebInspector.GoToLineDialog.install=function(panel,sourceFrameGetter)
+{var goToLineShortcut=WebInspector.GoToLineDialog.createShortcut();panel.registerShortcuts([goToLineShortcut],WebInspector.GoToLineDialog._show.bind(null,sourceFrameGetter));}
+WebInspector.GoToLineDialog._show=function(sourceFrameGetter,event)
+{var sourceFrame=sourceFrameGetter();if(!sourceFrame)
+return false;WebInspector.Dialog.show(sourceFrame.element,new WebInspector.GoToLineDialog(sourceFrame));return true;}
+WebInspector.GoToLineDialog.createShortcut=function()
+{return WebInspector.KeyboardShortcut.makeDescriptor("g",WebInspector.KeyboardShortcut.Modifiers.Ctrl);}
+WebInspector.GoToLineDialog.prototype={focus:function()
+{WebInspector.setCurrentFocusElement(this._input);this._input.select();},_onGoClick:function()
+{this._applyLineNumber();WebInspector.Dialog.hide();},_applyLineNumber:function()
+{var value=this._input.value;var lineNumber=parseInt(value,10)-1;if(!isNaN(lineNumber)&&lineNumber>=0)
+this._sourceFrame.revealPosition(lineNumber,0,true);},onEnter:function()
+{this._applyLineNumber();},__proto__:WebInspector.DialogDelegate.prototype}
+WebInspector.SettingsScreen=function(onHide)
+{WebInspector.HelpScreen.call(this);this.element.id="settings-screen";this._onHide=onHide;this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.element.classList.add("help-window-main");var settingsLabelElement=document.createElement("div");settingsLabelElement.className="help-window-label";settingsLabelElement.createTextChild(WebInspector.UIString("Settings"));this._tabbedPane.element.insertBefore(settingsLabelElement,this._tabbedPane.element.firstChild);this._tabbedPane.element.appendChild(this._createCloseButton());this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.General,WebInspector.UIString("General"),new WebInspector.GenericSettingsTab());this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Workspace,WebInspector.UIString("Workspace"),new WebInspector.WorkspaceSettingsTab());if(WebInspector.experimentsSettings.experimentsEnabled)
+this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Experiments,WebInspector.UIString("Experiments"),new WebInspector.ExperimentsSettingsTab());this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Shortcuts,WebInspector.UIString("Shortcuts"),WebInspector.shortcutsScreen.createShortcutsTabView());this._tabbedPane.shrinkableTabs=false;this._tabbedPane.verticalTabLayout=true;this._lastSelectedTabSetting=WebInspector.settings.createSetting("lastSelectedSettingsTab",WebInspector.SettingsScreen.Tabs.General);this.selectTab(this._lastSelectedTabSetting.get());this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);}
+WebInspector.SettingsScreen.regexValidator=function(text)
+{var regex;try{regex=new RegExp(text);}catch(e){}
+return regex?null:WebInspector.UIString("Invalid pattern");}
+WebInspector.SettingsScreen.integerValidator=function(min,max,text)
+{var value=Number(text);if(isNaN(value))
+return WebInspector.UIString("Invalid number format");if(value<min||value>max)
+return WebInspector.UIString("Value is out of range [%d, %d]",min,max);return null;}
+WebInspector.SettingsScreen.Tabs={General:"general",Overrides:"overrides",Workspace:"workspace",Experiments:"experiments",Shortcuts:"shortcuts"}
+WebInspector.SettingsScreen.prototype={selectTab:function(tabId)
+{this._tabbedPane.selectTab(tabId);},_tabSelected:function(event)
+{this._lastSelectedTabSetting.set(this._tabbedPane.selectedTabId);},wasShown:function()
+{this._tabbedPane.show(this.element);WebInspector.HelpScreen.prototype.wasShown.call(this);},isClosingKey:function(keyCode)
+{return[WebInspector.KeyboardShortcut.Keys.Enter.code,WebInspector.KeyboardShortcut.Keys.Esc.code,].indexOf(keyCode)>=0;},willHide:function()
+{this._onHide();WebInspector.HelpScreen.prototype.willHide.call(this);},__proto__:WebInspector.HelpScreen.prototype}
+WebInspector.SettingsTab=function(name,id)
+{WebInspector.VBox.call(this);this.element.classList.add("settings-tab-container");if(id)
+this.element.id=id;var header=this.element.createChild("header");header.createChild("h3").appendChild(document.createTextNode(name));this.containerElement=this.element.createChild("div","help-container-wrapper").createChild("div","settings-tab help-content help-container");}
+WebInspector.SettingsTab.prototype={_appendSection:function(name)
+{var block=this.containerElement.createChild("div","help-block");if(name)
+block.createChild("div","help-section-title").textContent=name;return block;},_createSelectSetting:function(name,options,setting)
+{var p=document.createElement("p");var labelElement=p.createChild("label");labelElement.textContent=name;var select=p.createChild("select");var settingValue=setting.get();for(var i=0;i<options.length;++i){var option=options[i];select.add(new Option(option[0],option[1]));if(settingValue===option[1])
+select.selectedIndex=i;}
+function changeListener(e)
+{setting.set(options[select.selectedIndex][1]);}
+select.addEventListener("change",changeListener,false);return p;},_createInputSetting:function(label,setting,numeric,maxLength,width,validatorCallback)
+{var p=document.createElement("p");var labelElement=p.createChild("label");labelElement.textContent=label;var inputElement=p.createChild("input");inputElement.value=setting.get();inputElement.type="text";if(numeric)
+inputElement.className="numeric";if(maxLength)
+inputElement.maxLength=maxLength;if(width)
+inputElement.style.width=width;if(validatorCallback){var errorMessageLabel=p.createChild("div");errorMessageLabel.classList.add("field-error-message");errorMessageLabel.style.color="DarkRed";inputElement.oninput=function()
+{var error=validatorCallback(inputElement.value);if(!error)
+error="";errorMessageLabel.textContent=error;};}
+function onBlur()
+{setting.set(numeric?Number(inputElement.value):inputElement.value);}
+inputElement.addEventListener("blur",onBlur,false);return p;},_createCustomSetting:function(name,element)
+{var p=document.createElement("p");var fieldsetElement=document.createElement("fieldset");fieldsetElement.createChild("label").textContent=name;fieldsetElement.appendChild(element);p.appendChild(fieldsetElement);return p;},__proto__:WebInspector.VBox.prototype}
+WebInspector.GenericSettingsTab=function()
+{WebInspector.SettingsTab.call(this,WebInspector.UIString("General"),"general-tab-content");var p=this._appendSection();p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Disable cache (while DevTools is open)"),WebInspector.settings.cacheDisabled));var disableJSElement=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Disable JavaScript"),WebInspector.settings.javaScriptDisabled);p.appendChild(disableJSElement);WebInspector.settings.javaScriptDisabled.addChangeListener(this._javaScriptDisabledChanged,this);this._disableJSCheckbox=disableJSElement.getElementsByTagName("input")[0];var disableJSInfoParent=this._disableJSCheckbox.parentElement.createChild("span","monospace");this._disableJSInfo=disableJSInfoParent.createChild("span","object-info-state-note hidden");this._disableJSInfo.title=WebInspector.UIString("JavaScript is blocked on the inspected page (may be disabled in browser settings).");WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._updateScriptDisabledCheckbox,this);this._updateScriptDisabledCheckbox();p=this._appendSection(WebInspector.UIString("Appearance"));var splitVerticallyTitle=WebInspector.UIString("Split panels vertically when docked to %s",WebInspector.experimentsSettings.dockToLeft.isEnabled()?"left or right":"right");p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(splitVerticallyTitle,WebInspector.settings.splitVerticallyWhenDockedToRight));var panelShortcutTitle=WebInspector.UIString("Enable %s + 1-9 shortcut to switch panels",WebInspector.isMac()?"Cmd":"Ctrl");p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(panelShortcutTitle,WebInspector.settings.shortcutPanelSwitch));p=this._appendSection(WebInspector.UIString("Elements"));var colorFormatElement=this._createSelectSetting(WebInspector.UIString("Color format"),[[WebInspector.UIString("As authored"),WebInspector.Color.Format.Original],["HEX: #DAC0DE",WebInspector.Color.Format.HEX],["RGB: rgb(128, 255, 255)",WebInspector.Color.Format.RGB],["HSL: hsl(300, 80%, 90%)",WebInspector.Color.Format.HSL]],WebInspector.settings.colorFormat);p.appendChild(colorFormatElement);p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show user agent styles"),WebInspector.settings.showUserAgentStyles));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show user agent shadow DOM"),WebInspector.settings.showUAShadowDOM));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Word wrap"),WebInspector.settings.domWordWrap));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show rulers"),WebInspector.settings.showMetricsRulers));p=this._appendSection(WebInspector.UIString("Sources"));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Search in content scripts"),WebInspector.settings.searchInContentScripts));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Enable JavaScript source maps"),WebInspector.settings.jsSourceMapsEnabled));var checkbox=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Enable CSS source maps"),WebInspector.settings.cssSourceMapsEnabled);p.appendChild(checkbox);var fieldset=WebInspector.SettingsUI.createSettingFieldset(WebInspector.settings.cssSourceMapsEnabled);var autoReloadCSSCheckbox=fieldset.createChild("input");fieldset.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Auto-reload generated CSS"),WebInspector.settings.cssReloadEnabled,false,autoReloadCSSCheckbox));checkbox.appendChild(fieldset);var indentationElement=this._createSelectSetting(WebInspector.UIString("Default indentation"),[[WebInspector.UIString("2 spaces"),WebInspector.TextUtils.Indent.TwoSpaces],[WebInspector.UIString("4 spaces"),WebInspector.TextUtils.Indent.FourSpaces],[WebInspector.UIString("8 spaces"),WebInspector.TextUtils.Indent.EightSpaces],[WebInspector.UIString("Tab character"),WebInspector.TextUtils.Indent.TabCharacter]],WebInspector.settings.textEditorIndent);p.appendChild(indentationElement);p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Detect indentation"),WebInspector.settings.textEditorAutoDetectIndent));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Autocompletion"),WebInspector.settings.textEditorAutocompletion));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Bracket matching"),WebInspector.settings.textEditorBracketMatching));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show whitespace characters"),WebInspector.settings.showWhitespacesInEditor));if(WebInspector.experimentsSettings.frameworksDebuggingSupport.isEnabled()){checkbox=WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Skip stepping through sources with particular names"),WebInspector.settings.skipStackFramesSwitch);fieldset=WebInspector.SettingsUI.createSettingFieldset(WebInspector.settings.skipStackFramesSwitch);fieldset.appendChild(this._createInputSetting(WebInspector.UIString("Pattern"),WebInspector.settings.skipStackFramesPattern,false,1000,"100px",WebInspector.SettingsScreen.regexValidator));checkbox.appendChild(fieldset);p.appendChild(checkbox);}
+WebInspector.settings.skipStackFramesSwitch.addChangeListener(this._skipStackFramesSwitchOrPatternChanged,this);WebInspector.settings.skipStackFramesPattern.addChangeListener(this._skipStackFramesSwitchOrPatternChanged,this);p=this._appendSection(WebInspector.UIString("Profiler"));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show advanced heap snapshot properties"),WebInspector.settings.showAdvancedHeapSnapshotProperties));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("High resolution CPU profiling"),WebInspector.settings.highResolutionCpuProfiling));p=this._appendSection(WebInspector.UIString("Console"));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Log XMLHttpRequests"),WebInspector.settings.monitoringXHREnabled));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Preserve log upon navigation"),WebInspector.settings.preserveConsoleLog));p.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show timestamps"),WebInspector.settings.consoleTimestampsEnabled));if(WebInspector.openAnchorLocationRegistry.handlerNames.length>0){var handlerSelector=new WebInspector.HandlerSelector(WebInspector.openAnchorLocationRegistry);p=this._appendSection(WebInspector.UIString("Extensions"));p.appendChild(this._createCustomSetting(WebInspector.UIString("Open links in"),handlerSelector.element));}
+p=this._appendSection();var restoreDefaults=p.createChild("input","settings-tab-text-button");restoreDefaults.type="button";restoreDefaults.value=WebInspector.UIString("Restore defaults and reload");restoreDefaults.addEventListener("click",restoreAndReload);function restoreAndReload()
+{if(window.localStorage)
+window.localStorage.clear();WebInspector.reload();}}
+WebInspector.GenericSettingsTab.prototype={_updateScriptDisabledCheckbox:function()
+{function executionStatusCallback(error,status)
+{if(error||!status)
+return;var forbidden=(status==="forbidden");var disabled=forbidden||(status==="disabled");this._disableJSInfo.classList.toggle("hidden",!forbidden);this._disableJSCheckbox.checked=disabled;this._disableJSCheckbox.disabled=forbidden;}
+PageAgent.getScriptExecutionStatus(executionStatusCallback.bind(this));},_javaScriptDisabledChanged:function()
+{PageAgent.setScriptExecutionDisabled(WebInspector.settings.javaScriptDisabled.get(),this._updateScriptDisabledCheckbox.bind(this));},_skipStackFramesSwitchOrPatternChanged:function()
+{WebInspector.debuggerModel.applySkipStackFrameSettings();},_appendDrawerNote:function(p)
+{var noteElement=p.createChild("div","help-field-note");noteElement.createTextChild("Hit ");noteElement.createChild("span","help-key").textContent="Esc";noteElement.createTextChild(WebInspector.UIString(" or click the"));noteElement.appendChild(new WebInspector.StatusBarButton(WebInspector.UIString("Drawer"),"console-status-bar-item").element);noteElement.createTextChild(WebInspector.UIString("toolbar item"));},__proto__:WebInspector.SettingsTab.prototype}
+WebInspector.WorkspaceSettingsTab=function()
+{WebInspector.SettingsTab.call(this,WebInspector.UIString("Workspace"),"workspace-tab-content");WebInspector.isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded,this._fileSystemAdded,this);WebInspector.isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved,this._fileSystemRemoved,this);this._commonSection=this._appendSection(WebInspector.UIString("Common"));var folderExcludePatternInput=this._createInputSetting(WebInspector.UIString("Folder exclude pattern"),WebInspector.settings.workspaceFolderExcludePattern,false,0,"270px",WebInspector.SettingsScreen.regexValidator);this._commonSection.appendChild(folderExcludePatternInput);this._fileSystemsSection=this._appendSection(WebInspector.UIString("Folders"));this._fileSystemsListContainer=this._fileSystemsSection.createChild("p","settings-list-container");this._addFileSystemRowElement=this._fileSystemsSection.createChild("div");var addFileSystemButton=this._addFileSystemRowElement.createChild("input","settings-tab-text-button");addFileSystemButton.type="button";addFileSystemButton.value=WebInspector.UIString("Add folder\u2026");addFileSystemButton.addEventListener("click",this._addFileSystemClicked.bind(this));this._editFileSystemButton=this._addFileSystemRowElement.createChild("input","settings-tab-text-button");this._editFileSystemButton.type="button";this._editFileSystemButton.value=WebInspector.UIString("Edit\u2026");this._editFileSystemButton.addEventListener("click",this._editFileSystemClicked.bind(this));this._updateEditFileSystemButtonState();this._reset();}
+WebInspector.WorkspaceSettingsTab.prototype={wasShown:function()
+{WebInspector.SettingsTab.prototype.wasShown.call(this);this._reset();},_reset:function()
+{this._resetFileSystems();},_resetFileSystems:function()
+{this._fileSystemsListContainer.removeChildren();var fileSystemPaths=WebInspector.isolatedFileSystemManager.mapping().fileSystemPaths();delete this._fileSystemsList;if(!fileSystemPaths.length){var noFileSystemsMessageElement=this._fileSystemsListContainer.createChild("div","no-file-systems-message");noFileSystemsMessageElement.textContent=WebInspector.UIString("You have no file systems added.");return;}
+this._fileSystemsList=new WebInspector.SettingsList(["path"],this._renderFileSystem.bind(this));this._fileSystemsList.element.classList.add("file-systems-list");this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.Selected,this._fileSystemSelected.bind(this));this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.Removed,this._fileSystemRemovedfromList.bind(this));this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.DoubleClicked,this._fileSystemDoubleClicked.bind(this));this._fileSystemsListContainer.appendChild(this._fileSystemsList.element);for(var i=0;i<fileSystemPaths.length;++i)
+this._fileSystemsList.addItem(fileSystemPaths[i]);this._updateEditFileSystemButtonState();},_updateEditFileSystemButtonState:function()
+{this._editFileSystemButton.disabled=!this._selectedFileSystemPath();},_fileSystemSelected:function(event)
+{this._updateEditFileSystemButtonState();},_fileSystemDoubleClicked:function(event)
+{var id=(event.data);this._editFileSystem(id);},_editFileSystemClicked:function(event)
+{this._editFileSystem(this._selectedFileSystemPath());},_editFileSystem:function(id)
+{WebInspector.EditFileSystemDialog.show(WebInspector.inspectorView.element,id);},_createRemoveButton:function(handler)
+{var removeButton=document.createElement("button");removeButton.classList.add("button");removeButton.classList.add("remove-item-button");removeButton.value=WebInspector.UIString("Remove");if(handler)
+removeButton.addEventListener("click",handler,false);else
+removeButton.disabled=true;return removeButton;},_renderFileSystem:function(columnElement,column,id)
+{if(!id)
+return"";var fileSystemPath=id;var textElement=columnElement.createChild("span","list-column-text");var pathElement=textElement.createChild("span","file-system-path");pathElement.title=fileSystemPath;const maxTotalPathLength=55;const maxFolderNameLength=30;var lastIndexOfSlash=fileSystemPath.lastIndexOf(WebInspector.isWin()?"\\":"/");var folderName=fileSystemPath.substr(lastIndexOfSlash+1);var folderPath=fileSystemPath.substr(0,lastIndexOfSlash+1);folderPath=folderPath.trimMiddle(maxTotalPathLength-Math.min(maxFolderNameLength,folderName.length));folderName=folderName.trimMiddle(maxFolderNameLength);var folderPathElement=pathElement.createChild("span");folderPathElement.textContent=folderPath;var nameElement=pathElement.createChild("span","file-system-path-name");nameElement.textContent=folderName;},_fileSystemRemovedfromList:function(event)
+{var id=(event.data);if(!id)
+return;WebInspector.isolatedFileSystemManager.removeFileSystem(id);},_addFileSystemClicked:function()
+{WebInspector.isolatedFileSystemManager.addFileSystem();},_fileSystemAdded:function(event)
+{var fileSystem=(event.data);if(!this._fileSystemsList)
+this._reset();else
+this._fileSystemsList.addItem(fileSystem.path());},_fileSystemRemoved:function(event)
+{var fileSystem=(event.data);var selectedFileSystemPath=this._selectedFileSystemPath();if(this._fileSystemsList.itemForId(fileSystem.path()))
+this._fileSystemsList.removeItem(fileSystem.path());if(!this._fileSystemsList.itemIds().length)
+this._reset();this._updateEditFileSystemButtonState();},_selectedFileSystemPath:function()
+{return this._fileSystemsList?this._fileSystemsList.selectedId():null;},__proto__:WebInspector.SettingsTab.prototype}
+WebInspector.ExperimentsSettingsTab=function()
+{WebInspector.SettingsTab.call(this,WebInspector.UIString("Experiments"),"experiments-tab-content");var experiments=WebInspector.experimentsSettings.experiments;if(experiments.length){var experimentsSection=this._appendSection();experimentsSection.appendChild(this._createExperimentsWarningSubsection());for(var i=0;i<experiments.length;++i)
+experimentsSection.appendChild(this._createExperimentCheckbox(experiments[i]));}}
+WebInspector.ExperimentsSettingsTab.prototype={_createExperimentsWarningSubsection:function()
+{var subsection=document.createElement("div");var warning=subsection.createChild("span","settings-experiments-warning-subsection-warning");warning.textContent=WebInspector.UIString("WARNING:");subsection.appendChild(document.createTextNode(" "));var message=subsection.createChild("span","settings-experiments-warning-subsection-message");message.textContent=WebInspector.UIString("These experiments could be dangerous and may require restart.");return subsection;},_createExperimentCheckbox:function(experiment)
+{var input=document.createElement("input");input.type="checkbox";input.name=experiment.name;input.checked=experiment.isEnabled();function listener()
+{experiment.setEnabled(input.checked);}
+input.addEventListener("click",listener,false);var p=document.createElement("p");var label=document.createElement("label");label.appendChild(input);label.appendChild(document.createTextNode(WebInspector.UIString(experiment.title)));p.appendChild(label);return p;},__proto__:WebInspector.SettingsTab.prototype}
+WebInspector.SettingsController=function()
+{this._statusBarButton=new WebInspector.StatusBarButton(WebInspector.UIString("Settings"),"settings-status-bar-item");this._statusBarButton.element.addEventListener("mouseup",this._mouseUp.bind(this),false);this._settingsScreen;}
+WebInspector.SettingsController.prototype={get statusBarItem()
+{return this._statusBarButton.element;},_mouseUp:function()
+{this.showSettingsScreen();},_onHideSettingsScreen:function()
+{delete this._settingsScreenVisible;},showSettingsScreen:function(tabId)
+{if(!this._settingsScreen)
+this._settingsScreen=new WebInspector.SettingsScreen(this._onHideSettingsScreen.bind(this));if(tabId)
+this._settingsScreen.selectTab(tabId);this._settingsScreen.showModal();this._settingsScreenVisible=true;},resize:function()
+{if(this._settingsScreen&&this._settingsScreen.isShowing())
+this._settingsScreen.doResize();}}
+WebInspector.SettingsController.SettingsScreenActionDelegate=function(){}
+WebInspector.SettingsController.SettingsScreenActionDelegate.prototype={handleAction:function()
+{WebInspector.settingsController.showSettingsScreen(WebInspector.SettingsScreen.Tabs.General);return true;}}
+WebInspector.SettingsList=function(columns,itemRenderer)
+{this.element=document.createElement("div");this.element.classList.add("settings-list");this.element.tabIndex=-1;this._itemRenderer=itemRenderer;this._listItems={};this._ids=[];this._columns=columns;}
+WebInspector.SettingsList.Events={Selected:"Selected",Removed:"Removed",DoubleClicked:"DoubleClicked",}
+WebInspector.SettingsList.prototype={addItem:function(itemId,beforeId)
+{var listItem=document.createElement("div");listItem._id=itemId;listItem.classList.add("settings-list-item");if(typeof beforeId!==undefined)
+this.element.insertBefore(listItem,this._listItems[beforeId]);else
+this.element.appendChild(listItem);var listItemContents=listItem.createChild("div","settings-list-item-contents");var listItemColumnsElement=listItemContents.createChild("div","settings-list-item-columns");listItem.columnElements={};for(var i=0;i<this._columns.length;++i){var columnElement=listItemColumnsElement.createChild("div","list-column");var columnId=this._columns[i];listItem.columnElements[columnId]=columnElement;this._itemRenderer(columnElement,columnId,itemId);}
+var removeItemButton=this._createRemoveButton(removeItemClicked.bind(this));listItemContents.addEventListener("click",this.selectItem.bind(this,itemId),false);listItemContents.addEventListener("dblclick",this._onDoubleClick.bind(this,itemId),false);listItemContents.appendChild(removeItemButton);this._listItems[itemId]=listItem;if(typeof beforeId!==undefined)
+this._ids.splice(this._ids.indexOf(beforeId),0,itemId);else
+this._ids.push(itemId);function removeItemClicked(event)
+{removeItemButton.disabled=true;this.removeItem(itemId);this.dispatchEventToListeners(WebInspector.SettingsList.Events.Removed,itemId);event.consume();}
+return listItem;},removeItem:function(id)
+{this._listItems[id].remove();delete this._listItems[id];this._ids.remove(id);if(id===this._selectedId){delete this._selectedId;if(this._ids.length)
+this.selectItem(this._ids[0]);}},itemIds:function()
+{return this._ids.slice();},columns:function()
+{return this._columns.slice();},selectedId:function()
+{return this._selectedId;},selectedItem:function()
+{return this._selectedId?this._listItems[this._selectedId]:null;},itemForId:function(itemId)
+{return this._listItems[itemId];},_onDoubleClick:function(id,event)
+{this.dispatchEventToListeners(WebInspector.SettingsList.Events.DoubleClicked,id);},selectItem:function(id,event)
+{if(typeof this._selectedId!=="undefined"){this._listItems[this._selectedId].classList.remove("selected");}
+this._selectedId=id;if(typeof this._selectedId!=="undefined"){this._listItems[this._selectedId].classList.add("selected");}
+this.dispatchEventToListeners(WebInspector.SettingsList.Events.Selected,id);if(event)
+event.consume();},_createRemoveButton:function(handler)
+{var removeButton=document.createElement("button");removeButton.classList.add("remove-item-button");removeButton.value=WebInspector.UIString("Remove");removeButton.addEventListener("click",handler,false);return removeButton;},__proto__:WebInspector.Object.prototype}
+WebInspector.EditableSettingsList=function(columns,valuesProvider,validateHandler,editHandler)
+{WebInspector.SettingsList.call(this,columns,this._renderColumn.bind(this));this._validateHandler=validateHandler;this._editHandler=editHandler;this._valuesProvider=valuesProvider;this._addInputElements={};this._editInputElements={};this._textElements={};this._addMappingItem=this.addItem(null);this._addMappingItem.classList.add("item-editing");this._addMappingItem.classList.add("add-list-item");}
+WebInspector.EditableSettingsList.prototype={addItem:function(itemId,beforeId)
+{var listItem=WebInspector.SettingsList.prototype.addItem.call(this,itemId,beforeId);listItem.classList.add("editable");return listItem;},_renderColumn:function(columnElement,columnId,itemId)
+{columnElement.classList.add("settings-list-column-"+columnId);var placeholder=(columnId==="url")?WebInspector.UIString("URL prefix"):WebInspector.UIString("Folder path");if(itemId===null){var inputElement=columnElement.createChild("input","list-column-editor");inputElement.placeholder=placeholder;inputElement.addEventListener("blur",this._onAddMappingInputBlur.bind(this));inputElement.addEventListener("input",this._validateEdit.bind(this,itemId));this._addInputElements[columnId]=inputElement;return;}
+var validItemId=itemId;if(!this._editInputElements[itemId])
+this._editInputElements[itemId]={};if(!this._textElements[itemId])
+this._textElements[itemId]={};var value=this._valuesProvider(itemId,columnId);var textElement=columnElement.createChild("span","list-column-text");textElement.textContent=value;textElement.title=value;columnElement.addEventListener("click",rowClicked.bind(this),false);this._textElements[itemId][columnId]=textElement;var inputElement=columnElement.createChild("input","list-column-editor");inputElement.value=value;inputElement.addEventListener("blur",this._editMappingBlur.bind(this,itemId));inputElement.addEventListener("input",this._validateEdit.bind(this,itemId));columnElement.inputElement=inputElement;this._editInputElements[itemId][columnId]=inputElement;function rowClicked(event)
+{if(itemId===this._editingId)
+return;event.consume();console.assert(!this._editingId);this._editingId=validItemId;var listItem=this.itemForId(validItemId);listItem.classList.add("item-editing");var inputElement=event.target.inputElement||this._editInputElements[validItemId][this.columns()[0]];inputElement.focus();inputElement.select();}},_data:function(itemId)
+{var inputElements=this._inputElements(itemId);var data={};var columns=this.columns();for(var i=0;i<columns.length;++i)
+data[columns[i]]=inputElements[columns[i]].value;return data;},_inputElements:function(itemId)
+{if(!itemId)
+return this._addInputElements;return this._editInputElements[itemId]||null;},_validateEdit:function(itemId)
+{var errorColumns=this._validateHandler(itemId,this._data(itemId));var hasChanges=this._hasChanges(itemId);var columns=this.columns();for(var i=0;i<columns.length;++i){var columnId=columns[i];var inputElement=this._inputElements(itemId)[columnId];if(hasChanges&&errorColumns.indexOf(columnId)!==-1)
+inputElement.classList.add("editable-item-error");else
+inputElement.classList.remove("editable-item-error");}
+return!errorColumns.length;},_hasChanges:function(itemId)
+{var hasChanges=false;var columns=this.columns();for(var i=0;i<columns.length;++i){var columnId=columns[i];var oldValue=itemId?this._textElements[itemId][columnId].textContent:"";var newValue=this._inputElements(itemId)[columnId].value;if(oldValue!==newValue){hasChanges=true;break;}}
+return hasChanges;},_editMappingBlur:function(itemId,event)
+{var inputElements=Object.values(this._editInputElements[itemId]);if(inputElements.indexOf(event.relatedTarget)!==-1)
+return;var listItem=this.itemForId(itemId);listItem.classList.remove("item-editing");delete this._editingId;if(!this._hasChanges(itemId))
+return;if(!this._validateEdit(itemId)){var columns=this.columns();for(var i=0;i<columns.length;++i){var columnId=columns[i];var inputElement=this._editInputElements[itemId][columnId];inputElement.value=this._textElements[itemId][columnId].textContent;inputElement.classList.remove("editable-item-error");}
+return;}
+this._editHandler(itemId,this._data(itemId));},_onAddMappingInputBlur:function(event)
+{var inputElements=Object.values(this._addInputElements);if(inputElements.indexOf(event.relatedTarget)!==-1)
+return;if(!this._hasChanges(null))
+return;if(!this._validateEdit(null))
+return;this._editHandler(null,this._data(null));var columns=this.columns();for(var i=0;i<columns.length;++i){var columnId=columns[i];var inputElement=this._addInputElements[columnId];inputElement.value="";}},__proto__:WebInspector.SettingsList.prototype}
+WebInspector.settingsController;WebInspector.EditFileSystemDialog=function(fileSystemPath)
+{WebInspector.DialogDelegate.call(this);this._fileSystemPath=fileSystemPath;this.element=document.createElement("div");this.element.className="edit-file-system-dialog";var header=this.element.createChild("div","header");var headerText=header.createChild("span");headerText.textContent=WebInspector.UIString("Edit file system");var closeButton=header.createChild("div","close-button-gray done-button");closeButton.addEventListener("click",this._onDoneClick.bind(this),false);var contents=this.element.createChild("div","contents");WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspector.FileSystemMapping.Events.FileMappingAdded,this._fileMappingAdded,this);WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspector.FileSystemMapping.Events.FileMappingRemoved,this._fileMappingRemoved,this);WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspector.FileSystemMapping.Events.ExcludedFolderAdded,this._excludedFolderAdded,this);WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspector.FileSystemMapping.Events.ExcludedFolderRemoved,this._excludedFolderRemoved,this);var blockHeader=contents.createChild("div","block-header");blockHeader.textContent=WebInspector.UIString("Mappings");this._fileMappingsSection=contents.createChild("div","section file-mappings-section");this._fileMappingsListContainer=this._fileMappingsSection.createChild("div","settings-list-container");var entries=WebInspector.isolatedFileSystemManager.mapping().mappingEntries(this._fileSystemPath);this._fileMappingsList=new WebInspector.EditableSettingsList(["url","path"],this._fileMappingValuesProvider.bind(this),this._fileMappingValidate.bind(this),this._fileMappingEdit.bind(this));this._fileMappingsList.addEventListener(WebInspector.SettingsList.Events.Removed,this._fileMappingRemovedfromList.bind(this));this._fileMappingsList.element.classList.add("file-mappings-list");this._fileMappingsListContainer.appendChild(this._fileMappingsList.element);this._entries={};for(var i=0;i<entries.length;++i)
+this._addMappingRow(entries[i]);blockHeader=contents.createChild("div","block-header");blockHeader.textContent=WebInspector.UIString("Excluded folders");this._excludedFolderListSection=contents.createChild("div","section excluded-folders-section");this._excludedFolderListContainer=this._excludedFolderListSection.createChild("div","settings-list-container");var excludedFolderEntries=WebInspector.isolatedFileSystemManager.mapping().excludedFolders(fileSystemPath);this._excludedFolderList=new WebInspector.EditableSettingsList(["path"],this._excludedFolderValueProvider.bind(this),this._excludedFolderValidate.bind(this),this._excludedFolderEdit.bind(this));this._excludedFolderList.addEventListener(WebInspector.SettingsList.Events.Removed,this._excludedFolderRemovedfromList.bind(this));this._excludedFolderList.element.classList.add("excluded-folders-list");this._excludedFolderListContainer.appendChild(this._excludedFolderList.element);this._excludedFolderEntries=new StringMap();for(var i=0;i<excludedFolderEntries.length;++i)
+this._addExcludedFolderRow(excludedFolderEntries[i]);this.element.tabIndex=0;}
+WebInspector.EditFileSystemDialog.show=function(element,fileSystemPath)
+{WebInspector.Dialog.show(element,new WebInspector.EditFileSystemDialog(fileSystemPath));var glassPane=document.getElementById("glass-pane");glassPane.classList.add("settings-glass-pane");}
+WebInspector.EditFileSystemDialog.prototype={show:function(element)
+{element.appendChild(this.element);this.element.classList.add("dialog-contents");element.classList.add("settings-dialog");element.classList.add("settings-tab");this._dialogElement=element;},_resize:function()
+{if(!this._dialogElement||!this._relativeToElement)
+return;const minWidth=200;const minHeight=150;var maxHeight=this._relativeToElement.offsetHeight-10;maxHeight=Math.max(minHeight,maxHeight);var maxWidth=Math.min(540,this._relativeToElement.offsetWidth-10);maxWidth=Math.max(minWidth,maxWidth);this._dialogElement.style.maxHeight=maxHeight+"px";this._dialogElement.style.width=maxWidth+"px";WebInspector.DialogDelegate.prototype.position(this._dialogElement,this._relativeToElement);},position:function(element,relativeToElement)
+{this._relativeToElement=relativeToElement;this._resize();},willHide:function(event)
+{},_fileMappingAdded:function(event)
+{var entry=(event.data);this._addMappingRow(entry);},_fileMappingRemoved:function(event)
+{var entry=(event.data);if(this._fileSystemPath!==entry.fileSystemPath)
+return;delete this._entries[entry.urlPrefix];if(this._fileMappingsList.itemForId(entry.urlPrefix))
+this._fileMappingsList.removeItem(entry.urlPrefix);this._resize();},_fileMappingValuesProvider:function(itemId,columnId)
+{if(!itemId)
+return"";var entry=this._entries[itemId];switch(columnId){case"url":return entry.urlPrefix;case"path":return entry.pathPrefix;default:console.assert("Should not be reached.");}
+return"";},_fileMappingValidate:function(itemId,data)
+{var oldPathPrefix=itemId?this._entries[itemId].pathPrefix:null;return this._validateMapping(data["url"],itemId,data["path"],oldPathPrefix);},_fileMappingEdit:function(itemId,data)
+{if(itemId){var urlPrefix=itemId;var pathPrefix=this._entries[itemId].pathPrefix;var fileSystemPath=this._entries[itemId].fileSystemPath;WebInspector.isolatedFileSystemManager.mapping().removeFileMapping(fileSystemPath,urlPrefix,pathPrefix);}
+this._addFileMapping(data["url"],data["path"]);},_validateMapping:function(urlPrefix,allowedURLPrefix,path,allowedPathPrefix)
+{var columns=[];if(!this._checkURLPrefix(urlPrefix,allowedURLPrefix))
+columns.push("url");if(!this._checkPathPrefix(path,allowedPathPrefix))
+columns.push("path");return columns;},_fileMappingRemovedfromList:function(event)
+{var urlPrefix=(event.data);if(!urlPrefix)
+return;var entry=this._entries[urlPrefix];WebInspector.isolatedFileSystemManager.mapping().removeFileMapping(entry.fileSystemPath,entry.urlPrefix,entry.pathPrefix);},_addFileMapping:function(urlPrefix,pathPrefix)
+{var normalizedURLPrefix=this._normalizePrefix(urlPrefix);var normalizedPathPrefix=this._normalizePrefix(pathPrefix);WebInspector.isolatedFileSystemManager.mapping().addFileMapping(this._fileSystemPath,normalizedURLPrefix,normalizedPathPrefix);this._fileMappingsList.selectItem(normalizedURLPrefix);return true;},_normalizePrefix:function(prefix)
+{if(!prefix)
+return"";return prefix+(prefix[prefix.length-1]==="/"?"":"/");},_addMappingRow:function(entry)
+{var fileSystemPath=entry.fileSystemPath;var urlPrefix=entry.urlPrefix;if(!this._fileSystemPath||this._fileSystemPath!==fileSystemPath)
+return;this._entries[urlPrefix]=entry;var fileMappingListItem=this._fileMappingsList.addItem(urlPrefix,null);this._resize();},_excludedFolderAdded:function(event)
+{var entry=(event.data);this._addExcludedFolderRow(entry);},_excludedFolderRemoved:function(event)
+{var entry=(event.data);var fileSystemPath=entry.fileSystemPath;if(!fileSystemPath||this._fileSystemPath!==fileSystemPath)
+return;delete this._excludedFolderEntries[entry.path];if(this._excludedFolderList.itemForId(entry.path))
+this._excludedFolderList.removeItem(entry.path);},_excludedFolderValueProvider:function(itemId,columnId)
+{return itemId;},_excludedFolderValidate:function(itemId,data)
+{var fileSystemPath=this._fileSystemPath;var columns=[];if(!this._validateExcludedFolder(data["path"],itemId))
+columns.push("path");return columns;},_validateExcludedFolder:function(path,allowedPath)
+{return!!path&&(path===allowedPath||!this._excludedFolderEntries.contains(path));},_excludedFolderEdit:function(itemId,data)
+{var fileSystemPath=this._fileSystemPath;if(itemId)
+WebInspector.isolatedFileSystemManager.mapping().removeExcludedFolder(fileSystemPath,itemId);var excludedFolderPath=data["path"];WebInspector.isolatedFileSystemManager.mapping().addExcludedFolder(fileSystemPath,excludedFolderPath);},_excludedFolderRemovedfromList:function(event)
+{var itemId=(event.data);if(!itemId)
+return;WebInspector.isolatedFileSystemManager.mapping().removeExcludedFolder(this._fileSystemPath,itemId);},_addExcludedFolderRow:function(entry)
+{var fileSystemPath=entry.fileSystemPath;if(!fileSystemPath||this._fileSystemPath!==fileSystemPath)
+return;var path=entry.path;this._excludedFolderEntries.put(path,entry);this._excludedFolderList.addItem(path,null);this._resize();},_checkURLPrefix:function(value,allowedPrefix)
+{var prefix=this._normalizePrefix(value);return!!prefix&&(prefix===allowedPrefix||!this._entries[prefix]);},_checkPathPrefix:function(value,allowedPrefix)
+{var prefix=this._normalizePrefix(value);if(!prefix)
+return false;if(prefix===allowedPrefix)
+return true;for(var urlPrefix in this._entries){var entry=this._entries[urlPrefix];if(urlPrefix&&entry.pathPrefix===prefix)
+return false;}
+return true;},focus:function()
+{WebInspector.setCurrentFocusElement(this.element);},_onDoneClick:function()
+{WebInspector.Dialog.hide();},onEnter:function()
+{},__proto__:WebInspector.DialogDelegate.prototype}
+WebInspector.ShortcutsScreen=function()
+{this._sections={};}
+WebInspector.ShortcutsScreen.prototype={section:function(name)
+{var section=this._sections[name];if(!section)
+this._sections[name]=section=new WebInspector.ShortcutsSection(name);return section;},createShortcutsTabView:function()
+{var orderedSections=[];for(var section in this._sections)
+orderedSections.push(this._sections[section]);function compareSections(a,b)
+{return a.order-b.order;}
+orderedSections.sort(compareSections);var view=new WebInspector.View();view.element.className="settings-tab-container";view.element.createChild("header").createChild("h3").appendChild(document.createTextNode(WebInspector.UIString("Shortcuts")));var scrollPane=view.element.createChild("div","help-container-wrapper");var container=scrollPane.createChild("div");container.className="help-content help-container";for(var i=0;i<orderedSections.length;++i)
+orderedSections[i].renderSection(container);var note=scrollPane.createChild("p","help-footnote");var noteLink=note.createChild("a");noteLink.href="https://developers.google.com/chrome-developer-tools/docs/shortcuts";noteLink.target="_blank";noteLink.createTextChild(WebInspector.UIString("Full list of keyboard shortcuts and gestures"));return view;}}
+WebInspector.shortcutsScreen;WebInspector.ShortcutsSection=function(name)
+{this.name=name;this._lines=([]);this.order=++WebInspector.ShortcutsSection._sequenceNumber;};WebInspector.ShortcutsSection._sequenceNumber=0;WebInspector.ShortcutsSection.prototype={addKey:function(key,description)
+{this._addLine(this._renderKey(key),description);},addRelatedKeys:function(keys,description)
+{this._addLine(this._renderSequence(keys,"/"),description);},addAlternateKeys:function(keys,description)
+{this._addLine(this._renderSequence(keys,WebInspector.UIString("or")),description);},_addLine:function(keyElement,description)
+{this._lines.push({key:keyElement,text:description})},renderSection:function(container)
+{var parent=container.createChild("div","help-block");var headLine=parent.createChild("div","help-line");headLine.createChild("div","help-key-cell");headLine.createChild("div","help-section-title help-cell").textContent=this.name;for(var i=0;i<this._lines.length;++i){var line=parent.createChild("div","help-line");var keyCell=line.createChild("div","help-key-cell");keyCell.appendChild(this._lines[i].key);keyCell.appendChild(this._createSpan("help-key-delimiter",":"));line.createChild("div","help-cell").textContent=this._lines[i].text;}},_renderSequence:function(sequence,delimiter)
+{var delimiterSpan=this._createSpan("help-key-delimiter",delimiter);return this._joinNodes(sequence.map(this._renderKey.bind(this)),delimiterSpan);},_renderKey:function(key)
+{var keyName=key.name;var plus=this._createSpan("help-combine-keys","+");return this._joinNodes(keyName.split(" + ").map(this._createSpan.bind(this,"help-key")),plus);},_createSpan:function(className,textContent)
+{var node=document.createElement("span");node.className=className;node.textContent=textContent;return node;},_joinNodes:function(nodes,delimiter)
+{var result=document.createDocumentFragment();for(var i=0;i<nodes.length;++i){if(i>0)
+result.appendChild(delimiter.cloneNode(true));result.appendChild(nodes[i]);}
+return result;}}
+WebInspector.ShortcutsScreen.registerShortcuts=function()
+{var elementsSection=WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));var navigate=WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NavigateUp.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NavigateDown);elementsSection.addRelatedKeys(navigate,WebInspector.UIString("Navigate elements"));var expandCollapse=WebInspector.ShortcutsScreen.ElementsPanelShortcuts.Expand.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.Collapse);elementsSection.addRelatedKeys(expandCollapse,WebInspector.UIString("Expand/collapse"));elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.EditAttribute,WebInspector.UIString("Edit attribute"));elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.HideElement,WebInspector.UIString("Hide element"));elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.ToggleEditAsHTML,WebInspector.UIString("Toggle edit as HTML"));var stylesPaneSection=WebInspector.shortcutsScreen.section(WebInspector.UIString("Styles Pane"));var nextPreviousProperty=WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NextProperty.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.PreviousProperty);stylesPaneSection.addRelatedKeys(nextPreviousProperty,WebInspector.UIString("Next/previous property"));stylesPaneSection.addRelatedKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementValue,WebInspector.UIString("Increment value"));stylesPaneSection.addRelatedKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementValue,WebInspector.UIString("Decrement value"));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy10,WebInspector.UIString("Increment by %f",10));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy10,WebInspector.UIString("Decrement by %f",10));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy100,WebInspector.UIString("Increment by %f",100));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy100,WebInspector.UIString("Decrement by %f",100));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy01,WebInspector.UIString("Increment by %f",0.1));stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy01,WebInspector.UIString("Decrement by %f",0.1));var section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Sources Panel"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.PauseContinue,WebInspector.UIString("Pause/Continue"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepOver,WebInspector.UIString("Step over"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepInto,WebInspector.UIString("Step into"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepOut,WebInspector.UIString("Step out"));var nextAndPrevFrameKeys=WebInspector.ShortcutsScreen.SourcesPanelShortcuts.NextCallFrame.concat(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.PrevCallFrame);section.addRelatedKeys(nextAndPrevFrameKeys,WebInspector.UIString("Next/previous call frame"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.EvaluateSelectionInConsole,WebInspector.UIString("Evaluate selection in console"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.AddSelectionToWatch,WebInspector.UIString("Add selection to watch"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToMember,WebInspector.UIString("Go to member"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToLine,WebInspector.UIString("Go to line"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleBreakpoint,WebInspector.UIString("Toggle breakpoint"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleComment,WebInspector.UIString("Toggle comment"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.CloseEditorTab,WebInspector.UIString("Close editor tab"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByOne,WebInspector.UIString("Increment CSS unit by 1"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByOne,WebInspector.UIString("Decrement CSS unit by 1"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByTen,WebInspector.UIString("Increment CSS unit by 10"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByTen,WebInspector.UIString("Decrement CSS unit by 10"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToPreviousLocation,WebInspector.UIString("Jump to previous editing location"));section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToNextLocation,WebInspector.UIString("Jump to next editing location"));section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Timeline Panel"));section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.StartStopRecording,WebInspector.UIString("Start/stop recording"));section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.SaveToFile,WebInspector.UIString("Save timeline data"));section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.LoadFromFile,WebInspector.UIString("Load timeline data"));section=WebInspector.shortcutsScreen.section(WebInspector.UIString("Profiles Panel"));section.addAlternateKeys(WebInspector.ShortcutsScreen.ProfilesPanelShortcuts.StartStopRecording,WebInspector.UIString("Start/stop recording"));}
+WebInspector.ShortcutsScreen.ElementsPanelShortcuts={NavigateUp:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up)],NavigateDown:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down)],Expand:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Right)],Collapse:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Left)],EditAttribute:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Enter)],HideElement:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.H)],ToggleEditAsHTML:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F2)],NextProperty:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Tab)],PreviousProperty:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Tab,WebInspector.KeyboardShortcut.Modifiers.Shift)],IncrementValue:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up)],DecrementValue:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down)],IncrementBy10:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up,WebInspector.KeyboardShortcut.Modifiers.Shift)],DecrementBy10:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down,WebInspector.KeyboardShortcut.Modifiers.Shift)],IncrementBy100:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp,WebInspector.KeyboardShortcut.Modifiers.Shift)],DecrementBy100:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown,WebInspector.KeyboardShortcut.Modifiers.Shift)],IncrementBy01:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp,WebInspector.KeyboardShortcut.Modifiers.Alt)],DecrementBy01:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown,WebInspector.KeyboardShortcut.Modifiers.Alt)]};WebInspector.ShortcutsScreen.SourcesPanelShortcuts={IncreaseCSSUnitByOne:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up,WebInspector.KeyboardShortcut.Modifiers.Alt)],DecreaseCSSUnitByOne:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down,WebInspector.KeyboardShortcut.Modifiers.Alt)],IncreaseCSSUnitByTen:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp,WebInspector.KeyboardShortcut.Modifiers.Alt)],DecreaseCSSUnitByTen:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown,WebInspector.KeyboardShortcut.Modifiers.Alt)],RunSnippet:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Enter,WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],PauseContinue:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F8),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Backslash,WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],StepOver:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F10),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.SingleQuote,WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],StepInto:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F11),WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Semicolon,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)],EvaluateSelectionInConsole:[WebInspector.KeyboardShortcut.makeDescriptor("e",WebInspector.KeyboardShortcut.Modifiers.Shift|WebInspector.KeyboardShortcut.Modifiers.Ctrl)],AddSelectionToWatch:[WebInspector.KeyboardShortcut.makeDescriptor("a",WebInspector.KeyboardShortcut.Modifiers.Shift|WebInspector.KeyboardShortcut.Modifiers.Ctrl)],GoToMember:[WebInspector.KeyboardShortcut.makeDescriptor("o",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta|WebInspector.KeyboardShortcut.Modifiers.Shift)],GoToLine:[WebInspector.KeyboardShortcut.makeDescriptor("g",WebInspector.KeyboardShortcut.Modifiers.Ctrl)],ToggleBreakpoint:[WebInspector.KeyboardShortcut.makeDescriptor("b",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],NextCallFrame:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Period,WebInspector.KeyboardShortcut.Modifiers.Ctrl)],PrevCallFrame:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Comma,WebInspector.KeyboardShortcut.Modifiers.Ctrl)],ToggleComment:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Slash,WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],JumpToPreviousLocation:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Minus,WebInspector.KeyboardShortcut.Modifiers.Alt)],JumpToNextLocation:[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Plus,WebInspector.KeyboardShortcut.Modifiers.Alt)],CloseEditorTab:[WebInspector.KeyboardShortcut.makeDescriptor("w",WebInspector.KeyboardShortcut.Modifiers.Alt)],Save:[WebInspector.KeyboardShortcut.makeDescriptor("s",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],};WebInspector.ShortcutsScreen.TimelinePanelShortcuts={StartStopRecording:[WebInspector.KeyboardShortcut.makeDescriptor("e",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],SaveToFile:[WebInspector.KeyboardShortcut.makeDescriptor("s",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],LoadFromFile:[WebInspector.KeyboardShortcut.makeDescriptor("o",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)]};WebInspector.ShortcutsScreen.ProfilesPanelShortcuts={StartStopRecording:[WebInspector.KeyboardShortcut.makeDescriptor("e",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)]}
+WebInspector.HAREntry=function(request)
+{this._request=request;}
+WebInspector.HAREntry.prototype={build:function()
+{var entry={startedDateTime:new Date(this._request.startTime*1000),time:this._request.timing?WebInspector.HAREntry._toMilliseconds(this._request.duration):0,request:this._buildRequest(),response:this._buildResponse(),cache:{},timings:this._buildTimings()};if(this._request.connectionId)
+entry.connection=String(this._request.connectionId);var page=WebInspector.networkLog.pageLoadForRequest(this._request);if(page)
+entry.pageref="page_"+page.id;return entry;},_buildRequest:function()
+{var headersText=this._request.requestHeadersText();var res={method:this._request.requestMethod,url:this._buildRequestURL(this._request.url),httpVersion:this._request.requestHttpVersion(),headers:this._request.requestHeaders(),queryString:this._buildParameters(this._request.queryParameters||[]),cookies:this._buildCookies(this._request.requestCookies||[]),headersSize:headersText?headersText.length:-1,bodySize:this.requestBodySize};if(this._request.requestFormData)
+res.postData=this._buildPostData();return res;},_buildResponse:function()
+{var headersText=this._request.responseHeadersText;return{status:this._request.statusCode,statusText:this._request.statusText,httpVersion:this._request.responseHttpVersion,headers:this._request.responseHeaders,cookies:this._buildCookies(this._request.responseCookies||[]),content:this._buildContent(),redirectURL:this._request.responseHeaderValue("Location")||"",headersSize:headersText?headersText.length:-1,bodySize:this.responseBodySize,_error:this._request.localizedFailDescription};},_buildContent:function()
+{var content={size:this._request.resourceSize,mimeType:this._request.mimeType||"x-unknown",};var compression=this.responseCompression;if(typeof compression==="number")
+content.compression=compression;return content;},_buildTimings:function()
+{var timing=this._request.timing;if(!timing)
+return{blocked:-1,dns:-1,connect:-1,send:0,wait:0,receive:0,ssl:-1};function firstNonNegative(values)
+{for(var i=0;i<values.length;++i){if(values[i]>=0)
+return values[i];}
+console.assert(false,"Incomplete requet timing information.");}
+var blocked=firstNonNegative([timing.dnsStart,timing.connectStart,timing.sendStart]);var dns=-1;if(timing.dnsStart>=0)
+dns=firstNonNegative([timing.connectStart,timing.sendStart])-timing.dnsStart;var connect=-1;if(timing.connectStart>=0)
+connect=timing.sendStart-timing.connectStart;var send=timing.sendEnd-timing.sendStart;var wait=timing.receiveHeadersEnd-timing.sendEnd;var receive=WebInspector.HAREntry._toMilliseconds(this._request.duration)-timing.receiveHeadersEnd;var ssl=-1;if(timing.sslStart>=0&&timing.sslEnd>=0)
+ssl=timing.sslEnd-timing.sslStart;return{blocked:blocked,dns:dns,connect:connect,send:send,wait:wait,receive:receive,ssl:ssl};},_buildPostData:function()
+{var res={mimeType:this._request.requestContentType(),text:this._request.requestFormData};if(this._request.formParameters)
+res.params=this._buildParameters(this._request.formParameters);return res;},_buildParameters:function(parameters)
+{return parameters.slice();},_buildRequestURL:function(url)
+{return url.split("#",2)[0];},_buildCookies:function(cookies)
+{return cookies.map(this._buildCookie.bind(this));},_buildCookie:function(cookie)
+{return{name:cookie.name(),value:cookie.value(),path:cookie.path(),domain:cookie.domain(),expires:cookie.expiresDate(new Date(this._request.startTime*1000)),httpOnly:cookie.httpOnly(),secure:cookie.secure()};},get requestBodySize()
+{return!this._request.requestFormData?0:this._request.requestFormData.length;},get responseBodySize()
+{if(this._request.cached||this._request.statusCode===304)
+return 0;if(!this._request.responseHeadersText)
+return-1;return this._request.transferSize-this._request.responseHeadersText.length;},get responseCompression()
+{if(this._request.cached||this._request.statusCode===304||this._request.statusCode===206)
+return;if(!this._request.responseHeadersText)
+return;return this._request.resourceSize-this.responseBodySize;}}
+WebInspector.HAREntry._toMilliseconds=function(time)
+{return time===-1?-1:time*1000;}
+WebInspector.HARLog=function(requests)
+{this._requests=requests;}
+WebInspector.HARLog.prototype={build:function()
+{return{version:"1.2",creator:this._creator(),pages:this._buildPages(),entries:this._requests.map(this._convertResource.bind(this))}},_creator:function()
+{var webKitVersion=/AppleWebKit\/([^ ]+)/.exec(window.navigator.userAgent);return{name:"WebInspector",version:webKitVersion?webKitVersion[1]:"n/a"};},_buildPages:function()
+{var seenIdentifiers={};var pages=[];for(var i=0;i<this._requests.length;++i){var page=WebInspector.networkLog.pageLoadForRequest(this._requests[i]);if(!page||seenIdentifiers[page.id])
+continue;seenIdentifiers[page.id]=true;pages.push(this._convertPage(page));}
+return pages;},_convertPage:function(page)
+{return{startedDateTime:new Date(page.startTime*1000),id:"page_"+page.id,title:page.url,pageTimings:{onContentLoad:this._pageEventTime(page,page.contentLoadTime),onLoad:this._pageEventTime(page,page.loadTime)}}},_convertResource:function(request)
+{return(new WebInspector.HAREntry(request)).build();},_pageEventTime:function(page,time)
+{var startTime=page.startTime;if(time===-1||startTime===-1)
+return-1;return WebInspector.HAREntry._toMilliseconds(time-startTime);}}
+WebInspector.HARWriter=function()
+{}
+WebInspector.HARWriter.prototype={write:function(stream,requests,progress)
+{this._stream=stream;this._harLog=(new WebInspector.HARLog(requests)).build();this._pendingRequests=1;var entries=this._harLog.entries;for(var i=0;i<entries.length;++i){var content=requests[i].content;if(typeof content==="undefined"&&requests[i].finished){++this._pendingRequests;requests[i].requestContent(this._onContentAvailable.bind(this,entries[i]));}else if(content!==null)
+entries[i].response.content.text=content;}
+var compositeProgress=new WebInspector.CompositeProgress(progress);this._writeProgress=compositeProgress.createSubProgress();if(--this._pendingRequests){this._requestsProgress=compositeProgress.createSubProgress();this._requestsProgress.setTitle(WebInspector.UIString("Collecting content…"));this._requestsProgress.setTotalWork(this._pendingRequests);}else
+this._beginWrite();},_onContentAvailable:function(entry,content)
+{if(content!==null)
+entry.response.content.text=content;if(this._requestsProgress)
+this._requestsProgress.worked();if(!--this._pendingRequests){this._requestsProgress.done();this._beginWrite();}},_beginWrite:function()
+{const jsonIndent=2;this._text=JSON.stringify({log:this._harLog},null,jsonIndent);this._writeProgress.setTitle(WebInspector.UIString("Writing file…"));this._writeProgress.setTotalWork(this._text.length);this._bytesWritten=0;this._writeNextChunk(this._stream);},_writeNextChunk:function(stream,error)
+{if(this._bytesWritten>=this._text.length||error){stream.close();this._writeProgress.done();return;}
+const chunkSize=100000;var text=this._text.substring(this._bytesWritten,this._bytesWritten+chunkSize);this._bytesWritten+=text.length;stream.write(text,this._writeNextChunk.bind(this));this._writeProgress.setWorked(this._bytesWritten);}}
+WebInspector.CookieParser=function()
+{}
+WebInspector.CookieParser.KeyValue=function(key,value,position)
+{this.key=key;this.value=value;this.position=position;}
+WebInspector.CookieParser.prototype={cookies:function()
+{return this._cookies;},parseCookie:function(cookieHeader)
+{if(!this._initialize(cookieHeader))
+return null;for(var kv=this._extractKeyValue();kv;kv=this._extractKeyValue()){if(kv.key.charAt(0)==="$"&&this._lastCookie)
+this._lastCookie.addAttribute(kv.key.slice(1),kv.value);else if(kv.key.toLowerCase()!=="$version"&&typeof kv.value==="string")
+this._addCookie(kv,WebInspector.Cookie.Type.Request);this._advanceAndCheckCookieDelimiter();}
+this._flushCookie();return this._cookies;},parseSetCookie:function(setCookieHeader)
+{if(!this._initialize(setCookieHeader))
+return null;for(var kv=this._extractKeyValue();kv;kv=this._extractKeyValue()){if(this._lastCookie)
+this._lastCookie.addAttribute(kv.key,kv.value);else
+this._addCookie(kv,WebInspector.Cookie.Type.Response);if(this._advanceAndCheckCookieDelimiter())
+this._flushCookie();}
+this._flushCookie();return this._cookies;},_initialize:function(headerValue)
+{this._input=headerValue;if(typeof headerValue!=="string")
+return false;this._cookies=[];this._lastCookie=null;this._originalInputLength=this._input.length;return true;},_flushCookie:function()
+{if(this._lastCookie)
+this._lastCookie.setSize(this._originalInputLength-this._input.length-this._lastCookiePosition);this._lastCookie=null;},_extractKeyValue:function()
+{if(!this._input||!this._input.length)
+return null;var keyValueMatch=/^[ \t]*([^\s=;]+)[ \t]*(?:=[ \t]*([^;\n]*))?/.exec(this._input);if(!keyValueMatch){console.log("Failed parsing cookie header before: "+this._input);return null;}
+var result=new WebInspector.CookieParser.KeyValue(keyValueMatch[1],keyValueMatch[2]&&keyValueMatch[2].trim(),this._originalInputLength-this._input.length);this._input=this._input.slice(keyValueMatch[0].length);return result;},_advanceAndCheckCookieDelimiter:function()
+{var match=/^\s*[\n;]\s*/.exec(this._input);if(!match)
+return false;this._input=this._input.slice(match[0].length);return match[0].match("\n")!==null;},_addCookie:function(keyValue,type)
+{if(this._lastCookie)
+this._lastCookie.setSize(keyValue.position-this._lastCookiePosition);this._lastCookie=typeof keyValue.value==="string"?new WebInspector.Cookie(keyValue.key,keyValue.value,type):new WebInspector.Cookie("",keyValue.key,type);this._lastCookiePosition=keyValue.position;this._cookies.push(this._lastCookie);}};WebInspector.CookieParser.parseCookie=function(header)
+{return(new WebInspector.CookieParser()).parseCookie(header);}
+WebInspector.CookieParser.parseSetCookie=function(header)
+{return(new WebInspector.CookieParser()).parseSetCookie(header);}
+WebInspector.Cookie=function(name,value,type)
+{this._name=name;this._value=value;this._type=type;this._attributes={};}
+WebInspector.Cookie.prototype={name:function()
+{return this._name;},value:function()
+{return this._value;},type:function()
+{return this._type;},httpOnly:function()
+{return"httponly"in this._attributes;},secure:function()
+{return"secure"in this._attributes;},session:function()
+{return!("expires"in this._attributes||"max-age"in this._attributes);},path:function()
+{return this._attributes["path"];},port:function()
+{return this._attributes["port"];},domain:function()
+{return this._attributes["domain"];},expires:function()
+{return this._attributes["expires"];},maxAge:function()
+{return this._attributes["max-age"];},size:function()
+{return this._size;},setSize:function(size)
+{this._size=size;},expiresDate:function(requestDate)
+{if(this.maxAge()){var targetDate=requestDate===null?new Date():requestDate;return new Date(targetDate.getTime()+1000*this.maxAge());}
+if(this.expires())
+return new Date(this.expires());return null;},attributes:function()
+{return this._attributes;},addAttribute:function(key,value)
+{this._attributes[key.toLowerCase()]=value;},remove:function(callback)
+{PageAgent.deleteCookie(this.name(),(this.secure()?"https://":"http://")+this.domain()+this.path(),callback);}}
+WebInspector.Cookie.Type={Request:0,Response:1};WebInspector.Cookies={}
+WebInspector.Cookies.getCookiesAsync=function(callback)
+{function mycallback(error,cookies)
+{if(error)
+return;callback(cookies.map(WebInspector.Cookies.buildCookieProtocolObject));}
+PageAgent.getCookies(mycallback);}
+WebInspector.Cookies.buildCookieProtocolObject=function(protocolCookie)
+{var cookie=new WebInspector.Cookie(protocolCookie.name,protocolCookie.value,null);cookie.addAttribute("domain",protocolCookie["domain"]);cookie.addAttribute("path",protocolCookie["path"]);cookie.addAttribute("port",protocolCookie["port"]);if(protocolCookie["expires"])
+cookie.addAttribute("expires",protocolCookie["expires"]);if(protocolCookie["httpOnly"])
+cookie.addAttribute("httpOnly");if(protocolCookie["secure"])
+cookie.addAttribute("secure");cookie.setSize(protocolCookie["size"]);return cookie;}
+WebInspector.Cookies.cookieMatchesResourceURL=function(cookie,resourceURL)
+{var url=resourceURL.asParsedURL();if(!url||!WebInspector.Cookies.cookieDomainMatchesResourceDomain(cookie.domain(),url.host))
+return false;return(url.path.startsWith(cookie.path())&&(!cookie.port()||url.port==cookie.port())&&(!cookie.secure()||url.scheme==="https"));}
+WebInspector.Cookies.cookieDomainMatchesResourceDomain=function(cookieDomain,resourceDomain)
+{if(cookieDomain.charAt(0)!=='.')
+return resourceDomain===cookieDomain;return!!resourceDomain.match(new RegExp("^([^\\.]+\\.)*"+cookieDomain.substring(1).escapeForRegExp()+"$","i"));}
+WebInspector.SearchableView=function(searchable)
+{WebInspector.VBox.call(this);this._searchProvider=searchable;this.element.addEventListener("keydown",this._onKeyDown.bind(this),false);this._footerElementContainer=this.element.createChild("div","search-bar status-bar hidden");this._footerElementContainer.style.order=100;this._footerElement=this._footerElementContainer.createChild("table","toolbar-search");this._footerElement.cellSpacing=0;this._firstRowElement=this._footerElement.createChild("tr");this._secondRowElement=this._footerElement.createChild("tr","hidden");var searchControlElementColumn=this._firstRowElement.createChild("td");this._searchControlElement=searchControlElementColumn.createChild("span","toolbar-search-control");this._searchInputElement=this._searchControlElement.createChild("input","search-replace");this._searchInputElement.id="search-input-field";this._searchInputElement.placeholder=WebInspector.UIString("Find");this._matchesElement=this._searchControlElement.createChild("label","search-results-matches");this._matchesElement.setAttribute("for","search-input-field");this._searchNavigationElement=this._searchControlElement.createChild("div","toolbar-search-navigation-controls");this._searchNavigationPrevElement=this._searchNavigationElement.createChild("div","toolbar-search-navigation toolbar-search-navigation-prev");this._searchNavigationPrevElement.addEventListener("click",this._onPrevButtonSearch.bind(this),false);this._searchNavigationPrevElement.title=WebInspector.UIString("Search Previous");this._searchNavigationNextElement=this._searchNavigationElement.createChild("div","toolbar-search-navigation toolbar-search-navigation-next");this._searchNavigationNextElement.addEventListener("click",this._onNextButtonSearch.bind(this),false);this._searchNavigationNextElement.title=WebInspector.UIString("Search Next");this._searchInputElement.addEventListener("mousedown",this._onSearchFieldManualFocus.bind(this),false);this._searchInputElement.addEventListener("keydown",this._onSearchKeyDown.bind(this),true);this._searchInputElement.addEventListener("input",this._onInput.bind(this),false);this._replaceInputElement=this._secondRowElement.createChild("td").createChild("input","search-replace toolbar-replace-control");this._replaceInputElement.addEventListener("keydown",this._onReplaceKeyDown.bind(this),true);this._replaceInputElement.placeholder=WebInspector.UIString("Replace");this._findButtonElement=this._firstRowElement.createChild("td").createChild("button","hidden");this._findButtonElement.textContent=WebInspector.UIString("Find");this._findButtonElement.tabIndex=-1;this._findButtonElement.addEventListener("click",this._onNextButtonSearch.bind(this),false);this._replaceButtonElement=this._secondRowElement.createChild("td").createChild("button");this._replaceButtonElement.textContent=WebInspector.UIString("Replace");this._replaceButtonElement.disabled=true;this._replaceButtonElement.tabIndex=-1;this._replaceButtonElement.addEventListener("click",this._replace.bind(this),false);this._prevButtonElement=this._firstRowElement.createChild("td").createChild("button","hidden");this._prevButtonElement.textContent=WebInspector.UIString("Previous");this._prevButtonElement.disabled=true;this._prevButtonElement.tabIndex=-1;this._prevButtonElement.addEventListener("click",this._onPrevButtonSearch.bind(this),false);this._replaceAllButtonElement=this._secondRowElement.createChild("td").createChild("button");this._replaceAllButtonElement.textContent=WebInspector.UIString("Replace All");this._replaceAllButtonElement.addEventListener("click",this._replaceAll.bind(this),false);this._replaceElement=this._firstRowElement.createChild("td").createChild("span");this._replaceCheckboxElement=this._replaceElement.createChild("input");this._replaceCheckboxElement.type="checkbox";this._replaceCheckboxElement.id="search-replace-trigger";this._replaceCheckboxElement.addEventListener("change",this._updateSecondRowVisibility.bind(this),false);this._replaceLabelElement=this._replaceElement.createChild("label");this._replaceLabelElement.textContent=WebInspector.UIString("Replace");this._replaceLabelElement.setAttribute("for","search-replace-trigger");var cancelButtonElement=this._firstRowElement.createChild("td").createChild("button");cancelButtonElement.textContent=WebInspector.UIString("Cancel");cancelButtonElement.tabIndex=-1;cancelButtonElement.addEventListener("click",this.closeSearch.bind(this),false);this._minimalSearchQuerySize=3;this._registerShortcuts();}
+WebInspector.SearchableView.findShortcuts=function()
+{if(WebInspector.SearchableView._findShortcuts)
+return WebInspector.SearchableView._findShortcuts;WebInspector.SearchableView._findShortcuts=[WebInspector.KeyboardShortcut.makeDescriptor("f",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)];if(!WebInspector.isMac())
+WebInspector.SearchableView._findShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F3));return WebInspector.SearchableView._findShortcuts;}
+WebInspector.SearchableView.cancelSearchShortcuts=function()
+{if(WebInspector.SearchableView._cancelSearchShortcuts)
+return WebInspector.SearchableView._cancelSearchShortcuts;WebInspector.SearchableView._cancelSearchShortcuts=[WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Esc)];return WebInspector.SearchableView._cancelSearchShortcuts;}
+WebInspector.SearchableView.findNextShortcut=function()
+{if(WebInspector.SearchableView._findNextShortcut)
+return WebInspector.SearchableView._findNextShortcut;WebInspector.SearchableView._findNextShortcut=[];if(WebInspector.isMac())
+WebInspector.SearchableView._findNextShortcut.push(WebInspector.KeyboardShortcut.makeDescriptor("g",WebInspector.KeyboardShortcut.Modifiers.Meta));return WebInspector.SearchableView._findNextShortcut;}
+WebInspector.SearchableView.findPreviousShortcuts=function()
+{if(WebInspector.SearchableView._findPreviousShortcuts)
+return WebInspector.SearchableView._findPreviousShortcuts;WebInspector.SearchableView._findPreviousShortcuts=[];if(WebInspector.isMac())
+WebInspector.SearchableView._findPreviousShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor("g",WebInspector.KeyboardShortcut.Modifiers.Meta|WebInspector.KeyboardShortcut.Modifiers.Shift));return WebInspector.SearchableView._findPreviousShortcuts;}
+WebInspector.SearchableView.prototype={_onKeyDown:function(event)
+{var shortcutKey=WebInspector.KeyboardShortcut.makeKeyFromEvent(event);var handler=this._shortcuts[shortcutKey];if(handler&&handler(event))
+event.consume(true);},_registerShortcuts:function()
+{this._shortcuts={};function register(shortcuts,handler)
+{for(var i=0;i<shortcuts.length;++i)
+this._shortcuts[shortcuts[i].key]=handler;}
+register.call(this,WebInspector.SearchableView.findShortcuts(),this.handleFindShortcut.bind(this));register.call(this,WebInspector.SearchableView.cancelSearchShortcuts(),this.handleCancelSearchShortcut.bind(this));register.call(this,WebInspector.SearchableView.findNextShortcut(),this.handleFindNextShortcut.bind(this));register.call(this,WebInspector.SearchableView.findPreviousShortcuts(),this.handleFindPreviousShortcut.bind(this));},setMinimalSearchQuerySize:function(minimalSearchQuerySize)
+{this._minimalSearchQuerySize=minimalSearchQuerySize;},setReplaceable:function(replaceable)
+{this._replaceable=replaceable;},updateSearchMatchesCount:function(matches)
+{this._searchProvider.currentSearchMatches=matches;this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentQuery?matches:0,-1);},updateCurrentMatchIndex:function(currentMatchIndex)
+{this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentSearchMatches,currentMatchIndex);},isSearchVisible:function()
+{return this._searchIsVisible;},closeSearch:function()
+{this.cancelSearch();if(WebInspector.currentFocusElement().isDescendant(this._footerElementContainer))
+WebInspector.setCurrentFocusElement(WebInspector.previousFocusElement());},_toggleSearchBar:function(toggled)
+{this._footerElementContainer.classList.toggle("hidden",!toggled);this.doResize();},cancelSearch:function()
+{if(!this._searchIsVisible)
+return;this.resetSearch();delete this._searchIsVisible;this._toggleSearchBar(false);},resetSearch:function()
+{this._clearSearch();this._updateReplaceVisibility();this._matchesElement.textContent="";},handleFindNextShortcut:function()
+{if(!this._searchIsVisible)
+return false;this._searchProvider.jumpToNextSearchResult();return true;},handleFindPreviousShortcut:function()
+{if(!this._searchIsVisible)
+return false;this._searchProvider.jumpToPreviousSearchResult();return true;},handleFindShortcut:function()
+{this.showSearchField();return true;},handleCancelSearchShortcut:function()
+{if(!this._searchIsVisible)
+return false;this.closeSearch();return true;},_updateSearchNavigationButtonState:function(enabled)
+{this._replaceButtonElement.disabled=!enabled;this._prevButtonElement.disabled=!enabled;if(enabled){this._searchNavigationPrevElement.classList.add("enabled");this._searchNavigationNextElement.classList.add("enabled");}else{this._searchNavigationPrevElement.classList.remove("enabled");this._searchNavigationNextElement.classList.remove("enabled");}},_updateSearchMatchesCountAndCurrentMatchIndex:function(matches,currentMatchIndex)
+{if(!this._currentQuery)
+this._matchesElement.textContent="";else if(matches===0||currentMatchIndex>=0)
+this._matchesElement.textContent=WebInspector.UIString("%d of %d",currentMatchIndex+1,matches);else if(matches===1)
+this._matchesElement.textContent=WebInspector.UIString("1 match");else
+this._matchesElement.textContent=WebInspector.UIString("%d matches",matches);this._updateSearchNavigationButtonState(matches>0);},showSearchField:function()
+{if(this._searchIsVisible)
+this.cancelSearch();this._toggleSearchBar(true);this._updateReplaceVisibility();if(WebInspector.currentFocusElement()!==this._searchInputElement){var selection=window.getSelection();if(selection.rangeCount){var queryCandidate=selection.toString().replace(/\r?\n.*/,"");if(queryCandidate)
+this._searchInputElement.value=queryCandidate;}}
+this._performSearch(false,false);this._searchInputElement.focus();this._searchInputElement.select();this._searchIsVisible=true;},_updateReplaceVisibility:function()
+{this._replaceElement.classList.toggle("hidden",!this._replaceable);if(!this._replaceable){this._replaceCheckboxElement.checked=false;this._updateSecondRowVisibility();}},_onSearchFieldManualFocus:function(event)
+{WebInspector.setCurrentFocusElement(event.target);},_onSearchKeyDown:function(event)
+{if(isEnterKey(event)){if(!this._currentQuery)
+this._performSearch(true,true);else
+this._jumpToNextSearchResult(event.shiftKey);}},_onReplaceKeyDown:function(event)
+{if(isEnterKey(event))
+this._replace();},_jumpToNextSearchResult:function(isBackwardSearch)
+{if(!this._currentQuery||!this._searchNavigationPrevElement.classList.contains("enabled"))
+return;if(isBackwardSearch)
+this._searchProvider.jumpToPreviousSearchResult();else
+this._searchProvider.jumpToNextSearchResult();},_onNextButtonSearch:function(event)
+{if(!this._searchNavigationNextElement.classList.contains("enabled"))
+return;this._jumpToNextSearchResult();this._searchInputElement.focus();},_onPrevButtonSearch:function(event)
+{if(!this._searchNavigationPrevElement.classList.contains("enabled"))
+return;this._jumpToNextSearchResult(true);this._searchInputElement.focus();},_clearSearch:function()
+{delete this._currentQuery;if(!!this._searchProvider.currentQuery){delete this._searchProvider.currentQuery;this._searchProvider.searchCanceled();}
+this._updateSearchMatchesCountAndCurrentMatchIndex(0,-1);},_performSearch:function(forceSearch,shouldJump)
+{var query=this._searchInputElement.value;if(!query||(!forceSearch&&query.length<this._minimalSearchQuerySize&&!this._currentQuery)){this._clearSearch();return;}
+this._currentQuery=query;this._searchProvider.currentQuery=query;this._searchProvider.performSearch(query,shouldJump);},_updateSecondRowVisibility:function()
+{var secondRowVisible=this._replaceCheckboxElement.checked;this._footerElementContainer.classList.toggle("replaceable",secondRowVisible);this._footerElement.classList.toggle("toolbar-search-replace",secondRowVisible);this._secondRowElement.classList.toggle("hidden",!secondRowVisible);this._prevButtonElement.classList.toggle("hidden",!secondRowVisible);this._findButtonElement.classList.toggle("hidden",!secondRowVisible);this._replaceCheckboxElement.tabIndex=secondRowVisible?-1:0;if(secondRowVisible)
+this._replaceInputElement.focus();else
+this._searchInputElement.focus();this.doResize();},_replace:function()
+{(this._searchProvider).replaceSelectionWith(this._replaceInputElement.value);delete this._currentQuery;this._performSearch(true,true);},_replaceAll:function()
+{(this._searchProvider).replaceAllWith(this._searchInputElement.value,this._replaceInputElement.value);},_onInput:function(event)
+{this._onValueChanged();},_onValueChanged:function()
+{this._performSearch(false,true);},__proto__:WebInspector.VBox.prototype}
+WebInspector.Searchable=function()
+{}
+WebInspector.Searchable.prototype={searchCanceled:function(){},performSearch:function(query,shouldJump){},jumpToNextSearchResult:function(){},jumpToPreviousSearchResult:function(){}}
+WebInspector.Replaceable=function()
+{}
+WebInspector.Replaceable.prototype={replaceSelectionWith:function(text){},replaceAllWith:function(query,replacement){}}
+WebInspector.FilterBar=function()
+{this._filtersShown=false;this._element=document.createElement("div");this._element.className="hbox";this._filterButton=new WebInspector.StatusBarButton(WebInspector.UIString("Filter"),"filters-toggle",3);this._filterButton.element.addEventListener("click",this._handleFilterButtonClick.bind(this),false);this._filters=[];}
+WebInspector.FilterBar.Events={FiltersToggled:"FiltersToggled"}
+WebInspector.FilterBar.FilterBarState={Inactive:"inactive",Active:"active",Shown:"shown"};WebInspector.FilterBar.prototype={setName:function(name)
+{this._stateSetting=WebInspector.settings.createSetting("filterBar-"+name+"-toggled",false);this._setState(this._stateSetting.get());},filterButton:function()
+{return this._filterButton;},filtersElement:function()
+{return this._element;},filtersToggled:function()
+{return this._filtersShown;},addFilter:function(filter)
+{this._filters.push(filter);this._element.appendChild(filter.element());filter.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._filterChanged,this);this._updateFilterButton();},_filterChanged:function(event)
+{this._updateFilterButton();},_filterBarState:function()
+{if(this._filtersShown)
+return WebInspector.FilterBar.FilterBarState.Shown;var isActive=false;for(var i=0;i<this._filters.length;++i){if(this._filters[i].isActive())
+return WebInspector.FilterBar.FilterBarState.Active;}
+return WebInspector.FilterBar.FilterBarState.Inactive;},_updateFilterButton:function()
+{this._filterButton.state=this._filterBarState();},_handleFilterButtonClick:function(event)
+{this._setState(!this._filtersShown);},_setState:function(filtersShown)
+{if(this._filtersShown===filtersShown)
+return;this._filtersShown=filtersShown;if(this._stateSetting)
+this._stateSetting.set(filtersShown);this._updateFilterButton();this.dispatchEventToListeners(WebInspector.FilterBar.Events.FiltersToggled,this._filtersShown);if(this._filtersShown){for(var i=0;i<this._filters.length;++i){if(this._filters[i]instanceof WebInspector.TextFilterUI){var textFilterUI=(this._filters[i]);textFilterUI.focus();}}}},clear:function()
+{this._element.removeChildren();this._filters=[];this._updateFilterButton();},__proto__:WebInspector.Object.prototype}
+WebInspector.FilterUI=function()
+{}
+WebInspector.FilterUI.Events={FilterChanged:"FilterChanged"}
+WebInspector.FilterUI.prototype={isActive:function(){},element:function(){}}
+WebInspector.TextFilterUI=function(supportRegex)
+{this._supportRegex=!!supportRegex;this._regex=null;this._filterElement=document.createElement("div");this._filterElement.className="filter-text-filter";this._filterInputElement=this._filterElement.createChild("input","search-replace toolbar-replace-control");this._filterInputElement.placeholder=WebInspector.UIString("Filter");this._filterInputElement.id="filter-input-field";this._filterInputElement.addEventListener("mousedown",this._onFilterFieldManualFocus.bind(this),false);this._filterInputElement.addEventListener("input",this._onInput.bind(this),false);this._filterInputElement.addEventListener("change",this._onChange.bind(this),false);this._filterInputElement.addEventListener("keydown",this._onInputKeyDown.bind(this),true);this._filterInputElement.addEventListener("blur",this._onBlur.bind(this),true);this._suggestionBuilder=null;this._suggestBox=new WebInspector.SuggestBox(this,this._filterElement);if(this._supportRegex){this._filterElement.classList.add("supports-regex");this._regexCheckBox=this._filterElement.createChild("input");this._regexCheckBox.type="checkbox";this._regexCheckBox.id="text-filter-regex";this._regexCheckBox.addEventListener("change",this._onInput.bind(this),false);this._regexLabel=this._filterElement.createChild("label");this._regexLabel.htmlFor="text-filter-regex";this._regexLabel.textContent=WebInspector.UIString("Regex");}}
+WebInspector.TextFilterUI.prototype={isActive:function()
+{return!!this._filterInputElement.value;},element:function()
+{return this._filterElement;},value:function()
+{return this._filterInputElement.value;},setValue:function(value)
+{this._filterInputElement.value=value;this._valueChanged(false);},regex:function()
+{return this._regex;},_onFilterFieldManualFocus:function(event)
+{WebInspector.setCurrentFocusElement(event.target);},_onBlur:function(event)
+{this._cancelSuggestion();},_cancelSuggestion:function()
+{if(this._suggestionBuilder&&this._suggestBox.visible){this._suggestionBuilder.unapplySuggestion(this._filterInputElement);this._suggestBox.hide();}},_onInput:function(event)
+{this._valueChanged(true);},_onChange:function(event)
+{this._valueChanged(false);},focus:function()
+{this._filterInputElement.focus();},setSuggestionBuilder:function(suggestionBuilder)
+{this._cancelSuggestion();this._suggestionBuilder=suggestionBuilder;},_updateSuggestions:function()
+{if(!this._suggestionBuilder)
+return;var suggestions=this._suggestionBuilder.buildSuggestions(this._filterInputElement);if(suggestions&&suggestions.length){if(this._suppressSuggestion)
+delete this._suppressSuggestion;else
+this._suggestionBuilder.applySuggestion(this._filterInputElement,suggestions[0],true);this._suggestBox.updateSuggestions(null,suggestions,0,true,"");}else{this._suggestBox.hide();}},_valueChanged:function(showSuggestions)
+{if(showSuggestions)
+this._updateSuggestions();else
+this._suggestBox.hide();var filterQuery=this.value();this._regex=null;this._filterInputElement.classList.remove("filter-text-invalid");if(filterQuery){if(this._supportRegex&&this._regexCheckBox.checked){try{this._regex=new RegExp(filterQuery,"i");}catch(e){this._filterInputElement.classList.add("filter-text-invalid");}}else{this._regex=createPlainTextSearchRegex(filterQuery,"i");}}
+this._dispatchFilterChanged();},_dispatchFilterChanged:function()
+{this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},_onInputKeyDown:function(event)
+{var handled=false;if(event.keyIdentifier==="U+0008"){this._suppressSuggestion=true;}else if(this._suggestBox.visible()){if(event.keyIdentifier==="U+001B"){this._cancelSuggestion();handled=true;}else if(event.keyIdentifier==="U+0009"){this._suggestBox.acceptSuggestion();this._valueChanged(true);handled=true;}else{handled=this._suggestBox.keyPressed(event);}}
+if(handled)
+event.consume(true);return handled;},applySuggestion:function(suggestion,isIntermediateSuggestion)
+{if(!this._suggestionBuilder)
+return;this._suggestionBuilder.applySuggestion(this._filterInputElement,suggestion,!!isIntermediateSuggestion);if(isIntermediateSuggestion)
+this._dispatchFilterChanged();},acceptSuggestion:function()
+{this._filterInputElement.scrollLeft=this._filterInputElement.scrollWidth;this._valueChanged(true);},__proto__:WebInspector.Object.prototype}
+WebInspector.TextFilterUI.SuggestionBuilder=function()
+{}
+WebInspector.TextFilterUI.SuggestionBuilder.prototype={buildSuggestions:function(input){},applySuggestion:function(input,suggestion,isIntermediate){},unapplySuggestion:function(input){}}
+WebInspector.NamedBitSetFilterUI=function(items,setting)
+{this._filtersElement=document.createElement("div");this._filtersElement.className="filter-bitset-filter status-bar-item";this._filtersElement.title=WebInspector.UIString("Use %s Click to select multiple types.",WebInspector.KeyboardShortcut.shortcutToString("",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta));this._allowedTypes={};this._typeFilterElements={};this._addBit(WebInspector.NamedBitSetFilterUI.ALL_TYPES,WebInspector.UIString("All"));this._filtersElement.createChild("div","filter-bitset-filter-divider");for(var i=0;i<items.length;++i)
+this._addBit(items[i].name,items[i].label);if(setting){this._setting=setting;setting.addChangeListener(this._settingChanged.bind(this));this._settingChanged();}else{this._toggleTypeFilter(WebInspector.NamedBitSetFilterUI.ALL_TYPES,false);}}
+WebInspector.NamedBitSetFilterUI.Item;WebInspector.NamedBitSetFilterUI.ALL_TYPES="all";WebInspector.NamedBitSetFilterUI.prototype={isActive:function()
+{return!this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES];},element:function()
+{return this._filtersElement;},accept:function(typeName)
+{return!!this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]||!!this._allowedTypes[typeName];},_settingChanged:function()
+{var allowedTypes=this._setting.get();this._allowedTypes={};for(var typeName in this._typeFilterElements){if(allowedTypes[typeName])
+this._allowedTypes[typeName]=true;}
+this._update();},_update:function()
+{if((Object.keys(this._allowedTypes).length===0)||this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]){this._allowedTypes={};this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]=true;}
+for(var typeName in this._typeFilterElements)
+this._typeFilterElements[typeName].classList.toggle("selected",this._allowedTypes[typeName]);this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},_addBit:function(name,label)
+{var typeFilterElement=this._filtersElement.createChild("li",name);typeFilterElement.typeName=name;typeFilterElement.createTextChild(label);typeFilterElement.addEventListener("click",this._onTypeFilterClicked.bind(this),false);this._typeFilterElements[name]=typeFilterElement;},_onTypeFilterClicked:function(e)
+{var toggle;if(WebInspector.isMac())
+toggle=e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey;else
+toggle=e.ctrlKey&&!e.metaKey&&!e.altKey&&!e.shiftKey;this._toggleTypeFilter(e.target.typeName,toggle);},_toggleTypeFilter:function(typeName,allowMultiSelect)
+{if(allowMultiSelect&&typeName!==WebInspector.NamedBitSetFilterUI.ALL_TYPES)
+this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]=false;else
+this._allowedTypes={};this._allowedTypes[typeName]=!this._allowedTypes[typeName];if(this._setting)
+this._setting.set(this._allowedTypes);else
+this._update();},__proto__:WebInspector.Object.prototype}
+WebInspector.ComboBoxFilterUI=function(options)
+{this._filterElement=document.createElement("div");this._filterElement.className="filter-combobox-filter";this._options=options;this._filterComboBox=new WebInspector.StatusBarComboBox(this._filterChanged.bind(this));for(var i=0;i<options.length;++i){var filterOption=options[i];var option=document.createElement("option");option.text=filterOption.label;option.title=filterOption.title;this._filterComboBox.addOption(option);this._filterComboBox.element.title=this._filterComboBox.selectedOption().title;}
+this._filterElement.appendChild(this._filterComboBox.element);}
+WebInspector.ComboBoxFilterUI.prototype={isActive:function()
+{return this._filterComboBox.selectedIndex()!==0;},element:function()
+{return this._filterElement;},value:function(typeName)
+{var option=this._options[this._filterComboBox.selectedIndex()];return option.value;},setSelectedIndex:function(index)
+{this._filterComboBox.setSelectedIndex(index);},selectedIndex:function(index)
+{return this._filterComboBox.selectedIndex();},_filterChanged:function(event)
+{var option=this._options[this._filterComboBox.selectedIndex()];this._filterComboBox.element.title=option.title;this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},__proto__:WebInspector.Object.prototype}
+WebInspector.CheckboxFilterUI=function(className,title,activeWhenChecked,setting)
+{this._filterElement=document.createElement("div");this._filterElement.classList.add("filter-checkbox-filter","filter-checkbox-filter-"+className);this._activeWhenChecked=!!activeWhenChecked;this._createCheckbox(title);if(setting){this._setting=setting;setting.addChangeListener(this._settingChanged.bind(this));this._settingChanged();}else{this._checked=!this._activeWhenChecked;this._update();}}
+WebInspector.CheckboxFilterUI.prototype={isActive:function()
+{return this._activeWhenChecked===this._checked;},element:function()
+{return this._filterElement;},checked:function()
+{return this._checked;},setState:function(state)
+{this._checked=state;this._update();},_update:function()
+{this._checkElement.classList.toggle("checkbox-filter-checkbox-checked",this._checked);this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged,null);},_settingChanged:function()
+{this._checked=this._setting.get();this._update();},_onClick:function(event)
+{this._checked=!this._checked;if(this._setting)
+this._setting.set(this._checked);else
+this._update();},_createCheckbox:function(title)
+{var label=this._filterElement.createChild("label");var checkBorder=label.createChild("div","checkbox-filter-checkbox");this._checkElement=checkBorder.createChild("div","checkbox-filter-checkbox-check");this._filterElement.addEventListener("click",this._onClick.bind(this),false);var typeElement=label.createChild("span","type");typeElement.textContent=title;},__proto__:WebInspector.Object.prototype}
+WebInspector.FilterSuggestionBuilder=function(keys)
+{this._keys=keys;this._valueSets={};this._valueLists={};}
+WebInspector.FilterSuggestionBuilder.prototype={buildSuggestions:function(input)
+{var text=input.value;var end=input.selectionEnd;if(end!=text.length)
+return null;var start=input.selectionStart;text=text.substring(0,start);var prefixIndex=text.lastIndexOf(" ")+1;var prefix=text.substring(prefixIndex);if(!prefix)
+return[];var valueDelimiterIndex=prefix.indexOf(":");var suggestions=[];if(valueDelimiterIndex===-1){for(var j=0;j<this._keys.length;++j){if(this._keys[j].startsWith(prefix))
+suggestions.push(this._keys[j]+":");}}else{var key=prefix.substring(0,valueDelimiterIndex);var value=prefix.substring(valueDelimiterIndex+1);var items=this._values(key);for(var i=0;i<items.length;++i){if(items[i].startsWith(value)&&(items[i]!==value))
+suggestions.push(key+":"+items[i]);}}
+return suggestions;},applySuggestion:function(input,suggestion,isIntermediate)
+{var text=input.value;var start=input.selectionStart;text=text.substring(0,start);var prefixIndex=text.lastIndexOf(" ")+1;text=text.substring(0,prefixIndex)+suggestion;input.value=text;if(!isIntermediate)
+start=text.length;input.setSelectionRange(start,text.length);},unapplySuggestion:function(input)
+{var start=input.selectionStart;var end=input.selectionEnd;var text=input.value;if(start!==end&&end===text.length)
+input.value=text.substring(0,start);},_values:function(key)
+{var result=this._valueLists[key];if(!result)
+return[];result.sort();return result;},addItem:function(key,value)
+{if(!value)
+return;var set=this._valueSets[key];var list=this._valueLists[key];if(!set){set={};this._valueSets[key]=set;list=[];this._valueLists[key]=list;}
+if(set[value])
+return;set[value]=true;list.push(value);},parseQuery:function(query)
+{var filters={};var text=[];var i=0;var j=0;var part;while(true){var colonIndex=query.indexOf(":",i);if(colonIndex==-1){part=query.substring(j);if(part)
+text.push(part);break;}
+var spaceIndex=query.lastIndexOf(" ",colonIndex);var key=query.substring(spaceIndex+1,colonIndex);if(this._keys.indexOf(key)==-1){i=colonIndex+1;continue;}
+part=spaceIndex>j?query.substring(j,spaceIndex):"";if(part)
+text.push(part);var nextSpace=query.indexOf(" ",colonIndex+1);if(nextSpace==-1){filters[key]=query.substring(colonIndex+1);break;}
+filters[key]=query.substring(colonIndex+1,nextSpace);i=nextSpace+1;j=i;}
+return{text:text,filters:filters};}};WebInspector.InspectElementModeController=function()
+{this.toggleSearchButton=new WebInspector.StatusBarButton(WebInspector.UIString("Select an element in the page to inspect it."),"node-search-status-bar-item");this.toggleSearchButton.addEventListener("click",this.toggleSearch,this);this._shortcut=WebInspector.InspectElementModeController.createShortcut();}
+WebInspector.InspectElementModeController.createShortcut=function()
+{return WebInspector.KeyboardShortcut.makeDescriptor("c",WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta|WebInspector.KeyboardShortcut.Modifiers.Shift);}
+WebInspector.InspectElementModeController.prototype={enabled:function()
+{return this.toggleSearchButton.toggled;},disable:function()
+{if(this.enabled())
+this.toggleSearch();},toggleSearch:function()
+{var enabled=!this.enabled();function callback(error)
+{if(!error)
+this.toggleSearchButton.toggled=enabled;}
+WebInspector.domModel.setInspectModeEnabled(enabled,WebInspector.settings.showUAShadowDOM.get(),callback.bind(this));},handleShortcut:function(event)
+{if(WebInspector.KeyboardShortcut.makeKeyFromEvent(event)!==this._shortcut.key)
+return false;this.toggleSearch();event.consume(true);return true;}}
+WebInspector.inspectElementModeController;WebInspector.WorkerManager=function(target,isMainFrontend)
+{this._reset();target.registerWorkerDispatcher(new WebInspector.WorkerDispatcher(this));if(isMainFrontend){WorkerAgent.enable();WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._mainFrameNavigated,this);}}
+WebInspector.WorkerManager.Events={WorkerAdded:"WorkerAdded",WorkerRemoved:"WorkerRemoved",WorkersCleared:"WorkersCleared",WorkerSelectionChanged:"WorkerSelectionChanged",WorkerDisconnected:"WorkerDisconnected",MessageFromWorker:"MessageFromWorker",}
+WebInspector.WorkerManager.MainThreadId=0;WebInspector.WorkerManager.prototype={_reset:function()
+{this._threadUrlByThreadId={};this._threadUrlByThreadId[WebInspector.WorkerManager.MainThreadId]=WebInspector.UIString("Thread: Main");this._threadsList=[WebInspector.WorkerManager.MainThreadId];this._selectedThreadId=WebInspector.WorkerManager.MainThreadId;},_workerCreated:function(workerId,url,inspectorConnected)
+{this._threadsList.push(workerId);this._threadUrlByThreadId[workerId]=url;this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerAdded,{workerId:workerId,url:url,inspectorConnected:inspectorConnected});},_workerTerminated:function(workerId)
+{this._threadsList.remove(workerId);delete this._threadUrlByThreadId[workerId];this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerRemoved,workerId);},_dispatchMessageFromWorker:function(workerId,message)
+{this.dispatchEventToListeners(WebInspector.WorkerManager.Events.MessageFromWorker,{workerId:workerId,message:message})},_disconnectedFromWorker:function()
+{this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkerDisconnected)},_mainFrameNavigated:function(event)
+{this._reset();this.dispatchEventToListeners(WebInspector.WorkerManager.Events.WorkersCleared);},threadsList:function()
+{return this._threadsList;},threadUrl:function(threadId)
+{return this._threadUrlByThreadId[threadId];},setSelectedThreadId:function(threadId)
+{this._selectedThreadId=threadId;},selectedThreadId:function()
+{return this._selectedThreadId;},__proto__:WebInspector.Object.prototype}
+WebInspector.WorkerDispatcher=function(workerManager)
+{this._workerManager=workerManager;}
+WebInspector.WorkerDispatcher.prototype={workerCreated:function(workerId,url,inspectorConnected)
+{this._workerManager._workerCreated(workerId,url,inspectorConnected);},workerTerminated:function(workerId)
+{this._workerManager._workerTerminated(workerId);},dispatchMessageFromWorker:function(workerId,message)
+{this._workerManager._dispatchMessageFromWorker(workerId,message);},disconnectedFromWorker:function()
+{this._workerManager._disconnectedFromWorker();}}
+WebInspector.workerManager;WebInspector.ExternalWorkerConnection=function(workerId,onConnectionReady)
+{InspectorBackendClass.Connection.call(this);this._workerId=workerId;window.addEventListener("message",this._processMessage.bind(this),true);onConnectionReady(this);}
+WebInspector.ExternalWorkerConnection.prototype={_processMessage:function(event)
+{if(!event)
+return;var message=event.data;this.dispatch(message);},sendMessage:function(messageObject)
+{window.opener.postMessage({workerId:this._workerId,command:"sendMessageToBackend",message:messageObject},"*");},__proto__:InspectorBackendClass.Connection.prototype}
+WebInspector.WorkerFrontendManager=function()
+{this._workerIdToWindow={};WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerAdded,this._workerAdded,this);WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerRemoved,this._workerRemoved,this);WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkersCleared,this._workersCleared,this);WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.MessageFromWorker,this._sendMessageToWorkerInspector,this);window.addEventListener("message",this._handleMessage.bind(this),true);}
+WebInspector.WorkerFrontendManager.prototype={_workerAdded:function(event)
+{var data=(event.data);if(data.inspectorConnected)
+this._openInspectorWindow(data.workerId,true);},_workerRemoved:function(event)
+{var data=(event.data);this.closeWorkerInspector(data.workerId);},_workersCleared:function()
+{for(var workerId in this._workerIdToWindow)
+this.closeWorkerInspector(workerId);},_handleMessage:function(event)
+{var data=(event.data);var workerId=data["workerId"];workerId=parseInt(workerId,10);var command=data.command;var message=data.message;if(command=="sendMessageToBackend")
+WorkerAgent.sendMessageToWorker(workerId,message);},_sendMessageToWorkerInspector:function(event)
+{var data=(event.data);var workerInspectorWindow=this._workerIdToWindow[data.workerId];if(workerInspectorWindow)
+workerInspectorWindow.postMessage(data.message,"*");},openWorkerInspector:function(workerId)
+{var existingInspector=this._workerIdToWindow[workerId];if(existingInspector){existingInspector.focus();return;}
+this._openInspectorWindow(workerId,false);WorkerAgent.connectToWorker(workerId);},_openInspectorWindow:function(workerId,workerIsPaused)
+{var search=window.location.search;var hash=window.location.hash;var url=window.location.href;url=url.replace(hash,"");url+=(search?"&dedicatedWorkerId=":"?dedicatedWorkerId=")+workerId;if(workerIsPaused)
+url+="&workerPaused=true";url=url.replace("docked=true&","");url=url.replace("can_dock=true&","");url+=hash;var width=WebInspector.settings.workerInspectorWidth.get();var height=WebInspector.settings.workerInspectorHeight.get();var workerInspectorWindow=window.open(url,undefined,"location=0,width="+width+",height="+height);workerInspectorWindow.addEventListener("resize",this._onWorkerInspectorResize.bind(this,workerInspectorWindow),false);this._workerIdToWindow[workerId]=workerInspectorWindow;workerInspectorWindow.addEventListener("beforeunload",this._workerInspectorClosing.bind(this,workerId),true);window.addEventListener("unload",this._pageInspectorClosing.bind(this),true);},closeWorkerInspector:function(workerId)
+{var workerInspectorWindow=this._workerIdToWindow[workerId];if(workerInspectorWindow)
+workerInspectorWindow.close();},_onWorkerInspectorResize:function(workerInspectorWindow)
+{var doc=workerInspectorWindow.document;WebInspector.settings.workerInspectorWidth.set(doc.width);WebInspector.settings.workerInspectorHeight.set(doc.height);},_workerInspectorClosing:function(workerId,event)
+{if(event.target.location.href==="about:blank")
+return;if(this._ignoreWorkerInspectorClosing)
+return;delete this._workerIdToWindow[workerId];WorkerAgent.disconnectFromWorker(workerId);},_pageInspectorClosing:function()
+{this._ignoreWorkerInspectorClosing=true;for(var workerId in this._workerIdToWindow){this._workerIdToWindow[workerId].close();WorkerAgent.disconnectFromWorker(parseInt(workerId,10));}}}
+WebInspector.workerFrontendManager=null;WebInspector.WorkerTargetManager=function(mainTarget,targetManager)
+{this._mainTarget=mainTarget;this._targetManager=targetManager;mainTarget.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerAdded,this._onWorkerAdded,this);}
+WebInspector.WorkerTargetManager.prototype={_onWorkerAdded:function(event)
+{var data=(event.data);new WebInspector.WorkerConnection(this._mainTarget,data.workerId,onConnectionReady.bind(this));function onConnectionReady(connection)
+{this._targetManager.createTarget(connection,workerTargetInitialization)}
+function workerTargetInitialization(target)
+{target.runtimeModel.addWorkerContextList(data.url);}}}
+WebInspector.WorkerConnection=function(target,workerId,onConnectionReady)
+{InspectorBackendClass.Connection.call(this);this._workerId=workerId;this._workerAgent=target.workerAgent();this._workerAgent.connectToWorker(workerId,onConnectionReady.bind(null,this));target.workerManager.addEventListener(WebInspector.WorkerManager.Events.MessageFromWorker,this._dispatchMessageFromWorker,this);}
+WebInspector.WorkerConnection.prototype={_dispatchMessageFromWorker:function(event)
+{var data=(event.data);if(data.workerId===this._workerId)
+this.dispatch(data.message);},sendMessage:function(messageObject)
+{this._workerAgent.sendMessageToWorker(this._workerId,messageObject);},__proto__:InspectorBackendClass.Connection.prototype}
+WebInspector.UserMetrics=function()
+{for(var actionName in WebInspector.UserMetrics._ActionCodes){var actionCode=WebInspector.UserMetrics._ActionCodes[actionName];this[actionName]=new WebInspector.UserMetrics._Recorder(actionCode);}}
+WebInspector.UserMetrics._ActionCodes={WindowDocked:1,WindowUndocked:2,ScriptsBreakpointSet:3,TimelineStarted:4,ProfilesCPUProfileTaken:5,ProfilesHeapProfileTaken:6,AuditsStarted:7,ConsoleEvaluated:8}
+WebInspector.UserMetrics._PanelCodes={elements:1,resources:2,network:3,scripts:4,timeline:5,profiles:6,audits:7,console:8}
+WebInspector.UserMetrics.UserAction="UserAction";WebInspector.UserMetrics.UserActionNames={ForcedElementState:"forcedElementState",FileSaved:"fileSaved",RevertRevision:"revertRevision",ApplyOriginalContent:"applyOriginalContent",TogglePrettyPrint:"togglePrettyPrint",SetBreakpoint:"setBreakpoint",OpenSourceLink:"openSourceLink",NetworkSort:"networkSort",NetworkRequestSelected:"networkRequestSelected",NetworkRequestTabSelected:"networkRequestTabSelected",HeapSnapshotFilterChanged:"heapSnapshotFilterChanged"};WebInspector.UserMetrics.prototype={panelShown:function(panelName)
+{InspectorFrontendHost.recordPanelShown(WebInspector.UserMetrics._PanelCodes[panelName]||0);}}
+WebInspector.UserMetrics._Recorder=function(actionCode)
+{this._actionCode=actionCode;}
+WebInspector.UserMetrics._Recorder.prototype={record:function()
+{InspectorFrontendHost.recordActionTaken(this._actionCode);}}
+WebInspector.userMetrics=new WebInspector.UserMetrics();WebInspector.RuntimeModel=function(target)
+{target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameAdded,this._frameAdded,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,this._frameNavigated,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached,this._frameDetached,this);target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded,this._didLoadCachedResources,this);this._target=target;this._debuggerModel=target.debuggerModel;this._agent=target.runtimeAgent();this._contextListById={};}
+WebInspector.RuntimeModel.Events={ExecutionContextListAdded:"ExecutionContextListAdded",ExecutionContextListRemoved:"ExecutionContextListRemoved",}
+WebInspector.RuntimeModel.prototype={addWorkerContextList:function(url)
+{console.assert(this._target.isWorkerTarget(),"Worker context list was added in a non-worker target");var fakeContextList=new WebInspector.WorkerExecutionContextList("worker",url);this._addContextList(fakeContextList);var fakeExecutionContext=new WebInspector.ExecutionContext(undefined,url,true);fakeContextList._addExecutionContext(fakeExecutionContext);},setCurrentExecutionContext:function(executionContext)
+{this._currentExecutionContext=executionContext;},currentExecutionContext:function()
+{return this._currentExecutionContext;},contextLists:function()
+{return Object.values(this._contextListById);},contextListByFrame:function(frame)
+{return this._contextListById[frame.id];},_frameAdded:function(event)
+{console.assert(!this._target.isWorkerTarget(),"Frame was added in a worker target.t");var frame=(event.data);var contextList=new WebInspector.FrameExecutionContextList(frame);this._addContextList(contextList);},_addContextList:function(executionContextList)
+{this._contextListById[executionContextList.id()]=executionContextList;this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextListAdded,executionContextList);},_frameNavigated:function(event)
+{console.assert(!this._target.isWorkerTarget(),"Frame was navigated in worker's target");var frame=(event.data);var context=this._contextListById[frame.id];if(context)
+context._frameNavigated(frame);},_frameDetached:function(event)
+{console.assert(!this._target.isWorkerTarget(),"Frame was detached in worker's target");var frame=(event.data);var context=this._contextListById[frame.id];if(!context)
+return;this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextListRemoved,context);delete this._contextListById[frame.id];},_didLoadCachedResources:function()
+{this._target.registerRuntimeDispatcher(new WebInspector.RuntimeDispatcher(this));this._agent.enable();},_executionContextCreated:function(context)
+{var contextList=this._contextListById[context.frameId];console.assert(contextList);contextList._addExecutionContext(new WebInspector.ExecutionContext(context.id,context.name,context.isPageContext));},evaluate:function(expression,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback)
+{if(this._debuggerModel.selectedCallFrame()){this._debuggerModel.evaluateOnSelectedCallFrame(expression,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,returnByValue,generatePreview,callback);return;}
+if(!expression){expression="this";}
+function evalCallback(error,result,wasThrown)
+{if(error){callback(null,false);return;}
+if(returnByValue)
+callback(null,!!wasThrown,wasThrown?null:result);else
+callback(WebInspector.RemoteObject.fromPayload(result,this._target),!!wasThrown);}
+this._agent.evaluate(expression,objectGroup,includeCommandLineAPI,doNotPauseOnExceptionsAndMuteConsole,this._currentExecutionContext?this._currentExecutionContext.id:undefined,returnByValue,generatePreview,evalCallback.bind(this));},completionsForTextPrompt:function(proxyElement,wordRange,force,completionsReadyCallback)
+{var expressionRange=wordRange.startContainer.rangeOfWord(wordRange.startOffset," =:[({;,!+-*/&|^<>",proxyElement,"backward");var expressionString=expressionRange.toString();var prefix=wordRange.toString();this._completionsForExpression(expressionString,prefix,force,completionsReadyCallback);},_completionsForExpression:function(expressionString,prefix,force,completionsReadyCallback)
+{var lastIndex=expressionString.length-1;var dotNotation=(expressionString[lastIndex]===".");var bracketNotation=(expressionString[lastIndex]==="[");if(dotNotation||bracketNotation)
+expressionString=expressionString.substr(0,lastIndex);if(expressionString&&parseInt(expressionString,10)==expressionString){completionsReadyCallback([]);return;}
+if(!prefix&&!expressionString&&!force){completionsReadyCallback([]);return;}
+if(!expressionString&&this._debuggerModel.selectedCallFrame())
+this._debuggerModel.getSelectedCallFrameVariables(receivedPropertyNames.bind(this));else
+this.evaluate(expressionString,"completion",true,true,false,false,evaluated.bind(this));function evaluated(result,wasThrown)
+{if(!result||wasThrown){completionsReadyCallback([]);return;}
+function getCompletions(primitiveType)
+{var object;if(primitiveType==="string")
+object=new String("");else if(primitiveType==="number")
+object=new Number(0);else if(primitiveType==="boolean")
+object=new Boolean(false);else
+object=this;var resultSet={};for(var o=object;o;o=o.__proto__){try{var names=Object.getOwnPropertyNames(o);for(var i=0;i<names.length;++i)
+resultSet[names[i]]=true;}catch(e){}}
+return resultSet;}
+if(result.type==="object"||result.type==="function")
+result.callFunctionJSON(getCompletions,undefined,receivedPropertyNames.bind(this));else if(result.type==="string"||result.type==="number"||result.type==="boolean")
+this.evaluate("("+getCompletions+")(\""+result.type+"\")","completion",false,true,true,false,receivedPropertyNamesFromEval.bind(this));}
+function receivedPropertyNamesFromEval(notRelevant,wasThrown,result)
+{if(result&&!wasThrown)
+receivedPropertyNames.call(this,result.value);else
+completionsReadyCallback([]);}
+function receivedPropertyNames(propertyNames)
+{this._agent.releaseObjectGroup("completion");if(!propertyNames){completionsReadyCallback([]);return;}
+var includeCommandLineAPI=(!dotNotation&&!bracketNotation);if(includeCommandLineAPI){const commandLineAPI=["dir","dirxml","keys","values","profile","profileEnd","monitorEvents","unmonitorEvents","inspect","copy","clear","getEventListeners","debug","undebug","monitor","unmonitor","table","$","$$","$x"];for(var i=0;i<commandLineAPI.length;++i)
+propertyNames[commandLineAPI[i]]=true;}
+this._reportCompletions(completionsReadyCallback,dotNotation,bracketNotation,expressionString,prefix,Object.keys(propertyNames));}},_reportCompletions:function(completionsReadyCallback,dotNotation,bracketNotation,expressionString,prefix,properties){if(bracketNotation){if(prefix.length&&prefix[0]==="'")
+var quoteUsed="'";else
+var quoteUsed="\"";}
+var results=[];if(!expressionString){const keywords=["break","case","catch","continue","default","delete","do","else","finally","for","function","if","in","instanceof","new","return","switch","this","throw","try","typeof","var","void","while","with"];properties=properties.concat(keywords);}
+properties.sort();for(var i=0;i<properties.length;++i){var property=properties[i];if(dotNotation&&!/^[a-zA-Z_$\u008F-\uFFFF][a-zA-Z0-9_$\u008F-\uFFFF]*$/.test(property))
+continue;if(bracketNotation){if(!/^[0-9]+$/.test(property))
+property=quoteUsed+property.escapeCharacters(quoteUsed+"\\")+quoteUsed;property+="]";}
+if(property.length<prefix.length)
+continue;if(prefix.length&&!property.startsWith(prefix))
+continue;results.push(property);}
+completionsReadyCallback(results);},__proto__:WebInspector.Object.prototype}
+WebInspector.runtimeModel;WebInspector.RuntimeDispatcher=function(runtimeModel)
+{this._runtimeModel=runtimeModel;}
+WebInspector.RuntimeDispatcher.prototype={executionContextCreated:function(context)
+{this._runtimeModel._executionContextCreated(context);}}
+WebInspector.ExecutionContext=function(id,name,isPageContext)
+{this.id=id;this.name=(isPageContext&&!name)?"<page context>":name;this.isMainWorldContext=isPageContext;}
+WebInspector.ExecutionContext.comparator=function(a,b)
+{if(a.isMainWorldContext)
+return-1;if(b.isMainWorldContext)
+return+1;return a.name.localeCompare(b.name);}
+WebInspector.ExecutionContextList=function()
+{this._executionContexts=[];}
+WebInspector.ExecutionContextList.EventTypes={Reset:"Reset",ContextAdded:"ContextAdded"}
+WebInspector.ExecutionContextList.prototype={_reset:function()
+{this._executionContexts=[];this.dispatchEventToListeners(WebInspector.ExecutionContextList.EventTypes.Reset,this);},_addExecutionContext:function(context)
+{var insertAt=insertionIndexForObjectInListSortedByFunction(context,this._executionContexts,WebInspector.ExecutionContext.comparator);this._executionContexts.splice(insertAt,0,context);this.dispatchEventToListeners(WebInspector.ExecutionContextList.EventTypes.ContextAdded,this);},executionContexts:function()
+{return this._executionContexts;},mainWorldContext:function()
+{return this._executionContexts[0];},contextBySecurityOrigin:function(securityOrigin)
+{for(var i=0;i<this._executionContexts.length;++i){var context=this._executionContexts[i];if(!context.isMainWorldContext&&context.name===securityOrigin)
+return context;}
+return null;},id:function()
+{throw"Not implemented";},url:function()
+{throw"Not implemented";},displayName:function()
+{throw"Not implemented";},__proto__:WebInspector.Object.prototype}
+WebInspector.FrameExecutionContextList=function(frame)
+{WebInspector.ExecutionContextList.call(this);this._frame=frame;}
+WebInspector.FrameExecutionContextList.prototype={_frameNavigated:function(frame)
+{this._frame=frame;this._reset();},id:function()
+{return this._frame.id;},url:function()
+{return this._frame.url;},displayName:function()
+{return this._frame.displayName();},__proto__:WebInspector.ExecutionContextList.prototype}
+WebInspector.WorkerExecutionContextList=function(id,url)
+{WebInspector.ExecutionContextList.call(this);this._url=url;this._id=id;}
+WebInspector.WorkerExecutionContextList.prototype={id:function()
+{return this._id;},url:function()
+{return this._url;},displayName:function()
+{return this._url;},__proto__:WebInspector.ExecutionContextList.prototype}
+WebInspector.HandlerRegistry=function(setting)
+{WebInspector.Object.call(this);this._handlers={};this._setting=setting;this._activeHandler=this._setting.get();WebInspector.moduleManager.registerModule("handler-registry");}
+WebInspector.HandlerRegistry.prototype={get handlerNames()
+{return Object.getOwnPropertyNames(this._handlers);},get activeHandler()
+{return this._activeHandler;},set activeHandler(value)
+{this._activeHandler=value;this._setting.set(value);},dispatch:function(data)
+{return this.dispatchToHandler(this._activeHandler,data);},dispatchToHandler:function(name,data)
+{var handler=this._handlers[name];var result=handler&&handler(data);return!!result;},registerHandler:function(name,handler)
+{this._handlers[name]=handler;this.dispatchEventToListeners(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated);},unregisterHandler:function(name)
+{delete this._handlers[name];this.dispatchEventToListeners(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated);},_openInNewTab:function(url)
+{InspectorFrontendHost.openInNewTab(url);},_appendContentProviderItems:function(contextMenu,target)
+{if(!(target instanceof WebInspector.UISourceCode||target instanceof WebInspector.Resource||target instanceof WebInspector.NetworkRequest))
+return;var contentProvider=(target);if(!contentProvider.contentURL())
+return;contextMenu.appendItem(WebInspector.openLinkExternallyLabel(),this._openInNewTab.bind(this,contentProvider.contentURL()));for(var i=1;i<this.handlerNames.length;++i){var handler=this.handlerNames[i];contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Open using %s":"Open Using %s",handler),this.dispatchToHandler.bind(this,handler,{url:contentProvider.contentURL()}));}
+contextMenu.appendItem(WebInspector.copyLinkAddressLabel(),InspectorFrontendHost.copyText.bind(InspectorFrontendHost,contentProvider.contentURL()));if(!contentProvider.contentURL())
+return;var contentType=contentProvider.contentType();if(contentType!==WebInspector.resourceTypes.Document&&contentType!==WebInspector.resourceTypes.Stylesheet&&contentType!==WebInspector.resourceTypes.Script)
+return;function doSave(forceSaveAs,content)
+{var url=contentProvider.contentURL();WebInspector.fileManager.save(url,(content),forceSaveAs);WebInspector.fileManager.close(url);}
+function save(forceSaveAs)
+{if(contentProvider instanceof WebInspector.UISourceCode){var uiSourceCode=(contentProvider);uiSourceCode.saveToFileSystem(forceSaveAs);return;}
+contentProvider.requestContent(doSave.bind(null,forceSaveAs));}
+contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString("Save"),save.bind(null,false));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Save as...":"Save As..."),save.bind(null,true));},_appendHrefItems:function(contextMenu,target)
+{if(!(target instanceof Node))
+return;var targetNode=(target);var anchorElement=targetNode.enclosingNodeOrSelfWithClass("webkit-html-resource-link")||targetNode.enclosingNodeOrSelfWithClass("webkit-html-external-link");if(!anchorElement)
+return;var resourceURL=anchorElement.href;if(!resourceURL)
+return;contextMenu.appendItem(WebInspector.openLinkExternallyLabel(),this._openInNewTab.bind(this,resourceURL));function openInResourcesPanel(resourceURL)
+{var resource=WebInspector.resourceForURL(resourceURL);if(resource)
+WebInspector.Revealer.reveal(resource);else
+InspectorFrontendHost.openInNewTab(resourceURL);}
+if(WebInspector.resourceForURL(resourceURL))
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Open link in Resources panel":"Open Link in Resources Panel"),openInResourcesPanel.bind(null,resourceURL));contextMenu.appendItem(WebInspector.copyLinkAddressLabel(),InspectorFrontendHost.copyText.bind(InspectorFrontendHost,resourceURL));},__proto__:WebInspector.Object.prototype}
+WebInspector.HandlerRegistry.EventTypes={HandlersUpdated:"HandlersUpdated"}
+WebInspector.HandlerSelector=function(handlerRegistry)
+{this._handlerRegistry=handlerRegistry;this.element=document.createElement("select");this.element.addEventListener("change",this._onChange.bind(this),false);this._update();this._handlerRegistry.addEventListener(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated,this._update.bind(this));}
+WebInspector.HandlerSelector.prototype={_update:function()
+{this.element.removeChildren();var names=this._handlerRegistry.handlerNames;var activeHandler=this._handlerRegistry.activeHandler;for(var i=0;i<names.length;++i){var option=document.createElement("option");option.textContent=names[i];option.selected=activeHandler===names[i];this.element.appendChild(option);}
+this.element.disabled=names.length<=1;},_onChange:function(event)
+{var value=event.target.value;this._handlerRegistry.activeHandler=value;}}
+WebInspector.HandlerRegistry.ContextMenuProvider=function()
+{}
+WebInspector.HandlerRegistry.ContextMenuProvider.prototype={appendApplicableItems:function(event,contextMenu,target)
+{WebInspector.openAnchorLocationRegistry._appendContentProviderItems(contextMenu,target);WebInspector.openAnchorLocationRegistry._appendHrefItems(contextMenu,target);}}
+WebInspector.HandlerRegistry.LinkHandler=function()
+{}
+WebInspector.HandlerRegistry.LinkHandler.prototype={handleLink:function(url,lineNumber)
+{return WebInspector.openAnchorLocationRegistry.dispatch({url:url,lineNumber:lineNumber});}}
+WebInspector.openAnchorLocationRegistry;WebInspector.SnippetStorage=function(settingPrefix,namePrefix)
+{this._snippets={};this._lastSnippetIdentifierSetting=WebInspector.settings.createSetting(settingPrefix+"Snippets_lastIdentifier",0);this._snippetsSetting=WebInspector.settings.createSetting(settingPrefix+"Snippets",[]);this._namePrefix=namePrefix;this._loadSettings();}
+WebInspector.SnippetStorage.prototype={get namePrefix()
+{return this._namePrefix;},_saveSettings:function()
+{var savedSnippets=[];for(var id in this._snippets)
+savedSnippets.push(this._snippets[id].serializeToObject());this._snippetsSetting.set(savedSnippets);},snippets:function()
+{var result=[];for(var id in this._snippets)
+result.push(this._snippets[id]);return result;},snippetForId:function(id)
+{return this._snippets[id];},snippetForName:function(name)
+{var snippets=Object.values(this._snippets);for(var i=0;i<snippets.length;++i)
+if(snippets[i].name===name)
+return snippets[i];return null;},_loadSettings:function()
+{var savedSnippets=this._snippetsSetting.get();for(var i=0;i<savedSnippets.length;++i)
+this._snippetAdded(WebInspector.Snippet.fromObject(this,savedSnippets[i]));},deleteSnippet:function(snippet)
+{delete this._snippets[snippet.id];this._saveSettings();},createSnippet:function()
+{var nextId=this._lastSnippetIdentifierSetting.get()+1;var snippetId=String(nextId);this._lastSnippetIdentifierSetting.set(nextId);var snippet=new WebInspector.Snippet(this,snippetId);this._snippetAdded(snippet);this._saveSettings();return snippet;},_snippetAdded:function(snippet)
+{this._snippets[snippet.id]=snippet;},reset:function()
+{this._lastSnippetIdentifierSetting.set(0);this._snippetsSetting.set([]);this._snippets={};},__proto__:WebInspector.Object.prototype}
+WebInspector.Snippet=function(storage,id,name,content)
+{this._storage=storage;this._id=id;this._name=name||storage.namePrefix+id;this._content=content||"";}
+WebInspector.Snippet.fromObject=function(storage,serializedSnippet)
+{return new WebInspector.Snippet(storage,serializedSnippet.id,serializedSnippet.name,serializedSnippet.content);}
+WebInspector.Snippet.prototype={get id()
+{return this._id;},get name()
+{return this._name;},set name(name)
+{if(this._name===name)
+return;this._name=name;this._storage._saveSettings();},get content()
+{return this._content;},set content(content)
+{if(this._content===content)
+return;this._content=content;this._storage._saveSettings();},serializeToObject:function()
+{var serializedSnippet={};serializedSnippet.id=this.id;serializedSnippet.name=this.name;serializedSnippet.content=this.content;return serializedSnippet;},__proto__:WebInspector.Object.prototype}
+WebInspector.ScriptSnippetModel=function(workspace)
+{this._workspace=workspace;this._uiSourceCodeForScriptId={};this._scriptForUISourceCode=new Map();this._uiSourceCodeForSnippetId={};this._snippetIdForUISourceCode=new Map();this._snippetStorage=new WebInspector.SnippetStorage("script","Script snippet #");this._lastSnippetEvaluationIndexSetting=WebInspector.settings.createSetting("lastSnippetEvaluationIndex",0);this._snippetScriptMapping=new WebInspector.SnippetScriptMapping(this);this._projectDelegate=new WebInspector.SnippetsProjectDelegate(this);this._project=this._workspace.addProject(this._projectDelegate);this.reset();WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
+WebInspector.ScriptSnippetModel.prototype={get scriptMapping()
+{return this._snippetScriptMapping;},project:function()
+{return this._project;},_loadSnippets:function()
+{var snippets=this._snippetStorage.snippets();for(var i=0;i<snippets.length;++i)
+this._addScriptSnippet(snippets[i]);},createScriptSnippet:function(content)
+{var snippet=this._snippetStorage.createSnippet();snippet.content=content;return this._addScriptSnippet(snippet);},_addScriptSnippet:function(snippet)
+{var path=this._projectDelegate.addSnippet(snippet.name,new WebInspector.SnippetContentProvider(snippet));var uiSourceCode=this._workspace.uiSourceCode(this._projectDelegate.id(),path);if(!uiSourceCode){console.assert(uiSourceCode);return"";}
+var scriptFile=new WebInspector.SnippetScriptFile(this,uiSourceCode);uiSourceCode.setScriptFile(scriptFile);this._snippetIdForUISourceCode.put(uiSourceCode,snippet.id);uiSourceCode.setSourceMapping(this._snippetScriptMapping);this._uiSourceCodeForSnippetId[snippet.id]=uiSourceCode;return path;},deleteScriptSnippet:function(path)
+{var uiSourceCode=this._workspace.uiSourceCode(this._projectDelegate.id(),path);if(!uiSourceCode)
+return;var snippetId=this._snippetIdForUISourceCode.get(uiSourceCode)||"";var snippet=this._snippetStorage.snippetForId(snippetId);this._snippetStorage.deleteSnippet(snippet);this._removeBreakpoints(uiSourceCode);this._releaseSnippetScript(uiSourceCode);delete this._uiSourceCodeForSnippetId[snippet.id];this._snippetIdForUISourceCode.remove(uiSourceCode);this._projectDelegate.removeFile(snippet.name);},renameScriptSnippet:function(name,newName,callback)
+{newName=newName.trim();if(!newName||newName.indexOf("/")!==-1||name===newName||this._snippetStorage.snippetForName(newName)){callback(false);return;}
+var snippet=this._snippetStorage.snippetForName(name);console.assert(snippet,"Snippet '"+name+"' was not found.");var uiSourceCode=this._uiSourceCodeForSnippetId[snippet.id];console.assert(uiSourceCode,"No uiSourceCode was found for snippet '"+name+"'.");var breakpointLocations=this._removeBreakpoints(uiSourceCode);snippet.name=newName;this._restoreBreakpoints(uiSourceCode,breakpointLocations);callback(true,newName);},_setScriptSnippetContent:function(name,newContent)
+{var snippet=this._snippetStorage.snippetForName(name);snippet.content=newContent;},_scriptSnippetEdited:function(uiSourceCode)
+{var script=this._scriptForUISourceCode.get(uiSourceCode);if(!script)
+return;var breakpointLocations=this._removeBreakpoints(uiSourceCode);this._releaseSnippetScript(uiSourceCode);this._restoreBreakpoints(uiSourceCode,breakpointLocations);var scriptUISourceCode=script.rawLocationToUILocation(0,0).uiSourceCode;if(scriptUISourceCode)
+this._restoreBreakpoints(scriptUISourceCode,breakpointLocations);},_nextEvaluationIndex:function(snippetId)
+{var evaluationIndex=this._lastSnippetEvaluationIndexSetting.get()+1;this._lastSnippetEvaluationIndexSetting.set(evaluationIndex);return evaluationIndex;},evaluateScriptSnippet:function(uiSourceCode)
+{var breakpointLocations=this._removeBreakpoints(uiSourceCode);this._releaseSnippetScript(uiSourceCode);this._restoreBreakpoints(uiSourceCode,breakpointLocations);var snippetId=this._snippetIdForUISourceCode.get(uiSourceCode)||"";var evaluationIndex=this._nextEvaluationIndex(snippetId);uiSourceCode._evaluationIndex=evaluationIndex;var evaluationUrl=this._evaluationSourceURL(uiSourceCode);var expression=uiSourceCode.workingCopy();WebInspector.console.show();DebuggerAgent.compileScript(expression,evaluationUrl,compileCallback.bind(this));function compileCallback(error,scriptId,syntaxErrorMessage)
+{if(!uiSourceCode||uiSourceCode._evaluationIndex!==evaluationIndex)
+return;if(error){console.error(error);return;}
+if(!scriptId){var consoleMessage=new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.JS,WebInspector.ConsoleMessage.MessageLevel.Error,syntaxErrorMessage||"");WebInspector.console.addMessage(consoleMessage);return;}
+var breakpointLocations=this._removeBreakpoints(uiSourceCode);this._restoreBreakpoints(uiSourceCode,breakpointLocations);this._runScript(scriptId);}},_runScript:function(scriptId)
+{var currentExecutionContext=WebInspector.runtimeModel.currentExecutionContext();DebuggerAgent.runScript(scriptId,currentExecutionContext?currentExecutionContext.id:undefined,"console",false,runCallback.bind(this));function runCallback(error,result,wasThrown)
+{if(error){console.error(error);return;}
+this._printRunScriptResult(result,wasThrown);}},_printRunScriptResult:function(result,wasThrown)
+{var level=(wasThrown?WebInspector.ConsoleMessage.MessageLevel.Error:WebInspector.ConsoleMessage.MessageLevel.Log);var message=new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.JS,level,"",undefined,undefined,undefined,undefined,undefined,[result]);WebInspector.console.addMessage(message);},_rawLocationToUILocation:function(rawLocation)
+{var uiSourceCode=this._uiSourceCodeForScriptId[rawLocation.scriptId];if(!uiSourceCode)
+return null;return new WebInspector.UILocation(uiSourceCode,rawLocation.lineNumber,rawLocation.columnNumber||0);},_uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{var script=this._scriptForUISourceCode.get(uiSourceCode);if(!script)
+return null;return WebInspector.debuggerModel.createRawLocation(script,lineNumber,columnNumber);},_addScript:function(script)
+{var snippetId=this._snippetIdForSourceURL(script.sourceURL);if(!snippetId)
+return;var uiSourceCode=this._uiSourceCodeForSnippetId[snippetId];if(!uiSourceCode||this._evaluationSourceURL(uiSourceCode)!==script.sourceURL)
+return;console.assert(!this._scriptForUISourceCode.get(uiSourceCode));this._uiSourceCodeForScriptId[script.scriptId]=uiSourceCode;this._scriptForUISourceCode.put(uiSourceCode,script);uiSourceCode.scriptFile().setHasDivergedFromVM(false);script.pushSourceMapping(this._snippetScriptMapping);},_removeBreakpoints:function(uiSourceCode)
+{var breakpointLocations=WebInspector.breakpointManager.breakpointLocationsForUISourceCode(uiSourceCode);for(var i=0;i<breakpointLocations.length;++i)
+breakpointLocations[i].breakpoint.remove();return breakpointLocations;},_restoreBreakpoints:function(uiSourceCode,breakpointLocations)
+{for(var i=0;i<breakpointLocations.length;++i){var uiLocation=breakpointLocations[i].uiLocation;var breakpoint=breakpointLocations[i].breakpoint;WebInspector.breakpointManager.setBreakpoint(uiSourceCode,uiLocation.lineNumber,uiLocation.columnNumber,breakpoint.condition(),breakpoint.enabled());}},_releaseSnippetScript:function(uiSourceCode)
+{var script=this._scriptForUISourceCode.get(uiSourceCode);if(!script)
+return null;uiSourceCode.scriptFile().setIsDivergingFromVM(true);uiSourceCode.scriptFile().setHasDivergedFromVM(true);delete this._uiSourceCodeForScriptId[script.scriptId];this._scriptForUISourceCode.remove(uiSourceCode);delete uiSourceCode._evaluationIndex;uiSourceCode.scriptFile().setIsDivergingFromVM(false);},_debuggerReset:function()
+{for(var snippetId in this._uiSourceCodeForSnippetId){var uiSourceCode=this._uiSourceCodeForSnippetId[snippetId];this._releaseSnippetScript(uiSourceCode);}},_evaluationSourceURL:function(uiSourceCode)
+{var evaluationSuffix="_"+uiSourceCode._evaluationIndex;var snippetId=this._snippetIdForUISourceCode.get(uiSourceCode);return WebInspector.Script.snippetSourceURLPrefix+snippetId+evaluationSuffix;},_snippetIdForSourceURL:function(sourceURL)
+{var snippetPrefix=WebInspector.Script.snippetSourceURLPrefix;if(!sourceURL.startsWith(snippetPrefix))
+return null;var splitURL=sourceURL.substring(snippetPrefix.length).split("_");var snippetId=splitURL[0];return snippetId;},reset:function()
+{this._uiSourceCodeForScriptId={};this._scriptForUISourceCode=new Map();this._uiSourceCodeForSnippetId={};this._snippetIdForUISourceCode=new Map();this._projectDelegate.reset();this._loadSnippets();},__proto__:WebInspector.Object.prototype}
+WebInspector.SnippetScriptFile=function(scriptSnippetModel,uiSourceCode)
+{WebInspector.ScriptFile.call(this);this._scriptSnippetModel=scriptSnippetModel;this._uiSourceCode=uiSourceCode;this._hasDivergedFromVM=true;this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);}
+WebInspector.SnippetScriptFile.prototype={hasDivergedFromVM:function()
+{return this._hasDivergedFromVM;},setHasDivergedFromVM:function(hasDivergedFromVM)
+{this._hasDivergedFromVM=hasDivergedFromVM;},isDivergingFromVM:function()
+{return this._isDivergingFromVM;},checkMapping:function()
+{},isMergingToVM:function()
+{return false;},setIsDivergingFromVM:function(isDivergingFromVM)
+{this._isDivergingFromVM=isDivergingFromVM;},_workingCopyChanged:function()
+{this._scriptSnippetModel._scriptSnippetEdited(this._uiSourceCode);},__proto__:WebInspector.Object.prototype}
+WebInspector.SnippetScriptMapping=function(scriptSnippetModel)
+{this._scriptSnippetModel=scriptSnippetModel;}
+WebInspector.SnippetScriptMapping.prototype={rawLocationToUILocation:function(rawLocation)
+{var debuggerModelLocation=(rawLocation);return this._scriptSnippetModel._rawLocationToUILocation(debuggerModelLocation);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{return this._scriptSnippetModel._uiLocationToRawLocation(uiSourceCode,lineNumber,columnNumber);},snippetIdForSourceURL:function(sourceURL)
+{return this._scriptSnippetModel._snippetIdForSourceURL(sourceURL);},addScript:function(script)
+{this._scriptSnippetModel._addScript(script);},isIdentity:function()
+{return false;},}
+WebInspector.SnippetContentProvider=function(snippet)
+{this._snippet=snippet;}
+WebInspector.SnippetContentProvider.prototype={contentURL:function()
+{return"";},contentType:function()
+{return WebInspector.resourceTypes.Script;},requestContent:function(callback)
+{callback(this._snippet.content);},searchInContent:function(query,caseSensitive,isRegex,callback)
+{function performSearch()
+{callback(WebInspector.ContentProvider.performSearchInContent(this._snippet.content,query,caseSensitive,isRegex));}
+window.setTimeout(performSearch.bind(this),0);}}
+WebInspector.SnippetsProjectDelegate=function(model)
+{WebInspector.ContentProviderBasedProjectDelegate.call(this,WebInspector.projectTypes.Snippets);this._model=model;}
+WebInspector.SnippetsProjectDelegate.prototype={id:function()
+{return WebInspector.projectTypes.Snippets+":";},addSnippet:function(name,contentProvider)
+{return this.addContentProvider("",name,name,contentProvider,true,false);},canSetFileContent:function()
+{return true;},setFileContent:function(path,newContent,callback)
+{this._model._setScriptSnippetContent(path,newContent);callback("");},canRename:function()
+{return true;},performRename:function(path,newName,callback)
+{this._model.renameScriptSnippet(path,newName,callback);},createFile:function(path,name,content,callback)
+{var filePath=this._model.createScriptSnippet(content);callback(filePath);},deleteFile:function(path)
+{this._model.deleteScriptSnippet(path);},__proto__:WebInspector.ContentProviderBasedProjectDelegate.prototype}
+WebInspector.scriptSnippetModel;WebInspector.Progress=function()
+{}
+WebInspector.Progress.Events={Canceled:"Canceled"}
+WebInspector.Progress.prototype={setTotalWork:function(totalWork){},setTitle:function(title){},setWorked:function(worked,title){},worked:function(worked){},done:function(){},isCanceled:function(){return false;},addEventListener:function(eventType,listener,thisObject){}}
+WebInspector.CompositeProgress=function(parent)
+{this._parent=parent;this._children=[];this._childrenDone=0;this._parent.setTotalWork(1);this._parent.setWorked(0);parent.addEventListener(WebInspector.Progress.Events.Canceled,this._parentCanceled.bind(this));}
+WebInspector.CompositeProgress.prototype={_childDone:function()
+{if(++this._childrenDone===this._children.length)
+this._parent.done();},_parentCanceled:function()
+{this.dispatchEventToListeners(WebInspector.Progress.Events.Canceled);for(var i=0;i<this._children.length;++i){this._children[i].dispatchEventToListeners(WebInspector.Progress.Events.Canceled);}},createSubProgress:function(weight)
+{var child=new WebInspector.SubProgress(this,weight);this._children.push(child);return child;},_update:function()
+{var totalWeights=0;var done=0;for(var i=0;i<this._children.length;++i){var child=this._children[i];if(child._totalWork)
+done+=child._weight*child._worked/child._totalWork;totalWeights+=child._weight;}
+this._parent.setWorked(done/totalWeights);},__proto__:WebInspector.Object.prototype}
+WebInspector.SubProgress=function(composite,weight)
+{this._composite=composite;this._weight=weight||1;this._worked=0;}
+WebInspector.SubProgress.prototype={isCanceled:function()
+{return this._composite._parent.isCanceled();},setTitle:function(title)
+{this._composite._parent.setTitle(title);},done:function()
+{this.setWorked(this._totalWork);this._composite._childDone();},setTotalWork:function(totalWork)
+{this._totalWork=totalWork;this._composite._update();},setWorked:function(worked,title)
+{this._worked=worked;if(typeof title!=="undefined")
+this.setTitle(title);this._composite._update();},worked:function(worked)
+{this.setWorked(this._worked+(worked||1));},__proto__:WebInspector.Object.prototype}
+WebInspector.ProgressIndicator=function()
+{this.element=document.createElement("div");this.element.className="progress-bar-container";this._labelElement=this.element.createChild("span");this._progressElement=this.element.createChild("progress");this._stopButton=new WebInspector.StatusBarButton(WebInspector.UIString("Cancel"),"progress-bar-stop-button");this._stopButton.addEventListener("click",this.cancel,this);this.element.appendChild(this._stopButton.element);this._isCanceled=false;this._worked=0;}
+WebInspector.ProgressIndicator.Events={Done:"Done"}
+WebInspector.ProgressIndicator.prototype={show:function(parent)
+{parent.appendChild(this.element);},hide:function()
+{var parent=this.element.parentElement;if(parent)
+parent.removeChild(this.element);},done:function()
+{if(this._isDone)
+return;this._isDone=true;this.hide();this.dispatchEventToListeners(WebInspector.ProgressIndicator.Events.Done);},cancel:function()
+{this._isCanceled=true;this.dispatchEventToListeners(WebInspector.Progress.Events.Canceled);},isCanceled:function()
+{return this._isCanceled;},setTitle:function(title)
+{this._labelElement.textContent=title;},setTotalWork:function(totalWork)
+{this._progressElement.max=totalWork;},setWorked:function(worked,title)
+{this._worked=worked;this._progressElement.value=worked;if(title)
+this.setTitle(title);},worked:function(worked)
+{this.setWorked(this._worked+(worked||1));},__proto__:WebInspector.Object.prototype}
+WebInspector.StylesSourceMapping=function(cssModel,workspace)
+{this._cssModel=cssModel;this._workspace=workspace;this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillReset,this._projectWillReset,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAddedToWorkspace,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameCreatedOrNavigated,this._mainFrameCreatedOrNavigated,this);this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged,this._styleSheetChanged,this);this._initialize();}
+WebInspector.StylesSourceMapping.MinorChangeUpdateTimeoutMs=1000;WebInspector.StylesSourceMapping.prototype={rawLocationToUILocation:function(rawLocation)
+{var location=(rawLocation);var uiSourceCode=this._workspace.uiSourceCodeForURL(location.url);if(!uiSourceCode)
+return null;return new WebInspector.UILocation(uiSourceCode,location.lineNumber,location.columnNumber);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{return new WebInspector.CSSLocation(uiSourceCode.url||"",lineNumber,columnNumber);},isIdentity:function()
+{return true;},addHeader:function(header)
+{var url=header.resourceURL();if(!url)
+return;header.pushSourceMapping(this);var map=this._urlToHeadersByFrameId[url];if(!map){map=(new StringMap());this._urlToHeadersByFrameId[url]=map;}
+var headersById=map.get(header.frameId);if(!headersById){headersById=(new StringMap());map.put(header.frameId,headersById);}
+headersById.put(header.id,header);var uiSourceCode=this._workspace.uiSourceCodeForURL(url);if(uiSourceCode)
+this._bindUISourceCode(uiSourceCode,header);},removeHeader:function(header)
+{var url=header.resourceURL();if(!url)
+return;var map=this._urlToHeadersByFrameId[url];console.assert(map);var headersById=map.get(header.frameId);console.assert(headersById);headersById.remove(header.id);if(!headersById.size()){map.remove(header.frameId);if(!map.size()){delete this._urlToHeadersByFrameId[url];var uiSourceCode=this._workspace.uiSourceCodeForURL(url);if(uiSourceCode)
+this._unbindUISourceCode(uiSourceCode);}}},_unbindUISourceCode:function(uiSourceCode)
+{var styleFile=this._styleFiles.get(uiSourceCode);if(!styleFile)
+return;styleFile.dispose();this._styleFiles.remove(uiSourceCode);},_uiSourceCodeAddedToWorkspace:function(event)
+{var uiSourceCode=(event.data);var url=uiSourceCode.url;if(!url||!this._urlToHeadersByFrameId[url])
+return;this._bindUISourceCode(uiSourceCode,this._urlToHeadersByFrameId[url].values()[0].values()[0]);},_bindUISourceCode:function(uiSourceCode,header)
+{if(this._styleFiles.get(uiSourceCode)||header.isInline)
+return;var url=uiSourceCode.url;this._styleFiles.put(uiSourceCode,new WebInspector.StyleFile(uiSourceCode,this));header.updateLocations();},_projectWillReset:function(event)
+{var project=(event.data);var uiSourceCodes=project.uiSourceCodes();for(var i=0;i<uiSourceCodes.length;++i)
+this._unbindUISourceCode(uiSourceCodes[i]);},_uiSourceCodeRemoved:function(event)
+{var uiSourceCode=(event.data);this._unbindUISourceCode(uiSourceCode);},_initialize:function()
+{this._urlToHeadersByFrameId={};this._styleFiles=new Map();},_mainFrameCreatedOrNavigated:function(event)
+{for(var url in this._urlToHeadersByFrameId){var uiSourceCode=this._workspace.uiSourceCodeForURL(url);if(!uiSourceCode)
+continue;this._unbindUISourceCode(uiSourceCode);}
+this._initialize();},_setStyleContent:function(uiSourceCode,content,majorChange,userCallback)
+{var styleSheetIds=this._cssModel.styleSheetIdsForURL(uiSourceCode.url);if(!styleSheetIds.length){userCallback("No stylesheet found: "+uiSourceCode.url);return;}
+this._isSettingContent=true;function callback(error)
+{userCallback(error);delete this._isSettingContent;}
+this._cssModel.setStyleSheetText(styleSheetIds[0],content,majorChange,callback.bind(this));},_styleSheetChanged:function(event)
+{if(this._isSettingContent)
+return;if(event.data.majorChange){this._updateStyleSheetText(event.data.styleSheetId);return;}
+this._updateStyleSheetTextSoon(event.data.styleSheetId);},_updateStyleSheetTextSoon:function(styleSheetId)
+{if(this._updateStyleSheetTextTimer)
+clearTimeout(this._updateStyleSheetTextTimer);this._updateStyleSheetTextTimer=setTimeout(this._updateStyleSheetText.bind(this,styleSheetId),WebInspector.StylesSourceMapping.MinorChangeUpdateTimeoutMs);},_updateStyleSheetText:function(styleSheetId)
+{if(this._updateStyleSheetTextTimer){clearTimeout(this._updateStyleSheetTextTimer);delete this._updateStyleSheetTextTimer;}
+var header=this._cssModel.styleSheetHeaderForId(styleSheetId);if(!header)
+return;var styleSheetURL=header.resourceURL();if(!styleSheetURL)
+return;var uiSourceCode=this._workspace.uiSourceCodeForURL(styleSheetURL)
+if(!uiSourceCode)
+return;header.requestContent(callback.bind(this,uiSourceCode));function callback(uiSourceCode,content)
+{var styleFile=this._styleFiles.get(uiSourceCode);if(styleFile)
+styleFile.addRevision(content||"");}}}
+WebInspector.StyleFile=function(uiSourceCode,mapping)
+{this._uiSourceCode=uiSourceCode;this._mapping=mapping;this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);}
+WebInspector.StyleFile.updateTimeout=200;WebInspector.StyleFile.prototype={_workingCopyCommitted:function(event)
+{if(this._isAddingRevision)
+return;this._commitIncrementalEdit(true);},_workingCopyChanged:function(event)
+{if(this._isAddingRevision)
+return;if(WebInspector.StyleFile.updateTimeout>=0){this._incrementalUpdateTimer=setTimeout(this._commitIncrementalEdit.bind(this,false),WebInspector.StyleFile.updateTimeout)}else
+this._commitIncrementalEdit(false);},_commitIncrementalEdit:function(majorChange)
+{this._clearIncrementalUpdateTimer();this._mapping._setStyleContent(this._uiSourceCode,this._uiSourceCode.workingCopy(),majorChange,this._styleContentSet.bind(this));},_styleContentSet:function(error)
+{if(error)
+WebInspector.console.showErrorMessage(error);},_clearIncrementalUpdateTimer:function()
+{if(!this._incrementalUpdateTimer)
+return;clearTimeout(this._incrementalUpdateTimer);delete this._incrementalUpdateTimer;},addRevision:function(content)
+{this._isAddingRevision=true;this._uiSourceCode.addRevision(content);delete this._isAddingRevision;},dispose:function()
+{this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);}}
+WebInspector.NetworkUISourceCodeProvider=function(networkWorkspaceProvider,workspace)
+{this._networkWorkspaceProvider=networkWorkspaceProvider;this._workspace=workspace;WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,this._resourceAdded,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._mainFrameNavigated,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource,this._parsedScriptSource,this);WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded,this._styleSheetAdded,this);this._processedURLs={};}
+WebInspector.NetworkUISourceCodeProvider.prototype={_populate:function()
+{function populateFrame(frame)
+{for(var i=0;i<frame.childFrames.length;++i)
+populateFrame.call(this,frame.childFrames[i]);var resources=frame.resources();for(var i=0;i<resources.length;++i)
+this._resourceAdded({data:resources[i]});}
+populateFrame.call(this,WebInspector.resourceTreeModel.mainFrame);},_parsedScriptSource:function(event)
+{var script=(event.data);if(!script.sourceURL||script.isInlineScript()||script.isSnippet())
+return;if(script.isContentScript&&!script.hasSourceURL){var parsedURL=new WebInspector.ParsedURL(script.sourceURL);if(!parsedURL.isValid)
+return;}
+this._addFile(script.sourceURL,script,script.isContentScript);},_styleSheetAdded:function(event)
+{var header=(event.data);if((!header.hasSourceURL||header.isInline)&&header.origin!=="inspector")
+return;this._addFile(header.resourceURL(),header,false);},_resourceAdded:function(event)
+{var resource=(event.data);this._addFile(resource.url,new WebInspector.NetworkUISourceCodeProvider.FallbackResource(resource));},_mainFrameNavigated:function(event)
+{this._reset();},_addFile:function(url,contentProvider,isContentScript)
+{if(this._workspace.hasMappingForURL(url))
+return;var type=contentProvider.contentType();if(type!==WebInspector.resourceTypes.Stylesheet&&type!==WebInspector.resourceTypes.Document&&type!==WebInspector.resourceTypes.Script)
+return;if(this._processedURLs[url])
+return;this._processedURLs[url]=true;var isEditable=type!==WebInspector.resourceTypes.Document;this._networkWorkspaceProvider.addFileForURL(url,contentProvider,isEditable,isContentScript);},_reset:function()
+{this._processedURLs={};this._networkWorkspaceProvider.reset();this._populate();}}
+WebInspector.NetworkUISourceCodeProvider.FallbackResource=function(resource)
+{this._resource=resource;}
+WebInspector.NetworkUISourceCodeProvider.FallbackResource.prototype={contentURL:function()
+{return this._resource.contentURL();},contentType:function()
+{return this._resource.contentType();},requestContent:function(callback)
+{function loadFallbackContent()
+{var scripts=WebInspector.debuggerModel.scriptsForSourceURL(this._resource.url);if(!scripts.length){callback(null);return;}
+var contentProvider;if(this._resource.type===WebInspector.resourceTypes.Document)
+contentProvider=new WebInspector.ConcatenatedScriptsContentProvider(scripts);else if(this._resource.type===WebInspector.resourceTypes.Script)
+contentProvider=scripts[0];console.assert(contentProvider,"Resource content request failed. "+this._resource.url);contentProvider.requestContent(callback);}
+function requestContentLoaded(content)
+{if(content)
+callback(content)
+else
+loadFallbackContent.call(this);}
+this._resource.requestContent(requestContentLoaded.bind(this));},searchInContent:function(query,caseSensitive,isRegex,callback)
+{function documentContentLoaded(content)
+{if(content===null){callback([]);return;}
+var result=WebInspector.ContentProvider.performSearchInContent(content,query,caseSensitive,isRegex);callback(result);}
+if(this.contentType()===WebInspector.resourceTypes.Document){this.requestContent(documentContentLoaded);return;}
+this._resource.searchInContent(query,caseSensitive,isRegex,callback);}}
+WebInspector.networkWorkspaceProvider;WebInspector.CPUProfilerModel=function()
+{this._delegate=null;this._isRecording=false;InspectorBackend.registerProfilerDispatcher(this);ProfilerAgent.enable();}
+WebInspector.CPUProfilerModel.EventTypes={ProfileStarted:"profile-started",ProfileStopped:"profile-stopped"};WebInspector.CPUProfilerModel.prototype={setDelegate:function(delegate)
+{this._delegate=delegate;},consoleProfileFinished:function(id,scriptLocation,cpuProfile,title)
+{WebInspector.moduleManager.loadModule("profiles");this._delegate.consoleProfileFinished(id,scriptLocation,cpuProfile,title);},consoleProfileStarted:function(id,scriptLocation,title)
+{WebInspector.moduleManager.loadModule("profiles");this._delegate.consoleProfileStarted(id,scriptLocation,title);},setRecording:function(isRecording)
+{this._isRecording=isRecording;this.dispatchEventToListeners(isRecording?WebInspector.CPUProfilerModel.EventTypes.ProfileStarted:WebInspector.CPUProfilerModel.EventTypes.ProfileStopped);},isRecordingProfile:function()
+{return this._isRecording;},__proto__:WebInspector.Object.prototype}
+WebInspector.CPUProfilerModel.Delegate=function(){};WebInspector.CPUProfilerModel.Delegate.prototype={consoleProfileStarted:function(protocolId,scriptLocation,title){},consoleProfileFinished:function(protocolId,scriptLocation,cpuProfile,title){}}
+WebInspector.cpuProfilerModel;WebInspector.DockController=function(canDock)
+{this._canDock=canDock;if(!canDock){this._dockSide=WebInspector.DockController.State.Undocked;this._updateUI();return;}
+WebInspector.settings.currentDockState=WebInspector.settings.createSetting("currentDockState","");WebInspector.settings.lastDockState=WebInspector.settings.createSetting("lastDockState","");var states=[WebInspector.DockController.State.DockedToBottom,WebInspector.DockController.State.Undocked,WebInspector.DockController.State.DockedToRight];var titles=[WebInspector.UIString("Dock to main window."),WebInspector.UIString("Undock into separate window."),WebInspector.UIString("Dock to main window.")];if(WebInspector.experimentsSettings.dockToLeft.isEnabled()){states.push(WebInspector.DockController.State.DockedToLeft);titles.push(WebInspector.UIString("Dock to main window."));}
+this._dockToggleButton=new WebInspector.StatusBarStatesSettingButton("dock-status-bar-item",states,titles,WebInspector.settings.currentDockState,WebInspector.settings.lastDockState,this._dockSideChanged.bind(this));}
+WebInspector.DockController.State={DockedToBottom:"bottom",DockedToRight:"right",DockedToLeft:"left",Undocked:"undocked"}
+WebInspector.DockController.Events={DockSideChanged:"DockSideChanged"}
+WebInspector.DockController.prototype={get element()
+{return this._canDock?this._dockToggleButton.element:null;},dockSide:function()
+{return this._dockSide;},canDock:function()
+{return this._canDock;},isVertical:function()
+{return this._dockSide===WebInspector.DockController.State.DockedToRight||this._dockSide===WebInspector.DockController.State.DockedToLeft;},_dockSideChanged:function(dockSide)
+{if(this._dockSide===dockSide)
+return;this._dockSide=dockSide;this._updateUI();this.dispatchEventToListeners(WebInspector.DockController.Events.DockSideChanged,this._dockSide);if(this._canDock)
+InspectorFrontendHost.setIsDocked(dockSide!==WebInspector.DockController.State.Undocked);},_updateUI:function()
+{var body=document.body;switch(this._dockSide){case WebInspector.DockController.State.DockedToBottom:body.classList.remove("undocked");body.classList.remove("dock-to-right");body.classList.remove("dock-to-left");body.classList.add("dock-to-bottom");break;case WebInspector.DockController.State.DockedToRight:body.classList.remove("undocked");body.classList.add("dock-to-right");body.classList.remove("dock-to-left");body.classList.remove("dock-to-bottom");break;case WebInspector.DockController.State.DockedToLeft:body.classList.remove("undocked");body.classList.remove("dock-to-right");body.classList.add("dock-to-left");body.classList.remove("dock-to-bottom");break;case WebInspector.DockController.State.Undocked:body.classList.add("undocked");body.classList.remove("dock-to-right");body.classList.remove("dock-to-left");body.classList.remove("dock-to-bottom");break;}},__proto__:WebInspector.Object.prototype}
+WebInspector.dockController;WebInspector.TracingAgent=function()
+{this._active=false;InspectorBackend.registerTracingDispatcher(new WebInspector.TracingDispatcher(this));}
+WebInspector.TracingAgent.prototype={start:function(categoryPatterns,options,callback)
+{TracingAgent.start(categoryPatterns,options,callback);this._active=true;this._events=[];},stop:function(callback)
+{if(!this._active){callback();return;}
+this._pendingStopCallback=callback;TracingAgent.end();},events:function()
+{return this._events;},_eventsCollected:function(events)
+{Array.prototype.push.apply(this._events,events);},_tracingComplete:function()
+{this._active=false;if(this._pendingStopCallback){this._pendingStopCallback();this._pendingStopCallback=null;}}}
+WebInspector.TracingDispatcher=function(tracingAgent)
+{this._tracingAgent=tracingAgent;}
+WebInspector.TracingDispatcher.prototype={dataCollected:function(data)
+{this._tracingAgent._eventsCollected(data);},tracingComplete:function()
+{this._tracingAgent._tracingComplete();}}
+WebInspector.tracingAgent;WebInspector.ScreencastView=function()
+{WebInspector.VBox.call(this);this.setMinimumSize(150,150);this.registerRequiredCSS("screencastView.css");};WebInspector.ScreencastView._bordersSize=40;WebInspector.ScreencastView._navBarHeight=29;WebInspector.ScreencastView._HttpRegex=/^https?:\/\/(.+)/;WebInspector.ScreencastView.prototype={initialize:function()
+{this.element.classList.add("screencast");this._createNavigationBar();this._viewportElement=this.element.createChild("div","screencast-viewport hidden");this._glassPaneElement=this.element.createChild("div","screencast-glasspane hidden");this._canvasElement=this._viewportElement.createChild("canvas");this._canvasElement.tabIndex=1;this._canvasElement.addEventListener("mousedown",this._handleMouseEvent.bind(this),false);this._canvasElement.addEventListener("mouseup",this._handleMouseEvent.bind(this),false);this._canvasElement.addEventListener("mousemove",this._handleMouseEvent.bind(this),false);this._canvasElement.addEventListener("mousewheel",this._handleMouseEvent.bind(this),false);this._canvasElement.addEventListener("click",this._handleMouseEvent.bind(this),false);this._canvasElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),false);this._canvasElement.addEventListener("keydown",this._handleKeyEvent.bind(this),false);this._canvasElement.addEventListener("keyup",this._handleKeyEvent.bind(this),false);this._canvasElement.addEventListener("keypress",this._handleKeyEvent.bind(this),false);this._titleElement=this._viewportElement.createChild("div","screencast-element-title monospace hidden");this._tagNameElement=this._titleElement.createChild("span","screencast-tag-name");this._nodeIdElement=this._titleElement.createChild("span","screencast-node-id");this._classNameElement=this._titleElement.createChild("span","screencast-class-name");this._titleElement.appendChild(document.createTextNode(" "));this._nodeWidthElement=this._titleElement.createChild("span");this._titleElement.createChild("span","screencast-px").textContent="px";this._titleElement.appendChild(document.createTextNode(" \u00D7 "));this._nodeHeightElement=this._titleElement.createChild("span");this._titleElement.createChild("span","screencast-px").textContent="px";this._imageElement=new Image();this._isCasting=false;this._context=this._canvasElement.getContext("2d");this._checkerboardPattern=this._createCheckerboardPattern(this._context);this._shortcuts=({});this._shortcuts[WebInspector.KeyboardShortcut.makeKey("l",WebInspector.KeyboardShortcut.Modifiers.Ctrl)]=this._focusNavigationBar.bind(this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ScreencastFrame,this._screencastFrame,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ScreencastVisibilityChanged,this._screencastVisibilityChanged,this);WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineStarted,this._onTimeline.bind(this,true),this);WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineStopped,this._onTimeline.bind(this,false),this);this._timelineActive=WebInspector.timelineManager.isStarted();WebInspector.cpuProfilerModel.addEventListener(WebInspector.CPUProfilerModel.EventTypes.ProfileStarted,this._onProfiler.bind(this,true),this);WebInspector.cpuProfilerModel.addEventListener(WebInspector.CPUProfilerModel.EventTypes.ProfileStopped,this._onProfiler.bind(this,false),this);this._profilerActive=WebInspector.cpuProfilerModel.isRecordingProfile();this._updateGlasspane();},wasShown:function()
+{this._startCasting();},willHide:function()
+{this._stopCasting();},_startCasting:function()
+{if(this._timelineActive||this._profilerActive)
+return;if(this._isCasting)
+return;this._isCasting=true;const maxImageDimension=1024;var dimensions=this._viewportDimensions();if(dimensions.width<0||dimensions.height<0){this._isCasting=false;return;}
+dimensions.width*=WebInspector.zoomManager.zoomFactor();dimensions.height*=WebInspector.zoomManager.zoomFactor();PageAgent.startScreencast("jpeg",80,Math.min(maxImageDimension,dimensions.width),Math.min(maxImageDimension,dimensions.height));WebInspector.domModel.setHighlighter(this);},_stopCasting:function()
+{if(!this._isCasting)
+return;this._isCasting=false;PageAgent.stopScreencast();WebInspector.domModel.setHighlighter(null);},_screencastFrame:function(event)
+{var metadata=(event.data.metadata);if(!metadata.deviceScaleFactor){console.log(event.data.data);return;}
+var base64Data=(event.data.data);this._imageElement.src="data:image/jpg;base64,"+base64Data;this._deviceScaleFactor=metadata.deviceScaleFactor;this._pageScaleFactor=metadata.pageScaleFactor;this._viewport=metadata.viewport;if(!this._viewport)
+return;var offsetTop=metadata.offsetTop||0;var offsetBottom=metadata.offsetBottom||0;var screenWidthDIP=this._viewport.width*this._pageScaleFactor;var screenHeightDIP=this._viewport.height*this._pageScaleFactor+offsetTop+offsetBottom;this._screenOffsetTop=offsetTop;this._resizeViewport(screenWidthDIP,screenHeightDIP);this._imageZoom=this._imageElement.naturalWidth?this._canvasElement.offsetWidth/this._imageElement.naturalWidth:1;this.highlightDOMNode(this._highlightNodeId,this._highlightConfig);},_isGlassPaneActive:function()
+{return!this._glassPaneElement.classList.contains("hidden");},_screencastVisibilityChanged:function(event)
+{this._targetInactive=!event.data.visible;this._updateGlasspane();},_onTimeline:function(on)
+{this._timelineActive=on;if(this._timelineActive)
+this._stopCasting();else
+this._startCasting();this._updateGlasspane();},_onProfiler:function(on,event){this._profilerActive=on;if(this._profilerActive)
+this._stopCasting();else
+this._startCasting();this._updateGlasspane();},_updateGlasspane:function()
+{if(this._targetInactive){this._glassPaneElement.textContent=WebInspector.UIString("The tab is inactive");this._glassPaneElement.classList.remove("hidden");}else if(this._timelineActive){this._glassPaneElement.textContent=WebInspector.UIString("Timeline is active");this._glassPaneElement.classList.remove("hidden");}else if(this._profilerActive){this._glassPaneElement.textContent=WebInspector.UIString("CPU profiler is active");this._glassPaneElement.classList.remove("hidden");}else{this._glassPaneElement.classList.add("hidden");}},_resizeViewport:function(screenWidthDIP,screenHeightDIP)
+{var dimensions=this._viewportDimensions();this._screenZoom=Math.min(dimensions.width/screenWidthDIP,dimensions.height/screenHeightDIP);var bordersSize=WebInspector.ScreencastView._bordersSize;this._viewportElement.classList.remove("hidden");this._viewportElement.style.width=screenWidthDIP*this._screenZoom+bordersSize+"px";this._viewportElement.style.height=screenHeightDIP*this._screenZoom+bordersSize+"px";},_handleMouseEvent:function(event)
+{if(this._isGlassPaneActive()){event.consume();return;}
+if(!this._viewport)
+return;if(!this._inspectModeConfig||event.type==="mousewheel"){this._simulateTouchGestureForMouseEvent(event);event.preventDefault();if(event.type==="mousedown")
+this._canvasElement.focus();return;}
+var position=this._convertIntoScreenSpace(event);DOMAgent.getNodeForLocation(position.x/this._pageScaleFactor,position.y/this._pageScaleFactor,callback.bind(this));function callback(error,nodeId)
+{if(error)
+return;if(event.type==="mousemove")
+this.highlightDOMNode(nodeId,this._inspectModeConfig);else if(event.type==="click")
+WebInspector.Revealer.reveal(WebInspector.domModel.nodeForId(nodeId));}},_handleKeyEvent:function(event)
+{if(this._isGlassPaneActive()){event.consume();return;}
+var shortcutKey=WebInspector.KeyboardShortcut.makeKeyFromEvent(event);var handler=this._shortcuts[shortcutKey];if(handler&&handler(event)){event.consume();return;}
+var type;switch(event.type){case"keydown":type="keyDown";break;case"keyup":type="keyUp";break;case"keypress":type="char";break;default:return;}
+var text=event.type==="keypress"?String.fromCharCode(event.charCode):undefined;InputAgent.dispatchKeyEvent(type,this._modifiersForEvent(event),event.timeStamp/1000,text,text?text.toLowerCase():undefined,event.keyIdentifier,event.keyCode,event.keyCode,undefined,false,false,false);event.consume();this._canvasElement.focus();},_handleContextMenuEvent:function(event)
+{event.consume(true);},_simulateTouchGestureForMouseEvent:function(event)
+{var position=this._convertIntoScreenSpace(event);var timeStamp=event.timeStamp/1000;var x=position.x;var y=position.y;switch(event.which){case 1:if(event.type==="mousedown"){InputAgent.dispatchGestureEvent("scrollBegin",x,y,timeStamp);}else if(event.type==="mousemove"){var dx=this._lastScrollPosition?position.x-this._lastScrollPosition.x:0;var dy=this._lastScrollPosition?position.y-this._lastScrollPosition.y:0;if(dx||dy)
+InputAgent.dispatchGestureEvent("scrollUpdate",x,y,timeStamp,dx,dy);}else if(event.type==="mouseup"){InputAgent.dispatchGestureEvent("scrollEnd",x,y,timeStamp);}else if(event.type==="mousewheel"){if(event.altKey){var factor=1.1;var scale=event.wheelDeltaY<0?1/factor:factor;InputAgent.dispatchGestureEvent("pinchBegin",x,y,timeStamp);InputAgent.dispatchGestureEvent("pinchUpdate",x,y,timeStamp,0,0,scale);InputAgent.dispatchGestureEvent("pinchEnd",x,y,timeStamp);}else{InputAgent.dispatchGestureEvent("scrollBegin",x,y,timeStamp);InputAgent.dispatchGestureEvent("scrollUpdate",x,y,timeStamp,event.wheelDeltaX,event.wheelDeltaY);InputAgent.dispatchGestureEvent("scrollEnd",x,y,timeStamp);}}else if(event.type==="click"){InputAgent.dispatchMouseEvent("mousePressed",x,y,0,timeStamp,"left",1,true);InputAgent.dispatchMouseEvent("mouseReleased",x,y,0,timeStamp,"left",1,true);}
+this._lastScrollPosition=position;break;case 2:if(event.type==="mousedown"){InputAgent.dispatchGestureEvent("tapDown",x,y,timeStamp);}else if(event.type==="mouseup"){InputAgent.dispatchGestureEvent("tap",x,y,timeStamp);}
+break;case 3:if(event.type==="mousedown"){this._pinchStart=position;InputAgent.dispatchGestureEvent("pinchBegin",x,y,timeStamp);}else if(event.type==="mousemove"){var dx=this._pinchStart?position.x-this._pinchStart.x:0;var dy=this._pinchStart?position.y-this._pinchStart.y:0;if(dx||dy){var scale=Math.pow(dy<0?0.999:1.001,Math.abs(dy));InputAgent.dispatchGestureEvent("pinchUpdate",this._pinchStart.x,this._pinchStart.y,timeStamp,0,0,scale);}}else if(event.type==="mouseup"){InputAgent.dispatchGestureEvent("pinchEnd",x,y,timeStamp);}
+break;case 0:default:}},_convertIntoScreenSpace:function(event)
+{var zoom=this._canvasElement.offsetWidth/this._viewport.width/this._pageScaleFactor;var position={};position.x=Math.round(event.offsetX/zoom);position.y=Math.round(event.offsetY/zoom-this._screenOffsetTop);return position;},_modifiersForEvent:function(event)
+{var modifiers=0;if(event.altKey)
+modifiers=1;if(event.ctrlKey)
+modifiers+=2;if(event.metaKey)
+modifiers+=4;if(event.shiftKey)
+modifiers+=8;return modifiers;},onResize:function()
+{if(this._deferredCasting){clearTimeout(this._deferredCasting);delete this._deferredCasting;}
+this._stopCasting();this._deferredCasting=setTimeout(this._startCasting.bind(this),100);},highlightDOMNode:function(nodeId,config,objectId)
+{this._highlightNodeId=nodeId;this._highlightConfig=config;if(!nodeId){this._model=null;this._config=null;this._node=null;this._titleElement.classList.add("hidden");this._repaint();return;}
+this._node=WebInspector.domModel.nodeForId(nodeId);DOMAgent.getBoxModel(nodeId,callback.bind(this));function callback(error,model)
+{if(error){this._repaint();return;}
+this._model=this._scaleModel(model);this._config=config;this._repaint();}},_scaleModel:function(model)
+{var scale=this._canvasElement.offsetWidth/this._viewport.width;function scaleQuad(quad)
+{for(var i=0;i<quad.length;i+=2){quad[i]=(quad[i]-this._viewport.x)*scale;quad[i+1]=(quad[i+1]-this._viewport.y)*scale+this._screenOffsetTop*this._screenZoom;}}
+scaleQuad.call(this,model.content);scaleQuad.call(this,model.padding);scaleQuad.call(this,model.border);scaleQuad.call(this,model.margin);return model;},_repaint:function()
+{var model=this._model;var config=this._config;this._canvasElement.width=window.devicePixelRatio*this._canvasElement.offsetWidth;this._canvasElement.height=window.devicePixelRatio*this._canvasElement.offsetHeight;this._context.save();this._context.scale(window.devicePixelRatio,window.devicePixelRatio);this._context.save();this._context.fillStyle=this._checkerboardPattern;this._context.fillRect(0,0,this._canvasElement.offsetWidth,this._screenOffsetTop*this._screenZoom);this._context.fillRect(0,this._screenOffsetTop*this._screenZoom+this._imageElement.naturalHeight*this._imageZoom,this._canvasElement.offsetWidth,this._canvasElement.offsetHeight);this._context.restore();if(model&&config){this._context.save();const transparentColor="rgba(0, 0, 0, 0)";var hasContent=model.content&&config.contentColor!==transparentColor;var hasPadding=model.padding&&config.paddingColor!==transparentColor;var hasBorder=model.border&&config.borderColor!==transparentColor;var hasMargin=model.margin&&config.marginColor!==transparentColor;var clipQuad;if(hasMargin&&(!hasBorder||!this._quadsAreEqual(model.margin,model.border))){this._drawOutlinedQuadWithClip(model.margin,model.border,config.marginColor);clipQuad=model.border;}
+if(hasBorder&&(!hasPadding||!this._quadsAreEqual(model.border,model.padding))){this._drawOutlinedQuadWithClip(model.border,model.padding,config.borderColor);clipQuad=model.padding;}
+if(hasPadding&&(!hasContent||!this._quadsAreEqual(model.padding,model.content))){this._drawOutlinedQuadWithClip(model.padding,model.content,config.paddingColor);clipQuad=model.content;}
+if(hasContent)
+this._drawOutlinedQuad(model.content,config.contentColor);this._context.restore();this._drawElementTitle();this._context.globalCompositeOperation="destination-over";}
+this._context.drawImage(this._imageElement,0,this._screenOffsetTop*this._screenZoom,this._imageElement.naturalWidth*this._imageZoom,this._imageElement.naturalHeight*this._imageZoom);this._context.restore();},_quadsAreEqual:function(quad1,quad2)
+{for(var i=0;i<quad1.length;++i){if(quad1[i]!==quad2[i])
+return false;}
+return true;},_cssColor:function(color)
+{if(!color)
+return"transparent";return WebInspector.Color.fromRGBA([color.r,color.g,color.b,color.a]).toString(WebInspector.Color.Format.RGBA)||"";},_quadToPath:function(quad)
+{this._context.beginPath();this._context.moveTo(quad[0],quad[1]);this._context.lineTo(quad[2],quad[3]);this._context.lineTo(quad[4],quad[5]);this._context.lineTo(quad[6],quad[7]);this._context.closePath();return this._context;},_drawOutlinedQuad:function(quad,fillColor)
+{this._context.save();this._context.lineWidth=2;this._quadToPath(quad).clip();this._context.fillStyle=this._cssColor(fillColor);this._context.fill();this._context.restore();},_drawOutlinedQuadWithClip:function(quad,clipQuad,fillColor)
+{this._context.fillStyle=this._cssColor(fillColor);this._context.save();this._context.lineWidth=0;this._quadToPath(quad).fill();this._context.globalCompositeOperation="destination-out";this._context.fillStyle="red";this._quadToPath(clipQuad).fill();this._context.restore();},_drawElementTitle:function()
+{if(!this._node)
+return;var canvasWidth=this._canvasElement.offsetWidth;var canvasHeight=this._canvasElement.offsetHeight;var lowerCaseName=this._node.localName()||this._node.nodeName().toLowerCase();this._tagNameElement.textContent=lowerCaseName;this._nodeIdElement.textContent=this._node.getAttribute("id")?"#"+this._node.getAttribute("id"):"";this._nodeIdElement.textContent=this._node.getAttribute("id")?"#"+this._node.getAttribute("id"):"";var className=this._node.getAttribute("class");if(className&&className.length>50)
+className=className.substring(0,50)+"\u2026";this._classNameElement.textContent=className||"";this._nodeWidthElement.textContent=this._model.width;this._nodeHeightElement.textContent=this._model.height;var marginQuad=this._model.margin;var titleWidth=this._titleElement.offsetWidth+6;var titleHeight=this._titleElement.offsetHeight+4;var anchorTop=this._model.margin[1];var anchorBottom=this._model.margin[7];const arrowHeight=7;var renderArrowUp=false;var renderArrowDown=false;var boxX=Math.max(2,this._model.margin[0]);if(boxX+titleWidth>canvasWidth)
+boxX=canvasWidth-titleWidth-2;var boxY;if(anchorTop>canvasHeight){boxY=canvasHeight-titleHeight-arrowHeight;renderArrowDown=true;}else if(anchorBottom<0){boxY=arrowHeight;renderArrowUp=true;}else if(anchorBottom+titleHeight+arrowHeight<canvasHeight){boxY=anchorBottom+arrowHeight-4;renderArrowUp=true;}else if(anchorTop-titleHeight-arrowHeight>0){boxY=anchorTop-titleHeight-arrowHeight+3;renderArrowDown=true;}else
+boxY=arrowHeight;this._context.save();this._context.translate(0.5,0.5);this._context.beginPath();this._context.moveTo(boxX,boxY);if(renderArrowUp){this._context.lineTo(boxX+2*arrowHeight,boxY);this._context.lineTo(boxX+3*arrowHeight,boxY-arrowHeight);this._context.lineTo(boxX+4*arrowHeight,boxY);}
+this._context.lineTo(boxX+titleWidth,boxY);this._context.lineTo(boxX+titleWidth,boxY+titleHeight);if(renderArrowDown){this._context.lineTo(boxX+4*arrowHeight,boxY+titleHeight);this._context.lineTo(boxX+3*arrowHeight,boxY+titleHeight+arrowHeight);this._context.lineTo(boxX+2*arrowHeight,boxY+titleHeight);}
+this._context.lineTo(boxX,boxY+titleHeight);this._context.closePath();this._context.fillStyle="rgb(255, 255, 194)";this._context.fill();this._context.strokeStyle="rgb(128, 128, 128)";this._context.stroke();this._context.restore();this._titleElement.classList.remove("hidden");this._titleElement.style.top=(boxY+3)+"px";this._titleElement.style.left=(boxX+3)+"px";},_viewportDimensions:function()
+{const gutterSize=30;const bordersSize=WebInspector.ScreencastView._bordersSize;return{width:this.element.offsetWidth-bordersSize-gutterSize,height:this.element.offsetHeight-bordersSize-gutterSize-WebInspector.ScreencastView._navBarHeight};},setInspectModeEnabled:function(enabled,inspectUAShadowDOM,config,callback)
+{this._inspectModeConfig=enabled?config:null;if(callback)
+callback(null);},_createCheckerboardPattern:function(context)
+{var pattern=(document.createElement("canvas"));const size=32;pattern.width=size*2;pattern.height=size*2;var pctx=pattern.getContext("2d");pctx.fillStyle="rgb(195, 195, 195)";pctx.fillRect(0,0,size*2,size*2);pctx.fillStyle="rgb(225, 225, 225)";pctx.fillRect(0,0,size,size);pctx.fillRect(size,size,size,size);return context.createPattern(pattern,"repeat");},_createNavigationBar:function()
+{this._navigationBar=this.element.createChild("div","toolbar-background screencast-navigation");this._navigationBack=this._navigationBar.createChild("button","back");this._navigationBack.disabled=true;this._navigationBack.addEventListener("click",this._navigateToHistoryEntry.bind(this,-1),false);this._navigationForward=this._navigationBar.createChild("button","forward");this._navigationForward.disabled=true;this._navigationForward.addEventListener("click",this._navigateToHistoryEntry.bind(this,1),false);this._navigationReload=this._navigationBar.createChild("button","reload");this._navigationReload.addEventListener("click",this._navigateReload.bind(this),false);this._navigationUrl=this._navigationBar.createChild("input");this._navigationUrl.type="text";this._navigationUrl.addEventListener('keyup',this._navigationUrlKeyUp.bind(this),true);this._navigationProgressBar=new WebInspector.ScreencastView.ProgressTracker(this._navigationBar.createChild("div","progress"));this._requestNavigationHistory();WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._requestNavigationHistory,this);},_navigateToHistoryEntry:function(offset)
+{var newIndex=this._historyIndex+offset;if(newIndex<0||newIndex>=this._historyEntries.length)
+return;PageAgent.navigateToHistoryEntry(this._historyEntries[newIndex].id);this._requestNavigationHistory();},_navigateReload:function()
+{WebInspector.resourceTreeModel.reloadPage();},_navigationUrlKeyUp:function(event)
+{if(event.keyIdentifier!='Enter')
+return;var url=this._navigationUrl.value;if(!url)
+return;if(!url.match(WebInspector.ScreencastView._HttpRegex))
+url="http://"+url;PageAgent.navigate(url);this._canvasElement.focus();},_requestNavigationHistory:function()
+{PageAgent.getNavigationHistory(this._onNavigationHistory.bind(this));},_onNavigationHistory:function(error,currentIndex,entries)
+{if(error)
+return;this._historyIndex=currentIndex;this._historyEntries=entries;this._navigationBack.disabled=currentIndex==0;this._navigationForward.disabled=currentIndex==(entries.length-1);var url=entries[currentIndex].url;var match=url.match(WebInspector.ScreencastView._HttpRegex);if(match)
+url=match[1];this._navigationUrl.value=url;},_focusNavigationBar:function()
+{this._navigationUrl.focus();this._navigationUrl.select();return true;},__proto__:WebInspector.VBox.prototype}
+WebInspector.ScreencastView.ProgressTracker=function(element){this._element=element;WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._onMainFrameNavigated,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._onLoad,this);WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted,this._onRequestStarted,this);WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished,this._onRequestFinished,this);};WebInspector.ScreencastView.ProgressTracker.prototype={_onMainFrameNavigated:function()
+{this._requestIds={};this._startedRequests=0;this._finishedRequests=0;this._maxDisplayedProgress=0;this._updateProgress(0.1);},_onLoad:function()
+{delete this._requestIds;this._updateProgress(1);setTimeout(function(){if(!this._navigationProgressVisible())
+this._displayProgress(0);}.bind(this),500);},_navigationProgressVisible:function()
+{return!!this._requestIds;},_onRequestStarted:function(event)
+{if(!this._navigationProgressVisible())
+return;var request=(event.data);if(request.type===WebInspector.resourceTypes.WebSocket)
+return;this._requestIds[request.requestId]=request;++this._startedRequests;},_onRequestFinished:function(event)
+{if(!this._navigationProgressVisible())
+return;var request=(event.data);if(!(request.requestId in this._requestIds))
+return;++this._finishedRequests;setTimeout(function(){this._updateProgress(this._finishedRequests/this._startedRequests*0.9);}.bind(this),500);},_updateProgress:function(progress)
+{if(!this._navigationProgressVisible())
+return;if(this._maxDisplayedProgress>=progress)
+return;this._maxDisplayedProgress=progress;this._displayProgress(progress);},_displayProgress:function(progress)
+{this._element.style.width=(100*progress)+"%";}};WebInspector.ScreencastController=function()
+{var rootView=new WebInspector.RootView();this._rootSplitView=new WebInspector.SplitView(false,true,"InspectorView.screencastSplitViewState",300,300);this._rootSplitView.show(rootView.element);WebInspector.inspectorView.show(this._rootSplitView.sidebarElement());this._screencastView=new WebInspector.ScreencastView();this._screencastView.show(this._rootSplitView.mainElement());this._onStatusBarButtonStateChanged("disabled");rootView.attachToBody();this._initialized=false;};WebInspector.ScreencastController.prototype={_onStatusBarButtonStateChanged:function(state)
+{if(state==="disabled"){this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(),false);this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(),false);this._rootSplitView.hideMain();return;}
+this._rootSplitView.setVertical(state==="left");this._rootSplitView.setSecondIsSidebar(true);this._rootSplitView.toggleResizer(this._rootSplitView.resizerElement(),true);this._rootSplitView.toggleResizer(WebInspector.inspectorView.topResizerElement(),state==="top");this._rootSplitView.showBoth();},initialize:function()
+{this._screencastView.initialize();this._currentScreencastState=WebInspector.settings.createSetting("currentScreencastState","");this._lastScreencastState=WebInspector.settings.createSetting("lastScreencastState","");this._toggleScreencastButton=new WebInspector.StatusBarStatesSettingButton("screencast-status-bar-item",["disabled","left","top"],[WebInspector.UIString("Disable screencast."),WebInspector.UIString("Switch to portrait screencast."),WebInspector.UIString("Switch to landscape screencast.")],this._currentScreencastState,this._lastScreencastState,this._onStatusBarButtonStateChanged.bind(this));if(this._statusBarPlaceholder){this._statusBarPlaceholder.parentElement.insertBefore(this._toggleScreencastButton.element,this._statusBarPlaceholder);this._statusBarPlaceholder.parentElement.removeChild(this._statusBarPlaceholder);delete this._statusBarPlaceholder;}
+this._initialized=true;},statusBarItem:function()
+{if(this._initialized)
+return this._toggleScreencastButton.element;this._statusBarPlaceholder=document.createElement("div");return this._statusBarPlaceholder;}};if(window.domAutomationController){var ___interactiveUiTestsMode=true;TestSuite=function()
+{this.controlTaken_=false;this.timerId_=-1;};TestSuite.prototype.fail=function(message)
+{if(this.controlTaken_)
+this.reportFailure_(message);else
+throw message;};TestSuite.prototype.assertEquals=function(expected,actual,opt_message)
+{if(expected!==actual){var message="Expected: '"+expected+"', but was '"+actual+"'";if(opt_message)
+message=opt_message+"("+message+")";this.fail(message);}};TestSuite.prototype.assertTrue=function(value,opt_message)
+{this.assertEquals(true,!!value,opt_message);};TestSuite.prototype.assertHasKey=function(object,key)
+{if(!object.hasOwnProperty(key))
+this.fail("Expected object to contain key '"+key+"'");};TestSuite.prototype.assertContains=function(string,substring)
+{if(string.indexOf(substring)===-1)
+this.fail("Expected to: '"+string+"' to contain '"+substring+"'");};TestSuite.prototype.takeControl=function()
+{this.controlTaken_=true;var self=this;this.timerId_=setTimeout(function(){self.reportFailure_("Timeout exceeded: 20 sec");},20000);};TestSuite.prototype.releaseControl=function()
+{if(this.timerId_!==-1){clearTimeout(this.timerId_);this.timerId_=-1;}
+this.reportOk_();};TestSuite.prototype.reportOk_=function()
+{window.domAutomationController.send("[OK]");};TestSuite.prototype.reportFailure_=function(error)
+{if(this.timerId_!==-1){clearTimeout(this.timerId_);this.timerId_=-1;}
+window.domAutomationController.send("[FAILED] "+error);};TestSuite.prototype.runTest=function(testName)
+{try{this[testName]();if(!this.controlTaken_)
+this.reportOk_();}catch(e){this.reportFailure_(e);}};TestSuite.prototype.showPanel=function(panelName)
+{var button=document.getElementById("tab-"+panelName);button.selectTabForTest();this.assertEquals(WebInspector.panels[panelName],WebInspector.inspectorView.currentPanel());};TestSuite.prototype.addSniffer=function(receiver,methodName,override,opt_sticky)
+{var orig=receiver[methodName];if(typeof orig!=="function")
+this.fail("Cannot find method to override: "+methodName);var test=this;receiver[methodName]=function(var_args){try{var result=orig.apply(this,arguments);}finally{if(!opt_sticky)
+receiver[methodName]=orig;}
+try{override.apply(this,arguments);}catch(e){test.fail("Exception in overriden method '"+methodName+"': "+e);}
+return result;};};TestSuite.prototype.testShowScriptsTab=function()
+{this.showPanel("sources");var test=this;this._waitUntilScriptsAreParsed(["debugger_test_page.html"],function(){test.releaseControl();});this.takeControl();};TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh=function()
+{var test=this;this.assertEquals(WebInspector.panels.elements,WebInspector.inspectorView.currentPanel(),"Elements panel should be current one.");WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,waitUntilScriptIsParsed);test.evaluateInConsole_("window.location.reload(true);",function(resultText){});function waitUntilScriptIsParsed()
+{WebInspector.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,waitUntilScriptIsParsed);test.showPanel("sources");test._waitUntilScriptsAreParsed(["debugger_test_page.html"],function(){test.releaseControl();});}
+this.takeControl();};TestSuite.prototype.testContentScriptIsPresent=function()
+{this.showPanel("sources");var test=this;test._waitUntilScriptsAreParsed(["page_with_content_script.html","simple_content_script.js"],function(){test.releaseControl();});this.takeControl();};TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch=function()
+{var test=this;var expectedScriptsCount=2;var parsedScripts=[];this.showPanel("sources");function switchToElementsTab(){test.showPanel("elements");setTimeout(switchToScriptsTab,0);}
+function switchToScriptsTab(){test.showPanel("sources");setTimeout(checkScriptsPanel,0);}
+function checkScriptsPanel(){test.assertTrue(test._scriptsAreParsed(["debugger_test_page.html"]),"Some scripts are missing.");checkNoDuplicates();test.releaseControl();}
+function checkNoDuplicates(){var uiSourceCodes=test.nonAnonymousUISourceCodes_();for(var i=0;i<uiSourceCodes.length;i++){var scriptName=uiSourceCodes[i].url;for(var j=i+1;j<uiSourceCodes.length;j++)
+test.assertTrue(scriptName!==uiSourceCodes[j].url,"Found script duplicates: "+test.uiSourceCodesToString_(uiSourceCodes));}}
+test._waitUntilScriptsAreParsed(["debugger_test_page.html"],function(){checkNoDuplicates();setTimeout(switchToElementsTab,0);});this.takeControl();};TestSuite.prototype.testPauseWhenLoadingDevTools=function()
+{this.showPanel("sources");if(WebInspector.debuggerModel.debuggerPausedDetails)
+return;this._waitForScriptPause(this.releaseControl.bind(this));this.takeControl();};TestSuite.prototype.testPauseWhenScriptIsRunning=function()
+{this.showPanel("sources");this.evaluateInConsole_('setTimeout("handleClick()" , 0)',didEvaluateInConsole.bind(this));function didEvaluateInConsole(resultText){this.assertTrue(!isNaN(resultText),"Failed to get timer id: "+resultText);setTimeout(testScriptPause.bind(this),300);}
+function testScriptPause(){WebInspector.panels.sources._pauseButton.element.click();this._waitForScriptPause(this.releaseControl.bind(this));}
+this.takeControl();};TestSuite.prototype.testNetworkSize=function()
+{var test=this;function finishResource(resource,finishTime)
+{test.assertEquals(219,resource.transferSize,"Incorrect total encoded data length");test.assertEquals(25,resource.resourceSize,"Incorrect total data length");test.releaseControl();}
+this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("window.location.reload(true);",function(resultText){});this.takeControl();};TestSuite.prototype.testNetworkSyncSize=function()
+{var test=this;function finishResource(resource,finishTime)
+{test.assertEquals(219,resource.transferSize,"Incorrect total encoded data length");test.assertEquals(25,resource.resourceSize,"Incorrect total data length");test.releaseControl();}
+this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("var xhr = new XMLHttpRequest(); xhr.open(\"GET\", \"chunked\", false); xhr.send(null);",function(){});this.takeControl();};TestSuite.prototype.testNetworkRawHeadersText=function()
+{var test=this;function finishResource(resource,finishTime)
+{if(!resource.responseHeadersText)
+test.fail("Failure: resource does not have response headers text");test.assertEquals(164,resource.responseHeadersText.length,"Incorrect response headers text length");test.releaseControl();}
+this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("window.location.reload(true);",function(resultText){});this.takeControl();};TestSuite.prototype.testNetworkTiming=function()
+{var test=this;function finishResource(resource,finishTime)
+{test.assertTrue(resource.timing.receiveHeadersEnd-resource.timing.connectStart>=70,"Time between receiveHeadersEnd and connectStart should be >=70ms, but was "+"receiveHeadersEnd="+resource.timing.receiveHeadersEnd+", connectStart="+resource.timing.connectStart+".");test.assertTrue(resource.responseReceivedTime-resource.startTime>=0.07,"Time between responseReceivedTime and startTime should be >=0.07s, but was "+"responseReceivedTime="+resource.responseReceivedTime+", startTime="+resource.startTime+".");test.assertTrue(resource.endTime-resource.startTime>=0.14,"Time between endTime and startTime should be >=0.14s, but was "+"endtime="+resource.endTime+", startTime="+resource.startTime+".");test.releaseControl();}
+this.addSniffer(WebInspector.NetworkDispatcher.prototype,"_finishNetworkRequest",finishResource);test.evaluateInConsole_("window.location.reload(true);",function(resultText){});this.takeControl();};TestSuite.prototype.testConsoleOnNavigateBack=function()
+{if(WebInspector.console.messages.length===1)
+firstConsoleMessageReceived.call(this);else
+WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,firstConsoleMessageReceived,this);function firstConsoleMessageReceived(){WebInspector.console.removeEventListener(WebInspector.ConsoleModel.Events.MessageAdded,firstConsoleMessageReceived,this);this.evaluateInConsole_("clickLink();",didClickLink.bind(this));}
+function didClickLink(){this.assertEquals(3,WebInspector.console.messages.length);this.evaluateInConsole_("history.back();",didNavigateBack.bind(this));}
+function didNavigateBack()
+{this.evaluateInConsole_("void 0;",didCompleteNavigation.bind(this));}
+function didCompleteNavigation(){this.assertEquals(7,WebInspector.console.messages.length);this.releaseControl();}
+this.takeControl();};TestSuite.prototype.testReattachAfterCrash=function()
+{this.evaluateInConsole_("1+1;",this.releaseControl.bind(this));this.takeControl();};TestSuite.prototype.testSharedWorker=function()
+{function didEvaluateInConsole(resultText){this.assertEquals("2011",resultText);this.releaseControl();}
+this.evaluateInConsole_("globalVar",didEvaluateInConsole.bind(this));this.takeControl();};TestSuite.prototype.testPauseInSharedWorkerInitialization=function()
+{if(WebInspector.debuggerModel.debuggerPausedDetails)
+return;this._waitForScriptPause(this.releaseControl.bind(this));this.takeControl();};TestSuite.prototype.testTimelineFrames=function()
+{var test=this;function step1()
+{test.recordTimeline(onTimelineRecorded);test.evaluateInConsole_("runTest()",function(){});}
+function onTimelineRecorded(records)
+{var frameCount=0;var recordsInFrame={};for(var i=0;i<records.length;++i){var record=records[i];if(record.type!=="BeginFrame"){recordsInFrame[record.type]=(recordsInFrame[record.type]||0)+1;continue;}
+if(!frameCount++)
+continue;test.assertHasKey(recordsInFrame,"FireAnimationFrame");test.assertHasKey(recordsInFrame,"Layout");test.assertHasKey(recordsInFrame,"RecalculateStyles");test.assertHasKey(recordsInFrame,"Paint");recordsInFrame={};}
+test.assertTrue(frameCount>=5,"Not enough frames");test.releaseControl();}
+step1();test.takeControl();}
+TestSuite.prototype.testPageOverlayUpdate=function()
+{var test=this;WebInspector.inspectorView.panel("elements");function populatePage()
+{var div1=document.createElement("div");div1.id="div1";div1.style.webkitTransform="translateZ(0)";document.body.appendChild(div1);var div2=document.createElement("div");div2.id="div2";document.body.appendChild(div2);}
+function step1()
+{test.evaluateInConsole_(populatePage.toString()+"; populatePage();"+"inspect(document.getElementById('div1'))",function(){});WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,step2);}
+function step2()
+{WebInspector.notifications.removeEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,step2);test.recordTimeline(onTimelineRecorded);setTimeout(step3,500);}
+function step3()
+{test.evaluateInConsole_("inspect(document.getElementById('div2'))",function(){});WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,step4);}
+function step4()
+{WebInspector.notifications.removeEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged,step4);test.stopTimeline();}
+function onTimelineRecorded(records)
+{var types={};for(var i=0;i<records.length;++i)
+types[records[i].type]=(types[records[i].type]||0)+1;var frameCount=types["BeginFrame"];test.assertTrue(frameCount>=2,"Not enough DevTools overlay updates");test.assertTrue(frameCount<6,"Too many updates caused by DevTools overlay");test.releaseControl();}
+step1();this.takeControl();}
+TestSuite.prototype.recordTimeline=function(callback)
+{var records=[];var dispatchOnRecordType={}
+WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded,addRecord);WebInspector.timelineManager.start();function addRecord(event)
+{innerAddRecord(event.data);}
+function innerAddRecord(record)
+{records.push(record);if(record.type==="TimeStamp"&&record.data.message==="ready")
+done();if(record.children)
+record.children.forEach(innerAddRecord);}
+function done()
+{WebInspector.timelineManager.stop();WebInspector.timelineManager.removeEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded,addRecord);callback(records);}}
+TestSuite.prototype.stopTimeline=function()
+{this.evaluateInConsole_("console.timeStamp('ready')",function(){});}
+TestSuite.prototype.waitForTestResultsInConsole=function()
+{var messages=WebInspector.console.messages;for(var i=0;i<messages.length;++i){var text=messages[i].messageText;if(text==="PASS")
+return;else if(/^FAIL/.test(text))
+this.fail(text);}
+function onConsoleMessage(event)
+{var text=event.data.messageText;if(text==="PASS")
+this.releaseControl();else if(/^FAIL/.test(text))
+this.fail(text);}
+WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,onConsoleMessage,this);this.takeControl();};TestSuite.prototype.checkLogAndErrorMessages=function()
+{var messages=WebInspector.console.messages;var matchesCount=0;function validMessage(message)
+{if(message.text==="log"&&message.level===WebInspector.ConsoleMessage.MessageLevel.Log){++matchesCount;return true;}
+if(message.text==="error"&&message.level===WebInspector.ConsoleMessage.MessageLevel.Error){++matchesCount;return true;}
+return false;}
+for(var i=0;i<messages.length;++i){if(validMessage(messages[i]))
+continue;this.fail(messages[i].text+":"+messages[i].level);}
+if(matchesCount===2)
+return;function onConsoleMessage(event)
+{var message=event.data;if(validMessage(message)){if(matchesCount===2){this.releaseControl();return;}}else
+this.fail(message.text+":"+messages[i].level);}
+WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded,onConsoleMessage,this);this.takeControl();};TestSuite.prototype.uiSourceCodesToString_=function(uiSourceCodes)
+{var names=[];for(var i=0;i<uiSourceCodes.length;i++)
+names.push('"'+uiSourceCodes[i].url+'"');return names.join(",");};TestSuite.prototype.nonAnonymousUISourceCodes_=function()
+{function filterOutAnonymous(uiSourceCode)
+{return!!uiSourceCode.url;}
+function filterOutService(uiSourceCode)
+{return!uiSourceCode.project().isServiceProject();}
+var uiSourceCodes=WebInspector.workspace.uiSourceCodes();uiSourceCodes=uiSourceCodes.filter(filterOutService);return uiSourceCodes.filter(filterOutAnonymous);};TestSuite.prototype.evaluateInConsole_=function(code,callback)
+{WebInspector.console.show();var consoleView=WebInspector.ConsolePanel._view();consoleView.prompt.text=code;consoleView.promptElement.dispatchEvent(TestSuite.createKeyEvent("Enter"));this.addSniffer(WebInspector.ConsoleView.prototype,"_showConsoleMessage",function(viewMessage){callback(viewMessage.toMessageElement().textContent);}.bind(this));};TestSuite.prototype._scriptsAreParsed=function(expected)
+{var uiSourceCodes=this.nonAnonymousUISourceCodes_();var missing=expected.slice(0);for(var i=0;i<uiSourceCodes.length;++i){for(var j=0;j<missing.length;++j){if(uiSourceCodes[i].name().search(missing[j])!==-1){missing.splice(j,1);break;}}}
+return missing.length===0;};TestSuite.prototype._waitForScriptPause=function(callback)
+{function pauseListener(event){WebInspector.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused,pauseListener,this);callback();}
+WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused,pauseListener,this);};TestSuite.prototype._executeCodeWhenScriptsAreParsed=function(code,expectedScripts)
+{var test=this;function executeFunctionInInspectedPage(){test.evaluateInConsole_('setTimeout("'+code+'" , 0)',function(resultText){test.assertTrue(!isNaN(resultText),"Failed to get timer id: "+resultText+". Code: "+code);});}
+test._waitUntilScriptsAreParsed(expectedScripts,executeFunctionInInspectedPage);};TestSuite.prototype._waitUntilScriptsAreParsed=function(expectedScripts,callback)
+{var test=this;function waitForAllScripts(){if(test._scriptsAreParsed(expectedScripts))
+callback();else
+test.addSniffer(WebInspector.panels.sources.sourcesView(),"_addUISourceCode",waitForAllScripts);}
+waitForAllScripts();};TestSuite.createKeyEvent=function(keyIdentifier)
+{var evt=document.createEvent("KeyboardEvent");evt.initKeyboardEvent("keydown",true,true,null,keyIdentifier,"");return evt;};var uiTests={};uiTests.runAllTests=function()
+{for(var name in TestSuite.prototype){if(name.substring(0,4)==="test"&&typeof TestSuite.prototype[name]==="function")
+uiTests.runTest(name);}};uiTests.runTest=function(name)
+{if(uiTests._populatedInterface)
+new TestSuite().runTest(name);else
+uiTests._pendingTestName=name;};(function(){function runTests()
+{uiTests._populatedInterface=true;var name=uiTests._pendingTestName;delete uiTests._pendingTestName;if(name)
+new TestSuite().runTest(name);}
+var oldLoadCompleted=InspectorFrontendAPI.loadCompleted;InspectorFrontendAPI.loadCompleted=function()
+{oldLoadCompleted.call(InspectorFrontendAPI);runTests();}})();}
+WebInspector.FlameChartDelegate=function(){}
+WebInspector.FlameChartDelegate.prototype={requestWindowTimes:function(startTime,endTime){},}
+WebInspector.FlameChart=function(dataProvider,flameChartDelegate,isTopDown,timeBasedWindow)
+{WebInspector.HBox.call(this);this.element.classList.add("flame-chart-main-pane");this._flameChartDelegate=flameChartDelegate;this._isTopDown=isTopDown;this._timeBasedWindow=timeBasedWindow;this._calculator=new WebInspector.FlameChart.Calculator();this._canvas=this.element.createChild("canvas");this._canvas.addEventListener("mousemove",this._onMouseMove.bind(this));this._canvas.addEventListener("mousewheel",this._onMouseWheel.bind(this),false);this._canvas.addEventListener("click",this._onClick.bind(this),false);WebInspector.installDragHandle(this._canvas,this._startCanvasDragging.bind(this),this._canvasDragging.bind(this),this._endCanvasDragging.bind(this),"move",null);this._vScrollElement=this.element.createChild("div","flame-chart-v-scroll");this._vScrollContent=this._vScrollElement.createChild("div");this._vScrollElement.addEventListener("scroll",this._scheduleUpdate.bind(this),false);this._entryInfo=this.element.createChild("div","profile-entry-info");this._highlightElement=this.element.createChild("div","flame-chart-highlight-element");this._selectedElement=this.element.createChild("div","flame-chart-selected-element");this._dataProvider=dataProvider;this._windowLeft=0.0;this._windowRight=1.0;this._windowWidth=1.0;this._timeWindowLeft=0;this._timeWindowRight=Infinity;this._barHeight=dataProvider.barHeight();this._barHeightDelta=this._isTopDown?-this._barHeight:this._barHeight;this._minWidth=1;this._paddingLeft=this._dataProvider.paddingLeft();this._highlightedEntryIndex=-1;this._selectedEntryIndex=-1;this._textWidth={};}
+WebInspector.FlameChart.DividersBarHeight=20;WebInspector.FlameChartDataProvider=function()
+{}
+WebInspector.FlameChart.TimelineData;WebInspector.FlameChartDataProvider.prototype={barHeight:function(){},dividerOffsets:function(startTime,endTime){},zeroTime:function(){},totalTime:function(){},maxStackDepth:function(){},timelineData:function(){},prepareHighlightedEntryInfo:function(entryIndex){},canJumpToEntry:function(entryIndex){},entryTitle:function(entryIndex){},entryFont:function(entryIndex){},entryColor:function(entryIndex){},decorateEntry:function(entryIndex,context,text,barX,barY,barWidth,barHeight,offsetToPosition){},forceDecoration:function(entryIndex){},textColor:function(entryIndex){},textBaseline:function(){},textPadding:function(){},highlightTimeRange:function(entryIndex){},paddingLeft:function(){}}
+WebInspector.FlameChart.Events={EntrySelected:"EntrySelected"}
+WebInspector.FlameChart.Calculator=function()
+{this._paddingLeft=0;}
+WebInspector.FlameChart.Calculator.prototype={paddingLeft:function()
+{return this._paddingLeft;},_updateBoundaries:function(mainPane)
+{this._totalTime=mainPane._dataProvider.totalTime();this._zeroTime=mainPane._dataProvider.zeroTime();this._minimumBoundaries=this._zeroTime+mainPane._windowLeft*this._totalTime;this._maximumBoundaries=this._zeroTime+mainPane._windowRight*this._totalTime;this._paddingLeft=mainPane._paddingLeft;this._width=mainPane._canvas.width/window.devicePixelRatio-this._paddingLeft;this._timeToPixel=this._width/this.boundarySpan();},computePosition:function(time)
+{return Math.round((time-this._minimumBoundaries)*this._timeToPixel+this._paddingLeft);},formatTime:function(value,precision)
+{return Number.preciseMillisToString(value-this._zeroTime,precision);},maximumBoundary:function()
+{return this._maximumBoundaries;},minimumBoundary:function()
+{return this._minimumBoundaries;},zeroTime:function()
+{return this._zeroTime;},boundarySpan:function()
+{return this._maximumBoundaries-this._minimumBoundaries;}}
+WebInspector.FlameChart.prototype={_resetCanvas:function()
+{var ratio=window.devicePixelRatio;this._canvas.width=this._offsetWidth*ratio;this._canvas.height=this._offsetHeight*ratio;},_timelineData:function()
+{return this._dataProvider.timelineData();},changeWindow:function(windowLeft,windowRight)
+{console.assert(!this._timeBasedWindow);this._windowLeft=windowLeft;this._windowRight=windowRight;this._windowWidth=this._windowRight-this._windowLeft;this._scheduleUpdate();},setWindowTimes:function(startTime,endTime)
+{console.assert(this._timeBasedWindow);this._timeWindowLeft=startTime;this._timeWindowRight=endTime;this._scheduleUpdate();},_startCanvasDragging:function(event)
+{if(!this._timelineData())
+return false;this._isDragging=true;this._maxDragOffset=0;this._dragStartPointX=event.pageX;this._dragStartPointY=event.pageY;this._dragStartScrollTop=this._vScrollElement.scrollTop;this._dragStartWindowLeft=this._timeWindowLeft;this._dragStartWindowRight=this._timeWindowRight;this._canvas.style.cursor="";return true;},_canvasDragging:function(event)
+{var pixelShift=this._dragStartPointX-event.pageX;var pixelScroll=this._dragStartPointY-event.pageY;this._vScrollElement.scrollTop=this._dragStartScrollTop+pixelScroll;var windowShift=pixelShift/this._totalPixels;var windowTime=this._windowWidth*this._totalTime;var timeShift=windowTime*pixelShift/this._pixelWindowWidth;timeShift=Number.constrain(timeShift,this._zeroTime-this._dragStartWindowLeft,this._zeroTime+this._totalTime-this._dragStartWindowRight);var windowLeft=this._dragStartWindowLeft+timeShift;var windowRight=this._dragStartWindowRight+timeShift;this._flameChartDelegate.requestWindowTimes(windowLeft,windowRight);this._maxDragOffset=Math.max(this._maxDragOffset,Math.abs(pixelShift));},_endCanvasDragging:function()
+{this._isDragging=false;},_onMouseMove:function(event)
+{if(this._isDragging)
+return;var entryIndex=this._coordinatesToEntryIndex(event.offsetX,event.offsetY);if(this._highlightedEntryIndex===entryIndex)
+return;if(entryIndex===-1||!this._dataProvider.canJumpToEntry(entryIndex))
+this._canvas.style.cursor="default";else
+this._canvas.style.cursor="pointer";this._highlightedEntryIndex=entryIndex;this._updateElementPosition(this._highlightElement,this._highlightedEntryIndex);this._entryInfo.removeChildren();if(this._highlightedEntryIndex===-1)
+return;if(!this._isDragging){var entryInfo=this._dataProvider.prepareHighlightedEntryInfo(this._highlightedEntryIndex);if(entryInfo)
+this._entryInfo.appendChild(this._buildEntryInfo(entryInfo));}},_onClick:function()
+{const clickThreshold=5;if(this._maxDragOffset>clickThreshold)
+return;if(this._highlightedEntryIndex===-1)
+return;this.dispatchEventToListeners(WebInspector.FlameChart.Events.EntrySelected,this._highlightedEntryIndex);},_onMouseWheel:function(e)
+{var windowLeft=this._timeWindowLeft?this._timeWindowLeft:this._dataProvider.zeroTime();var windowRight=this._timeWindowRight!==Infinity?this._timeWindowRight:this._dataProvider.zeroTime()+this._dataProvider.totalTime();if(e.wheelDeltaY){if(!e.altKey){const mouseWheelZoomSpeed=1/120;var zoom=Math.pow(1.2,-e.wheelDeltaY*mouseWheelZoomSpeed)-1;var cursorTime=this._cursorTime(e.offsetX);windowLeft+=(windowLeft-cursorTime)*zoom;windowRight+=(windowRight-cursorTime)*zoom;}else{this._vScrollElement.scrollTop-=e.wheelDeltaY/120*this._offsetHeight/8;}}else{var shift=e.wheelDeltaX*this._pixelToTime;shift=Number.constrain(shift,this._zeroTime-windowLeft,this._totalTime+this._zeroTime-windowRight);windowLeft+=shift;windowRight+=shift;}
+windowLeft=Number.constrain(windowLeft,this._zeroTime,this._totalTime+this._zeroTime);windowRight=Number.constrain(windowRight,this._zeroTime,this._totalTime+this._zeroTime);this._flameChartDelegate.requestWindowTimes(windowLeft,windowRight);},_cursorTime:function(x)
+{return(x+this._pixelWindowLeft-this._paddingLeft)*this._pixelToTime+this._zeroTime;},_coordinatesToEntryIndex:function(x,y)
+{y+=this._scrollTop;var timelineData=this._timelineData();if(!timelineData)
+return-1;var cursorTimeOffset=this._cursorTime(x)-this._zeroTime;var cursorLevel=this._isTopDown?Math.floor((y-WebInspector.FlameChart.DividersBarHeight)/this._barHeight):Math.floor((this._canvas.height/window.devicePixelRatio-y)/this._barHeight);var entryOffsets=timelineData.entryOffsets;var entryTotalTimes=timelineData.entryTotalTimes;var entryLevels=timelineData.entryLevels;var length=entryOffsets.length;for(var i=0;i<length;++i){var entryLevel=entryLevels[i];if(cursorLevel!==entryLevel)
+continue;if(cursorTimeOffset<entryOffsets[i])
+return-1;if(cursorTimeOffset<(entryOffsets[i]+entryTotalTimes[i]))
+return i;}
+return-1;},draw:function(width,height)
+{var timelineData=this._timelineData();if(!timelineData)
+return;var context=this._canvas.getContext("2d");context.save();var ratio=window.devicePixelRatio;context.scale(ratio,ratio);var timeWindowRight=this._timeWindowRight-this._zeroTime;var timeWindowLeft=this._timeWindowLeft-this._zeroTime;var timeToPixel=this._timeToPixel;var pixelWindowLeft=this._pixelWindowLeft;var paddingLeft=this._paddingLeft;var minWidth=this._minWidth;var entryTotalTimes=timelineData.entryTotalTimes;var entryOffsets=timelineData.entryOffsets;var entryLevels=timelineData.entryLevels;var titleIndexes=new Uint32Array(timelineData.entryTotalTimes);var lastTitleIndex=0;var textPadding=this._dataProvider.textPadding();this._minTextWidth=2*textPadding+this._measureWidth(context,"\u2026");var minTextWidth=this._minTextWidth;var lastDrawOffset=new Int32Array(this._dataProvider.maxStackDepth());for(var i=0;i<lastDrawOffset.length;++i)
+lastDrawOffset[i]=-1;var barHeight=this._barHeight;var offsetToPosition=this._offsetToPosition.bind(this);var textBaseHeight=this._baseHeight+barHeight-this._dataProvider.textBaseline();var colorBuckets={};var minVisibleBarLevel=Math.max(0,Math.floor((this._scrollTop-this._baseHeight)/barHeight));var maxVisibleBarLevel=Math.min(this._dataProvider.maxStackDepth(),Math.ceil((height+this._scrollTop)/barHeight));var visibleBarsCount=maxVisibleBarLevel-minVisibleBarLevel+1;context.translate(0,-this._scrollTop);var levelsCompleted=0;var lastEntryOnLevelPainted=[];for(var i=0;i<visibleBarsCount;++i)
+lastEntryOnLevelPainted[i]=false;for(var entryIndex=0;levelsCompleted<visibleBarsCount&&entryIndex<entryOffsets.length;++entryIndex){var barLevel=entryLevels[entryIndex];if(barLevel<minVisibleBarLevel||barLevel>maxVisibleBarLevel||lastEntryOnLevelPainted[barLevel-minVisibleBarLevel])
+continue;var entryOffset=entryOffsets[entryIndex];if(entryOffset>timeWindowRight){lastEntryOnLevelPainted[barLevel-minVisibleBarLevel]=true;levelsCompleted++;continue;}
+var entryOffsetRight=entryOffset+entryTotalTimes[entryIndex];if(entryOffsetRight<timeWindowLeft)
+continue;var barRight=this._offsetToPosition(entryOffsetRight);if(barRight<=lastDrawOffset[barLevel])
+continue;var barX=Math.max(this._offsetToPosition(entryOffset),lastDrawOffset[barLevel]);lastDrawOffset[barLevel]=barRight;var barWidth=barRight-barX;var color=this._dataProvider.entryColor(entryIndex);var bucket=colorBuckets[color];if(!bucket){bucket=[];colorBuckets[color]=bucket;}
+bucket.push(entryIndex);}
+var colors=Object.keys(colorBuckets);for(var c=0;c<colors.length;++c){var color=colors[c];context.fillStyle=color;context.strokeStyle=color;var indexes=colorBuckets[color];context.beginPath();for(i=0;i<indexes.length;++i){var entryIndex=indexes[i];var entryOffset=entryOffsets[entryIndex];var barX=this._offsetToPosition(entryOffset);var barRight=this._offsetToPosition(entryOffset+entryTotalTimes[entryIndex]);var barWidth=Math.max(barRight-barX,minWidth);var barLevel=entryLevels[entryIndex];var barY=this._levelToHeight(barLevel);context.rect(barX,barY,barWidth,barHeight);if(barWidth>minTextWidth||this._dataProvider.forceDecoration(entryIndex))
+titleIndexes[lastTitleIndex++]=entryIndex;}
+context.fill();}
+context.textBaseline="alphabetic";for(var i=0;i<lastTitleIndex;++i){var entryIndex=titleIndexes[i];var entryOffset=entryOffsets[entryIndex];var barX=this._offsetToPosition(entryOffset);var barRight=this._offsetToPosition(entryOffset+entryTotalTimes[entryIndex]);var barWidth=Math.max(barRight-barX,minWidth);var barLevel=entryLevels[entryIndex];var barY=this._levelToHeight(barLevel);var text=this._dataProvider.entryTitle(entryIndex);if(text&&text.length)
+text=this._prepareText(context,text,barWidth-2*textPadding);if(this._dataProvider.decorateEntry(entryIndex,context,text,barX,barY,barWidth,barHeight,offsetToPosition))
+continue;if(!text||!text.length)
+continue;context.font=this._dataProvider.entryFont(entryIndex);context.fillStyle=this._dataProvider.textColor(entryIndex);context.fillText(text,barX+textPadding,textBaseHeight-barLevel*this._barHeightDelta);}
+context.restore();var offsets=this._dataProvider.dividerOffsets(this._calculator.minimumBoundary(),this._calculator.maximumBoundary());if(timelineData.entryOffsets.length)
+WebInspector.TimelineGrid.drawCanvasGrid(this._canvas,this._calculator,offsets);this._updateElementPosition(this._highlightElement,this._highlightedEntryIndex);this._updateElementPosition(this._selectedElement,this._selectedEntryIndex);},setSelectedEntry:function(entryIndex)
+{this._selectedEntryIndex=entryIndex;this._updateElementPosition(this._selectedElement,this._selectedEntryIndex);},_updateElementPosition:function(element,entryIndex)
+{if(element.parentElement)
+element.remove();if(entryIndex===-1)
+return;var timeRange=this._dataProvider.highlightTimeRange(entryIndex);if(!timeRange)
+return;var timelineData=this._timelineData();var barX=this._offsetToPosition(timeRange.startTimeOffset);var barRight=this._offsetToPosition(timeRange.endTimeOffset);if(barRight===0||barX===this._canvas.width)
+return;var barWidth=Math.max(barRight-barX,this._minWidth);var barY=this._levelToHeight(timelineData.entryLevels[entryIndex])-this._scrollTop;var style=element.style;style.left=barX+"px";style.top=barY+"px";style.width=barWidth+"px";style.height=this._barHeight+"px";this.element.appendChild(element);},_offsetToPosition:function(offset)
+{var value=Math.floor(offset*this._timeToPixel)-this._pixelWindowLeft+this._paddingLeft;return Math.min(this._canvas.width,Math.max(0,value));},_levelToHeight:function(level)
+{return this._baseHeight-level*this._barHeightDelta;},_buildEntryInfo:function(entryInfo)
+{var infoTable=document.createElement("table");infoTable.className="info-table";for(var i=0;i<entryInfo.length;++i){var row=infoTable.createChild("tr");var titleCell=row.createChild("td");titleCell.textContent=entryInfo[i].title;titleCell.className="title";var textCell=row.createChild("td");textCell.textContent=entryInfo[i].text;}
+return infoTable;},_prepareText:function(context,title,maxSize)
+{var titleWidth=this._measureWidth(context,title);if(maxSize>titleWidth)
+return title;var l=3;var r=title.length;while(l<r){var m=(l+r)>>1;if(this._measureWidth(context,title.trimMiddle(m))<maxSize)
+l=m+1;else
+r=m;}
+title=title.trimMiddle(r-1);titleWidth=this._measureWidth(context,title);if(titleWidth<=maxSize)
+return title;if(maxSize>this._measureWidth(context,"\u2026"))
+return"\u2026";return"";},_measureWidth:function(context,text)
+{if(text.length>20)
+return context.measureText(text).width;var width=this._textWidth[text];if(!width){width=context.measureText(text).width;this._textWidth[text]=width;}
+return width;},_updateBoundaries:function()
+{this._totalTime=this._dataProvider.totalTime();this._zeroTime=this._dataProvider.zeroTime();if(this._timeBasedWindow){if(this._timeWindowRight!==Infinity){this._windowLeft=(this._timeWindowLeft-this._zeroTime)/this._totalTime;this._windowRight=(this._timeWindowRight-this._zeroTime)/this._totalTime;this._windowWidth=this._windowRight-this._windowLeft;}else{this._windowLeft=0;this._windowRight=1;this._windowWidth=1;}}else{this._timeWindowLeft=this._windowLeft*this._totalTime;this._timeWindowRight=this._windowRight*this._totalTime;}
+this._pixelWindowWidth=this._offsetWidth-this._paddingLeft;this._totalPixels=Math.floor(this._pixelWindowWidth/this._windowWidth);this._pixelWindowLeft=Math.floor(this._totalPixels*this._windowLeft);this._pixelWindowRight=Math.floor(this._totalPixels*this._windowRight);this._timeToPixel=this._totalPixels/this._totalTime;this._pixelToTime=this._totalTime/this._totalPixels;this._paddingLeftTime=this._paddingLeft/this._timeToPixel;this._baseHeight=this._isTopDown?WebInspector.FlameChart.DividersBarHeight:this._offsetHeight-this._barHeight;var totalHeight=this._levelToHeight(this._dataProvider.maxStackDepth());this._vScrollContent.style.height=totalHeight+"px";this._scrollTop=this._vScrollElement.scrollTop;},onResize:function()
+{this._offsetWidth=this.element.offsetWidth-this._vScrollElement.offsetWidth;this._offsetHeight=this.element.offsetHeight;this._canvas.style.width=this._offsetWidth+"px";this._canvas.style.height=this._offsetHeight+"px";this._scheduleUpdate();},_scheduleUpdate:function()
+{if(this._updateTimerId)
+return;this._updateTimerId=requestAnimationFrame(this.update.bind(this));},update:function()
+{this._updateTimerId=0;if(!this._timelineData())
+return;this._resetCanvas();this._updateBoundaries();this._calculator._updateBoundaries(this);this.draw(this._offsetWidth,this._offsetHeight);},reset:function()
+{this._highlightedEntryIndex=-1;this._selectedEntryIndex=-1;this._textWidth={};this.update();},__proto__:WebInspector.HBox.prototype}
+WebInspector.PaintProfilerSnapshot=function(snapshotId)
+{this._id=snapshotId;}
+WebInspector.PaintProfilerSnapshot.prototype={dispose:function()
+{LayerTreeAgent.releaseSnapshot(this._id);},requestImage:function(firstStep,lastStep,callback)
+{var wrappedCallback=InspectorBackend.wrapClientCallback(callback,"LayerTreeAgent.replaySnapshot(): ");LayerTreeAgent.replaySnapshot(this._id,firstStep||undefined,lastStep||undefined,wrappedCallback);},profile:function(callback)
+{var wrappedCallback=InspectorBackend.wrapClientCallback(callback,"LayerTreeAgent.profileSnapshot(): ");LayerTreeAgent.profileSnapshot(this._id,5,1,wrappedCallback);}};WebInspector.HelpScreenUntilReload=function(title,message)
+{WebInspector.HelpScreen.call(this,title);var p=this.contentElement.createChild("p");p.classList.add("help-section");p.textContent=message;WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this.hide,this);}
+WebInspector.HelpScreenUntilReload.prototype={willHide:function()
+{WebInspector.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this.hide,this);WebInspector.HelpScreen.prototype.willHide.call(this);},__proto__:WebInspector.HelpScreen.prototype}
+WebInspector.ZoomManager=function()
+{this._zoomFactor=InspectorFrontendHost.zoomFactor();window.addEventListener("resize",this._onWindowResize.bind(this),true);};WebInspector.ZoomManager.Events={ZoomChanged:"ZoomChanged"};WebInspector.ZoomManager.prototype={zoomFactor:function()
+{return this._zoomFactor;},_onWindowResize:function()
+{var oldZoomFactor=this._zoomFactor;this._zoomFactor=InspectorFrontendHost.zoomFactor();if(oldZoomFactor!==this._zoomFactor)
+this.dispatchEventToListeners(WebInspector.ZoomManager.Events.ZoomChanged,{from:oldZoomFactor,to:this._zoomFactor});},__proto__:WebInspector.Object.prototype};WebInspector.zoomManager;
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/NetworkPanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/NetworkPanel.js
new file mode 100644 (file)
index 0000000..86d8ef1
--- /dev/null
@@ -0,0 +1,611 @@
+WebInspector.RequestView=function(request)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("resourceView.css");this.element.classList.add("resource-view");this.request=request;}
+WebInspector.RequestView.prototype={hasContent:function()
+{return false;},__proto__:WebInspector.VBox.prototype}
+WebInspector.RequestView.hasTextContent=function(request)
+{if(request.type.isTextType())
+return true;if(request.type===WebInspector.resourceTypes.Other||request.hasErrorStatusCode())
+return request.content&&!request.contentEncoded;return false;}
+WebInspector.RequestView.nonSourceViewForRequest=function(request)
+{switch(request.type){case WebInspector.resourceTypes.Image:return new WebInspector.ImageView(request);case WebInspector.resourceTypes.Font:return new WebInspector.FontView(request);default:return new WebInspector.RequestView(request);}};WebInspector.NetworkItemView=function(request)
+{WebInspector.TabbedPane.call(this);this.element.classList.add("network-item-view");var headersView=new WebInspector.RequestHeadersView(request);this.appendTab("headers",WebInspector.UIString("Headers"),headersView);this.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);if(request.type===WebInspector.resourceTypes.WebSocket){var frameView=new WebInspector.ResourceWebSocketFrameView(request);this.appendTab("webSocketFrames",WebInspector.UIString("Frames"),frameView);}else{var responseView=new WebInspector.RequestResponseView(request);var previewView=new WebInspector.RequestPreviewView(request,responseView);this.appendTab("preview",WebInspector.UIString("Preview"),previewView);this.appendTab("response",WebInspector.UIString("Response"),responseView);}
+if(request.requestCookies||request.responseCookies){this._cookiesView=new WebInspector.RequestCookiesView(request);this.appendTab("cookies",WebInspector.UIString("Cookies"),this._cookiesView);}
+if(request.timing){var timingView=new WebInspector.RequestTimingView(request);this.appendTab("timing",WebInspector.UIString("Timing"),timingView);}
+this._request=request;}
+WebInspector.NetworkItemView.prototype={wasShown:function()
+{WebInspector.TabbedPane.prototype.wasShown.call(this);this._selectTab();},currentSourceFrame:function()
+{var view=this.visibleView;if(view&&view instanceof WebInspector.SourceFrame)
+return(view);return null;},_selectTab:function(tabId)
+{if(!tabId)
+tabId=WebInspector.settings.resourceViewTab.get();if(!this.selectTab(tabId)){this._isInFallbackSelection=true;this.selectTab("headers");delete this._isInFallbackSelection;}},_tabSelected:function(event)
+{if(!event.data.isUserGesture)
+return;WebInspector.settings.resourceViewTab.set(event.data.tabId);WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.NetworkRequestTabSelected,tab:event.data.tabId,url:this._request.url});},request:function()
+{return this._request;},__proto__:WebInspector.TabbedPane.prototype}
+WebInspector.RequestContentView=function(request)
+{WebInspector.RequestView.call(this,request);}
+WebInspector.RequestContentView.prototype={hasContent:function()
+{return true;},get innerView()
+{return this._innerView;},set innerView(innerView)
+{this._innerView=innerView;},wasShown:function()
+{this._ensureInnerViewShown();},_ensureInnerViewShown:function()
+{if(this._innerViewShowRequested)
+return;this._innerViewShowRequested=true;function callback(content)
+{this._innerViewShowRequested=false;this.contentLoaded();}
+this.request.requestContent(callback.bind(this));},contentLoaded:function()
+{},__proto__:WebInspector.RequestView.prototype};WebInspector.RequestCookiesView=function(request)
+{WebInspector.VBox.call(this);this.element.classList.add("resource-cookies-view");this._request=request;}
+WebInspector.RequestCookiesView.prototype={wasShown:function()
+{this._request.addEventListener(WebInspector.NetworkRequest.Events.RequestHeadersChanged,this._refreshCookies,this);this._request.addEventListener(WebInspector.NetworkRequest.Events.ResponseHeadersChanged,this._refreshCookies,this);if(!this._gotCookies){if(!this._emptyView){this._emptyView=new WebInspector.EmptyView(WebInspector.UIString("This request has no cookies."));this._emptyView.show(this.element);}
+return;}
+if(!this._cookiesTable)
+this._buildCookiesTable();},willHide:function()
+{this._request.removeEventListener(WebInspector.NetworkRequest.Events.RequestHeadersChanged,this._refreshCookies,this);this._request.removeEventListener(WebInspector.NetworkRequest.Events.ResponseHeadersChanged,this._refreshCookies,this);},get _gotCookies()
+{return(this._request.requestCookies&&this._request.requestCookies.length)||(this._request.responseCookies&&this._request.responseCookies.length);},_buildCookiesTable:function()
+{this.detachChildViews();this._cookiesTable=new WebInspector.CookiesTable(true);this._cookiesTable.setCookieFolders([{folderName:WebInspector.UIString("Request Cookies"),cookies:this._request.requestCookies},{folderName:WebInspector.UIString("Response Cookies"),cookies:this._request.responseCookies}]);this._cookiesTable.show(this.element);},_refreshCookies:function()
+{delete this._cookiesTable;if(!this._gotCookies||!this.isShowing())
+return;this._buildCookiesTable();},__proto__:WebInspector.VBox.prototype};WebInspector.RequestHeadersView=function(request)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("resourceView.css");this.element.classList.add("resource-headers-view");this._request=request;this._headersListElement=document.createElement("ol");this._headersListElement.className="outline-disclosure";this.element.appendChild(this._headersListElement);this._headersTreeOutline=new TreeOutline(this._headersListElement);this._headersTreeOutline.expandTreeElementsWhenArrowing=true;this._remoteAddressTreeElement=new TreeElement("",null,false);this._remoteAddressTreeElement.selectable=false;this._remoteAddressTreeElement.hidden=true;this._headersTreeOutline.appendChild(this._remoteAddressTreeElement);this._urlTreeElement=new TreeElement("",null,false);this._urlTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._urlTreeElement);this._requestMethodTreeElement=new TreeElement("",null,false);this._requestMethodTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._requestMethodTreeElement);this._statusCodeTreeElement=new TreeElement("",null,false);this._statusCodeTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._statusCodeTreeElement);this._requestHeadersTreeElement=new TreeElement("",null,true);this._requestHeadersTreeElement.expanded=true;this._requestHeadersTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._requestHeadersTreeElement);this._decodeRequestParameters=true;this._showRequestHeadersText=false;this._showResponseHeadersText=false;this._queryStringTreeElement=new TreeElement("",null,true);this._queryStringTreeElement.expanded=true;this._queryStringTreeElement.selectable=false;this._queryStringTreeElement.hidden=true;this._headersTreeOutline.appendChild(this._queryStringTreeElement);this._formDataTreeElement=new TreeElement("",null,true);this._formDataTreeElement.expanded=true;this._formDataTreeElement.selectable=false;this._formDataTreeElement.hidden=true;this._headersTreeOutline.appendChild(this._formDataTreeElement);this._requestPayloadTreeElement=new TreeElement(WebInspector.UIString("Request Payload"),null,true);this._requestPayloadTreeElement.expanded=true;this._requestPayloadTreeElement.selectable=false;this._requestPayloadTreeElement.hidden=true;this._headersTreeOutline.appendChild(this._requestPayloadTreeElement);this._responseHeadersTreeElement=new TreeElement("",null,true);this._responseHeadersTreeElement.expanded=true;this._responseHeadersTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._responseHeadersTreeElement);}
+WebInspector.RequestHeadersView.prototype={wasShown:function()
+{this._request.addEventListener(WebInspector.NetworkRequest.Events.RemoteAddressChanged,this._refreshRemoteAddress,this);this._request.addEventListener(WebInspector.NetworkRequest.Events.RequestHeadersChanged,this._refreshRequestHeaders,this);this._request.addEventListener(WebInspector.NetworkRequest.Events.ResponseHeadersChanged,this._refreshResponseHeaders,this);this._request.addEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._refreshHTTPInformation,this);this._refreshURL();this._refreshQueryString();this._refreshRequestHeaders();this._refreshResponseHeaders();this._refreshHTTPInformation();this._refreshRemoteAddress();},willHide:function()
+{this._request.removeEventListener(WebInspector.NetworkRequest.Events.RemoteAddressChanged,this._refreshRemoteAddress,this);this._request.removeEventListener(WebInspector.NetworkRequest.Events.RequestHeadersChanged,this._refreshRequestHeaders,this);this._request.removeEventListener(WebInspector.NetworkRequest.Events.ResponseHeadersChanged,this._refreshResponseHeaders,this);this._request.removeEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._refreshHTTPInformation,this);},_formatHeader:function(name,value)
+{var fragment=document.createDocumentFragment();fragment.createChild("div","header-name").textContent=name+":";fragment.createChild("div","header-value source-code").textContent=value;return fragment;},_formatParameter:function(value,className,decodeParameters)
+{var errorDecoding=false;if(decodeParameters){value=value.replace(/\+/g," ");if(value.indexOf("%")>=0){try{value=decodeURIComponent(value);}catch(e){errorDecoding=true;}}}
+var div=document.createElement("div");div.className=className;if(errorDecoding)
+div.createChild("span","error-message").textContent=WebInspector.UIString("(unable to decode value)");else
+div.textContent=value;return div;},_refreshURL:function()
+{this._urlTreeElement.title=this._formatHeader(WebInspector.UIString("Request URL"),this._request.url);},_refreshQueryString:function()
+{var queryString=this._request.queryString();var queryParameters=this._request.queryParameters;this._queryStringTreeElement.hidden=!queryParameters;if(queryParameters)
+this._refreshParams(WebInspector.UIString("Query String Parameters"),queryParameters,queryString,this._queryStringTreeElement);},_refreshFormData:function()
+{this._formDataTreeElement.hidden=true;this._requestPayloadTreeElement.hidden=true;var formData=this._request.requestFormData;if(!formData)
+return;var formParameters=this._request.formParameters;if(formParameters){this._formDataTreeElement.hidden=false;this._refreshParams(WebInspector.UIString("Form Data"),formParameters,formData,this._formDataTreeElement);}else{this._requestPayloadTreeElement.hidden=false;try{var json=JSON.parse(formData);this._refreshRequestJSONPayload(json,formData);}catch(e){this._populateTreeElementWithSourceText(this._requestPayloadTreeElement,formData);}}},_populateTreeElementWithSourceText:function(treeElement,sourceText)
+{var sourceTextElement=document.createElement("span");sourceTextElement.classList.add("header-value");sourceTextElement.classList.add("source-code");sourceTextElement.textContent=String(sourceText||"").trim();var sourceTreeElement=new TreeElement(sourceTextElement);sourceTreeElement.selectable=false;treeElement.removeChildren();treeElement.appendChild(sourceTreeElement);},_refreshParams:function(title,params,sourceText,paramsTreeElement)
+{paramsTreeElement.removeChildren();paramsTreeElement.listItemElement.removeChildren();paramsTreeElement.listItemElement.appendChild(document.createTextNode(title));var headerCount=document.createElement("span");headerCount.classList.add("header-count");headerCount.textContent=WebInspector.UIString(" (%d)",params.length);paramsTreeElement.listItemElement.appendChild(headerCount);function toggleViewSource(event)
+{paramsTreeElement._viewSource=!paramsTreeElement._viewSource;this._refreshParams(title,params,sourceText,paramsTreeElement);}
+paramsTreeElement.listItemElement.appendChild(this._createViewSourceToggle(paramsTreeElement._viewSource,toggleViewSource.bind(this)));if(paramsTreeElement._viewSource){this._populateTreeElementWithSourceText(paramsTreeElement,sourceText);return;}
+var toggleTitle=this._decodeRequestParameters?WebInspector.UIString("view URL encoded"):WebInspector.UIString("view decoded");var toggleButton=this._createToggleButton(toggleTitle);toggleButton.addEventListener("click",this._toggleURLDecoding.bind(this),false);paramsTreeElement.listItemElement.appendChild(toggleButton);for(var i=0;i<params.length;++i){var paramNameValue=document.createDocumentFragment();var name=this._formatParameter(params[i].name+":","header-name",this._decodeRequestParameters);var value=this._formatParameter(params[i].value,"header-value source-code",this._decodeRequestParameters);paramNameValue.appendChild(name);paramNameValue.appendChild(value);var parmTreeElement=new TreeElement(paramNameValue,null,false);parmTreeElement.selectable=false;paramsTreeElement.appendChild(parmTreeElement);}},_refreshRequestJSONPayload:function(parsedObject,sourceText)
+{var treeElement=this._requestPayloadTreeElement;treeElement.removeChildren();var listItem=this._requestPayloadTreeElement.listItemElement;listItem.removeChildren();listItem.appendChild(document.createTextNode(this._requestPayloadTreeElement.title));function toggleViewSource(event)
+{treeElement._viewSource=!treeElement._viewSource;this._refreshRequestJSONPayload(parsedObject,sourceText);}
+listItem.appendChild(this._createViewSourceToggle(treeElement._viewSource,toggleViewSource.bind(this)));if(treeElement._viewSource){this._populateTreeElementWithSourceText(this._requestPayloadTreeElement,sourceText);}else{var object=WebInspector.RemoteObject.fromLocalObject(parsedObject);var section=new WebInspector.ObjectPropertiesSection(object,object.description);section.expand();section.editable=false;listItem.appendChild(section.element);}},_createViewSourceToggle:function(viewSource,handler)
+{var viewSourceToggleTitle=viewSource?WebInspector.UIString("view parsed"):WebInspector.UIString("view source");var viewSourceToggleButton=this._createToggleButton(viewSourceToggleTitle);viewSourceToggleButton.addEventListener("click",handler,false);return viewSourceToggleButton;},_toggleURLDecoding:function(event)
+{this._decodeRequestParameters=!this._decodeRequestParameters;this._refreshQueryString();this._refreshFormData();},_refreshRequestHeaders:function()
+{var treeElement=this._requestHeadersTreeElement;var headers=this._request.requestHeaders();headers=headers.slice();headers.sort(function(a,b){return a.name.toLowerCase().compareTo(b.name.toLowerCase())});var headersText=this._request.requestHeadersText();if(this._showRequestHeadersText&&headersText)
+this._refreshHeadersText(WebInspector.UIString("Request Headers"),headers.length,headersText,treeElement);else
+this._refreshHeaders(WebInspector.UIString("Request Headers"),headers,treeElement);if(headersText===undefined){var caution=WebInspector.UIString(" CAUTION: Provisional headers are shown.");treeElement.listItemElement.createChild("span","caution").textContent=caution;}
+if(headersText){var toggleButton=this._createHeadersToggleButton(this._showRequestHeadersText);toggleButton.addEventListener("click",this._toggleRequestHeadersText.bind(this),false);treeElement.listItemElement.appendChild(toggleButton);}
+this._refreshFormData();},_refreshResponseHeaders:function()
+{var treeElement=this._responseHeadersTreeElement;var headers=this._request.sortedResponseHeaders;var headersText=this._request.responseHeadersText;if(this._showResponseHeadersText)
+this._refreshHeadersText(WebInspector.UIString("Response Headers"),headers.length,headersText,treeElement);else
+this._refreshHeaders(WebInspector.UIString("Response Headers"),headers,treeElement);if(headersText){var toggleButton=this._createHeadersToggleButton(this._showResponseHeadersText);toggleButton.addEventListener("click",this._toggleResponseHeadersText.bind(this),false);treeElement.listItemElement.appendChild(toggleButton);}},_refreshHTTPInformation:function()
+{var requestMethodElement=this._requestMethodTreeElement;requestMethodElement.hidden=!this._request.statusCode;var statusCodeElement=this._statusCodeTreeElement;statusCodeElement.hidden=!this._request.statusCode;if(this._request.statusCode){var statusCodeFragment=document.createDocumentFragment();statusCodeFragment.createChild("div","header-name").textContent=WebInspector.UIString("Status Code")+":";var statusCodeImage=statusCodeFragment.createChild("div","resource-status-image");statusCodeImage.title=this._request.statusCode+" "+this._request.statusText;if(this._request.statusCode<300||this._request.statusCode===304)
+statusCodeImage.classList.add("green-ball");else if(this._request.statusCode<400)
+statusCodeImage.classList.add("orange-ball");else
+statusCodeImage.classList.add("red-ball");requestMethodElement.title=this._formatHeader(WebInspector.UIString("Request Method"),this._request.requestMethod);var value=statusCodeFragment.createChild("div","header-value source-code");value.textContent=this._request.statusCode+" "+this._request.statusText;if(this._request.cached)
+value.createChild("span","status-from-cache").textContent=" "+WebInspector.UIString("(from cache)");statusCodeElement.title=statusCodeFragment;}},_refreshHeadersTitle:function(title,headersTreeElement,headersLength)
+{headersTreeElement.listItemElement.removeChildren();headersTreeElement.listItemElement.createTextChild(title);var headerCount=WebInspector.UIString(" (%d)",headersLength);headersTreeElement.listItemElement.createChild("span","header-count").textContent=headerCount;},_refreshHeaders:function(title,headers,headersTreeElement)
+{headersTreeElement.removeChildren();var length=headers.length;this._refreshHeadersTitle(title,headersTreeElement,length);headersTreeElement.hidden=!length;for(var i=0;i<length;++i){var headerTreeElement=new TreeElement(this._formatHeader(headers[i].name,headers[i].value));headerTreeElement.selectable=false;headersTreeElement.appendChild(headerTreeElement);}},_refreshHeadersText:function(title,count,headersText,headersTreeElement)
+{this._populateTreeElementWithSourceText(headersTreeElement,headersText);this._refreshHeadersTitle(title,headersTreeElement,count);},_refreshRemoteAddress:function()
+{var remoteAddress=this._request.remoteAddress();var treeElement=this._remoteAddressTreeElement;treeElement.hidden=!remoteAddress;if(remoteAddress)
+treeElement.title=this._formatHeader(WebInspector.UIString("Remote Address"),remoteAddress);},_toggleRequestHeadersText:function(event)
+{this._showRequestHeadersText=!this._showRequestHeadersText;this._refreshRequestHeaders();},_toggleResponseHeadersText:function(event)
+{this._showResponseHeadersText=!this._showResponseHeadersText;this._refreshResponseHeaders();},_createToggleButton:function(title)
+{var button=document.createElement("span");button.classList.add("header-toggle");button.textContent=title;return button;},_createHeadersToggleButton:function(isHeadersTextShown)
+{var toggleTitle=isHeadersTextShown?WebInspector.UIString("view parsed"):WebInspector.UIString("view source");return this._createToggleButton(toggleTitle);},__proto__:WebInspector.VBox.prototype};WebInspector.RequestHTMLView=function(request,dataURL)
+{WebInspector.RequestView.call(this,request);this._dataURL=dataURL;this.element.classList.add("html");}
+WebInspector.RequestHTMLView.prototype={hasContent:function()
+{return true;},wasShown:function()
+{this._createIFrame();},willHide:function(parentElement)
+{this.element.removeChildren();},_createIFrame:function()
+{this.element.removeChildren();var iframe=document.createElement("iframe");iframe.setAttribute("sandbox","");iframe.setAttribute("src",this._dataURL);this.element.appendChild(iframe);},__proto__:WebInspector.RequestView.prototype};WebInspector.RequestJSONView=function(request,parsedJSON)
+{WebInspector.RequestView.call(this,request);this._parsedJSON=parsedJSON;this.element.classList.add("json");}
+WebInspector.RequestJSONView.parseJSON=function(text)
+{var prefix="";var start=/[{[]/.exec(text);if(start&&start.index){prefix=text.substring(0,start.index);text=text.substring(start.index);}
+try{return new WebInspector.ParsedJSON(JSON.parse(text),prefix,"");}catch(e){return;}}
+WebInspector.RequestJSONView.parseJSONP=function(text)
+{var start=text.indexOf("(");var end=text.lastIndexOf(")");if(start==-1||end==-1||end<start)
+return;var prefix=text.substring(0,start+1);var suffix=text.substring(end);text=text.substring(start+1,end);try{return new WebInspector.ParsedJSON(JSON.parse(text),prefix,suffix);}catch(e){return;}}
+WebInspector.RequestJSONView.prototype={hasContent:function()
+{return true;},wasShown:function()
+{this._initialize();},_initialize:function()
+{if(this._initialized)
+return;this._initialized=true;var obj=WebInspector.RemoteObject.fromLocalObject(this._parsedJSON.data);var title=this._parsedJSON.prefix+obj.description+this._parsedJSON.suffix;var section=new WebInspector.ObjectPropertiesSection(obj,title);section.expand();section.editable=false;this.element.appendChild(section.element);},__proto__:WebInspector.RequestView.prototype}
+WebInspector.ParsedJSON=function(data,prefix,suffix)
+{this.data=data;this.prefix=prefix;this.suffix=suffix;};WebInspector.RequestPreviewView=function(request,responseView)
+{WebInspector.RequestContentView.call(this,request);this._responseView=responseView;}
+WebInspector.RequestPreviewView.prototype={contentLoaded:function()
+{if(!this.request.content&&!this.request.contentError()){if(!this._emptyView){this._emptyView=this._createEmptyView();this._emptyView.show(this.element);this.innerView=this._emptyView;}}else{if(this._emptyView){this._emptyView.detach();delete this._emptyView;}
+if(!this._previewView)
+this._previewView=this._createPreviewView();this._previewView.show(this.element);this.innerView=this._previewView;}},_createEmptyView:function()
+{return this._createMessageView(WebInspector.UIString("This request has no preview available."));},_createMessageView:function(message)
+{return new WebInspector.EmptyView(message);},_jsonView:function()
+{var parsedJSON=WebInspector.RequestJSONView.parseJSON(this.request.content);if(parsedJSON)
+return new WebInspector.RequestJSONView(this.request,parsedJSON);},_htmlView:function()
+{var dataURL=this.request.asDataURL();if(dataURL!==null)
+return new WebInspector.RequestHTMLView(this.request,dataURL);},_createPreviewView:function()
+{if(this.request.contentError())
+return this._createMessageView(WebInspector.UIString("Failed to load response data"));var jsonMediaTypeRE=/^application\/[^;]*\+json/;if(this.request.mimeType==="application/json"||jsonMediaTypeRE.test(this.request.mimeType)){var jsonView=this._jsonView();if(jsonView)
+return jsonView;}
+if(this.request.hasErrorStatusCode()){var htmlView=this._htmlView();if(htmlView)
+return htmlView;}
+if(this.request.type===WebInspector.resourceTypes.XHR){var jsonView=this._jsonView();if(jsonView)
+return jsonView;}
+if(this.request.type===WebInspector.resourceTypes.XHR&&this.request.mimeType==="text/html"){var htmlView=this._htmlView();if(htmlView)
+return htmlView;}
+if(this._responseView.sourceView)
+return this._responseView.sourceView;if(this.request.type===WebInspector.resourceTypes.Other)
+return this._createEmptyView();return WebInspector.RequestView.nonSourceViewForRequest(this.request);},__proto__:WebInspector.RequestContentView.prototype};WebInspector.RequestResponseView=function(request)
+{WebInspector.RequestContentView.call(this,request);}
+WebInspector.RequestResponseView._maxFormattedResourceSize=100000;WebInspector.RequestResponseView.prototype={get sourceView()
+{if(this._sourceView||!WebInspector.RequestView.hasTextContent(this.request))
+return this._sourceView;if(this.request.resourceSize>=WebInspector.RequestResponseView._maxFormattedResourceSize){this._sourceView=new WebInspector.ResourceSourceFrameFallback(this.request);return this._sourceView;}
+var sourceFrame=new WebInspector.ResourceSourceFrame(this.request);sourceFrame.setHighlighterType(this.request.type.canonicalMimeType()||this.request.mimeType);this._sourceView=sourceFrame;return this._sourceView;},_createMessageView:function(message)
+{return new WebInspector.EmptyView(message);},contentLoaded:function()
+{if((!this.request.content||!this.sourceView)&&!this.request.contentError()){if(!this._emptyView){this._emptyView=this._createMessageView(WebInspector.UIString("This request has no response data available."));this._emptyView.show(this.element);this.innerView=this._emptyView;}}else{if(this._emptyView){this._emptyView.detach();delete this._emptyView;}
+if(this.request.content&&this.sourceView){this.sourceView.show(this.element);this.innerView=this.sourceView;}else{if(!this._errorView)
+this._errorView=this._createMessageView(WebInspector.UIString("Failed to load response data"));this._errorView.show(this.element);this.innerView=this._errorView;}}},__proto__:WebInspector.RequestContentView.prototype};WebInspector.RequestTimingView=function(request)
+{WebInspector.VBox.call(this);this.element.classList.add("resource-timing-view");this._request=request;}
+WebInspector.RequestTimingView.prototype={wasShown:function()
+{this._request.addEventListener(WebInspector.NetworkRequest.Events.TimingChanged,this._refresh,this);this._request.addEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._refresh,this);if(!this._request.timing){if(!this._emptyView){this._emptyView=new WebInspector.EmptyView(WebInspector.UIString("This request has no detailed timing info."));this._emptyView.show(this.element);this.innerView=this._emptyView;}
+return;}
+if(this._emptyView){this._emptyView.detach();delete this._emptyView;}
+this._refresh();},willHide:function()
+{this._request.removeEventListener(WebInspector.NetworkRequest.Events.TimingChanged,this._refresh,this);this._request.removeEventListener(WebInspector.NetworkRequest.Events.FinishedLoading,this._refresh,this);},_refresh:function()
+{if(this._tableElement)
+this._tableElement.remove();this._tableElement=WebInspector.RequestTimingView.createTimingTable(this._request);this.element.appendChild(this._tableElement);},__proto__:WebInspector.VBox.prototype}
+WebInspector.RequestTimingView.createTimingTable=function(request)
+{var tableElement=document.createElement("table");tableElement.className="network-timing-table";var rows=[];function addRow(title,className,start,end)
+{var row={};row.title=title;row.className=className;row.start=start;row.end=end;rows.push(row);}
+function firstPositive(numbers)
+{for(var i=0;i<numbers.length;++i){if(numbers[i]>0)
+return numbers[i];}
+return undefined;}
+var timing=request.timing;var blocking=firstPositive([timing.dnsStart,timing.connectStart,timing.sendStart]);var endTime=firstPositive([request.endTime,request.responseReceivedTime,timing.requestTime]);var total=(endTime-timing.requestTime)*1000;if(blocking>0)
+addRow(WebInspector.UIString("Blocking"),"blocking",0,blocking);if(timing.proxyStart!==-1)
+addRow(WebInspector.UIString("Proxy"),"proxy",timing.proxyStart,timing.proxyEnd);if(timing.dnsStart!==-1)
+addRow(WebInspector.UIString("DNS Lookup"),"dns",timing.dnsStart,timing.dnsEnd);if(timing.connectStart!==-1)
+addRow(WebInspector.UIString("Connecting"),"connecting",timing.connectStart,timing.connectEnd);if(timing.sslStart!==-1)
+addRow(WebInspector.UIString("SSL"),"ssl",timing.sslStart,timing.sslEnd);addRow(WebInspector.UIString("Sending"),"sending",timing.sendStart,timing.sendEnd);addRow(WebInspector.UIString("Waiting"),"waiting",timing.sendEnd,timing.receiveHeadersEnd);if(request.endTime!==-1)
+addRow(WebInspector.UIString("Receiving"),"receiving",(request.responseReceivedTime-timing.requestTime)*1000,total);const chartWidth=200;var scale=chartWidth/total;for(var i=0;i<rows.length;++i){var tr=document.createElement("tr");tableElement.appendChild(tr);var td=document.createElement("td");td.textContent=rows[i].title;tr.appendChild(td);td=document.createElement("td");td.width=chartWidth+"px";var row=document.createElement("div");row.className="network-timing-row";td.appendChild(row);var bar=document.createElement("span");bar.className="network-timing-bar "+rows[i].className;bar.style.left=Math.floor(scale*rows[i].start)+"px";bar.style.right=Math.floor(scale*(total-rows[i].end))+"px";bar.style.backgroundColor=rows[i].color;bar.textContent="\u200B";row.appendChild(bar);var title=document.createElement("span");title.className="network-timing-bar-title";if(total-rows[i].end<rows[i].start)
+title.style.right=(scale*(total-rows[i].end)+3)+"px";else
+title.style.left=(scale*rows[i].start+3)+"px";title.textContent=Number.secondsToString((rows[i].end-rows[i].start)/1000,true);row.appendChild(title);tr.appendChild(td);}
+if(!request.finished){var cell=tableElement.createChild("tr").createChild("td","caution");cell.colSpan=2;cell.createTextChild(WebInspector.UIString("CAUTION: request is not finished yet!"));}
+return tableElement;};WebInspector.ResourceWebSocketFrameView=function(resource)
+{WebInspector.VBox.call(this);this.element.classList.add("resource-websocket");this.resource=resource;this.element.removeChildren();this._dataGrid=new WebInspector.DataGrid([{id:"data",title:WebInspector.UIString("Data"),sortable:false,weight:88,longText:true},{id:"length",title:WebInspector.UIString("Length"),sortable:false,alig:WebInspector.DataGrid.Align.Right,weight:5},{id:"time",title:WebInspector.UIString("Time"),weight:7}],undefined,undefined,undefined,this._onContextMenu.bind(this));this.refresh();this._dataGrid.setName("ResourceWebSocketFrameView");this._dataGrid.show(this.element);}
+WebInspector.ResourceWebSocketFrameView.OpCodes={ContinuationFrame:0,TextFrame:1,BinaryFrame:2,ConnectionCloseFrame:8,PingFrame:9,PongFrame:10};WebInspector.ResourceWebSocketFrameView.prototype={appendFrame:function(frame)
+{var payload=frame;var date=new Date(payload.time*1000);var row={data:"",length:typeof payload.payloadData==="undefined"?payload.errorMessage.length.toString():payload.payloadData.length.toString(),time:date.toLocaleTimeString()};var rowClass="";if(payload.errorMessage){rowClass="error";row.data=payload.errorMessage;}else if(payload.opcode==WebInspector.ResourceWebSocketFrameView.OpCodes.TextFrame){if(payload.sent)
+rowClass="outcoming";row.data=payload.payloadData;}else{rowClass="opcode";var opcodeMeaning="";switch(payload.opcode){case WebInspector.ResourceWebSocketFrameView.OpCodes.ContinuationFrame:opcodeMeaning=WebInspector.UIString("Continuation Frame");break;case WebInspector.ResourceWebSocketFrameView.OpCodes.BinaryFrame:opcodeMeaning=WebInspector.UIString("Binary Frame");break;case WebInspector.ResourceWebSocketFrameView.OpCodes.ConnectionCloseFrame:opcodeMeaning=WebInspector.UIString("Connection Close Frame");break;case WebInspector.ResourceWebSocketFrameView.OpCodes.PingFrame:opcodeMeaning=WebInspector.UIString("Ping Frame");break;case WebInspector.ResourceWebSocketFrameView.OpCodes.PongFrame:opcodeMeaning=WebInspector.UIString("Pong Frame");break;}
+row.data=WebInspector.UIString("%s (Opcode %d%s)",opcodeMeaning,payload.opcode,(payload.mask?", mask":""));}
+var node=new WebInspector.DataGridNode(row,false);this._dataGrid.rootNode().appendChild(node);if(rowClass)
+node.element.classList.add("resource-websocket-row-"+rowClass);},refresh:function()
+{this._dataGrid.rootNode().removeChildren();var frames=this.resource.frames();for(var i=frames.length-1;i>=0;i--){this.appendFrame(frames[i]);}},show:function(parentElement,insertBefore)
+{this.refresh();WebInspector.View.prototype.show.call(this,parentElement,insertBefore);},_onContextMenu:function(contextMenu,node)
+{contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy message":"Copy Message"),this._copyMessage.bind(this,node.data));},_copyMessage:function(row)
+{InspectorFrontendHost.copyText(row.data);},__proto__:WebInspector.VBox.prototype};WebInspector.NetworkLogView=function(filterBar,coulmnsVisibilitySetting)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("networkLogView.css");this.registerRequiredCSS("filter.css");this.registerRequiredCSS("textPrompt.css");this._filterBar=filterBar;this._coulmnsVisibilitySetting=coulmnsVisibilitySetting;this._allowRequestSelection=false;this._requests=[];this._requestsById={};this._requestsByURL={};this._staleRequests={};this._requestGridNodes={};this._lastRequestGridNodeId=0;this._mainRequestLoadTime=-1;this._mainRequestDOMContentLoadedTime=-1;this._matchedRequests=[];this._highlightedSubstringChanges=[];this._filteredOutRequests=new Map();this._filters=[];this._matchedRequestsMap={};this._currentMatchedRequestIndex=-1;this._createStatusbarButtons();this._createStatusBarItems();this._linkifier=new WebInspector.Linkifier();WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted,this._onRequestStarted,this);WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestUpdated,this._onRequestUpdated,this);WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished,this._onRequestUpdated,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage,this._willReloadPage,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._mainFrameNavigated,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._loadEventFired,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded,this._domContentLoadedEventFired,this);this._addFilters();this._resetSuggestionBuilder();this._initializeView();this._recordButton.toggled=true;WebInspector.networkLog.requests.forEach(this._appendRequest.bind(this));}
+WebInspector.NetworkLogView.HTTPSchemas={"http":true,"https":true,"ws":true,"wss":true};WebInspector.NetworkLogView._responseHeaderColumns=["Cache-Control","Connection","Content-Encoding","Content-Length","ETag","Keep-Alive","Last-Modified","Server","Vary"];WebInspector.NetworkLogView._defaultColumnsVisibility={method:true,status:true,scheme:false,domain:false,remoteAddress:false,type:true,initiator:true,cookies:false,setCookies:false,size:true,time:true,"Cache-Control":false,"Connection":false,"Content-Encoding":false,"Content-Length":false,"ETag":false,"Keep-Alive":false,"Last-Modified":false,"Server":false,"Vary":false};WebInspector.NetworkLogView._defaultRefreshDelay=500;WebInspector.NetworkLogView.prototype={_addFilters:function()
+{this._textFilterUI=new WebInspector.TextFilterUI();this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._filterChanged,this);this._filterBar.addFilter(this._textFilterUI);var types=[];for(var typeId in WebInspector.resourceTypes){var resourceType=WebInspector.resourceTypes[typeId];types.push({name:resourceType.name(),label:resourceType.categoryTitle()});}
+this._resourceTypeFilterUI=new WebInspector.NamedBitSetFilterUI(types,WebInspector.settings.networkResourceTypeFilters);this._resourceTypeFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._filterChanged.bind(this),this);this._filterBar.addFilter(this._resourceTypeFilterUI);var dataURLSetting=WebInspector.settings.networkHideDataURL;this._dataURLFilterUI=new WebInspector.CheckboxFilterUI("hide-data-url",WebInspector.UIString("Hide data URLs"),true,dataURLSetting);this._dataURLFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._filterChanged.bind(this),this);this._filterBar.addFilter(this._dataURLFilterUI);},_resetSuggestionBuilder:function()
+{this._suggestionBuilder=new WebInspector.FilterSuggestionBuilder(WebInspector.NetworkPanel._searchKeys);this._textFilterUI.setSuggestionBuilder(this._suggestionBuilder);},_filterChanged:function(event)
+{this._removeAllNodeHighlights();this.searchCanceled();this._parseFilterQuery(this._textFilterUI.value());this._filterRequests();},_initializeView:function()
+{this.element.id="network-container";this._createSortingFunctions();this._createTable();this._createTimelineGrid();this._summaryBarElement=this.element.createChild("div","network-summary-bar");if(!this.useLargeRows)
+this._setLargerRequests(this.useLargeRows);this._allowPopover=true;this._popoverHelper=new WebInspector.PopoverHelper(this.element,this._getPopoverAnchor.bind(this),this._showPopover.bind(this),this._onHidePopover.bind(this));this._popoverHelper.setTimeout(100);this.calculator=new WebInspector.NetworkTransferTimeCalculator();this.switchToDetailedView();},get statusBarItems()
+{return[this._recordButton.element,this._clearButton.element,this._filterBar.filterButton().element,this._largerRequestsButton.element,this._preserveLogCheckbox.element,this._progressBarContainer];},get useLargeRows()
+{return WebInspector.settings.resourcesLargeRows.get();},set allowPopover(flag)
+{this._allowPopover=flag;},elementsToRestoreScrollPositionsFor:function()
+{if(!this._dataGrid)
+return[];return[this._dataGrid.scrollContainer];},_createTimelineGrid:function()
+{this._timelineGrid=new WebInspector.TimelineGrid();this._timelineGrid.element.classList.add("network-timeline-grid");this._dataGrid.element.appendChild(this._timelineGrid.element);},_createTable:function()
+{var columns=[];columns.push({id:"name",titleDOMFragment:this._makeHeaderFragment(WebInspector.UIString("Name"),WebInspector.UIString("Path")),title:WebInspector.UIString("Name"),sortable:true,weight:20,disclosure:true});columns.push({id:"method",title:WebInspector.UIString("Method"),sortable:true,weight:6});columns.push({id:"status",titleDOMFragment:this._makeHeaderFragment(WebInspector.UIString("Status"),WebInspector.UIString("Text")),title:WebInspector.UIString("Status"),sortable:true,weight:6});columns.push({id:"scheme",title:WebInspector.UIString("Scheme"),sortable:true,weight:6});columns.push({id:"domain",title:WebInspector.UIString("Domain"),sortable:true,weight:6});columns.push({id:"remoteAddress",title:WebInspector.UIString("Remote Address"),sortable:true,weight:10,align:WebInspector.DataGrid.Align.Right});columns.push({id:"type",title:WebInspector.UIString("Type"),sortable:true,weight:6});columns.push({id:"initiator",title:WebInspector.UIString("Initiator"),sortable:true,weight:10});columns.push({id:"cookies",title:WebInspector.UIString("Cookies"),sortable:true,weight:6,align:WebInspector.DataGrid.Align.Right});columns.push({id:"setCookies",title:WebInspector.UIString("Set-Cookies"),sortable:true,weight:6,align:WebInspector.DataGrid.Align.Right});columns.push({id:"size",titleDOMFragment:this._makeHeaderFragment(WebInspector.UIString("Size"),WebInspector.UIString("Content")),title:WebInspector.UIString("Size"),sortable:true,weight:6,align:WebInspector.DataGrid.Align.Right});columns.push({id:"time",titleDOMFragment:this._makeHeaderFragment(WebInspector.UIString("Time"),WebInspector.UIString("Latency")),title:WebInspector.UIString("Time"),sortable:true,weight:6,align:WebInspector.DataGrid.Align.Right});var responseHeaderColumns=WebInspector.NetworkLogView._responseHeaderColumns;for(var i=0;i<responseHeaderColumns.length;++i){var headerName=responseHeaderColumns[i];var descriptor={id:headerName,title:WebInspector.UIString(headerName),weight:6}
+if(headerName==="Content-Length")
+descriptor.align=WebInspector.DataGrid.Align.Right;columns.push(descriptor);}
+columns.push({id:"timeline",titleDOMFragment:document.createDocumentFragment(),title:WebInspector.UIString("Timeline"),sortable:false,weight:40,sort:WebInspector.DataGrid.Order.Ascending});this._dataGrid=new WebInspector.DataGrid(columns);this._dataGrid.setName("networkLog");this._dataGrid.resizeMethod=WebInspector.DataGrid.ResizeMethod.Last;this._dataGrid.element.classList.add("network-log-grid");this._dataGrid.element.addEventListener("contextmenu",this._contextMenu.bind(this),true);this._dataGrid.show(this.element);this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged,this._sortItems,this);this._dataGrid.addEventListener(WebInspector.DataGrid.Events.ColumnsResized,this._updateDividersIfNeeded,this);this._patchTimelineHeader();},_makeHeaderFragment:function(title,subtitle)
+{var fragment=document.createDocumentFragment();fragment.createTextChild(title);var subtitleDiv=fragment.createChild("div","network-header-subtitle");subtitleDiv.createTextChild(subtitle);return fragment;},_patchTimelineHeader:function()
+{var timelineSorting=document.createElement("select");var option=document.createElement("option");option.value="startTime";option.label=WebInspector.UIString("Timeline");timelineSorting.appendChild(option);option=document.createElement("option");option.value="startTime";option.label=WebInspector.UIString("Start Time");timelineSorting.appendChild(option);option=document.createElement("option");option.value="responseTime";option.label=WebInspector.UIString("Response Time");timelineSorting.appendChild(option);option=document.createElement("option");option.value="endTime";option.label=WebInspector.UIString("End Time");timelineSorting.appendChild(option);option=document.createElement("option");option.value="duration";option.label=WebInspector.UIString("Duration");timelineSorting.appendChild(option);option=document.createElement("option");option.value="latency";option.label=WebInspector.UIString("Latency");timelineSorting.appendChild(option);var header=this._dataGrid.headerTableHeader("timeline");header.replaceChild(timelineSorting,header.firstChild);timelineSorting.addEventListener("click",function(event){event.consume()},false);timelineSorting.addEventListener("change",this._sortByTimeline.bind(this),false);this._timelineSortSelector=timelineSorting;},_createSortingFunctions:function()
+{this._sortingFunctions={};this._sortingFunctions.name=WebInspector.NetworkDataGridNode.NameComparator;this._sortingFunctions.method=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"method",false);this._sortingFunctions.status=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"statusCode",false);this._sortingFunctions.scheme=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"scheme",false);this._sortingFunctions.domain=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"domain",false);this._sortingFunctions.remoteAddress=WebInspector.NetworkDataGridNode.RemoteAddressComparator;this._sortingFunctions.type=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"mimeType",false);this._sortingFunctions.initiator=WebInspector.NetworkDataGridNode.InitiatorComparator;this._sortingFunctions.cookies=WebInspector.NetworkDataGridNode.RequestCookiesCountComparator;this._sortingFunctions.setCookies=WebInspector.NetworkDataGridNode.ResponseCookiesCountComparator;this._sortingFunctions.size=WebInspector.NetworkDataGridNode.SizeComparator;this._sortingFunctions.time=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"duration",false);this._sortingFunctions.timeline=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"startTime",false);this._sortingFunctions.startTime=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"startTime",false);this._sortingFunctions.endTime=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"endTime",false);this._sortingFunctions.responseTime=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"responseReceivedTime",false);this._sortingFunctions.duration=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"duration",true);this._sortingFunctions.latency=WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null,"latency",true);var timeCalculator=new WebInspector.NetworkTransferTimeCalculator();var durationCalculator=new WebInspector.NetworkTransferDurationCalculator();this._calculators={};this._calculators.timeline=timeCalculator;this._calculators.startTime=timeCalculator;this._calculators.endTime=timeCalculator;this._calculators.responseTime=timeCalculator;this._calculators.duration=durationCalculator;this._calculators.latency=durationCalculator;},_sortItems:function()
+{this._removeAllNodeHighlights();var columnIdentifier=this._dataGrid.sortColumnIdentifier();if(columnIdentifier==="timeline"){this._sortByTimeline();return;}
+var sortingFunction=this._sortingFunctions[columnIdentifier];if(!sortingFunction)
+return;this._dataGrid.sortNodes(sortingFunction,!this._dataGrid.isSortOrderAscending());this._timelineSortSelector.selectedIndex=0;this._updateRows();this.searchCanceled();WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.NetworkSort,column:columnIdentifier,sortOrder:this._dataGrid.sortOrder()});},_sortByTimeline:function()
+{this._removeAllNodeHighlights();var selectedIndex=this._timelineSortSelector.selectedIndex;if(!selectedIndex)
+selectedIndex=1;var selectedOption=this._timelineSortSelector[selectedIndex];var value=selectedOption.value;var sortingFunction=this._sortingFunctions[value];this._dataGrid.sortNodes(sortingFunction);this.calculator=this._calculators[value];if(this.calculator.startAtZero)
+this._timelineGrid.hideEventDividers();else
+this._timelineGrid.showEventDividers();this._dataGrid.markColumnAsSortedBy("timeline",WebInspector.DataGrid.Order.Ascending);this._updateRows();},_createStatusBarItems:function()
+{this._progressBarContainer=document.createElement("div");this._progressBarContainer.className="status-bar-item";},_updateSummaryBar:function()
+{var requestsNumber=this._requests.length;if(!requestsNumber){if(this._summaryBarElement._isDisplayingWarning)
+return;this._summaryBarElement._isDisplayingWarning=true;this._summaryBarElement.removeChildren();this._summaryBarElement.createChild("div","warning-icon-small");var text=WebInspector.UIString("No requests captured. Reload the page to see detailed information on the network activity.");this._summaryBarElement.appendChild(document.createTextNode(text));this._summaryBarElement.title=text;return;}
+delete this._summaryBarElement._isDisplayingWarning;var transferSize=0;var selectedRequestsNumber=0;var selectedTransferSize=0;var baseTime=-1;var maxTime=-1;for(var i=0;i<this._requests.length;++i){var request=this._requests[i];var requestTransferSize=request.transferSize;transferSize+=requestTransferSize;if(!this._filteredOutRequests.get(request)){selectedRequestsNumber++;selectedTransferSize+=requestTransferSize;}
+if(request.url===WebInspector.resourceTreeModel.inspectedPageURL())
+baseTime=request.startTime;if(request.endTime>maxTime)
+maxTime=request.endTime;}
+var text="";if(selectedRequestsNumber!==requestsNumber){text+=String.sprintf(WebInspector.UIString("%d / %d requests"),selectedRequestsNumber,requestsNumber);text+="  \u2758  "+String.sprintf(WebInspector.UIString("%s / %s transferred"),Number.bytesToString(selectedTransferSize),Number.bytesToString(transferSize));}else{text+=String.sprintf(WebInspector.UIString("%d requests"),requestsNumber);text+="  \u2758  "+String.sprintf(WebInspector.UIString("%s transferred"),Number.bytesToString(transferSize));}
+if(baseTime!==-1&&this._mainRequestLoadTime!==-1&&this._mainRequestDOMContentLoadedTime!==-1&&this._mainRequestDOMContentLoadedTime>baseTime){text+="  \u2758  "+String.sprintf(WebInspector.UIString("%s (load: %s, DOMContentLoaded: %s)"),Number.secondsToString(maxTime-baseTime),Number.secondsToString(this._mainRequestLoadTime-baseTime),Number.secondsToString(this._mainRequestDOMContentLoadedTime-baseTime));}
+this._summaryBarElement.textContent=text;this._summaryBarElement.title=text;},_scheduleRefresh:function()
+{if(this._needsRefresh)
+return;this._needsRefresh=true;if(this.isShowing()&&!this._refreshTimeout)
+this._refreshTimeout=setTimeout(this.refresh.bind(this),WebInspector.NetworkLogView._defaultRefreshDelay);},_updateDividersIfNeeded:function()
+{if(!this._dataGrid)
+return;var timelineColumn=this._dataGrid.columns.timeline;for(var i=0;i<this._dataGrid.resizers.length;++i){if(timelineColumn.ordinal===this._dataGrid.resizers[i].rightNeighboringColumnIndex){this._timelineGrid.element.style.left=this._dataGrid.resizers[i].style.left;}}
+var proceed=true;if(!this.isShowing()){this._scheduleRefresh();proceed=false;}else{this.calculator.setDisplayWindow(this._timelineGrid.dividersElement.clientWidth);proceed=this._timelineGrid.updateDividers(this.calculator);}
+if(!proceed)
+return;if(this.calculator.startAtZero||!this.calculator.computePercentageFromEventTime){return;}
+this._timelineGrid.removeEventDividers();if(this._mainRequestLoadTime!==-1){var percent=this.calculator.computePercentageFromEventTime(this._mainRequestLoadTime);var loadDivider=document.createElement("div");loadDivider.className="network-event-divider network-red-divider";var loadDividerPadding=document.createElement("div");loadDividerPadding.className="network-event-divider-padding";loadDividerPadding.title=WebInspector.UIString("Load event");loadDividerPadding.appendChild(loadDivider);loadDividerPadding.style.left=percent+"%";this._timelineGrid.addEventDivider(loadDividerPadding);}
+if(this._mainRequestDOMContentLoadedTime!==-1){var percent=this.calculator.computePercentageFromEventTime(this._mainRequestDOMContentLoadedTime);var domContentLoadedDivider=document.createElement("div");domContentLoadedDivider.className="network-event-divider network-blue-divider";var domContentLoadedDividerPadding=document.createElement("div");domContentLoadedDividerPadding.className="network-event-divider-padding";domContentLoadedDividerPadding.title=WebInspector.UIString("DOMContentLoaded event");domContentLoadedDividerPadding.appendChild(domContentLoadedDivider);domContentLoadedDividerPadding.style.left=percent+"%";this._timelineGrid.addEventDivider(domContentLoadedDividerPadding);}},_refreshIfNeeded:function()
+{if(this._needsRefresh)
+this.refresh();},_invalidateAllItems:function()
+{for(var i=0;i<this._requests.length;++i){var request=this._requests[i];this._staleRequests[request.requestId]=request;}},get calculator()
+{return this._calculator;},set calculator(x)
+{if(!x||this._calculator===x)
+return;this._calculator=x;this._calculator.reset();this._invalidateAllItems();this.refresh();},_requestGridNode:function(request)
+{return this._requestGridNodes[request.__gridNodeId];},_createRequestGridNode:function(request)
+{var node=new WebInspector.NetworkDataGridNode(this,request);request.__gridNodeId=this._lastRequestGridNodeId++;this._requestGridNodes[request.__gridNodeId]=node;return node;},_createStatusbarButtons:function()
+{this._recordButton=new WebInspector.StatusBarButton(WebInspector.UIString("Record Network Log"),"record-profile-status-bar-item");this._recordButton.addEventListener("click",this._onRecordButtonClicked,this);this._clearButton=new WebInspector.StatusBarButton(WebInspector.UIString("Clear"),"clear-status-bar-item");this._clearButton.addEventListener("click",this._reset,this);this._largerRequestsButton=new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."),"network-larger-resources-status-bar-item");this._largerRequestsButton.toggled=WebInspector.settings.resourcesLargeRows.get();this._largerRequestsButton.addEventListener("click",this._toggleLargerRequests,this);this._preserveLogCheckbox=new WebInspector.StatusBarCheckbox(WebInspector.UIString("Preserve log"));this._preserveLogCheckbox.element.title=WebInspector.UIString("Do not clear log on page reload / navigation.");},_loadEventFired:function(event)
+{if(!this._recordButton.toggled)
+return;this._mainRequestLoadTime=event.data||-1;this._scheduleRefresh();},_domContentLoadedEventFired:function(event)
+{if(!this._recordButton.toggled)
+return;this._mainRequestDOMContentLoadedTime=event.data||-1;this._scheduleRefresh();},wasShown:function()
+{this._refreshIfNeeded();},willHide:function()
+{this._popoverHelper.hidePopover();},refresh:function()
+{this._needsRefresh=false;if(this._refreshTimeout){clearTimeout(this._refreshTimeout);delete this._refreshTimeout;}
+this._removeAllNodeHighlights();var wasScrolledToLastRow=this._dataGrid.isScrolledToLastRow();var boundariesChanged=false;if(this.calculator.updateBoundariesForEventTime){boundariesChanged=this.calculator.updateBoundariesForEventTime(this._mainRequestLoadTime)||boundariesChanged;boundariesChanged=this.calculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime)||boundariesChanged;}
+for(var requestId in this._staleRequests){var request=this._staleRequests[requestId];var node=this._requestGridNode(request);if(!node){node=this._createRequestGridNode(request);this._dataGrid.rootNode().appendChild(node);}
+node.refreshRequest();this._applyFilter(node);if(this.calculator.updateBoundaries(request))
+boundariesChanged=true;if(!node.isFilteredOut())
+this._updateHighlightIfMatched(request);}
+if(boundariesChanged){this._invalidateAllItems();}
+for(var requestId in this._staleRequests)
+this._requestGridNode(this._staleRequests[requestId]).refreshGraph(this.calculator);this._staleRequests={};this._sortItems();this._updateSummaryBar();this._dataGrid.updateWidths();if(wasScrolledToLastRow)
+this._dataGrid.scrollToLastRow();},_onRecordButtonClicked:function()
+{if(!this._recordButton.toggled)
+this._reset();this._recordButton.toggled=!this._recordButton.toggled;},_reset:function()
+{this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.ViewCleared);this._clearSearchMatchedList();if(this._popoverHelper)
+this._popoverHelper.hidePopover();if(this._calculator)
+this._calculator.reset();this._requests=[];this._requestsById={};this._requestsByURL={};this._staleRequests={};this._requestGridNodes={};this._resetSuggestionBuilder();if(this._dataGrid){this._dataGrid.rootNode().removeChildren();this._updateDividersIfNeeded();this._updateSummaryBar();}
+this._mainRequestLoadTime=-1;this._mainRequestDOMContentLoadedTime=-1;},get requests()
+{return this._requests;},_onRequestStarted:function(event)
+{if(this._recordButton.toggled)
+this._appendRequest(event.data);},_appendRequest:function(request)
+{this._requests.push(request);if(this._requestsById[request.requestId]){var oldRequest=request.redirects[request.redirects.length-1];this._requestsById[oldRequest.requestId]=oldRequest;this._updateSearchMatchedListAfterRequestIdChanged(request.requestId,oldRequest.requestId);}
+this._requestsById[request.requestId]=request;this._requestsByURL[request.url]=request;if(request.redirects){for(var i=0;i<request.redirects.length;++i)
+this._refreshRequest(request.redirects[i]);}
+this._refreshRequest(request);},_onRequestUpdated:function(event)
+{var request=(event.data);this._refreshRequest(request);},_refreshRequest:function(request)
+{if(!this._requestsById[request.requestId])
+return;this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.Domain,request.domain);this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.MimeType,request.mimeType);var responseHeaders=request.responseHeaders;for(var i=0,l=responseHeaders.length;i<l;++i)
+this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.HasResponseHeader,responseHeaders[i].name);var cookies=request.responseCookies;for(var i=0,l=cookies?cookies.length:0;i<l;++i){var cookie=cookies[i];this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.SetCookieDomain,cookie.domain());this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.SetCookieName,cookie.name());this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.SetCookieValue,cookie.value());}
+this._staleRequests[request.requestId]=request;this._scheduleRefresh();},_willReloadPage:function(event)
+{this._recordButton.toggled=true;if(!this._preserveLogCheckbox.checked())
+this._reset();},_mainFrameNavigated:function(event)
+{if(!this._recordButton.toggled||this._preserveLogCheckbox.checked())
+return;var frame=(event.data);var loaderId=frame.loaderId;var requestsToPick=[];var requests=WebInspector.networkLog.requests;for(var i=0;i<requests.length;++i){var request=requests[i];if(request.loaderId===loaderId)
+requestsToPick.push(request);}
+this._reset();for(var i=0;i<requestsToPick.length;++i)
+this._appendRequest(requestsToPick[i]);},switchToDetailedView:function()
+{if(!this._dataGrid)
+return;if(this._dataGrid.selectedNode)
+this._dataGrid.selectedNode.selected=false;this.element.classList.remove("brief-mode");this._detailedMode=true;this._updateColumns();},switchToBriefView:function()
+{this.element.classList.add("brief-mode");this._removeAllNodeHighlights();this._detailedMode=false;this._updateColumns();this._popoverHelper.hidePopover();},_toggleLargerRequests:function()
+{WebInspector.settings.resourcesLargeRows.set(!WebInspector.settings.resourcesLargeRows.get());this._setLargerRequests(WebInspector.settings.resourcesLargeRows.get());},_setLargerRequests:function(enabled)
+{this._largerRequestsButton.toggled=enabled;if(!enabled){this._largerRequestsButton.title=WebInspector.UIString("Use large resource rows.");this._dataGrid.element.classList.add("small");this._timelineGrid.element.classList.add("small");}else{this._largerRequestsButton.title=WebInspector.UIString("Use small resource rows.");this._dataGrid.element.classList.remove("small");this._timelineGrid.element.classList.remove("small");}
+this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.RowSizeChanged,{largeRows:enabled});},_getPopoverAnchor:function(element)
+{if(!this._allowPopover)
+return;var anchor=element.enclosingNodeOrSelfWithClass("network-graph-bar")||element.enclosingNodeOrSelfWithClass("network-graph-label");if(anchor&&anchor.parentElement.request&&anchor.parentElement.request.timing)
+return anchor;anchor=element.enclosingNodeOrSelfWithClass("network-script-initiated");if(anchor&&anchor.request&&anchor.request.initiator)
+return anchor;return null;},_showPopover:function(anchor,popover)
+{var content;if(anchor.classList.contains("network-script-initiated"))
+content=this._generateScriptInitiatedPopoverContent(anchor.request);else
+content=WebInspector.RequestTimingView.createTimingTable(anchor.parentElement.request);popover.show(content,anchor);},_onHidePopover:function()
+{this._linkifier.reset();},_generateScriptInitiatedPopoverContent:function(request)
+{var stackTrace=request.initiator.stackTrace;var framesTable=document.createElement("table");for(var i=0;i<stackTrace.length;++i){var stackFrame=stackTrace[i];var row=document.createElement("tr");row.createChild("td").textContent=stackFrame.functionName||WebInspector.UIString("(anonymous function)");row.createChild("td").textContent=" @ ";row.createChild("td").appendChild(this._linkifier.linkifyLocation(stackFrame.url,stackFrame.lineNumber-1,stackFrame.columnNumber-1));framesTable.appendChild(row);}
+return framesTable;},_updateColumns:function()
+{var columnsVisibility=this._coulmnsVisibilitySetting.get();var detailedMode=!!this._detailedMode;for(var columnIdentifier in columnsVisibility){var visible=detailedMode&&columnsVisibility[columnIdentifier];this._dataGrid.setColumnVisible(columnIdentifier,visible);}
+this._dataGrid.setColumnVisible("timeline",detailedMode);this._dataGrid.applyColumnWeights();},_toggleColumnVisibility:function(columnIdentifier)
+{var columnsVisibility=this._coulmnsVisibilitySetting.get();columnsVisibility[columnIdentifier]=!columnsVisibility[columnIdentifier];this._coulmnsVisibilitySetting.set(columnsVisibility);this._updateColumns();},_getConfigurableColumnIDs:function()
+{if(this._configurableColumnIDs)
+return this._configurableColumnIDs;var columns=this._dataGrid.columns;function compare(id1,id2)
+{return columns[id1].title.compareTo(columns[id2].title);}
+var columnIDs=Object.keys(this._coulmnsVisibilitySetting.get());this._configurableColumnIDs=columnIDs.sort(compare);return this._configurableColumnIDs;},_contextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);if(this._detailedMode&&event.target.isSelfOrDescendant(this._dataGrid.headerTableBody)){var columnsVisibility=this._coulmnsVisibilitySetting.get();var columnIDs=this._getConfigurableColumnIDs();for(var i=0;i<columnIDs.length;++i){var columnIdentifier=columnIDs[i];var column=this._dataGrid.columns[columnIdentifier];contextMenu.appendCheckboxItem(column.title,this._toggleColumnVisibility.bind(this,columnIdentifier),!!columnsVisibility[columnIdentifier]);}
+contextMenu.show();return;}
+var gridNode=this._dataGrid.dataGridNodeFromNode(event.target);var request=gridNode&&gridNode._request;function openResourceInNewTab(url)
+{InspectorFrontendHost.openInNewTab(url);}
+if(request){contextMenu.appendItem(WebInspector.openLinkExternallyLabel(),openResourceInNewTab.bind(null,request.url));contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.copyLinkAddressLabel(),this._copyLocation.bind(this,request));if(request.requestHeadersText())
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy request headers":"Copy Request Headers"),this._copyRequestHeaders.bind(this,request));if(request.responseHeadersText)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy response headers":"Copy Response Headers"),this._copyResponseHeaders.bind(this,request));if(request.finished)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy response":"Copy Response"),this._copyResponse.bind(this,request));contextMenu.appendItem(WebInspector.UIString("Copy as cURL"),this._copyCurlCommand.bind(this,request));}
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy all as HAR":"Copy All as HAR"),this._copyAll.bind(this));contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Save as HAR with content":"Save as HAR with Content"),this._exportAll.bind(this));contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Clear browser cache":"Clear Browser Cache"),this._clearBrowserCache.bind(this));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Clear browser cookies":"Clear Browser Cookies"),this._clearBrowserCookies.bind(this));if(request&&request.type===WebInspector.resourceTypes.XHR){contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString("Replay XHR"),this._replayXHR.bind(this,request.requestId));contextMenu.appendSeparator();}
+contextMenu.show();},_replayXHR:function(requestId)
+{NetworkAgent.replayXHR(requestId);},_harRequests:function()
+{var httpRequests=this._requests.filter(WebInspector.NetworkLogView.HTTPRequestsFilter);httpRequests=httpRequests.filter(WebInspector.NetworkLogView.FinishedRequestsFilter);return httpRequests.filter(WebInspector.NetworkLogView.NonSourceMapRequestsFilter);},_copyAll:function()
+{var harArchive={log:(new WebInspector.HARLog(this._harRequests())).build()};InspectorFrontendHost.copyText(JSON.stringify(harArchive,null,2));},_copyLocation:function(request)
+{InspectorFrontendHost.copyText(request.url);},_copyRequestHeaders:function(request)
+{InspectorFrontendHost.copyText(request.requestHeadersText());},_copyResponse:function(request)
+{function callback(content)
+{if(request.contentEncoded)
+content=request.asDataURL();InspectorFrontendHost.copyText(content||"");}
+request.requestContent(callback);},_copyResponseHeaders:function(request)
+{InspectorFrontendHost.copyText(request.responseHeadersText);},_copyCurlCommand:function(request)
+{InspectorFrontendHost.copyText(this._generateCurlCommand(request));},_exportAll:function()
+{var filename=WebInspector.resourceTreeModel.inspectedPageDomain()+".har";var stream=new WebInspector.FileOutputStream();stream.open(filename,openCallback.bind(this));function openCallback(accepted)
+{if(!accepted)
+return;var progressIndicator=new WebInspector.ProgressIndicator();this._progressBarContainer.appendChild(progressIndicator.element);var harWriter=new WebInspector.HARWriter();harWriter.write(stream,this._harRequests(),progressIndicator);}},_clearBrowserCache:function()
+{if(confirm(WebInspector.UIString("Are you sure you want to clear browser cache?")))
+NetworkAgent.clearBrowserCache();},_clearBrowserCookies:function()
+{if(confirm(WebInspector.UIString("Are you sure you want to clear browser cookies?")))
+NetworkAgent.clearBrowserCookies();},_updateRows:function()
+{var dataTableBody=this._dataGrid.dataTableBody;var rows=dataTableBody.children;var recordsCount=rows.length;if(recordsCount<2)
+return;var unfilteredRowIndex=0;for(var i=0;i<recordsCount-1;++i){var row=rows[i];var dataGridNode=this._dataGrid.dataGridNodeFromNode(row);if(dataGridNode.isFilteredOut()){row.classList.remove("offscreen");continue;}
+var rowIsOdd=!!(unfilteredRowIndex&1);if(rowIsOdd!==row.rowIsOdd){row.classList.toggle("odd",rowIsOdd);row.rowIsOdd=rowIsOdd;}
+unfilteredRowIndex++;}},_matchRequest:function(request)
+{if(!this._searchRegExp)
+return-1;if(!request.name().match(this._searchRegExp)&&!request.path().match(this._searchRegExp))
+return-1;if(request.requestId in this._matchedRequestsMap)
+return this._matchedRequestsMap[request.requestId];var matchedRequestIndex=this._matchedRequests.length;this._matchedRequestsMap[request.requestId]=matchedRequestIndex;this._matchedRequests.push(request.requestId);return matchedRequestIndex;},_clearSearchMatchedList:function()
+{delete this._searchRegExp;this._matchedRequests=[];this._matchedRequestsMap={};this._removeAllHighlights();},_updateSearchMatchedListAfterRequestIdChanged:function(oldRequestId,newRequestId)
+{var requestIndex=this._matchedRequestsMap[oldRequestId];if(requestIndex){delete this._matchedRequestsMap[oldRequestId];this._matchedRequestsMap[newRequestId]=requestIndex;this._matchedRequests[requestIndex]=newRequestId;}},_updateHighlightIfMatched:function(request)
+{var matchedRequestIndex=this._matchRequest(request);if(matchedRequestIndex===-1)
+return;this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated,this._matchedRequests.length);if(this._currentMatchedRequestIndex!==-1&&this._currentMatchedRequestIndex!==matchedRequestIndex)
+return;this._highlightNthMatchedRequestForSearch(matchedRequestIndex,false);},_removeAllHighlights:function()
+{this._removeAllNodeHighlights();for(var i=0;i<this._highlightedSubstringChanges.length;++i)
+WebInspector.revertDomChanges(this._highlightedSubstringChanges[i]);this._highlightedSubstringChanges=[];},_highlightMatchedRequest:function(request,reveal,regExp)
+{var node=this._requestGridNode(request);if(!node)
+return;var nameMatched=request.name().match(regExp);var pathMatched=request.path().match(regExp);if(!nameMatched&&pathMatched&&!this._largerRequestsButton.toggled)
+this._toggleLargerRequests();var highlightedSubstringChanges=node._highlightMatchedSubstring(regExp);this._highlightedSubstringChanges.push(highlightedSubstringChanges);if(reveal){node.reveal();this._highlightNode(node);}},_highlightNthMatchedRequestForSearch:function(matchedRequestIndex,reveal)
+{var request=this._requestsById[this._matchedRequests[matchedRequestIndex]];if(!request)
+return;this._removeAllHighlights();this._highlightMatchedRequest(request,reveal,this._searchRegExp);var node=this._requestGridNode(request);if(node)
+this._currentMatchedRequestIndex=matchedRequestIndex;this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchIndexUpdated,this._currentMatchedRequestIndex);},performSearch:function(query,shouldJump)
+{var newMatchedRequestIndex=0;var currentMatchedRequestId;if(this._currentMatchedRequestIndex!==-1)
+currentMatchedRequestId=this._matchedRequests[this._currentMatchedRequestIndex];this._clearSearchMatchedList();this._searchRegExp=createPlainTextSearchRegex(query,"i");var childNodes=this._dataGrid.dataTableBody.childNodes;var requestNodes=Array.prototype.slice.call(childNodes,0,childNodes.length-1);for(var i=0;i<requestNodes.length;++i){var dataGridNode=this._dataGrid.dataGridNodeFromNode(requestNodes[i]);if(dataGridNode.isFilteredOut())
+continue;if(this._matchRequest(dataGridNode._request)!==-1&&dataGridNode._request.requestId===currentMatchedRequestId)
+newMatchedRequestIndex=this._matchedRequests.length-1;}
+this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated,this._matchedRequests.length);if(shouldJump)
+this._highlightNthMatchedRequestForSearch(newMatchedRequestIndex,true);},_applyFilter:function(node)
+{var request=node._request;var matches=this._resourceTypeFilterUI.accept(request.type.name());if(this._dataURLFilterUI.checked()&&request.parsedURL.isDataURL())
+matches=false;for(var i=0;matches&&(i<this._filters.length);++i)
+matches=this._filters[i](request);node.element.classList.toggle("filtered-out",!matches);if(matches)
+this._filteredOutRequests.remove(request);else
+this._filteredOutRequests.put(request,true);},_parseFilterQuery:function(query)
+{var parsedQuery=this._suggestionBuilder.parseQuery(query);this._filters=parsedQuery.text.map(this._createTextFilter);for(var key in parsedQuery.filters){var filterType=(key);this._filters.push(this._createFilter(filterType,parsedQuery.filters[key]));}},_createTextFilter:function(text)
+{var regexp=new RegExp(text.escapeForRegExp(),"i");return WebInspector.NetworkLogView._requestNameOrPathFilter.bind(null,regexp);},_createFilter:function(type,value){switch(type){case WebInspector.NetworkPanel.FilterType.Domain:return WebInspector.NetworkLogView._requestDomainFilter.bind(null,value);case WebInspector.NetworkPanel.FilterType.HasResponseHeader:return WebInspector.NetworkLogView._requestResponseHeaderFilter.bind(null,value);case WebInspector.NetworkPanel.FilterType.MimeType:return WebInspector.NetworkLogView._requestMimeTypeFilter.bind(null,value);case WebInspector.NetworkPanel.FilterType.SetCookieDomain:return WebInspector.NetworkLogView._requestSetCookieDomainFilter.bind(null,value);case WebInspector.NetworkPanel.FilterType.SetCookieName:return WebInspector.NetworkLogView._requestSetCookieNameFilter.bind(null,value);case WebInspector.NetworkPanel.FilterType.SetCookieValue:return WebInspector.NetworkLogView._requestSetCookieValueFilter.bind(null,value);}
+return this._createTextFilter(type+":"+value);},_filterRequests:function()
+{this._removeAllHighlights();this._filteredOutRequests.clear();var nodes=this._dataGrid.rootNode().children;for(var i=0;i<nodes.length;++i)
+this._applyFilter(nodes[i]);this._updateSummaryBar();this._updateRows();},jumpToPreviousSearchResult:function()
+{if(!this._matchedRequests.length)
+return;this._highlightNthMatchedRequestForSearch((this._currentMatchedRequestIndex+this._matchedRequests.length-1)%this._matchedRequests.length,true);},jumpToNextSearchResult:function()
+{if(!this._matchedRequests.length)
+return;this._highlightNthMatchedRequestForSearch((this._currentMatchedRequestIndex+1)%this._matchedRequests.length,true);},searchCanceled:function()
+{this._clearSearchMatchedList();this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated,0);},revealAndHighlightRequest:function(request)
+{this._removeAllNodeHighlights();var node=this._requestGridNode(request);if(node){this._dataGrid.element.focus();node.reveal();this._highlightNode(node);}},_removeAllNodeHighlights:function()
+{if(this._highlightedNode){this._highlightedNode.element.classList.remove("highlighted-row");delete this._highlightedNode;}},_highlightNode:function(node)
+{WebInspector.runCSSAnimationOnce(node.element,"highlighted-row");this._highlightedNode=node;},_generateCurlCommand:function(request)
+{var command=["curl"];var ignoredHeaders={"host":1,"method":1,"path":1,"scheme":1,"version":1};function escapeStringWin(str)
+{return"\""+str.replace(/"/g,"\"\"").replace(/%/g,"\"%\"").replace(/\\/g,"\\\\").replace(/[\r\n]+/g,"\"^$&\"")+"\"";}
+function escapeStringPosix(str)
+{function escapeCharacter(x)
+{var code=x.charCodeAt(0);if(code<256){return code<16?"\\x0"+code.toString(16):"\\x"+code.toString(16);}
+code=code.toString(16);return"\\u"+("0000"+code).substr(code.length,4);}
+if(/[^\x20-\x7E]|\'/.test(str)){return"$\'"+str.replace(/\\/g,"\\\\").replace(/\'/g,"\\\'").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[^\x20-\x7E]/g,escapeCharacter)+"'";}else{return"'"+str+"'";}}
+var escapeString=WebInspector.isWin()?escapeStringWin:escapeStringPosix;command.push(escapeString(request.url).replace(/[[{}\]]/g,"\\$&"));var inferredMethod="GET";var data=[];var requestContentType=request.requestContentType();if(requestContentType&&requestContentType.startsWith("application/x-www-form-urlencoded")&&request.requestFormData){data.push("--data");data.push(escapeString(request.requestFormData));ignoredHeaders["content-length"]=true;inferredMethod="POST";}else if(request.requestFormData){data.push("--data-binary");data.push(escapeString(request.requestFormData));ignoredHeaders["content-length"]=true;inferredMethod="POST";}
+if(request.requestMethod!==inferredMethod){command.push("-X");command.push(request.requestMethod);}
+var requestHeaders=request.requestHeaders();for(var i=0;i<requestHeaders.length;i++){var header=requestHeaders[i];var name=header.name.replace(/^:/,"");if(name.toLowerCase()in ignoredHeaders)
+continue;command.push("-H");command.push(escapeString(name+": "+header.value));}
+command=command.concat(data);command.push("--compressed");return command.join(" ");},__proto__:WebInspector.VBox.prototype}
+WebInspector.NetworkLogView.Filter;WebInspector.NetworkLogView._requestNameOrPathFilter=function(regex,request)
+{return regex.test(request.name())||regex.test(request.path());}
+WebInspector.NetworkLogView._requestDomainFilter=function(value,request)
+{return request.domain===value;}
+WebInspector.NetworkLogView._requestResponseHeaderFilter=function(value,request)
+{return request.responseHeaderValue(value)!==undefined;}
+WebInspector.NetworkLogView._requestMimeTypeFilter=function(value,request)
+{return request.mimeType===value;}
+WebInspector.NetworkLogView._requestSetCookieDomainFilter=function(value,request)
+{var cookies=request.responseCookies;for(var i=0,l=cookies?cookies.length:0;i<l;++i){if(cookies[i].domain()===value)
+return false;}
+return false;}
+WebInspector.NetworkLogView._requestSetCookieNameFilter=function(value,request)
+{var cookies=request.responseCookies;for(var i=0,l=cookies?cookies.length:0;i<l;++i){if(cookies[i].name()===value)
+return false;}
+return false;}
+WebInspector.NetworkLogView._requestSetCookieValueFilter=function(value,request)
+{var cookies=request.responseCookies;for(var i=0,l=cookies?cookies.length:0;i<l;++i){if(cookies[i].value()===value)
+return false;}
+return false;}
+WebInspector.NetworkLogView.HTTPRequestsFilter=function(request)
+{return request.parsedURL.isValid&&(request.scheme in WebInspector.NetworkLogView.HTTPSchemas);}
+WebInspector.NetworkLogView.NonSourceMapRequestsFilter=function(request)
+{return!WebInspector.SourceMap.hasSourceMapRequestHeader(request);}
+WebInspector.NetworkLogView.FinishedRequestsFilter=function(request)
+{return request.finished;}
+WebInspector.NetworkLogView.EventTypes={ViewCleared:"ViewCleared",RowSizeChanged:"RowSizeChanged",RequestSelected:"RequestSelected",SearchCountUpdated:"SearchCountUpdated",SearchIndexUpdated:"SearchIndexUpdated"};WebInspector.NetworkPanel=function()
+{WebInspector.Panel.call(this,"network");this.registerRequiredCSS("networkPanel.css");this._injectStyles();this._panelStatusBarElement=this.element.createChild("div","panel-status-bar");this._filterBar=new WebInspector.FilterBar();this._filtersContainer=this.element.createChild("div","network-filters-header hidden");this._filtersContainer.appendChild(this._filterBar.filtersElement());this._filterBar.addEventListener(WebInspector.FilterBar.Events.FiltersToggled,this._onFiltersToggled,this);this._filterBar.setName("networkPanel");this._searchableView=new WebInspector.SearchableView(this);this._searchableView.show(this.element);this._contentsElement=this._searchableView.element;this._splitView=new WebInspector.SplitView(true,false,"networkPanelSplitViewState");this._splitView.show(this._contentsElement);this._splitView.hideMain();var defaultColumnsVisibility=WebInspector.NetworkLogView._defaultColumnsVisibility;var networkLogColumnsVisibilitySetting=WebInspector.settings.createSetting("networkLogColumnsVisibility",defaultColumnsVisibility);var savedColumnsVisibility=networkLogColumnsVisibilitySetting.get();var columnsVisibility={};for(var columnId in defaultColumnsVisibility)
+columnsVisibility[columnId]=savedColumnsVisibility.hasOwnProperty(columnId)?savedColumnsVisibility[columnId]:defaultColumnsVisibility[columnId];networkLogColumnsVisibilitySetting.set(columnsVisibility);this._networkLogView=new WebInspector.NetworkLogView(this._filterBar,networkLogColumnsVisibilitySetting);this._networkLogView.show(this._splitView.sidebarElement());var viewsContainerView=new WebInspector.VBox();this._viewsContainerElement=viewsContainerView.element;this._viewsContainerElement.id="network-views";if(!this._networkLogView.useLargeRows)
+this._viewsContainerElement.classList.add("small");viewsContainerView.show(this._splitView.mainElement());this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.ViewCleared,this._onViewCleared,this);this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.RowSizeChanged,this._onRowSizeChanged,this);this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.RequestSelected,this._onRequestSelected,this);this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated,this._onSearchCountUpdated,this);this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.SearchIndexUpdated,this._onSearchIndexUpdated,this);this._closeButtonElement=this._viewsContainerElement.createChild("div","close-button");this._closeButtonElement.id="network-close-button";this._closeButtonElement.addEventListener("click",this._toggleGridMode.bind(this),false);this._viewsContainerElement.appendChild(this._closeButtonElement);for(var i=0;i<this._networkLogView.statusBarItems.length;++i)
+this._panelStatusBarElement.appendChild(this._networkLogView.statusBarItems[i]);function sourceFrameGetter()
+{return this._networkItemView.currentSourceFrame();}
+WebInspector.GoToLineDialog.install(this,sourceFrameGetter.bind(this));}
+WebInspector.NetworkPanel.FilterType={Domain:"Domain",HasResponseHeader:"HasResponseHeader",MimeType:"MimeType",SetCookieDomain:"SetCookieDomain",SetCookieName:"SetCookieName",SetCookieValue:"SetCookieValue"};WebInspector.NetworkPanel._searchKeys=Object.values(WebInspector.NetworkPanel.FilterType);WebInspector.NetworkPanel.prototype={_onFiltersToggled:function(event)
+{var toggled=(event.data);this._filtersContainer.classList.toggle("hidden",!toggled);this.element.classList.toggle("filters-toggled",toggled);this.doResize();},elementsToRestoreScrollPositionsFor:function()
+{return this._networkLogView.elementsToRestoreScrollPositionsFor();},searchableView:function()
+{return this._searchableView;},_reset:function()
+{this._networkLogView._reset();},handleShortcut:function(event)
+{if(this._viewingRequestMode&&event.keyCode===WebInspector.KeyboardShortcut.Keys.Esc.code){this._toggleGridMode();event.handled=true;return;}
+WebInspector.Panel.prototype.handleShortcut.call(this,event);},wasShown:function()
+{WebInspector.Panel.prototype.wasShown.call(this);},get requests()
+{return this._networkLogView.requests;},revealAndHighlightRequest:function(request)
+{this._toggleGridMode();if(request)
+this._networkLogView.revealAndHighlightRequest(request);},_onViewCleared:function(event)
+{this._closeVisibleRequest();this._toggleGridMode();this._viewsContainerElement.removeChildren();this._viewsContainerElement.appendChild(this._closeButtonElement);},_onRowSizeChanged:function(event)
+{this._viewsContainerElement.classList.toggle("small",!event.data.largeRows);},_onSearchCountUpdated:function(event)
+{this._searchableView.updateSearchMatchesCount(event.data);},_onSearchIndexUpdated:function(event)
+{this._searchableView.updateCurrentMatchIndex(event.data);},_onRequestSelected:function(event)
+{this._showRequest(event.data);},_showRequest:function(request)
+{if(!request)
+return;this._toggleViewingRequestMode();if(this._networkItemView){this._networkItemView.detach();delete this._networkItemView;}
+var view=new WebInspector.NetworkItemView(request);view.show(this._viewsContainerElement);this._networkItemView=view;},_closeVisibleRequest:function()
+{this.element.classList.remove("viewing-resource");if(this._networkItemView){this._networkItemView.detach();delete this._networkItemView;}},_toggleGridMode:function()
+{if(this._viewingRequestMode){this._viewingRequestMode=false;this.element.classList.remove("viewing-resource");this._splitView.hideMain();}
+this._networkLogView.switchToDetailedView();this._networkLogView.allowPopover=true;this._networkLogView._allowRequestSelection=false;},_toggleViewingRequestMode:function()
+{if(this._viewingRequestMode)
+return;this._viewingRequestMode=true;this.element.classList.add("viewing-resource");this._splitView.showBoth();this._networkLogView.allowPopover=false;this._networkLogView._allowRequestSelection=true;this._networkLogView.switchToBriefView();},performSearch:function(query,shouldJump)
+{this._networkLogView.performSearch(query,shouldJump);},jumpToPreviousSearchResult:function()
+{this._networkLogView.jumpToPreviousSearchResult();},jumpToNextSearchResult:function()
+{this._networkLogView.jumpToNextSearchResult();},searchCanceled:function()
+{this._networkLogView.searchCanceled();},appendApplicableItems:function(event,contextMenu,target)
+{function reveal(request)
+{WebInspector.inspectorView.setCurrentPanel(this);this.revealAndHighlightRequest(request);}
+function appendRevealItem(request)
+{var revealText=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in Network panel":"Reveal in Network Panel");contextMenu.appendItem(revealText,reveal.bind(this,request));}
+if(target instanceof WebInspector.Resource){var resource=(target);if(resource.request)
+appendRevealItem.call(this,resource.request);return;}
+if(target instanceof WebInspector.UISourceCode){var uiSourceCode=(target);var resource=WebInspector.resourceForURL(uiSourceCode.url);if(resource&&resource.request)
+appendRevealItem.call(this,resource.request);return;}
+if(!(target instanceof WebInspector.NetworkRequest))
+return;var request=(target);if(this._networkItemView&&this._networkItemView.isShowing()&&this._networkItemView.request()===request)
+return;appendRevealItem.call(this,request);},_injectStyles:function()
+{var style=document.createElement("style");var rules=[];var columns=WebInspector.NetworkLogView._defaultColumnsVisibility;var hideSelectors=[];var bgSelectors=[];for(var columnId in columns){hideSelectors.push("#network-container .hide-"+columnId+"-column ."+columnId+"-column");bgSelectors.push(".network-log-grid.data-grid td."+columnId+"-column");}
+rules.push(hideSelectors.join(", ")+"{border-left: 0 none transparent;}");rules.push(bgSelectors.join(", ")+"{background-color: rgba(0, 0, 0, 0.07);}");style.textContent=rules.join("\n");document.head.appendChild(style);},__proto__:WebInspector.Panel.prototype}
+WebInspector.NetworkPanel.ContextMenuProvider=function()
+{}
+WebInspector.NetworkPanel.ContextMenuProvider.prototype={appendApplicableItems:function(event,contextMenu,target)
+{WebInspector.inspectorView.panel("network").appendApplicableItems(event,contextMenu,target);}}
+WebInspector.NetworkPanel.RequestRevealer=function()
+{}
+WebInspector.NetworkPanel.RequestRevealer.prototype={reveal:function(request)
+{if(request instanceof WebInspector.NetworkRequest)
+(WebInspector.inspectorView.showPanel("network")).revealAndHighlightRequest(request);}}
+WebInspector.NetworkBaseCalculator=function()
+{}
+WebInspector.NetworkBaseCalculator.prototype={computePosition:function(time)
+{return(time-this._minimumBoundary)/this.boundarySpan()*this._workingArea;},computeBarGraphPercentages:function(item)
+{return{start:0,middle:0,end:(this._value(item)/this.boundarySpan())*100};},computeBarGraphLabels:function(item)
+{const label=this.formatTime(this._value(item));return{left:label,right:label,tooltip:label};},boundarySpan:function()
+{return this._maximumBoundary-this._minimumBoundary;},updateBoundaries:function(item)
+{this._minimumBoundary=0;var value=this._value(item);if(typeof this._maximumBoundary==="undefined"||value>this._maximumBoundary){this._maximumBoundary=value;return true;}
+return false;},reset:function()
+{delete this._minimumBoundary;delete this._maximumBoundary;},maximumBoundary:function()
+{return this._maximumBoundary;},minimumBoundary:function()
+{return this._minimumBoundary;},zeroTime:function()
+{return this._minimumBoundary;},_value:function(item)
+{return 0;},formatTime:function(value,precision)
+{return value.toString();},setDisplayWindow:function(clientWidth)
+{this._workingArea=clientWidth;},paddingLeft:function()
+{return 0;}}
+WebInspector.NetworkTimeCalculator=function(startAtZero)
+{WebInspector.NetworkBaseCalculator.call(this);this.startAtZero=startAtZero;}
+WebInspector.NetworkTimeCalculator.prototype={computeBarGraphPercentages:function(request)
+{if(request.startTime!==-1)
+var start=((request.startTime-this._minimumBoundary)/this.boundarySpan())*100;else
+var start=0;if(request.responseReceivedTime!==-1)
+var middle=((request.responseReceivedTime-this._minimumBoundary)/this.boundarySpan())*100;else
+var middle=(this.startAtZero?start:100);if(request.endTime!==-1)
+var end=((request.endTime-this._minimumBoundary)/this.boundarySpan())*100;else
+var end=(this.startAtZero?middle:100);if(this.startAtZero){end-=start;middle-=start;start=0;}
+return{start:start,middle:middle,end:end};},computePercentageFromEventTime:function(eventTime)
+{if(eventTime!==-1&&!this.startAtZero)
+return((eventTime-this._minimumBoundary)/this.boundarySpan())*100;return 0;},updateBoundariesForEventTime:function(eventTime)
+{if(eventTime===-1||this.startAtZero)
+return false;if(typeof this._maximumBoundary==="undefined"||eventTime>this._maximumBoundary){this._maximumBoundary=eventTime;return true;}
+return false;},computeBarGraphLabels:function(request)
+{var rightLabel="";if(request.responseReceivedTime!==-1&&request.endTime!==-1)
+rightLabel=Number.secondsToString(request.endTime-request.responseReceivedTime);var hasLatency=request.latency>0;if(hasLatency)
+var leftLabel=Number.secondsToString(request.latency);else
+var leftLabel=rightLabel;if(request.timing)
+return{left:leftLabel,right:rightLabel};if(hasLatency&&rightLabel){var total=Number.secondsToString(request.duration);var tooltip=WebInspector.UIString("%s latency, %s download (%s total)",leftLabel,rightLabel,total);}else if(hasLatency)
+var tooltip=WebInspector.UIString("%s latency",leftLabel);else if(rightLabel)
+var tooltip=WebInspector.UIString("%s download",rightLabel);if(request.cached)
+tooltip=WebInspector.UIString("%s (from cache)",tooltip);return{left:leftLabel,right:rightLabel,tooltip:tooltip};},updateBoundaries:function(request)
+{var didChange=false;var lowerBound;if(this.startAtZero)
+lowerBound=0;else
+lowerBound=this._lowerBound(request);if(lowerBound!==-1&&(typeof this._minimumBoundary==="undefined"||lowerBound<this._minimumBoundary)){this._minimumBoundary=lowerBound;didChange=true;}
+var upperBound=this._upperBound(request);if(upperBound!==-1&&(typeof this._maximumBoundary==="undefined"||upperBound>this._maximumBoundary)){this._maximumBoundary=upperBound;didChange=true;}
+return didChange;},formatTime:function(value)
+{return Number.secondsToString(value);},_lowerBound:function(request)
+{return 0;},_upperBound:function(request)
+{return 0;},__proto__:WebInspector.NetworkBaseCalculator.prototype}
+WebInspector.NetworkTransferTimeCalculator=function()
+{WebInspector.NetworkTimeCalculator.call(this,false);}
+WebInspector.NetworkTransferTimeCalculator.prototype={formatTime:function(value)
+{return Number.secondsToString(value-this.zeroTime());},_lowerBound:function(request)
+{return request.startTime;},_upperBound:function(request)
+{return request.endTime;},__proto__:WebInspector.NetworkTimeCalculator.prototype}
+WebInspector.NetworkTransferDurationCalculator=function()
+{WebInspector.NetworkTimeCalculator.call(this,true);}
+WebInspector.NetworkTransferDurationCalculator.prototype={formatTime:function(value)
+{return Number.secondsToString(value);},_upperBound:function(request)
+{return request.duration;},__proto__:WebInspector.NetworkTimeCalculator.prototype}
+WebInspector.NetworkDataGridNode=function(parentView,request)
+{WebInspector.DataGridNode.call(this,{});this._parentView=parentView;this._request=request;this._linkifier=new WebInspector.Linkifier();}
+WebInspector.NetworkDataGridNode.prototype={createCells:function()
+{this._nameCell=this._createDivInTD("name");this._methodCell=this._createDivInTD("method");this._statusCell=this._createDivInTD("status");this._schemeCell=this._createDivInTD("scheme");this._domainCell=this._createDivInTD("domain");this._remoteAddressCell=this._createDivInTD("remoteAddress");this._typeCell=this._createDivInTD("type");this._initiatorCell=this._createDivInTD("initiator");this._cookiesCell=this._createDivInTD("cookies");this._setCookiesCell=this._createDivInTD("setCookies");this._sizeCell=this._createDivInTD("size");this._timeCell=this._createDivInTD("time");this._responseHeaderCells={};var responseHeaderColumns=WebInspector.NetworkLogView._responseHeaderColumns;for(var i=0;i<responseHeaderColumns.length;++i)
+this._responseHeaderCells[responseHeaderColumns[i]]=this._createDivInTD(responseHeaderColumns[i]);this._timelineCell=this._createDivInTD("timeline");this._createTimelineBar(this._timelineCell);this._nameCell.addEventListener("click",this._onClick.bind(this),false);this._nameCell.addEventListener("dblclick",this._openInNewTab.bind(this),false);},wasDetached:function()
+{this._linkifier.reset();},isFilteredOut:function()
+{return!!this._parentView._filteredOutRequests.get(this._request);},_onClick:function()
+{if(!this._parentView._allowRequestSelection)
+this.select();},select:function()
+{this._parentView.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.RequestSelected,this._request);WebInspector.DataGridNode.prototype.select.apply(this,arguments);WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.NetworkRequestSelected,url:this._request.url});},_highlightMatchedSubstring:function(regexp)
+{var domChanges=[];var matchInfo=this._element.textContent.match(regexp);if(matchInfo)
+WebInspector.highlightSearchResult(this._nameCell,matchInfo.index,matchInfo[0].length,domChanges);return domChanges;},_openInNewTab:function()
+{InspectorFrontendHost.openInNewTab(this._request.url);},get selectable()
+{return this._parentView._allowRequestSelection&&!this.isFilteredOut();},_createDivInTD:function(columnIdentifier)
+{var td=this.createTD(columnIdentifier);var div=td.createChild("div");this._element.appendChild(td);return div;},_createTimelineBar:function(cell)
+{cell.className="network-graph-side";this._barAreaElement=document.createElement("div");this._barAreaElement.className="network-graph-bar-area";this._barAreaElement.request=this._request;cell.appendChild(this._barAreaElement);this._barLeftElement=document.createElement("div");this._barLeftElement.className="network-graph-bar waiting";this._barAreaElement.appendChild(this._barLeftElement);this._barRightElement=document.createElement("div");this._barRightElement.className="network-graph-bar";this._barAreaElement.appendChild(this._barRightElement);this._labelLeftElement=document.createElement("div");this._labelLeftElement.className="network-graph-label waiting";this._barAreaElement.appendChild(this._labelLeftElement);this._labelRightElement=document.createElement("div");this._labelRightElement.className="network-graph-label";this._barAreaElement.appendChild(this._labelRightElement);cell.addEventListener("mouseover",this._refreshLabelPositions.bind(this),false);},refreshRequest:function()
+{this._refreshNameCell();this._refreshMethodCell();this._refreshStatusCell();this._refreshSchemeCell();this._refreshDomainCell();this._refreshRemoteAddressCell();this._refreshTypeCell();this._refreshInitiatorCell();this._refreshCookiesCell();this._refreshSetCookiesCell();this._refreshSizeCell();this._refreshTimeCell();var responseHeaderColumns=WebInspector.NetworkLogView._responseHeaderColumns;for(var i=0;i<responseHeaderColumns.length;++i)
+this._refreshResponseHeaderCell(responseHeaderColumns[i]);if(this._request.cached)
+this._timelineCell.classList.add("resource-cached");this._element.classList.add("network-item");this._element.classList.toggle("network-error-row",this._isFailed());this._updateElementStyleClasses(this._element);},_isFailed:function()
+{return!!this._request.failed||(this._request.statusCode>=400);},_updateElementStyleClasses:function(element)
+{var typeClassName="network-type-"+this._request.type.name();if(!element.classList.contains(typeClassName)){element.removeMatchingStyleClasses("network-type-\\w+");element.classList.add(typeClassName);}},_refreshResponseHeaderCell:function(headerName)
+{var cell=this._responseHeaderCells[headerName];var value=this._request.responseHeaderValue(headerName);cell.setTextAndTitle(value?value:"");},_refreshNameCell:function()
+{this._nameCell.removeChildren();if(this._request.type===WebInspector.resourceTypes.Image){var previewImage=document.createElement("img");previewImage.className="image-network-icon-preview";this._request.populateImageSource(previewImage);var iconElement=document.createElement("div");iconElement.className="icon";iconElement.appendChild(previewImage);}else{var iconElement=document.createElement("img");iconElement.className="icon";}
+this._nameCell.appendChild(iconElement);this._nameCell.appendChild(document.createTextNode(this._request.name()));this._appendSubtitle(this._nameCell,this._request.path());this._nameCell.title=this._request.url;},_refreshMethodCell:function()
+{this._methodCell.setTextAndTitle(this._request.requestMethod);},_refreshStatusCell:function()
+{this._statusCell.removeChildren();this._statusCell.classList.toggle("network-dim-cell",!this._isFailed()&&(this._request.cached||!this._request.statusCode));if(this._request.failed&&!this._request.canceled){var failText=WebInspector.UIString("(failed)");if(this._request.localizedFailDescription){this._statusCell.appendChild(document.createTextNode(failText));this._appendSubtitle(this._statusCell,this._request.localizedFailDescription);this._statusCell.title=failText+" "+this._request.localizedFailDescription;}else
+this._statusCell.setTextAndTitle(failText);}else if(this._request.statusCode){this._statusCell.appendChild(document.createTextNode(""+this._request.statusCode));this._appendSubtitle(this._statusCell,this._request.statusText);this._statusCell.title=this._request.statusCode+" "+this._request.statusText;}else if(this._request.parsedURL.isDataURL()){this._statusCell.setTextAndTitle(WebInspector.UIString("(data)"));}else if(this._request.isPingRequest()){this._statusCell.setTextAndTitle(WebInspector.UIString("(ping)"));}else if(this._request.canceled){this._statusCell.setTextAndTitle(WebInspector.UIString("(canceled)"));}else if(this._request.finished){this._statusCell.setTextAndTitle(WebInspector.UIString("Finished"));}else{this._statusCell.setTextAndTitle(WebInspector.UIString("(pending)"));}},_refreshSchemeCell:function()
+{this._schemeCell.setTextAndTitle(this._request.scheme);},_refreshDomainCell:function()
+{this._domainCell.setTextAndTitle(this._request.domain);},_refreshRemoteAddressCell:function()
+{this._remoteAddressCell.setTextAndTitle(this._request.remoteAddress());},_refreshTypeCell:function()
+{if(this._request.mimeType){this._typeCell.classList.remove("network-dim-cell");this._typeCell.setTextAndTitle(this._request.mimeType);}else{this._typeCell.classList.toggle("network-dim-cell",!this._request.isPingRequest());this._typeCell.setTextAndTitle(this._request.requestContentType()||"");}},_refreshInitiatorCell:function()
+{this._initiatorCell.removeChildren();this._initiatorCell.classList.remove("network-dim-cell");this._initiatorCell.classList.remove("network-script-initiated");delete this._initiatorCell.request;var request=this._request;var initiator=request.initiatorInfo();switch(initiator.type){case WebInspector.NetworkRequest.InitiatorType.Parser:this._initiatorCell.title=initiator.url+":"+initiator.lineNumber;this._initiatorCell.appendChild(WebInspector.linkifyResourceAsNode(initiator.url,initiator.lineNumber-1));this._appendSubtitle(this._initiatorCell,WebInspector.UIString("Parser"));break;case WebInspector.NetworkRequest.InitiatorType.Redirect:this._initiatorCell.title=initiator.url;console.assert(request.redirectSource);var redirectSource=(request.redirectSource);this._initiatorCell.appendChild(WebInspector.linkifyRequestAsNode(redirectSource));this._appendSubtitle(this._initiatorCell,WebInspector.UIString("Redirect"));break;case WebInspector.NetworkRequest.InitiatorType.Script:var urlElement=this._linkifier.linkifyLocation(initiator.url,initiator.lineNumber-1,initiator.columnNumber-1);urlElement.title="";this._initiatorCell.appendChild(urlElement);this._appendSubtitle(this._initiatorCell,WebInspector.UIString("Script"));this._initiatorCell.classList.add("network-script-initiated");this._initiatorCell.request=request;break;default:this._initiatorCell.title="";this._initiatorCell.classList.add("network-dim-cell");this._initiatorCell.setTextAndTitle(WebInspector.UIString("Other"));}},_refreshCookiesCell:function()
+{var requestCookies=this._request.requestCookies;this._cookiesCell.setTextAndTitle(requestCookies?""+requestCookies.length:"");},_refreshSetCookiesCell:function()
+{var responseCookies=this._request.responseCookies;this._setCookiesCell.setTextAndTitle(responseCookies?""+responseCookies.length:"");},_refreshSizeCell:function()
+{if(this._request.cached){this._sizeCell.setTextAndTitle(WebInspector.UIString("(from cache)"));this._sizeCell.classList.add("network-dim-cell");}else{var resourceSize=Number.bytesToString(this._request.resourceSize);var transferSize=Number.bytesToString(this._request.transferSize);this._sizeCell.setTextAndTitle(transferSize);this._sizeCell.classList.remove("network-dim-cell");this._appendSubtitle(this._sizeCell,resourceSize);}},_refreshTimeCell:function()
+{if(this._request.duration>0){this._timeCell.classList.remove("network-dim-cell");this._timeCell.setTextAndTitle(Number.secondsToString(this._request.duration));this._appendSubtitle(this._timeCell,Number.secondsToString(this._request.latency));}else{this._timeCell.classList.add("network-dim-cell");this._timeCell.setTextAndTitle(WebInspector.UIString("Pending"));}},_appendSubtitle:function(cellElement,subtitleText)
+{var subtitleElement=document.createElement("div");subtitleElement.className="network-cell-subtitle";subtitleElement.textContent=subtitleText;cellElement.appendChild(subtitleElement);},refreshGraph:function(calculator)
+{var percentages=calculator.computeBarGraphPercentages(this._request);this._percentages=percentages;this._barAreaElement.classList.remove("hidden");this._updateElementStyleClasses(this._timelineCell);this._barLeftElement.style.setProperty("left",percentages.start+"%");this._barRightElement.style.setProperty("right",(100-percentages.end)+"%");this._barLeftElement.style.setProperty("right",(100-percentages.end)+"%");this._barRightElement.style.setProperty("left",percentages.middle+"%");var labels=calculator.computeBarGraphLabels(this._request);this._labelLeftElement.textContent=labels.left;this._labelRightElement.textContent=labels.right;var tooltip=(labels.tooltip||"");this._barLeftElement.title=tooltip;this._labelLeftElement.title=tooltip;this._labelRightElement.title=tooltip;this._barRightElement.title=tooltip;},_refreshLabelPositions:function()
+{if(!this._percentages)
+return;this._labelLeftElement.style.removeProperty("left");this._labelLeftElement.style.removeProperty("right");this._labelLeftElement.classList.remove("before");this._labelLeftElement.classList.remove("hidden");this._labelRightElement.style.removeProperty("left");this._labelRightElement.style.removeProperty("right");this._labelRightElement.classList.remove("after");this._labelRightElement.classList.remove("hidden");const labelPadding=10;const barRightElementOffsetWidth=this._barRightElement.offsetWidth;const barLeftElementOffsetWidth=this._barLeftElement.offsetWidth;if(this._barLeftElement){var leftBarWidth=barLeftElementOffsetWidth-labelPadding;var rightBarWidth=(barRightElementOffsetWidth-barLeftElementOffsetWidth)-labelPadding;}else{var leftBarWidth=(barLeftElementOffsetWidth-barRightElementOffsetWidth)-labelPadding;var rightBarWidth=barRightElementOffsetWidth-labelPadding;}
+const labelLeftElementOffsetWidth=this._labelLeftElement.offsetWidth;const labelRightElementOffsetWidth=this._labelRightElement.offsetWidth;const labelBefore=(labelLeftElementOffsetWidth>leftBarWidth);const labelAfter=(labelRightElementOffsetWidth>rightBarWidth);const graphElementOffsetWidth=this._timelineCell.offsetWidth;if(labelBefore&&(graphElementOffsetWidth*(this._percentages.start/100))<(labelLeftElementOffsetWidth+10))
+var leftHidden=true;if(labelAfter&&(graphElementOffsetWidth*((100-this._percentages.end)/100))<(labelRightElementOffsetWidth+10))
+var rightHidden=true;if(barLeftElementOffsetWidth==barRightElementOffsetWidth){if(labelBefore&&!labelAfter)
+leftHidden=true;else if(labelAfter&&!labelBefore)
+rightHidden=true;}
+if(labelBefore){if(leftHidden)
+this._labelLeftElement.classList.add("hidden");this._labelLeftElement.style.setProperty("right",(100-this._percentages.start)+"%");this._labelLeftElement.classList.add("before");}else{this._labelLeftElement.style.setProperty("left",this._percentages.start+"%");this._labelLeftElement.style.setProperty("right",(100-this._percentages.middle)+"%");}
+if(labelAfter){if(rightHidden)
+this._labelRightElement.classList.add("hidden");this._labelRightElement.style.setProperty("left",this._percentages.end+"%");this._labelRightElement.classList.add("after");}else{this._labelRightElement.style.setProperty("left",this._percentages.middle+"%");this._labelRightElement.style.setProperty("right",(100-this._percentages.end)+"%");}},__proto__:WebInspector.DataGridNode.prototype}
+WebInspector.NetworkDataGridNode.NameComparator=function(a,b)
+{var aFileName=a._request.name();var bFileName=b._request.name();if(aFileName>bFileName)
+return 1;if(bFileName>aFileName)
+return-1;return 0;}
+WebInspector.NetworkDataGridNode.RemoteAddressComparator=function(a,b)
+{var aRemoteAddress=a._request.remoteAddress();var bRemoteAddress=b._request.remoteAddress();if(aRemoteAddress>bRemoteAddress)
+return 1;if(bRemoteAddress>aRemoteAddress)
+return-1;return 0;}
+WebInspector.NetworkDataGridNode.SizeComparator=function(a,b)
+{if(b._request.cached&&!a._request.cached)
+return 1;if(a._request.cached&&!b._request.cached)
+return-1;return a._request.transferSize-b._request.transferSize;}
+WebInspector.NetworkDataGridNode.InitiatorComparator=function(a,b)
+{var aInitiator=a._request.initiatorInfo();var bInitiator=b._request.initiatorInfo();if(aInitiator.type<bInitiator.type)
+return-1;if(aInitiator.type>bInitiator.type)
+return 1;if(aInitiator.source<bInitiator.source)
+return-1;if(aInitiator.source>bInitiator.source)
+return 1;if(aInitiator.lineNumber<bInitiator.lineNumber)
+return-1;if(aInitiator.lineNumber>bInitiator.lineNumber)
+return 1;if(aInitiator.columnNumber<bInitiator.columnNumber)
+return-1;if(aInitiator.columnNumber>bInitiator.columnNumber)
+return 1;return 0;}
+WebInspector.NetworkDataGridNode.RequestCookiesCountComparator=function(a,b)
+{var aScore=a._request.requestCookies?a._request.requestCookies.length:0;var bScore=b._request.requestCookies?b._request.requestCookies.length:0;return aScore-bScore;}
+WebInspector.NetworkDataGridNode.ResponseCookiesCountComparator=function(a,b)
+{var aScore=a._request.responseCookies?a._request.responseCookies.length:0;var bScore=b._request.responseCookies?b._request.responseCookies.length:0;return aScore-bScore;}
+WebInspector.NetworkDataGridNode.RequestPropertyComparator=function(propertyName,revert,a,b)
+{var aValue=a._request[propertyName];var bValue=b._request[propertyName];if(aValue>bValue)
+return revert?-1:1;if(bValue>aValue)
+return revert?1:-1;return 0;}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ProfilesPanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ProfilesPanel.js
new file mode 100644 (file)
index 0000000..d82f7c3
--- /dev/null
@@ -0,0 +1,1681 @@
+WebInspector.ProfileType=function(id,name)
+{WebInspector.Object.call(this);this._id=id;this._name=name;this._profiles=[];this._profileBeingRecorded=null;this._nextProfileUid=1;window.addEventListener("unload",this._clearTempStorage.bind(this),false);}
+WebInspector.ProfileType.Events={AddProfileHeader:"add-profile-header",RemoveProfileHeader:"remove-profile-header",ViewUpdated:"view-updated"}
+WebInspector.ProfileType.prototype={hasTemporaryView:function()
+{return false;},fileExtension:function()
+{return null;},get statusBarItems()
+{return[];},get buttonTooltip()
+{return"";},get id()
+{return this._id;},get treeItemTitle()
+{return this._name;},get name()
+{return this._name;},buttonClicked:function()
+{return false;},get description()
+{return"";},isInstantProfile:function()
+{return false;},isEnabled:function()
+{return true;},getProfiles:function()
+{function isFinished(profile)
+{return this._profileBeingRecorded!==profile;}
+return this._profiles.filter(isFinished.bind(this));},decorationElement:function()
+{return null;},getProfile:function(uid)
+{for(var i=0;i<this._profiles.length;++i){if(this._profiles[i].uid===uid)
+return this._profiles[i];}
+return null;},loadFromFile:function(file)
+{var name=file.name;if(name.endsWith(this.fileExtension()))
+name=name.substr(0,name.length-this.fileExtension().length);var profile=this.createProfileLoadedFromFile(name);profile.setFromFile();this._profileBeingRecorded=profile;this.addProfile(profile);profile.loadFromFile(file);},createProfileLoadedFromFile:function(title)
+{throw new Error("Needs implemented.");},addProfile:function(profile)
+{this._profiles.push(profile);this.dispatchEventToListeners(WebInspector.ProfileType.Events.AddProfileHeader,profile);},removeProfile:function(profile)
+{var index=this._profiles.indexOf(profile);if(index===-1)
+return;this._profiles.splice(index,1);this._disposeProfile(profile);},_clearTempStorage:function()
+{for(var i=0;i<this._profiles.length;++i)
+this._profiles[i].removeTempFile();},profileBeingRecorded:function()
+{return this._profileBeingRecorded;},profileBeingRecordedRemoved:function()
+{},_reset:function()
+{var profiles=this._profiles.slice(0);for(var i=0;i<profiles.length;++i)
+this._disposeProfile(profiles[i]);this._profiles=[];this._nextProfileUid=1;},_disposeProfile:function(profile)
+{this.dispatchEventToListeners(WebInspector.ProfileType.Events.RemoveProfileHeader,profile);profile.dispose();if(this._profileBeingRecorded===profile){this.profileBeingRecordedRemoved();this._profileBeingRecorded=null;}},__proto__:WebInspector.Object.prototype}
+WebInspector.ProfileHeader=function(profileType,title)
+{this._profileType=profileType;this.title=title;this.uid=profileType._nextProfileUid++;this._fromFile=false;}
+WebInspector.ProfileHeader.StatusUpdate=function(subtitle,wait)
+{this.subtitle=subtitle;this.wait=wait;}
+WebInspector.ProfileHeader.Events={UpdateStatus:"UpdateStatus",ProfileReceived:"ProfileReceived"}
+WebInspector.ProfileHeader.prototype={profileType:function()
+{return this._profileType;},updateStatus:function(subtitle,wait)
+{this.dispatchEventToListeners(WebInspector.ProfileHeader.Events.UpdateStatus,new WebInspector.ProfileHeader.StatusUpdate(subtitle,wait));},createSidebarTreeElement:function()
+{throw new Error("Needs implemented.");},createView:function()
+{throw new Error("Not implemented.");},removeTempFile:function()
+{if(this._tempFile)
+this._tempFile.remove();},dispose:function()
+{},load:function(callback)
+{},canSaveToFile:function()
+{return false;},saveToFile:function()
+{throw new Error("Needs implemented");},loadFromFile:function(file)
+{throw new Error("Needs implemented");},fromFile:function()
+{return this._fromFile;},setFromFile:function()
+{this._fromFile=true;},__proto__:WebInspector.Object.prototype}
+WebInspector.ProfilesPanel=function()
+{WebInspector.PanelWithSidebarTree.call(this,"profiles");this.registerRequiredCSS("panelEnablerView.css");this.registerRequiredCSS("heapProfiler.css");this.registerRequiredCSS("profilesPanel.css");this._searchableView=new WebInspector.SearchableView(this);var mainView=new WebInspector.VBox();this._searchableView.show(mainView.element);mainView.show(this.mainElement());this.profilesItemTreeElement=new WebInspector.ProfilesSidebarTreeElement(this);this.sidebarTree.appendChild(this.profilesItemTreeElement);this.profileViews=document.createElement("div");this.profileViews.id="profile-views";this.profileViews.classList.add("vbox");this._searchableView.element.appendChild(this.profileViews);var statusBarContainer=document.createElementWithClass("div","profiles-status-bar");mainView.element.insertBefore(statusBarContainer,mainView.element.firstChild);this._statusBarElement=statusBarContainer.createChild("div","status-bar");this.sidebarElement().classList.add("profiles-sidebar-tree-box");var statusBarContainerLeft=document.createElementWithClass("div","profiles-status-bar");this.sidebarElement().insertBefore(statusBarContainerLeft,this.sidebarElement().firstChild);this._statusBarButtons=statusBarContainerLeft.createChild("div","status-bar");this.recordButton=new WebInspector.StatusBarButton("","record-profile-status-bar-item");this.recordButton.addEventListener("click",this.toggleRecordButton,this);this._statusBarButtons.appendChild(this.recordButton.element);this.clearResultsButton=new WebInspector.StatusBarButton(WebInspector.UIString("Clear all profiles."),"clear-status-bar-item");this.clearResultsButton.addEventListener("click",this._reset,this);this._statusBarButtons.appendChild(this.clearResultsButton.element);this._profileTypeStatusBarItemsContainer=this._statusBarElement.createChild("div");this._profileViewStatusBarItemsContainer=this._statusBarElement.createChild("div");this._profileGroups={};this._launcherView=new WebInspector.MultiProfileLauncherView(this);this._launcherView.addEventListener(WebInspector.MultiProfileLauncherView.EventTypes.ProfileTypeSelected,this._onProfileTypeSelected,this);this._profileToView=[];this._typeIdToSidebarSection={};var types=WebInspector.ProfileTypeRegistry.instance.profileTypes();for(var i=0;i<types.length;i++)
+this._registerProfileType(types[i]);this._launcherView.restoreSelectedProfileType();this.profilesItemTreeElement.select();this._showLauncherView();this._createFileSelectorElement();this.element.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);this._registerShortcuts();this._configureCpuProfilerSamplingInterval();WebInspector.settings.highResolutionCpuProfiling.addChangeListener(this._configureCpuProfilerSamplingInterval,this);}
+WebInspector.ProfileTypeRegistry=function(){this._profileTypes=[];this.cpuProfileType=new WebInspector.CPUProfileType();this._addProfileType(this.cpuProfileType);this.heapSnapshotProfileType=new WebInspector.HeapSnapshotProfileType();this._addProfileType(this.heapSnapshotProfileType);this.trackingHeapSnapshotProfileType=new WebInspector.TrackingHeapSnapshotProfileType();this._addProfileType(this.trackingHeapSnapshotProfileType);HeapProfilerAgent.enable();if(Capabilities.isMainFrontend&&WebInspector.experimentsSettings.canvasInspection.isEnabled()){this.canvasProfileType=new WebInspector.CanvasProfileType();this._addProfileType(this.canvasProfileType);}}
+WebInspector.ProfileTypeRegistry.prototype={_addProfileType:function(profileType)
+{this._profileTypes.push(profileType);},profileTypes:function()
+{return this._profileTypes;}}
+WebInspector.ProfilesPanel.prototype={searchableView:function()
+{return this._searchableView;},_createFileSelectorElement:function()
+{if(this._fileSelectorElement)
+this.element.removeChild(this._fileSelectorElement);this._fileSelectorElement=WebInspector.createFileSelectorElement(this._loadFromFile.bind(this));this.element.appendChild(this._fileSelectorElement);},_findProfileTypeByExtension:function(fileName)
+{var types=WebInspector.ProfileTypeRegistry.instance.profileTypes();for(var i=0;i<types.length;i++){var type=types[i];var extension=type.fileExtension();if(!extension)
+continue;if(fileName.endsWith(type.fileExtension()))
+return type;}
+return null;},_registerShortcuts:function()
+{this.registerShortcuts(WebInspector.ShortcutsScreen.ProfilesPanelShortcuts.StartStopRecording,this.toggleRecordButton.bind(this));},_configureCpuProfilerSamplingInterval:function()
+{var intervalUs=WebInspector.settings.highResolutionCpuProfiling.get()?100:1000;ProfilerAgent.setSamplingInterval(intervalUs,didChangeInterval);function didChangeInterval(error)
+{if(error)
+WebInspector.console.showErrorMessage(error);}},_loadFromFile:function(file)
+{this._createFileSelectorElement();var profileType=this._findProfileTypeByExtension(file.name);if(!profileType){var extensions=[];var types=WebInspector.ProfileTypeRegistry.instance.profileTypes();for(var i=0;i<types.length;i++){var extension=types[i].fileExtension();if(!extension)
+continue;extensions.push(extension);}
+WebInspector.console.log(WebInspector.UIString("Can't load file. Only files with extensions '%s' can be loaded.",extensions.join("', '")));return;}
+if(!!profileType.profileBeingRecorded()){WebInspector.console.log(WebInspector.UIString("Can't load profile when other profile is recording."));return;}
+profileType.loadFromFile(file);},toggleRecordButton:function()
+{var type=this._selectedProfileType;var isProfiling=type.buttonClicked();this.recordButton.toggled=isProfiling;this.recordButton.title=type.buttonTooltip;if(isProfiling){this._launcherView.profileStarted();if(type.hasTemporaryView())
+this.showProfile(type.profileBeingRecorded());}else{this._launcherView.profileFinished();}
+return true;},_profileBeingRecordedRemoved:function()
+{this.recordButton.toggled=false;this.recordButton.title=this._selectedProfileType.buttonTooltip;this._launcherView.profileFinished();},_onProfileTypeSelected:function(event)
+{this._selectedProfileType=(event.data);this._updateProfileTypeSpecificUI();},_updateProfileTypeSpecificUI:function()
+{this.recordButton.title=this._selectedProfileType.buttonTooltip;this._launcherView.updateProfileType(this._selectedProfileType);this._profileTypeStatusBarItemsContainer.removeChildren();var statusBarItems=this._selectedProfileType.statusBarItems;if(statusBarItems){for(var i=0;i<statusBarItems.length;++i)
+this._profileTypeStatusBarItemsContainer.appendChild(statusBarItems[i]);}},_reset:function()
+{WebInspector.Panel.prototype.reset.call(this);var types=WebInspector.ProfileTypeRegistry.instance.profileTypes();for(var i=0;i<types.length;i++)
+types[i]._reset();delete this.visibleView;delete this.currentQuery;this.searchCanceled();this._profileGroups={};this.recordButton.toggled=false;if(this._selectedProfileType)
+this.recordButton.title=this._selectedProfileType.buttonTooltip;this._launcherView.profileFinished();this.sidebarTree.element.classList.remove("some-expandable");this._launcherView.detach();this.profileViews.removeChildren();this._profileViewStatusBarItemsContainer.removeChildren();this.removeAllListeners();this.recordButton.visible=true;this._profileViewStatusBarItemsContainer.classList.remove("hidden");this.clearResultsButton.element.classList.remove("hidden");this.profilesItemTreeElement.select();this._showLauncherView();},_showLauncherView:function()
+{this.closeVisibleView();this._profileViewStatusBarItemsContainer.removeChildren();this._launcherView.show(this.profileViews);this.visibleView=this._launcherView;},_garbageCollectButtonClicked:function()
+{HeapProfilerAgent.collectGarbage();},_registerProfileType:function(profileType)
+{this._launcherView.addProfileType(profileType);var profileTypeSection=new WebInspector.ProfileTypeSidebarSection(profileType);this._typeIdToSidebarSection[profileType.id]=profileTypeSection
+this.sidebarTree.appendChild(profileTypeSection);profileTypeSection.childrenListElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);function onAddProfileHeader(event)
+{this._addProfileHeader(event.data);}
+function onRemoveProfileHeader(event)
+{this._removeProfileHeader(event.data);}
+profileType.addEventListener(WebInspector.ProfileType.Events.ViewUpdated,this._updateProfileTypeSpecificUI,this);profileType.addEventListener(WebInspector.ProfileType.Events.AddProfileHeader,onAddProfileHeader,this);profileType.addEventListener(WebInspector.ProfileType.Events.RemoveProfileHeader,onRemoveProfileHeader,this);var profiles=profileType.getProfiles();for(var i=0;i<profiles.length;i++)
+this._addProfileHeader(profiles[i]);},_handleContextMenuEvent:function(event)
+{var element=event.srcElement;while(element&&!element.treeElement&&element!==this.element)
+element=element.parentElement;if(!element)
+return;if(element.treeElement&&element.treeElement.handleContextMenuEvent){element.treeElement.handleContextMenuEvent(event,this);return;}
+var contextMenu=new WebInspector.ContextMenu(event);if(this.visibleView instanceof WebInspector.HeapSnapshotView){this.visibleView.populateContextMenu(contextMenu,event);}
+if(element!==this.element||event.srcElement===this.sidebarElement()){contextMenu.appendItem(WebInspector.UIString("Load\u2026"),this._fileSelectorElement.click.bind(this._fileSelectorElement));}
+contextMenu.show();},showLoadFromFileDialog:function()
+{this._fileSelectorElement.click();},_addProfileHeader:function(profile)
+{var profileType=profile.profileType();var typeId=profileType.id;this._typeIdToSidebarSection[typeId].addProfileHeader(profile);;if(!this.visibleView||this.visibleView===this._launcherView)
+this.showProfile(profile);},_removeProfileHeader:function(profile)
+{if(profile.profileType()._profileBeingRecorded===profile)
+this._profileBeingRecordedRemoved();var i=this._indexOfViewForProfile(profile);if(i!==-1)
+this._profileToView.splice(i,1);var profileType=profile.profileType();var typeId=profileType.id;var sectionIsEmpty=this._typeIdToSidebarSection[typeId].removeProfileHeader(profile);if(sectionIsEmpty){this.profilesItemTreeElement.select();this._showLauncherView();}},showProfile:function(profile)
+{if(!profile||(profile.profileType().profileBeingRecorded()===profile)&&!profile.profileType().hasTemporaryView())
+return null;var view=this._viewForProfile(profile);if(view===this.visibleView)
+return view;this.closeVisibleView();view.show(this.profileViews);this.visibleView=view;var profileTypeSection=this._typeIdToSidebarSection[profile.profileType().id];var sidebarElement=profileTypeSection.sidebarElementForProfile(profile);sidebarElement.revealAndSelect();this._profileViewStatusBarItemsContainer.removeChildren();var statusBarItems=view.statusBarItems;if(statusBarItems)
+for(var i=0;i<statusBarItems.length;++i)
+this._profileViewStatusBarItemsContainer.appendChild(statusBarItems[i]);return view;},showObject:function(snapshotObjectId,perspectiveName)
+{var heapProfiles=WebInspector.ProfileTypeRegistry.instance.heapSnapshotProfileType.getProfiles();for(var i=0;i<heapProfiles.length;i++){var profile=heapProfiles[i];if(profile.maxJSObjectId>=snapshotObjectId){this.showProfile(profile);var view=this._viewForProfile(profile);view.highlightLiveObject(perspectiveName,snapshotObjectId);break;}}},_viewForProfile:function(profile)
+{var index=this._indexOfViewForProfile(profile);if(index!==-1)
+return this._profileToView[index].view;var view=profile.createView();view.element.classList.add("profile-view");this._profileToView.push({profile:profile,view:view});return view;},_indexOfViewForProfile:function(profile)
+{for(var i=0;i<this._profileToView.length;i++){if(this._profileToView[i].profile===profile)
+return i;}
+return-1;},closeVisibleView:function()
+{if(this.visibleView)
+this.visibleView.detach();delete this.visibleView;},performSearch:function(query,shouldJump)
+{this.searchCanceled();var visibleView=this.visibleView;if(!visibleView)
+return;function finishedCallback(view,searchMatches)
+{if(!searchMatches)
+return;this._searchableView.updateSearchMatchesCount(searchMatches);this._searchResultsView=view;if(shouldJump){view.jumpToFirstSearchResult();this._searchableView.updateCurrentMatchIndex(view.currentSearchResultIndex());}}
+visibleView.currentQuery=query;visibleView.performSearch(query,finishedCallback.bind(this));},jumpToNextSearchResult:function()
+{if(!this._searchResultsView)
+return;if(this._searchResultsView!==this.visibleView)
+return;this._searchResultsView.jumpToNextSearchResult();this._searchableView.updateCurrentMatchIndex(this._searchResultsView.currentSearchResultIndex());},jumpToPreviousSearchResult:function()
+{if(!this._searchResultsView)
+return;if(this._searchResultsView!==this.visibleView)
+return;this._searchResultsView.jumpToPreviousSearchResult();this._searchableView.updateCurrentMatchIndex(this._searchResultsView.currentSearchResultIndex());},searchCanceled:function()
+{if(this._searchResultsView){if(this._searchResultsView.searchCanceled)
+this._searchResultsView.searchCanceled();this._searchResultsView.currentQuery=null;this._searchResultsView=null;}
+this._searchableView.updateSearchMatchesCount(0);},appendApplicableItems:function(event,contextMenu,target)
+{if(!(target instanceof WebInspector.RemoteObject))
+return;if(WebInspector.inspectorView.currentPanel()!==this)
+return;var object=(target);var objectId=object.objectId;if(!objectId)
+return;var heapProfiles=WebInspector.ProfileTypeRegistry.instance.heapSnapshotProfileType.getProfiles();if(!heapProfiles.length)
+return;function revealInView(viewName)
+{HeapProfilerAgent.getHeapObjectId(objectId,didReceiveHeapObjectId.bind(this,viewName));}
+function didReceiveHeapObjectId(viewName,error,result)
+{if(WebInspector.inspectorView.currentPanel()!==this)
+return;if(!error)
+this.showObject(result,viewName);}
+if(WebInspector.settings.showAdvancedHeapSnapshotProperties.get())
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in Dominators view":"Reveal in Dominators View"),revealInView.bind(this,"Dominators"));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in Summary view":"Reveal in Summary View"),revealInView.bind(this,"Summary"));},__proto__:WebInspector.PanelWithSidebarTree.prototype}
+WebInspector.ProfileTypeSidebarSection=function(profileType)
+{WebInspector.SidebarSectionTreeElement.call(this,profileType.treeItemTitle,null,true);this._profileTreeElements=[];this._profileGroups={};this.hidden=true;}
+WebInspector.ProfileTypeSidebarSection.ProfileGroup=function()
+{this.profileSidebarTreeElements=[];this.sidebarTreeElement=null;}
+WebInspector.ProfileTypeSidebarSection.prototype={addProfileHeader:function(profile)
+{this.hidden=false;var profileType=profile.profileType();var sidebarParent=this;var profileTreeElement=profile.createSidebarTreeElement();this._profileTreeElements.push(profileTreeElement);if(!profile.fromFile()&&profileType.profileBeingRecorded()!==profile){var profileTitle=profile.title;var group=this._profileGroups[profileTitle];if(!group){group=new WebInspector.ProfileTypeSidebarSection.ProfileGroup();this._profileGroups[profileTitle]=group;}
+group.profileSidebarTreeElements.push(profileTreeElement);var groupSize=group.profileSidebarTreeElements.length;if(groupSize===2){group.sidebarTreeElement=new WebInspector.ProfileGroupSidebarTreeElement(profile.title);var firstProfileTreeElement=group.profileSidebarTreeElements[0];var index=this.children.indexOf(firstProfileTreeElement);this.insertChild(group.sidebarTreeElement,index);var selected=firstProfileTreeElement.selected;this.removeChild(firstProfileTreeElement);group.sidebarTreeElement.appendChild(firstProfileTreeElement);if(selected)
+firstProfileTreeElement.revealAndSelect();firstProfileTreeElement.small=true;firstProfileTreeElement.mainTitle=WebInspector.UIString("Run %d",1);this.treeOutline.element.classList.add("some-expandable");}
+if(groupSize>=2){sidebarParent=group.sidebarTreeElement;profileTreeElement.small=true;profileTreeElement.mainTitle=WebInspector.UIString("Run %d",groupSize);}}
+sidebarParent.appendChild(profileTreeElement);},removeProfileHeader:function(profile)
+{var index=this._sidebarElementIndex(profile);if(index===-1)
+return false;var profileTreeElement=this._profileTreeElements[index];this._profileTreeElements.splice(index,1);var sidebarParent=this;var group=this._profileGroups[profile.title];if(group){var groupElements=group.profileSidebarTreeElements;groupElements.splice(groupElements.indexOf(profileTreeElement),1);if(groupElements.length===1){var pos=sidebarParent.children.indexOf(group.sidebarTreeElement);this.insertChild(groupElements[0],pos);groupElements[0].small=false;groupElements[0].mainTitle=group.sidebarTreeElement.title;this.removeChild(group.sidebarTreeElement);}
+if(groupElements.length!==0)
+sidebarParent=group.sidebarTreeElement;}
+sidebarParent.removeChild(profileTreeElement);profileTreeElement.dispose();if(this.children.length)
+return false;this.hidden=true;return true;},sidebarElementForProfile:function(profile)
+{var index=this._sidebarElementIndex(profile);return index===-1?null:this._profileTreeElements[index];},_sidebarElementIndex:function(profile)
+{var elements=this._profileTreeElements;for(var i=0;i<elements.length;i++){if(elements[i].profile===profile)
+return i;}
+return-1;},__proto__:WebInspector.SidebarSectionTreeElement.prototype}
+WebInspector.ProfilesPanel.ContextMenuProvider=function()
+{}
+WebInspector.ProfilesPanel.ContextMenuProvider.prototype={appendApplicableItems:function(event,contextMenu,target)
+{WebInspector.inspectorView.panel("profiles").appendApplicableItems(event,contextMenu,target);}}
+WebInspector.ProfileSidebarTreeElement=function(profile,className)
+{this.profile=profile;WebInspector.SidebarTreeElement.call(this,className,profile.title,"",profile,false);this.refreshTitles();profile.addEventListener(WebInspector.ProfileHeader.Events.UpdateStatus,this._updateStatus,this);if(profile.canSaveToFile())
+this._createSaveLink();else
+profile.addEventListener(WebInspector.ProfileHeader.Events.ProfileReceived,this._onProfileReceived,this);}
+WebInspector.ProfileSidebarTreeElement.prototype={_createSaveLink:function()
+{this._saveLinkElement=this.titleContainer.createChild("span","save-link");this._saveLinkElement.textContent=WebInspector.UIString("Save");this._saveLinkElement.addEventListener("click",this._saveProfile.bind(this),false);},_onProfileReceived:function(event)
+{this._createSaveLink();},_updateStatus:function(event)
+{var statusUpdate=event.data;if(statusUpdate.subtitle!==null)
+this.subtitle=statusUpdate.subtitle;if(typeof statusUpdate.wait==="boolean")
+this.wait=statusUpdate.wait;this.refreshTitles();},dispose:function()
+{this.profile.removeEventListener(WebInspector.ProfileHeader.Events.UpdateStatus,this._updateStatus,this);this.profile.removeEventListener(WebInspector.ProfileHeader.Events.ProfileReceived,this._onProfileReceived,this);},onselect:function()
+{WebInspector.panels.profiles.showProfile(this.profile);},ondelete:function()
+{this.profile.profileType().removeProfile(this.profile);return true;},handleContextMenuEvent:function(event,panel)
+{var profile=this.profile;var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Load\u2026"),panel._fileSelectorElement.click.bind(panel._fileSelectorElement));if(profile.canSaveToFile())
+contextMenu.appendItem(WebInspector.UIString("Save\u2026"),profile.saveToFile.bind(profile));contextMenu.appendItem(WebInspector.UIString("Delete"),this.ondelete.bind(this));contextMenu.show();},_saveProfile:function(event)
+{this.profile.saveToFile();},__proto__:WebInspector.SidebarTreeElement.prototype}
+WebInspector.ProfileGroupSidebarTreeElement=function(title,subtitle)
+{WebInspector.SidebarTreeElement.call(this,"profile-group-sidebar-tree-item",title,subtitle,null,true);}
+WebInspector.ProfileGroupSidebarTreeElement.prototype={onselect:function()
+{if(this.children.length>0)
+WebInspector.panels.profiles.showProfile(this.children[this.children.length-1].profile);},__proto__:WebInspector.SidebarTreeElement.prototype}
+WebInspector.ProfilesSidebarTreeElement=function(panel)
+{this._panel=panel;this.small=false;WebInspector.SidebarTreeElement.call(this,"profile-launcher-view-tree-item",WebInspector.UIString("Profiles"),"",null,false);}
+WebInspector.ProfilesSidebarTreeElement.prototype={onselect:function()
+{this._panel._showLauncherView();},get selectable()
+{return true;},__proto__:WebInspector.SidebarTreeElement.prototype}
+WebInspector.ProfileDataGridNode=function(profileNode,owningTree,hasChildren)
+{this.profileNode=profileNode;WebInspector.DataGridNode.call(this,null,hasChildren);this.tree=owningTree;this.childrenByCallUID={};this.lastComparator=null;this.callUID=profileNode.callUID;this.selfTime=profileNode.selfTime;this.totalTime=profileNode.totalTime;this.functionName=profileNode.functionName;this._deoptReason=(!profileNode.deoptReason||profileNode.deoptReason==="no reason")?"":profileNode.deoptReason;this.url=profileNode.url;}
+WebInspector.ProfileDataGridNode.prototype={get data()
+{function formatMilliseconds(time)
+{return WebInspector.UIString("%.1f\u2009ms",time);}
+var data={};if(this._deoptReason){var content=document.createDocumentFragment();var marker=content.createChild("span","profile-warn-marker");marker.title=WebInspector.UIString("Not optimized: %s",this._deoptReason);content.createTextChild(this.functionName);data["function"]=content;}else
+data["function"]=this.functionName;if(this.tree.profileView.showSelfTimeAsPercent.get())
+data["self"]=WebInspector.UIString("%.2f%",this.selfPercent);else
+data["self"]=formatMilliseconds(this.selfTime);if(this.tree.profileView.showTotalTimeAsPercent.get())
+data["total"]=WebInspector.UIString("%.2f%",this.totalPercent);else
+data["total"]=formatMilliseconds(this.totalTime);return data;},createCell:function(columnIdentifier)
+{var cell=WebInspector.DataGridNode.prototype.createCell.call(this,columnIdentifier);if(columnIdentifier==="self"&&this._searchMatchedSelfColumn)
+cell.classList.add("highlight");else if(columnIdentifier==="total"&&this._searchMatchedTotalColumn)
+cell.classList.add("highlight");if(columnIdentifier!=="function")
+return cell;if(this._deoptReason)
+cell.classList.add("not-optimized");if(this.profileNode._searchMatchedFunctionColumn)
+cell.classList.add("highlight");if(this.profileNode.scriptId!=="0"){var lineNumber=this.profileNode.lineNumber?this.profileNode.lineNumber-1:0;var columnNumber=this.profileNode.columnNumber?this.profileNode.columnNumber-1:0;var location=new WebInspector.DebuggerModel.Location(this.profileNode.scriptId,lineNumber,columnNumber);var urlElement=this.tree.profileView._linkifier.linkifyRawLocation(location,"profile-node-file");if(!urlElement)
+urlElement=this.tree.profileView._linkifier.linkifyLocation(this.profileNode.url,lineNumber,columnNumber,"profile-node-file");urlElement.style.maxWidth="75%";cell.insertBefore(urlElement,cell.firstChild);}
+return cell;},select:function(supressSelectedEvent)
+{WebInspector.DataGridNode.prototype.select.call(this,supressSelectedEvent);this.tree.profileView._dataGridNodeSelected(this);},deselect:function(supressDeselectedEvent)
+{WebInspector.DataGridNode.prototype.deselect.call(this,supressDeselectedEvent);this.tree.profileView._dataGridNodeDeselected(this);},sort:function(comparator,force)
+{var gridNodeGroups=[[this]];for(var gridNodeGroupIndex=0;gridNodeGroupIndex<gridNodeGroups.length;++gridNodeGroupIndex){var gridNodes=gridNodeGroups[gridNodeGroupIndex];var count=gridNodes.length;for(var index=0;index<count;++index){var gridNode=gridNodes[index];if(!force&&(!gridNode.expanded||gridNode.lastComparator===comparator)){if(gridNode.children.length)
+gridNode.shouldRefreshChildren=true;continue;}
+gridNode.lastComparator=comparator;var children=gridNode.children;var childCount=children.length;if(childCount){children.sort(comparator);for(var childIndex=0;childIndex<childCount;++childIndex)
+children[childIndex]._recalculateSiblings(childIndex);gridNodeGroups.push(children);}}}},insertChild:function(profileDataGridNode,index)
+{WebInspector.DataGridNode.prototype.insertChild.call(this,profileDataGridNode,index);this.childrenByCallUID[profileDataGridNode.callUID]=profileDataGridNode;},removeChild:function(profileDataGridNode)
+{WebInspector.DataGridNode.prototype.removeChild.call(this,profileDataGridNode);delete this.childrenByCallUID[profileDataGridNode.callUID];},removeChildren:function()
+{WebInspector.DataGridNode.prototype.removeChildren.call(this);this.childrenByCallUID={};},findChild:function(node)
+{if(!node)
+return null;return this.childrenByCallUID[node.callUID];},get selfPercent()
+{return this.selfTime/this.tree.totalTime*100.0;},get totalPercent()
+{return this.totalTime/this.tree.totalTime*100.0;},get _parent()
+{return this.parent!==this.dataGrid?this.parent:this.tree;},populate:function()
+{if(this._populated)
+return;this._populated=true;this._sharedPopulate();var currentComparator=this.tree.lastComparator;if(currentComparator)
+this.sort(currentComparator,true);},_save:function()
+{if(this._savedChildren)
+return;this._savedSelfTime=this.selfTime;this._savedTotalTime=this.totalTime;this._savedChildren=this.children.slice();},_restore:function()
+{if(!this._savedChildren)
+return;this.selfTime=this._savedSelfTime;this.totalTime=this._savedTotalTime;this.removeChildren();var children=this._savedChildren;var count=children.length;for(var index=0;index<count;++index){children[index]._restore();this.appendChild(children[index]);}},_merge:function(child,shouldAbsorb)
+{this.selfTime+=child.selfTime;if(!shouldAbsorb)
+this.totalTime+=child.totalTime;var children=this.children.slice();this.removeChildren();var count=children.length;for(var index=0;index<count;++index){if(!shouldAbsorb||children[index]!==child)
+this.appendChild(children[index]);}
+children=child.children.slice();count=children.length;for(var index=0;index<count;++index){var orphanedChild=children[index],existingChild=this.childrenByCallUID[orphanedChild.callUID];if(existingChild)
+existingChild._merge(orphanedChild,false);else
+this.appendChild(orphanedChild);}},__proto__:WebInspector.DataGridNode.prototype}
+WebInspector.ProfileDataGridTree=function(profileView,rootProfileNode)
+{this.tree=this;this.children=[];this.profileView=profileView;this.totalTime=rootProfileNode.totalTime;this.lastComparator=null;this.childrenByCallUID={};}
+WebInspector.ProfileDataGridTree.prototype={get expanded()
+{return true;},appendChild:function(child)
+{this.insertChild(child,this.children.length);},insertChild:function(child,index)
+{this.children.splice(index,0,child);this.childrenByCallUID[child.callUID]=child;},removeChildren:function()
+{this.children=[];this.childrenByCallUID={};},findChild:WebInspector.ProfileDataGridNode.prototype.findChild,sort:WebInspector.ProfileDataGridNode.prototype.sort,_save:function()
+{if(this._savedChildren)
+return;this._savedTotalTime=this.totalTime;this._savedChildren=this.children.slice();},restore:function()
+{if(!this._savedChildren)
+return;this.children=this._savedChildren;this.totalTime=this._savedTotalTime;var children=this.children;var count=children.length;for(var index=0;index<count;++index)
+children[index]._restore();this._savedChildren=null;}}
+WebInspector.ProfileDataGridTree.propertyComparators=[{},{}];WebInspector.ProfileDataGridTree.propertyComparator=function(property,isAscending)
+{var comparator=WebInspector.ProfileDataGridTree.propertyComparators[(isAscending?1:0)][property];if(!comparator){if(isAscending){comparator=function(lhs,rhs)
+{if(lhs[property]<rhs[property])
+return-1;if(lhs[property]>rhs[property])
+return 1;return 0;}}else{comparator=function(lhs,rhs)
+{if(lhs[property]>rhs[property])
+return-1;if(lhs[property]<rhs[property])
+return 1;return 0;}}
+WebInspector.ProfileDataGridTree.propertyComparators[(isAscending?1:0)][property]=comparator;}
+return comparator;};WebInspector.BottomUpProfileDataGridNode=function(profileNode,owningTree)
+{WebInspector.ProfileDataGridNode.call(this,profileNode,owningTree,this._willHaveChildren(profileNode));this._remainingNodeInfos=[];}
+WebInspector.BottomUpProfileDataGridNode.prototype={_takePropertiesFromProfileDataGridNode:function(profileDataGridNode)
+{this._save();this.selfTime=profileDataGridNode.selfTime;this.totalTime=profileDataGridNode.totalTime;},_keepOnlyChild:function(child)
+{this._save();this.removeChildren();this.appendChild(child);},_exclude:function(aCallUID)
+{if(this._remainingNodeInfos)
+this.populate();this._save();var children=this.children;var index=this.children.length;while(index--)
+children[index]._exclude(aCallUID);var child=this.childrenByCallUID[aCallUID];if(child)
+this._merge(child,true);},_restore:function()
+{WebInspector.ProfileDataGridNode.prototype._restore();if(!this.children.length)
+this.hasChildren=this._willHaveChildren(this.profileNode);},_merge:function(child,shouldAbsorb)
+{this.selfTime-=child.selfTime;WebInspector.ProfileDataGridNode.prototype._merge.call(this,child,shouldAbsorb);},_sharedPopulate:function()
+{var remainingNodeInfos=this._remainingNodeInfos;var count=remainingNodeInfos.length;for(var index=0;index<count;++index){var nodeInfo=remainingNodeInfos[index];var ancestor=nodeInfo.ancestor;var focusNode=nodeInfo.focusNode;var child=this.findChild(ancestor);if(child){var totalTimeAccountedFor=nodeInfo.totalTimeAccountedFor;child.selfTime+=focusNode.selfTime;if(!totalTimeAccountedFor)
+child.totalTime+=focusNode.totalTime;}else{child=new WebInspector.BottomUpProfileDataGridNode(ancestor,this.tree);if(ancestor!==focusNode){child.selfTime=focusNode.selfTime;child.totalTime=focusNode.totalTime;}
+this.appendChild(child);}
+var parent=ancestor.parent;if(parent&&parent.parent){nodeInfo.ancestor=parent;child._remainingNodeInfos.push(nodeInfo);}}
+delete this._remainingNodeInfos;},_willHaveChildren:function(profileNode)
+{return!!(profileNode.parent&&profileNode.parent.parent);},__proto__:WebInspector.ProfileDataGridNode.prototype}
+WebInspector.BottomUpProfileDataGridTree=function(profileView,rootProfileNode)
+{WebInspector.ProfileDataGridTree.call(this,profileView,rootProfileNode);var profileNodeUIDs=0;var profileNodeGroups=[[],[rootProfileNode]];var visitedProfileNodesForCallUID={};this._remainingNodeInfos=[];for(var profileNodeGroupIndex=0;profileNodeGroupIndex<profileNodeGroups.length;++profileNodeGroupIndex){var parentProfileNodes=profileNodeGroups[profileNodeGroupIndex];var profileNodes=profileNodeGroups[++profileNodeGroupIndex];var count=profileNodes.length;for(var index=0;index<count;++index){var profileNode=profileNodes[index];if(!profileNode.UID)
+profileNode.UID=++profileNodeUIDs;if(profileNode.head&&profileNode!==profileNode.head){var visitedNodes=visitedProfileNodesForCallUID[profileNode.callUID];var totalTimeAccountedFor=false;if(!visitedNodes){visitedNodes={}
+visitedProfileNodesForCallUID[profileNode.callUID]=visitedNodes;}else{var parentCount=parentProfileNodes.length;for(var parentIndex=0;parentIndex<parentCount;++parentIndex){if(visitedNodes[parentProfileNodes[parentIndex].UID]){totalTimeAccountedFor=true;break;}}}
+visitedNodes[profileNode.UID]=true;this._remainingNodeInfos.push({ancestor:profileNode,focusNode:profileNode,totalTimeAccountedFor:totalTimeAccountedFor});}
+var children=profileNode.children;if(children.length){profileNodeGroups.push(parentProfileNodes.concat([profileNode]))
+profileNodeGroups.push(children);}}}
+var any=(this);var node=(any);WebInspector.BottomUpProfileDataGridNode.prototype.populate.call(node);return this;}
+WebInspector.BottomUpProfileDataGridTree.prototype={focus:function(profileDataGridNode)
+{if(!profileDataGridNode)
+return;this._save();var currentNode=profileDataGridNode;var focusNode=profileDataGridNode;while(currentNode.parent&&(currentNode instanceof WebInspector.ProfileDataGridNode)){currentNode._takePropertiesFromProfileDataGridNode(profileDataGridNode);focusNode=currentNode;currentNode=currentNode.parent;if(currentNode instanceof WebInspector.ProfileDataGridNode)
+currentNode._keepOnlyChild(focusNode);}
+this.children=[focusNode];this.totalTime=profileDataGridNode.totalTime;},exclude:function(profileDataGridNode)
+{if(!profileDataGridNode)
+return;this._save();var excludedCallUID=profileDataGridNode.callUID;var excludedTopLevelChild=this.childrenByCallUID[excludedCallUID];if(excludedTopLevelChild)
+this.children.remove(excludedTopLevelChild);var children=this.children;var count=children.length;for(var index=0;index<count;++index)
+children[index]._exclude(excludedCallUID);if(this.lastComparator)
+this.sort(this.lastComparator,true);},_sharedPopulate:WebInspector.BottomUpProfileDataGridNode.prototype._sharedPopulate,__proto__:WebInspector.ProfileDataGridTree.prototype};WebInspector.CPUProfileFlameChart=function(dataProvider)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("flameChart.css");this.element.id="cpu-flame-chart";this._overviewPane=new WebInspector.CPUProfileFlameChart.OverviewPane(dataProvider);this._overviewPane.show(this.element);this._mainPane=new WebInspector.FlameChart(dataProvider,this._overviewPane,true,false);this._mainPane.show(this.element);this._mainPane.addEventListener(WebInspector.FlameChart.Events.EntrySelected,this._onEntrySelected,this);this._overviewPane._overviewGrid.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged,this._onWindowChanged,this);}
+WebInspector.CPUProfileFlameChart.prototype={_onWindowChanged:function(event)
+{this._mainPane.changeWindow(this._overviewPane._overviewGrid.windowLeft(),this._overviewPane._overviewGrid.windowRight());},selectRange:function(timeLeft,timeRight)
+{this._overviewPane._selectRange(timeLeft,timeRight);},_onEntrySelected:function(event)
+{this.dispatchEventToListeners(WebInspector.FlameChart.Events.EntrySelected,event.data);},update:function()
+{this._overviewPane.update();this._mainPane.update();},__proto__:WebInspector.VBox.prototype};WebInspector.CPUProfileFlameChart.OverviewCalculator=function()
+{}
+WebInspector.CPUProfileFlameChart.OverviewCalculator.prototype={paddingLeft:function()
+{return 0;},_updateBoundaries:function(overviewPane)
+{this._minimumBoundaries=0;var totalTime=overviewPane._dataProvider.totalTime();this._maximumBoundaries=totalTime;this._xScaleFactor=overviewPane._overviewCanvas.width/totalTime;},computePosition:function(time)
+{return(time-this._minimumBoundaries)*this._xScaleFactor;},formatTime:function(value,precision)
+{return Number.secondsToString((value+this._minimumBoundaries)/1000);},maximumBoundary:function()
+{return this._maximumBoundaries;},minimumBoundary:function()
+{return this._minimumBoundaries;},zeroTime:function()
+{return this._minimumBoundaries;},boundarySpan:function()
+{return this._maximumBoundaries-this._minimumBoundaries;}}
+WebInspector.CPUProfileFlameChart.ColorGenerator=function()
+{this._colors={};this._currentColorIndex=0;}
+WebInspector.CPUProfileFlameChart.ColorGenerator.prototype={setColorForID:function(id,color)
+{this._colors[id]=color;},colorForID:function(id,sat)
+{if(typeof sat!=="number")
+sat=100;var color=this._colors[id];if(!color){color=this._createColor(this._currentColorIndex++,sat);this._colors[id]=color;}
+return color;},_createColor:function(index,sat)
+{var hue=(index*7+12*(index%2))%360;return"hsla("+hue+", "+sat+"%, 66%, 0.7)";}}
+WebInspector.CPUProfileFlameChart.OverviewPane=function(dataProvider)
+{WebInspector.VBox.call(this);this.element.classList.add("flame-chart-overview-pane");this._overviewContainer=this.element.createChild("div","overview-container");this._overviewGrid=new WebInspector.OverviewGrid("flame-chart");this._overviewGrid.element.classList.add("fill");this._overviewCanvas=this._overviewContainer.createChild("canvas","flame-chart-overview-canvas");this._overviewContainer.appendChild(this._overviewGrid.element);this._overviewCalculator=new WebInspector.CPUProfileFlameChart.OverviewCalculator();this._dataProvider=dataProvider;}
+WebInspector.CPUProfileFlameChart.OverviewPane.prototype={requestWindowTimes:function(windowStartTime,windowEndTime)
+{this._overviewGrid.setWindow(windowStartTime/this._dataProvider.totalTime(),windowEndTime/this._dataProvider.totalTime());},_selectRange:function(timeLeft,timeRight)
+{this._overviewGrid.setWindow(timeLeft/this._dataProvider.totalTime(),timeRight/this._dataProvider.totalTime());},_timelineData:function()
+{return this._dataProvider.timelineData();},onResize:function()
+{this._scheduleUpdate();},_scheduleUpdate:function()
+{if(this._updateTimerId)
+return;this._updateTimerId=requestAnimationFrame(this.update.bind(this));},update:function()
+{this._updateTimerId=0;var timelineData=this._timelineData();if(!timelineData)
+return;this._resetCanvas(this._overviewContainer.clientWidth,this._overviewContainer.clientHeight-WebInspector.FlameChart.DividersBarHeight);this._overviewCalculator._updateBoundaries(this);this._overviewGrid.updateDividers(this._overviewCalculator);WebInspector.CPUProfileFlameChart.OverviewPane.drawOverviewCanvas(this._dataProvider,timelineData,this._overviewCanvas.getContext("2d"),this._overviewContainer.clientWidth,this._overviewContainer.clientHeight-WebInspector.FlameChart.DividersBarHeight);},_resetCanvas:function(width,height)
+{var ratio=window.devicePixelRatio;this._overviewCanvas.width=width*ratio;this._overviewCanvas.height=height*ratio;},__proto__:WebInspector.VBox.prototype}
+WebInspector.CPUProfileFlameChart.OverviewPane.calculateDrawData=function(dataProvider,timelineData,width)
+{var entryOffsets=timelineData.entryOffsets;var entryTotalTimes=timelineData.entryTotalTimes;var entryLevels=timelineData.entryLevels;var length=entryOffsets.length;var drawData=new Uint8Array(width);var scaleFactor=width/dataProvider.totalTime();for(var entryIndex=0;entryIndex<length;++entryIndex){var start=Math.floor(entryOffsets[entryIndex]*scaleFactor);var finish=Math.floor((entryOffsets[entryIndex]+entryTotalTimes[entryIndex])*scaleFactor);for(var x=start;x<=finish;++x)
+drawData[x]=Math.max(drawData[x],entryLevels[entryIndex]+1);}
+return drawData;}
+WebInspector.CPUProfileFlameChart.OverviewPane.drawOverviewCanvas=function(dataProvider,timelineData,context,width,height)
+{var ratio=window.devicePixelRatio;var canvasWidth=width*ratio;var canvasHeight=height*ratio;var drawData=WebInspector.CPUProfileFlameChart.OverviewPane.calculateDrawData(dataProvider,timelineData,canvasWidth);if(!drawData)
+return;var yScaleFactor=canvasHeight/(dataProvider.maxStackDepth()*1.1);context.lineWidth=1;context.translate(0.5,0.5);context.strokeStyle="rgba(20,0,0,0.4)";context.fillStyle="rgba(214,225,254,0.8)";context.moveTo(-1,canvasHeight-1);context.lineTo(-1,Math.round(canvasHeight-drawData[0]*yScaleFactor-1));var value;for(var x=0;x<canvasWidth;++x){value=Math.round(canvasHeight-drawData[x]*yScaleFactor-1);context.lineTo(x,value);}
+context.lineTo(canvasWidth+1,value);context.lineTo(canvasWidth+1,canvasHeight-1);context.fill();context.stroke();context.closePath();};WebInspector.CPUProfileView=function(profileHeader)
+{WebInspector.VBox.call(this);this.element.classList.add("cpu-profile-view");this.showSelfTimeAsPercent=WebInspector.settings.createSetting("cpuProfilerShowSelfTimeAsPercent",true);this.showTotalTimeAsPercent=WebInspector.settings.createSetting("cpuProfilerShowTotalTimeAsPercent",true);this.showAverageTimeAsPercent=WebInspector.settings.createSetting("cpuProfilerShowAverageTimeAsPercent",true);this._viewType=WebInspector.settings.createSetting("cpuProfilerView",WebInspector.CPUProfileView._TypeHeavy);var columns=[];columns.push({id:"self",title:WebInspector.UIString("Self"),width:"72px",sort:WebInspector.DataGrid.Order.Descending,sortable:true});columns.push({id:"total",title:WebInspector.UIString("Total"),width:"72px",sortable:true});columns.push({id:"function",title:WebInspector.UIString("Function"),disclosure:true,sortable:true});this.dataGrid=new WebInspector.DataGrid(columns);this.dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged,this._sortProfile,this);this.dataGrid.element.addEventListener("mousedown",this._mouseDownInDataGrid.bind(this),true);this.dataGrid.show(this.element);this.viewSelectComboBox=new WebInspector.StatusBarComboBox(this._changeView.bind(this));var options={};options[WebInspector.CPUProfileView._TypeFlame]=this.viewSelectComboBox.createOption(WebInspector.UIString("Chart"),"",WebInspector.CPUProfileView._TypeFlame);options[WebInspector.CPUProfileView._TypeHeavy]=this.viewSelectComboBox.createOption(WebInspector.UIString("Heavy (Bottom Up)"),"",WebInspector.CPUProfileView._TypeHeavy);options[WebInspector.CPUProfileView._TypeTree]=this.viewSelectComboBox.createOption(WebInspector.UIString("Tree (Top Down)"),"",WebInspector.CPUProfileView._TypeTree);var optionName=this._viewType.get()||WebInspector.CPUProfileView._TypeFlame;var option=options[optionName]||options[WebInspector.CPUProfileView._TypeFlame];this.viewSelectComboBox.select(option);this._statusBarButtonsElement=document.createElement("span");this.percentButton=new WebInspector.StatusBarButton("","percent-time-status-bar-item");this.percentButton.addEventListener("click",this._percentClicked,this);this._statusBarButtonsElement.appendChild(this.percentButton.element);this.focusButton=new WebInspector.StatusBarButton(WebInspector.UIString("Focus selected function."),"focus-profile-node-status-bar-item");this.focusButton.setEnabled(false);this.focusButton.addEventListener("click",this._focusClicked,this);this._statusBarButtonsElement.appendChild(this.focusButton.element);this.excludeButton=new WebInspector.StatusBarButton(WebInspector.UIString("Exclude selected function."),"exclude-profile-node-status-bar-item");this.excludeButton.setEnabled(false);this.excludeButton.addEventListener("click",this._excludeClicked,this);this._statusBarButtonsElement.appendChild(this.excludeButton.element);this.resetButton=new WebInspector.StatusBarButton(WebInspector.UIString("Restore all functions."),"reset-profile-status-bar-item");this.resetButton.visible=false;this.resetButton.addEventListener("click",this._resetClicked,this);this._statusBarButtonsElement.appendChild(this.resetButton.element);this.profileHead=(null);this.profile=profileHeader;this._linkifier=new WebInspector.Linkifier(new WebInspector.Linkifier.DefaultFormatter(30));if(this.profile._profile)
+this._processProfileData(this.profile._profile);else
+this._processProfileData(this.profile.protocolProfile());}
+WebInspector.CPUProfileView._TypeFlame="Flame";WebInspector.CPUProfileView._TypeTree="Tree";WebInspector.CPUProfileView._TypeHeavy="Heavy";WebInspector.CPUProfileView.prototype={selectRange:function(timeLeft,timeRight)
+{if(!this._flameChart)
+return;this._flameChart.selectRange(timeLeft,timeRight);},_processProfileData:function(profile)
+{this.profileHead=profile.head;this.samples=profile.samples;this._calculateTimes(profile);this._assignParentsInProfile();if(this.samples)
+this._buildIdToNodeMap();this._changeView();this._updatePercentButton();if(this._flameChart)
+this._flameChart.update();},get statusBarItems()
+{return[this.viewSelectComboBox.element,this._statusBarButtonsElement];},_getBottomUpProfileDataGridTree:function()
+{if(!this._bottomUpProfileDataGridTree)
+this._bottomUpProfileDataGridTree=new WebInspector.BottomUpProfileDataGridTree(this,(this.profileHead));return this._bottomUpProfileDataGridTree;},_getTopDownProfileDataGridTree:function()
+{if(!this._topDownProfileDataGridTree)
+this._topDownProfileDataGridTree=new WebInspector.TopDownProfileDataGridTree(this,(this.profileHead));return this._topDownProfileDataGridTree;},willHide:function()
+{this._currentSearchResultIndex=-1;},refresh:function()
+{var selectedProfileNode=this.dataGrid.selectedNode?this.dataGrid.selectedNode.profileNode:null;this.dataGrid.rootNode().removeChildren();var children=this.profileDataGridTree.children;var count=children.length;for(var index=0;index<count;++index)
+this.dataGrid.rootNode().appendChild(children[index]);if(selectedProfileNode)
+selectedProfileNode.selected=true;},refreshVisibleData:function()
+{var child=this.dataGrid.rootNode().children[0];while(child){child.refresh();child=child.traverseNextNode(false,null,true);}},refreshShowAsPercents:function()
+{this._updatePercentButton();this.refreshVisibleData();},searchCanceled:function()
+{if(this._searchResults){for(var i=0;i<this._searchResults.length;++i){var profileNode=this._searchResults[i].profileNode;delete profileNode._searchMatchedSelfColumn;delete profileNode._searchMatchedTotalColumn;delete profileNode._searchMatchedFunctionColumn;profileNode.refresh();}}
+delete this._searchFinishedCallback;this._currentSearchResultIndex=-1;this._searchResults=[];},performSearch:function(query,finishedCallback)
+{this.searchCanceled();query=query.trim();if(!query.length)
+return;this._searchFinishedCallback=finishedCallback;var greaterThan=(query.startsWith(">"));var lessThan=(query.startsWith("<"));var equalTo=(query.startsWith("=")||((greaterThan||lessThan)&&query.indexOf("=")===1));var percentUnits=(query.lastIndexOf("%")===(query.length-1));var millisecondsUnits=(query.length>2&&query.lastIndexOf("ms")===(query.length-2));var secondsUnits=(!millisecondsUnits&&query.lastIndexOf("s")===(query.length-1));var queryNumber=parseFloat(query);if(greaterThan||lessThan||equalTo){if(equalTo&&(greaterThan||lessThan))
+queryNumber=parseFloat(query.substring(2));else
+queryNumber=parseFloat(query.substring(1));}
+var queryNumberMilliseconds=(secondsUnits?(queryNumber*1000):queryNumber);if(!isNaN(queryNumber)&&!(greaterThan||lessThan))
+equalTo=true;var matcher=createPlainTextSearchRegex(query,"i");function matchesQuery(profileDataGridNode)
+{delete profileDataGridNode._searchMatchedSelfColumn;delete profileDataGridNode._searchMatchedTotalColumn;delete profileDataGridNode._searchMatchedFunctionColumn;if(percentUnits){if(lessThan){if(profileDataGridNode.selfPercent<queryNumber)
+profileDataGridNode._searchMatchedSelfColumn=true;if(profileDataGridNode.totalPercent<queryNumber)
+profileDataGridNode._searchMatchedTotalColumn=true;}else if(greaterThan){if(profileDataGridNode.selfPercent>queryNumber)
+profileDataGridNode._searchMatchedSelfColumn=true;if(profileDataGridNode.totalPercent>queryNumber)
+profileDataGridNode._searchMatchedTotalColumn=true;}
+if(equalTo){if(profileDataGridNode.selfPercent==queryNumber)
+profileDataGridNode._searchMatchedSelfColumn=true;if(profileDataGridNode.totalPercent==queryNumber)
+profileDataGridNode._searchMatchedTotalColumn=true;}}else if(millisecondsUnits||secondsUnits){if(lessThan){if(profileDataGridNode.selfTime<queryNumberMilliseconds)
+profileDataGridNode._searchMatchedSelfColumn=true;if(profileDataGridNode.totalTime<queryNumberMilliseconds)
+profileDataGridNode._searchMatchedTotalColumn=true;}else if(greaterThan){if(profileDataGridNode.selfTime>queryNumberMilliseconds)
+profileDataGridNode._searchMatchedSelfColumn=true;if(profileDataGridNode.totalTime>queryNumberMilliseconds)
+profileDataGridNode._searchMatchedTotalColumn=true;}
+if(equalTo){if(profileDataGridNode.selfTime==queryNumberMilliseconds)
+profileDataGridNode._searchMatchedSelfColumn=true;if(profileDataGridNode.totalTime==queryNumberMilliseconds)
+profileDataGridNode._searchMatchedTotalColumn=true;}}
+if(profileDataGridNode.functionName.match(matcher)||(profileDataGridNode.url&&profileDataGridNode.url.match(matcher)))
+profileDataGridNode._searchMatchedFunctionColumn=true;if(profileDataGridNode._searchMatchedSelfColumn||profileDataGridNode._searchMatchedTotalColumn||profileDataGridNode._searchMatchedFunctionColumn)
+{profileDataGridNode.refresh();return true;}
+return false;}
+var current=this.profileDataGridTree.children[0];while(current){if(matchesQuery(current)){this._searchResults.push({profileNode:current});}
+current=current.traverseNextNode(false,null,false);}
+finishedCallback(this,this._searchResults.length);},jumpToFirstSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;this._currentSearchResultIndex=0;this._jumpToSearchResult(this._currentSearchResultIndex);},jumpToLastSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;this._currentSearchResultIndex=(this._searchResults.length-1);this._jumpToSearchResult(this._currentSearchResultIndex);},jumpToNextSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;if(++this._currentSearchResultIndex>=this._searchResults.length)
+this._currentSearchResultIndex=0;this._jumpToSearchResult(this._currentSearchResultIndex);},jumpToPreviousSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;if(--this._currentSearchResultIndex<0)
+this._currentSearchResultIndex=(this._searchResults.length-1);this._jumpToSearchResult(this._currentSearchResultIndex);},showingFirstSearchResult:function()
+{return(this._currentSearchResultIndex===0);},showingLastSearchResult:function()
+{return(this._searchResults&&this._currentSearchResultIndex===(this._searchResults.length-1));},currentSearchResultIndex:function(){return this._currentSearchResultIndex;},_jumpToSearchResult:function(index)
+{var searchResult=this._searchResults[index];if(!searchResult)
+return;var profileNode=searchResult.profileNode;profileNode.revealAndSelect();},_ensureFlameChartCreated:function()
+{if(this._flameChart)
+return;this._dataProvider=new WebInspector.CPUFlameChartDataProvider(this);this._flameChart=new WebInspector.CPUProfileFlameChart(this._dataProvider);this._flameChart.addEventListener(WebInspector.FlameChart.Events.EntrySelected,this._onEntrySelected.bind(this));},_onEntrySelected:function(event)
+{var entryIndex=event.data;var node=this._dataProvider._entryNodes[entryIndex];if(!node||!node.scriptId)
+return;var script=WebInspector.debuggerModel.scriptForId(node.scriptId)
+if(!script)
+return;WebInspector.Revealer.reveal(script.rawLocationToUILocation(node.lineNumber));},_changeView:function()
+{if(!this.profile)
+return;switch(this.viewSelectComboBox.selectedOption().value){case WebInspector.CPUProfileView._TypeFlame:this._ensureFlameChartCreated();this.dataGrid.detach();this._flameChart.show(this.element);this._viewType.set(WebInspector.CPUProfileView._TypeFlame);this._statusBarButtonsElement.classList.toggle("hidden",true);return;case WebInspector.CPUProfileView._TypeTree:this.profileDataGridTree=this._getTopDownProfileDataGridTree();this._sortProfile();this._viewType.set(WebInspector.CPUProfileView._TypeTree);break;case WebInspector.CPUProfileView._TypeHeavy:this.profileDataGridTree=this._getBottomUpProfileDataGridTree();this._sortProfile();this._viewType.set(WebInspector.CPUProfileView._TypeHeavy);break;}
+this._statusBarButtonsElement.classList.toggle("hidden",false);if(this._flameChart)
+this._flameChart.detach();this.dataGrid.show(this.element);if(!this.currentQuery||!this._searchFinishedCallback||!this._searchResults)
+return;this._searchFinishedCallback(this,-this._searchResults.length);this.performSearch(this.currentQuery,this._searchFinishedCallback);},_percentClicked:function(event)
+{var currentState=this.showSelfTimeAsPercent.get()&&this.showTotalTimeAsPercent.get()&&this.showAverageTimeAsPercent.get();this.showSelfTimeAsPercent.set(!currentState);this.showTotalTimeAsPercent.set(!currentState);this.showAverageTimeAsPercent.set(!currentState);this.refreshShowAsPercents();},_updatePercentButton:function()
+{if(this.showSelfTimeAsPercent.get()&&this.showTotalTimeAsPercent.get()&&this.showAverageTimeAsPercent.get()){this.percentButton.title=WebInspector.UIString("Show absolute total and self times.");this.percentButton.toggled=true;}else{this.percentButton.title=WebInspector.UIString("Show total and self times as percentages.");this.percentButton.toggled=false;}},_focusClicked:function(event)
+{if(!this.dataGrid.selectedNode)
+return;this.resetButton.visible=true;this.profileDataGridTree.focus(this.dataGrid.selectedNode);this.refresh();this.refreshVisibleData();},_excludeClicked:function(event)
+{var selectedNode=this.dataGrid.selectedNode
+if(!selectedNode)
+return;selectedNode.deselect();this.resetButton.visible=true;this.profileDataGridTree.exclude(selectedNode);this.refresh();this.refreshVisibleData();},_resetClicked:function(event)
+{this.resetButton.visible=false;this.profileDataGridTree.restore();this._linkifier.reset();this.refresh();this.refreshVisibleData();},_dataGridNodeSelected:function(node)
+{this.focusButton.setEnabled(true);this.excludeButton.setEnabled(true);},_dataGridNodeDeselected:function(node)
+{this.focusButton.setEnabled(false);this.excludeButton.setEnabled(false);},_sortProfile:function()
+{var sortAscending=this.dataGrid.isSortOrderAscending();var sortColumnIdentifier=this.dataGrid.sortColumnIdentifier();var sortProperty={"self":"selfTime","total":"totalTime","function":"functionName"}[sortColumnIdentifier];this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator(sortProperty,sortAscending));this.refresh();},_mouseDownInDataGrid:function(event)
+{if(event.detail<2)
+return;var cell=event.target.enclosingNodeOrSelfWithNodeName("td");if(!cell||(!cell.classList.contains("total-column")&&!cell.classList.contains("self-column")&&!cell.classList.contains("average-column")))
+return;if(cell.classList.contains("total-column"))
+this.showTotalTimeAsPercent.set(!this.showTotalTimeAsPercent.get());else if(cell.classList.contains("self-column"))
+this.showSelfTimeAsPercent.set(!this.showSelfTimeAsPercent.get());else if(cell.classList.contains("average-column"))
+this.showAverageTimeAsPercent.set(!this.showAverageTimeAsPercent.get());this.refreshShowAsPercents();event.consume(true);},_calculateTimes:function(profile)
+{function totalHitCount(node){var result=node.hitCount;for(var i=0;i<node.children.length;i++)
+result+=totalHitCount(node.children[i]);return result;}
+profile.totalHitCount=totalHitCount(profile.head);var durationMs=1000*(profile.endTime-profile.startTime);var samplingInterval=durationMs/profile.totalHitCount;this.samplingIntervalMs=samplingInterval;function calculateTimesForNode(node){node.selfTime=node.hitCount*samplingInterval;var totalHitCount=node.hitCount;for(var i=0;i<node.children.length;i++)
+totalHitCount+=calculateTimesForNode(node.children[i]);node.totalTime=totalHitCount*samplingInterval;return totalHitCount;}
+calculateTimesForNode(profile.head);},_assignParentsInProfile:function()
+{var head=this.profileHead;head.parent=null;head.head=null;var nodesToTraverse=[head];while(nodesToTraverse.length){var parent=nodesToTraverse.pop();var children=parent.children;var length=children.length;for(var i=0;i<length;++i){var child=children[i];child.head=head;child.parent=parent;if(child.children.length)
+nodesToTraverse.push(child);}}},_buildIdToNodeMap:function()
+{var idToNode=this._idToNode={};var stack=[this.profileHead];while(stack.length){var node=stack.pop();idToNode[node.id]=node;for(var i=0;i<node.children.length;i++)
+stack.push(node.children[i]);}
+var topLevelNodes=this.profileHead.children;for(var i=0;i<topLevelNodes.length;i++){var node=topLevelNodes[i];if(node.functionName==="(garbage collector)"){this._gcNode=node;break;}}},__proto__:WebInspector.VBox.prototype}
+WebInspector.CPUProfileType=function()
+{WebInspector.ProfileType.call(this,WebInspector.CPUProfileType.TypeId,WebInspector.UIString("Collect JavaScript CPU Profile"));this._recording=false;this._nextAnonymousConsoleProfileNumber=1;this._anonymousConsoleProfileIdToTitle={};WebInspector.CPUProfileType.instance=this;WebInspector.cpuProfilerModel.setDelegate(this);}
+WebInspector.CPUProfileType.TypeId="CPU";WebInspector.CPUProfileType.prototype={fileExtension:function()
+{return".cpuprofile";},get buttonTooltip()
+{return this._recording?WebInspector.UIString("Stop CPU profiling."):WebInspector.UIString("Start CPU profiling.");},buttonClicked:function()
+{if(this._recording){this.stopRecordingProfile();return false;}else{this.startRecordingProfile();return true;}},get treeItemTitle()
+{return WebInspector.UIString("CPU PROFILES");},get description()
+{return WebInspector.UIString("CPU profiles show where the execution time is spent in your page's JavaScript functions.");},consoleProfileStarted:function(id,scriptLocation,title)
+{var resolvedTitle=title;if(!resolvedTitle){resolvedTitle=WebInspector.UIString("Profile %s",this._nextAnonymousConsoleProfileNumber++);this._anonymousConsoleProfileIdToTitle[id]=resolvedTitle;}
+this._addMessageToConsole(WebInspector.ConsoleMessage.MessageType.Profile,scriptLocation,WebInspector.UIString("Profile '%s' started.",resolvedTitle));},consoleProfileFinished:function(protocolId,scriptLocation,cpuProfile,title)
+{var resolvedTitle=title;if(typeof title==="undefined"){resolvedTitle=this._anonymousConsoleProfileIdToTitle[protocolId];delete this._anonymousConsoleProfileIdToTitle[protocolId];}
+var profile=new WebInspector.CPUProfileHeader(this,resolvedTitle);profile.setProtocolProfile(cpuProfile);this.addProfile(profile);this._addMessageToConsole(WebInspector.ConsoleMessage.MessageType.ProfileEnd,scriptLocation,WebInspector.UIString("Profile '%s' finished.",resolvedTitle));},_addMessageToConsole:function(type,scriptLocation,messageText)
+{var script=WebInspector.debuggerModel.scriptForId(scriptLocation.scriptId);var message=new WebInspector.ConsoleMessage(WebInspector.ConsoleMessage.MessageSource.ConsoleAPI,WebInspector.ConsoleMessage.MessageLevel.Debug,messageText,type,undefined,undefined,undefined,undefined,undefined,[{functionName:"",scriptId:scriptLocation.scriptId,url:script?script.contentURL():"",lineNumber:scriptLocation.lineNumber,columnNumber:scriptLocation.columnNumber||0}]);WebInspector.console.addMessage(message);},isRecordingProfile:function()
+{return this._recording;},startRecordingProfile:function()
+{if(this._profileBeingRecorded)
+return;this._profileBeingRecorded=new WebInspector.CPUProfileHeader(this);this.addProfile(this._profileBeingRecorded);this._profileBeingRecorded.updateStatus(WebInspector.UIString("Recording\u2026"));this._recording=true;WebInspector.cpuProfilerModel.setRecording(true);WebInspector.userMetrics.ProfilesCPUProfileTaken.record();ProfilerAgent.start();},stopRecordingProfile:function()
+{this._recording=false;WebInspector.cpuProfilerModel.setRecording(false);function didStopProfiling(error,profile)
+{if(!this._profileBeingRecorded)
+return;this._profileBeingRecorded.setProtocolProfile(profile);this._profileBeingRecorded.updateStatus("");var recordedProfile=this._profileBeingRecorded;this._profileBeingRecorded=null;WebInspector.panels.profiles.showProfile(recordedProfile);}
+ProfilerAgent.stop(didStopProfiling.bind(this));},createProfileLoadedFromFile:function(title)
+{return new WebInspector.CPUProfileHeader(this,title);},profileBeingRecordedRemoved:function()
+{this.stopRecordingProfile();},__proto__:WebInspector.ProfileType.prototype}
+WebInspector.CPUProfileHeader=function(type,title)
+{WebInspector.ProfileHeader.call(this,type,title||WebInspector.UIString("Profile %d",type._nextProfileUid));this._tempFile=null;}
+WebInspector.CPUProfileHeader.prototype={onTransferStarted:function()
+{this._jsonifiedProfile="";this.updateStatus(WebInspector.UIString("Loading\u2026 %s",Number.bytesToString(this._jsonifiedProfile.length)),true);},onChunkTransferred:function(reader)
+{this.updateStatus(WebInspector.UIString("Loading\u2026 %d\%",Number.bytesToString(this._jsonifiedProfile.length)));},onTransferFinished:function()
+{this.updateStatus(WebInspector.UIString("Parsing\u2026"),true);this._profile=JSON.parse(this._jsonifiedProfile);this._jsonifiedProfile=null;this.updateStatus(WebInspector.UIString("Loaded"),false);if(this._profileType._profileBeingRecorded===this)
+this._profileType._profileBeingRecorded=null;},onError:function(reader,e)
+{var subtitle;switch(e.target.error.code){case e.target.error.NOT_FOUND_ERR:subtitle=WebInspector.UIString("'%s' not found.",reader.fileName());break;case e.target.error.NOT_READABLE_ERR:subtitle=WebInspector.UIString("'%s' is not readable",reader.fileName());break;case e.target.error.ABORT_ERR:return;default:subtitle=WebInspector.UIString("'%s' error %d",reader.fileName(),e.target.error.code);}
+this.updateStatus(subtitle);},write:function(text)
+{this._jsonifiedProfile+=text;},close:function(){},dispose:function()
+{this.removeTempFile();},createSidebarTreeElement:function()
+{return new WebInspector.ProfileSidebarTreeElement(this,"profile-sidebar-tree-item");},createView:function()
+{return new WebInspector.CPUProfileView(this);},canSaveToFile:function()
+{return!this.fromFile()&&this._protocolProfile;},saveToFile:function()
+{var fileOutputStream=new WebInspector.FileOutputStream();function onOpenForSave(accepted)
+{if(!accepted)
+return;function didRead(data)
+{if(data)
+fileOutputStream.write(data,fileOutputStream.close.bind(fileOutputStream));else
+fileOutputStream.close();}
+if(this._failedToCreateTempFile){WebInspector.console.log("Failed to open temp file with heap snapshot",WebInspector.ConsoleMessage.MessageLevel.Error);fileOutputStream.close();}else if(this._tempFile){this._tempFile.read(didRead);}else{this._onTempFileReady=onOpenForSave.bind(this,accepted);}}
+this._fileName=this._fileName||"CPU-"+new Date().toISO8601Compact()+this._profileType.fileExtension();fileOutputStream.open(this._fileName,onOpenForSave.bind(this));},loadFromFile:function(file)
+{this.updateStatus(WebInspector.UIString("Loading\u2026"),true);var fileReader=new WebInspector.ChunkedFileReader(file,10000000,this);fileReader.start(this);},protocolProfile:function()
+{return this._protocolProfile;},setProtocolProfile:function(cpuProfile)
+{this._protocolProfile=cpuProfile;this._saveProfileDataToTempFile(cpuProfile);if(this.canSaveToFile())
+this.dispatchEventToListeners(WebInspector.ProfileHeader.Events.ProfileReceived);},_saveProfileDataToTempFile:function(data)
+{var serializedData=JSON.stringify(data);function didCreateTempFile(tempFile)
+{this._writeToTempFile(tempFile,serializedData);}
+new WebInspector.TempFile("cpu-profiler",this.uid,didCreateTempFile.bind(this));},_writeToTempFile:function(tempFile,serializedData)
+{this._tempFile=tempFile;if(!tempFile){this._failedToCreateTempFile=true;this._notifyTempFileReady();return;}
+function didWriteToTempFile(success)
+{if(!success)
+this._failedToCreateTempFile=true;tempFile.finishWriting();this._notifyTempFileReady();}
+tempFile.write(serializedData,didWriteToTempFile.bind(this));},_notifyTempFileReady:function()
+{if(this._onTempFileReady){this._onTempFileReady();this._onTempFileReady=null;}},__proto__:WebInspector.ProfileHeader.prototype}
+WebInspector.CPUProfileView.colorGenerator=function()
+{if(!WebInspector.CPUProfileView._colorGenerator){var colorGenerator=new WebInspector.CPUProfileFlameChart.ColorGenerator();colorGenerator.colorForID("(idle)::0",50);colorGenerator.colorForID("(program)::0",50);colorGenerator.colorForID("(garbage collector)::0",50);WebInspector.CPUProfileView._colorGenerator=colorGenerator;}
+return WebInspector.CPUProfileView._colorGenerator;}
+WebInspector.CPUFlameChartDataProvider=function(cpuProfileView)
+{WebInspector.FlameChartDataProvider.call(this);this._cpuProfileView=cpuProfileView;this._colorGenerator=WebInspector.CPUProfileView.colorGenerator();}
+WebInspector.CPUFlameChartDataProvider.prototype={barHeight:function()
+{return 15;},textBaseline:function()
+{return 4;},textPadding:function()
+{return 2;},dividerOffsets:function(startTime,endTime)
+{return null;},zeroTime:function()
+{return 0;},totalTime:function()
+{return this._cpuProfileView.profileHead.totalTime;},maxStackDepth:function()
+{return this._maxStackDepth;},timelineData:function()
+{return this._timelineData||this._calculateTimelineData();},_calculateTimelineData:function()
+{if(!this._cpuProfileView.profileHead)
+return null;var samples=this._cpuProfileView.samples;var idToNode=this._cpuProfileView._idToNode;var gcNode=this._cpuProfileView._gcNode;var samplesCount=samples.length;var samplingInterval=this._cpuProfileView.samplingIntervalMs;var index=0;var openIntervals=[];var stackTrace=[];var maxDepth=5;var depth=0;function ChartEntry(depth,duration,startTime,node)
+{this.depth=depth;this.duration=duration;this.startTime=startTime;this.node=node;this.selfTime=0;}
+var entries=([]);for(var sampleIndex=0;sampleIndex<samplesCount;sampleIndex++){var node=idToNode[samples[sampleIndex]];stackTrace.length=0;while(node){stackTrace.push(node);node=node.parent;}
+stackTrace.pop();maxDepth=Math.max(maxDepth,depth);depth=0;node=stackTrace.pop();var intervalIndex;if(node===gcNode){while(depth<openIntervals.length){intervalIndex=openIntervals[depth].index;entries[intervalIndex].duration+=samplingInterval;++depth;}
+if(openIntervals.length>0&&openIntervals.peekLast().node===node){entries[intervalIndex].selfTime+=samplingInterval;continue;}}
+while(node&&depth<openIntervals.length&&node===openIntervals[depth].node){intervalIndex=openIntervals[depth].index;entries[intervalIndex].duration+=samplingInterval;node=stackTrace.pop();++depth;}
+if(depth<openIntervals.length)
+openIntervals.length=depth;if(!node){entries[intervalIndex].selfTime+=samplingInterval;continue;}
+var colorGenerator=this._colorGenerator;var color="";while(node){entries.push(new ChartEntry(depth,samplingInterval,sampleIndex*samplingInterval,node));openIntervals.push({node:node,index:index});++index;node=stackTrace.pop();++depth;}
+entries[entries.length-1].selfTime+=samplingInterval;}
+var entryNodes=new Array(entries.length);var entryLevels=new Uint8Array(entries.length);var entryTotalTimes=new Float32Array(entries.length);var entrySelfTimes=new Float32Array(entries.length);var entryOffsets=new Float32Array(entries.length);for(var i=0;i<entries.length;++i){var entry=entries[i];entryNodes[i]=entry.node;entryLevels[i]=entry.depth;entryTotalTimes[i]=entry.duration;entryOffsets[i]=entry.startTime;entrySelfTimes[i]=entry.selfTime;}
+this._maxStackDepth=Math.max(maxDepth,depth);this._timelineData={entryLevels:entryLevels,entryTotalTimes:entryTotalTimes,entryOffsets:entryOffsets,};this._entryNodes=entryNodes;this._entrySelfTimes=entrySelfTimes;return(this._timelineData);},_millisecondsToString:function(ms)
+{if(ms===0)
+return"0";if(ms<1000)
+return WebInspector.UIString("%.1f\u2009ms",ms);return Number.secondsToString(ms/1000,true);},prepareHighlightedEntryInfo:function(entryIndex)
+{var timelineData=this._timelineData;var node=this._entryNodes[entryIndex];if(!node)
+return null;var entryInfo=[];function pushEntryInfoRow(title,text)
+{var row={};row.title=title;row.text=text;entryInfo.push(row);}
+pushEntryInfoRow(WebInspector.UIString("Name"),node.functionName);var selfTime=this._millisecondsToString(this._entrySelfTimes[entryIndex]);var totalTime=this._millisecondsToString(timelineData.entryTotalTimes[entryIndex]);pushEntryInfoRow(WebInspector.UIString("Self time"),selfTime);pushEntryInfoRow(WebInspector.UIString("Total time"),totalTime);var text=WebInspector.Linkifier.liveLocationText(node.scriptId,node.lineNumber,node.columnNumber);pushEntryInfoRow(WebInspector.UIString("URL"),text);pushEntryInfoRow(WebInspector.UIString("Aggregated self time"),Number.secondsToString(node.selfTime/1000,true));pushEntryInfoRow(WebInspector.UIString("Aggregated total time"),Number.secondsToString(node.totalTime/1000,true));if(node.deoptReason&&node.deoptReason!=="no reason")
+pushEntryInfoRow(WebInspector.UIString("Not optimized"),node.deoptReason);return entryInfo;},canJumpToEntry:function(entryIndex)
+{return this._entryNodes[entryIndex].scriptId!=="0";},entryTitle:function(entryIndex)
+{var node=this._entryNodes[entryIndex];return node.functionName;},entryFont:function(entryIndex)
+{if(!this._font){this._font=(this.barHeight()-4)+"px "+WebInspector.fontFamily();this._boldFont="bold "+this._font;}
+var node=this._entryNodes[entryIndex];var reason=node.deoptReason;return(reason&&reason!=="no reason")?this._boldFont:this._font;},entryColor:function(entryIndex)
+{var node=this._entryNodes[entryIndex];return this._colorGenerator.colorForID(node.functionName+":"+node.url+":"+node.lineNumber);},decorateEntry:function(entryIndex,context,text,barX,barY,barWidth,barHeight,offsetToPosition)
+{return false;},forceDecoration:function(entryIndex)
+{return false;},highlightTimeRange:function(entryIndex)
+{var startTimeOffset=this._timelineData.entryOffsets[entryIndex];return{startTimeOffset:startTimeOffset,endTimeOffset:startTimeOffset+this._timelineData.entryTotalTimes[entryIndex]};},paddingLeft:function()
+{return 15;},textColor:function(entryIndex)
+{return"#333";}};WebInspector.HeapSnapshotProgressEvent={Update:"ProgressUpdate"};WebInspector.HeapSnapshotCommon={}
+WebInspector.HeapSnapshotCommon.AllocationNodeCallers=function(nodesWithSingleCaller,branchingCallers)
+{this.nodesWithSingleCaller=nodesWithSingleCaller;this.branchingCallers=branchingCallers;}
+WebInspector.HeapSnapshotCommon.SerializedAllocationNode=function(nodeId,functionName,scriptName,line,column,count,size,liveCount,liveSize,hasChildren)
+{this.id=nodeId;this.name=functionName;this.scriptName=scriptName;this.line=line;this.column=column;this.count=count;this.size=size;this.liveCount=liveCount;this.liveSize=liveSize;this.hasChildren=hasChildren;}
+WebInspector.HeapSnapshotCommon.Aggregate=function()
+{this.count;this.distance;this.self;this.maxRet;this.type;this.name;this.idxs;}
+WebInspector.HeapSnapshotCommon.AggregateForDiff=function(){this.indexes=[];this.ids=[];this.selfSizes=[];}
+WebInspector.HeapSnapshotCommon.Diff=function()
+{this.addedCount=0;this.removedCount=0;this.addedSize=0;this.removedSize=0;this.deletedIndexes=[];this.addedIndexes=[];}
+WebInspector.HeapSnapshotCommon.DiffForClass=function()
+{this.addedCount;this.removedCount;this.addedSize;this.removedSize;this.deletedIndexes;this.addedIndexes;this.countDelta;this.sizeDelta;}
+WebInspector.HeapSnapshotCommon.ComparatorConfig=function()
+{this.fieldName1;this.ascending1;this.fieldName2;this.ascending2;}
+WebInspector.HeapSnapshotCommon.WorkerCommand=function()
+{this.callId;this.disposition;this.objectId;this.newObjectId;this.methodName;this.methodArguments;this.source;}
+WebInspector.HeapSnapshotCommon.ItemsRange=function(startPosition,endPosition,totalLength,items)
+{this.startPosition=startPosition;this.endPosition=endPosition;this.totalLength=totalLength;this.items=items;}
+WebInspector.HeapSnapshotCommon.StaticData=function(nodeCount,rootNodeIndex,totalSize,maxJSObjectId)
+{this.nodeCount=nodeCount;this.rootNodeIndex=rootNodeIndex;this.totalSize=totalSize;this.maxJSObjectId=maxJSObjectId;}
+WebInspector.HeapSnapshotCommon.Statistics=function()
+{this.total;this.v8heap;this.native;this.code;this.jsArrays;this.strings;}
+WebInspector.HeapSnapshotCommon.NodeFilter=function(minNodeId,maxNodeId)
+{this.minNodeId=minNodeId;this.maxNodeId=maxNodeId;this.allocationNodeId;}
+WebInspector.HeapSnapshotCommon.NodeFilter.prototype={equals:function(o)
+{return this.minNodeId===o.minNodeId&&this.maxNodeId===o.maxNodeId&&this.allocationNodeId===o.allocationNodeId;}};WebInspector.HeapSnapshotWorkerProxy=function(eventHandler)
+{this._eventHandler=eventHandler;this._nextObjectId=1;this._nextCallId=1;this._callbacks=[];this._previousCallbacks=[];this._worker=new Worker("HeapSnapshotWorker.js");this._worker.onmessage=this._messageReceived.bind(this);}
+WebInspector.HeapSnapshotWorkerProxy.prototype={createLoader:function(profileUid,snapshotReceivedCallback)
+{var objectId=this._nextObjectId++;var proxy=new WebInspector.HeapSnapshotLoaderProxy(this,objectId,profileUid,snapshotReceivedCallback);this._postMessage({callId:this._nextCallId++,disposition:"create",objectId:objectId,methodName:"WebInspector.HeapSnapshotLoader"});return proxy;},dispose:function()
+{this._worker.terminate();if(this._interval)
+clearInterval(this._interval);},disposeObject:function(objectId)
+{this._postMessage({callId:this._nextCallId++,disposition:"dispose",objectId:objectId});},evaluateForTest:function(script,callback)
+{var callId=this._nextCallId++;this._callbacks[callId]=callback;this._postMessage({callId:callId,disposition:"evaluateForTest",source:script});},callFactoryMethod:function(callback,objectId,methodName,proxyConstructor)
+{var callId=this._nextCallId++;var methodArguments=Array.prototype.slice.call(arguments,4);var newObjectId=this._nextObjectId++;function wrapCallback(remoteResult)
+{callback(remoteResult?new proxyConstructor(this,newObjectId):null);}
+if(callback){this._callbacks[callId]=wrapCallback.bind(this);this._postMessage({callId:callId,disposition:"factory",objectId:objectId,methodName:methodName,methodArguments:methodArguments,newObjectId:newObjectId});return null;}else{this._postMessage({callId:callId,disposition:"factory",objectId:objectId,methodName:methodName,methodArguments:methodArguments,newObjectId:newObjectId});return new proxyConstructor(this,newObjectId);}},callMethod:function(callback,objectId,methodName)
+{var callId=this._nextCallId++;var methodArguments=Array.prototype.slice.call(arguments,3);if(callback)
+this._callbacks[callId]=callback;this._postMessage({callId:callId,disposition:"method",objectId:objectId,methodName:methodName,methodArguments:methodArguments});},startCheckingForLongRunningCalls:function()
+{if(this._interval)
+return;this._checkLongRunningCalls();this._interval=setInterval(this._checkLongRunningCalls.bind(this),300);},_checkLongRunningCalls:function()
+{for(var callId in this._previousCallbacks)
+if(!(callId in this._callbacks))
+delete this._previousCallbacks[callId];var hasLongRunningCalls=false;for(callId in this._previousCallbacks){hasLongRunningCalls=true;break;}
+this.dispatchEventToListeners("wait",hasLongRunningCalls);for(callId in this._callbacks)
+this._previousCallbacks[callId]=true;},_messageReceived:function(event)
+{var data=event.data;if(data.eventName){if(this._eventHandler)
+this._eventHandler(data.eventName,data.data);return;}
+if(data.error){if(data.errorMethodName)
+WebInspector.console.log(WebInspector.UIString("An error happened when a call for method '%s' was requested",data.errorMethodName));WebInspector.console.log(data["errorCallStack"]);delete this._callbacks[data.callId];return;}
+if(!this._callbacks[data.callId])
+return;var callback=this._callbacks[data.callId];delete this._callbacks[data.callId];callback(data.result);},_postMessage:function(message)
+{this._worker.postMessage(message);},__proto__:WebInspector.Object.prototype}
+WebInspector.HeapSnapshotProxyObject=function(worker,objectId)
+{this._worker=worker;this._objectId=objectId;}
+WebInspector.HeapSnapshotProxyObject.prototype={_callWorker:function(workerMethodName,args)
+{args.splice(1,0,this._objectId);return this._worker[workerMethodName].apply(this._worker,args);},dispose:function()
+{this._worker.disposeObject(this._objectId);},disposeWorker:function()
+{this._worker.dispose();},callFactoryMethod:function(callback,methodName,proxyConstructor,var_args)
+{return this._callWorker("callFactoryMethod",Array.prototype.slice.call(arguments,0));},callMethod:function(callback,methodName,var_args)
+{return this._callWorker("callMethod",Array.prototype.slice.call(arguments,0));}};WebInspector.HeapSnapshotLoaderProxy=function(worker,objectId,profileUid,snapshotReceivedCallback)
+{WebInspector.HeapSnapshotProxyObject.call(this,worker,objectId);this._profileUid=profileUid;this._snapshotReceivedCallback=snapshotReceivedCallback;}
+WebInspector.HeapSnapshotLoaderProxy.prototype={write:function(chunk,callback)
+{this.callMethod(callback,"write",chunk);},close:function(callback)
+{function buildSnapshot()
+{if(callback)
+callback();var showHiddenData=WebInspector.settings.showAdvancedHeapSnapshotProperties.get();this.callFactoryMethod(updateStaticData.bind(this),"buildSnapshot",WebInspector.HeapSnapshotProxy,showHiddenData);}
+function updateStaticData(snapshotProxy)
+{this.dispose();snapshotProxy.setProfileUid(this._profileUid);snapshotProxy.updateStaticData(this._snapshotReceivedCallback.bind(this));}
+this.callMethod(buildSnapshot.bind(this),"close");},__proto__:WebInspector.HeapSnapshotProxyObject.prototype}
+WebInspector.HeapSnapshotProxy=function(worker,objectId)
+{WebInspector.HeapSnapshotProxyObject.call(this,worker,objectId);this._staticData=null;}
+WebInspector.HeapSnapshotProxy.prototype={aggregatesWithFilter:function(filter,callback)
+{this.callMethod(callback,"aggregatesWithFilter",filter);},aggregatesForDiff:function(callback)
+{this.callMethod(callback,"aggregatesForDiff");},calculateSnapshotDiff:function(baseSnapshotId,baseSnapshotAggregates,callback)
+{this.callMethod(callback,"calculateSnapshotDiff",baseSnapshotId,baseSnapshotAggregates);},nodeClassName:function(snapshotObjectId,callback)
+{this.callMethod(callback,"nodeClassName",snapshotObjectId);},dominatorIdsForNode:function(nodeIndex,callback)
+{this.callMethod(callback,"dominatorIdsForNode",nodeIndex);},createEdgesProvider:function(nodeIndex)
+{return this.callFactoryMethod(null,"createEdgesProvider",WebInspector.HeapSnapshotProviderProxy,nodeIndex);},createRetainingEdgesProvider:function(nodeIndex)
+{return this.callFactoryMethod(null,"createRetainingEdgesProvider",WebInspector.HeapSnapshotProviderProxy,nodeIndex);},createAddedNodesProvider:function(baseSnapshotId,className)
+{return this.callFactoryMethod(null,"createAddedNodesProvider",WebInspector.HeapSnapshotProviderProxy,baseSnapshotId,className);},createDeletedNodesProvider:function(nodeIndexes)
+{return this.callFactoryMethod(null,"createDeletedNodesProvider",WebInspector.HeapSnapshotProviderProxy,nodeIndexes);},createNodesProvider:function(filter)
+{return this.callFactoryMethod(null,"createNodesProvider",WebInspector.HeapSnapshotProviderProxy,filter);},createNodesProviderForClass:function(className,nodeFilter)
+{return this.callFactoryMethod(null,"createNodesProviderForClass",WebInspector.HeapSnapshotProviderProxy,className,nodeFilter);},createNodesProviderForDominator:function(nodeIndex)
+{return this.callFactoryMethod(null,"createNodesProviderForDominator",WebInspector.HeapSnapshotProviderProxy,nodeIndex);},allocationTracesTops:function(callback)
+{this.callMethod(callback,"allocationTracesTops");},allocationNodeCallers:function(nodeId,callback)
+{this.callMethod(callback,"allocationNodeCallers",nodeId);},dispose:function()
+{throw new Error("Should never be called");},get nodeCount()
+{return this._staticData.nodeCount;},get rootNodeIndex()
+{return this._staticData.rootNodeIndex;},updateStaticData:function(callback)
+{function dataReceived(staticData)
+{this._staticData=staticData;callback(this);}
+this.callMethod(dataReceived.bind(this),"updateStaticData");},getStatistics:function(callback)
+{this.callMethod(callback,"getStatistics");},get totalSize()
+{return this._staticData.totalSize;},get uid()
+{return this._profileUid;},setProfileUid:function(profileUid)
+{this._profileUid=profileUid;},maxJSObjectId:function()
+{return this._staticData.maxJSObjectId;},__proto__:WebInspector.HeapSnapshotProxyObject.prototype}
+WebInspector.HeapSnapshotProviderProxy=function(worker,objectId)
+{WebInspector.HeapSnapshotProxyObject.call(this,worker,objectId);}
+WebInspector.HeapSnapshotProviderProxy.prototype={nodePosition:function(snapshotObjectId,callback)
+{this.callMethod(callback,"nodePosition",snapshotObjectId);},isEmpty:function(callback)
+{this.callMethod(callback,"isEmpty");},serializeItemsRange:function(startPosition,endPosition,callback)
+{this.callMethod(callback,"serializeItemsRange",startPosition,endPosition);},sortAndRewind:function(comparator,callback)
+{this.callMethod(callback,"sortAndRewind",comparator);},__proto__:WebInspector.HeapSnapshotProxyObject.prototype};WebInspector.HeapSnapshotSortableDataGrid=function(columns)
+{WebInspector.DataGrid.call(this,columns);this._recursiveSortingDepth=0;this._highlightedNode=null;this._populatedAndSorted=false;this._nameFilter="";this.addEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.SortingComplete,this._sortingComplete,this);this.addEventListener(WebInspector.DataGrid.Events.SortingChanged,this.sortingChanged,this);}
+WebInspector.HeapSnapshotSortableDataGrid.Events={ContentShown:"ContentShown",ResetFilter:"ResetFilter",SortingComplete:"SortingComplete"}
+WebInspector.HeapSnapshotSortableDataGrid.prototype={defaultPopulateCount:function()
+{return 100;},_disposeAllNodes:function()
+{var children=this.topLevelNodes();for(var i=0,l=children.length;i<l;++i)
+children[i].dispose();},wasShown:function()
+{if(this._populatedAndSorted)
+this.dispatchEventToListeners(WebInspector.HeapSnapshotSortableDataGrid.Events.ContentShown,this);},_sortingComplete:function()
+{this.removeEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.SortingComplete,this._sortingComplete,this);this._populatedAndSorted=true;this.dispatchEventToListeners(WebInspector.HeapSnapshotSortableDataGrid.Events.ContentShown,this);},willHide:function()
+{this._clearCurrentHighlight();},populateContextMenu:function(contextMenu,event)
+{var td=event.target.enclosingNodeOrSelfWithNodeName("td");if(!td)
+return;var node=td.heapSnapshotNode;function revealInDominatorsView()
+{WebInspector.panels.profiles.showObject(node.snapshotNodeId,"Dominators");}
+function revealInSummaryView()
+{WebInspector.panels.profiles.showObject(node.snapshotNodeId,"Summary");}
+if(node&&node.showRetainingEdges){contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in Summary view":"Reveal in Summary View"),revealInSummaryView);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in Dominators view":"Reveal in Dominators View"),revealInDominatorsView);}
+else if(node instanceof WebInspector.HeapSnapshotInstanceNode||node instanceof WebInspector.HeapSnapshotObjectNode){contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in Dominators view":"Reveal in Dominators View"),revealInDominatorsView);}else if(node instanceof WebInspector.HeapSnapshotDominatorObjectNode){contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in Summary view":"Reveal in Summary View"),revealInSummaryView);}},resetSortingCache:function()
+{delete this._lastSortColumnIdentifier;delete this._lastSortAscending;},topLevelNodes:function()
+{return this.rootNode().children;},highlightObjectByHeapSnapshotId:function(heapSnapshotObjectId,callback)
+{},highlightNode:function(node)
+{var prevNode=this._highlightedNode;this._clearCurrentHighlight();this._highlightedNode=node;WebInspector.runCSSAnimationOnce(this._highlightedNode.element,"highlighted-row");},nodeWasDetached:function(node)
+{if(this._highlightedNode===node)
+this._clearCurrentHighlight();},_clearCurrentHighlight:function()
+{if(!this._highlightedNode)
+return
+this._highlightedNode.element.classList.remove("highlighted-row");this._highlightedNode=null;},resetNameFilter:function(callback)
+{this._callbackAfterFilterChange=callback;this.dispatchEventToListeners(WebInspector.HeapSnapshotSortableDataGrid.Events.ResetFilter);},changeNameFilter:function(filter)
+{this._nameFilter=filter.toLowerCase();this.updateVisibleNodes(true);if(this._callbackAfterFilterChange){this._callbackAfterFilterChange();this._callbackAfterFilterChange=null;}},sortingChanged:function()
+{var sortAscending=this.isSortOrderAscending();var sortColumnIdentifier=this.sortColumnIdentifier();if(this._lastSortColumnIdentifier===sortColumnIdentifier&&this._lastSortAscending===sortAscending)
+return;this._lastSortColumnIdentifier=sortColumnIdentifier;this._lastSortAscending=sortAscending;var sortFields=this._sortFields(sortColumnIdentifier,sortAscending);function SortByTwoFields(nodeA,nodeB)
+{var field1=nodeA[sortFields[0]];var field2=nodeB[sortFields[0]];var result=field1<field2?-1:(field1>field2?1:0);if(!sortFields[1])
+result=-result;if(result!==0)
+return result;field1=nodeA[sortFields[2]];field2=nodeB[sortFields[2]];result=field1<field2?-1:(field1>field2?1:0);if(!sortFields[3])
+result=-result;return result;}
+this._performSorting(SortByTwoFields);},_performSorting:function(sortFunction)
+{this.recursiveSortingEnter();var children=this.allChildren(this.rootNode());this.rootNode().removeChildren();children.sort(sortFunction);for(var i=0,l=children.length;i<l;++i){var child=children[i];this.appendChildAfterSorting(child);if(child.expanded)
+child.sort();}
+this.recursiveSortingLeave();},appendChildAfterSorting:function(child)
+{var revealed=child.revealed;this.rootNode().appendChild(child);child.revealed=revealed;},recursiveSortingEnter:function()
+{++this._recursiveSortingDepth;},recursiveSortingLeave:function()
+{if(!this._recursiveSortingDepth)
+return;if(--this._recursiveSortingDepth)
+return;this.updateVisibleNodes(true);this.dispatchEventToListeners(WebInspector.HeapSnapshotSortableDataGrid.Events.SortingComplete);},updateVisibleNodes:function(force)
+{},allChildren:function(parent)
+{return parent.children;},insertChild:function(parent,node,index)
+{parent.insertChild(node,index);},removeChildByIndex:function(parent,index)
+{parent.removeChild(parent.children[index]);},removeAllChildren:function(parent)
+{parent.removeChildren();},__proto__:WebInspector.DataGrid.prototype}
+WebInspector.HeapSnapshotViewportDataGrid=function(columns)
+{WebInspector.HeapSnapshotSortableDataGrid.call(this,columns);this.scrollContainer.addEventListener("scroll",this._onScroll.bind(this),true);this._nodeToHighlightAfterScroll=null;this._topPadding=new WebInspector.HeapSnapshotPaddingNode();this._topPaddingHeight=0;this.dataTableBody.insertBefore(this._topPadding.element,this.dataTableBody.firstChild);this._bottomPadding=new WebInspector.HeapSnapshotPaddingNode();this._bottomPaddingHeight=0;this.dataTableBody.insertBefore(this._bottomPadding.element,this.dataTableBody.lastChild);}
+WebInspector.HeapSnapshotViewportDataGrid.prototype={topLevelNodes:function()
+{return this.allChildren(this.rootNode());},appendChildAfterSorting:function(child)
+{},updateVisibleNodes:function(force,pathToReveal)
+{var guardZoneHeight=40;var scrollHeight=this.scrollContainer.scrollHeight;var scrollTop=this.scrollContainer.scrollTop;var scrollBottom=scrollHeight-scrollTop-this.scrollContainer.offsetHeight;scrollTop=Math.max(0,scrollTop-guardZoneHeight);scrollBottom=Math.max(0,scrollBottom-guardZoneHeight);var viewPortHeight=scrollHeight-scrollTop-scrollBottom;if(!pathToReveal){if(!force&&scrollTop>=this._topPaddingHeight&&scrollBottom>=this._bottomPaddingHeight)
+return;var hysteresisHeight=500;scrollTop-=hysteresisHeight;viewPortHeight+=2*hysteresisHeight;}
+var selectedNode=this.selectedNode;this.rootNode().removeChildren();this._topPaddingHeight=0;this._bottomPaddingHeight=0;this._addVisibleNodes(this.rootNode(),scrollTop,scrollTop+viewPortHeight,pathToReveal||null);this._topPadding.setHeight(this._topPaddingHeight);this._bottomPadding.setHeight(this._bottomPaddingHeight);if(selectedNode){if(selectedNode.parent)
+selectedNode.select(true);else
+this.selectedNode=selectedNode;}},_addVisibleNodes:function(parentNode,topBound,bottomBound,pathToReveal)
+{if(!parentNode.expanded)
+return 0;var nodeToReveal=pathToReveal?pathToReveal[0]:null;var restPathToReveal=pathToReveal&&pathToReveal.length>1?pathToReveal.slice(1):null;var children=this.allChildren(parentNode);var topPadding=0;for(var i=0;i<children.length;++i){var child=children[i];if(child.filteredOut&&child.filteredOut())
+continue;var newTop=topPadding+this._nodeHeight(child);if(nodeToReveal===child||(!nodeToReveal&&newTop>topBound))
+break;topPadding=newTop;}
+var position=topPadding;for(;i<children.length&&(nodeToReveal||position<bottomBound);++i){var child=children[i];if(child.filteredOut&&child.filteredOut())
+continue;var hasChildren=child.hasChildren;child.removeChildren();child.hasChildren=hasChildren;child.revealed=true;parentNode.appendChild(child);position+=child.nodeSelfHeight();position+=this._addVisibleNodes(child,topBound-position,bottomBound-position,restPathToReveal);if(nodeToReveal===child)
+break;}
+var bottomPadding=0;for(;i<children.length;++i){var child=children[i];if(child.filteredOut&&child.filteredOut())
+continue;bottomPadding+=this._nodeHeight(child);}
+this._topPaddingHeight+=topPadding;this._bottomPaddingHeight+=bottomPadding;return position+bottomPadding;},_nodeHeight:function(node)
+{if(!node.revealed)
+return 0;var result=node.nodeSelfHeight();if(!node.expanded)
+return result;var children=this.allChildren(node);for(var i=0;i<children.length;i++)
+result+=this._nodeHeight(children[i]);return result;},defaultAttachLocation:function()
+{return this._bottomPadding.element;},revealTreeNode:function(pathToReveal)
+{this.updateVisibleNodes(true,pathToReveal);},allChildren:function(parent)
+{return parent._allChildren||(parent._allChildren=[]);},appendNode:function(parent,node)
+{this.allChildren(parent).push(node);},insertChild:function(parent,node,index)
+{this.allChildren(parent).splice(index,0,node);},removeChildByIndex:function(parent,index)
+{this.allChildren(parent).splice(index,1);},removeAllChildren:function(parent)
+{parent._allChildren=[];},removeTopLevelNodes:function()
+{this._disposeAllNodes();this.rootNode().removeChildren();this.rootNode()._allChildren=[];},highlightNode:function(node)
+{if(this._isScrolledIntoView(node.element)){this.updateVisibleNodes(true);WebInspector.HeapSnapshotSortableDataGrid.prototype.highlightNode.call(this,node);}else{node.element.scrollIntoViewIfNeeded(true);this._nodeToHighlightAfterScroll=node;}},_isScrolledIntoView:function(element)
+{var viewportTop=this.scrollContainer.scrollTop;var viewportBottom=viewportTop+this.scrollContainer.clientHeight;var elemTop=element.offsetTop
+var elemBottom=elemTop+element.offsetHeight;return elemBottom<=viewportBottom&&elemTop>=viewportTop;},onResize:function()
+{WebInspector.HeapSnapshotSortableDataGrid.prototype.onResize.call(this);this.updateVisibleNodes(false);},_onScroll:function(event)
+{this.updateVisibleNodes(false);if(this._nodeToHighlightAfterScroll){WebInspector.HeapSnapshotSortableDataGrid.prototype.highlightNode.call(this,this._nodeToHighlightAfterScroll);this._nodeToHighlightAfterScroll=null;}},__proto__:WebInspector.HeapSnapshotSortableDataGrid.prototype}
+WebInspector.HeapSnapshotPaddingNode=function()
+{this.element=document.createElement("tr");this.element.classList.add("revealed");}
+WebInspector.HeapSnapshotPaddingNode.prototype={setHeight:function(height)
+{this.element.style.height=height+"px";},removeFromTable:function()
+{var parent=this.element.parentNode;if(parent)
+parent.removeChild(this.element);}}
+WebInspector.HeapSnapshotContainmentDataGrid=function(columns)
+{columns=columns||[{id:"object",title:WebInspector.UIString("Object"),disclosure:true,sortable:true},{id:"distance",title:WebInspector.UIString("Distance"),width:"80px",sortable:true},{id:"shallowSize",title:WebInspector.UIString("Shallow Size"),width:"120px",sortable:true},{id:"retainedSize",title:WebInspector.UIString("Retained Size"),width:"120px",sortable:true,sort:WebInspector.DataGrid.Order.Descending}];WebInspector.HeapSnapshotSortableDataGrid.call(this,columns);}
+WebInspector.HeapSnapshotContainmentDataGrid.prototype={setDataSource:function(snapshot,nodeIndex)
+{this.snapshot=snapshot;var node={nodeIndex:nodeIndex||snapshot.rootNodeIndex};var fakeEdge={node:node};this.setRootNode(new WebInspector.HeapSnapshotObjectNode(this,snapshot,fakeEdge,null));this.rootNode().sort();},sortingChanged:function()
+{var rootNode=this.rootNode();if(rootNode.hasChildren)
+rootNode.sort();},__proto__:WebInspector.HeapSnapshotSortableDataGrid.prototype}
+WebInspector.HeapSnapshotRetainmentDataGrid=function()
+{this.showRetainingEdges=true;var columns=[{id:"object",title:WebInspector.UIString("Object"),disclosure:true,sortable:true},{id:"distance",title:WebInspector.UIString("Distance"),width:"80px",sortable:true,sort:WebInspector.DataGrid.Order.Ascending},{id:"shallowSize",title:WebInspector.UIString("Shallow Size"),width:"120px",sortable:true},{id:"retainedSize",title:WebInspector.UIString("Retained Size"),width:"120px",sortable:true}];WebInspector.HeapSnapshotContainmentDataGrid.call(this,columns);}
+WebInspector.HeapSnapshotRetainmentDataGrid.Events={ExpandRetainersComplete:"ExpandRetainersComplete"}
+WebInspector.HeapSnapshotRetainmentDataGrid.prototype={_sortFields:function(sortColumn,sortAscending)
+{return{object:["_name",sortAscending,"_count",false],count:["_count",sortAscending,"_name",true],shallowSize:["_shallowSize",sortAscending,"_name",true],retainedSize:["_retainedSize",sortAscending,"_name",true],distance:["_distance",sortAscending,"_name",true]}[sortColumn];},reset:function()
+{this.rootNode().removeChildren();this.resetSortingCache();},setDataSource:function(snapshot,nodeIndex)
+{WebInspector.HeapSnapshotContainmentDataGrid.prototype.setDataSource.call(this,snapshot,nodeIndex);var dataGrid=this;var maxExpandLevels=20;function populateComplete()
+{this.removeEventListener(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete,populateComplete,this);this.expand();if(--maxExpandLevels>0&&this.children.length>0){var retainer=this.children[0];if(retainer._distance>1){retainer.addEventListener(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete,populateComplete,retainer);retainer.populate();return;}}
+dataGrid.dispatchEventToListeners(WebInspector.HeapSnapshotRetainmentDataGrid.Events.ExpandRetainersComplete);}
+this.rootNode().addEventListener(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete,populateComplete,this.rootNode());},__proto__:WebInspector.HeapSnapshotContainmentDataGrid.prototype}
+WebInspector.HeapSnapshotConstructorsDataGrid=function()
+{var columns=[{id:"object",title:WebInspector.UIString("Constructor"),disclosure:true,sortable:true},{id:"distance",title:WebInspector.UIString("Distance"),width:"90px",sortable:true},{id:"count",title:WebInspector.UIString("Objects Count"),width:"90px",sortable:true},{id:"shallowSize",title:WebInspector.UIString("Shallow Size"),width:"120px",sortable:true},{id:"retainedSize",title:WebInspector.UIString("Retained Size"),width:"120px",sort:WebInspector.DataGrid.Order.Descending,sortable:true}];WebInspector.HeapSnapshotViewportDataGrid.call(this,columns);this._profileIndex=-1;this._objectIdToSelect=null;}
+WebInspector.HeapSnapshotConstructorsDataGrid.prototype={_sortFields:function(sortColumn,sortAscending)
+{return{object:["_name",sortAscending,"_count",false],distance:["_distance",sortAscending,"_retainedSize",true],count:["_count",sortAscending,"_name",true],shallowSize:["_shallowSize",sortAscending,"_name",true],retainedSize:["_retainedSize",sortAscending,"_name",true]}[sortColumn];},highlightObjectByHeapSnapshotId:function(id,callback)
+{if(!this.snapshot){this._objectIdToSelect=id;return;}
+function didGetClassName(className)
+{if(!className){callback(false);return;}
+var constructorNodes=this.topLevelNodes();for(var i=0;i<constructorNodes.length;i++){var parent=constructorNodes[i];if(parent._name===className){parent.revealNodeBySnapshotObjectId(parseInt(id,10),callback);return;}}}
+this.snapshot.nodeClassName(parseInt(id,10),didGetClassName.bind(this));},clear:function()
+{this._nextRequestedFilter=null;this._lastFilter=null;this.removeTopLevelNodes();},setDataSource:function(snapshot)
+{this.snapshot=snapshot;if(this._profileIndex===-1)
+this._populateChildren();if(this._objectIdToSelect){this.highlightObjectByHeapSnapshotId(this._objectIdToSelect,function(found){});this._objectIdToSelect=null;}},setSelectionRange:function(minNodeId,maxNodeId)
+{this._populateChildren(new WebInspector.HeapSnapshotCommon.NodeFilter(minNodeId,maxNodeId));},setAllocationNodeId:function(allocationNodeId)
+{var filter=new WebInspector.HeapSnapshotCommon.NodeFilter();filter.allocationNodeId=allocationNodeId;this._populateChildren(filter);},_aggregatesReceived:function(nodeFilter,aggregates)
+{this._filterInProgress=null;if(this._nextRequestedFilter){this.snapshot.aggregatesWithFilter(this._nextRequestedFilter,this._aggregatesReceived.bind(this,this._nextRequestedFilter));this._filterInProgress=this._nextRequestedFilter;this._nextRequestedFilter=null;}
+this.removeTopLevelNodes();this.resetSortingCache();for(var constructor in aggregates)
+this.appendNode(this.rootNode(),new WebInspector.HeapSnapshotConstructorNode(this,constructor,aggregates[constructor],nodeFilter));this.sortingChanged();this._lastFilter=nodeFilter;},_populateChildren:function(nodeFilter)
+{nodeFilter=nodeFilter||new WebInspector.HeapSnapshotCommon.NodeFilter();if(this._filterInProgress){this._nextRequestedFilter=this._filterInProgress.equals(nodeFilter)?null:nodeFilter;return;}
+if(this._lastFilter&&this._lastFilter.equals(nodeFilter))
+return;this._filterInProgress=nodeFilter;this.snapshot.aggregatesWithFilter(nodeFilter,this._aggregatesReceived.bind(this,nodeFilter));},filterSelectIndexChanged:function(profiles,profileIndex)
+{this._profileIndex=profileIndex;var nodeFilter;if(profileIndex!==-1){var minNodeId=profileIndex>0?profiles[profileIndex-1].maxJSObjectId:0;var maxNodeId=profiles[profileIndex].maxJSObjectId;nodeFilter=new WebInspector.HeapSnapshotCommon.NodeFilter(minNodeId,maxNodeId)}
+this._populateChildren(nodeFilter);},__proto__:WebInspector.HeapSnapshotViewportDataGrid.prototype}
+WebInspector.HeapSnapshotDiffDataGrid=function()
+{var columns=[{id:"object",title:WebInspector.UIString("Constructor"),disclosure:true,sortable:true},{id:"addedCount",title:WebInspector.UIString("# New"),width:"72px",sortable:true},{id:"removedCount",title:WebInspector.UIString("# Deleted"),width:"72px",sortable:true},{id:"countDelta",title:WebInspector.UIString("# Delta"),width:"64px",sortable:true},{id:"addedSize",title:WebInspector.UIString("Alloc. Size"),width:"72px",sortable:true,sort:WebInspector.DataGrid.Order.Descending},{id:"removedSize",title:WebInspector.UIString("Freed Size"),width:"72px",sortable:true},{id:"sizeDelta",title:WebInspector.UIString("Size Delta"),width:"72px",sortable:true}];WebInspector.HeapSnapshotViewportDataGrid.call(this,columns);}
+WebInspector.HeapSnapshotDiffDataGrid.prototype={defaultPopulateCount:function()
+{return 50;},_sortFields:function(sortColumn,sortAscending)
+{return{object:["_name",sortAscending,"_count",false],addedCount:["_addedCount",sortAscending,"_name",true],removedCount:["_removedCount",sortAscending,"_name",true],countDelta:["_countDelta",sortAscending,"_name",true],addedSize:["_addedSize",sortAscending,"_name",true],removedSize:["_removedSize",sortAscending,"_name",true],sizeDelta:["_sizeDelta",sortAscending,"_name",true]}[sortColumn];},setDataSource:function(snapshot)
+{this.snapshot=snapshot;},setBaseDataSource:function(baseSnapshot)
+{this.baseSnapshot=baseSnapshot;this.removeTopLevelNodes();this.resetSortingCache();if(this.baseSnapshot===this.snapshot){this.dispatchEventToListeners(WebInspector.HeapSnapshotSortableDataGrid.Events.SortingComplete);return;}
+this._populateChildren();},_populateChildren:function()
+{function aggregatesForDiffReceived(aggregatesForDiff)
+{this.snapshot.calculateSnapshotDiff(this.baseSnapshot.uid,aggregatesForDiff,didCalculateSnapshotDiff.bind(this));function didCalculateSnapshotDiff(diffByClassName)
+{for(var className in diffByClassName){var diff=diffByClassName[className];this.appendNode(this.rootNode(),new WebInspector.HeapSnapshotDiffNode(this,className,diff));}
+this.sortingChanged();}}
+this.baseSnapshot.aggregatesForDiff(aggregatesForDiffReceived.bind(this));},__proto__:WebInspector.HeapSnapshotViewportDataGrid.prototype}
+WebInspector.HeapSnapshotDominatorsDataGrid=function()
+{var columns=[{id:"object",title:WebInspector.UIString("Object"),disclosure:true,sortable:true},{id:"shallowSize",title:WebInspector.UIString("Shallow Size"),width:"120px",sortable:true},{id:"retainedSize",title:WebInspector.UIString("Retained Size"),width:"120px",sort:WebInspector.DataGrid.Order.Descending,sortable:true}];WebInspector.HeapSnapshotSortableDataGrid.call(this,columns);this._objectIdToSelect=null;}
+WebInspector.HeapSnapshotDominatorsDataGrid.prototype={defaultPopulateCount:function()
+{return 25;},setDataSource:function(snapshot)
+{this.snapshot=snapshot;var fakeNode={nodeIndex:this.snapshot.rootNodeIndex};this.setRootNode(new WebInspector.HeapSnapshotDominatorObjectNode(this,fakeNode));this.rootNode().sort();if(this._objectIdToSelect){this.highlightObjectByHeapSnapshotId(this._objectIdToSelect,function(found){});this._objectIdToSelect=null;}},sortingChanged:function()
+{this.rootNode().sort();},highlightObjectByHeapSnapshotId:function(id,callback)
+{if(!this.snapshot){this._objectIdToSelect=id;callback(false);return;}
+function didGetDominators(dominatorIds)
+{if(!dominatorIds){WebInspector.console.log(WebInspector.UIString("Cannot find corresponding heap snapshot node"));callback(false);return;}
+var dominatorNode=this.rootNode();expandNextDominator.call(this,dominatorIds,dominatorNode);}
+function expandNextDominator(dominatorIds,dominatorNode)
+{if(!dominatorNode){console.error("Cannot find dominator node");callback(false);return;}
+if(!dominatorIds.length){this.highlightNode(dominatorNode);dominatorNode.element.scrollIntoViewIfNeeded(true);callback(true);return;}
+var snapshotObjectId=dominatorIds.pop();dominatorNode.retrieveChildBySnapshotObjectId(snapshotObjectId,expandNextDominator.bind(this,dominatorIds));}
+this.snapshot.dominatorIdsForNode(parseInt(id,10),didGetDominators.bind(this));},__proto__:WebInspector.HeapSnapshotSortableDataGrid.prototype}
+WebInspector.AllocationDataGrid=function()
+{var columns=[{id:"liveCount",title:WebInspector.UIString("Live Count"),width:"72px",sortable:true},{id:"count",title:WebInspector.UIString("Count"),width:"72px",sortable:true},{id:"liveSize",title:WebInspector.UIString("Live Size"),width:"72px",sortable:true},{id:"size",title:WebInspector.UIString("Size"),width:"72px",sortable:true,sort:WebInspector.DataGrid.Order.Descending},{id:"name",title:WebInspector.UIString("Function"),disclosure:true,sortable:true},];WebInspector.DataGrid.call(this,columns);this._linkifier=new WebInspector.Linkifier();this.addEventListener(WebInspector.DataGrid.Events.SortingChanged,this._sortingChanged,this);}
+WebInspector.AllocationDataGrid.prototype={setDataSource:function(snapshot)
+{this.snapshot=snapshot;this.snapshot.allocationTracesTops(didReceiveAllocationTracesTops.bind(this));function didReceiveAllocationTracesTops(tops)
+{this._topNodes=tops;this._populateChildren();}},_populateChildren:function()
+{var root=this.rootNode();var tops=this._topNodes;for(var i=0;i<tops.length;i++)
+root.appendChild(new WebInspector.AllocationGridNode(this,tops[i]));},_sortingChanged:function()
+{this._topNodes.sort(this._createComparator());this.rootNode().removeChildren();this._populateChildren();},_createComparator:function()
+{var fieldName=this.sortColumnIdentifier();var compareResult=(this.sortOrder()===WebInspector.DataGrid.Order.Ascending)?+1:-1;function compare(a,b)
+{if(a[fieldName]>b[fieldName])
+return compareResult;if(a[fieldName]<b[fieldName])
+return-compareResult;return 0;}
+return compare;},__proto__:WebInspector.DataGrid.prototype};WebInspector.HeapSnapshotGridNode=function(tree,hasChildren)
+{WebInspector.DataGridNode.call(this,null,hasChildren);this._dataGrid=tree;this._instanceCount=0;this._savedChildren=null;this._retrievedChildrenRanges=[];this._providerObject=null;}
+WebInspector.HeapSnapshotGridNode.Events={PopulateComplete:"PopulateComplete"}
+WebInspector.HeapSnapshotGridNode.createComparator=function(fieldNames)
+{return({fieldName1:fieldNames[0],ascending1:fieldNames[1],fieldName2:fieldNames[2],ascending2:fieldNames[3]});}
+WebInspector.HeapSnapshotGridNode.ChildrenProvider=function(){}
+WebInspector.HeapSnapshotGridNode.ChildrenProvider.prototype={dispose:function(){},nodePosition:function(snapshotObjectId,callback){},isEmpty:function(callback){},serializeItemsRange:function(startPosition,endPosition,callback){},sortAndRewind:function(comparator,callback){}}
+WebInspector.HeapSnapshotGridNode.prototype={createProvider:function()
+{throw new Error("Not implemented.");},retainersDataSource:function()
+{return null;},_provider:function()
+{if(!this._providerObject)
+this._providerObject=this.createProvider();return this._providerObject;},createCell:function(columnIdentifier)
+{var cell=WebInspector.DataGridNode.prototype.createCell.call(this,columnIdentifier);if(this._searchMatched)
+cell.classList.add("highlight");return cell;},collapse:function()
+{WebInspector.DataGridNode.prototype.collapse.call(this);this._dataGrid.updateVisibleNodes(true);},expand:function()
+{WebInspector.DataGridNode.prototype.expand.call(this);this._dataGrid.updateVisibleNodes(true);},dispose:function()
+{if(this._providerObject)
+this._providerObject.dispose();for(var node=this.children[0];node;node=node.traverseNextNode(true,this,true))
+if(node.dispose)
+node.dispose();},_reachableFromWindow:false,queryObjectContent:function(callback)
+{},wasDetached:function()
+{this._dataGrid.nodeWasDetached(this);},_toPercentString:function(num)
+{return num.toFixed(0)+"\u2009%";},allChildren:function()
+{return this._dataGrid.allChildren(this);},removeChildByIndex:function(index)
+{this._dataGrid.removeChildByIndex(this,index);},childForPosition:function(nodePosition)
+{var indexOfFirstChildInRange=0;for(var i=0;i<this._retrievedChildrenRanges.length;i++){var range=this._retrievedChildrenRanges[i];if(range.from<=nodePosition&&nodePosition<range.to){var childIndex=indexOfFirstChildInRange+nodePosition-range.from;return this.allChildren()[childIndex];}
+indexOfFirstChildInRange+=range.to-range.from+1;}
+return null;},_createValueCell:function(columnIdentifier)
+{var cell=document.createElement("td");cell.className=columnIdentifier+"-column";if(this.dataGrid.snapshot.totalSize!==0){var div=document.createElement("div");var valueSpan=document.createElement("span");valueSpan.textContent=this.data[columnIdentifier];div.appendChild(valueSpan);var percentColumn=columnIdentifier+"-percent";if(percentColumn in this.data){var percentSpan=document.createElement("span");percentSpan.className="percent-column";percentSpan.textContent=this.data[percentColumn];div.appendChild(percentSpan);div.classList.add("heap-snapshot-multiple-values");}
+cell.appendChild(div);}
+return cell;},populate:function(event)
+{if(this._populated)
+return;this._populated=true;function sorted()
+{this._populateChildren();}
+this._provider().sortAndRewind(this.comparator(),sorted.bind(this));},expandWithoutPopulate:function(callback)
+{this._populated=true;this.expand();this._provider().sortAndRewind(this.comparator(),callback);},_populateChildren:function(fromPosition,toPosition,afterPopulate)
+{fromPosition=fromPosition||0;toPosition=toPosition||fromPosition+this._dataGrid.defaultPopulateCount();var firstNotSerializedPosition=fromPosition;function serializeNextChunk()
+{if(firstNotSerializedPosition>=toPosition)
+return;var end=Math.min(firstNotSerializedPosition+this._dataGrid.defaultPopulateCount(),toPosition);this._provider().serializeItemsRange(firstNotSerializedPosition,end,childrenRetrieved.bind(this));firstNotSerializedPosition=end;}
+function insertRetrievedChild(item,insertionIndex)
+{if(this._savedChildren){var hash=this._childHashForEntity(item);if(hash in this._savedChildren){this._dataGrid.insertChild(this,this._savedChildren[hash],insertionIndex);return;}}
+this._dataGrid.insertChild(this,this._createChildNode(item),insertionIndex);}
+function insertShowMoreButton(from,to,insertionIndex)
+{var button=new WebInspector.ShowMoreDataGridNode(this._populateChildren.bind(this),from,to,this._dataGrid.defaultPopulateCount());this._dataGrid.insertChild(this,button,insertionIndex);}
+function childrenRetrieved(itemsRange)
+{var itemIndex=0;var itemPosition=itemsRange.startPosition;var items=itemsRange.items;var insertionIndex=0;if(!this._retrievedChildrenRanges.length){if(itemsRange.startPosition>0){this._retrievedChildrenRanges.push({from:0,to:0});insertShowMoreButton.call(this,0,itemsRange.startPosition,insertionIndex++);}
+this._retrievedChildrenRanges.push({from:itemsRange.startPosition,to:itemsRange.endPosition});for(var i=0,l=items.length;i<l;++i)
+insertRetrievedChild.call(this,items[i],insertionIndex++);if(itemsRange.endPosition<itemsRange.totalLength)
+insertShowMoreButton.call(this,itemsRange.endPosition,itemsRange.totalLength,insertionIndex++);}else{var rangeIndex=0;var found=false;var range;while(rangeIndex<this._retrievedChildrenRanges.length){range=this._retrievedChildrenRanges[rangeIndex];if(range.to>=itemPosition){found=true;break;}
+insertionIndex+=range.to-range.from;if(range.to<itemsRange.totalLength)
+insertionIndex+=1;++rangeIndex;}
+if(!found||itemsRange.startPosition<range.from){this.allChildren()[insertionIndex-1].setEndPosition(itemsRange.startPosition);insertShowMoreButton.call(this,itemsRange.startPosition,found?range.from:itemsRange.totalLength,insertionIndex);range={from:itemsRange.startPosition,to:itemsRange.startPosition};if(!found)
+rangeIndex=this._retrievedChildrenRanges.length;this._retrievedChildrenRanges.splice(rangeIndex,0,range);}else{insertionIndex+=itemPosition-range.from;}
+while(range.to<itemsRange.endPosition){var skipCount=range.to-itemPosition;insertionIndex+=skipCount;itemIndex+=skipCount;itemPosition=range.to;var nextRange=this._retrievedChildrenRanges[rangeIndex+1];var newEndOfRange=nextRange?nextRange.from:itemsRange.totalLength;if(newEndOfRange>itemsRange.endPosition)
+newEndOfRange=itemsRange.endPosition;while(itemPosition<newEndOfRange){insertRetrievedChild.call(this,items[itemIndex++],insertionIndex++);++itemPosition;}
+if(nextRange&&newEndOfRange===nextRange.from){range.to=nextRange.to;this.removeChildByIndex(insertionIndex);this._retrievedChildrenRanges.splice(rangeIndex+1,1);}else{range.to=newEndOfRange;if(newEndOfRange===itemsRange.totalLength)
+this.removeChildByIndex(insertionIndex);else
+this.allChildren()[insertionIndex].setStartPosition(itemsRange.endPosition);}}}
+this._instanceCount+=items.length;if(firstNotSerializedPosition<toPosition){serializeNextChunk.call(this);return;}
+if(this.expanded)
+this._dataGrid.updateVisibleNodes(true);if(afterPopulate)
+afterPopulate();this.dispatchEventToListeners(WebInspector.HeapSnapshotGridNode.Events.PopulateComplete);}
+serializeNextChunk.call(this);},_saveChildren:function()
+{this._savedChildren=null;var children=this.allChildren();for(var i=0,l=children.length;i<l;++i){var child=children[i];if(!child.expanded)
+continue;if(!this._savedChildren)
+this._savedChildren={};this._savedChildren[this._childHashForNode(child)]=child;}},sort:function()
+{this._dataGrid.recursiveSortingEnter();function afterSort()
+{this._saveChildren();this._dataGrid.removeAllChildren(this);this._retrievedChildrenRanges=[];function afterPopulate()
+{var children=this.allChildren();for(var i=0,l=children.length;i<l;++i){var child=children[i];if(child.expanded)
+child.sort();}
+this._dataGrid.recursiveSortingLeave();}
+var instanceCount=this._instanceCount;this._instanceCount=0;this._populateChildren(0,instanceCount,afterPopulate.bind(this));}
+this._provider().sortAndRewind(this.comparator(),afterSort.bind(this));},__proto__:WebInspector.DataGridNode.prototype}
+WebInspector.HeapSnapshotGenericObjectNode=function(dataGrid,node)
+{WebInspector.HeapSnapshotGridNode.call(this,dataGrid,false);if(!node)
+return;this._name=node.name;this._type=node.type;this._distance=node.distance;this._shallowSize=node.selfSize;this._retainedSize=node.retainedSize;this.snapshotNodeId=node.id;this.snapshotNodeIndex=node.nodeIndex;if(this._type==="string")
+this._reachableFromWindow=true;else if(this._type==="object"&&this._name.startsWith("Window")){this._name=this.shortenWindowURL(this._name,false);this._reachableFromWindow=true;}else if(node.canBeQueried)
+this._reachableFromWindow=true;if(node.detachedDOMTreeNode)
+this.detachedDOMTreeNode=true;var snapshot=dataGrid.snapshot;var shallowSizePercent=this._shallowSize/snapshot.totalSize*100.0;var retainedSizePercent=this._retainedSize/snapshot.totalSize*100.0;this.data={"distance":this._distance,"shallowSize":Number.withThousandsSeparator(this._shallowSize),"retainedSize":Number.withThousandsSeparator(this._retainedSize),"shallowSize-percent":this._toPercentString(shallowSizePercent),"retainedSize-percent":this._toPercentString(retainedSizePercent)};};WebInspector.HeapSnapshotGenericObjectNode.prototype={retainersDataSource:function()
+{return{snapshot:this._dataGrid.snapshot,snapshotNodeIndex:this.snapshotNodeIndex};},createCell:function(columnIdentifier)
+{var cell=columnIdentifier!=="object"?this._createValueCell(columnIdentifier):this._createObjectCell();if(this._searchMatched)
+cell.classList.add("highlight");return cell;},_createObjectCell:function()
+{var value=this._name;var valueStyle="object";switch(this._type){case"concatenated string":case"string":value="\""+value+"\"";valueStyle="string";break;case"regexp":value="/"+value+"/";valueStyle="string";break;case"closure":value="function"+(value?" ":"")+value+"()";valueStyle="function";break;case"number":valueStyle="number";break;case"hidden":valueStyle="null";break;case"array":if(!value)
+value="[]";else
+value+="[]";break;};if(this._reachableFromWindow)
+valueStyle+=" highlight";if(value==="Object")
+value="";if(this.detachedDOMTreeNode)
+valueStyle+=" detached-dom-tree-node";return this._createObjectCellWithValue(valueStyle,value);},_createObjectCellWithValue:function(valueStyle,value)
+{var cell=document.createElement("td");cell.className="object-column";var div=document.createElement("div");div.className="source-code event-properties";div.style.overflow="visible";this._prefixObjectCell(div);var valueSpan=document.createElement("span");valueSpan.className="value console-formatted-"+valueStyle;valueSpan.textContent=value;div.appendChild(valueSpan);var idSpan=document.createElement("span");idSpan.className="console-formatted-id";idSpan.textContent=" @"+this.snapshotNodeId;div.appendChild(idSpan);cell.appendChild(div);cell.classList.add("disclosure");if(this.depth)
+cell.style.setProperty("padding-left",(this.depth*this.dataGrid.indentWidth)+"px");cell.heapSnapshotNode=this;return cell;},_prefixObjectCell:function(div)
+{},queryObjectContent:function(callback,objectGroupName)
+{function formatResult(error,object)
+{if(!error&&object.type)
+callback(WebInspector.RemoteObject.fromPayload(object),!!error);else
+callback(WebInspector.RemoteObject.fromPrimitiveValue(WebInspector.UIString("Preview is not available")));}
+if(this._type==="string")
+callback(WebInspector.RemoteObject.fromPrimitiveValue(this._name));else
+HeapProfilerAgent.getObjectByHeapObjectId(String(this.snapshotNodeId),objectGroupName,formatResult);},updateHasChildren:function()
+{function isEmptyCallback(isEmpty)
+{this.hasChildren=!isEmpty;}
+this._provider().isEmpty(isEmptyCallback.bind(this));},shortenWindowURL:function(fullName,hasObjectId)
+{var startPos=fullName.indexOf("/");var endPos=hasObjectId?fullName.indexOf("@"):fullName.length;if(startPos!==-1&&endPos!==-1){var fullURL=fullName.substring(startPos+1,endPos).trimLeft();var url=fullURL.trimURL();if(url.length>40)
+url=url.trimMiddle(40);return fullName.substr(0,startPos+2)+url+fullName.substr(endPos);}else
+return fullName;},__proto__:WebInspector.HeapSnapshotGridNode.prototype}
+WebInspector.HeapSnapshotObjectNode=function(dataGrid,snapshot,edge,parentGridNode)
+{WebInspector.HeapSnapshotGenericObjectNode.call(this,dataGrid,edge.node);this._referenceName=edge.name;this._referenceType=edge.type;this.showRetainingEdges=dataGrid.showRetainingEdges;this._snapshot=snapshot;this._parentGridNode=parentGridNode;this._cycledWithAncestorGridNode=this._findAncestorWithSameSnapshotNodeId();if(!this._cycledWithAncestorGridNode)
+this.updateHasChildren();var data=this.data;data["count"]="";data["addedCount"]="";data["removedCount"]="";data["countDelta"]="";data["addedSize"]="";data["removedSize"]="";data["sizeDelta"]="";}
+WebInspector.HeapSnapshotObjectNode.prototype={retainersDataSource:function()
+{return{snapshot:this._snapshot,snapshotNodeIndex:this.snapshotNodeIndex};},createProvider:function()
+{var tree=this._dataGrid;if(this.showRetainingEdges)
+return this._snapshot.createRetainingEdgesProvider(this.snapshotNodeIndex);else
+return this._snapshot.createEdgesProvider(this.snapshotNodeIndex);},_findAncestorWithSameSnapshotNodeId:function()
+{var ancestor=this._parentGridNode;while(ancestor){if(ancestor.snapshotNodeId===this.snapshotNodeId)
+return ancestor;ancestor=ancestor._parentGridNode;}
+return null;},_createChildNode:function(item)
+{return new WebInspector.HeapSnapshotObjectNode(this._dataGrid,this._snapshot,item,this);},_childHashForEntity:function(edge)
+{var prefix=this.showRetainingEdges?edge.node.id+"#":"";return prefix+edge.type+"#"+edge.name;},_childHashForNode:function(childNode)
+{var prefix=this.showRetainingEdges?childNode.snapshotNodeId+"#":"";return prefix+childNode._referenceType+"#"+childNode._referenceName;},comparator:function()
+{var sortAscending=this._dataGrid.isSortOrderAscending();var sortColumnIdentifier=this._dataGrid.sortColumnIdentifier();var sortFields={object:["!edgeName",sortAscending,"retainedSize",false],count:["!edgeName",true,"retainedSize",false],shallowSize:["selfSize",sortAscending,"!edgeName",true],retainedSize:["retainedSize",sortAscending,"!edgeName",true],distance:["distance",sortAscending,"_name",true]}[sortColumnIdentifier]||["!edgeName",true,"retainedSize",false];return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);},_prefixObjectCell:function(div)
+{var name=this._referenceName;if(name==="")name="(empty)";var nameClass="name";switch(this._referenceType){case"context":nameClass="console-formatted-number";break;case"internal":case"hidden":case"weak":nameClass="console-formatted-null";break;case"element":name="["+name+"]";break;}
+if(this._cycledWithAncestorGridNode)
+div.className+=" cycled-ancessor-node";var nameSpan=document.createElement("span");nameSpan.className=nameClass;nameSpan.textContent=name;div.appendChild(nameSpan);var separatorSpan=document.createElement("span");separatorSpan.className="grayed";separatorSpan.textContent=this.showRetainingEdges?" in ":" :: ";div.appendChild(separatorSpan);},__proto__:WebInspector.HeapSnapshotGenericObjectNode.prototype}
+WebInspector.HeapSnapshotInstanceNode=function(dataGrid,snapshot,node,isDeletedNode)
+{WebInspector.HeapSnapshotGenericObjectNode.call(this,dataGrid,node);this._baseSnapshotOrSnapshot=snapshot;this._isDeletedNode=isDeletedNode;this.updateHasChildren();var data=this.data;data["count"]="";data["countDelta"]="";data["sizeDelta"]="";if(this._isDeletedNode){data["addedCount"]="";data["addedSize"]="";data["removedCount"]="\u2022";data["removedSize"]=Number.withThousandsSeparator(this._shallowSize);}else{data["addedCount"]="\u2022";data["addedSize"]=Number.withThousandsSeparator(this._shallowSize);data["removedCount"]="";data["removedSize"]="";}};WebInspector.HeapSnapshotInstanceNode.prototype={retainersDataSource:function()
+{return{snapshot:this._baseSnapshotOrSnapshot,snapshotNodeIndex:this.snapshotNodeIndex};},createProvider:function()
+{return this._baseSnapshotOrSnapshot.createEdgesProvider(this.snapshotNodeIndex);},_createChildNode:function(item)
+{return new WebInspector.HeapSnapshotObjectNode(this._dataGrid,this._baseSnapshotOrSnapshot,item,null);},_childHashForEntity:function(edge)
+{return edge.type+"#"+edge.name;},_childHashForNode:function(childNode)
+{return childNode._referenceType+"#"+childNode._referenceName;},comparator:function()
+{var sortAscending=this._dataGrid.isSortOrderAscending();var sortColumnIdentifier=this._dataGrid.sortColumnIdentifier();var sortFields={object:["!edgeName",sortAscending,"retainedSize",false],distance:["distance",sortAscending,"retainedSize",false],count:["!edgeName",true,"retainedSize",false],addedSize:["selfSize",sortAscending,"!edgeName",true],removedSize:["selfSize",sortAscending,"!edgeName",true],shallowSize:["selfSize",sortAscending,"!edgeName",true],retainedSize:["retainedSize",sortAscending,"!edgeName",true]}[sortColumnIdentifier]||["!edgeName",true,"retainedSize",false];return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);},__proto__:WebInspector.HeapSnapshotGenericObjectNode.prototype}
+WebInspector.HeapSnapshotConstructorNode=function(dataGrid,className,aggregate,nodeFilter)
+{WebInspector.HeapSnapshotGridNode.call(this,dataGrid,aggregate.count>0);this._name=className;this._nodeFilter=nodeFilter;this._distance=aggregate.distance;this._count=aggregate.count;this._shallowSize=aggregate.self;this._retainedSize=aggregate.maxRet;var snapshot=dataGrid.snapshot;var countPercent=this._count/snapshot.nodeCount*100.0;var retainedSizePercent=this._retainedSize/snapshot.totalSize*100.0;var shallowSizePercent=this._shallowSize/snapshot.totalSize*100.0;this.data={"object":className,"count":Number.withThousandsSeparator(this._count),"distance":this._distance,"shallowSize":Number.withThousandsSeparator(this._shallowSize),"retainedSize":Number.withThousandsSeparator(this._retainedSize),"count-percent":this._toPercentString(countPercent),"shallowSize-percent":this._toPercentString(shallowSizePercent),"retainedSize-percent":this._toPercentString(retainedSizePercent)};}
+WebInspector.HeapSnapshotConstructorNode.prototype={createProvider:function()
+{return this._dataGrid.snapshot.createNodesProviderForClass(this._name,this._nodeFilter)},revealNodeBySnapshotObjectId:function(snapshotObjectId,callback)
+{function didExpand()
+{this._provider().nodePosition(snapshotObjectId,didGetNodePosition.bind(this));}
+function didGetNodePosition(nodePosition)
+{if(nodePosition===-1){this.collapse();callback(false);}else{this._populateChildren(nodePosition,null,didPopulateChildren.bind(this,nodePosition));}}
+function didPopulateChildren(nodePosition)
+{var child=this.childForPosition(nodePosition);if(child){this._dataGrid.revealTreeNode([this,child]);this._dataGrid.highlightNode((child));}
+callback(!!child);}
+this._dataGrid.resetNameFilter(this.expandWithoutPopulate.bind(this,didExpand.bind(this)));},filteredOut:function()
+{return this._name.toLowerCase().indexOf(this._dataGrid._nameFilter)===-1;},createCell:function(columnIdentifier)
+{var cell=columnIdentifier!=="object"?this._createValueCell(columnIdentifier):WebInspector.HeapSnapshotGridNode.prototype.createCell.call(this,columnIdentifier);if(this._searchMatched)
+cell.classList.add("highlight");return cell;},_createChildNode:function(item)
+{return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid,this._dataGrid.snapshot,item,false);},comparator:function()
+{var sortAscending=this._dataGrid.isSortOrderAscending();var sortColumnIdentifier=this._dataGrid.sortColumnIdentifier();var sortFields={object:["id",sortAscending,"retainedSize",false],distance:["distance",sortAscending,"retainedSize",false],count:["id",true,"retainedSize",false],shallowSize:["selfSize",sortAscending,"id",true],retainedSize:["retainedSize",sortAscending,"id",true]}[sortColumnIdentifier];return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);},_childHashForEntity:function(node)
+{return node.id;},_childHashForNode:function(childNode)
+{return childNode.snapshotNodeId;},__proto__:WebInspector.HeapSnapshotGridNode.prototype}
+WebInspector.HeapSnapshotDiffNodesProvider=function(addedNodesProvider,deletedNodesProvider,addedCount,removedCount)
+{this._addedNodesProvider=addedNodesProvider;this._deletedNodesProvider=deletedNodesProvider;this._addedCount=addedCount;this._removedCount=removedCount;}
+WebInspector.HeapSnapshotDiffNodesProvider.prototype={dispose:function()
+{this._addedNodesProvider.dispose();this._deletedNodesProvider.dispose();},nodePosition:function(snapshotObjectId,callback)
+{throw new Error("Unreachable");},isEmpty:function(callback)
+{callback(false);},serializeItemsRange:function(beginPosition,endPosition,callback)
+{function didReceiveAllItems(items)
+{items.totalLength=this._addedCount+this._removedCount;callback(items);}
+function didReceiveDeletedItems(addedItems,itemsRange)
+{var items=itemsRange.items;if(!addedItems.items.length)
+addedItems.startPosition=this._addedCount+itemsRange.startPosition;for(var i=0;i<items.length;i++){items[i].isAddedNotRemoved=false;addedItems.items.push(items[i]);}
+addedItems.endPosition=this._addedCount+itemsRange.endPosition;didReceiveAllItems.call(this,addedItems);}
+function didReceiveAddedItems(itemsRange)
+{var items=itemsRange.items;for(var i=0;i<items.length;i++)
+items[i].isAddedNotRemoved=true;if(itemsRange.endPosition<endPosition)
+return this._deletedNodesProvider.serializeItemsRange(0,endPosition-itemsRange.endPosition,didReceiveDeletedItems.bind(this,itemsRange));itemsRange.totalLength=this._addedCount+this._removedCount;didReceiveAllItems.call(this,itemsRange);}
+if(beginPosition<this._addedCount){this._addedNodesProvider.serializeItemsRange(beginPosition,endPosition,didReceiveAddedItems.bind(this));}else{var emptyRange=new WebInspector.HeapSnapshotCommon.ItemsRange(0,0,0,[]);this._deletedNodesProvider.serializeItemsRange(beginPosition-this._addedCount,endPosition-this._addedCount,didReceiveDeletedItems.bind(this,emptyRange));}},sortAndRewind:function(comparator,callback)
+{function afterSort()
+{this._deletedNodesProvider.sortAndRewind(comparator,callback);}
+this._addedNodesProvider.sortAndRewind(comparator,afterSort.bind(this));}};WebInspector.HeapSnapshotDiffNode=function(dataGrid,className,diffForClass)
+{WebInspector.HeapSnapshotGridNode.call(this,dataGrid,true);this._name=className;this._addedCount=diffForClass.addedCount;this._removedCount=diffForClass.removedCount;this._countDelta=diffForClass.countDelta;this._addedSize=diffForClass.addedSize;this._removedSize=diffForClass.removedSize;this._sizeDelta=diffForClass.sizeDelta;this._deletedIndexes=diffForClass.deletedIndexes;this.data={"object":className,"addedCount":Number.withThousandsSeparator(this._addedCount),"removedCount":Number.withThousandsSeparator(this._removedCount),"countDelta":this._signForDelta(this._countDelta)+Number.withThousandsSeparator(Math.abs(this._countDelta)),"addedSize":Number.withThousandsSeparator(this._addedSize),"removedSize":Number.withThousandsSeparator(this._removedSize),"sizeDelta":this._signForDelta(this._sizeDelta)+Number.withThousandsSeparator(Math.abs(this._sizeDelta))};}
+WebInspector.HeapSnapshotDiffNode.prototype={createProvider:function()
+{var tree=this._dataGrid;return new WebInspector.HeapSnapshotDiffNodesProvider(tree.snapshot.createAddedNodesProvider(tree.baseSnapshot.uid,this._name),tree.baseSnapshot.createDeletedNodesProvider(this._deletedIndexes),this._addedCount,this._removedCount);},_createChildNode:function(item)
+{if(item.isAddedNotRemoved)
+return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid,this._dataGrid.snapshot,item,false);else
+return new WebInspector.HeapSnapshotInstanceNode(this._dataGrid,this._dataGrid.baseSnapshot,item,true);},_childHashForEntity:function(node)
+{return node.id;},_childHashForNode:function(childNode)
+{return childNode.snapshotNodeId;},comparator:function()
+{var sortAscending=this._dataGrid.isSortOrderAscending();var sortColumnIdentifier=this._dataGrid.sortColumnIdentifier();var sortFields={object:["id",sortAscending,"selfSize",false],addedCount:["selfSize",sortAscending,"id",true],removedCount:["selfSize",sortAscending,"id",true],countDelta:["selfSize",sortAscending,"id",true],addedSize:["selfSize",sortAscending,"id",true],removedSize:["selfSize",sortAscending,"id",true],sizeDelta:["selfSize",sortAscending,"id",true]}[sortColumnIdentifier];return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);},filteredOut:function()
+{return this._name.toLowerCase().indexOf(this._dataGrid._nameFilter)===-1;},_signForDelta:function(delta)
+{if(delta===0)
+return"";if(delta>0)
+return"+";else
+return"\u2212";},__proto__:WebInspector.HeapSnapshotGridNode.prototype}
+WebInspector.HeapSnapshotDominatorObjectNode=function(dataGrid,node)
+{WebInspector.HeapSnapshotGenericObjectNode.call(this,dataGrid,node);this.updateHasChildren();};WebInspector.HeapSnapshotDominatorObjectNode.prototype={createProvider:function()
+{return this._dataGrid.snapshot.createNodesProviderForDominator(this.snapshotNodeIndex);},retrieveChildBySnapshotObjectId:function(snapshotObjectId,callback)
+{function didExpand()
+{this._provider().nodePosition(snapshotObjectId,didGetNodePosition.bind(this));}
+function didGetNodePosition(nodePosition)
+{if(nodePosition===-1){this.collapse();callback(null);}else
+this._populateChildren(nodePosition,null,didPopulateChildren.bind(this,nodePosition));}
+function didPopulateChildren(nodePosition)
+{var child=this.childForPosition(nodePosition);callback(child);}
+this.hasChildren=true;this.expandWithoutPopulate(didExpand.bind(this));},_createChildNode:function(item)
+{return new WebInspector.HeapSnapshotDominatorObjectNode(this._dataGrid,item);},_childHashForEntity:function(node)
+{return node.id;},_childHashForNode:function(childNode)
+{return childNode.snapshotNodeId;},comparator:function()
+{var sortAscending=this._dataGrid.isSortOrderAscending();var sortColumnIdentifier=this._dataGrid.sortColumnIdentifier();var sortFields={object:["id",sortAscending,"retainedSize",false],shallowSize:["selfSize",sortAscending,"id",true],retainedSize:["retainedSize",sortAscending,"id",true]}[sortColumnIdentifier];return WebInspector.HeapSnapshotGridNode.createComparator(sortFields);},__proto__:WebInspector.HeapSnapshotGenericObjectNode.prototype}
+WebInspector.AllocationGridNode=function(dataGrid,data)
+{WebInspector.DataGridNode.call(this,data,data.hasChildren);this._dataGrid=dataGrid;this._populated=false;}
+WebInspector.AllocationGridNode.prototype={populate:function()
+{if(this._populated)
+return;this._populated=true;this._dataGrid.snapshot.allocationNodeCallers(this.data.id,didReceiveCallers.bind(this));function didReceiveCallers(callers)
+{var callersChain=callers.nodesWithSingleCaller;var parentNode=this;for(var i=0;i<callersChain.length;i++){var child=new WebInspector.AllocationGridNode(this._dataGrid,callersChain[i]);parentNode.appendChild(child);parentNode=child;parentNode._populated=true;if(this.expanded)
+parentNode.expand();}
+var callersBranch=callers.branchingCallers;callersBranch.sort(this._dataGrid._createComparator());for(var i=0;i<callersBranch.length;i++)
+parentNode.appendChild(new WebInspector.AllocationGridNode(this._dataGrid,callersBranch[i]));}},expand:function()
+{WebInspector.DataGridNode.prototype.expand.call(this);if(this.children.length===1)
+this.children[0].expand();},createCell:function(columnIdentifier)
+{var cell=WebInspector.DataGridNode.prototype.createCell.call(this,columnIdentifier);if(columnIdentifier!=="name")
+return cell;var functionInfo=this.data;if(functionInfo.scriptName){var urlElement=this._dataGrid._linkifier.linkifyLocation(functionInfo.scriptName,functionInfo.line-1,functionInfo.column-1,"profile-node-file");urlElement.style.maxWidth="75%";cell.insertBefore(urlElement,cell.firstChild);}
+return cell;},allocationNodeId:function()
+{return this.data.id;},__proto__:WebInspector.DataGridNode.prototype};WebInspector.HeapSnapshotView=function(profile)
+{WebInspector.VBox.call(this);this.element.classList.add("heap-snapshot-view");profile.profileType().addEventListener(WebInspector.HeapSnapshotProfileType.SnapshotReceived,this._onReceiveSnapshot,this);profile.profileType().addEventListener(WebInspector.ProfileType.Events.RemoveProfileHeader,this._onProfileHeaderRemoved,this);if(profile._profileType.id===WebInspector.TrackingHeapSnapshotProfileType.TypeId){this._trackingOverviewGrid=new WebInspector.HeapTrackingOverviewGrid(profile);this._trackingOverviewGrid.addEventListener(WebInspector.HeapTrackingOverviewGrid.IdsRangeChanged,this._onIdsRangeChanged.bind(this));}
+this._splitView=new WebInspector.SplitView(false,true,"heapSnapshotSplitViewState",200,200);this._splitView.show(this.element);this._containmentView=new WebInspector.VBox();this._containmentView.setMinimumSize(50,25);this._containmentDataGrid=new WebInspector.HeapSnapshotContainmentDataGrid();this._containmentDataGrid.show(this._containmentView.element);this._containmentDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,this._selectionChanged,this);this._statisticsView=new WebInspector.HeapSnapshotStatisticsView();this._constructorsView=new WebInspector.VBox();this._constructorsView.setMinimumSize(50,25);this._constructorsDataGrid=new WebInspector.HeapSnapshotConstructorsDataGrid();this._constructorsDataGrid.show(this._constructorsView.element);this._constructorsDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,this._selectionChanged,this);this._diffView=new WebInspector.VBox();this._diffView.setMinimumSize(50,25);this._diffDataGrid=new WebInspector.HeapSnapshotDiffDataGrid();this._diffDataGrid.show(this._diffView.element);this._diffDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,this._selectionChanged,this);this._dominatorView=new WebInspector.VBox();this._dominatorView.setMinimumSize(50,25);this._dominatorDataGrid=new WebInspector.HeapSnapshotDominatorsDataGrid();this._dominatorDataGrid.show(this._dominatorView.element);this._dominatorDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,this._selectionChanged,this);if(WebInspector.experimentsSettings.allocationProfiler.isEnabled()&&profile.profileType()===WebInspector.ProfileTypeRegistry.instance.trackingHeapSnapshotProfileType){this._allocationView=new WebInspector.VBox();this._allocationView.setMinimumSize(50,25);this._allocationDataGrid=new WebInspector.AllocationDataGrid();this._allocationDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,this._onSelectAllocationNode,this);this._allocationDataGrid.show(this._allocationView.element);}
+this._retainmentViewHeader=document.createElementWithClass("div","retainers-view-header");var retainingPathsTitleDiv=this._retainmentViewHeader.createChild("div","title");var retainingPathsTitle=retainingPathsTitleDiv.createChild("span");retainingPathsTitle.textContent=WebInspector.UIString("Object's retaining tree");this._splitView.hideDefaultResizer();this._splitView.installResizer(this._retainmentViewHeader);this._retainmentView=new WebInspector.VBox();this._retainmentView.setMinimumSize(50,21);this._retainmentView.element.classList.add("retaining-paths-view");this._retainmentView.element.appendChild(this._retainmentViewHeader);this._retainmentDataGrid=new WebInspector.HeapSnapshotRetainmentDataGrid();this._retainmentDataGrid.show(this._retainmentView.element);this._retainmentDataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,this._inspectedObjectChanged,this);this._retainmentDataGrid.reset();this._perspectives=[];this._perspectives.push(new WebInspector.HeapSnapshotView.SummaryPerspective());if(profile.profileType()!==WebInspector.ProfileTypeRegistry.instance.trackingHeapSnapshotProfileType)
+this._perspectives.push(new WebInspector.HeapSnapshotView.ComparisonPerspective());this._perspectives.push(new WebInspector.HeapSnapshotView.ContainmentPerspective());if(WebInspector.settings.showAdvancedHeapSnapshotProperties.get())
+this._perspectives.push(new WebInspector.HeapSnapshotView.DominatorPerspective());if(this._allocationView)
+this._perspectives.push(new WebInspector.HeapSnapshotView.AllocationPerspective());if(WebInspector.experimentsSettings.heapSnapshotStatistics.isEnabled())
+this._perspectives.push(new WebInspector.HeapSnapshotView.StatisticsPerspective());this._perspectiveSelect=new WebInspector.StatusBarComboBox(this._onSelectedPerspectiveChanged.bind(this));for(var i=0;i<this._perspectives.length;++i)
+this._perspectiveSelect.createOption(this._perspectives[i].title());this._profile=profile;this._baseSelect=new WebInspector.StatusBarComboBox(this._changeBase.bind(this));this._baseSelect.visible=false;this._updateBaseOptions();this._filterSelect=new WebInspector.StatusBarComboBox(this._changeFilter.bind(this));this._filterSelect.visible=false;this._updateFilterOptions();this._classNameFilter=new WebInspector.StatusBarInput("Class filter");this._classNameFilter.visible=false;this._classNameFilter.setOnChangeHandler(this._onClassFilterChanged.bind(this));this._selectedSizeText=new WebInspector.StatusBarText("");this._popoverHelper=new WebInspector.ObjectPopoverHelper(this.element,this._getHoverAnchor.bind(this),this._resolveObjectForPopover.bind(this),undefined,true);this._currentPerspectiveIndex=0;this._currentPerspective=this._perspectives[0];this._currentPerspective.activate(this);this._dataGrid=this._currentPerspective.masterGrid(this);this._dataGrid.addEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.ResetFilter,this._onResetClassNameFilter,this);this._refreshView();}
+WebInspector.HeapSnapshotView.Perspective=function(title)
+{this._title=title;}
+WebInspector.HeapSnapshotView.Perspective.prototype={activate:function(heapSnapshotView){},deactivate:function(heapSnapshotView)
+{heapSnapshotView._baseSelect.visible=false;heapSnapshotView._filterSelect.visible=false;heapSnapshotView._classNameFilter.visible=false;if(heapSnapshotView._trackingOverviewGrid)
+heapSnapshotView._trackingOverviewGrid.detach();if(heapSnapshotView._allocationView)
+heapSnapshotView._allocationView.detach();if(heapSnapshotView._statisticsView)
+heapSnapshotView._statisticsView.detach();heapSnapshotView._splitView.detach();heapSnapshotView._splitView.detachChildViews();},masterGrid:function(heapSnapshotView)
+{return null;},title:function()
+{return this._title;},supportsSearch:function()
+{return false;}}
+WebInspector.HeapSnapshotView.SummaryPerspective=function()
+{WebInspector.HeapSnapshotView.Perspective.call(this,WebInspector.UIString("Summary"));}
+WebInspector.HeapSnapshotView.SummaryPerspective.prototype={activate:function(heapSnapshotView)
+{heapSnapshotView._constructorsView.show(heapSnapshotView._splitView.mainElement());heapSnapshotView._retainmentView.show(heapSnapshotView._splitView.sidebarElement());heapSnapshotView._splitView.show(heapSnapshotView.element);heapSnapshotView._filterSelect.visible=true;heapSnapshotView._classNameFilter.visible=true;if(heapSnapshotView._trackingOverviewGrid){heapSnapshotView._trackingOverviewGrid.show(heapSnapshotView.element,heapSnapshotView._splitView.element);heapSnapshotView._trackingOverviewGrid.update();heapSnapshotView._trackingOverviewGrid._updateGrid();}},masterGrid:function(heapSnapshotView)
+{return heapSnapshotView._constructorsDataGrid;},supportsSearch:function()
+{return true;},__proto__:WebInspector.HeapSnapshotView.Perspective.prototype}
+WebInspector.HeapSnapshotView.ComparisonPerspective=function()
+{WebInspector.HeapSnapshotView.Perspective.call(this,WebInspector.UIString("Comparison"));}
+WebInspector.HeapSnapshotView.ComparisonPerspective.prototype={activate:function(heapSnapshotView)
+{heapSnapshotView._diffView.show(heapSnapshotView._splitView.mainElement());heapSnapshotView._retainmentView.show(heapSnapshotView._splitView.sidebarElement());heapSnapshotView._splitView.show(heapSnapshotView.element);heapSnapshotView._baseSelect.visible=true;heapSnapshotView._classNameFilter.visible=true;},masterGrid:function(heapSnapshotView)
+{return heapSnapshotView._diffDataGrid;},supportsSearch:function()
+{return true;},__proto__:WebInspector.HeapSnapshotView.Perspective.prototype}
+WebInspector.HeapSnapshotView.ContainmentPerspective=function()
+{WebInspector.HeapSnapshotView.Perspective.call(this,WebInspector.UIString("Containment"));}
+WebInspector.HeapSnapshotView.ContainmentPerspective.prototype={activate:function(heapSnapshotView)
+{heapSnapshotView._containmentView.show(heapSnapshotView._splitView.mainElement());heapSnapshotView._retainmentView.show(heapSnapshotView._splitView.sidebarElement());heapSnapshotView._splitView.show(heapSnapshotView.element);},masterGrid:function(heapSnapshotView)
+{return heapSnapshotView._containmentDataGrid;},__proto__:WebInspector.HeapSnapshotView.Perspective.prototype}
+WebInspector.HeapSnapshotView.DominatorPerspective=function()
+{WebInspector.HeapSnapshotView.Perspective.call(this,WebInspector.UIString("Dominators"));}
+WebInspector.HeapSnapshotView.DominatorPerspective.prototype={activate:function(heapSnapshotView)
+{heapSnapshotView._dominatorView.show(heapSnapshotView._splitView.mainElement());heapSnapshotView._retainmentView.show(heapSnapshotView._splitView.sidebarElement());heapSnapshotView._splitView.show(heapSnapshotView.element);},masterGrid:function(heapSnapshotView)
+{return heapSnapshotView._dominatorDataGrid;},__proto__:WebInspector.HeapSnapshotView.Perspective.prototype}
+WebInspector.HeapSnapshotView.AllocationPerspective=function()
+{WebInspector.HeapSnapshotView.Perspective.call(this,WebInspector.UIString("Allocation"));this._allocationSplitView=new WebInspector.SplitView(false,true,"heapSnapshotAllocationSplitViewState",200,200);}
+WebInspector.HeapSnapshotView.AllocationPerspective.prototype={activate:function(heapSnapshotView)
+{heapSnapshotView._allocationView.show(this._allocationSplitView.mainElement());heapSnapshotView._constructorsView.show(heapSnapshotView._splitView.mainElement());heapSnapshotView._retainmentView.show(heapSnapshotView._splitView.sidebarElement());heapSnapshotView._splitView.show(this._allocationSplitView.sidebarElement());this._allocationSplitView.show(heapSnapshotView.element);heapSnapshotView._constructorsDataGrid.clear();var selectedNode=heapSnapshotView._allocationDataGrid.selectedNode;if(selectedNode)
+heapSnapshotView._constructorsDataGrid.setAllocationNodeId(selectedNode.allocationNodeId());},deactivate:function(heapSnapshotView)
+{this._allocationSplitView.detach();WebInspector.HeapSnapshotView.Perspective.prototype.deactivate.call(this,heapSnapshotView);},masterGrid:function(heapSnapshotView)
+{return heapSnapshotView._allocationDataGrid;},__proto__:WebInspector.HeapSnapshotView.Perspective.prototype}
+WebInspector.HeapSnapshotView.StatisticsPerspective=function()
+{WebInspector.HeapSnapshotView.Perspective.call(this,WebInspector.UIString("Statistics"));}
+WebInspector.HeapSnapshotView.StatisticsPerspective.prototype={activate:function(heapSnapshotView)
+{heapSnapshotView._statisticsView.show(heapSnapshotView.element);},masterGrid:function(heapSnapshotView)
+{return null;},__proto__:WebInspector.HeapSnapshotView.Perspective.prototype}
+WebInspector.HeapSnapshotView.prototype={_refreshView:function()
+{this._profile.load(profileCallback.bind(this));function profileCallback(heapSnapshotProxy)
+{heapSnapshotProxy.getStatistics(this._gotStatistics.bind(this));var list=this._profiles();var profileIndex=list.indexOf(this._profile);this._baseSelect.setSelectedIndex(Math.max(0,profileIndex-1));this._dataGrid.setDataSource(heapSnapshotProxy);if(this._trackingOverviewGrid)
+this._trackingOverviewGrid._updateGrid();}},_gotStatistics:function(statistics){this._statisticsView.setTotal(statistics.total);this._statisticsView.addRecord(statistics.code,WebInspector.UIString("Code"),"#f77");this._statisticsView.addRecord(statistics.strings,WebInspector.UIString("Strings"),"#5e5");this._statisticsView.addRecord(statistics.jsArrays,WebInspector.UIString("JS Arrays"),"#7af");this._statisticsView.addRecord(statistics.native,WebInspector.UIString("Typed Arrays"),"#fc5");this._statisticsView.addRecord(statistics.total,WebInspector.UIString("Total"));},_onIdsRangeChanged:function(event)
+{var minId=event.data.minId;var maxId=event.data.maxId;this._selectedSizeText.setText(WebInspector.UIString("Selected size: %s",Number.bytesToString(event.data.size)));if(this._constructorsDataGrid.snapshot)
+this._constructorsDataGrid.setSelectionRange(minId,maxId);},get statusBarItems()
+{var result=[this._perspectiveSelect.element,this._classNameFilter.element];if(this._profile.profileType()!==WebInspector.ProfileTypeRegistry.instance.trackingHeapSnapshotProfileType)
+result.push(this._baseSelect.element,this._filterSelect.element);result.push(this._selectedSizeText.element);return result;},wasShown:function()
+{this._profile.load(profileCallback.bind(this));function profileCallback(){this._profile._wasShown();if(this._baseProfile)
+this._baseProfile.load(function(){});}},willHide:function()
+{this._currentSearchResultIndex=-1;this._popoverHelper.hidePopover();if(this.helpPopover&&this.helpPopover.isShowing())
+this.helpPopover.hide();},searchCanceled:function()
+{if(this._searchResults){for(var i=0;i<this._searchResults.length;++i){var node=this._searchResults[i].node;delete node._searchMatched;node.refresh();}}
+delete this._searchFinishedCallback;this._currentSearchResultIndex=-1;this._searchResults=[];},performSearch:function(query,finishedCallback)
+{this.searchCanceled();query=query.trim();if(!query)
+return;if(!this._currentPerspective.supportsSearch())
+return;function didHighlight(found)
+{finishedCallback(this,found?1:0);}
+if(query.charAt(0)==="@"){var snapshotNodeId=parseInt(query.substring(1),10);if(!isNaN(snapshotNodeId))
+this._dataGrid.highlightObjectByHeapSnapshotId(String(snapshotNodeId),didHighlight.bind(this));else
+finishedCallback(this,0);return;}
+this._searchFinishedCallback=finishedCallback;var nameRegExp=createPlainTextSearchRegex(query,"i");function matchesByName(gridNode){return("_name"in gridNode)&&nameRegExp.test(gridNode._name);}
+function matchesQuery(gridNode)
+{delete gridNode._searchMatched;if(matchesByName(gridNode)){gridNode._searchMatched=true;gridNode.refresh();return true;}
+return false;}
+var current=this._dataGrid.rootNode().children[0];var depth=0;var info={};const maxDepth=1;while(current){if(matchesQuery(current))
+this._searchResults.push({node:current});current=current.traverseNextNode(false,null,(depth>=maxDepth),info);depth+=info.depthChange;}
+finishedCallback(this,this._searchResults.length);},jumpToFirstSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;this._currentSearchResultIndex=0;this._jumpToSearchResult(this._currentSearchResultIndex);},jumpToLastSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;this._currentSearchResultIndex=(this._searchResults.length-1);this._jumpToSearchResult(this._currentSearchResultIndex);},jumpToNextSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;if(++this._currentSearchResultIndex>=this._searchResults.length)
+this._currentSearchResultIndex=0;this._jumpToSearchResult(this._currentSearchResultIndex);},jumpToPreviousSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;if(--this._currentSearchResultIndex<0)
+this._currentSearchResultIndex=(this._searchResults.length-1);this._jumpToSearchResult(this._currentSearchResultIndex);},showingFirstSearchResult:function()
+{return(this._currentSearchResultIndex===0);},showingLastSearchResult:function()
+{return(this._searchResults&&this._currentSearchResultIndex===(this._searchResults.length-1));},currentSearchResultIndex:function(){return this._currentSearchResultIndex;},_jumpToSearchResult:function(index)
+{var searchResult=this._searchResults[index];if(!searchResult)
+return;var node=searchResult.node;node.revealAndSelect();},refreshVisibleData:function()
+{if(!this._dataGrid)
+return;var child=this._dataGrid.rootNode().children[0];while(child){child.refresh();child=child.traverseNextNode(false,null,true);}},_changeBase:function()
+{if(this._baseProfile===this._profiles()[this._baseSelect.selectedIndex()])
+return;this._baseProfile=this._profiles()[this._baseSelect.selectedIndex()];var dataGrid=(this._dataGrid);if(dataGrid.snapshot)
+this._baseProfile.load(dataGrid.setBaseDataSource.bind(dataGrid));if(!this.currentQuery||!this._searchFinishedCallback||!this._searchResults)
+return;this._searchFinishedCallback(this,-this._searchResults.length);this.performSearch(this.currentQuery,this._searchFinishedCallback);},_changeFilter:function()
+{var profileIndex=this._filterSelect.selectedIndex()-1;this._dataGrid.filterSelectIndexChanged(this._profiles(),profileIndex);WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.HeapSnapshotFilterChanged,label:this._filterSelect.selectedOption().label});if(!this.currentQuery||!this._searchFinishedCallback||!this._searchResults)
+return;this._searchFinishedCallback(this,-this._searchResults.length);this.performSearch(this.currentQuery,this._searchFinishedCallback);},_onClassFilterChanged:function(value)
+{this._dataGrid.changeNameFilter(value);},_onResetClassNameFilter:function()
+{this._classNameFilter.setValue("");},_profiles:function()
+{return this._profile.profileType().getProfiles();},populateContextMenu:function(contextMenu,event)
+{if(this._dataGrid)
+this._dataGrid.populateContextMenu(contextMenu,event);},_selectionChanged:function(event)
+{var selectedNode=event.target.selectedNode;this._setRetainmentDataGridSource(selectedNode);this._inspectedObjectChanged(event);},_onSelectAllocationNode:function(event)
+{var selectedNode=event.target.selectedNode;this._constructorsDataGrid.setAllocationNodeId(selectedNode.allocationNodeId());},_inspectedObjectChanged:function(event)
+{var selectedNode=event.target.selectedNode;if(!this._profile.fromFile()&&selectedNode instanceof WebInspector.HeapSnapshotGenericObjectNode)
+ConsoleAgent.addInspectedHeapObject(selectedNode.snapshotNodeId);},_setRetainmentDataGridSource:function(nodeItem)
+{var dataSource=nodeItem&&nodeItem.retainersDataSource();if(dataSource)
+this._retainmentDataGrid.setDataSource(dataSource.snapshot,dataSource.snapshotNodeIndex);else
+this._retainmentDataGrid.reset();},_changePerspectiveAndWait:function(perspectiveTitle,callback)
+{var perspectiveIndex=null;for(var i=0;i<this._perspectives.length;++i){if(this._perspectives[i].title()===perspectiveTitle){perspectiveIndex=i;break;}}
+if(this._currentPerspectiveIndex===perspectiveIndex||perspectiveIndex===null){setTimeout(callback,0);return;}
+function dataGridContentShown(event)
+{var dataGrid=event.data;dataGrid.removeEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.ContentShown,dataGridContentShown,this);if(dataGrid===this._dataGrid)
+callback();}
+this._perspectives[perspectiveIndex].masterGrid(this).addEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.ContentShown,dataGridContentShown,this);this._perspectiveSelect.setSelectedIndex(perspectiveIndex);this._changePerspective(perspectiveIndex);},_updateDataSourceAndView:function()
+{var dataGrid=this._dataGrid;if(!dataGrid||dataGrid.snapshot)
+return;this._profile.load(didLoadSnapshot.bind(this));function didLoadSnapshot(snapshotProxy)
+{if(this._dataGrid!==dataGrid)
+return;if(dataGrid.snapshot!==snapshotProxy)
+dataGrid.setDataSource(snapshotProxy);if(dataGrid===this._diffDataGrid){if(!this._baseProfile)
+this._baseProfile=this._profiles()[this._baseSelect.selectedIndex()];this._baseProfile.load(didLoadBaseSnaphot.bind(this));}}
+function didLoadBaseSnaphot(baseSnapshotProxy)
+{if(this._diffDataGrid.baseSnapshot!==baseSnapshotProxy)
+this._diffDataGrid.setBaseDataSource(baseSnapshotProxy);}},_onSelectedPerspectiveChanged:function(event)
+{this._changePerspective(event.target.selectedIndex);this._onSelectedViewChanged(event);},_onSelectedViewChanged:function(event)
+{},_changePerspective:function(selectedIndex)
+{if(selectedIndex===this._currentPerspectiveIndex)
+return;if(this._dataGrid)
+this._dataGrid.removeEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.ResetFilter,this._onResetClassNameFilter,this);this._currentPerspectiveIndex=selectedIndex;this._currentPerspective.deactivate(this);var perspective=this._perspectives[selectedIndex];this._currentPerspective=perspective;this._dataGrid=perspective.masterGrid(this);perspective.activate(this);this.refreshVisibleData();if(this._dataGrid){this._dataGrid.addEventListener(WebInspector.HeapSnapshotSortableDataGrid.Events.ResetFilter,this._onResetClassNameFilter,this);this._dataGrid.updateWidths();}
+this._updateDataSourceAndView();if(!this.currentQuery||!this._searchFinishedCallback||!this._searchResults)
+return;this._searchFinishedCallback(this,-this._searchResults.length);this.performSearch(this.currentQuery,this._searchFinishedCallback);},highlightLiveObject:function(perspectiveName,snapshotObjectId)
+{this._changePerspectiveAndWait(perspectiveName,didChangePerspective.bind(this));function didChangePerspective()
+{this._dataGrid.highlightObjectByHeapSnapshotId(snapshotObjectId,didHighlightObject);}
+function didHighlightObject(found)
+{if(!found)
+WebInspector.console.log("Cannot find corresponding heap snapshot node",WebInspector.ConsoleMessage.MessageLevel.Error,true);}},_getHoverAnchor:function(target)
+{var span=target.enclosingNodeOrSelfWithNodeName("span");if(!span)
+return;var row=target.enclosingNodeOrSelfWithNodeName("tr");if(!row)
+return;span.node=row._dataGridNode;return span;},_resolveObjectForPopover:function(element,showCallback,objectGroupName)
+{if(this._profile.fromFile())
+return;element.node.queryObjectContent(showCallback,objectGroupName);},_updateBaseOptions:function()
+{var list=this._profiles();if(this._baseSelect.size()===list.length)
+return;for(var i=this._baseSelect.size(),n=list.length;i<n;++i){var title=list[i].title;this._baseSelect.createOption(title);}},_updateFilterOptions:function()
+{var list=this._profiles();if(this._filterSelect.size()-1===list.length)
+return;if(!this._filterSelect.size())
+this._filterSelect.createOption(WebInspector.UIString("All objects"));for(var i=this._filterSelect.size()-1,n=list.length;i<n;++i){var title=list[i].title;if(!i)
+title=WebInspector.UIString("Objects allocated before %s",title);else
+title=WebInspector.UIString("Objects allocated between %s and %s",list[i-1].title,title);this._filterSelect.createOption(title);}},_updateControls:function()
+{this._updateBaseOptions();this._updateFilterOptions();},_onReceiveSnapshot:function(event)
+{this._updateControls();},_onProfileHeaderRemoved:function(event)
+{var profile=event.data;if(this._profile===profile){this.detach();this._profile.profileType().removeEventListener(WebInspector.HeapSnapshotProfileType.SnapshotReceived,this._onReceiveSnapshot,this);this._profile.profileType().removeEventListener(WebInspector.ProfileType.Events.RemoveProfileHeader,this._onProfileHeaderRemoved,this);}else{this._updateControls();}},__proto__:WebInspector.VBox.prototype}
+WebInspector.HeapProfilerDispatcher=function()
+{this._dispatchers=[];InspectorBackend.registerHeapProfilerDispatcher(this);}
+WebInspector.HeapProfilerDispatcher.prototype={register:function(dispatcher)
+{this._dispatchers.push(dispatcher);},_genericCaller:function(eventName)
+{var args=Array.prototype.slice.call(arguments.callee.caller.arguments);for(var i=0;i<this._dispatchers.length;++i)
+this._dispatchers[i][eventName].apply(this._dispatchers[i],args);},heapStatsUpdate:function(samples)
+{this._genericCaller("heapStatsUpdate");},lastSeenObjectId:function(lastSeenObjectId,timestamp)
+{this._genericCaller("lastSeenObjectId");},addHeapSnapshotChunk:function(chunk)
+{this._genericCaller("addHeapSnapshotChunk");},reportHeapSnapshotProgress:function(done,total,finished)
+{this._genericCaller("reportHeapSnapshotProgress");},resetProfiles:function()
+{this._genericCaller("resetProfiles");}}
+WebInspector.HeapProfilerDispatcher._dispatcher=new WebInspector.HeapProfilerDispatcher();WebInspector.HeapSnapshotProfileType=function(id,title)
+{WebInspector.ProfileType.call(this,id||WebInspector.HeapSnapshotProfileType.TypeId,title||WebInspector.UIString("Take Heap Snapshot"));WebInspector.HeapProfilerDispatcher._dispatcher.register(this);}
+WebInspector.HeapSnapshotProfileType.TypeId="HEAP";WebInspector.HeapSnapshotProfileType.SnapshotReceived="SnapshotReceived";WebInspector.HeapSnapshotProfileType.prototype={fileExtension:function()
+{return".heapsnapshot";},get buttonTooltip()
+{return WebInspector.UIString("Take heap snapshot.");},isInstantProfile:function()
+{return true;},buttonClicked:function()
+{this._takeHeapSnapshot(function(){});WebInspector.userMetrics.ProfilesHeapProfileTaken.record();return false;},heapStatsUpdate:function(samples)
+{},lastSeenObjectId:function(lastSeenObjectId,timestamp)
+{},get treeItemTitle()
+{return WebInspector.UIString("HEAP SNAPSHOTS");},get description()
+{return WebInspector.UIString("Heap snapshot profiles show memory distribution among your page's JavaScript objects and related DOM nodes.");},createProfileLoadedFromFile:function(title)
+{return new WebInspector.HeapProfileHeader(this,title);},_takeHeapSnapshot:function(callback)
+{if(this.profileBeingRecorded())
+return;this._profileBeingRecorded=new WebInspector.HeapProfileHeader(this);this.addProfile(this._profileBeingRecorded);this._profileBeingRecorded.updateStatus(WebInspector.UIString("Snapshotting\u2026"));function didTakeHeapSnapshot(error)
+{var profile=this._profileBeingRecorded;profile.title=WebInspector.UIString("Snapshot %d",profile.uid);profile._finishLoad();this._profileBeingRecorded=null;WebInspector.panels.profiles.showProfile(profile);callback();}
+HeapProfilerAgent.takeHeapSnapshot(true,didTakeHeapSnapshot.bind(this));},addHeapSnapshotChunk:function(chunk)
+{if(!this.profileBeingRecorded())
+return;this.profileBeingRecorded().transferChunk(chunk);},reportHeapSnapshotProgress:function(done,total,finished)
+{var profile=this.profileBeingRecorded();if(!profile)
+return;profile.updateStatus(WebInspector.UIString("%.0f%",(done/total)*100),true);if(finished)
+profile._prepareToLoad();},resetProfiles:function()
+{this._reset();},_snapshotReceived:function(profile)
+{if(this._profileBeingRecorded===profile)
+this._profileBeingRecorded=null;this.dispatchEventToListeners(WebInspector.HeapSnapshotProfileType.SnapshotReceived,profile);},__proto__:WebInspector.ProfileType.prototype}
+WebInspector.TrackingHeapSnapshotProfileType=function()
+{WebInspector.HeapSnapshotProfileType.call(this,WebInspector.TrackingHeapSnapshotProfileType.TypeId,WebInspector.UIString("Record Heap Allocations"));}
+WebInspector.TrackingHeapSnapshotProfileType.TypeId="HEAP-RECORD";WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate="HeapStatsUpdate";WebInspector.TrackingHeapSnapshotProfileType.TrackingStarted="TrackingStarted";WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped="TrackingStopped";WebInspector.TrackingHeapSnapshotProfileType.prototype={heapStatsUpdate:function(samples)
+{if(!this._profileSamples)
+return;var index;for(var i=0;i<samples.length;i+=3){index=samples[i];var count=samples[i+1];var size=samples[i+2];this._profileSamples.sizes[index]=size;if(!this._profileSamples.max[index])
+this._profileSamples.max[index]=size;}},lastSeenObjectId:function(lastSeenObjectId,timestamp)
+{var profileSamples=this._profileSamples;if(!profileSamples)
+return;var currentIndex=Math.max(profileSamples.ids.length,profileSamples.max.length-1);profileSamples.ids[currentIndex]=lastSeenObjectId;if(!profileSamples.max[currentIndex]){profileSamples.max[currentIndex]=0;profileSamples.sizes[currentIndex]=0;}
+profileSamples.timestamps[currentIndex]=timestamp;if(profileSamples.totalTime<timestamp-profileSamples.timestamps[0])
+profileSamples.totalTime*=2;this.dispatchEventToListeners(WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate,this._profileSamples);this._profileBeingRecorded.updateStatus(null,true);},hasTemporaryView:function()
+{return true;},get buttonTooltip()
+{return this._recording?WebInspector.UIString("Stop recording heap profile."):WebInspector.UIString("Start recording heap profile.");},isInstantProfile:function()
+{return false;},buttonClicked:function()
+{return this._toggleRecording();},_startRecordingProfile:function()
+{if(this.profileBeingRecorded())
+return;this._addNewProfile();HeapProfilerAgent.startTrackingHeapObjects(WebInspector.experimentsSettings.allocationProfiler.isEnabled());},_addNewProfile:function()
+{this._profileBeingRecorded=new WebInspector.HeapProfileHeader(this);this._lastSeenIndex=-1;this._profileSamples={'sizes':[],'ids':[],'timestamps':[],'max':[],'totalTime':30000};this._profileBeingRecorded._profileSamples=this._profileSamples;this._recording=true;this.addProfile(this._profileBeingRecorded);this._profileBeingRecorded.updateStatus(WebInspector.UIString("Recording\u2026"));this.dispatchEventToListeners(WebInspector.TrackingHeapSnapshotProfileType.TrackingStarted);},_stopRecordingProfile:function()
+{this._profileBeingRecorded.updateStatus(WebInspector.UIString("Snapshotting\u2026"));function didTakeHeapSnapshot(error)
+{var profile=this._profileBeingRecorded;if(!profile)
+return;profile._finishLoad();this._profileSamples=null;this._profileBeingRecorded=null;WebInspector.panels.profiles.showProfile(profile);}
+HeapProfilerAgent.stopTrackingHeapObjects(true,didTakeHeapSnapshot.bind(this));this._recording=false;this.dispatchEventToListeners(WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped);},_toggleRecording:function()
+{if(this._recording)
+this._stopRecordingProfile();else
+this._startRecordingProfile();return this._recording;},get treeItemTitle()
+{return WebInspector.UIString("HEAP TIMELINES");},get description()
+{return WebInspector.UIString("Record JavaScript object allocations over time. Use this profile type to isolate memory leaks.");},resetProfiles:function()
+{var wasRecording=this._recording;this._profileBeingRecorded=null;WebInspector.HeapSnapshotProfileType.prototype.resetProfiles.call(this);this._profileSamples=null;this._lastSeenIndex=-1;if(wasRecording)
+this._addNewProfile();},profileBeingRecordedRemoved:function()
+{this._stopRecordingProfile();this._profileSamples=null;},__proto__:WebInspector.HeapSnapshotProfileType.prototype}
+WebInspector.HeapProfileHeader=function(type,title)
+{WebInspector.ProfileHeader.call(this,type,title||WebInspector.UIString("Snapshot %d",type._nextProfileUid));this.maxJSObjectId=-1;this._workerProxy=null;this._receiver=null;this._snapshotProxy=null;this._loadCallbacks=[];this._totalNumberOfChunks=0;this._bufferedWriter=null;}
+WebInspector.HeapProfileHeader.prototype={createSidebarTreeElement:function()
+{return new WebInspector.ProfileSidebarTreeElement(this,"heap-snapshot-sidebar-tree-item");},createView:function()
+{return new WebInspector.HeapSnapshotView(this);},load:function(callback)
+{if(this.uid===-1)
+return;if(this._snapshotProxy){callback(this._snapshotProxy);return;}
+this._loadCallbacks.push(callback);},_prepareToLoad:function()
+{console.assert(!this._receiver,"Already loading");this._setupWorker();this.updateStatus(WebInspector.UIString("Loading\u2026"),true);},_finishLoad:function()
+{if(!this._wasDisposed)
+this._receiver.close(function(){});if(this._bufferedWriter){this._bufferedWriter.close(this._didWriteToTempFile.bind(this));this._bufferedWriter=null;}},_didWriteToTempFile:function(tempFile)
+{if(this._wasDisposed){if(tempFile)
+tempFile.remove();return;}
+this._tempFile=tempFile;if(!tempFile)
+this._failedToCreateTempFile=true;if(this._onTempFileReady){this._onTempFileReady();this._onTempFileReady=null;}},_setupWorker:function()
+{function setProfileWait(event)
+{this.updateStatus(null,event.data);}
+console.assert(!this._workerProxy,"HeapSnapshotWorkerProxy already exists");this._workerProxy=new WebInspector.HeapSnapshotWorkerProxy(this._handleWorkerEvent.bind(this));this._workerProxy.addEventListener("wait",setProfileWait,this);this._receiver=this._workerProxy.createLoader(this.uid,this._snapshotReceived.bind(this));},_handleWorkerEvent:function(eventName,data)
+{if(WebInspector.HeapSnapshotProgressEvent.Update!==eventName)
+return;var subtitle=(data);this.updateStatus(subtitle);},dispose:function()
+{if(this._workerProxy)
+this._workerProxy.dispose();this.removeTempFile();this._wasDisposed=true;},_didCompleteSnapshotTransfer:function()
+{if(!this._snapshotProxy)
+return;this.updateStatus(Number.bytesToString(this._snapshotProxy.totalSize),false);},transferChunk:function(chunk)
+{if(!this._bufferedWriter)
+this._bufferedWriter=new WebInspector.BufferedTempFileWriter("heap-profiler",this.uid);this._bufferedWriter.write(chunk);++this._totalNumberOfChunks;this._receiver.write(chunk,function(){});},_snapshotReceived:function(snapshotProxy)
+{if(this._wasDisposed)
+return;this._receiver=null;this._snapshotProxy=snapshotProxy;this.maxJSObjectId=snapshotProxy.maxJSObjectId();this._didCompleteSnapshotTransfer();this._workerProxy.startCheckingForLongRunningCalls();this.notifySnapshotReceived();},notifySnapshotReceived:function()
+{for(var i=0;i<this._loadCallbacks.length;i++)
+this._loadCallbacks[i](this._snapshotProxy);this._loadCallbacks=null;this._profileType._snapshotReceived(this);if(this.canSaveToFile())
+this.dispatchEventToListeners(WebInspector.ProfileHeader.Events.ProfileReceived);},_wasShown:function()
+{},canSaveToFile:function()
+{return!this.fromFile()&&this._snapshotProxy;},saveToFile:function()
+{var fileOutputStream=new WebInspector.FileOutputStream();function onOpen(accepted)
+{if(!accepted)
+return;if(this._failedToCreateTempFile){WebInspector.console.log("Failed to open temp file with heap snapshot",WebInspector.ConsoleMessage.MessageLevel.Error);fileOutputStream.close();}else if(this._tempFile){var delegate=new WebInspector.SaveSnapshotOutputStreamDelegate(this);this._tempFile.writeToOutputSteam(fileOutputStream,delegate);}else{this._onTempFileReady=onOpen.bind(this,accepted);this._updateSaveProgress(0,1);}}
+this._fileName=this._fileName||"Heap-"+new Date().toISO8601Compact()+this._profileType.fileExtension();fileOutputStream.open(this._fileName,onOpen.bind(this));},_updateSaveProgress:function(value,total)
+{var percentValue=((total?(value/total):0)*100).toFixed(0);this.updateStatus(WebInspector.UIString("Saving\u2026 %d\%",percentValue));},loadFromFile:function(file)
+{this.updateStatus(WebInspector.UIString("Loading\u2026"),true);this._setupWorker();var delegate=new WebInspector.HeapSnapshotLoadFromFileDelegate(this);var fileReader=this._createFileReader(file,delegate);fileReader.start(this._receiver);},_createFileReader:function(file,delegate)
+{return new WebInspector.ChunkedFileReader(file,10000000,delegate);},__proto__:WebInspector.ProfileHeader.prototype}
+WebInspector.HeapSnapshotLoadFromFileDelegate=function(snapshotHeader)
+{this._snapshotHeader=snapshotHeader;}
+WebInspector.HeapSnapshotLoadFromFileDelegate.prototype={onTransferStarted:function()
+{},onChunkTransferred:function(reader)
+{},onTransferFinished:function()
+{},onError:function(reader,e)
+{var subtitle;switch(e.target.error.code){case e.target.error.NOT_FOUND_ERR:subtitle=WebInspector.UIString("'%s' not found.",reader.fileName());break;case e.target.error.NOT_READABLE_ERR:subtitle=WebInspector.UIString("'%s' is not readable",reader.fileName());break;case e.target.error.ABORT_ERR:return;default:subtitle=WebInspector.UIString("'%s' error %d",reader.fileName(),e.target.error.code);}
+this._snapshotHeader.updateStatus(subtitle);}}
+WebInspector.SaveSnapshotOutputStreamDelegate=function(profileHeader)
+{this._profileHeader=profileHeader;}
+WebInspector.SaveSnapshotOutputStreamDelegate.prototype={onTransferStarted:function()
+{this._profileHeader._updateSaveProgress(0,1);},onTransferFinished:function()
+{this._profileHeader._didCompleteSnapshotTransfer();},onChunkTransferred:function(reader)
+{this._profileHeader._updateSaveProgress(reader.loadedSize(),reader.fileSize());},onError:function(reader,event)
+{WebInspector.console.log("Failed to read heap snapshot from temp file: "+event.message,WebInspector.ConsoleMessage.MessageLevel.Error);this.onTransferFinished();}}
+WebInspector.HeapTrackingOverviewGrid=function(heapProfileHeader)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("flameChart.css");this.element.id="heap-recording-view";this.element.classList.add("heap-tracking-overview");this._overviewContainer=this.element.createChild("div","overview-container");this._overviewGrid=new WebInspector.OverviewGrid("heap-recording");this._overviewGrid.element.classList.add("fill");this._overviewCanvas=this._overviewContainer.createChild("canvas","heap-recording-overview-canvas");this._overviewContainer.appendChild(this._overviewGrid.element);this._overviewCalculator=new WebInspector.HeapTrackingOverviewGrid.OverviewCalculator();this._overviewGrid.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged,this._onWindowChanged,this);this._profileSamples=heapProfileHeader._profileSamples;if(heapProfileHeader.profileType().profileBeingRecorded()===heapProfileHeader){this._profileType=heapProfileHeader._profileType;this._profileType.addEventListener(WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate,this._onHeapStatsUpdate,this);this._profileType.addEventListener(WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped,this._onStopTracking,this);}
+var timestamps=this._profileSamples.timestamps;var totalTime=this._profileSamples.totalTime;this._windowLeft=0.0;this._windowRight=totalTime&&timestamps.length?(timestamps[timestamps.length-1]-timestamps[0])/totalTime:1.0;this._overviewGrid.setWindow(this._windowLeft,this._windowRight);this._yScale=new WebInspector.HeapTrackingOverviewGrid.SmoothScale();this._xScale=new WebInspector.HeapTrackingOverviewGrid.SmoothScale();}
+WebInspector.HeapTrackingOverviewGrid.IdsRangeChanged="IdsRangeChanged";WebInspector.HeapTrackingOverviewGrid.prototype={_onStopTracking:function(event)
+{this._profileType.removeEventListener(WebInspector.TrackingHeapSnapshotProfileType.HeapStatsUpdate,this._onHeapStatsUpdate,this);this._profileType.removeEventListener(WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped,this._onStopTracking,this);},_onHeapStatsUpdate:function(event)
+{this._profileSamples=event.data;this._scheduleUpdate();},_drawOverviewCanvas:function(width,height)
+{if(!this._profileSamples)
+return;var profileSamples=this._profileSamples;var sizes=profileSamples.sizes;var topSizes=profileSamples.max;var timestamps=profileSamples.timestamps;var startTime=timestamps[0];var endTime=timestamps[timestamps.length-1];var scaleFactor=this._xScale.nextScale(width/profileSamples.totalTime);var maxSize=0;function aggregateAndCall(sizes,callback)
+{var size=0;var currentX=0;for(var i=1;i<timestamps.length;++i){var x=Math.floor((timestamps[i]-startTime)*scaleFactor);if(x!==currentX){if(size)
+callback(currentX,size);size=0;currentX=x;}
+size+=sizes[i];}
+callback(currentX,size);}
+function maxSizeCallback(x,size)
+{maxSize=Math.max(maxSize,size);}
+aggregateAndCall(sizes,maxSizeCallback);var yScaleFactor=this._yScale.nextScale(maxSize?height/(maxSize*1.1):0.0);this._overviewCanvas.width=width*window.devicePixelRatio;this._overviewCanvas.height=height*window.devicePixelRatio;this._overviewCanvas.style.width=width+"px";this._overviewCanvas.style.height=height+"px";var context=this._overviewCanvas.getContext("2d");context.scale(window.devicePixelRatio,window.devicePixelRatio);context.beginPath();context.lineWidth=2;context.strokeStyle="rgba(192, 192, 192, 0.6)";var currentX=(endTime-startTime)*scaleFactor;context.moveTo(currentX,height-1);context.lineTo(currentX,0);context.stroke();context.closePath();var gridY;var gridValue;var gridLabelHeight=14;if(yScaleFactor){const maxGridValue=(height-gridLabelHeight)/yScaleFactor;gridValue=Math.pow(1024,Math.floor(Math.log(maxGridValue)/Math.log(1024)));gridValue*=Math.pow(10,Math.floor(Math.log(maxGridValue/gridValue)/Math.LN10));if(gridValue*5<=maxGridValue)
+gridValue*=5;gridY=Math.round(height-gridValue*yScaleFactor-0.5)+0.5;context.beginPath();context.lineWidth=1;context.strokeStyle="rgba(0, 0, 0, 0.2)";context.moveTo(0,gridY);context.lineTo(width,gridY);context.stroke();context.closePath();}
+function drawBarCallback(x,size)
+{context.moveTo(x,height-1);context.lineTo(x,Math.round(height-size*yScaleFactor-1));}
+context.beginPath();context.lineWidth=2;context.strokeStyle="rgba(192, 192, 192, 0.6)";aggregateAndCall(topSizes,drawBarCallback);context.stroke();context.closePath();context.beginPath();context.lineWidth=2;context.strokeStyle="rgba(0, 0, 192, 0.8)";aggregateAndCall(sizes,drawBarCallback);context.stroke();context.closePath();if(gridValue){var label=Number.bytesToString(gridValue);var labelPadding=4;var labelX=0;var labelY=gridY-0.5;var labelWidth=2*labelPadding+context.measureText(label).width;context.beginPath();context.textBaseline="bottom";context.font="10px "+window.getComputedStyle(this.element,null).getPropertyValue("font-family");context.fillStyle="rgba(255, 255, 255, 0.75)";context.fillRect(labelX,labelY-gridLabelHeight,labelWidth,gridLabelHeight);context.fillStyle="rgb(64, 64, 64)";context.fillText(label,labelX+labelPadding,labelY);context.fill();context.closePath();}},onResize:function()
+{this._updateOverviewCanvas=true;this._scheduleUpdate();},_onWindowChanged:function()
+{if(!this._updateGridTimerId)
+this._updateGridTimerId=setTimeout(this._updateGrid.bind(this),10);},_scheduleUpdate:function()
+{if(this._updateTimerId)
+return;this._updateTimerId=setTimeout(this.update.bind(this),10);},_updateBoundaries:function()
+{this._windowLeft=this._overviewGrid.windowLeft();this._windowRight=this._overviewGrid.windowRight();this._windowWidth=this._windowRight-this._windowLeft;},update:function()
+{this._updateTimerId=null;if(!this.isShowing())
+return;this._updateBoundaries();this._overviewCalculator._updateBoundaries(this);this._overviewGrid.updateDividers(this._overviewCalculator);this._drawOverviewCanvas(this._overviewContainer.clientWidth,this._overviewContainer.clientHeight-20);},_updateGrid:function()
+{this._updateGridTimerId=0;this._updateBoundaries();var ids=this._profileSamples.ids;var timestamps=this._profileSamples.timestamps;var sizes=this._profileSamples.sizes;var startTime=timestamps[0];var totalTime=this._profileSamples.totalTime;var timeLeft=startTime+totalTime*this._windowLeft;var timeRight=startTime+totalTime*this._windowRight;var minId=0;var maxId=ids[ids.length-1]+1;var size=0;for(var i=0;i<timestamps.length;++i){if(!timestamps[i])
+continue;if(timestamps[i]>timeRight)
+break;maxId=ids[i];if(timestamps[i]<timeLeft){minId=ids[i];continue;}
+size+=sizes[i];}
+this.dispatchEventToListeners(WebInspector.HeapTrackingOverviewGrid.IdsRangeChanged,{minId:minId,maxId:maxId,size:size});},__proto__:WebInspector.VBox.prototype}
+WebInspector.HeapTrackingOverviewGrid.SmoothScale=function()
+{this._lastUpdate=0;this._currentScale=0.0;}
+WebInspector.HeapTrackingOverviewGrid.SmoothScale.prototype={nextScale:function(target){target=target||this._currentScale;if(this._currentScale){var now=Date.now();var timeDeltaMs=now-this._lastUpdate;this._lastUpdate=now;var maxChangePerSec=20;var maxChangePerDelta=Math.pow(maxChangePerSec,timeDeltaMs/1000);var scaleChange=target/this._currentScale;this._currentScale*=Number.constrain(scaleChange,1/maxChangePerDelta,maxChangePerDelta);}else
+this._currentScale=target;return this._currentScale;}}
+WebInspector.HeapTrackingOverviewGrid.OverviewCalculator=function()
+{}
+WebInspector.HeapTrackingOverviewGrid.OverviewCalculator.prototype={paddingLeft:function()
+{return 0;},_updateBoundaries:function(chart)
+{this._minimumBoundaries=0;this._maximumBoundaries=chart._profileSamples.totalTime;this._xScaleFactor=chart._overviewContainer.clientWidth/this._maximumBoundaries;},computePosition:function(time)
+{return(time-this._minimumBoundaries)*this._xScaleFactor;},formatTime:function(value,precision)
+{return Number.secondsToString(value/1000,!!precision);},maximumBoundary:function()
+{return this._maximumBoundaries;},minimumBoundary:function()
+{return this._minimumBoundaries;},zeroTime:function()
+{return this._minimumBoundaries;},boundarySpan:function()
+{return this._maximumBoundaries-this._minimumBoundaries;}}
+WebInspector.HeapSnapshotStatisticsView=function()
+{WebInspector.VBox.call(this);this.setMinimumSize(50,25);this._pieChart=new WebInspector.PieChart();this._pieChart.setSize(150);this.element.appendChild(this._pieChart.element);this._labels=this.element.createChild("div","heap-snapshot-stats-legend");}
+WebInspector.HeapSnapshotStatisticsView.prototype={setTotal:function(value)
+{this._pieChart.setTotal(value);},addRecord:function(value,name,color)
+{if(color)
+this._pieChart.addSlice(value,color);var node=this._labels.createChild("div");var swatchDiv=node.createChild("div","heap-snapshot-stats-swatch");var nameDiv=node.createChild("div","heap-snapshot-stats-name");var sizeDiv=node.createChild("div","heap-snapshot-stats-size");if(color)
+swatchDiv.style.backgroundColor=color;else
+swatchDiv.classList.add("heap-snapshot-stats-empty-swatch");nameDiv.textContent=name;sizeDiv.textContent=WebInspector.UIString("%s KB",Number.withThousandsSeparator(Math.round(value/1024)));},__proto__:WebInspector.VBox.prototype};WebInspector.ProfileLauncherView=function(profilesPanel)
+{WebInspector.VBox.call(this);this._panel=profilesPanel;this.element.classList.add("profile-launcher-view");this.element.classList.add("panel-enabler-view");this._contentElement=this.element.createChild("div","profile-launcher-view-content");this._innerContentElement=this._contentElement.createChild("div");this._controlButton=this._contentElement.createChild("button","control-profiling");this._controlButton.addEventListener("click",this._controlButtonClicked.bind(this),false);this._loadButton=this._contentElement.createChild("button","load-profile");this._loadButton.textContent=WebInspector.UIString("Load");this._loadButton.addEventListener("click",this._loadButtonClicked.bind(this),false);}
+WebInspector.ProfileLauncherView.prototype={addProfileType:function(profileType)
+{var descriptionElement=this._innerContentElement.createChild("h1");descriptionElement.textContent=profileType.description;var decorationElement=profileType.decorationElement();if(decorationElement)
+this._innerContentElement.appendChild(decorationElement);this._isInstantProfile=profileType.isInstantProfile();this._isEnabled=profileType.isEnabled();this._profileTypeId=profileType.id;},_controlButtonClicked:function()
+{this._panel.toggleRecordButton();},_loadButtonClicked:function()
+{this._panel.showLoadFromFileDialog();},_updateControls:function()
+{if(this._isEnabled)
+this._controlButton.removeAttribute("disabled");else
+this._controlButton.setAttribute("disabled","");if(this._isInstantProfile){this._controlButton.classList.remove("running");this._controlButton.textContent=WebInspector.UIString("Take Snapshot");}else if(this._isProfiling){this._controlButton.classList.add("running");this._controlButton.textContent=WebInspector.UIString("Stop");}else{this._controlButton.classList.remove("running");this._controlButton.textContent=WebInspector.UIString("Start");}},profileStarted:function()
+{this._isProfiling=true;this._updateControls();},profileFinished:function()
+{this._isProfiling=false;this._updateControls();},updateProfileType:function(profileType)
+{this._isInstantProfile=profileType.isInstantProfile();this._isEnabled=profileType.isEnabled();this._profileTypeId=profileType.id;this._updateControls();},__proto__:WebInspector.VBox.prototype}
+WebInspector.MultiProfileLauncherView=function(profilesPanel)
+{WebInspector.ProfileLauncherView.call(this,profilesPanel);WebInspector.settings.selectedProfileType=WebInspector.settings.createSetting("selectedProfileType","CPU");var header=this._innerContentElement.createChild("h1");header.textContent=WebInspector.UIString("Select profiling type");this._profileTypeSelectorForm=this._innerContentElement.createChild("form");this._innerContentElement.createChild("div","flexible-space");this._typeIdToOptionElement={};}
+WebInspector.MultiProfileLauncherView.EventTypes={ProfileTypeSelected:"profile-type-selected"}
+WebInspector.MultiProfileLauncherView.prototype={addProfileType:function(profileType)
+{var labelElement=this._profileTypeSelectorForm.createChild("label");labelElement.textContent=profileType.name;var optionElement=document.createElement("input");labelElement.insertBefore(optionElement,labelElement.firstChild);this._typeIdToOptionElement[profileType.id]=optionElement;optionElement._profileType=profileType;optionElement.type="radio";optionElement.name="profile-type";optionElement.style.hidden=true;optionElement.addEventListener("change",this._profileTypeChanged.bind(this,profileType),false);var descriptionElement=labelElement.createChild("p");descriptionElement.textContent=profileType.description;var decorationElement=profileType.decorationElement();if(decorationElement)
+labelElement.appendChild(decorationElement);},restoreSelectedProfileType:function()
+{var typeId=WebInspector.settings.selectedProfileType.get();if(!(typeId in this._typeIdToOptionElement))
+typeId=Object.keys(this._typeIdToOptionElement)[0];this._typeIdToOptionElement[typeId].checked=true;var type=this._typeIdToOptionElement[typeId]._profileType;this.dispatchEventToListeners(WebInspector.MultiProfileLauncherView.EventTypes.ProfileTypeSelected,type);},_controlButtonClicked:function()
+{this._panel.toggleRecordButton();},_updateControls:function()
+{WebInspector.ProfileLauncherView.prototype._updateControls.call(this);var items=this._profileTypeSelectorForm.elements;for(var i=0;i<items.length;++i){if(items[i].type==="radio")
+items[i].disabled=this._isProfiling;}},_profileTypeChanged:function(profileType,event)
+{this.dispatchEventToListeners(WebInspector.MultiProfileLauncherView.EventTypes.ProfileTypeSelected,profileType);this._isInstantProfile=profileType.isInstantProfile();this._isEnabled=profileType.isEnabled();this._profileTypeId=profileType.id;this._updateControls();WebInspector.settings.selectedProfileType.set(profileType.id);},profileStarted:function()
+{this._isProfiling=true;this._updateControls();},profileFinished:function()
+{this._isProfiling=false;this._updateControls();},__proto__:WebInspector.ProfileLauncherView.prototype};WebInspector.TopDownProfileDataGridNode=function(profileNode,owningTree)
+{var hasChildren=!!(profileNode.children&&profileNode.children.length);WebInspector.ProfileDataGridNode.call(this,profileNode,owningTree,hasChildren);this._remainingChildren=profileNode.children;}
+WebInspector.TopDownProfileDataGridNode.prototype={_sharedPopulate:function()
+{var children=this._remainingChildren;var childrenLength=children.length;for(var i=0;i<childrenLength;++i)
+this.appendChild(new WebInspector.TopDownProfileDataGridNode(children[i],this.tree));this._remainingChildren=null;},_exclude:function(aCallUID)
+{if(this._remainingChildren)
+this.populate();this._save();var children=this.children;var index=this.children.length;while(index--)
+children[index]._exclude(aCallUID);var child=this.childrenByCallUID[aCallUID];if(child)
+this._merge(child,true);},__proto__:WebInspector.ProfileDataGridNode.prototype}
+WebInspector.TopDownProfileDataGridTree=function(profileView,rootProfileNode)
+{WebInspector.ProfileDataGridTree.call(this,profileView,rootProfileNode);this._remainingChildren=rootProfileNode.children;var any=(this);var node=(any);WebInspector.TopDownProfileDataGridNode.prototype.populate.call(node);}
+WebInspector.TopDownProfileDataGridTree.prototype={focus:function(profileDataGridNode)
+{if(!profileDataGridNode)
+return;this._save();profileDataGridNode.savePosition();this.children=[profileDataGridNode];this.totalTime=profileDataGridNode.totalTime;},exclude:function(profileDataGridNode)
+{if(!profileDataGridNode)
+return;this._save();var excludedCallUID=profileDataGridNode.callUID;var any=(this);var node=(any);WebInspector.TopDownProfileDataGridNode.prototype._exclude.call(node,excludedCallUID);if(this.lastComparator)
+this.sort(this.lastComparator,true);},restore:function()
+{if(!this._savedChildren)
+return;this.children[0].restorePosition();WebInspector.ProfileDataGridTree.prototype.restore.call(this);},_merge:WebInspector.TopDownProfileDataGridNode.prototype._merge,_sharedPopulate:WebInspector.TopDownProfileDataGridNode.prototype._sharedPopulate,__proto__:WebInspector.ProfileDataGridTree.prototype};WebInspector.CanvasProfileView=function(profile)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("canvasProfiler.css");this.element.classList.add("canvas-profile-view");this._profile=profile;this._traceLogId=profile.traceLogId();this._traceLogPlayer=(profile.traceLogPlayer());this._linkifier=new WebInspector.Linkifier();this._replayInfoSplitView=new WebInspector.SplitView(true,true,"canvasProfileViewReplaySplitViewState",0.34);this._replayInfoSplitView.show(this.element);this._imageSplitView=new WebInspector.SplitView(false,true,"canvasProfileViewSplitViewState",300);this._imageSplitView.show(this._replayInfoSplitView.mainElement());var replayImageContainerView=new WebInspector.VBox();replayImageContainerView.setMinimumSize(50,28);replayImageContainerView.show(this._imageSplitView.mainElement());var replayImageContainer=replayImageContainerView.element.createChild("div");replayImageContainer.id="canvas-replay-image-container";this._replayImageElement=replayImageContainer.createChild("img","canvas-replay-image");this._debugInfoElement=replayImageContainer.createChild("div","canvas-debug-info hidden");this._spinnerIcon=replayImageContainer.createChild("div","spinner-icon small hidden");var replayLogContainerView=new WebInspector.VBox();replayLogContainerView.setMinimumSize(22,22);replayLogContainerView.show(this._imageSplitView.sidebarElement());var replayLogContainer=replayLogContainerView.element;var controlsContainer=replayLogContainer.createChild("div","status-bar");var logGridContainer=replayLogContainer.createChild("div","canvas-replay-log");this._createControlButton(controlsContainer,"canvas-replay-first-step",WebInspector.UIString("First call."),this._onReplayFirstStepClick.bind(this));this._createControlButton(controlsContainer,"canvas-replay-prev-step",WebInspector.UIString("Previous call."),this._onReplayStepClick.bind(this,false));this._createControlButton(controlsContainer,"canvas-replay-next-step",WebInspector.UIString("Next call."),this._onReplayStepClick.bind(this,true));this._createControlButton(controlsContainer,"canvas-replay-prev-draw",WebInspector.UIString("Previous drawing call."),this._onReplayDrawingCallClick.bind(this,false));this._createControlButton(controlsContainer,"canvas-replay-next-draw",WebInspector.UIString("Next drawing call."),this._onReplayDrawingCallClick.bind(this,true));this._createControlButton(controlsContainer,"canvas-replay-last-step",WebInspector.UIString("Last call."),this._onReplayLastStepClick.bind(this));this._replayContextSelector=new WebInspector.StatusBarComboBox(this._onReplayContextChanged.bind(this));this._replayContextSelector.createOption(WebInspector.UIString("<screenshot auto>"),WebInspector.UIString("Show screenshot of the last replayed resource."),"");controlsContainer.appendChild(this._replayContextSelector.element);this._installReplayInfoSidebarWidgets(controlsContainer);this._replayStateView=new WebInspector.CanvasReplayStateView(this._traceLogPlayer);this._replayStateView.show(this._replayInfoSplitView.sidebarElement());this._replayContexts={};var columns=[{title:"#",sortable:false,width:"5%"},{title:WebInspector.UIString("Call"),sortable:false,width:"75%",disclosure:true},{title:WebInspector.UIString("Location"),sortable:false,width:"20%"}];this._logGrid=new WebInspector.DataGrid(columns);this._logGrid.element.classList.add("fill");this._logGrid.show(logGridContainer);this._logGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode,this._replayTraceLog,this);this.element.addEventListener("mousedown",this._onMouseClick.bind(this),true);this._popoverHelper=new WebInspector.ObjectPopoverHelper(this.element,this._popoverAnchor.bind(this),this._resolveObjectForPopover.bind(this),this._onHidePopover.bind(this),true);this._popoverHelper.setRemoteObjectFormatter(this._hexNumbersFormatter.bind(this));this._requestTraceLog(0);}
+WebInspector.CanvasProfileView.TraceLogPollingInterval=500;WebInspector.CanvasProfileView.prototype={dispose:function()
+{this._linkifier.reset();},get statusBarItems()
+{return[];},get profile()
+{return this._profile;},elementsToRestoreScrollPositionsFor:function()
+{return[this._logGrid.scrollContainer];},_installReplayInfoSidebarWidgets:function(controlsContainer)
+{this._replayInfoResizeWidgetElement=controlsContainer.createChild("div","resizer-widget");this._replayInfoSplitView.addEventListener(WebInspector.SplitView.Events.ShowModeChanged,this._updateReplayInfoResizeWidget,this);this._updateReplayInfoResizeWidget();this._replayInfoSplitView.installResizer(this._replayInfoResizeWidgetElement);this._toggleReplayStateSidebarButton=this._replayInfoSplitView.createShowHideSidebarButton("sidebar","canvas-sidebar-show-hide-button");controlsContainer.appendChild(this._toggleReplayStateSidebarButton.element);this._replayInfoSplitView.hideSidebar();},_updateReplayInfoResizeWidget:function()
+{this._replayInfoResizeWidgetElement.classList.toggle("hidden",this._replayInfoSplitView.showMode()!==WebInspector.SplitView.ShowMode.Both);},_onMouseClick:function(event)
+{var resourceLinkElement=event.target.enclosingNodeOrSelfWithClass("canvas-formatted-resource");if(resourceLinkElement){this._replayInfoSplitView.showBoth();this._replayStateView.selectResource(resourceLinkElement.__resourceId);event.consume(true);return;}
+if(event.target.enclosingNodeOrSelfWithClass("webkit-html-resource-link"))
+event.consume(false);},_createControlButton:function(parent,className,title,clickCallback)
+{var button=new WebInspector.StatusBarButton(title,className+" canvas-replay-button");parent.appendChild(button.element);button.makeLongClickEnabled();button.addEventListener("click",clickCallback,this);button.addEventListener("longClickDown",clickCallback,this);button.addEventListener("longClickPress",clickCallback,this);},_onReplayContextChanged:function()
+{var selectedContextId=this._replayContextSelector.selectedOption().value;function didReceiveResourceState(resourceState)
+{this._enableWaitIcon(false);if(selectedContextId!==this._replayContextSelector.selectedOption().value)
+return;var imageURL=(resourceState&&resourceState.imageURL)||"";this._replayImageElement.src=imageURL;this._replayImageElement.style.visibility=imageURL?"":"hidden";}
+this._enableWaitIcon(true);this._traceLogPlayer.getResourceState(selectedContextId,didReceiveResourceState.bind(this));},_onReplayStepClick:function(forward)
+{var selectedNode=this._logGrid.selectedNode;if(!selectedNode)
+return;var nextNode=selectedNode;do{nextNode=forward?nextNode.traverseNextNode(false):nextNode.traversePreviousNode(false);}while(nextNode&&typeof nextNode.index!=="number");(nextNode||selectedNode).revealAndSelect();},_onReplayDrawingCallClick:function(forward)
+{var selectedNode=this._logGrid.selectedNode;if(!selectedNode)
+return;var nextNode=selectedNode;while(nextNode){var sibling=forward?nextNode.nextSibling:nextNode.previousSibling;if(sibling){nextNode=sibling;if(nextNode.hasChildren||nextNode.call.isDrawingCall)
+break;}else{nextNode=nextNode.parent;if(!forward)
+break;}}
+if(!nextNode&&forward)
+this._onReplayLastStepClick();else
+(nextNode||selectedNode).revealAndSelect();},_onReplayFirstStepClick:function()
+{var firstNode=this._logGrid.rootNode().children[0];if(firstNode)
+firstNode.revealAndSelect();},_onReplayLastStepClick:function()
+{var lastNode=this._logGrid.rootNode().children.peekLast();if(!lastNode)
+return;while(lastNode.expanded){var lastChild=lastNode.children.peekLast();if(!lastChild)
+break;lastNode=lastChild;}
+lastNode.revealAndSelect();},_enableWaitIcon:function(enable)
+{this._spinnerIcon.classList.toggle("hidden",!enable);this._debugInfoElement.classList.toggle("hidden",enable);},_replayTraceLog:function()
+{if(this._pendingReplayTraceLogEvent)
+return;var index=this._selectedCallIndex();if(index===-1||index===this._lastReplayCallIndex)
+return;this._lastReplayCallIndex=index;this._pendingReplayTraceLogEvent=true;function didReplayTraceLog(resourceState,replayTime)
+{delete this._pendingReplayTraceLogEvent;this._enableWaitIcon(false);this._debugInfoElement.textContent=WebInspector.UIString("Replay time: %s",Number.secondsToString(replayTime/1000,true));this._onReplayContextChanged();if(index!==this._selectedCallIndex())
+this._replayTraceLog();}
+this._enableWaitIcon(true);this._traceLogPlayer.replayTraceLog(index,didReplayTraceLog.bind(this));},_requestTraceLog:function(offset)
+{function didReceiveTraceLog(traceLog)
+{this._enableWaitIcon(false);if(!traceLog)
+return;var callNodes=[];var calls=traceLog.calls;var index=traceLog.startOffset;for(var i=0,n=calls.length;i<n;++i)
+callNodes.push(this._createCallNode(index++,calls[i]));var contexts=traceLog.contexts;for(var i=0,n=contexts.length;i<n;++i){var contextId=contexts[i].resourceId||"";var description=contexts[i].description||"";if(this._replayContexts[contextId])
+continue;this._replayContexts[contextId]=true;this._replayContextSelector.createOption(description,WebInspector.UIString("Show screenshot of this context's canvas."),contextId);}
+this._appendCallNodes(callNodes);if(traceLog.alive)
+setTimeout(this._requestTraceLog.bind(this,index),WebInspector.CanvasProfileView.TraceLogPollingInterval);else
+this._flattenSingleFrameNode();this._profile._updateCapturingStatus(traceLog);this._onReplayLastStepClick();}
+this._enableWaitIcon(true);this._traceLogPlayer.getTraceLog(offset,undefined,didReceiveTraceLog.bind(this));},_selectedCallIndex:function()
+{var node=this._logGrid.selectedNode;return node?this._peekLastRecursively(node).index:-1;},_peekLastRecursively:function(node)
+{var lastChild;while((lastChild=node.children.peekLast()))
+node=lastChild;return node;},_appendCallNodes:function(callNodes)
+{var rootNode=this._logGrid.rootNode();var frameNode=rootNode.children.peekLast();if(frameNode&&this._peekLastRecursively(frameNode).call.isFrameEndCall)
+frameNode=null;for(var i=0,n=callNodes.length;i<n;++i){if(!frameNode){var index=rootNode.children.length;var data={};data[0]="";data[1]=WebInspector.UIString("Frame #%d",index+1);data[2]="";frameNode=new WebInspector.DataGridNode(data);frameNode.selectable=true;rootNode.appendChild(frameNode);}
+var nextFrameCallIndex=i+1;while(nextFrameCallIndex<n&&!callNodes[nextFrameCallIndex-1].call.isFrameEndCall)
+++nextFrameCallIndex;this._appendCallNodesToFrameNode(frameNode,callNodes,i,nextFrameCallIndex);i=nextFrameCallIndex-1;frameNode=null;}},_appendCallNodesToFrameNode:function(frameNode,callNodes,fromIndex,toIndex)
+{var self=this;function appendDrawCallGroup()
+{var index=self._drawCallGroupsCount||0;var data={};data[0]="";data[1]=WebInspector.UIString("Draw call group #%d",index+1);data[2]="";var node=new WebInspector.DataGridNode(data);node.selectable=true;self._drawCallGroupsCount=index+1;frameNode.appendChild(node);return node;}
+function splitDrawCallGroup(drawCallGroup)
+{var splitIndex=0;var splitNode;while((splitNode=drawCallGroup.children[splitIndex])){if(splitNode.call.isDrawingCall)
+break;++splitIndex;}
+var newDrawCallGroup=appendDrawCallGroup();var lastNode;while((lastNode=drawCallGroup.children[splitIndex+1]))
+newDrawCallGroup.appendChild(lastNode);return newDrawCallGroup;}
+var drawCallGroup=frameNode.children.peekLast();var groupHasDrawCall=false;if(drawCallGroup){for(var i=0,n=drawCallGroup.children.length;i<n;++i){if(drawCallGroup.children[i].call.isDrawingCall){groupHasDrawCall=true;break;}}}else
+drawCallGroup=appendDrawCallGroup();for(var i=fromIndex;i<toIndex;++i){var node=callNodes[i];drawCallGroup.appendChild(node);if(node.call.isDrawingCall){if(groupHasDrawCall)
+drawCallGroup=splitDrawCallGroup(drawCallGroup);else
+groupHasDrawCall=true;}}},_createCallNode:function(index,call)
+{var callViewElement=document.createElement("div");var data={};data[0]=index+1;data[1]=callViewElement;data[2]="";if(call.sourceURL){var lineNumber=Math.max(0,call.lineNumber-1)||0;var columnNumber=Math.max(0,call.columnNumber-1)||0;data[2]=this._linkifier.linkifyLocation(call.sourceURL,lineNumber,columnNumber);}
+callViewElement.createChild("span","canvas-function-name").textContent=call.functionName||"context."+call.property;if(call.arguments){callViewElement.createTextChild("(");for(var i=0,n=call.arguments.length;i<n;++i){var argument=(call.arguments[i]);if(i)
+callViewElement.createTextChild(", ");var element=WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(argument);element.__argumentIndex=i;callViewElement.appendChild(element);}
+callViewElement.createTextChild(")");}else if(call.value){callViewElement.createTextChild(" = ");callViewElement.appendChild(WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(call.value));}
+if(call.result){callViewElement.createTextChild(" => ");callViewElement.appendChild(WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(call.result));}
+var node=new WebInspector.DataGridNode(data);node.index=index;node.selectable=true;node.call=call;return node;},_popoverAnchor:function(element,event)
+{var argumentElement=element.enclosingNodeOrSelfWithClass("canvas-call-argument");if(!argumentElement||argumentElement.__suppressPopover)
+return null;return argumentElement;},_resolveObjectForPopover:function(argumentElement,showCallback,objectGroupName)
+{function showObjectPopover(error,result,resourceState)
+{if(error)
+return;if(!result)
+return;this._popoverAnchorElement=argumentElement.cloneNode(true);this._popoverAnchorElement.classList.add("canvas-popover-anchor");this._popoverAnchorElement.classList.add("source-frame-eval-expression");argumentElement.parentElement.appendChild(this._popoverAnchorElement);var diffLeft=this._popoverAnchorElement.boxInWindow().x-argumentElement.boxInWindow().x;this._popoverAnchorElement.style.left=this._popoverAnchorElement.offsetLeft-diffLeft+"px";showCallback(WebInspector.RemoteObject.fromPayload(result),false,this._popoverAnchorElement);}
+var evalResult=argumentElement.__evalResult;if(evalResult)
+showObjectPopover.call(this,null,evalResult);else{var dataGridNode=this._logGrid.dataGridNodeFromNode(argumentElement);if(!dataGridNode||typeof dataGridNode.index!=="number"){this._popoverHelper.hidePopover();return;}
+var callIndex=dataGridNode.index;var argumentIndex=argumentElement.__argumentIndex;if(typeof argumentIndex!=="number")
+argumentIndex=-1;CanvasAgent.evaluateTraceLogCallArgument(this._traceLogId,callIndex,argumentIndex,objectGroupName,showObjectPopover.bind(this));}},_hexNumbersFormatter:function(object)
+{if(object.type==="number"){var str="0000"+Number(object.description).toString(16).toUpperCase();str=str.replace(/^0+(.{4,})$/,"$1");return"0x"+str;}
+return object.description||"";},_onHidePopover:function()
+{if(this._popoverAnchorElement){this._popoverAnchorElement.remove()
+delete this._popoverAnchorElement;}},_flattenSingleFrameNode:function()
+{var rootNode=this._logGrid.rootNode();if(rootNode.children.length!==1)
+return;var frameNode=rootNode.children[0];while(frameNode.children[0])
+rootNode.appendChild(frameNode.children[0]);rootNode.removeChild(frameNode);},__proto__:WebInspector.VBox.prototype}
+WebInspector.CanvasProfileType=function()
+{WebInspector.ProfileType.call(this,WebInspector.CanvasProfileType.TypeId,WebInspector.UIString("Capture Canvas Frame"));this._recording=false;this._lastProfileHeader=null;this._capturingModeSelector=new WebInspector.StatusBarComboBox(this._dispatchViewUpdatedEvent.bind(this));this._capturingModeSelector.element.title=WebInspector.UIString("Canvas capture mode.");this._capturingModeSelector.createOption(WebInspector.UIString("Single Frame"),WebInspector.UIString("Capture a single canvas frame."),"");this._capturingModeSelector.createOption(WebInspector.UIString("Consecutive Frames"),WebInspector.UIString("Capture consecutive canvas frames."),"1");this._frameOptions={};this._framesWithCanvases={};this._frameSelector=new WebInspector.StatusBarComboBox(this._dispatchViewUpdatedEvent.bind(this));this._frameSelector.element.title=WebInspector.UIString("Frame containing the canvases to capture.");this._frameSelector.element.classList.add("hidden");WebInspector.resourceTreeModel.frames().forEach(this._addFrame,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameAdded,this._frameAdded,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached,this._frameRemoved,this);this._dispatcher=new WebInspector.CanvasDispatcher(this);this._canvasAgentEnabled=false;this._decorationElement=document.createElement("div");this._decorationElement.className="profile-canvas-decoration";this._updateDecorationElement();}
+WebInspector.CanvasProfileType.TypeId="CANVAS_PROFILE";WebInspector.CanvasProfileType.prototype={get statusBarItems()
+{return[this._capturingModeSelector.element,this._frameSelector.element];},get buttonTooltip()
+{if(this._isSingleFrameMode())
+return WebInspector.UIString("Capture next canvas frame.");else
+return this._recording?WebInspector.UIString("Stop capturing canvas frames."):WebInspector.UIString("Start capturing canvas frames.");},buttonClicked:function()
+{if(!this._canvasAgentEnabled)
+return false;if(this._recording){this._recording=false;this._stopFrameCapturing();}else if(this._isSingleFrameMode()){this._recording=false;this._runSingleFrameCapturing();}else{this._recording=true;this._startFrameCapturing();}
+return this._recording;},_runSingleFrameCapturing:function()
+{var frameId=this._selectedFrameId();CanvasAgent.captureFrame(frameId,this._didStartCapturingFrame.bind(this,frameId));},_startFrameCapturing:function()
+{var frameId=this._selectedFrameId();CanvasAgent.startCapturing(frameId,this._didStartCapturingFrame.bind(this,frameId));},_stopFrameCapturing:function()
+{if(!this._lastProfileHeader)
+return;var profileHeader=this._lastProfileHeader;var traceLogId=profileHeader.traceLogId();this._lastProfileHeader=null;function didStopCapturing()
+{profileHeader._updateCapturingStatus();}
+CanvasAgent.stopCapturing(traceLogId,didStopCapturing);},_didStartCapturingFrame:function(frameId,error,traceLogId)
+{if(error||this._lastProfileHeader&&this._lastProfileHeader.traceLogId()===traceLogId)
+return;var profileHeader=new WebInspector.CanvasProfileHeader(this,traceLogId,frameId);this._lastProfileHeader=profileHeader;this.addProfile(profileHeader);profileHeader._updateCapturingStatus();},get treeItemTitle()
+{return WebInspector.UIString("CANVAS PROFILE");},get description()
+{return WebInspector.UIString("Canvas calls instrumentation");},decorationElement:function()
+{return this._decorationElement;},removeProfile:function(profile)
+{WebInspector.ProfileType.prototype.removeProfile.call(this,profile);if(this._recording&&profile===this._lastProfileHeader)
+this._recording=false;},_updateDecorationElement:function(forcePageReload)
+{this._decorationElement.removeChildren();this._decorationElement.createChild("div","warning-icon-small");this._decorationElement.appendChild(document.createTextNode(this._canvasAgentEnabled?WebInspector.UIString("Canvas Profiler is enabled."):WebInspector.UIString("Canvas Profiler is disabled.")));var button=this._decorationElement.createChild("button");button.type="button";button.textContent=this._canvasAgentEnabled?WebInspector.UIString("Disable"):WebInspector.UIString("Enable");button.addEventListener("click",this._onProfilerEnableButtonClick.bind(this,!this._canvasAgentEnabled),false);function hasUninstrumentedCanvasesCallback(error,result)
+{if(error||result)
+WebInspector.resourceTreeModel.reloadPage();}
+if(forcePageReload){if(this._canvasAgentEnabled){CanvasAgent.hasUninstrumentedCanvases(hasUninstrumentedCanvasesCallback);}else{for(var frameId in this._framesWithCanvases){if(this._framesWithCanvases.hasOwnProperty(frameId)){WebInspector.resourceTreeModel.reloadPage();break;}}}}},_onProfilerEnableButtonClick:function(enable)
+{if(this._canvasAgentEnabled===enable)
+return;function callback(error)
+{if(error)
+return;this._canvasAgentEnabled=enable;this._updateDecorationElement(true);this._dispatchViewUpdatedEvent();}
+if(enable)
+CanvasAgent.enable(callback.bind(this));else
+CanvasAgent.disable(callback.bind(this));},_isSingleFrameMode:function()
+{return!this._capturingModeSelector.selectedOption().value;},_frameAdded:function(event)
+{var frame=(event.data);this._addFrame(frame);},_addFrame:function(frame)
+{var frameId=frame.id;var option=document.createElement("option");option.text=frame.displayName();option.title=frame.url;option.value=frameId;this._frameOptions[frameId]=option;if(this._framesWithCanvases[frameId]){this._frameSelector.addOption(option);this._dispatchViewUpdatedEvent();}},_frameRemoved:function(event)
+{var frame=(event.data);var frameId=frame.id;var option=this._frameOptions[frameId];if(option&&this._framesWithCanvases[frameId]){this._frameSelector.removeOption(option);this._dispatchViewUpdatedEvent();}
+delete this._frameOptions[frameId];delete this._framesWithCanvases[frameId];},_contextCreated:function(frameId)
+{if(this._framesWithCanvases[frameId])
+return;this._framesWithCanvases[frameId]=true;var option=this._frameOptions[frameId];if(option){this._frameSelector.addOption(option);this._dispatchViewUpdatedEvent();}},_traceLogsRemoved:function(frameId,traceLogId)
+{var sidebarElementsToDelete=[];var sidebarElements=((this.treeElement&&this.treeElement.children)||[]);for(var i=0,n=sidebarElements.length;i<n;++i){var header=(sidebarElements[i].profile);if(!header)
+continue;if(frameId&&frameId!==header.frameId())
+continue;if(traceLogId&&traceLogId!==header.traceLogId())
+continue;sidebarElementsToDelete.push(sidebarElements[i]);}
+for(var i=0,n=sidebarElementsToDelete.length;i<n;++i)
+sidebarElementsToDelete[i].ondelete();},_selectedFrameId:function()
+{var option=this._frameSelector.selectedOption();return option?option.value:undefined;},_dispatchViewUpdatedEvent:function()
+{this._frameSelector.element.classList.toggle("hidden",this._frameSelector.size()<=1);this.dispatchEventToListeners(WebInspector.ProfileType.Events.ViewUpdated);},isInstantProfile:function()
+{return this._isSingleFrameMode();},isEnabled:function()
+{return this._canvasAgentEnabled;},__proto__:WebInspector.ProfileType.prototype}
+WebInspector.CanvasDispatcher=function(profileType)
+{this._profileType=profileType;InspectorBackend.registerCanvasDispatcher(this);}
+WebInspector.CanvasDispatcher.prototype={contextCreated:function(frameId)
+{this._profileType._contextCreated(frameId);},traceLogsRemoved:function(frameId,traceLogId)
+{this._profileType._traceLogsRemoved(frameId,traceLogId);}}
+WebInspector.CanvasProfileHeader=function(type,traceLogId,frameId)
+{WebInspector.ProfileHeader.call(this,type,WebInspector.UIString("Trace Log %d",type._nextProfileUid));this._traceLogId=traceLogId||"";this._frameId=frameId;this._alive=true;this._traceLogSize=0;this._traceLogPlayer=traceLogId?new WebInspector.CanvasTraceLogPlayerProxy(traceLogId):null;}
+WebInspector.CanvasProfileHeader.prototype={traceLogId:function()
+{return this._traceLogId;},traceLogPlayer:function()
+{return this._traceLogPlayer;},frameId:function()
+{return this._frameId;},createSidebarTreeElement:function()
+{return new WebInspector.ProfileSidebarTreeElement(this,"profile-sidebar-tree-item");},createView:function()
+{return new WebInspector.CanvasProfileView(this);},dispose:function()
+{if(this._traceLogPlayer)
+this._traceLogPlayer.dispose();clearTimeout(this._requestStatusTimer);this._alive=false;},_updateCapturingStatus:function(traceLog)
+{if(!this._traceLogId)
+return;if(traceLog){this._alive=traceLog.alive;this._traceLogSize=traceLog.totalAvailableCalls;}
+var subtitle=this._alive?WebInspector.UIString("Capturing\u2026 %d calls",this._traceLogSize):WebInspector.UIString("Captured %d calls",this._traceLogSize);this.updateStatus(subtitle,this._alive);if(this._alive){clearTimeout(this._requestStatusTimer);this._requestStatusTimer=setTimeout(this._requestCapturingStatus.bind(this),WebInspector.CanvasProfileView.TraceLogPollingInterval);}},_requestCapturingStatus:function()
+{function didReceiveTraceLog(traceLog)
+{if(!traceLog)
+return;this._alive=traceLog.alive;this._traceLogSize=traceLog.totalAvailableCalls;this._updateCapturingStatus();}
+this._traceLogPlayer.getTraceLog(0,0,didReceiveTraceLog.bind(this));},__proto__:WebInspector.ProfileHeader.prototype}
+WebInspector.CanvasProfileDataGridHelper={createCallArgumentElement:function(callArgument)
+{if(callArgument.enumName)
+return WebInspector.CanvasProfileDataGridHelper.createEnumValueElement(callArgument.enumName,+callArgument.description);var element=document.createElement("span");element.className="canvas-call-argument";var description=callArgument.description;if(callArgument.type==="string"){const maxStringLength=150;element.createTextChild("\"");element.createChild("span","canvas-formatted-string").textContent=description.trimMiddle(maxStringLength);element.createTextChild("\"");element.__suppressPopover=(description.length<=maxStringLength&&!/[\r\n]/.test(description));if(!element.__suppressPopover)
+element.__evalResult=WebInspector.RemoteObject.fromPrimitiveValue(description);}else{var type=callArgument.subtype||callArgument.type;if(type){element.classList.add("canvas-formatted-"+type);if(["null","undefined","boolean","number"].indexOf(type)>=0)
+element.__suppressPopover=true;}
+element.textContent=description;if(callArgument.remoteObject)
+element.__evalResult=WebInspector.RemoteObject.fromPayload(callArgument.remoteObject);}
+if(callArgument.resourceId){element.classList.add("canvas-formatted-resource");element.__resourceId=callArgument.resourceId;}
+return element;},createEnumValueElement:function(enumName,enumValue)
+{var element=document.createElement("span");element.className="canvas-call-argument canvas-formatted-number";element.textContent=enumName;element.__evalResult=WebInspector.RemoteObject.fromPrimitiveValue(enumValue);return element;}}
+WebInspector.CanvasTraceLogPlayerProxy=function(traceLogId)
+{this._traceLogId=traceLogId;this._currentResourceStates={};this._defaultResourceId=null;}
+WebInspector.CanvasTraceLogPlayerProxy.Events={CanvasTraceLogReceived:"CanvasTraceLogReceived",CanvasReplayStateChanged:"CanvasReplayStateChanged",CanvasResourceStateReceived:"CanvasResourceStateReceived",}
+WebInspector.CanvasTraceLogPlayerProxy.prototype={getTraceLog:function(startOffset,maxLength,userCallback)
+{function callback(error,traceLog)
+{if(error||!traceLog){userCallback(null);return;}
+userCallback(traceLog);this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasTraceLogReceived,traceLog);}
+CanvasAgent.getTraceLog(this._traceLogId,startOffset,maxLength,callback.bind(this));},dispose:function()
+{this._currentResourceStates={};CanvasAgent.dropTraceLog(this._traceLogId);this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged);},getResourceState:function(resourceId,userCallback)
+{resourceId=resourceId||this._defaultResourceId;if(!resourceId){userCallback(null);return;}
+var effectiveResourceId=(resourceId);if(this._currentResourceStates[effectiveResourceId]){userCallback(this._currentResourceStates[effectiveResourceId]);return;}
+function callback(error,resourceState)
+{if(error||!resourceState){userCallback(null);return;}
+this._currentResourceStates[effectiveResourceId]=resourceState;userCallback(resourceState);this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasResourceStateReceived,resourceState);}
+CanvasAgent.getResourceState(this._traceLogId,effectiveResourceId,callback.bind(this));},replayTraceLog:function(index,userCallback)
+{function callback(error,resourceState,replayTime)
+{this._currentResourceStates={};if(error){userCallback(null,replayTime);}else{this._defaultResourceId=resourceState.id;this._currentResourceStates[resourceState.id]=resourceState;userCallback(resourceState,replayTime);}
+this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged);if(!error)
+this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasResourceStateReceived,resourceState);}
+CanvasAgent.replayTraceLog(this._traceLogId,index,callback.bind(this));},clearResourceStates:function()
+{this._currentResourceStates={};this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged);},__proto__:WebInspector.Object.prototype};WebInspector.CanvasReplayStateView=function(traceLogPlayer)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("canvasProfiler.css");this.element.classList.add("canvas-replay-state-view");this._traceLogPlayer=traceLogPlayer;var controlsContainer=this.element.createChild("div","status-bar");this._prevButton=this._createControlButton(controlsContainer,"canvas-replay-state-prev",WebInspector.UIString("Previous resource."),this._onResourceNavigationClick.bind(this,false));this._nextButton=this._createControlButton(controlsContainer,"canvas-replay-state-next",WebInspector.UIString("Next resource."),this._onResourceNavigationClick.bind(this,true));this._createControlButton(controlsContainer,"canvas-replay-state-refresh",WebInspector.UIString("Refresh."),this._onStateRefreshClick.bind(this));this._resourceSelector=new WebInspector.StatusBarComboBox(this._onReplayResourceChanged.bind(this));this._currentOption=this._resourceSelector.createOption(WebInspector.UIString("<auto>"),WebInspector.UIString("Show state of the last replayed resource."),"");controlsContainer.appendChild(this._resourceSelector.element);this._resourceIdToDescription={};this._gridNodesExpandedState={};this._gridScrollPositions={};this._currentResourceId=null;this._prevOptionsStack=[];this._nextOptionsStack=[];this._highlightedGridNodes=[];var columns=[{title:WebInspector.UIString("Name"),sortable:false,width:"50%",disclosure:true},{title:WebInspector.UIString("Value"),sortable:false,width:"50%"}];this._stateGrid=new WebInspector.DataGrid(columns);this._stateGrid.element.classList.add("fill");this._stateGrid.show(this.element);this._traceLogPlayer.addEventListener(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged,this._onReplayResourceChanged,this);this._traceLogPlayer.addEventListener(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasTraceLogReceived,this._onCanvasTraceLogReceived,this);this._traceLogPlayer.addEventListener(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasResourceStateReceived,this._onCanvasResourceStateReceived,this);this._updateButtonsEnabledState();}
+WebInspector.CanvasReplayStateView.prototype={selectResource:function(resourceId)
+{if(resourceId===this._resourceSelector.selectedOption().value)
+return;var option=this._resourceSelector.selectElement().firstChild;for(var index=0;option;++index,option=option.nextSibling){if(resourceId===option.value){this._resourceSelector.setSelectedIndex(index);this._onReplayResourceChanged();break;}}},_createControlButton:function(parent,className,title,clickCallback)
+{var button=new WebInspector.StatusBarButton(title,className+" canvas-replay-button");parent.appendChild(button.element);button.makeLongClickEnabled();button.addEventListener("click",clickCallback,this);button.addEventListener("longClickDown",clickCallback,this);button.addEventListener("longClickPress",clickCallback,this);return button;},_onResourceNavigationClick:function(forward)
+{var newOption=forward?this._nextOptionsStack.pop():this._prevOptionsStack.pop();if(!newOption)
+return;(forward?this._prevOptionsStack:this._nextOptionsStack).push(this._currentOption);this._isNavigationButton=true;this.selectResource(newOption.value);delete this._isNavigationButton;this._updateButtonsEnabledState();},_onStateRefreshClick:function()
+{this._traceLogPlayer.clearResourceStates();},_updateButtonsEnabledState:function()
+{this._prevButton.setEnabled(this._prevOptionsStack.length>0);this._nextButton.setEnabled(this._nextOptionsStack.length>0);},_updateCurrentOption:function()
+{const maxStackSize=256;var selectedOption=this._resourceSelector.selectedOption();if(this._currentOption===selectedOption)
+return;if(!this._isNavigationButton){this._prevOptionsStack.push(this._currentOption);this._nextOptionsStack=[];if(this._prevOptionsStack.length>maxStackSize)
+this._prevOptionsStack.shift();this._updateButtonsEnabledState();}
+this._currentOption=selectedOption;},_collectResourcesFromTraceLog:function(traceLog)
+{var collectedResources=[];var calls=traceLog.calls;for(var i=0,n=calls.length;i<n;++i){var call=calls[i];var args=call.arguments||[];for(var j=0;j<args.length;++j)
+this._collectResourceFromCallArgument(args[j],collectedResources);this._collectResourceFromCallArgument(call.result,collectedResources);this._collectResourceFromCallArgument(call.value,collectedResources);}
+var contexts=traceLog.contexts;for(var i=0,n=contexts.length;i<n;++i)
+this._collectResourceFromCallArgument(contexts[i],collectedResources);this._addCollectedResourcesToSelector(collectedResources);},_collectResourcesFromResourceState:function(resourceState)
+{var collectedResources=[];this._collectResourceFromResourceStateDescriptors(resourceState.descriptors,collectedResources);this._addCollectedResourcesToSelector(collectedResources);},_collectResourceFromResourceStateDescriptors:function(descriptors,output)
+{if(!descriptors)
+return;for(var i=0,n=descriptors.length;i<n;++i){var descriptor=descriptors[i];this._collectResourceFromCallArgument(descriptor.value,output);this._collectResourceFromResourceStateDescriptors(descriptor.values,output);}},_collectResourceFromCallArgument:function(argument,output)
+{if(!argument)
+return;var resourceId=argument.resourceId;if(!resourceId||this._resourceIdToDescription[resourceId])
+return;this._resourceIdToDescription[resourceId]=argument.description;output.push(argument);},_addCollectedResourcesToSelector:function(collectedResources)
+{if(!collectedResources.length)
+return;function comparator(arg1,arg2)
+{var a=arg1.description;var b=arg2.description;return String.naturalOrderComparator(a,b);}
+collectedResources.sort(comparator);var selectElement=this._resourceSelector.selectElement();var currentOption=selectElement.firstChild;currentOption=currentOption.nextSibling;for(var i=0,n=collectedResources.length;i<n;++i){var argument=collectedResources[i];while(currentOption&&String.naturalOrderComparator(currentOption.text,argument.description)<0)
+currentOption=currentOption.nextSibling;var option=this._resourceSelector.createOption(argument.description,WebInspector.UIString("Show state of this resource."),argument.resourceId);if(currentOption)
+selectElement.insertBefore(option,currentOption);}},_onReplayResourceChanged:function()
+{this._updateCurrentOption();var selectedResourceId=this._resourceSelector.selectedOption().value;function didReceiveResourceState(resourceState)
+{if(selectedResourceId!==this._resourceSelector.selectedOption().value)
+return;this._showResourceState(resourceState);}
+this._traceLogPlayer.getResourceState(selectedResourceId,didReceiveResourceState.bind(this));},_onCanvasTraceLogReceived:function(event)
+{var traceLog=(event.data);console.assert(traceLog);this._collectResourcesFromTraceLog(traceLog);},_onCanvasResourceStateReceived:function(event)
+{var resourceState=(event.data);console.assert(resourceState);this._collectResourcesFromResourceState(resourceState);},_showResourceState:function(resourceState)
+{this._saveExpandedState();this._saveScrollState();var rootNode=this._stateGrid.rootNode();if(!resourceState){this._currentResourceId=null;this._updateDataGridHighlights([]);rootNode.removeChildren();return;}
+var nodesToHighlight=[];var nameToOldGridNodes={};function populateNameToNodesMap(map,node)
+{if(!node)
+return;for(var i=0,child;child=node.children[i];++i){var item={node:child,children:{}};map[child.name]=item;populateNameToNodesMap(item.children,child);}}
+populateNameToNodesMap(nameToOldGridNodes,rootNode);rootNode.removeChildren();function comparator(d1,d2)
+{var hasChildren1=!!d1.values;var hasChildren2=!!d2.values;if(hasChildren1!==hasChildren2)
+return hasChildren1?1:-1;return String.naturalOrderComparator(d1.name,d2.name);}
+function appendResourceStateDescriptors(descriptors,parent,nameToOldChildren)
+{descriptors=descriptors||[];descriptors.sort(comparator);var oldChildren=nameToOldChildren||{};for(var i=0,n=descriptors.length;i<n;++i){var descriptor=descriptors[i];var childNode=this._createDataGridNode(descriptor);parent.appendChild(childNode);var oldChildrenItem=oldChildren[childNode.name]||{};var oldChildNode=oldChildrenItem.node;if(!oldChildNode||oldChildNode.element.textContent!==childNode.element.textContent)
+nodesToHighlight.push(childNode);appendResourceStateDescriptors.call(this,descriptor.values,childNode,oldChildrenItem.children);}}
+appendResourceStateDescriptors.call(this,resourceState.descriptors,rootNode,nameToOldGridNodes);var shouldHighlightChanges=(this._resourceKindId(this._currentResourceId)===this._resourceKindId(resourceState.id));this._currentResourceId=resourceState.id;this._restoreExpandedState();this._updateDataGridHighlights(shouldHighlightChanges?nodesToHighlight:[]);this._restoreScrollState();},_updateDataGridHighlights:function(nodes)
+{for(var i=0,n=this._highlightedGridNodes.length;i<n;++i)
+this._highlightedGridNodes[i].element.classList.remove("canvas-grid-node-highlighted");this._highlightedGridNodes=nodes;for(var i=0,n=this._highlightedGridNodes.length;i<n;++i){var node=this._highlightedGridNodes[i];WebInspector.runCSSAnimationOnce(node.element,"canvas-grid-node-highlighted");node.reveal();}},_resourceKindId:function(resourceId)
+{var description=(resourceId&&this._resourceIdToDescription[resourceId])||"";return description.replace(/\d+/g,"");},_forEachGridNode:function(callback)
+{function processRecursively(node,key)
+{for(var i=0,child;child=node.children[i];++i){var childKey=key+"#"+child.name;callback(child,childKey);processRecursively(child,childKey);}}
+processRecursively(this._stateGrid.rootNode(),"");},_saveExpandedState:function()
+{if(!this._currentResourceId)
+return;var expandedState={};var key=this._resourceKindId(this._currentResourceId);this._gridNodesExpandedState[key]=expandedState;function callback(node,key)
+{if(node.expanded)
+expandedState[key]=true;}
+this._forEachGridNode(callback);},_restoreExpandedState:function()
+{if(!this._currentResourceId)
+return;var key=this._resourceKindId(this._currentResourceId);var expandedState=this._gridNodesExpandedState[key];if(!expandedState)
+return;function callback(node,key)
+{if(expandedState[key])
+node.expand();}
+this._forEachGridNode(callback);},_saveScrollState:function()
+{if(!this._currentResourceId)
+return;var key=this._resourceKindId(this._currentResourceId);this._gridScrollPositions[key]={scrollTop:this._stateGrid.scrollContainer.scrollTop,scrollLeft:this._stateGrid.scrollContainer.scrollLeft};},_restoreScrollState:function()
+{if(!this._currentResourceId)
+return;var key=this._resourceKindId(this._currentResourceId);var scrollState=this._gridScrollPositions[key];if(!scrollState)
+return;this._stateGrid.scrollContainer.scrollTop=scrollState.scrollTop;this._stateGrid.scrollContainer.scrollLeft=scrollState.scrollLeft;},_createDataGridNode:function(descriptor)
+{var name=descriptor.name;var callArgument=descriptor.value;var valueElement=callArgument?WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(callArgument):"";var nameElement=name;if(typeof descriptor.enumValueForName!=="undefined")
+nameElement=WebInspector.CanvasProfileDataGridHelper.createEnumValueElement(name,+descriptor.enumValueForName);if(descriptor.isArray&&descriptor.values){if(typeof nameElement==="string")
+nameElement+="["+descriptor.values.length+"]";else{var element=document.createElement("span");element.appendChild(nameElement);element.createTextChild("["+descriptor.values.length+"]");nameElement=element;}}
+var data={};data[0]=nameElement;data[1]=valueElement;var node=new WebInspector.DataGridNode(data);node.selectable=false;node.name=name;return node;},__proto__:WebInspector.VBox.prototype};WebInspector.PieChart=function(totalValue,formatter)
+{const shadowOffset=0.04;this.element=document.createElementWithClass("div","pie-chart");var svg=this._createSVGChild(this.element,"svg");svg.setAttribute("width","100%");svg.setAttribute("height",(100*(1+shadowOffset))+"%");this._group=this._createSVGChild(svg,"g");var shadow=this._createSVGChild(this._group,"circle");shadow.setAttribute("r",1);shadow.setAttribute("cy",shadowOffset);shadow.setAttribute("fill","hsl(0,0%,70%)");var background=this._createSVGChild(this._group,"circle");background.setAttribute("r",1);background.setAttribute("fill","hsl(0,0%,92%)");if(totalValue){var totalString=formatter?formatter(totalValue):totalValue;this._totalElement=this.element.createChild("div","pie-chart-foreground");this._totalElement.textContent=totalString;this._totalValue=totalValue;}
+this._lastAngle=-Math.PI/2;this.setSize(100);}
+WebInspector.PieChart.prototype={setTotal:function(value)
+{this._totalValue=value;},setSize:function(value)
+{this._group.setAttribute("transform","scale("+(value/2)+") translate(1,1)");var size=value+"px";this.element.style.width=size;this.element.style.height=size;if(this._totalElement)
+this._totalElement.style.lineHeight=size;},addSlice:function(value,color)
+{var sliceAngle=value/this._totalValue*2*Math.PI;if(!isFinite(sliceAngle))
+return;sliceAngle=Math.min(sliceAngle,2*Math.PI*0.9999);var path=this._createSVGChild(this._group,"path");var x1=Math.cos(this._lastAngle);var y1=Math.sin(this._lastAngle);this._lastAngle+=sliceAngle;var x2=Math.cos(this._lastAngle);var y2=Math.sin(this._lastAngle);var largeArc=sliceAngle>Math.PI?1:0;path.setAttribute("d","M0,0 L"+x1+","+y1+" A1,1,0,"+largeArc+",1,"+x2+","+y2+" Z");path.setAttribute("fill",color);},_createSVGChild:function(parent,childType)
+{var child=document.createElementNS("http://www.w3.org/2000/svg",childType);parent.appendChild(child);return child;}};WebInspector.ProfileTypeRegistry.instance=new WebInspector.ProfileTypeRegistry();
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ResourcesPanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ResourcesPanel.js
new file mode 100644 (file)
index 0000000..7165915
--- /dev/null
@@ -0,0 +1,592 @@
+WebInspector.ApplicationCacheItemsView=function(model,frameId)
+{WebInspector.VBox.call(this);this._model=model;this.element.classList.add("storage-view");this.element.classList.add("table");this.deleteButton=new WebInspector.StatusBarButton(WebInspector.UIString("Delete"),"delete-storage-status-bar-item");this.deleteButton.visible=false;this.deleteButton.addEventListener("click",this._deleteButtonClicked,this);this.connectivityIcon=document.createElement("div");this.connectivityMessage=document.createElement("span");this.connectivityMessage.className="storage-application-cache-connectivity";this.connectivityMessage.textContent="";this.divider=document.createElement("span");this.divider.className="status-bar-item status-bar-divider";this.statusIcon=document.createElement("div");this.statusMessage=document.createElement("span");this.statusMessage.className="storage-application-cache-status";this.statusMessage.textContent="";this._frameId=frameId;this._emptyView=new WebInspector.EmptyView(WebInspector.UIString("No Application Cache information available."));this._emptyView.show(this.element);this._markDirty();var status=this._model.frameManifestStatus(frameId);this.updateStatus(status);this.updateNetworkState(this._model.onLine);this.deleteButton.element.style.display="none";}
+WebInspector.ApplicationCacheItemsView.prototype={get statusBarItems()
+{return[this.deleteButton.element,this.connectivityIcon,this.connectivityMessage,this.divider,this.statusIcon,this.statusMessage];},wasShown:function()
+{this._maybeUpdate();},willHide:function()
+{this.deleteButton.visible=false;},_maybeUpdate:function()
+{if(!this.isShowing()||!this._viewDirty)
+return;this._update();this._viewDirty=false;},_markDirty:function()
+{this._viewDirty=true;},updateStatus:function(status)
+{var oldStatus=this._status;this._status=status;var statusInformation={};statusInformation[applicationCache.UNCACHED]={className:"red-ball",text:"UNCACHED"};statusInformation[applicationCache.IDLE]={className:"green-ball",text:"IDLE"};statusInformation[applicationCache.CHECKING]={className:"orange-ball",text:"CHECKING"};statusInformation[applicationCache.DOWNLOADING]={className:"orange-ball",text:"DOWNLOADING"};statusInformation[applicationCache.UPDATEREADY]={className:"green-ball",text:"UPDATEREADY"};statusInformation[applicationCache.OBSOLETE]={className:"red-ball",text:"OBSOLETE"};var info=statusInformation[status]||statusInformation[applicationCache.UNCACHED];this.statusIcon.className="storage-application-cache-status-icon "+info.className;this.statusMessage.textContent=info.text;if(this.isShowing()&&this._status===applicationCache.IDLE&&(oldStatus===applicationCache.UPDATEREADY||!this._resources))
+this._markDirty();this._maybeUpdate();},updateNetworkState:function(isNowOnline)
+{if(isNowOnline){this.connectivityIcon.className="storage-application-cache-connectivity-icon green-ball";this.connectivityMessage.textContent=WebInspector.UIString("Online");}else{this.connectivityIcon.className="storage-application-cache-connectivity-icon red-ball";this.connectivityMessage.textContent=WebInspector.UIString("Offline");}},_update:function()
+{this._model.requestApplicationCache(this._frameId,this._updateCallback.bind(this));},_updateCallback:function(applicationCache)
+{if(!applicationCache||!applicationCache.manifestURL){delete this._manifest;delete this._creationTime;delete this._updateTime;delete this._size;delete this._resources;this._emptyView.show(this.element);this.deleteButton.visible=false;if(this._dataGrid)
+this._dataGrid.element.classList.add("hidden");return;}
+this._manifest=applicationCache.manifestURL;this._creationTime=applicationCache.creationTime;this._updateTime=applicationCache.updateTime;this._size=applicationCache.size;this._resources=applicationCache.resources;if(!this._dataGrid)
+this._createDataGrid();this._populateDataGrid();this._dataGrid.autoSizeColumns(20,80);this._dataGrid.element.classList.remove("hidden");this._emptyView.detach();this.deleteButton.visible=true;},_createDataGrid:function()
+{var columns=[{title:WebInspector.UIString("Resource"),sort:WebInspector.DataGrid.Order.Ascending,sortable:true},{title:WebInspector.UIString("Type"),sortable:true},{title:WebInspector.UIString("Size"),align:WebInspector.DataGrid.Align.Right,sortable:true}];this._dataGrid=new WebInspector.DataGrid(columns);this._dataGrid.show(this.element);this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged,this._populateDataGrid,this);},_populateDataGrid:function()
+{var selectedResource=this._dataGrid.selectedNode?this._dataGrid.selectedNode.resource:null;var sortDirection=this._dataGrid.isSortOrderAscending()?1:-1;function numberCompare(field,resource1,resource2)
+{return sortDirection*(resource1[field]-resource2[field]);}
+function localeCompare(field,resource1,resource2)
+{return sortDirection*(resource1[field]+"").localeCompare(resource2[field]+"")}
+var comparator;switch(parseInt(this._dataGrid.sortColumnIdentifier(),10)){case 0:comparator=localeCompare.bind(null,"name");break;case 1:comparator=localeCompare.bind(null,"type");break;case 2:comparator=numberCompare.bind(null,"size");break;default:localeCompare.bind(null,"resource");}
+this._resources.sort(comparator);this._dataGrid.rootNode().removeChildren();var nodeToSelect;for(var i=0;i<this._resources.length;++i){var data={};var resource=this._resources[i];data[0]=resource.url;data[1]=resource.type;data[2]=Number.bytesToString(resource.size);var node=new WebInspector.DataGridNode(data);node.resource=resource;node.selectable=true;this._dataGrid.rootNode().appendChild(node);if(resource===selectedResource){nodeToSelect=node;nodeToSelect.selected=true;}}
+if(!nodeToSelect&&this._dataGrid.rootNode().children.length)
+this._dataGrid.rootNode().children[0].selected=true;},_deleteButtonClicked:function(event)
+{if(!this._dataGrid||!this._dataGrid.selectedNode)
+return;this._deleteCallback(this._dataGrid.selectedNode);},_deleteCallback:function(node)
+{},__proto__:WebInspector.VBox.prototype};WebInspector.DOMStorageItemsView=function(domStorage)
+{WebInspector.VBox.call(this);this.domStorage=domStorage;this.element.classList.add("storage-view");this.element.classList.add("table");this.deleteButton=new WebInspector.StatusBarButton(WebInspector.UIString("Delete"),"delete-storage-status-bar-item");this.deleteButton.visible=false;this.deleteButton.addEventListener("click",this._deleteButtonClicked,this);this.refreshButton=new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"),"refresh-storage-status-bar-item");this.refreshButton.addEventListener("click",this._refreshButtonClicked,this);this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemsCleared,this._domStorageItemsCleared,this);this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemRemoved,this._domStorageItemRemoved,this);this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemAdded,this._domStorageItemAdded,this);this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemUpdated,this._domStorageItemUpdated,this);}
+WebInspector.DOMStorageItemsView.prototype={get statusBarItems()
+{return[this.refreshButton.element,this.deleteButton.element];},wasShown:function()
+{this._update();},willHide:function()
+{this.deleteButton.visible=false;},_domStorageItemsCleared:function(event)
+{if(!this.isShowing()||!this._dataGrid)
+return;this._dataGrid.rootNode().removeChildren();this._dataGrid.addCreationNode(false);this.deleteButton.visible=false;event.consume(true);},_domStorageItemRemoved:function(event)
+{if(!this.isShowing()||!this._dataGrid)
+return;var storageData=event.data;var rootNode=this._dataGrid.rootNode();var children=rootNode.children;event.consume(true);for(var i=0;i<children.length;++i){var childNode=children[i];if(childNode.data.key===storageData.key){rootNode.removeChild(childNode);this.deleteButton.visible=(children.length>1);return;}}},_domStorageItemAdded:function(event)
+{if(!this.isShowing()||!this._dataGrid)
+return;var storageData=event.data;var rootNode=this._dataGrid.rootNode();var children=rootNode.children;event.consume(true);this.deleteButton.visible=true;for(var i=0;i<children.length;++i)
+if(children[i].data.key===storageData.key)
+return;var childNode=new WebInspector.DataGridNode({key:storageData.key,value:storageData.value},false);rootNode.insertChild(childNode,children.length-1);},_domStorageItemUpdated:function(event)
+{if(!this.isShowing()||!this._dataGrid)
+return;var storageData=event.data;var rootNode=this._dataGrid.rootNode();var children=rootNode.children;event.consume(true);var keyFound=false;for(var i=0;i<children.length;++i){var childNode=children[i];if(childNode.data.key===storageData.key){if(keyFound){rootNode.removeChild(childNode);return;}
+keyFound=true;if(childNode.data.value!==storageData.value){childNode.data.value=storageData.value;childNode.refresh();childNode.select();childNode.reveal();}
+this.deleteButton.visible=true;}}},_update:function()
+{this.detachChildViews();this.domStorage.getItems(this._showDOMStorageItems.bind(this));},_showDOMStorageItems:function(error,items)
+{if(error)
+return;this._dataGrid=this._dataGridForDOMStorageItems(items);this._dataGrid.show(this.element);this.deleteButton.visible=(this._dataGrid.rootNode().children.length>1);},_dataGridForDOMStorageItems:function(items)
+{var columns=[{id:"key",title:WebInspector.UIString("Key"),editable:true,weight:50},{id:"value",title:WebInspector.UIString("Value"),editable:true,weight:50}];var nodes=[];var keys=[];var length=items.length;for(var i=0;i<items.length;i++){var key=items[i][0];var value=items[i][1];var node=new WebInspector.DataGridNode({key:key,value:value},false);node.selectable=true;nodes.push(node);keys.push(key);}
+var dataGrid=new WebInspector.DataGrid(columns,this._editingCallback.bind(this),this._deleteCallback.bind(this));dataGrid.setName("DOMStorageItemsView");length=nodes.length;for(var i=0;i<length;++i)
+dataGrid.rootNode().appendChild(nodes[i]);dataGrid.addCreationNode(false);if(length>0)
+nodes[0].selected=true;return dataGrid;},_deleteButtonClicked:function(event)
+{if(!this._dataGrid||!this._dataGrid.selectedNode)
+return;this._deleteCallback(this._dataGrid.selectedNode);this._dataGrid.changeNodeAfterDeletion();},_refreshButtonClicked:function(event)
+{this._update();},_editingCallback:function(editingNode,columnIdentifier,oldText,newText)
+{var domStorage=this.domStorage;if("key"===columnIdentifier){if(typeof oldText==="string")
+domStorage.removeItem(oldText);domStorage.setItem(newText,editingNode.data.value||'');this._removeDupes(editingNode);}else
+domStorage.setItem(editingNode.data.key||'',newText);},_removeDupes:function(masterNode)
+{var rootNode=this._dataGrid.rootNode();var children=rootNode.children;for(var i=children.length-1;i>=0;--i){var childNode=children[i];if((childNode.data.key===masterNode.data.key)&&(masterNode!==childNode))
+rootNode.removeChild(childNode);}},_deleteCallback:function(node)
+{if(!node||node.isCreationNode)
+return;if(this.domStorage)
+this.domStorage.removeItem(node.data.key);},__proto__:WebInspector.VBox.prototype};WebInspector.DatabaseQueryView=function(database)
+{WebInspector.VBox.call(this);this.database=database;this.element.classList.add("storage-view");this.element.classList.add("query");this.element.classList.add("monospace");this.element.addEventListener("selectstart",this._selectStart.bind(this),false);this._promptElement=document.createElement("div");this._promptElement.className="database-query-prompt";this._promptElement.appendChild(document.createElement("br"));this._promptElement.addEventListener("keydown",this._promptKeyDown.bind(this),true);this.element.appendChild(this._promptElement);this.prompt=new WebInspector.TextPromptWithHistory(this.completions.bind(this)," ");this.prompt.attach(this._promptElement);this.element.addEventListener("click",this._messagesClicked.bind(this),true);}
+WebInspector.DatabaseQueryView.Events={SchemaUpdated:"SchemaUpdated"}
+WebInspector.DatabaseQueryView.prototype={_messagesClicked:function()
+{if(!this.prompt.isCaretInsidePrompt()&&window.getSelection().isCollapsed)
+this.prompt.moveCaretToEndOfPrompt();},completions:function(proxyElement,wordRange,force,completionsReadyCallback)
+{var prefix=wordRange.toString().toLowerCase();if(!prefix)
+return;var results=[];function accumulateMatches(textArray)
+{for(var i=0;i<textArray.length;++i){var text=textArray[i].toLowerCase();if(text.length<prefix.length)
+continue;if(!text.startsWith(prefix))
+continue;results.push(textArray[i]);}}
+function tableNamesCallback(tableNames)
+{accumulateMatches(tableNames.map(function(name){return name+" "}));accumulateMatches(["SELECT ","FROM ","WHERE ","LIMIT ","DELETE FROM ","CREATE ","DROP ","TABLE ","INDEX ","UPDATE ","INSERT INTO ","VALUES ("]);completionsReadyCallback(results);}
+this.database.getTableNames(tableNamesCallback);},_selectStart:function(event)
+{if(this._selectionTimeout)
+clearTimeout(this._selectionTimeout);this.prompt.clearAutoComplete();function moveBackIfOutside()
+{delete this._selectionTimeout;if(!this.prompt.isCaretInsidePrompt()&&window.getSelection().isCollapsed)
+this.prompt.moveCaretToEndOfPrompt();this.prompt.autoCompleteSoon();}
+this._selectionTimeout=setTimeout(moveBackIfOutside.bind(this),100);},_promptKeyDown:function(event)
+{if(isEnterKey(event)){this._enterKeyPressed(event);return;}},_enterKeyPressed:function(event)
+{event.consume(true);this.prompt.clearAutoComplete(true);var query=this.prompt.text;if(!query.length)
+return;this.prompt.pushHistoryItem(query);this.prompt.text="";this.database.executeSql(query,this._queryFinished.bind(this,query),this._queryError.bind(this,query));},_queryFinished:function(query,columnNames,values)
+{var dataGrid=WebInspector.DataGrid.createSortableDataGrid(columnNames,values);var trimmedQuery=query.trim();if(dataGrid){dataGrid.renderInline();this._appendViewQueryResult(trimmedQuery,dataGrid);dataGrid.autoSizeColumns(5);}
+if(trimmedQuery.match(/^create /i)||trimmedQuery.match(/^drop table /i))
+this.dispatchEventToListeners(WebInspector.DatabaseQueryView.Events.SchemaUpdated,this.database);},_queryError:function(query,errorMessage)
+{this._appendErrorQueryResult(query,errorMessage);},_appendViewQueryResult:function(query,view)
+{var resultElement=this._appendQueryResult(query);view.show(resultElement);this._promptElement.scrollIntoView(false);},_appendErrorQueryResult:function(query,errorText)
+{var resultElement=this._appendQueryResult(query);resultElement.classList.add("error")
+resultElement.textContent=errorText;this._promptElement.scrollIntoView(false);},_appendQueryResult:function(query)
+{var element=document.createElement("div");element.className="database-user-query";this.element.insertBefore(element,this.prompt.proxyElement);var commandTextElement=document.createElement("span");commandTextElement.className="database-query-text";commandTextElement.textContent=query;element.appendChild(commandTextElement);var resultElement=document.createElement("div");resultElement.className="database-query-result";element.appendChild(resultElement);return resultElement;},__proto__:WebInspector.VBox.prototype};WebInspector.DatabaseTableView=function(database,tableName)
+{WebInspector.VBox.call(this);this.database=database;this.tableName=tableName;this.element.classList.add("storage-view");this.element.classList.add("table");this.refreshButton=new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"),"refresh-storage-status-bar-item");this.refreshButton.addEventListener("click",this._refreshButtonClicked,this);}
+WebInspector.DatabaseTableView.prototype={wasShown:function()
+{this.update();},get statusBarItems()
+{return[this.refreshButton.element];},_escapeTableName:function(tableName)
+{return tableName.replace(/\"/g,"\"\"");},update:function()
+{this.database.executeSql("SELECT * FROM \""+this._escapeTableName(this.tableName)+"\"",this._queryFinished.bind(this),this._queryError.bind(this));},_queryFinished:function(columnNames,values)
+{this.detachChildViews();this.element.removeChildren();var dataGrid=WebInspector.DataGrid.createSortableDataGrid(columnNames,values);if(!dataGrid){this._emptyView=new WebInspector.EmptyView(WebInspector.UIString("The “%s”\ntable is empty.",this.tableName));this._emptyView.show(this.element);return;}
+dataGrid.show(this.element);dataGrid.autoSizeColumns(5);},_queryError:function(error)
+{this.detachChildViews();this.element.removeChildren();var errorMsgElement=document.createElement("div");errorMsgElement.className="storage-table-error";errorMsgElement.textContent=WebInspector.UIString("An error occurred trying to\nread the “%s” table.",this.tableName);this.element.appendChild(errorMsgElement);},_refreshButtonClicked:function(event)
+{this.update();},__proto__:WebInspector.VBox.prototype};WebInspector.DirectoryContentView=function()
+{const indexes=WebInspector.DirectoryContentView.columnIndexes;var columns=[{id:indexes.Name,title:WebInspector.UIString("Name"),sortable:true,sort:WebInspector.DataGrid.Order.Ascending,width:"20%"},{id:indexes.URL,title:WebInspector.UIString("URL"),sortable:true,width:"20%"},{id:indexes.Type,title:WebInspector.UIString("Type"),sortable:true,width:"15%"},{id:indexes.Size,title:WebInspector.UIString("Size"),sortable:true,width:"10%"},{id:indexes.ModificationTime,title:WebInspector.UIString("Modification Time"),sortable:true,width:"25%"}];WebInspector.DataGrid.call(this,columns);this.addEventListener(WebInspector.DataGrid.Events.SortingChanged,this._sort,this);}
+WebInspector.DirectoryContentView.columnIndexes={Name:"0",URL:"1",Type:"2",Size:"3",ModificationTime:"4"}
+WebInspector.DirectoryContentView.prototype={showEntries:function(entries)
+{const indexes=WebInspector.DirectoryContentView.columnIndexes;this.rootNode().removeChildren();for(var i=0;i<entries.length;++i)
+this.rootNode().appendChild(new WebInspector.DirectoryContentView.Node(entries[i]));},_sort:function()
+{var column=(this.sortColumnIdentifier());this.sortNodes(WebInspector.DirectoryContentView.Node.comparator(column,!this.isSortOrderAscending()),false);},__proto__:WebInspector.DataGrid.prototype}
+WebInspector.DirectoryContentView.Node=function(entry)
+{const indexes=WebInspector.DirectoryContentView.columnIndexes;var data={};data[indexes.Name]=entry.name;data[indexes.URL]=entry.url;data[indexes.Type]=entry.isDirectory?WebInspector.UIString("Directory"):entry.mimeType;data[indexes.Size]="";data[indexes.ModificationTime]="";WebInspector.DataGridNode.call(this,data);this._entry=entry;this._metadata=null;this._entry.requestMetadata(this._metadataReceived.bind(this));}
+WebInspector.DirectoryContentView.Node.comparator=function(column,reverse)
+{var reverseFactor=reverse?-1:1;const indexes=WebInspector.DirectoryContentView.columnIndexes;switch(column){case indexes.Name:case indexes.URL:return function(x,y)
+{return isDirectoryCompare(x,y)||nameCompare(x,y);};case indexes.Type:return function(x,y)
+{return isDirectoryCompare(x,y)||typeCompare(x,y)||nameCompare(x,y);};case indexes.Size:return function(x,y)
+{return isDirectoryCompare(x,y)||sizeCompare(x,y)||nameCompare(x,y);};case indexes.ModificationTime:return function(x,y)
+{return isDirectoryCompare(x,y)||modificationTimeCompare(x,y)||nameCompare(x,y);};}
+function isDirectoryCompare(x,y)
+{if(x._entry.isDirectory!=y._entry.isDirectory)
+return y._entry.isDirectory?1:-1;return 0;}
+function nameCompare(x,y)
+{return reverseFactor*x._entry.name.compareTo(y._entry.name);}
+function typeCompare(x,y)
+{return reverseFactor*(x._entry.mimeType||"").compareTo(y._entry.mimeType||"");}
+function sizeCompare(x,y)
+{return reverseFactor*((x._metadata?x._metadata.size:0)-(y._metadata?y._metadata.size:0));}
+function modificationTimeCompare(x,y)
+{return reverseFactor*((x._metadata?x._metadata.modificationTime:0)-(y._metadata?y._metadata.modificationTime:0));}}
+WebInspector.DirectoryContentView.Node.prototype={_metadataReceived:function(errorCode,metadata)
+{const indexes=WebInspector.DirectoryContentView.columnIndexes;if(errorCode!==0)
+return;this._metadata=metadata;var data=this.data;if(this._entry.isDirectory)
+data[indexes.Size]=WebInspector.UIString("-");else
+data[indexes.Size]=Number.bytesToString(metadata.size);data[indexes.ModificationTime]=new Date(metadata.modificationTime).toGMTString();this.data=data;},__proto__:WebInspector.DataGridNode.prototype};WebInspector.IDBDatabaseView=function(database)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("indexedDBViews.css");this.element.classList.add("indexed-db-database-view");this._headersListElement=this.element.createChild("ol","outline-disclosure");this._headersTreeOutline=new TreeOutline(this._headersListElement);this._headersTreeOutline.expandTreeElementsWhenArrowing=true;this._securityOriginTreeElement=new TreeElement("",null,false);this._securityOriginTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._securityOriginTreeElement);this._nameTreeElement=new TreeElement("",null,false);this._nameTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._nameTreeElement);this._intVersionTreeElement=new TreeElement("",null,false);this._intVersionTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._intVersionTreeElement);this._stringVersionTreeElement=new TreeElement("",null,false);this._stringVersionTreeElement.selectable=false;this._headersTreeOutline.appendChild(this._stringVersionTreeElement);this.update(database);}
+WebInspector.IDBDatabaseView.prototype={_formatHeader:function(name,value)
+{var fragment=document.createDocumentFragment();fragment.createChild("div","attribute-name").textContent=name+":";fragment.createChild("div","attribute-value source-code").textContent=value;return fragment;},_refreshDatabase:function()
+{this._securityOriginTreeElement.title=this._formatHeader(WebInspector.UIString("Security origin"),this._database.databaseId.securityOrigin);this._nameTreeElement.title=this._formatHeader(WebInspector.UIString("Name"),this._database.databaseId.name);this._stringVersionTreeElement.title=this._formatHeader(WebInspector.UIString("String Version"),this._database.version);this._intVersionTreeElement.title=this._formatHeader(WebInspector.UIString("Integer Version"),this._database.intVersion);},update:function(database)
+{this._database=database;this._refreshDatabase();},__proto__:WebInspector.VBox.prototype}
+WebInspector.IDBDataView=function(model,databaseId,objectStore,index)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("indexedDBViews.css");this._model=model;this._databaseId=databaseId;this._isIndex=!!index;this.element.classList.add("indexed-db-data-view");var editorToolbar=this._createEditorToolbar();this.element.appendChild(editorToolbar);this._dataGridContainer=this.element.createChild("div","fill");this._dataGridContainer.classList.add("data-grid-container");this._refreshButton=new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"),"refresh-storage-status-bar-item");this._refreshButton.addEventListener("click",this._refreshButtonClicked,this);this._clearButton=new WebInspector.StatusBarButton(WebInspector.UIString("Clear object store"),"clear-storage-status-bar-item");this._clearButton.addEventListener("click",this._clearButtonClicked,this);this._pageSize=50;this._skipCount=0;this.update(objectStore,index);this._entries=[];}
+WebInspector.IDBDataView.prototype={_createDataGrid:function()
+{var keyPath=this._isIndex?this._index.keyPath:this._objectStore.keyPath;var columns=[];columns.push({id:"number",title:WebInspector.UIString("#"),width:"50px"});columns.push({id:"key",titleDOMFragment:this._keyColumnHeaderFragment(WebInspector.UIString("Key"),keyPath)});if(this._isIndex)
+columns.push({id:"primaryKey",titleDOMFragment:this._keyColumnHeaderFragment(WebInspector.UIString("Primary key"),this._objectStore.keyPath)});columns.push({id:"value",title:WebInspector.UIString("Value")});var dataGrid=new WebInspector.DataGrid(columns);return dataGrid;},_keyColumnHeaderFragment:function(prefix,keyPath)
+{var keyColumnHeaderFragment=document.createDocumentFragment();keyColumnHeaderFragment.appendChild(document.createTextNode(prefix));if(keyPath===null)
+return keyColumnHeaderFragment;keyColumnHeaderFragment.appendChild(document.createTextNode(" ("+WebInspector.UIString("Key path: ")));if(keyPath instanceof Array){keyColumnHeaderFragment.appendChild(document.createTextNode("["));for(var i=0;i<keyPath.length;++i){if(i!=0)
+keyColumnHeaderFragment.appendChild(document.createTextNode(", "));keyColumnHeaderFragment.appendChild(this._keyPathStringFragment(keyPath[i]));}
+keyColumnHeaderFragment.appendChild(document.createTextNode("]"));}else{var keyPathString=(keyPath);keyColumnHeaderFragment.appendChild(this._keyPathStringFragment(keyPathString));}
+keyColumnHeaderFragment.appendChild(document.createTextNode(")"));return keyColumnHeaderFragment;},_keyPathStringFragment:function(keyPathString)
+{var keyPathStringFragment=document.createDocumentFragment();keyPathStringFragment.appendChild(document.createTextNode("\""));var keyPathSpan=keyPathStringFragment.createChild("span","source-code console-formatted-string");keyPathSpan.textContent=keyPathString;keyPathStringFragment.appendChild(document.createTextNode("\""));return keyPathStringFragment;},_createEditorToolbar:function()
+{var editorToolbar=document.createElement("div");editorToolbar.classList.add("status-bar");editorToolbar.classList.add("data-view-toolbar");this._pageBackButton=editorToolbar.createChild("button","back-button");this._pageBackButton.classList.add("status-bar-item");this._pageBackButton.title=WebInspector.UIString("Show previous page.");this._pageBackButton.disabled=true;this._pageBackButton.appendChild(document.createElement("img"));this._pageBackButton.addEventListener("click",this._pageBackButtonClicked.bind(this),false);editorToolbar.appendChild(this._pageBackButton);this._pageForwardButton=editorToolbar.createChild("button","forward-button");this._pageForwardButton.classList.add("status-bar-item");this._pageForwardButton.title=WebInspector.UIString("Show next page.");this._pageForwardButton.disabled=true;this._pageForwardButton.appendChild(document.createElement("img"));this._pageForwardButton.addEventListener("click",this._pageForwardButtonClicked.bind(this),false);editorToolbar.appendChild(this._pageForwardButton);this._keyInputElement=editorToolbar.createChild("input","key-input");this._keyInputElement.placeholder=WebInspector.UIString("Start from key");this._keyInputElement.addEventListener("paste",this._keyInputChanged.bind(this));this._keyInputElement.addEventListener("cut",this._keyInputChanged.bind(this));this._keyInputElement.addEventListener("keypress",this._keyInputChanged.bind(this));this._keyInputElement.addEventListener("keydown",this._keyInputChanged.bind(this));return editorToolbar;},_pageBackButtonClicked:function()
+{this._skipCount=Math.max(0,this._skipCount-this._pageSize);this._updateData(false);},_pageForwardButtonClicked:function()
+{this._skipCount=this._skipCount+this._pageSize;this._updateData(false);},_keyInputChanged:function()
+{window.setTimeout(this._updateData.bind(this,false),0);},update:function(objectStore,index)
+{this._objectStore=objectStore;this._index=index;if(this._dataGrid)
+this._dataGrid.detach();this._dataGrid=this._createDataGrid();this._dataGrid.show(this._dataGridContainer);this._skipCount=0;this._updateData(true);},_parseKey:function(keyString)
+{var result;try{result=JSON.parse(keyString);}catch(e){result=keyString;}
+return result;},_updateData:function(force)
+{var key=this._parseKey(this._keyInputElement.value);var pageSize=this._pageSize;var skipCount=this._skipCount;this._refreshButton.setEnabled(false);this._clearButton.setEnabled(!this._isIndex);if(!force&&this._lastKey===key&&this._lastPageSize===pageSize&&this._lastSkipCount===skipCount)
+return;if(this._lastKey!==key||this._lastPageSize!==pageSize){skipCount=0;this._skipCount=0;}
+this._lastKey=key;this._lastPageSize=pageSize;this._lastSkipCount=skipCount;function callback(entries,hasMore)
+{this._refreshButton.setEnabled(true);this.clear();this._entries=entries;for(var i=0;i<entries.length;++i){var data={};data["number"]=i+skipCount;data["key"]=entries[i].key;data["primaryKey"]=entries[i].primaryKey;data["value"]=entries[i].value;var primaryKey=JSON.stringify(this._isIndex?entries[i].primaryKey:entries[i].key);var node=new WebInspector.IDBDataGridNode(data);this._dataGrid.rootNode().appendChild(node);}
+this._pageBackButton.disabled=skipCount===0;this._pageForwardButton.disabled=!hasMore;}
+var idbKeyRange=key?window.webkitIDBKeyRange.lowerBound(key):null;if(this._isIndex)
+this._model.loadIndexData(this._databaseId,this._objectStore.name,this._index.name,idbKeyRange,skipCount,pageSize,callback.bind(this));else
+this._model.loadObjectStoreData(this._databaseId,this._objectStore.name,idbKeyRange,skipCount,pageSize,callback.bind(this));},_refreshButtonClicked:function(event)
+{this._updateData(true);},_clearButtonClicked:function(event)
+{function cleared(){this._clearButton.setEnabled(true);this._updateData(true);}
+this._clearButton.setEnabled(false);this._model.clearObjectStore(this._databaseId,this._objectStore.name,cleared.bind(this));},get statusBarItems()
+{return[this._refreshButton.element,this._clearButton.element];},clear:function()
+{this._dataGrid.rootNode().removeChildren();for(var i=0;i<this._entries.length;++i){this._entries[i].key.release();this._entries[i].primaryKey.release();this._entries[i].value.release();}
+this._entries=[];},__proto__:WebInspector.VBox.prototype}
+WebInspector.IDBDataGridNode=function(data)
+{WebInspector.DataGridNode.call(this,data,false);this.selectable=false;}
+WebInspector.IDBDataGridNode.prototype={createCell:function(columnIdentifier)
+{var cell=WebInspector.DataGridNode.prototype.createCell.call(this,columnIdentifier);var value=this.data[columnIdentifier];switch(columnIdentifier){case"value":case"key":case"primaryKey":cell.removeChildren();this._formatValue(cell,value);break;default:}
+return cell;},_formatValue:function(cell,value)
+{var type=value.subtype||value.type;var contents=cell.createChild("div","source-code console-formatted-"+type);switch(type){case"object":case"array":var section=new WebInspector.ObjectPropertiesSection(value,value.description)
+section.editable=false;section.skipProto=true;contents.appendChild(section.element);break;case"string":contents.classList.add("primitive-value");contents.appendChild(document.createTextNode("\""+value.description+"\""));break;default:contents.classList.add("primitive-value");contents.appendChild(document.createTextNode(value.description));}},__proto__:WebInspector.DataGridNode.prototype};WebInspector.FileContentView=function(file)
+{WebInspector.VBox.call(this);this._innerView=(null);this._file=file;this._content=null;}
+WebInspector.FileContentView.prototype={wasShown:function()
+{if(!this._innerView){if(this._file.isTextFile)
+this._innerView=new WebInspector.EmptyView("");else
+this._innerView=new WebInspector.EmptyView(WebInspector.UIString("Binary File"));this.refresh();}
+this._innerView.show(this.element);},_metadataReceived:function(errorCode,metadata)
+{if(errorCode||!metadata)
+return;if(this._content){if(!this._content.updateMetadata(metadata))
+return;var sourceFrame=(this._innerView);this._content.requestContent(sourceFrame.setContent.bind(sourceFrame));}else{this._innerView.detach();this._content=new WebInspector.FileContentView.FileContentProvider(this._file,metadata);var sourceFrame=new WebInspector.SourceFrame(this._content);sourceFrame.setHighlighterType(this._file.resourceType.canonicalMimeType());this._innerView=sourceFrame;this._innerView.show(this.element);}},refresh:function()
+{if(!this._innerView)
+return;if(this._file.isTextFile)
+this._file.requestMetadata(this._metadataReceived.bind(this));},__proto__:WebInspector.VBox.prototype}
+WebInspector.FileContentView.FileContentProvider=function(file,metadata)
+{this._file=file;this._metadata=metadata;}
+WebInspector.FileContentView.FileContentProvider.prototype={contentURL:function()
+{return this._file.url;},contentType:function()
+{return this._file.resourceType;},requestContent:function(callback)
+{var size=(this._metadata.size);this._file.requestFileContent(true,0,size,this._charset||"",this._fileContentReceived.bind(this,callback));},_fileContentReceived:function(callback,errorCode,content,base64Encoded,charset)
+{if(errorCode||!content){callback(null);return;}
+this._charset=charset;callback(content);},searchInContent:function(query,caseSensitive,isRegex,callback)
+{setTimeout(callback.bind(null,[]),0);},updateMetadata:function(metadata)
+{if(this._metadata.modificationTime>=metadata.modificationTime)
+return false;this._metadata=metadata.modificationTime;return true;}};WebInspector.FileSystemView=function(fileSystem)
+{WebInspector.SplitView.call(this,true,false,"fileSystemViewSplitViewState");this.element.classList.add("file-system-view");this.element.classList.add("storage-view");var directoryTreeElement=this.element.createChild("ol","filesystem-directory-tree");this._directoryTree=new TreeOutline(directoryTreeElement);this.sidebarElement().appendChild(directoryTreeElement);this.sidebarElement().classList.add("outline-disclosure","sidebar");var rootItem=new WebInspector.FileSystemView.EntryTreeElement(this,fileSystem.root);rootItem.expanded=true;this._directoryTree.appendChild(rootItem);this._visibleView=null;this._refreshButton=new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"),"refresh-storage-status-bar-item");this._refreshButton.visible=true;this._refreshButton.addEventListener("click",this._refresh,this);this._deleteButton=new WebInspector.StatusBarButton(WebInspector.UIString("Delete"),"delete-storage-status-bar-item");this._deleteButton.visible=true;this._deleteButton.addEventListener("click",this._confirmDelete,this);}
+WebInspector.FileSystemView.prototype={get statusBarItems()
+{return[this._refreshButton.element,this._deleteButton.element];},get visibleView()
+{return this._visibleView;},showView:function(view)
+{if(this._visibleView===view)
+return;if(this._visibleView)
+this._visibleView.detach();this._visibleView=view;view.show(this.mainElement());},_refresh:function()
+{this._directoryTree.children[0].refresh();},_confirmDelete:function()
+{if(confirm(WebInspector.UIString("Are you sure you want to delete the selected entry?")))
+this._delete();},_delete:function()
+{this._directoryTree.selectedTreeElement.deleteEntry();},__proto__:WebInspector.SplitView.prototype}
+WebInspector.FileSystemView.EntryTreeElement=function(fileSystemView,entry)
+{TreeElement.call(this,entry.name,null,entry.isDirectory);this._entry=entry;this._fileSystemView=fileSystemView;}
+WebInspector.FileSystemView.EntryTreeElement.prototype={onattach:function()
+{var selection=this.listItemElement.createChild("div","selection");this.listItemElement.insertBefore(selection,this.listItemElement.firstChild);},onselect:function()
+{if(!this._view){if(this._entry.isDirectory)
+this._view=new WebInspector.DirectoryContentView();else{var file=(this._entry);this._view=new WebInspector.FileContentView(file);}}
+this._fileSystemView.showView(this._view);this.refresh();return false;},onpopulate:function()
+{this.refresh();},_directoryContentReceived:function(errorCode,entries)
+{if(errorCode===FileError.NOT_FOUND_ERR){if(this.parent!==this.treeOutline)
+this.parent.refresh();return;}
+if(errorCode!==0||!entries){console.error("Failed to read directory: "+errorCode);return;}
+entries.sort(WebInspector.FileSystemModel.Entry.compare);if(this._view)
+this._view.showEntries(entries);var oldChildren=this.children.slice(0);var newEntryIndex=0;var oldChildIndex=0;var currentTreeItem=0;while(newEntryIndex<entries.length&&oldChildIndex<oldChildren.length){var newEntry=entries[newEntryIndex];var oldChild=oldChildren[oldChildIndex];var order=newEntry.name.compareTo(oldChild._entry.name);if(order===0){if(oldChild._entry.isDirectory)
+oldChild.shouldRefreshChildren=true;else
+oldChild.refresh();++newEntryIndex;++oldChildIndex;++currentTreeItem;continue;}
+if(order<0){this.insertChild(new WebInspector.FileSystemView.EntryTreeElement(this._fileSystemView,newEntry),currentTreeItem);++newEntryIndex;++currentTreeItem;continue;}
+this.removeChildAtIndex(currentTreeItem);++oldChildIndex;}
+for(;newEntryIndex<entries.length;++newEntryIndex)
+this.appendChild(new WebInspector.FileSystemView.EntryTreeElement(this._fileSystemView,entries[newEntryIndex]));for(;oldChildIndex<oldChildren.length;++oldChildIndex)
+this.removeChild(oldChildren[oldChildIndex]);},refresh:function()
+{if(!this._entry.isDirectory){if(this._view&&this._view===this._fileSystemView.visibleView){var fileContentView=(this._view);fileContentView.refresh();}}else
+this._entry.requestDirectoryContent(this._directoryContentReceived.bind(this));},deleteEntry:function()
+{this._entry.deleteEntry(this._deletionCompleted.bind(this));},_deletionCompleted:function()
+{if(this._entry!=this._entry.fileSystem.root)
+this.parent.refresh();},__proto__:TreeElement.prototype};WebInspector.ResourcesPanel=function(database)
+{WebInspector.PanelWithSidebarTree.call(this,"resources");this.registerRequiredCSS("resourcesPanel.css");WebInspector.settings.resourcesLastSelectedItem=WebInspector.settings.createSetting("resourcesLastSelectedItem",{});this.sidebarElement().classList.add("filter-all","children","small","outline-disclosure");this.sidebarTree.element.classList.remove("sidebar-tree");this.resourcesListTreeElement=new WebInspector.StorageCategoryTreeElement(this,WebInspector.UIString("Frames"),"Frames",["frame-storage-tree-item"]);this.sidebarTree.appendChild(this.resourcesListTreeElement);this.databasesListTreeElement=new WebInspector.StorageCategoryTreeElement(this,WebInspector.UIString("Web SQL"),"Databases",["database-storage-tree-item"]);this.sidebarTree.appendChild(this.databasesListTreeElement);this.indexedDBListTreeElement=new WebInspector.IndexedDBTreeElement(this);this.sidebarTree.appendChild(this.indexedDBListTreeElement);this.localStorageListTreeElement=new WebInspector.StorageCategoryTreeElement(this,WebInspector.UIString("Local Storage"),"LocalStorage",["domstorage-storage-tree-item","local-storage"]);this.sidebarTree.appendChild(this.localStorageListTreeElement);this.sessionStorageListTreeElement=new WebInspector.StorageCategoryTreeElement(this,WebInspector.UIString("Session Storage"),"SessionStorage",["domstorage-storage-tree-item","session-storage"]);this.sidebarTree.appendChild(this.sessionStorageListTreeElement);this.cookieListTreeElement=new WebInspector.StorageCategoryTreeElement(this,WebInspector.UIString("Cookies"),"Cookies",["cookie-storage-tree-item"]);this.sidebarTree.appendChild(this.cookieListTreeElement);this.applicationCacheListTreeElement=new WebInspector.StorageCategoryTreeElement(this,WebInspector.UIString("Application Cache"),"ApplicationCache",["application-cache-storage-tree-item"]);this.sidebarTree.appendChild(this.applicationCacheListTreeElement);if(WebInspector.experimentsSettings.fileSystemInspection.isEnabled()){this.fileSystemListTreeElement=new WebInspector.FileSystemListTreeElement(this);this.sidebarTree.appendChild(this.fileSystemListTreeElement);}
+var mainView=new WebInspector.VBox();this.storageViews=mainView.element.createChild("div","resources-main diff-container");var statusBarContainer=mainView.element.createChild("div","resources-status-bar");this.storageViewStatusBarItemsContainer=statusBarContainer.createChild("div","status-bar");mainView.show(this.mainElement());this._databaseTableViews=new Map();this._databaseQueryViews=new Map();this._databaseTreeElements=new Map();this._domStorageViews=new Map();this._domStorageTreeElements=new Map();this._cookieViews={};this._domains={};this.sidebarElement().addEventListener("mousemove",this._onmousemove.bind(this),false);this.sidebarElement().addEventListener("mouseout",this._onmouseout.bind(this),false);function sourceFrameGetter()
+{var view=this.visibleView;if(view&&view instanceof WebInspector.SourceFrame)
+return(view);return null;}
+WebInspector.GoToLineDialog.install(this,sourceFrameGetter.bind(this));if(WebInspector.resourceTreeModel.cachedResourcesLoaded())
+this._cachedResourcesLoaded();WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._loadEventFired,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded,this._cachedResourcesLoaded,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources,this._resetWithFrames,this);WebInspector.databaseModel.databases().forEach(this._addDatabase.bind(this));WebInspector.databaseModel.addEventListener(WebInspector.DatabaseModel.Events.DatabaseAdded,this._databaseAdded,this);}
+WebInspector.ResourcesPanel.prototype={canSearch:function()
+{return false;},wasShown:function()
+{WebInspector.Panel.prototype.wasShown.call(this);this._initialize();},_initialize:function()
+{if(!this._initialized&&this.isShowing()&&this._cachedResourcesWereLoaded){this._populateResourceTree();this._populateDOMStorageTree();this._populateApplicationCacheTree();this.indexedDBListTreeElement._initialize();if(WebInspector.experimentsSettings.fileSystemInspection.isEnabled())
+this.fileSystemListTreeElement._initialize();this._initDefaultSelection();this._initialized=true;}},_loadEventFired:function()
+{this._initDefaultSelection();},_initDefaultSelection:function()
+{if(!this._initialized)
+return;var itemURL=WebInspector.settings.resourcesLastSelectedItem.get();if(itemURL){for(var treeElement=this.sidebarTree.children[0];treeElement;treeElement=treeElement.traverseNextTreeElement(false,this.sidebarTree,true)){if(treeElement.itemURL===itemURL){treeElement.revealAndSelect(true);return;}}}
+var mainResource=WebInspector.resourceTreeModel.inspectedPageURL()&&this.resourcesListTreeElement&&this.resourcesListTreeElement.expanded?WebInspector.resourceTreeModel.resourceForURL(WebInspector.resourceTreeModel.inspectedPageURL()):null;if(mainResource)
+this.showResource(mainResource);},_resetWithFrames:function()
+{this.resourcesListTreeElement.removeChildren();this._treeElementForFrameId={};this._reset();},_reset:function()
+{this._domains={};var queryViews=this._databaseQueryViews.values();for(var i=0;i<queryViews.length;++i)
+queryViews[i].removeEventListener(WebInspector.DatabaseQueryView.Events.SchemaUpdated,this._updateDatabaseTables,this);this._databaseTableViews.clear();this._databaseQueryViews.clear();this._databaseTreeElements.clear();this._domStorageViews.clear();this._domStorageTreeElements.clear();this._cookieViews={};this.databasesListTreeElement.removeChildren();this.localStorageListTreeElement.removeChildren();this.sessionStorageListTreeElement.removeChildren();this.cookieListTreeElement.removeChildren();if(this.visibleView&&!(this.visibleView instanceof WebInspector.StorageCategoryView))
+this.visibleView.detach();this.storageViewStatusBarItemsContainer.removeChildren();if(this.sidebarTree.selectedTreeElement)
+this.sidebarTree.selectedTreeElement.deselect();},_populateResourceTree:function()
+{this._treeElementForFrameId={};WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameAdded,this._frameAdded,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated,this._frameNavigated,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached,this._frameDetached,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded,this._resourceAdded,this);function populateFrame(frame)
+{this._frameAdded({data:frame});for(var i=0;i<frame.childFrames.length;++i)
+populateFrame.call(this,frame.childFrames[i]);var resources=frame.resources();for(var i=0;i<resources.length;++i)
+this._resourceAdded({data:resources[i]});}
+populateFrame.call(this,WebInspector.resourceTreeModel.mainFrame);},_frameAdded:function(event)
+{var frame=event.data;var parentFrame=frame.parentFrame;var parentTreeElement=parentFrame?this._treeElementForFrameId[parentFrame.id]:this.resourcesListTreeElement;if(!parentTreeElement){console.warn("No frame to route "+frame.url+" to.")
+return;}
+var frameTreeElement=new WebInspector.FrameTreeElement(this,frame);this._treeElementForFrameId[frame.id]=frameTreeElement;parentTreeElement.appendChild(frameTreeElement);},_frameDetached:function(event)
+{var frame=event.data;var frameTreeElement=this._treeElementForFrameId[frame.id];if(!frameTreeElement)
+return;delete this._treeElementForFrameId[frame.id];if(frameTreeElement.parent)
+frameTreeElement.parent.removeChild(frameTreeElement);},_resourceAdded:function(event)
+{var resource=event.data;var frameId=resource.frameId;if(resource.statusCode>=301&&resource.statusCode<=303)
+return;var frameTreeElement=this._treeElementForFrameId[frameId];if(!frameTreeElement){return;}
+frameTreeElement.appendResource(resource);},_frameNavigated:function(event)
+{var frame=event.data;if(!frame.parentFrame)
+this._reset();var frameId=frame.id;var frameTreeElement=this._treeElementForFrameId[frameId];if(frameTreeElement)
+frameTreeElement.frameNavigated(frame);var applicationCacheFrameTreeElement=this._applicationCacheFrameElements[frameId];if(applicationCacheFrameTreeElement)
+applicationCacheFrameTreeElement.frameNavigated(frame);},_cachedResourcesLoaded:function()
+{this._cachedResourcesWereLoaded=true;this._initialize();},_databaseAdded:function(event)
+{var database=(event.data);this._addDatabase(database);},_addDatabase:function(database)
+{var databaseTreeElement=new WebInspector.DatabaseTreeElement(this,database);this._databaseTreeElements.put(database,databaseTreeElement);this.databasesListTreeElement.appendChild(databaseTreeElement);},addDocumentURL:function(url)
+{var parsedURL=url.asParsedURL();if(!parsedURL)
+return;var domain=parsedURL.host;if(!this._domains[domain]){this._domains[domain]=true;var cookieDomainTreeElement=new WebInspector.CookieTreeElement(this,domain);this.cookieListTreeElement.appendChild(cookieDomainTreeElement);}},_domStorageAdded:function(event)
+{var domStorage=(event.data);this._addDOMStorage(domStorage);},_addDOMStorage:function(domStorage)
+{console.assert(!this._domStorageTreeElements.get(domStorage));var domStorageTreeElement=new WebInspector.DOMStorageTreeElement(this,domStorage,(domStorage.isLocalStorage?"local-storage":"session-storage"));this._domStorageTreeElements.put(domStorage,domStorageTreeElement);if(domStorage.isLocalStorage)
+this.localStorageListTreeElement.appendChild(domStorageTreeElement);else
+this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);},_domStorageRemoved:function(event)
+{var domStorage=(event.data);this._removeDOMStorage(domStorage);},_removeDOMStorage:function(domStorage)
+{var treeElement=this._domStorageTreeElements.get(domStorage);if(!treeElement)
+return;var wasSelected=treeElement.selected;var parentListTreeElement=treeElement.parent;parentListTreeElement.removeChild(treeElement);if(wasSelected)
+parentListTreeElement.select();this._domStorageTreeElements.remove(treeElement);this._domStorageViews.remove(domStorage);},selectDatabase:function(database)
+{if(database){this._showDatabase(database);this._databaseTreeElements.get(database).select();}},selectDOMStorage:function(domStorage)
+{if(domStorage){this._showDOMStorage(domStorage);this._domStorageTreeElements.get(domStorage).select();}},showResource:function(resource,line,column)
+{var resourceTreeElement=this._findTreeElementForResource(resource);if(resourceTreeElement)
+resourceTreeElement.revealAndSelect(true);if(typeof line==="number"){var resourceSourceFrame=this._resourceSourceFrameViewForResource(resource);if(resourceSourceFrame)
+resourceSourceFrame.revealPosition(line,column,true);}
+return true;},_showResourceView:function(resource)
+{var view=this._resourceViewForResource(resource);if(!view){this.visibleView.detach();return;}
+this._innerShowView(view);},_resourceViewForResource:function(resource)
+{if(WebInspector.ResourceView.hasTextContent(resource)){var treeElement=this._findTreeElementForResource(resource);if(!treeElement)
+return null;return treeElement.sourceView();}
+return WebInspector.ResourceView.nonSourceViewForResource(resource);},_resourceSourceFrameViewForResource:function(resource)
+{var resourceView=this._resourceViewForResource(resource);if(resourceView&&resourceView instanceof WebInspector.ResourceSourceFrame)
+return(resourceView);return null;},_showDatabase:function(database,tableName)
+{if(!database)
+return;var view;if(tableName){var tableViews=this._databaseTableViews.get(database);if(!tableViews){tableViews=({});this._databaseTableViews.put(database,tableViews);}
+view=tableViews[tableName];if(!view){view=new WebInspector.DatabaseTableView(database,tableName);tableViews[tableName]=view;}}else{view=this._databaseQueryViews.get(database);if(!view){view=new WebInspector.DatabaseQueryView(database);this._databaseQueryViews.put(database,view);view.addEventListener(WebInspector.DatabaseQueryView.Events.SchemaUpdated,this._updateDatabaseTables,this);}}
+this._innerShowView(view);},showIndexedDB:function(view)
+{this._innerShowView(view);},_showDOMStorage:function(domStorage)
+{if(!domStorage)
+return;var view;view=this._domStorageViews.get(domStorage);if(!view){view=new WebInspector.DOMStorageItemsView(domStorage);this._domStorageViews.put(domStorage,view);}
+this._innerShowView(view);},showCookies:function(treeElement,cookieDomain)
+{var view=this._cookieViews[cookieDomain];if(!view){view=new WebInspector.CookieItemsView(treeElement,cookieDomain);this._cookieViews[cookieDomain]=view;}
+this._innerShowView(view);},clearCookies:function(cookieDomain)
+{this._cookieViews[cookieDomain].clear();},showApplicationCache:function(frameId)
+{if(!this._applicationCacheViews[frameId])
+this._applicationCacheViews[frameId]=new WebInspector.ApplicationCacheItemsView(this._applicationCacheModel,frameId);this._innerShowView(this._applicationCacheViews[frameId]);},showFileSystem:function(view)
+{this._innerShowView(view);},showCategoryView:function(categoryName)
+{if(!this._categoryView)
+this._categoryView=new WebInspector.StorageCategoryView();this._categoryView.setText(categoryName);this._innerShowView(this._categoryView);},_innerShowView:function(view)
+{if(this.visibleView===view)
+return;if(this.visibleView)
+this.visibleView.detach();view.show(this.storageViews);this.visibleView=view;this.storageViewStatusBarItemsContainer.removeChildren();var statusBarItems=view.statusBarItems||[];for(var i=0;i<statusBarItems.length;++i)
+this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);},closeVisibleView:function()
+{if(!this.visibleView)
+return;this.visibleView.detach();delete this.visibleView;},_updateDatabaseTables:function(event)
+{var database=event.data;if(!database)
+return;var databasesTreeElement=this._databaseTreeElements.get(database);if(!databasesTreeElement)
+return;databasesTreeElement.shouldRefreshChildren=true;var tableViews=this._databaseTableViews.get(database);if(!tableViews)
+return;var tableNamesHash={};var self=this;function tableNamesCallback(tableNames)
+{var tableNamesLength=tableNames.length;for(var i=0;i<tableNamesLength;++i)
+tableNamesHash[tableNames[i]]=true;for(var tableName in tableViews){if(!(tableName in tableNamesHash)){if(self.visibleView===tableViews[tableName])
+self.closeVisibleView();delete tableViews[tableName];}}}
+database.getTableNames(tableNamesCallback);},_populateDOMStorageTree:function()
+{WebInspector.domStorageModel.storages().forEach(this._addDOMStorage.bind(this));WebInspector.domStorageModel.addEventListener(WebInspector.DOMStorageModel.Events.DOMStorageAdded,this._domStorageAdded,this);WebInspector.domStorageModel.addEventListener(WebInspector.DOMStorageModel.Events.DOMStorageRemoved,this._domStorageRemoved,this);},_populateApplicationCacheTree:function()
+{this._applicationCacheModel=new WebInspector.ApplicationCacheModel();this._applicationCacheViews={};this._applicationCacheFrameElements={};this._applicationCacheManifestElements={};this._applicationCacheModel.addEventListener(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestAdded,this._applicationCacheFrameManifestAdded,this);this._applicationCacheModel.addEventListener(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestRemoved,this._applicationCacheFrameManifestRemoved,this);this._applicationCacheModel.addEventListener(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestStatusUpdated,this._applicationCacheFrameManifestStatusChanged,this);this._applicationCacheModel.addEventListener(WebInspector.ApplicationCacheModel.EventTypes.NetworkStateChanged,this._applicationCacheNetworkStateChanged,this);},_applicationCacheFrameManifestAdded:function(event)
+{var frameId=event.data;var manifestURL=this._applicationCacheModel.frameManifestURL(frameId);var status=this._applicationCacheModel.frameManifestStatus(frameId)
+var manifestTreeElement=this._applicationCacheManifestElements[manifestURL]
+if(!manifestTreeElement){manifestTreeElement=new WebInspector.ApplicationCacheManifestTreeElement(this,manifestURL);this.applicationCacheListTreeElement.appendChild(manifestTreeElement);this._applicationCacheManifestElements[manifestURL]=manifestTreeElement;}
+var frameTreeElement=new WebInspector.ApplicationCacheFrameTreeElement(this,frameId,manifestURL);manifestTreeElement.appendChild(frameTreeElement);manifestTreeElement.expand();this._applicationCacheFrameElements[frameId]=frameTreeElement;},_applicationCacheFrameManifestRemoved:function(event)
+{var frameId=event.data;var frameTreeElement=this._applicationCacheFrameElements[frameId];if(!frameTreeElement)
+return;var manifestURL=frameTreeElement.manifestURL;delete this._applicationCacheFrameElements[frameId];delete this._applicationCacheViews[frameId];frameTreeElement.parent.removeChild(frameTreeElement);var manifestTreeElement=this._applicationCacheManifestElements[manifestURL];if(manifestTreeElement.children.length!==0)
+return;delete this._applicationCacheManifestElements[manifestURL];manifestTreeElement.parent.removeChild(manifestTreeElement);},_applicationCacheFrameManifestStatusChanged:function(event)
+{var frameId=event.data;var status=this._applicationCacheModel.frameManifestStatus(frameId)
+if(this._applicationCacheViews[frameId])
+this._applicationCacheViews[frameId].updateStatus(status);},_applicationCacheNetworkStateChanged:function(event)
+{var isNowOnline=event.data;for(var manifestURL in this._applicationCacheViews)
+this._applicationCacheViews[manifestURL].updateNetworkState(isNowOnline);},_findTreeElementForResource:function(resource)
+{function isAncestor(ancestor,object)
+{return false;}
+function getParent(object)
+{return null;}
+return this.sidebarTree.findTreeElement(resource,isAncestor,getParent);},showView:function(view)
+{if(view)
+this.showResource(view.resource);},_onmousemove:function(event)
+{var nodeUnderMouse=document.elementFromPoint(event.pageX,event.pageY);if(!nodeUnderMouse)
+return;var listNode=nodeUnderMouse.enclosingNodeOrSelfWithNodeName("li");if(!listNode)
+return;var element=listNode.treeElement;if(this._previousHoveredElement===element)
+return;if(this._previousHoveredElement){this._previousHoveredElement.hovered=false;delete this._previousHoveredElement;}
+if(element instanceof WebInspector.FrameTreeElement){this._previousHoveredElement=element;element.hovered=true;}},_onmouseout:function(event)
+{if(this._previousHoveredElement){this._previousHoveredElement.hovered=false;delete this._previousHoveredElement;}},__proto__:WebInspector.PanelWithSidebarTree.prototype}
+WebInspector.ResourcesPanel.ResourceRevealer=function()
+{}
+WebInspector.ResourcesPanel.ResourceRevealer.prototype={reveal:function(resource,lineNumber)
+{if(resource instanceof WebInspector.Resource)
+(WebInspector.inspectorView.showPanel("resources")).showResource(resource,lineNumber);}}
+WebInspector.BaseStorageTreeElement=function(storagePanel,representedObject,title,iconClasses,hasChildren,noIcon)
+{TreeElement.call(this,"",representedObject,hasChildren);this._storagePanel=storagePanel;this._titleText=title;this._iconClasses=iconClasses;this._noIcon=noIcon;}
+WebInspector.BaseStorageTreeElement.prototype={onattach:function()
+{this.listItemElement.removeChildren();if(this._iconClasses){for(var i=0;i<this._iconClasses.length;++i)
+this.listItemElement.classList.add(this._iconClasses[i]);}
+var selectionElement=document.createElement("div");selectionElement.className="selection";this.listItemElement.appendChild(selectionElement);if(!this._noIcon){this.imageElement=document.createElement("img");this.imageElement.className="icon";this.listItemElement.appendChild(this.imageElement);}
+this.titleElement=document.createElement("div");this.titleElement.className="base-storage-tree-element-title";this._titleTextNode=document.createTextNode("");this.titleElement.appendChild(this._titleTextNode);this._updateTitle();this._updateSubtitle();this.listItemElement.appendChild(this.titleElement);},get displayName()
+{return this._displayName;},_updateDisplayName:function()
+{this._displayName=this._titleText||"";if(this._subtitleText)
+this._displayName+=" ("+this._subtitleText+")";},_updateTitle:function()
+{this._updateDisplayName();if(!this.titleElement)
+return;this._titleTextNode.textContent=this._titleText||"";},_updateSubtitle:function()
+{this._updateDisplayName();if(!this.titleElement)
+return;if(this._subtitleText){if(!this._subtitleElement){this._subtitleElement=document.createElement("span");this._subtitleElement.className="base-storage-tree-element-subtitle";this.titleElement.appendChild(this._subtitleElement);}
+this._subtitleElement.textContent="("+this._subtitleText+")";}else if(this._subtitleElement){this.titleElement.removeChild(this._subtitleElement);delete this._subtitleElement;}},onselect:function(selectedByUser)
+{if(!selectedByUser)
+return false;var itemURL=this.itemURL;if(itemURL)
+WebInspector.settings.resourcesLastSelectedItem.set(itemURL);return false;},onreveal:function()
+{if(this.listItemElement)
+this.listItemElement.scrollIntoViewIfNeeded(false);},get titleText()
+{return this._titleText;},set titleText(titleText)
+{this._titleText=titleText;this._updateTitle();},get subtitleText()
+{return this._subtitleText;},set subtitleText(subtitleText)
+{this._subtitleText=subtitleText;this._updateSubtitle();},__proto__:TreeElement.prototype}
+WebInspector.StorageCategoryTreeElement=function(storagePanel,categoryName,settingsKey,iconClasses,noIcon)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,categoryName,iconClasses,false,noIcon);this._expandedSettingKey="resources"+settingsKey+"Expanded";WebInspector.settings[this._expandedSettingKey]=WebInspector.settings.createSetting(this._expandedSettingKey,settingsKey==="Frames");this._categoryName=categoryName;}
+WebInspector.StorageCategoryTreeElement.prototype={get itemURL()
+{return"category://"+this._categoryName;},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel.showCategoryView(this._categoryName);return false;},onattach:function()
+{WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);if(WebInspector.settings[this._expandedSettingKey].get())
+this.expand();},onexpand:function()
+{WebInspector.settings[this._expandedSettingKey].set(true);},oncollapse:function()
+{WebInspector.settings[this._expandedSettingKey].set(false);},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.FrameTreeElement=function(storagePanel,frame)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,"",["frame-storage-tree-item"]);this._frame=frame;this.frameNavigated(frame);}
+WebInspector.FrameTreeElement.prototype={frameNavigated:function(frame)
+{this.removeChildren();this._frameId=frame.id;this.titleText=frame.name;this.subtitleText=new WebInspector.ParsedURL(frame.url).displayName;this._categoryElements={};this._treeElementForResource={};this._storagePanel.addDocumentURL(frame.url);},get itemURL()
+{return"frame://"+encodeURI(this.displayName);},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel.showCategoryView(this.displayName);this.listItemElement.classList.remove("hovered");DOMAgent.hideHighlight();return false;},set hovered(hovered)
+{if(hovered){this.listItemElement.classList.add("hovered");DOMAgent.highlightFrame(this._frameId,WebInspector.Color.PageHighlight.Content.toProtocolRGBA(),WebInspector.Color.PageHighlight.ContentOutline.toProtocolRGBA());}else{this.listItemElement.classList.remove("hovered");DOMAgent.hideHighlight();}},appendResource:function(resource)
+{if(resource.isHidden())
+return;var categoryName=resource.type.name();var categoryElement=resource.type===WebInspector.resourceTypes.Document?this:this._categoryElements[categoryName];if(!categoryElement){categoryElement=new WebInspector.StorageCategoryTreeElement(this._storagePanel,resource.type.categoryTitle(),categoryName,null,true);this._categoryElements[resource.type.name()]=categoryElement;this._insertInPresentationOrder(this,categoryElement);}
+var resourceTreeElement=new WebInspector.FrameResourceTreeElement(this._storagePanel,resource);this._insertInPresentationOrder(categoryElement,resourceTreeElement);this._treeElementForResource[resource.url]=resourceTreeElement;},resourceByURL:function(url)
+{var treeElement=this._treeElementForResource[url];return treeElement?treeElement.representedObject:null;},appendChild:function(treeElement)
+{this._insertInPresentationOrder(this,treeElement);},_insertInPresentationOrder:function(parentTreeElement,childTreeElement)
+{function typeWeight(treeElement)
+{if(treeElement instanceof WebInspector.StorageCategoryTreeElement)
+return 2;if(treeElement instanceof WebInspector.FrameTreeElement)
+return 1;return 3;}
+function compare(treeElement1,treeElement2)
+{var typeWeight1=typeWeight(treeElement1);var typeWeight2=typeWeight(treeElement2);var result;if(typeWeight1>typeWeight2)
+result=1;else if(typeWeight1<typeWeight2)
+result=-1;else{var title1=treeElement1.displayName||treeElement1.titleText;var title2=treeElement2.displayName||treeElement2.titleText;result=title1.localeCompare(title2);}
+return result;}
+var children=parentTreeElement.children;var i;for(i=0;i<children.length;++i){if(compare(childTreeElement,children[i])<0)
+break;}
+parentTreeElement.insertChild(childTreeElement,i);},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.FrameResourceTreeElement=function(storagePanel,resource)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,resource,resource.displayName,["resource-sidebar-tree-item","resources-type-"+resource.type.name()]);this._resource=resource;this._resource.addEventListener(WebInspector.Resource.Events.MessageAdded,this._consoleMessageAdded,this);this._resource.addEventListener(WebInspector.Resource.Events.MessagesCleared,this._consoleMessagesCleared,this);this.tooltip=resource.url;}
+WebInspector.FrameResourceTreeElement.prototype={get itemURL()
+{return this._resource.url;},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel._showResourceView(this._resource);return false;},ondblclick:function(event)
+{InspectorFrontendHost.openInNewTab(this._resource.url);return false;},onattach:function()
+{WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);if(this._resource.type===WebInspector.resourceTypes.Image){var previewImage=document.createElement("img");previewImage.className="image-resource-icon-preview";this._resource.populateImageSource(previewImage);var iconElement=document.createElement("div");iconElement.className="icon";iconElement.appendChild(previewImage);this.listItemElement.replaceChild(iconElement,this.imageElement);}
+this._statusElement=document.createElement("div");this._statusElement.className="status";this.listItemElement.insertBefore(this._statusElement,this.titleElement);this.listItemElement.draggable=true;this.listItemElement.addEventListener("dragstart",this._ondragstart.bind(this),false);this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);this._updateErrorsAndWarningsBubbles();},_ondragstart:function(event)
+{event.dataTransfer.setData("text/plain",this._resource.content);event.dataTransfer.effectAllowed="copy";return true;},_handleContextMenuEvent:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(this._resource);contextMenu.show();},_setBubbleText:function(x)
+{if(!this._bubbleElement){this._bubbleElement=document.createElement("div");this._bubbleElement.className="bubble";this._statusElement.appendChild(this._bubbleElement);}
+this._bubbleElement.textContent=x;},_resetBubble:function()
+{if(this._bubbleElement){this._bubbleElement.textContent="";this._bubbleElement.classList.remove("warning");this._bubbleElement.classList.remove("error");}},_updateErrorsAndWarningsBubbles:function()
+{if(this._storagePanel.currentQuery)
+return;this._resetBubble();if(this._resource.warnings||this._resource.errors)
+this._setBubbleText(this._resource.warnings+this._resource.errors);if(this._resource.warnings)
+this._bubbleElement.classList.add("warning");if(this._resource.errors)
+this._bubbleElement.classList.add("error");},_consoleMessagesCleared:function()
+{if(this._sourceView)
+this._sourceView.clearMessages();this._updateErrorsAndWarningsBubbles();},_consoleMessageAdded:function(event)
+{var msg=event.data;if(this._sourceView)
+this._sourceView.addMessage(msg);this._updateErrorsAndWarningsBubbles();},sourceView:function()
+{if(!this._sourceView){var sourceFrame=new WebInspector.ResourceSourceFrame(this._resource);sourceFrame.setHighlighterType(this._resource.canonicalMimeType());this._sourceView=sourceFrame;if(this._resource.messages){for(var i=0;i<this._resource.messages.length;i++)
+this._sourceView.addMessage(this._resource.messages[i]);}}
+return this._sourceView;},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.DatabaseTreeElement=function(storagePanel,database)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,database.name,["database-storage-tree-item"],true);this._database=database;}
+WebInspector.DatabaseTreeElement.prototype={get itemURL()
+{return"database://"+encodeURI(this._database.name);},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel._showDatabase(this._database);return false;},onexpand:function()
+{this._updateChildren();},_updateChildren:function()
+{this.removeChildren();function tableNamesCallback(tableNames)
+{var tableNamesLength=tableNames.length;for(var i=0;i<tableNamesLength;++i)
+this.appendChild(new WebInspector.DatabaseTableTreeElement(this._storagePanel,this._database,tableNames[i]));}
+this._database.getTableNames(tableNamesCallback.bind(this));},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.DatabaseTableTreeElement=function(storagePanel,database,tableName)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,tableName,["database-storage-tree-item"]);this._database=database;this._tableName=tableName;}
+WebInspector.DatabaseTableTreeElement.prototype={get itemURL()
+{return"database://"+encodeURI(this._database.name)+"/"+encodeURI(this._tableName);},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel._showDatabase(this._database,this._tableName);return false;},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.IndexedDBTreeElement=function(storagePanel)
+{WebInspector.StorageCategoryTreeElement.call(this,storagePanel,WebInspector.UIString("IndexedDB"),"IndexedDB",["indexed-db-storage-tree-item"]);}
+WebInspector.IndexedDBTreeElement.prototype={_initialize:function()
+{this._createIndexedDBModel();},onattach:function()
+{WebInspector.StorageCategoryTreeElement.prototype.onattach.call(this);this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);},_handleContextMenuEvent:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Refresh IndexedDB"),this.refreshIndexedDB.bind(this));contextMenu.show();},_createIndexedDBModel:function()
+{this._indexedDBModel=new WebInspector.IndexedDBModel();this._idbDatabaseTreeElements=[];this._indexedDBModel.addEventListener(WebInspector.IndexedDBModel.EventTypes.DatabaseAdded,this._indexedDBAdded,this);this._indexedDBModel.addEventListener(WebInspector.IndexedDBModel.EventTypes.DatabaseRemoved,this._indexedDBRemoved,this);this._indexedDBModel.addEventListener(WebInspector.IndexedDBModel.EventTypes.DatabaseLoaded,this._indexedDBLoaded,this);},refreshIndexedDB:function()
+{if(!this._indexedDBModel){this._createIndexedDBModel();return;}
+this._indexedDBModel.refreshDatabaseNames();},_indexedDBAdded:function(event)
+{var databaseId=(event.data);var idbDatabaseTreeElement=new WebInspector.IDBDatabaseTreeElement(this._storagePanel,this._indexedDBModel,databaseId);this._idbDatabaseTreeElements.push(idbDatabaseTreeElement);this.appendChild(idbDatabaseTreeElement);this._indexedDBModel.refreshDatabase(databaseId);},_indexedDBRemoved:function(event)
+{var databaseId=(event.data);var idbDatabaseTreeElement=this._idbDatabaseTreeElement(databaseId)
+if(!idbDatabaseTreeElement)
+return;idbDatabaseTreeElement.clear();this.removeChild(idbDatabaseTreeElement);this._idbDatabaseTreeElements.remove(idbDatabaseTreeElement);},_indexedDBLoaded:function(event)
+{var database=(event.data);var idbDatabaseTreeElement=this._idbDatabaseTreeElement(database.databaseId)
+if(!idbDatabaseTreeElement)
+return;idbDatabaseTreeElement.update(database);},_idbDatabaseTreeElement:function(databaseId)
+{var index=-1;for(var i=0;i<this._idbDatabaseTreeElements.length;++i){if(this._idbDatabaseTreeElements[i]._databaseId.equals(databaseId)){index=i;break;}}
+if(index!==-1)
+return this._idbDatabaseTreeElements[i];return null;},__proto__:WebInspector.StorageCategoryTreeElement.prototype}
+WebInspector.FileSystemListTreeElement=function(storagePanel)
+{WebInspector.StorageCategoryTreeElement.call(this,storagePanel,WebInspector.UIString("FileSystem"),"FileSystem",["file-system-storage-tree-item"]);}
+WebInspector.FileSystemListTreeElement.prototype={_initialize:function()
+{this._refreshFileSystem();},onattach:function()
+{WebInspector.StorageCategoryTreeElement.prototype.onattach.call(this);this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);},_handleContextMenuEvent:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Refresh FileSystem list":"Refresh FileSystem List"),this._refreshFileSystem.bind(this));contextMenu.show();},_fileSystemAdded:function(event)
+{var fileSystem=(event.data);var fileSystemTreeElement=new WebInspector.FileSystemTreeElement(this._storagePanel,fileSystem);this.appendChild(fileSystemTreeElement);},_fileSystemRemoved:function(event)
+{var fileSystem=(event.data);var fileSystemTreeElement=this._fileSystemTreeElementByName(fileSystem.name);if(!fileSystemTreeElement)
+return;fileSystemTreeElement.clear();this.removeChild(fileSystemTreeElement);},_fileSystemTreeElementByName:function(fileSystemName)
+{for(var i=0;i<this.children.length;++i){var child=(this.children[i]);if(child.fileSystemName===fileSystemName)
+return this.children[i];}
+return null;},_refreshFileSystem:function()
+{if(!this._fileSystemModel){this._fileSystemModel=new WebInspector.FileSystemModel();this._fileSystemModel.addEventListener(WebInspector.FileSystemModel.EventTypes.FileSystemAdded,this._fileSystemAdded,this);this._fileSystemModel.addEventListener(WebInspector.FileSystemModel.EventTypes.FileSystemRemoved,this._fileSystemRemoved,this);}
+this._fileSystemModel.refreshFileSystemList();},__proto__:WebInspector.StorageCategoryTreeElement.prototype}
+WebInspector.IDBDatabaseTreeElement=function(storagePanel,model,databaseId)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,databaseId.name+" - "+databaseId.securityOrigin,["indexed-db-storage-tree-item"]);this._model=model;this._databaseId=databaseId;this._idbObjectStoreTreeElements={};}
+WebInspector.IDBDatabaseTreeElement.prototype={get itemURL()
+{return"indexedDB://"+this._databaseId.securityOrigin+"/"+this._databaseId.name;},onattach:function()
+{WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);},_handleContextMenuEvent:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Refresh IndexedDB"),this._refreshIndexedDB.bind(this));contextMenu.show();},_refreshIndexedDB:function()
+{this._model.refreshDatabaseNames();},update:function(database)
+{this._database=database;var objectStoreNames={};for(var objectStoreName in this._database.objectStores){var objectStore=this._database.objectStores[objectStoreName];objectStoreNames[objectStore.name]=true;if(!this._idbObjectStoreTreeElements[objectStore.name]){var idbObjectStoreTreeElement=new WebInspector.IDBObjectStoreTreeElement(this._storagePanel,this._model,this._databaseId,objectStore);this._idbObjectStoreTreeElements[objectStore.name]=idbObjectStoreTreeElement;this.appendChild(idbObjectStoreTreeElement);}
+this._idbObjectStoreTreeElements[objectStore.name].update(objectStore);}
+for(var objectStoreName in this._idbObjectStoreTreeElements){if(!objectStoreNames[objectStoreName])
+this._objectStoreRemoved(objectStoreName);}
+if(this.children.length){this.hasChildren=true;this.expand();}
+if(this._view)
+this._view.update(database);this._updateTooltip();},_updateTooltip:function()
+{this.tooltip=WebInspector.UIString("Version")+": "+this._database.version;},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);if(!this._view)
+this._view=new WebInspector.IDBDatabaseView(this._database);this._storagePanel.showIndexedDB(this._view);return false;},_objectStoreRemoved:function(objectStoreName)
+{var objectStoreTreeElement=this._idbObjectStoreTreeElements[objectStoreName];objectStoreTreeElement.clear();this.removeChild(objectStoreTreeElement);delete this._idbObjectStoreTreeElements[objectStoreName];},clear:function()
+{for(var objectStoreName in this._idbObjectStoreTreeElements)
+this._objectStoreRemoved(objectStoreName);},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.IDBObjectStoreTreeElement=function(storagePanel,model,databaseId,objectStore)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,objectStore.name,["indexed-db-object-store-storage-tree-item"]);this._model=model;this._databaseId=databaseId;this._idbIndexTreeElements={};}
+WebInspector.IDBObjectStoreTreeElement.prototype={get itemURL()
+{return"indexedDB://"+this._databaseId.securityOrigin+"/"+this._databaseId.name+"/"+this._objectStore.name;},onattach:function()
+{WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);},_handleContextMenuEvent:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Clear"),this._clearObjectStore.bind(this));contextMenu.show();},_clearObjectStore:function()
+{function callback(){this.update(this._objectStore);}
+this._model.clearObjectStore(this._databaseId,this._objectStore.name,callback.bind(this));},update:function(objectStore)
+{this._objectStore=objectStore;var indexNames={};for(var indexName in this._objectStore.indexes){var index=this._objectStore.indexes[indexName];indexNames[index.name]=true;if(!this._idbIndexTreeElements[index.name]){var idbIndexTreeElement=new WebInspector.IDBIndexTreeElement(this._storagePanel,this._model,this._databaseId,this._objectStore,index);this._idbIndexTreeElements[index.name]=idbIndexTreeElement;this.appendChild(idbIndexTreeElement);}
+this._idbIndexTreeElements[index.name].update(index);}
+for(var indexName in this._idbIndexTreeElements){if(!indexNames[indexName])
+this._indexRemoved(indexName);}
+for(var indexName in this._idbIndexTreeElements){if(!indexNames[indexName]){this.removeChild(this._idbIndexTreeElements[indexName]);delete this._idbIndexTreeElements[indexName];}}
+if(this.children.length){this.hasChildren=true;this.expand();}
+if(this._view)
+this._view.update(this._objectStore);this._updateTooltip();},_updateTooltip:function()
+{var keyPathString=this._objectStore.keyPathString;var tooltipString=keyPathString!==null?(WebInspector.UIString("Key path: ")+keyPathString):"";if(this._objectStore.autoIncrement)
+tooltipString+="\n"+WebInspector.UIString("autoIncrement");this.tooltip=tooltipString},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);if(!this._view)
+this._view=new WebInspector.IDBDataView(this._model,this._databaseId,this._objectStore,null);this._storagePanel.showIndexedDB(this._view);return false;},_indexRemoved:function(indexName)
+{var indexTreeElement=this._idbIndexTreeElements[indexName];indexTreeElement.clear();this.removeChild(indexTreeElement);delete this._idbIndexTreeElements[indexName];},clear:function()
+{for(var indexName in this._idbIndexTreeElements)
+this._indexRemoved(indexName);if(this._view)
+this._view.clear();},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.IDBIndexTreeElement=function(storagePanel,model,databaseId,objectStore,index)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,index.name,["indexed-db-index-storage-tree-item"]);this._model=model;this._databaseId=databaseId;this._objectStore=objectStore;this._index=index;}
+WebInspector.IDBIndexTreeElement.prototype={get itemURL()
+{return"indexedDB://"+this._databaseId.securityOrigin+"/"+this._databaseId.name+"/"+this._objectStore.name+"/"+this._index.name;},update:function(index)
+{this._index=index;if(this._view)
+this._view.update(this._index);this._updateTooltip();},_updateTooltip:function()
+{var tooltipLines=[];var keyPathString=this._index.keyPathString;tooltipLines.push(WebInspector.UIString("Key path: ")+keyPathString);if(this._index.unique)
+tooltipLines.push(WebInspector.UIString("unique"));if(this._index.multiEntry)
+tooltipLines.push(WebInspector.UIString("multiEntry"));this.tooltip=tooltipLines.join("\n");},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);if(!this._view)
+this._view=new WebInspector.IDBDataView(this._model,this._databaseId,this._objectStore,this._index);this._storagePanel.showIndexedDB(this._view);return false;},clear:function()
+{if(this._view)
+this._view.clear();},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.DOMStorageTreeElement=function(storagePanel,domStorage,className)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,domStorage.securityOrigin?domStorage.securityOrigin:WebInspector.UIString("Local Files"),["domstorage-storage-tree-item",className]);this._domStorage=domStorage;}
+WebInspector.DOMStorageTreeElement.prototype={get itemURL()
+{return"storage://"+this._domStorage.securityOrigin+"/"+(this._domStorage.isLocalStorage?"local":"session");},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel._showDOMStorage(this._domStorage);return false;},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.CookieTreeElement=function(storagePanel,cookieDomain)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,cookieDomain?cookieDomain:WebInspector.UIString("Local Files"),["cookie-storage-tree-item"]);this._cookieDomain=cookieDomain;}
+WebInspector.CookieTreeElement.prototype={get itemURL()
+{return"cookies://"+this._cookieDomain;},onattach:function()
+{WebInspector.BaseStorageTreeElement.prototype.onattach.call(this);this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),true);},_handleContextMenuEvent:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Clear"),this._clearCookies.bind(this));contextMenu.show();},_clearCookies:function(domain)
+{this._storagePanel.clearCookies(this._cookieDomain);},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel.showCookies(this,this._cookieDomain);return false;},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.ApplicationCacheManifestTreeElement=function(storagePanel,manifestURL)
+{var title=new WebInspector.ParsedURL(manifestURL).displayName;WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,title,["application-cache-storage-tree-item"]);this.tooltip=manifestURL;this._manifestURL=manifestURL;}
+WebInspector.ApplicationCacheManifestTreeElement.prototype={get itemURL()
+{return"appcache://"+this._manifestURL;},get manifestURL()
+{return this._manifestURL;},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel.showCategoryView(this._manifestURL);return false;},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.ApplicationCacheFrameTreeElement=function(storagePanel,frameId,manifestURL)
+{WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,"",["frame-storage-tree-item"]);this._frameId=frameId;this._manifestURL=manifestURL;this._refreshTitles();}
+WebInspector.ApplicationCacheFrameTreeElement.prototype={get itemURL()
+{return"appcache://"+this._manifestURL+"/"+encodeURI(this.displayName);},get frameId()
+{return this._frameId;},get manifestURL()
+{return this._manifestURL;},_refreshTitles:function()
+{var frame=WebInspector.resourceTreeModel.frameForId(this._frameId);if(!frame){this.subtitleText=WebInspector.UIString("new frame");return;}
+this.titleText=frame.name;this.subtitleText=new WebInspector.ParsedURL(frame.url).displayName;},frameNavigated:function()
+{this._refreshTitles();},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._storagePanel.showApplicationCache(this._frameId);return false;},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.FileSystemTreeElement=function(storagePanel,fileSystem)
+{var displayName=fileSystem.type+" - "+fileSystem.origin;WebInspector.BaseStorageTreeElement.call(this,storagePanel,null,displayName,["file-system-storage-tree-item"]);this._fileSystem=fileSystem;}
+WebInspector.FileSystemTreeElement.prototype={get fileSystemName()
+{return this._fileSystem.name;},get itemURL()
+{return"filesystem://"+this._fileSystem.name;},onselect:function(selectedByUser)
+{WebInspector.BaseStorageTreeElement.prototype.onselect.call(this,selectedByUser);this._fileSystemView=new WebInspector.FileSystemView(this._fileSystem);this._storagePanel.showFileSystem(this._fileSystemView);return false;},clear:function()
+{if(this.fileSystemView&&this._storagePanel.visibleView===this.fileSystemView)
+this._storagePanel.closeVisibleView();},__proto__:WebInspector.BaseStorageTreeElement.prototype}
+WebInspector.StorageCategoryView=function()
+{WebInspector.VBox.call(this);this.element.classList.add("storage-view");this._emptyView=new WebInspector.EmptyView("");this._emptyView.show(this.element);}
+WebInspector.StorageCategoryView.prototype={setText:function(text)
+{this._emptyView.text=text;},__proto__:WebInspector.VBox.prototype}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ScriptFormatterWorker.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/ScriptFormatterWorker.js
new file mode 100644 (file)
index 0000000..3dd1900
--- /dev/null
@@ -0,0 +1,821 @@
+Object.isEmpty=function(obj)
+{for(var i in obj)
+return false;return true;}
+Object.values=function(obj)
+{var result=Object.keys(obj);var length=result.length;for(var i=0;i<length;++i)
+result[i]=obj[result[i]];return result;}
+String.prototype.findAll=function(string)
+{var matches=[];var i=this.indexOf(string);while(i!==-1){matches.push(i);i=this.indexOf(string,i+string.length);}
+return matches;}
+String.prototype.lineEndings=function()
+{if(!this._lineEndings){this._lineEndings=this.findAll("\n");this._lineEndings.push(this.length);}
+return this._lineEndings;}
+String.prototype.lineCount=function()
+{var lineEndings=this.lineEndings();return lineEndings.length;}
+String.prototype.lineAt=function(lineNumber)
+{var lineEndings=this.lineEndings();var lineStart=lineNumber>0?lineEndings[lineNumber-1]+1:0;var lineEnd=lineEndings[lineNumber];var lineContent=this.substring(lineStart,lineEnd);if(lineContent.length>0&&lineContent.charAt(lineContent.length-1)==="\r")
+lineContent=lineContent.substring(0,lineContent.length-1);return lineContent;}
+String.prototype.escapeCharacters=function(chars)
+{var foundChar=false;for(var i=0;i<chars.length;++i){if(this.indexOf(chars.charAt(i))!==-1){foundChar=true;break;}}
+if(!foundChar)
+return String(this);var result="";for(var i=0;i<this.length;++i){if(chars.indexOf(this.charAt(i))!==-1)
+result+="\\";result+=this.charAt(i);}
+return result;}
+String.regexSpecialCharacters=function()
+{return"^[]{}()\\.^$*+?|-,";}
+String.prototype.escapeForRegExp=function()
+{return this.escapeCharacters(String.regexSpecialCharacters());}
+String.prototype.escapeHTML=function()
+{return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");}
+String.prototype.collapseWhitespace=function()
+{return this.replace(/[\s\xA0]+/g," ");}
+String.prototype.trimMiddle=function(maxLength)
+{if(this.length<=maxLength)
+return String(this);var leftHalf=maxLength>>1;var rightHalf=maxLength-leftHalf-1;return this.substr(0,leftHalf)+"\u2026"+this.substr(this.length-rightHalf,rightHalf);}
+String.prototype.trimEnd=function(maxLength)
+{if(this.length<=maxLength)
+return String(this);return this.substr(0,maxLength-1)+"\u2026";}
+String.prototype.trimURL=function(baseURLDomain)
+{var result=this.replace(/^(https|http|file):\/\//i,"");if(baseURLDomain)
+result=result.replace(new RegExp("^"+baseURLDomain.escapeForRegExp(),"i"),"");return result;}
+String.prototype.toTitleCase=function()
+{return this.substring(0,1).toUpperCase()+this.substring(1);}
+String.prototype.compareTo=function(other)
+{if(this>other)
+return 1;if(this<other)
+return-1;return 0;}
+function sanitizeHref(href)
+{return href&&href.trim().toLowerCase().startsWith("javascript:")?null:href;}
+String.prototype.removeURLFragment=function()
+{var fragmentIndex=this.indexOf("#");if(fragmentIndex==-1)
+fragmentIndex=this.length;return this.substring(0,fragmentIndex);}
+String.prototype.startsWith=function(substring)
+{return!this.lastIndexOf(substring,0);}
+String.prototype.endsWith=function(substring)
+{return this.indexOf(substring,this.length-substring.length)!==-1;}
+String.prototype.hashCode=function()
+{var result=0;for(var i=0;i<this.length;++i)
+result=result*3+this.charCodeAt(i);return result;}
+String.naturalOrderComparator=function(a,b)
+{var chunk=/^\d+|^\D+/;var chunka,chunkb,anum,bnum;while(1){if(a){if(!b)
+return 1;}else{if(b)
+return-1;else
+return 0;}
+chunka=a.match(chunk)[0];chunkb=b.match(chunk)[0];anum=!isNaN(chunka);bnum=!isNaN(chunkb);if(anum&&!bnum)
+return-1;if(bnum&&!anum)
+return 1;if(anum&&bnum){var diff=chunka-chunkb;if(diff)
+return diff;if(chunka.length!==chunkb.length){if(!+chunka&&!+chunkb)
+return chunka.length-chunkb.length;else
+return chunkb.length-chunka.length;}}else if(chunka!==chunkb)
+return(chunka<chunkb)?-1:1;a=a.substring(chunka.length);b=b.substring(chunkb.length);}}
+Number.constrain=function(num,min,max)
+{if(num<min)
+num=min;else if(num>max)
+num=max;return num;}
+Number.gcd=function(a,b)
+{if(b===0)
+return a;else
+return Number.gcd(b,a%b);}
+Number.toFixedIfFloating=function(value)
+{if(!value||isNaN(value))
+return value;var number=Number(value);return number%1?number.toFixed(3):String(number);}
+Date.prototype.toISO8601Compact=function()
+{function leadZero(x)
+{return(x>9?"":"0")+x;}
+return this.getFullYear()+
+leadZero(this.getMonth()+1)+
+leadZero(this.getDate())+"T"+
+leadZero(this.getHours())+
+leadZero(this.getMinutes())+
+leadZero(this.getSeconds());}
+Date.prototype.toConsoleTime=function()
+{function leadZero2(x)
+{return(x>9?"":"0")+x;}
+function leadZero3(x)
+{return(Array(4-x.toString().length)).join('0')+x;}
+return this.getFullYear()+"-"+
+leadZero2(this.getMonth()+1)+"-"+
+leadZero2(this.getDate())+" "+
+leadZero2(this.getHours())+":"+
+leadZero2(this.getMinutes())+":"+
+leadZero2(this.getSeconds())+"."+
+leadZero3(this.getMilliseconds());}
+Object.defineProperty(Array.prototype,"remove",{value:function(value,firstOnly)
+{var index=this.indexOf(value);if(index===-1)
+return;if(firstOnly){this.splice(index,1);return;}
+for(var i=index+1,n=this.length;i<n;++i){if(this[i]!==value)
+this[index++]=this[i];}
+this.length=index;}});Object.defineProperty(Array.prototype,"keySet",{value:function()
+{var keys={};for(var i=0;i<this.length;++i)
+keys[this[i]]=true;return keys;}});Object.defineProperty(Array.prototype,"rotate",{value:function(index)
+{var result=[];for(var i=index;i<index+this.length;++i)
+result.push(this[i%this.length]);return result;}});Object.defineProperty(Uint32Array.prototype,"sort",{value:Array.prototype.sort});(function(){var partition={value:function(comparator,left,right,pivotIndex)
+{function swap(array,i1,i2)
+{var temp=array[i1];array[i1]=array[i2];array[i2]=temp;}
+var pivotValue=this[pivotIndex];swap(this,right,pivotIndex);var storeIndex=left;for(var i=left;i<right;++i){if(comparator(this[i],pivotValue)<0){swap(this,storeIndex,i);++storeIndex;}}
+swap(this,right,storeIndex);return storeIndex;}};Object.defineProperty(Array.prototype,"partition",partition);Object.defineProperty(Uint32Array.prototype,"partition",partition);var sortRange={value:function(comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight)
+{function quickSortRange(array,comparator,left,right,sortWindowLeft,sortWindowRight)
+{if(right<=left)
+return;var pivotIndex=Math.floor(Math.random()*(right-left))+left;var pivotNewIndex=array.partition(comparator,left,right,pivotIndex);if(sortWindowLeft<pivotNewIndex)
+quickSortRange(array,comparator,left,pivotNewIndex-1,sortWindowLeft,sortWindowRight);if(pivotNewIndex<sortWindowRight)
+quickSortRange(array,comparator,pivotNewIndex+1,right,sortWindowLeft,sortWindowRight);}
+if(leftBound===0&&rightBound===(this.length-1)&&sortWindowLeft===0&&sortWindowRight>=rightBound)
+this.sort(comparator);else
+quickSortRange(this,comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight);return this;}}
+Object.defineProperty(Array.prototype,"sortRange",sortRange);Object.defineProperty(Uint32Array.prototype,"sortRange",sortRange);})();Object.defineProperty(Array.prototype,"stableSort",{value:function(comparator)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var indices=new Array(this.length);for(var i=0;i<this.length;++i)
+indices[i]=i;var self=this;function indexComparator(a,b)
+{var result=comparator(self[a],self[b]);return result?result:a-b;}
+indices.sort(indexComparator);for(var i=0;i<this.length;++i){if(indices[i]<0||i===indices[i])
+continue;var cyclical=i;var saved=this[i];while(true){var next=indices[cyclical];indices[cyclical]=-1;if(next===i){this[cyclical]=saved;break;}else{this[cyclical]=this[next];cyclical=next;}}}
+return this;}});Object.defineProperty(Array.prototype,"qselect",{value:function(k,comparator)
+{if(k<0||k>=this.length)
+return;if(!comparator)
+comparator=function(a,b){return a-b;}
+var low=0;var high=this.length-1;for(;;){var pivotPosition=this.partition(comparator,low,high,Math.floor((high+low)/2));if(pivotPosition===k)
+return this[k];else if(pivotPosition>k)
+high=pivotPosition-1;else
+low=pivotPosition+1;}}});Object.defineProperty(Array.prototype,"lowerBound",{value:function(object,comparator,left,right)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>0)
+l=m+1;else
+r=m;}
+return r;}});Object.defineProperty(Array.prototype,"upperBound",{value:function(object,comparator,left,right)
+{function defaultComparator(a,b)
+{return a<b?-1:(a>b?1:0);}
+comparator=comparator||defaultComparator;var l=left||0;var r=right!==undefined?right:this.length;while(l<r){var m=(l+r)>>1;if(comparator(object,this[m])>=0)
+l=m+1;else
+r=m;}
+return r;}});Object.defineProperty(Array.prototype,"binaryIndexOf",{value:function(value,comparator)
+{var index=this.lowerBound(value,comparator);return index<this.length&&comparator(value,this[index])===0?index:-1;}});Object.defineProperty(Array.prototype,"select",{value:function(field)
+{var result=new Array(this.length);for(var i=0;i<this.length;++i)
+result[i]=this[i][field];return result;}});Object.defineProperty(Array.prototype,"peekLast",{value:function()
+{return this[this.length-1];}});(function(){function mergeOrIntersect(array1,array2,comparator,mergeNotIntersect)
+{var result=[];var i=0;var j=0;while(i<array1.length&&j<array2.length){var compareValue=comparator(array1[i],array2[j]);if(mergeNotIntersect||!compareValue)
+result.push(compareValue<=0?array1[i]:array2[j]);if(compareValue<=0)
+i++;if(compareValue>=0)
+j++;}
+if(mergeNotIntersect){while(i<array1.length)
+result.push(array1[i++]);while(j<array2.length)
+result.push(array2[j++]);}
+return result;}
+Object.defineProperty(Array.prototype,"intersectOrdered",{value:function(array,comparator)
+{return mergeOrIntersect(this,array,comparator,false);}});Object.defineProperty(Array.prototype,"mergeOrdered",{value:function(array,comparator)
+{return mergeOrIntersect(this,array,comparator,true);}});}());function insertionIndexForObjectInListSortedByFunction(object,list,comparator,insertionIndexAfter)
+{if(insertionIndexAfter)
+return list.upperBound(object,comparator);else
+return list.lowerBound(object,comparator);}
+String.sprintf=function(format,var_arg)
+{return String.vsprintf(format,Array.prototype.slice.call(arguments,1));}
+String.tokenizeFormatString=function(format,formatters)
+{var tokens=[];var substitutionIndex=0;function addStringToken(str)
+{tokens.push({type:"string",value:str});}
+function addSpecifierToken(specifier,precision,substitutionIndex)
+{tokens.push({type:"specifier",specifier:specifier,precision:precision,substitutionIndex:substitutionIndex});}
+function isDigit(c)
+{return!!/[0-9]/.exec(c);}
+var index=0;for(var precentIndex=format.indexOf("%",index);precentIndex!==-1;precentIndex=format.indexOf("%",index)){addStringToken(format.substring(index,precentIndex));index=precentIndex+1;if(isDigit(format[index])){var number=parseInt(format.substring(index),10);while(isDigit(format[index]))
+++index;if(number>0&&format[index]==="$"){substitutionIndex=(number-1);++index;}}
+var precision=-1;if(format[index]==="."){++index;precision=parseInt(format.substring(index),10);if(isNaN(precision))
+precision=0;while(isDigit(format[index]))
+++index;}
+if(!(format[index]in formatters)){addStringToken(format.substring(precentIndex,index+1));++index;continue;}
+addSpecifierToken(format[index],precision,substitutionIndex);++substitutionIndex;++index;}
+addStringToken(format.substring(index));return tokens;}
+String.standardFormatters={d:function(substitution)
+{return!isNaN(substitution)?substitution:0;},f:function(substitution,token)
+{if(substitution&&token.precision>-1)
+substitution=substitution.toFixed(token.precision);return!isNaN(substitution)?substitution:(token.precision>-1?Number(0).toFixed(token.precision):0);},s:function(substitution)
+{return substitution;}}
+String.vsprintf=function(format,substitutions)
+{return String.format(format,substitutions,String.standardFormatters,"",function(a,b){return a+b;}).formattedResult;}
+String.format=function(format,substitutions,formatters,initialValue,append)
+{if(!format||!substitutions||!substitutions.length)
+return{formattedResult:append(initialValue,format),unusedSubstitutions:substitutions};function prettyFunctionName()
+{return"String.format(\""+format+"\", \""+substitutions.join("\", \"")+"\")";}
+function warn(msg)
+{console.warn(prettyFunctionName()+": "+msg);}
+function error(msg)
+{console.error(prettyFunctionName()+": "+msg);}
+var result=initialValue;var tokens=String.tokenizeFormatString(format,formatters);var usedSubstitutionIndexes={};for(var i=0;i<tokens.length;++i){var token=tokens[i];if(token.type==="string"){result=append(result,token.value);continue;}
+if(token.type!=="specifier"){error("Unknown token type \""+token.type+"\" found.");continue;}
+if(token.substitutionIndex>=substitutions.length){error("not enough substitution arguments. Had "+substitutions.length+" but needed "+(token.substitutionIndex+1)+", so substitution was skipped.");result=append(result,"%"+(token.precision>-1?token.precision:"")+token.specifier);continue;}
+usedSubstitutionIndexes[token.substitutionIndex]=true;if(!(token.specifier in formatters)){warn("unsupported format character \u201C"+token.specifier+"\u201D. Treating as a string.");result=append(result,substitutions[token.substitutionIndex]);continue;}
+result=append(result,formatters[token.specifier](substitutions[token.substitutionIndex],token));}
+var unusedSubstitutions=[];for(var i=0;i<substitutions.length;++i){if(i in usedSubstitutionIndexes)
+continue;unusedSubstitutions.push(substitutions[i]);}
+return{formattedResult:result,unusedSubstitutions:unusedSubstitutions};}
+function createSearchRegex(query,caseSensitive,isRegex)
+{var regexFlags=caseSensitive?"g":"gi";var regexObject;if(isRegex){try{regexObject=new RegExp(query,regexFlags);}catch(e){}}
+if(!regexObject)
+regexObject=createPlainTextSearchRegex(query,regexFlags);return regexObject;}
+function createPlainTextSearchRegex(query,flags)
+{var regexSpecialCharacters=String.regexSpecialCharacters();var regex="";for(var i=0;i<query.length;++i){var c=query.charAt(i);if(regexSpecialCharacters.indexOf(c)!=-1)
+regex+="\\";regex+=c;}
+return new RegExp(regex,flags||"");}
+function countRegexMatches(regex,content)
+{var text=content;var result=0;var match;while(text&&(match=regex.exec(text))){if(match[0].length>0)
+++result;text=text.substring(match.index+1);}
+return result;}
+function numberToStringWithSpacesPadding(value,symbolsCount)
+{var numberString=value.toString();var paddingLength=Math.max(0,symbolsCount-numberString.length);var paddingString=Array(paddingLength+1).join("\u00a0");return paddingString+numberString;}
+var createObjectIdentifier=function()
+{return"_"+ ++createObjectIdentifier._last;}
+createObjectIdentifier._last=0;var Set=function()
+{this._set={};this._size=0;}
+Set.prototype={add:function(item)
+{var objectIdentifier=item.__identifier;if(!objectIdentifier){objectIdentifier=createObjectIdentifier();item.__identifier=objectIdentifier;}
+if(!this._set[objectIdentifier])
+++this._size;this._set[objectIdentifier]=item;},remove:function(item)
+{if(this._set[item.__identifier]){--this._size;delete this._set[item.__identifier];return true;}
+return false;},items:function()
+{var result=new Array(this._size);var i=0;for(var objectIdentifier in this._set)
+result[i++]=this._set[objectIdentifier];return result;},hasItem:function(item)
+{return!!this._set[item.__identifier];},size:function()
+{return this._size;},clear:function()
+{this._set={};this._size=0;}}
+var Map=function()
+{this._map={};this._size=0;}
+Map.prototype={put:function(key,value)
+{var objectIdentifier=key.__identifier;if(!objectIdentifier){objectIdentifier=createObjectIdentifier();key.__identifier=objectIdentifier;}
+if(!this._map[objectIdentifier])
+++this._size;this._map[objectIdentifier]=[key,value];},remove:function(key)
+{var result=this._map[key.__identifier];if(!result)
+return undefined;--this._size;delete this._map[key.__identifier];return result[1];},keys:function()
+{return this._list(0);},values:function()
+{return this._list(1);},_list:function(index)
+{var result=new Array(this._size);var i=0;for(var objectIdentifier in this._map)
+result[i++]=this._map[objectIdentifier][index];return result;},get:function(key)
+{var entry=this._map[key.__identifier];return entry?entry[1]:undefined;},contains:function(key)
+{var entry=this._map[key.__identifier];return!!entry;},size:function()
+{return this._size;},clear:function()
+{this._map={};this._size=0;}}
+var StringMap=function()
+{this._map={};this._size=0;}
+StringMap.prototype={put:function(key,value)
+{if(key==="__proto__"){if(!this._hasProtoKey){++this._size;this._hasProtoKey=true;}
+this._protoValue=value;return;}
+if(!Object.prototype.hasOwnProperty.call(this._map,key))
+++this._size;this._map[key]=value;},remove:function(key)
+{var result;if(key==="__proto__"){if(!this._hasProtoKey)
+return undefined;--this._size;delete this._hasProtoKey;result=this._protoValue;delete this._protoValue;return result;}
+if(!Object.prototype.hasOwnProperty.call(this._map,key))
+return undefined;--this._size;result=this._map[key];delete this._map[key];return result;},keys:function()
+{var result=Object.keys(this._map)||[];if(this._hasProtoKey)
+result.push("__proto__");return result;},values:function()
+{var result=Object.values(this._map);if(this._hasProtoKey)
+result.push(this._protoValue);return result;},get:function(key)
+{if(key==="__proto__")
+return this._protoValue;if(!Object.prototype.hasOwnProperty.call(this._map,key))
+return undefined;return this._map[key];},contains:function(key)
+{var result;if(key==="__proto__")
+return this._hasProtoKey;return Object.prototype.hasOwnProperty.call(this._map,key);},size:function()
+{return this._size;},clear:function()
+{this._map={};this._size=0;delete this._hasProtoKey;delete this._protoValue;}}
+var StringSet=function()
+{this._map=new StringMap();}
+StringSet.prototype={put:function(value)
+{this._map.put(value,true);},remove:function(value)
+{return!!this._map.remove(value);},values:function()
+{return this._map.keys();},contains:function(value)
+{return this._map.contains(value);},size:function()
+{return this._map.size();},clear:function()
+{this._map.clear();}}
+function loadXHR(url,async,callback)
+{function onReadyStateChanged()
+{if(xhr.readyState!==XMLHttpRequest.DONE)
+return;if(xhr.status===200){callback(xhr.responseText);return;}
+callback(null);}
+var xhr=new XMLHttpRequest();xhr.open("GET",url,async);if(async)
+xhr.onreadystatechange=onReadyStateChanged;xhr.send(null);if(!async){if(xhr.status===200)
+return xhr.responseText;return null;}
+return null;}
+var _importedScripts={};function importScript(scriptName)
+{if(_importedScripts[scriptName])
+return;var xhr=new XMLHttpRequest();_importedScripts[scriptName]=true;xhr.open("GET",scriptName,false);xhr.send(null);if(!xhr.responseText)
+throw"empty response arrived for script '"+scriptName+"'";var baseUrl=location.origin+location.pathname;baseUrl=baseUrl.substring(0,baseUrl.lastIndexOf("/"));var sourceURL=baseUrl+"/"+scriptName;self.eval(xhr.responseText+"\n//# sourceURL="+sourceURL);}
+var loadScript=importScript;function CallbackBarrier()
+{this._pendingIncomingCallbacksCount=0;}
+CallbackBarrier.prototype={createCallback:function(userCallback)
+{console.assert(!this._outgoingCallback,"CallbackBarrier.createCallback() is called after CallbackBarrier.callWhenDone()");++this._pendingIncomingCallbacksCount;return this._incomingCallback.bind(this,userCallback);},callWhenDone:function(callback)
+{console.assert(!this._outgoingCallback,"CallbackBarrier.callWhenDone() is called multiple times");this._outgoingCallback=callback;if(!this._pendingIncomingCallbacksCount)
+this._outgoingCallback();},_incomingCallback:function(userCallback)
+{console.assert(this._pendingIncomingCallbacksCount>0);if(userCallback){var args=Array.prototype.slice.call(arguments,1);userCallback.apply(null,args);}
+if(!--this._pendingIncomingCallbacksCount&&this._outgoingCallback)
+this._outgoingCallback();}}
+function suppressUnused(value)
+{};(function(window){window.CodeMirror={};(function(){"use strict";function splitLines(string){return string.split(/\r?\n|\r/);};function StringStream(string){this.pos=this.start=0;this.string=string;this.lineStart=0;}
+StringStream.prototype={eol:function(){return this.pos>=this.string.length;},sol:function(){return this.pos==0;},peek:function(){return this.string.charAt(this.pos)||null;},next:function(){if(this.pos<this.string.length)
+return this.string.charAt(this.pos++);},eat:function(match){var ch=this.string.charAt(this.pos);if(typeof match=="string")var ok=ch==match;else var ok=ch&&(match.test?match.test(ch):match(ch));if(ok){++this.pos;return ch;}},eatWhile:function(match){var start=this.pos;while(this.eat(match)){}
+return this.pos>start;},eatSpace:function(){var start=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos)))++this.pos;return this.pos>start;},skipToEnd:function(){this.pos=this.string.length;},skipTo:function(ch){var found=this.string.indexOf(ch,this.pos);if(found>-1){this.pos=found;return true;}},backUp:function(n){this.pos-=n;},column:function(){return this.start-this.lineStart;},indentation:function(){return 0;},match:function(pattern,consume,caseInsensitive){if(typeof pattern=="string"){var cased=function(str){return caseInsensitive?str.toLowerCase():str;};var substr=this.string.substr(this.pos,pattern.length);if(cased(substr)==cased(pattern)){if(consume!==false)this.pos+=pattern.length;return true;}}else{var match=this.string.slice(this.pos).match(pattern);if(match&&match.index>0)return null;if(match&&consume!==false)this.pos+=match[0].length;return match;}},current:function(){return this.string.slice(this.start,this.pos);},hideFirstChars:function(n,inner){this.lineStart+=n;try{return inner();}
+finally{this.lineStart-=n;}}};CodeMirror.StringStream=StringStream;CodeMirror.startState=function(mode,a1,a2){return mode.startState?mode.startState(a1,a2):true;};var modes=CodeMirror.modes={},mimeModes=CodeMirror.mimeModes={};CodeMirror.defineMode=function(name,mode){modes[name]=mode;};CodeMirror.defineMIME=function(mime,spec){mimeModes[mime]=spec;};CodeMirror.resolveMode=function(spec){if(typeof spec=="string"&&mimeModes.hasOwnProperty(spec)){spec=mimeModes[spec];}else if(spec&&typeof spec.name=="string"&&mimeModes.hasOwnProperty(spec.name)){spec=mimeModes[spec.name];}
+if(typeof spec=="string")return{name:spec};else return spec||{name:"null"};};CodeMirror.getMode=function(options,spec){spec=CodeMirror.resolveMode(spec);var mfactory=modes[spec.name];if(!mfactory)throw new Error("Unknown mode: "+spec);return mfactory(options,spec);};CodeMirror.registerHelper=CodeMirror.registerGlobalHelper=Math.min;CodeMirror.defineMode("null",function(){return{token:function(stream){stream.skipToEnd();}};});CodeMirror.defineMIME("text/plain","null");CodeMirror.runMode=function(string,modespec,callback,options){var mode=CodeMirror.getMode({indentUnit:2},modespec);if(callback.nodeType==1){var tabSize=(options&&options.tabSize)||4;var node=callback,col=0;node.innerHTML="";callback=function(text,style){if(text=="\n"){node.appendChild(document.createElement("br"));col=0;return;}
+var content="";for(var pos=0;;){var idx=text.indexOf("\t",pos);if(idx==-1){content+=text.slice(pos);col+=text.length-pos;break;}else{col+=idx-pos;content+=text.slice(pos,idx);var size=tabSize-col%tabSize;col+=size;for(var i=0;i<size;++i)content+=" ";pos=idx+1;}}
+if(style){var sp=node.appendChild(document.createElement("span"));sp.className="cm-"+style.replace(/ +/g," cm-");sp.appendChild(document.createTextNode(content));}else{node.appendChild(document.createTextNode(content));}};}
+var lines=splitLines(string),state=(options&&options.state)||CodeMirror.startState(mode);for(var i=0,e=lines.length;i<e;++i){if(i)callback("\n");var stream=new CodeMirror.StringStream(lines[i]);while(!stream.eol()){var style=mode.token(stream,state);callback(stream.current(),style,i,stream.start,state);stream.start=stream.pos;}}};})();}(this));CodeMirror.defineMode("css",function(config,parserConfig){"use strict";if(!parserConfig.propertyKeywords)parserConfig=CodeMirror.resolveMode("text/css");var indentUnit=config.indentUnit||config.tabSize||2,hooks=parserConfig.hooks||{},atMediaTypes=parserConfig.atMediaTypes||{},atMediaFeatures=parserConfig.atMediaFeatures||{},propertyKeywords=parserConfig.propertyKeywords||{},colorKeywords=parserConfig.colorKeywords||{},valueKeywords=parserConfig.valueKeywords||{},allowNested=!!parserConfig.allowNested,type=null;function ret(style,tp){type=tp;return style;}
+function tokenBase(stream,state){var ch=stream.next();if(hooks[ch]){var result=hooks[ch](stream,state);if(result!==false)return result;}
+if(ch=="@"){stream.eatWhile(/[\w\\\-]/);return ret("def",stream.current());}
+else if(ch=="=")ret(null,"compare");else if((ch=="~"||ch=="|")&&stream.eat("="))return ret(null,"compare");else if(ch=="\""||ch=="'"){state.tokenize=tokenString(ch);return state.tokenize(stream,state);}
+else if(ch=="#"){stream.eatWhile(/[\w\\\-]/);return ret("atom","hash");}
+else if(ch=="!"){stream.match(/^\s*\w*/);return ret("keyword","important");}
+else if(/\d/.test(ch)||ch=="."&&stream.eat(/\d/)){stream.eatWhile(/[\w.%]/);return ret("number","unit");}
+else if(ch==="-"){if(/\d/.test(stream.peek())){stream.eatWhile(/[\w.%]/);return ret("number","unit");}else if(stream.match(/^[^-]+-/)){return ret("meta","meta");}}
+else if(/[,+>*\/]/.test(ch)){return ret(null,"select-op");}
+else if(ch=="."&&stream.match(/^-?[_a-z][_a-z0-9-]*/i)){return ret("qualifier","qualifier");}
+else if(ch==":"){return ret("operator",ch);}
+else if(/[;{}\[\]\(\)]/.test(ch)){return ret(null,ch);}
+else if(ch=="u"&&stream.match("rl(")){stream.backUp(1);state.tokenize=tokenParenthesized;return ret("property","variable");}
+else{stream.eatWhile(/[\w\\\-]/);return ret("property","variable");}}
+function tokenString(quote,nonInclusive){return function(stream,state){var escaped=false,ch;while((ch=stream.next())!=null){if(ch==quote&&!escaped)
+break;escaped=!escaped&&ch=="\\";}
+if(!escaped){if(nonInclusive)stream.backUp(1);state.tokenize=tokenBase;}
+return ret("string","string");};}
+function tokenParenthesized(stream,state){stream.next();if(!stream.match(/\s*[\"\']/,false))
+state.tokenize=tokenString(")",true);else
+state.tokenize=tokenBase;return ret(null,"(");}
+return{startState:function(base){return{tokenize:tokenBase,baseIndent:base||0,stack:[],lastToken:null};},token:function(stream,state){state.tokenize=state.tokenize||tokenBase;if(state.tokenize==tokenBase&&stream.eatSpace())return null;var style=state.tokenize(stream,state);if(style&&typeof style!="string")style=ret(style[0],style[1]);var context=state.stack[state.stack.length-1];if(style=="variable"){if(type=="variable-definition")state.stack.push("propertyValue");return state.lastToken="variable-2";}else if(style=="property"){var word=stream.current().toLowerCase();if(context=="propertyValue"){if(valueKeywords.hasOwnProperty(word)){style="string-2";}else if(colorKeywords.hasOwnProperty(word)){style="keyword";}else{style="variable-2";}}else if(context=="rule"){if(!propertyKeywords.hasOwnProperty(word)){style+=" error";}}else if(context=="block"){if(propertyKeywords.hasOwnProperty(word)){style="property";}else if(colorKeywords.hasOwnProperty(word)){style="keyword";}else if(valueKeywords.hasOwnProperty(word)){style="string-2";}else{style="tag";}}else if(!context||context=="@media{"){style="tag";}else if(context=="@media"){if(atMediaTypes[stream.current()]){style="attribute";}else if(/^(only|not)$/.test(word)){style="keyword";}else if(word=="and"){style="error";}else if(atMediaFeatures.hasOwnProperty(word)){style="error";}else{style="attribute error";}}else if(context=="@mediaType"){if(atMediaTypes.hasOwnProperty(word)){style="attribute";}else if(word=="and"){style="operator";}else if(/^(only|not)$/.test(word)){style="error";}else{style="error";}}else if(context=="@mediaType("){if(propertyKeywords.hasOwnProperty(word)){}else if(atMediaTypes.hasOwnProperty(word)){style="error";}else if(word=="and"){style="operator";}else if(/^(only|not)$/.test(word)){style="error";}else{style+=" error";}}else if(context=="@import"){style="tag";}else{style="error";}}else if(style=="atom"){if(!context||context=="@media{"||context=="block"){style="builtin";}else if(context=="propertyValue"){if(!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())){style+=" error";}}else{style="error";}}else if(context=="@media"&&type=="{"){style="error";}
+if(type=="{"){if(context=="@media"||context=="@mediaType"){state.stack[state.stack.length-1]="@media{";}
+else{var newContext=allowNested?"block":"rule";state.stack.push(newContext);}}
+else if(type=="}"){if(context=="interpolation")style="operator";while(state.stack.length){var removed=state.stack.pop();if(removed.indexOf("{")>-1||removed=="block"||removed=="rule"){break;}}}
+else if(type=="interpolation")state.stack.push("interpolation");else if(type=="@media")state.stack.push("@media");else if(type=="@import")state.stack.push("@import");else if(context=="@media"&&/\b(keyword|attribute)\b/.test(style))
+state.stack[state.stack.length-1]="@mediaType";else if(context=="@mediaType"&&stream.current()==",")
+state.stack[state.stack.length-1]="@media";else if(type=="("){if(context=="@media"||context=="@mediaType"){state.stack[state.stack.length-1]="@mediaType";state.stack.push("@mediaType(");}
+else state.stack.push("(");}
+else if(type==")"){while(state.stack.length){var removed=state.stack.pop();if(removed.indexOf("(")>-1){break;}}}
+else if(type==":"&&state.lastToken=="property")state.stack.push("propertyValue");else if(context=="propertyValue"&&type==";")state.stack.pop();else if(context=="@import"&&type==";")state.stack.pop();return state.lastToken=style;},indent:function(state,textAfter){var n=state.stack.length;if(/^\}/.test(textAfter))
+n-=state.stack[n-1]=="propertyValue"?2:1;return state.baseIndent+n*indentUnit;},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"};});(function(){function keySet(array){var keys={};for(var i=0;i<array.length;++i){keys[array[i]]=true;}
+return keys;}
+var atMediaTypes=keySet(["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"]);var atMediaFeatures=keySet(["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"]);var propertyKeywords=keySet(["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid-cell","grid-column","grid-column-align","grid-column-sizing","grid-column-span","grid-columns","grid-flow","grid-row","grid-row-align","grid-row-sizing","grid-row-span","grid-rows","grid-template","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-inside","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","zoom","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-profile","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","kerning","text-anchor","writing-mode"]);var colorKeywords=keySet(["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]);var valueKeywords=keySet(["above","absolute","activeborder","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","cover","crop","cross","crosshair","currentcolor","cursive","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ew-resize","expanded","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-table","inset","inside","intrinsic","invert","italic","justify","kannada","katakana","katakana-iroha","keep-all","khmer","landscape","lao","large","larger","left","level","lighter","line-through","linear","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","single","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","x-large","x-small","xor","xx-large","xx-small"]);function tokenCComment(stream,state){var maybeEnd=false,ch;while((ch=stream.next())!=null){if(maybeEnd&&ch=="/"){state.tokenize=null;break;}
+maybeEnd=(ch=="*");}
+return["comment","comment"];}
+CodeMirror.defineMIME("text/css",{atMediaTypes:atMediaTypes,atMediaFeatures:atMediaFeatures,propertyKeywords:propertyKeywords,colorKeywords:colorKeywords,valueKeywords:valueKeywords,hooks:{"<":function(stream,state){function tokenSGMLComment(stream,state){var dashes=0,ch;while((ch=stream.next())!=null){if(dashes>=2&&ch==">"){state.tokenize=null;break;}
+dashes=(ch=="-")?dashes+1:0;}
+return["comment","comment"];}
+if(stream.eat("!")){state.tokenize=tokenSGMLComment;return tokenSGMLComment(stream,state);}},"/":function(stream,state){if(stream.eat("*")){state.tokenize=tokenCComment;return tokenCComment(stream,state);}
+return false;}},name:"css"});CodeMirror.defineMIME("text/x-scss",{atMediaTypes:atMediaTypes,atMediaFeatures:atMediaFeatures,propertyKeywords:propertyKeywords,colorKeywords:colorKeywords,valueKeywords:valueKeywords,allowNested:true,hooks:{":":function(stream){if(stream.match(/\s*{/)){return[null,"{"];}
+return false;},"$":function(stream){stream.match(/^[\w-]+/);if(stream.peek()==":"){return["variable","variable-definition"];}
+return["variable","variable"];},",":function(stream,state){if(state.stack[state.stack.length-1]=="propertyValue"&&stream.match(/^ *\$/,false)){return["operator",";"];}},"/":function(stream,state){if(stream.eat("/")){stream.skipToEnd();return["comment","comment"];}else if(stream.eat("*")){state.tokenize=tokenCComment;return tokenCComment(stream,state);}else{return["operator","operator"];}},"#":function(stream){if(stream.eat("{")){return["operator","interpolation"];}else{stream.eatWhile(/[\w\\\-]/);return["atom","hash"];}}},name:"css"});})();;CodeMirror.defineMode("javascript",function(config,parserConfig){var indentUnit=config.indentUnit;var statementIndent=parserConfig.statementIndent;var jsonMode=parserConfig.json;var isTS=parserConfig.typescript;var keywords=function(){function kw(type){return{type:type,style:"keyword"};}
+var A=kw("keyword a"),B=kw("keyword b"),C=kw("keyword c");var operator=kw("operator"),atom={type:"atom",style:"atom"};var jsKeywords={"if":kw("if"),"while":A,"with":A,"else":B,"do":B,"try":B,"finally":B,"return":C,"break":C,"continue":C,"new":C,"delete":C,"throw":C,"var":kw("var"),"const":kw("var"),"let":kw("var"),"function":kw("function"),"catch":kw("catch"),"for":kw("for"),"switch":kw("switch"),"case":kw("case"),"default":kw("default"),"in":operator,"typeof":operator,"instanceof":operator,"true":atom,"false":atom,"null":atom,"undefined":atom,"NaN":atom,"Infinity":atom,"this":kw("this"),"module":kw("module"),"class":kw("class"),"super":kw("atom"),"yield":C,"export":kw("export"),"import":kw("import"),"extends":C};if(isTS){var type={type:"variable",style:"variable-3"};var tsKeywords={"interface":kw("interface"),"extends":kw("extends"),"constructor":kw("constructor"),"public":kw("public"),"private":kw("private"),"protected":kw("protected"),"static":kw("static"),"string":type,"number":type,"bool":type,"any":type};for(var attr in tsKeywords){jsKeywords[attr]=tsKeywords[attr];}}
+return jsKeywords;}();var isOperatorChar=/[+\-*&%=<>!?|~^]/;function nextUntilUnescaped(stream,end){var escaped=false,next;while((next=stream.next())!=null){if(next==end&&!escaped)
+return false;escaped=!escaped&&next=="\\";}
+return escaped;}
+var type,content;function ret(tp,style,cont){type=tp;content=cont;return style;}
+function tokenBase(stream,state){var ch=stream.next();if(ch=='"'||ch=="'"){state.tokenize=tokenString(ch);return state.tokenize(stream,state);}else if(ch=="."&&stream.match(/^\d+(?:[eE][+\-]?\d+)?/)){return ret("number","number");}else if(ch=="."&&stream.match("..")){return ret("spread","meta");}else if(/[\[\]{}\(\),;\:\.]/.test(ch)){return ret(ch);}else if(ch=="="&&stream.eat(">")){return ret("=>");}else if(ch=="0"&&stream.eat(/x/i)){stream.eatWhile(/[\da-f]/i);return ret("number","number");}else if(/\d/.test(ch)){stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);return ret("number","number");}else if(ch=="/"){if(stream.eat("*")){state.tokenize=tokenComment;return tokenComment(stream,state);}else if(stream.eat("/")){stream.skipToEnd();return ret("comment","comment");}else if(state.lastType=="operator"||state.lastType=="keyword c"||state.lastType=="sof"||/^[\[{}\(,;:]$/.test(state.lastType)){nextUntilUnescaped(stream,"/");stream.eatWhile(/[gimy]/);return ret("regexp","string-2");}else{stream.eatWhile(isOperatorChar);return ret("operator",null,stream.current());}}else if(ch=="`"){state.tokenize=tokenQuasi;return tokenQuasi(stream,state);}else if(ch=="#"){stream.skipToEnd();return ret("error","error");}else if(isOperatorChar.test(ch)){stream.eatWhile(isOperatorChar);return ret("operator",null,stream.current());}else{stream.eatWhile(/[\w\$_]/);var word=stream.current(),known=keywords.propertyIsEnumerable(word)&&keywords[word];return(known&&state.lastType!=".")?ret(known.type,known.style,word):ret("variable","variable",word);}}
+function tokenString(quote){return function(stream,state){if(!nextUntilUnescaped(stream,quote))
+state.tokenize=tokenBase;return ret("string","string");};}
+function tokenComment(stream,state){var maybeEnd=false,ch;while(ch=stream.next()){if(ch=="/"&&maybeEnd){state.tokenize=tokenBase;break;}
+maybeEnd=(ch=="*");}
+return ret("comment","comment");}
+function tokenQuasi(stream,state){var escaped=false,next;while((next=stream.next())!=null){if(!escaped&&(next=="`"||next=="$"&&stream.eat("{"))){state.tokenize=tokenBase;break;}
+escaped=!escaped&&next=="\\";}
+return ret("quasi","string-2",stream.current());}
+var brackets="([{}])";function findFatArrow(stream,state){if(state.fatArrowAt)state.fatArrowAt=null;var arrow=stream.string.indexOf("=>",stream.start);if(arrow<0)return;var depth=0,sawSomething=false;for(var pos=arrow-1;pos>=0;--pos){var ch=stream.string.charAt(pos);var bracket=brackets.indexOf(ch);if(bracket>=0&&bracket<3){if(!depth){++pos;break;}
+if(--depth==0)break;}else if(bracket>=3&&bracket<6){++depth;}else if(/[$\w]/.test(ch)){sawSomething=true;}else if(sawSomething&&!depth){++pos;break;}}
+if(sawSomething&&!depth)state.fatArrowAt=pos;}
+var atomicTypes={"atom":true,"number":true,"variable":true,"string":true,"regexp":true,"this":true};function JSLexical(indented,column,type,align,prev,info){this.indented=indented;this.column=column;this.type=type;this.prev=prev;this.info=info;if(align!=null)this.align=align;}
+function inScope(state,varname){for(var v=state.localVars;v;v=v.next)
+if(v.name==varname)return true;for(var cx=state.context;cx;cx=cx.prev){for(var v=cx.vars;v;v=v.next)
+if(v.name==varname)return true;}}
+function parseJS(state,style,type,content,stream){var cc=state.cc;cx.state=state;cx.stream=stream;cx.marked=null,cx.cc=cc;if(!state.lexical.hasOwnProperty("align"))
+state.lexical.align=true;while(true){var combinator=cc.length?cc.pop():jsonMode?expression:statement;if(combinator(type,content)){while(cc.length&&cc[cc.length-1].lex)
+cc.pop()();if(cx.marked)return cx.marked;if(type=="variable"&&inScope(state,content))return"variable-2";return style;}}}
+var cx={state:null,column:null,marked:null,cc:null};function pass(){for(var i=arguments.length-1;i>=0;i--)cx.cc.push(arguments[i]);}
+function cont(){pass.apply(null,arguments);return true;}
+function register(varname){function inList(list){for(var v=list;v;v=v.next)
+if(v.name==varname)return true;return false;}
+var state=cx.state;if(state.context){cx.marked="def";if(inList(state.localVars))return;state.localVars={name:varname,next:state.localVars};}else{if(inList(state.globalVars))return;if(parserConfig.globalVars)
+state.globalVars={name:varname,next:state.globalVars};}}
+var defaultVars={name:"this",next:{name:"arguments"}};function pushcontext(){cx.state.context={prev:cx.state.context,vars:cx.state.localVars};cx.state.localVars=defaultVars;}
+function popcontext(){cx.state.localVars=cx.state.context.vars;cx.state.context=cx.state.context.prev;}
+function pushlex(type,info){var result=function(){var state=cx.state,indent=state.indented;if(state.lexical.type=="stat")indent=state.lexical.indented;state.lexical=new JSLexical(indent,cx.stream.column(),type,null,state.lexical,info);};result.lex=true;return result;}
+function poplex(){var state=cx.state;if(state.lexical.prev){if(state.lexical.type==")")
+state.indented=state.lexical.indented;state.lexical=state.lexical.prev;}}
+poplex.lex=true;function expect(wanted){return function(type){if(type==wanted)return cont();else if(wanted==";")return pass();else return cont(arguments.callee);};}
+function statement(type,value){if(type=="var")return cont(pushlex("vardef",value.length),vardef,expect(";"),poplex);if(type=="keyword a")return cont(pushlex("form"),expression,statement,poplex);if(type=="keyword b")return cont(pushlex("form"),statement,poplex);if(type=="{")return cont(pushlex("}"),block,poplex);if(type==";")return cont();if(type=="if")return cont(pushlex("form"),expression,statement,poplex,maybeelse);if(type=="function")return cont(functiondef);if(type=="for")return cont(pushlex("form"),forspec,poplex,statement,poplex);if(type=="variable")return cont(pushlex("stat"),maybelabel);if(type=="switch")return cont(pushlex("form"),expression,pushlex("}","switch"),expect("{"),block,poplex,poplex);if(type=="case")return cont(expression,expect(":"));if(type=="default")return cont(expect(":"));if(type=="catch")return cont(pushlex("form"),pushcontext,expect("("),funarg,expect(")"),statement,poplex,popcontext);if(type=="module")return cont(pushlex("form"),pushcontext,afterModule,popcontext,poplex);if(type=="class")return cont(pushlex("form"),className,objlit,poplex);if(type=="export")return cont(pushlex("form"),afterExport,poplex);if(type=="import")return cont(pushlex("form"),afterImport,poplex);return pass(pushlex("stat"),expression,expect(";"),poplex);}
+function expression(type){return expressionInner(type,false);}
+function expressionNoComma(type){return expressionInner(type,true);}
+function expressionInner(type,noComma){if(cx.state.fatArrowAt==cx.stream.start){var body=noComma?arrowBodyNoComma:arrowBody;if(type=="(")return cont(pushcontext,commasep(pattern,")"),expect("=>"),body,popcontext);else if(type=="variable")return pass(pushcontext,pattern,expect("=>"),body,popcontext);}
+var maybeop=noComma?maybeoperatorNoComma:maybeoperatorComma;if(atomicTypes.hasOwnProperty(type))return cont(maybeop);if(type=="function")return cont(functiondef);if(type=="keyword c")return cont(noComma?maybeexpressionNoComma:maybeexpression);if(type=="(")return cont(pushlex(")"),maybeexpression,comprehension,expect(")"),poplex,maybeop);if(type=="operator"||type=="spread")return cont(noComma?expressionNoComma:expression);if(type=="[")return cont(pushlex("]"),expressionNoComma,maybeArrayComprehension,poplex,maybeop);if(type=="{")return cont(commasep(objprop,"}"),maybeop);return cont();}
+function maybeexpression(type){if(type.match(/[;\}\)\],]/))return pass();return pass(expression);}
+function maybeexpressionNoComma(type){if(type.match(/[;\}\)\],]/))return pass();return pass(expressionNoComma);}
+function maybeoperatorComma(type,value){if(type==",")return cont(expression);return maybeoperatorNoComma(type,value,false);}
+function maybeoperatorNoComma(type,value,noComma){var me=noComma==false?maybeoperatorComma:maybeoperatorNoComma;var expr=noComma==false?expression:expressionNoComma;if(value=="=>")return cont(pushcontext,noComma?arrowBodyNoComma:arrowBody,popcontext);if(type=="operator"){if(/\+\+|--/.test(value))return cont(me);if(value=="?")return cont(expression,expect(":"),expr);return cont(expr);}
+if(type=="quasi"){cx.cc.push(me);return quasi(value);}
+if(type==";")return;if(type=="(")return cont(commasep(expressionNoComma,")","call"),me);if(type==".")return cont(property,me);if(type=="[")return cont(pushlex("]"),maybeexpression,expect("]"),poplex,me);}
+function quasi(value){if(!value)debugger;if(value.slice(value.length-2)!="${")return cont();return cont(expression,continueQuasi);}
+function continueQuasi(type){if(type=="}"){cx.marked="string-2";cx.state.tokenize=tokenQuasi;return cont();}}
+function arrowBody(type){findFatArrow(cx.stream,cx.state);if(type=="{")return pass(statement);return pass(expression);}
+function arrowBodyNoComma(type){findFatArrow(cx.stream,cx.state);if(type=="{")return pass(statement);return pass(expressionNoComma);}
+function maybelabel(type){if(type==":")return cont(poplex,statement);return pass(maybeoperatorComma,expect(";"),poplex);}
+function property(type){if(type=="variable"){cx.marked="property";return cont();}}
+function objprop(type,value){if(type=="variable"){cx.marked="property";if(value=="get"||value=="set")return cont(getterSetter);}else if(type=="number"||type=="string"){cx.marked=type+" property";}else if(type=="["){return cont(expression,expect("]"),afterprop);}
+if(atomicTypes.hasOwnProperty(type))return cont(afterprop);}
+function getterSetter(type){if(type!="variable")return pass(afterprop);cx.marked="property";return cont(functiondef);}
+function afterprop(type){if(type==":")return cont(expressionNoComma);if(type=="(")return pass(functiondef);}
+function commasep(what,end,info){function proceed(type){if(type==","){var lex=cx.state.lexical;if(lex.info=="call")lex.pos=(lex.pos||0)+1;return cont(what,proceed);}
+if(type==end)return cont();return cont(expect(end));}
+return function(type){if(type==end)return cont();if(info===false)return pass(what,proceed);return pass(pushlex(end,info),what,proceed,poplex);};}
+function block(type){if(type=="}")return cont();return pass(statement,block);}
+function maybetype(type){if(isTS&&type==":")return cont(typedef);}
+function typedef(type){if(type=="variable"){cx.marked="variable-3";return cont();}}
+function vardef(){return pass(pattern,maybetype,maybeAssign,vardefCont);}
+function pattern(type,value){if(type=="variable"){register(value);return cont();}
+if(type=="[")return cont(commasep(pattern,"]"));if(type=="{")return cont(commasep(proppattern,"}"));}
+function proppattern(type,value){if(type=="variable"&&!cx.stream.match(/^\s*:/,false)){register(value);return cont(maybeAssign);}
+if(type=="variable")cx.marked="property";return cont(expect(":"),pattern,maybeAssign);}
+function maybeAssign(_type,value){if(value=="=")return cont(expressionNoComma);}
+function vardefCont(type){if(type==",")return cont(vardef);}
+function maybeelse(type,value){if(type=="keyword b"&&value=="else")return cont(pushlex("form"),statement,poplex);}
+function forspec(type){if(type=="(")return cont(pushlex(")"),forspec1,expect(")"));}
+function forspec1(type){if(type=="var")return cont(vardef,expect(";"),forspec2);if(type==";")return cont(forspec2);if(type=="variable")return cont(formaybeinof);return pass(expression,expect(";"),forspec2);}
+function formaybeinof(_type,value){if(value=="in"||value=="of"){cx.marked="keyword";return cont(expression);}
+return cont(maybeoperatorComma,forspec2);}
+function forspec2(type,value){if(type==";")return cont(forspec3);if(value=="in"||value=="of"){cx.marked="keyword";return cont(expression);}
+return pass(expression,expect(";"),forspec3);}
+function forspec3(type){if(type!=")")cont(expression);}
+function functiondef(type,value){if(value=="*"){cx.marked="keyword";return cont(functiondef);}
+if(type=="variable"){register(value);return cont(functiondef);}
+if(type=="(")return cont(pushcontext,commasep(funarg,")"),statement,popcontext);}
+function funarg(type){if(type=="spread")return cont(funarg);return pass(pattern,maybetype);}
+function className(type,value){if(type=="variable"){register(value);return cont(classNameAfter);}}
+function classNameAfter(_type,value){if(value=="extends")return cont(expression);}
+function objlit(type){if(type=="{")return cont(commasep(objprop,"}"));}
+function afterModule(type,value){if(type=="string")return cont(statement);if(type=="variable"){register(value);return cont(maybeFrom);}}
+function afterExport(_type,value){if(value=="*"){cx.marked="keyword";return cont(maybeFrom,expect(";"));}
+if(value=="default"){cx.marked="keyword";return cont(expression,expect(";"));}
+return pass(statement);}
+function afterImport(type){if(type=="string")return cont();return pass(importSpec,maybeFrom);}
+function importSpec(type,value){if(type=="{")return cont(commasep(importSpec,"}"));if(type=="variable")register(value);return cont();}
+function maybeFrom(_type,value){if(value=="from"){cx.marked="keyword";return cont(expression);}}
+function maybeArrayComprehension(type){if(type=="for")return pass(comprehension);if(type==",")return cont(commasep(expressionNoComma,"]",false));return pass(commasep(expressionNoComma,"]",false));}
+function comprehension(type){if(type=="for")return cont(forspec,comprehension);if(type=="if")return cont(expression,comprehension);}
+return{startState:function(basecolumn){var state={tokenize:tokenBase,lastType:"sof",cc:[],lexical:new JSLexical((basecolumn||0)-indentUnit,0,"block",false),localVars:parserConfig.localVars,context:parserConfig.localVars&&{vars:parserConfig.localVars},indented:0};if(parserConfig.globalVars)state.globalVars=parserConfig.globalVars;return state;},token:function(stream,state){if(stream.sol()){if(!state.lexical.hasOwnProperty("align"))
+state.lexical.align=false;state.indented=stream.indentation();findFatArrow(stream,state);}
+if(state.tokenize!=tokenComment&&stream.eatSpace())return null;var style=state.tokenize(stream,state);if(type=="comment")return style;state.lastType=type=="operator"&&(content=="++"||content=="--")?"incdec":type;return parseJS(state,style,type,content,stream);},indent:function(state,textAfter){if(state.tokenize==tokenComment)return CodeMirror.Pass;if(state.tokenize!=tokenBase)return 0;var firstChar=textAfter&&textAfter.charAt(0),lexical=state.lexical;for(var i=state.cc.length-1;i>=0;--i){var c=state.cc[i];if(c==poplex)lexical=lexical.prev;else if(c!=maybeelse)break;}
+if(lexical.type=="stat"&&firstChar=="}")lexical=lexical.prev;if(statementIndent&&lexical.type==")"&&lexical.prev.type=="stat")
+lexical=lexical.prev;var type=lexical.type,closing=firstChar==type;if(type=="vardef")return lexical.indented+(state.lastType=="operator"||state.lastType==","?lexical.info+1:0);else if(type=="form"&&firstChar=="{")return lexical.indented;else if(type=="form")return lexical.indented+indentUnit;else if(type=="stat")
+return lexical.indented+(state.lastType=="operator"||state.lastType==","?statementIndent||indentUnit:0);else if(lexical.info=="switch"&&!closing&&parserConfig.doubleIndentSwitch!=false)
+return lexical.indented+(/^(?:case|default)\b/.test(textAfter)?indentUnit:2*indentUnit);else if(lexical.align)return lexical.column+(closing?0:1);else return lexical.indented+(closing?0:indentUnit);},electricChars:":{}",blockCommentStart:jsonMode?null:"/*",blockCommentEnd:jsonMode?null:"*/",lineComment:jsonMode?null:"//",fold:"brace",helperType:jsonMode?"json":"javascript",jsonMode:jsonMode};});CodeMirror.defineMIME("text/javascript","javascript");CodeMirror.defineMIME("text/ecmascript","javascript");CodeMirror.defineMIME("application/javascript","javascript");CodeMirror.defineMIME("application/ecmascript","javascript");CodeMirror.defineMIME("application/json",{name:"javascript",json:true});CodeMirror.defineMIME("application/x-json",{name:"javascript",json:true});CodeMirror.defineMIME("text/typescript",{name:"javascript",typescript:true});CodeMirror.defineMIME("application/typescript",{name:"javascript",typescript:true});;CodeMirror.defineMode("xml",function(config,parserConfig){var indentUnit=config.indentUnit;var multilineTagIndentFactor=parserConfig.multilineTagIndentFactor||1;var multilineTagIndentPastTag=parserConfig.multilineTagIndentPastTag||true;var Kludges=parserConfig.htmlMode?{autoSelfClosers:{'area':true,'base':true,'br':true,'col':true,'command':true,'embed':true,'frame':true,'hr':true,'img':true,'input':true,'keygen':true,'link':true,'meta':true,'param':true,'source':true,'track':true,'wbr':true},implicitlyClosed:{'dd':true,'li':true,'optgroup':true,'option':true,'p':true,'rp':true,'rt':true,'tbody':true,'td':true,'tfoot':true,'th':true,'tr':true},contextGrabbers:{'dd':{'dd':true,'dt':true},'dt':{'dd':true,'dt':true},'li':{'li':true},'option':{'option':true,'optgroup':true},'optgroup':{'optgroup':true},'p':{'address':true,'article':true,'aside':true,'blockquote':true,'dir':true,'div':true,'dl':true,'fieldset':true,'footer':true,'form':true,'h1':true,'h2':true,'h3':true,'h4':true,'h5':true,'h6':true,'header':true,'hgroup':true,'hr':true,'menu':true,'nav':true,'ol':true,'p':true,'pre':true,'section':true,'table':true,'ul':true},'rp':{'rp':true,'rt':true},'rt':{'rp':true,'rt':true},'tbody':{'tbody':true,'tfoot':true},'td':{'td':true,'th':true},'tfoot':{'tbody':true},'th':{'td':true,'th':true},'thead':{'tbody':true,'tfoot':true},'tr':{'tr':true}},doNotIndent:{"pre":true},allowUnquoted:true,allowMissing:true}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:false,allowMissing:false};var alignCDATA=parserConfig.alignCDATA;var tagName,type;function inText(stream,state){function chain(parser){state.tokenize=parser;return parser(stream,state);}
+var ch=stream.next();if(ch=="<"){if(stream.eat("!")){if(stream.eat("[")){if(stream.match("CDATA["))return chain(inBlock("atom","]]>"));else return null;}else if(stream.match("--")){return chain(inBlock("comment","-->"));}else if(stream.match("DOCTYPE",true,true)){stream.eatWhile(/[\w\._\-]/);return chain(doctype(1));}else{return null;}}else if(stream.eat("?")){stream.eatWhile(/[\w\._\-]/);state.tokenize=inBlock("meta","?>");return"meta";}else{var isClose=stream.eat("/");tagName="";var c;while((c=stream.eat(/[^\s\u00a0=<>\"\'\/?]/)))tagName+=c;if(!tagName)return"tag error";type=isClose?"closeTag":"openTag";state.tokenize=inTag;return"tag";}}else if(ch=="&"){var ok;if(stream.eat("#")){if(stream.eat("x")){ok=stream.eatWhile(/[a-fA-F\d]/)&&stream.eat(";");}else{ok=stream.eatWhile(/[\d]/)&&stream.eat(";");}}else{ok=stream.eatWhile(/[\w\.\-:]/)&&stream.eat(";");}
+return ok?"atom":"error";}else{stream.eatWhile(/[^&<]/);return null;}}
+function inTag(stream,state){var ch=stream.next();if(ch==">"||(ch=="/"&&stream.eat(">"))){state.tokenize=inText;type=ch==">"?"endTag":"selfcloseTag";return"tag";}else if(ch=="="){type="equals";return null;}else if(ch=="<"){state.tokenize=inText;var next=state.tokenize(stream,state);return next?next+" error":"error";}else if(/[\'\"]/.test(ch)){state.tokenize=inAttribute(ch);state.stringStartCol=stream.column();return state.tokenize(stream,state);}else{stream.eatWhile(/[^\s\u00a0=<>\"\']/);return"word";}}
+function inAttribute(quote){var closure=function(stream,state){while(!stream.eol()){if(stream.next()==quote){state.tokenize=inTag;break;}}
+return"string";};closure.isInAttribute=true;return closure;}
+function inBlock(style,terminator){return function(stream,state){while(!stream.eol()){if(stream.match(terminator)){state.tokenize=inText;break;}
+stream.next();}
+return style;};}
+function doctype(depth){return function(stream,state){var ch;while((ch=stream.next())!=null){if(ch=="<"){state.tokenize=doctype(depth+1);return state.tokenize(stream,state);}else if(ch==">"){if(depth==1){state.tokenize=inText;break;}else{state.tokenize=doctype(depth-1);return state.tokenize(stream,state);}}}
+return"meta";};}
+var curState,curStream,setStyle;function pass(){for(var i=arguments.length-1;i>=0;i--)curState.cc.push(arguments[i]);}
+function cont(){pass.apply(null,arguments);return true;}
+function pushContext(tagName,startOfLine){var noIndent=Kludges.doNotIndent.hasOwnProperty(tagName)||(curState.context&&curState.context.noIndent);curState.context={prev:curState.context,tagName:tagName,indent:curState.indented,startOfLine:startOfLine,noIndent:noIndent};}
+function popContext(){if(curState.context)curState.context=curState.context.prev;}
+function element(type){if(type=="openTag"){curState.tagName=tagName;curState.tagStart=curStream.column();return cont(attributes,endtag(curState.startOfLine));}else if(type=="closeTag"){var err=false;if(curState.context){if(curState.context.tagName!=tagName){if(Kludges.implicitlyClosed.hasOwnProperty(curState.context.tagName.toLowerCase())){popContext();}
+err=!curState.context||curState.context.tagName!=tagName;}}else{err=true;}
+if(err)setStyle="error";return cont(endclosetag(err));}
+return cont();}
+function endtag(startOfLine){return function(type){var tagName=curState.tagName;curState.tagName=curState.tagStart=null;if(type=="selfcloseTag"||(type=="endTag"&&Kludges.autoSelfClosers.hasOwnProperty(tagName.toLowerCase()))){maybePopContext(tagName.toLowerCase());return cont();}
+if(type=="endTag"){maybePopContext(tagName.toLowerCase());pushContext(tagName,startOfLine);return cont();}
+return cont();};}
+function endclosetag(err){return function(type){if(err)setStyle="error";if(type=="endTag"){popContext();return cont();}
+setStyle="error";return cont(arguments.callee);};}
+function maybePopContext(nextTagName){var parentTagName;while(true){if(!curState.context){return;}
+parentTagName=curState.context.tagName.toLowerCase();if(!Kludges.contextGrabbers.hasOwnProperty(parentTagName)||!Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)){return;}
+popContext();}}
+function attributes(type){if(type=="word"){setStyle="attribute";return cont(attribute,attributes);}
+if(type=="endTag"||type=="selfcloseTag")return pass();setStyle="error";return cont(attributes);}
+function attribute(type){if(type=="equals")return cont(attvalue,attributes);if(!Kludges.allowMissing)setStyle="error";else if(type=="word"){setStyle="attribute";return cont(attribute,attributes);}
+return(type=="endTag"||type=="selfcloseTag")?pass():cont();}
+function attvalue(type){if(type=="string")return cont(attvaluemaybe);if(type=="word"&&Kludges.allowUnquoted){setStyle="string";return cont();}
+setStyle="error";return(type=="endTag"||type=="selfCloseTag")?pass():cont();}
+function attvaluemaybe(type){if(type=="string")return cont(attvaluemaybe);else return pass();}
+return{startState:function(){return{tokenize:inText,cc:[],indented:0,startOfLine:true,tagName:null,tagStart:null,context:null};},token:function(stream,state){if(!state.tagName&&stream.sol()){state.startOfLine=true;state.indented=stream.indentation();}
+if(stream.eatSpace())return null;setStyle=type=tagName=null;var style=state.tokenize(stream,state);state.type=type;if((style||type)&&style!="comment"){curState=state;curStream=stream;while(true){var comb=state.cc.pop()||element;if(comb(type||style))break;}}
+state.startOfLine=false;if(setStyle)
+style=setStyle=="error"?style+" error":setStyle;return style;},indent:function(state,textAfter,fullLine){var context=state.context;if(state.tokenize.isInAttribute){return state.stringStartCol+1;}
+if((state.tokenize!=inTag&&state.tokenize!=inText)||context&&context.noIndent)
+return fullLine?fullLine.match(/^(\s*)/)[0].length:0;if(state.tagName){if(multilineTagIndentPastTag)
+return state.tagStart+state.tagName.length+2;else
+return state.tagStart+indentUnit*multilineTagIndentFactor;}
+if(alignCDATA&&/<!\[CDATA\[/.test(textAfter))return 0;if(context&&/^<\//.test(textAfter))
+context=context.prev;while(context&&!context.startOfLine)
+context=context.prev;if(context)return context.indent+indentUnit;else return 0;},electricChars:"/",blockCommentStart:"<!--",blockCommentEnd:"-->",configuration:parserConfig.htmlMode?"html":"xml",helperType:parserConfig.htmlMode?"html":"xml"};});CodeMirror.defineMIME("text/xml","xml");CodeMirror.defineMIME("application/xml","xml");if(!CodeMirror.mimeModes.hasOwnProperty("text/html"))
+CodeMirror.defineMIME("text/html",{name:"xml",htmlMode:true});;CodeMirror.defineMode("htmlmixed",function(config,parserConfig){var htmlMode=CodeMirror.getMode(config,{name:"xml",htmlMode:true});var cssMode=CodeMirror.getMode(config,"css");var scriptTypes=[],scriptTypesConf=parserConfig&&parserConfig.scriptTypes;scriptTypes.push({matches:/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,mode:CodeMirror.getMode(config,"javascript")});if(scriptTypesConf)for(var i=0;i<scriptTypesConf.length;++i){var conf=scriptTypesConf[i];scriptTypes.push({matches:conf.matches,mode:conf.mode&&CodeMirror.getMode(config,conf.mode)});}
+scriptTypes.push({matches:/./,mode:CodeMirror.getMode(config,"text/plain")});function html(stream,state){var tagName=state.htmlState.tagName;var style=htmlMode.token(stream,state.htmlState);if(tagName=="script"&&/\btag\b/.test(style)&&stream.current()==">"){var scriptType=stream.string.slice(Math.max(0,stream.pos-100),stream.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);scriptType=scriptType?scriptType[1]:"";if(scriptType&&/[\"\']/.test(scriptType.charAt(0)))scriptType=scriptType.slice(1,scriptType.length-1);for(var i=0;i<scriptTypes.length;++i){var tp=scriptTypes[i];if(typeof tp.matches=="string"?scriptType==tp.matches:tp.matches.test(scriptType)){if(tp.mode){state.token=script;state.localMode=tp.mode;state.localState=tp.mode.startState&&tp.mode.startState(htmlMode.indent(state.htmlState,""));}
+break;}}}else if(tagName=="style"&&/\btag\b/.test(style)&&stream.current()==">"){state.token=css;state.localMode=cssMode;state.localState=cssMode.startState(htmlMode.indent(state.htmlState,""));}
+return style;}
+function maybeBackup(stream,pat,style){var cur=stream.current();var close=cur.search(pat),m;if(close>-1)stream.backUp(cur.length-close);else if(m=cur.match(/<\/?$/)){stream.backUp(cur.length);if(!stream.match(pat,false))stream.match(cur);}
+return style;}
+function script(stream,state){if(stream.match(/^<\/\s*script\s*>/i,false)){state.token=html;state.localState=state.localMode=null;return html(stream,state);}
+return maybeBackup(stream,/<\/\s*script\s*>/,state.localMode.token(stream,state.localState));}
+function css(stream,state){if(stream.match(/^<\/\s*style\s*>/i,false)){state.token=html;state.localState=state.localMode=null;return html(stream,state);}
+return maybeBackup(stream,/<\/\s*style\s*>/,cssMode.token(stream,state.localState));}
+return{startState:function(){var state=htmlMode.startState();return{token:html,localMode:null,localState:null,htmlState:state};},copyState:function(state){if(state.localState)
+var local=CodeMirror.copyState(state.localMode,state.localState);return{token:state.token,localMode:state.localMode,localState:local,htmlState:CodeMirror.copyState(htmlMode,state.htmlState)};},token:function(stream,state){return state.token(stream,state);},indent:function(state,textAfter){if(!state.localMode||/^\s*<\//.test(textAfter))
+return htmlMode.indent(state.htmlState,textAfter);else if(state.localMode.indent)
+return state.localMode.indent(state.localState,textAfter);else
+return CodeMirror.Pass;},electricChars:"/{}:",innerMode:function(state){return{state:state.localState||state.htmlState,mode:state.localMode||htmlMode};}};},"xml","javascript","css");CodeMirror.defineMIME("text/html","htmlmixed");;WebInspector={};FormatterWorker={createTokenizer:function(mimeType)
+{var mode=CodeMirror.getMode({indentUnit:2},mimeType);var state=CodeMirror.startState(mode);function tokenize(line,callback)
+{var stream=new CodeMirror.StringStream(line);while(!stream.eol()){var style=mode.token(stream,state);var value=stream.current();callback(value,style,stream.start,stream.start+value.length);stream.start=stream.pos;}}
+return tokenize;}};var FormatterParameters;var onmessage=function(event){var data=(event.data);if(!data.method)
+return;FormatterWorker[data.method](data.params);};FormatterWorker.format=function(params)
+{var indentString=params.indentString||"    ";var result={};if(params.mimeType==="text/html"){var formatter=new FormatterWorker.HTMLFormatter(indentString);result=formatter.format(params.content);}else if(params.mimeType==="text/css"){result.mapping={original:[0],formatted:[0]};result.content=FormatterWorker._formatCSS(params.content,result.mapping,0,0,indentString);}else{result.mapping={original:[0],formatted:[0]};result.content=FormatterWorker._formatScript(params.content,result.mapping,0,0,indentString);}
+postMessage(result);}
+FormatterWorker._chunkCount=function(totalLength,chunkSize)
+{if(totalLength<=chunkSize)
+return 1;var remainder=totalLength%chunkSize;var partialLength=totalLength-remainder;return(partialLength/chunkSize)+(remainder?1:0);}
+FormatterWorker.javaScriptOutline=function(params)
+{var chunkSize=100000;var totalLength=params.content.length;var lines=params.content.split("\n");var chunkCount=FormatterWorker._chunkCount(totalLength,chunkSize);var outlineChunk=[];var previousIdentifier=null;var previousToken=null;var previousTokenType=null;var currentChunk=1;var processedChunkCharacters=0;var addedFunction=false;var isReadingArguments=false;var argumentsText="";var currentFunction=null;var tokenizer=FormatterWorker.createTokenizer("text/javascript");for(var i=0;i<lines.length;++i){var line=lines[i];tokenizer(line,processToken);}
+function isJavaScriptIdentifier(tokenType)
+{if(!tokenType)
+return false;return tokenType.startsWith("variable")||tokenType.startsWith("property")||tokenType==="def";}
+function processToken(tokenValue,tokenType,column,newColumn)
+{if(isJavaScriptIdentifier(tokenType)){previousIdentifier=tokenValue;if(tokenValue&&previousToken==="function"){currentFunction={line:i,column:column,name:tokenValue};addedFunction=true;previousIdentifier=null;}}else if(tokenType==="keyword"){if(tokenValue==="function"){if(previousIdentifier&&(previousToken==="="||previousToken===":")){currentFunction={line:i,column:column,name:previousIdentifier};addedFunction=true;previousIdentifier=null;}}}else if(tokenValue==="."&&isJavaScriptIdentifier(previousTokenType))
+previousIdentifier+=".";else if(tokenValue==="("&&addedFunction)
+isReadingArguments=true;if(isReadingArguments&&tokenValue)
+argumentsText+=tokenValue;if(tokenValue===")"&&isReadingArguments){addedFunction=false;isReadingArguments=false;currentFunction.arguments=argumentsText.replace(/,[\r\n\s]*/g,", ").replace(/([^,])[\r\n\s]+/g,"$1");argumentsText="";outlineChunk.push(currentFunction);}
+if(tokenValue.trim().length){previousToken=tokenValue;previousTokenType=tokenType;}
+processedChunkCharacters+=newColumn-column;if(processedChunkCharacters>=chunkSize){postMessage({chunk:outlineChunk,total:chunkCount,index:currentChunk++});outlineChunk=[];processedChunkCharacters=0;}}
+postMessage({chunk:outlineChunk,total:chunkCount,index:chunkCount});}
+FormatterWorker.CSSParserStates={Initial:"Initial",Selector:"Selector",Style:"Style",PropertyName:"PropertyName",PropertyValue:"PropertyValue",AtRule:"AtRule",};FormatterWorker.parseCSS=function(params)
+{var chunkSize=100000;var lines=params.content.split("\n");var rules=[];var processedChunkCharacters=0;var state=FormatterWorker.CSSParserStates.Initial;var rule;var property;var UndefTokenType={};function processToken(tokenValue,tokenTypes,column,newColumn)
+{var tokenType=tokenTypes?tokenTypes.split(" ").keySet():UndefTokenType;switch(state){case FormatterWorker.CSSParserStates.Initial:if(tokenType["qualifier"]||tokenType["builtin"]||tokenType["tag"]){rule={selectorText:tokenValue,lineNumber:lineNumber,columNumber:column,properties:[],};state=FormatterWorker.CSSParserStates.Selector;}else if(tokenType["def"]){rule={atRule:tokenValue,lineNumber:lineNumber,columNumber:column,};state=FormatterWorker.CSSParserStates.AtRule;}
+break;case FormatterWorker.CSSParserStates.Selector:if(tokenValue==="{"&&tokenType===UndefTokenType){rule.selectorText=rule.selectorText.trim();state=FormatterWorker.CSSParserStates.Style;}else{rule.selectorText+=tokenValue;}
+break;case FormatterWorker.CSSParserStates.AtRule:if((tokenValue===";"||tokenValue==="{")&&tokenType===UndefTokenType){rule.atRule=rule.atRule.trim();rules.push(rule);state=FormatterWorker.CSSParserStates.Initial;}else{rule.atRule+=tokenValue;}
+break;case FormatterWorker.CSSParserStates.Style:if(tokenType["meta"]||tokenType["property"]){property={name:tokenValue,value:"",};state=FormatterWorker.CSSParserStates.PropertyName;}else if(tokenValue==="}"&&tokenType===UndefTokenType){rules.push(rule);state=FormatterWorker.CSSParserStates.Initial;}
+break;case FormatterWorker.CSSParserStates.PropertyName:if(tokenValue===":"&&tokenType["operator"]){property.name=property.name.trim();state=FormatterWorker.CSSParserStates.PropertyValue;}else if(tokenType["property"]){property.name+=tokenValue;}
+break;case FormatterWorker.CSSParserStates.PropertyValue:if(tokenValue===";"&&tokenType===UndefTokenType){property.value=property.value.trim();rule.properties.push(property);state=FormatterWorker.CSSParserStates.Style;}else if(tokenValue==="}"&&tokenType===UndefTokenType){property.value=property.value.trim();rule.properties.push(property);rules.push(rule);state=FormatterWorker.CSSParserStates.Initial;}else if(!tokenType["comment"]){property.value+=tokenValue;}
+break;default:console.assert(false,"Unknown CSS parser state.");}
+processedChunkCharacters+=newColumn-column;if(processedChunkCharacters>chunkSize){postMessage({chunk:rules,isLastChunk:false});rules=[];processedChunkCharacters=0;}}
+var tokenizer=FormatterWorker.createTokenizer("text/css");var lineNumber;for(lineNumber=0;lineNumber<lines.length;++lineNumber){var line=lines[lineNumber];tokenizer(line,processToken);}
+postMessage({chunk:rules,isLastChunk:true});}
+FormatterWorker._formatScript=function(content,mapping,offset,formattedOffset,indentString)
+{var formattedContent;try{var tokenizer=new FormatterWorker.JavaScriptTokenizer(content);var builder=new FormatterWorker.JavaScriptFormattedContentBuilder(tokenizer.content(),mapping,offset,formattedOffset,indentString);var formatter=new FormatterWorker.JavaScriptFormatter(tokenizer,builder);formatter.format();formattedContent=builder.content();}catch(e){formattedContent=content;}
+return formattedContent;}
+FormatterWorker._formatCSS=function(content,mapping,offset,formattedOffset,indentString)
+{var formattedContent;try{var builder=new FormatterWorker.CSSFormattedContentBuilder(content,mapping,offset,formattedOffset,indentString);var formatter=new FormatterWorker.CSSFormatter(content,builder);formatter.format();formattedContent=builder.content();}catch(e){formattedContent=content;}
+return formattedContent;}
+FormatterWorker.HTMLFormatter=function(indentString)
+{this._indentString=indentString;}
+FormatterWorker.HTMLFormatter.prototype={format:function(content)
+{this.line=content;this._content=content;this._formattedContent="";this._mapping={original:[0],formatted:[0]};this._position=0;var scriptOpened=false;var styleOpened=false;var tokenizer=FormatterWorker.createTokenizer("text/html");function processToken(tokenValue,tokenType,tokenStart,tokenEnd){if(tokenType!=="tag")
+return;if(tokenValue.toLowerCase()==="<script"){scriptOpened=true;}else if(scriptOpened&&tokenValue===">"){scriptOpened=false;this._scriptStarted(tokenEnd);}else if(tokenValue.toLowerCase()==="</script"){this._scriptEnded(tokenStart);}else if(tokenValue.toLowerCase()==="<style"){styleOpened=true;}else if(styleOpened&&tokenValue===">"){styleOpened=false;this._styleStarted(tokenEnd);}else if(tokenValue.toLowerCase()==="</style"){this._styleEnded(tokenStart);}}
+tokenizer(content,processToken.bind(this));this._formattedContent+=this._content.substring(this._position);return{content:this._formattedContent,mapping:this._mapping};},_scriptStarted:function(cursor)
+{this._handleSubFormatterStart(cursor);},_scriptEnded:function(cursor)
+{this._handleSubFormatterEnd(FormatterWorker._formatScript,cursor);},_styleStarted:function(cursor)
+{this._handleSubFormatterStart(cursor);},_styleEnded:function(cursor)
+{this._handleSubFormatterEnd(FormatterWorker._formatCSS,cursor);},_handleSubFormatterStart:function(cursor)
+{this._formattedContent+=this._content.substring(this._position,cursor);this._formattedContent+="\n";this._position=cursor;},_handleSubFormatterEnd:function(formatFunction,cursor)
+{if(cursor===this._position)
+return;var scriptContent=this._content.substring(this._position,cursor);this._mapping.original.push(this._position);this._mapping.formatted.push(this._formattedContent.length);var formattedScriptContent=formatFunction(scriptContent,this._mapping,this._position,this._formattedContent.length,this._indentString);this._formattedContent+=formattedScriptContent;this._position=cursor;}}
+Array.prototype.keySet=function()
+{var keys={};for(var i=0;i<this.length;++i)
+keys[this[i]]=true;return keys;};function require()
+{return parse;}
+var exports={tokenizer:null};var KEYWORDS=array_to_hash(["break","case","catch","const","continue","default","delete","do","else","finally","for","function","if","in","instanceof","new","return","switch","throw","try","typeof","var","void","while","with"]);var RESERVED_WORDS=array_to_hash(["abstract","boolean","byte","char","class","debugger","double","enum","export","extends","final","float","goto","implements","import","int","interface","long","native","package","private","protected","public","short","static","super","synchronized","throws","transient","volatile"]);var KEYWORDS_BEFORE_EXPRESSION=array_to_hash(["return","new","delete","throw","else","case"]);var KEYWORDS_ATOM=array_to_hash(["false","null","true","undefined"]);var OPERATOR_CHARS=array_to_hash(characters("+-*&%=<>!?|~^"));var RE_HEX_NUMBER=/^0x[0-9a-f]+$/i;var RE_OCT_NUMBER=/^0[0-7]+$/;var RE_DEC_NUMBER=/^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i;var OPERATORS=array_to_hash(["in","instanceof","typeof","new","void","delete","++","--","+","-","!","~","&","|","^","*","/","%",">>","<<",">>>","<",">","<=",">=","==","===","!=","!==","?","=","+=","-=","/=","*=","%=",">>=","<<=",">>>=","%=","|=","^=","&=","&&","||"]);var WHITESPACE_CHARS=array_to_hash(characters(" \n\r\t"));var PUNC_BEFORE_EXPRESSION=array_to_hash(characters("[{}(,.;:"));var PUNC_CHARS=array_to_hash(characters("[]{}(),;:"));var REGEXP_MODIFIERS=array_to_hash(characters("gmsiy"));function is_alphanumeric_char(ch){ch=ch.charCodeAt(0);return(ch>=48&&ch<=57)||(ch>=65&&ch<=90)||(ch>=97&&ch<=122);};function is_identifier_char(ch){return is_alphanumeric_char(ch)||ch=="$"||ch=="_";};function is_digit(ch){ch=ch.charCodeAt(0);return ch>=48&&ch<=57;};function parse_js_number(num){if(RE_HEX_NUMBER.test(num)){return parseInt(num.substr(2),16);}else if(RE_OCT_NUMBER.test(num)){return parseInt(num.substr(1),8);}else if(RE_DEC_NUMBER.test(num)){return parseFloat(num);}};function JS_Parse_Error(message,line,col,pos){this.message=message;this.line=line;this.col=col;this.pos=pos;try{({})();}catch(ex){this.stack=ex.stack;};};JS_Parse_Error.prototype.toString=function(){return this.message+" (line: "+this.line+", col: "+this.col+", pos: "+this.pos+")"+"\n\n"+this.stack;};function js_error(message,line,col,pos){throw new JS_Parse_Error(message,line,col,pos);};function is_token(token,type,val){return token.type==type&&(val==null||token.value==val);};var EX_EOF={};function tokenizer($TEXT){var S={text:$TEXT.replace(/\r\n?|[\n\u2028\u2029]/g,"\n").replace(/^\uFEFF/,''),pos:0,tokpos:0,line:0,tokline:0,col:0,tokcol:0,newline_before:false,regex_allowed:false,comments_before:[]};function peek(){return S.text.charAt(S.pos);};function next(signal_eof){var ch=S.text.charAt(S.pos++);if(signal_eof&&!ch)
+throw EX_EOF;if(ch=="\n"){S.newline_before=true;++S.line;S.col=0;}else{++S.col;}
+return ch;};function eof(){return!S.peek();};function find(what,signal_eof){var pos=S.text.indexOf(what,S.pos);if(signal_eof&&pos==-1)throw EX_EOF;return pos;};function start_token(){S.tokline=S.line;S.tokcol=S.col;S.tokpos=S.pos;};function token(type,value,is_comment){S.regex_allowed=((type=="operator"&&!HOP(UNARY_POSTFIX,value))||(type=="keyword"&&HOP(KEYWORDS_BEFORE_EXPRESSION,value))||(type=="punc"&&HOP(PUNC_BEFORE_EXPRESSION,value)));var ret={type:type,value:value,line:S.tokline,col:S.tokcol,pos:S.tokpos,nlb:S.newline_before};if(!is_comment){ret.comments_before=S.comments_before;S.comments_before=[];}
+S.newline_before=false;return ret;};function skip_whitespace(){while(HOP(WHITESPACE_CHARS,peek()))
+next();};function read_while(pred){var ret="",ch=peek(),i=0;while(ch&&pred(ch,i++)){ret+=next();ch=peek();}
+return ret;};function parse_error(err){js_error(err,S.tokline,S.tokcol,S.tokpos);};function read_num(prefix){var has_e=false,after_e=false,has_x=false,has_dot=prefix==".";var num=read_while(function(ch,i){if(ch=="x"||ch=="X"){if(has_x)return false;return has_x=true;}
+if(!has_x&&(ch=="E"||ch=="e")){if(has_e)return false;return has_e=after_e=true;}
+if(ch=="-"){if(after_e||(i==0&&!prefix))return true;return false;}
+if(ch=="+")return after_e;after_e=false;if(ch=="."){if(!has_dot)
+return has_dot=true;return false;}
+return is_alphanumeric_char(ch);});if(prefix)
+num=prefix+num;var valid=parse_js_number(num);if(!isNaN(valid)){return token("num",valid);}else{parse_error("Invalid syntax: "+num);}};function read_escaped_char(){var ch=next(true);switch(ch){case"n":return"\n";case"r":return"\r";case"t":return"\t";case"b":return"\b";case"v":return"\v";case"f":return"\f";case"0":return"\0";case"x":return String.fromCharCode(hex_bytes(2));case"u":return String.fromCharCode(hex_bytes(4));default:return ch;}};function hex_bytes(n){var num=0;for(;n>0;--n){var digit=parseInt(next(true),16);if(isNaN(digit))
+parse_error("Invalid hex-character pattern in string");num=(num<<4)|digit;}
+return num;};function read_string(){return with_eof_error("Unterminated string constant",function(){var quote=next(),ret="";for(;;){var ch=next(true);if(ch=="\\")ch=read_escaped_char();else if(ch==quote)break;ret+=ch;}
+return token("string",ret);});};function read_line_comment(){next();var i=find("\n"),ret;if(i==-1){ret=S.text.substr(S.pos);S.pos=S.text.length;}else{ret=S.text.substring(S.pos,i);S.pos=i;}
+return token("comment1",ret,true);};function read_multiline_comment(){next();return with_eof_error("Unterminated multiline comment",function(){var i=find("*/",true),text=S.text.substring(S.pos,i),tok=token("comment2",text,true);S.pos=i+2;S.line+=text.split("\n").length-1;S.newline_before=text.indexOf("\n")>=0;return tok;});};function read_regexp(){return with_eof_error("Unterminated regular expression",function(){var prev_backslash=false,regexp="",ch,in_class=false;while((ch=next(true)))if(prev_backslash){regexp+="\\"+ch;prev_backslash=false;}else if(ch=="["){in_class=true;regexp+=ch;}else if(ch=="]"&&in_class){in_class=false;regexp+=ch;}else if(ch=="/"&&!in_class){break;}else if(ch=="\\"){prev_backslash=true;}else{regexp+=ch;}
+var mods=read_while(function(ch){return HOP(REGEXP_MODIFIERS,ch);});return token("regexp",[regexp,mods]);});};function read_operator(prefix){function grow(op){if(!peek())return op;var bigger=op+peek();if(HOP(OPERATORS,bigger)){next();return grow(bigger);}else{return op;}};return token("operator",grow(prefix||next()));};function handle_slash(){next();var regex_allowed=S.regex_allowed;switch(peek()){case"/":S.comments_before.push(read_line_comment());S.regex_allowed=regex_allowed;return next_token();case"*":S.comments_before.push(read_multiline_comment());S.regex_allowed=regex_allowed;return next_token();}
+return S.regex_allowed?read_regexp():read_operator("/");};function handle_dot(){next();return is_digit(peek())?read_num("."):token("punc",".");};function read_word(){var word=read_while(is_identifier_char);return!HOP(KEYWORDS,word)?token("name",word):HOP(OPERATORS,word)?token("operator",word):HOP(KEYWORDS_ATOM,word)?token("atom",word):token("keyword",word);};function with_eof_error(eof_error,cont){try{return cont();}catch(ex){if(ex===EX_EOF)parse_error(eof_error);else throw ex;}};function next_token(force_regexp){if(force_regexp)
+return read_regexp();skip_whitespace();start_token();var ch=peek();if(!ch)return token("eof");if(is_digit(ch))return read_num();if(ch=='"'||ch=="'")return read_string();if(HOP(PUNC_CHARS,ch))return token("punc",next());if(ch==".")return handle_dot();if(ch=="/")return handle_slash();if(HOP(OPERATOR_CHARS,ch))return read_operator();if(is_identifier_char(ch))return read_word();parse_error("Unexpected character '"+ch+"'");};next_token.context=function(nc){if(nc)S=nc;return S;};return next_token;};var UNARY_PREFIX=array_to_hash(["typeof","void","delete","--","++","!","~","-","+"]);var UNARY_POSTFIX=array_to_hash(["--","++"]);var ASSIGNMENT=(function(a,ret,i){while(i<a.length){ret[a[i]]=a[i].substr(0,a[i].length-1);i++;}
+return ret;})(["+=","-=","/=","*=","%=",">>=","<<=",">>>=","|=","^=","&="],{"=":true},0);var PRECEDENCE=(function(a,ret){for(var i=0,n=1;i<a.length;++i,++n){var b=a[i];for(var j=0;j<b.length;++j){ret[b[j]]=n;}}
+return ret;})([["||"],["&&"],["|"],["^"],["&"],["==","===","!=","!=="],["<",">","<=",">=","in","instanceof"],[">>","<<",">>>"],["+","-"],["*","/","%"]],{});var STATEMENTS_WITH_LABELS=array_to_hash(["for","do","while","switch"]);var ATOMIC_START_TOKEN=array_to_hash(["atom","num","string","regexp","name"]);function NodeWithToken(str,start,end){this.name=str;this.start=start;this.end=end;};NodeWithToken.prototype.toString=function(){return this.name;};function parse($TEXT,strict_mode,embed_tokens){var S={input:typeof $TEXT=="string"?tokenizer($TEXT,true):$TEXT,token:null,prev:null,peeked:null,in_function:0,in_loop:0,labels:[]};S.token=next();function is(type,value){return is_token(S.token,type,value);};function peek(){return S.peeked||(S.peeked=S.input());};function next(){S.prev=S.token;if(S.peeked){S.token=S.peeked;S.peeked=null;}else{S.token=S.input();}
+return S.token;};function prev(){return S.prev;};function croak(msg,line,col,pos){var ctx=S.input.context();js_error(msg,line!=null?line:ctx.tokline,col!=null?col:ctx.tokcol,pos!=null?pos:ctx.tokpos);};function token_error(token,msg){croak(msg,token.line,token.col);};function unexpected(token){if(token==null)
+token=S.token;token_error(token,"Unexpected token: "+token.type+" ("+token.value+")");};function expect_token(type,val){if(is(type,val)){return next();}
+token_error(S.token,"Unexpected token "+S.token.type+", expected "+type);};function expect(punc){return expect_token("punc",punc);};function can_insert_semicolon(){return!strict_mode&&(S.token.nlb||is("eof")||is("punc","}"));};function semicolon(){if(is("punc",";"))next();else if(!can_insert_semicolon())unexpected();};function as(){return slice(arguments);};function parenthesised(){expect("(");var ex=expression();expect(")");return ex;};function add_tokens(str,start,end){return new NodeWithToken(str,start,end);};var statement=embed_tokens?function(){var start=S.token;var stmt=$statement();stmt[0]=add_tokens(stmt[0],start,prev());return stmt;}:$statement;function $statement(){if(is("operator","/")){S.peeked=null;S.token=S.input(true);}
+switch(S.token.type){case"num":case"string":case"regexp":case"operator":case"atom":return simple_statement();case"name":return is_token(peek(),"punc",":")?labeled_statement(prog1(S.token.value,next,next)):simple_statement();case"punc":switch(S.token.value){case"{":return as("block",block_());case"[":case"(":return simple_statement();case";":next();return as("block");default:unexpected();}
+case"keyword":switch(prog1(S.token.value,next)){case"break":return break_cont("break");case"continue":return break_cont("continue");case"debugger":semicolon();return as("debugger");case"do":return(function(body){expect_token("keyword","while");return as("do",prog1(parenthesised,semicolon),body);})(in_loop(statement));case"for":return for_();case"function":return function_(true);case"if":return if_();case"return":if(S.in_function==0)
+croak("'return' outside of function");return as("return",is("punc",";")?(next(),null):can_insert_semicolon()?null:prog1(expression,semicolon));case"switch":return as("switch",parenthesised(),switch_block_());case"throw":return as("throw",prog1(expression,semicolon));case"try":return try_();case"var":return prog1(var_,semicolon);case"const":return prog1(const_,semicolon);case"while":return as("while",parenthesised(),in_loop(statement));case"with":return as("with",parenthesised(),statement());default:unexpected();}}};function labeled_statement(label){S.labels.push(label);var start=S.token,stat=statement();if(strict_mode&&!HOP(STATEMENTS_WITH_LABELS,stat[0]))
+unexpected(start);S.labels.pop();return as("label",label,stat);};function simple_statement(){return as("stat",prog1(expression,semicolon));};function break_cont(type){var name=is("name")?S.token.value:null;if(name!=null){next();if(!member(name,S.labels))
+croak("Label "+name+" without matching loop or statement");}
+else if(S.in_loop==0)
+croak(type+" not inside a loop or switch");semicolon();return as(type,name);};function for_(){expect("(");var has_var=is("keyword","var");if(has_var)
+next();if(is("name")&&is_token(peek(),"operator","in")){var name=S.token.value;next();next();var obj=expression();expect(")");return as("for-in",has_var,name,obj,in_loop(statement));}else{var init=is("punc",";")?null:has_var?var_():expression();expect(";");var test=is("punc",";")?null:expression();expect(";");var step=is("punc",")")?null:expression();expect(")");return as("for",init,test,step,in_loop(statement));}};function function_(in_statement){var name=is("name")?prog1(S.token.value,next):null;if(in_statement&&!name)
+unexpected();expect("(");return as(in_statement?"defun":"function",name,(function(first,a){while(!is("punc",")")){if(first)first=false;else expect(",");if(!is("name"))unexpected();a.push(S.token.value);next();}
+next();return a;})(true,[]),(function(){++S.in_function;var loop=S.in_loop;S.in_loop=0;var a=block_();--S.in_function;S.in_loop=loop;return a;})());};function if_(){var cond=parenthesised(),body=statement(),belse;if(is("keyword","else")){next();belse=statement();}
+return as("if",cond,body,belse);};function block_(){expect("{");var a=[];while(!is("punc","}")){if(is("eof"))unexpected();a.push(statement());}
+next();return a;};var switch_block_=curry(in_loop,function(){expect("{");var a=[],cur=null;while(!is("punc","}")){if(is("eof"))unexpected();if(is("keyword","case")){next();cur=[];a.push([expression(),cur]);expect(":");}
+else if(is("keyword","default")){next();expect(":");cur=[];a.push([null,cur]);}
+else{if(!cur)unexpected();cur.push(statement());}}
+next();return a;});function try_(){var body=block_(),bcatch,bfinally;if(is("keyword","catch")){next();expect("(");if(!is("name"))
+croak("Name expected");var name=S.token.value;next();expect(")");bcatch=[name,block_()];}
+if(is("keyword","finally")){next();bfinally=block_();}
+if(!bcatch&&!bfinally)
+croak("Missing catch/finally blocks");return as("try",body,bcatch,bfinally);};function vardefs(){var a=[];for(;;){if(!is("name"))
+unexpected();var name=S.token.value;next();if(is("operator","=")){next();a.push([name,expression(false)]);}else{a.push([name]);}
+if(!is("punc",","))
+break;next();}
+return a;};function var_(){return as("var",vardefs());};function const_(){return as("const",vardefs());};function new_(){var newexp=expr_atom(false),args;if(is("punc","(")){next();args=expr_list(")");}else{args=[];}
+return subscripts(as("new",newexp,args),true);};function expr_atom(allow_calls){if(is("operator","new")){next();return new_();}
+if(is("operator")&&HOP(UNARY_PREFIX,S.token.value)){return make_unary("unary-prefix",prog1(S.token.value,next),expr_atom(allow_calls));}
+if(is("punc")){switch(S.token.value){case"(":next();return subscripts(prog1(expression,curry(expect,")")),allow_calls);case"[":next();return subscripts(array_(),allow_calls);case"{":next();return subscripts(object_(),allow_calls);}
+unexpected();}
+if(is("keyword","function")){next();return subscripts(function_(false),allow_calls);}
+if(HOP(ATOMIC_START_TOKEN,S.token.type)){var atom=S.token.type=="regexp"?as("regexp",S.token.value[0],S.token.value[1]):as(S.token.type,S.token.value);return subscripts(prog1(atom,next),allow_calls);}
+unexpected();};function expr_list(closing,allow_trailing_comma,allow_empty){var first=true,a=[];while(!is("punc",closing)){if(first)first=false;else expect(",");if(allow_trailing_comma&&is("punc",closing))break;if(is("punc",",")&&allow_empty){a.push(["atom","undefined"]);}else{a.push(expression(false));}}
+next();return a;};function array_(){return as("array",expr_list("]",!strict_mode,true));};function object_(){var first=true,a=[];while(!is("punc","}")){if(first)first=false;else expect(",");if(!strict_mode&&is("punc","}"))
+break;var type=S.token.type;var name=as_property_name();if(type=="name"&&(name=="get"||name=="set")&&!is("punc",":")){a.push([as_name(),function_(false),name]);}else{expect(":");a.push([name,expression(false)]);}}
+next();return as("object",a);};function as_property_name(){switch(S.token.type){case"num":case"string":return prog1(S.token.value,next);}
+return as_name();};function as_name(){switch(S.token.type){case"name":case"operator":case"keyword":case"atom":return prog1(S.token.value,next);default:unexpected();}};function subscripts(expr,allow_calls){if(is("punc",".")){next();return subscripts(as("dot",expr,as_name()),allow_calls);}
+if(is("punc","[")){next();return subscripts(as("sub",expr,prog1(expression,curry(expect,"]"))),allow_calls);}
+if(allow_calls&&is("punc","(")){next();return subscripts(as("call",expr,expr_list(")")),true);}
+if(allow_calls&&is("operator")&&HOP(UNARY_POSTFIX,S.token.value)){return prog1(curry(make_unary,"unary-postfix",S.token.value,expr),next);}
+return expr;};function make_unary(tag,op,expr){if((op=="++"||op=="--")&&!is_assignable(expr))
+croak("Invalid use of "+op+" operator");return as(tag,op,expr);};function expr_op(left,min_prec){var op=is("operator")?S.token.value:null;var prec=op!=null?PRECEDENCE[op]:null;if(prec!=null&&prec>min_prec){next();var right=expr_op(expr_atom(true),prec);return expr_op(as("binary",op,left,right),min_prec);}
+return left;};function expr_ops(){return expr_op(expr_atom(true),0);};function maybe_conditional(){var expr=expr_ops();if(is("operator","?")){next();var yes=expression(false);expect(":");return as("conditional",expr,yes,expression(false));}
+return expr;};function is_assignable(expr){switch(expr[0]){case"dot":case"sub":return true;case"name":return expr[1]!="this";}};function maybe_assign(){var left=maybe_conditional(),val=S.token.value;if(is("operator")&&HOP(ASSIGNMENT,val)){if(is_assignable(left)){next();return as("assign",ASSIGNMENT[val],left,maybe_assign());}
+croak("Invalid assignment");}
+return left;};function expression(commas){if(arguments.length==0)
+commas=true;var expr=maybe_assign();if(commas&&is("punc",",")){next();return as("seq",expr,expression());}
+return expr;};function in_loop(cont){try{++S.in_loop;return cont();}finally{--S.in_loop;}};return as("toplevel",(function(a){while(!is("eof"))
+a.push(statement());return a;})([]));};function curry(f){var args=slice(arguments,1);return function(){return f.apply(this,args.concat(slice(arguments)));};};function prog1(ret){if(ret instanceof Function)
+ret=ret();for(var i=1,n=arguments.length;--n>0;++i)
+arguments[i]();return ret;};function array_to_hash(a){var ret={};for(var i=0;i<a.length;++i)
+ret[a[i]]=true;return ret;};function slice(a,start){return Array.prototype.slice.call(a,start==null?0:start);};function characters(str){return str.split("");};function member(name,array){for(var i=array.length;--i>=0;)
+if(array[i]===name)
+return true;return false;};function HOP(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop);};exports.tokenizer=tokenizer;exports.parse=parse;exports.slice=slice;exports.curry=curry;exports.member=member;exports.array_to_hash=array_to_hash;exports.PRECEDENCE=PRECEDENCE;exports.KEYWORDS_ATOM=KEYWORDS_ATOM;exports.RESERVED_WORDS=RESERVED_WORDS;exports.KEYWORDS=KEYWORDS;exports.ATOMIC_START_TOKEN=ATOMIC_START_TOKEN;exports.OPERATORS=OPERATORS;exports.is_alphanumeric_char=is_alphanumeric_char;exports.is_identifier_char=is_identifier_char;;var parse=exports;FormatterWorker.JavaScriptFormatter=function(tokenizer,builder)
+{this._tokenizer=tokenizer;this._builder=builder;this._token=null;this._nextToken=this._tokenizer.next();}
+FormatterWorker.JavaScriptFormatter.prototype={format:function()
+{this._parseSourceElements(FormatterWorker.JavaScriptTokens.EOS);this._consume(FormatterWorker.JavaScriptTokens.EOS);},_peek:function()
+{return this._nextToken.token;},_next:function()
+{if(this._token&&this._token.token===FormatterWorker.JavaScriptTokens.EOS)
+throw"Unexpected EOS token";this._builder.addToken(this._nextToken);this._token=this._nextToken;this._nextToken=this._tokenizer.next(this._forceRegexp);this._forceRegexp=false;return this._token.token;},_consume:function(token)
+{var next=this._next();if(next!==token)
+throw"Unexpected token in consume: expected "+token+", actual "+next;},_expect:function(token)
+{var next=this._next();if(next!==token)
+throw"Unexpected token: expected "+token+", actual "+next;},_expectSemicolon:function()
+{if(this._peek()===FormatterWorker.JavaScriptTokens.SEMICOLON)
+this._consume(FormatterWorker.JavaScriptTokens.SEMICOLON);},_hasLineTerminatorBeforeNext:function()
+{return this._nextToken.nlb;},_parseSourceElements:function(endToken)
+{while(this._peek()!==endToken){this._parseStatement();this._builder.addNewLine();}},_parseStatementOrBlock:function()
+{if(this._peek()===FormatterWorker.JavaScriptTokens.LBRACE){this._builder.addSpace();this._parseBlock();return true;}
+this._builder.addNewLine();this._builder.increaseNestingLevel();this._parseStatement();this._builder.decreaseNestingLevel();},_parseStatement:function()
+{switch(this._peek()){case FormatterWorker.JavaScriptTokens.LBRACE:return this._parseBlock();case FormatterWorker.JavaScriptTokens.CONST:case FormatterWorker.JavaScriptTokens.VAR:return this._parseVariableStatement();case FormatterWorker.JavaScriptTokens.SEMICOLON:return this._next();case FormatterWorker.JavaScriptTokens.IF:return this._parseIfStatement();case FormatterWorker.JavaScriptTokens.DO:return this._parseDoWhileStatement();case FormatterWorker.JavaScriptTokens.WHILE:return this._parseWhileStatement();case FormatterWorker.JavaScriptTokens.FOR:return this._parseForStatement();case FormatterWorker.JavaScriptTokens.CONTINUE:return this._parseContinueStatement();case FormatterWorker.JavaScriptTokens.BREAK:return this._parseBreakStatement();case FormatterWorker.JavaScriptTokens.RETURN:return this._parseReturnStatement();case FormatterWorker.JavaScriptTokens.WITH:return this._parseWithStatement();case FormatterWorker.JavaScriptTokens.SWITCH:return this._parseSwitchStatement();case FormatterWorker.JavaScriptTokens.THROW:return this._parseThrowStatement();case FormatterWorker.JavaScriptTokens.TRY:return this._parseTryStatement();case FormatterWorker.JavaScriptTokens.FUNCTION:return this._parseFunctionDeclaration();case FormatterWorker.JavaScriptTokens.DEBUGGER:return this._parseDebuggerStatement();default:return this._parseExpressionOrLabelledStatement();}},_parseFunctionDeclaration:function()
+{this._expect(FormatterWorker.JavaScriptTokens.FUNCTION);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);this._parseFunctionLiteral()},_parseBlock:function()
+{this._expect(FormatterWorker.JavaScriptTokens.LBRACE);this._builder.addNewLine();this._builder.increaseNestingLevel();while(this._peek()!==FormatterWorker.JavaScriptTokens.RBRACE){this._parseStatement();this._builder.addNewLine();}
+this._builder.decreaseNestingLevel();this._expect(FormatterWorker.JavaScriptTokens.RBRACE);},_parseVariableStatement:function()
+{this._parseVariableDeclarations();this._expectSemicolon();},_parseVariableDeclarations:function()
+{if(this._peek()===FormatterWorker.JavaScriptTokens.VAR)
+this._consume(FormatterWorker.JavaScriptTokens.VAR);else
+this._consume(FormatterWorker.JavaScriptTokens.CONST)
+this._builder.addSpace();var isFirstVariable=true;do{if(!isFirstVariable){this._consume(FormatterWorker.JavaScriptTokens.COMMA);this._builder.addSpace();}
+isFirstVariable=false;this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);if(this._peek()===FormatterWorker.JavaScriptTokens.ASSIGN){this._builder.addSpace();this._consume(FormatterWorker.JavaScriptTokens.ASSIGN);this._builder.addSpace();this._parseAssignmentExpression();}}while(this._peek()===FormatterWorker.JavaScriptTokens.COMMA);},_parseExpressionOrLabelledStatement:function()
+{this._parseExpression();if(this._peek()===FormatterWorker.JavaScriptTokens.COLON){this._expect(FormatterWorker.JavaScriptTokens.COLON);this._builder.addSpace();this._parseStatement();}
+this._expectSemicolon();},_parseIfStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.IF);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LPAREN);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RPAREN);var isBlock=this._parseStatementOrBlock();if(this._peek()===FormatterWorker.JavaScriptTokens.ELSE){if(isBlock)
+this._builder.addSpace();else
+this._builder.addNewLine();this._next();if(this._peek()===FormatterWorker.JavaScriptTokens.IF){this._builder.addSpace();this._parseStatement();}else
+this._parseStatementOrBlock();}},_parseContinueStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.CONTINUE);var token=this._peek();if(!this._hasLineTerminatorBeforeNext()&&token!==FormatterWorker.JavaScriptTokens.SEMICOLON&&token!==FormatterWorker.JavaScriptTokens.RBRACE&&token!==FormatterWorker.JavaScriptTokens.EOS){this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);}
+this._expectSemicolon();},_parseBreakStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.BREAK);var token=this._peek();if(!this._hasLineTerminatorBeforeNext()&&token!==FormatterWorker.JavaScriptTokens.SEMICOLON&&token!==FormatterWorker.JavaScriptTokens.RBRACE&&token!==FormatterWorker.JavaScriptTokens.EOS){this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);}
+this._expectSemicolon();},_parseReturnStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.RETURN);var token=this._peek();if(!this._hasLineTerminatorBeforeNext()&&token!==FormatterWorker.JavaScriptTokens.SEMICOLON&&token!==FormatterWorker.JavaScriptTokens.RBRACE&&token!==FormatterWorker.JavaScriptTokens.EOS){this._builder.addSpace();this._parseExpression();}
+this._expectSemicolon();},_parseWithStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.WITH);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LPAREN);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RPAREN);this._parseStatementOrBlock();},_parseCaseClause:function()
+{if(this._peek()===FormatterWorker.JavaScriptTokens.CASE){this._expect(FormatterWorker.JavaScriptTokens.CASE);this._builder.addSpace();this._parseExpression();}else
+this._expect(FormatterWorker.JavaScriptTokens.DEFAULT);this._expect(FormatterWorker.JavaScriptTokens.COLON);this._builder.addNewLine();this._builder.increaseNestingLevel();while(this._peek()!==FormatterWorker.JavaScriptTokens.CASE&&this._peek()!==FormatterWorker.JavaScriptTokens.DEFAULT&&this._peek()!==FormatterWorker.JavaScriptTokens.RBRACE){this._parseStatement();this._builder.addNewLine();}
+this._builder.decreaseNestingLevel();},_parseSwitchStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.SWITCH);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LPAREN);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RPAREN);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LBRACE);this._builder.addNewLine();this._builder.increaseNestingLevel();while(this._peek()!==FormatterWorker.JavaScriptTokens.RBRACE)
+this._parseCaseClause();this._builder.decreaseNestingLevel();this._expect(FormatterWorker.JavaScriptTokens.RBRACE);},_parseThrowStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.THROW);this._builder.addSpace();this._parseExpression();this._expectSemicolon();},_parseTryStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.TRY);this._builder.addSpace();this._parseBlock();var token=this._peek();if(token===FormatterWorker.JavaScriptTokens.CATCH){this._builder.addSpace();this._consume(FormatterWorker.JavaScriptTokens.CATCH);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LPAREN);this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);this._expect(FormatterWorker.JavaScriptTokens.RPAREN);this._builder.addSpace();this._parseBlock();token=this._peek();}
+if(token===FormatterWorker.JavaScriptTokens.FINALLY){this._consume(FormatterWorker.JavaScriptTokens.FINALLY);this._builder.addSpace();this._parseBlock();}},_parseDoWhileStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.DO);var isBlock=this._parseStatementOrBlock();if(isBlock)
+this._builder.addSpace();else
+this._builder.addNewLine();this._expect(FormatterWorker.JavaScriptTokens.WHILE);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LPAREN);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RPAREN);this._expectSemicolon();},_parseWhileStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.WHILE);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LPAREN);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RPAREN);this._parseStatementOrBlock();},_parseForStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.FOR);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LPAREN);if(this._peek()!==FormatterWorker.JavaScriptTokens.SEMICOLON){if(this._peek()===FormatterWorker.JavaScriptTokens.VAR||this._peek()===FormatterWorker.JavaScriptTokens.CONST){this._parseVariableDeclarations();if(this._peek()===FormatterWorker.JavaScriptTokens.IN){this._builder.addSpace();this._consume(FormatterWorker.JavaScriptTokens.IN);this._builder.addSpace();this._parseExpression();}}else
+this._parseExpression();}
+if(this._peek()!==FormatterWorker.JavaScriptTokens.RPAREN){this._expect(FormatterWorker.JavaScriptTokens.SEMICOLON);this._builder.addSpace();if(this._peek()!==FormatterWorker.JavaScriptTokens.SEMICOLON)
+this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.SEMICOLON);this._builder.addSpace();if(this._peek()!==FormatterWorker.JavaScriptTokens.RPAREN)
+this._parseExpression();}
+this._expect(FormatterWorker.JavaScriptTokens.RPAREN);this._parseStatementOrBlock();},_parseExpression:function()
+{this._parseAssignmentExpression();while(this._peek()===FormatterWorker.JavaScriptTokens.COMMA){this._expect(FormatterWorker.JavaScriptTokens.COMMA);this._builder.addSpace();this._parseAssignmentExpression();}},_parseAssignmentExpression:function()
+{this._parseConditionalExpression();var token=this._peek();if(FormatterWorker.JavaScriptTokens.ASSIGN<=token&&token<=FormatterWorker.JavaScriptTokens.ASSIGN_MOD){this._builder.addSpace();this._next();this._builder.addSpace();this._parseAssignmentExpression();}},_parseConditionalExpression:function()
+{this._parseBinaryExpression();if(this._peek()===FormatterWorker.JavaScriptTokens.CONDITIONAL){this._builder.addSpace();this._consume(FormatterWorker.JavaScriptTokens.CONDITIONAL);this._builder.addSpace();this._parseAssignmentExpression();this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.COLON);this._builder.addSpace();this._parseAssignmentExpression();}},_parseBinaryExpression:function()
+{this._parseUnaryExpression();var token=this._peek();while(FormatterWorker.JavaScriptTokens.OR<=token&&token<=FormatterWorker.JavaScriptTokens.IN){this._builder.addSpace();this._next();this._builder.addSpace();this._parseBinaryExpression();token=this._peek();}},_parseUnaryExpression:function()
+{var token=this._peek();if((FormatterWorker.JavaScriptTokens.NOT<=token&&token<=FormatterWorker.JavaScriptTokens.VOID)||token===FormatterWorker.JavaScriptTokens.ADD||token===FormatterWorker.JavaScriptTokens.SUB||token===FormatterWorker.JavaScriptTokens.INC||token===FormatterWorker.JavaScriptTokens.DEC){this._next();if(token===FormatterWorker.JavaScriptTokens.DELETE||token===FormatterWorker.JavaScriptTokens.TYPEOF||token===FormatterWorker.JavaScriptTokens.VOID)
+this._builder.addSpace();this._parseUnaryExpression();}else
+return this._parsePostfixExpression();},_parsePostfixExpression:function()
+{this._parseLeftHandSideExpression();var token=this._peek();if(!this._hasLineTerminatorBeforeNext()&&(token===FormatterWorker.JavaScriptTokens.INC||token===FormatterWorker.JavaScriptTokens.DEC))
+this._next();},_parseLeftHandSideExpression:function()
+{if(this._peek()===FormatterWorker.JavaScriptTokens.NEW)
+this._parseNewExpression();else
+this._parseMemberExpression();while(true){switch(this._peek()){case FormatterWorker.JavaScriptTokens.LBRACK:this._consume(FormatterWorker.JavaScriptTokens.LBRACK);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RBRACK);break;case FormatterWorker.JavaScriptTokens.LPAREN:this._parseArguments();break;case FormatterWorker.JavaScriptTokens.PERIOD:this._consume(FormatterWorker.JavaScriptTokens.PERIOD);this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);break;default:return;}}},_parseNewExpression:function()
+{this._expect(FormatterWorker.JavaScriptTokens.NEW);this._builder.addSpace();if(this._peek()===FormatterWorker.JavaScriptTokens.NEW)
+this._parseNewExpression();else
+this._parseMemberExpression();},_parseMemberExpression:function()
+{if(this._peek()===FormatterWorker.JavaScriptTokens.FUNCTION){this._expect(FormatterWorker.JavaScriptTokens.FUNCTION);if(this._peek()===FormatterWorker.JavaScriptTokens.IDENTIFIER){this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);}
+this._parseFunctionLiteral();}else
+this._parsePrimaryExpression();while(true){switch(this._peek()){case FormatterWorker.JavaScriptTokens.LBRACK:this._consume(FormatterWorker.JavaScriptTokens.LBRACK);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RBRACK);break;case FormatterWorker.JavaScriptTokens.PERIOD:this._consume(FormatterWorker.JavaScriptTokens.PERIOD);this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);break;case FormatterWorker.JavaScriptTokens.LPAREN:this._parseArguments();break;default:return;}}},_parseDebuggerStatement:function()
+{this._expect(FormatterWorker.JavaScriptTokens.DEBUGGER);this._expectSemicolon();},_parsePrimaryExpression:function()
+{switch(this._peek()){case FormatterWorker.JavaScriptTokens.THIS:return this._consume(FormatterWorker.JavaScriptTokens.THIS);case FormatterWorker.JavaScriptTokens.NULL_LITERAL:return this._consume(FormatterWorker.JavaScriptTokens.NULL_LITERAL);case FormatterWorker.JavaScriptTokens.TRUE_LITERAL:return this._consume(FormatterWorker.JavaScriptTokens.TRUE_LITERAL);case FormatterWorker.JavaScriptTokens.FALSE_LITERAL:return this._consume(FormatterWorker.JavaScriptTokens.FALSE_LITERAL);case FormatterWorker.JavaScriptTokens.IDENTIFIER:return this._consume(FormatterWorker.JavaScriptTokens.IDENTIFIER);case FormatterWorker.JavaScriptTokens.NUMBER:return this._consume(FormatterWorker.JavaScriptTokens.NUMBER);case FormatterWorker.JavaScriptTokens.STRING:return this._consume(FormatterWorker.JavaScriptTokens.STRING);case FormatterWorker.JavaScriptTokens.ASSIGN_DIV:return this._parseRegExpLiteral();case FormatterWorker.JavaScriptTokens.DIV:return this._parseRegExpLiteral();case FormatterWorker.JavaScriptTokens.LBRACK:return this._parseArrayLiteral();case FormatterWorker.JavaScriptTokens.LBRACE:return this._parseObjectLiteral();case FormatterWorker.JavaScriptTokens.LPAREN:this._consume(FormatterWorker.JavaScriptTokens.LPAREN);this._parseExpression();this._expect(FormatterWorker.JavaScriptTokens.RPAREN);return;default:return this._next();}},_parseArrayLiteral:function()
+{this._expect(FormatterWorker.JavaScriptTokens.LBRACK);this._builder.increaseNestingLevel();while(this._peek()!==FormatterWorker.JavaScriptTokens.RBRACK){if(this._peek()!==FormatterWorker.JavaScriptTokens.COMMA)
+this._parseAssignmentExpression();if(this._peek()!==FormatterWorker.JavaScriptTokens.RBRACK){this._expect(FormatterWorker.JavaScriptTokens.COMMA);this._builder.addSpace();}}
+this._builder.decreaseNestingLevel();this._expect(FormatterWorker.JavaScriptTokens.RBRACK);},_parseObjectLiteralGetSet:function()
+{var token=this._peek();if(token===FormatterWorker.JavaScriptTokens.IDENTIFIER||token===FormatterWorker.JavaScriptTokens.NUMBER||token===FormatterWorker.JavaScriptTokens.STRING||FormatterWorker.JavaScriptTokens.DELETE<=token&&token<=FormatterWorker.JavaScriptTokens.FALSE_LITERAL||token===FormatterWorker.JavaScriptTokens.INSTANCEOF||token===FormatterWorker.JavaScriptTokens.IN||token===FormatterWorker.JavaScriptTokens.CONST){this._next();this._parseFunctionLiteral();}},_parseObjectLiteral:function()
+{this._expect(FormatterWorker.JavaScriptTokens.LBRACE);this._builder.increaseNestingLevel();while(this._peek()!==FormatterWorker.JavaScriptTokens.RBRACE){var token=this._peek();switch(token){case FormatterWorker.JavaScriptTokens.IDENTIFIER:this._consume(FormatterWorker.JavaScriptTokens.IDENTIFIER);var name=this._token.value;if((name==="get"||name==="set")&&this._peek()!==FormatterWorker.JavaScriptTokens.COLON){this._builder.addSpace();this._parseObjectLiteralGetSet();if(this._peek()!==FormatterWorker.JavaScriptTokens.RBRACE){this._expect(FormatterWorker.JavaScriptTokens.COMMA);}
+continue;}
+break;case FormatterWorker.JavaScriptTokens.STRING:this._consume(FormatterWorker.JavaScriptTokens.STRING);break;case FormatterWorker.JavaScriptTokens.NUMBER:this._consume(FormatterWorker.JavaScriptTokens.NUMBER);break;default:this._next();}
+this._expect(FormatterWorker.JavaScriptTokens.COLON);this._builder.addSpace();this._parseAssignmentExpression();if(this._peek()!==FormatterWorker.JavaScriptTokens.RBRACE){this._expect(FormatterWorker.JavaScriptTokens.COMMA);}}
+this._builder.decreaseNestingLevel();this._expect(FormatterWorker.JavaScriptTokens.RBRACE);},_parseRegExpLiteral:function()
+{if(this._nextToken.type==="regexp")
+this._next();else{this._forceRegexp=true;this._next();}},_parseArguments:function()
+{this._expect(FormatterWorker.JavaScriptTokens.LPAREN);var done=(this._peek()===FormatterWorker.JavaScriptTokens.RPAREN);while(!done){this._parseAssignmentExpression();done=(this._peek()===FormatterWorker.JavaScriptTokens.RPAREN);if(!done){this._expect(FormatterWorker.JavaScriptTokens.COMMA);this._builder.addSpace();}}
+this._expect(FormatterWorker.JavaScriptTokens.RPAREN);},_parseFunctionLiteral:function()
+{this._expect(FormatterWorker.JavaScriptTokens.LPAREN);var done=(this._peek()===FormatterWorker.JavaScriptTokens.RPAREN);while(!done){this._expect(FormatterWorker.JavaScriptTokens.IDENTIFIER);done=(this._peek()===FormatterWorker.JavaScriptTokens.RPAREN);if(!done){this._expect(FormatterWorker.JavaScriptTokens.COMMA);this._builder.addSpace();}}
+this._expect(FormatterWorker.JavaScriptTokens.RPAREN);this._builder.addSpace();this._expect(FormatterWorker.JavaScriptTokens.LBRACE);this._builder.addNewLine();this._builder.increaseNestingLevel();this._parseSourceElements(FormatterWorker.JavaScriptTokens.RBRACE);this._builder.decreaseNestingLevel();this._expect(FormatterWorker.JavaScriptTokens.RBRACE);}}
+FormatterWorker.JavaScriptFormattedContentBuilder=function(content,mapping,originalOffset,formattedOffset,indentString)
+{this._originalContent=content;this._originalOffset=originalOffset;this._lastOriginalPosition=0;this._formattedContent=[];this._formattedContentLength=0;this._formattedOffset=formattedOffset;this._lastFormattedPosition=0;this._mapping=mapping;this._lineNumber=0;this._nestingLevel=0;this._indentString=indentString;this._cachedIndents={};}
+FormatterWorker.JavaScriptFormattedContentBuilder.prototype={addToken:function(token)
+{for(var i=0;i<token.comments_before.length;++i)
+this._addComment(token.comments_before[i]);while(this._lineNumber<token.line){this._addText("\n");this._addIndent();this._needNewLine=false;this._lineNumber+=1;}
+if(this._needNewLine){this._addText("\n");this._addIndent();this._needNewLine=false;}
+this._addMappingIfNeeded(token.pos);this._addText(this._originalContent.substring(token.pos,token.endPos));this._lineNumber=token.endLine;},addSpace:function()
+{this._addText(" ");},addNewLine:function()
+{this._needNewLine=true;},increaseNestingLevel:function()
+{this._nestingLevel+=1;},decreaseNestingLevel:function()
+{this._nestingLevel-=1;},content:function()
+{return this._formattedContent.join("");},_addIndent:function()
+{if(this._cachedIndents[this._nestingLevel]){this._addText(this._cachedIndents[this._nestingLevel]);return;}
+var fullIndent="";for(var i=0;i<this._nestingLevel;++i)
+fullIndent+=this._indentString;this._addText(fullIndent);if(this._nestingLevel<=20)
+this._cachedIndents[this._nestingLevel]=fullIndent;},_addComment:function(comment)
+{if(this._lineNumber<comment.line){for(var j=this._lineNumber;j<comment.line;++j)
+this._addText("\n");this._lineNumber=comment.line;this._needNewLine=false;this._addIndent();}else
+this.addSpace();this._addMappingIfNeeded(comment.pos);if(comment.type==="comment1")
+this._addText("//");else
+this._addText("/*");this._addText(comment.value);if(comment.type!=="comment1"){this._addText("*/");var position;while((position=comment.value.indexOf("\n",position+1))!==-1)
+this._lineNumber+=1;}},_addText:function(text)
+{this._formattedContent.push(text);this._formattedContentLength+=text.length;},_addMappingIfNeeded:function(originalPosition)
+{if(originalPosition-this._lastOriginalPosition===this._formattedContentLength-this._lastFormattedPosition)
+return;this._mapping.original.push(this._originalOffset+originalPosition);this._lastOriginalPosition=originalPosition;this._mapping.formatted.push(this._formattedOffset+this._formattedContentLength);this._lastFormattedPosition=this._formattedContentLength;}}
+FormatterWorker.JavaScriptTokens={};FormatterWorker.JavaScriptTokensByValue={};FormatterWorker.JavaScriptTokens.EOS=0;FormatterWorker.JavaScriptTokens.LPAREN=FormatterWorker.JavaScriptTokensByValue["("]=1;FormatterWorker.JavaScriptTokens.RPAREN=FormatterWorker.JavaScriptTokensByValue[")"]=2;FormatterWorker.JavaScriptTokens.LBRACK=FormatterWorker.JavaScriptTokensByValue["["]=3;FormatterWorker.JavaScriptTokens.RBRACK=FormatterWorker.JavaScriptTokensByValue["]"]=4;FormatterWorker.JavaScriptTokens.LBRACE=FormatterWorker.JavaScriptTokensByValue["{"]=5;FormatterWorker.JavaScriptTokens.RBRACE=FormatterWorker.JavaScriptTokensByValue["}"]=6;FormatterWorker.JavaScriptTokens.COLON=FormatterWorker.JavaScriptTokensByValue[":"]=7;FormatterWorker.JavaScriptTokens.SEMICOLON=FormatterWorker.JavaScriptTokensByValue[";"]=8;FormatterWorker.JavaScriptTokens.PERIOD=FormatterWorker.JavaScriptTokensByValue["."]=9;FormatterWorker.JavaScriptTokens.CONDITIONAL=FormatterWorker.JavaScriptTokensByValue["?"]=10;FormatterWorker.JavaScriptTokens.INC=FormatterWorker.JavaScriptTokensByValue["++"]=11;FormatterWorker.JavaScriptTokens.DEC=FormatterWorker.JavaScriptTokensByValue["--"]=12;FormatterWorker.JavaScriptTokens.ASSIGN=FormatterWorker.JavaScriptTokensByValue["="]=13;FormatterWorker.JavaScriptTokens.ASSIGN_BIT_OR=FormatterWorker.JavaScriptTokensByValue["|="]=14;FormatterWorker.JavaScriptTokens.ASSIGN_BIT_XOR=FormatterWorker.JavaScriptTokensByValue["^="]=15;FormatterWorker.JavaScriptTokens.ASSIGN_BIT_AND=FormatterWorker.JavaScriptTokensByValue["&="]=16;FormatterWorker.JavaScriptTokens.ASSIGN_SHL=FormatterWorker.JavaScriptTokensByValue["<<="]=17;FormatterWorker.JavaScriptTokens.ASSIGN_SAR=FormatterWorker.JavaScriptTokensByValue[">>="]=18;FormatterWorker.JavaScriptTokens.ASSIGN_SHR=FormatterWorker.JavaScriptTokensByValue[">>>="]=19;FormatterWorker.JavaScriptTokens.ASSIGN_ADD=FormatterWorker.JavaScriptTokensByValue["+="]=20;FormatterWorker.JavaScriptTokens.ASSIGN_SUB=FormatterWorker.JavaScriptTokensByValue["-="]=21;FormatterWorker.JavaScriptTokens.ASSIGN_MUL=FormatterWorker.JavaScriptTokensByValue["*="]=22;FormatterWorker.JavaScriptTokens.ASSIGN_DIV=FormatterWorker.JavaScriptTokensByValue["/="]=23;FormatterWorker.JavaScriptTokens.ASSIGN_MOD=FormatterWorker.JavaScriptTokensByValue["%="]=24;FormatterWorker.JavaScriptTokens.COMMA=FormatterWorker.JavaScriptTokensByValue[","]=25;FormatterWorker.JavaScriptTokens.OR=FormatterWorker.JavaScriptTokensByValue["||"]=26;FormatterWorker.JavaScriptTokens.AND=FormatterWorker.JavaScriptTokensByValue["&&"]=27;FormatterWorker.JavaScriptTokens.BIT_OR=FormatterWorker.JavaScriptTokensByValue["|"]=28;FormatterWorker.JavaScriptTokens.BIT_XOR=FormatterWorker.JavaScriptTokensByValue["^"]=29;FormatterWorker.JavaScriptTokens.BIT_AND=FormatterWorker.JavaScriptTokensByValue["&"]=30;FormatterWorker.JavaScriptTokens.SHL=FormatterWorker.JavaScriptTokensByValue["<<"]=31;FormatterWorker.JavaScriptTokens.SAR=FormatterWorker.JavaScriptTokensByValue[">>"]=32;FormatterWorker.JavaScriptTokens.SHR=FormatterWorker.JavaScriptTokensByValue[">>>"]=33;FormatterWorker.JavaScriptTokens.ADD=FormatterWorker.JavaScriptTokensByValue["+"]=34;FormatterWorker.JavaScriptTokens.SUB=FormatterWorker.JavaScriptTokensByValue["-"]=35;FormatterWorker.JavaScriptTokens.MUL=FormatterWorker.JavaScriptTokensByValue["*"]=36;FormatterWorker.JavaScriptTokens.DIV=FormatterWorker.JavaScriptTokensByValue["/"]=37;FormatterWorker.JavaScriptTokens.MOD=FormatterWorker.JavaScriptTokensByValue["%"]=38;FormatterWorker.JavaScriptTokens.EQ=FormatterWorker.JavaScriptTokensByValue["=="]=39;FormatterWorker.JavaScriptTokens.NE=FormatterWorker.JavaScriptTokensByValue["!="]=40;FormatterWorker.JavaScriptTokens.EQ_STRICT=FormatterWorker.JavaScriptTokensByValue["==="]=41;FormatterWorker.JavaScriptTokens.NE_STRICT=FormatterWorker.JavaScriptTokensByValue["!=="]=42;FormatterWorker.JavaScriptTokens.LT=FormatterWorker.JavaScriptTokensByValue["<"]=43;FormatterWorker.JavaScriptTokens.GT=FormatterWorker.JavaScriptTokensByValue[">"]=44;FormatterWorker.JavaScriptTokens.LTE=FormatterWorker.JavaScriptTokensByValue["<="]=45;FormatterWorker.JavaScriptTokens.GTE=FormatterWorker.JavaScriptTokensByValue[">="]=46;FormatterWorker.JavaScriptTokens.INSTANCEOF=FormatterWorker.JavaScriptTokensByValue["instanceof"]=47;FormatterWorker.JavaScriptTokens.IN=FormatterWorker.JavaScriptTokensByValue["in"]=48;FormatterWorker.JavaScriptTokens.NOT=FormatterWorker.JavaScriptTokensByValue["!"]=49;FormatterWorker.JavaScriptTokens.BIT_NOT=FormatterWorker.JavaScriptTokensByValue["~"]=50;FormatterWorker.JavaScriptTokens.DELETE=FormatterWorker.JavaScriptTokensByValue["delete"]=51;FormatterWorker.JavaScriptTokens.TYPEOF=FormatterWorker.JavaScriptTokensByValue["typeof"]=52;FormatterWorker.JavaScriptTokens.VOID=FormatterWorker.JavaScriptTokensByValue["void"]=53;FormatterWorker.JavaScriptTokens.BREAK=FormatterWorker.JavaScriptTokensByValue["break"]=54;FormatterWorker.JavaScriptTokens.CASE=FormatterWorker.JavaScriptTokensByValue["case"]=55;FormatterWorker.JavaScriptTokens.CATCH=FormatterWorker.JavaScriptTokensByValue["catch"]=56;FormatterWorker.JavaScriptTokens.CONTINUE=FormatterWorker.JavaScriptTokensByValue["continue"]=57;FormatterWorker.JavaScriptTokens.DEBUGGER=FormatterWorker.JavaScriptTokensByValue["debugger"]=58;FormatterWorker.JavaScriptTokens.DEFAULT=FormatterWorker.JavaScriptTokensByValue["default"]=59;FormatterWorker.JavaScriptTokens.DO=FormatterWorker.JavaScriptTokensByValue["do"]=60;FormatterWorker.JavaScriptTokens.ELSE=FormatterWorker.JavaScriptTokensByValue["else"]=61;FormatterWorker.JavaScriptTokens.FINALLY=FormatterWorker.JavaScriptTokensByValue["finally"]=62;FormatterWorker.JavaScriptTokens.FOR=FormatterWorker.JavaScriptTokensByValue["for"]=63;FormatterWorker.JavaScriptTokens.FUNCTION=FormatterWorker.JavaScriptTokensByValue["function"]=64;FormatterWorker.JavaScriptTokens.IF=FormatterWorker.JavaScriptTokensByValue["if"]=65;FormatterWorker.JavaScriptTokens.NEW=FormatterWorker.JavaScriptTokensByValue["new"]=66;FormatterWorker.JavaScriptTokens.RETURN=FormatterWorker.JavaScriptTokensByValue["return"]=67;FormatterWorker.JavaScriptTokens.SWITCH=FormatterWorker.JavaScriptTokensByValue["switch"]=68;FormatterWorker.JavaScriptTokens.THIS=FormatterWorker.JavaScriptTokensByValue["this"]=69;FormatterWorker.JavaScriptTokens.THROW=FormatterWorker.JavaScriptTokensByValue["throw"]=70;FormatterWorker.JavaScriptTokens.TRY=FormatterWorker.JavaScriptTokensByValue["try"]=71;FormatterWorker.JavaScriptTokens.VAR=FormatterWorker.JavaScriptTokensByValue["var"]=72;FormatterWorker.JavaScriptTokens.WHILE=FormatterWorker.JavaScriptTokensByValue["while"]=73;FormatterWorker.JavaScriptTokens.WITH=FormatterWorker.JavaScriptTokensByValue["with"]=74;FormatterWorker.JavaScriptTokens.NULL_LITERAL=FormatterWorker.JavaScriptTokensByValue["null"]=75;FormatterWorker.JavaScriptTokens.TRUE_LITERAL=FormatterWorker.JavaScriptTokensByValue["true"]=76;FormatterWorker.JavaScriptTokens.FALSE_LITERAL=FormatterWorker.JavaScriptTokensByValue["false"]=77;FormatterWorker.JavaScriptTokens.NUMBER=78;FormatterWorker.JavaScriptTokens.STRING=79;FormatterWorker.JavaScriptTokens.IDENTIFIER=80;FormatterWorker.JavaScriptTokens.CONST=FormatterWorker.JavaScriptTokensByValue["const"]=81;FormatterWorker.JavaScriptTokensByType={"eof":FormatterWorker.JavaScriptTokens.EOS,"name":FormatterWorker.JavaScriptTokens.IDENTIFIER,"num":FormatterWorker.JavaScriptTokens.NUMBER,"regexp":FormatterWorker.JavaScriptTokens.DIV,"string":FormatterWorker.JavaScriptTokens.STRING};FormatterWorker.JavaScriptTokenizer=function(content)
+{this._readNextToken=parse.tokenizer(content);this._state=this._readNextToken.context();}
+FormatterWorker.JavaScriptTokenizer.prototype={content:function()
+{return this._state.text;},next:function(forceRegexp)
+{var uglifyToken=this._readNextToken(forceRegexp);uglifyToken.endPos=this._state.pos;uglifyToken.endLine=this._state.line;uglifyToken.token=this._convertUglifyToken(uglifyToken);return uglifyToken;},_convertUglifyToken:function(uglifyToken)
+{var token=FormatterWorker.JavaScriptTokensByType[uglifyToken.type];if(typeof token==="number")
+return token;token=FormatterWorker.JavaScriptTokensByValue[uglifyToken.value];if(typeof token==="number")
+return token;throw"Unknown token type "+uglifyToken.type;}};FormatterWorker.CSSFormatter=function(content,builder)
+{this._content=content;this._builder=builder;this._lastLine=-1;this._state={};}
+FormatterWorker.CSSFormatter.prototype={format:function()
+{this._lineEndings=this._lineEndings(this._content);var tokenize=FormatterWorker.createTokenizer("text/css");var lines=this._content.split("\n");for(var i=0;i<lines.length;++i){var line=lines[i];tokenize(line,this._tokenCallback.bind(this,i));}
+this._builder.flushNewLines(true);},_lineEndings:function(text)
+{var lineEndings=[];var i=text.indexOf("\n");while(i!==-1){lineEndings.push(i);i=text.indexOf("\n",i+1);}
+lineEndings.push(text.length);return lineEndings;},_tokenCallback:function(startLine,token,type,startColumn)
+{if(startLine!==this._lastLine)
+this._state.eatWhitespace=true;if(/^property/.test(type)&&!this._state.inPropertyValue)
+this._state.seenProperty=true;this._lastLine=startLine;var isWhitespace=/^\s+$/.test(token);if(isWhitespace){if(!this._state.eatWhitespace)
+this._builder.addSpace();return;}
+this._state.eatWhitespace=false;if(token==="\n")
+return;if(token!=="}"){if(this._state.afterClosingBrace)
+this._builder.addNewLine();this._state.afterClosingBrace=false;}
+var startPosition=(startLine?this._lineEndings[startLine-1]:0)+startColumn;if(token==="}"){if(this._state.inPropertyValue)
+this._builder.addNewLine();this._builder.decreaseNestingLevel();this._state.afterClosingBrace=true;this._state.inPropertyValue=false;}else if(token===":"&&!this._state.inPropertyValue&&this._state.seenProperty){this._builder.addToken(token,startPosition,startLine,startColumn);this._builder.addSpace();this._state.eatWhitespace=true;this._state.inPropertyValue=true;this._state.seenProperty=false;return;}else if(token==="{"){this._builder.addSpace();this._builder.addToken(token,startPosition,startLine,startColumn);this._builder.addNewLine();this._builder.increaseNestingLevel();return;}
+this._builder.addToken(token,startPosition,startLine,startColumn);if(type==="comment"&&!this._state.inPropertyValue&&!this._state.seenProperty)
+this._builder.addNewLine();if(token===";"&&this._state.inPropertyValue){this._state.inPropertyValue=false;this._builder.addNewLine();}else if(token==="}"){this._builder.addNewLine();}}}
+FormatterWorker.CSSFormattedContentBuilder=function(content,mapping,originalOffset,formattedOffset,indentString)
+{this._originalContent=content;this._originalOffset=originalOffset;this._lastOriginalPosition=0;this._formattedContent=[];this._formattedContentLength=0;this._formattedOffset=formattedOffset;this._lastFormattedPosition=0;this._mapping=mapping;this._lineNumber=0;this._nestingLevel=0;this._needNewLines=0;this._atLineStart=true;this._indentString=indentString;this._cachedIndents={};}
+FormatterWorker.CSSFormattedContentBuilder.prototype={addToken:function(token,startPosition,startLine,startColumn)
+{if((this._isWhitespaceRun||this._atLineStart)&&/^\s+$/.test(token))
+return;if(this._isWhitespaceRun&&this._lineNumber===startLine&&!this._needNewLines)
+this._addText(" ");this._isWhitespaceRun=false;this._atLineStart=false;while(this._lineNumber<startLine){this._addText("\n");this._addIndent();this._needNewLines=0;this._lineNumber+=1;this._atLineStart=true;}
+if(this._needNewLines){this.flushNewLines();this._addIndent();this._atLineStart=true;}
+this._addMappingIfNeeded(startPosition);this._addText(token);this._lineNumber=startLine;},addSpace:function()
+{if(this._isWhitespaceRun)
+return;this._isWhitespaceRun=true;},addNewLine:function()
+{++this._needNewLines;},flushNewLines:function(atLeastOne)
+{var newLineCount=atLeastOne&&!this._needNewLines?1:this._needNewLines;if(newLineCount)
+this._isWhitespaceRun=false;for(var i=0;i<newLineCount;++i)
+this._addText("\n");this._needNewLines=0;},increaseNestingLevel:function()
+{this._nestingLevel+=1;},decreaseNestingLevel:function(addNewline)
+{if(this._nestingLevel)
+this._nestingLevel-=1;if(addNewline)
+this.addNewLine();},content:function()
+{return this._formattedContent.join("");},_addIndent:function()
+{if(this._cachedIndents[this._nestingLevel]){this._addText(this._cachedIndents[this._nestingLevel]);return;}
+var fullIndent="";for(var i=0;i<this._nestingLevel;++i)
+fullIndent+=this._indentString;this._addText(fullIndent);if(this._nestingLevel<=20)
+this._cachedIndents[this._nestingLevel]=fullIndent;},_addText:function(text)
+{if(!text)
+return;this._formattedContent.push(text);this._formattedContentLength+=text.length;},_addMappingIfNeeded:function(originalPosition)
+{if(originalPosition-this._lastOriginalPosition===this._formattedContentLength-this._lastFormattedPosition)
+return;this._mapping.original.push(this._originalOffset+originalPosition);this._lastOriginalPosition=originalPosition;this._mapping.formatted.push(this._formattedOffset+this._formattedContentLength);this._lastFormattedPosition=this._formattedContentLength;}};
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/SourcesPanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/SourcesPanel.js
new file mode 100644 (file)
index 0000000..435ecf2
--- /dev/null
@@ -0,0 +1,1502 @@
+WebInspector.JavaScriptBreakpointsSidebarPane=function(debuggerModel,breakpointManager,showSourceLineDelegate)
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Breakpoints"));this._debuggerModel=debuggerModel;this.registerRequiredCSS("breakpointsList.css");this._breakpointManager=breakpointManager;this._showSourceLineDelegate=showSourceLineDelegate;this.listElement=document.createElement("ol");this.listElement.className="breakpoint-list";this.emptyElement=document.createElement("div");this.emptyElement.className="info";this.emptyElement.textContent=WebInspector.UIString("No Breakpoints");this.bodyElement.appendChild(this.emptyElement);this._items=new Map();var breakpointLocations=this._breakpointManager.allBreakpointLocations();for(var i=0;i<breakpointLocations.length;++i)
+this._addBreakpoint(breakpointLocations[i].breakpoint,breakpointLocations[i].uiLocation);this._breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointAdded,this._breakpointAdded,this);this._breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointRemoved,this._breakpointRemoved,this);this.emptyElement.addEventListener("contextmenu",this._emptyElementContextMenu.bind(this),true);}
+WebInspector.JavaScriptBreakpointsSidebarPane.prototype={_emptyElementContextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);var breakpointActive=this._debuggerModel.breakpointsActive();var breakpointActiveTitle=breakpointActive?WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Deactivate breakpoints":"Deactivate Breakpoints"):WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Activate breakpoints":"Activate Breakpoints");contextMenu.appendItem(breakpointActiveTitle,this._debuggerModel.setBreakpointsActive.bind(this._debuggerModel,!breakpointActive));contextMenu.show();},_breakpointAdded:function(event)
+{this._breakpointRemoved(event);var breakpoint=(event.data.breakpoint);var uiLocation=(event.data.uiLocation);this._addBreakpoint(breakpoint,uiLocation);},_addBreakpoint:function(breakpoint,uiLocation)
+{var element=document.createElement("li");element.classList.add("cursor-pointer");element.addEventListener("contextmenu",this._breakpointContextMenu.bind(this,breakpoint),true);element.addEventListener("click",this._breakpointClicked.bind(this,uiLocation),false);var checkbox=document.createElement("input");checkbox.className="checkbox-elem";checkbox.type="checkbox";checkbox.checked=breakpoint.enabled();checkbox.addEventListener("click",this._breakpointCheckboxClicked.bind(this,breakpoint),false);element.appendChild(checkbox);var labelElement=document.createTextNode(uiLocation.linkText());element.appendChild(labelElement);var snippetElement=document.createElement("div");snippetElement.className="source-text monospace";element.appendChild(snippetElement);function didRequestContent(content)
+{var lineNumber=uiLocation.lineNumber
+var columnNumber=uiLocation.columnNumber;var contentString=new String(content);if(lineNumber<contentString.lineCount()){var lineText=contentString.lineAt(lineNumber);var maxSnippetLength=200;snippetElement.textContent=lineText.substr(columnNumber).trimEnd(maxSnippetLength);}}
+uiLocation.uiSourceCode.requestContent(didRequestContent);element._data=uiLocation;var currentElement=this.listElement.firstChild;while(currentElement){if(currentElement._data&&this._compareBreakpoints(currentElement._data,element._data)>0)
+break;currentElement=currentElement.nextSibling;}
+this._addListElement(element,currentElement);var breakpointItem={};breakpointItem.element=element;breakpointItem.checkbox=checkbox;this._items.put(breakpoint,breakpointItem);this.expand();},_breakpointRemoved:function(event)
+{var breakpoint=(event.data.breakpoint);var uiLocation=(event.data.uiLocation);var breakpointItem=this._items.get(breakpoint);if(!breakpointItem)
+return;this._items.remove(breakpoint);this._removeListElement(breakpointItem.element);},highlightBreakpoint:function(breakpoint)
+{var breakpointItem=this._items.get(breakpoint);if(!breakpointItem)
+return;breakpointItem.element.classList.add("breakpoint-hit");this._highlightedBreakpointItem=breakpointItem;},clearBreakpointHighlight:function()
+{if(this._highlightedBreakpointItem){this._highlightedBreakpointItem.element.classList.remove("breakpoint-hit");delete this._highlightedBreakpointItem;}},_breakpointClicked:function(uiLocation,event)
+{this._showSourceLineDelegate(uiLocation.uiSourceCode,uiLocation.lineNumber);},_breakpointCheckboxClicked:function(breakpoint,event)
+{event.consume();breakpoint.setEnabled(event.target.checked);},_breakpointContextMenu:function(breakpoint,event)
+{var breakpoints=this._items.values();var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove breakpoint":"Remove Breakpoint"),breakpoint.remove.bind(breakpoint));if(breakpoints.length>1){var removeAllTitle=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove all breakpoints":"Remove All Breakpoints");contextMenu.appendItem(removeAllTitle,this._breakpointManager.removeAllBreakpoints.bind(this._breakpointManager));}
+contextMenu.appendSeparator();var breakpointActive=this._debuggerModel.breakpointsActive();var breakpointActiveTitle=breakpointActive?WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Deactivate breakpoints":"Deactivate Breakpoints"):WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Activate breakpoints":"Activate Breakpoints");contextMenu.appendItem(breakpointActiveTitle,this._debuggerModel.setBreakpointsActive.bind(this._debuggerModel,!breakpointActive));function enabledBreakpointCount(breakpoints)
+{var count=0;for(var i=0;i<breakpoints.length;++i){if(breakpoints[i].checkbox.checked)
+count++;}
+return count;}
+if(breakpoints.length>1){var enableBreakpointCount=enabledBreakpointCount(breakpoints);var enableTitle=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Enable all breakpoints":"Enable All Breakpoints");var disableTitle=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Disable all breakpoints":"Disable All Breakpoints");contextMenu.appendSeparator();contextMenu.appendItem(enableTitle,this._breakpointManager.toggleAllBreakpoints.bind(this._breakpointManager,true),!(enableBreakpointCount!=breakpoints.length));contextMenu.appendItem(disableTitle,this._breakpointManager.toggleAllBreakpoints.bind(this._breakpointManager,false),!(enableBreakpointCount>1));}
+contextMenu.show();},_addListElement:function(element,beforeElement)
+{if(beforeElement)
+this.listElement.insertBefore(element,beforeElement);else{if(!this.listElement.firstChild){this.bodyElement.removeChild(this.emptyElement);this.bodyElement.appendChild(this.listElement);}
+this.listElement.appendChild(element);}},_removeListElement:function(element)
+{this.listElement.removeChild(element);if(!this.listElement.firstChild){this.bodyElement.removeChild(this.listElement);this.bodyElement.appendChild(this.emptyElement);}},_compare:function(x,y)
+{if(x!==y)
+return x<y?-1:1;return 0;},_compareBreakpoints:function(b1,b2)
+{return this._compare(b1.uiSourceCode.originURL(),b2.uiSourceCode.originURL())||this._compare(b1.lineNumber,b2.lineNumber);},reset:function()
+{this.listElement.removeChildren();if(this.listElement.parentElement){this.bodyElement.removeChild(this.listElement);this.bodyElement.appendChild(this.emptyElement);}
+this._items.clear();},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.XHRBreakpointsSidebarPane=function()
+{WebInspector.NativeBreakpointsSidebarPane.call(this,WebInspector.UIString("XHR Breakpoints"));this._breakpointElements={};var addButton=document.createElement("button");addButton.className="pane-title-button add";addButton.addEventListener("click",this._addButtonClicked.bind(this),false);addButton.title=WebInspector.UIString("Add XHR breakpoint");this.titleElement.appendChild(addButton);this.emptyElement.addEventListener("contextmenu",this._emptyElementContextMenu.bind(this),true);this._restoreBreakpoints();}
+WebInspector.XHRBreakpointsSidebarPane.prototype={_emptyElementContextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add breakpoint":"Add Breakpoint"),this._addButtonClicked.bind(this));contextMenu.show();},_addButtonClicked:function(event)
+{if(event)
+event.consume();this.expand();var inputElementContainer=document.createElement("p");inputElementContainer.className="breakpoint-condition";var inputElement=document.createElement("span");inputElementContainer.textContent=WebInspector.UIString("Break when URL contains:");inputElement.className="editing";inputElement.id="breakpoint-condition-input";inputElementContainer.appendChild(inputElement);this._addListElement(inputElementContainer,this.listElement.firstChild);function finishEditing(accept,e,text)
+{this._removeListElement(inputElementContainer);if(accept){this._setBreakpoint(text,true);this._saveBreakpoints();}}
+var config=new WebInspector.InplaceEditor.Config(finishEditing.bind(this,true),finishEditing.bind(this,false));WebInspector.InplaceEditor.startEditing(inputElement,config);},_setBreakpoint:function(url,enabled)
+{if(url in this._breakpointElements)
+return;var element=document.createElement("li");element._url=url;element.addEventListener("contextmenu",this._contextMenu.bind(this,url),true);var checkboxElement=document.createElement("input");checkboxElement.className="checkbox-elem";checkboxElement.type="checkbox";checkboxElement.checked=enabled;checkboxElement.addEventListener("click",this._checkboxClicked.bind(this,url),false);element._checkboxElement=checkboxElement;element.appendChild(checkboxElement);var labelElement=document.createElement("span");if(!url)
+labelElement.textContent=WebInspector.UIString("Any XHR");else
+labelElement.textContent=WebInspector.UIString("URL contains \"%s\"",url);labelElement.classList.add("cursor-auto");labelElement.addEventListener("dblclick",this._labelClicked.bind(this,url),false);element.appendChild(labelElement);var currentElement=this.listElement.firstChild;while(currentElement){if(currentElement._url&&currentElement._url<element._url)
+break;currentElement=currentElement.nextSibling;}
+this._addListElement(element,currentElement);this._breakpointElements[url]=element;if(enabled)
+DOMDebuggerAgent.setXHRBreakpoint(url);},_removeBreakpoint:function(url)
+{var element=this._breakpointElements[url];if(!element)
+return;this._removeListElement(element);delete this._breakpointElements[url];if(element._checkboxElement.checked)
+DOMDebuggerAgent.removeXHRBreakpoint(url);},_contextMenu:function(url,event)
+{var contextMenu=new WebInspector.ContextMenu(event);function removeBreakpoint()
+{this._removeBreakpoint(url);this._saveBreakpoints();}
+function removeAllBreakpoints()
+{for(var url in this._breakpointElements)
+this._removeBreakpoint(url);this._saveBreakpoints();}
+var removeAllTitle=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove all breakpoints":"Remove All Breakpoints");contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add breakpoint":"Add Breakpoint"),this._addButtonClicked.bind(this));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove breakpoint":"Remove Breakpoint"),removeBreakpoint.bind(this));contextMenu.appendItem(removeAllTitle,removeAllBreakpoints.bind(this));contextMenu.show();},_checkboxClicked:function(url,event)
+{if(event.target.checked)
+DOMDebuggerAgent.setXHRBreakpoint(url);else
+DOMDebuggerAgent.removeXHRBreakpoint(url);this._saveBreakpoints();},_labelClicked:function(url)
+{var element=this._breakpointElements[url];var inputElement=document.createElement("span");inputElement.className="breakpoint-condition editing";inputElement.textContent=url;this.listElement.insertBefore(inputElement,element);element.classList.add("hidden");function finishEditing(accept,e,text)
+{this._removeListElement(inputElement);if(accept){this._removeBreakpoint(url);this._setBreakpoint(text,element._checkboxElement.checked);this._saveBreakpoints();}else
+element.classList.remove("hidden");}
+WebInspector.InplaceEditor.startEditing(inputElement,new WebInspector.InplaceEditor.Config(finishEditing.bind(this,true),finishEditing.bind(this,false)));},highlightBreakpoint:function(url)
+{var element=this._breakpointElements[url];if(!element)
+return;this.expand();element.classList.add("breakpoint-hit");this._highlightedElement=element;},clearBreakpointHighlight:function()
+{if(this._highlightedElement){this._highlightedElement.classList.remove("breakpoint-hit");delete this._highlightedElement;}},_saveBreakpoints:function()
+{var breakpoints=[];for(var url in this._breakpointElements)
+breakpoints.push({url:url,enabled:this._breakpointElements[url]._checkboxElement.checked});WebInspector.settings.xhrBreakpoints.set(breakpoints);},_restoreBreakpoints:function()
+{var breakpoints=WebInspector.settings.xhrBreakpoints.get();for(var i=0;i<breakpoints.length;++i){var breakpoint=breakpoints[i];if(breakpoint&&typeof breakpoint.url==="string")
+this._setBreakpoint(breakpoint.url,breakpoint.enabled);}},__proto__:WebInspector.NativeBreakpointsSidebarPane.prototype}
+WebInspector.EventListenerBreakpointsSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Event Listener Breakpoints"));this.registerRequiredCSS("breakpointsList.css");this.categoriesElement=document.createElement("ol");this.categoriesElement.tabIndex=0;this.categoriesElement.classList.add("properties-tree");this.categoriesElement.classList.add("event-listener-breakpoints");this.categoriesTreeOutline=new TreeOutline(this.categoriesElement);this.bodyElement.appendChild(this.categoriesElement);this._breakpointItems={};this._createCategory(WebInspector.UIString("Animation"),false,["requestAnimationFrame","cancelAnimationFrame","animationFrameFired"]);this._createCategory(WebInspector.UIString("Control"),true,["resize","scroll","zoom","focus","blur","select","change","submit","reset"]);this._createCategory(WebInspector.UIString("Clipboard"),true,["copy","cut","paste","beforecopy","beforecut","beforepaste"]);this._createCategory(WebInspector.UIString("DOM Mutation"),true,["DOMActivate","DOMFocusIn","DOMFocusOut","DOMAttrModified","DOMCharacterDataModified","DOMNodeInserted","DOMNodeInsertedIntoDocument","DOMNodeRemoved","DOMNodeRemovedFromDocument","DOMSubtreeModified","DOMContentLoaded"]);this._createCategory(WebInspector.UIString("Device"),true,["deviceorientation","devicemotion"]);this._createCategory(WebInspector.UIString("Drag / drop"),true,["dragenter","dragover","dragleave","drop"]);this._createCategory(WebInspector.UIString("Keyboard"),true,["keydown","keyup","keypress","input"]);this._createCategory(WebInspector.UIString("Load"),true,["load","beforeunload","unload","abort","error","hashchange","popstate"]);this._createCategory(WebInspector.UIString("Mouse"),true,["click","dblclick","mousedown","mouseup","mouseover","mousemove","mouseout","mousewheel","wheel"]);this._createCategory(WebInspector.UIString("Timer"),false,["setTimer","clearTimer","timerFired"]);this._createCategory(WebInspector.UIString("Touch"),true,["touchstart","touchmove","touchend","touchcancel"]);this._createCategory(WebInspector.UIString("WebGL"),false,["webglErrorFired","webglWarningFired"]);this._restoreBreakpoints();}
+WebInspector.EventListenerBreakpointsSidebarPane.categotyListener="listener:";WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation="instrumentation:";WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI=function(eventName,auxData)
+{if(!WebInspector.EventListenerBreakpointsSidebarPane._eventNamesForUI){WebInspector.EventListenerBreakpointsSidebarPane._eventNamesForUI={"instrumentation:setTimer":WebInspector.UIString("Set Timer"),"instrumentation:clearTimer":WebInspector.UIString("Clear Timer"),"instrumentation:timerFired":WebInspector.UIString("Timer Fired"),"instrumentation:requestAnimationFrame":WebInspector.UIString("Request Animation Frame"),"instrumentation:cancelAnimationFrame":WebInspector.UIString("Cancel Animation Frame"),"instrumentation:animationFrameFired":WebInspector.UIString("Animation Frame Fired"),"instrumentation:webglErrorFired":WebInspector.UIString("WebGL Error Fired"),"instrumentation:webglWarningFired":WebInspector.UIString("WebGL Warning Fired")};}
+if(auxData){if(eventName==="instrumentation:webglErrorFired"&&auxData["webglErrorName"]){var errorName=auxData["webglErrorName"];errorName=errorName.replace(/^.*(0x[0-9a-f]+).*$/i,"$1");return WebInspector.UIString("WebGL Error Fired (%s)",errorName);}}
+return WebInspector.EventListenerBreakpointsSidebarPane._eventNamesForUI[eventName]||eventName.substring(eventName.indexOf(":")+1);}
+WebInspector.EventListenerBreakpointsSidebarPane.prototype={_createCategory:function(name,isDOMEvent,eventNames)
+{var categoryItem={};categoryItem.element=new TreeElement(name);this.categoriesTreeOutline.appendChild(categoryItem.element);categoryItem.element.listItemElement.classList.add("event-category");categoryItem.element.selectable=true;categoryItem.checkbox=this._createCheckbox(categoryItem.element);categoryItem.checkbox.addEventListener("click",this._categoryCheckboxClicked.bind(this,categoryItem),true);categoryItem.children={};for(var i=0;i<eventNames.length;++i){var eventName=(isDOMEvent?WebInspector.EventListenerBreakpointsSidebarPane.categotyListener:WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation)+eventNames[i];var breakpointItem={};var title=WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI(eventName);breakpointItem.element=new TreeElement(title);categoryItem.element.appendChild(breakpointItem.element);var hitMarker=document.createElement("div");hitMarker.className="breakpoint-hit-marker";breakpointItem.element.listItemElement.appendChild(hitMarker);breakpointItem.element.listItemElement.classList.add("source-code");breakpointItem.element.selectable=false;breakpointItem.checkbox=this._createCheckbox(breakpointItem.element);breakpointItem.checkbox.addEventListener("click",this._breakpointCheckboxClicked.bind(this,eventName),true);breakpointItem.parent=categoryItem;this._breakpointItems[eventName]=breakpointItem;categoryItem.children[eventName]=breakpointItem;}},_createCheckbox:function(treeElement)
+{var checkbox=document.createElement("input");checkbox.className="checkbox-elem";checkbox.type="checkbox";treeElement.listItemElement.insertBefore(checkbox,treeElement.listItemElement.firstChild);return checkbox;},_categoryCheckboxClicked:function(categoryItem)
+{var checked=categoryItem.checkbox.checked;for(var eventName in categoryItem.children){var breakpointItem=categoryItem.children[eventName];if(breakpointItem.checkbox.checked===checked)
+continue;if(checked)
+this._setBreakpoint(eventName);else
+this._removeBreakpoint(eventName);}
+this._saveBreakpoints();},_breakpointCheckboxClicked:function(eventName,event)
+{if(event.target.checked)
+this._setBreakpoint(eventName);else
+this._removeBreakpoint(eventName);this._saveBreakpoints();},_setBreakpoint:function(eventName)
+{var breakpointItem=this._breakpointItems[eventName];if(!breakpointItem)
+return;breakpointItem.checkbox.checked=true;if(eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener))
+DOMDebuggerAgent.setEventListenerBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener.length));else if(eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation))
+DOMDebuggerAgent.setInstrumentationBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation.length));this._updateCategoryCheckbox(breakpointItem.parent);},_removeBreakpoint:function(eventName)
+{var breakpointItem=this._breakpointItems[eventName];if(!breakpointItem)
+return;breakpointItem.checkbox.checked=false;if(eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener))
+DOMDebuggerAgent.removeEventListenerBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener.length));else if(eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation))
+DOMDebuggerAgent.removeInstrumentationBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation.length));this._updateCategoryCheckbox(breakpointItem.parent);},_updateCategoryCheckbox:function(categoryItem)
+{var hasEnabled=false,hasDisabled=false;for(var eventName in categoryItem.children){var breakpointItem=categoryItem.children[eventName];if(breakpointItem.checkbox.checked)
+hasEnabled=true;else
+hasDisabled=true;}
+categoryItem.checkbox.checked=hasEnabled;categoryItem.checkbox.indeterminate=hasEnabled&&hasDisabled;},highlightBreakpoint:function(eventName)
+{var breakpointItem=this._breakpointItems[eventName];if(!breakpointItem)
+return;this.expand();breakpointItem.parent.element.expand();breakpointItem.element.listItemElement.classList.add("breakpoint-hit");this._highlightedElement=breakpointItem.element.listItemElement;},clearBreakpointHighlight:function()
+{if(this._highlightedElement){this._highlightedElement.classList.remove("breakpoint-hit");delete this._highlightedElement;}},_saveBreakpoints:function()
+{var breakpoints=[];for(var eventName in this._breakpointItems){if(this._breakpointItems[eventName].checkbox.checked)
+breakpoints.push({eventName:eventName});}
+WebInspector.settings.eventListenerBreakpoints.set(breakpoints);},_restoreBreakpoints:function()
+{var breakpoints=WebInspector.settings.eventListenerBreakpoints.get();for(var i=0;i<breakpoints.length;++i){var breakpoint=breakpoints[i];if(breakpoint&&typeof breakpoint.eventName==="string")
+this._setBreakpoint(breakpoint.eventName);}},__proto__:WebInspector.SidebarPane.prototype};WebInspector.CallStackSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Call Stack"));this.bodyElement.addEventListener("keydown",this._keyDown.bind(this),true);this.bodyElement.tabIndex=0;var asyncCheckbox=this.titleElement.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Async"),WebInspector.settings.enableAsyncStackTraces,true,undefined,WebInspector.UIString("Capture async stack traces")));asyncCheckbox.classList.add("scripts-callstack-async");asyncCheckbox.addEventListener("click",consumeEvent,false);WebInspector.settings.enableAsyncStackTraces.addChangeListener(this._asyncStackTracesStateChanged,this);}
+WebInspector.CallStackSidebarPane.Events={CallFrameRestarted:"CallFrameRestarted",CallFrameSelected:"CallFrameSelected"}
+WebInspector.CallStackSidebarPane.prototype={update:function(callFrames,asyncStackTrace)
+{this.bodyElement.removeChildren();delete this._statusMessageElement;this.placards=[];if(!callFrames){var infoElement=this.bodyElement.createChild("div","info");infoElement.textContent=WebInspector.UIString("Not Paused");return;}
+this._appendSidebarPlacards(callFrames);while(asyncStackTrace){var title=asyncStackTrace.description;if(title)
+title+=" "+WebInspector.UIString("(async)");else
+title=WebInspector.UIString("Async Call");var asyncPlacard=new WebInspector.Placard(title,"");asyncPlacard.element.classList.add("placard-label");this.bodyElement.appendChild(asyncPlacard.element);this._appendSidebarPlacards(asyncStackTrace.callFrames,asyncPlacard);asyncStackTrace=asyncStackTrace.asyncStackTrace;}},_appendSidebarPlacards:function(callFrames,asyncPlacard)
+{for(var i=0,n=callFrames.length;i<n;++i){var placard=new WebInspector.CallStackSidebarPane.Placard(callFrames[i],asyncPlacard);placard.element.addEventListener("click",this._placardSelected.bind(this,placard),false);placard.element.addEventListener("contextmenu",this._placardContextMenu.bind(this,placard),true);if(!i&&asyncPlacard){asyncPlacard.element.addEventListener("click",this._placardSelected.bind(this,placard),false);asyncPlacard.element.addEventListener("contextmenu",this._placardContextMenu.bind(this,placard),true);}
+this.placards.push(placard);this.bodyElement.appendChild(placard.element);}},_placardContextMenu:function(placard,event)
+{var contextMenu=new WebInspector.ContextMenu(event);if(!placard._callFrame.isAsync())
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Restart frame":"Restart Frame"),this._restartFrame.bind(this,placard));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Copy stack trace":"Copy Stack Trace"),this._copyStackTrace.bind(this));contextMenu.show();},_restartFrame:function(placard)
+{placard._callFrame.restart();this.dispatchEventToListeners(WebInspector.CallStackSidebarPane.Events.CallFrameRestarted,placard._callFrame);},_asyncStackTracesStateChanged:function()
+{var enabled=WebInspector.settings.enableAsyncStackTraces.get();if(!enabled&&this.placards)
+this._removeAsyncPlacards();},_removeAsyncPlacards:function()
+{var shouldSelectTopFrame=false;var lastSyncPlacardIndex=-1;for(var i=0;i<this.placards.length;++i){var placard=this.placards[i];if(placard._asyncPlacard){if(placard.selected)
+shouldSelectTopFrame=true;placard._asyncPlacard.element.remove();placard.element.remove();}else{lastSyncPlacardIndex=i;}}
+this.placards.length=lastSyncPlacardIndex+1;if(shouldSelectTopFrame)
+this._selectPlacardByIndex(0);},setSelectedCallFrame:function(x)
+{for(var i=0;i<this.placards.length;++i){var placard=this.placards[i];placard.selected=(placard._callFrame===x);}},_selectNextCallFrameOnStack:function()
+{var index=this._selectedCallFrameIndex();if(index===-1)
+return false;return this._selectPlacardByIndex(index+1);},_selectPreviousCallFrameOnStack:function()
+{var index=this._selectedCallFrameIndex();if(index===-1)
+return false;return this._selectPlacardByIndex(index-1);},_selectPlacardByIndex:function(index)
+{if(index<0||index>=this.placards.length)
+return false;this._placardSelected(this.placards[index]);return true;},_selectedCallFrameIndex:function()
+{var selectedCallFrame=WebInspector.debuggerModel.selectedCallFrame();if(!selectedCallFrame)
+return-1;for(var i=0;i<this.placards.length;++i){var placard=this.placards[i];if(placard._callFrame===selectedCallFrame)
+return i;}
+return-1;},_placardSelected:function(placard)
+{placard.element.scrollIntoViewIfNeeded();this.dispatchEventToListeners(WebInspector.CallStackSidebarPane.Events.CallFrameSelected,placard._callFrame);},_copyStackTrace:function()
+{var text="";for(var i=0;i<this.placards.length;++i){if(i&&this.placards[i]._asyncPlacard!==this.placards[i-1]._asyncPlacard)
+text+=this.placards[i]._asyncPlacard.title+"\n";text+=this.placards[i].title+" ("+this.placards[i].subtitle+")\n";}
+InspectorFrontendHost.copyText(text);},registerShortcuts:function(registerShortcutDelegate)
+{registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.NextCallFrame,this._selectNextCallFrameOnStack.bind(this));registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.PrevCallFrame,this._selectPreviousCallFrameOnStack.bind(this));},setStatus:function(status)
+{if(!this._statusMessageElement)
+this._statusMessageElement=this.bodyElement.createChild("div","info");if(typeof status==="string"){this._statusMessageElement.textContent=status;}else{this._statusMessageElement.removeChildren();this._statusMessageElement.appendChild(status);}},_keyDown:function(event)
+{if(event.altKey||event.shiftKey||event.metaKey||event.ctrlKey)
+return;if(event.keyIdentifier==="Up"&&this._selectPreviousCallFrameOnStack()||event.keyIdentifier==="Down"&&this._selectNextCallFrameOnStack())
+event.consume(true);},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.CallStackSidebarPane.Placard=function(callFrame,asyncPlacard)
+{WebInspector.Placard.call(this,callFrame.functionName||WebInspector.UIString("(anonymous function)"),"");callFrame.createLiveLocation(this._update.bind(this));this._callFrame=callFrame;this._asyncPlacard=asyncPlacard;}
+WebInspector.CallStackSidebarPane.Placard.prototype={_update:function(uiLocation)
+{this.subtitle=uiLocation.linkText().trimMiddle(100);},__proto__:WebInspector.Placard.prototype};WebInspector.HistoryEntry=function(){}
+WebInspector.HistoryEntry.prototype={valid:function(){},reveal:function(){}};WebInspector.SimpleHistoryManager=function(historyDepth)
+{this._entries=[];this._activeEntryIndex=-1;this._coalescingReadonly=0;this._historyDepth=historyDepth;}
+WebInspector.SimpleHistoryManager.prototype={readOnlyLock:function()
+{++this._coalescingReadonly;},releaseReadOnlyLock:function()
+{--this._coalescingReadonly;},readOnly:function()
+{return!!this._coalescingReadonly;},filterOut:function(filterOutCallback)
+{if(this.readOnly())
+return;var filteredEntries=[];var removedBeforeActiveEntry=0;for(var i=0;i<this._entries.length;++i){if(!filterOutCallback(this._entries[i])){filteredEntries.push(this._entries[i]);}else if(i<=this._activeEntryIndex)
+++removedBeforeActiveEntry;}
+this._entries=filteredEntries;this._activeEntryIndex=Math.max(0,this._activeEntryIndex-removedBeforeActiveEntry);},empty:function()
+{return!this._entries.length;},active:function()
+{return this.empty()?null:this._entries[this._activeEntryIndex];},push:function(entry)
+{if(this.readOnly())
+return;if(!this.empty())
+this._entries.splice(this._activeEntryIndex+1);this._entries.push(entry);if(this._entries.length>this._historyDepth)
+this._entries.shift();this._activeEntryIndex=this._entries.length-1;},rollback:function()
+{if(this.empty())
+return false;var revealIndex=this._activeEntryIndex-1;while(revealIndex>=0&&!this._entries[revealIndex].valid())
+--revealIndex;if(revealIndex<0)
+return false;this.readOnlyLock();this._entries[revealIndex].reveal();this.releaseReadOnlyLock();this._activeEntryIndex=revealIndex;return true;},rollover:function()
+{var revealIndex=this._activeEntryIndex+1;while(revealIndex<this._entries.length&&!this._entries[revealIndex].valid())
+++revealIndex;if(revealIndex>=this._entries.length)
+return false;this.readOnlyLock();this._entries[revealIndex].reveal();this.releaseReadOnlyLock();this._activeEntryIndex=revealIndex;return true;},};;WebInspector.EditingLocationHistoryManager=function(sourcesView,currentSourceFrameCallback)
+{this._sourcesView=sourcesView;this._historyManager=new WebInspector.SimpleHistoryManager(WebInspector.EditingLocationHistoryManager.HistoryDepth);this._currentSourceFrameCallback=currentSourceFrameCallback;}
+WebInspector.EditingLocationHistoryManager.HistoryDepth=20;WebInspector.EditingLocationHistoryManager.prototype={trackSourceFrameCursorJumps:function(sourceFrame)
+{sourceFrame.addEventListener(WebInspector.SourceFrame.Events.JumpHappened,this._onJumpHappened.bind(this));},_onJumpHappened:function(event)
+{if(event.data.from)
+this._updateActiveState(event.data.from);if(event.data.to)
+this._pushActiveState(event.data.to);},rollback:function()
+{this._historyManager.rollback();},rollover:function()
+{this._historyManager.rollover();},updateCurrentState:function()
+{var sourceFrame=this._currentSourceFrameCallback();if(!sourceFrame)
+return;this._updateActiveState(sourceFrame.textEditor.selection());},pushNewState:function()
+{var sourceFrame=this._currentSourceFrameCallback();if(!sourceFrame)
+return;this._pushActiveState(sourceFrame.textEditor.selection());},_updateActiveState:function(selection)
+{var active=this._historyManager.active();if(!active)
+return;var sourceFrame=this._currentSourceFrameCallback();if(!sourceFrame)
+return;var entry=new WebInspector.EditingLocationHistoryEntry(this._sourcesView,this,sourceFrame,selection);active.merge(entry);},_pushActiveState:function(selection)
+{var sourceFrame=this._currentSourceFrameCallback();if(!sourceFrame)
+return;var entry=new WebInspector.EditingLocationHistoryEntry(this._sourcesView,this,sourceFrame,selection);this._historyManager.push(entry);},removeHistoryForSourceCode:function(uiSourceCode)
+{function filterOut(entry)
+{return entry._projectId===uiSourceCode.project().id()&&entry._path===uiSourceCode.path();}
+this._historyManager.filterOut(filterOut);},}
+WebInspector.EditingLocationHistoryEntry=function(sourcesView,editingLocationManager,sourceFrame,selection)
+{this._sourcesView=sourcesView;this._editingLocationManager=editingLocationManager;var uiSourceCode=sourceFrame.uiSourceCode();this._projectId=uiSourceCode.project().id();this._path=uiSourceCode.path();var position=this._positionFromSelection(selection);this._positionHandle=sourceFrame.textEditor.textEditorPositionHandle(position.lineNumber,position.columnNumber);}
+WebInspector.EditingLocationHistoryEntry.prototype={merge:function(entry)
+{if(this._projectId!==entry._projectId||this._path!==entry._path)
+return;this._positionHandle=entry._positionHandle;},_positionFromSelection:function(selection)
+{return{lineNumber:selection.endLine,columnNumber:selection.endColumn};},valid:function()
+{var position=this._positionHandle.resolve();var uiSourceCode=WebInspector.workspace.project(this._projectId).uiSourceCode(this._path);return!!(position&&uiSourceCode);},reveal:function()
+{var position=this._positionHandle.resolve();var uiSourceCode=WebInspector.workspace.project(this._projectId).uiSourceCode(this._path);if(!position||!uiSourceCode)
+return;this._editingLocationManager.updateCurrentState();this._sourcesView.showSourceLocation(uiSourceCode,position.lineNumber,position.columnNumber);}};;WebInspector.FilePathScoreFunction=function(query)
+{this._query=query;this._queryUpperCase=query.toUpperCase();this._score=null;this._sequence=null;this._dataUpperCase="";this._fileNameIndex=0;}
+WebInspector.FilePathScoreFunction.filterRegex=function(query)
+{const toEscape=String.regexSpecialCharacters();var regexString="";for(var i=0;i<query.length;++i){var c=query.charAt(i);if(toEscape.indexOf(c)!==-1)
+c="\\"+c;if(i)
+regexString+="[^"+c+"]*";regexString+=c;}
+return new RegExp(regexString,"i");}
+WebInspector.FilePathScoreFunction.prototype={score:function(data,matchIndexes)
+{if(!data||!this._query)
+return 0;var n=this._query.length;var m=data.length;if(!this._score||this._score.length<n*m){this._score=new Int32Array(n*m*2);this._sequence=new Int32Array(n*m*2);}
+var score=this._score;var sequence=(this._sequence);this._dataUpperCase=data.toUpperCase();this._fileNameIndex=data.lastIndexOf("/");for(var i=0;i<n;++i){for(var j=0;j<m;++j){var skipCharScore=j===0?0:score[i*m+j-1];var prevCharScore=i===0||j===0?0:score[(i-1)*m+j-1];var consecutiveMatch=i===0||j===0?0:sequence[(i-1)*m+j-1];var pickCharScore=this._match(this._query,data,i,j,consecutiveMatch);if(pickCharScore&&prevCharScore+pickCharScore>skipCharScore){sequence[i*m+j]=consecutiveMatch+1;score[i*m+j]=(prevCharScore+pickCharScore);}else{sequence[i*m+j]=0;score[i*m+j]=skipCharScore;}}}
+if(matchIndexes)
+this._restoreMatchIndexes(sequence,n,m,matchIndexes);return score[n*m-1];},_testWordStart:function(data,j)
+{var prevChar=data.charAt(j-1);return j===0||prevChar==="_"||prevChar==="-"||prevChar==="/"||(data[j-1]!==this._dataUpperCase[j-1]&&data[j]===this._dataUpperCase[j]);},_restoreMatchIndexes:function(sequence,n,m,out)
+{var i=n-1,j=m-1;while(i>=0&&j>=0){switch(sequence[i*m+j]){case 0:--j;break;default:out.push(j);--i;--j;break;}}
+out.reverse();},_singleCharScore:function(query,data,i,j)
+{var isWordStart=this._testWordStart(data,j);var isFileName=j>this._fileNameIndex;var isPathTokenStart=j===0||data[j-1]==="/";var isCapsMatch=query[i]===data[j]&&query[i]==this._queryUpperCase[i];var score=10;if(isPathTokenStart)
+score+=4;if(isWordStart)
+score+=2;if(isCapsMatch)
+score+=6;if(isFileName)
+score+=4;if(j===this._fileNameIndex+1&&i===0)
+score+=5;if(isFileName&&isWordStart)
+score+=3;return score;},_sequenceCharScore:function(query,data,i,j,sequenceLength)
+{var isFileName=j>this._fileNameIndex;var isPathTokenStart=j===0||data[j-1]==="/";var score=10;if(isFileName)
+score+=4;if(isPathTokenStart)
+score+=5;score+=sequenceLength*4;return score;},_match:function(query,data,i,j,consecutiveMatch)
+{if(this._queryUpperCase[i]!==this._dataUpperCase[j])
+return 0;if(!consecutiveMatch)
+return this._singleCharScore(query,data,i,j);else
+return this._sequenceCharScore(query,data,i,j-consecutiveMatch,consecutiveMatch);},};WebInspector.FilteredItemSelectionDialog=function(delegate)
+{WebInspector.DialogDelegate.call(this);if(!WebInspector.FilteredItemSelectionDialog._stylesLoaded){WebInspector.View.createStyleElement("filteredItemSelectionDialog.css");WebInspector.FilteredItemSelectionDialog._stylesLoaded=true;}
+this.element=document.createElement("div");this.element.className="filtered-item-list-dialog";this.element.addEventListener("keydown",this._onKeyDown.bind(this),false);this._promptElement=this.element.createChild("input","monospace");this._promptElement.addEventListener("input",this._onInput.bind(this),false);this._promptElement.type="text";this._promptElement.setAttribute("spellcheck","false");this._filteredItems=[];this._viewportControl=new WebInspector.ViewportControl(this);this._itemElementsContainer=this._viewportControl.element;this._itemElementsContainer.classList.add("container");this._itemElementsContainer.classList.add("monospace");this._itemElementsContainer.addEventListener("click",this._onClick.bind(this),false);this.element.appendChild(this._itemElementsContainer);this._delegate=delegate;this._delegate.setRefreshCallback(this._itemsLoaded.bind(this));this._itemsLoaded();}
+WebInspector.FilteredItemSelectionDialog.prototype={position:function(element,relativeToElement)
+{const shadow=10;const shadowPadding=20;var container=WebInspector.Dialog.modalHostView().element;var preferredWidth=Math.max(relativeToElement.offsetWidth*2/3,500);var width=Math.min(preferredWidth,container.offsetWidth-2*shadowPadding);var preferredHeight=Math.max(relativeToElement.offsetHeight*2/3,204);var height=Math.min(preferredHeight,container.offsetHeight-2*shadowPadding);this.element.style.width=width+"px";var box=relativeToElement.boxInWindow(window).relativeToElement(container);var positionX=box.x+Math.max((box.width-width-2*shadowPadding)/2,shadow);positionX=Math.max(shadow,Math.min(container.offsetWidth-width-2*shadowPadding,positionX));var positionY=box.y+Math.max((box.height-height-2*shadowPadding)/2,shadow);positionY=Math.max(shadow,Math.min(container.offsetHeight-height-2*shadowPadding,positionY));element.positionAt(positionX,positionY,container);this._dialogHeight=height;this._updateShowMatchingItems();},focus:function()
+{WebInspector.setCurrentFocusElement(this._promptElement);if(this._filteredItems.length&&this._viewportControl.lastVisibleIndex()===-1)
+this._viewportControl.refresh();},willHide:function()
+{if(this._isHiding)
+return;this._isHiding=true;this._delegate.dispose();if(this._filterTimer)
+clearTimeout(this._filterTimer);},renderAsTwoRows:function()
+{this._renderAsTwoRows=true;},onEnter:function()
+{if(!this._delegate.itemCount())
+return;var selectedIndex=this._selectedIndexInFiltered<this._filteredItems.length?this._filteredItems[this._selectedIndexInFiltered]:null;this._delegate.selectItem(selectedIndex,this._promptElement.value.trim());},_itemsLoaded:function()
+{if(this._loadTimeout)
+return;this._loadTimeout=setTimeout(this._updateAfterItemsLoaded.bind(this),0);},_updateAfterItemsLoaded:function()
+{delete this._loadTimeout;this._filterItems();},_createItemElement:function(index)
+{var itemElement=document.createElement("div");itemElement.className="filtered-item-list-dialog-item "+(this._renderAsTwoRows?"two-rows":"one-row");itemElement._titleElement=itemElement.createChild("div","filtered-item-list-dialog-title");itemElement._subtitleElement=itemElement.createChild("div","filtered-item-list-dialog-subtitle");itemElement._subtitleElement.textContent="\u200B";itemElement._index=index;this._delegate.renderItem(index,this._promptElement.value.trim(),itemElement._titleElement,itemElement._subtitleElement);return itemElement;},setQuery:function(query)
+{this._promptElement.value=query;this._scheduleFilter();},_filterItems:function()
+{delete this._filterTimer;if(this._scoringTimer){clearTimeout(this._scoringTimer);delete this._scoringTimer;}
+var query=this._delegate.rewriteQuery(this._promptElement.value.trim());this._query=query;var queryLength=query.length;var filterRegex=query?WebInspector.FilePathScoreFunction.filterRegex(query):null;var oldSelectedAbsoluteIndex=this._selectedIndexInFiltered?this._filteredItems[this._selectedIndexInFiltered]:null;var filteredItems=[];this._selectedIndexInFiltered=0;var bestScores=[];var bestItems=[];var bestItemsToCollect=100;var minBestScore=0;var overflowItems=[];scoreItems.call(this,0);function compareIntegers(a,b)
+{return b-a;}
+function scoreItems(fromIndex)
+{var maxWorkItems=1000;var workDone=0;for(var i=fromIndex;i<this._delegate.itemCount()&&workDone<maxWorkItems;++i){if(filterRegex&&!filterRegex.test(this._delegate.itemKeyAt(i)))
+continue;var score=this._delegate.itemScoreAt(i,query);if(query)
+workDone++;if(score>minBestScore||bestScores.length<bestItemsToCollect){var index=insertionIndexForObjectInListSortedByFunction(score,bestScores,compareIntegers,true);bestScores.splice(index,0,score);bestItems.splice(index,0,i);if(bestScores.length>bestItemsToCollect){overflowItems.push(bestItems.peekLast());bestScores.length=bestItemsToCollect;bestItems.length=bestItemsToCollect;}
+minBestScore=bestScores.peekLast();}else
+filteredItems.push(i);}
+if(i<this._delegate.itemCount()){this._scoringTimer=setTimeout(scoreItems.bind(this,i),0);return;}
+delete this._scoringTimer;this._filteredItems=bestItems.concat(overflowItems).concat(filteredItems);for(var i=0;i<this._filteredItems.length;++i){if(this._filteredItems[i]===oldSelectedAbsoluteIndex){this._selectedIndexInFiltered=i;break;}}
+this._viewportControl.refresh();if(!query)
+this._selectedIndexInFiltered=0;this._updateSelection(this._selectedIndexInFiltered,false);}},_shouldShowMatchingItems:function()
+{return this._delegate.shouldShowMatchingItems(this._promptElement.value);},_onInput:function(event)
+{this._updateShowMatchingItems();this._scheduleFilter();},_updateShowMatchingItems:function()
+{var shouldShowMatchingItems=this._shouldShowMatchingItems();this._itemElementsContainer.classList.toggle("hidden",!shouldShowMatchingItems);this.element.style.height=shouldShowMatchingItems?this._dialogHeight+"px":"auto";},_onKeyDown:function(event)
+{var newSelectedIndex=this._selectedIndexInFiltered;switch(event.keyCode){case WebInspector.KeyboardShortcut.Keys.Down.code:if(++newSelectedIndex>=this._filteredItems.length)
+newSelectedIndex=this._filteredItems.length-1;this._updateSelection(newSelectedIndex,true);event.consume(true);break;case WebInspector.KeyboardShortcut.Keys.Up.code:if(--newSelectedIndex<0)
+newSelectedIndex=0;this._updateSelection(newSelectedIndex,false);event.consume(true);break;case WebInspector.KeyboardShortcut.Keys.PageDown.code:newSelectedIndex=Math.min(newSelectedIndex+this._viewportControl.rowsPerViewport(),this._filteredItems.length-1);this._updateSelection(newSelectedIndex,true);event.consume(true);break;case WebInspector.KeyboardShortcut.Keys.PageUp.code:newSelectedIndex=Math.max(newSelectedIndex-this._viewportControl.rowsPerViewport(),0);this._updateSelection(newSelectedIndex,false);event.consume(true);break;default:}},_scheduleFilter:function()
+{if(this._filterTimer)
+return;this._filterTimer=setTimeout(this._filterItems.bind(this),0);},_updateSelection:function(index,makeLast)
+{var element=this._viewportControl.renderedElementAt(this._selectedIndexInFiltered);if(element)
+element.classList.remove("selected");this._viewportControl.scrollItemIntoView(index,makeLast);this._selectedIndexInFiltered=index;element=this._viewportControl.renderedElementAt(index);if(element)
+element.classList.add("selected");},_onClick:function(event)
+{var itemElement=event.target.enclosingNodeOrSelfWithClass("filtered-item-list-dialog-item");if(!itemElement)
+return;this._delegate.selectItem(itemElement._index,this._promptElement.value.trim());WebInspector.Dialog.hide();},itemCount:function()
+{return this._filteredItems.length;},itemElement:function(index)
+{var delegateIndex=this._filteredItems[index];var element=this._createItemElement(delegateIndex);if(index===this._selectedIndexInFiltered)
+element.classList.add("selected");return element;},__proto__:WebInspector.DialogDelegate.prototype}
+WebInspector.SelectionDialogContentProvider=function()
+{}
+WebInspector.SelectionDialogContentProvider.prototype={setRefreshCallback:function(refreshCallback)
+{this._refreshCallback=refreshCallback;},shouldShowMatchingItems:function(query)
+{return true;},itemCount:function()
+{return 0;},itemKeyAt:function(itemIndex)
+{return"";},itemScoreAt:function(itemIndex,query)
+{return 1;},renderItem:function(itemIndex,query,titleElement,subtitleElement)
+{},highlightRanges:function(element,query)
+{if(!query)
+return false;function rangesForMatch(text,query)
+{var sm=new difflib.SequenceMatcher(query,text);var opcodes=sm.get_opcodes();var ranges=[];for(var i=0;i<opcodes.length;++i){var opcode=opcodes[i];if(opcode[0]==="equal")
+ranges.push(new WebInspector.SourceRange(opcode[3],opcode[4]-opcode[3]));else if(opcode[0]!=="insert")
+return null;}
+return ranges;}
+var text=element.textContent;var ranges=rangesForMatch(text,query);if(!ranges)
+ranges=rangesForMatch(text.toUpperCase(),query.toUpperCase());if(ranges){WebInspector.highlightRangesWithStyleClass(element,ranges,"highlight");return true;}
+return false;},selectItem:function(itemIndex,promptValue)
+{},refresh:function()
+{this._refreshCallback();},rewriteQuery:function(query)
+{return query;},dispose:function()
+{}}
+WebInspector.JavaScriptOutlineDialog=function(uiSourceCode,selectItemCallback)
+{WebInspector.SelectionDialogContentProvider.call(this);this._functionItems=[];this._selectItemCallback=selectItemCallback;this._outlineWorker=new Worker("ScriptFormatterWorker.js");this._outlineWorker.onmessage=this._didBuildOutlineChunk.bind(this);this._outlineWorker.postMessage({method:"javaScriptOutline",params:{content:uiSourceCode.workingCopy()}});}
+WebInspector.JavaScriptOutlineDialog.show=function(view,uiSourceCode,selectItemCallback)
+{if(WebInspector.Dialog.currentInstance())
+return null;var filteredItemSelectionDialog=new WebInspector.FilteredItemSelectionDialog(new WebInspector.JavaScriptOutlineDialog(uiSourceCode,selectItemCallback));WebInspector.Dialog.show(view.element,filteredItemSelectionDialog);}
+WebInspector.JavaScriptOutlineDialog.prototype={_didBuildOutlineChunk:function(event)
+{var data=(event.data);var chunk=data.chunk;for(var i=0;i<chunk.length;++i)
+this._functionItems.push(chunk[i]);if(data.total===data.index+1)
+this.dispose();this.refresh();},itemCount:function()
+{return this._functionItems.length;},itemKeyAt:function(itemIndex)
+{return this._functionItems[itemIndex].name;},itemScoreAt:function(itemIndex,query)
+{var item=this._functionItems[itemIndex];return-item.line;},renderItem:function(itemIndex,query,titleElement,subtitleElement)
+{var item=this._functionItems[itemIndex];titleElement.textContent=item.name+(item.arguments?item.arguments:"");this.highlightRanges(titleElement,query);subtitleElement.textContent=":"+(item.line+1);},selectItem:function(itemIndex,promptValue)
+{if(itemIndex===null)
+return;var lineNumber=this._functionItems[itemIndex].line;if(!isNaN(lineNumber)&&lineNumber>=0)
+this._selectItemCallback(lineNumber,this._functionItems[itemIndex].column);},dispose:function()
+{if(this._outlineWorker){this._outlineWorker.terminate();delete this._outlineWorker;}},__proto__:WebInspector.SelectionDialogContentProvider.prototype}
+WebInspector.SelectUISourceCodeDialog=function(defaultScores)
+{WebInspector.SelectionDialogContentProvider.call(this);this._uiSourceCodes=[];var projects=WebInspector.workspace.projects().filter(this.filterProject.bind(this));for(var i=0;i<projects.length;++i)
+this._uiSourceCodes=this._uiSourceCodes.concat(projects[i].uiSourceCodes());this._defaultScores=defaultScores;this._scorer=new WebInspector.FilePathScoreFunction("");WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);}
+WebInspector.SelectUISourceCodeDialog.prototype={uiSourceCodeSelected:function(uiSourceCode,lineNumber,columnNumber)
+{},filterProject:function(project)
+{return true;},itemCount:function()
+{return this._uiSourceCodes.length;},itemKeyAt:function(itemIndex)
+{return this._uiSourceCodes[itemIndex].fullDisplayName();},itemScoreAt:function(itemIndex,query)
+{var uiSourceCode=this._uiSourceCodes[itemIndex];var score=this._defaultScores?(this._defaultScores.get(uiSourceCode)||0):0;if(!query||query.length<2)
+return score;if(this._query!==query){this._query=query;this._scorer=new WebInspector.FilePathScoreFunction(query);}
+var path=uiSourceCode.fullDisplayName();return score+10*this._scorer.score(path,null);},renderItem:function(itemIndex,query,titleElement,subtitleElement)
+{query=this.rewriteQuery(query);var uiSourceCode=this._uiSourceCodes[itemIndex];titleElement.textContent=uiSourceCode.displayName()+(this._queryLineNumberAndColumnNumber||"");subtitleElement.textContent=uiSourceCode.fullDisplayName().trimEnd(100);var indexes=[];var score=new WebInspector.FilePathScoreFunction(query).score(subtitleElement.textContent,indexes);var fileNameIndex=subtitleElement.textContent.lastIndexOf("/");var ranges=[];for(var i=0;i<indexes.length;++i)
+ranges.push({offset:indexes[i],length:1});if(indexes[0]>fileNameIndex){for(var i=0;i<ranges.length;++i)
+ranges[i].offset-=fileNameIndex+1;return WebInspector.highlightRangesWithStyleClass(titleElement,ranges,"highlight");}else{return WebInspector.highlightRangesWithStyleClass(subtitleElement,ranges,"highlight");}},selectItem:function(itemIndex,promptValue)
+{var parsedExpression=promptValue.trim().match(/^([^:]*)(:\d+)?(:\d+)?$/);if(!parsedExpression)
+return;var lineNumber;var columnNumber;if(parsedExpression[2])
+lineNumber=parseInt(parsedExpression[2].substr(1),10)-1;if(parsedExpression[3])
+columnNumber=parseInt(parsedExpression[3].substr(1),10)-1;var uiSourceCode=itemIndex!==null?this._uiSourceCodes[itemIndex]:null;this.uiSourceCodeSelected(uiSourceCode,lineNumber,columnNumber);},rewriteQuery:function(query)
+{if(!query)
+return query;query=query.trim();var lineNumberMatch=query.match(/^([^:]+)((?::[^:]*){0,2})$/);this._queryLineNumberAndColumnNumber=lineNumberMatch?lineNumberMatch[2]:"";return lineNumberMatch?lineNumberMatch[1]:query;},_uiSourceCodeAdded:function(event)
+{var uiSourceCode=(event.data);if(!this.filterProject(uiSourceCode.project()))
+return;this._uiSourceCodes.push(uiSourceCode)
+this.refresh();},dispose:function()
+{WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);},__proto__:WebInspector.SelectionDialogContentProvider.prototype}
+WebInspector.OpenResourceDialog=function(sourcesView,defaultScores)
+{WebInspector.SelectUISourceCodeDialog.call(this,defaultScores);this._sourcesView=sourcesView;}
+WebInspector.OpenResourceDialog.prototype={uiSourceCodeSelected:function(uiSourceCode,lineNumber,columnNumber)
+{if(!uiSourceCode)
+uiSourceCode=this._sourcesView.currentUISourceCode();if(!uiSourceCode)
+return;this._sourcesView.showSourceLocation(uiSourceCode,lineNumber,columnNumber);},shouldShowMatchingItems:function(query)
+{return!query.startsWith(":");},filterProject:function(project)
+{return!project.isServiceProject();},__proto__:WebInspector.SelectUISourceCodeDialog.prototype}
+WebInspector.OpenResourceDialog.show=function(sourcesView,relativeToElement,query,defaultScores)
+{if(WebInspector.Dialog.currentInstance())
+return;var filteredItemSelectionDialog=new WebInspector.FilteredItemSelectionDialog(new WebInspector.OpenResourceDialog(sourcesView,defaultScores));filteredItemSelectionDialog.renderAsTwoRows();if(query)
+filteredItemSelectionDialog.setQuery(query);WebInspector.Dialog.show(relativeToElement,filteredItemSelectionDialog);}
+WebInspector.SelectUISourceCodeForProjectTypeDialog=function(type,callback)
+{this._type=type;WebInspector.SelectUISourceCodeDialog.call(this);this._callback=callback;}
+WebInspector.SelectUISourceCodeForProjectTypeDialog.prototype={uiSourceCodeSelected:function(uiSourceCode,lineNumber,columnNumber)
+{this._callback(uiSourceCode);},filterProject:function(project)
+{return project.type()===this._type;},__proto__:WebInspector.SelectUISourceCodeDialog.prototype}
+WebInspector.SelectUISourceCodeForProjectTypeDialog.show=function(name,type,callback,relativeToElement)
+{if(WebInspector.Dialog.currentInstance())
+return;var filteredItemSelectionDialog=new WebInspector.FilteredItemSelectionDialog(new WebInspector.SelectUISourceCodeForProjectTypeDialog(type,callback));filteredItemSelectionDialog.setQuery(name);filteredItemSelectionDialog.renderAsTwoRows();WebInspector.Dialog.show(relativeToElement,filteredItemSelectionDialog);}
+WebInspector.JavaScriptOutlineDialog.MessageEventData;;WebInspector.UISourceCodeFrame=function(uiSourceCode)
+{this._uiSourceCode=uiSourceCode;WebInspector.SourceFrame.call(this,this._uiSourceCode);WebInspector.settings.textEditorAutocompletion.addChangeListener(this._enableAutocompletionIfNeeded,this);this._enableAutocompletionIfNeeded();this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._onWorkingCopyChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._onWorkingCopyCommitted,this);this._updateStyle();}
+WebInspector.UISourceCodeFrame.prototype={uiSourceCode:function()
+{return this._uiSourceCode;},_enableAutocompletionIfNeeded:function()
+{this.textEditor.setCompletionDictionary(WebInspector.settings.textEditorAutocompletion.get()?new WebInspector.SampleCompletionDictionary():null);},wasShown:function()
+{WebInspector.SourceFrame.prototype.wasShown.call(this);this._boundWindowFocused=this._windowFocused.bind(this);window.addEventListener("focus",this._boundWindowFocused,false);this._checkContentUpdated();},willHide:function()
+{WebInspector.SourceFrame.prototype.willHide.call(this);window.removeEventListener("focus",this._boundWindowFocused,false);delete this._boundWindowFocused;this._uiSourceCode.removeWorkingCopyGetter();},canEditSource:function()
+{return this._uiSourceCode.isEditable();},_windowFocused:function(event)
+{this._checkContentUpdated();},_checkContentUpdated:function()
+{if(!this.loaded||!this.isShowing())
+return;this._uiSourceCode.checkContentUpdated();},commitEditing:function()
+{if(!this._uiSourceCode.isDirty())
+return;this._muteSourceCodeEvents=true;this._uiSourceCode.commitWorkingCopy(this._didEditContent.bind(this));delete this._muteSourceCodeEvents;},onTextChanged:function(oldRange,newRange)
+{WebInspector.SourceFrame.prototype.onTextChanged.call(this,oldRange,newRange);if(this._isSettingContent)
+return;this._muteSourceCodeEvents=true;if(this._textEditor.isClean())
+this._uiSourceCode.resetWorkingCopy();else
+this._uiSourceCode.setWorkingCopyGetter(this._textEditor.text.bind(this._textEditor));delete this._muteSourceCodeEvents;},_didEditContent:function(error)
+{if(error){WebInspector.console.log(error,WebInspector.ConsoleMessage.MessageLevel.Error,true);return;}},_onWorkingCopyChanged:function(event)
+{if(this._muteSourceCodeEvents)
+return;this._innerSetContent(this._uiSourceCode.workingCopy());this.onUISourceCodeContentChanged();},_onWorkingCopyCommitted:function(event)
+{if(!this._muteSourceCodeEvents){this._innerSetContent(this._uiSourceCode.workingCopy());this.onUISourceCodeContentChanged();}
+this._textEditor.markClean();this._updateStyle();},_updateStyle:function()
+{this.element.classList.toggle("source-frame-unsaved-committed-changes",this._uiSourceCode.hasUnsavedCommittedChanges());},onUISourceCodeContentChanged:function()
+{},_innerSetContent:function(content)
+{this._isSettingContent=true;this.setContent(content);delete this._isSettingContent;},populateTextAreaContextMenu:function(contextMenu,lineNumber)
+{WebInspector.SourceFrame.prototype.populateTextAreaContextMenu.call(this,contextMenu,lineNumber);contextMenu.appendApplicableItems(this._uiSourceCode);contextMenu.appendSeparator();},dispose:function()
+{this.detach();},__proto__:WebInspector.SourceFrame.prototype};WebInspector.JavaScriptSourceFrame=function(scriptsPanel,uiSourceCode)
+{this._scriptsPanel=scriptsPanel;this._breakpointManager=WebInspector.breakpointManager;this._uiSourceCode=uiSourceCode;WebInspector.UISourceCodeFrame.call(this,uiSourceCode);if(uiSourceCode.project().type()===WebInspector.projectTypes.Debugger)
+this.element.classList.add("source-frame-debugger-script");this._popoverHelper=new WebInspector.ObjectPopoverHelper(this.textEditor.element,this._getPopoverAnchor.bind(this),this._resolveObjectForPopover.bind(this),this._onHidePopover.bind(this),true);this.textEditor.element.addEventListener("keydown",this._onKeyDown.bind(this),true);this.textEditor.addEventListener(WebInspector.TextEditor.Events.GutterClick,this._handleGutterClick.bind(this),this);this._breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointAdded,this._breakpointAdded,this);this._breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointRemoved,this._breakpointRemoved,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.ConsoleMessageAdded,this._consoleMessageAdded,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.ConsoleMessageRemoved,this._consoleMessageRemoved,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.ConsoleMessagesCleared,this._consoleMessagesCleared,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged,this._onSourceMappingChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);this._registerShortcuts();this._updateScriptFile();}
+WebInspector.JavaScriptSourceFrame.prototype={_registerShortcuts:function()
+{var shortcutKeys=WebInspector.ShortcutsScreen.SourcesPanelShortcuts;for(var i=0;i<shortcutKeys.EvaluateSelectionInConsole.length;++i){var keyDescriptor=shortcutKeys.EvaluateSelectionInConsole[i];this.addShortcut(keyDescriptor.key,this._evaluateSelectionInConsole.bind(this));}
+for(var i=0;i<shortcutKeys.AddSelectionToWatch.length;++i){var keyDescriptor=shortcutKeys.AddSelectionToWatch[i];this.addShortcut(keyDescriptor.key,this._addCurrentSelectionToWatch.bind(this));}},_addCurrentSelectionToWatch:function()
+{var textSelection=this.textEditor.selection();if(textSelection&&!textSelection.isEmpty())
+this._innerAddToWatch(this.textEditor.copyRange(textSelection));},_innerAddToWatch:function(expression)
+{this._scriptsPanel.addToWatch(expression);},_evaluateSelectionInConsole:function()
+{var selection=this.textEditor.selection();if(!selection||selection.isEmpty())
+return false;this._evaluateInConsole(this.textEditor.copyRange(selection));return true;},_evaluateInConsole:function(expression)
+{WebInspector.console.evaluate(expression);},wasShown:function()
+{WebInspector.UISourceCodeFrame.prototype.wasShown.call(this);},willHide:function()
+{WebInspector.UISourceCodeFrame.prototype.willHide.call(this);this._popoverHelper.hidePopover();},onUISourceCodeContentChanged:function()
+{this._removeAllBreakpoints();WebInspector.UISourceCodeFrame.prototype.onUISourceCodeContentChanged.call(this);},populateLineGutterContextMenu:function(contextMenu,lineNumber)
+{contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Continue to here":"Continue to Here"),this._continueToLine.bind(this,lineNumber));var breakpoint=this._breakpointManager.findBreakpointOnLine(this._uiSourceCode,lineNumber);if(!breakpoint){contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add breakpoint":"Add Breakpoint"),this._setBreakpoint.bind(this,lineNumber,0,"",true));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add conditional breakpoint…":"Add Conditional Breakpoint…"),this._editBreakpointCondition.bind(this,lineNumber));}else{contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove breakpoint":"Remove Breakpoint"),breakpoint.remove.bind(breakpoint));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Edit breakpoint…":"Edit Breakpoint…"),this._editBreakpointCondition.bind(this,lineNumber,breakpoint));if(breakpoint.enabled())
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Disable breakpoint":"Disable Breakpoint"),breakpoint.setEnabled.bind(breakpoint,false));else
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Enable breakpoint":"Enable Breakpoint"),breakpoint.setEnabled.bind(breakpoint,true));}},populateTextAreaContextMenu:function(contextMenu,lineNumber)
+{var textSelection=this.textEditor.selection();if(textSelection&&!textSelection.isEmpty()){var selection=this.textEditor.copyRange(textSelection);var addToWatchLabel=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add to watch":"Add to Watch");contextMenu.appendItem(addToWatchLabel,this._innerAddToWatch.bind(this,selection));var evaluateLabel=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Evaluate in console":"Evaluate in Console");contextMenu.appendItem(evaluateLabel,this._evaluateInConsole.bind(this,selection));contextMenu.appendSeparator();}else if(!this._uiSourceCode.isEditable()&&this._uiSourceCode.contentType()===WebInspector.resourceTypes.Script){var liveEditLabel=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Live edit":"Live Edit");contextMenu.appendItem(liveEditLabel,liveEdit.bind(this));contextMenu.appendSeparator();}
+function liveEdit()
+{var liveEditUISourceCode=WebInspector.liveEditSupport.uiSourceCodeForLiveEdit(this._uiSourceCode);this._scriptsPanel.showUISourceCode(liveEditUISourceCode,lineNumber)}
+WebInspector.UISourceCodeFrame.prototype.populateTextAreaContextMenu.call(this,contextMenu,lineNumber);},_workingCopyChanged:function(event)
+{if(this._supportsEnabledBreakpointsWhileEditing()||this._scriptFile)
+return;if(this._uiSourceCode.isDirty())
+this._muteBreakpointsWhileEditing();else
+this._restoreBreakpointsAfterEditing();},_workingCopyCommitted:function(event)
+{if(this._supportsEnabledBreakpointsWhileEditing()||this._scriptFile)
+return;this._restoreBreakpointsAfterEditing();},_didMergeToVM:function()
+{if(this._supportsEnabledBreakpointsWhileEditing())
+return;this._restoreBreakpointsAfterEditing();},_didDivergeFromVM:function()
+{if(this._supportsEnabledBreakpointsWhileEditing())
+return;this._muteBreakpointsWhileEditing();},_muteBreakpointsWhileEditing:function()
+{if(this._muted)
+return;for(var lineNumber=0;lineNumber<this._textEditor.linesCount;++lineNumber){var breakpointDecoration=this._textEditor.getAttribute(lineNumber,"breakpoint");if(!breakpointDecoration)
+continue;this._removeBreakpointDecoration(lineNumber);this._addBreakpointDecoration(lineNumber,breakpointDecoration.columnNumber,breakpointDecoration.condition,breakpointDecoration.enabled,true);}
+this._muted=true;},_supportsEnabledBreakpointsWhileEditing:function()
+{return this._uiSourceCode.project().type()===WebInspector.projectTypes.Snippets;},_restoreBreakpointsAfterEditing:function()
+{delete this._muted;var breakpoints={};for(var lineNumber=0;lineNumber<this._textEditor.linesCount;++lineNumber){var breakpointDecoration=this._textEditor.getAttribute(lineNumber,"breakpoint");if(breakpointDecoration){breakpoints[lineNumber]=breakpointDecoration;this._removeBreakpointDecoration(lineNumber);}}
+this._removeAllBreakpoints();for(var lineNumberString in breakpoints){var lineNumber=parseInt(lineNumberString,10);if(isNaN(lineNumber))
+continue;var breakpointDecoration=breakpoints[lineNumberString];this._setBreakpoint(lineNumber,breakpointDecoration.columnNumber,breakpointDecoration.condition,breakpointDecoration.enabled);}},_removeAllBreakpoints:function()
+{var breakpoints=this._breakpointManager.breakpointsForUISourceCode(this._uiSourceCode);for(var i=0;i<breakpoints.length;++i)
+breakpoints[i].remove();},_getPopoverAnchor:function(element,event)
+{if(!WebInspector.debuggerModel.isPaused())
+return null;var textPosition=this.textEditor.coordinatesToCursorPosition(event.x,event.y);if(!textPosition)
+return null;var mouseLine=textPosition.startLine;var mouseColumn=textPosition.startColumn;var textSelection=this.textEditor.selection().normalize();if(textSelection&&!textSelection.isEmpty()){if(textSelection.startLine!==textSelection.endLine||textSelection.startLine!==mouseLine||mouseColumn<textSelection.startColumn||mouseColumn>textSelection.endColumn)
+return null;var leftCorner=this.textEditor.cursorPositionToCoordinates(textSelection.startLine,textSelection.startColumn);var rightCorner=this.textEditor.cursorPositionToCoordinates(textSelection.endLine,textSelection.endColumn);var anchorBox=new AnchorBox(leftCorner.x,leftCorner.y,rightCorner.x-leftCorner.x,leftCorner.height);anchorBox.highlight={lineNumber:textSelection.startLine,startColumn:textSelection.startColumn,endColumn:textSelection.endColumn-1};anchorBox.forSelection=true;return anchorBox;}
+var token=this.textEditor.tokenAtTextPosition(textPosition.startLine,textPosition.startColumn);if(!token)
+return null;var lineNumber=textPosition.startLine;var line=this.textEditor.line(lineNumber);var tokenContent=line.substring(token.startColumn,token.endColumn+1);var isIdentifier=token.type.startsWith("js-variable")||token.type.startsWith("js-property")||token.type=="js-def";if(!isIdentifier&&(token.type!=="js-keyword"||tokenContent!=="this"))
+return null;var leftCorner=this.textEditor.cursorPositionToCoordinates(lineNumber,token.startColumn);var rightCorner=this.textEditor.cursorPositionToCoordinates(lineNumber,token.endColumn+1);var anchorBox=new AnchorBox(leftCorner.x,leftCorner.y,rightCorner.x-leftCorner.x,leftCorner.height);anchorBox.highlight={lineNumber:lineNumber,startColumn:token.startColumn,endColumn:token.endColumn};return anchorBox;},_resolveObjectForPopover:function(anchorBox,showCallback,objectGroupName)
+{function showObjectPopover(result,wasThrown)
+{if(!WebInspector.debuggerModel.isPaused()||!result){this._popoverHelper.hidePopover();return;}
+this._popoverAnchorBox=anchorBox;showCallback(WebInspector.RemoteObject.fromPayload(result),wasThrown,this._popoverAnchorBox);if(this._popoverAnchorBox){var highlightRange=new WebInspector.TextRange(lineNumber,startHighlight,lineNumber,endHighlight);this._popoverAnchorBox._highlightDescriptor=this.textEditor.highlightRange(highlightRange,"source-frame-eval-expression");}}
+if(!WebInspector.debuggerModel.isPaused()){this._popoverHelper.hidePopover();return;}
+var lineNumber=anchorBox.highlight.lineNumber;var startHighlight=anchorBox.highlight.startColumn;var endHighlight=anchorBox.highlight.endColumn;var line=this.textEditor.line(lineNumber);if(!anchorBox.forSelection){while(startHighlight>1&&line.charAt(startHighlight-1)==='.'){var token=this.textEditor.tokenAtTextPosition(lineNumber,startHighlight-2);if(!token){this._popoverHelper.hidePopover();return;}
+startHighlight=token.startColumn;}}
+var evaluationText=line.substring(startHighlight,endHighlight+1);var selectedCallFrame=WebInspector.debuggerModel.selectedCallFrame();selectedCallFrame.evaluate(evaluationText,objectGroupName,false,true,false,false,showObjectPopover.bind(this));},_onHidePopover:function()
+{if(!this._popoverAnchorBox)
+return;if(this._popoverAnchorBox._highlightDescriptor)
+this.textEditor.removeHighlight(this._popoverAnchorBox._highlightDescriptor);delete this._popoverAnchorBox;},_addBreakpointDecoration:function(lineNumber,columnNumber,condition,enabled,mutedWhileEditing)
+{var breakpoint={condition:condition,enabled:enabled,columnNumber:columnNumber};this.textEditor.setAttribute(lineNumber,"breakpoint",breakpoint);var disabled=!enabled||mutedWhileEditing;this.textEditor.addBreakpoint(lineNumber,disabled,!!condition);},_removeBreakpointDecoration:function(lineNumber)
+{this.textEditor.removeAttribute(lineNumber,"breakpoint");this.textEditor.removeBreakpoint(lineNumber);},_onKeyDown:function(event)
+{if(event.keyIdentifier==="U+001B"){if(this._popoverHelper.isPopoverVisible()){this._popoverHelper.hidePopover();event.consume();}}},_editBreakpointCondition:function(lineNumber,breakpoint)
+{this._conditionElement=this._createConditionElement(lineNumber);this.textEditor.addDecoration(lineNumber,this._conditionElement);function finishEditing(committed,element,newText)
+{this.textEditor.removeDecoration(lineNumber,this._conditionElement);delete this._conditionEditorElement;delete this._conditionElement;if(!committed)
+return;if(breakpoint)
+breakpoint.setCondition(newText);else
+this._setBreakpoint(lineNumber,0,newText,true);}
+var config=new WebInspector.InplaceEditor.Config(finishEditing.bind(this,true),finishEditing.bind(this,false));WebInspector.InplaceEditor.startEditing(this._conditionEditorElement,config);this._conditionEditorElement.value=breakpoint?breakpoint.condition():"";this._conditionEditorElement.select();},_createConditionElement:function(lineNumber)
+{var conditionElement=document.createElement("div");conditionElement.className="source-frame-breakpoint-condition";var labelElement=document.createElement("label");labelElement.className="source-frame-breakpoint-message";labelElement.htmlFor="source-frame-breakpoint-condition";labelElement.appendChild(document.createTextNode(WebInspector.UIString("The breakpoint on line %d will stop only if this expression is true:",lineNumber)));conditionElement.appendChild(labelElement);var editorElement=document.createElement("input");editorElement.id="source-frame-breakpoint-condition";editorElement.className="monospace";editorElement.type="text";conditionElement.appendChild(editorElement);this._conditionEditorElement=editorElement;return conditionElement;},setExecutionLine:function(lineNumber)
+{this._executionLineNumber=lineNumber;if(this.loaded)
+this.textEditor.setExecutionLine(lineNumber);},clearExecutionLine:function()
+{if(this.loaded&&typeof this._executionLineNumber==="number")
+this.textEditor.clearExecutionLine();delete this._executionLineNumber;},_shouldIgnoreExternalBreakpointEvents:function()
+{if(this._supportsEnabledBreakpointsWhileEditing())
+return false;if(this._muted)
+return true;return this._scriptFile&&(this._scriptFile.isDivergingFromVM()||this._scriptFile.isMergingToVM());},_breakpointAdded:function(event)
+{var uiLocation=(event.data.uiLocation);if(uiLocation.uiSourceCode!==this._uiSourceCode)
+return;if(this._shouldIgnoreExternalBreakpointEvents())
+return;var breakpoint=(event.data.breakpoint);if(this.loaded)
+this._addBreakpointDecoration(uiLocation.lineNumber,uiLocation.columnNumber,breakpoint.condition(),breakpoint.enabled(),false);},_breakpointRemoved:function(event)
+{var uiLocation=(event.data.uiLocation);if(uiLocation.uiSourceCode!==this._uiSourceCode)
+return;if(this._shouldIgnoreExternalBreakpointEvents())
+return;var breakpoint=(event.data.breakpoint);var remainingBreakpoint=this._breakpointManager.findBreakpointOnLine(this._uiSourceCode,uiLocation.lineNumber);if(!remainingBreakpoint&&this.loaded)
+this._removeBreakpointDecoration(uiLocation.lineNumber);},_consoleMessageAdded:function(event)
+{var message=(event.data);if(this.loaded)
+this.addMessageToSource(message.lineNumber,message.originalMessage);},_consoleMessageRemoved:function(event)
+{var message=(event.data);if(this.loaded)
+this.removeMessageFromSource(message.lineNumber,message.originalMessage);},_consoleMessagesCleared:function(event)
+{this.clearMessages();},_onSourceMappingChanged:function(event)
+{this._updateScriptFile();},_updateScriptFile:function()
+{if(this._scriptFile){this._scriptFile.removeEventListener(WebInspector.ScriptFile.Events.DidMergeToVM,this._didMergeToVM,this);this._scriptFile.removeEventListener(WebInspector.ScriptFile.Events.DidDivergeFromVM,this._didDivergeFromVM,this);if(this._muted&&!this._uiSourceCode.isDirty())
+this._restoreBreakpointsAfterEditing();}
+this._scriptFile=this._uiSourceCode.scriptFile();if(this._scriptFile){this._scriptFile.addEventListener(WebInspector.ScriptFile.Events.DidMergeToVM,this._didMergeToVM,this);this._scriptFile.addEventListener(WebInspector.ScriptFile.Events.DidDivergeFromVM,this._didDivergeFromVM,this);if(this.loaded)
+this._scriptFile.checkMapping();}},onTextEditorContentLoaded:function()
+{if(typeof this._executionLineNumber==="number")
+this.setExecutionLine(this._executionLineNumber);var breakpointLocations=this._breakpointManager.breakpointLocationsForUISourceCode(this._uiSourceCode);for(var i=0;i<breakpointLocations.length;++i)
+this._breakpointAdded({data:breakpointLocations[i]});var messages=this._uiSourceCode.consoleMessages();for(var i=0;i<messages.length;++i){var message=messages[i];this.addMessageToSource(message.lineNumber,message.originalMessage);}
+if(this._scriptFile)
+this._scriptFile.checkMapping();},_handleGutterClick:function(event)
+{if(this._muted)
+return;var eventData=(event.data);var lineNumber=eventData.lineNumber;var eventObject=(eventData.event);if(eventObject.button!=0||eventObject.altKey||eventObject.ctrlKey||eventObject.metaKey)
+return;this._toggleBreakpoint(lineNumber,eventObject.shiftKey);eventObject.consume(true);},_toggleBreakpoint:function(lineNumber,onlyDisable)
+{var breakpoint=this._breakpointManager.findBreakpointOnLine(this._uiSourceCode,lineNumber);if(breakpoint){if(onlyDisable)
+breakpoint.setEnabled(!breakpoint.enabled());else
+breakpoint.remove();}else
+this._setBreakpoint(lineNumber,0,"",true);},toggleBreakpointOnCurrentLine:function()
+{if(this._muted)
+return;var selection=this.textEditor.selection();if(!selection)
+return;this._toggleBreakpoint(selection.startLine,false);},_setBreakpoint:function(lineNumber,columnNumber,condition,enabled)
+{this._breakpointManager.setBreakpoint(this._uiSourceCode,lineNumber,columnNumber,condition,enabled);WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.SetBreakpoint,url:this._uiSourceCode.originURL(),line:lineNumber,enabled:enabled});},_continueToLine:function(lineNumber)
+{var rawLocation=(this._uiSourceCode.uiLocationToRawLocation(lineNumber,0));this._scriptsPanel.continueToLocation(rawLocation);},dispose:function()
+{this._breakpointManager.removeEventListener(WebInspector.BreakpointManager.Events.BreakpointAdded,this._breakpointAdded,this);this._breakpointManager.removeEventListener(WebInspector.BreakpointManager.Events.BreakpointRemoved,this._breakpointRemoved,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.ConsoleMessageAdded,this._consoleMessageAdded,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.ConsoleMessageRemoved,this._consoleMessageRemoved,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.ConsoleMessagesCleared,this._consoleMessagesCleared,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged,this._onSourceMappingChanged,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);WebInspector.UISourceCodeFrame.prototype.dispose.call(this);},__proto__:WebInspector.UISourceCodeFrame.prototype};WebInspector.CSSSourceFrame=function(uiSourceCode)
+{WebInspector.UISourceCodeFrame.call(this,uiSourceCode);this._registerShortcuts();}
+WebInspector.CSSSourceFrame.prototype={_registerShortcuts:function()
+{var shortcutKeys=WebInspector.ShortcutsScreen.SourcesPanelShortcuts;for(var i=0;i<shortcutKeys.IncreaseCSSUnitByOne.length;++i)
+this.addShortcut(shortcutKeys.IncreaseCSSUnitByOne[i].key,this._handleUnitModification.bind(this,1));for(var i=0;i<shortcutKeys.DecreaseCSSUnitByOne.length;++i)
+this.addShortcut(shortcutKeys.DecreaseCSSUnitByOne[i].key,this._handleUnitModification.bind(this,-1));for(var i=0;i<shortcutKeys.IncreaseCSSUnitByTen.length;++i)
+this.addShortcut(shortcutKeys.IncreaseCSSUnitByTen[i].key,this._handleUnitModification.bind(this,10));for(var i=0;i<shortcutKeys.DecreaseCSSUnitByTen.length;++i)
+this.addShortcut(shortcutKeys.DecreaseCSSUnitByTen[i].key,this._handleUnitModification.bind(this,-10));},_modifyUnit:function(unit,change)
+{var unitValue=parseInt(unit,10);if(isNaN(unitValue))
+return null;var tail=unit.substring((unitValue).toString().length);return String.sprintf("%d%s",unitValue+change,tail);},_handleUnitModification:function(change)
+{var selection=this.textEditor.selection().normalize();var token=this.textEditor.tokenAtTextPosition(selection.startLine,selection.startColumn);if(!token){if(selection.startColumn>0)
+token=this.textEditor.tokenAtTextPosition(selection.startLine,selection.startColumn-1);if(!token)
+return false;}
+if(token.type!=="css-number")
+return false;var cssUnitRange=new WebInspector.TextRange(selection.startLine,token.startColumn,selection.startLine,token.endColumn+1);var cssUnitText=this.textEditor.copyRange(cssUnitRange);var newUnitText=this._modifyUnit(cssUnitText,change);if(!newUnitText)
+return false;this.textEditor.editRange(cssUnitRange,newUnitText);selection.startColumn=token.startColumn;selection.endColumn=selection.startColumn+newUnitText.length;this.textEditor.setSelection(selection);return true;},__proto__:WebInspector.UISourceCodeFrame.prototype};WebInspector.NavigatorView=function()
+{WebInspector.VBox.call(this);this.registerRequiredCSS("navigatorView.css");var scriptsTreeElement=document.createElement("ol");this._scriptsTree=new WebInspector.NavigatorTreeOutline(scriptsTreeElement);var scriptsOutlineElement=document.createElement("div");scriptsOutlineElement.classList.add("outline-disclosure");scriptsOutlineElement.classList.add("navigator");scriptsOutlineElement.appendChild(scriptsTreeElement);this.element.classList.add("navigator-container");this.element.appendChild(scriptsOutlineElement);this.setDefaultFocusedElement(this._scriptsTree.element);this._uiSourceCodeNodes=new Map();this._subfolderNodes=new Map();this._rootNode=new WebInspector.NavigatorRootTreeNode(this);this._rootNode.populate();this.element.addEventListener("contextmenu",this.handleContextMenu.bind(this),false);}
+WebInspector.NavigatorView.Events={ItemSelected:"ItemSelected",ItemRenamed:"ItemRenamed",}
+WebInspector.NavigatorView.iconClassForType=function(type)
+{if(type===WebInspector.NavigatorTreeOutline.Types.Domain)
+return"navigator-domain-tree-item";if(type===WebInspector.NavigatorTreeOutline.Types.FileSystem)
+return"navigator-folder-tree-item";return"navigator-folder-tree-item";}
+WebInspector.NavigatorView.prototype={setWorkspace:function(workspace)
+{this._workspace=workspace;this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillReset,this._projectWillReset.bind(this),this);},wasShown:function()
+{if(this._loaded)
+return;this._loaded=true;this._workspace.uiSourceCodes().forEach(this._addUISourceCode.bind(this));},accept:function(uiSourceCode)
+{return!uiSourceCode.project().isServiceProject();},_addUISourceCode:function(uiSourceCode)
+{if(!this.accept(uiSourceCode))
+return;var projectNode=this._projectNode(uiSourceCode.project());var folderNode=this._folderNode(projectNode,uiSourceCode.parentPath());var uiSourceCodeNode=new WebInspector.NavigatorUISourceCodeTreeNode(this,uiSourceCode);this._uiSourceCodeNodes.put(uiSourceCode,uiSourceCodeNode);folderNode.appendChild(uiSourceCodeNode);},_uiSourceCodeAdded:function(event)
+{var uiSourceCode=(event.data);this._addUISourceCode(uiSourceCode);},_uiSourceCodeRemoved:function(event)
+{var uiSourceCode=(event.data);this._removeUISourceCode(uiSourceCode);},_projectWillReset:function(event)
+{var project=(event.data);var uiSourceCodes=project.uiSourceCodes();for(var i=0;i<uiSourceCodes.length;++i)
+this._removeUISourceCode(uiSourceCodes[i]);},_projectNode:function(project)
+{if(!project.displayName())
+return this._rootNode;var projectNode=this._rootNode.child(project.id());if(!projectNode){var type=project.type()===WebInspector.projectTypes.FileSystem?WebInspector.NavigatorTreeOutline.Types.FileSystem:WebInspector.NavigatorTreeOutline.Types.Domain;projectNode=new WebInspector.NavigatorFolderTreeNode(this,project,project.id(),type,"",project.displayName());this._rootNode.appendChild(projectNode);}
+return projectNode;},_folderNode:function(projectNode,folderPath)
+{if(!folderPath)
+return projectNode;var subfolderNodes=this._subfolderNodes.get(projectNode);if(!subfolderNodes){subfolderNodes=(new StringMap());this._subfolderNodes.put(projectNode,subfolderNodes);}
+var folderNode=subfolderNodes.get(folderPath);if(folderNode)
+return folderNode;var parentNode=projectNode;var index=folderPath.lastIndexOf("/");if(index!==-1)
+parentNode=this._folderNode(projectNode,folderPath.substring(0,index));var name=folderPath.substring(index+1);folderNode=new WebInspector.NavigatorFolderTreeNode(this,null,name,WebInspector.NavigatorTreeOutline.Types.Folder,folderPath,name);subfolderNodes.put(folderPath,folderNode);parentNode.appendChild(folderNode);return folderNode;},revealUISourceCode:function(uiSourceCode,select)
+{var node=this._uiSourceCodeNodes.get(uiSourceCode);if(!node)
+return;if(this._scriptsTree.selectedTreeElement)
+this._scriptsTree.selectedTreeElement.deselect();this._lastSelectedUISourceCode=uiSourceCode;node.reveal(select);},_sourceSelected:function(uiSourceCode,focusSource)
+{this._lastSelectedUISourceCode=uiSourceCode;var data={uiSourceCode:uiSourceCode,focusSource:focusSource};this.dispatchEventToListeners(WebInspector.NavigatorView.Events.ItemSelected,data);},sourceDeleted:function(uiSourceCode)
+{},_removeUISourceCode:function(uiSourceCode)
+{var node=this._uiSourceCodeNodes.get(uiSourceCode);if(!node)
+return;var projectNode=this._projectNode(uiSourceCode.project());var subfolderNodes=this._subfolderNodes.get(projectNode);var parentNode=node.parent;this._uiSourceCodeNodes.remove(uiSourceCode);parentNode.removeChild(node);node=parentNode;while(node){parentNode=node.parent;if(!parentNode||!node.isEmpty())
+break;if(subfolderNodes)
+subfolderNodes.remove(node._folderPath);parentNode.removeChild(node);node=parentNode;}},_updateIcon:function(uiSourceCode)
+{var node=this._uiSourceCodeNodes.get(uiSourceCode);node.updateIcon();},reset:function()
+{var nodes=this._uiSourceCodeNodes.values();for(var i=0;i<nodes.length;++i)
+nodes[i].dispose();this._scriptsTree.removeChildren();this._uiSourceCodeNodes.clear();this._subfolderNodes.clear();this._rootNode.reset();},handleContextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);this._appendAddFolderItem(contextMenu);contextMenu.show();},_appendAddFolderItem:function(contextMenu)
+{function addFolder()
+{WebInspector.isolatedFileSystemManager.addFileSystem();}
+var addFolderLabel=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add folder to workspace":"Add Folder to Workspace");contextMenu.appendItem(addFolderLabel,addFolder);},_handleContextMenuRefresh:function(project,path)
+{project.refresh(path);},_handleContextMenuCreate:function(project,path,uiSourceCode)
+{this.create(project,path,uiSourceCode);},_handleContextMenuExclude:function(project,path)
+{var shouldExclude=window.confirm(WebInspector.UIString("Are you sure you want to exclude this folder?"));if(shouldExclude){WebInspector.startBatchUpdate();project.excludeFolder(path);WebInspector.endBatchUpdate();}},_handleContextMenuDelete:function(uiSourceCode)
+{var shouldDelete=window.confirm(WebInspector.UIString("Are you sure you want to delete this file?"));if(shouldDelete)
+uiSourceCode.project().deleteFile(uiSourceCode.path());},handleFileContextMenu:function(event,uiSourceCode)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendApplicableItems(uiSourceCode);contextMenu.appendSeparator();var project=uiSourceCode.project();var path=uiSourceCode.parentPath();contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Refresh parent":"Refresh Parent"),this._handleContextMenuRefresh.bind(this,project,path));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Duplicate file":"Duplicate File"),this._handleContextMenuCreate.bind(this,project,path,uiSourceCode));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Exclude parent folder":"Exclude Parent Folder"),this._handleContextMenuExclude.bind(this,project,path));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Delete file":"Delete File"),this._handleContextMenuDelete.bind(this,uiSourceCode));contextMenu.appendSeparator();this._appendAddFolderItem(contextMenu);contextMenu.show();},handleFolderContextMenu:function(event,node)
+{var contextMenu=new WebInspector.ContextMenu(event);var path="/";var projectNode=node;while(projectNode.parent!==this._rootNode){path="/"+projectNode.id+path;projectNode=projectNode.parent;}
+var project=projectNode._project;if(project.type()===WebInspector.projectTypes.FileSystem){contextMenu.appendItem(WebInspector.UIString("Refresh"),this._handleContextMenuRefresh.bind(this,project,path));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"New file":"New File"),this._handleContextMenuCreate.bind(this,project,path));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Exclude folder":"Exclude Folder"),this._handleContextMenuExclude.bind(this,project,path));}
+contextMenu.appendSeparator();this._appendAddFolderItem(contextMenu);function removeFolder()
+{var shouldRemove=window.confirm(WebInspector.UIString("Are you sure you want to remove this folder?"));if(shouldRemove)
+project.remove();}
+if(project.type()===WebInspector.projectTypes.FileSystem&&node===projectNode){var removeFolderLabel=WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove folder from workspace":"Remove Folder from Workspace");contextMenu.appendItem(removeFolderLabel,removeFolder);}
+contextMenu.show();},rename:function(uiSourceCode,deleteIfCanceled)
+{var node=this._uiSourceCodeNodes.get(uiSourceCode);console.assert(node);node.rename(callback.bind(this));function callback(committed)
+{if(!committed){if(deleteIfCanceled)
+uiSourceCode.remove();return;}
+var data={uiSourceCode:uiSourceCode};this.dispatchEventToListeners(WebInspector.NavigatorView.Events.ItemRenamed,data);this._updateIcon(uiSourceCode);this._sourceSelected(uiSourceCode,true)}},create:function(project,path,uiSourceCodeToCopy)
+{var filePath;var uiSourceCode;function contentLoaded(content)
+{createFile.call(this,content||"");}
+if(uiSourceCodeToCopy)
+uiSourceCodeToCopy.requestContent(contentLoaded.bind(this));else
+createFile.call(this);function createFile(content)
+{project.createFile(path,null,content||"",fileCreated.bind(this));}
+function fileCreated(path)
+{if(!path)
+return;filePath=path;uiSourceCode=project.uiSourceCode(filePath);if(!uiSourceCode){console.assert(uiSourceCode)
+return;}
+this._sourceSelected(uiSourceCode,false);this.rename(uiSourceCode,true);}},__proto__:WebInspector.VBox.prototype}
+WebInspector.SourcesNavigatorView=function()
+{WebInspector.NavigatorView.call(this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged,this._inspectedURLChanged,this);}
+WebInspector.SourcesNavigatorView.prototype={accept:function(uiSourceCode)
+{if(!WebInspector.NavigatorView.prototype.accept(uiSourceCode))
+return false;return!uiSourceCode.isContentScript&&uiSourceCode.project().type()!==WebInspector.projectTypes.Snippets;},_inspectedURLChanged:function(event)
+{var nodes=this._uiSourceCodeNodes.values();for(var i=0;i<nodes.length;++i){var uiSourceCode=nodes[i].uiSourceCode();if(uiSourceCode.url===WebInspector.resourceTreeModel.inspectedPageURL())
+this.revealUISourceCode(uiSourceCode,true);}},_addUISourceCode:function(uiSourceCode)
+{WebInspector.NavigatorView.prototype._addUISourceCode.call(this,uiSourceCode);if(uiSourceCode.url===WebInspector.resourceTreeModel.inspectedPageURL())
+this.revealUISourceCode(uiSourceCode,true);},__proto__:WebInspector.NavigatorView.prototype}
+WebInspector.ContentScriptsNavigatorView=function()
+{WebInspector.NavigatorView.call(this);}
+WebInspector.ContentScriptsNavigatorView.prototype={accept:function(uiSourceCode)
+{if(!WebInspector.NavigatorView.prototype.accept(uiSourceCode))
+return false;return uiSourceCode.isContentScript;},__proto__:WebInspector.NavigatorView.prototype}
+WebInspector.NavigatorTreeOutline=function(element)
+{TreeOutline.call(this,element);this.element=element;this.comparator=WebInspector.NavigatorTreeOutline._treeElementsCompare;}
+WebInspector.NavigatorTreeOutline.Types={Root:"Root",Domain:"Domain",Folder:"Folder",UISourceCode:"UISourceCode",FileSystem:"FileSystem"}
+WebInspector.NavigatorTreeOutline._treeElementsCompare=function compare(treeElement1,treeElement2)
+{function typeWeight(treeElement)
+{var type=treeElement.type();if(type===WebInspector.NavigatorTreeOutline.Types.Domain){if(treeElement.titleText===WebInspector.resourceTreeModel.inspectedPageDomain())
+return 1;return 2;}
+if(type===WebInspector.NavigatorTreeOutline.Types.FileSystem)
+return 3;if(type===WebInspector.NavigatorTreeOutline.Types.Folder)
+return 4;return 5;}
+var typeWeight1=typeWeight(treeElement1);var typeWeight2=typeWeight(treeElement2);var result;if(typeWeight1>typeWeight2)
+result=1;else if(typeWeight1<typeWeight2)
+result=-1;else{var title1=treeElement1.titleText;var title2=treeElement2.titleText;result=title1.compareTo(title2);}
+return result;}
+WebInspector.NavigatorTreeOutline.prototype={scriptTreeElements:function()
+{var result=[];if(this.children.length){for(var treeElement=this.children[0];treeElement;treeElement=treeElement.traverseNextTreeElement(false,this,true)){if(treeElement instanceof WebInspector.NavigatorSourceTreeElement)
+result.push(treeElement.uiSourceCode);}}
+return result;},__proto__:TreeOutline.prototype}
+WebInspector.BaseNavigatorTreeElement=function(type,title,iconClasses,hasChildren,noIcon)
+{this._type=type;TreeElement.call(this,"",null,hasChildren);this._titleText=title;this._iconClasses=iconClasses;this._noIcon=noIcon;}
+WebInspector.BaseNavigatorTreeElement.prototype={onattach:function()
+{this.listItemElement.removeChildren();if(this._iconClasses){for(var i=0;i<this._iconClasses.length;++i)
+this.listItemElement.classList.add(this._iconClasses[i]);}
+var selectionElement=document.createElement("div");selectionElement.className="selection";this.listItemElement.appendChild(selectionElement);if(!this._noIcon){this.imageElement=document.createElement("img");this.imageElement.className="icon";this.listItemElement.appendChild(this.imageElement);}
+this.titleElement=document.createElement("div");this.titleElement.className="base-navigator-tree-element-title";this._titleTextNode=document.createTextNode("");this._titleTextNode.textContent=this._titleText;this.titleElement.appendChild(this._titleTextNode);this.listItemElement.appendChild(this.titleElement);},updateIconClasses:function(iconClasses)
+{for(var i=0;i<this._iconClasses.length;++i)
+this.listItemElement.classList.remove(this._iconClasses[i]);this._iconClasses=iconClasses;for(var i=0;i<this._iconClasses.length;++i)
+this.listItemElement.classList.add(this._iconClasses[i]);},onreveal:function()
+{if(this.listItemElement)
+this.listItemElement.scrollIntoViewIfNeeded(true);},get titleText()
+{return this._titleText;},set titleText(titleText)
+{if(this._titleText===titleText)
+return;this._titleText=titleText||"";if(this.titleElement)
+this.titleElement.textContent=this._titleText;},type:function()
+{return this._type;},__proto__:TreeElement.prototype}
+WebInspector.NavigatorFolderTreeElement=function(navigatorView,type,title)
+{var iconClass=WebInspector.NavigatorView.iconClassForType(type);WebInspector.BaseNavigatorTreeElement.call(this,type,title,[iconClass],true);this._navigatorView=navigatorView;}
+WebInspector.NavigatorFolderTreeElement.prototype={onpopulate:function()
+{this._node.populate();},onattach:function()
+{WebInspector.BaseNavigatorTreeElement.prototype.onattach.call(this);this.collapse();this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),false);},setNode:function(node)
+{this._node=node;var paths=[];while(node&&!node.isRoot()){paths.push(node._title);node=node.parent;}
+paths.reverse();this.tooltip=paths.join("/");},_handleContextMenuEvent:function(event)
+{if(!this._node)
+return;this.select();this._navigatorView.handleFolderContextMenu((event),this._node);},__proto__:WebInspector.BaseNavigatorTreeElement.prototype}
+WebInspector.NavigatorSourceTreeElement=function(navigatorView,uiSourceCode,title)
+{this._navigatorView=navigatorView;this._uiSourceCode=uiSourceCode;WebInspector.BaseNavigatorTreeElement.call(this,WebInspector.NavigatorTreeOutline.Types.UISourceCode,title,this._calculateIconClasses(),false);this.tooltip=uiSourceCode.originURL();}
+WebInspector.NavigatorSourceTreeElement.prototype={get uiSourceCode()
+{return this._uiSourceCode;},_calculateIconClasses:function()
+{return["navigator-"+this._uiSourceCode.contentType().name()+"-tree-item"];},updateIcon:function()
+{this.updateIconClasses(this._calculateIconClasses());},onattach:function()
+{WebInspector.BaseNavigatorTreeElement.prototype.onattach.call(this);this.listItemElement.draggable=true;this.listItemElement.addEventListener("click",this._onclick.bind(this),false);this.listItemElement.addEventListener("contextmenu",this._handleContextMenuEvent.bind(this),false);this.listItemElement.addEventListener("mousedown",this._onmousedown.bind(this),false);this.listItemElement.addEventListener("dragstart",this._ondragstart.bind(this),false);},_onmousedown:function(event)
+{if(event.which===1)
+this._uiSourceCode.requestContent(callback.bind(this));function callback(content)
+{this._warmedUpContent=content;}},_shouldRenameOnMouseDown:function()
+{if(!this._uiSourceCode.canRename())
+return false;var isSelected=this===this.treeOutline.selectedTreeElement;var isFocused=this.treeOutline.childrenListElement.isSelfOrAncestor(document.activeElement);return isSelected&&isFocused&&!WebInspector.isBeingEdited(this.treeOutline.element);},selectOnMouseDown:function(event)
+{if(event.which!==1||!this._shouldRenameOnMouseDown()){TreeElement.prototype.selectOnMouseDown.call(this,event);return;}
+setTimeout(rename.bind(this),300);function rename()
+{if(this._shouldRenameOnMouseDown())
+this._navigatorView.rename(this.uiSourceCode,false);}},_ondragstart:function(event)
+{event.dataTransfer.setData("text/plain",this._warmedUpContent);event.dataTransfer.effectAllowed="copy";return true;},onspace:function()
+{this._navigatorView._sourceSelected(this.uiSourceCode,true);return true;},_onclick:function(event)
+{this._navigatorView._sourceSelected(this.uiSourceCode,false);},ondblclick:function(event)
+{var middleClick=event.button===1;this._navigatorView._sourceSelected(this.uiSourceCode,!middleClick);return false;},onenter:function()
+{this._navigatorView._sourceSelected(this.uiSourceCode,true);return true;},ondelete:function()
+{this._navigatorView.sourceDeleted(this.uiSourceCode);return true;},_handleContextMenuEvent:function(event)
+{this.select();this._navigatorView.handleFileContextMenu(event,this._uiSourceCode);},__proto__:WebInspector.BaseNavigatorTreeElement.prototype}
+WebInspector.NavigatorTreeNode=function(id)
+{this.id=id;this._children=new StringMap();}
+WebInspector.NavigatorTreeNode.prototype={treeElement:function(){throw"Not implemented";},dispose:function(){},isRoot:function()
+{return false;},hasChildren:function()
+{return true;},populate:function()
+{if(this.isPopulated())
+return;if(this.parent)
+this.parent.populate();this._populated=true;this.wasPopulated();},wasPopulated:function()
+{var children=this.children();for(var i=0;i<children.length;++i)
+this.treeElement().appendChild(children[i].treeElement());},didAddChild:function(node)
+{if(this.isPopulated())
+this.treeElement().appendChild(node.treeElement());},willRemoveChild:function(node)
+{if(this.isPopulated())
+this.treeElement().removeChild(node.treeElement());},isPopulated:function()
+{return this._populated;},isEmpty:function()
+{return!this._children.size();},child:function(id)
+{return this._children.get(id)||null;},children:function()
+{return this._children.values();},appendChild:function(node)
+{this._children.put(node.id,node);node.parent=this;this.didAddChild(node);},removeChild:function(node)
+{this.willRemoveChild(node);this._children.remove(node.id);delete node.parent;node.dispose();},reset:function()
+{this._children.clear();}}
+WebInspector.NavigatorRootTreeNode=function(navigatorView)
+{WebInspector.NavigatorTreeNode.call(this,"");this._navigatorView=navigatorView;}
+WebInspector.NavigatorRootTreeNode.prototype={isRoot:function()
+{return true;},treeElement:function()
+{return this._navigatorView._scriptsTree;},__proto__:WebInspector.NavigatorTreeNode.prototype}
+WebInspector.NavigatorUISourceCodeTreeNode=function(navigatorView,uiSourceCode)
+{WebInspector.NavigatorTreeNode.call(this,uiSourceCode.name());this._navigatorView=navigatorView;this._uiSourceCode=uiSourceCode;this._treeElement=null;}
+WebInspector.NavigatorUISourceCodeTreeNode.prototype={uiSourceCode:function()
+{return this._uiSourceCode;},updateIcon:function()
+{if(this._treeElement)
+this._treeElement.updateIcon();},treeElement:function()
+{if(this._treeElement)
+return this._treeElement;this._treeElement=new WebInspector.NavigatorSourceTreeElement(this._navigatorView,this._uiSourceCode,"");this.updateTitle();this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.TitleChanged,this._titleChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);return this._treeElement;},updateTitle:function(ignoreIsDirty)
+{if(!this._treeElement)
+return;var titleText=this._uiSourceCode.displayName();if(!ignoreIsDirty&&(this._uiSourceCode.isDirty()||this._uiSourceCode.hasUnsavedCommittedChanges()))
+titleText="*"+titleText;this._treeElement.titleText=titleText;},hasChildren:function()
+{return false;},dispose:function()
+{if(!this._treeElement)
+return;this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.TitleChanged,this._titleChanged,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._workingCopyChanged,this);this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._workingCopyCommitted,this);},_titleChanged:function(event)
+{this.updateTitle();},_workingCopyChanged:function(event)
+{this.updateTitle();},_workingCopyCommitted:function(event)
+{this.updateTitle();},reveal:function(select)
+{this.parent.populate();this.parent.treeElement().expand();this._treeElement.reveal();if(select)
+this._treeElement.select(true);},rename:function(callback)
+{if(!this._treeElement)
+return;var treeOutlineElement=this._treeElement.treeOutline.element;WebInspector.markBeingEdited(treeOutlineElement,true);function commitHandler(element,newTitle,oldTitle)
+{if(newTitle!==oldTitle){this._treeElement.titleText=newTitle;this._uiSourceCode.rename(newTitle,renameCallback.bind(this));return;}
+afterEditing.call(this,true);}
+function renameCallback(success)
+{if(!success){WebInspector.markBeingEdited(treeOutlineElement,false);this.updateTitle();this.rename(callback);return;}
+afterEditing.call(this,true);}
+function cancelHandler()
+{afterEditing.call(this,false);}
+function afterEditing(committed)
+{WebInspector.markBeingEdited(treeOutlineElement,false);this.updateTitle();this._treeElement.treeOutline.childrenListElement.focus();if(callback)
+callback(committed);}
+var editingConfig=new WebInspector.InplaceEditor.Config(commitHandler.bind(this),cancelHandler.bind(this));this.updateTitle(true);WebInspector.InplaceEditor.startEditing(this._treeElement.titleElement,editingConfig);window.getSelection().setBaseAndExtent(this._treeElement.titleElement,0,this._treeElement.titleElement,1);},__proto__:WebInspector.NavigatorTreeNode.prototype}
+WebInspector.NavigatorFolderTreeNode=function(navigatorView,project,id,type,folderPath,title)
+{WebInspector.NavigatorTreeNode.call(this,id);this._navigatorView=navigatorView;this._project=project;this._type=type;this._folderPath=folderPath;this._title=title;}
+WebInspector.NavigatorFolderTreeNode.prototype={treeElement:function()
+{if(this._treeElement)
+return this._treeElement;this._treeElement=this._createTreeElement(this._title,this);return this._treeElement;},_createTreeElement:function(title,node)
+{var treeElement=new WebInspector.NavigatorFolderTreeElement(this._navigatorView,this._type,title);treeElement.setNode(node);return treeElement;},wasPopulated:function()
+{if(!this._treeElement||this._treeElement._node!==this)
+return;this._addChildrenRecursive();},_addChildrenRecursive:function()
+{var children=this.children();for(var i=0;i<children.length;++i){var child=children[i];this.didAddChild(child);if(child instanceof WebInspector.NavigatorFolderTreeNode)
+child._addChildrenRecursive();}},_shouldMerge:function(node)
+{return this._type!==WebInspector.NavigatorTreeOutline.Types.Domain&&node instanceof WebInspector.NavigatorFolderTreeNode;},didAddChild:function(node)
+{function titleForNode(node)
+{return node._title;}
+if(!this._treeElement)
+return;var children=this.children();if(children.length===1&&this._shouldMerge(node)){node._isMerged=true;this._treeElement.titleText=this._treeElement.titleText+"/"+node._title;node._treeElement=this._treeElement;this._treeElement.setNode(node);return;}
+var oldNode;if(children.length===2)
+oldNode=children[0]!==node?children[0]:children[1];if(oldNode&&oldNode._isMerged){delete oldNode._isMerged;var mergedToNodes=[];mergedToNodes.push(this);var treeNode=this;while(treeNode._isMerged){treeNode=treeNode.parent;mergedToNodes.push(treeNode);}
+mergedToNodes.reverse();var titleText=mergedToNodes.map(titleForNode).join("/");var nodes=[];treeNode=oldNode;do{nodes.push(treeNode);children=treeNode.children();treeNode=children.length===1?children[0]:null;}while(treeNode&&treeNode._isMerged);if(!this.isPopulated()){this._treeElement.titleText=titleText;this._treeElement.setNode(this);for(var i=0;i<nodes.length;++i){delete nodes[i]._treeElement;delete nodes[i]._isMerged;}
+return;}
+var oldTreeElement=this._treeElement;var treeElement=this._createTreeElement(titleText,this);for(var i=0;i<mergedToNodes.length;++i)
+mergedToNodes[i]._treeElement=treeElement;oldTreeElement.parent.appendChild(treeElement);oldTreeElement.setNode(nodes[nodes.length-1]);oldTreeElement.titleText=nodes.map(titleForNode).join("/");oldTreeElement.parent.removeChild(oldTreeElement);this._treeElement.appendChild(oldTreeElement);if(oldTreeElement.expanded)
+treeElement.expand();}
+if(this.isPopulated())
+this._treeElement.appendChild(node.treeElement());},willRemoveChild:function(node)
+{if(node._isMerged||!this.isPopulated())
+return;this._treeElement.removeChild(node._treeElement);},__proto__:WebInspector.NavigatorTreeNode.prototype};WebInspector.RevisionHistoryView=function()
+{WebInspector.VBox.call(this);this.registerRequiredCSS("revisionHistory.css");this.element.classList.add("revision-history-drawer");this.element.classList.add("outline-disclosure");this._uiSourceCodeItems=new Map();var olElement=this.element.createChild("ol");this._treeOutline=new TreeOutline(olElement);function populateRevisions(uiSourceCode)
+{if(uiSourceCode.history.length)
+this._createUISourceCodeItem(uiSourceCode);}
+WebInspector.workspace.uiSourceCodes().forEach(populateRevisions.bind(this));WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted,this._revisionAdded,this);WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillReset,this._projectWillReset,this);}
+WebInspector.RevisionHistoryView.showHistory=function(uiSourceCode)
+{if(!WebInspector.RevisionHistoryView._view)
+WebInspector.RevisionHistoryView._view=new WebInspector.RevisionHistoryView();var view=WebInspector.RevisionHistoryView._view;WebInspector.inspectorView.showCloseableViewInDrawer("history",WebInspector.UIString("History"),view);view._revealUISourceCode(uiSourceCode);}
+WebInspector.RevisionHistoryView.prototype={_createUISourceCodeItem:function(uiSourceCode)
+{var uiSourceCodeItem=new TreeElement(uiSourceCode.displayName(),null,true);uiSourceCodeItem.selectable=false;for(var i=0;i<this._treeOutline.children.length;++i){if(this._treeOutline.children[i].title.localeCompare(uiSourceCode.displayName())>0){this._treeOutline.insertChild(uiSourceCodeItem,i);break;}}
+if(i===this._treeOutline.children.length)
+this._treeOutline.appendChild(uiSourceCodeItem);this._uiSourceCodeItems.put(uiSourceCode,uiSourceCodeItem);var revisionCount=uiSourceCode.history.length;for(var i=revisionCount-1;i>=0;--i){var revision=uiSourceCode.history[i];var historyItem=new WebInspector.RevisionHistoryTreeElement(revision,uiSourceCode.history[i-1],i!==revisionCount-1);uiSourceCodeItem.appendChild(historyItem);}
+var linkItem=new TreeElement("",null,false);linkItem.selectable=false;uiSourceCodeItem.appendChild(linkItem);var revertToOriginal=linkItem.listItemElement.createChild("span","revision-history-link revision-history-link-row");revertToOriginal.textContent=WebInspector.UIString("apply original content");revertToOriginal.addEventListener("click",uiSourceCode.revertToOriginal.bind(uiSourceCode));var clearHistoryElement=uiSourceCodeItem.listItemElement.createChild("span","revision-history-link");clearHistoryElement.textContent=WebInspector.UIString("revert");clearHistoryElement.addEventListener("click",this._clearHistory.bind(this,uiSourceCode));return uiSourceCodeItem;},_clearHistory:function(uiSourceCode)
+{uiSourceCode.revertAndClearHistory(this._removeUISourceCode.bind(this));},_revisionAdded:function(event)
+{var uiSourceCode=(event.data.uiSourceCode);var uiSourceCodeItem=this._uiSourceCodeItems.get(uiSourceCode);if(!uiSourceCodeItem){uiSourceCodeItem=this._createUISourceCodeItem(uiSourceCode);return;}
+var historyLength=uiSourceCode.history.length;var historyItem=new WebInspector.RevisionHistoryTreeElement(uiSourceCode.history[historyLength-1],uiSourceCode.history[historyLength-2],false);if(uiSourceCodeItem.children.length)
+uiSourceCodeItem.children[0].allowRevert();uiSourceCodeItem.insertChild(historyItem,0);},_revealUISourceCode:function(uiSourceCode)
+{var uiSourceCodeItem=this._uiSourceCodeItems.get(uiSourceCode);if(uiSourceCodeItem){uiSourceCodeItem.reveal();uiSourceCodeItem.expand();}},_uiSourceCodeRemoved:function(event)
+{var uiSourceCode=(event.data);this._removeUISourceCode(uiSourceCode);},_removeUISourceCode:function(uiSourceCode)
+{var uiSourceCodeItem=this._uiSourceCodeItems.get(uiSourceCode);if(!uiSourceCodeItem)
+return;this._treeOutline.removeChild(uiSourceCodeItem);this._uiSourceCodeItems.remove(uiSourceCode);},_projectWillReset:function(event)
+{var project=event.data;project.uiSourceCodes().forEach(this._removeUISourceCode.bind(this));},__proto__:WebInspector.VBox.prototype}
+WebInspector.RevisionHistoryTreeElement=function(revision,baseRevision,allowRevert)
+{TreeElement.call(this,revision.timestamp.toLocaleTimeString(),null,true);this.selectable=false;this._revision=revision;this._baseRevision=baseRevision;this._revertElement=document.createElement("span");this._revertElement.className="revision-history-link";this._revertElement.textContent=WebInspector.UIString("apply revision content");this._revertElement.addEventListener("click",this._revision.revertToThis.bind(this._revision),false);if(!allowRevert)
+this._revertElement.classList.add("hidden");}
+WebInspector.RevisionHistoryTreeElement.prototype={onattach:function()
+{this.listItemElement.classList.add("revision-history-revision");},onexpand:function()
+{this.listItemElement.appendChild(this._revertElement);if(this._wasExpandedOnce)
+return;this._wasExpandedOnce=true;this.childrenListElement.classList.add("source-code");if(this._baseRevision)
+this._baseRevision.requestContent(step1.bind(this));else
+this._revision.uiSourceCode.requestOriginalContent(step1.bind(this));function step1(baseContent)
+{this._revision.requestContent(step2.bind(this,baseContent));}
+function step2(baseContent,newContent)
+{var baseLines=difflib.stringAsLines(baseContent);var newLines=difflib.stringAsLines(newContent);var sm=new difflib.SequenceMatcher(baseLines,newLines);var opcodes=sm.get_opcodes();var lastWasSeparator=false;for(var idx=0;idx<opcodes.length;idx++){var code=opcodes[idx];var change=code[0];var b=code[1];var be=code[2];var n=code[3];var ne=code[4];var rowCount=Math.max(be-b,ne-n);var topRows=[];var bottomRows=[];for(var i=0;i<rowCount;i++){if(change==="delete"||(change==="replace"&&b<be)){var lineNumber=b++;this._createLine(lineNumber,null,baseLines[lineNumber],"removed");lastWasSeparator=false;}
+if(change==="insert"||(change==="replace"&&n<ne)){var lineNumber=n++;this._createLine(null,lineNumber,newLines[lineNumber],"added");lastWasSeparator=false;}
+if(change==="equal"){b++;n++;if(!lastWasSeparator)
+this._createLine(null,null,"    \u2026","separator");lastWasSeparator=true;}}}}},oncollapse:function()
+{this._revertElement.remove();},_createLine:function(baseLineNumber,newLineNumber,lineContent,changeType)
+{var child=new TreeElement("",null,false);child.selectable=false;this.appendChild(child);var lineElement=document.createElement("span");function appendLineNumber(lineNumber)
+{var numberString=lineNumber!==null?numberToStringWithSpacesPadding(lineNumber+1,4):"    ";var lineNumberSpan=document.createElement("span");lineNumberSpan.classList.add("webkit-line-number");lineNumberSpan.textContent=numberString;child.listItemElement.appendChild(lineNumberSpan);}
+appendLineNumber(baseLineNumber);appendLineNumber(newLineNumber);var contentSpan=document.createElement("span");contentSpan.textContent=lineContent;child.listItemElement.appendChild(contentSpan);child.listItemElement.classList.add("revision-history-line");child.listItemElement.classList.add("revision-history-line-"+changeType);},allowRevert:function()
+{this._revertElement.classList.remove("hidden");},__proto__:TreeElement.prototype};WebInspector.ScopeChainSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Scope Variables"));this._sections=[];this._expandedSections={};this._expandedProperties=[];}
+WebInspector.ScopeChainSidebarPane.prototype={update:function(callFrame)
+{this.bodyElement.removeChildren();if(!callFrame){var infoElement=document.createElement("div");infoElement.className="info";infoElement.textContent=WebInspector.UIString("Not Paused");this.bodyElement.appendChild(infoElement);return;}
+for(var i=0;i<this._sections.length;++i){var section=this._sections[i];if(!section.title)
+continue;if(section.expanded)
+this._expandedSections[section.title]=true;else
+delete this._expandedSections[section.title];}
+this._sections=[];var foundLocalScope=false;var scopeChain=callFrame.scopeChain;for(var i=0;i<scopeChain.length;++i){var scope=scopeChain[i];var title=null;var subtitle=scope.object.description;var emptyPlaceholder=null;var extraProperties=[];var declarativeScope;switch(scope.type){case DebuggerAgent.ScopeType.Local:foundLocalScope=true;title=WebInspector.UIString("Local");emptyPlaceholder=WebInspector.UIString("No Variables");subtitle=undefined;if(callFrame.this)
+extraProperties.push(new WebInspector.RemoteObjectProperty("this",WebInspector.RemoteObject.fromPayload(callFrame.this)));if(i==0){var details=WebInspector.debuggerModel.debuggerPausedDetails();var exception=details.reason===WebInspector.DebuggerModel.BreakReason.Exception?details.auxData:0;if(exception&&!callFrame.isAsync()){var exceptionObject=(exception);extraProperties.push(new WebInspector.RemoteObjectProperty("<exception>",WebInspector.RemoteObject.fromPayload(exceptionObject)));}
+if(callFrame.returnValue)
+extraProperties.push(new WebInspector.RemoteObjectProperty("<return>",WebInspector.RemoteObject.fromPayload(callFrame.returnValue)));}
+declarativeScope=true;break;case DebuggerAgent.ScopeType.Closure:title=WebInspector.UIString("Closure");emptyPlaceholder=WebInspector.UIString("No Variables");subtitle=undefined;declarativeScope=true;break;case DebuggerAgent.ScopeType.Catch:title=WebInspector.UIString("Catch");subtitle=undefined;declarativeScope=true;break;case DebuggerAgent.ScopeType.With:title=WebInspector.UIString("With Block");declarativeScope=false;break;case DebuggerAgent.ScopeType.Global:title=WebInspector.UIString("Global");declarativeScope=false;break;}
+if(!title||title===subtitle)
+subtitle=undefined;var scopeRef=declarativeScope?new WebInspector.ScopeRef(i,callFrame.id,undefined):undefined;var scopeObject=WebInspector.ScopeRemoteObject.fromPayload(scope.object,scopeRef);var section=new WebInspector.ObjectPropertiesSection(scopeObject,title,subtitle,emptyPlaceholder,true,extraProperties,WebInspector.ScopeVariableTreeElement);section.editInSelectedCallFrameWhenPaused=true;section.pane=this;if(scope.type===DebuggerAgent.ScopeType.Global)
+section.expanded=false;else if(!foundLocalScope||scope.type===DebuggerAgent.ScopeType.Local||title in this._expandedSections)
+section.expanded=true;this._sections.push(section);this.bodyElement.appendChild(section.element);}},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.ScopeVariableTreeElement=function(property)
+{WebInspector.ObjectPropertyTreeElement.call(this,property);}
+WebInspector.ScopeVariableTreeElement.prototype={onattach:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);if(this.hasChildren&&this.propertyIdentifier in this.treeOutline.section.pane._expandedProperties)
+this.expand();},onexpand:function()
+{this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier]=true;},oncollapse:function()
+{delete this.treeOutline.section.pane._expandedProperties[this.propertyIdentifier];},get propertyIdentifier()
+{if("_propertyIdentifier"in this)
+return this._propertyIdentifier;var section=this.treeOutline.section;this._propertyIdentifier=section.title+":"+(section.subtitle?section.subtitle+":":"")+this.propertyPath();return this._propertyIdentifier;},__proto__:WebInspector.ObjectPropertyTreeElement.prototype};WebInspector.SourcesNavigator=function(workspace)
+{WebInspector.Object.call(this);this._workspace=workspace;this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.shrinkableTabs=true;this._tabbedPane.element.classList.add("navigator-tabbed-pane");new WebInspector.ExtensibleTabbedPaneController(this._tabbedPane,"navigator-view",this._navigatorViewCreated.bind(this));this._navigatorViews=new StringMap();}
+WebInspector.SourcesNavigator.Events={SourceSelected:"SourceSelected",SourceRenamed:"SourceRenamed"}
+WebInspector.SourcesNavigator.prototype={_navigatorViewCreated:function(id,view)
+{var navigatorView=(view);navigatorView.addEventListener(WebInspector.NavigatorView.Events.ItemSelected,this._sourceSelected,this);navigatorView.addEventListener(WebInspector.NavigatorView.Events.ItemRenamed,this._sourceRenamed,this);this._navigatorViews.put(id,navigatorView);navigatorView.setWorkspace(this._workspace);},get view()
+{return this._tabbedPane;},_navigatorViewIdForUISourceCode:function(uiSourceCode)
+{var ids=this._navigatorViews.keys();for(var i=0;i<ids.length;++i){var id=ids[i]
+var navigatorView=this._navigatorViews.get(id);if(navigatorView.accept(uiSourceCode))
+return id;}
+return null;},revealUISourceCode:function(uiSourceCode)
+{var id=this._navigatorViewIdForUISourceCode(uiSourceCode);if(!id)
+return;var navigatorView=this._navigatorViews.get(id);console.assert(navigatorView);navigatorView.revealUISourceCode(uiSourceCode,true);this._tabbedPane.selectTab(id);},_sourceSelected:function(event)
+{this.dispatchEventToListeners(WebInspector.SourcesNavigator.Events.SourceSelected,event.data);},_sourceRenamed:function(event)
+{this.dispatchEventToListeners(WebInspector.SourcesNavigator.Events.SourceRenamed,event.data);},__proto__:WebInspector.Object.prototype}
+WebInspector.SnippetsNavigatorView=function()
+{WebInspector.NavigatorView.call(this);}
+WebInspector.SnippetsNavigatorView.prototype={accept:function(uiSourceCode)
+{if(!WebInspector.NavigatorView.prototype.accept(uiSourceCode))
+return false;return uiSourceCode.project().type()===WebInspector.projectTypes.Snippets;},handleContextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("New"),this._handleCreateSnippet.bind(this));contextMenu.show();},handleFileContextMenu:function(event,uiSourceCode)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString("Run"),this._handleEvaluateSnippet.bind(this,uiSourceCode));contextMenu.appendItem(WebInspector.UIString("Rename"),this.rename.bind(this,uiSourceCode));contextMenu.appendItem(WebInspector.UIString("Remove"),this._handleRemoveSnippet.bind(this,uiSourceCode));contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString("New"),this._handleCreateSnippet.bind(this));contextMenu.show();},_handleEvaluateSnippet:function(uiSourceCode)
+{if(uiSourceCode.project().type()!==WebInspector.projectTypes.Snippets)
+return;WebInspector.scriptSnippetModel.evaluateScriptSnippet(uiSourceCode);},_handleRemoveSnippet:function(uiSourceCode)
+{if(uiSourceCode.project().type()!==WebInspector.projectTypes.Snippets)
+return;uiSourceCode.remove();},_handleCreateSnippet:function()
+{this.create(WebInspector.scriptSnippetModel.project(),"")},sourceDeleted:function(uiSourceCode)
+{this._handleRemoveSnippet(uiSourceCode);},__proto__:WebInspector.NavigatorView.prototype};WebInspector.SourcesSearchScope=function()
+{this._searchId=0;this._workspace=WebInspector.workspace;}
+WebInspector.SourcesSearchScope.prototype={performIndexing:function(progress,indexingFinishedCallback)
+{this.stopSearch();var projects=this._workspace.projects().filter(this._filterOutServiceProjects);var barrier=new CallbackBarrier();var compositeProgress=new WebInspector.CompositeProgress(progress);progress.addEventListener(WebInspector.Progress.Events.Canceled,indexingCanceled);for(var i=0;i<projects.length;++i){var project=projects[i];var projectProgress=compositeProgress.createSubProgress(project.uiSourceCodes().length);project.indexContent(projectProgress,barrier.createCallback());}
+barrier.callWhenDone(indexingFinishedCallback.bind(this,true));function indexingCanceled()
+{indexingFinishedCallback(false);progress.done();}},_filterOutServiceProjects:function(project)
+{return!project.isServiceProject()||project.type()===WebInspector.projectTypes.Formatter;},performSearch:function(searchConfig,progress,searchResultCallback,searchFinishedCallback)
+{this.stopSearch();this._searchResultCallback=searchResultCallback;this._searchFinishedCallback=searchFinishedCallback;this._searchConfig=searchConfig;var projects=this._workspace.projects().filter(this._filterOutServiceProjects);var barrier=new CallbackBarrier();var compositeProgress=new WebInspector.CompositeProgress(progress);for(var i=0;i<projects.length;++i){var project=projects[i];var weight=project.uiSourceCodes().length;var projectProgress=new WebInspector.CompositeProgress(compositeProgress.createSubProgress(weight));var findMatchingFilesProgress=projectProgress.createSubProgress();var searchContentProgress=projectProgress.createSubProgress();var barrierCallback=barrier.createCallback();var callback=this._processMatchingFilesForProject.bind(this,this._searchId,project,searchContentProgress,barrierCallback);project.findFilesMatchingSearchRequest(searchConfig.queries(),searchConfig.fileQueries(),!searchConfig.ignoreCase,searchConfig.isRegex,findMatchingFilesProgress,callback);}
+barrier.callWhenDone(this._searchFinishedCallback.bind(this,true));},_processMatchingFilesForProject:function(searchId,project,progress,callback,files)
+{if(searchId!==this._searchId){this._searchFinishedCallback(false);return;}
+if(!files.length){progress.done();callback();return;}
+progress.setTotalWork(files.length);var fileIndex=0;var maxFileContentRequests=20;var callbacksLeft=0;for(var i=0;i<maxFileContentRequests&&i<files.length;++i)
+scheduleSearchInNextFileOrFinish.call(this);function searchInNextFile(path)
+{var uiSourceCode=project.uiSourceCode(path);if(!uiSourceCode){--callbacksLeft;progress.worked(1);scheduleSearchInNextFileOrFinish.call(this);return;}
+uiSourceCode.requestContent(contentLoaded.bind(this,path));}
+function scheduleSearchInNextFileOrFinish()
+{if(fileIndex>=files.length){if(!callbacksLeft){progress.done();callback();return;}
+return;}
+++callbacksLeft;var path=files[fileIndex++];setTimeout(searchInNextFile.bind(this,path),0);}
+function contentLoaded(path,content)
+{function matchesComparator(a,b)
+{return a.lineNumber-b.lineNumber;}
+progress.worked(1);var matches=[];var queries=this._searchConfig.queries();if(content!==null){for(var i=0;i<queries.length;++i){var nextMatches=WebInspector.ContentProvider.performSearchInContent(content,queries[i],!this._searchConfig.ignoreCase,this._searchConfig.isRegex)
+matches=matches.mergeOrdered(nextMatches,matchesComparator);}}
+var uiSourceCode=project.uiSourceCode(path);if(matches&&uiSourceCode){var searchResult=new WebInspector.FileBasedSearchResultsPane.SearchResult(uiSourceCode,matches);this._searchResultCallback(searchResult);}
+--callbacksLeft;scheduleSearchInNextFileOrFinish.call(this);}},stopSearch:function()
+{++this._searchId;},createSearchResultsPane:function(searchConfig)
+{return new WebInspector.FileBasedSearchResultsPane(searchConfig);}};WebInspector.StyleSheetOutlineDialog=function(uiSourceCode,selectItemCallback)
+{WebInspector.SelectionDialogContentProvider.call(this);this._selectItemCallback=selectItemCallback;this._cssParser=new WebInspector.CSSParser();this._cssParser.addEventListener(WebInspector.CSSParser.Events.RulesParsed,this.refresh.bind(this));this._cssParser.parse(uiSourceCode.workingCopy());}
+WebInspector.StyleSheetOutlineDialog.show=function(view,uiSourceCode,selectItemCallback)
+{if(WebInspector.Dialog.currentInstance())
+return null;var delegate=new WebInspector.StyleSheetOutlineDialog(uiSourceCode,selectItemCallback);var filteredItemSelectionDialog=new WebInspector.FilteredItemSelectionDialog(delegate);WebInspector.Dialog.show(view.element,filteredItemSelectionDialog);}
+WebInspector.StyleSheetOutlineDialog.prototype={itemCount:function()
+{return this._cssParser.rules().length;},itemKeyAt:function(itemIndex)
+{var rule=this._cssParser.rules()[itemIndex];return rule.selectorText||rule.atRule;},itemScoreAt:function(itemIndex,query)
+{var rule=this._cssParser.rules()[itemIndex];return-rule.lineNumber;},renderItem:function(itemIndex,query,titleElement,subtitleElement)
+{var rule=this._cssParser.rules()[itemIndex];titleElement.textContent=rule.selectorText||rule.atRule;this.highlightRanges(titleElement,query);subtitleElement.textContent=":"+(rule.lineNumber+1);},selectItem:function(itemIndex,promptValue)
+{var rule=this._cssParser.rules()[itemIndex];var lineNumber=rule.lineNumber;if(!isNaN(lineNumber)&&lineNumber>=0)
+this._selectItemCallback(lineNumber,rule.columnNumber);},dispose:function()
+{this._cssParser.dispose();},__proto__:WebInspector.SelectionDialogContentProvider.prototype};WebInspector.TabbedEditorContainerDelegate=function(){}
+WebInspector.TabbedEditorContainerDelegate.prototype={viewForFile:function(uiSourceCode){},}
+WebInspector.TabbedEditorContainer=function(delegate,settingName,placeholderText)
+{WebInspector.Object.call(this);this._delegate=delegate;this._tabbedPane=new WebInspector.TabbedPane();this._tabbedPane.setPlaceholderText(placeholderText);this._tabbedPane.setTabDelegate(new WebInspector.EditorContainerTabDelegate(this));this._tabbedPane.closeableTabs=true;this._tabbedPane.element.id="sources-editor-container-tabbed-pane";this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabClosed,this._tabClosed,this);this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected,this._tabSelected,this);this._tabIds=new Map();this._files={};this._previouslyViewedFilesSetting=WebInspector.settings.createSetting(settingName,[]);this._history=WebInspector.TabbedEditorContainer.History.fromObject(this._previouslyViewedFilesSetting.get());}
+WebInspector.TabbedEditorContainer.Events={EditorSelected:"EditorSelected",EditorClosed:"EditorClosed"}
+WebInspector.TabbedEditorContainer._tabId=0;WebInspector.TabbedEditorContainer.maximalPreviouslyViewedFilesCount=30;WebInspector.TabbedEditorContainer.prototype={get view()
+{return this._tabbedPane;},get visibleView()
+{return this._tabbedPane.visibleView;},show:function(parentElement)
+{this._tabbedPane.show(parentElement);},showFile:function(uiSourceCode)
+{this._innerShowFile(uiSourceCode,true);},closeFile:function(uiSourceCode)
+{var tabId=this._tabIds.get(uiSourceCode);if(!tabId)
+return;this._closeTabs([tabId]);},historyUISourceCodes:function()
+{var uriToUISourceCode={};for(var id in this._files){var uiSourceCode=this._files[id];uriToUISourceCode[uiSourceCode.uri()]=uiSourceCode;}
+var result=[];var uris=this._history._urls();for(var i=0;i<uris.length;++i){var uiSourceCode=uriToUISourceCode[uris[i]];if(uiSourceCode)
+result.push(uiSourceCode);}
+return result;},_addViewListeners:function()
+{if(!this._currentView)
+return;this._currentView.addEventListener(WebInspector.SourceFrame.Events.ScrollChanged,this._scrollChanged,this);this._currentView.addEventListener(WebInspector.SourceFrame.Events.SelectionChanged,this._selectionChanged,this);},_removeViewListeners:function()
+{if(!this._currentView)
+return;this._currentView.removeEventListener(WebInspector.SourceFrame.Events.ScrollChanged,this._scrollChanged,this);this._currentView.removeEventListener(WebInspector.SourceFrame.Events.SelectionChanged,this._selectionChanged,this);},_scrollChanged:function(event)
+{var lineNumber=(event.data);this._history.updateScrollLineNumber(this._currentFile.uri(),lineNumber);this._history.save(this._previouslyViewedFilesSetting);},_selectionChanged:function(event)
+{var range=(event.data);this._history.updateSelectionRange(this._currentFile.uri(),range);this._history.save(this._previouslyViewedFilesSetting);},_innerShowFile:function(uiSourceCode,userGesture)
+{if(this._currentFile===uiSourceCode)
+return;this._removeViewListeners();this._currentFile=uiSourceCode;var tabId=this._tabIds.get(uiSourceCode)||this._appendFileTab(uiSourceCode,userGesture);this._tabbedPane.selectTab(tabId,userGesture);if(userGesture)
+this._editorSelectedByUserAction();this._currentView=this.visibleView;this._addViewListeners();var eventData={currentFile:this._currentFile,userGesture:userGesture};this.dispatchEventToListeners(WebInspector.TabbedEditorContainer.Events.EditorSelected,eventData);},_titleForFile:function(uiSourceCode)
+{var maxDisplayNameLength=30;var title=uiSourceCode.displayName(true).trimMiddle(maxDisplayNameLength);if(uiSourceCode.isDirty()||uiSourceCode.hasUnsavedCommittedChanges())
+title+="*";return title;},_maybeCloseTab:function(id,nextTabId)
+{var uiSourceCode=this._files[id];var shouldPrompt=uiSourceCode.isDirty()&&uiSourceCode.project().canSetFileContent();if(!shouldPrompt||confirm(WebInspector.UIString("Are you sure you want to close unsaved file: %s?",uiSourceCode.name()))){uiSourceCode.resetWorkingCopy();if(nextTabId)
+this._tabbedPane.selectTab(nextTabId,true);this._tabbedPane.closeTab(id,true);return true;}
+return false;},_closeTabs:function(ids)
+{var dirtyTabs=[];var cleanTabs=[];for(var i=0;i<ids.length;++i){var id=ids[i];var uiSourceCode=this._files[id];if(uiSourceCode.isDirty())
+dirtyTabs.push(id);else
+cleanTabs.push(id);}
+if(dirtyTabs.length)
+this._tabbedPane.selectTab(dirtyTabs[0],true);this._tabbedPane.closeTabs(cleanTabs,true);for(var i=0;i<dirtyTabs.length;++i){var nextTabId=i+1<dirtyTabs.length?dirtyTabs[i+1]:null;if(!this._maybeCloseTab(dirtyTabs[i],nextTabId))
+break;}},addUISourceCode:function(uiSourceCode)
+{var uri=uiSourceCode.uri();if(this._userSelectedFiles)
+return;var index=this._history.index(uri)
+if(index===-1)
+return;var tabId=this._tabIds.get(uiSourceCode)||this._appendFileTab(uiSourceCode,false);if(!this._currentFile)
+return;if(!index){this._innerShowFile(uiSourceCode,false);return;}
+var currentProjectType=this._currentFile.project().type();var addedProjectType=uiSourceCode.project().type();var snippetsProjectType=WebInspector.projectTypes.Snippets;if(this._history.index(this._currentFile.uri())&&currentProjectType===snippetsProjectType&&addedProjectType!==snippetsProjectType)
+this._innerShowFile(uiSourceCode,false);},removeUISourceCode:function(uiSourceCode)
+{this.removeUISourceCodes([uiSourceCode]);},removeUISourceCodes:function(uiSourceCodes)
+{var tabIds=[];for(var i=0;i<uiSourceCodes.length;++i){var uiSourceCode=uiSourceCodes[i];var tabId=this._tabIds.get(uiSourceCode);if(tabId)
+tabIds.push(tabId);}
+this._tabbedPane.closeTabs(tabIds);},_editorClosedByUserAction:function(uiSourceCode)
+{this._userSelectedFiles=true;this._history.remove(uiSourceCode.uri());this._updateHistory();},_editorSelectedByUserAction:function()
+{this._userSelectedFiles=true;this._updateHistory();},_updateHistory:function()
+{var tabIds=this._tabbedPane.lastOpenedTabIds(WebInspector.TabbedEditorContainer.maximalPreviouslyViewedFilesCount);function tabIdToURI(tabId)
+{return this._files[tabId].uri();}
+this._history.update(tabIds.map(tabIdToURI.bind(this)));this._history.save(this._previouslyViewedFilesSetting);},_tooltipForFile:function(uiSourceCode)
+{return uiSourceCode.originURL();},_appendFileTab:function(uiSourceCode,userGesture)
+{var view=this._delegate.viewForFile(uiSourceCode);var title=this._titleForFile(uiSourceCode);var tooltip=this._tooltipForFile(uiSourceCode);var tabId=this._generateTabId();this._tabIds.put(uiSourceCode,tabId);this._files[tabId]=uiSourceCode;var savedSelectionRange=this._history.selectionRange(uiSourceCode.uri());if(savedSelectionRange)
+view.setSelection(savedSelectionRange);var savedScrollLineNumber=this._history.scrollLineNumber(uiSourceCode.uri());if(savedScrollLineNumber)
+view.scrollToLine(savedScrollLineNumber);this._tabbedPane.appendTab(tabId,title,view,tooltip,userGesture);this._updateFileTitle(uiSourceCode);this._addUISourceCodeListeners(uiSourceCode);return tabId;},_tabClosed:function(event)
+{var tabId=(event.data.tabId);var userGesture=(event.data.isUserGesture);var uiSourceCode=this._files[tabId];if(this._currentFile===uiSourceCode){this._removeViewListeners();delete this._currentView;delete this._currentFile;}
+this._tabIds.remove(uiSourceCode);delete this._files[tabId];this._removeUISourceCodeListeners(uiSourceCode);this.dispatchEventToListeners(WebInspector.TabbedEditorContainer.Events.EditorClosed,uiSourceCode);if(userGesture)
+this._editorClosedByUserAction(uiSourceCode);},_tabSelected:function(event)
+{var tabId=(event.data.tabId);var userGesture=(event.data.isUserGesture);var uiSourceCode=this._files[tabId];this._innerShowFile(uiSourceCode,userGesture);},_addUISourceCodeListeners:function(uiSourceCode)
+{uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.TitleChanged,this._uiSourceCodeTitleChanged,this);uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._uiSourceCodeWorkingCopyChanged,this);uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._uiSourceCodeWorkingCopyCommitted,this);uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.SavedStateUpdated,this._uiSourceCodeSavedStateUpdated,this);},_removeUISourceCodeListeners:function(uiSourceCode)
+{uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.TitleChanged,this._uiSourceCodeTitleChanged,this);uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged,this._uiSourceCodeWorkingCopyChanged,this);uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted,this._uiSourceCodeWorkingCopyCommitted,this);uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.SavedStateUpdated,this._uiSourceCodeSavedStateUpdated,this);},_updateFileTitle:function(uiSourceCode)
+{var tabId=this._tabIds.get(uiSourceCode);if(tabId){var title=this._titleForFile(uiSourceCode);this._tabbedPane.changeTabTitle(tabId,title);if(uiSourceCode.hasUnsavedCommittedChanges())
+this._tabbedPane.setTabIcon(tabId,"editor-container-unsaved-committed-changes-icon",WebInspector.UIString("Changes to this file were not saved to file system."));else
+this._tabbedPane.setTabIcon(tabId,"");}},_uiSourceCodeTitleChanged:function(event)
+{var uiSourceCode=(event.target);this._updateFileTitle(uiSourceCode);this._updateHistory();},_uiSourceCodeWorkingCopyChanged:function(event)
+{var uiSourceCode=(event.target);this._updateFileTitle(uiSourceCode);},_uiSourceCodeWorkingCopyCommitted:function(event)
+{var uiSourceCode=(event.target);this._updateFileTitle(uiSourceCode);},_uiSourceCodeSavedStateUpdated:function(event)
+{var uiSourceCode=(event.target);this._updateFileTitle(uiSourceCode);},reset:function()
+{delete this._userSelectedFiles;},_generateTabId:function()
+{return"tab_"+(WebInspector.TabbedEditorContainer._tabId++);},currentFile:function()
+{return this._currentFile;},__proto__:WebInspector.Object.prototype}
+WebInspector.TabbedEditorContainer.HistoryItem=function(url,selectionRange,scrollLineNumber)
+{this.url=url;this._isSerializable=url.length<WebInspector.TabbedEditorContainer.HistoryItem.serializableUrlLengthLimit;this.selectionRange=selectionRange;this.scrollLineNumber=scrollLineNumber;}
+WebInspector.TabbedEditorContainer.HistoryItem.serializableUrlLengthLimit=4096;WebInspector.TabbedEditorContainer.HistoryItem.fromObject=function(serializedHistoryItem)
+{var selectionRange=serializedHistoryItem.selectionRange?WebInspector.TextRange.fromObject(serializedHistoryItem.selectionRange):undefined;return new WebInspector.TabbedEditorContainer.HistoryItem(serializedHistoryItem.url,selectionRange,serializedHistoryItem.scrollLineNumber);}
+WebInspector.TabbedEditorContainer.HistoryItem.prototype={serializeToObject:function()
+{if(!this._isSerializable)
+return null;var serializedHistoryItem={};serializedHistoryItem.url=this.url;serializedHistoryItem.selectionRange=this.selectionRange;serializedHistoryItem.scrollLineNumber=this.scrollLineNumber;return serializedHistoryItem;}}
+WebInspector.TabbedEditorContainer.History=function(items)
+{this._items=items;this._rebuildItemIndex();}
+WebInspector.TabbedEditorContainer.History.fromObject=function(serializedHistory)
+{var items=[];for(var i=0;i<serializedHistory.length;++i)
+items.push(WebInspector.TabbedEditorContainer.HistoryItem.fromObject(serializedHistory[i]));return new WebInspector.TabbedEditorContainer.History(items);}
+WebInspector.TabbedEditorContainer.History.prototype={index:function(url)
+{var index=this._itemsIndex[url];if(typeof index==="number")
+return index;return-1;},_rebuildItemIndex:function()
+{this._itemsIndex={};for(var i=0;i<this._items.length;++i){console.assert(!this._itemsIndex.hasOwnProperty(this._items[i].url));this._itemsIndex[this._items[i].url]=i;}},selectionRange:function(url)
+{var index=this.index(url);return index!==-1?this._items[index].selectionRange:undefined;},updateSelectionRange:function(url,selectionRange)
+{if(!selectionRange)
+return;var index=this.index(url);if(index===-1)
+return;this._items[index].selectionRange=selectionRange;},scrollLineNumber:function(url)
+{var index=this.index(url);return index!==-1?this._items[index].scrollLineNumber:undefined;},updateScrollLineNumber:function(url,scrollLineNumber)
+{var index=this.index(url);if(index===-1)
+return;this._items[index].scrollLineNumber=scrollLineNumber;},update:function(urls)
+{for(var i=urls.length-1;i>=0;--i){var index=this.index(urls[i]);var item;if(index!==-1){item=this._items[index];this._items.splice(index,1);}else
+item=new WebInspector.TabbedEditorContainer.HistoryItem(urls[i]);this._items.unshift(item);this._rebuildItemIndex();}},remove:function(url)
+{var index=this.index(url);if(index!==-1){this._items.splice(index,1);this._rebuildItemIndex();}},save:function(setting)
+{setting.set(this._serializeToObject());},_serializeToObject:function()
+{var serializedHistory=[];for(var i=0;i<this._items.length;++i){var serializedItem=this._items[i].serializeToObject();if(serializedItem)
+serializedHistory.push(serializedItem);if(serializedHistory.length===WebInspector.TabbedEditorContainer.maximalPreviouslyViewedFilesCount)
+break;}
+return serializedHistory;},_urls:function()
+{var result=[];for(var i=0;i<this._items.length;++i)
+result.push(this._items[i].url);return result;}}
+WebInspector.EditorContainerTabDelegate=function(editorContainer)
+{this._editorContainer=editorContainer;}
+WebInspector.EditorContainerTabDelegate.prototype={closeTabs:function(tabbedPane,ids)
+{this._editorContainer._closeTabs(ids);}};WebInspector.WatchExpressionsSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Watch Expressions"));this.section=new WebInspector.WatchExpressionsSection();this.bodyElement.appendChild(this.section.element);var refreshButton=document.createElement("button");refreshButton.className="pane-title-button refresh";refreshButton.addEventListener("click",this._refreshButtonClicked.bind(this),false);refreshButton.title=WebInspector.UIString("Refresh");this.titleElement.appendChild(refreshButton);var addButton=document.createElement("button");addButton.className="pane-title-button add";addButton.addEventListener("click",this._addButtonClicked.bind(this),false);this.titleElement.appendChild(addButton);addButton.title=WebInspector.UIString("Add watch expression");this._requiresUpdate=true;}
+WebInspector.WatchExpressionsSidebarPane.prototype={wasShown:function()
+{this._refreshExpressionsIfNeeded();},reset:function()
+{this.refreshExpressions();},refreshExpressions:function()
+{this._requiresUpdate=true;this._refreshExpressionsIfNeeded();},addExpression:function(expression)
+{this.section.addExpression(expression);this.expand();},_refreshExpressionsIfNeeded:function()
+{if(this._requiresUpdate&&this.isShowing()){this.section.update();delete this._requiresUpdate;}else
+this._requiresUpdate=true;},_addButtonClicked:function(event)
+{event.consume();this.expand();this.section.addNewExpressionAndEdit();},_refreshButtonClicked:function(event)
+{event.consume();this.refreshExpressions();},__proto__:WebInspector.SidebarPane.prototype}
+WebInspector.WatchExpressionsSection=function()
+{this._watchObjectGroupId="watch-group";WebInspector.ObjectPropertiesSection.call(this,WebInspector.RemoteObject.fromPrimitiveValue(""));this.treeElementConstructor=WebInspector.WatchedPropertyTreeElement;this._expandedExpressions={};this._expandedProperties={};this.emptyElement=document.createElement("div");this.emptyElement.className="info";this.emptyElement.textContent=WebInspector.UIString("No Watch Expressions");this.watchExpressions=WebInspector.settings.watchExpressions.get();this.headerElement.className="hidden";this.editable=true;this.expanded=true;this.propertiesElement.classList.add("watch-expressions");this.element.addEventListener("mousemove",this._mouseMove.bind(this),true);this.element.addEventListener("mouseout",this._mouseOut.bind(this),true);this.element.addEventListener("dblclick",this._sectionDoubleClick.bind(this),false);this.emptyElement.addEventListener("contextmenu",this._emptyElementContextMenu.bind(this),false);}
+WebInspector.WatchExpressionsSection.NewWatchExpression="\xA0";WebInspector.WatchExpressionsSection.prototype={update:function(e)
+{if(e)
+e.consume();function appendResult(expression,watchIndex,result,wasThrown)
+{if(!result)
+return;var property=new WebInspector.RemoteObjectProperty(expression,result);property.watchIndex=watchIndex;property.wasThrown=wasThrown;properties.push(property);if(properties.length==propertyCount){this.updateProperties(properties,[],WebInspector.WatchExpressionTreeElement,WebInspector.WatchExpressionsSection.CompareProperties);if(this._newExpressionAdded){delete this._newExpressionAdded;var treeElement=this.findAddedTreeElement();if(treeElement)
+treeElement.startEditing();}
+if(this._lastMouseMovePageY)
+this._updateHoveredElement(this._lastMouseMovePageY);}}
+RuntimeAgent.releaseObjectGroup(this._watchObjectGroupId)
+var properties=[];var propertyCount=0;for(var i=0;i<this.watchExpressions.length;++i){if(!this.watchExpressions[i])
+continue;++propertyCount;}
+for(var i=0;i<this.watchExpressions.length;++i){var expression=this.watchExpressions[i];if(!expression)
+continue;WebInspector.runtimeModel.evaluate(expression,this._watchObjectGroupId,false,true,false,false,appendResult.bind(this,expression,i));}
+if(!propertyCount){if(!this.emptyElement.parentNode)
+this.element.appendChild(this.emptyElement);}else{if(this.emptyElement.parentNode)
+this.element.removeChild(this.emptyElement);}
+this.expanded=(propertyCount!=0);},addExpression:function(expression)
+{this.watchExpressions.push(expression);this.saveExpressions();this.update();},addNewExpressionAndEdit:function()
+{this._newExpressionAdded=true;this.watchExpressions.push(WebInspector.WatchExpressionsSection.NewWatchExpression);this.update();},_sectionDoubleClick:function(event)
+{if(event.target!==this.element&&event.target!==this.propertiesElement&&event.target!==this.emptyElement)
+return;event.consume();this.addNewExpressionAndEdit();},updateExpression:function(element,value)
+{if(value===null){var index=element.property.watchIndex;this.watchExpressions.splice(index,1);}
+else
+this.watchExpressions[element.property.watchIndex]=value;this.saveExpressions();this.update();},_deleteAllExpressions:function()
+{this.watchExpressions=[];this.saveExpressions();this.update();},findAddedTreeElement:function()
+{var children=this.propertiesTreeOutline.children;for(var i=0;i<children.length;++i){if(children[i].property.name===WebInspector.WatchExpressionsSection.NewWatchExpression)
+return children[i];}
+return null;},saveExpressions:function()
+{var toSave=[];for(var i=0;i<this.watchExpressions.length;i++)
+if(this.watchExpressions[i])
+toSave.push(this.watchExpressions[i]);WebInspector.settings.watchExpressions.set(toSave);return toSave.length;},_mouseMove:function(e)
+{if(this.propertiesElement.firstChild)
+this._updateHoveredElement(e.pageY);},_mouseOut:function()
+{if(this._hoveredElement){this._hoveredElement.classList.remove("hovered");delete this._hoveredElement;}
+delete this._lastMouseMovePageY;},_updateHoveredElement:function(pageY)
+{var candidateElement=this.propertiesElement.firstChild;while(true){var next=candidateElement.nextSibling;while(next&&!next.clientHeight)
+next=next.nextSibling;if(!next||next.totalOffsetTop()>pageY)
+break;candidateElement=next;}
+if(this._hoveredElement!==candidateElement){if(this._hoveredElement)
+this._hoveredElement.classList.remove("hovered");if(candidateElement)
+candidateElement.classList.add("hovered");this._hoveredElement=candidateElement;}
+this._lastMouseMovePageY=pageY;},_emptyElementContextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add watch expression":"Add Watch Expression"),this.addNewExpressionAndEdit.bind(this));contextMenu.show();},__proto__:WebInspector.ObjectPropertiesSection.prototype}
+WebInspector.WatchExpressionsSection.CompareProperties=function(propertyA,propertyB)
+{if(propertyA.watchIndex==propertyB.watchIndex)
+return 0;else if(propertyA.watchIndex<propertyB.watchIndex)
+return-1;else
+return 1;}
+WebInspector.WatchExpressionTreeElement=function(property)
+{WebInspector.ObjectPropertyTreeElement.call(this,property);}
+WebInspector.WatchExpressionTreeElement.prototype={onexpand:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.onexpand.call(this);this.treeOutline.section._expandedExpressions[this._expression()]=true;},oncollapse:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.oncollapse.call(this);delete this.treeOutline.section._expandedExpressions[this._expression()];},onattach:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);if(this.treeOutline.section._expandedExpressions[this._expression()])
+this.expanded=true;},_expression:function()
+{return this.property.name;},update:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);if(this.property.wasThrown){this.valueElement.textContent=WebInspector.UIString("<not available>");this.listItemElement.classList.add("dimmed");}else
+this.listItemElement.classList.remove("dimmed");var deleteButton=document.createElement("input");deleteButton.type="button";deleteButton.title=WebInspector.UIString("Delete watch expression.");deleteButton.classList.add("enabled-button");deleteButton.classList.add("delete-button");deleteButton.addEventListener("click",this._deleteButtonClicked.bind(this),false);this.listItemElement.addEventListener("contextmenu",this._contextMenu.bind(this),false);this.listItemElement.insertBefore(deleteButton,this.listItemElement.firstChild);},populateContextMenu:function(contextMenu)
+{if(!this.isEditing()){contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Add watch expression":"Add Watch Expression"),this.treeOutline.section.addNewExpressionAndEdit.bind(this.treeOutline.section));contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Delete watch expression":"Delete Watch Expression"),this._deleteButtonClicked.bind(this));}
+if(this.treeOutline.section.watchExpressions.length>1)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Delete all watch expressions":"Delete All Watch Expressions"),this._deleteAllButtonClicked.bind(this));},_contextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);this.populateContextMenu(contextMenu);contextMenu.show();},_deleteAllButtonClicked:function()
+{this.treeOutline.section._deleteAllExpressions();},_deleteButtonClicked:function()
+{this.treeOutline.section.updateExpression(this,null);},renderPromptAsBlock:function()
+{return true;},elementAndValueToEdit:function(event)
+{return[this.nameElement,this.property.name.trim()];},editingCancelled:function(element,context)
+{if(!context.elementToEdit.textContent)
+this.treeOutline.section.updateExpression(this,null);WebInspector.ObjectPropertyTreeElement.prototype.editingCancelled.call(this,element,context);},applyExpression:function(expression,updateInterface)
+{expression=expression.trim();if(!expression)
+expression=null;this.property.name=expression;this.treeOutline.section.updateExpression(this,expression);},__proto__:WebInspector.ObjectPropertyTreeElement.prototype}
+WebInspector.WatchedPropertyTreeElement=function(property)
+{WebInspector.ObjectPropertyTreeElement.call(this,property);}
+WebInspector.WatchedPropertyTreeElement.prototype={onattach:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.onattach.call(this);if(this.hasChildren&&this.propertyPath()in this.treeOutline.section._expandedProperties)
+this.expand();},onexpand:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.onexpand.call(this);this.treeOutline.section._expandedProperties[this.propertyPath()]=true;},oncollapse:function()
+{WebInspector.ObjectPropertyTreeElement.prototype.oncollapse.call(this);delete this.treeOutline.section._expandedProperties[this.propertyPath()];},__proto__:WebInspector.ObjectPropertyTreeElement.prototype};WebInspector.WorkersSidebarPane=function()
+{WebInspector.SidebarPane.call(this,WebInspector.UIString("Workers"));this._enableWorkersCheckbox=new WebInspector.Checkbox(WebInspector.UIString("Pause on start"),"sidebar-label",WebInspector.UIString("Automatically attach to new workers and pause them. Enabling this option will force opening inspector for all new workers."));this._enableWorkersCheckbox.element.id="pause-workers-checkbox";this.bodyElement.appendChild(this._enableWorkersCheckbox.element);this._enableWorkersCheckbox.addEventListener(this._autoattachToWorkersClicked.bind(this));this._enableWorkersCheckbox.checked=false;var note=this.bodyElement.createChild("div");note.id="shared-workers-list";note.classList.add("sidebar-label")
+note.textContent=WebInspector.UIString("Shared workers can be inspected in the Task Manager");var separator=this.bodyElement.createChild("div","sidebar-separator");separator.textContent=WebInspector.UIString("Dedicated worker inspectors");this._workerListElement=document.createElement("ol");this._workerListElement.tabIndex=0;this._workerListElement.classList.add("properties-tree");this._workerListElement.classList.add("sidebar-label");this.bodyElement.appendChild(this._workerListElement);this._idToWorkerItem={};var threadList=WebInspector.workerManager.threadsList();for(var i=0;i<threadList.length;++i){var threadId=threadList[i];if(threadId===WebInspector.WorkerManager.MainThreadId)
+continue;this._addWorker(threadId,WebInspector.workerManager.threadUrl(threadId));}
+WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerAdded,this._workerAdded,this);WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerRemoved,this._workerRemoved,this);WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkersCleared,this._workersCleared,this);}
+WebInspector.WorkersSidebarPane.prototype={_workerAdded:function(event)
+{this._addWorker(event.data.workerId,event.data.url);},_workerRemoved:function(event)
+{this._idToWorkerItem[event.data].remove();delete this._idToWorkerItem[event.data];},_workersCleared:function(event)
+{this._idToWorkerItem={};this._workerListElement.removeChildren();},_addWorker:function(workerId,url)
+{var item=this._workerListElement.createChild("div","dedicated-worker-item");var link=item.createChild("a");link.textContent=url;link.href="#";link.target="_blank";link.addEventListener("click",this._workerItemClicked.bind(this,workerId),true);this._idToWorkerItem[workerId]=item;},_workerItemClicked:function(workerId,event)
+{event.preventDefault();WebInspector.workerFrontendManager.openWorkerInspector(workerId);},_autoattachToWorkersClicked:function(event)
+{WorkerAgent.setAutoconnectToWorkers(this._enableWorkersCheckbox.checked);},__proto__:WebInspector.SidebarPane.prototype};WebInspector.ThreadsToolbar=function()
+{this.element=document.createElement("div");this.element.className="status-bar scripts-debug-toolbar threads-toolbar hidden";this._comboBox=new WebInspector.StatusBarComboBox(this._onComboBoxSelectionChange.bind(this));this.element.appendChild(this._comboBox.element);this._reset();if(WebInspector.experimentsSettings.workersInMainWindow.isEnabled()){WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerAdded,this._workerAdded,this);WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkerRemoved,this._workerRemoved,this);WebInspector.workerManager.addEventListener(WebInspector.WorkerManager.Events.WorkersCleared,this._workersCleared,this);}}
+WebInspector.ThreadsToolbar.prototype={_reset:function()
+{if(!WebInspector.experimentsSettings.workersInMainWindow.isEnabled())
+return;this._threadIdToOption={};var connectedThreads=WebInspector.workerManager.threadsList();for(var i=0;i<connectedThreads.length;++i){var threadId=connectedThreads[i];this._addOption(threadId,WebInspector.workerManager.threadUrl(threadId));}
+this._alterVisibility();this._comboBox.select(this._threadIdToOption[WebInspector.workerManager.selectedThreadId()]);},_addOption:function(workerId,url)
+{var option=this._comboBox.createOption(url,"",String(workerId));this._threadIdToOption[workerId]=option;},_workerAdded:function(event)
+{var data=(event.data);this._addOption(data.workerId,data.url);this._alterVisibility();},_workerRemoved:function(event)
+{var data=(event.data);this._comboBox.removeOption(this._threadIdToOption[data.workerId]);delete this._threadIdToOption[data.workerId];this._alterVisibility();},_workersCleared:function()
+{this._comboBox.removeOptions();this._reset();},_onComboBoxSelectionChange:function()
+{var selectedOption=this._comboBox.selectedOption();if(!selectedOption)
+return;WebInspector.workerManager.setSelectedThreadId(parseInt(selectedOption.value,10));},_alterVisibility:function()
+{var hidden=this._comboBox.size()===1;this.element.classList.toggle("hidden",hidden);}};WebInspector.FormatterScriptMapping=function(workspace,debuggerModel)
+{this._workspace=workspace;this._debuggerModel=debuggerModel;this._init();this._projectDelegate=new WebInspector.FormatterProjectDelegate();this._workspace.addProject(this._projectDelegate);this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
+WebInspector.FormatterScriptMapping.prototype={rawLocationToUILocation:function(rawLocation)
+{var debuggerModelLocation=(rawLocation);var script=this._debuggerModel.scriptForId(debuggerModelLocation.scriptId);var uiSourceCode=this._uiSourceCodes.get(script);if(!uiSourceCode)
+return null;var formatData=this._formatData.get(uiSourceCode);if(!formatData)
+return null;var mapping=formatData.mapping;var lineNumber=debuggerModelLocation.lineNumber;var columnNumber=debuggerModelLocation.columnNumber||0;var formattedLocation=mapping.originalToFormatted(lineNumber,columnNumber);return new WebInspector.UILocation(uiSourceCode,formattedLocation[0],formattedLocation[1]);},uiLocationToRawLocation:function(uiSourceCode,lineNumber,columnNumber)
+{var formatData=this._formatData.get(uiSourceCode);if(!formatData)
+return null;var originalLocation=formatData.mapping.formattedToOriginal(lineNumber,columnNumber)
+return this._debuggerModel.createRawLocation(formatData.scripts[0],originalLocation[0],originalLocation[1]);},isIdentity:function()
+{return false;},_scriptsForUISourceCode:function(uiSourceCode)
+{function isInlineScript(script)
+{return script.isInlineScript();}
+if(uiSourceCode.contentType()===WebInspector.resourceTypes.Document)
+return this._debuggerModel.scriptsForSourceURL(uiSourceCode.url).filter(isInlineScript);if(uiSourceCode.contentType()===WebInspector.resourceTypes.Script){var rawLocation=uiSourceCode.uiLocationToRawLocation(0,0);return rawLocation?[this._debuggerModel.scriptForId(rawLocation.scriptId)]:[];}
+return[];},_init:function()
+{this._uiSourceCodes=new Map();this._formattedPaths=new StringMap();this._formatData=new Map();},_debuggerReset:function()
+{var formattedPaths=this._formattedPaths.values();for(var i=0;i<formattedPaths.length;++i)
+this._projectDelegate._removeFormatted(formattedPaths[i]);this._init();},_performUISourceCodeScriptFormatting:function(uiSourceCode,callback)
+{var path=this._formattedPaths.get(uiSourceCode.project().id()+":"+uiSourceCode.path());if(path){var uiSourceCodePath=path;var formattedUISourceCode=this._workspace.uiSourceCode(this._projectDelegate.id(),uiSourceCodePath);var formatData=formattedUISourceCode?this._formatData.get(formattedUISourceCode):null;if(!formatData)
+callback(null);else
+callback(formattedUISourceCode,formatData.mapping);return;}
+uiSourceCode.requestContent(contentLoaded.bind(this));function contentLoaded(content)
+{var formatter=WebInspector.Formatter.createFormatter(uiSourceCode.contentType());formatter.formatContent(uiSourceCode.highlighterType(),content||"",innerCallback.bind(this));}
+function innerCallback(formattedContent,formatterMapping)
+{var scripts=this._scriptsForUISourceCode(uiSourceCode);if(!scripts.length){callback(null);return;}
+var name;if(uiSourceCode.contentType()===WebInspector.resourceTypes.Document)
+name=uiSourceCode.displayName();else
+name=uiSourceCode.name()||scripts[0].scriptId;path=this._projectDelegate._addFormatted(name,uiSourceCode.url,uiSourceCode.contentType(),formattedContent);var formattedUISourceCode=(this._workspace.uiSourceCode(this._projectDelegate.id(),path));var formatData=new WebInspector.FormatterScriptMapping.FormatData(uiSourceCode.project().id(),uiSourceCode.path(),formatterMapping,scripts);this._formatData.put(formattedUISourceCode,formatData);this._formattedPaths.put(uiSourceCode.project().id()+":"+uiSourceCode.path(),path);for(var i=0;i<scripts.length;++i){this._uiSourceCodes.put(scripts[i],formattedUISourceCode);scripts[i].pushSourceMapping(this);}
+formattedUISourceCode.setSourceMapping(this);callback(formattedUISourceCode,formatterMapping);}},_discardFormattedUISourceCodeScript:function(formattedUISourceCode)
+{var formatData=this._formatData.get(formattedUISourceCode);if(!formatData)
+return null;this._formatData.remove(formattedUISourceCode);this._formattedPaths.remove(formatData.projectId+":"+formatData.path);for(var i=0;i<formatData.scripts.length;++i){this._uiSourceCodes.remove(formatData.scripts[i]);formatData.scripts[i].popSourceMapping();}
+this._projectDelegate._removeFormatted(formattedUISourceCode.path());return formatData.mapping;},}
+WebInspector.FormatterScriptMapping.FormatData=function(projectId,path,mapping,scripts)
+{this.projectId=projectId;this.path=path;this.mapping=mapping;this.scripts=scripts;}
+WebInspector.FormatterProjectDelegate=function()
+{WebInspector.ContentProviderBasedProjectDelegate.call(this,WebInspector.projectTypes.Formatter);}
+WebInspector.FormatterProjectDelegate.prototype={id:function()
+{return"formatter:";},displayName:function()
+{return"formatter";},_addFormatted:function(name,sourceURL,contentType,content)
+{var contentProvider=new WebInspector.StaticContentProvider(contentType,content);return this.addContentProvider(sourceURL,name+":formatted","deobfuscated:"+sourceURL,contentProvider,false,false);},_removeFormatted:function(path)
+{this.removeFile(path);},__proto__:WebInspector.ContentProviderBasedProjectDelegate.prototype}
+WebInspector.ScriptFormatterEditorAction=function()
+{this._scriptMapping=new WebInspector.FormatterScriptMapping(WebInspector.workspace,WebInspector.debuggerModel);}
+WebInspector.ScriptFormatterEditorAction.prototype={_editorSelected:function(event)
+{var uiSourceCode=(event.data);this._updateButton(uiSourceCode);},_editorClosed:function(event)
+{var uiSourceCode=(event.data.uiSourceCode);var wasSelected=(event.data.wasSelected);if(wasSelected)
+this._updateButton(null);this._discardFormattedUISourceCodeScript(uiSourceCode);},_updateButton:function(uiSourceCode)
+{this._button.element.classList.toggle("hidden",!this._isFormatableScript(uiSourceCode));},button:function(sourcesView)
+{if(this._button)
+return this._button.element;this._sourcesView=sourcesView;this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorSelected,this._editorSelected.bind(this));this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorClosed,this._editorClosed.bind(this));this._button=new WebInspector.StatusBarButton(WebInspector.UIString("Pretty print"),"sources-toggle-pretty-print-status-bar-item");this._button.toggled=false;this._button.addEventListener("click",this._toggleFormatScriptSource,this);this._updateButton(null);return this._button.element;},_isFormatableScript:function(uiSourceCode)
+{if(!uiSourceCode)
+return false;var projectType=uiSourceCode.project().type();if(projectType!==WebInspector.projectTypes.Network&&projectType!==WebInspector.projectTypes.Debugger)
+return false;var contentType=uiSourceCode.contentType();return contentType===WebInspector.resourceTypes.Script||contentType===WebInspector.resourceTypes.Document;},_toggleFormatScriptSource:function()
+{var uiSourceCode=this._sourcesView.currentUISourceCode();if(!this._isFormatableScript(uiSourceCode))
+return;this._formatUISourceCodeScript(uiSourceCode);WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.TogglePrettyPrint,enabled:true,url:uiSourceCode.originURL()});},_formatUISourceCodeScript:function(uiSourceCode)
+{this._scriptMapping._performUISourceCodeScriptFormatting(uiSourceCode,innerCallback.bind(this));function innerCallback(formattedUISourceCode,mapping)
+{if(!formattedUISourceCode)
+return;if(uiSourceCode!==this._sourcesView.currentUISourceCode())
+return;var sourceFrame=this._sourcesView.viewForFile(uiSourceCode);var start=[0,0];if(sourceFrame){var selection=sourceFrame.selection();start=mapping.originalToFormatted(selection.startLine,selection.startColumn);}
+this._sourcesView.showSourceLocation(formattedUISourceCode,start[0],start[1]);this._updateButton(formattedUISourceCode);}},_discardFormattedUISourceCodeScript:function(uiSourceCode)
+{this._scriptMapping._discardFormattedUISourceCodeScript(uiSourceCode);}};WebInspector.InplaceFormatterEditorAction=function()
+{}
+WebInspector.InplaceFormatterEditorAction.prototype={_editorSelected:function(event)
+{var uiSourceCode=(event.data);this._updateButton(uiSourceCode);},_editorClosed:function(event)
+{var wasSelected=(event.data.wasSelected);if(wasSelected)
+this._updateButton(null);},_updateButton:function(uiSourceCode)
+{this._button.element.classList.toggle("hidden",!this._isFormattable(uiSourceCode));},button:function(sourcesView)
+{if(this._button)
+return this._button.element;this._sourcesView=sourcesView;this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorSelected,this._editorSelected.bind(this));this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorClosed,this._editorClosed.bind(this));this._button=new WebInspector.StatusBarButton(WebInspector.UIString("Format"),"sources-toggle-pretty-print-status-bar-item");this._button.toggled=false;this._button.addEventListener("click",this._formatSourceInPlace,this);this._updateButton(null);return this._button.element;},_isFormattable:function(uiSourceCode)
+{if(!uiSourceCode)
+return false;return uiSourceCode.contentType()===WebInspector.resourceTypes.Stylesheet||uiSourceCode.project().type()===WebInspector.projectTypes.Snippets;},_formatSourceInPlace:function()
+{var uiSourceCode=this._sourcesView.currentUISourceCode();if(!this._isFormattable(uiSourceCode))
+return;if(uiSourceCode.isDirty())
+contentLoaded.call(this,uiSourceCode.workingCopy());else
+uiSourceCode.requestContent(contentLoaded.bind(this));function contentLoaded(content)
+{var formatter=WebInspector.Formatter.createFormatter(uiSourceCode.contentType());formatter.formatContent(uiSourceCode.highlighterType(),content||"",innerCallback.bind(this));}
+function innerCallback(formattedContent,formatterMapping)
+{if(uiSourceCode.workingCopy()===formattedContent)
+return;var sourceFrame=this._sourcesView.viewForFile(uiSourceCode);var start=[0,0];if(sourceFrame){var selection=sourceFrame.selection();start=formatterMapping.originalToFormatted(selection.startLine,selection.startColumn);}
+uiSourceCode.setWorkingCopy(formattedContent);this._sourcesView.showSourceLocation(uiSourceCode,start[0],start[1]);}},};WebInspector.Formatter=function()
+{}
+WebInspector.Formatter.createFormatter=function(contentType)
+{if(contentType===WebInspector.resourceTypes.Script||contentType===WebInspector.resourceTypes.Document||contentType===WebInspector.resourceTypes.Stylesheet)
+return new WebInspector.ScriptFormatter();return new WebInspector.IdentityFormatter();}
+WebInspector.Formatter.locationToPosition=function(lineEndings,lineNumber,columnNumber)
+{var position=lineNumber?lineEndings[lineNumber-1]+1:0;return position+columnNumber;}
+WebInspector.Formatter.positionToLocation=function(lineEndings,position)
+{var lineNumber=lineEndings.upperBound(position-1);if(!lineNumber)
+var columnNumber=position;else
+var columnNumber=position-lineEndings[lineNumber-1]-1;return[lineNumber,columnNumber];}
+WebInspector.Formatter.prototype={formatContent:function(mimeType,content,callback)
+{}}
+WebInspector.ScriptFormatter=function()
+{this._tasks=[];}
+WebInspector.ScriptFormatter.prototype={formatContent:function(mimeType,content,callback)
+{content=content.replace(/\r\n?|[\n\u2028\u2029]/g,"\n").replace(/^\uFEFF/,'');const method="format";var parameters={mimeType:mimeType,content:content,indentString:WebInspector.settings.textEditorIndent.get()};this._tasks.push({data:parameters,callback:callback});this._worker.postMessage({method:method,params:parameters});},_didFormatContent:function(event)
+{var task=this._tasks.shift();var originalContent=task.data.content;var formattedContent=event.data.content;var mapping=event.data["mapping"];var sourceMapping=new WebInspector.FormatterSourceMappingImpl(originalContent.lineEndings(),formattedContent.lineEndings(),mapping);task.callback(formattedContent,sourceMapping);},get _worker()
+{if(!this._cachedWorker){this._cachedWorker=new Worker("ScriptFormatterWorker.js");this._cachedWorker.onmessage=(this._didFormatContent.bind(this));}
+return this._cachedWorker;}}
+WebInspector.IdentityFormatter=function()
+{this._tasks=[];}
+WebInspector.IdentityFormatter.prototype={formatContent:function(mimeType,content,callback)
+{callback(content,new WebInspector.IdentityFormatterSourceMapping());}}
+WebInspector.FormatterMappingPayload=function()
+{this.original=[];this.formatted=[];}
+WebInspector.FormatterSourceMapping=function()
+{}
+WebInspector.FormatterSourceMapping.prototype={originalToFormatted:function(lineNumber,columnNumber){},formattedToOriginal:function(lineNumber,columnNumber){}}
+WebInspector.IdentityFormatterSourceMapping=function()
+{}
+WebInspector.IdentityFormatterSourceMapping.prototype={originalToFormatted:function(lineNumber,columnNumber)
+{return[lineNumber,columnNumber||0];},formattedToOriginal:function(lineNumber,columnNumber)
+{return[lineNumber,columnNumber||0];}}
+WebInspector.FormatterSourceMappingImpl=function(originalLineEndings,formattedLineEndings,mapping)
+{this._originalLineEndings=originalLineEndings;this._formattedLineEndings=formattedLineEndings;this._mapping=mapping;}
+WebInspector.FormatterSourceMappingImpl.prototype={originalToFormatted:function(lineNumber,columnNumber)
+{var originalPosition=WebInspector.Formatter.locationToPosition(this._originalLineEndings,lineNumber,columnNumber||0);var formattedPosition=this._convertPosition(this._mapping.original,this._mapping.formatted,originalPosition||0);return WebInspector.Formatter.positionToLocation(this._formattedLineEndings,formattedPosition);},formattedToOriginal:function(lineNumber,columnNumber)
+{var formattedPosition=WebInspector.Formatter.locationToPosition(this._formattedLineEndings,lineNumber,columnNumber||0);var originalPosition=this._convertPosition(this._mapping.formatted,this._mapping.original,formattedPosition);return WebInspector.Formatter.positionToLocation(this._originalLineEndings,originalPosition||0);},_convertPosition:function(positions1,positions2,position)
+{var index=positions1.upperBound(position)-1;var convertedPosition=positions2[index]+position-positions1[index];if(index<positions2.length-1&&convertedPosition>positions2[index+1])
+convertedPosition=positions2[index+1];return convertedPosition;}};WebInspector.SourcesView=function(workspace,sourcesPanel)
+{WebInspector.VBox.call(this);this.registerRequiredCSS("sourcesView.css");this.element.id="sources-panel-sources-view";this.setMinimumSize(50,25);this._workspace=workspace;this._sourcesPanel=sourcesPanel;this._searchableView=new WebInspector.SearchableView(this);this._searchableView.setMinimalSearchQuerySize(0);this._searchableView.show(this.element);this._sourceFramesByUISourceCode=new Map();var tabbedEditorPlaceholderText=WebInspector.isMac()?WebInspector.UIString("Hit Cmd+O to open a file"):WebInspector.UIString("Hit Ctrl+O to open a file");this._editorContainer=new WebInspector.TabbedEditorContainer(this,"previouslyViewedFiles",tabbedEditorPlaceholderText);this._editorContainer.show(this._searchableView.element);this._editorContainer.addEventListener(WebInspector.TabbedEditorContainer.Events.EditorSelected,this._editorSelected,this);this._editorContainer.addEventListener(WebInspector.TabbedEditorContainer.Events.EditorClosed,this._editorClosed,this);this._historyManager=new WebInspector.EditingLocationHistoryManager(this,this.currentSourceFrame.bind(this));this._scriptViewStatusBarItemsContainer=document.createElement("div");this._scriptViewStatusBarItemsContainer.className="inline-block";this._scriptViewStatusBarTextContainer=document.createElement("div");this._scriptViewStatusBarTextContainer.className="hbox";this._statusBarContainerElement=this.element.createChild("div","sources-status-bar");function appendButtonForExtension(EditorAction)
+{this._statusBarContainerElement.appendChild(EditorAction.button(this));}
+var editorActions=(WebInspector.moduleManager.instances(WebInspector.SourcesView.EditorAction));editorActions.forEach(appendButtonForExtension.bind(this));this._statusBarContainerElement.appendChild(this._scriptViewStatusBarItemsContainer);this._statusBarContainerElement.appendChild(this._scriptViewStatusBarTextContainer);WebInspector.startBatchUpdate();this._workspace.uiSourceCodes().forEach(this._addUISourceCode.bind(this));WebInspector.endBatchUpdate();this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded,this._uiSourceCodeAdded,this);this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved,this._uiSourceCodeRemoved,this);this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillReset,this._projectWillReset.bind(this),this);function handleBeforeUnload(event)
+{if(event.returnValue)
+return;var unsavedSourceCodes=WebInspector.workspace.unsavedSourceCodes();if(!unsavedSourceCodes.length)
+return;event.returnValue=WebInspector.UIString("DevTools have unsaved changes that will be permanently lost.");WebInspector.inspectorView.showPanel("sources");for(var i=0;i<unsavedSourceCodes.length;++i)
+WebInspector.panels.sources.showUISourceCode(unsavedSourceCodes[i]);}
+window.addEventListener("beforeunload",handleBeforeUnload,true);this._shortcuts={};this.element.addEventListener("keydown",this._handleKeyDown.bind(this),false);}
+WebInspector.SourcesView.Events={EditorClosed:"EditorClosed",EditorSelected:"EditorSelected",}
+WebInspector.SourcesView.prototype={registerShortcuts:function(registerShortcutDelegate)
+{function registerShortcut(shortcuts,handler)
+{registerShortcutDelegate(shortcuts,handler);this._registerShortcuts(shortcuts,handler);}
+registerShortcut.call(this,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToPreviousLocation,this._onJumpToPreviousLocation.bind(this));registerShortcut.call(this,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToNextLocation,this._onJumpToNextLocation.bind(this));registerShortcut.call(this,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.CloseEditorTab,this._onCloseEditorTab.bind(this));registerShortcut.call(this,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToLine,this._showGoToLineDialog.bind(this));registerShortcut.call(this,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToMember,this._showOutlineDialog.bind(this));registerShortcut.call(this,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleBreakpoint,this._toggleBreakpoint.bind(this));registerShortcut.call(this,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.Save,this._save.bind(this));},_registerShortcuts:function(keys,handler)
+{for(var i=0;i<keys.length;++i)
+this._shortcuts[keys[i].key]=handler;},_handleKeyDown:function(event)
+{var shortcutKey=WebInspector.KeyboardShortcut.makeKeyFromEvent(event);var handler=this._shortcuts[shortcutKey];if(handler&&handler())
+event.consume(true);},statusBarContainerElement:function()
+{return this._statusBarContainerElement;},defaultFocusedElement:function()
+{return this._editorContainer.view.defaultFocusedElement();},searchableView:function()
+{return this._searchableView;},visibleView:function()
+{return this._editorContainer.visibleView;},currentSourceFrame:function()
+{var view=this.visibleView();if(!(view instanceof WebInspector.SourceFrame))
+return null;return(view);},currentUISourceCode:function()
+{return this._currentUISourceCode;},_onCloseEditorTab:function(event)
+{var uiSourceCode=this.currentUISourceCode();if(!uiSourceCode)
+return false;this._editorContainer.closeFile(uiSourceCode);return true;},_onJumpToPreviousLocation:function(event)
+{this._historyManager.rollback();return true;},_onJumpToNextLocation:function(event)
+{this._historyManager.rollover();return true;},_uiSourceCodeAdded:function(event)
+{var uiSourceCode=(event.data);this._addUISourceCode(uiSourceCode);},_addUISourceCode:function(uiSourceCode)
+{if(uiSourceCode.project().isServiceProject())
+return;this._editorContainer.addUISourceCode(uiSourceCode);var currentUISourceCode=this._currentUISourceCode;if(currentUISourceCode&&currentUISourceCode.project().isServiceProject()&&currentUISourceCode!==uiSourceCode&&currentUISourceCode.url===uiSourceCode.url){this._showFile(uiSourceCode);this._editorContainer.removeUISourceCode(currentUISourceCode);}},_uiSourceCodeRemoved:function(event)
+{var uiSourceCode=(event.data);this._removeUISourceCodes([uiSourceCode]);},_removeUISourceCodes:function(uiSourceCodes)
+{for(var i=0;i<uiSourceCodes.length;++i){this._removeSourceFrame(uiSourceCodes[i]);this._historyManager.removeHistoryForSourceCode(uiSourceCodes[i]);}
+this._editorContainer.removeUISourceCodes(uiSourceCodes);},_projectWillReset:function(event)
+{var project=event.data;var uiSourceCodes=project.uiSourceCodes();this._removeUISourceCodes(uiSourceCodes);if(project.type()===WebInspector.projectTypes.Network)
+this._editorContainer.reset();},_updateScriptViewStatusBarItems:function()
+{this._scriptViewStatusBarItemsContainer.removeChildren();this._scriptViewStatusBarTextContainer.removeChildren();var sourceFrame=this.currentSourceFrame();if(!sourceFrame)
+return;var statusBarItems=sourceFrame.statusBarItems()||[];for(var i=0;i<statusBarItems.length;++i)
+this._scriptViewStatusBarItemsContainer.appendChild(statusBarItems[i]);var statusBarText=sourceFrame.statusBarText();if(statusBarText)
+this._scriptViewStatusBarTextContainer.appendChild(statusBarText);},showSourceLocation:function(uiSourceCode,lineNumber,columnNumber,omitFocus,omitHighlight)
+{this._historyManager.updateCurrentState();var sourceFrame=this._showFile(uiSourceCode);if(typeof lineNumber==="number")
+sourceFrame.revealPosition(lineNumber,columnNumber,!omitHighlight);this._historyManager.pushNewState();if(!omitFocus)
+sourceFrame.focus();WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction,{action:WebInspector.UserMetrics.UserActionNames.OpenSourceLink,url:uiSourceCode.originURL(),lineNumber:lineNumber});},_showFile:function(uiSourceCode)
+{var sourceFrame=this._getOrCreateSourceFrame(uiSourceCode);if(this._currentUISourceCode===uiSourceCode)
+return sourceFrame;this._currentUISourceCode=uiSourceCode;this._editorContainer.showFile(uiSourceCode);this._updateScriptViewStatusBarItems();return sourceFrame;},_createSourceFrame:function(uiSourceCode)
+{var sourceFrame;switch(uiSourceCode.contentType()){case WebInspector.resourceTypes.Script:sourceFrame=new WebInspector.JavaScriptSourceFrame(this._sourcesPanel,uiSourceCode);break;case WebInspector.resourceTypes.Document:sourceFrame=new WebInspector.JavaScriptSourceFrame(this._sourcesPanel,uiSourceCode);break;case WebInspector.resourceTypes.Stylesheet:sourceFrame=new WebInspector.CSSSourceFrame(uiSourceCode);break;default:sourceFrame=new WebInspector.UISourceCodeFrame(uiSourceCode);break;}
+sourceFrame.setHighlighterType(uiSourceCode.highlighterType());this._sourceFramesByUISourceCode.put(uiSourceCode,sourceFrame);this._historyManager.trackSourceFrameCursorJumps(sourceFrame);return sourceFrame;},_getOrCreateSourceFrame:function(uiSourceCode)
+{return this._sourceFramesByUISourceCode.get(uiSourceCode)||this._createSourceFrame(uiSourceCode);},_sourceFrameMatchesUISourceCode:function(sourceFrame,uiSourceCode)
+{switch(uiSourceCode.contentType()){case WebInspector.resourceTypes.Script:case WebInspector.resourceTypes.Document:return sourceFrame instanceof WebInspector.JavaScriptSourceFrame;case WebInspector.resourceTypes.Stylesheet:return sourceFrame instanceof WebInspector.CSSSourceFrame;default:return!(sourceFrame instanceof WebInspector.JavaScriptSourceFrame);}},_recreateSourceFrameIfNeeded:function(uiSourceCode)
+{var oldSourceFrame=this._sourceFramesByUISourceCode.get(uiSourceCode);if(!oldSourceFrame)
+return;if(this._sourceFrameMatchesUISourceCode(oldSourceFrame,uiSourceCode)){oldSourceFrame.setHighlighterType(uiSourceCode.highlighterType());}else{this._editorContainer.removeUISourceCode(uiSourceCode);this._removeSourceFrame(uiSourceCode);}},viewForFile:function(uiSourceCode)
+{return this._getOrCreateSourceFrame(uiSourceCode);},_removeSourceFrame:function(uiSourceCode)
+{var sourceFrame=this._sourceFramesByUISourceCode.get(uiSourceCode);if(!sourceFrame)
+return;this._sourceFramesByUISourceCode.remove(uiSourceCode);sourceFrame.dispose();},clearCurrentExecutionLine:function()
+{if(this._executionSourceFrame)
+this._executionSourceFrame.clearExecutionLine();delete this._executionSourceFrame;},setExecutionLine:function(uiLocation)
+{var sourceFrame=this._getOrCreateSourceFrame(uiLocation.uiSourceCode);sourceFrame.setExecutionLine(uiLocation.lineNumber);this._executionSourceFrame=sourceFrame;},_editorClosed:function(event)
+{var uiSourceCode=(event.data);this._historyManager.removeHistoryForSourceCode(uiSourceCode);var wasSelected=false;if(this._currentUISourceCode===uiSourceCode){delete this._currentUISourceCode;wasSelected=true;}
+this._updateScriptViewStatusBarItems();this._searchableView.resetSearch();var data={};data.uiSourceCode=uiSourceCode;data.wasSelected=wasSelected;this.dispatchEventToListeners(WebInspector.SourcesView.Events.EditorClosed,data);},_editorSelected:function(event)
+{var uiSourceCode=(event.data.currentFile);var shouldUseHistoryManager=uiSourceCode!==this._currentUISourceCode&&event.data.userGesture;if(shouldUseHistoryManager)
+this._historyManager.updateCurrentState();var sourceFrame=this._showFile(uiSourceCode);if(shouldUseHistoryManager)
+this._historyManager.pushNewState();this._searchableView.setReplaceable(!!sourceFrame&&sourceFrame.canEditSource());this._searchableView.resetSearch();this.dispatchEventToListeners(WebInspector.SourcesView.Events.EditorSelected,uiSourceCode);},sourceRenamed:function(uiSourceCode)
+{this._recreateSourceFrameIfNeeded(uiSourceCode);},searchCanceled:function()
+{if(this._searchView)
+this._searchView.searchCanceled();delete this._searchView;delete this._searchQuery;},performSearch:function(query,shouldJump)
+{this._searchableView.updateSearchMatchesCount(0);var sourceFrame=this.currentSourceFrame();if(!sourceFrame)
+return;this._searchView=sourceFrame;this._searchQuery=query;function finishedCallback(view,searchMatches)
+{if(!searchMatches)
+return;this._searchableView.updateSearchMatchesCount(searchMatches);}
+function currentMatchChanged(currentMatchIndex)
+{this._searchableView.updateCurrentMatchIndex(currentMatchIndex);}
+function searchResultsChanged()
+{this._searchableView.cancelSearch();}
+this._searchView.performSearch(query,shouldJump,finishedCallback.bind(this),currentMatchChanged.bind(this),searchResultsChanged.bind(this));},jumpToNextSearchResult:function()
+{if(!this._searchView)
+return;if(this._searchView!==this.currentSourceFrame()){this.performSearch(this._searchQuery,true);return;}
+this._searchView.jumpToNextSearchResult();},jumpToPreviousSearchResult:function()
+{if(!this._searchView)
+return;if(this._searchView!==this.currentSourceFrame()){this.performSearch(this._searchQuery,true);if(this._searchView)
+this._searchView.jumpToLastSearchResult();return;}
+this._searchView.jumpToPreviousSearchResult();},replaceSelectionWith:function(text)
+{var sourceFrame=this.currentSourceFrame();if(!sourceFrame){console.assert(sourceFrame);return;}
+sourceFrame.replaceSelectionWith(text);},replaceAllWith:function(query,text)
+{var sourceFrame=this.currentSourceFrame();if(!sourceFrame){console.assert(sourceFrame);return;}
+sourceFrame.replaceAllWith(query,text);},_showOutlineDialog:function(event)
+{var uiSourceCode=this._editorContainer.currentFile();if(!uiSourceCode)
+return false;switch(uiSourceCode.contentType()){case WebInspector.resourceTypes.Document:case WebInspector.resourceTypes.Script:WebInspector.JavaScriptOutlineDialog.show(this,uiSourceCode,this.showSourceLocation.bind(this,uiSourceCode));return true;case WebInspector.resourceTypes.Stylesheet:WebInspector.StyleSheetOutlineDialog.show(this,uiSourceCode,this.showSourceLocation.bind(this,uiSourceCode));return true;}
+return false;},showOpenResourceDialog:function(query)
+{var uiSourceCodes=this._editorContainer.historyUISourceCodes();var defaultScores=new Map();for(var i=1;i<uiSourceCodes.length;++i)
+defaultScores.put(uiSourceCodes[i],uiSourceCodes.length-i);WebInspector.OpenResourceDialog.show(this,this.element,query,defaultScores);},_showGoToLineDialog:function(event)
+{if(this._currentUISourceCode)
+this.showOpenResourceDialog(":");return true;},_save:function()
+{var sourceFrame=this.currentSourceFrame();if(!sourceFrame)
+return true;if(!(sourceFrame instanceof WebInspector.UISourceCodeFrame))
+return true;var uiSourceCodeFrame=(sourceFrame);uiSourceCodeFrame.commitEditing();return true;},_toggleBreakpoint:function()
+{var sourceFrame=this.currentSourceFrame();if(!sourceFrame)
+return false;if(sourceFrame instanceof WebInspector.JavaScriptSourceFrame){var javaScriptSourceFrame=(sourceFrame);javaScriptSourceFrame.toggleBreakpointOnCurrentLine();return true;}
+return false;},toggleBreakpointsActiveState:function(active)
+{this._editorContainer.view.element.classList.toggle("breakpoints-deactivated",!active);},__proto__:WebInspector.VBox.prototype}
+WebInspector.SourcesView.EditorAction=function()
+{}
+WebInspector.SourcesView.EditorAction.prototype={button:function(sourcesView){}};WebInspector.SourcesPanel=function(workspaceForTest)
+{WebInspector.Panel.call(this,"sources");this.registerRequiredCSS("sourcesPanel.css");this.registerRequiredCSS("textPrompt.css");new WebInspector.UpgradeFileSystemDropTarget(this.element);WebInspector.settings.showEditorInDrawer=WebInspector.settings.createSetting("showEditorInDrawer",true);this._workspace=workspaceForTest||WebInspector.workspace;var helpSection=WebInspector.shortcutsScreen.section(WebInspector.UIString("Sources Panel"));this.debugToolbar=this._createDebugToolbar();this._debugToolbarDrawer=this._createDebugToolbarDrawer();this.threadsToolbar=new WebInspector.ThreadsToolbar();const initialDebugSidebarWidth=225;this._splitView=new WebInspector.SplitView(true,true,"sourcesPanelSplitViewState",initialDebugSidebarWidth);this._splitView.enableShowModeSaving();this._splitView.show(this.element);const initialNavigatorWidth=225;this.editorView=new WebInspector.SplitView(true,false,"sourcesPanelNavigatorSplitViewState",initialNavigatorWidth);this.editorView.enableShowModeSaving();this.editorView.element.id="scripts-editor-split-view";this.editorView.element.tabIndex=0;this.editorView.show(this._splitView.mainElement());this._navigator=new WebInspector.SourcesNavigator(this._workspace);this._navigator.view.setMinimumSize(Preferences.minSidebarWidth,25);this._navigator.view.show(this.editorView.sidebarElement());this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.SourceSelected,this._sourceSelected,this);this._navigator.addEventListener(WebInspector.SourcesNavigator.Events.SourceRenamed,this._sourceRenamed,this);this._sourcesView=new WebInspector.SourcesView(this._workspace,this);this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorSelected,this._editorSelected.bind(this));this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorClosed,this._editorClosed.bind(this));this._sourcesView.registerShortcuts(this.registerShortcuts.bind(this));this._drawerEditorView=new WebInspector.SourcesPanel.DrawerEditorView();this._sourcesView.show(this._drawerEditorView.element);this._debugSidebarResizeWidgetElement=document.createElementWithClass("div","resizer-widget");this._debugSidebarResizeWidgetElement.id="scripts-debug-sidebar-resizer-widget";this._splitView.addEventListener(WebInspector.SplitView.Events.ShowModeChanged,this._updateDebugSidebarResizeWidget,this);this._updateDebugSidebarResizeWidget();this._splitView.installResizer(this._debugSidebarResizeWidgetElement);this.sidebarPanes={};this.sidebarPanes.watchExpressions=new WebInspector.WatchExpressionsSidebarPane();this.sidebarPanes.callstack=new WebInspector.CallStackSidebarPane();this.sidebarPanes.callstack.addEventListener(WebInspector.CallStackSidebarPane.Events.CallFrameSelected,this._callFrameSelectedInSidebar.bind(this));this.sidebarPanes.callstack.addEventListener(WebInspector.CallStackSidebarPane.Events.CallFrameRestarted,this._callFrameRestartedInSidebar.bind(this));this.sidebarPanes.callstack.registerShortcuts(this.registerShortcuts.bind(this));this.sidebarPanes.scopechain=new WebInspector.ScopeChainSidebarPane();this.sidebarPanes.jsBreakpoints=new WebInspector.JavaScriptBreakpointsSidebarPane(WebInspector.debuggerModel,WebInspector.breakpointManager,this.showUISourceCode.bind(this));this.sidebarPanes.domBreakpoints=WebInspector.domBreakpointsSidebarPane.createProxy(this);this.sidebarPanes.xhrBreakpoints=new WebInspector.XHRBreakpointsSidebarPane();this.sidebarPanes.eventListenerBreakpoints=new WebInspector.EventListenerBreakpointsSidebarPane();if(Capabilities.isMainFrontend)
+this.sidebarPanes.workerList=new WebInspector.WorkersSidebarPane();this._extensionSidebarPanes=[];this._installDebuggerSidebarController();WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged,this._dockSideChanged.bind(this));WebInspector.settings.splitVerticallyWhenDockedToRight.addChangeListener(this._dockSideChanged.bind(this));this._dockSideChanged();this._updateDebuggerButtons();this._pauseOnExceptionEnabledChanged();if(WebInspector.debuggerModel.isPaused())
+this._showDebuggerPausedDetails();WebInspector.settings.pauseOnExceptionEnabled.addChangeListener(this._pauseOnExceptionEnabledChanged,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled,this._debuggerWasEnabled,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled,this._debuggerWasDisabled,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused,this._debuggerPaused,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed,this._debuggerResumed,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.CallFrameSelected,this._callFrameSelected,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ConsoleCommandEvaluatedInSelectedCallFrame,this._consoleCommandEvaluatedInSelectedCallFrame,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointsActiveStateChanged,this._breakpointsActiveStateChanged,this);WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared,this._debuggerReset,this);}
+WebInspector.SourcesPanel.minToolbarWidth=215;WebInspector.SourcesPanel.prototype={defaultFocusedElement:function()
+{return this._sourcesView.defaultFocusedElement()||this._navigator.view.defaultFocusedElement();},get paused()
+{return this._paused;},_drawerEditor:function()
+{var drawerEditorInstance=WebInspector.moduleManager.instance(WebInspector.DrawerEditor);console.assert(drawerEditorInstance instanceof WebInspector.SourcesPanel.DrawerEditor,"WebInspector.DrawerEditor module instance does not use WebInspector.SourcesPanel.DrawerEditor as an implementation. ");return(drawerEditorInstance);},wasShown:function()
+{this._drawerEditor()._panelWasShown();this._sourcesView.show(this.editorView.mainElement());WebInspector.Panel.prototype.wasShown.call(this);},willHide:function()
+{WebInspector.Panel.prototype.willHide.call(this);this._drawerEditor()._panelWillHide();this._sourcesView.show(this._drawerEditorView.element);},searchableView:function()
+{return this._sourcesView.searchableView();},_consoleCommandEvaluatedInSelectedCallFrame:function(event)
+{this.sidebarPanes.scopechain.update(WebInspector.debuggerModel.selectedCallFrame());},_debuggerPaused:function()
+{WebInspector.inspectorView.setCurrentPanel(this);this._showDebuggerPausedDetails();},_showDebuggerPausedDetails:function()
+{var details=WebInspector.debuggerModel.debuggerPausedDetails();this._paused=true;this._waitingToPause=false;this._updateDebuggerButtons();this.sidebarPanes.callstack.update(details.callFrames,details.asyncStackTrace);function didCreateBreakpointHitStatusMessage(element)
+{this.sidebarPanes.callstack.setStatus(element);}
+function didGetUILocation(uiLocation)
+{var breakpoint=WebInspector.breakpointManager.findBreakpointOnLine(uiLocation.uiSourceCode,uiLocation.lineNumber);if(!breakpoint)
+return;this.sidebarPanes.jsBreakpoints.highlightBreakpoint(breakpoint);this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a JavaScript breakpoint."));}
+if(details.reason===WebInspector.DebuggerModel.BreakReason.DOM){WebInspector.domBreakpointsSidebarPane.highlightBreakpoint(details.auxData);WebInspector.domBreakpointsSidebarPane.createBreakpointHitStatusMessage(details.auxData,didCreateBreakpointHitStatusMessage.bind(this));}else if(details.reason===WebInspector.DebuggerModel.BreakReason.EventListener){var eventName=details.auxData.eventName;this.sidebarPanes.eventListenerBreakpoints.highlightBreakpoint(details.auxData.eventName);var eventNameForUI=WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI(eventName,details.auxData);this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a \"%s\" Event Listener.",eventNameForUI));}else if(details.reason===WebInspector.DebuggerModel.BreakReason.XHR){this.sidebarPanes.xhrBreakpoints.highlightBreakpoint(details.auxData["breakpointURL"]);this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a XMLHttpRequest."));}else if(details.reason===WebInspector.DebuggerModel.BreakReason.Exception)
+this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on exception: '%s'.",details.auxData.description));else if(details.reason===WebInspector.DebuggerModel.BreakReason.Assert)
+this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on assertion."));else if(details.reason===WebInspector.DebuggerModel.BreakReason.CSPViolation)
+this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a script blocked due to Content Security Policy directive: \"%s\".",details.auxData["directiveText"]));else if(details.reason===WebInspector.DebuggerModel.BreakReason.DebugCommand)
+this.sidebarPanes.callstack.setStatus(WebInspector.UIString("Paused on a debugged function"));else{if(details.callFrames.length)
+details.callFrames[0].createLiveLocation(didGetUILocation.bind(this));else
+console.warn("ScriptsPanel paused, but callFrames.length is zero.");}
+this._splitView.showBoth(true);this._toggleDebuggerSidebarButton.setEnabled(false);window.focus();InspectorFrontendHost.bringToFront();},_debuggerResumed:function()
+{this._paused=false;this._waitingToPause=false;this._clearInterface();this._toggleDebuggerSidebarButton.setEnabled(true);},_debuggerWasEnabled:function()
+{this._updateDebuggerButtons();},_debuggerWasDisabled:function()
+{this._debuggerReset();},_debuggerReset:function()
+{this._debuggerResumed();this.sidebarPanes.watchExpressions.reset();delete this._skipExecutionLineRevealing;},get visibleView()
+{return this._sourcesView.visibleView();},showUISourceCode:function(uiSourceCode,lineNumber,columnNumber,forceShowInPanel)
+{this._showEditor(forceShowInPanel);this._sourcesView.showSourceLocation(uiSourceCode,lineNumber,columnNumber);},_showEditor:function(forceShowInPanel)
+{if(this._sourcesView.isShowing())
+return;if(this._shouldShowEditorInDrawer()&&!forceShowInPanel)
+this._drawerEditor()._show();else
+WebInspector.inspectorView.showPanel("sources");},showUILocation:function(uiLocation,forceShowInPanel)
+{this.showUISourceCode(uiLocation.uiSourceCode,uiLocation.lineNumber,uiLocation.columnNumber,forceShowInPanel);},_shouldShowEditorInDrawer:function()
+{return WebInspector.experimentsSettings.showEditorInDrawer.isEnabled()&&WebInspector.settings.showEditorInDrawer.get()&&WebInspector.inspectorView.isDrawerEditorShown();},_revealInNavigator:function(uiSourceCode)
+{this._navigator.revealUISourceCode(uiSourceCode);},_executionLineChanged:function(uiLocation)
+{this._sourcesView.clearCurrentExecutionLine();this._sourcesView.setExecutionLine(uiLocation);if(this._skipExecutionLineRevealing)
+return;this._skipExecutionLineRevealing=true;this._sourcesView.showSourceLocation(uiLocation.uiSourceCode,uiLocation.lineNumber,0,undefined,true);},_callFrameSelected:function(event)
+{var callFrame=event.data;if(!callFrame)
+return;this.sidebarPanes.scopechain.update(callFrame);this.sidebarPanes.watchExpressions.refreshExpressions();this.sidebarPanes.callstack.setSelectedCallFrame(callFrame);callFrame.createLiveLocation(this._executionLineChanged.bind(this));},_sourceSelected:function(event)
+{var uiSourceCode=(event.data.uiSourceCode);this._sourcesView.showSourceLocation(uiSourceCode,undefined,undefined,!event.data.focusSource)},_sourceRenamed:function(event)
+{var uiSourceCode=(event.data);this._sourcesView.sourceRenamed(uiSourceCode);},_pauseOnExceptionEnabledChanged:function()
+{var enabled=WebInspector.settings.pauseOnExceptionEnabled.get();this._pauseOnExceptionButton.toggled=enabled;this._pauseOnExceptionButton.title=WebInspector.UIString(enabled?"Don't pause on exceptions.":"Pause on exceptions.");this._debugToolbarDrawer.classList.toggle("expanded",enabled);},_updateDebuggerButtons:function()
+{if(this._paused){this._updateButtonTitle(this._pauseButton,WebInspector.UIString("Resume script execution (%s)."))
+this._pauseButton.state=true;this._pauseButton.setLongClickOptionsEnabled((function(){return[this._longResumeButton]}).bind(this));this._pauseButton.setEnabled(true);this._stepOverButton.setEnabled(true);this._stepIntoButton.setEnabled(true);this._stepOutButton.setEnabled(true);}else{this._updateButtonTitle(this._pauseButton,WebInspector.UIString("Pause script execution (%s)."))
+this._pauseButton.state=false;this._pauseButton.setLongClickOptionsEnabled(null);this._pauseButton.setEnabled(!this._waitingToPause);this._stepOverButton.setEnabled(false);this._stepIntoButton.setEnabled(false);this._stepOutButton.setEnabled(false);}},_clearInterface:function()
+{this.sidebarPanes.callstack.update(null,null);this.sidebarPanes.scopechain.update(null);this.sidebarPanes.jsBreakpoints.clearBreakpointHighlight();WebInspector.domBreakpointsSidebarPane.clearBreakpointHighlight();this.sidebarPanes.eventListenerBreakpoints.clearBreakpointHighlight();this.sidebarPanes.xhrBreakpoints.clearBreakpointHighlight();this._sourcesView.clearCurrentExecutionLine();this._updateDebuggerButtons();},_togglePauseOnExceptions:function()
+{WebInspector.settings.pauseOnExceptionEnabled.set(!this._pauseOnExceptionButton.toggled);},_runSnippet:function()
+{var uiSourceCode=this._sourcesView.currentUISourceCode();if(uiSourceCode.project().type()!==WebInspector.projectTypes.Snippets)
+return false;WebInspector.scriptSnippetModel.evaluateScriptSnippet(uiSourceCode);return true;},_editorSelected:function(event)
+{var uiSourceCode=(event.data);this._editorChanged(uiSourceCode);},_editorClosed:function(event)
+{var wasSelected=(event.data.wasSelected);if(wasSelected)
+this._editorChanged(null);},_editorChanged:function(uiSourceCode)
+{var isSnippet=uiSourceCode&&uiSourceCode.project().type()===WebInspector.projectTypes.Snippets;this._runSnippetButton.element.classList.toggle("hidden",!isSnippet);},_togglePause:function()
+{if(this._paused){delete this._skipExecutionLineRevealing;this._paused=false;this._waitingToPause=false;WebInspector.debuggerModel.resume();}else{this._waitingToPause=true;WebInspector.debuggerModel.skipAllPauses(false);DebuggerAgent.pause();}
+this._clearInterface();return true;},_longResume:function()
+{if(!this._paused)
+return true;this._paused=false;this._waitingToPause=false;WebInspector.debuggerModel.skipAllPausesUntilReloadOrTimeout(500);WebInspector.debuggerModel.resume();this._clearInterface();return true;},_stepOverClicked:function()
+{if(!this._paused)
+return true;delete this._skipExecutionLineRevealing;this._paused=false;this._clearInterface();WebInspector.debuggerModel.stepOver();return true;},_stepIntoClicked:function()
+{if(!this._paused)
+return true;delete this._skipExecutionLineRevealing;this._paused=false;this._clearInterface();WebInspector.debuggerModel.stepInto();return true;},_stepOutClicked:function()
+{if(!this._paused)
+return true;delete this._skipExecutionLineRevealing;this._paused=false;this._clearInterface();WebInspector.debuggerModel.stepOut();return true;},_callFrameSelectedInSidebar:function(event)
+{var callFrame=(event.data);delete this._skipExecutionLineRevealing;WebInspector.debuggerModel.setSelectedCallFrame(callFrame);},_callFrameRestartedInSidebar:function()
+{delete this._skipExecutionLineRevealing;},continueToLocation:function(rawLocation)
+{if(!this._paused)
+return;delete this._skipExecutionLineRevealing;this._paused=false;this._clearInterface();WebInspector.debuggerModel.continueToLocation(rawLocation);},_toggleBreakpointsClicked:function(event)
+{WebInspector.debuggerModel.setBreakpointsActive(!WebInspector.debuggerModel.breakpointsActive());},_breakpointsActiveStateChanged:function(event)
+{var active=event.data;this._toggleBreakpointsButton.toggled=!active;this.sidebarPanes.jsBreakpoints.listElement.classList.toggle("breakpoints-list-deactivated",!active);this._sourcesView.toggleBreakpointsActiveState(active);if(active)
+this._toggleBreakpointsButton.title=WebInspector.UIString("Deactivate breakpoints.");else
+this._toggleBreakpointsButton.title=WebInspector.UIString("Activate breakpoints.");},_createDebugToolbar:function()
+{var debugToolbar=document.createElement("div");debugToolbar.className="scripts-debug-toolbar";var title,handler;var platformSpecificModifier=WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta;title=WebInspector.UIString("Run snippet (%s).");handler=this._runSnippet.bind(this);this._runSnippetButton=this._createButtonAndRegisterShortcuts("scripts-run-snippet",title,handler,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.RunSnippet);debugToolbar.appendChild(this._runSnippetButton.element);this._runSnippetButton.element.classList.add("hidden");handler=this._togglePause.bind(this);this._pauseButton=this._createButtonAndRegisterShortcuts("scripts-pause","",handler,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.PauseContinue);debugToolbar.appendChild(this._pauseButton.element);title=WebInspector.UIString("Resume with all pauses blocked for 500 ms");this._longResumeButton=new WebInspector.StatusBarButton(title,"scripts-long-resume");this._longResumeButton.addEventListener("click",this._longResume.bind(this),this);title=WebInspector.UIString("Step over next function call (%s).");handler=this._stepOverClicked.bind(this);this._stepOverButton=this._createButtonAndRegisterShortcuts("scripts-step-over",title,handler,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepOver);debugToolbar.appendChild(this._stepOverButton.element);title=WebInspector.UIString("Step into next function call (%s).");handler=this._stepIntoClicked.bind(this);this._stepIntoButton=this._createButtonAndRegisterShortcuts("scripts-step-into",title,handler,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepInto);debugToolbar.appendChild(this._stepIntoButton.element);title=WebInspector.UIString("Step out of current function (%s).");handler=this._stepOutClicked.bind(this);this._stepOutButton=this._createButtonAndRegisterShortcuts("scripts-step-out",title,handler,WebInspector.ShortcutsScreen.SourcesPanelShortcuts.StepOut);debugToolbar.appendChild(this._stepOutButton.element);this._toggleBreakpointsButton=new WebInspector.StatusBarButton(WebInspector.UIString("Deactivate breakpoints."),"scripts-toggle-breakpoints");this._toggleBreakpointsButton.toggled=false;this._toggleBreakpointsButton.addEventListener("click",this._toggleBreakpointsClicked,this);debugToolbar.appendChild(this._toggleBreakpointsButton.element);this._pauseOnExceptionButton=new WebInspector.StatusBarButton("","scripts-pause-on-exceptions-status-bar-item");this._pauseOnExceptionButton.addEventListener("click",this._togglePauseOnExceptions,this);debugToolbar.appendChild(this._pauseOnExceptionButton.element);return debugToolbar;},_createDebugToolbarDrawer:function()
+{var debugToolbarDrawer=document.createElement("div");debugToolbarDrawer.className="scripts-debug-toolbar-drawer";var label=WebInspector.UIString("Pause On Caught Exceptions");var setting=WebInspector.settings.pauseOnCaughtException;debugToolbarDrawer.appendChild(WebInspector.SettingsUI.createSettingCheckbox(label,setting,true));return debugToolbarDrawer;},_updateButtonTitle:function(button,buttonTitle)
+{var hasShortcuts=button.shortcuts&&button.shortcuts.length;if(hasShortcuts)
+button.title=String.vsprintf(buttonTitle,[button.shortcuts[0].name]);else
+button.title=buttonTitle;},_createButtonAndRegisterShortcuts:function(buttonId,buttonTitle,handler,shortcuts)
+{var button=new WebInspector.StatusBarButton(buttonTitle,buttonId);button.element.addEventListener("click",handler,false);button.shortcuts=shortcuts;this._updateButtonTitle(button,buttonTitle);this.registerShortcuts(shortcuts,handler);return button;},addToWatch:function(expression)
+{this.sidebarPanes.watchExpressions.addExpression(expression);},_installDebuggerSidebarController:function()
+{this._toggleNavigatorSidebarButton=this.editorView.createShowHideSidebarButton("navigator","scripts-navigator-show-hide-button");this.editorView.mainElement().appendChild(this._toggleNavigatorSidebarButton.element);this._toggleDebuggerSidebarButton=this._splitView.createShowHideSidebarButton("debugger","scripts-debugger-show-hide-button");this._splitView.mainElement().appendChild(this._toggleDebuggerSidebarButton.element);this._splitView.mainElement().appendChild(this._debugSidebarResizeWidgetElement);},_updateDebugSidebarResizeWidget:function()
+{this._debugSidebarResizeWidgetElement.classList.toggle("hidden",this._splitView.showMode()!==WebInspector.SplitView.ShowMode.Both);},_showLocalHistory:function(uiSourceCode)
+{WebInspector.RevisionHistoryView.showHistory(uiSourceCode);},appendApplicableItems:function(event,contextMenu,target)
+{this._appendUISourceCodeItems(event,contextMenu,target);this._appendRemoteObjectItems(contextMenu,target);},_suggestReload:function()
+{if(window.confirm(WebInspector.UIString("It is recommended to restart inspector after making these changes. Would you like to restart it?")))
+WebInspector.reload();},_mapFileSystemToNetwork:function(uiSourceCode)
+{WebInspector.SelectUISourceCodeForProjectTypeDialog.show(uiSourceCode.name(),WebInspector.projectTypes.Network,mapFileSystemToNetwork.bind(this),this.editorView.mainElement())
+function mapFileSystemToNetwork(networkUISourceCode)
+{this._workspace.addMapping(networkUISourceCode,uiSourceCode,WebInspector.fileSystemWorkspaceProvider);this._suggestReload();}},_removeNetworkMapping:function(uiSourceCode)
+{if(confirm(WebInspector.UIString("Are you sure you want to remove network mapping?"))){this._workspace.removeMapping(uiSourceCode);this._suggestReload();}},_mapNetworkToFileSystem:function(networkUISourceCode)
+{WebInspector.SelectUISourceCodeForProjectTypeDialog.show(networkUISourceCode.name(),WebInspector.projectTypes.FileSystem,mapNetworkToFileSystem.bind(this),this.editorView.mainElement())
+function mapNetworkToFileSystem(uiSourceCode)
+{this._workspace.addMapping(networkUISourceCode,uiSourceCode,WebInspector.fileSystemWorkspaceProvider);}},_appendUISourceCodeMappingItems:function(contextMenu,uiSourceCode)
+{if(uiSourceCode.project().type()===WebInspector.projectTypes.FileSystem){var hasMappings=!!uiSourceCode.url;if(!hasMappings)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Map to network resource\u2026":"Map to Network Resource\u2026"),this._mapFileSystemToNetwork.bind(this,uiSourceCode));else
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Remove network mapping":"Remove Network Mapping"),this._removeNetworkMapping.bind(this,uiSourceCode));}
+function filterProject(project)
+{return project.type()===WebInspector.projectTypes.FileSystem;}
+if(uiSourceCode.project().type()===WebInspector.projectTypes.Network){if(!this._workspace.projects().filter(filterProject).length)
+return;if(this._workspace.uiSourceCodeForURL(uiSourceCode.url)===uiSourceCode)
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Map to file system resource\u2026":"Map to File System Resource\u2026"),this._mapNetworkToFileSystem.bind(this,uiSourceCode));}},_appendUISourceCodeItems:function(event,contextMenu,target)
+{if(!(target instanceof WebInspector.UISourceCode))
+return;var uiSourceCode=(target);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Local modifications\u2026":"Local Modifications\u2026"),this._showLocalHistory.bind(this,uiSourceCode));this._appendUISourceCodeMappingItems(contextMenu,uiSourceCode);if(!event.target.isSelfOrDescendant(this.editorView.sidebarElement())){contextMenu.appendSeparator();contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Reveal in navigator":"Reveal in Navigator"),this._handleContextMenuReveal.bind(this,uiSourceCode));}},_handleContextMenuReveal:function(uiSourceCode)
+{this.editorView.showBoth();this._revealInNavigator(uiSourceCode);},_appendRemoteObjectItems:function(contextMenu,target)
+{if(!(target instanceof WebInspector.RemoteObject))
+return;var remoteObject=(target);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Store as global variable":"Store as Global Variable"),this._saveToTempVariable.bind(this,remoteObject));if(remoteObject.type==="function")
+contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Show function definition":"Show Function Definition"),this._showFunctionDefinition.bind(this,remoteObject));},_saveToTempVariable:function(remoteObject)
+{WebInspector.runtimeModel.evaluate("window","",false,true,false,false,didGetGlobalObject);function didGetGlobalObject(global,wasThrown)
+{function remoteFunction(value)
+{var prefix="temp";var index=1;while((prefix+index)in this)
+++index;var name=prefix+index;this[name]=value;return name;}
+if(wasThrown||!global)
+failedToSave(global);else
+global.callFunction(remoteFunction,[WebInspector.RemoteObject.toCallArgument(remoteObject)],didSave.bind(null,global));}
+function didSave(global,result,wasThrown)
+{global.release();if(wasThrown||!result||result.type!=="string")
+failedToSave(result);else
+WebInspector.console.evaluate(result.value);}
+function failedToSave(result)
+{var message=WebInspector.UIString("Failed to save to temp variable.");if(result){message+=" "+result.description;result.release();}
+WebInspector.console.showErrorMessage(message)}},_showFunctionDefinition:function(remoteObject)
+{function didGetFunctionDetails(error,response)
+{if(error){console.error(error);return;}
+var uiLocation=WebInspector.debuggerModel.rawLocationToUILocation(response.location);if(!uiLocation)
+return;this.showUILocation(uiLocation,true);}
+DebuggerAgent.getFunctionDetails(remoteObject.objectId,didGetFunctionDetails.bind(this));},showGoToSourceDialog:function()
+{this._sourcesView.showOpenResourceDialog();},_dockSideChanged:function()
+{var vertically=WebInspector.dockController.isVertical()&&WebInspector.settings.splitVerticallyWhenDockedToRight.get();this._splitVertically(vertically);},_splitVertically:function(vertically)
+{if(this.sidebarPaneView&&vertically===!this._splitView.isVertical())
+return;if(this.sidebarPaneView)
+this.sidebarPaneView.detach();this._splitView.setVertical(!vertically);if(!vertically)
+this._splitView.uninstallResizer(this._sourcesView.statusBarContainerElement());else
+this._splitView.installResizer(this._sourcesView.statusBarContainerElement());var vbox=new WebInspector.VBox();vbox.element.appendChild(this._debugToolbarDrawer);vbox.element.appendChild(this.debugToolbar);vbox.element.appendChild(this.threadsToolbar.element);vbox.setMinimumSize(WebInspector.SourcesPanel.minToolbarWidth,25);var sidebarPaneStack=new WebInspector.SidebarPaneStack();sidebarPaneStack.element.classList.add("flex-auto");sidebarPaneStack.show(vbox.element);if(!vertically){for(var pane in this.sidebarPanes)
+sidebarPaneStack.addPane(this.sidebarPanes[pane]);this._extensionSidebarPanesContainer=sidebarPaneStack;this.sidebarPaneView=vbox;}else{var splitView=new WebInspector.SplitView(true,true,"sourcesPanelDebuggerSidebarSplitViewState",0.5);vbox.show(splitView.mainElement());sidebarPaneStack.addPane(this.sidebarPanes.callstack);sidebarPaneStack.addPane(this.sidebarPanes.jsBreakpoints);sidebarPaneStack.addPane(this.sidebarPanes.domBreakpoints);sidebarPaneStack.addPane(this.sidebarPanes.xhrBreakpoints);sidebarPaneStack.addPane(this.sidebarPanes.eventListenerBreakpoints);if(this.sidebarPanes.workerList)
+sidebarPaneStack.addPane(this.sidebarPanes.workerList);var tabbedPane=new WebInspector.SidebarTabbedPane();tabbedPane.show(splitView.sidebarElement());tabbedPane.addPane(this.sidebarPanes.scopechain);tabbedPane.addPane(this.sidebarPanes.watchExpressions);this._extensionSidebarPanesContainer=tabbedPane;this.sidebarPaneView=splitView;}
+for(var i=0;i<this._extensionSidebarPanes.length;++i)
+this._extensionSidebarPanesContainer.addPane(this._extensionSidebarPanes[i]);this.sidebarPaneView.show(this._splitView.sidebarElement());this.sidebarPanes.scopechain.expand();this.sidebarPanes.jsBreakpoints.expand();this.sidebarPanes.callstack.expand();if(WebInspector.settings.watchExpressions.get().length>0)
+this.sidebarPanes.watchExpressions.expand();},addExtensionSidebarPane:function(id,pane)
+{this._extensionSidebarPanes.push(pane);this._extensionSidebarPanesContainer.addPane(pane);this.setHideOnDetach();},sourcesView:function()
+{return this._sourcesView;},__proto__:WebInspector.Panel.prototype}
+WebInspector.UpgradeFileSystemDropTarget=function(element)
+{element.addEventListener("dragenter",this._onDragEnter.bind(this),true);element.addEventListener("dragover",this._onDragOver.bind(this),true);this._element=element;}
+WebInspector.UpgradeFileSystemDropTarget.dragAndDropFilesType="Files";WebInspector.UpgradeFileSystemDropTarget.prototype={_onDragEnter:function(event)
+{if(event.dataTransfer.types.indexOf(WebInspector.UpgradeFileSystemDropTarget.dragAndDropFilesType)===-1)
+return;event.consume(true);},_onDragOver:function(event)
+{if(event.dataTransfer.types.indexOf(WebInspector.UpgradeFileSystemDropTarget.dragAndDropFilesType)===-1)
+return;event.dataTransfer.dropEffect="copy";event.consume(true);if(this._dragMaskElement)
+return;this._dragMaskElement=this._element.createChild("div","fill drag-mask");this._dragMaskElement.createChild("div","fill drag-mask-inner").textContent=WebInspector.UIString("Drop workspace folder here");this._dragMaskElement.addEventListener("drop",this._onDrop.bind(this),true);this._dragMaskElement.addEventListener("dragleave",this._onDragLeave.bind(this),true);},_onDrop:function(event)
+{event.consume(true);this._removeMask();var items=(event.dataTransfer.items);if(!items.length)
+return;var entry=items[0].webkitGetAsEntry();if(!entry.isDirectory)
+return;InspectorFrontendHost.upgradeDraggedFileSystemPermissions(entry.filesystem);},_onDragLeave:function(event)
+{event.consume(true);this._removeMask();},_removeMask:function()
+{this._dragMaskElement.remove();delete this._dragMaskElement;}}
+WebInspector.SourcesPanel.DrawerEditor=function()
+{this._panel=WebInspector.inspectorView.panel("sources");}
+WebInspector.SourcesPanel.DrawerEditor.prototype={view:function()
+{return this._panel._drawerEditorView;},installedIntoDrawer:function()
+{if(this._panel.isShowing())
+this._panelWasShown();else
+this._panelWillHide();},_panelWasShown:function()
+{WebInspector.inspectorView.setDrawerEditorAvailable(false);WebInspector.inspectorView.hideDrawerEditor();},_panelWillHide:function()
+{WebInspector.inspectorView.setDrawerEditorAvailable(true);if(WebInspector.inspectorView.isDrawerEditorShown())
+WebInspector.inspectorView.showDrawerEditor();},_show:function()
+{WebInspector.inspectorView.showDrawerEditor();},}
+WebInspector.SourcesPanel.DrawerEditorView=function()
+{WebInspector.VBox.call(this);this.element.id="drawer-editor-view";}
+WebInspector.SourcesPanel.DrawerEditorView.prototype={__proto__:WebInspector.VBox.prototype}
+WebInspector.SourcesPanel.ContextMenuProvider=function()
+{}
+WebInspector.SourcesPanel.ContextMenuProvider.prototype={appendApplicableItems:function(event,contextMenu,target)
+{WebInspector.inspectorView.panel("sources").appendApplicableItems(event,contextMenu,target);}}
+WebInspector.SourcesPanel.UILocationRevealer=function()
+{}
+WebInspector.SourcesPanel.UILocationRevealer.prototype={reveal:function(uiLocation)
+{if(uiLocation instanceof WebInspector.UILocation)
+(WebInspector.inspectorView.panel("sources")).showUILocation(uiLocation);}}
+WebInspector.SourcesPanel.ShowGoToSourceDialogActionDelegate=function(){}
+WebInspector.SourcesPanel.ShowGoToSourceDialogActionDelegate.prototype={handleAction:function()
+{(WebInspector.inspectorView.showPanel("sources")).showGoToSourceDialog();return true;}}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/TempStorageSharedWorker.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/TempStorageSharedWorker.js
new file mode 100644 (file)
index 0000000..21225af
--- /dev/null
@@ -0,0 +1,33 @@
+var ports=[];var isTempStorageCleared=false;var tempStorageError;self.onconnect=function(event)
+{var newPort=(event.ports[0]);if(isTempStorageCleared){notifyTempStorageCleared(newPort);return;}
+newPort.onmessage=handleMessage;newPort.onerror=handleError;ports.push(newPort);if(ports.length===1)
+clearTempStorage();}
+function clearTempStorage()
+{function didFail(e)
+{tempStorageError="Failed to clear temp storage: "+e.message+" "+e.name;console.error(tempStorageError);didClearTempStorage();}
+function didGetFS(fs)
+{fs.root.createReader().readEntries(didReadEntries,didFail);}
+function didReadEntries(entries)
+{var remainingEntries=entries.length;if(!remainingEntries){didClearTempStorage();return;}
+function didDeleteEntry()
+{if(!--remainingEntries)
+didClearTempStorage();}
+function failedToDeleteEntry(e)
+{tempStorageError="Failed to delete entry: "+e.message+" "+e.name;console.error(tempStorageError);didDeleteEntry();}
+for(var i=0;i<entries.length;i++){var entry=entries[i];if(entry.isFile)
+entry.remove(didDeleteEntry,failedToDeleteEntry);else
+entry.removeRecursively(didDeleteEntry,failedToDeleteEntry);}}
+self.webkitRequestFileSystem(self.TEMPORARY,10,didGetFS,didFail);}
+function didClearTempStorage()
+{isTempStorageCleared=true;for(var i=0;i<ports.length;i++)
+notifyTempStorageCleared(ports[i]);ports=null;}
+function notifyTempStorageCleared(port)
+{port.postMessage({type:"tempStorageCleared",error:tempStorageError});}
+function handleMessage(event)
+{if(event.data.type==="disconnect")
+removePort(event.target);}
+function handleError(event)
+{console.error("Error: "+event.data);removePort(event.target);}
+function removePort(port)
+{if(!ports)
+return;var index=ports.indexOf(port);ports.splice(index,1);}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/TimelinePanel.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/TimelinePanel.js
new file mode 100644 (file)
index 0000000..486f5ff
--- /dev/null
@@ -0,0 +1,1083 @@
+WebInspector.CountersGraph=function(delegate,model)
+{WebInspector.SplitView.call(this,true,false);this.element.id="memory-graphs-container";this._delegate=delegate;this._model=model;this._calculator=new WebInspector.TimelineCalculator(this._model);this._graphsContainer=this.mainElement();this._createCurrentValuesBar();this._canvasView=new WebInspector.VBoxWithResizeCallback(this._resize.bind(this));this._canvasView.show(this._graphsContainer);this._canvasContainer=this._canvasView.element;this._canvasContainer.id="memory-graphs-canvas-container";this._canvas=this._canvasContainer.createChild("canvas");this._canvas.id="memory-counters-graph";this._canvasContainer.addEventListener("mouseover",this._onMouseMove.bind(this),true);this._canvasContainer.addEventListener("mousemove",this._onMouseMove.bind(this),true);this._canvasContainer.addEventListener("mouseout",this._onMouseOut.bind(this),true);this._canvasContainer.addEventListener("click",this._onClick.bind(this),true);this._timelineGrid=new WebInspector.TimelineGrid();this._canvasContainer.appendChild(this._timelineGrid.dividersElement);this.sidebarElement().createChild("div","sidebar-tree sidebar-tree-section").textContent=WebInspector.UIString("COUNTERS");this._counters=[];this._counterUI=[];}
+WebInspector.CountersGraph.prototype={_createCurrentValuesBar:function()
+{this._currentValuesBar=this._graphsContainer.createChild("div");this._currentValuesBar.id="counter-values-bar";},createCounter:function(uiName,uiValueTemplate,color)
+{var counter=new WebInspector.CountersGraph.Counter();this._counters.push(counter);this._counterUI.push(new WebInspector.CountersGraph.CounterUI(this,uiName,uiValueTemplate,color,counter));return counter;},reset:function()
+{for(var i=0;i<this._counters.length;++i){this._counters[i].reset();this._counterUI[i].reset();}
+this.refresh();},_resize:function()
+{var parentElement=this._canvas.parentElement;this._canvas.width=parentElement.clientWidth;this._canvas.height=parentElement.clientHeight;var timelinePaddingLeft=15;this._calculator.setDisplayWindow(timelinePaddingLeft,this._canvas.width);this.refresh();},setWindowTimes:function(startTime,endTime)
+{this._calculator.setWindow(startTime,endTime);this.scheduleRefresh();},scheduleRefresh:function()
+{if(this._refreshTimer)
+return;this._refreshTimer=setTimeout(this.refresh.bind(this),300);},draw:function()
+{for(var i=0;i<this._counters.length;++i){this._counters[i]._calculateVisibleIndexes(this._calculator);this._counters[i]._calculateXValues(this._canvas.width);}
+this._clear();this._setVerticalClip(10,this._canvas.height-20);for(var i=0;i<this._counterUI.length;i++)
+this._drawGraph(this._counterUI[i]);},_onClick:function(event)
+{var x=event.x-this._canvasContainer.totalOffsetLeft();var minDistance=Infinity;var bestTime;for(var i=0;i<this._counterUI.length;++i){var counterUI=this._counterUI[i];if(!counterUI.counter.times.length)
+continue;var index=counterUI._recordIndexAt(x);var distance=Math.abs(x-counterUI.counter.x[index]);if(distance<minDistance){minDistance=distance;bestTime=counterUI.counter.times[index];}}
+if(bestTime!==undefined)
+this._revealRecordAt(bestTime);},_revealRecordAt:function(time)
+{var recordToReveal;function findRecordToReveal(record)
+{if(record.startTime<=time&&time<=record.endTime){recordToReveal=record;return true;}
+if(!recordToReveal||record.endTime<time&&recordToReveal.endTime<record.endTime)
+recordToReveal=record;return false;}
+this._model.forAllRecords(null,findRecordToReveal);this._delegate.selectRecord(recordToReveal);},_onMouseOut:function(event)
+{delete this._markerXPosition;this._clearCurrentValueAndMarker();},_clearCurrentValueAndMarker:function()
+{for(var i=0;i<this._counterUI.length;i++)
+this._counterUI[i]._clearCurrentValueAndMarker();},_onMouseMove:function(event)
+{var x=event.x-this._canvasContainer.totalOffsetLeft();this._markerXPosition=x;this._refreshCurrentValues();},_refreshCurrentValues:function()
+{if(this._markerXPosition===undefined)
+return;for(var i=0;i<this._counterUI.length;++i)
+this._counterUI[i].updateCurrentValue(this._markerXPosition);},refresh:function()
+{delete this._refreshTimer;this._timelineGrid.updateDividers(this._calculator);this.draw();this._refreshCurrentValues();},refreshRecords:function()
+{this.reset();var records=this._model.records();for(var i=0;i<records.length;++i)
+this.addRecord(records[i]);},_setVerticalClip:function(originY,height)
+{this._originY=originY;this._clippedHeight=height;},_clear:function()
+{var ctx=this._canvas.getContext("2d");ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);},highlightSearchResult:function(record,regex,selectRecord)
+{},setSelectedRecord:function(record)
+{},_drawGraph:function(counterUI)
+{var canvas=this._canvas;var ctx=canvas.getContext("2d");var width=canvas.width;var height=this._clippedHeight;var originY=this._originY;var counter=counterUI.counter;var values=counter.values;if(!values.length)
+return;var bounds=counter._calculateBounds();var minValue=bounds.min;var maxValue=bounds.max;counterUI.setRange(minValue,maxValue);if(!counterUI.visible())
+return;var yValues=counterUI.graphYValues;yValues.length=this._counters.length;var maxYRange=maxValue-minValue;var yFactor=maxYRange?height/(maxYRange):1;ctx.save();ctx.translate(0.5,0.5);ctx.beginPath();var value=values[counter._minimumIndex];var currentY=Math.round(originY+height-(value-minValue)*yFactor);ctx.moveTo(0,currentY);for(var i=counter._minimumIndex;i<=counter._maximumIndex;i++){var x=Math.round(counter.x[i]);ctx.lineTo(x,currentY);var currentValue=values[i];if(typeof currentValue!=="undefined")
+value=currentValue;currentY=Math.round(originY+height-(value-minValue)*yFactor);ctx.lineTo(x,currentY);yValues[i]=currentY;}
+ctx.lineTo(width,currentY);ctx.lineWidth=1;ctx.strokeStyle=counterUI.graphColor;ctx.stroke();if(counter._limitValue){var limitLineY=Math.round(originY+height-(counter._limitValue-minValue)*yFactor);ctx.moveTo(0,limitLineY);ctx.lineTo(width,limitLineY);ctx.strokeStyle=counterUI.limitColor;ctx.stroke();}
+ctx.closePath();ctx.restore();},__proto__:WebInspector.SplitView.prototype}
+WebInspector.CountersGraph.Counter=function()
+{this.times=[];this.values=[];}
+WebInspector.CountersGraph.Counter.prototype={appendSample:function(time,value)
+{if(this.values.length&&this.values.peekLast()===value)
+return;this.times.push(time);this.values.push(value);},reset:function()
+{this.times=[];this.values=[];},setLimit:function(value)
+{this._limitValue=value;},_calculateBounds:function()
+{var maxValue;var minValue;for(var i=this._minimumIndex;i<=this._maximumIndex;i++){var value=this.values[i];if(minValue===undefined||value<minValue)
+minValue=value;if(maxValue===undefined||value>maxValue)
+maxValue=value;}
+minValue=minValue||0;maxValue=maxValue||1;if(this._limitValue){if(maxValue>this._limitValue*0.5)
+maxValue=Math.max(maxValue,this._limitValue);minValue=Math.min(minValue,this._limitValue);}
+return{min:minValue,max:maxValue};},_calculateVisibleIndexes:function(calculator)
+{var start=calculator.minimumBoundary();var end=calculator.maximumBoundary();this._minimumIndex=Number.constrain(this.times.upperBound(start)-1,0,this.times.length-1);this._maximumIndex=Number.constrain(this.times.lowerBound(end),0,this.times.length-1);this._minTime=start;this._maxTime=end;},_calculateXValues:function(width)
+{if(!this.values.length)
+return;var xFactor=width/(this._maxTime-this._minTime);this.x=new Array(this.values.length);this.x[this._minimumIndex]=0;for(var i=this._minimumIndex+1;i<this._maximumIndex;i++)
+this.x[i]=xFactor*(this.times[i]-this._minTime);this.x[this._maximumIndex]=width;}}
+WebInspector.CountersGraph.CounterUI=function(memoryCountersPane,title,currentValueLabel,graphColor,counter)
+{this._memoryCountersPane=memoryCountersPane;this.counter=counter;var container=memoryCountersPane.sidebarElement().createChild("div","memory-counter-sidebar-info");var swatchColor=graphColor;this._swatch=new WebInspector.SwatchCheckbox(WebInspector.UIString(title),swatchColor);this._swatch.addEventListener(WebInspector.SwatchCheckbox.Events.Changed,this._toggleCounterGraph.bind(this));container.appendChild(this._swatch.element);this._range=this._swatch.element.createChild("span");this._value=memoryCountersPane._currentValuesBar.createChild("span","memory-counter-value");this._value.style.color=graphColor;this.graphColor=graphColor;this.limitColor=WebInspector.Color.parse(graphColor).setAlpha(0.3).toString(WebInspector.Color.Format.RGBA);this.graphYValues=[];this._currentValueLabel=currentValueLabel;this._marker=memoryCountersPane._canvasContainer.createChild("div","memory-counter-marker");this._marker.style.backgroundColor=graphColor;this._clearCurrentValueAndMarker();}
+WebInspector.CountersGraph.CounterUI.prototype={reset:function()
+{this._range.textContent="";},setRange:function(minValue,maxValue)
+{this._range.textContent=WebInspector.UIString("[%d:%d]",minValue,maxValue);},_toggleCounterGraph:function(event)
+{this._value.classList.toggle("hidden",!this._swatch.checked);this._memoryCountersPane.refresh();},_recordIndexAt:function(x)
+{return this.counter.x.upperBound(x,null,this.counter._minimumIndex+1,this.counter._maximumIndex+1)-1;},updateCurrentValue:function(x)
+{if(!this.visible()||!this.counter.values.length)
+return;var index=this._recordIndexAt(x);this._value.textContent=WebInspector.UIString(this._currentValueLabel,this.counter.values[index]);var y=this.graphYValues[index];this._marker.style.left=x+"px";this._marker.style.top=y+"px";this._marker.classList.remove("hidden");},_clearCurrentValueAndMarker:function()
+{this._value.textContent="";this._marker.classList.add("hidden");},visible:function()
+{return this._swatch.checked;}}
+WebInspector.SwatchCheckbox=function(title,color)
+{this.element=document.createElement("div");this._swatch=this.element.createChild("div","swatch");this.element.createChild("span","title").textContent=title;this._color=color;this.checked=true;this.element.addEventListener("click",this._toggleCheckbox.bind(this),true);}
+WebInspector.SwatchCheckbox.Events={Changed:"Changed"}
+WebInspector.SwatchCheckbox.prototype={get checked()
+{return this._checked;},set checked(v)
+{this._checked=v;if(this._checked)
+this._swatch.style.backgroundColor=this._color;else
+this._swatch.style.backgroundColor="";},_toggleCheckbox:function(event)
+{this.checked=!this.checked;this.dispatchEventToListeners(WebInspector.SwatchCheckbox.Events.Changed);},__proto__:WebInspector.Object.prototype};WebInspector.MemoryCountersGraph=function(delegate,model)
+{WebInspector.CountersGraph.call(this,delegate,model);this._countersByName={};this._countersByName["documents"]=this.createCounter(WebInspector.UIString("Documents"),WebInspector.UIString("Documents: %d"),"#d00");this._countersByName["nodes"]=this.createCounter(WebInspector.UIString("Nodes"),WebInspector.UIString("Nodes: %d"),"#0a0");this._countersByName["jsEventListeners"]=this.createCounter(WebInspector.UIString("Listeners"),WebInspector.UIString("Listeners: %d"),"#00d");if(WebInspector.experimentsSettings.gpuTimeline.isEnabled())
+this._countersByName["gpuMemoryUsedKB"]=this.createCounter(WebInspector.UIString("GPU Memory"),WebInspector.UIString("GPU Memory [KB]: %d"),"#c0c");}
+WebInspector.MemoryCountersGraph.prototype={addRecord:function(record)
+{function addStatistics(record)
+{var counters=record.counters;if(!counters)
+return;for(var name in counters){var counter=this._countersByName[name];if(counter)
+counter.appendSample(record.endTime||record.startTime,counters[name]);}}
+WebInspector.TimelineModel.forAllRecords([record],null,addStatistics.bind(this));this.scheduleRefresh();},__proto__:WebInspector.CountersGraph.prototype};WebInspector.PieChart=function(totalValue,formatter)
+{const shadowOffset=0.04;this.element=document.createElementWithClass("div","pie-chart");var svg=this._createSVGChild(this.element,"svg");svg.setAttribute("width","100%");svg.setAttribute("height",(100*(1+shadowOffset))+"%");this._group=this._createSVGChild(svg,"g");var shadow=this._createSVGChild(this._group,"circle");shadow.setAttribute("r",1);shadow.setAttribute("cy",shadowOffset);shadow.setAttribute("fill","hsl(0,0%,70%)");var background=this._createSVGChild(this._group,"circle");background.setAttribute("r",1);background.setAttribute("fill","hsl(0,0%,92%)");if(totalValue){var totalString=formatter?formatter(totalValue):totalValue;this._totalElement=this.element.createChild("div","pie-chart-foreground");this._totalElement.textContent=totalString;this._totalValue=totalValue;}
+this._lastAngle=-Math.PI/2;this.setSize(100);}
+WebInspector.PieChart.prototype={setTotal:function(value)
+{this._totalValue=value;},setSize:function(value)
+{this._group.setAttribute("transform","scale("+(value/2)+") translate(1,1)");var size=value+"px";this.element.style.width=size;this.element.style.height=size;if(this._totalElement)
+this._totalElement.style.lineHeight=size;},addSlice:function(value,color)
+{var sliceAngle=value/this._totalValue*2*Math.PI;if(!isFinite(sliceAngle))
+return;sliceAngle=Math.min(sliceAngle,2*Math.PI*0.9999);var path=this._createSVGChild(this._group,"path");var x1=Math.cos(this._lastAngle);var y1=Math.sin(this._lastAngle);this._lastAngle+=sliceAngle;var x2=Math.cos(this._lastAngle);var y2=Math.sin(this._lastAngle);var largeArc=sliceAngle>Math.PI?1:0;path.setAttribute("d","M0,0 L"+x1+","+y1+" A1,1,0,"+largeArc+",1,"+x2+","+y2+" Z");path.setAttribute("fill",color);},_createSVGChild:function(parent,childType)
+{var child=document.createElementNS("http://www.w3.org/2000/svg",childType);parent.appendChild(child);return child;}};WebInspector.TimelineModel=function()
+{this._filters=[];this._bindings=new WebInspector.TimelineModel.InterRecordBindings();this.reset();WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded,this._onRecordAdded,this);WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineStarted,this._onStarted,this);WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineStopped,this._onStopped,this);WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineProgress,this._onProgress,this);}
+WebInspector.TimelineModel.TransferChunkLengthBytes=5000000;WebInspector.TimelineModel.RecordType={Root:"Root",Program:"Program",EventDispatch:"EventDispatch",GPUTask:"GPUTask",RequestMainThreadFrame:"RequestMainThreadFrame",BeginFrame:"BeginFrame",ActivateLayerTree:"ActivateLayerTree",DrawFrame:"DrawFrame",ScheduleStyleRecalculation:"ScheduleStyleRecalculation",RecalculateStyles:"RecalculateStyles",InvalidateLayout:"InvalidateLayout",Layout:"Layout",UpdateLayerTree:"UpdateLayerTree",AutosizeText:"AutosizeText",PaintSetup:"PaintSetup",Paint:"Paint",Rasterize:"Rasterize",ScrollLayer:"ScrollLayer",DecodeImage:"DecodeImage",ResizeImage:"ResizeImage",CompositeLayers:"CompositeLayers",ParseHTML:"ParseHTML",TimerInstall:"TimerInstall",TimerRemove:"TimerRemove",TimerFire:"TimerFire",XHRReadyStateChange:"XHRReadyStateChange",XHRLoad:"XHRLoad",EvaluateScript:"EvaluateScript",MarkLoad:"MarkLoad",MarkDOMContent:"MarkDOMContent",MarkFirstPaint:"MarkFirstPaint",TimeStamp:"TimeStamp",ConsoleTime:"ConsoleTime",ScheduleResourceRequest:"ScheduleResourceRequest",ResourceSendRequest:"ResourceSendRequest",ResourceReceiveResponse:"ResourceReceiveResponse",ResourceReceivedData:"ResourceReceivedData",ResourceFinish:"ResourceFinish",FunctionCall:"FunctionCall",GCEvent:"GCEvent",RequestAnimationFrame:"RequestAnimationFrame",CancelAnimationFrame:"CancelAnimationFrame",FireAnimationFrame:"FireAnimationFrame",WebSocketCreate:"WebSocketCreate",WebSocketSendHandshakeRequest:"WebSocketSendHandshakeRequest",WebSocketReceiveHandshakeResponse:"WebSocketReceiveHandshakeResponse",WebSocketDestroy:"WebSocketDestroy",EmbedderCallback:"EmbedderCallback",}
+WebInspector.TimelineModel.Events={RecordAdded:"RecordAdded",RecordsCleared:"RecordsCleared",RecordingStarted:"RecordingStarted",RecordingStopped:"RecordingStopped",RecordingProgress:"RecordingProgress",RecordFilterChanged:"RecordFilterChanged"}
+WebInspector.TimelineModel.forAllRecords=function(recordsArray,preOrderCallback,postOrderCallback)
+{function processRecords(records,depth)
+{for(var i=0;i<records.length;++i){var record=records[i];if(preOrderCallback&&preOrderCallback(record,depth))
+return true;if(processRecords(record.children,depth+1))
+return true;if(postOrderCallback&&postOrderCallback(record,depth))
+return true;}
+return false;}
+return processRecords(recordsArray,0);}
+WebInspector.TimelineModel.prototype={forAllRecords:function(preOrderCallback,postOrderCallback)
+{WebInspector.TimelineModel.forAllRecords(this._records,preOrderCallback,postOrderCallback);},addFilter:function(filter)
+{this._filters.push(filter);filter._model=this;},forAllFilteredRecords:function(callback)
+{function processRecord(record,depth)
+{var visible=this.isVisible(record);if(visible){if(callback(record,depth))
+return true;}
+for(var i=0;i<record.children.length;++i){if(processRecord.call(this,record.children[i],visible?depth+1:depth))
+return true;}
+return false;}
+for(var i=0;i<this._records.length;++i)
+processRecord.call(this,this._records[i],0);},isVisible:function(record)
+{for(var i=0;i<this._filters.length;++i){if(!this._filters[i].accept(record))
+return false;}
+return true;},_filterChanged:function()
+{this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordFilterChanged);},startRecording:function()
+{this._clientInitiatedRecording=true;this.reset();var maxStackFrames=WebInspector.settings.timelineCaptureStacks.get()?30:0;this._bufferEvents=WebInspector.experimentsSettings.timelineNoLiveUpdate.isEnabled();var includeGPUEvents=WebInspector.experimentsSettings.gpuTimeline.isEnabled();var liveEvents=[WebInspector.TimelineModel.RecordType.BeginFrame,WebInspector.TimelineModel.RecordType.DrawFrame,WebInspector.TimelineModel.RecordType.RequestMainThreadFrame,WebInspector.TimelineModel.RecordType.ActivateLayerTree];var includeCounters=true;WebInspector.timelineManager.start(maxStackFrames,this._bufferEvents,liveEvents.join(","),includeCounters,includeGPUEvents,this._fireRecordingStarted.bind(this));},stopRecording:function()
+{if(!this._clientInitiatedRecording){WebInspector.timelineManager.start(undefined,undefined,undefined,undefined,undefined,stopTimeline.bind(this));return;}
+function stopTimeline()
+{WebInspector.timelineManager.stop(this._fireRecordingStopped.bind(this));}
+this._clientInitiatedRecording=false;WebInspector.timelineManager.stop(this._fireRecordingStopped.bind(this));},records:function()
+{return this._records;},_onRecordAdded:function(event)
+{if(this._collectionEnabled)
+this._addRecord((event.data));},_onStarted:function(event)
+{if(event.data){this._fireRecordingStarted();}},_onStopped:function(event)
+{if(event.data){this._fireRecordingStopped(null);}},_onProgress:function(event)
+{this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordingProgress,event.data);},_fireRecordingStarted:function()
+{this._collectionEnabled=true;this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordingStarted);},_fireRecordingStopped:function(error,events)
+{this._bufferEvents=false;this._collectionEnabled=false;if(events&&events.length){this.reset();for(var i=0;i<events.length;++i)
+this._addRecord(events[i]);}
+this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordingStopped);},bufferEvents:function()
+{return this._bufferEvents;},_addRecord:function(payload)
+{this._internStrings(payload);this._payloads.push(payload);this._updateBoundaries(payload);var record=this._innerAddRecord(payload,null);this._records.push(record);if(record.type===WebInspector.TimelineModel.RecordType.Program)
+this._mainThreadTasks.push(record);if(record.type===WebInspector.TimelineModel.RecordType.GPUTask)
+this._gpuThreadTasks.push(record);this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordAdded,record);},_innerAddRecord:function(payload,parentRecord)
+{var record=new WebInspector.TimelineModel.Record(this,payload,parentRecord);if(WebInspector.TimelineUIUtils.isEventDivider(record))
+this._eventDividerRecords.push(record);for(var i=0;payload.children&&i<payload.children.length;++i)
+this._innerAddRecord.call(this,payload.children[i],record);record.calculateAggregatedStats();if(parentRecord)
+parentRecord._selfTime-=record.endTime-record.startTime;return record;},loadFromFile:function(file,progress)
+{var delegate=new WebInspector.TimelineModelLoadFromFileDelegate(this,progress);var fileReader=this._createFileReader(file,delegate);var loader=new WebInspector.TimelineModelLoader(this,fileReader,progress);fileReader.start(loader);},loadFromURL:function(url,progress)
+{var delegate=new WebInspector.TimelineModelLoadFromFileDelegate(this,progress);var urlReader=new WebInspector.ChunkedXHRReader(url,delegate);var loader=new WebInspector.TimelineModelLoader(this,urlReader,progress);urlReader.start(loader);},_createFileReader:function(file,delegate)
+{return new WebInspector.ChunkedFileReader(file,WebInspector.TimelineModel.TransferChunkLengthBytes,delegate);},_createFileWriter:function()
+{return new WebInspector.FileOutputStream();},saveToFile:function()
+{var now=new Date();var fileName="TimelineRawData-"+now.toISO8601Compact()+".json";var stream=this._createFileWriter();function callback(accepted)
+{if(!accepted)
+return;var saver=new WebInspector.TimelineSaver(stream);saver.save(this._payloads,window.navigator.appVersion);}
+stream.open(fileName,callback.bind(this));},reset:function()
+{this._records=[];this._payloads=[];this._stringPool={};this._minimumRecordTime=-1;this._maximumRecordTime=-1;this._bindings._reset();this._mainThreadTasks=[];this._gpuThreadTasks=[];this._eventDividerRecords=[];this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordsCleared);},minimumRecordTime:function()
+{return this._minimumRecordTime;},maximumRecordTime:function()
+{return this._maximumRecordTime;},_updateBoundaries:function(record)
+{var startTime=record.startTime;var endTime=record.endTime;if(this._minimumRecordTime===-1||startTime<this._minimumRecordTime)
+this._minimumRecordTime=startTime;if((this._maximumRecordTime===-1&&endTime)||endTime>this._maximumRecordTime)
+this._maximumRecordTime=endTime;},mainThreadTasks:function()
+{return this._mainThreadTasks;},gpuThreadTasks:function()
+{return this._gpuThreadTasks;},eventDividerRecords:function()
+{return this._eventDividerRecords;},_internStrings:function(record)
+{for(var name in record){var value=record[name];if(typeof value!=="string")
+continue;var interned=this._stringPool[value];if(typeof interned==="string")
+record[name]=interned;else
+this._stringPool[value]=value;}
+var children=record.children;for(var i=0;children&&i<children.length;++i)
+this._internStrings(children[i]);},__proto__:WebInspector.Object.prototype}
+WebInspector.TimelineModel.InterRecordBindings=function(){this._reset();}
+WebInspector.TimelineModel.InterRecordBindings.prototype={_reset:function()
+{this._sendRequestRecords={};this._timerRecords={};this._requestAnimationFrameRecords={};this._layoutInvalidateStack={};this._lastScheduleStyleRecalculation={};this._webSocketCreateRecords={};}}
+WebInspector.TimelineModel.Record=function(model,record,parentRecord)
+{this._model=model;var bindings=this._model._bindings;this._aggregatedStats={};this._record=record;this._children=[];if(parentRecord){this.parent=parentRecord;parentRecord.children.push(this);}
+this._selfTime=this.endTime-this.startTime;this._lastChildEndTime=this.endTime;this._startTimeOffset=this.startTime-model.minimumRecordTime();if(record.data){if(record.data["url"])
+this.url=record.data["url"];if(record.data["rootNode"])
+this._relatedBackendNodeId=record.data["rootNode"];else if(record.data["elementId"])
+this._relatedBackendNodeId=record.data["elementId"];if(record.data["scriptName"]){this.scriptName=record.data["scriptName"];this.scriptLine=record.data["scriptLine"];}}
+if(parentRecord&&parentRecord.callSiteStackTrace)
+this.callSiteStackTrace=parentRecord.callSiteStackTrace;var recordTypes=WebInspector.TimelineModel.RecordType;switch(record.type){case recordTypes.ResourceSendRequest:bindings._sendRequestRecords[record.data["requestId"]]=this;break;case recordTypes.ResourceReceiveResponse:var sendRequestRecord=bindings._sendRequestRecords[record.data["requestId"]];if(sendRequestRecord)
+this.url=sendRequestRecord.url;break;case recordTypes.ResourceReceivedData:case recordTypes.ResourceFinish:var sendRequestRecord=bindings._sendRequestRecords[record.data["requestId"]];if(sendRequestRecord)
+this.url=sendRequestRecord.url;break;case recordTypes.TimerInstall:this.timeout=record.data["timeout"];this.singleShot=record.data["singleShot"];bindings._timerRecords[record.data["timerId"]]=this;break;case recordTypes.TimerFire:var timerInstalledRecord=bindings._timerRecords[record.data["timerId"]];if(timerInstalledRecord){this.callSiteStackTrace=timerInstalledRecord.stackTrace;this.timeout=timerInstalledRecord.timeout;this.singleShot=timerInstalledRecord.singleShot;}
+break;case recordTypes.RequestAnimationFrame:bindings._requestAnimationFrameRecords[record.data["id"]]=this;break;case recordTypes.FireAnimationFrame:var requestAnimationRecord=bindings._requestAnimationFrameRecords[record.data["id"]];if(requestAnimationRecord)
+this.callSiteStackTrace=requestAnimationRecord.stackTrace;break;case recordTypes.ConsoleTime:var message=record.data["message"];break;case recordTypes.ScheduleStyleRecalculation:bindings._lastScheduleStyleRecalculation[this.frameId]=this;break;case recordTypes.RecalculateStyles:var scheduleStyleRecalculationRecord=bindings._lastScheduleStyleRecalculation[this.frameId];if(!scheduleStyleRecalculationRecord)
+break;this.callSiteStackTrace=scheduleStyleRecalculationRecord.stackTrace;break;case recordTypes.InvalidateLayout:var styleRecalcStack;if(!bindings._layoutInvalidateStack[this.frameId]){if(parentRecord.type===recordTypes.RecalculateStyles)
+styleRecalcStack=parentRecord.callSiteStackTrace;}
+bindings._layoutInvalidateStack[this.frameId]=styleRecalcStack||this.stackTrace;break;case recordTypes.Layout:var layoutInvalidateStack=bindings._layoutInvalidateStack[this.frameId];if(layoutInvalidateStack)
+this.callSiteStackTrace=layoutInvalidateStack;if(this.stackTrace)
+this.addWarning(WebInspector.UIString("Forced synchronous layout is a possible performance bottleneck."));bindings._layoutInvalidateStack[this.frameId]=null;this.highlightQuad=record.data.root||WebInspector.TimelineModel._quadFromRectData(record.data);this._relatedBackendNodeId=record.data["rootNode"];break;case recordTypes.AutosizeText:if(record.data.needsRelayout&&parentRecord.type===recordTypes.Layout)
+parentRecord.addWarning(WebInspector.UIString("Layout required two passes due to text autosizing, consider setting viewport."));break;case recordTypes.Paint:this.highlightQuad=record.data.clip||WebInspector.TimelineModel._quadFromRectData(record.data);break;case recordTypes.WebSocketCreate:this.webSocketURL=record.data["url"];if(typeof record.data["webSocketProtocol"]!=="undefined")
+this.webSocketProtocol=record.data["webSocketProtocol"];bindings._webSocketCreateRecords[record.data["identifier"]]=this;break;case recordTypes.WebSocketSendHandshakeRequest:case recordTypes.WebSocketReceiveHandshakeResponse:case recordTypes.WebSocketDestroy:var webSocketCreateRecord=bindings._webSocketCreateRecords[record.data["identifier"]];if(webSocketCreateRecord){this.webSocketURL=webSocketCreateRecord.webSocketURL;if(typeof webSocketCreateRecord.webSocketProtocol!=="undefined")
+this.webSocketProtocol=webSocketCreateRecord.webSocketProtocol;}
+break;case recordTypes.EmbedderCallback:this.embedderCallbackName=record.data["callbackName"];break;}}
+WebInspector.TimelineModel.Record.prototype={get lastChildEndTime()
+{return this._lastChildEndTime;},set lastChildEndTime(time)
+{this._lastChildEndTime=time;},get selfTime()
+{return this._selfTime;},get cpuTime()
+{return this._cpuTime;},isRoot:function()
+{return this.type===WebInspector.TimelineModel.RecordType.Root;},get children()
+{return this._children;},get category()
+{return WebInspector.TimelineUIUtils.categoryForRecord(this);},title:function()
+{return WebInspector.TimelineUIUtils.recordTitle(this);},get startTime()
+{return this._startTime||this._record.startTime;},set startTime(startTime)
+{this._startTime=startTime;},get thread()
+{return this._record.thread;},get startTimeOffset()
+{return this._startTimeOffset;},get endTime()
+{return this._endTime||this._record.endTime||this._record.startTime;},set endTime(endTime)
+{this._endTime=endTime;},get data()
+{return this._record.data;},get type()
+{return this._record.type;},get frameId()
+{return this._record.frameId||"";},get usedHeapSizeDelta()
+{return this._record.usedHeapSizeDelta||0;},get jsHeapSizeUsed()
+{return this._record.counters?this._record.counters.jsHeapSizeUsed||0:0;},get counters()
+{return this._record.counters;},get stackTrace()
+{if(this._record.stackTrace&&this._record.stackTrace.length)
+return this._record.stackTrace;return null;},getUserObject:function(key)
+{if(!this._userObjects)
+return null;return this._userObjects.get(key);},setUserObject:function(key,value)
+{if(!this._userObjects)
+this._userObjects=new StringMap();this._userObjects.put(key,value);},relatedBackendNodeId:function()
+{return this._relatedBackendNodeId;},calculateAggregatedStats:function()
+{this._aggregatedStats={};this._cpuTime=this._selfTime;for(var index=this._children.length;index;--index){var child=this._children[index-1];for(var category in child._aggregatedStats)
+this._aggregatedStats[category]=(this._aggregatedStats[category]||0)+child._aggregatedStats[category];}
+for(var category in this._aggregatedStats)
+this._cpuTime+=this._aggregatedStats[category];this._aggregatedStats[this.category.name]=(this._aggregatedStats[this.category.name]||0)+this._selfTime;},get aggregatedStats()
+{return this._aggregatedStats;},addWarning:function(message)
+{if(this._warnings)
+this._warnings.push(message);else{this._warnings=[message];for(var parent=this.parent;parent&&!parent._childHasWarnings;parent=parent.parent)
+parent._childHasWarnings=true;}},warnings:function()
+{return this._warnings;},childHasWarnings:function()
+{return!!this._childHasWarnings;},testContentMatching:function(regExp)
+{var tokens=[this.title()];for(var key in this._record.data)
+tokens.push(this._record.data[key])
+return regExp.test(tokens.join("|"));}}
+WebInspector.TimelineModel.Filter=function()
+{this._model;}
+WebInspector.TimelineModel.Filter.prototype={accept:function(record)
+{return true;},notifyFilterChanged:function()
+{this._model._filterChanged();}}
+WebInspector.TimelineModelLoader=function(model,reader,progress)
+{this._model=model;this._reader=reader;this._progress=progress;this._buffer="";this._firstChunk=true;}
+WebInspector.TimelineModelLoader.prototype={write:function(chunk)
+{var data=this._buffer+chunk;var lastIndex=0;var index;do{index=lastIndex;lastIndex=WebInspector.TextUtils.findBalancedCurlyBrackets(data,index);}while(lastIndex!==-1)
+var json=data.slice(0,index)+"]";this._buffer=data.slice(index);if(!index)
+return;if(!this._firstChunk)
+json="[0"+json;var items;try{items=(JSON.parse(json));}catch(e){WebInspector.console.showErrorMessage("Malformed timeline data.");this._model.reset();this._reader.cancel();this._progress.done();return;}
+if(this._firstChunk){this._version=items[0];this._firstChunk=false;this._model.reset();}
+for(var i=1,size=items.length;i<size;++i)
+this._model._addRecord(items[i]);},close:function(){}}
+WebInspector.TimelineModelLoadFromFileDelegate=function(model,progress)
+{this._model=model;this._progress=progress;}
+WebInspector.TimelineModelLoadFromFileDelegate.prototype={onTransferStarted:function()
+{this._progress.setTitle(WebInspector.UIString("Loading\u2026"));},onChunkTransferred:function(reader)
+{if(this._progress.isCanceled()){reader.cancel();this._progress.done();this._model.reset();return;}
+var totalSize=reader.fileSize();if(totalSize){this._progress.setTotalWork(totalSize);this._progress.setWorked(reader.loadedSize());}},onTransferFinished:function()
+{this._progress.done();},onError:function(reader,event)
+{this._progress.done();this._model.reset();switch(event.target.error.code){case FileError.NOT_FOUND_ERR:WebInspector.console.showErrorMessage(WebInspector.UIString("File \"%s\" not found.",reader.fileName()));break;case FileError.NOT_READABLE_ERR:WebInspector.console.showErrorMessage(WebInspector.UIString("File \"%s\" is not readable",reader.fileName()));break;case FileError.ABORT_ERR:break;default:WebInspector.console.showErrorMessage(WebInspector.UIString("An error occurred while reading the file \"%s\"",reader.fileName()));}}}
+WebInspector.TimelineSaver=function(stream)
+{this._stream=stream;}
+WebInspector.TimelineSaver.prototype={save:function(payloads,version)
+{this._payloads=payloads;this._recordIndex=0;this._prologue="["+JSON.stringify(version);this._writeNextChunk(this._stream);},_writeNextChunk:function(stream)
+{const separator=",\n";var data=[];var length=0;if(this._prologue){data.push(this._prologue);length+=this._prologue.length;delete this._prologue;}else{if(this._recordIndex===this._payloads.length){stream.close();return;}
+data.push("");}
+while(this._recordIndex<this._payloads.length){var item=JSON.stringify(this._payloads[this._recordIndex]);var itemLength=item.length+separator.length;if(length+itemLength>WebInspector.TimelineModel.TransferChunkLengthBytes)
+break;length+=itemLength;data.push(item);++this._recordIndex;}
+if(this._recordIndex===this._payloads.length)
+data.push(data.pop()+"]");stream.write(data.join(separator),this._writeNextChunk.bind(this));}}
+WebInspector.TimelineMergingRecordBuffer=function()
+{this._backgroundRecordsBuffer=[];}
+WebInspector.TimelineMergingRecordBuffer.prototype={process:function(thread,records)
+{if(thread){this._backgroundRecordsBuffer=this._backgroundRecordsBuffer.concat(records);return[];}
+function recordTimestampComparator(a,b)
+{return a.startTime<b.startTime?-1:1;}
+var result=this._backgroundRecordsBuffer.mergeOrdered(records,recordTimestampComparator);this._backgroundRecordsBuffer=[];return result;}}
+WebInspector.TimelineModel._quadFromRectData=function(data)
+{if(typeof data["x"]==="undefined"||typeof data["y"]==="undefined")
+return null;var x0=data["x"];var x1=data["x"]+data["width"];var y0=data["y"];var y1=data["y"]+data["height"];return[x0,y0,x1,y0,x1,y1,x0,y1];};WebInspector.TimelineOverviewPane=function(model)
+{WebInspector.VBox.call(this);this.element.id="timeline-overview-pane";this._eventDividers=[];this._model=model;this._overviewGrid=new WebInspector.OverviewGrid("timeline");this.element.appendChild(this._overviewGrid.element);this._overviewCalculator=new WebInspector.TimelineOverviewCalculator();model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared,this._reset,this);this._overviewGrid.addEventListener(WebInspector.OverviewGrid.Events.WindowChanged,this._onWindowChanged,this);}
+WebInspector.TimelineOverviewPane.Events={WindowChanged:"WindowChanged"};WebInspector.TimelineOverviewPane.prototype={wasShown:function()
+{this._update();},onResize:function()
+{this._update();},setOverviewControl:function(overviewControl)
+{if(this._overviewControl===overviewControl)
+return;var windowTimes=null;if(this._overviewControl){windowTimes=this._overviewControl.windowTimes(this._overviewGrid.windowLeft(),this._overviewGrid.windowRight());this._overviewControl.detach();}
+this._overviewControl=overviewControl;this._overviewControl.show(this._overviewGrid.element);this._update();if(windowTimes)
+this.requestWindowTimes(windowTimes.startTime,windowTimes.endTime);},_update:function()
+{delete this._refreshTimeout;this._overviewCalculator._setWindow(this._model.minimumRecordTime(),this._model.maximumRecordTime());this._overviewCalculator._setDisplayWindow(0,this._overviewGrid.clientWidth());if(this._overviewControl)
+this._overviewControl.update();this._overviewGrid.updateDividers(this._overviewCalculator);this._updateEventDividers();this._updateWindow();},_updateEventDividers:function()
+{var records=this._eventDividers;this._overviewGrid.removeEventDividers();var dividers=[];for(var i=0;i<records.length;++i){var record=records[i];var positions=this._overviewCalculator.computeBarGraphPercentages(record);var dividerPosition=Math.round(positions.start*10);if(dividers[dividerPosition])
+continue;var divider=WebInspector.TimelineUIUtils.createEventDivider(record.type);divider.style.left=positions.start+"%";dividers[dividerPosition]=divider;}
+this._overviewGrid.addEventDividers(dividers);},addRecord:function(record)
+{var eventDividers=this._eventDividers;function addEventDividers(record)
+{if(WebInspector.TimelineUIUtils.isEventDivider(record))
+eventDividers.push(record);}
+WebInspector.TimelineModel.forAllRecords([record],addEventDividers);this._scheduleRefresh();},_reset:function()
+{this._overviewCalculator.reset();this._overviewGrid.reset();this._overviewGrid.setResizeEnabled(false);this._eventDividers=[];this._overviewGrid.updateDividers(this._overviewCalculator);if(this._overviewControl)
+this._overviewControl.reset();this._update();},_onWindowChanged:function(event)
+{if(this._muteOnWindowChanged)
+return;var windowTimes=this._overviewControl.windowTimes(this._overviewGrid.windowLeft(),this._overviewGrid.windowRight());this._windowStartTime=windowTimes.startTime;this._windowEndTime=windowTimes.endTime;this.dispatchEventToListeners(WebInspector.TimelineOverviewPane.Events.WindowChanged,windowTimes);},requestWindowTimes:function(startTime,endTime)
+{if(startTime===this._windowStartTime&&endTime===this._windowEndTime)
+return;this._windowStartTime=startTime;this._windowEndTime=endTime;this._updateWindow();this.dispatchEventToListeners(WebInspector.TimelineOverviewPane.Events.WindowChanged,{startTime:startTime,endTime:endTime});},_updateWindow:function()
+{var windowBoundaries=this._overviewControl.windowBoundaries(this._windowStartTime,this._windowEndTime);this._muteOnWindowChanged=true;this._overviewGrid.setWindow(windowBoundaries.left,windowBoundaries.right);this._overviewGrid.setResizeEnabled(!!this._model.records().length);this._muteOnWindowChanged=false;},_scheduleRefresh:function()
+{if(this._refreshTimeout)
+return;if(!this.isShowing())
+return;this._refreshTimeout=setTimeout(this._update.bind(this),300);},__proto__:WebInspector.VBox.prototype}
+WebInspector.TimelineOverviewCalculator=function()
+{}
+WebInspector.TimelineOverviewCalculator.prototype={paddingLeft:function()
+{return this._paddingLeft;},computePosition:function(time)
+{return(time-this._minimumBoundary)/this.boundarySpan()*this._workingArea+this._paddingLeft;},computeBarGraphPercentages:function(record)
+{var start=(record.startTime-this._minimumBoundary)/this.boundarySpan()*100;var end=(record.endTime-this._minimumBoundary)/this.boundarySpan()*100;return{start:start,end:end};},_setWindow:function(minimumRecordTime,maximumRecordTime)
+{this._minimumBoundary=minimumRecordTime;this._maximumBoundary=maximumRecordTime;},_setDisplayWindow:function(paddingLeft,clientWidth)
+{this._workingArea=clientWidth-paddingLeft;this._paddingLeft=paddingLeft;},reset:function()
+{this._setWindow(0,1000);},formatTime:function(value,precision)
+{return Number.preciseMillisToString(value-this.zeroTime(),precision);},maximumBoundary:function()
+{return this._maximumBoundary;},minimumBoundary:function()
+{return this._minimumBoundary;},zeroTime:function()
+{return this._minimumBoundary;},boundarySpan:function()
+{return this._maximumBoundary-this._minimumBoundary;}}
+WebInspector.TimelineOverview=function(model)
+{}
+WebInspector.TimelineOverview.prototype={show:function(parentElement,insertBefore){},update:function(){},reset:function(){},windowTimes:function(windowLeft,windowRight){},windowBoundaries:function(startTime,endTime){}}
+WebInspector.TimelineOverviewBase=function(model)
+{WebInspector.VBox.call(this);this._model=model;this._canvas=this.element.createChild("canvas","fill");this._context=this._canvas.getContext("2d");}
+WebInspector.TimelineOverviewBase.prototype={update:function()
+{this.resetCanvas();},reset:function()
+{},timelineStarted:function(){},timelineStopped:function(){},windowTimes:function(windowLeft,windowRight)
+{var absoluteMin=this._model.minimumRecordTime();var timeSpan=this._model.maximumRecordTime()-absoluteMin;return{startTime:absoluteMin+timeSpan*windowLeft,endTime:absoluteMin+timeSpan*windowRight};},windowBoundaries:function(startTime,endTime)
+{var absoluteMin=this._model.minimumRecordTime();var timeSpan=this._model.maximumRecordTime()-absoluteMin;var haveRecords=absoluteMin>=0;return{left:haveRecords&&startTime?Math.min((startTime-absoluteMin)/timeSpan,1):0,right:haveRecords&&endTime<Infinity?(endTime-absoluteMin)/timeSpan:1}},resetCanvas:function()
+{this._canvas.width=this.element.clientWidth*window.devicePixelRatio;this._canvas.height=this.element.clientHeight*window.devicePixelRatio;},__proto__:WebInspector.VBox.prototype};WebInspector.TimelinePresentationModel=function(model)
+{this._model=model;this._filters=[];this._recordToPresentationRecord=new Map();this.reset();}
+WebInspector.TimelinePresentationModel._coalescingRecords={};WebInspector.TimelinePresentationModel._coalescingRecords[WebInspector.TimelineModel.RecordType.Layout]=1;WebInspector.TimelinePresentationModel._coalescingRecords[WebInspector.TimelineModel.RecordType.Paint]=1;WebInspector.TimelinePresentationModel._coalescingRecords[WebInspector.TimelineModel.RecordType.Rasterize]=1;WebInspector.TimelinePresentationModel._coalescingRecords[WebInspector.TimelineModel.RecordType.DecodeImage]=1;WebInspector.TimelinePresentationModel._coalescingRecords[WebInspector.TimelineModel.RecordType.ResizeImage]=1;WebInspector.TimelinePresentationModel.prototype={setWindowTimes:function(startTime,endTime)
+{this._windowStartTime=startTime;this._windowEndTime=endTime;},toPresentationRecord:function(record)
+{return record?this._recordToPresentationRecord.get(record)||null:null;},rootRecord:function()
+{return this._rootRecord;},reset:function()
+{this._recordToPresentationRecord.clear();var rootPayload={type:WebInspector.TimelineModel.RecordType.Root};var rootRecord=new WebInspector.TimelineModel.Record(this._model,(rootPayload),null);this._rootRecord=new WebInspector.TimelinePresentationModel.Record(rootRecord,null);this._coalescingBuckets={};this._windowStartTime=0;this._windowEndTime=Infinity;},addRecord:function(record)
+{var records;if(record.type===WebInspector.TimelineModel.RecordType.Program)
+records=record.children;else
+records=[record];for(var i=0;i<records.length;++i)
+this._innerAddRecord(this._rootRecord,records[i]);},_innerAddRecord:function(parentRecord,record)
+{var coalescingBucket;if(parentRecord===this._rootRecord)
+coalescingBucket=record.thread?record.type:"mainThread";var coalescedRecord=this._findCoalescedParent(record,parentRecord,coalescingBucket);if(coalescedRecord)
+parentRecord=coalescedRecord;var formattedRecord=new WebInspector.TimelinePresentationModel.Record(record,parentRecord);this._recordToPresentationRecord.put(record,formattedRecord);formattedRecord._collapsed=parentRecord===this._rootRecord;if(coalescingBucket)
+this._coalescingBuckets[coalescingBucket]=formattedRecord;for(var i=0;record.children&&i<record.children.length;++i)
+this._innerAddRecord(formattedRecord,record.children[i]);if(parentRecord._coalesced)
+this._updateCoalescingParent(formattedRecord);},_findCoalescedParent:function(record,newParent,bucket)
+{const coalescingThresholdMillis=5;var lastRecord=bucket?this._coalescingBuckets[bucket]:newParent._presentationChildren.peekLast();if(lastRecord&&lastRecord._coalesced)
+lastRecord=lastRecord._presentationChildren.peekLast();var startTime=record.startTime;var endTime=record.endTime;if(!lastRecord)
+return null;if(lastRecord.record().type!==record.type)
+return null;if(!WebInspector.TimelinePresentationModel._coalescingRecords[record.type])
+return null;if(lastRecord.record().endTime+coalescingThresholdMillis<startTime)
+return null;if(endTime+coalescingThresholdMillis<lastRecord.record().startTime)
+return null;if(lastRecord.presentationParent()._coalesced)
+return lastRecord.presentationParent();return this._replaceWithCoalescedRecord(lastRecord);},_replaceWithCoalescedRecord:function(presentationRecord)
+{var record=presentationRecord.record();var rawRecord={type:record.type,startTime:record.startTime,endTime:record.endTime,data:{}};if(record.thread)
+rawRecord.thread="aggregated";if(record.type===WebInspector.TimelineModel.RecordType.TimeStamp)
+rawRecord.data["message"]=record.data.message;var modelRecord=new WebInspector.TimelineModel.Record(this._model,(rawRecord),null);var coalescedRecord=new WebInspector.TimelinePresentationModel.Record(modelRecord,null);var parent=presentationRecord._presentationParent;coalescedRecord._coalesced=true;coalescedRecord._collapsed=true;coalescedRecord._presentationChildren.push(presentationRecord);presentationRecord._presentationParent=coalescedRecord;if(presentationRecord.hasWarnings()||presentationRecord.childHasWarnings())
+coalescedRecord._childHasWarnings=true;coalescedRecord._presentationParent=parent;parent._presentationChildren[parent._presentationChildren.indexOf(presentationRecord)]=coalescedRecord;WebInspector.TimelineUIUtils.aggregateTimeByCategory(modelRecord.aggregatedStats,record.aggregatedStats);return coalescedRecord;},_updateCoalescingParent:function(presentationRecord)
+{var record=presentationRecord.record();var parentRecord=presentationRecord._presentationParent.record();WebInspector.TimelineUIUtils.aggregateTimeByCategory(parentRecord.aggregatedStats,record.aggregatedStats);if(parentRecord.startTime>record.startTime)
+parentRecord.startTime=record.startTime;if(parentRecord.endTime<record.endTime){parentRecord.endTime=record.endTime;parentRecord.lastChildEndTime=parentRecord.endTime;}},setTextFilter:function(textFilter)
+{this._textFilter=textFilter;},invalidateFilteredRecords:function()
+{delete this._filteredRecords;},filteredRecords:function()
+{if(this._filteredRecords)
+return this._filteredRecords;var recordsInWindow=[];var stack=[{children:this._rootRecord._presentationChildren,index:0,parentIsCollapsed:false,parentRecord:{}}];var revealedDepth=0;function revealRecordsInStack(){for(var depth=revealedDepth+1;depth<stack.length;++depth){if(stack[depth-1].parentIsCollapsed){stack[depth].parentRecord._presentationParent._expandable=true;return;}
+stack[depth-1].parentRecord._collapsed=false;recordsInWindow.push(stack[depth].parentRecord);stack[depth].windowLengthBeforeChildrenTraversal=recordsInWindow.length;stack[depth].parentIsRevealed=true;revealedDepth=depth;}}
+while(stack.length){var entry=stack[stack.length-1];var records=entry.children;if(records&&entry.index<records.length){var record=records[entry.index];++entry.index;var rawRecord=record.record();if(rawRecord.startTime<this._windowEndTime&&rawRecord.endTime>this._windowStartTime){if(this._model.isVisible(rawRecord)){record._presentationParent._expandable=true;if(this._textFilter)
+revealRecordsInStack();if(!entry.parentIsCollapsed){recordsInWindow.push(record);revealedDepth=stack.length;entry.parentRecord._collapsed=false;}}}
+record._expandable=false;stack.push({children:record._presentationChildren,index:0,parentIsCollapsed:entry.parentIsCollapsed||(record._collapsed&&(!this._textFilter||record._expandedOrCollapsedWhileFiltered)),parentRecord:record,windowLengthBeforeChildrenTraversal:recordsInWindow.length});}else{stack.pop();revealedDepth=Math.min(revealedDepth,stack.length-1);entry.parentRecord._visibleChildrenCount=recordsInWindow.length-entry.windowLengthBeforeChildrenTraversal;}}
+this._filteredRecords=recordsInWindow;return recordsInWindow;},__proto__:WebInspector.Object.prototype}
+WebInspector.TimelinePresentationModel.Record=function(record,parentRecord)
+{this._record=record;this._presentationChildren=[];if(parentRecord){this._presentationParent=parentRecord;parentRecord._presentationChildren.push(this);}
+if(this.hasWarnings()){for(var parent=this._presentationParent;parent&&!parent._childHasWarnings;parent=parent._presentationParent)
+parent._childHasWarnings=true;}
+if(parentRecord&&parentRecord.callSiteStackTrace)
+this.callSiteStackTrace=parentRecord.callSiteStackTrace;}
+WebInspector.TimelinePresentationModel.Record.prototype={record:function()
+{return this._record;},presentationChildren:function()
+{return this._presentationChildren;},coalesced:function()
+{return this._coalesced;},collapsed:function()
+{return this._collapsed;},setCollapsed:function(collapsed)
+{this._collapsed=collapsed;this._expandedOrCollapsedWhileFiltered=true;},presentationParent:function()
+{return this._presentationParent||null;},visibleChildrenCount:function()
+{return this._visibleChildrenCount||0;},expandable:function()
+{return!!this._expandable;},hasWarnings:function()
+{return!!this._record.warnings();},childHasWarnings:function()
+{return this._childHasWarnings;},listRow:function()
+{return this._listRow;},setListRow:function(listRow)
+{this._listRow=listRow;},graphRow:function()
+{return this._graphRow;},setGraphRow:function(graphRow)
+{this._graphRow=graphRow;}};WebInspector.TimelineFrameModel=function(model)
+{this._model=model;this.reset();var records=model.records();for(var i=0;i<records.length;++i)
+this.addRecord(records[i]);}
+WebInspector.TimelineFrameModel.Events={FrameAdded:"FrameAdded"}
+WebInspector.TimelineFrameModel._mainFrameMarkers=[WebInspector.TimelineModel.RecordType.ScheduleStyleRecalculation,WebInspector.TimelineModel.RecordType.InvalidateLayout,WebInspector.TimelineModel.RecordType.BeginFrame,WebInspector.TimelineModel.RecordType.ScrollLayer];WebInspector.TimelineFrameModel.prototype={frames:function()
+{return this._frames;},filteredFrames:function(startTime,endTime)
+{function compareStartTime(value,object)
+{return value-object.startTime;}
+function compareEndTime(value,object)
+{return value-object.endTime;}
+var frames=this._frames;var firstFrame=insertionIndexForObjectInListSortedByFunction(startTime,frames,compareEndTime);var lastFrame=insertionIndexForObjectInListSortedByFunction(endTime,frames,compareStartTime);return frames.slice(firstFrame,lastFrame);},reset:function()
+{this._frames=[];this._lastFrame=null;this._lastLayerTree=null;this._hasThreadedCompositing=false;this._mainFrameCommitted=false;this._mainFrameRequested=false;this._aggregatedMainThreadWork=null;this._mergingBuffer=new WebInspector.TimelineMergingRecordBuffer();},addRecord:function(record)
+{var recordTypes=WebInspector.TimelineModel.RecordType;var programRecord=record.type===recordTypes.Program?record:null;if(programRecord){if(!this._aggregatedMainThreadWork&&this._findRecordRecursively(WebInspector.TimelineFrameModel._mainFrameMarkers,programRecord))
+this._aggregatedMainThreadWork={};}
+var records;if(this._model.bufferEvents())
+records=[record];else
+records=this._mergingBuffer.process(record.thread,programRecord?record.children||[]:[record]);for(var i=0;i<records.length;++i){if(records[i].thread)
+this._addBackgroundRecord(records[i]);else
+this._addMainThreadRecord(programRecord,records[i]);}},_addBackgroundRecord:function(record)
+{var recordTypes=WebInspector.TimelineModel.RecordType;if(!this._lastFrame){if(record.type===recordTypes.BeginFrame||record.type===recordTypes.DrawFrame)
+this._startBackgroundFrame(record);return;}
+if(record.type===recordTypes.DrawFrame){if(this._mainFrameCommitted||!this._mainFrameRequested)
+this._startBackgroundFrame(record);this._mainFrameCommitted=false;}else if(record.type===recordTypes.RequestMainThreadFrame){this._mainFrameRequested=true;}else if(record.type===recordTypes.ActivateLayerTree){this._mainFrameRequested=false;this._mainFrameCommitted=true;this._lastFrame._addTimeForCategories(this._aggregatedMainThreadWorkToAttachToBackgroundFrame);this._aggregatedMainThreadWorkToAttachToBackgroundFrame={};}
+this._lastFrame._addTimeFromRecord(record);},_addMainThreadRecord:function(programRecord,record)
+{var recordTypes=WebInspector.TimelineModel.RecordType;if(record.type===recordTypes.UpdateLayerTree)
+this._lastLayerTree=record.data["layerTree"]||null;if(!this._hasThreadedCompositing){if(record.type===recordTypes.BeginFrame)
+this._startMainThreadFrame(record);if(!this._lastFrame)
+return;this._lastFrame._addTimeFromRecord(record);if(programRecord.children[0]===record){this._deriveOtherTime(programRecord,this._lastFrame.timeByCategory);this._lastFrame._updateCpuTime();}
+return;}
+if(!this._aggregatedMainThreadWork)
+return;WebInspector.TimelineUIUtils.aggregateTimeForRecord(this._aggregatedMainThreadWork,record);if(programRecord.children[0]===record)
+this._deriveOtherTime(programRecord,this._aggregatedMainThreadWork);if(record.type===recordTypes.CompositeLayers){this._aggregatedMainThreadWorkToAttachToBackgroundFrame=this._aggregatedMainThreadWork;this._aggregatedMainThreadWork=null;}},_deriveOtherTime:function(programRecord,timeByCategory)
+{var accounted=0;for(var i=0;i<programRecord.children.length;++i)
+accounted+=programRecord.children[i].endTime-programRecord.children[i].startTime;var otherTime=programRecord.endTime-programRecord.startTime-accounted;timeByCategory["other"]=(timeByCategory["other"]||0)+otherTime;},_startBackgroundFrame:function(record)
+{if(!this._hasThreadedCompositing){this._lastFrame=null;this._hasThreadedCompositing=true;}
+if(this._lastFrame)
+this._flushFrame(this._lastFrame,record);this._lastFrame=new WebInspector.TimelineFrame(record);},_startMainThreadFrame:function(record)
+{if(this._lastFrame)
+this._flushFrame(this._lastFrame,record);this._lastFrame=new WebInspector.TimelineFrame(record);},_flushFrame:function(frame,record)
+{frame._setLayerTree(this._lastLayerTree);frame._setEndTime(record.startTime);this._frames.push(frame);this.dispatchEventToListeners(WebInspector.TimelineFrameModel.Events.FrameAdded,frame);},_findRecordRecursively:function(types,record)
+{if(types.indexOf(record.type)>=0)
+return record;if(!record.children)
+return null;for(var i=0;i<record.children.length;++i){var result=this._findRecordRecursively(types,record.children[i]);if(result)
+return result;}
+return null;},__proto__:WebInspector.Object.prototype}
+WebInspector.FrameStatistics=function(frames)
+{this.frameCount=frames.length;this.minDuration=Infinity;this.maxDuration=0;this.timeByCategory={};this.startOffset=frames[0].startTimeOffset;var lastFrame=frames[this.frameCount-1];this.endOffset=lastFrame.startTimeOffset+lastFrame.duration;var totalDuration=0;var sumOfSquares=0;for(var i=0;i<this.frameCount;++i){var duration=frames[i].duration;totalDuration+=duration;sumOfSquares+=duration*duration;this.minDuration=Math.min(this.minDuration,duration);this.maxDuration=Math.max(this.maxDuration,duration);WebInspector.TimelineUIUtils.aggregateTimeByCategory(this.timeByCategory,frames[i].timeByCategory);}
+this.average=totalDuration/this.frameCount;var variance=sumOfSquares/this.frameCount-this.average*this.average;this.stddev=Math.sqrt(variance);}
+WebInspector.TimelineFrame=function(record)
+{this.startTime=record.startTime;this.startTimeOffset=record.startTimeOffset;this.endTime=this.startTime;this.duration=0;this.timeByCategory={};this.cpuTime=0;this.layerTree=null;}
+WebInspector.TimelineFrame.prototype={_setEndTime:function(endTime)
+{this.endTime=endTime;this.duration=this.endTime-this.startTime;},_setLayerTree:function(layerTree)
+{this.layerTree=layerTree;},_addTimeFromRecord:function(record)
+{if(!record.endTime)
+return;WebInspector.TimelineUIUtils.aggregateTimeForRecord(this.timeByCategory,record);this._updateCpuTime();},_addTimeForCategories:function(timeByCategory)
+{WebInspector.TimelineUIUtils.aggregateTimeByCategory(this.timeByCategory,timeByCategory);this._updateCpuTime();},_updateCpuTime:function()
+{this.cpuTime=0;for(var key in this.timeByCategory)
+this.cpuTime+=this.timeByCategory[key];}};WebInspector.TimelineEventOverview=function(model)
+{WebInspector.TimelineOverviewBase.call(this,model);this.element.id="timeline-overview-events";this._fillStyles={};var categories=WebInspector.TimelineUIUtils.categories();for(var category in categories){this._fillStyles[category]=WebInspector.TimelineUIUtils.createFillStyleForCategory(this._context,0,WebInspector.TimelineEventOverview._stripGradientHeight,categories[category]);categories[category].addEventListener(WebInspector.TimelineCategory.Events.VisibilityChanged,this._onCategoryVisibilityChanged,this);}
+this._disabledCategoryFillStyle=WebInspector.TimelineUIUtils.createFillStyle(this._context,0,WebInspector.TimelineEventOverview._stripGradientHeight,"hsl(0, 0%, 85%)","hsl(0, 0%, 67%)","hsl(0, 0%, 56%)");this._disabledCategoryBorderStyle="rgb(143, 143, 143)";}
+WebInspector.TimelineEventOverview._numberOfStrips=3;WebInspector.TimelineEventOverview._stripGradientHeight=120;WebInspector.TimelineEventOverview.prototype={update:function()
+{this.resetCanvas();var stripHeight=Math.round(this._canvas.height/WebInspector.TimelineEventOverview._numberOfStrips);var timeOffset=this._model.minimumRecordTime();var timeSpan=this._model.maximumRecordTime()-timeOffset;var scale=this._canvas.width/timeSpan;var lastBarByGroup=[];this._context.fillStyle="rgba(0, 0, 0, 0.05)";for(var i=1;i<WebInspector.TimelineEventOverview._numberOfStrips;i+=2)
+this._context.fillRect(0.5,i*stripHeight+0.5,this._canvas.width,stripHeight);function appendRecord(record)
+{if(record.type===WebInspector.TimelineModel.RecordType.BeginFrame)
+return;var recordStart=Math.floor((record.startTime-timeOffset)*scale);var recordEnd=Math.ceil((record.endTime-timeOffset)*scale);var category=WebInspector.TimelineUIUtils.categoryForRecord(record);if(category.overviewStripGroupIndex<0)
+return;var bar=lastBarByGroup[category.overviewStripGroupIndex];const barsMergeThreshold=2;if(bar&&bar.category===category&&bar.end+barsMergeThreshold>=recordStart){if(recordEnd>bar.end)
+bar.end=recordEnd;return;}
+if(bar)
+this._renderBar(bar.start,bar.end,stripHeight,bar.category);lastBarByGroup[category.overviewStripGroupIndex]={start:recordStart,end:recordEnd,category:category};}
+this._model.forAllRecords(appendRecord.bind(this));for(var i=0;i<lastBarByGroup.length;++i){if(lastBarByGroup[i])
+this._renderBar(lastBarByGroup[i].start,lastBarByGroup[i].end,stripHeight,lastBarByGroup[i].category);}},_onCategoryVisibilityChanged:function()
+{this.update();},_renderBar:function(begin,end,height,category)
+{const stripPadding=4*window.devicePixelRatio;const innerStripHeight=height-2*stripPadding;var x=begin+0.5;var y=category.overviewStripGroupIndex*height+stripPadding+0.5;var width=Math.max(end-begin,1);this._context.save();this._context.translate(x,y);this._context.scale(1,innerStripHeight/WebInspector.TimelineEventOverview._stripGradientHeight);this._context.fillStyle=category.hidden?this._disabledCategoryFillStyle:this._fillStyles[category.name];this._context.fillRect(0,0,width,WebInspector.TimelineEventOverview._stripGradientHeight);this._context.strokeStyle=category.hidden?this._disabledCategoryBorderStyle:category.borderColor;this._context.strokeRect(0,0,width,WebInspector.TimelineEventOverview._stripGradientHeight);this._context.restore();},__proto__:WebInspector.TimelineOverviewBase.prototype};WebInspector.TimelineFrameOverview=function(model,frameModel)
+{WebInspector.TimelineOverviewBase.call(this,model);this.element.id="timeline-overview-frames";this._frameModel=frameModel;this.reset();this._outerPadding=4*window.devicePixelRatio;this._maxInnerBarWidth=10*window.devicePixelRatio;this._topPadding=6*window.devicePixelRatio;this._actualPadding=5*window.devicePixelRatio;this._actualOuterBarWidth=this._maxInnerBarWidth+this._actualPadding;this._fillStyles={};var categories=WebInspector.TimelineUIUtils.categories();for(var category in categories)
+this._fillStyles[category]=WebInspector.TimelineUIUtils.createFillStyleForCategory(this._context,this._maxInnerBarWidth,0,categories[category]);this._frameTopShadeGradient=this._context.createLinearGradient(0,0,0,this._topPadding);this._frameTopShadeGradient.addColorStop(0,"rgba(255, 255, 255, 0.9)");this._frameTopShadeGradient.addColorStop(1,"rgba(255, 255, 255, 0.2)");}
+WebInspector.TimelineFrameOverview.prototype={reset:function()
+{this._recordsPerBar=1;this._barTimes=[];},update:function()
+{this.resetCanvas();this._barTimes=[];const minBarWidth=4*window.devicePixelRatio;var frames=this._frameModel.frames();var framesPerBar=Math.max(1,frames.length*minBarWidth/this._canvas.width);var visibleFrames=this._aggregateFrames(frames,framesPerBar);this._context.save();var scale=(this._canvas.height-this._topPadding)/this._computeTargetFrameLength(visibleFrames);this._renderBars(visibleFrames,scale,this._canvas.height);this._context.fillStyle=this._frameTopShadeGradient;this._context.fillRect(0,0,this._canvas.width,this._topPadding);this._drawFPSMarks(scale,this._canvas.height);this._context.restore();},_aggregateFrames:function(frames,framesPerBar)
+{var visibleFrames=[];for(var barNumber=0,currentFrame=0;currentFrame<frames.length;++barNumber){var barStartTime=frames[currentFrame].startTime;var longestFrame=null;var longestDuration=0;for(var lastFrame=Math.min(Math.floor((barNumber+1)*framesPerBar),frames.length);currentFrame<lastFrame;++currentFrame){var duration=frames[currentFrame].duration;if(!longestFrame||longestDuration<duration){longestFrame=frames[currentFrame];longestDuration=duration;}}
+var barEndTime=frames[currentFrame-1].endTime;if(longestFrame){visibleFrames.push(longestFrame);this._barTimes.push({startTime:barStartTime,endTime:barEndTime});}}
+return visibleFrames;},_computeTargetFrameLength:function(frames)
+{var durations=[];for(var i=0;i<frames.length;++i){if(frames[i])
+durations.push(frames[i].duration);}
+var medianFrameLength=durations.qselect(Math.floor(durations.length/2));const targetFPS=20;var result=1000.0/targetFPS;if(result>=medianFrameLength)
+return result;var maxFrameLength=Math.max.apply(Math,durations);return Math.min(medianFrameLength*2,maxFrameLength);},_renderBars:function(frames,scale,windowHeight)
+{const maxPadding=5*window.devicePixelRatio;this._actualOuterBarWidth=Math.min((this._canvas.width-2*this._outerPadding)/frames.length,this._maxInnerBarWidth+maxPadding);this._actualPadding=Math.min(Math.floor(this._actualOuterBarWidth/3),maxPadding);var barWidth=this._actualOuterBarWidth-this._actualPadding;for(var i=0;i<frames.length;++i){if(frames[i])
+this._renderBar(this._barNumberToScreenPosition(i),barWidth,windowHeight,frames[i],scale);}},_barNumberToScreenPosition:function(n)
+{return this._outerPadding+this._actualOuterBarWidth*n;},_drawFPSMarks:function(scale,height)
+{const fpsMarks=[30,60];this._context.save();this._context.beginPath();this._context.font=(10*window.devicePixelRatio)+"px "+window.getComputedStyle(this.element,null).getPropertyValue("font-family");this._context.textAlign="right";this._context.textBaseline="alphabetic";const labelPadding=4*window.devicePixelRatio;const baselineHeight=3*window.devicePixelRatio;var lineHeight=12*window.devicePixelRatio;var labelTopMargin=0;var labelOffsetY=0;for(var i=0;i<fpsMarks.length;++i){var fps=fpsMarks[i];var y=height-Math.floor(1000.0/fps*scale)-0.5;var label=WebInspector.UIString("%d\u2009fps",fps);var labelWidth=this._context.measureText(label).width+2*labelPadding;var labelX=this._canvas.width;if(!i&&labelTopMargin<y-lineHeight)
+labelOffsetY=-lineHeight;var labelY=y+labelOffsetY;if(labelY<labelTopMargin||labelY+lineHeight>height)
+break;this._context.moveTo(0,y);this._context.lineTo(this._canvas.width,y);this._context.fillStyle="rgba(255, 255, 255, 0.5)";this._context.fillRect(labelX-labelWidth,labelY,labelWidth,lineHeight);this._context.fillStyle="black";this._context.fillText(label,labelX-labelPadding,labelY+lineHeight-baselineHeight);labelTopMargin=labelY+lineHeight;}
+this._context.strokeStyle="rgba(60, 60, 60, 0.4)";this._context.stroke();this._context.restore();},_renderBar:function(left,width,windowHeight,frame,scale)
+{var categories=Object.keys(WebInspector.TimelineUIUtils.categories());var x=Math.floor(left)+0.5;width=Math.floor(width);var totalCPUTime=frame.cpuTime;var normalizedScale=scale;if(totalCPUTime>frame.duration)
+normalizedScale*=frame.duration/totalCPUTime;for(var i=0,bottomOffset=windowHeight;i<categories.length;++i){var category=categories[i];var duration=frame.timeByCategory[category];if(!duration)
+continue;var height=Math.round(duration*normalizedScale);var y=Math.floor(bottomOffset-height)+0.5;this._context.save();this._context.translate(x,0);this._context.scale(width/this._maxInnerBarWidth,1);this._context.fillStyle=this._fillStyles[category];this._context.fillRect(0,y,this._maxInnerBarWidth,Math.floor(height));this._context.strokeStyle=WebInspector.TimelineUIUtils.categories()[category].borderColor;this._context.beginPath();this._context.moveTo(0,y);this._context.lineTo(this._maxInnerBarWidth,y);this._context.stroke();this._context.restore();bottomOffset-=height;}
+var y0=Math.floor(windowHeight-frame.duration*scale)+0.5;var y1=windowHeight+0.5;this._context.strokeStyle="rgba(90, 90, 90, 0.3)";this._context.beginPath();this._context.moveTo(x,y1);this._context.lineTo(x,y0);this._context.lineTo(x+width,y0);this._context.lineTo(x+width,y1);this._context.stroke();},windowTimes:function(windowLeft,windowRight)
+{if(!this._barTimes.length)
+return WebInspector.TimelineOverviewBase.prototype.windowTimes.call(this,windowLeft,windowRight);var windowSpan=this._canvas.width;var leftOffset=windowLeft*windowSpan-this._outerPadding+this._actualPadding;var rightOffset=windowRight*windowSpan-this._outerPadding;var firstBar=Math.floor(Math.max(leftOffset,0)/this._actualOuterBarWidth);var lastBar=Math.min(Math.floor(rightOffset/this._actualOuterBarWidth),this._barTimes.length-1);if(firstBar>=this._barTimes.length)
+return{startTime:Infinity,endTime:Infinity};const snapToRightTolerancePixels=3;return{startTime:this._barTimes[firstBar].startTime,endTime:(rightOffset+snapToRightTolerancePixels>windowSpan)||(lastBar>=this._barTimes.length)?Infinity:this._barTimes[lastBar].endTime}},windowBoundaries:function(startTime,endTime)
+{if(this._barTimes.length===0)
+return{left:0,right:1};function barStartComparator(time,barTime)
+{return time-barTime.startTime;}
+function barEndComparator(time,barTime)
+{if(time===barTime.endTime)
+return 1;return time-barTime.endTime;}
+return{left:this._windowBoundaryFromTime(startTime,barEndComparator),right:this._windowBoundaryFromTime(endTime,barStartComparator)}},_windowBoundaryFromTime:function(time,comparator)
+{if(time===Infinity)
+return 1;var index=this._firstBarAfter(time,comparator);if(!index)
+return 0;return(this._barNumberToScreenPosition(index)-this._actualPadding/2)/this._canvas.width;},_firstBarAfter:function(time,comparator)
+{return insertionIndexForObjectInListSortedByFunction(time,this._barTimes,comparator);},__proto__:WebInspector.TimelineOverviewBase.prototype};WebInspector.TimelineMemoryOverview=function(model)
+{WebInspector.TimelineOverviewBase.call(this,model);this.element.id="timeline-overview-memory";this._maxHeapSizeLabel=this.element.createChild("div","max memory-graph-label");this._minHeapSizeLabel=this.element.createChild("div","min memory-graph-label");}
+WebInspector.TimelineMemoryOverview.prototype={resetHeapSizeLabels:function()
+{this._maxHeapSizeLabel.textContent="";this._minHeapSizeLabel.textContent="";},update:function()
+{this.resetCanvas();var records=this._model.records();if(!records.length){this.resetHeapSizeLabels();return;}
+const lowerOffset=3;var maxUsedHeapSize=0;var minUsedHeapSize=100000000000;var minTime=this._model.minimumRecordTime();var maxTime=this._model.maximumRecordTime();this._model.forAllRecords(function(r){if(!r.counters||!r.counters.jsHeapSizeUsed)
+return;maxUsedHeapSize=Math.max(maxUsedHeapSize,r.counters.jsHeapSizeUsed);minUsedHeapSize=Math.min(minUsedHeapSize,r.counters.jsHeapSizeUsed);});minUsedHeapSize=Math.min(minUsedHeapSize,maxUsedHeapSize);var width=this._canvas.width;var height=this._canvas.height-lowerOffset;var xFactor=width/(maxTime-minTime);var yFactor=height/Math.max(maxUsedHeapSize-minUsedHeapSize,1);var histogram=new Array(width);this._model.forAllRecords(function(r){if(!r.counters||!r.counters.jsHeapSizeUsed)
+return;var x=Math.round((r.endTime-minTime)*xFactor);var y=(r.counters.jsHeapSizeUsed-minUsedHeapSize)*yFactor;histogram[x]=Math.max(histogram[x]||0,y);});var y=0;var isFirstPoint=true;var ctx=this._context;ctx.save();ctx.translate(0.5,0.5);ctx.beginPath();ctx.moveTo(-1,this._canvas.height);for(var x=0;x<histogram.length;x++){if(typeof histogram[x]==="undefined")
+continue;if(isFirstPoint){isFirstPoint=false;y=histogram[x];ctx.lineTo(-1,height-y);}
+ctx.lineTo(x,height-y);y=histogram[x];ctx.lineTo(x,height-y);}
+ctx.lineTo(width,height-y);ctx.lineTo(width,this._canvas.height);ctx.lineTo(-1,this._canvas.height);ctx.closePath();var gradient=ctx.createLinearGradient(0,0,0,height);gradient.addColorStop(0,"rgba(192,204,255,1)");gradient.addColorStop(1,"rgba(192,204,255,0.4)");ctx.fillStyle=gradient;ctx.fill();ctx.lineWidth=0.5;ctx.strokeStyle="#666";ctx.stroke();ctx.restore();this._maxHeapSizeLabel.textContent=Number.bytesToString(maxUsedHeapSize);this._minHeapSizeLabel.textContent=Number.bytesToString(minUsedHeapSize);},__proto__:WebInspector.TimelineOverviewBase.prototype};WebInspector.TimelinePowerOverviewDataProvider=function()
+{this._records=[];if(Capabilities.canProfilePower)
+WebInspector.powerProfiler.addEventListener(WebInspector.PowerProfiler.EventTypes.PowerEventRecorded,this._onRecordAdded,this);}
+WebInspector.TimelinePowerOverviewDataProvider.prototype={records:function()
+{return this._records.slice(0,this._records.length-1);},_onRecordAdded:function(event)
+{var record=event.data;var length=this._records.length;if(length)
+this._records[length-1].value=record.value;this._records.push(record);},__proto__:WebInspector.Object.prototype}
+WebInspector.TimelinePowerOverview=function(model)
+{WebInspector.TimelineOverviewBase.call(this,model);this.element.id="timeline-overview-power";this._dataProvider=new WebInspector.TimelinePowerOverviewDataProvider();this._maxPowerLabel=this.element.createChild("div","max memory-graph-label");this._minPowerLabel=this.element.createChild("div","min memory-graph-label");}
+WebInspector.TimelinePowerOverview.prototype={timelineStarted:function()
+{if(Capabilities.canProfilePower)
+WebInspector.powerProfiler.startProfile();},timelineStopped:function()
+{if(Capabilities.canProfilePower)
+WebInspector.powerProfiler.stopProfile();},_resetPowerLabels:function()
+{this._maxPowerLabel.textContent="";this._minPowerLabel.textContent="";},update:function()
+{this.resetCanvas();var records=this._dataProvider.records();if(!records.length){this._resetPowerLabels();return;}
+const lowerOffset=3;var maxPower=0;var minPower=100000000000;var minTime=this._model.minimumRecordTime();var maxTime=this._model.maximumRecordTime();for(var i=0;i<records.length;i++){var record=records[i];if(record.timestamp<minTime||record.timestamp>maxTime)
+continue;maxPower=Math.max(maxPower,record.value);minPower=Math.min(minPower,record.value);}
+minPower=Math.min(minPower,maxPower);var width=this._canvas.width;var height=this._canvas.height-lowerOffset;var xFactor=width/(maxTime-minTime);var yFactor=height/Math.max(maxPower-minPower,1);var histogram=new Array(width);for(var i=0;i<records.length-1;i++){var record=records[i];if(record.timestamp<minTime||record.timestamp>maxTime)
+continue;var x=Math.round((record.timestamp-minTime)*xFactor);var y=Math.round((record.value-minPower)*yFactor);histogram[x]=Math.max(histogram[x]||0,y);}
+var y=0;var isFirstPoint=true;var ctx=this._context;ctx.save();ctx.translate(0.5,0.5);ctx.beginPath();ctx.moveTo(-1,this._canvas.height);for(var x=0;x<histogram.length;x++){if(typeof histogram[x]==="undefined")
+continue;if(isFirstPoint){isFirstPoint=false;y=histogram[x];ctx.lineTo(-1,height-y);}
+ctx.lineTo(x,height-y);y=histogram[x];ctx.lineTo(x,height-y);}
+ctx.lineTo(width,height-y);ctx.lineTo(width,this._canvas.height);ctx.lineTo(-1,this._canvas.height);ctx.closePath();ctx.fillStyle="rgba(255,192,0, 0.8);";ctx.fill();ctx.lineWidth=0.5;ctx.strokeStyle="rgba(20,0,0,0.8)";ctx.stroke();ctx.restore();this._maxPowerLabel.textContent=WebInspector.UIString("%.2f\u2009watts",maxPower);this._minPowerLabel.textContent=WebInspector.UIString("%.2f\u2009watts",minPower);;},__proto__:WebInspector.TimelineOverviewBase.prototype};WebInspector.TimelineFlameChartDataProvider=function(model,frameModel)
+{WebInspector.FlameChartDataProvider.call(this);this._model=model;this._frameModel=frameModel;this._font="bold 12px "+WebInspector.fontFamily();this._linkifier=new WebInspector.Linkifier();}
+WebInspector.TimelineFlameChartDataProvider.prototype={barHeight:function()
+{return 20;},textBaseline:function()
+{return 6;},textPadding:function()
+{return 5;},entryFont:function(entryIndex)
+{return this._font;},entryTitle:function(entryIndex)
+{var record=this._records[entryIndex];if(record===this._cpuThreadRecord)
+return WebInspector.UIString("CPU");else if(record===this._gpuThreadRecord)
+return WebInspector.UIString("GPU");var details=WebInspector.TimelineUIUtils.buildDetailsNode(record,this._linkifier);return details?WebInspector.UIString("%s (%s)",record.title(),details.textContent):record.title();},dividerOffsets:function(startTime,endTime)
+{if(endTime-startTime<16||endTime-startTime>300)
+return null;var frames=this._frameModel.filteredFrames(startTime,endTime);if(frames.length>10)
+return null;if(frames.length<3)
+return null;var offsets=[];for(var i=0;i<frames.length;++i)
+offsets.push(frames[i].startTime);offsets.push(frames.peekLast.endTime)
+return offsets;},reset:function()
+{this._timelineData=null;},timelineData:function()
+{if(this._timelineData)
+return this._timelineData;this._linkifier.reset();this._timelineData={entryLevels:[],entryTotalTimes:[],entryOffsets:[]};this._records=[];this._entryThreadDepths={};this._zeroTime=this._model.minimumRecordTime();var cpuThreadRecordPayload={type:WebInspector.TimelineModel.RecordType.Program};this._cpuThreadRecord=new WebInspector.TimelineModel.Record(this._model,(cpuThreadRecordPayload),null);this._pushRecord(this._cpuThreadRecord,0,this.zeroTime(),Math.max(this._model.maximumRecordTime(),this.totalTime()+this.zeroTime()));var gpuThreadRecordPayload={type:WebInspector.TimelineModel.RecordType.Program};this._gpuThreadRecord=new WebInspector.TimelineModel.Record(this._model,(gpuThreadRecordPayload),null);this._pushRecord(this._gpuThreadRecord,0,this.zeroTime(),Math.max(this._model.maximumRecordTime(),this.totalTime()+this.zeroTime()));var records=this._model.records();for(var i=0;i<records.length;++i){var record=records[i];var thread=record.thread;if(thread==="gpu")
+continue;if(!thread){for(var j=0;j<record.children.length;++j)
+this._appendRecord(record.children[j],1);}else{this._appendRecord(records[i],1);}}
+var cpuStackDepth=Math.max(4,this._entryThreadDepths[undefined]);delete this._entryThreadDepths[undefined];var threadBaselines={};var threadBaseline=cpuStackDepth+2;for(var thread in this._entryThreadDepths){threadBaselines[thread]=threadBaseline;threadBaseline+=this._entryThreadDepths[thread];}
+this._maxStackDepth=threadBaseline;for(var i=0;i<this._records.length;++i){var record=this._records[i];var level=this._timelineData.entryLevels[i];if(record===this._cpuThreadRecord)
+level=0;else if(record===this._gpuThreadRecord)
+level=cpuStackDepth+2;else if(record.thread)
+level+=threadBaselines[record.thread];this._timelineData.entryLevels[i]=level;}
+return this._timelineData;},zeroTime:function()
+{return this._zeroTime;},totalTime:function()
+{return Math.max(1000,this._model.maximumRecordTime()-this._model.minimumRecordTime());},maxStackDepth:function()
+{return this._maxStackDepth;},_appendRecord:function(record,level)
+{if(!this._model.isVisible(record)){for(var i=0;i<record.children.length;++i)
+this._appendRecord(record.children[i],level);return;}
+this._pushRecord(record,level,record.startTime,record.endTime);for(var i=0;i<record.children.length;++i)
+this._appendRecord(record.children[i],level+1);},_pushRecord:function(record,level,startTime,endTime)
+{var index=this._records.length;this._records.push(record);this._timelineData.entryOffsets[index]=startTime-this._zeroTime;this._timelineData.entryLevels[index]=level;this._timelineData.entryTotalTimes[index]=endTime-startTime;this._entryThreadDepths[record.thread]=Math.max(level,this._entryThreadDepths[record.thread]||0);return index;},prepareHighlightedEntryInfo:function(entryIndex)
+{return null;},canJumpToEntry:function(entryIndex)
+{return false;},entryColor:function(entryIndex)
+{var record=this._records[entryIndex];if(record===this._cpuThreadRecord||record===this._gpuThreadRecord)
+return"#555";var category=WebInspector.TimelineUIUtils.categoryForRecord(record);return category.fillColorStop1;},decorateEntry:function(entryIndex,context,text,barX,barY,barWidth,barHeight,offsetToPosition)
+{if(barWidth<5)
+return false;var record=this._records[entryIndex];var timelineData=this._timelineData;var decorated=false;if(record.children.length){var category=WebInspector.TimelineUIUtils.categoryForRecord(record);if(text){context.fillStyle="white";context.font=this._font;context.fillText(text,barX+this.textPadding(),barY+barHeight-this.textBaseline());}
+var entryOffset=timelineData.entryOffsets[entryIndex];var barSelf=offsetToPosition(entryOffset+record.selfTime)
+context.beginPath();context.fillStyle=category.backgroundColor;context.rect(barSelf,barY,barX+barWidth-barSelf,barHeight);context.fill();if(text){context.save();context.clip();context.fillStyle=category.borderColor;context.fillText(text,barX+this.textPadding(),barY+barHeight-this.textBaseline());context.restore();}
+decorated=true;}
+if(record.warnings()||record.childHasWarnings()){context.save();context.rect(barX,barY,barWidth,this.barHeight());context.clip();context.beginPath();context.fillStyle=record.warnings()?"red":"rgba(255, 0, 0, 0.5)";context.moveTo(barX+barWidth-15,barY+1);context.lineTo(barX+barWidth-1,barY+1);context.lineTo(barX+barWidth-1,barY+15);context.fill();context.restore();decorated=true;}
+return decorated;},forceDecoration:function(entryIndex)
+{var record=this._records[entryIndex];return record.childHasWarnings()||!!record.warnings();},highlightTimeRange:function(entryIndex)
+{var record=this._records[entryIndex];if(record===this._cpuThreadRecord||record===this._gpuThreadRecord)
+return null;return{startTimeOffset:record.startTime-this._zeroTime,endTimeOffset:record.endTime-this._zeroTime};},paddingLeft:function()
+{return 0;},textColor:function(entryIndex)
+{return"white";}}
+WebInspector.TimelineFlameChart=function(delegate,model,frameModel)
+{WebInspector.VBox.call(this);this.element.classList.add("timeline-flamechart");this.registerRequiredCSS("flameChart.css");this._delegate=delegate;this._model=model;this._dataProvider=new WebInspector.TimelineFlameChartDataProvider(model,frameModel);this._mainView=new WebInspector.FlameChart(this._dataProvider,this,true,true);this._mainView.show(this.element);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStarted,this._onRecordingStarted,this);this._mainView.addEventListener(WebInspector.FlameChart.Events.EntrySelected,this._onEntrySelected,this);}
+WebInspector.TimelineFlameChart.prototype={requestWindowTimes:function(windowStartTime,windowEndTime)
+{this._delegate.requestWindowTimes(windowStartTime,windowEndTime);},refreshRecords:function(textFilter)
+{this._dataProvider.reset();this._mainView._scheduleUpdate();},wasShown:function()
+{this._mainView._scheduleUpdate();},reset:function()
+{this._automaticallySizeWindow=true;this._dataProvider.reset();this._mainView.setWindowTimes(0,Infinity);},_onRecordingStarted:function()
+{this._automaticallySizeWindow=true;this._mainView.reset();},addRecord:function(record)
+{this._dataProvider.reset();if(this._automaticallySizeWindow){var minimumRecordTime=this._model.minimumRecordTime();if(record.startTime>(minimumRecordTime+1000)){this._automaticallySizeWindow=false;this._delegate.requestWindowTimes(minimumRecordTime,minimumRecordTime+1000);}
+this._mainView._scheduleUpdate();}else{if(!this._pendingUpdateTimer)
+this._pendingUpdateTimer=window.setTimeout(this._updateOnAddRecord.bind(this),300);}},_updateOnAddRecord:function()
+{delete this._pendingUpdateTimer;this._mainView._scheduleUpdate();},setWindowTimes:function(startTime,endTime)
+{this._mainView.setWindowTimes(startTime,endTime);},setSidebarSize:function(width)
+{},highlightSearchResult:function(record,regex,selectRecord)
+{},setSelectedRecord:function(record)
+{var entryRecords=this._dataProvider._records;for(var entryIndex=0;entryIndex<entryRecords.length;++entryIndex){if(entryRecords[entryIndex]===record){this._mainView.setSelectedEntry(entryIndex);return;}}
+this._mainView.setSelectedEntry(-1);},_onEntrySelected:function(event)
+{var entryIndex=event.data;var record=this._dataProvider._records[entryIndex];this._delegate.selectRecord(record);},__proto__:WebInspector.VBox.prototype};WebInspector.TimelineUIUtils=function(){}
+WebInspector.TimelineUIUtils.categories=function()
+{if(WebInspector.TimelineUIUtils._categories)
+return WebInspector.TimelineUIUtils._categories;WebInspector.TimelineUIUtils._categories={loading:new WebInspector.TimelineCategory("loading",WebInspector.UIString("Loading"),0,"hsl(214, 53%, 58%)","hsl(214, 67%, 90%)","hsl(214, 67%, 74%)","hsl(214, 67%, 66%)"),scripting:new WebInspector.TimelineCategory("scripting",WebInspector.UIString("Scripting"),1,"hsl(43, 68%, 53%)","hsl(43, 83%, 90%)","hsl(43, 83%, 72%)","hsl(43, 83%, 64%) "),rendering:new WebInspector.TimelineCategory("rendering",WebInspector.UIString("Rendering"),2,"hsl(256, 50%, 60%)","hsl(256, 67%, 90%)","hsl(256, 67%, 76%)","hsl(256, 67%, 70%)"),painting:new WebInspector.TimelineCategory("painting",WebInspector.UIString("Painting"),2,"hsl(109, 33%, 47%)","hsl(109, 33%, 90%)","hsl(109, 33%, 64%)","hsl(109, 33%, 55%)"),other:new WebInspector.TimelineCategory("other",WebInspector.UIString("Other"),-1,"hsl(0, 0%, 73%)","hsl(0, 0%, 90%)","hsl(0, 0%, 87%)","hsl(0, 0%, 79%)"),idle:new WebInspector.TimelineCategory("idle",WebInspector.UIString("Idle"),-1,"hsl(0, 0%, 87%)","hsl(0, 100%, 100%)","hsl(0, 100%, 100%)","hsl(0, 100%, 100%)")};return WebInspector.TimelineUIUtils._categories;};WebInspector.TimelineUIUtils._initRecordStyles=function()
+{if(WebInspector.TimelineUIUtils._recordStylesMap)
+return WebInspector.TimelineUIUtils._recordStylesMap;var recordTypes=WebInspector.TimelineModel.RecordType;var categories=WebInspector.TimelineUIUtils.categories();var recordStyles={};recordStyles[recordTypes.Root]={title:"#root",category:categories["loading"]};recordStyles[recordTypes.Program]={title:WebInspector.UIString("Other"),category:categories["other"]};recordStyles[recordTypes.EventDispatch]={title:WebInspector.UIString("Event"),category:categories["scripting"]};recordStyles[recordTypes.BeginFrame]={title:WebInspector.UIString("Frame Start"),category:categories["rendering"]};recordStyles[recordTypes.ScheduleStyleRecalculation]={title:WebInspector.UIString("Schedule Style Recalculation"),category:categories["rendering"]};recordStyles[recordTypes.RecalculateStyles]={title:WebInspector.UIString("Recalculate Style"),category:categories["rendering"]};recordStyles[recordTypes.InvalidateLayout]={title:WebInspector.UIString("Invalidate Layout"),category:categories["rendering"]};recordStyles[recordTypes.Layout]={title:WebInspector.UIString("Layout"),category:categories["rendering"]};recordStyles[recordTypes.AutosizeText]={title:WebInspector.UIString("Autosize Text"),category:categories["rendering"]};recordStyles[recordTypes.PaintSetup]={title:WebInspector.UIString("Paint Setup"),category:categories["painting"]};recordStyles[recordTypes.Paint]={title:WebInspector.UIString("Paint"),category:categories["painting"]};recordStyles[recordTypes.Rasterize]={title:WebInspector.UIString("Paint"),category:categories["painting"]};recordStyles[recordTypes.ScrollLayer]={title:WebInspector.UIString("Scroll"),category:categories["rendering"]};recordStyles[recordTypes.DecodeImage]={title:WebInspector.UIString("Image Decode"),category:categories["painting"]};recordStyles[recordTypes.ResizeImage]={title:WebInspector.UIString("Image Resize"),category:categories["painting"]};recordStyles[recordTypes.CompositeLayers]={title:WebInspector.UIString("Composite Layers"),category:categories["painting"]};recordStyles[recordTypes.ParseHTML]={title:WebInspector.UIString("Parse HTML"),category:categories["loading"]};recordStyles[recordTypes.TimerInstall]={title:WebInspector.UIString("Install Timer"),category:categories["scripting"]};recordStyles[recordTypes.TimerRemove]={title:WebInspector.UIString("Remove Timer"),category:categories["scripting"]};recordStyles[recordTypes.TimerFire]={title:WebInspector.UIString("Timer Fired"),category:categories["scripting"]};recordStyles[recordTypes.XHRReadyStateChange]={title:WebInspector.UIString("XHR Ready State Change"),category:categories["scripting"]};recordStyles[recordTypes.XHRLoad]={title:WebInspector.UIString("XHR Load"),category:categories["scripting"]};recordStyles[recordTypes.EvaluateScript]={title:WebInspector.UIString("Evaluate Script"),category:categories["scripting"]};recordStyles[recordTypes.ResourceSendRequest]={title:WebInspector.UIString("Send Request"),category:categories["loading"]};recordStyles[recordTypes.ResourceReceiveResponse]={title:WebInspector.UIString("Receive Response"),category:categories["loading"]};recordStyles[recordTypes.ResourceFinish]={title:WebInspector.UIString("Finish Loading"),category:categories["loading"]};recordStyles[recordTypes.FunctionCall]={title:WebInspector.UIString("Function Call"),category:categories["scripting"]};recordStyles[recordTypes.ResourceReceivedData]={title:WebInspector.UIString("Receive Data"),category:categories["loading"]};recordStyles[recordTypes.GCEvent]={title:WebInspector.UIString("GC Event"),category:categories["scripting"]};recordStyles[recordTypes.MarkDOMContent]={title:WebInspector.UIString("DOMContentLoaded event"),category:categories["scripting"]};recordStyles[recordTypes.MarkLoad]={title:WebInspector.UIString("Load event"),category:categories["scripting"]};recordStyles[recordTypes.MarkFirstPaint]={title:WebInspector.UIString("First paint"),category:categories["painting"]};recordStyles[recordTypes.TimeStamp]={title:WebInspector.UIString("Stamp"),category:categories["scripting"]};recordStyles[recordTypes.ConsoleTime]={title:WebInspector.UIString("Console Time"),category:categories["scripting"]};recordStyles[recordTypes.ScheduleResourceRequest]={title:WebInspector.UIString("Schedule Request"),category:categories["loading"]};recordStyles[recordTypes.RequestAnimationFrame]={title:WebInspector.UIString("Request Animation Frame"),category:categories["scripting"]};recordStyles[recordTypes.CancelAnimationFrame]={title:WebInspector.UIString("Cancel Animation Frame"),category:categories["scripting"]};recordStyles[recordTypes.FireAnimationFrame]={title:WebInspector.UIString("Animation Frame Fired"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketCreate]={title:WebInspector.UIString("Create WebSocket"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketSendHandshakeRequest]={title:WebInspector.UIString("Send WebSocket Handshake"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketReceiveHandshakeResponse]={title:WebInspector.UIString("Receive WebSocket Handshake"),category:categories["scripting"]};recordStyles[recordTypes.WebSocketDestroy]={title:WebInspector.UIString("Destroy WebSocket"),category:categories["scripting"]};recordStyles[recordTypes.EmbedderCallback]={title:WebInspector.UIString("Embedder Callback"),category:categories["scripting"]};WebInspector.TimelineUIUtils._recordStylesMap=recordStyles;return recordStyles;}
+WebInspector.TimelineUIUtils.recordStyle=function(record)
+{var recordStyles=WebInspector.TimelineUIUtils._initRecordStyles();var result=recordStyles[record.type];if(!result){result={title:WebInspector.UIString("Unknown: %s",record.type),category:WebInspector.TimelineUIUtils.categories()["other"]};recordStyles[record.type]=result;}
+return result;}
+WebInspector.TimelineUIUtils.categoryForRecord=function(record)
+{return WebInspector.TimelineUIUtils.recordStyle(record).category;}
+WebInspector.TimelineUIUtils.isEventDivider=function(record)
+{var recordTypes=WebInspector.TimelineModel.RecordType;if(record.type===recordTypes.TimeStamp)
+return true;if(record.type===recordTypes.MarkFirstPaint)
+return true;if(record.type===recordTypes.MarkDOMContent||record.type===recordTypes.MarkLoad){if(record.data&&((typeof record.data.isMainFrame)==="boolean"))
+return record.data.isMainFrame;}
+return false;}
+WebInspector.TimelineUIUtils.needsPreviewElement=function(recordType)
+{if(!recordType)
+return false;const recordTypes=WebInspector.TimelineModel.RecordType;switch(recordType){case recordTypes.ScheduleResourceRequest:case recordTypes.ResourceSendRequest:case recordTypes.ResourceReceiveResponse:case recordTypes.ResourceReceivedData:case recordTypes.ResourceFinish:return true;default:return false;}}
+WebInspector.TimelineUIUtils.createEventDivider=function(recordType,title)
+{var eventDivider=document.createElement("div");eventDivider.className="resources-event-divider";var recordTypes=WebInspector.TimelineModel.RecordType;if(recordType===recordTypes.MarkDOMContent)
+eventDivider.className+=" resources-blue-divider";else if(recordType===recordTypes.MarkLoad)
+eventDivider.className+=" resources-red-divider";else if(recordType===recordTypes.MarkFirstPaint)
+eventDivider.className+=" resources-green-divider";else if(recordType===recordTypes.TimeStamp)
+eventDivider.className+=" resources-orange-divider";else if(recordType===recordTypes.BeginFrame)
+eventDivider.className+=" timeline-frame-divider";if(title)
+eventDivider.title=title;return eventDivider;}
+WebInspector.TimelineUIUtils.generateMainThreadBarPopupContent=function(model,info)
+{var firstTaskIndex=info.firstTaskIndex;var lastTaskIndex=info.lastTaskIndex;var tasks=info.tasks;var messageCount=lastTaskIndex-firstTaskIndex+1;var cpuTime=0;for(var i=firstTaskIndex;i<=lastTaskIndex;++i){var task=tasks[i];cpuTime+=task.endTime-task.startTime;}
+var startTime=tasks[firstTaskIndex].startTime;var endTime=tasks[lastTaskIndex].endTime;var duration=endTime-startTime;var contentHelper=new WebInspector.TimelinePopupContentHelper(info.name);var durationText=WebInspector.UIString("%s (at %s)",Number.millisToString(duration,true),Number.millisToString(startTime-model.minimumRecordTime(),true));contentHelper.appendTextRow(WebInspector.UIString("Duration"),durationText);contentHelper.appendTextRow(WebInspector.UIString("CPU time"),Number.millisToString(cpuTime,true));contentHelper.appendTextRow(WebInspector.UIString("Message Count"),messageCount);return contentHelper.contentTable();}
+WebInspector.TimelineUIUtils.recordTitle=function(record)
+{if(record.type===WebInspector.TimelineModel.RecordType.TimeStamp)
+return record.data["message"];if(WebInspector.TimelineUIUtils.isEventDivider(record)){var startTime=Number.millisToString(record.startTimeOffset);return WebInspector.UIString("%s at %s",WebInspector.TimelineUIUtils.recordStyle(record).title,startTime,true);}
+return WebInspector.TimelineUIUtils.recordStyle(record).title;}
+WebInspector.TimelineUIUtils.aggregateTimeByCategory=function(total,addend)
+{for(var category in addend)
+total[category]=(total[category]||0)+addend[category];}
+WebInspector.TimelineUIUtils.aggregateTimeForRecord=function(total,record)
+{var childrenTime=0;var children=record.children;for(var i=0;i<children.length;++i){WebInspector.TimelineUIUtils.aggregateTimeForRecord(total,children[i]);childrenTime+=children[i].endTime-children[i].startTime;}
+var categoryName=WebInspector.TimelineUIUtils.recordStyle(record).category.name;var ownTime=record.endTime-record.startTime-childrenTime;total[categoryName]=(total[categoryName]||0)+ownTime;}
+WebInspector.TimelineUIUtils._generateAggregatedInfo=function(aggregatedStats)
+{var cell=document.createElement("span");cell.className="timeline-aggregated-info";for(var index in aggregatedStats){var label=document.createElement("div");label.className="timeline-aggregated-category timeline-"+index;cell.appendChild(label);var text=document.createElement("span");text.textContent=Number.millisToString(aggregatedStats[index],true);cell.appendChild(text);}
+return cell;}
+WebInspector.TimelineUIUtils.generatePieChart=function(aggregatedStats,selfCategory,selfTime)
+{var element=document.createElement("div");element.className="timeline-aggregated-info";var total=0;for(var categoryName in aggregatedStats)
+total+=aggregatedStats[categoryName];function formatter(value)
+{return Number.millisToString(value,true);}
+var pieChart=new WebInspector.PieChart(total,formatter);element.appendChild(pieChart.element);var footerElement=element.createChild("div","timeline-aggregated-info-legend");if(selfCategory&&selfTime){pieChart.addSlice(selfTime,selfCategory.fillColorStop1);var rowElement=footerElement.createChild("div");rowElement.createChild("div","timeline-aggregated-category timeline-"+selfCategory.name);rowElement.createTextChild(WebInspector.UIString("%s %s (Self)",formatter(selfTime),selfCategory.title));var categoryTime=aggregatedStats[selfCategory.name];var value=categoryTime-selfTime;if(value>0){pieChart.addSlice(value,selfCategory.fillColorStop0);rowElement=footerElement.createChild("div");rowElement.createChild("div","timeline-aggregated-category timeline-"+selfCategory.name);rowElement.createTextChild(WebInspector.UIString("%s %s (Children)",formatter(value),selfCategory.title));}}
+for(var categoryName in WebInspector.TimelineUIUtils.categories()){var category=WebInspector.TimelineUIUtils.categories()[categoryName];if(category===selfCategory)
+continue;var value=aggregatedStats[category.name];if(!value)
+continue;pieChart.addSlice(value,category.fillColorStop0);var rowElement=footerElement.createChild("div");rowElement.createChild("div","timeline-aggregated-category timeline-"+category.name);rowElement.createTextChild(WebInspector.UIString("%s %s",formatter(value),category.title));}
+return element;}
+WebInspector.TimelineUIUtils.generatePopupContentForFrame=function(frame)
+{var contentHelper=new WebInspector.TimelinePopupContentHelper(WebInspector.UIString("Frame"));var durationInMillis=frame.endTime-frame.startTime;var durationText=WebInspector.UIString("%s (at %s)",Number.millisToString(frame.endTime-frame.startTime,true),Number.millisToString(frame.startTimeOffset,true));contentHelper.appendTextRow(WebInspector.UIString("Duration"),durationText);contentHelper.appendTextRow(WebInspector.UIString("FPS"),Math.floor(1000/durationInMillis));contentHelper.appendTextRow(WebInspector.UIString("CPU time"),Number.millisToString(frame.cpuTime,true));contentHelper.appendElementRow(WebInspector.UIString("Aggregated Time"),WebInspector.TimelineUIUtils._generateAggregatedInfo(frame.timeByCategory));if(WebInspector.experimentsSettings.layersPanel.isEnabled()&&frame.layerTree){var layerTreeSnapshot=new WebInspector.LayerTreeSnapshot(frame.layerTree);contentHelper.appendElementRow(WebInspector.UIString("Layer tree"),WebInspector.Linkifier.linkifyUsingRevealer(layerTreeSnapshot,WebInspector.UIString("show")));}
+return contentHelper.contentTable();}
+WebInspector.TimelineUIUtils.generatePopupContentForFrameStatistics=function(statistics)
+{function formatTimeAndFPS(time)
+{return WebInspector.UIString("%s (%.0f FPS)",Number.millisToString(time,true),1/time);}
+var contentHelper=new WebInspector.TimelineDetailsContentHelper(new WebInspector.Linkifier(),false);contentHelper.appendTextRow(WebInspector.UIString("Minimum Time"),formatTimeAndFPS(statistics.minDuration));contentHelper.appendTextRow(WebInspector.UIString("Average Time"),formatTimeAndFPS(statistics.average));contentHelper.appendTextRow(WebInspector.UIString("Maximum Time"),formatTimeAndFPS(statistics.maxDuration));contentHelper.appendTextRow(WebInspector.UIString("Standard Deviation"),Number.millisToString(statistics.stddev,true));return contentHelper.element;}
+WebInspector.TimelineUIUtils.createFillStyle=function(context,width,height,color0,color1,color2)
+{var gradient=context.createLinearGradient(0,0,width,height);gradient.addColorStop(0,color0);gradient.addColorStop(0.25,color1);gradient.addColorStop(0.75,color1);gradient.addColorStop(1,color2);return gradient;}
+WebInspector.TimelineUIUtils.createFillStyleForCategory=function(context,width,height,category)
+{return WebInspector.TimelineUIUtils.createFillStyle(context,width,height,category.fillColorStop0,category.fillColorStop1,category.borderColor);}
+WebInspector.TimelineUIUtils.createStyleRuleForCategory=function(category)
+{var selector=".timeline-category-"+category.name+" .timeline-graph-bar, "+".panel.timeline .timeline-filters-header .filter-checkbox-filter.filter-checkbox-filter-"+category.name+" .checkbox-filter-checkbox, "+".popover .timeline-"+category.name+", "+".timeline-details-view .timeline-"+category.name+", "+".timeline-category-"+category.name+" .timeline-tree-icon"
+return selector+" { background-image: linear-gradient("+
+category.fillColorStop0+", "+category.fillColorStop1+" 25%, "+category.fillColorStop1+" 25%, "+category.fillColorStop1+");"+" border-color: "+category.borderColor+"}";}
+WebInspector.TimelineUIUtils.generatePopupContent=function(record,linkifier,callback)
+{var imageElement=(record.getUserObject("TimelineUIUtils::preview-element")||null);var relatedNode=null;var barrier=new CallbackBarrier();if(!imageElement&&WebInspector.TimelineUIUtils.needsPreviewElement(record.type))
+WebInspector.DOMPresentationUtils.buildImagePreviewContents(record.url,false,barrier.createCallback(saveImage));if(record.relatedBackendNodeId())
+WebInspector.domModel.pushNodesByBackendIdsToFrontend([record.relatedBackendNodeId()],barrier.createCallback(setRelatedNode));barrier.callWhenDone(callbackWrapper);function saveImage(element)
+{imageElement=element||null;record.setUserObject("TimelineUIUtils::preview-element",element);}
+function setRelatedNode(nodeIds)
+{if(nodeIds)
+relatedNode=WebInspector.domModel.nodeForId(nodeIds[0]);}
+function callbackWrapper()
+{callback(WebInspector.TimelineUIUtils._generatePopupContentSynchronously(record,linkifier,imageElement,relatedNode));}}
+WebInspector.TimelineUIUtils._generatePopupContentSynchronously=function(record,linkifier,imagePreviewElement,relatedNode)
+{var fragment=document.createDocumentFragment();if(record.children.length)
+fragment.appendChild(WebInspector.TimelineUIUtils.generatePieChart(record.aggregatedStats,record.category,record.selfTime));else
+fragment.appendChild(WebInspector.TimelineUIUtils.generatePieChart(record.aggregatedStats));const recordTypes=WebInspector.TimelineModel.RecordType;var callSiteStackTraceLabel;var callStackLabel;var relatedNodeLabel;var contentHelper=new WebInspector.TimelineDetailsContentHelper(linkifier,true);contentHelper.appendTextRow(WebInspector.UIString("Self Time"),Number.millisToString(record.selfTime,true));contentHelper.appendTextRow(WebInspector.UIString("Start Time"),Number.millisToString(record.startTimeOffset));switch(record.type){case recordTypes.GCEvent:contentHelper.appendTextRow(WebInspector.UIString("Collected"),Number.bytesToString(record.data["usedHeapSizeDelta"]));break;case recordTypes.TimerFire:callSiteStackTraceLabel=WebInspector.UIString("Timer installed");case recordTypes.TimerInstall:case recordTypes.TimerRemove:contentHelper.appendTextRow(WebInspector.UIString("Timer ID"),record.data["timerId"]);if(typeof record.timeout==="number"){contentHelper.appendTextRow(WebInspector.UIString("Timeout"),Number.millisToString(record.timeout));contentHelper.appendTextRow(WebInspector.UIString("Repeats"),!record.singleShot);}
+break;case recordTypes.FireAnimationFrame:callSiteStackTraceLabel=WebInspector.UIString("Animation frame requested");contentHelper.appendTextRow(WebInspector.UIString("Callback ID"),record.data["id"]);break;case recordTypes.FunctionCall:if(record.scriptName)
+contentHelper.appendLocationRow(WebInspector.UIString("Location"),record.scriptName,record.scriptLine);break;case recordTypes.ScheduleResourceRequest:case recordTypes.ResourceSendRequest:case recordTypes.ResourceReceiveResponse:case recordTypes.ResourceReceivedData:case recordTypes.ResourceFinish:contentHelper.appendElementRow(WebInspector.UIString("Resource"),WebInspector.linkifyResourceAsNode(record.url));if(imagePreviewElement)
+contentHelper.appendElementRow(WebInspector.UIString("Preview"),imagePreviewElement);if(record.data["requestMethod"])
+contentHelper.appendTextRow(WebInspector.UIString("Request Method"),record.data["requestMethod"]);if(typeof record.data["statusCode"]==="number")
+contentHelper.appendTextRow(WebInspector.UIString("Status Code"),record.data["statusCode"]);if(record.data["mimeType"])
+contentHelper.appendTextRow(WebInspector.UIString("MIME Type"),record.data["mimeType"]);if(record.data["encodedDataLength"])
+contentHelper.appendTextRow(WebInspector.UIString("Encoded Data Length"),WebInspector.UIString("%d Bytes",record.data["encodedDataLength"]));break;case recordTypes.EvaluateScript:if(record.data&&record.url)
+contentHelper.appendLocationRow(WebInspector.UIString("Script"),record.url,record.data["lineNumber"]);break;case recordTypes.Paint:var clip=record.data["clip"];if(clip){contentHelper.appendTextRow(WebInspector.UIString("Location"),WebInspector.UIString("(%d, %d)",clip[0],clip[1]));var clipWidth=WebInspector.TimelineUIUtils._quadWidth(clip);var clipHeight=WebInspector.TimelineUIUtils._quadHeight(clip);contentHelper.appendTextRow(WebInspector.UIString("Dimensions"),WebInspector.UIString("%d × %d",clipWidth,clipHeight));}else{if(typeof record.data["x"]!=="undefined"&&typeof record.data["y"]!=="undefined")
+contentHelper.appendTextRow(WebInspector.UIString("Location"),WebInspector.UIString("(%d, %d)",record.data["x"],record.data["y"]));if(typeof record.data["width"]!=="undefined"&&typeof record.data["height"]!=="undefined")
+contentHelper.appendTextRow(WebInspector.UIString("Dimensions"),WebInspector.UIString("%d\u2009\u00d7\u2009%d",record.data["width"],record.data["height"]));}
+case recordTypes.PaintSetup:case recordTypes.Rasterize:case recordTypes.ScrollLayer:relatedNodeLabel=WebInspector.UIString("Layer root");break;case recordTypes.AutosizeText:relatedNodeLabel=WebInspector.UIString("Root node");break;case recordTypes.DecodeImage:case recordTypes.ResizeImage:relatedNodeLabel=WebInspector.UIString("Image element");if(record.url)
+contentHelper.appendElementRow(WebInspector.UIString("Image URL"),WebInspector.linkifyResourceAsNode(record.url));break;case recordTypes.RecalculateStyles:if(record.data["elementCount"])
+contentHelper.appendTextRow(WebInspector.UIString("Elements affected"),record.data["elementCount"]);callStackLabel=WebInspector.UIString("Styles recalculation forced");break;case recordTypes.Layout:if(record.data["dirtyObjects"])
+contentHelper.appendTextRow(WebInspector.UIString("Nodes that need layout"),record.data["dirtyObjects"]);if(record.data["totalObjects"])
+contentHelper.appendTextRow(WebInspector.UIString("Layout tree size"),record.data["totalObjects"]);if(typeof record.data["partialLayout"]==="boolean"){contentHelper.appendTextRow(WebInspector.UIString("Layout scope"),record.data["partialLayout"]?WebInspector.UIString("Partial"):WebInspector.UIString("Whole document"));}
+callSiteStackTraceLabel=WebInspector.UIString("Layout invalidated");callStackLabel=WebInspector.UIString("Layout forced");relatedNodeLabel=WebInspector.UIString("Layout root");break;case recordTypes.ConsoleTime:contentHelper.appendTextRow(WebInspector.UIString("Message"),record.data["message"]);break;case recordTypes.WebSocketCreate:case recordTypes.WebSocketSendHandshakeRequest:case recordTypes.WebSocketReceiveHandshakeResponse:case recordTypes.WebSocketDestroy:if(typeof record.webSocketURL!=="undefined")
+contentHelper.appendTextRow(WebInspector.UIString("URL"),record.webSocketURL);if(typeof record.webSocketProtocol!=="undefined")
+contentHelper.appendTextRow(WebInspector.UIString("WebSocket Protocol"),record.webSocketProtocol);if(typeof record.data["message"]!=="undefined")
+contentHelper.appendTextRow(WebInspector.UIString("Message"),record.data["message"]);break;case recordTypes.EmbedderCallback:contentHelper.appendTextRow(WebInspector.UIString("Callback Function"),record.embedderCallbackName);break;default:var detailsNode=WebInspector.TimelineUIUtils.buildDetailsNode(record,linkifier);if(detailsNode)
+contentHelper.appendElementRow(WebInspector.UIString("Details"),detailsNode);break;}
+if(relatedNode)
+contentHelper.appendElementRow(relatedNodeLabel||WebInspector.UIString("Related node"),WebInspector.DOMPresentationUtils.linkifyNodeReference(relatedNode));if(record.scriptName&&record.type!==recordTypes.FunctionCall)
+contentHelper.appendLocationRow(WebInspector.UIString("Function Call"),record.scriptName,record.scriptLine);if(record.jsHeapSizeUsed){if(record.usedHeapSizeDelta){var sign=record.usedHeapSizeDelta>0?"+":"-";contentHelper.appendTextRow(WebInspector.UIString("Used JavaScript Heap Size"),WebInspector.UIString("%s (%s%s)",Number.bytesToString(record.jsHeapSizeUsed),sign,Number.bytesToString(Math.abs(record.usedHeapSizeDelta))));}else if(record.category===WebInspector.TimelineUIUtils.categories().scripting)
+contentHelper.appendTextRow(WebInspector.UIString("Used JavaScript Heap Size"),Number.bytesToString(record.jsHeapSizeUsed));}
+if(record.callSiteStackTrace)
+contentHelper.appendStackTrace(callSiteStackTraceLabel||WebInspector.UIString("Call Site stack"),record.callSiteStackTrace);if(record.stackTrace)
+contentHelper.appendStackTrace(callStackLabel||WebInspector.UIString("Call Stack"),record.stackTrace);if(record.warnings()){var ul=document.createElement("ul");for(var i=0;i<record.warnings().length;++i)
+ul.createChild("li").textContent=record.warnings()[i];contentHelper.appendElementRow(WebInspector.UIString("Warning"),ul);}
+fragment.appendChild(contentHelper.element);return fragment;}
+WebInspector.TimelineUIUtils._quadWidth=function(quad)
+{return Math.round(Math.sqrt(Math.pow(quad[0]-quad[2],2)+Math.pow(quad[1]-quad[3],2)));}
+WebInspector.TimelineUIUtils._quadHeight=function(quad)
+{return Math.round(Math.sqrt(Math.pow(quad[0]-quad[6],2)+Math.pow(quad[1]-quad[7],2)));}
+WebInspector.TimelineUIUtils.buildDetailsNode=function(record,linkifier)
+{var details;var detailsText;switch(record.type){case WebInspector.TimelineModel.RecordType.GCEvent:detailsText=WebInspector.UIString("%s collected",Number.bytesToString(record.data["usedHeapSizeDelta"]));break;case WebInspector.TimelineModel.RecordType.TimerFire:detailsText=record.data["timerId"];break;case WebInspector.TimelineModel.RecordType.FunctionCall:if(record.scriptName)
+details=linkifyLocation(record.scriptName,record.scriptLine,0);break;case WebInspector.TimelineModel.RecordType.FireAnimationFrame:detailsText=record.data["id"];break;case WebInspector.TimelineModel.RecordType.EventDispatch:detailsText=record.data?record.data["type"]:null;break;case WebInspector.TimelineModel.RecordType.Paint:var width=record.data.clip?WebInspector.TimelineUIUtils._quadWidth(record.data.clip):record.data.width;var height=record.data.clip?WebInspector.TimelineUIUtils._quadHeight(record.data.clip):record.data.height;if(width&&height)
+detailsText=WebInspector.UIString("%d\u2009\u00d7\u2009%d",width,height);break;case WebInspector.TimelineModel.RecordType.TimerInstall:case WebInspector.TimelineModel.RecordType.TimerRemove:details=linkifyTopCallFrame();detailsText=record.data["timerId"];break;case WebInspector.TimelineModel.RecordType.RequestAnimationFrame:case WebInspector.TimelineModel.RecordType.CancelAnimationFrame:details=linkifyTopCallFrame();detailsText=record.data["id"];break;case WebInspector.TimelineModel.RecordType.ParseHTML:case WebInspector.TimelineModel.RecordType.RecalculateStyles:details=linkifyTopCallFrame();break;case WebInspector.TimelineModel.RecordType.EvaluateScript:details=record.url?linkifyLocation(record.url,record.data["lineNumber"],0):null;break;case WebInspector.TimelineModel.RecordType.XHRReadyStateChange:case WebInspector.TimelineModel.RecordType.XHRLoad:case WebInspector.TimelineModel.RecordType.ScheduleResourceRequest:case WebInspector.TimelineModel.RecordType.ResourceSendRequest:case WebInspector.TimelineModel.RecordType.ResourceReceivedData:case WebInspector.TimelineModel.RecordType.ResourceReceiveResponse:case WebInspector.TimelineModel.RecordType.ResourceFinish:case WebInspector.TimelineModel.RecordType.DecodeImage:case WebInspector.TimelineModel.RecordType.ResizeImage:detailsText=WebInspector.displayNameForURL(record.url);break;case WebInspector.TimelineModel.RecordType.ConsoleTime:detailsText=record.data["message"];break;case WebInspector.TimelineModel.RecordType.EmbedderCallback:detailsText=record.data["callbackName"];break;default:details=record.scriptName?linkifyLocation(record.scriptName,record.scriptLine,0):linkifyTopCallFrame();break;}
+if(!details&&detailsText)
+details=document.createTextNode(detailsText);return details;function linkifyLocation(url,lineNumber,columnNumber)
+{columnNumber=columnNumber?columnNumber-1:0;return linkifier.linkifyLocation(url,lineNumber-1,columnNumber,"timeline-details");}
+function linkifyCallFrame(callFrame)
+{return linkifyLocation(callFrame.url,callFrame.lineNumber,callFrame.columnNumber);}
+function linkifyTopCallFrame()
+{if(record.stackTrace)
+return linkifyCallFrame(record.stackTrace[0]);if(record.callSiteStackTrace)
+return linkifyCallFrame(record.callSiteStackTrace[0]);return null;}
+function linkifyScriptLocation()
+{return record.scriptName?linkifyLocation(record.scriptName,record.scriptLine,0):null;}}
+WebInspector.TimelineCategory=function(name,title,overviewStripGroupIndex,borderColor,backgroundColor,fillColorStop0,fillColorStop1)
+{this.name=name;this.title=title;this.overviewStripGroupIndex=overviewStripGroupIndex;this.borderColor=borderColor;this.backgroundColor=backgroundColor;this.fillColorStop0=fillColorStop0;this.fillColorStop1=fillColorStop1;this.hidden=false;}
+WebInspector.TimelineCategory.Events={VisibilityChanged:"VisibilityChanged"};WebInspector.TimelineCategory.prototype={get hidden()
+{return this._hidden;},set hidden(hidden)
+{this._hidden=hidden;this.dispatchEventToListeners(WebInspector.TimelineCategory.Events.VisibilityChanged,this);},__proto__:WebInspector.Object.prototype}
+WebInspector.TimelinePopupContentHelper=function(title)
+{this._contentTable=document.createElement("table");var titleCell=this._createCell(WebInspector.UIString("%s - Details",title),"timeline-details-title");titleCell.colSpan=2;var titleRow=document.createElement("tr");titleRow.appendChild(titleCell);this._contentTable.appendChild(titleRow);}
+WebInspector.TimelinePopupContentHelper.prototype={contentTable:function()
+{return this._contentTable;},_createCell:function(content,styleName)
+{var text=document.createElement("label");text.appendChild(document.createTextNode(content));var cell=document.createElement("td");cell.className="timeline-details";if(styleName)
+cell.className+=" "+styleName;cell.textContent=content;return cell;},appendTextRow:function(title,content)
+{var row=document.createElement("tr");row.appendChild(this._createCell(title,"timeline-details-row-title"));row.appendChild(this._createCell(content,"timeline-details-row-data"));this._contentTable.appendChild(row);},appendElementRow:function(title,content)
+{var row=document.createElement("tr");var titleCell=this._createCell(title,"timeline-details-row-title");row.appendChild(titleCell);var cell=document.createElement("td");cell.className="details";if(content instanceof Node)
+cell.appendChild(content);else
+cell.createTextChild(content||"");row.appendChild(cell);this._contentTable.appendChild(row);}}
+WebInspector.TimelineDetailsContentHelper=function(linkifier,monospaceValues)
+{this._linkifier=linkifier;this.element=document.createElement("div");this.element.className="timeline-details-view-block";this._monospaceValues=monospaceValues;}
+WebInspector.TimelineDetailsContentHelper.prototype={appendTextRow:function(title,value)
+{var rowElement=this.element.createChild("div","timeline-details-view-row");rowElement.createChild("span","timeline-details-view-row-title").textContent=WebInspector.UIString("%s: ",title);rowElement.createChild("span","timeline-details-view-row-value"+(this._monospaceValues?" monospace":"")).textContent=value;},appendElementRow:function(title,content)
+{var rowElement=this.element.createChild("div","timeline-details-view-row");rowElement.createChild("span","timeline-details-view-row-title").textContent=WebInspector.UIString("%s: ",title);var valueElement=rowElement.createChild("span","timeline-details-view-row-details"+(this._monospaceValues?" monospace":""));if(content instanceof Node)
+valueElement.appendChild(content);else
+valueElement.createTextChild(content||"");},appendLocationRow:function(title,url,line)
+{this.appendElementRow(title,this._linkifier.linkifyLocation(url,line-1)||"");},appendStackTrace:function(title,stackTrace)
+{var rowElement=this.element.createChild("div","timeline-details-view-row");rowElement.createChild("span","timeline-details-view-row-title").textContent=WebInspector.UIString("%s: ",title);var stackTraceElement=rowElement.createChild("div","timeline-details-view-row-stack-trace monospace");for(var i=0;i<stackTrace.length;++i){var stackFrame=stackTrace[i];var row=stackTraceElement.createChild("div");row.createTextChild(stackFrame.functionName||WebInspector.UIString("(anonymous function)"));row.createTextChild(" @ ");var urlElement=this._linkifier.linkifyLocation(stackFrame.url,stackFrame.lineNumber-1);row.appendChild(urlElement);}}};WebInspector.TimelineView=function(delegate,model)
+{WebInspector.HBox.call(this);this.element.classList.add("timeline-view");this._delegate=delegate;this._model=model;this._presentationModel=new WebInspector.TimelinePresentationModel(model);this._calculator=new WebInspector.TimelineCalculator(model);this._linkifier=new WebInspector.Linkifier();this._boundariesAreValid=true;this._scrollTop=0;this._recordsView=this._createRecordsView();this._recordsView.addEventListener(WebInspector.SplitView.Events.SidebarSizeChanged,this._sidebarResized,this);this._recordsView.show(this.element);this._headerElement=this.element.createChild("div","fill");this._headerElement.id="timeline-graph-records-header";this._cpuBarsElement=this._headerElement.createChild("div","timeline-utilization-strip");if(WebInspector.experimentsSettings.gpuTimeline.isEnabled())
+this._gpuBarsElement=this._headerElement.createChild("div","timeline-utilization-strip gpu");this._popoverHelper=new WebInspector.PopoverHelper(this.element,this._getPopoverAnchor.bind(this),this._showPopover.bind(this));this.element.addEventListener("mousemove",this._mouseMove.bind(this),false);this.element.addEventListener("mouseout",this._mouseOut.bind(this),false);this.element.addEventListener("keydown",this._keyDown.bind(this),false);this._expandOffset=15;}
+WebInspector.TimelineView.prototype={setFrameModel:function(frameModel)
+{this._frameModel=frameModel;},_createRecordsView:function()
+{var recordsView=new WebInspector.SplitView(true,false,"timelinePanelRecorsSplitViewState");this._containerElement=recordsView.element;this._containerElement.tabIndex=0;this._containerElement.id="timeline-container";this._containerElement.addEventListener("scroll",this._onScroll.bind(this),false);recordsView.sidebarElement().createChild("div","timeline-records-title").textContent=WebInspector.UIString("RECORDS");this._sidebarListElement=recordsView.sidebarElement().createChild("div","timeline-records-list");this._gridContainer=new WebInspector.VBoxWithResizeCallback(this._onViewportResize.bind(this));this._gridContainer.element.id="resources-container-content";this._gridContainer.show(recordsView.mainElement());this._timelineGrid=new WebInspector.TimelineGrid();this._gridContainer.element.appendChild(this._timelineGrid.element);this._itemsGraphsElement=this._gridContainer.element.createChild("div");this._itemsGraphsElement.id="timeline-graphs";this._topGapElement=this._itemsGraphsElement.createChild("div","timeline-gap");this._graphRowsElement=this._itemsGraphsElement.createChild("div");this._bottomGapElement=this._itemsGraphsElement.createChild("div","timeline-gap");this._expandElements=this._itemsGraphsElement.createChild("div");this._expandElements.id="orphan-expand-elements";return recordsView;},_rootRecord:function()
+{return this._presentationModel.rootRecord();},_updateEventDividers:function()
+{this._timelineGrid.removeEventDividers();var clientWidth=this._graphRowsElementWidth;var dividers=[];var eventDividerRecords=this._model.eventDividerRecords();for(var i=0;i<eventDividerRecords.length;++i){var record=eventDividerRecords[i];var positions=this._calculator.computeBarGraphWindowPosition(record);var dividerPosition=Math.round(positions.left);if(dividerPosition<0||dividerPosition>=clientWidth||dividers[dividerPosition])
+continue;var divider=WebInspector.TimelineUIUtils.createEventDivider(record.type,WebInspector.TimelineUIUtils.recordTitle(record));divider.style.left=dividerPosition+"px";dividers[dividerPosition]=divider;}
+this._timelineGrid.addEventDividers(dividers);},_updateFrameBars:function(frames)
+{var clientWidth=this._graphRowsElementWidth;if(this._frameContainer)
+this._frameContainer.removeChildren();else{const frameContainerBorderWidth=1;this._frameContainer=document.createElement("div");this._frameContainer.classList.add("fill");this._frameContainer.classList.add("timeline-frame-container");this._frameContainer.style.height=WebInspector.TimelinePanel.rowHeight+frameContainerBorderWidth+"px";this._frameContainer.addEventListener("dblclick",this._onFrameDoubleClicked.bind(this),false);}
+var dividers=[];for(var i=0;i<frames.length;++i){var frame=frames[i];var frameStart=this._calculator.computePosition(frame.startTime);var frameEnd=this._calculator.computePosition(frame.endTime);var frameStrip=document.createElement("div");frameStrip.className="timeline-frame-strip";var actualStart=Math.max(frameStart,0);var width=frameEnd-actualStart;frameStrip.style.left=actualStart+"px";frameStrip.style.width=width+"px";frameStrip._frame=frame;const minWidthForFrameInfo=60;if(width>minWidthForFrameInfo)
+frameStrip.textContent=Number.millisToString(frame.endTime-frame.startTime,true);this._frameContainer.appendChild(frameStrip);if(actualStart>0){var frameMarker=WebInspector.TimelineUIUtils.createEventDivider(WebInspector.TimelineModel.RecordType.BeginFrame);frameMarker.style.left=frameStart+"px";dividers.push(frameMarker);}}
+this._timelineGrid.addEventDividers(dividers);this._headerElement.appendChild(this._frameContainer);},_onFrameDoubleClicked:function(event)
+{var frameBar=event.target.enclosingNodeOrSelfWithClass("timeline-frame-strip");if(!frameBar)
+return;this._delegate.requestWindowTimes(frameBar._frame.startTime,frameBar._frame.endTime);},addRecord:function(record)
+{this._presentationModel.addRecord(record);this._invalidateAndScheduleRefresh(false,false);},setSidebarSize:function(width)
+{this._recordsView.setSidebarSize(width);},_sidebarResized:function(event)
+{this.dispatchEventToListeners(WebInspector.SplitView.Events.SidebarSizeChanged,event.data);},_onViewportResize:function()
+{this._resize(this._recordsView.sidebarSize());},_resize:function(sidebarWidth)
+{this._closeRecordDetails();this._graphRowsElementWidth=this._graphRowsElement.offsetWidth;this._headerElement.style.left=sidebarWidth+"px";this._headerElement.style.width=this._itemsGraphsElement.offsetWidth+"px";this._scheduleRefresh(false,true);},_resetView:function()
+{this._windowStartTime=-1;this._windowEndTime=-1;this._boundariesAreValid=false;this._adjustScrollPosition(0);this._linkifier.reset();this._closeRecordDetails();this._automaticallySizeWindow=true;this._presentationModel.reset();},reset:function()
+{this._resetView();this._invalidateAndScheduleRefresh(true,true);},elementsToRestoreScrollPositionsFor:function()
+{return[this._containerElement];},refreshRecords:function(textFilter)
+{this._presentationModel.reset();var records=this._model.records();for(var i=0;i<records.length;++i)
+this.addRecord(records[i]);this._automaticallySizeWindow=false;this._presentationModel.setTextFilter(textFilter);this._invalidateAndScheduleRefresh(false,true);},wasShown:function()
+{WebInspector.View.prototype.wasShown.call(this);this._onViewportResize();this._refresh();},willHide:function()
+{this._closeRecordDetails();WebInspector.View.prototype.willHide.call(this);},_onScroll:function(event)
+{this._closeRecordDetails();this._scrollTop=this._containerElement.scrollTop;var dividersTop=Math.max(0,this._scrollTop);this._timelineGrid.setScrollAndDividerTop(this._scrollTop,dividersTop);this._scheduleRefresh(true,true);},_invalidateAndScheduleRefresh:function(preserveBoundaries,userGesture)
+{this._presentationModel.invalidateFilteredRecords();this._scheduleRefresh(preserveBoundaries,userGesture);},_selectRecord:function(presentationRecord)
+{if(presentationRecord&&presentationRecord.coalesced()){this._innerSetSelectedRecord(presentationRecord);var aggregatedStats={};var presentationChildren=presentationRecord.presentationChildren();for(var i=0;i<presentationChildren.length;++i)
+WebInspector.TimelineUIUtils.aggregateTimeByCategory(aggregatedStats,presentationChildren[i].record().aggregatedStats);var idle=presentationRecord.record().endTime-presentationRecord.record().startTime;for(var category in aggregatedStats)
+idle-=aggregatedStats[category];aggregatedStats["idle"]=idle;this._delegate.showAggregatedStatsInDetails(WebInspector.TimelineUIUtils.recordStyle(presentationRecord.record()).title,aggregatedStats);return;}
+this._delegate.selectRecord(presentationRecord?presentationRecord.record():null);},setSelectedRecord:function(record)
+{this._innerSetSelectedRecord(this._presentationModel.toPresentationRecord(record));},_innerSetSelectedRecord:function(presentationRecord)
+{if(presentationRecord===this._lastSelectedRecord)
+return;if(this._lastSelectedRecord){if(this._lastSelectedRecord.listRow())
+this._lastSelectedRecord.listRow().renderAsSelected(false);if(this._lastSelectedRecord.graphRow())
+this._lastSelectedRecord.graphRow().renderAsSelected(false);}
+this._lastSelectedRecord=presentationRecord;if(!presentationRecord)
+return;this._innerRevealRecord(presentationRecord);if(presentationRecord.listRow())
+presentationRecord.listRow().renderAsSelected(true);if(presentationRecord.graphRow())
+presentationRecord.graphRow().renderAsSelected(true);},setWindowTimes:function(startTime,endTime)
+{this._windowStartTime=startTime;this._windowEndTime=endTime;this._presentationModel.setWindowTimes(startTime,endTime);this._automaticallySizeWindow=false;this._invalidateAndScheduleRefresh(false,true);this._selectRecord(null);},_scheduleRefresh:function(preserveBoundaries,userGesture)
+{this._closeRecordDetails();this._boundariesAreValid&=preserveBoundaries;if(!this.isShowing())
+return;if(preserveBoundaries||userGesture)
+this._refresh();else{if(!this._refreshTimeout)
+this._refreshTimeout=setTimeout(this._refresh.bind(this),300);}},_refresh:function()
+{if(this._refreshTimeout){clearTimeout(this._refreshTimeout);delete this._refreshTimeout;}
+var windowStartTime=this._windowStartTime;var windowEndTime=this._windowEndTime;this._timelinePaddingLeft=this._expandOffset;if(windowStartTime===-1)
+windowStartTime=this._model.minimumRecordTime();if(windowEndTime===-1)
+windowEndTime=this._model.maximumRecordTime();this._calculator.setWindow(windowStartTime,windowEndTime);this._calculator.setDisplayWindow(this._timelinePaddingLeft,this._graphRowsElementWidth);this._refreshRecords();if(!this._boundariesAreValid){this._updateEventDividers();if(this._frameContainer)
+this._frameContainer.remove();if(this._frameModel){var frames=this._frameModel.filteredFrames(windowStartTime,windowEndTime);const maxFramesForFrameBars=30;if(frames.length&&frames.length<maxFramesForFrameBars){this._timelineGrid.removeDividers();this._updateFrameBars(frames);}else{this._timelineGrid.updateDividers(this._calculator);}}else
+this._timelineGrid.updateDividers(this._calculator);this._refreshAllUtilizationBars();}
+this._boundariesAreValid=true;},_innerRevealRecord:function(recordToReveal)
+{var needRefresh=false;for(var parent=recordToReveal.presentationParent();parent!==this._rootRecord();parent=parent.presentationParent()){if(!parent.collapsed())
+continue;this._presentationModel.invalidateFilteredRecords();parent.setCollapsed(false);needRefresh=true;}
+var recordsInWindow=this._presentationModel.filteredRecords();var index=recordsInWindow.indexOf(recordToReveal);var itemOffset=index*WebInspector.TimelinePanel.rowHeight;var visibleTop=this._scrollTop-WebInspector.TimelinePanel.headerHeight;var visibleBottom=visibleTop+this._containerElementHeight-WebInspector.TimelinePanel.rowHeight;if(itemOffset<visibleTop)
+this._containerElement.scrollTop=itemOffset;else if(itemOffset>visibleBottom)
+this._containerElement.scrollTop=itemOffset-this._containerElementHeight+WebInspector.TimelinePanel.headerHeight+WebInspector.TimelinePanel.rowHeight;else if(needRefresh)
+this._refreshRecords();},_refreshRecords:function()
+{this._containerElementHeight=this._containerElement.clientHeight;var recordsInWindow=this._presentationModel.filteredRecords();var visibleTop=this._scrollTop;var visibleBottom=visibleTop+this._containerElementHeight;var rowHeight=WebInspector.TimelinePanel.rowHeight;var headerHeight=WebInspector.TimelinePanel.headerHeight;var startIndex=Math.max(0,Math.min(Math.floor((visibleTop-headerHeight)/rowHeight),recordsInWindow.length-1));var endIndex=Math.min(recordsInWindow.length,Math.ceil(visibleBottom/rowHeight));var lastVisibleLine=Math.max(0,Math.floor((visibleBottom-headerHeight)/rowHeight));if(this._automaticallySizeWindow&&recordsInWindow.length>lastVisibleLine){this._automaticallySizeWindow=false;this._selectRecord(null);var windowStartTime=startIndex?recordsInWindow[startIndex].record().startTime:this._model.minimumRecordTime();var windowEndTime=recordsInWindow[Math.max(0,lastVisibleLine-1)].record().endTime;this._delegate.requestWindowTimes(windowStartTime,windowEndTime);recordsInWindow=this._presentationModel.filteredRecords();endIndex=Math.min(recordsInWindow.length,lastVisibleLine);}
+this._topGapElement.style.height=(startIndex*rowHeight)+"px";this._recordsView.sidebarElement().firstElementChild.style.flexBasis=(startIndex*rowHeight+headerHeight)+"px";this._bottomGapElement.style.height=(recordsInWindow.length-endIndex)*rowHeight+"px";var rowsHeight=headerHeight+recordsInWindow.length*rowHeight;var totalHeight=Math.max(this._containerElementHeight,rowsHeight);this._recordsView.mainElement().style.height=totalHeight+"px";this._recordsView.sidebarElement().style.height=totalHeight+"px";this._recordsView.resizerElement().style.height=totalHeight+"px";var listRowElement=this._sidebarListElement.firstChild;var width=this._graphRowsElementWidth;this._itemsGraphsElement.removeChild(this._graphRowsElement);var graphRowElement=this._graphRowsElement.firstChild;var scheduleRefreshCallback=this._invalidateAndScheduleRefresh.bind(this,true,true);var selectRecordCallback=this._selectRecord.bind(this);this._itemsGraphsElement.removeChild(this._expandElements);this._expandElements.removeChildren();for(var i=0;i<endIndex;++i){var record=recordsInWindow[i];if(i<startIndex){var lastChildIndex=i+record.visibleChildrenCount();if(lastChildIndex>=startIndex&&lastChildIndex<endIndex){var expandElement=new WebInspector.TimelineExpandableElement(this._expandElements);var positions=this._calculator.computeBarGraphWindowPosition(record);expandElement._update(record,i,positions.left-this._expandOffset,positions.width);}}else{if(!listRowElement){listRowElement=new WebInspector.TimelineRecordListRow(this._linkifier,selectRecordCallback,scheduleRefreshCallback).element;this._sidebarListElement.appendChild(listRowElement);}
+if(!graphRowElement){graphRowElement=new WebInspector.TimelineRecordGraphRow(this._itemsGraphsElement,selectRecordCallback,scheduleRefreshCallback).element;this._graphRowsElement.appendChild(graphRowElement);}
+listRowElement.row.update(record,visibleTop);graphRowElement.row.update(record,this._calculator,this._expandOffset,i);if(this._lastSelectedRecord===record){listRowElement.row.renderAsSelected(true);graphRowElement.row.renderAsSelected(true);}
+listRowElement=listRowElement.nextSibling;graphRowElement=graphRowElement.nextSibling;}}
+while(listRowElement){var nextElement=listRowElement.nextSibling;listRowElement.row.dispose();listRowElement=nextElement;}
+while(graphRowElement){var nextElement=graphRowElement.nextSibling;graphRowElement.row.dispose();graphRowElement=nextElement;}
+this._itemsGraphsElement.insertBefore(this._graphRowsElement,this._bottomGapElement);this._itemsGraphsElement.appendChild(this._expandElements);this._adjustScrollPosition(recordsInWindow.length*rowHeight+headerHeight);return recordsInWindow.length;},_refreshAllUtilizationBars:function()
+{this._refreshUtilizationBars(WebInspector.UIString("CPU"),this._model.mainThreadTasks(),this._cpuBarsElement);if(WebInspector.experimentsSettings.gpuTimeline.isEnabled())
+this._refreshUtilizationBars(WebInspector.UIString("GPU"),this._model.gpuThreadTasks(),this._gpuBarsElement);},_refreshUtilizationBars:function(name,tasks,container)
+{if(!container)
+return;const barOffset=3;const minGap=3;var minWidth=WebInspector.TimelineCalculator._minWidth;var widthAdjustment=minWidth/2;var width=this._graphRowsElementWidth;var boundarySpan=this._windowEndTime-this._windowStartTime;var scale=boundarySpan/(width-minWidth-this._timelinePaddingLeft);var startTime=(this._windowStartTime-this._timelinePaddingLeft*scale);var endTime=startTime+width*scale;function compareEndTime(value,task)
+{return value<task.endTime?-1:1;}
+var taskIndex=insertionIndexForObjectInListSortedByFunction(startTime,tasks,compareEndTime);var foreignStyle="gpu-task-foreign";var element=container.firstChild;var lastElement;var lastLeft;var lastRight;for(;taskIndex<tasks.length;++taskIndex){var task=tasks[taskIndex];if(task.startTime>endTime)
+break;var left=Math.max(0,this._calculator.computePosition(task.startTime)+barOffset-widthAdjustment);var right=Math.min(width,this._calculator.computePosition(task.endTime||0)+barOffset+widthAdjustment);if(lastElement){var gap=Math.floor(left)-Math.ceil(lastRight);if(gap<minGap){if(!task.data["foreign"])
+lastElement.classList.remove(foreignStyle);lastRight=right;lastElement._tasksInfo.lastTaskIndex=taskIndex;continue;}
+lastElement.style.width=(lastRight-lastLeft)+"px";}
+if(!element)
+element=container.createChild("div","timeline-graph-bar");element.style.left=left+"px";element._tasksInfo={name:name,tasks:tasks,firstTaskIndex:taskIndex,lastTaskIndex:taskIndex};if(task.data["foreign"])
+element.classList.add(foreignStyle);lastLeft=left;lastRight=right;lastElement=element;element=element.nextSibling;}
+if(lastElement)
+lastElement.style.width=(lastRight-lastLeft)+"px";while(element){var nextElement=element.nextSibling;element._tasksInfo=null;container.removeChild(element);element=nextElement;}},_adjustScrollPosition:function(totalHeight)
+{if((this._scrollTop+this._containerElementHeight)>totalHeight+1)
+this._containerElement.scrollTop=(totalHeight-this._containerElement.offsetHeight);},_getPopoverAnchor:function(element)
+{var anchor=element.enclosingNodeOrSelfWithClass("timeline-graph-bar");if(anchor&&anchor._tasksInfo)
+return anchor;return element.enclosingNodeOrSelfWithClass("timeline-frame-strip");},_mouseOut:function()
+{this._hideQuadHighlight();},_mouseMove:function(e)
+{var rowElement=e.target.enclosingNodeOrSelfWithClass("timeline-tree-item");if(rowElement&&rowElement.row&&rowElement.row._record.record().highlightQuad)
+this._highlightQuad(rowElement.row._record.record().highlightQuad);else
+this._hideQuadHighlight();var taskBarElement=e.target.enclosingNodeOrSelfWithClass("timeline-graph-bar");if(taskBarElement&&taskBarElement._tasksInfo){var offset=taskBarElement.offsetLeft;this._timelineGrid.showCurtains(offset>=0?offset:0,taskBarElement.offsetWidth);}else
+this._timelineGrid.hideCurtains();},_keyDown:function(event)
+{if(!this._lastSelectedRecord||event.shiftKey||event.metaKey||event.ctrlKey)
+return;var record=this._lastSelectedRecord;var recordsInWindow=this._presentationModel.filteredRecords();var index=recordsInWindow.indexOf(record);var recordsInPage=Math.floor(this._containerElementHeight/WebInspector.TimelinePanel.rowHeight);var rowHeight=WebInspector.TimelinePanel.rowHeight;if(index===-1)
+index=0;switch(event.keyIdentifier){case"Left":if(record.presentationParent()){if((!record.expandable()||record.collapsed())&&record.presentationParent()!==this._presentationModel.rootRecord()){this._selectRecord(record.presentationParent());}else{record.setCollapsed(true);this._invalidateAndScheduleRefresh(true,true);}}
+event.consume(true);break;case"Up":if(--index<0)
+break;this._selectRecord(recordsInWindow[index]);event.consume(true);break;case"Right":if(record.expandable()&&record.collapsed()){record.setCollapsed(false);this._invalidateAndScheduleRefresh(true,true);}else{if(++index>=recordsInWindow.length)
+break;this._selectRecord(recordsInWindow[index]);}
+event.consume(true);break;case"Down":if(++index>=recordsInWindow.length)
+break;this._selectRecord(recordsInWindow[index]);event.consume(true);break;case"PageUp":index=Math.max(0,index-recordsInPage);this._scrollTop=Math.max(0,this._scrollTop-recordsInPage*rowHeight);this._containerElement.scrollTop=this._scrollTop;this._selectRecord(recordsInWindow[index]);event.consume(true);break;case"PageDown":index=Math.min(recordsInWindow.length-1,index+recordsInPage);this._scrollTop=Math.min(this._containerElement.scrollHeight-this._containerElementHeight,this._scrollTop+recordsInPage*rowHeight);this._containerElement.scrollTop=this._scrollTop;this._selectRecord(recordsInWindow[index]);event.consume(true);break;case"Home":index=0;this._selectRecord(recordsInWindow[index]);event.consume(true);break;case"End":index=recordsInWindow.length-1;this._selectRecord(recordsInWindow[index]);event.consume(true);break;}},_highlightQuad:function(quad)
+{if(this._highlightedQuad===quad)
+return;this._highlightedQuad=quad;DOMAgent.highlightQuad(quad,WebInspector.Color.PageHighlight.Content.toProtocolRGBA(),WebInspector.Color.PageHighlight.ContentOutline.toProtocolRGBA());},_hideQuadHighlight:function()
+{if(this._highlightedQuad){delete this._highlightedQuad;DOMAgent.hideHighlight();}},_showPopover:function(anchor,popover)
+{if(anchor.classList.contains("timeline-frame-strip")){var frame=anchor._frame;popover.show(WebInspector.TimelineUIUtils.generatePopupContentForFrame(frame),anchor);}else if(anchor._tasksInfo){popover.show(WebInspector.TimelineUIUtils.generateMainThreadBarPopupContent(this._model,anchor._tasksInfo),anchor,null,null,WebInspector.Popover.Orientation.Bottom);}
+function showCallback(popupContent)
+{popover.show(popupContent,anchor);}},_closeRecordDetails:function()
+{this._popoverHelper.hidePopover();},highlightSearchResult:function(record,regex,selectRecord)
+{if(this._highlightDomChanges)
+WebInspector.revertDomChanges(this._highlightDomChanges);this._highlightDomChanges=[];var presentationRecord=this._presentationModel.toPresentationRecord(record);if(!presentationRecord)
+return;if(selectRecord)
+this._selectRecord(presentationRecord);for(var element=this._sidebarListElement.firstChild;element;element=element.nextSibling){if(element.row._record===presentationRecord){element.row.highlight(regex,this._highlightDomChanges);break;}}},__proto__:WebInspector.HBox.prototype}
+WebInspector.TimelineCalculator=function(model)
+{this._model=model;}
+WebInspector.TimelineCalculator._minWidth=5;WebInspector.TimelineCalculator.prototype={paddingLeft:function()
+{return this._paddingLeft;},computePosition:function(time)
+{return(time-this._minimumBoundary)/this.boundarySpan()*this._workingArea+this._paddingLeft;},computeBarGraphPercentages:function(record)
+{var start=(record.startTime-this._minimumBoundary)/this.boundarySpan()*100;var end=(record.startTime+record.selfTime-this._minimumBoundary)/this.boundarySpan()*100;var endWithChildren=(record.lastChildEndTime-this._minimumBoundary)/this.boundarySpan()*100;var cpuWidth=record.cpuTime/this.boundarySpan()*100;return{start:start,end:end,endWithChildren:endWithChildren,cpuWidth:cpuWidth};},computeBarGraphWindowPosition:function(record)
+{var percentages=this.computeBarGraphPercentages(record);var widthAdjustment=0;var left=this.computePosition(record.startTime);var width=(percentages.end-percentages.start)/100*this._workingArea;if(width<WebInspector.TimelineCalculator._minWidth){widthAdjustment=WebInspector.TimelineCalculator._minWidth-width;width=WebInspector.TimelineCalculator._minWidth;}
+var widthWithChildren=(percentages.endWithChildren-percentages.start)/100*this._workingArea+widthAdjustment;var cpuWidth=percentages.cpuWidth/100*this._workingArea+widthAdjustment;if(percentages.endWithChildren>percentages.end)
+widthWithChildren+=widthAdjustment;return{left:left,width:width,widthWithChildren:widthWithChildren,cpuWidth:cpuWidth};},setWindow:function(minimumBoundary,maximumBoundary)
+{this._minimumBoundary=minimumBoundary;this._maximumBoundary=maximumBoundary;},setDisplayWindow:function(paddingLeft,clientWidth)
+{this._workingArea=clientWidth-WebInspector.TimelineCalculator._minWidth-paddingLeft;this._paddingLeft=paddingLeft;},formatTime:function(value,precision)
+{return Number.preciseMillisToString(value-this.zeroTime(),precision);},maximumBoundary:function()
+{return this._maximumBoundary;},minimumBoundary:function()
+{return this._minimumBoundary;},zeroTime:function()
+{return this._model.minimumRecordTime();},boundarySpan:function()
+{return this._maximumBoundary-this._minimumBoundary;}}
+WebInspector.TimelineRecordListRow=function(linkifier,selectRecord,scheduleRefresh)
+{this.element=document.createElement("div");this.element.row=this;this.element.style.cursor="pointer";this.element.addEventListener("click",this._onClick.bind(this),false);this.element.addEventListener("mouseover",this._onMouseOver.bind(this),false);this.element.addEventListener("mouseout",this._onMouseOut.bind(this),false);this._linkifier=linkifier;this._warningElement=this.element.createChild("div","timeline-tree-item-warning hidden");this._expandArrowElement=this.element.createChild("div","timeline-tree-item-expand-arrow");this._expandArrowElement.addEventListener("click",this._onExpandClick.bind(this),false);var iconElement=this.element.createChild("span","timeline-tree-icon");this._typeElement=this.element.createChild("span","type");this._dataElement=this.element.createChild("span","data dimmed");this._scheduleRefresh=scheduleRefresh;this._selectRecord=selectRecord;}
+WebInspector.TimelineRecordListRow.prototype={update:function(presentationRecord,offset)
+{this._record=presentationRecord;var record=presentationRecord.record();this._offset=offset;this.element.className="timeline-tree-item timeline-category-"+record.category.name;var paddingLeft=5;var step=-3;for(var currentRecord=presentationRecord.presentationParent()?presentationRecord.presentationParent().presentationParent():null;currentRecord;currentRecord=currentRecord.presentationParent())
+paddingLeft+=12/(Math.max(1,step++));this.element.style.paddingLeft=paddingLeft+"px";if(record.thread)
+this.element.classList.add("background");this._typeElement.textContent=record.title();if(this._dataElement.firstChild)
+this._dataElement.removeChildren();this._warningElement.classList.toggle("hidden",!presentationRecord.hasWarnings()&&!presentationRecord.childHasWarnings());this._warningElement.classList.toggle("timeline-tree-item-child-warning",presentationRecord.childHasWarnings()&&!presentationRecord.hasWarnings());if(presentationRecord.coalesced()){this._dataElement.createTextChild(WebInspector.UIString("× %d",presentationRecord.presentationChildren().length));}else{var detailsNode=WebInspector.TimelineUIUtils.buildDetailsNode(record,this._linkifier);if(detailsNode){this._dataElement.appendChild(document.createTextNode("("));this._dataElement.appendChild(detailsNode);this._dataElement.appendChild(document.createTextNode(")"));}}
+this._expandArrowElement.classList.toggle("parent",presentationRecord.expandable());this._expandArrowElement.classList.toggle("expanded",!!presentationRecord.visibleChildrenCount());this._record.setListRow(this);},highlight:function(regExp,domChanges)
+{var matchInfo=this.element.textContent.match(regExp);if(matchInfo)
+WebInspector.highlightSearchResult(this.element,matchInfo.index,matchInfo[0].length,domChanges);},dispose:function()
+{this.element.remove();},_onExpandClick:function(event)
+{this._record.setCollapsed(!this._record.collapsed());this._scheduleRefresh();event.consume(true);},_onClick:function(event)
+{this._selectRecord(this._record);},renderAsSelected:function(selected)
+{this.element.classList.toggle("selected",selected);},_onMouseOver:function(event)
+{this.element.classList.add("hovered");if(this._record.graphRow())
+this._record.graphRow().element.classList.add("hovered");},_onMouseOut:function(event)
+{this.element.classList.remove("hovered");if(this._record.graphRow())
+this._record.graphRow().element.classList.remove("hovered");}}
+WebInspector.TimelineRecordGraphRow=function(graphContainer,selectRecord,scheduleRefresh)
+{this.element=document.createElement("div");this.element.row=this;this.element.addEventListener("mouseover",this._onMouseOver.bind(this),false);this.element.addEventListener("mouseout",this._onMouseOut.bind(this),false);this.element.addEventListener("click",this._onClick.bind(this),false);this._barAreaElement=document.createElement("div");this._barAreaElement.className="timeline-graph-bar-area";this.element.appendChild(this._barAreaElement);this._barWithChildrenElement=document.createElement("div");this._barWithChildrenElement.className="timeline-graph-bar with-children";this._barWithChildrenElement.row=this;this._barAreaElement.appendChild(this._barWithChildrenElement);this._barCpuElement=document.createElement("div");this._barCpuElement.className="timeline-graph-bar cpu"
+this._barCpuElement.row=this;this._barAreaElement.appendChild(this._barCpuElement);this._barElement=document.createElement("div");this._barElement.className="timeline-graph-bar";this._barElement.row=this;this._barAreaElement.appendChild(this._barElement);this._expandElement=new WebInspector.TimelineExpandableElement(graphContainer);this._selectRecord=selectRecord;this._scheduleRefresh=scheduleRefresh;}
+WebInspector.TimelineRecordGraphRow.prototype={update:function(presentationRecord,calculator,expandOffset,index)
+{this._record=presentationRecord;var record=presentationRecord.record();this.element.className="timeline-graph-side timeline-category-"+record.category.name;if(record.thread)
+this.element.classList.add("background");var barPosition=calculator.computeBarGraphWindowPosition(record);this._barWithChildrenElement.style.left=barPosition.left+"px";this._barWithChildrenElement.style.width=barPosition.widthWithChildren+"px";this._barElement.style.left=barPosition.left+"px";this._barElement.style.width=(presentationRecord.coalesced()?barPosition.widthWithChildren:barPosition.width)+"px";this._barCpuElement.style.left=barPosition.left+"px";this._barCpuElement.style.width=(presentationRecord.coalesced()?barPosition.widthWithChildren:barPosition.cpuWidth)+"px";this._expandElement._update(presentationRecord,index,barPosition.left-expandOffset,barPosition.width);this._record.setGraphRow(this);},_onClick:function(event)
+{if(this._expandElement._arrow.containsEventPoint(event))
+this._expand();this._selectRecord(this._record);},renderAsSelected:function(selected)
+{this.element.classList.toggle("selected",selected);},_expand:function()
+{this._record.setCollapsed(!this._record.collapsed());this._scheduleRefresh();},_onMouseOver:function(event)
+{this.element.classList.add("hovered");if(this._record.listRow())
+this._record.listRow().element.classList.add("hovered");},_onMouseOut:function(event)
+{this.element.classList.remove("hovered");if(this._record.listRow())
+this._record.listRow().element.classList.remove("hovered");},dispose:function()
+{this.element.remove();this._expandElement._dispose();}}
+WebInspector.TimelineExpandableElement=function(container)
+{this._element=container.createChild("div","timeline-expandable");this._element.createChild("div","timeline-expandable-left");this._arrow=this._element.createChild("div","timeline-expandable-arrow");}
+WebInspector.TimelineExpandableElement.prototype={_update:function(record,index,left,width)
+{const rowHeight=WebInspector.TimelinePanel.rowHeight;if(record.visibleChildrenCount()||record.expandable()){this._element.style.top=index*rowHeight+"px";this._element.style.left=left+"px";this._element.style.width=Math.max(12,width+25)+"px";if(!record.collapsed()){this._element.style.height=(record.visibleChildrenCount()+1)*rowHeight+"px";this._element.classList.add("timeline-expandable-expanded");this._element.classList.remove("timeline-expandable-collapsed");}else{this._element.style.height=rowHeight+"px";this._element.classList.add("timeline-expandable-collapsed");this._element.classList.remove("timeline-expandable-expanded");}
+this._element.classList.remove("hidden");}else
+this._element.classList.add("hidden");},_dispose:function()
+{this._element.remove();}};WebInspector.TimelinePanel=function()
+{WebInspector.Panel.call(this,"timeline");this.registerRequiredCSS("timelinePanel.css");this.registerRequiredCSS("filter.css");this.element.addEventListener("contextmenu",this._contextMenu.bind(this),false);this._detailsLinkifier=new WebInspector.Linkifier();this._windowStartTime=0;this._windowEndTime=Infinity;this._model=new WebInspector.TimelineModel();this._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStarted,this._onRecordingStarted,this);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStopped,this._onRecordingStopped,this);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordsCleared,this._onRecordsCleared,this);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordingProgress,this._onRecordingProgress,this);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordFilterChanged,this._refreshViews,this);this._model.addEventListener(WebInspector.TimelineModel.Events.RecordAdded,this._onRecordAdded,this);this._categoryFilter=new WebInspector.TimelineCategoryFilter();this._durationFilter=new WebInspector.TimelineIsLongFilter();this._textFilter=new WebInspector.TimelineTextFilter();this._model.addFilter(new WebInspector.TimelineHiddenFilter());this._model.addFilter(this._categoryFilter);this._model.addFilter(this._durationFilter);this._model.addFilter(this._textFilter);this._presentationModeSetting=WebInspector.settings.createSetting("timelineOverviewMode",WebInspector.TimelinePanel.Mode.Events);this._createStatusBarItems();this._topPane=new WebInspector.SplitView(true,false);this._topPane.element.id="timeline-overview-panel";this._topPane.show(this.element);this._topPane.addEventListener(WebInspector.SplitView.Events.SidebarSizeChanged,this._sidebarResized,this);this._topPane.setResizable(false);this._createPresentationSelector();this._overviewPane=new WebInspector.TimelineOverviewPane(this._model);this._overviewPane.addEventListener(WebInspector.TimelineOverviewPane.Events.WindowChanged,this._onWindowChanged.bind(this));this._overviewPane.show(this._topPane.mainElement());this._createFileSelector();this._registerShortcuts();WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage,this._willReloadPage,this);WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load,this._loadEventFired,this);this._detailsSplitView=new WebInspector.SplitView(false,true,"timelinePanelDetailsSplitViewState");this._detailsSplitView.element.classList.add("timeline-details-split");this._detailsSplitView.sidebarElement().classList.add("timeline-details");this._detailsView=new WebInspector.TimelineDetailsView();this._detailsSplitView.installResizer(this._detailsView.titleElement());this._detailsView.show(this._detailsSplitView.sidebarElement());this._searchableView=new WebInspector.SearchableView(this);this._searchableView.setMinimumSize(0,25);this._searchableView.element.classList.add("searchable-view");this._searchableView.show(this._detailsSplitView.mainElement());this._stackView=new WebInspector.StackView(false);this._stackView.show(this._searchableView.element);this._stackView.element.classList.add("timeline-view-stack");WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged,this._dockSideChanged.bind(this));WebInspector.settings.splitVerticallyWhenDockedToRight.addChangeListener(this._dockSideChanged.bind(this));this._dockSideChanged();this._selectPresentationMode(this._presentationModeSetting.get());this._detailsSplitView.show(this.element);}
+WebInspector.TimelinePanel.Mode={Events:"Events",Frames:"Frames",Memory:"Memory",FlameChart:"FlameChart",Power:"Power"};WebInspector.TimelinePanel.rowHeight=18;WebInspector.TimelinePanel.headerHeight=20;WebInspector.TimelinePanel.durationFilterPresetsMs=[0,1,15];WebInspector.TimelinePanel.prototype={searchableView:function()
+{return this._searchableView;},wasShown:function()
+{if(!WebInspector.TimelinePanel._categoryStylesInitialized){WebInspector.TimelinePanel._categoryStylesInitialized=true;var style=document.createElement("style");var categories=WebInspector.TimelineUIUtils.categories();style.textContent=Object.values(categories).map(WebInspector.TimelineUIUtils.createStyleRuleForCategory).join("\n");document.head.appendChild(style);}},_dockSideChanged:function()
+{var dockSide=WebInspector.dockController.dockSide();var vertically=false;if(dockSide===WebInspector.DockController.State.DockedToBottom)
+vertically=true;else
+vertically=!WebInspector.settings.splitVerticallyWhenDockedToRight.get();this._detailsSplitView.setVertical(vertically);this._detailsView.setVertical(vertically);},windowStartTime:function()
+{if(this._windowStartTime)
+return this._windowStartTime;if(this._model.minimumRecordTime()!=-1)
+return this._model.minimumRecordTime();return 0;},windowEndTime:function()
+{if(this._windowEndTime<Infinity)
+return this._windowEndTime;if(this._model.maximumRecordTime()!=-1)
+return this._model.maximumRecordTime();return Infinity;},_sidebarResized:function(event)
+{var width=(event.data);this._topPane.setSidebarSize(width);for(var i=0;i<this._currentViews.length;++i)
+this._currentViews[i].setSidebarSize(width);},_onWindowChanged:function(event)
+{this._windowStartTime=event.data.startTime;this._windowEndTime=event.data.endTime;for(var i=0;i<this._currentViews.length;++i)
+this._currentViews[i].setWindowTimes(this._windowStartTime,this._windowEndTime);this._updateSelectionDetails();},requestWindowTimes:function(windowStartTime,windowEndTime)
+{this._overviewPane.requestWindowTimes(windowStartTime,windowEndTime);},_frameModel:function()
+{if(!this._lazyFrameModel)
+this._lazyFrameModel=new WebInspector.TimelineFrameModel(this._model);return this._lazyFrameModel;},_timelineView:function()
+{if(!this._lazyTimelineView)
+this._lazyTimelineView=new WebInspector.TimelineView(this,this._model);return this._lazyTimelineView;},_viewsForMode:function(mode)
+{var views=this._viewsMap[mode];if(!views){views={};switch(mode){case WebInspector.TimelinePanel.Mode.Events:views.overviewView=new WebInspector.TimelineEventOverview(this._model);views.mainViews=[this._timelineView()];break;case WebInspector.TimelinePanel.Mode.Frames:views.overviewView=new WebInspector.TimelineFrameOverview(this._model,this._frameModel());views.mainViews=[this._timelineView()];break;case WebInspector.TimelinePanel.Mode.Memory:views.overviewView=new WebInspector.TimelineMemoryOverview(this._model);views.mainViews=[this._timelineView(),new WebInspector.MemoryCountersGraph(this,this._model)];break;case WebInspector.TimelinePanel.Mode.FlameChart:views.overviewView=new WebInspector.TimelineFrameOverview(this._model,this._frameModel());views.mainViews=[new WebInspector.TimelineFlameChart(this,this._model,this._frameModel())];break;case WebInspector.TimelinePanel.Mode.Power:views.overviewView=new WebInspector.TimelinePowerOverview(this._model);views.mainViews=[this._timelineView()];break;default:console.assert(false,"Unknown mode: "+mode);}
+for(var i=0;i<views.mainViews.length;++i)
+views.mainViews[i].addEventListener(WebInspector.SplitView.Events.SidebarSizeChanged,this._sidebarResized,this);this._viewsMap[mode]=views;}
+return views;},_createPresentationSelector:function()
+{this._viewsMap={};var topPaneSidebarElement=this._topPane.sidebarElement();topPaneSidebarElement.id="timeline-overview-sidebar";var overviewTreeElement=topPaneSidebarElement.createChild("ol","sidebar-tree vbox");var topPaneSidebarTree=new TreeOutline(overviewTreeElement);this._overviewItems={};for(var mode in WebInspector.TimelinePanel.Mode){if(mode===WebInspector.TimelinePanel.Mode.FlameChart&&!WebInspector.experimentsSettings.timelineFlameChart.isEnabled()||mode===WebInspector.TimelinePanel.Mode.Power&&!Capabilities.canProfilePower)
+continue;this._overviewItems[mode]=new WebInspector.SidebarTreeElement("timeline-overview-sidebar-"+mode.toLowerCase(),WebInspector.UIString(mode));var item=this._overviewItems[mode];item.onselect=this._onModeChanged.bind(this,mode);topPaneSidebarTree.appendChild(item);}},_createStatusBarItems:function()
+{var panelStatusBarElement=this.element.createChild("div","panel-status-bar");this._statusBarButtons=([]);this.toggleTimelineButton=new WebInspector.StatusBarButton(WebInspector.UIString("Record"),"record-profile-status-bar-item");this.toggleTimelineButton.addEventListener("click",this._toggleTimelineButtonClicked,this);this._statusBarButtons.push(this.toggleTimelineButton);panelStatusBarElement.appendChild(this.toggleTimelineButton.element);this.clearButton=new WebInspector.StatusBarButton(WebInspector.UIString("Clear"),"clear-status-bar-item");this.clearButton.addEventListener("click",this._onClearButtonClick,this);this._statusBarButtons.push(this.clearButton);panelStatusBarElement.appendChild(this.clearButton.element);this._filterBar=this._createFilterBar();panelStatusBarElement.appendChild(this._filterBar.filterButton().element);this.garbageCollectButton=new WebInspector.StatusBarButton(WebInspector.UIString("Collect Garbage"),"garbage-collect-status-bar-item");this.garbageCollectButton.addEventListener("click",this._garbageCollectButtonClicked,this);this._statusBarButtons.push(this.garbageCollectButton);panelStatusBarElement.appendChild(this.garbageCollectButton.element);panelStatusBarElement.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Capture stacks"),WebInspector.settings.timelineCaptureStacks,true,undefined,WebInspector.UIString("Capture JavaScript stack on every timeline event")));this._miscStatusBarItems=panelStatusBarElement.createChild("div","status-bar-item");this._filtersContainer=this.element.createChild("div","timeline-filters-header hidden");this._filtersContainer.appendChild(this._filterBar.filtersElement());this._filterBar.addEventListener(WebInspector.FilterBar.Events.FiltersToggled,this._onFiltersToggled,this);this._filterBar.setName("timelinePanel");},_createFilterBar:function()
+{this._filterBar=new WebInspector.FilterBar();this._filters={};this._filters._textFilterUI=new WebInspector.TextFilterUI();this._filters._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._textFilterChanged,this);this._filterBar.addFilter(this._filters._textFilterUI);var durationOptions=[];for(var presetIndex=0;presetIndex<WebInspector.TimelinePanel.durationFilterPresetsMs.length;++presetIndex){var durationMs=WebInspector.TimelinePanel.durationFilterPresetsMs[presetIndex];var durationOption={};if(!durationMs){durationOption.label=WebInspector.UIString("All");durationOption.title=WebInspector.UIString("Show all records");}else{durationOption.label=WebInspector.UIString("\u2265 %dms",durationMs);durationOption.title=WebInspector.UIString("Hide records shorter than %dms",durationMs);}
+durationOption.value=durationMs;durationOptions.push(durationOption);}
+this._filters._durationFilterUI=new WebInspector.ComboBoxFilterUI(durationOptions);this._filters._durationFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._durationFilterChanged,this);this._filterBar.addFilter(this._filters._durationFilterUI);this._filters._categoryFiltersUI={};var categoryTypes=[];var categories=WebInspector.TimelineUIUtils.categories();for(var categoryName in categories){var category=categories[categoryName];if(category.overviewStripGroupIndex<0)
+continue;var filter=new WebInspector.CheckboxFilterUI(category.name,category.title);this._filters._categoryFiltersUI[category.name]=filter;filter.addEventListener(WebInspector.FilterUI.Events.FilterChanged,this._categoriesFilterChanged.bind(this,categoryName),this);this._filterBar.addFilter(filter);}
+return this._filterBar;},_textFilterChanged:function(event)
+{var searchQuery=this._filters._textFilterUI.value();this.searchCanceled();this._textFilter.setRegex(searchQuery?createPlainTextSearchRegex(searchQuery,"i"):null);},_durationFilterChanged:function()
+{var duration=this._filters._durationFilterUI.value();var minimumRecordDuration=parseInt(duration,10);this._durationFilter.setMinimumRecordDuration(minimumRecordDuration);},_categoriesFilterChanged:function(name,event)
+{var categories=WebInspector.TimelineUIUtils.categories();categories[name].hidden=!this._filters._categoryFiltersUI[name].checked();this._categoryFilter.notifyFilterChanged();},defaultFocusedElement:function()
+{return this.element;},_onFiltersToggled:function(event)
+{var toggled=(event.data);this._filtersContainer.classList.toggle("hidden",!toggled);this.doResize();},_prepareToLoadTimeline:function()
+{if(this._operationInProgress)
+return null;if(this._recordingInProgress()){this.toggleTimelineButton.toggled=false;this._stopRecording();}
+var progressIndicator=new WebInspector.ProgressIndicator();progressIndicator.addEventListener(WebInspector.ProgressIndicator.Events.Done,this._setOperationInProgress.bind(this,null));this._setOperationInProgress(progressIndicator);return progressIndicator;},_setOperationInProgress:function(indicator)
+{this._operationInProgress=!!indicator;for(var i=0;i<this._statusBarButtons.length;++i)
+this._statusBarButtons[i].setEnabled(!this._operationInProgress);this._miscStatusBarItems.removeChildren();if(indicator)
+this._miscStatusBarItems.appendChild(indicator.element);},_registerShortcuts:function()
+{this.registerShortcuts(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.StartStopRecording,this._toggleTimelineButtonClicked.bind(this));this.registerShortcuts(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.SaveToFile,this._saveToFile.bind(this));this.registerShortcuts(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.LoadFromFile,this._selectFileToLoad.bind(this));},_createFileSelector:function()
+{if(this._fileSelectorElement)
+this._fileSelectorElement.remove();this._fileSelectorElement=WebInspector.createFileSelectorElement(this._loadFromFile.bind(this));this.element.appendChild(this._fileSelectorElement);},_contextMenu:function(event)
+{var contextMenu=new WebInspector.ContextMenu(event);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Save Timeline data\u2026":"Save Timeline Data\u2026"),this._saveToFile.bind(this),this._operationInProgress);contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles()?"Load Timeline data\u2026":"Load Timeline Data\u2026"),this._selectFileToLoad.bind(this),this._operationInProgress);contextMenu.show();},_saveToFile:function()
+{if(this._operationInProgress)
+return true;this._model.saveToFile();return true;},_selectFileToLoad:function(){this._fileSelectorElement.click();return true;},_loadFromFile:function(file)
+{var progressIndicator=this._prepareToLoadTimeline();if(!progressIndicator)
+return;this._model.loadFromFile(file,progressIndicator);this._createFileSelector();},loadFromURL:function(url)
+{var progressIndicator=this._prepareToLoadTimeline();if(!progressIndicator)
+return;this._model.loadFromURL(url,progressIndicator);},_selectPresentationMode:function(mode)
+{if(!this._overviewItems[mode])
+mode=WebInspector.TimelinePanel.Mode.Events;this._overviewItems[mode].revealAndSelect(false);},_refreshViews:function(totalUpdate)
+{for(var i=0;i<this._currentViews.length;++i){var view=this._currentViews[i];view.refreshRecords(this._textFilter._regex);}
+this._updateSelectionDetails();},_onModeChanged:function(mode)
+{this.element.classList.remove("timeline-"+this._presentationModeSetting.get().toLowerCase()+"-view");this._presentationModeSetting.set(mode);this.element.classList.add("timeline-"+mode.toLowerCase()+"-view");this._stackView.detachChildViews();var views=this._viewsForMode(mode);this._currentViews=views.mainViews;for(var i=0;i<this._currentViews.length;++i){var view=this._currentViews[i];view.setWindowTimes(this.windowStartTime(),this.windowEndTime());this._stackView.appendView(view,"timelinePanelTimelineStackSplitViewState");view.refreshRecords(this._textFilter._regex);}
+this._timelineView().setFrameModel(mode===WebInspector.TimelinePanel.Mode.Frames?this._frameModel():null);this._overviewControl=views.overviewView;this._overviewPane.setOverviewControl(this._overviewControl);this._updateSelectionDetails();},_startRecording:function(userInitiated)
+{this._userInitiatedRecording=userInitiated;this._model.startRecording();for(var mode in WebInspector.TimelinePanel.Mode)
+this._viewsForMode(mode).overviewView.timelineStarted();if(userInitiated)
+WebInspector.userMetrics.TimelineStarted.record();},_stopRecording:function()
+{this._userInitiatedRecording=false;this._model.stopRecording();for(var mode in WebInspector.TimelinePanel.Mode)
+this._viewsForMode(mode).overviewView.timelineStopped();},_toggleTimelineButtonClicked:function()
+{if(this._operationInProgress)
+return true;if(this._recordingInProgress())
+this._stopRecording();else
+this._startRecording(true);return true;},_garbageCollectButtonClicked:function()
+{HeapProfilerAgent.collectGarbage();},_onClearButtonClick:function()
+{this._model.reset();},_onRecordsCleared:function()
+{this.requestWindowTimes(0,Infinity);delete this._selectedRecord;if(this._lazyFrameModel)
+this._lazyFrameModel.reset();for(var i=0;i<this._currentViews.length;++i)
+this._currentViews[i].reset();this._overviewControl.reset();this._updateSelectionDetails();},_onRecordingStarted:function()
+{this.toggleTimelineButton.title=WebInspector.UIString("Stop");this.toggleTimelineButton.toggled=true;this._showProgressPane();},_recordingInProgress:function()
+{return this.toggleTimelineButton.toggled;},_showProgressPane:function()
+{if(!WebInspector.experimentsSettings.timelineNoLiveUpdate.isEnabled())
+return;this._hideProgressPane();this._progressElement=this._detailsSplitView.mainElement().createChild("div","timeline-progress-pane");this._progressElement.textContent=WebInspector.UIString("%d events collected",0);},_hideProgressPane:function()
+{if(!WebInspector.experimentsSettings.timelineNoLiveUpdate.isEnabled())
+return;if(this._progressElement)
+this._progressElement.remove();},_onRecordingProgress:function(event)
+{if(!WebInspector.experimentsSettings.timelineNoLiveUpdate.isEnabled())
+return;this._progressElement.textContent=WebInspector.UIString("%d events collected",event.data);},_onRecordingStopped:function()
+{this.toggleTimelineButton.title=WebInspector.UIString("Record");this.toggleTimelineButton.toggled=false;this._hideProgressPane();},_onRecordAdded:function(event)
+{this._addRecord((event.data));},_addRecord:function(record)
+{if(this._lazyFrameModel)
+this._lazyFrameModel.addRecord(record);for(var i=0;i<this._currentViews.length;++i)
+this._currentViews[i].addRecord(record);this._overviewPane.addRecord(record);this._updateSearchHighlight(false,true);},_willReloadPage:function(event)
+{if(this._operationInProgress||this._userInitiatedRecording||!this.isShowing())
+return;this._startRecording(false);},_loadEventFired:function(event)
+{if(!this._recordingInProgress()||this._userInitiatedRecording)
+return;this._stopRecording();},jumpToNextSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;var index=this._selectedSearchResult?this._searchResults.indexOf(this._selectedSearchResult):-1;this._jumpToSearchResult(index+1);},jumpToPreviousSearchResult:function()
+{if(!this._searchResults||!this._searchResults.length)
+return;var index=this._selectedSearchResult?this._searchResults.indexOf(this._selectedSearchResult):0;this._jumpToSearchResult(index-1);},_jumpToSearchResult:function(index)
+{this._selectSearchResult((index+this._searchResults.length)%this._searchResults.length);this._currentViews[0].highlightSearchResult(this._selectedSearchResult,this._searchRegex,true);},_selectSearchResult:function(index)
+{this._selectedSearchResult=this._searchResults[index];this._searchableView.updateCurrentMatchIndex(index);},_clearHighlight:function()
+{this._currentViews[0].highlightSearchResult(null);},_updateSearchHighlight:function(revealRecord,shouldJump)
+{if(!this._textFilter.isEmpty()||!this._searchRegex){this._clearHighlight();return;}
+if(!this._searchResults)
+this._updateSearchResults(shouldJump);this._currentViews[0].highlightSearchResult(this._selectedSearchResult,this._searchRegex,revealRecord);},_updateSearchResults:function(shouldJump)
+{var searchRegExp=this._searchRegex;if(!searchRegExp)
+return;var matches=[];function processRecord(record)
+{if(record.endTime<this._windowStartTime||record.startTime>this._windowEndTime)
+return;if(record.testContentMatching(searchRegExp))
+matches.push(record);}
+this._model.forAllFilteredRecords(processRecord.bind(this));var matchesCount=matches.length;if(matchesCount){this._searchResults=matches;this._searchableView.updateSearchMatchesCount(matchesCount);var selectedIndex=matches.indexOf(this._selectedSearchResult);if(shouldJump&&selectedIndex===-1)
+selectedIndex=0;this._selectSearchResult(selectedIndex);}else{this._searchableView.updateSearchMatchesCount(0);delete this._selectedSearchResult;}},searchCanceled:function()
+{this._clearHighlight();delete this._searchResults;delete this._selectedSearchResult;delete this._searchRegex;},performSearch:function(query,shouldJump)
+{this._searchRegex=createPlainTextSearchRegex(query,"i");delete this._searchResults;this._updateSearchHighlight(true,shouldJump);},_updateSelectionDetails:function()
+{if(this._selectedRecord)
+return;var startTime=this._windowStartTime;var endTime=this._windowEndTime;if(startTime<0)
+return;var aggregatedStats={};function compareEndTime(value,task)
+{return value<task.endTime?-1:1;}
+function aggregateTimeForRecordWithinWindow(record)
+{if(!record.endTime||record.endTime<startTime||record.startTime>endTime)
+return;var childrenTime=0;var children=record.children||[];for(var i=0;i<children.length;++i){var child=children[i];if(!child.endTime||child.endTime<startTime||child.startTime>endTime)
+continue;childrenTime+=Math.min(endTime,child.endTime)-Math.max(startTime,child.startTime);aggregateTimeForRecordWithinWindow(child);}
+var categoryName=WebInspector.TimelineUIUtils.categoryForRecord(record).name;var ownTime=Math.min(endTime,record.endTime)-Math.max(startTime,record.startTime)-childrenTime;aggregatedStats[categoryName]=(aggregatedStats[categoryName]||0)+ownTime;}
+var mainThreadTasks=this._model.mainThreadTasks();var taskIndex=insertionIndexForObjectInListSortedByFunction(startTime,mainThreadTasks,compareEndTime);for(;taskIndex<mainThreadTasks.length;++taskIndex){var task=mainThreadTasks[taskIndex];if(task.startTime>endTime)
+break;aggregateTimeForRecordWithinWindow(task);}
+var aggregatedTotal=0;for(var categoryName in aggregatedStats)
+aggregatedTotal+=aggregatedStats[categoryName];aggregatedStats["idle"]=Math.max(0,endTime-startTime-aggregatedTotal);var fragment=document.createDocumentFragment();fragment.appendChild(WebInspector.TimelineUIUtils.generatePieChart(aggregatedStats));var startOffset=startTime-this._model.minimumRecordTime();var endOffset=endTime-this._model.minimumRecordTime();var title=WebInspector.UIString("%s \u2013 %s",Number.millisToString(startOffset),Number.millisToString(endOffset));this._detailsView.setContent(title,fragment);},selectRecord:function(record)
+{this._detailsLinkifier.reset();this._selectedRecord=record;if(!record){this._updateSelectionDetails();return;}
+for(var i=0;i<this._currentViews.length;++i){var view=this._currentViews[i];view.setSelectedRecord(record);}
+if(!record){this._updateSelectionDetails();return;}
+WebInspector.TimelineUIUtils.generatePopupContent(record,this._detailsLinkifier,showCallback.bind(this));function showCallback(element)
+{this._detailsView.setContent(record.title(),element);}},showAggregatedStatsInDetails:function(title,aggregatedStats)
+{this._detailsView.setContent(title,WebInspector.TimelineUIUtils.generatePieChart(aggregatedStats));},__proto__:WebInspector.Panel.prototype}
+WebInspector.TimelineDetailsView=function()
+{WebInspector.VBox.call(this);this.element.classList.add("timeline-details-view");this._titleElement=this.element.createChild("div","timeline-details-view-title");this._titleElement.textContent=WebInspector.UIString("DETAILS");this._contentElement=this.element.createChild("div","timeline-details-view-body");}
+WebInspector.TimelineDetailsView.prototype={titleElement:function()
+{return this._titleElement;},setContent:function(title,node)
+{this._titleElement.textContent=WebInspector.UIString("DETAILS: %s",title);this._contentElement.removeChildren();this._contentElement.appendChild(node);},setVertical:function(vertical)
+{this._contentElement.classList.toggle("hbox",!vertical);this._contentElement.classList.toggle("vbox",vertical);},__proto__:WebInspector.VBox.prototype}
+WebInspector.TimelineModeView=function()
+{}
+WebInspector.TimelineModeView.prototype={reset:function(){},refreshRecords:function(textFilter){},addRecord:function(record){},highlightSearchResult:function(record,regex,selectRecord){},setWindowTimes:function(startTime,endTime){},setSidebarSize:function(width){},setSelectedRecord:function(record){}}
+WebInspector.TimelineModeViewDelegate=function(){}
+WebInspector.TimelineModeViewDelegate.prototype={requestWindowTimes:function(startTime,endTime){},selectRecord:function(record){},showAggregatedStatsInDetails:function(title,aggregatedStats){},}
+WebInspector.TimelineCategoryFilter=function()
+{WebInspector.TimelineModel.Filter.call(this);}
+WebInspector.TimelineCategoryFilter.prototype={accept:function(record)
+{return!record.category.hidden;},__proto__:WebInspector.TimelineModel.Filter.prototype}
+WebInspector.TimelineIsLongFilter=function()
+{WebInspector.TimelineModel.Filter.call(this);this._minimumRecordDuration=0;}
+WebInspector.TimelineIsLongFilter.prototype={setMinimumRecordDuration:function(value)
+{this._minimumRecordDuration=value;this.notifyFilterChanged();},accept:function(record)
+{return this._minimumRecordDuration?((record.lastChildEndTime-record.startTime)>=this._minimumRecordDuration):true;},__proto__:WebInspector.TimelineModel.Filter.prototype}
+WebInspector.TimelineTextFilter=function()
+{WebInspector.TimelineModel.Filter.call(this);}
+WebInspector.TimelineTextFilter.prototype={isEmpty:function()
+{return!this._regex;},setRegex:function(regex)
+{this._regex=regex;this.notifyFilterChanged();},accept:function(record)
+{if(!this._regex)
+return true;var accept=false;function processRecord(record)
+{return record.testContentMatching(this._regex);}
+return WebInspector.TimelineModel.forAllRecords([record],processRecord.bind(this));},__proto__:WebInspector.TimelineModel.Filter.prototype}
+WebInspector.TimelineHiddenFilter=function()
+{WebInspector.TimelineModel.Filter.call(this);this._hiddenRecords={};this._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkDOMContent]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkLoad]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkFirstPaint]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.GPUTask]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.ScheduleStyleRecalculation]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.InvalidateLayout]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.RequestMainThreadFrame]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.ActivateLayerTree]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.DrawFrame]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.BeginFrame]=1;this._hiddenRecords[WebInspector.TimelineModel.RecordType.UpdateLayerTree]=1;}
+WebInspector.TimelineHiddenFilter.prototype={accept:function(record)
+{return!this._hiddenRecords[record.type];},__proto__:WebInspector.TimelineModel.Filter.prototype}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/accelerometer.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/accelerometer.css
new file mode 100644 (file)
index 0000000..9e40c40
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * 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.
+ */
+
+.accelerometer-stage {
+    -webkit-perspective: 700px;
+    -webkit-perspective-origin: 50% 50%;
+    width: 200px;
+    height: 130px;
+}
+
+.accelerometer-box {
+    pointer-events:none;
+    margin-top: -54px;
+    margin-left: -40px;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    width: 80px;
+    height: 108px;
+    -webkit-transform-style: preserve-3d;
+}
+
+.accelerometer-box section {
+    margin-top: -54px;
+    margin-left: -40px;
+    position: absolute;
+    display: block;
+    overflow: hidden;
+    top: 50%;
+    left: 50%;
+    -webkit-transform-style: flat;
+    -webkit-box-shadow: inset 0px 0px 15px rgba(0, 0, 0, 0.7);
+}
+
+.accelerometer-box .front {
+    border:15px solid black;
+    width: 80px;
+    height: 107px;
+    background-color: gray;
+    -webkit-transform: translate3d(0px, 0px, 10px);
+}
+
+.accelerometer-box .back {
+    width: 80px;
+    height: 107px;
+    background-color: black;
+    -webkit-transform: rotateY(-180deg) translate3d(0px, 0px, 10px);
+}
+
+.accelerometer-box .top {
+    overflow: hidden;
+    width: 80px;
+    height: 20px;
+    background-color: #75CE89;
+    -webkit-transform: rotateX(-90deg) translate3d(0px, 0px, -10px);
+}
+
+.accelerometer-box .bottom {
+    overflow: hidden;
+    width: 80px;
+    height: 20px;
+    background-color: #865C6C;
+    -webkit-transform: rotateX(90deg) translate3d(0px, 0px, -97px);
+}
+
+.accelerometer-box .left {
+    width: 20px;
+    height: 107px;
+    background-color: #7992CB;
+    -webkit-transform: rotateY(90deg) translate3d(0px, 0px, 70px);
+}
+
+.accelerometer-box .right {
+    width: 20px;
+    height: 107px;
+    background-color: #7992CB;
+    -webkit-transform: rotateY(-90deg) translate3d(0px, 0px, 10px);
+}
+
+.accelerometer-axis-input-container {
+    margin-bottom: 10px;
+}
+
+.accelerometer-inputs-cell {
+    vertical-align: top;
+}
+
+.accelerometer-reset-button {
+    width: 100%;
+}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/auditsPanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/auditsPanel.css
new file mode 100644 (file)
index 0000000..90ecb07
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 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.
+ */
+
+.audits-sidebar-tree-item .icon {
+    content: url(Images/resourcesTimeGraphIcon.png);
+}
+
+.audit-result-sidebar-tree-item .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+.audit-launcher-view .audit-launcher-view-content {
+    padding: 0 0 0 16px;
+    white-space: nowrap;
+    display: -webkit-flex;
+    text-align: left;
+    -webkit-flex-direction: column;
+    flex: auto;
+}
+
+.audit-launcher-view h1 {
+    padding-top: 15px;
+    -webkit-flex: none;
+}
+
+.audit-launcher-view h1.no-audits {
+    text-align: center;
+    font-style: italic;
+    position: relative;
+    left: -8px;
+}
+
+.audit-launcher-view div.button-container {
+    width: 100%;
+    padding: 16px 0;
+    -webkit-flex: none;
+}
+
+.audit-launcher-view div.button-container > button {
+    -webkit-align-self: flex-start;
+    margin: 5px;
+}
+
+.audit-launcher-view fieldset.audit-categories-container {
+    position: relative;
+    top: 11px;
+    left: 0;
+    width: 100%;
+    overflow-y: auto;
+    border: 0 none;
+    -webkit-flex: none;
+}
+
+.audit-launcher-view button {
+    margin: 0 5px 0 0;
+}
+
+.audit-launcher-view button:active {
+    background-color: rgb(215, 215, 215);
+    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));
+}
+
+.panel-enabler-view.audit-launcher-view label {
+    padding: 0 0 5px 0;
+    margin: 0;
+    display: flex;
+    flex-shrink: 0;
+}
+
+.panel-enabler-view.audit-launcher-view label.disabled {
+    color: rgb(130, 130, 130);
+}
+
+.audit-launcher-view input[type="checkbox"] {
+    margin-left: 0;
+    height: 14px;
+    width: 14px;
+}
+
+.audit-result-view {
+    overflow: auto;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    display: none;
+}
+
+.audit-result-view.visible {
+    display: block;
+}
+
+.audit-result-view .severity-severe,
+.audit-result-view .severity-warning,
+.audit-result-view .severity-info {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    display: inline-block;
+    width: 10px;
+    margin-right: -10px;
+    height: 10px;
+    position: relative;
+    left: -28px;
+    margin-top: 3px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.audit-result-view .severity-severe,
+.audit-result-view .severity-warning,
+.audit-result-view .severity-info {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.audit-result-view .severity-severe {
+    background-position: -224px -96px;
+}
+
+.audit-result-view .severity-warning {
+    background-position: -246px -96px;
+}
+
+.audit-result-view .severity-info {
+    background-position: -235px -96px;
+}
+
+.audit-result-tree li.parent::before {
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    float: left;
+    width: 8px;
+    height: 10px;
+    content: "a";
+    color: transparent;
+    margin-left: 3px;
+    margin-right: 4px;
+    position: relative;
+    top: 2px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.audit-result-tree li.parent::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.audit-result-tree li.parent::before {
+    background-position: -4px -96px;
+}
+
+.audit-result-tree li.parent.expanded::before {
+    background-position: -20px -96px;
+}
+
+.audit-result-tree {
+    line-height: 16px;
+    -webkit-user-select: text;
+}
+
+.audit-result-tree > ol {
+    position: relative;
+    padding: 2px 6px !important;
+    margin: 0;
+    cursor: default;
+    min-width: 100%;
+}
+
+.audit-result-tree,
+.audit-result-tree ol {
+    list-style-type: none;
+    -webkit-padding-start: 12px;
+    margin: 0;
+}
+
+.audit-result-tree ol.outline-disclosure {
+    -webkit-padding-start: 0;
+}
+
+.audit-result-tree .section .header {
+    padding-left: 13px;
+}
+
+.audit-result-tree .section .header::before {
+    left: 2px;
+}
+
+.audit-result-tree li {
+    padding: 0 0 0 14px;
+    margin-top: 1px;
+    margin-bottom: 1px;
+    word-wrap: break-word;
+    margin-left: -2px;
+}
+
+.audit-result-tree li.parent {
+    margin-left: -12px
+}
+
+.audit-result-tree ol.children {
+    display: none;
+}
+
+.audit-result-tree ol.children.expanded {
+    display: block;
+}
+
+.audit-result {
+    font-weight: bold;
+}
+
+.audit-launcher-view .progress-bar-container {
+    display: inline-block;
+}
+
+.audit-launcher-view .progress-bar-container .progress-bar-stop-button {
+    display: none;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/breadcrumbList.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/breadcrumbList.css
new file mode 100644 (file)
index 0000000..925d5a8
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.crumbs {
+    display: inline-block;
+    pointer-events: auto;
+    cursor: default;
+    font-size: 11px;
+    line-height: 17px;
+}
+
+.crumbs .crumb {
+    display: inline-block;
+    padding: 0 7px;
+    height: 18px;
+    white-space: nowrap;
+}
+
+.crumbs .crumb.collapsed > * {
+    display: none;
+}
+
+.crumbs .crumb.collapsed::before {
+    content: "\2026";
+    font-weight: bold;
+}
+
+.crumbs .crumb.compact .extra {
+    display: none;
+}
+
+.crumbs .crumb.selected, .crumbs .crumb.selected:hover {
+    background-color: rgb(56, 121, 217);
+    color: white;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 0 0;
+}
+
+.crumbs .crumb:hover {
+    background-color: rgb(216, 216, 216);
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/breakpointsList.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/breakpointsList.css
new file mode 100644 (file)
index 0000000..a5a0478
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.sidebar-pane > .body .breakpoint-condition {
+    display: block;
+    margin-top: 4px;
+    margin-bottom: 4px;
+    margin-left: 23px;
+    margin-right: 8px;
+}
+
+#breakpoint-condition-input {
+    display: block;
+    margin-left: 0;
+    margin-right: 0;
+    outline: none !important;
+    border: 1px solid rgb(66%, 66%, 66%);
+}
+
+ol.breakpoint-list {
+    -webkit-padding-start: 0;
+    list-style: none;
+    margin: 0;
+    padding-bottom: 3px;
+}
+
+.breakpoints-list-deactivated {
+    background-color: rgb(245, 245, 245);
+    opacity: 0.3;
+}
+
+.breakpoint-list li {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    padding: 2px 0;
+}
+
+.breakpoint-list li:hover {
+    background-color: rgba(56, 121, 217, 0.2);
+}
+
+.breakpoint-list .checkbox-elem {
+    font-size: 10px;
+    margin: 0 4px;
+    vertical-align: top;
+    position: relative;
+    z-index: 1;
+    top: 3px;
+}
+
+.breakpoint-list .source-text {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    margin: 2px 0 0 20px;
+}
+
+.sidebar-pane .breakpoint-hit {
+    background-color: rgb(255, 255, 194);
+}
+
+li.breakpoint-hit .breakpoint-hit-marker {
+    background-color: rgb(255, 255, 194);
+    height: 18px;
+    left: 0;
+    margin-top: -16px;
+    position: absolute;
+    right: 0;
+    z-index: -1;
+}
+
+.event-listener-breakpoints.properties-tree li {
+    height: 16px;
+    padding-top: 3px;
+}
+
+.event-listener-breakpoints.properties-tree .children li {
+    margin-left: 12px;
+    height: 16px;
+}
+
+.event-listener-breakpoints .checkbox-elem {
+    float: left;
+    position: relative;
+    top: 1px;
+    font-size: 10px;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/buildSystemOnly.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/buildSystemOnly.js
new file mode 100644 (file)
index 0000000..7be07f7
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * This flag notifies inspector that it was deployed with the help
+ * of a build system. Build system flattenes all css and js files,
+ * so in this case inspector has to correct paths for dynamic resource loading.
+ */
+window.flattenImports = true;
+window.DEBUG = false;
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/canvasProfiler.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/canvasProfiler.css
new file mode 100644 (file)
index 0000000..bb8e267
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * 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:
+ *
+ *     * 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.
+ */
+
+.canvas-profile-view,
+#canvas-replay-image-container {
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+#canvas-replay-image-container {
+    text-align: center;
+    background-color: black;
+    overflow: hidden;
+    padding: 5px 5px 10px 5px;
+    color: white;
+}
+
+.canvas-replay-image {
+    zoom: 100;
+    height: auto;
+    width: auto;
+    max-width: 100%;
+    max-height: 100%;
+    margin: auto;
+    display: block;
+}
+
+.canvas-debug-info {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 6px;
+}
+
+.canvas-profile-view .spinner-icon {
+    position: absolute;
+    width: 16px;
+    height: 16px;
+    right: 4px;
+    bottom: 4px;
+}
+
+.canvas-replay-log {
+    position: absolute;
+    top: 24px;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.canvas-replay-log .data-grid {
+    border: none;
+}
+
+.canvas-profile-view button.right-sidebar-show-hide-button.canvas-sidebar-show-hide-button.toggled-hide {
+    margin-right: 15px;
+}
+
+.canvas-replay-button {
+    min-width: 32px;
+}
+
+.canvas-replay-first-step .glyph {
+    -webkit-mask-position: 0 -72px;
+    -webkit-transform: rotate(180deg);
+    top: 0;
+    bottom: 0;
+}
+.canvas-replay-next-step .glyph {
+    -webkit-mask-position: -64px -72px;
+}
+.canvas-replay-prev-step .glyph {
+    -webkit-mask-position: -96px -72px;
+}
+.canvas-replay-last-step .glyph {
+    -webkit-mask-position: 0 -72px;
+}
+.canvas-replay-prev-draw .glyph {
+    -webkit-mask-position: -128px -72px;
+    -webkit-transform: scaleX(-1);
+}
+.canvas-replay-next-draw .glyph {
+    -webkit-mask-position: -128px -72px;
+}
+.canvas-replay-state-prev .glyph {
+    -webkit-mask-position: -64px -48px;
+    -webkit-transform: scaleX(-1);
+}
+.canvas-replay-state-next .glyph {
+    -webkit-mask-position: -64px -48px;
+}
+.canvas-replay-state-refresh .glyph {
+    -webkit-mask-position: 0 0;
+}
+
+.canvas-popover-anchor {
+    position: absolute;
+    text-indent: 0;
+    padding: 0;
+    margin: 0;
+}
+.data-grid:focus tr.selected .canvas-popover-anchor {
+    background-color: #aaa !important;
+}
+
+.canvas-function-name {
+}
+
+.canvas-formatted-resource {
+    color: rgb(33%, 33%, 33%);
+}
+.canvas-formatted-resource.canvas-popover-anchor,
+.canvas-formatted-resource:hover {
+    color: rgb(38, 38, 38);
+    text-decoration: underline;
+    cursor: pointer;
+}
+
+/* Keep in sync with "console-formatted-*" CSS styles. */
+.canvas-formatted-object,
+.canvas-formatted-node,
+.canvas-formatted-array {
+    color: #222;
+}
+.canvas-formatted-number {
+    color: rgb(28, 0, 207);
+}
+.canvas-formatted-string,
+.canvas-formatted-regexp {
+    color: rgb(196, 26, 22);
+}
+.canvas-formatted-null,
+.canvas-formatted-undefined {
+    color: rgb(128, 128, 128);
+}
+.data-grid:focus tr.selected .canvas-call-argument,
+.data-grid:focus tr.selected .canvas-formatted-string {
+    color: inherit !important;
+}
+
+.canvas-replay-state-view .data-grid {
+    top: 23px;
+}
+
+.canvas-replay-state-view .data-grid .data-container tr:nth-child(odd).canvas-grid-node-highlighted {
+    -webkit-animation: "fadeout-odd" 2s 0s;
+    background-color: rgb(255, 255, 175);
+}
+
+.canvas-replay-state-view .data-grid .data-container tr:nth-child(even).canvas-grid-node-highlighted {
+    -webkit-animation: "fadeout-even" 2s 0s;
+    background-color: rgb(235, 235, 120);
+}
+
+@-webkit-keyframes fadeout-odd {
+    from { background-color: rgb(255, 255, 25); }
+    to { background-color: rgb(255, 255, 175); }
+}
+
+@-webkit-keyframes fadeout-even {
+    from { background-color: rgb(255, 255, 25); }
+    to { background-color: rgb(235, 235, 120); }
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/cmdevtools.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/cmdevtools.css
new file mode 100644 (file)
index 0000000..68069fc
--- /dev/null
@@ -0,0 +1,249 @@
+.CodeMirror * {
+  box-sizing: content-box;
+}
+
+.CodeMirror {
+  line-height: 1.2em !important;
+  background-color: transparent !important;
+}
+
+.CodeMirror .source-frame-eval-expression {
+  outline: 0px;
+  border: 1px solid rgb(163, 41, 34);
+  border-left-width: 0px;
+  border-right-width: 0px;
+}
+
+.CodeMirror .source-frame-eval-expression-end {
+  border-right-width: 1px;
+  margin-right: -1px;
+}
+
+.CodeMirror .source-frame-eval-expression-start {
+  border-left-width: 1px;
+  margin-left: -1px;
+}
+
+.CodeMirror-readonly .CodeMirror-cursor {
+    display: none;
+}
+
+.CodeMirror .CodeMirror-gutters {
+  border-right: 1px solid rgb(187, 187, 187);
+  background-color: rgb(240, 240, 240);
+}
+
+.CodeMirror .CodeMirror-linenumber {
+  color: rgb(128, 128, 128);
+}
+
+.CodeMirror-linenumber {
+  min-width: 22px !important;
+}
+
+.cm-highlight {
+  -webkit-animation: "fadeout" 2s 0s;
+}
+@-webkit-keyframes fadeout {
+    from {background-color: rgb(255, 255, 120); }
+    to { background-color: white; }
+}
+
+.cm-highlight.cm-execution-line {
+  -webkit-animation: "fadeout-execution-line" 1s 0s;
+}
+@-webkit-keyframes fadeout-execution-line {
+    from {background-color: rgb(121, 141, 254); }
+    to { background-color: rgb(171, 191, 254); }
+}
+
+.cm-breakpoint .CodeMirror-linenumber {
+  color: white;
+  border-width: 1px 4px 1px 1px !important;
+  -webkit-border-image: url(Images/breakpoint.png) 1 4 1 1;
+  margin: 0px 0px 0px 3px !important;
+  padding-right: 3px;
+  padding-left: 1px;
+  height: 11px;
+  line-height: 12px !important;
+}
+
+.cm-breakpoint.cm-breakpoint-conditional .CodeMirror-linenumber {
+  -webkit-border-image: url(Images/breakpointConditional.png) 1 4 1 1;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.cm-breakpoint .CodeMirror-linenumber {
+  -webkit-border-image: url(Images/breakpoint_2x.png) 2 8 2 2;
+}
+.cm-breakpoint.cm-breakpoint-conditional .CodeMirror-linenumber {
+  -webkit-border-image: url(Images/breakpointConditional_2x.png) 2 8 2 2;
+}
+} /* media */
+
+.cm-breakpoint-disabled .CodeMirror-linenumber {
+  opacity: 0.5;
+}
+
+.breakpoints-deactivated .cm-breakpoint .CodeMirror-linenumber {
+    opacity: 0.5;
+}
+
+.breakpoints-deactivated .cm-breakpoint-disabled .CodeMirror-linenumber {
+    opacity: 0.3;
+}
+
+.CodeMirror-matchingbracket {
+  border-bottom: 1px solid black;
+  color: #222 !important;
+}
+
+.CodeMirror-nonmatchingbracket {
+  color: #222 !important;
+}
+
+.cm-whitespace::before {
+    position: absolute;
+    pointer-events: none;
+    color: rgb(175, 175, 175);
+}
+
+.cm-tab {
+    position: relative;
+}
+
+.cm-tab:before {
+    display: none;
+    content: ".";
+    color: transparent;
+    border-bottom: 1px solid rgb(175, 175, 175);
+    position: absolute;
+    width: 90%;
+    bottom: 50%;
+    left: 5%;
+}
+
+.show-whitespaces .CodeMirror .cm-tab:before {
+    display: block !important;
+}
+
+.cm-execution-line {
+    background-color: rgb(171, 191, 254);
+    outline: 1px solid rgb(64, 115, 244);
+}
+
+.cm-execution-line .CodeMirror-linenumber {
+    border-right: 1px solid rgb(64, 115, 244);
+}
+
+.cm-token-highlight {
+    position: relative;
+}
+
+.cm-token-highlight:before {
+    position: absolute;
+    border: 1px solid gray;
+    border-radius: 3px;
+    top: 0px;
+    bottom: -1px;
+    left: 0px;
+    right: 0px;
+    content: "";
+}
+
+.cm-line-with-selection .cm-column-with-selection:before {
+    border: none;
+}
+
+.cm-search-highlight {
+    position: relative;
+}
+
+.cm-search-highlight:before {
+    position: absolute;
+    border-top-style: solid;
+    border-bottom-style: solid;
+    border-top-color: gray;
+    border-bottom-color: gray;
+    border-top-width: 1px;
+    border-bottom-width: 1px;
+    top: -1px;
+    bottom: 0px;
+    left: 0px;
+    right: 0px;
+    content: "";
+}
+
+.cm-search-highlight-full:before {
+    border: 1px solid gray;
+    border-radius: 3px;
+}
+
+.cm-search-highlight-start:before {
+    border-left-width: 1px;
+    border-top-left-radius: 2px;
+    border-bottom-left-radius: 2px;
+    border-left-style: solid;
+    border-left-color: gray;
+}
+
+.cm-search-highlight-end:before {
+    border-right-width: 1px;
+    border-top-right-radius: 2px;
+    border-bottom-right-radius: 2px;
+    border-right-style: solid;
+    border-right-color: gray;
+}
+
+.cm-line-with-selection .cm-column-with-selection.cm-search-highlight-full:before {
+    border-radius: 1px;
+}
+
+.cm-line-with-selection .cm-column-with-selection.cm-search-highlight-start:before {
+    border-top-left-radius: 1px;
+    border-bottom-left-radius: 1px;
+}
+
+.cm-line-with-selection .cm-column-with-selection.cm-search-highlight-end:before {
+    border-top-right-radius: 1px;
+    border-bottom-right-radius: 1px;
+}
+
+.cm-line-with-selection .cm-column-with-selection.cm-search-highlight:before {
+    margin: -1px -1px -1px -1px;
+    background-color: rgb(241, 234, 0);
+    z-index: -1;
+}
+
+.CodeMirror .webkit-html-message-bubble {
+    box-shadow: black 0px 2px 5px;
+    border-radius: 9px;
+    -webkit-border-fit: lines;
+    font-size: 10px;
+    font-family: Lucida Grande, sans-serif;
+    font-weight: bold;
+    margin: 3px 10px;
+    padding: 1px 2px 0;
+    z-index: 5;
+}
+
+.CodeMirror .webkit-html-message-bubble img {
+    position: relative;
+    top: 1px;
+    margin-right: 2px;
+}
+
+.CodeMirror .webkit-html-warning-message {
+    background-color: rgb(100%, 62%, 42%);
+    border: 2px solid rgb(100%, 52%, 21%);
+}
+
+.CodeMirror .webkit-html-error-message {
+    background-color: rgb(100%, 42%, 42%);
+    border: 2px solid rgb(100%, 31%, 31%);
+}
+
+/** @see crbug.com/358161 */
+.CodeMirror .CodeMirror-vscrollbar, .CodeMirror .CodeMirror-hscrollbar {
+  -webkit-transform: translateZ(0);
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/codemirror.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/codemirror.css
new file mode 100644 (file)
index 0000000..23eaf74
--- /dev/null
@@ -0,0 +1,263 @@
+/* BASICS */
+
+.CodeMirror {
+  /* Set height, width, borders, and global font properties here */
+  font-family: monospace;
+  height: 300px;
+}
+.CodeMirror-scroll {
+  /* Set scrolling behaviour here */
+  overflow: auto;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+  padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre {
+  padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+  border-right: 1px solid #ddd;
+  background-color: #f7f7f7;
+  white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+  padding: 0 3px 0 5px;
+  min-width: 20px;
+  text-align: right;
+  color: #999;
+}
+
+/* CURSOR */
+
+.CodeMirror div.CodeMirror-cursor {
+  border-left: 1px solid black;
+  z-index: 3;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+  border-left: 1px solid silver;
+}
+.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
+  width: auto;
+  border: 0;
+  background: #7e7;
+  z-index: 1;
+}
+/* Can style cursor different in overwrite (non-insert) mode */
+.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
+
+.cm-tab { display: inline-block; }
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable {color: black;}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-property {color: black;}
+.cm-s-default .cm-operator {color: black;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+.CodeMirror-activeline-background {background: #e8f2ff;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+   the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+  line-height: 1;
+  position: relative;
+  overflow: hidden;
+  background: white;
+  color: black;
+}
+
+.CodeMirror-scroll {
+  /* 30px is the magic margin used to hide the element's real scrollbars */
+  /* See overflow: hidden in .CodeMirror */
+  margin-bottom: -30px; margin-right: -30px;
+  padding-bottom: 30px; padding-right: 30px;
+  height: 100%;
+  outline: none; /* Prevent dragging from highlighting the element */
+  position: relative;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+.CodeMirror-sizer {
+  position: relative;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+   before actuall scrolling happens, thus preventing shaking and
+   flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  position: absolute;
+  z-index: 6;
+  display: none;
+}
+.CodeMirror-vscrollbar {
+  right: 0; top: 0;
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+  bottom: 0; left: 0;
+  overflow-y: hidden;
+  overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+  right: 0; bottom: 0;
+}
+.CodeMirror-gutter-filler {
+  left: 0; bottom: 0;
+}
+
+.CodeMirror-gutters {
+  position: absolute; left: 0; top: 0;
+  padding-bottom: 30px;
+  z-index: 3;
+}
+.CodeMirror-gutter {
+  white-space: normal;
+  height: 100%;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  padding-bottom: 30px;
+  margin-bottom: -32px;
+  display: inline-block;
+  /* Hack to make IE7 behave */
+  *zoom:1;
+  *display:inline;
+}
+.CodeMirror-gutter-elt {
+  position: absolute;
+  cursor: default;
+  z-index: 4;
+}
+
+.CodeMirror-lines {
+  cursor: text;
+}
+.CodeMirror pre {
+  /* Reset some styles that the rest of the page might have set */
+  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+  border-width: 0;
+  background: transparent;
+  font-family: inherit;
+  font-size: inherit;
+  margin: 0;
+  white-space: pre;
+  word-wrap: normal;
+  line-height: inherit;
+  color: inherit;
+  z-index: 2;
+  position: relative;
+  overflow: visible;
+}
+.CodeMirror-wrap pre {
+  word-wrap: break-word;
+  white-space: pre-wrap;
+  word-break: normal;
+}
+.CodeMirror-code pre {
+  border-right: 30px solid transparent;
+  width: -webkit-fit-content;
+  width: -moz-fit-content;
+  width: fit-content;
+}
+.CodeMirror-wrap .CodeMirror-code pre {
+  border-right: none;
+  width: auto;
+}
+.CodeMirror-linebackground {
+  position: absolute;
+  left: 0; right: 0; top: 0; bottom: 0;
+  z-index: 0;
+}
+
+.CodeMirror-linewidget {
+  position: relative;
+  z-index: 2;
+  overflow: auto;
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-wrap .CodeMirror-scroll {
+  overflow-x: hidden;
+}
+
+.CodeMirror-measure {
+  position: absolute;
+  width: 100%;
+  height: 0;
+  overflow: hidden;
+  visibility: hidden;
+}
+.CodeMirror-measure pre { position: static; }
+
+.CodeMirror div.CodeMirror-cursor {
+  position: absolute;
+  visibility: hidden;
+  border-right: none;
+  width: 0;
+}
+.CodeMirror-focused div.CodeMirror-cursor {
+  visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+
+.cm-searching {
+  background: #ffa;
+  background: rgba(255, 255, 0, .4);
+}
+
+/* IE7 hack to prevent it from returning funny offsetTops on the spans */
+.CodeMirror span { *vertical-align: text-bottom; }
+
+@media print {
+  /* Hide the cursor when printing */
+  .CodeMirror div.CodeMirror-cursor {
+    visibility: hidden;
+  }
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/dataGrid.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/dataGrid.css
new file mode 100644 (file)
index 0000000..265982b
--- /dev/null
@@ -0,0 +1,248 @@
+.data-grid {
+    position: relative;
+    border: 1px solid #aaa;
+    font-size: 11px;
+    line-height: 120%;
+}
+
+.data-grid .highlight {
+    background-color: rgb(255, 230, 179);
+}
+
+.data-grid tr.selected .highlight {
+    background-color: transparent;
+}
+
+.data-grid table {
+    table-layout: fixed;
+    border-spacing: 0;
+    border-collapse: collapse;
+    width: 100%;
+}
+
+.data-grid .data-container {
+    position: absolute;
+    top: 17px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    -webkit-transform: translateZ(0);
+}
+
+.data-grid.inline {
+    border-left: none;
+}
+
+.data-grid.inline .data-container {
+    position: static;
+}
+
+.data-grid.inline th.corner,
+.data-grid.inline td.corner {
+    display: none;
+}
+
+.data-grid th {
+    text-align: left;
+    background-color: rgb(236, 236, 236);
+    border: 1px solid rgb(179, 179, 179);
+    border-top: none;
+    border-right: none;
+    height: 16px;
+    line-height: 16px;
+    font-weight: normal;
+    vertical-align: middle;
+    padding: 0 4px;
+    white-space: nowrap;
+}
+
+.data-grid th.corner,
+.data-grid td.corner,
+.data-grid col.corner {
+    width: 14px;
+    padding-right: 0;
+    padding-left: 0;
+    border-left: 0 none transparent !important;
+}
+
+.data-grid tr.filler {
+    display: table-row !important;
+    height: auto !important;
+}
+
+.data-grid tr.filler td {
+    height: auto !important;
+    padding: 0 !important;
+}
+
+.data-grid table.data {
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    height: 100%;
+    border-top: 0 none transparent;
+    background-image: linear-gradient(to bottom, white, white 50%, rgb(234, 243, 255) 50%, rgb(234, 243, 255));
+    background-size: 128px 32px;
+    table-layout: fixed;
+}
+
+.data-grid.inline table.data {
+    position: static;
+}
+
+.data-grid table.data tr {
+    display: none;
+}
+
+.data-grid table.data tr.revealed {
+    display: table-row;
+}
+
+.data-grid td {
+    vertical-align: top;
+    height: 16px; /* Keep in sync with .data-grid table.data @ background-size */
+    line-height: 14px;
+    padding: 1px 4px;
+    white-space: nowrap;
+    overflow: hidden;
+    border-left: 1px solid #aaa;
+    -webkit-user-select: text;
+}
+
+.data-grid th:first-child,
+.data-grid td:first-child {
+    border-left: none !important;
+}
+
+.data-grid td > div,
+.data-grid th > div {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.data-grid td.editing > div {
+    text-overflow: clip;
+}
+
+.data-grid .center div {
+    text-align: center;
+}
+
+.data-grid .right div {
+    text-align: right;
+}
+
+.data-grid th.sortable div {
+    position: relative;
+}
+
+.data-grid th.sortable:active {
+    background-color: rgba(0, 0, 0, 0.15);
+}
+
+.data-grid th.sort-ascending > div::after,
+.data-grid th.sort-descending > div::after {
+    position: absolute;
+    top: 1px;
+    right: 0;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    width: 8px;
+    height: 10px;
+    content: "a";
+    color: transparent;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.data-grid th.sort-ascending > div::after,
+.data-grid th.sort-descending > div::after {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.data-grid th.sort-ascending > div::after {
+    background-position: -4px -108px;
+}
+
+.data-grid th.sort-descending > div::after {
+    background-position: -20px -96px;
+}
+
+.data-grid th:hover {
+    background-color: rgba(0, 0, 0, 0.1);
+}
+
+.data-grid button {
+    line-height: 18px;
+    color: inherit;
+}
+
+.data-grid tr.parent td.disclosure::before {
+    -webkit-user-select: none;
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-size: 320px 144px;
+    float: left;
+    width: 8px;
+    margin-right: 2px;
+    content: "a";
+    color: transparent;
+    position: relative;
+    top: 1px;
+}
+
+.data-grid tr.parent td.disclosure::before {
+    background-color: rgb(110, 110, 110);
+    -webkit-mask-position: -4px -96px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.data-grid tr.parent td.disclosure::before {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.data-grid tr.expanded td.disclosure::before {
+    -webkit-mask-position: -20px -96px;
+}
+
+.data-grid tr.selected {
+    background-color: rgb(212, 212, 212);
+    color: inherit;
+}
+
+.data-grid:focus tr.selected {
+    background-color: rgb(56, 121, 217);
+    color: white;
+}
+
+.data-grid:focus tr.selected a {
+    color: white;
+}
+
+.data-grid:focus tr.parent.selected td.disclosure::before {
+    background-color: white;
+    -webkit-mask-position: -4px -96px;
+}
+
+.data-grid:focus tr.expanded.selected td.disclosure::before {
+    background-color: white;
+    -webkit-mask-position: -20px -96px;
+}
+
+.data-grid tr:not(.parent) td.disclosure {
+    text-indent: 10px;
+}
+
+.data-grid-resizer {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 5px;
+    z-index: 500;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/devtools.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/devtools.css
deleted file mode 100755 (executable)
index e228fee..0000000
+++ /dev/null
@@ -1,6372 +0,0 @@
-/* audits.css */\r
-\r
-/*\r
- * Copyright (C) 2008 Apple Inc.  All rights reserved.\r
- * Copyright (C) 2009 Google Inc. All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions are\r
- * met:\r
- *\r
- *     * Redistributions of source code must retain the above copyright\r
- * notice, this list of conditions and the following disclaimer.\r
- *     * Redistributions in binary form must reproduce the above\r
- * copyright notice, this list of conditions and the following disclaimer\r
- * in the documentation and/or other materials provided with the\r
- * distribution.\r
- *     * Neither the name of Google Inc. nor the names of its\r
- * contributors may be used to endorse or promote products derived from\r
- * this software without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
- */\r
-\r
-.audits-sidebar-tree-item .icon {\r
-    content: url(Images/resourcesTimeGraphIcon.png);\r
-}\r
-\r
-.audit-result-sidebar-tree-item .icon {\r
-    content: url(Images/resourceDocumentIcon.png);\r
-}\r
-\r
-#audit-views {\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    left: 200px;\r
-    bottom: 0;\r
-    overflow: auto;\r
-}\r
-\r
-.audit-launcher-view {\r
-    z-index: 1000;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    background-color: white;\r
-    font-size: 13px;\r
-    overflow-x: hidden;\r
-    overflow-y: overlay;\r
-    display: none;\r
-}\r
-\r
-.audit-launcher-view.visible {\r
-    display: block;\r
-}\r
-\r
-.audit-launcher-view .audit-launcher-view-content {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    padding: 0 0 0 16px;\r
-    white-space: nowrap;\r
-    display: -webkit-box;\r
-    -webkit-box-orient: vertical;\r
-}\r
-\r
-.audit-launcher-view h1 {\r
-    color: rgb(110, 116, 128);\r
-    font-size: 16px;\r
-    line-height: 20px;\r
-    font-weight: normal;\r
-    padding-top: 15px;\r
-}\r
-\r
-.audit-launcher-view h1.no-audits {\r
-    text-align: center;\r
-    font-style: italic;\r
-    position: relative;\r
-    left: -8px;\r
-}\r
-\r
-.audit-launcher-view div.button-container {\r
-    display: -webkit-box;\r
-    -webkit-box-orient: vertical;\r
-    width: 100%;\r
-    padding: 16px 0;\r
-}\r
-.audit-launcher-view .flexible-space {\r
-    -webkit-box-flex: 1;\r
-}\r
-\r
-.audit-launcher-view div.audit-categories-container {\r
-    position: relative;\r
-    top: 11px;\r
-    left: 0;\r
-    width: 100%;\r
-    overflow-y: auto;\r
-}\r
-\r
-.audit-launcher-view button {\r
-    color: rgb(6, 6, 6);\r
-    background-color: transparent;\r
-    border: 1px solid rgb(165, 165, 165);\r
-    background-color: rgb(237, 237, 237);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));\r
-    -webkit-border-radius: 12px;\r
-    -webkit-appearance: none;\r
-}\r
-\r
-.audit-launcher-view button {\r
-    font-size: 13px;\r
-    padding: 3px 20px;\r
-    height: 24px;\r
-    margin: 0 5px 0 0;\r
-}\r
-\r
-.audit-launcher-view button:active {\r
-    background-color: rgb(215, 215, 215);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));\r
-}\r
-\r
-body.inactive .audit-launcher-view button, .audit-launcher-view button:disabled {\r
-    color: rgb(130, 130, 130);\r
-    border-color: rgb(212, 212, 212);\r
-    background-color: rgb(239, 239, 239);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));\r
-}\r
-\r
-.audit-launcher-view label {\r
-    position: relative;\r
-    display: block;\r
-    text-align: left;\r
-    word-break: break-word;\r
-    padding: 0 0 5px 0;\r
-}\r
-\r
-.audit-launcher-view label.disabled {\r
-    color: rgb(130, 130, 130);\r
-}\r
-\r
-.audit-launcher-view input[type="checkbox"] {\r
-    margin-left: 0;\r
-}\r
-\r
-.audit-launcher-view input[type="radio"] {\r
-    height: 17px;\r
-    width: 17px;\r
-    border: 1px solid rgb(165, 165, 165);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));\r
-    -webkit-border-radius: 8px;\r
-    -webkit-appearance: none;\r
-    vertical-align: middle;\r
-    margin: 0 5px 5px 0;\r
-}\r
-\r
-.audit-launcher-view input[type="radio"]:active:not(:disabled) {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));\r
-}\r
-\r
-.audit-launcher-view input[type="radio"]:checked:not(:disabled), .audit-launcher-view input[type="radio"]:checked:disabled {\r
-    background: url(Images/radioDot.png) center no-repeat,\r
-                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));\r
-}\r
-\r
-.audit-launcher-view .resource-progress > img {\r
-    content: url(Images/spinner.gif);\r
-    vertical-align: text-top;\r
-    margin: 0 4px 0 8px;\r
-}\r
-\r
-.audit-result-view {\r
-    overflow: auto;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    display: none;\r
-}\r
-\r
-.audit-result-view.visible {\r
-    display: block;\r
-}\r
-\r
-.audit-result-view .severity-severe {\r
-    content: url(Images/errorRedDot.png);\r
-}\r
-\r
-.audit-result-view .severity-warning {\r
-    content: url(Images/warningOrangeDot.png);\r
-}\r
-\r
-.audit-result-view .severity-info {\r
-    content: url(Images/successGreenDot.png);\r
-}\r
-\r
-.audit-result-tree li.parent::before {\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-    float: left;\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-top: 1px;\r
-    padding-right: 2px;\r
-}\r
-\r
-.audit-result-tree {\r
-    font-size: 11px;\r
-    line-height: 14px;\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.audit-result-tree > ol {\r
-    position: relative;\r
-    padding: 2px 6px !important;\r
-    margin: 0;\r
-    color: rgb(84, 84, 84);\r
-    cursor: default;\r
-    min-width: 100%;\r
-}\r
-\r
-.audit-result-tree, .audit-result-tree ol {\r
-    list-style-type: none;\r
-    -webkit-padding-start: 12px;\r
-    margin: 0;\r
-}\r
-\r
-.audit-result-tree li {\r
-    padding: 0 0 0 14px;\r
-    margin-top: 1px;\r
-    margin-bottom: 1px;\r
-    word-wrap: break-word;\r
-    text-indent: -2px;\r
-}\r
-\r
-.audit-result-tree li.parent {\r
-    text-indent: -12px\r
-}\r
-\r
-.audit-result-tree li.parent::before {\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-    float: left;\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-top: 0;\r
-    padding-right: 2px;\r
-}\r
-\r
-.audit-result-tree li.parent.expanded::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-}\r
-\r
-.audit-result-tree ol.children {\r
-    display: none;\r
-}\r
-\r
-.audit-result-tree ol.children.expanded {\r
-    display: block;\r
-}\r
-\r
-.audit-result {\r
-    font-weight: bold;\r
-    color: black;\r
-}\r
-\r
-.audit-result img {\r
-    float: left;\r
-    margin-left: -40px;\r
-    margin-top: -1px;\r
-}\r
-\r
-/* goToLineDialog.css */\r
-\r
-.go-to-line-dialog {\r
-    position: absolute;\r
-    top: 40%;\r
-    left: 40%;\r
-    z-index: 1900;\r
-\r
-    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#E9E9E9), to(#CFCFCF));\r
-    display: -webkit-box;\r
-    -webkit-box-orient: vertical;\r
-    padding: 10px;\r
-    border-radius: 10px;\r
-    border: 1px solid gray;\r
-    -webkit-box-shadow: rgb(40,40,40) 0px 0px 50px;\r
-\r
-    font-size: 11px;\r
-    font-family: 'Lucida Grande', sans-serif;\r
-}\r
-\r
-.go-to-line-dialog input {\r
-    font-size: 11px;\r
-}\r
-\r
-.go-to-line-dialog button {\r
-    font-size: 11px;\r
-    color: rgb(6, 6, 6);\r
-    border: 1px solid rgb(165, 165, 165);\r
-    background-color: rgb(237, 237, 237);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));\r
-    -webkit-border-radius: 12px;\r
-    -webkit-appearance: none;\r
-\r
-    padding: 3px 20px;\r
-    margin: 0 0 0 10px;\r
-}\r
-\r
-.go-to-line-dialog button:active {\r
-    background-color: rgb(215, 215, 215);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));\r
-}\r
-\r
-/* heapProfiler.css */\r
-\r
-/*\r
- * Copyright (C) 2009 Google Inc. All rights reserved.\r
- * Copyright (C) 2010 Apple Inc. All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions are\r
- * met:\r
- *\r
- *     * Redistributions of source code must retain the above copyright\r
- * notice, this list of conditions and the following disclaimer.\r
- *     * Redistributions in binary form must reproduce the above\r
- * copyright notice, this list of conditions and the following disclaimer\r
- * in the documentation and/or other materials provided with the\r
- * distribution.\r
- *     * Neither the name of Google Inc. nor the names of its\r
- * contributors may be used to endorse or promote products derived from\r
- * this software without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
- */\r
-\r
-.heap-snapshot-sidebar-tree-item .icon {\r
-    content: url(Images/profileIcon.png);\r
-}\r
-\r
-.heap-snapshot-sidebar-tree-item.small .icon {\r
-    content: url(Images/profileSmallIcon.png);\r
-}\r
-\r
-.heap-snapshot-view {\r
-    display: none;\r
-    overflow: hidden;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-}\r
-\r
-.heap-snapshot-view.visible {\r
-    display: block;\r
-}\r
-\r
-.heap-snapshot-view .data-grid {\r
-    border: none;\r
-    max-height: 100%;\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    top: 0;\r
-    bottom: 93px;\r
-}\r
-\r
-.heap-snapshot-view .data-grid th.count-column {\r
-    text-align: center;\r
-}\r
-\r
-.heap-snapshot-view .data-grid td.count-column {\r
-    text-align: right;\r
-}\r
-\r
-.heap-snapshot-view .data-grid th.size-column {\r
-    text-align: center;\r
-}\r
-\r
-.heap-snapshot-view .data-grid td.size-column {\r
-    text-align: right;\r
-}\r
-\r
-.heap-snapshot-view .data-grid th.countDelta-column {\r
-    text-align: center;\r
-}\r
-\r
-.heap-snapshot-view .data-grid td.countDelta-column {\r
-    text-align: right;\r
-}\r
-\r
-.heap-snapshot-view .data-grid th.sizeDelta-column {\r
-    text-align: center;\r
-}\r
-\r
-.heap-snapshot-view .data-grid td.sizeDelta-column {\r
-    text-align: right;\r
-}\r
-\r
-#heap-snapshot-summary-container {\r
-    position: absolute;\r
-    padding-top: 20px;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    height: 93px;\r
-    margin-left: -1px;\r
-    border-left: 1px solid rgb(102, 102, 102);\r
-    background-color: rgb(101, 111, 130);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\r
-    background-repeat: repeat-x;\r
-    background-position: top;\r
-    text-align: center;\r
-    text-shadow: black 0 1px 1px;\r
-    white-space: nowrap;\r
-    color: white;\r
-    -webkit-background-size: 1px 6px;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-.heap-snapshot-summary {\r
-    display: inline-block;\r
-    width: 50%;\r
-    min-width: 300px;\r
-    position: relative;\r
-}\r
-\r
-.heap-snapshot-summary canvas.summary-graph {\r
-    width: 225px;\r
-}\r
-\r
-.heap-snapshot-summary-label {\r
-    font-size: 12px;\r
-    font-weight: bold;\r
-    position: absolute;\r
-    top: 1px;\r
-    width: 50%;\r
-    left: 25%;\r
-}\r
-\r
-/* inspector.css */\r
-\r
-/*\r
- * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\r
- * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- *\r
- * 1.  Redistributions of source code must retain the above copyright\r
- *     notice, this list of conditions and the following disclaimer. \r
- * 2.  Redistributions in binary form must reproduce the above copyright\r
- *     notice, this list of conditions and the following disclaimer in the\r
- *     documentation and/or other materials provided with the distribution. \r
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of\r
- *     its contributors may be used to endorse or promote products derived\r
- *     from this software without specific prior written permission. \r
- *\r
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY\r
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\r
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
- */\r
-\r
-html {\r
-    height: 100%;\r
-}\r
-\r
-body {\r
-    cursor: default;\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    overflow: hidden;\r
-    font-family: Lucida Grande, sans-serif;\r
-    font-size: 10px;\r
-    margin: 0;\r
-    -webkit-text-size-adjust: none;\r
-    -webkit-user-select: none;\r
-}\r
-\r
-* {\r
-    -webkit-box-sizing: border-box;\r
-}\r
-\r
-:focus {\r
-    outline: none;\r
-}\r
-\r
-input[type="search"]:focus, input[type="text"]:focus {\r
-    outline: auto 5px -webkit-focus-ring-color;\r
-}\r
-\r
-iframe, a img {\r
-    border: none;\r
-}\r
-\r
-img {\r
-    -webkit-user-drag: none;\r
-}\r
-\r
-.hidden {\r
-    display: none !important;\r
-}\r
-\r
-#toolbar {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    height: 56px;\r
-    display: -webkit-box;\r
-    padding: 0 5px;\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(191, 191, 191)), to(rgb(151, 151, 151)));\r
-    border-bottom: 1px solid rgb(80, 80, 80);\r
-    -webkit-box-orient: horizontal;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-body.inactive #toolbar {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(207, 207, 207)));\r
-    border-bottom: 1px solid rgb(64%, 64%, 64%);\r
-}\r
-\r
-body.detached.platform-mac-leopard #toolbar,\r
-body.detached.platform-mac-snowleopard #toolbar {\r
-    background: transparent !important;\r
-}\r
-\r
-body.attached #toolbar {\r
-    height: 34px;\r
-    border-top: 1px solid rgb(100, 100, 100);\r
-    cursor: row-resize;\r
-    padding-left: 0;\r
-}\r
-\r
-body.attached.port-qt #toolbar {\r
-    cursor: auto;\r
-}\r
-\r
-body.attached.inactive #toolbar {\r
-    border-top: 1px solid rgb(64%, 64%, 64%);\r
-}\r
-\r
-.toolbar-item {\r
-    display: -webkit-box;\r
-    padding: 4px 6px;\r
-    margin: 0;\r
-    background-color: transparent;\r
-    border-style: none;\r
-    border-color: transparent;\r
-    -webkit-box-orient: vertical;\r
-    -webkit-box-align: center;\r
-    -webkit-box-pack: end;\r
-}\r
-\r
-.toolbar-item.toggleable.toggled-on {\r
-    border-width: 0 2px 0 2px;\r
-    padding: 4px 4px;\r
-    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;\r
-}\r
-\r
-.toolbar-item.flexable-space {\r
-    -webkit-box-flex: 1;\r
-    visibility: hidden;\r
-}\r
-\r
-.toolbar-item input {\r
-    margin-bottom: 8px;\r
-}\r
-\r
-.toolbar-icon {\r
-    display: inline-block;\r
-    width: 32px;\r
-    height: 32px;\r
-    -webkit-background-size: 100% auto;\r
-}\r
-\r
-body.attached .toolbar-icon {\r
-    width: 24px;\r
-    height: 24px;\r
-    vertical-align: middle;\r
-}\r
-\r
-.toolbar-item:active .toolbar-icon {\r
-    background-position: 0 32px;\r
-}\r
-\r
-body.attached .toolbar-item:active .toolbar-icon {\r
-    background-position: 0 24px;\r
-}\r
-\r
-.toolbar-label {\r
-    font-size: 11px;\r
-    font-family: Lucida Grande, sans-serif;\r
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;\r
-}\r
-\r
-.toolbar-item.toggleable:active .toolbar-label {\r
-    text-shadow: none;\r
-}\r
-\r
-body.attached .toolbar-label {\r
-    display: inline-block;\r
-    vertical-align: middle;\r
-    margin-left: 3px;\r
-}\r
-\r
-body.attached #search-toolbar-label {\r
-    display: none;\r
-}\r
-\r
-#search {\r
-    width: 205px;\r
-    font-size: 16px;\r
-    margin-bottom: 5px;\r
-}\r
-\r
-body.attached #search {\r
-    font-size: 11px;\r
-    margin-bottom: 8px;\r
-}\r
-\r
-#search-results-matches {\r
-    font-size: 11px;\r
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;\r
-    margin-bottom: 22px;\r
-}\r
-\r
-body.attached #search-results-matches {\r
-    margin-bottom: 6px;\r
-}\r
-\r
-.toolbar-item.elements .toolbar-icon {\r
-    background-image: url(Images/elementsIcon.png);\r
-}\r
-\r
-.toolbar-item.resources .toolbar-icon {\r
-    background-image: url(Images/resourcesIcon.png);\r
-}\r
-\r
-.toolbar-item.network .toolbar-icon {\r
-    background-image: url(Images/networkIcon.png);\r
-}\r
-\r
-.toolbar-item.scripts .toolbar-icon {\r
-    background-image: url(Images/scriptsIcon.png);\r
-}\r
-\r
-.toolbar-item.timeline .toolbar-icon {\r
-    background-image: url(Images/timelineIcon.png);\r
-}\r
-\r
-.toolbar-item.profiles .toolbar-icon {\r
-    background-image: url(Images/profilesIcon.png);\r
-}\r
-\r
-.toolbar-item.audits .toolbar-icon {\r
-    background-image: url(Images/auditsIcon.png);\r
-}\r
-\r
-.toolbar-item.console .toolbar-icon {\r
-    background-image: url(Images/consoleIcon.png);\r
-}\r
-\r
-#close-button-left, #close-button-right {\r
-    width: 14px;\r
-    height: 14px;\r
-    background-image: url(Images/closeButtons.png);\r
-    background-position: 0 0;\r
-    background-color: transparent;\r
-    border: 0 none transparent;\r
-    margin: 5px 0;\r
-}\r
-\r
-#close-button-left:hover, #close-button-right:hover {\r
-    background-position: 14px 0;\r
-}\r
-\r
-#close-button-left:active, #close-button-right:active {\r
-    background-position: 28px 0;\r
-}\r
-\r
-body.detached .toolbar-item.close-left, body.detached .toolbar-item.close-right {\r
-    display: none;\r
-}\r
-\r
-body.attached.port-qt .toolbar-item.close-left, body.attached.port-qt .toolbar-item.close-right {\r
-    display: none;\r
-}\r
-\r
-body.platform-mac .toolbar-item.close-right {\r
-    display: none;\r
-}\r
-\r
-body:not(.platform-mac) .toolbar-item.close-left {\r
-    display: none;\r
-}\r
-\r
-#main {\r
-    position: absolute;\r
-    z-index: 1;\r
-    top: 56px;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    overflow: hidden;\r
-    background-color: white;\r
-}\r
-\r
-body.attached #main {\r
-    top: 34px;\r
-}\r
-\r
-#main-panels {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 23px;\r
-    overflow: hidden;\r
-}\r
-\r
-#main-status-bar {\r
-    position: absolute;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-}\r
-\r
-body.drawer-visible #main-status-bar {\r
-    height: 24px;\r
-    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackground.png);\r
-    background-repeat: no-repeat, repeat-x;\r
-    background-position: right center, center;\r
-    cursor: row-resize;\r
-}\r
-\r
-body.drawer-visible #main-status-bar * {\r
-    cursor: default;\r
-}\r
-\r
-body.drawer-visible #main-panels {\r
-    bottom: 24px;\r
-}\r
-\r
-.status-bar {\r
-    background-color: rgb(235, 235, 235);\r
-    background-image: url(Images/statusbarBackground.png);\r
-    background-repeat: repeat-x;\r
-    white-space: nowrap;\r
-    height: 23px;\r
-    overflow: hidden;\r
-    z-index: 12;\r
-}\r
-\r
-.status-bar > div {\r
-    display: inline-block;\r
-    vertical-align: top;\r
-}\r
-\r
-.status-bar-item {\r
-    display: inline-block;\r
-    height: 24px;\r
-    padding: 0;\r
-    margin-left: -1px;\r
-    margin-right: 0;\r
-    vertical-align: top;\r
-    border: 0 transparent none;\r
-    background-color: transparent;\r
-}\r
-\r
-.status-bar-item:active {\r
-    position: relative;\r
-    z-index: 200;\r
-}\r
-\r
-.glyph {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    background-color: rgba(0, 0, 0, 0.75);\r
-    z-index: 1;\r
-}\r
-\r
-.glyph.shadow {\r
-    top: 1px;\r
-    background-color: white !important;\r
-    z-index: 0;\r
-}\r
-\r
-button.status-bar-item {\r
-    position: relative;\r
-    width: 32px;\r
-    background-image: url(Images/statusbarButtons.png);\r
-    background-position: 0 0;\r
-}\r
-\r
-button.status-bar-item:active {\r
-    background-position: 32px 0 !important;\r
-}\r
-\r
-button.status-bar-item .glyph.shadow {\r
-    background-color: rgba(255, 255, 255, 0.33) !important;\r
-}\r
-\r
-button.status-bar-item.toggled-on .glyph {\r
-    background-color: rgb(66, 129, 235);\r
-}\r
-\r
-button.status-bar-item.toggled-1 .glyph {\r
-    background-color: rgb(66, 129, 235);\r
-}\r
-\r
-button.status-bar-item.toggled-2 .glyph {\r
-    background-color: purple;   \r
-}\r
-\r
-button.status-bar-item:disabled {\r
-    opacity: 0.5;\r
-    background-position: 0 0 !important;\r
-}\r
-\r
-select.status-bar-item {\r
-    min-width: 48px;\r
-    border-width: 0 17px 0 2px;\r
-    padding: 0 2px 0 6px;\r
-    font-weight: bold;\r
-    color: rgb(48, 48, 48);\r
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;\r
-    -webkit-border-image: url(Images/statusbarMenuButton.png) 0 17 0 2;\r
-    -webkit-border-radius: 0;\r
-    -webkit-appearance: none;\r
-}\r
-\r
-select.status-bar-item:active {\r
-    color: black;\r
-    -webkit-border-image: url(Images/statusbarMenuButtonSelected.png) 0 17 0 2;\r
-}\r
-\r
-#dock-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/undockButtonGlyph.png);\r
-}\r
-\r
-body.detached #dock-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/dockButtonGlyph.png);\r
-}\r
-\r
-body.port-qt #dock-status-bar-item {\r
-    display: none\r
-}\r
-\r
-#console-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/consoleButtonGlyph.png);\r
-}\r
-\r
-.clear-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/clearConsoleButtonGlyph.png);\r
-}\r
-\r
-#changes-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/consoleButtonGlyph.png); /* TODO: Needs Image for Changes Toggle Button */\r
-}\r
-\r
-#counters {\r
-    position: absolute;\r
-    right: 16px;\r
-    top: 0;\r
-    cursor: pointer;\r
-    padding: 6px 2px 6px 0px;\r
-    font-size: 10px;\r
-    height: 19px;\r
-}\r
-\r
-#changes-count, #error-warning-count {\r
-    display: inline;\r
-}\r
-\r
-#error-warning-count:hover, #changes-count:hover {\r
-    border-bottom: 1px solid rgb(96, 96, 96);\r
-}\r
-\r
-#style-changes-count::before {\r
-    content: url(Images/styleIcon.png); /* TODO: Needs Image for Style Changes Icon */\r
-    width: 10px;\r
-    height: 10px;\r
-    vertical-align: -1px;\r
-    margin-right: 2px;\r
-}\r
-\r
-#error-count::before {\r
-    content: url(Images/errorIcon.png);\r
-    width: 10px;\r
-    height: 10px;\r
-    vertical-align: -1px;\r
-    margin-right: 2px;\r
-}\r
-    \r
-#changes-count + #error-warning-count, #error-count + #warning-count {\r
-    margin-left: 6px;\r
-}\r
-\r
-#warning-count::before {\r
-    content: url(Images/warningIcon.png);\r
-    width: 10px;\r
-    height: 10px;\r
-    vertical-align: -1px;\r
-    margin-right: 2px;\r
-}\r
-\r
-#drawer {\r
-    display: none;\r
-    position: absolute;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    height: 200px;\r
-    background-color: white;\r
-    background-image: url(Images/statusbarBottomBackground.png);\r
-    background-repeat: repeat-x;\r
-    background-position: bottom;\r
-}\r
-\r
-body.drawer-visible #drawer {\r
-    display: block;\r
-}\r
-\r
-#drawer-status-bar {\r
-    position: absolute;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    background: none;\r
-}\r
-\r
-.monospace {\r
-    font-size: 10px !important;\r
-    font-family: monospace;\r
-}\r
-\r
-body.platform-mac .monospace, body.platform-mac .source-code {\r
-    font-family: Monaco, monospace;\r
-}\r
-\r
-/* Keep .platform-mac to make the rule more specific than the general one above. */\r
-body.platform-mac.platform-mac-snowleopard .monospace,\r
-body.platform-mac.platform-mac-snowleopard .source-code {\r
-    font-size: 11px !important;\r
-    font-family: Menlo, monospace;\r
-}\r
-\r
-body.platform-windows .monospace, body.platform-windows .source-code {\r
-    font-size: 12px !important;\r
-    font-family: Consolas, Lucida Console, monospace;\r
-}\r
-\r
-body.platform-linux .monospace, body.platform-linux .source-code {\r
-    font-size: 11px !important;\r
-    font-family: dejavu sans mono, monospace;\r
-}\r
-\r
-#console-messages {\r
-    position: absolute;\r
-    z-index: 0;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 23px;\r
-    padding: 2px 0;\r
-    overflow-y: overlay;\r
-    word-wrap: break-word;\r
-    -webkit-user-select: text;\r
-    -webkit-text-size-adjust: auto;\r
-}\r
-\r
-#console-prompt {\r
-    position: relative;\r
-    padding: 1px 22px 1px 24px;\r
-    min-height: 16px; \r
-    white-space: pre-wrap;\r
-    -webkit-user-modify: read-write-plaintext-only;\r
-}\r
-\r
-#console-prompt::before {\r
-    background-image: url(Images/userInputIcon.png);\r
-}\r
-\r
-.console-user-command-result.console-log-level::before {\r
-    background-image: url(Images/userInputResultIcon.png);\r
-}\r
-\r
-.console-message, .console-user-command {\r
-    position: relative;\r
-    border-bottom: 1px solid rgb(240, 240, 240);\r
-    padding: 1px 22px 1px 24px;\r
-    min-height: 16px;\r
-}\r
-\r
-.console-adjacent-user-command-result {\r
-    border-bottom: none;\r
-}\r
-\r
-.console-adjacent-user-command-result + .console-user-command-result.console-log-level::before {\r
-    background-image: none;\r
-}\r
-\r
-.console-message::before, .console-user-command::before, #console-prompt::before, .console-group-title::before {\r
-    position: absolute;\r
-    display: block;\r
-    content: "";\r
-    left: 7px;\r
-    top: 0.8em;\r
-    width: 10px;\r
-    height: 10px;\r
-    margin-top: -5px;\r
-    -webkit-user-select: none;\r
-}\r
-\r
-.console-message .bubble {\r
-    display: inline-block;\r
-    height: 14px;\r
-    background-color: rgb(128, 151, 189);\r
-    vertical-align: middle;\r
-    white-space: nowrap;\r
-    padding: 1px 4px;\r
-    margin-top: -2px;\r
-    margin-right: 4px;\r
-    text-align: left;\r
-    font-size: 11px;\r
-    line-height: normal;\r
-    font-family: Helvetica, Arial, sans-serif;\r
-    font-weight: bold;\r
-    text-shadow: none;\r
-    color: white;\r
-    -webkit-border-radius: 7px;\r
-}\r
-\r
-.console-message-text {\r
-    white-space: pre-wrap;\r
-}\r
-\r
-.repeated-message {\r
-    padding-left: 6px;\r
-}\r
-\r
-.repeated-message.console-error-level::before, .repeated-message.console-warning-level:before, .repeated-message.console-debug-level:before {\r
-    visibility: hidden;\r
-}\r
-\r
-.console-group .console-group > .console-group-messages {\r
-    margin-left: 16px;\r
-}\r
-\r
-.console-group-title {\r
-    font-weight: bold;\r
-}\r
-\r
-.console-group-title::before {\r
-    background-image: url(Images/disclosureTriangleSmallDown.png);\r
-    top: 0.6em;\r
-    width: 11px;\r
-    height: 12px;\r
-}\r
-\r
-.console-group.collapsed .console-group-title::before {\r
-    background-image: url(Images/disclosureTriangleSmallRight.png);\r
-}\r
-\r
-.console-group.collapsed > .console-group-messages {\r
-    display: none;\r
-}\r
-\r
-.console-error-level .console-message-text {\r
-    color: red;\r
-}\r
-\r
-.console-debug-level .console-message-text {\r
-    color: blue;\r
-}\r
-\r
-.console-debug-level::before {\r
-    background-image: url(Images/searchSmallBrightBlue.png);\r
-}\r
-\r
-.console-error-level::before {\r
-    background-image: url(Images/errorIcon.png);\r
-}\r
-\r
-.console-warning-level::before {\r
-    background-image: url(Images/warningIcon.png);\r
-}\r
-\r
-.console-user-command .console-message {\r
-    margin-left: -24px;\r
-    padding-right: 0;\r
-    border-bottom: none;\r
-}\r
-\r
-.console-user-command::before {\r
-    background-image: url(Images/userInputPreviousIcon.png);\r
-}\r
-\r
-.console-user-command > .console-message-text {\r
-    color: rgb(0, 128, 255);\r
-}\r
-\r
-#console-messages a {\r
-    color: rgb(33%, 33%, 33%);\r
-    cursor: pointer;\r
-}\r
-\r
-#console-messages a:hover {\r
-    color: rgb(15%, 15%, 15%);\r
-}\r
-\r
-.console-message-url {\r
-    float: right;\r
-}\r
-\r
-.console-group-messages .section {\r
-    margin: 0 0 0 12px !important;\r
-}\r
-\r
-.console-group-messages .section .header {\r
-    padding: 0 8px 0 0;\r
-    background-image: none;\r
-    border: none;\r
-    min-height: 0;\r
-}\r
-\r
-.console-group-messages .section .header::before {\r
-    position: absolute;\r
-    top: 1px;\r
-    left: 1px;\r
-    width: 8px;\r
-    height: 8px;\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-}\r
-\r
-.console-group-messages .section.expanded .header::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-}\r
-\r
-.console-group-messages .section .header .title {\r
-    color: black;\r
-    font-weight: normal;\r
-}\r
-\r
-.console-group-messages .section .properties li .info {\r
-    padding-top: 0;\r
-    padding-bottom: 0;\r
-    color: rgb(60%, 60%, 60%);\r
-}\r
-\r
-.console-group-messages .outline-disclosure {\r
-    padding-left: 0;\r
-}\r
-\r
-.console-group-messages .outline-disclosure > ol {\r
-    padding: 0 0 0 12px !important;\r
-}\r
-\r
-.console-group-messages .outline-disclosure, .console-group-messages .outline-disclosure ol {\r
-    font-size: inherit;\r
-    line-height: 12px;\r
-}\r
-\r
-.console-group-messages .outline-disclosure.single-node li {\r
-    padding-left: 2px;\r
-}\r
-\r
-.console-group-messages .outline-disclosure li .selection {\r
-    margin-left: -6px;\r
-    margin-right: -6px;\r
-}\r
-\r
-.console-group-messages .add-attribute {\r
-    display: none;\r
-}\r
-\r
-.console-formatted-object, .console-formatted-node {\r
-    position: relative;\r
-    display: inline-block;\r
-    vertical-align: top;\r
-}\r
-\r
-.console-formatted-object .section, .console-formatted-node .section {\r
-    position: static;\r
-}\r
-\r
-.console-formatted-object .properties, .console-formatted-node .properties {\r
-    padding-left: 0 !important;\r
-}\r
-\r
-.console-formatted-number {\r
-    color: rgb(28, 0, 207);\r
-}\r
-\r
-.console-formatted-string, .console-formatted-regexp {\r
-    color: rgb(196, 26, 22);\r
-}\r
-\r
-.console-formatted-null, .console-formatted-undefined {\r
-    color: rgb(128, 128, 128);\r
-}\r
-\r
-.error-message {\r
-    color: red;\r
-}\r
-\r
-.auto-complete-text {\r
-    color: rgb(128, 128, 128);\r
-    -webkit-user-select: none;\r
-    -webkit-user-modify: read-only;\r
-}\r
-\r
-.panel {\r
-    display: none;\r
-    overflow: hidden;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-}\r
-\r
-.panel.visible {\r
-    display: block;\r
-}\r
-\r
-.webkit-line-gutter-backdrop {\r
-    /* Keep this in sync with view-source.css (.webkit-line-gutter-backdrop) */\r
-    width: 31px;\r
-    background-color: rgb(240, 240, 240);\r
-    border-right: 1px solid rgb(187, 187, 187);\r
-    position: absolute;\r
-    z-index: -1;\r
-    left: 0;\r
-    top: 0;\r
-    height: 100%\r
-}\r
-\r
-.resource-view {\r
-    display: none;\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    left: 0;\r
-    bottom: 0;\r
-    overflow: auto;\r
-}\r
-\r
-.resource-view.visible {\r
-    display: block;\r
-}\r
-\r
-.resource-view.font {\r
-    font-size: 60px;\r
-    white-space: pre-wrap;\r
-    word-wrap: break-word;\r
-    text-align: center;\r
-    padding: 15px;\r
-}\r
-\r
-.resource-view.image > .image {\r
-    padding: 20px 20px 10px 20px;\r
-    text-align: center;\r
-}\r
-\r
-.resource-view.image > .info {\r
-    padding-bottom: 10px;\r
-    font-size: 11px;\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.resource-view.image img.resource-image-view {\r
-    max-width: 100%;\r
-    max-height: 1000px;\r
-    background-image: url(Images/checker.png);\r
-    -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.5);\r
-    -webkit-user-select: text;\r
-    -webkit-user-drag: auto;\r
-}\r
-\r
-.resource-url {\r
-    vertical-align: middle;\r
-}\r
-\r
-.resource-status-image {\r
-    margin-top: -3px;\r
-    vertical-align: middle;\r
-}\r
-\r
-.resource-view.image .title {\r
-    text-align: center;\r
-    font-size: 13px;\r
-}\r
-\r
-.resource-view.image .infoList {\r
-    margin: 0;\r
-}\r
-\r
-.resource-view.image .infoList dt {\r
-    font-weight: bold;\r
-    display: inline-block;\r
-    width: 50%;\r
-    text-align: right;\r
-    color: rgb(76, 76, 76);\r
-}\r
-\r
-.resource-view.image .infoList dd {\r
-    display: inline-block;\r
-    padding-left: 8px;\r
-    width: 50%;\r
-    text-align: left;\r
-    margin: 0;\r
-}\r
-\r
-.resource-view.image .infoList dd::after {\r
-    white-space: pre;\r
-    content: "\A";\r
-}\r
-\r
-.resource-timing-row {\r
-    position: relative;\r
-    height: 12px;\r
-}\r
-\r
-.resource-timing-bar {\r
-    position: absolute;\r
-    background-color: red;\r
-    border-left: 1px solid red;\r
-    opacity: 0.4;\r
-}\r
-\r
-.resource-timing-bar-title {\r
-    position: absolute;\r
-}\r
-\r
-#elements-content {\r
-    display: block;\r
-    overflow: auto;\r
-    padding: 0;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 325px;\r
-    bottom: 0;\r
-}\r
-\r
-#elements-sidebar {\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    width: 325px;\r
-    border-left: 1px solid rgb(64%, 64%, 64%);\r
-    cursor: default;\r
-    overflow: auto;\r
-}\r
-\r
-.crumbs {\r
-    display: inline-block;\r
-    font-size: 11px;\r
-    line-height: 19px;\r
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;\r
-    color: rgb(20, 20, 20);\r
-    margin-left: -1px;\r
-    padding-right: 12px;\r
-}\r
-\r
-.crumbs .crumb {\r
-    height: 24px;\r
-    border-width: 0 12px 0 2px;\r
-    -webkit-border-image: url(Images/segment.png) 0 12 0 2;\r
-    margin-right: -12px;\r
-    padding-left: 18px;\r
-    padding-right: 2px;\r
-    white-space: nowrap;\r
-    line-height: 23px;\r
-    float: right;\r
-}\r
-\r
-.crumbs .crumb.collapsed > * {\r
-    display: none;\r
-}\r
-\r
-.crumbs .crumb.collapsed::before {\r
-    content: "\2026";\r
-    font-weight: bold;\r
-}\r
-\r
-.crumbs .crumb.compact .extra {\r
-    display: none;\r
-}\r
-\r
-.crumbs .crumb.dimmed {\r
-    color: rgba(0, 0, 0, 0.45);\r
-}\r
-\r
-.crumbs .crumb.start {\r
-    padding-left: 7px;\r
-}\r
-\r
-.crumbs .crumb.end {\r
-    border-width: 0 2px 0 2px;\r
-    padding-right: 6px;\r
-    -webkit-border-image: url(Images/segmentEnd.png) 0 2 0 2;\r
-}\r
-\r
-.crumbs .crumb.selected {\r
-    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;\r
-    color: black;\r
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;\r
-}\r
-\r
-.crumbs .crumb.selected:hover {\r
-    -webkit-border-image: url(Images/segmentSelected.png) 0 12 0 2;\r
-}\r
-\r
-.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {\r
-    -webkit-border-image: url(Images/segmentSelectedEnd.png) 0 2 0 2;\r
-}\r
-\r
-.crumbs .crumb:hover {\r
-    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;\r
-    color: black;\r
-}\r
-\r
-.crumbs .crumb.dimmed:hover {\r
-    -webkit-border-image: url(Images/segmentHover.png) 0 12 0 2;\r
-    color: rgba(0, 0, 0, 0.75);\r
-}\r
-\r
-.crumbs .crumb.end:hover {\r
-    -webkit-border-image: url(Images/segmentHoverEnd.png) 0 2 0 2;\r
-}\r
-\r
-.outline-disclosure li.hovered:not(.selected) .selection {\r
-    display: block;\r
-    left: 3px;\r
-    right: 3px;\r
-    background-color: rgba(56, 121, 217, 0.1);\r
-    -webkit-border-radius: 5px;\r
-}\r
-\r
-.outline-disclosure li.highlighted .highlight {\r
-    background-color: rgb(255, 230, 179);\r
-    -webkit-border-radius: 4px;\r
-    padding-bottom: 2px;\r
-    margin-bottom: -2px;\r
-}\r
-\r
-.outline-disclosure li.selected.highlighted .highlight {\r
-    background-color: transparent;\r
-    padding-bottom: 0;\r
-    margin-bottom: 0;\r
-}\r
-\r
-.outline-disclosure li .selection {\r
-    display: none;\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    height: 15px;\r
-    z-index: -1;\r
-}\r
-\r
-.outline-disclosure li.selected .selection {\r
-    display: block;\r
-    background-color: rgb(212, 212, 212);\r
-}\r
-\r
-.outline-disclosure ol:focus li.selected .selection {\r
-    background-color: rgb(56, 121, 217);\r
-}\r
-\r
-.outline-disclosure {\r
-    font-size: 11px;\r
-}\r
-\r
-.outline-disclosure > ol {\r
-    position: relative;\r
-    padding: 2px 6px !important;\r
-    margin: 0;\r
-    color: black;\r
-    cursor: default;\r
-    min-width: 100%;\r
-}\r
-\r
-.outline-disclosure, .outline-disclosure ol {\r
-    list-style-type: none;\r
-    -webkit-padding-start: 12px;\r
-    margin: 0;\r
-}\r
-\r
-.source-code {\r
-    font-family: monospace;\r
-    font-size: 10px !important;\r
-    white-space: pre-wrap;\r
-}\r
-\r
-.outline-disclosure li {\r
-    padding: 0 0 0 14px;\r
-    margin-top: 1px;\r
-    margin-bottom: 1px;\r
-    word-wrap: break-word;\r
-    text-indent: -2px;\r
-}\r
-\r
-.resources .outline-disclosure li {\r
-    text-indent: -1px;\r
-}\r
-\r
-.outline-disclosure ol:focus li.selected {\r
-    color: white;\r
-}\r
-\r
-.outline-disclosure ol:focus li.selected * {\r
-    color: inherit;\r
-}\r
-\r
-.outline-disclosure li.parent {\r
-    text-indent: -12px\r
-}\r
-\r
-.outline-disclosure li .webkit-html-tag.close {\r
-    margin-left: -12px;\r
-}\r
-\r
-.outline-disclosure li.parent::before {\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-    float: left;\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-top: 1px;\r
-    padding-right: 2px;\r
-}\r
-\r
-.outline-disclosure li.parent::before {\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-}\r
-\r
-.outline-disclosure ol:focus li.parent.selected::before {\r
-    content: url(Images/treeRightTriangleWhite.png);\r
-}\r
-\r
-.outline-disclosure li.parent.expanded::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-}\r
-\r
-.outline-disclosure ol:focus li.parent.expanded.selected::before {\r
-    content: url(Images/treeDownTriangleWhite.png);\r
-}\r
-\r
-.outline-disclosure ol.children {\r
-    display: none;\r
-}\r
-\r
-.outline-disclosure ol.children.expanded {\r
-    display: block;\r
-}\r
-\r
-.add-attribute {\r
-    margin-left: 1px;\r
-    margin-right: 1px;\r
-    white-space: nowrap;\r
-}\r
-\r
-.placard {\r
-    position: relative;\r
-    margin-top: 1px;\r
-    padding: 3px 8px 4px 18px;\r
-    min-height: 18px;\r
-    white-space: nowrap;\r
-}\r
-\r
-.placard:nth-of-type(2n) {\r
-    background-color: rgb(234, 243, 255);\r
-}\r
-\r
-.placard.selected {\r
-    border-top: 1px solid rgb(145, 160, 192);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-:focus .placard.selected {\r
-    border-top: 1px solid rgb(68, 128, 200);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));\r
-}\r
-\r
-body.inactive .placard.selected {\r
-    border-top: 1px solid rgb(151, 151, 151);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));\r
-}\r
-\r
-.placard .title {\r
-    color: black;\r
-    font-weight: normal;\r
-    word-wrap: break-word;\r
-    white-space: normal;\r
-}\r
-\r
-.placard.selected .title {\r
-    color: white;\r
-    font-weight: bold;\r
-}\r
-\r
-.placard .subtitle {\r
-    float: right;\r
-    font-size: 10px;\r
-    margin-left: 5px;\r
-    max-width: 55%;\r
-    color: rgba(0, 0, 0, 0.7);\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-}\r
-\r
-.placard.selected .subtitle {\r
-    color: rgba(255, 255, 255, 0.7);\r
-}\r
-\r
-.placard .subtitle a {\r
-    color: inherit;\r
-}\r
-\r
-.section {\r
-    position: relative;\r
-    margin-top: 1px;\r
-}\r
-\r
-.watch-expressions-buttons-container {\r
-    text-align: center;\r
-}\r
-\r
-.events-pane .section:not(:nth-of-type(1)) {\r
-    border-top: 1px solid rgb(191, 191, 191);\r
-}\r
-\r
-.event-bar:first-child {\r
-    margin-top: 1px;\r
-}\r
-\r
-.section .header {\r
-    color: black;\r
-    padding: 0 8px 0 18px;\r
-    min-height: 18px;\r
-    white-space: nowrap;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-.section .header::before {\r
-    position: absolute;\r
-    top: 2px;\r
-    left: 7px;\r
-    width: 8px;\r
-    height: 8px;\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-    opacity: 0.8;\r
-}\r
-\r
-.section.expanded .header::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-}\r
-\r
-.section .header .title, .event-bar .header .title {\r
-    font-weight: normal;\r
-    word-wrap: break-word;\r
-    white-space: normal;\r
-    line-height: 18px;\r
-}\r
-\r
-.section .header .title.blank-title {\r
-    font-style: italic;\r
-}\r
-\r
-.section .header label, .event-bar .header label {\r
-    display: none;\r
-}\r
-\r
-.section.expanded .header label, .event-bar.expanded .header label {\r
-    display: inline;\r
-}\r
-\r
-.section .header .subtitle, .event-bar .header .subtitle {\r
-    float: right;\r
-    margin-left: 5px;\r
-    max-width: 55%;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-}\r
-\r
-.section .header .subtitle a {\r
-    color: inherit;\r
-}\r
-\r
-.section .properties, .event-bar .event-properties {\r
-    display: none;\r
-}\r
-\r
-.section.expanded .properties, .event-bar.expanded .event-properties {\r
-    display: block;\r
-    padding-left: 16px;\r
-}\r
-\r
-.section.no-affect .properties li {\r
-    opacity: 0.5;\r
-}\r
-\r
-.section.no-affect .properties li.editing {\r
-    opacity: 1.0;\r
-}\r
-\r
-.properties-tree {\r
-    margin: 0;\r
-    padding: 0 6px 2px;\r
-    list-style: none;\r
-    min-height: 18px;\r
-}\r
-\r
-.properties-tree li {\r
-    margin-left: 12px;\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    -webkit-user-select: text;\r
-    cursor: auto;\r
-}\r
-\r
-.properties-tree li.parent {\r
-    margin-left: 1px;\r
-}\r
-\r
-.properties-tree li.parent::before {\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-    opacity: 0.75;\r
-    float: left;\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-top: 0;\r
-    padding-right: 3px;\r
-    -webkit-user-select: none;\r
-    cursor: default;\r
-}\r
-\r
-.properties-tree li.parent.expanded::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-    margin-top: 1px;\r
-}\r
-\r
-.properties-tree li .info {\r
-    padding-top: 4px;\r
-    padding-bottom: 3px;\r
-}\r
-\r
-.properties-tree ol {\r
-    display: none;\r
-    margin: 0;\r
-    -webkit-padding-start: 12px;\r
-    list-style: none;\r
-}\r
-\r
-.properties-tree ol.expanded {\r
-    display: block;\r
-}\r
-\r
-.event-listener-breakpoints .event-category {\r
-    font-size: 11px;\r
-    font-weight: bold;\r
-    color: rgb(96, 96, 96);\r
-    padding-top: 2px;\r
-}\r
-\r
-.event-listener-breakpoints.properties-tree .children li {\r
-    margin-left: 12px;\r
-    height: 16px;\r
-}\r
-\r
-.event-listener-breakpoints .checkbox-elem {\r
-    font-size: 10px;\r
-    float: left;\r
-    top: -2px;\r
-    position: relative;\r
-    left: -1px;\r
-}\r
-\r
-.section .event-bars {\r
-    display: none;\r
-}\r
-\r
-.section.expanded .event-bars {\r
-    display: block;\r
-}\r
-\r
-.event-bar {\r
-    position: relative;\r
-    margin-left: 10px;\r
-}\r
-\r
-.event-bars .event-bar .header {\r
-    padding: 0 8px 0 18px;\r
-    min-height: 16px;\r
-    opacity: 1.0;\r
-    white-space: nowrap;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-.event-bars .event-bar .header .title {\r
-    font-weight: normal;\r
-    color: black;\r
-    text-shadow: white 0 1px 0; \r
-}\r
-\r
-.event-bars .event-bar .header .subtitle {\r
-    color: rgba(90, 90, 90, 0.75);\r
-}\r
-\r
-.event-bars .event-bar .header::before {\r
-    position: absolute;\r
-    top: 2px;\r
-    left: 7px;\r
-    width: 8px;\r
-    height: 8px;\r
-    opacity: 0.75;\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-}\r
-\r
-.event-bars .event-bar.expanded .header::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-}\r
-\r
-.editing {\r
-    -webkit-user-select: text;\r
-    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;\r
-    outline: 1px solid rgb(66%, 66%, 66%) !important;\r
-    background-color: white;\r
-    -webkit-user-modify: read-write-plaintext-only;\r
-    text-overflow: clip !important;\r
-    padding-left: 2px;\r
-    margin-left: -2px;\r
-    padding-right: 2px;\r
-    margin-right: -2px;\r
-    margin-bottom: -1px;\r
-    padding-bottom: 1px;\r
-    opacity: 1.0 !important;\r
-}\r
-\r
-.editing, .editing * {\r
-    color: black !important;\r
-    text-decoration: none !important;\r
-}\r
-\r
-.child-editing {\r
-    color: black !important;\r
-    text-decoration: none !important;\r
-    overflow: visible !important;\r
-}\r
-\r
-.editing br {\r
-    display: none;\r
-}\r
-\r
-.elements-tree-editor {\r
-    -webkit-user-select: text;\r
-    -webkit-user-modify: read-write-plaintext-only;\r
-}\r
-\r
-.section .properties li.editing {\r
-    margin-left: 10px;\r
-    text-overflow: clip;\r
-}\r
-\r
-li.editing .swatch, li.editing .enabled-button,  li.editing-sub-part .delete-button {\r
-    display: none !important;\r
-}\r
-\r
-.watch-expressions > li.editing-sub-part .name {\r
-    display: block; \r
-    width: 100%;\r
-}\r
-\r
-.watch-expressions > li.editing-sub-part .value, .watch-expressions > li.editing-sub-part .separator  {\r
-    display: none;\r
-}\r
-\r
-.watch-expressions-error-level {\r
-    color: red;\r
-}\r
-\r
-.section .properties li.editing-sub-part {\r
-    padding: 3px 6px 8px 18px;\r
-    margin: -3px -6px -8px -6px;\r
-    text-overflow: clip;\r
-}\r
-\r
-/* FIXME: need a better icon (comment in bug 27514) */\r
-.section .properties .delete-button {\r
-    width: 10px;\r
-    height: 10px;\r
-    background-image: url(Images/errorIcon.png);\r
-    background-position: 0 0;\r
-    background-color: transparent;\r
-    background-repeat: no-repeat;\r
-    border: 0 none transparent;\r
-}\r
-\r
-.section .properties .name, .event-properties .name {\r
-    color: rgb(136, 19, 145);\r
-}\r
-\r
-.section .properties .value.dimmed {\r
-    color: rgb(100, 100, 100);\r
-}\r
-\r
-.section .properties .value.error {\r
-    color: red;\r
-}\r
-\r
-.section .properties .number, .event-properties .number {\r
-    color: blue;\r
-}\r
-\r
-.section .properties .keyword, .event-properties .keyword {\r
-    color: rgb(136, 19, 79);\r
-}\r
-\r
-.section .properties .color, .event-properties .color {\r
-    color: rgb(118, 15, 21);\r
-}\r
-\r
-.swatch {\r
-    display: inline-block;\r
-    vertical-align: baseline;\r
-    margin-left: 1px;\r
-    margin-right: 2px;\r
-    margin-bottom: -1px;\r
-    width: 1em;\r
-    height: 1em;\r
-    border: 1px solid rgba(128, 128, 128, 0.6);\r
-}\r
-\r
-.swatch:hover {\r
-    border: 1px solid rgba(64, 64, 64, 0.8);\r
-}\r
-\r
-.pane:not(.expanded) + .pane, .pane:first-of-type {\r
-    margin-top: -1px;\r
-}\r
-\r
-.pane > .title {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), color-stop(0.05, rgb(243, 243, 243)), color-stop(0.05, rgb(230, 230, 230)), to(rgb(209, 209, 209)));\r
-    height: 20px;\r
-    padding: 0 5px;\r
-    border-top: 1px solid rgb(189, 189, 189);\r
-    border-bottom: 1px solid rgb(189, 189, 189);\r
-    font-weight: bold;\r
-    font-size: 12px;\r
-    line-height: 18px;\r
-    color: rgb(110, 110, 110);\r
-    text-shadow: white 0 1px 0;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-.pane > .title:active {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(231, 231, 231)), color-stop(0.05, rgb(231, 231, 231)), color-stop(0.05, rgb(207, 207, 207)), to(rgb(186, 186, 186)));\r
-    border-top: 1px solid rgb(178, 178, 178);\r
-    border-bottom: 1px solid rgb(178, 178, 178);\r
-}\r
-\r
-.pane > .title::before {\r
-    content: url(Images/disclosureTriangleSmallRightBlack.png);\r
-    float: left;\r
-    width: 11px;\r
-    height: 12px;\r
-    margin-right: 2px;\r
-    margin-top: 1px;\r
-}\r
-\r
-.pane.expanded > .title::before {\r
-    content: url(Images/disclosureTriangleSmallDownBlack.png);\r
-}\r
-\r
-.pane > .title > select {\r
-    float: right;\r
-    width: 23px;\r
-    height: 17px;\r
-    color: transparent;\r
-    background-color: transparent;\r
-    border: none;\r
-    background-image: url(Images/paneSettingsButtons.png);\r
-    background-repeat: no-repeat;\r
-    margin: 1px 0 0 0;\r
-    padding: 0;\r
-    -webkit-border-radius: 0;\r
-    -webkit-appearance: none;\r
-}\r
-\r
-.pane > .title > select:hover {\r
-    background-position: -23px 0px;\r
-}\r
-\r
-.pane > .title > select:active {\r
-    background-position: -46px 0px;\r
-}\r
-\r
-.pane > .title > select > option, .pane > .title > select > hr {\r
-    color: black;\r
-}\r
-\r
-.pane > .title > button.add {\r
-    float: right;\r
-    width: 23px;\r
-    height: 17px;\r
-    color: transparent;\r
-    background-color: transparent;\r
-    border: none;\r
-    background-image: url(Images/paneAddButtons.png);\r
-    background-repeat: no-repeat;\r
-    margin: 1px 0 0 0;\r
-    padding: 0;\r
-    -webkit-border-radius: 0;\r
-    -webkit-appearance: none;\r
-}\r
-\r
-.pane > .title > button.add:hover {\r
-    background-position: -23px 0px;\r
-}\r
-\r
-.pane > .title > button.add:active {\r
-    background-position: -46px 0px;\r
-}\r
-\r
-.pane > .body {\r
-    position: relative;\r
-    display: none;\r
-    overflow-y: auto;\r
-    overflow-x: hidden;\r
-}\r
-\r
-.pane > .body .info {\r
-    text-align: center;\r
-    font-style: italic;\r
-    font-size: 10px;\r
-    padding: 6px;\r
-    color: black;\r
-}\r
-\r
-.pane > .body .placard + .info {\r
-    border-top: 1px solid rgb(189, 189, 189);\r
-    background-color: rgb(255, 255, 194);\r
-}\r
-\r
-.pane.expanded > .body, .pane.expanded > .growbar {\r
-    display: block;\r
-}\r
-\r
-.pane > .body .breakpoint-condition {\r
-    display: block;\r
-    margin-top: 4px;\r
-    margin-bottom: 4px;\r
-    margin-left: 25px;\r
-    margin-right: 10px;\r
-}\r
-\r
-.pane.expanded:nth-last-of-type(1) {\r
-    border-bottom: 1px solid rgb(189, 189, 189);\r
-}\r
-\r
-.pane > .growbar {\r
-    display: none;\r
-    background-image: url(Images/paneGrowHandleLine.png), url(Images/paneBottomGrow.png);\r
-    background-repeat: no-repeat, repeat-x;\r
-    background-position: center center, bottom;\r
-    height: 5px;\r
-}\r
-\r
-.sidebar-pane-subtitle {\r
-    position: absolute;\r
-    right: 0;\r
-    font-weight: normal;\r
-}\r
-\r
-body.platform-windows .sidebar-pane-subtitle {\r
-    padding-top: 1px;\r
-}\r
-\r
-.sidebar-pane-subtitle input, .section .header input[type=checkbox] {\r
-    font-size: inherit;\r
-    hight: 1em;\r
-    width: 1em;\r
-    margin-left: 0;\r
-    margin-top: 0;\r
-    margin-bottom: 0.25em;\r
-    vertical-align: bottom;\r
-}\r
-\r
-.metrics {\r
-    padding: 8px;\r
-    font-size: 10px;\r
-    text-align: center;\r
-    white-space: nowrap;\r
-}\r
-\r
-.metrics .label {\r
-    position: absolute;\r
-    margin-top: -10px;\r
-    font-size: 9px;\r
-    color: grey;\r
-    background-color: white;\r
-    margin-left: 3px;\r
-    padding-left: 2px;\r
-    padding-right: 2px;\r
-}\r
-\r
-.metrics .position {\r
-    border: 1px rgb(66%, 66%, 66%) dotted;\r
-    display: inline-block;\r
-    text-align: center;\r
-    padding: 3px;\r
-    margin: 3px;\r
-}\r
-\r
-.metrics .margin {\r
-    border: 1px dashed;\r
-    display: inline-block;\r
-    text-align: center;\r
-    vertical-align: middle;\r
-    padding: 3px;\r
-    margin: 3px;\r
-}\r
-\r
-.metrics .border {\r
-    border: 1px black solid;\r
-    display: inline-block;\r
-    text-align: center;\r
-    vertical-align: middle;\r
-    padding: 3px;\r
-    margin: 3px;\r
-}\r
-\r
-.metrics .padding {\r
-    border: 1px grey dashed;\r
-    display: inline-block;\r
-    text-align: center;\r
-    vertical-align: middle;\r
-    padding: 3px;\r
-    margin: 3px;\r
-}\r
-\r
-.metrics .content {\r
-    position: static;\r
-    border: 1px grey solid;\r
-    display: inline-block;\r
-    text-align: center;\r
-    vertical-align: middle;\r
-    padding: 3px;\r
-    margin: 3px;\r
-    min-width: 80px;\r
-    text-align: center;\r
-    overflow: visible;\r
-}\r
-\r
-.metrics .content span {\r
-    display: inline-block;\r
-}\r
-\r
-.metrics .editing {\r
-    position: relative;\r
-    z-index: 100;\r
-}\r
-\r
-.metrics .left {\r
-    display: inline-block;\r
-    vertical-align: middle;\r
-}\r
-\r
-.metrics .right {\r
-    display: inline-block;\r
-    vertical-align: middle;\r
-}\r
-\r
-.metrics .top {\r
-    display: inline-block;\r
-}\r
-\r
-.metrics .bottom {\r
-    display: inline-block;\r
-}\r
-\r
-.sidebar {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    left: 0;\r
-    width: 200px;\r
-    overflow-y: auto;\r
-    overflow-x: hidden;\r
-    background-color: rgb(214, 221, 229);\r
-    border-right: 1px solid rgb(64%, 64%, 64%);\r
-}\r
-\r
-body.inactive .sidebar {\r
-    background-color: rgb(232, 232, 232);\r
-}\r
-\r
-.frame-storage-tree-item .icon {\r
-    content: url(Images/frame.png);\r
-}\r
-\r
-.database-storage-tree-item .icon {\r
-    content: url(Images/database.png);\r
-}\r
-\r
-.database-table-storage-tree-item .icon {\r
-    content: url(Images/databaseTable.png);\r
-}\r
-\r
-.domstorage-storage-tree-item.local-storage .icon {\r
-    content: url(Images/localStorage.png);\r
-}\r
-\r
-.domstorage-storage-tree-item.session-storage .icon {\r
-    content: url(Images/sessionStorage.png);\r
-}\r
-\r
-.cookie-storage-tree-item .icon {\r
-    content: url(Images/cookie.png);\r
-}\r
-\r
-.application-cache-storage-tree-item .icon {\r
-    content: url(Images/applicationCache.png);\r
-}\r
-\r
-/* FIXME: Make separate png for file-system */\r
-.file-system-storage-tree-item .icon {\r
-    content: url(Images/applicationCache.png);\r
-}\r
-\r
-#storage-views {\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    left: 200px;\r
-    bottom: 0;\r
-}\r
-\r
-.resources.panel .sidebar {\r
-    padding-left: 0;\r
-    z-index: 10;\r
-}\r
-\r
-.resources.panel .sidebar li {\r
-    height: 17px;\r
-    white-space: nowrap;\r
-    text-indent: 0;\r
-    margin-left: -2px;\r
-}\r
-\r
-.resources.panel .sidebar li.parent {\r
-    text-indent: 0;\r
-    margin-left: -12px;\r
-}\r
-\r
-.resources.panel .sidebar li.selected {\r
-    color: white;\r
-    text-shadow: rgba(0, 0, 0, 0.33) 0 1px 0;\r
-    font-weight: bold;\r
-}\r
-\r
-.resources.panel .sidebar li.selected .selection {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));\r
-    border-top: 1px solid #979797;\r
-    height: 17px;\r
-}\r
-\r
-.resources.panel .sidebar :focus li.selected .selection {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));\r
-    border-top: 1px solid rgb(68, 128, 200);\r
-}\r
-\r
-body.inactive .resources.panel .sidebar li.selected .selection {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));\r
-    border-top: 1px solid rgb(151, 151, 151);\r
-}\r
-\r
-.resources.panel .sidebar .icon {\r
-    width: 16px;\r
-    height: 16px;\r
-    float: left;\r
-}\r
-\r
-.resources.panel .base-storage-tree-element-title {\r
-    overflow: hidden;\r
-    position: relative;\r
-    text-overflow: ellipsis;\r
-    padding-left: 2px;\r
-    top: 1px;\r
-}\r
-\r
-li.selected .base-storage-tree-element-subtitle {\r
-    color: white;\r
-}\r
-\r
-.base-storage-tree-element-subtitle {\r
-    padding-left: 2px;\r
-    color: rgb(80, 80, 80);\r
-    text-shadow: none;\r
-}\r
-\r
-.resources.panel .status {\r
-    float: right;\r
-    height: 16px;\r
-    margin-top: 1px;\r
-    margin-left: 4px;\r
-    line-height: 1em;\r
-}\r
-\r
-.resources.panel li .status .bubble {\r
-    height: 13px;\r
-    padding-top: 0;\r
-}\r
-\r
-.storage-view {\r
-    display: none;\r
-    overflow: hidden;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-}\r
-\r
-.storage-view.visible {\r
-    display: block;\r
-}\r
-\r
-.storage-view {\r
-    overflow: hidden;\r
-}\r
-\r
-.storage-view .data-grid {\r
-    border: none;\r
-    height: 100%;\r
-}\r
-\r
-.storage-empty-view, .storage-view .storage-table-error {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 25%;\r
-    left: 0;\r
-    right: 0;\r
-    font-size: 24px;\r
-    color: rgb(75%, 75%, 75%);\r
-    margin-top: auto;\r
-    margin-bottom: auto;\r
-    height: 50px;\r
-    line-height: 26px;\r
-    text-align: center;\r
-    font-weight: bold;\r
-    padding: 10px;\r
-    white-space: pre-wrap;\r
-}\r
-\r
-.storage-view .storage-table-error {\r
-    color: rgb(66%, 33%, 33%);\r
-}\r
-\r
-.data-grid {\r
-    position: relative;\r
-    border: 1px solid #aaa;\r
-}\r
-\r
-.data-grid .highlight {\r
-    background-color: rgb(255, 230, 179);\r
-}\r
-\r
-.data-grid tr.selected .highlight {\r
-    background-color: transparent;\r
-}\r
-\r
-.data-grid table {\r
-    table-layout: fixed;\r
-    border-spacing: 0;\r
-    border-collapse: collapse;\r
-    width: 100%;\r
-    font-size: 10px;\r
-    font-family: Lucida Grande, sans-serif;\r
-}\r
-\r
-.data-grid .data-container {\r
-    position: absolute;\r
-    top: 16px;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    padding-right: 14px;\r
-    overflow-x: hidden;\r
-    overflow-y: overlay;\r
-}\r
-\r
-.data-grid.inline .data-container {\r
-    position: static;\r
-}\r
-\r
-.data-grid th {\r
-    text-align: left;\r
-    background-image: url(Images/glossyHeader.png);\r
-    background-repeat: repeat-x;\r
-    border-right: 1px solid rgb(179, 179, 179);\r
-    border-bottom: 1px solid rgb(179, 179, 179);\r
-    height: 15px;\r
-    font-weight: normal;\r
-    vertical-align: middle;\r
-    padding: 0 4px;\r
-    white-space: nowrap;\r
-}\r
-\r
-.data-grid th.corner {\r
-    width: 15px;\r
-    border-right: 0 none transparent;\r
-}\r
-\r
-.data-grid tr.filler {\r
-    display: table-row !important;\r
-    height: auto !important;\r
-}\r
-\r
-.data-grid tr.filler td {\r
-    height: auto !important;\r
-    padding: 0 !important;\r
-}\r
-\r
-.data-grid table.data {\r
-    position: absolute;\r
-    left: 0;\r
-    top: 0;\r
-    right: 16px;\r
-    bottom: 0;\r
-    height: 100%;\r
-    border-top: 0 none transparent;\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(0.5, white), color-stop(0.5, rgb(234, 243, 255)), to(rgb(234, 243, 255)));\r
-    -webkit-background-size: 1px 32px;\r
-}\r
-\r
-.data-grid.inline table.data {\r
-    position: static;\r
-}\r
-\r
-.data-grid table.data tr {\r
-    display: none;\r
-}\r
-\r
-.data-grid table.data tr.revealed {\r
-    display: table-row;\r
-}\r
-\r
-.data-grid td {\r
-    vertical-align: top;\r
-    height: 12px;\r
-    line-height: 12px;\r
-    padding: 2px 4px;\r
-    white-space: nowrap;\r
-    border-right: 1px solid #aaa;\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.data-grid td > div, .data-grid th > div {\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-}\r
-\r
-.data-grid .centered div {\r
-    text-align: center;\r
-}\r
-\r
-.data-grid .right div {\r
-    text-align: right;\r
-}\r
-\r
-.data-grid th.sortable div {\r
-    position: relative;\r
-}\r
-\r
-.data-grid th.sortable:active {\r
-    background-image: url(Images/glossyHeaderPressed.png);\r
-}\r
-\r
-.data-grid th.sort-ascending, .data-grid th.sort-descending {\r
-    border-right: 1px solid rgb(107, 140, 196);\r
-    border-bottom: 1px solid rgb(107, 140, 196);\r
-    background-image: url(Images/glossyHeaderSelected.png);\r
-    background-repeat: repeat-x;\r
-}\r
-\r
-.data-grid th.sortable.sort-ascending:active, .data-grid th.sortable.sort-descending:active {\r
-    background-image: url(Images/glossyHeaderSelectedPressed.png);\r
-}\r
-\r
-.data-grid th.sort-ascending > div::after {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    right: 0;\r
-    height: 12px;\r
-    margin-bottom: auto;\r
-    margin-top: auto;\r
-    width: 8px;\r
-    content: url(Images/treeUpTriangleBlack.png);\r
-}\r
-\r
-.data-grid th.sort-descending > div::after {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    right: 0;\r
-    height: 8px;\r
-    margin-bottom: auto;\r
-    margin-top: auto;\r
-    width: 8px;\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-}\r
-\r
-body.inactive .data-grid th.sort-ascending, body.inactive .data-grid th.sort-descending {\r
-    background-image: url(Images/glossyHeader.png);\r
-    border-right: 1px solid rgb(179, 179, 179);\r
-    border-bottom: 1px solid rgb(179, 179, 179);\r
-}\r
-\r
-.data-grid tr.parent td.disclosure::before {\r
-    float: left;\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-right: 2px;\r
-    -webkit-user-select: none;\r
-}\r
-\r
-.data-grid tr.expanded td.disclosure::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-top: 1px;\r
-}\r
-\r
-.data-grid tr.selected {\r
-    background-color: rgb(212, 212, 212);\r
-    color: inherit;\r
-}\r
-\r
-.data-grid:focus tr.selected {\r
-    background-color: rgb(56, 121, 217);\r
-    color: white;\r
-}\r
-\r
-.data-grid:focus tr.parent.selected td.disclosure::before {\r
-    content: url(Images/treeRightTriangleWhite.png);\r
-}\r
-\r
-.data-grid:focus tr.expanded.selected td.disclosure::before {\r
-    content: url(Images/treeDownTriangleWhite.png);\r
-}\r
-\r
-.data-grid tr:not(.parent) td.disclosure {\r
-    text-indent: 10px;\r
-}\r
-\r
-.data-grid-resizer {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    width: 5px;\r
-    z-index: 500;\r
-    cursor: col-resize;\r
-}\r
-\r
-.storage-view.query {\r
-    padding: 2px 0;\r
-    overflow-y: overlay;\r
-    overflow-x: hidden;\r
-    -webkit-text-size-adjust: auto;\r
-}\r
-\r
-.database-query-prompt {\r
-    position: relative;\r
-    padding: 1px 22px 1px 24px;\r
-    min-height: 16px; \r
-    white-space: pre-wrap;\r
-    -webkit-user-modify: read-write-plaintext-only;\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.database-user-query::before, .database-query-prompt::before, .database-query-result::before {\r
-    position: absolute;\r
-    display: block;\r
-    content: "";\r
-    left: 7px;\r
-    top: 0.8em;\r
-    width: 10px;\r
-    height: 10px;\r
-    margin-top: -5px;\r
-    -webkit-user-select: none;\r
-}\r
-\r
-.database-query-prompt::before {\r
-    background-image: url(Images/userInputIcon.png);\r
-}\r
-\r
-.database-user-query {\r
-    position: relative;\r
-    border-bottom: 1px solid rgb(245, 245, 245);\r
-    padding: 1px 22px 1px 24px;\r
-    min-height: 16px; \r
-}\r
-\r
-.database-user-query::before {\r
-    background-image: url(Images/userInputPreviousIcon.png);\r
-}\r
-\r
-.database-query-text {\r
-    color: rgb(0, 128, 255);\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.database-query-result {\r
-    position: relative;\r
-    padding: 1px 22px 1px 24px;\r
-    min-height: 16px;\r
-    margin-left: -24px;\r
-    padding-right: 0;\r
-}\r
-\r
-.database-query-result.error {\r
-    color: red;\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.database-query-result.error::before {\r
-    background-image: url(Images/errorIcon.png);\r
-}\r
-\r
-.panel-enabler-view {\r
-    z-index: 1000;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    background-color: white;\r
-    font-size: 13px;\r
-    text-align: center;\r
-    overflow-x: hidden;\r
-    overflow-y: overlay;\r
-    display: none;\r
-}\r
-\r
-.panel-enabler-view.visible {\r
-    display: block;\r
-}\r
-\r
-.panel-enabler-view .panel-enabler-view-content {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    max-height: 390px;\r
-    margin: auto;\r
-    white-space: nowrap;\r
-}\r
-\r
-.panel-enabler-view h1 {\r
-    color: rgb(110, 116, 128);\r
-    font-size: 16px;\r
-    line-height: 20px;\r
-    font-weight: normal;\r
-    margin-top: 0;\r
-}\r
-\r
-.panel-enabler-disclaimer {\r
-    font-size: 10px;\r
-    color: rgb(110, 116, 128);\r
-    margin-bottom: 12px;\r
-    margin-left: 20px;\r
-}\r
-\r
-.panel-enabler-disclaimer:empty {\r
-    display: none;\r
-}\r
-\r
-.panel-enabler-view img, div.welcome-instructions-aligner {\r
-    height: 100%;\r
-    min-height: 200px;\r
-    max-width: 100%;\r
-    top: 0;\r
-    bottom: 0;\r
-    padding: 20px 0 20px 20px;\r
-    margin: auto;\r
-    vertical-align: middle;\r
-}\r
-\r
-.panel-enabler-view img.hidden {\r
-    display: initial !important;\r
-    width: 0;\r
-}\r
-\r
-.panel-enabler-view form {\r
-    display: inline-block;\r
-    vertical-align: middle;\r
-    width: 330px;\r
-    margin: 0;\r
-    padding: 15px;\r
-    white-space: normal;\r
-}\r
-\r
-.panel-enabler-view label {\r
-    position: relative;\r
-    display: block;\r
-    text-align: left;\r
-    word-break: break-word;\r
-    margin: 0 0 5px 20px;\r
-}\r
-\r
-.panel-enabler-view button:not(.status-bar-item), .pane button, button.show-all-nodes {\r
-    color: rgb(6, 6, 6);\r
-    background-color: transparent;\r
-    border: 1px solid rgb(165, 165, 165);\r
-    background-color: rgb(237, 237, 237);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));\r
-    -webkit-border-radius: 12px;\r
-    -webkit-appearance: none;\r
-}\r
-\r
-.panel-enabler-view button:not(.status-bar-item) {\r
-    font-size: 13px;\r
-    margin: 6px 0 0 0;\r
-    padding: 3px 20px;\r
-    height: 24px;\r
-}\r
-\r
-button.show-all-nodes {\r
-    font-size: 13px;\r
-    margin: 0;\r
-    padding: 0 20px;\r
-    height: 20px;\r
-}\r
-\r
-.panel-enabler-view.welcome {\r
-    z-index: auto;\r
-}\r
-\r
-.panel-enabler-view.welcome div.welcome-instructions-aligner {\r
-    display: inline-block;\r
-    width: 0;\r
-}\r
-\r
-.panel-enabler-view.welcome .instructions {\r
-    display: inline-block;\r
-    vertical-align: middle;\r
-    margin: 0;\r
-    white-space: normal;\r
-    line-height: 175%;\r
-}\r
-\r
-.panel-enabler-view.welcome .message {\r
-    margin-bottom: 2ex;\r
-}\r
-\r
-.panel-enabler-view.welcome button.status-bar-item {\r
-    background-image: none;\r
-    vertical-align: top;\r
-}\r
-\r
-.pane button {\r
-    margin: 6px 0 6px 3px;\r
-    padding: 2px 9px;\r
-}\r
-\r
-.panel-enabler-view button:active:not(.status-bar-item), .pane button:active, button.show-all-nodes:active {\r
-    background-color: rgb(215, 215, 215);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));\r
-}\r
-\r
-body.inactive .panel-enabler-view button:not(.status-bar-item), .panel-enabler-view button:disabled:not(.status-bar-item), body.inactive .pane button, .pane button:disabled, body.inactive button.show-all-nodes {\r
-    color: rgb(130, 130, 130);\r
-    border-color: rgb(212, 212, 212);\r
-    background-color: rgb(239, 239, 239);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(250, 250, 250)), to(rgb(235, 235, 235)));\r
-}\r
-\r
-.panel-enabler-view input {\r
-    height: 17px;\r
-    width: 17px;\r
-    border: 1px solid rgb(165, 165, 165);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));\r
-    -webkit-border-radius: 8px;\r
-    -webkit-appearance: none;\r
-    vertical-align: middle;\r
-    margin: 0 5px 5px 0;\r
-}\r
-\r
-.panel-enabler-view input:active {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(194, 194, 194)), to(rgb(239, 239, 239)));\r
-}\r
-\r
-.panel-enabler-view input:checked {\r
-    background: url(Images/radioDot.png) center no-repeat,\r
-                -webkit-gradient(linear, left top, left bottom, from(rgb(252, 252, 252)), to(rgb(223, 223, 223)));\r
-}\r
-\r
-.panel-enabler-view.scripts img {\r
-    content: url(Images/scriptsSilhouette.png);\r
-}\r
-\r
-.panel-enabler-view.profiles img {\r
-    content: url(Images/profilesSilhouette.png);\r
-}\r
-\r
-button.enable-toggle-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/enableOutlineButtonGlyph.png);\r
-}\r
-\r
-button.enable-toggle-status-bar-item.toggled-on .glyph {\r
-    -webkit-mask-image: url(Images/enableSolidButtonGlyph.png);\r
-}\r
-\r
-.scripts-pause-on-exceptions-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/pauseOnExceptionButtonGlyph.png);\r
-}\r
-\r
-#scripts-status-bar {\r
-    position: absolute;\r
-    top: -1px;\r
-    left: 0;\r
-    right: 0;\r
-    height: 24px;\r
-}\r
-\r
-#scripts-files {\r
-    max-width: 250px;\r
-}\r
-\r
-#scripts-files option.extension-script {\r
-    color: rgb(70, 134, 240);\r
-}\r
-\r
-#scripts-functions {\r
-    max-width: 150px;\r
-}\r
-\r
-#scripts-status-bar .status-bar-item img {\r
-    margin-top: 2px;\r
-}\r
-\r
-#scripts-back img {\r
-    content: url(Images/back.png);\r
-}\r
-\r
-#scripts-forward img {\r
-    content: url(Images/forward.png);\r
-}\r
-\r
-#scripts-pause img {\r
-    content: url(Images/debuggerPause.png);\r
-}\r
-\r
-#scripts-pause.paused img {\r
-    content: url(Images/debuggerContinue.png);\r
-}\r
-\r
-#scripts-step-over img {\r
-    content: url(Images/debuggerStepOver.png);\r
-}\r
-\r
-#scripts-step-into img {\r
-    content: url(Images/debuggerStepInto.png);\r
-}\r
-\r
-#scripts-step-out img {\r
-    content: url(Images/debuggerStepOut.png);\r
-}\r
-\r
-.toggle-breakpoints .glyph {\r
-    -webkit-mask-image: url(Images/breakpointsActivateButtonGlyph.png);\r
-    background-color: rgb(96, 96, 96) !important;\r
-}\r
-\r
-.toggle-breakpoints.toggled-on .glyph {\r
-    -webkit-mask-image: url(Images/breakpointsDeactivateButtonGlyph.png);\r
-}\r
-\r
-#scripts-debugger-status {\r
-    position: absolute;\r
-    line-height: 24px;\r
-    top: 0;\r
-    right: 8px;\r
-}\r
-\r
-#scripts-sidebar-resizer-widget {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    right: 225px;\r
-    width: 16px;\r
-    cursor: col-resize;\r
-    background-image: url(Images/statusbarResizerHorizontal.png);\r
-    background-repeat: no-repeat;\r
-    background-position: center;\r
-}\r
-\r
-#scripts-sidebar-buttons {\r
-    position: absolute;\r
-    right: 0;\r
-    top: 0;\r
-    bottom: 0;\r
-    width: 225px;\r
-    overflow: hidden;\r
-    border-left: 1px solid rgb(64%, 64%, 64%);\r
-}\r
-\r
-#script-resource-views {\r
-    display: block;\r
-    padding: 0;\r
-    position: absolute;\r
-    top: 23px;\r
-    left: 0;\r
-    right: 225px;\r
-    bottom: 0;\r
-}\r
-\r
-.script-view {\r
-    display: none;\r
-    overflow: hidden;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-}\r
-\r
-.script-view.visible {\r
-    display: block;\r
-}\r
-\r
-#scripts-sidebar {\r
-    position: absolute;\r
-    top: 23px;\r
-    right: 0;\r
-    bottom: 0;\r
-    width: 225px;\r
-    border-left: 1px solid rgb(64%, 64%, 64%);\r
-    cursor: default;\r
-    overflow: auto;\r
-}\r
-\r
-.resources-larger-resources-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/largerResourcesButtonGlyph.png);\r
-}\r
-\r
-#resources-filter, #console-filter.console-filter-top {\r
-    background: -webkit-gradient(linear, left top, left bottom, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));\r
-    border-bottom: 1px solid rgb(64%, 64%, 64%);\r
-    width: 100%;\r
-}\r
-\r
-#console-messages.console-filter-top {\r
-    margin-top: 23px;\r
-}\r
-\r
-#console-filter {\r
-    margin-top: 1px;\r
-}\r
-\r
-.tabbed-pane {\r
-    -webkit-box-orient: vertical;\r
-    height: 100%;\r
-}\r
-\r
-.tabbed-pane-content {\r
-    -webkit-box-flex: 1;\r
-    position: relative;\r
-}\r
-\r
-.tabbed-pane-header {\r
-    height: 23px;\r
-    padding: 0 10px;\r
-    border-bottom: 1px solid rgb(163, 163, 163);\r
-}\r
-\r
-.tabbed-pane-header li {\r
-    display: inline-block;\r
-    margin-top: 2px;\r
-    font-size: 11px;\r
-    font-weight: bold;\r
-    color: rgb(46, 46, 46);\r
-    background: transparent;\r
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;\r
-    vertical-align: middle;\r
-    padding: 3px 7px 2px;\r
-    height: 21px;\r
-    border: 1px solid transparent;\r
-    border-bottom: none;\r
-}\r
-\r
-.tabbed-pane-header li.selected {\r
-    background-color: white;\r
-    border: 1px solid rgb(163, 163, 163);\r
-    border-bottom: none;\r
-}\r
-\r
-.scope-bar {\r
-    height: 23px;\r
-    padding: 2px 10px 0;\r
-    overflow: hidden;\r
-}\r
-\r
-.scope-bar li {\r
-    display: inline-block;\r
-    margin: 1px 2px 0 0;\r
-    padding: 1px 7px 3px;\r
-    font-size: 11px;\r
-    line-height: 12px;\r
-    font-weight: bold;\r
-    color: rgb(46, 46, 46);\r
-    background: transparent;\r
-    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;\r
-    -webkit-border-radius: 8px;\r
-    vertical-align: middle;\r
-}\r
-\r
-.scope-bar-divider {\r
-    margin: 1px 9px 0 8px;\r
-    background-color: rgba(0, 0, 0, 0.4);\r
-    height: 16px;\r
-    width: 1px;\r
-    vertical-align: middle;\r
-    display: inline-block;\r
-}\r
-\r
-.scope-bar li.selected, .scope-bar li:hover, .scope-bar li:active {\r
-    color: white;\r
-    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;\r
-}\r
-\r
-.scope-bar li:hover {\r
-    background: rgba(0, 0, 0, 0.2);\r
-}\r
-\r
-.scope-bar li.selected {\r
-    background: rgba(0, 0, 0, 0.3);\r
-    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);\r
-}\r
-\r
-.scope-bar li:active {\r
-    background: rgba(0, 0, 0, 0.5);\r
-    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset, 0 -1px 1px rgba(255, 255, 255, 0.25) inset, 0 1px 0 rgba(255, 255, 255, 0.5);\r
-}\r
-\r
-#resources-container {\r
-    position: absolute;\r
-    top: 23px;\r
-    left: 0;\r
-    bottom: 0;\r
-    right: 0;\r
-    border-right: 0 none transparent;\r
-    overflow-y: auto;\r
-    overflow-x: hidden;\r
-}\r
-\r
-#resources-container.viewing-resource {\r
-    right: auto;\r
-    width: 200px;\r
-    border-right: 1px solid rgb(64%, 64%, 64%);\r
-}\r
-\r
-#resources-container.viewing-resource #resources-sidebar {\r
-    width: 100%;\r
-    border-right: 0 none transparent;\r
-}\r
-\r
-#resources-sidebar {\r
-    min-height: 100%;\r
-    bottom: auto;\r
-    overflow: visible;\r
-}\r
-\r
-#resources-container-content {\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    left: 200px;\r
-    min-height: 100%;\r
-}\r
-\r
-#resources-container.viewing-resource #resources-container-content {\r
-    display: none;\r
-}\r
-\r
-#resources-summary {\r
-    position: absolute;\r
-    padding-top: 20px;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    height: 93px;\r
-    margin-left: -1px;\r
-    border-left: 1px solid rgb(102, 102, 102);\r
-    background-color: rgb(101, 111, 130);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.5)));\r
-    background-repeat: repeat-x;\r
-    background-position: bottom;\r
-    text-align: center;\r
-    text-shadow: black 0 1px 1px;\r
-    white-space: nowrap;\r
-    color: white;\r
-    -webkit-background-size: 1px 6px;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-    z-index: 400;\r
-}\r
-\r
-.summary-graph-legend {\r
-    margin-top: -10px;\r
-    padding-left: 15px;\r
-}\r
-\r
-.summary-graph-legend-item {\r
-    display: inline-block;\r
-    font-weight: bold;\r
-    margin-right: 15px;\r
-    vertical-align: top;\r
-}\r
-\r
-.summary-graph-legend-item.total {\r
-    margin-left: 10px;\r
-}\r
-\r
-.summary-graph-legend-label {\r
-    display: inline-block;\r
-    text-align: left;\r
-}\r
-\r
-.summary-graph-legend-header {\r
-    font-size: 12px;\r
-}\r
-\r
-.summary-graph-legend-value {\r
-    font-size: 10px;\r
-}\r
-\r
-.summary-graph-legend-swatch {\r
-    vertical-align: top;\r
-    margin-top: 1px;\r
-    margin-right: 3px;\r
-}\r
-\r
-.resources-dividers {\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    height: 100%;\r
-    top: 0;\r
-    z-index: -100;\r
-}\r
-\r
-.resources-event-dividers {\r
-    position: absolute;\r
-    left: 0;\r
-    right: 5px;\r
-    height: 100%;\r
-    top: 0;\r
-    z-index: 300;\r
-    pointer-events: none;\r
-}\r
-\r
-.timeline .resources-event-dividers {\r
-    height: 19px;\r
-}\r
-\r
-.resources-dividers-label-bar {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0px;\r
-    right: 0;\r
-    background-color: rgba(255, 255, 255, 0.8);\r
-    background-clip: padding;\r
-    border-bottom: 1px solid rgba(0, 0, 0, 0.3);\r
-    height: 20px;\r
-    z-index: 200;\r
-}\r
-\r
-.resources-divider {\r
-    position: absolute;\r
-    width: 1px;\r
-    top: 0;\r
-    bottom: 0;\r
-    background-color: rgba(0, 0, 0, 0.1);\r
-}\r
-\r
-.resources-event-divider-padding {\r
-    position: absolute;\r
-    width: 8px;\r
-    top: 0;\r
-    bottom: 0;\r
-    pointer-events: auto;\r
-}\r
-\r
-.resources-event-divider {\r
-    position: absolute;\r
-    width: 2px;\r
-    top: 0;\r
-    bottom: 0;\r
-    z-index: 300;\r
-}\r
-\r
-.resources-red-divider {\r
-    background-color: rgba(255, 0, 0, 0.5);\r
-}\r
-\r
-.resources-blue-divider {\r
-    background-color: rgba(0, 0, 255, 0.5);\r
-}\r
-\r
-.resources-orange-divider {\r
-    background-color: rgba(255, 178, 23, 0.5);\r
-}\r
-\r
-.resources-divider.last {\r
-    background-color: transparent;\r
-}\r
-\r
-.resources-divider-label {\r
-    position: absolute;\r
-    top: 4px;\r
-    right: 3px;\r
-    font-size: 9px;\r
-    color: rgb(50%, 50%, 50%);\r
-    white-space: nowrap;\r
-}\r
-\r
-.memory-graph-label {\r
-    position: absolute;\r
-    top: 5px;\r
-    left: 5px;\r
-    font-size: 9px;\r
-    color: rgb(50%, 50%, 50%);\r
-    white-space: nowrap;\r
-}\r
-\r
-.resources-graph-label {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    margin: auto -7px;\r
-    height: 13px;\r
-    line-height: 13px;\r
-    font-size: 9px;\r
-    color: rgba(0, 0, 0, 0.75);\r
-    text-shadow: rgba(255, 255, 255, 0.25) 1px 0 0, rgba(255, 255, 255, 0.25) -1px 0 0, rgba(255, 255, 255, 0.333) 0 1px 0, rgba(255, 255, 255, 0.25) 0 -1px 0;\r
-    z-index: 150;\r
-    overflow: hidden;\r
-    text-align: center;\r
-    font-weight: bold;\r
-    opacity: 0;\r
-    -webkit-transition: opacity 250ms ease-in-out;\r
-}\r
-\r
-.resources-graph-side:hover .resources-graph-label {\r
-    opacity: 1;\r
-}\r
-\r
-.resources-graph-label:empty {\r
-    display: none;\r
-}\r
-\r
-.resources-graph-label.waiting {\r
-    margin-right: 5px;\r
-}\r
-\r
-.resources-graph-label.waiting-right {\r
-    margin-left: 5px;\r
-}\r
-\r
-.resources-graph-label.before {\r
-    color: rgba(0, 0, 0, 0.7);\r
-    text-shadow: none;\r
-    text-align: right;\r
-    margin-right: 2px;\r
-}\r
-\r
-.resources-graph-label.before::after {\r
-    padding-left: 2px;\r
-    height: 6px;\r
-    content: url(Images/graphLabelCalloutLeft.png);\r
-}\r
-\r
-.resources-graph-label.after {\r
-    color: rgba(0, 0, 0, 0.7);\r
-    text-shadow: none;\r
-    text-align: left;\r
-    margin-left: 2px;\r
-}\r
-\r
-.resources-graph-label.after::before {\r
-    padding-right: 2px;\r
-    height: 6px;\r
-    content: url(Images/graphLabelCalloutRight.png);\r
-}\r
-\r
-.resources-graph-bar {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    margin: auto -7px;\r
-    border-width: 6px 7px;\r
-    height: 13px;\r
-    min-width: 14px;\r
-    opacity: 0.65;\r
-    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-documents, .resources-category-stylesheets, .resources-category-images,\r
-.resources-category-scripts, .resources-category-xhr, .resources-category-fonts,\r
-.resources-category-websockets, .resources-category-other {\r
-    display: none;\r
-}\r
-\r
-.filter-all .resources-category-documents, .filter-documents .resources-category-documents,\r
-.filter-all .resources-category-stylesheets, .filter-stylesheets .resources-category-stylesheets,\r
-.filter-all .resources-category-images, .filter-images .resources-category-images,\r
-.filter-all .resources-category-scripts, .filter-scripts .resources-category-scripts,\r
-.filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr,\r
-.filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts,\r
-.filter-all .resources-category-websockets, .filter-websockets .resources-category-websockets,\r
-.filter-all .resources-category-other, .filter-other .resources-category-other,\r
-.resource-sidebar-tree-item.selected {\r
-    display: list-item;\r
-}\r
-\r
-.console-warning-level, .console-error-level, .console-log-level {\r
-    display: none;\r
-}\r
-\r
-.filter-all .console-warning-level, .filter-warnings .console-warning-level,\r
-.filter-all .console-error-level, .filter-errors .console-error-level,\r
-.filter-all .console-log-level, .filter-logs .console-log-level {\r
-    display: block;\r
-}\r
-\r
-.console-user-command-result {\r
-    display: block;\r
-}\r
-\r
-.resources-graph-bar.waiting, .resources-graph-bar.waiting-right {\r
-    opacity: 0.35;\r
-}\r
-\r
-.resource-cached .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-documents .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillBlue.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-documents.resource-cached .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillBlue.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-stylesheets .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillGreen.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-stylesheets.resource-cached .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillGreen.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-images .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillPurple.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-images.resource-cached .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillPurple.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-fonts .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillRed.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-fonts.resource-cached .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillRed.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-scripts .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillOrange.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-scripts.resource-cached .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillOrange.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-xhr .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillYellow.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-xhr.resource-cached .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7;\r
-}\r
-\r
-/* FIXME: Create bar images for WebSocket. */\r
-.resources-category-websockets .resources-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;\r
-}\r
-\r
-.resources-category-websockets.resource-cached .resources-graph-bar {\r
-   -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;\r
-}\r
-\r
-#resource-views {\r
-    position: absolute;\r
-    top: 23px;\r
-    right: 0;\r
-    left: 200px;\r
-    bottom: 0;\r
-}\r
-\r
-.source-view-frame {\r
-    width: 100%;\r
-    height: 100%;\r
-}\r
-\r
-.sidebar-resizer-vertical {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    width: 5px;\r
-    z-index: 500;\r
-    cursor: col-resize;\r
-}\r
-\r
-.resources .sidebar-resizer-vertical {\r
-    top: 23px;\r
-}\r
-\r
-.sidebar-tree, .sidebar-tree .children {\r
-    position: relative;\r
-    padding: 0;\r
-    margin: 0;\r
-    list-style: none;\r
-    font-size: 11px;\r
-}\r
-\r
-.sidebar-tree-section {\r
-    position: relative;\r
-    height: 18px;\r
-    padding: 4px 10px 6px 10px;\r
-    white-space: nowrap;\r
-    margin-top: 1px;\r
-    color: rgb(92, 110, 129);\r
-    font-weight: bold;\r
-    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;\r
-}\r
-\r
-.sidebar-tree-item {\r
-    position: relative;\r
-    height: 36px;\r
-    padding: 0 5px 0 5px;\r
-    white-space: nowrap;\r
-    margin-top: 1px;\r
-    line-height: 34px;\r
-    border-top: 1px solid transparent;\r
-}\r
-\r
-.sidebar-tree .children {\r
-    display: none;\r
-}\r
-\r
-.sidebar-tree .children.expanded {\r
-    display: block;\r
-}\r
-\r
-.sidebar-tree-section + .children > .sidebar-tree-item {\r
-    padding-left: 10px !important;\r
-}\r
-\r
-.sidebar-tree-section + .children.small > .sidebar-tree-item {\r
-    padding-left: 17px !important;\r
-}\r
-\r
-.sidebar-tree > .children > .sidebar-tree-item {\r
-    padding-left: 37px;\r
-}\r
-\r
-.sidebar-tree > .children > .children > .sidebar-tree-item {\r
-    padding-left: 37px;\r
-}\r
-\r
-.sidebar-tree.hide-disclosure-buttons > .children {\r
-    display: none;\r
-}\r
-\r
-.sidebar-tree > .children.hide-disclosure-buttons > .children {\r
-    display: none;\r
-}\r
-\r
-.sidebar-tree.some-expandable:not(.hide-disclosure-buttons) > .sidebar-tree-item:not(.parent) .icon {\r
-    margin-left: 16px;\r
-}\r
-\r
-.sidebar-tree-item .disclosure-button {\r
-    float: left;\r
-    width: 16px;\r
-    height: 100%;\r
-    border: 0;\r
-    background-color: transparent;\r
-    background-image: url(Images/disclosureTriangleSmallRight.png);\r
-    background-repeat: no-repeat;\r
-    background-position: center;\r
-    -webkit-apearance: none;\r
-}\r
-\r
-.sidebar-tree.hide-disclosure-buttons .sidebar-tree-item .disclosure-button {\r
-    display: none;\r
-}\r
-\r
-body.inactive .sidebar-tree-item .disclosure-button {\r
-    background-image: url(Images/disclosureTriangleSmallRightBlack.png);\r
-}\r
-\r
-body.inactive .sidebar-tree-item.expanded .disclosure-button {\r
-    background-image: url(Images/disclosureTriangleSmallDownBlack.png);\r
-}\r
-\r
-body.inactive .sidebar-tree-item .disclosure-button:active {\r
-    background-image: url(Images/disclosureTriangleSmallRightDownBlack.png);\r
-}\r
-\r
-.sidebar-tree-item.selected .disclosure-button {\r
-    background-image: url(Images/disclosureTriangleSmallRightWhite.png) !important;\r
-}\r
-\r
-.sidebar-tree-item.expanded .disclosure-button {\r
-    background-image: url(Images/disclosureTriangleSmallDown.png);\r
-}\r
-\r
-.sidebar-tree-item.selected.expanded .disclosure-button {\r
-    background-image: url(Images/disclosureTriangleSmallDownWhite.png) !important;\r
-}\r
-\r
-.sidebar-tree-item.selected .disclosure-button:active {\r
-    background-image: url(Images/disclosureTriangleSmallRightDownWhite.png) !important;\r
-}\r
-\r
-.sidebar-tree-item .disclosure-button:active {\r
-    background-image: url(Images/disclosureTriangleSmallRightDown.png);\r
-}\r
-\r
-.sidebar-tree-item .icon {\r
-    float: left;\r
-    width: 32px;\r
-    height: 32px;\r
-    margin-top: 1px;\r
-    margin-right: 3px;\r
-}\r
-\r
-li .status {\r
-    float: right;\r
-    height: 16px;\r
-    margin-top: 9px;\r
-    margin-left: 4px;\r
-    line-height: 1em;\r
-}\r
-\r
-li .status:empty {\r
-    display: none;\r
-}\r
-\r
-li .status .bubble {\r
-    display: inline-block;\r
-    height: 14px;\r
-    min-width: 16px;\r
-    margin-top: 1px;\r
-    background-color: rgb(128, 151, 189);\r
-    vertical-align: middle;\r
-    white-space: nowrap;\r
-    padding: 1px 4px;\r
-    text-align: center;\r
-    font-size: 11px;\r
-    line-height: normal;\r
-    font-family: Helvetica, Arial, sans-serif;\r
-    font-weight: bold;\r
-    text-shadow: none;\r
-    color: white;\r
-    -webkit-border-radius: 7px;\r
-}\r
-\r
-li .status .bubble:empty {\r
-    display: none;\r
-}\r
-\r
-li.selected .status .bubble {\r
-    background-color: white !important;\r
-    color: rgb(132, 154, 190) !important;\r
-}\r
-\r
-:focus li.selected .status .bubble {\r
-    color: rgb(36, 98, 172) !important;\r
-}\r
-\r
-body.inactive li.selected .status .bubble {\r
-    color: rgb(159, 159, 159) !important;\r
-}\r
-\r
-.sidebar-tree.small .sidebar-tree-item, .sidebar-tree .children.small .sidebar-tree-item, .sidebar-tree-item.small, .small .resources-graph-side {\r
-    height: 20px;\r
-}\r
-\r
-.sidebar-tree.small .sidebar-tree-item .icon, .sidebar-tree .children.small .sidebar-tree-item .icon, .sidebar-tree-item.small .icon {\r
-    width: 16px;\r
-    height: 16px;\r
-}\r
-\r
-.sidebar-tree.small .sidebar-tree-item .status, .sidebar-tree .children.small .sidebar-tree-item .status, .sidebar-tree-item.small .status {\r
-    margin-top: 1px;\r
-}\r
-\r
-.sidebar-tree-item.selected {\r
-    color: white;\r
-    border-top: 1px solid rgb(145, 160, 192);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(162, 177, 207)), to(rgb(120, 138, 177)));\r
-    text-shadow: rgba(0, 0, 0, 0.33) 0 1px 0;\r
-    font-weight: bold;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-:focus .sidebar-tree-item.selected {\r
-    border-top: 1px solid rgb(68, 128, 200);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(92, 147, 213)), to(rgb(21, 83, 170)));\r
-}\r
-\r
-body.inactive .sidebar-tree-item.selected {\r
-    border-top: 1px solid rgb(151, 151, 151);\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(180, 180, 180)), to(rgb(138, 138, 138)));\r
-}\r
-\r
-.sidebar-tree-item .titles {\r
-    position: relative;\r
-    top: 5px;\r
-    line-height: 11px;\r
-    padding-bottom: 1px;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    white-space: nowrap;\r
-}\r
-\r
-.sidebar-tree-item .titles.no-subtitle {\r
-    top: 10px;\r
-}\r
-\r
-.sidebar-tree.small .sidebar-tree-item .titles, .sidebar-tree .children.small .sidebar-tree-item .titles, .sidebar-tree-item.small .titles {\r
-    top: 2px;\r
-    line-height: normal;\r
-}\r
-\r
-.sidebar-tree:not(.small) .sidebar-tree-item:not(.small) .title::after, .sidebar-tree .children:not(.small) .sidebar-tree-item .title::after {\r
-    content: "\A";\r
-    white-space: pre;\r
-}\r
-\r
-.sidebar-tree-item .subtitle {\r
-    font-size: 9px;\r
-    color: rgba(0, 0, 0, 0.7);\r
-}\r
-\r
-.sidebar-tree.small .sidebar-tree-item .subtitle, .sidebar-tree .children.small .sidebar-tree-item .subtitle, .sidebar-tree-item.small .subtitle {\r
-    display: none;\r
-}\r
-\r
-.sidebar-tree-item.selected .subtitle {\r
-    color: rgba(255, 255, 255, 0.9);\r
-}\r
-\r
-#resources-graphs {\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    max-height: 100%;\r
-    top: 112px;\r
-}\r
-\r
-.resources-graph-side {\r
-    position: relative;\r
-    height: 36px;\r
-    padding: 0 5px;\r
-    white-space: nowrap;\r
-    margin-top: 1px;\r
-    border-top: 1px solid transparent;\r
-    overflow: hidden;\r
-}\r
-\r
-.resources-graph-bar-area {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    right: 8px;\r
-    left: 9px;\r
-}\r
-\r
-#resources-container:not(.viewing-resource) .resource-sidebar-tree-item:nth-of-type(2n) {\r
-    background-color: rgba(0, 0, 0, 0.05);\r
-}\r
-\r
-#resources-container:not(.viewing-resource) .resources-graph-side:nth-of-type(2n) {\r
-    background-color: rgba(0, 0, 0, 0.05);\r
-}\r
-\r
-.resources-time-graph-sidebar-item .icon {\r
-    content: url(Images/resourcesTimeGraphIcon.png);\r
-}\r
-\r
-.resources-size-graph-sidebar-item .icon {\r
-    content: url(Images/resourcesSizeGraphIcon.png);\r
-}\r
-\r
-.resources-size-graph-sidebar-item .icon {\r
-    content: url(Images/resourcesSizeGraphIcon.png);\r
-}\r
-\r
-.resource-sidebar-tree-item .icon {\r
-    content: url(Images/resourcePlainIcon.png);\r
-}\r
-\r
-.children.small .resource-sidebar-tree-item .icon {\r
-    content: url(Images/resourcePlainIconSmall.png);\r
-}\r
-\r
-.resource-sidebar-tree-item.resources-category-documents .icon {\r
-    content: url(Images/resourceDocumentIcon.png);\r
-}\r
-\r
-.children.small .resource-sidebar-tree-item.resources-category-documents .icon {\r
-    content: url(Images/resourceDocumentIconSmall.png);\r
-}\r
-\r
-.resource-sidebar-tree-item.resources-category-stylesheets .icon {\r
-    content: url(Images/resourceCSSIcon.png);\r
-}\r
-\r
-.children.small .resource-sidebar-tree-item.resources-category-stylesheets .icon {\r
-    content: url(Images/resourceDocumentIconSmall.png);\r
-}\r
-\r
-.resource-sidebar-tree-item.resources-category-images .icon {\r
-    position: relative;\r
-    background-image: url(Images/resourcePlainIcon.png);\r
-    background-repeat: no-repeat;\r
-    content: "";\r
-}\r
-\r
-.resources-category-images .image-resource-icon-preview {\r
-    position: absolute;\r
-    margin: auto;\r
-    top: 3px;\r
-    bottom: 4px;\r
-    left: 5px;\r
-    right: 5px;\r
-    max-width: 18px;\r
-    max-height: 21px;\r
-    min-width: 1px;\r
-    min-height: 1px;\r
-}\r
-\r
-.children.small .resource-sidebar-tree-item.resources-category-images .icon {\r
-    background-image: url(Images/resourcePlainIconSmall.png);\r
-    content: "";\r
-}\r
-\r
-.children.small .resources-category-images .image-resource-icon-preview {\r
-    top: 2px;\r
-    bottom: 1px;\r
-    left: 3px;\r
-    right: 3px;\r
-    max-width: 8px;\r
-    max-height: 11px;\r
-}\r
-\r
-.resource-sidebar-tree-item.resources-category-fonts .icon {\r
-    content: url(Images/resourcePlainIcon.png);\r
-}\r
-\r
-.children.small .resource-sidebar-tree-item.resources-category-fonts .icon {\r
-    content: url(Images/resourcePlainIconSmall.png);\r
-}\r
-\r
-.resource-sidebar-tree-item.resources-category-scripts .icon {\r
-    content: url(Images/resourceJSIcon.png);\r
-}\r
-\r
-.children.small .resource-sidebar-tree-item.resources-category-scripts .icon {\r
-    content: url(Images/resourceDocumentIconSmall.png);\r
-}\r
-\r
-.resource-sidebar-tree-item.resources-category-xhr .icon {\r
-    content: url(Images/resourcePlainIcon.png);\r
-}\r
-\r
-.children.small .resource-sidebar-tree-item.resources-category-xhr .icon {\r
-    content: url(Images/resourceDocumentIconSmall.png);\r
-}\r
-\r
-.bubble.debug, .console-debug-level .bubble {\r
-    background-color: rgb(0, 0, 255) !important;\r
-}\r
-\r
-.bubble.warning, .console-warning-level .bubble {\r
-    background-color: rgb(232, 164, 0) !important;\r
-}\r
-\r
-.bubble.error, .console-error-level .bubble {\r
-    background-color: rgb(216, 35, 35) !important;\r
-}\r
-\r
-.bubble.search-matches {\r
-    background-image: url(Images/searchSmallWhite.png);\r
-    background-repeat: no-repeat;\r
-    background-position: 3px 2px;\r
-    padding-left: 13px !important;\r
-}\r
-\r
-li.selected .bubble.search-matches {\r
-    background-image: url(Images/searchSmallBlue.png);\r
-}\r
-\r
-:focus li.selected .bubble.search-matches {\r
-    background-image: url(Images/searchSmallBrightBlue.png);\r
-}\r
-\r
-body.inactive li.selected .bubble.search-matches {\r
-    background-image: url(Images/searchSmallGray.png);\r
-}\r
-\r
-/* Timeline Style */\r
-\r
-#timeline-overview-panel {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    height: 80px;\r
-}\r
-\r
-#timeline-overview-panel .timeline-graph-bar {\r
-    pointer-events: none;\r
-}\r
-\r
-.timeline-sidebar-background {\r
-    top: 90px;\r
-    bottom: 0;\r
-}\r
-\r
-.timeline .sidebar {\r
-    overflow-y: hidden;\r
-    z-index: 100;\r
-    min-height: 100%;\r
-    bottom: auto;\r
-}\r
-\r
-#timeline-overview-separator {\r
-    position: absolute;\r
-    top: 80px;\r
-    left: 0;\r
-    right: 0;\r
-    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(253, 253, 253)), to(rgb(213, 213, 213)));\r
-    border-top: 1px solid rgb(140, 140, 140);\r
-    border-bottom: 1px solid rgb(115, 115, 115);\r
-    height: 10px;\r
-}\r
-\r
-#timeline-overview-sidebar {\r
-    position: absolute;\r
-    width: 200px;\r
-    top: 0px;\r
-    bottom: 0px;\r
-    left: 0px;\r
-    padding-top: 2px;\r
-    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(242, 242, 242)), to(rgb(209, 209, 209)));\r
-    border-right: 1px solid rgb(163, 163, 163);\r
-}\r
-\r
-#timeline-overview-grid {\r
-    position: absolute;\r
-    top: 0px;\r
-    bottom: 0px;\r
-    left: 200px;\r
-    right: 0px;\r
-    background-color: rgb(255, 255, 255);\r
-}\r
-\r
-.timeline-window-selector {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    background-color: rgba(125, 173, 217, 0.5);\r
-    z-index: 250;\r
-}\r
-\r
-#timeline-overview-window {\r
-    background-color: white;\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    top: 0;\r
-    bottom: 60px;\r
-    z-index: 150;\r
-}\r
-\r
-.timeline-overview-dividers-background {\r
-    left: 0%;\r
-    right: 0%;\r
-    top: 0px;\r
-    bottom: 60px;\r
-    background-color: black;\r
-    position: absolute;\r
-}\r
-\r
-.timeline-overview-window-rulers {\r
-    top: 0;\r
-    bottom: 0;\r
-    position: absolute;\r
-    opacity: 0.2;\r
-    border-right: 1px solid black;\r
-    border-left: 1px solid black;\r
-    z-index: 150;\r
-}\r
-\r
-.timeline-window-resizer {\r
-    position: absolute;\r
-    top: 0px;\r
-    bottom: 60px;\r
-    width: 5px;\r
-    margin-left: -3px;\r
-    margin-right: -2px;\r
-    background-color: rgb(153, 153, 153);\r
-    z-index: 500;\r
-    cursor: col-resize;\r
-    -webkit-border-radius: 2px;\r
-    -webkit-box-shadow: white 1px 0 0, white -1px 0 0, white 0 1px 0, white 0 -1px 0;\r
-}\r
-\r
-#timeline-overview-grid #resources-graphs {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    height: 80px;\r
-}\r
-\r
-#timeline-container {\r
-    position: absolute;\r
-    top: 90px;\r
-    left: 0;\r
-    bottom: 0;\r
-    right: 0;\r
-    border-right: 0 none transparent;\r
-    overflow-y: auto;\r
-    overflow-x: hidden;\r
-}\r
-\r
-.timeline-category-statusbar-item {\r
-    height: 24px;\r
-    line-height: 24px;\r
-    padding-left: 6px;\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    font-weight: bold;\r
-}\r
-\r
-.timeline-category-statusbar-item .timeline-category-checkbox {\r
-    width: 10px;\r
-    height: 11px;\r
-    margin: 0 3px 0 5px;\r
-    padding: 0;\r
-    background-image: url(Images/timelineCheckmarks.png);\r
-    background-repeat: no-repeat;\r
-    background-position: 0 -66px;\r
-    vertical-align: -1px;\r
-    -webkit-appearance: none;\r
-}\r
-\r
-.timeline-category-statusbar-item .timeline-category-checkbox:checked {\r
-    background-position-x: -10px;\r
-}\r
-\r
-.timeline-category-statusbar-item.timeline-category-loading .timeline-category-checkbox {\r
-    background-position-y: 0;\r
-}\r
-\r
-.timeline-category-statusbar-item.timeline-category-scripting .timeline-category-checkbox {\r
-    background-position-y: -33px;\r
-}\r
-\r
-.timeline-category-statusbar-item.timeline-category-rendering .timeline-category-checkbox {\r
-    background-position-y: -11px;\r
-}\r
-\r
-.timeline-tree-item {\r
-    height: 18px;\r
-    line-height: 15px;\r
-    padding-right: 5px;\r
-    padding-left: 10px;\r
-    padding-top: 2px;\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-}\r
-\r
-.timeline-expandable {\r
-    position: absolute;\r
-    border-left: 1px solid rgb(163, 163, 163);\r
-}\r
-\r
-.timeline-expandable-left {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    left: 0;\r
-    width: 3px;\r
-    border-top: 1px solid rgb(163, 163, 163);\r
-    border-bottom: 1px solid rgb(163, 163, 163);\r
-}\r
-\r
-.timeline-expandable-collapsed {\r
-    background-image: url(Images/disclosureTriangleSmallRightBlack.png);\r
-    background-position-x: 1px;\r
-    background-position-y: 2px;\r
-    background-repeat: no-repeat;\r
-}\r
-\r
-.timeline-expandable-expanded {\r
-    background-image: url(Images/disclosureTriangleSmallDownBlack.png);\r
-    background-position-x: 1px;\r
-    background-position-y: 3px;\r
-    background-repeat: no-repeat;\r
-}\r
-\r
-.timeline-tree-item .type {\r
-    padding-left: 14px;\r
-}\r
-\r
-.timeline-tree-item .count {\r
-    font-family: Helvetica, Arial, sans-serif;\r
-    font-weight: bold;\r
-}\r
-\r
-.timeline-tree-item .timeline-tree-icon {\r
-    background-image: url(Images/timelineDots.png);\r
-    margin-top: 2px;\r
-    width: 12px;\r
-    height: 12px;\r
-    position: absolute;\r
-}\r
-\r
-.timeline-tree-item.even {\r
-    background-color: rgba(0, 0, 0, 0.05);\r
-}\r
-\r
-.timeline-tree-item .data.dimmed {\r
-    color: rgba(0, 0, 0, 0.7);\r
-}\r
-\r
-#timeline-overview-timelines,\r
-#timeline-overview-memory {\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    top: 20px;\r
-    z-index: 160;\r
-}\r
-\r
-#timeline-overview-memory > canvas {\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    top: 5px;\r
-}\r
-\r
-\r
-#timeline-graphs {\r
-    position: absolute;\r
-    left: 0;\r
-    right: 0;\r
-    max-height: 100%;\r
-    top: 19px;\r
-}\r
-\r
-.timeline-graph-side {\r
-    position: relative;\r
-    height: 18px;\r
-    padding: 0 5px;\r
-    white-space: nowrap;\r
-    margin-top: 0px;\r
-    border-top: 1px solid transparent;\r
-    overflow: hidden;\r
-    pointer-events: none;\r
-}\r
-\r
-.timeline-overview-graph-side {\r
-    height: 20px;\r
-    z-index: 170;\r
-    pointer-events: none;\r
-}\r
-\r
-.timeline-overview-graph-side .timeline-graph-bar {\r
-    height: 13px;\r
-}\r
-\r
-.timeline-graph-bar-area {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    right: 0;\r
-    left: 3px;\r
-    pointer-events: none;\r
-}\r
-\r
-.timeline-graph-bar {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    margin: auto -2px;\r
-    border-width: 4px 4px 5px;\r
-    height: 9px;\r
-    min-width: 5px;\r
-    opacity: 0.8;\r
-    -webkit-border-image: url(Images/timelineBarGray.png) 4 4 5 4;\r
-    z-index: 180;\r
-    pointer-events: visibleFill;\r
-}\r
-\r
-.timeline-graph-bar.with-children {\r
-    opacity: 0.2;\r
-}\r
-\r
-.timeline-graph-bar.cpu {\r
-    opacity: 0.6;\r
-}\r
-\r
-.timeline-graph-side.even {\r
-    background-color: rgba(0, 0, 0, 0.05);\r
-}\r
-\r
-.timeline-category-loading .timeline-graph-bar {\r
-    -webkit-border-image: url(Images/timelineBarBlue.png) 4 4 5 4;\r
-}\r
-\r
-.timeline-category-scripting .timeline-graph-bar {\r
-    -webkit-border-image: url(Images/timelineBarOrange.png) 4 4 5 4;\r
-}\r
-\r
-.timeline-category-rendering .timeline-graph-bar {\r
-    -webkit-border-image: url(Images/timelineBarPurple.png) 4 4 5 4;\r
-}\r
-\r
-.timeline-aggregated-category {\r
-    display: inline-block;\r
-    height: 11px;\r
-    margin-right: 2px;\r
-    margin-left: 6px;\r
-    position: relative;\r
-    top: 2px;\r
-    width: 10px;\r
-}\r
-\r
-.timeline-loading {\r
-    -webkit-border-image: url(Images/timelineBarBlue.png) 4 4 5 4;\r
-}\r
-\r
-.timeline-scripting {\r
-    -webkit-border-image: url(Images/timelineBarOrange.png) 4 4 5 4;\r
-}\r
-\r
-.timeline-rendering {\r
-    -webkit-border-image: url(Images/timelineBarPurple.png) 4 4 5 4;\r
-}\r
-\r
-.popover .timeline-aggregated-category.timeline-loading {\r
-    margin-left: 0px;\r
-}\r
-\r
-.timeline-category-loading .timeline-tree-icon {\r
-    background-position-y: 0px;\r
-}\r
-\r
-.timeline-category-scripting .timeline-tree-icon {\r
-    background-position-y: 48px;\r
-}\r
-\r
-.timeline-category-rendering .timeline-tree-icon {\r
-    background-position-y: 72px;\r
-}\r
-\r
-.timeline-details {\r
-    -webkit-user-select: text;\r
-    vertical-align: top;\r
-}\r
-\r
-.timeline-function-name {\r
-    text-align: right;\r
-}\r
-\r
-.timeline-stacktrace-title {\r
-    padding-top: 4px;\r
-}\r
-\r
-.timeline-details-row-title {\r
-    font-weight: bold;\r
-    text-align: right;\r
-    white-space: nowrap;\r
-}\r
-\r
-.timeline-details-row-data {\r
-    white-space: nowrap;\r
-}\r
-\r
-.timeline-details-title {\r
-    border-bottom: 1px solid #B8B8B8;\r
-    font-size: 11px;\r
-    font-weight: bold;\r
-    padding-bottom: 5px;\r
-    padding-top: 0px;\r
-    white-space: nowrap;\r
-}\r
-\r
-.timeline-filter-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/largerResourcesButtonGlyph.png);\r
-}\r
-\r
-.timeline-filter-status-bar-item.toggled-on .glyph {\r
-    background-color: rgb(66, 129, 235) !important;\r
-}\r
-\r
-.timeline-records-counter, .storage-application-cache-status, .storage-application-cache-connectivity {\r
-    font-size: 11px;\r
-    text-shadow: white 0 1px 0;\r
-}\r
-\r
-#main-status-bar > .timeline-records-counter {\r
-    float: right;\r
-    margin-top: 4px;\r
-    margin-right: 25px;\r
-}\r
-\r
-#counters > .timeline-records-counter {\r
-    float: left;\r
-    margin-top: -2px;\r
-}\r
-\r
-.storage-application-cache-status-icon, .storage-application-cache-connectivity-icon {\r
-    margin-bottom: -3px;\r
-    margin-left: 5px;\r
-    vertical-align: middle;\r
-}\r
-\r
-.status-bar-divider {\r
-    margin-left: 7px;\r
-    border-right: 1px solid #CCC;\r
-}\r
-\r
-.storage-application-cache-status, .storage-application-cache-connectivity {\r
-    position: relative;\r
-    top: 4px;\r
-}\r
-\r
-/* Profiler Style */\r
-\r
-#profile-views {\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    left: 200px;\r
-    bottom: 0;\r
-}\r
-\r
-.status-bar-items {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    left: 200px;\r
-    overflow: hidden;\r
-    border-left: 1px solid rgb(184, 184, 184);\r
-    margin-left: -1px;\r
-}\r
-\r
-.profile-sidebar-tree-item .icon {\r
-    content: url(Images/profileIcon.png);\r
-}\r
-\r
-.profile-sidebar-tree-item.small .icon {\r
-    content: url(Images/profileSmallIcon.png);\r
-}\r
-\r
-.profile-group-sidebar-tree-item .icon {\r
-    content: url(Images/profileGroupIcon.png);\r
-}\r
-\r
-.profile-view {\r
-    display: none;\r
-    overflow: hidden;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-}\r
-\r
-.profile-view.visible {\r
-    display: block;\r
-}\r
-\r
-.profile-view .data-grid {\r
-    border: none;\r
-    height: 100%;\r
-}\r
-\r
-.profile-view .data-grid th.average-column {\r
-    text-align: center;\r
-}\r
-\r
-.profile-view .data-grid td.average-column {\r
-    text-align: right;\r
-}\r
-\r
-.profile-view .data-grid th.self-column {\r
-    text-align: center;\r
-}\r
-\r
-.profile-view .data-grid td.self-column {\r
-    text-align: right;\r
-}\r
-\r
-.profile-view .data-grid th.total-column {\r
-    text-align: center;\r
-}\r
-\r
-.profile-view .data-grid td.total-column {\r
-    text-align: right;\r
-}\r
-\r
-.profile-view .data-grid .calls-column {\r
-    text-align: center;\r
-}\r
-\r
-.profile-node-file {\r
-    float: right;\r
-    color: gray;\r
-    margin-top: -1px;\r
-}\r
-\r
-.data-grid tr.selected .profile-node-file {\r
-    color: rgb(33%, 33%, 33%);\r
-}\r
-\r
-.data-grid:focus tr.selected .profile-node-file {\r
-    color: white;\r
-}\r
-\r
-button.enable-toggle-status-bar-item .glyph {\r
-}\r
-\r
-.record-profile-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/recordButtonGlyph.png);\r
-}\r
-\r
-.record-profile-status-bar-item.toggled-on .glyph {\r
-    -webkit-mask-image: url(Images/recordToggledButtonGlyph.png);\r
-    background-color: rgb(216, 0, 0) !important;\r
-}\r
-\r
-/* FIXME: should have its own glyph. */\r
-.heap-snapshot-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);\r
-}\r
-\r
-.node-search-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/nodeSearchButtonGlyph.png);\r
-}\r
-\r
-.percent-time-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/percentButtonGlyph.png);\r
-}\r
-\r
-.focus-profile-node-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/focusButtonGlyph.png);\r
-}\r
-\r
-.exclude-profile-node-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/excludeButtonGlyph.png);\r
-}\r
-\r
-.reset-profile-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/reloadButtonGlyph.png);\r
-}\r
-\r
-.delete-storage-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/excludeButtonGlyph.png);\r
-}\r
-\r
-.refresh-storage-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/reloadButtonGlyph.png);\r
-}\r
-\r
-ol.breakpoint-list {\r
-    -webkit-padding-start: 0;\r
-    list-style: none;\r
-    margin: 0;\r
-}\r
-\r
-.breakpoint-list li {\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    padding: 2px 0;\r
-    color: black;\r
-}\r
-\r
-.breakpoint-list li:hover {\r
-    color: rgb(15%, 15%, 15%);\r
-}\r
-\r
-.breakpoint-list .checkbox-elem {\r
-    font-size: 10px;\r
-    margin: 0 4px;\r
-    vertical-align: top;\r
-    position: relative;\r
-    z-index: 1;\r
-}\r
-\r
-.breakpoint-list .source-text {\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    margin: 2px 0 0px 20px;\r
-}\r
-\r
-.pane .breakpoint-hit {\r
-    background-color: rgb(255, 255, 194);\r
-}\r
-\r
-li.breakpoint-hit .breakpoint-hit-marker {\r
-    background-color: rgb(255, 255, 194);\r
-    height: 18px;\r
-    left: 0px;\r
-    margin-top: -16px;\r
-    position: absolute;\r
-    right: 0px;\r
-    z-index: -1;\r
-}\r
-\r
-.webkit-html-js-node, .webkit-html-css-node {\r
-    white-space: pre;\r
-}\r
-\r
-.source-frame-breakpoint-condition {\r
-    z-index: 30;\r
-    padding: 4px;\r
-    background-color: rgb(203, 226, 255);\r
-    -webkit-border-radius: 7px;\r
-    border: 2px solid rgb(169, 172, 203); \r
-    width: 90%; \r
-}\r
-\r
-.source-frame-breakpoint-message {\r
-    background-color: transparent;\r
-    font-family: Lucida Grande, sans-serif; \r
-    font-weight: normal;\r
-    font-size: 11px;\r
-    text-align: left;\r
-    text-shadow: none;\r
-    color: rgb(85, 85, 85);\r
-    cursor: default;\r
-    margin: 0 0 2px 0; \r
-}\r
-\r
-#source-frame-breakpoint-condition {\r
-    margin: 0;\r
-    border: 1px inset rgb(190, 190, 190) !important;\r
-    width: 100%;\r
-    box-shadow: none !important;\r
-    outline: none !important;\r
-    -webkit-user-modify: read-write;\r
-}\r
-\r
-.source-frame-popover-title {\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    white-space: nowrap;\r
-    font-weight: bold;\r
-    padding-left: 18px;\r
-}\r
-\r
-.source-frame-popover-tree {\r
-    border-top: 1px solid rgb(194, 194, 147);\r
-    overflow: auto;\r
-    position: absolute;\r
-    top: 15px;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-}\r
-\r
-.source-frame-eval-expression {\r
-    border: 1px solid rgb(163, 41, 34);\r
-    margin: -1px;\r
-    background-color: rgb(255, 255, 194);\r
-}\r
-\r
-.styles-sidebar-separator {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(243, 243, 243)), color-stop(0.05, rgb(243, 243, 243)), color-stop(0.05, rgb(230, 230, 230)), to(rgb(209, 209, 209)));\r
-    padding: 0 5px;\r
-    border-top: 1px solid rgb(189, 189, 189);\r
-    border-bottom: 1px solid rgb(189, 189, 189);\r
-    color: rgb(110, 110, 110);\r
-    text-shadow: white 0 1px 0;\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    font-size: 11px;\r
-}\r
-\r
-.styles-selector {\r
-    cursor: text;\r
-}\r
-\r
-.workers-list {\r
-    list-style: none;\r
-    margin: 0;\r
-    padding: 0;\r
-}\r
\r
-.workers-list > li {\r
-    overflow: hidden;\r
-    text-overflow: ellipsis;\r
-    white-space: nowrap;\r
-    margin-left: 1em;\r
-    font-size: 12px;\r
-}\r
-\r
-a.worker-item {\r
-    color: rgb(33%, 33%, 33%);\r
-    cursor: pointer;\r
-    text-decoration: none;\r
-}\r
-\r
-.styles-section {\r
-    padding: 2px 2px 4px 4px;\r
-    min-height: 18px;\r
-    white-space: nowrap;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.styles-section:not(.first-styles-section) {\r
-    border-top: 1px solid rgb(191, 191, 191);\r
-}\r
-\r
-.styles-section.read-only {\r
-    background-color: rgb(240, 240, 240);\r
-}\r
-\r
-.styles-section .properties li.not-parsed-ok {\r
-    margin-left: 0px;\r
-}\r
-\r
-.styles-section .properties li.not-parsed-ok::before {\r
-    content: url(Images/warningIcon.png);\r
-    opacity: 0.75;\r
-    float: left;\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-top: 0;\r
-    padding-right: 5px;\r
-    vertical-align: sub;\r
-    -webkit-user-select: none;\r
-    cursor: default;\r
-}\r
-\r
-.styles-section .header {\r
-    white-space: nowrap;\r
-    -webkit-background-origin: padding;\r
-    -webkit-background-clip: padding;\r
-}\r
-\r
-.styles-section .header .title {\r
-    word-wrap: break-word;\r
-    white-space: normal;\r
-}\r
-\r
-.styles-section .header .subtitle {\r
-    color: rgb(85, 85, 85);\r
-    float: right;\r
-    margin-left: 5px;\r
-    max-width: 65%;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-}\r
-\r
-.styles-section .header .subtitle a {\r
-    color: inherit;\r
-}\r
-\r
-.styles-section a::before {\r
-    content: attr(data-uncopyable);\r
-}\r
-\r
-.styles-section .properties {\r
-    display: none;\r
-    margin: 0;\r
-    padding: 2px 4px 0 8px;\r
-    list-style: none;\r
-}\r
-\r
-.styles-section.no-affect .properties li {\r
-    opacity: 0.5;\r
-}\r
-\r
-.styles-section.no-affect .properties li.editing {\r
-    opacity: 1.0;\r
-}\r
-\r
-.styles-section.expanded .properties {\r
-    display: block;\r
-}\r
-\r
-.styles-section .properties li {\r
-    margin-left: 12px;\r
-    white-space: nowrap;\r
-    text-overflow: ellipsis;\r
-    overflow: hidden;\r
-    cursor: auto;\r
-}\r
-\r
-.styles-section .properties li.parent {\r
-    margin-left: 1px;\r
-}\r
-\r
-.styles-section .properties ol {\r
-    display: none;\r
-    margin: 0;\r
-    -webkit-padding-start: 12px;\r
-    list-style: none;\r
-}\r
-\r
-.styles-section .properties ol.expanded {\r
-    display: block;\r
-}\r
-\r
-.styles-section .properties li.parent::before {\r
-    content: url(Images/treeRightTriangleBlack.png);\r
-    opacity: 0.75;\r
-    float: left;\r
-    width: 8px;\r
-    height: 8px;\r
-    margin-top: 0;\r
-    padding-right: 3px;\r
-    -webkit-user-select: none;\r
-    cursor: default;\r
-}\r
-\r
-.styles-section .properties li.parent.expanded::before {\r
-    content: url(Images/treeDownTriangleBlack.png);\r
-    margin-top: 1px;\r
-}\r
-\r
-.styles-section .properties li .info {\r
-    padding-top: 4px;\r
-    padding-bottom: 3px;\r
-}\r
-\r
-.styles-section:hover .properties .enabled-button {\r
-    display: block;\r
-}\r
-\r
-.styles-section .properties li.disabled .enabled-button {\r
-    display: block;\r
-}\r
-\r
-.styles-section .properties .enabled-button {\r
-    display: none;\r
-    float: right;\r
-    font-size: 10px;\r
-    margin: 0 0 0 4px;\r
-    vertical-align: top;\r
-    position: relative;\r
-    z-index: 1;\r
-}\r
-\r
-.styles-section .properties .overloaded, .styles-section .properties .inactive, .styles-section .properties .disabled {\r
-    text-decoration: line-through;\r
-}\r
-\r
-.styles-section.computed-style .properties .disabled {\r
-    text-decoration: none;\r
-    opacity: 0.5;\r
-}\r
-\r
-.styles-section .properties .implicit, .styles-section .properties .inherited {\r
-    opacity: 0.5;\r
-}\r
-\r
-\r
-.body .styles-section .properties .inherited {\r
-    display: none;\r
-}\r
-\r
-.body.show-inherited .styles-section .properties .inherited {\r
-    display: block;\r
-}\r
-\r
-a.worker-item:hover {\r
-    color: rgb(15%, 15%, 15%);\r
-}\r
-\r
-.resource-content-unavailable {\r
-    color: rgb(50%, 50%, 50%);\r
-    font-style: italic;\r
-    font-size: 14px;\r
-    text-align: center;\r
-    padding: 32px;\r
-}\r
-\r
-.node-link {\r
-    text-decoration: underline;\r
-    cursor: pointer;\r
-}\r
-\r
-.cursor-pointer {\r
-    cursor: pointer;\r
-}\r
-\r
-.cursor-auto {\r
-    cursor: auto;\r
-}\r
-\r
-/* inspectorSyntaxHighlight.css */\r
-\r
-/*\r
- * Copyright (C) 2009 Apple Inc.  All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- *\r
- * 1.  Redistributions of source code must retain the above copyright\r
- *     notice, this list of conditions and the following disclaimer. \r
- * 2.  Redistributions in binary form must reproduce the above copyright\r
- *     notice, this list of conditions and the following disclaimer in the\r
- *     documentation and/or other materials provided with the distribution. \r
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of\r
- *     its contributors may be used to endorse or promote products derived\r
- *     from this software without specific prior written permission. \r
- *\r
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY\r
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\r
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
- */\r
-\r
-.webkit-css-comment { \r
-    color: rgb(0, 116, 0);\r
-}\r
-\r
-.webkit-css-url, .webkit-css-color, .webkit-css-string, .webkit-css-keyword {\r
-    color: rgb(7, 144, 154);\r
- }\r
-\r
-.webkit-css-number {\r
-    color: rgb(50, 0, 255);\r
-}\r
-\r
-.webkit-css-property, .webkit-css-at-rule {\r
-    color: rgb(200, 0, 0);\r
-}\r
-\r
-.webkit-css-selector {\r
-    color: black;\r
-}\r
-\r
-.webkit-css-important {\r
-    color: rgb(200, 0, 180);\r
-}\r
-\r
-.webkit-javascript-comment {\r
-    color: rgb(0, 116, 0);\r
-}\r
-\r
-.webkit-javascript-keyword {\r
-    color: rgb(170, 13, 145);\r
-}\r
-\r
-.webkit-javascript-number {\r
-    color: rgb(28, 0, 207);\r
-}\r
-\r
-.webkit-javascript-string, .webkit-javascript-regexp {\r
-    color: rgb(196, 26, 22);\r
-}\r
-\r
-.webkit-javascript-ident {\r
-    color: black;\r
-}\r
-\r
-.webkit-html-comment {\r
-    /* Keep this in sync with view-source.css (.webkit-html-comment) */\r
-    color: rgb(35, 110, 37);\r
-}\r
-\r
-.webkit-html-tag {\r
-    /* Keep this in sync with view-source.css (.webkit-html-tag) */\r
-    color: rgb(136, 18, 128);\r
-}\r
-\r
-.webkit-html-doctype {\r
-    /* Keep this in sync with view-source.css (.webkit-html-doctype) */\r
-    color: rgb(192, 192, 192);\r
-}\r
-\r
-.webkit-html-attribute-name {\r
-    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */\r
-    color: rgb(153, 69, 0);\r
-}\r
-\r
-.webkit-html-attribute-value {\r
-    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */\r
-    color: rgb(26, 26, 166);\r
-}\r
-\r
-.webkit-html-external-link, .webkit-html-resource-link {\r
-    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */\r
-    color: #00e;\r
-}\r
-\r
-.webkit-html-external-link {\r
-    /* Keep this in sync with view-source.css (.webkit-html-external-link) */\r
-    text-decoration: none;\r
-}\r
-\r
-.webkit-html-external-link:hover {\r
-    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */\r
-    text-decoration: underline;\r
-}\r
-\r
-/* networkPanel.css */\r
-\r
-.network-larger-resources-status-bar-item .glyph {\r
-    -webkit-mask-image: url(Images/largerResourcesButtonGlyph.png);\r
-}\r
-\r
-.network-sidebar .data-grid {\r
-    border: none;\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    font-size: 11px;\r
-}\r
-\r
-.network-sidebar .data-grid table.data {\r
-    -webkit-background-size: 1px 82px;\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), color-stop(0.5, rgba(0, 0, 0, 0)), color-stop(0.5, rgba(0, 0, 0, 0.05)), to(rgba(0, 0, 0, 0.05)));\r
-    font-size: 11px;\r
-}\r
-\r
-.network-sidebar .data-grid.small table.data {\r
-    -webkit-background-size: 1px 42px;\r
-}\r
-\r
-.network-sidebar .data-grid td:not(.network-summary) {\r
-    line-height: 17px;\r
-    height: 37px;\r
-    border-right: 1px solid rgb(210, 210, 210);\r
-    vertical-align: middle;\r
-}\r
-\r
-.network-sidebar .data-grid.small td {\r
-    height: 17px;\r
-}\r
-\r
-.network-sidebar .data-grid th {\r
-    border-bottom: 1px solid rgb(64%, 64%, 64%);\r
-    height: 30px;\r
-    font-size: 11px;\r
-    font-weight: bold;\r
-}\r
-\r
-.network-sidebar .data-grid.small th {\r
-    height: 22px;\r
-}\r
-\r
-.network-sidebar .data-grid th, .network.panel .data-grid th.sort-descending, .network.panel .data-grid th.sort-ascending {\r
-    background: -webkit-gradient(linear, left top, left bottom, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));\r
-}\r
-\r
-.network-sidebar .data-grid .data-container {\r
-    top: 31px;\r
-}\r
-\r
-.network-sidebar .data-grid.small .data-container {\r
-    top: 23px;\r
-}\r
-\r
-.network-sidebar .data-grid select {\r
-    -webkit-appearance: none;\r
-    background-color: transparent;\r
-    border: none;\r
-    width: 100%;\r
-    font-size: 11px;\r
-    font-weight: bold;\r
-}\r
-\r
-.network-sidebar .data-grid tr.filler {\r
-    background-color: white;\r
-}\r
-\r
-.network-sidebar .data-grid td.name-column {\r
-    font-weight: bold;\r
-    cursor: pointer;\r
-}\r
-\r
-.network.panel:not(.viewing-resource) .network-sidebar td.name-column:hover {\r
-    text-decoration: underline;\r
-}\r
-\r
-.network-sidebar .data-grid td.method-column,\r
-.network-sidebar .data-grid td.status-column,\r
-.network-sidebar .data-grid td.type-column,\r
-.network-sidebar .data-grid td.size-column,\r
-.network-sidebar .data-grid td.time-column {\r
-    background-color: rgba(0, 0, 0, 0.07);\r
-}\r
-\r
-.network-sidebar .data-grid td.size-column,\r
-.network-sidebar .data-grid td.time-column {\r
-    text-align: right;\r
-}\r
-\r
-.network-sidebar .small .network-graph-side {\r
-    height: 14px;\r
-}\r
-\r
-.network-sidebar .data-grid th.sortable:active {\r
-    background-image: none;\r
-}\r
-\r
-.network-cell-subtitle {\r
-    font-weight: normal;\r
-    color: gray;\r
-}\r
-\r
-.network-sidebar tr.selected .network-cell-subtitle {\r
-    color: white;\r
-}\r
-\r
-.network-header-subtitle {\r
-    color: gray;\r
-}\r
-\r
-.network-sidebar .data-grid.small .network-cell-subtitle,\r
-.network-sidebar .data-grid.small .network-header-subtitle\r
-{\r
-    display: none;\r
-}\r
-\r
-/* Resource preview icons */\r
-\r
-.network-sidebar .data-grid .icon {\r
-    content: url(Images/resourcePlainIcon.png);\r
-}\r
-\r
-.network-sidebar .data-grid.small .icon {\r
-    content: url(Images/resourcePlainIconSmall.png);\r
-}\r
-\r
-.network-sidebar .network-category-scripts .icon {\r
-    content: url(Images/resourceJSIcon.png);\r
-}\r
-\r
-.network-sidebar .data-grid.small .network-category-scripts .icon {\r
-    content: url(Images/resourceDocumentIconSmall.png);\r
-}\r
-\r
-.network-sidebar .network-category-documents .icon {\r
-    content: url(Images/resourceDocumentIcon.png);\r
-}\r
-\r
-.network-sidebar .data-grid.small .network-category-documents .icon {\r
-    content: url(Images/resourceDocumentIconSmall.png);\r
-}\r
-\r
-.network-sidebar .network-category-stylesheets .icon {\r
-    content: url(Images/resourceCSSIcon.png);\r
-}\r
-\r
-.network-sidebar .data-grid.small .network-category-stylesheets .icon {\r
-    content: url(Images/resourceDocumentIconSmall.png);\r
-}\r
-\r
-.network-sidebar .network-category-images .icon {\r
-    position: relative;\r
-    background-image: url(Images/resourcePlainIcon.png);\r
-    background-repeat: no-repeat;\r
-    content: "";\r
-}\r
-\r
-.network-sidebar .data-grid.small .network-category-images .icon {\r
-    background-image: url(Images/resourcePlainIconSmall.png);\r
-    content: "";\r
-}\r
-\r
-.network-sidebar .data-grid .icon {\r
-    float: left;\r
-    width: 32px;\r
-    height: 32px;\r
-    margin-top: 1px;\r
-    margin-right: 3px;\r
-}\r
-\r
-.network-sidebar .data-grid.small .icon {\r
-    width: 16px;\r
-    height: 16px;\r
-}\r
-\r
-.network-sidebar .image-network-icon-preview {\r
-    position: absolute;\r
-    margin: auto;\r
-    top: 3px;\r
-    bottom: 4px;\r
-    left: 5px;\r
-    right: 5px;\r
-    max-width: 18px;\r
-    max-height: 21px;\r
-    min-width: 1px;\r
-    min-height: 1px;\r
-}\r
-\r
-.network-sidebar .data-grid.small .image-network-icon-preview {\r
-    top: 2px;\r
-    bottom: 1px;\r
-    left: 3px;\r
-    right: 3px;\r
-    max-width: 8px;\r
-    max-height: 11px;\r
-}\r
-\r
-/* Graph styles */\r
-\r
-.network-graph-side {\r
-    position: relative;\r
-    height: 36px;\r
-    padding: 0 5px;\r
-    white-space: nowrap;\r
-    margin-top: 1px;\r
-    border-top: 1px solid transparent;\r
-    overflow: hidden;\r
-}\r
-\r
-.network-graph-bar-area {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    right: 8px;\r
-    left: 9px;\r
-}\r
-\r
-.network-graph-label {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    margin: auto -7px;\r
-    height: 13px;\r
-    line-height: 13px;\r
-    font-size: 9px;\r
-    color: rgba(0, 0, 0, 0.75);\r
-    text-shadow: rgba(255, 255, 255, 0.25) 1px 0 0, rgba(255, 255, 255, 0.25) -1px 0 0, rgba(255, 255, 255, 0.333) 0 1px 0, rgba(255, 255, 255, 0.25) 0 -1px 0;\r
-    z-index: 150;\r
-    overflow: hidden;\r
-    text-align: center;\r
-    font-weight: bold;\r
-    opacity: 0;\r
-    -webkit-transition: opacity 250ms ease-in-out;\r
-}\r
-\r
-.network-graph-side:hover .network-graph-label {\r
-    opacity: 1;\r
-}\r
-\r
-.network-graph-label:empty {\r
-    display: none;\r
-}\r
-\r
-.network-graph-label.waiting {\r
-    margin-right: 5px;\r
-}\r
-\r
-.network-graph-label.waiting-right {\r
-    margin-left: 5px;\r
-}\r
-\r
-.network-graph-label.before {\r
-    color: rgba(0, 0, 0, 0.7);\r
-    text-shadow: none;\r
-    text-align: right;\r
-    margin-right: 2px;\r
-}\r
-\r
-.network-graph-label.before::after {\r
-    padding-left: 2px;\r
-    height: 6px;\r
-    content: url(Images/graphLabelCalloutLeft.png);\r
-}\r
-\r
-.network-graph-label.after {\r
-    color: rgba(0, 0, 0, 0.7);\r
-    text-shadow: none;\r
-    text-align: left;\r
-    margin-left: 2px;\r
-}\r
-\r
-.network-graph-label.after::before {\r
-    padding-right: 2px;\r
-    height: 6px;\r
-    content: url(Images/graphLabelCalloutRight.png);\r
-}\r
-\r
-.network-graph-bar {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    margin: auto -7px;\r
-    border-width: 6px 7px;\r
-    height: 13px;\r
-    min-width: 14px;\r
-    opacity: 0.65;\r
-    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;\r
-}\r
-\r
-.network-graph-bar.waiting, .network-graph-bar.waiting-right {\r
-    opacity: 0.35;\r
-}\r
-\r
-/* Resource categories */\r
-\r
-\r
-.resource-cached .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-documents .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillBlue.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-documents.resource-cached .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillBlue.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-stylesheets .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillGreen.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-stylesheets.resource-cached .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillGreen.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-images .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillPurple.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-images.resource-cached .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillPurple.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-fonts .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillRed.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-fonts.resource-cached .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillRed.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-scripts .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillOrange.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-scripts.resource-cached .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillOrange.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-xhr .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillYellow.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-xhr.resource-cached .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-websockets .network-graph-bar {\r
-    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;\r
-}\r
-\r
-.network-category-websockets.resource-cached .network-graph-bar {\r
-   -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;\r
-}\r
-\r
-\r
-/* Popover */\r
-\r
-.network-timing-row {\r
-    position: relative;\r
-    height: 16px;\r
-}\r
-\r
-.network-timing-bar {\r
-    position: absolute;\r
-    background-color: red;\r
-    border-left: 1px solid red;\r
-    opacity: 0.4;\r
-    top: 0;\r
-    bottom: 0;\r
-}\r
-\r
-.network-timing-bar-title {\r
-    position: absolute;\r
-    color: black;\r
-    top: 1px;\r
-}\r
-\r
-.network-dim-cell {\r
-    color: grey;\r
-}\r
-\r
-/* Dividers */\r
-\r
-.network-timeline-grid {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    pointer-events: none;\r
-}\r
-\r
-.network-event-divider-padding {\r
-    position: absolute;\r
-    width: 8px;\r
-    top: 0;\r
-    bottom: 0;\r
-    pointer-events: auto;\r
-}\r
-\r
-.network-event-divider {\r
-    position: absolute;\r
-    width: 2px;\r
-    top: 31px;\r
-    bottom: 0;\r
-    z-index: 300;\r
-}\r
-\r
-.network-sidebar .network-timeline-grid.small .network-event-divider {\r
-    top: 23px;\r
-}\r
-\r
-.network-red-divider {\r
-    background-color: rgba(255, 0, 0, 0.5);\r
-}\r
-\r
-.network-blue-divider {\r
-    background-color: rgba(0, 0, 255, 0.5);\r
-}\r
-\r
-.network-sidebar .resources-dividers {\r
-    z-index: 0;\r
-}\r
-\r
-.network-sidebar .resources-dividers-label-bar {\r
-    background-color: transparent;\r
-    border: none;\r
-    height: 30px;\r
-    pointer-events: none;\r
-}\r
-\r
-.network-sidebar .network-timeline-grid.small .resources-dividers-label-bar {\r
-    height: 23px;\r
-}\r
-\r
-.network-sidebar .resources-divider-label {\r
-    top: 0px;\r
-    margin-top: -4px;\r
-    color: black;\r
-}\r
-\r
-.network-sidebar .resources-dividers-label-bar .resources-divider {\r
-    top: 23px;\r
-}\r
-\r
-.network-sidebar .network-timeline-grid.small .resources-dividers-label-bar .resources-divider {\r
-    top: 15px;\r
-}\r
-\r
-.network-sidebar .resources-divider.first .resources-divider-label {\r
-    display: none;\r
-}\r
-\r
-.network-sidebar .resources-dividers-label-bar .resources-divider.first {\r
-    background-color: transparent;\r
-}\r
-\r
-/* Filters */\r
-#network-filter {\r
-    margin-top: 1px;\r
-}\r
-\r
-.data-grid table.data tr.revealed.network-item {\r
-    display: none;\r
-}\r
-\r
-.data-grid.filter-all table.data tr.revealed.network-item,\r
-.data-grid.filter-documents table.data tr.revealed.network-category-documents,\r
-.data-grid.filter-stylesheets table.data tr.revealed.network-category-stylesheets,\r
-.data-grid.filter-images table.data tr.revealed.network-category-images,\r
-.data-grid.filter-scripts table.data tr.revealed.network-category-scripts,\r
-.data-grid.filter-xhr table.data tr.revealed.network-category-xhr,\r
-.data-grid.filter-fonts table.data tr.revealed.network-category-fonts,\r
-.data-grid.filter-websockets table.data tr.revealed.network-category-websockets,\r
-.data-grid.filter-other table.data tr.revealed.network-category-other {\r
-    display: table-row;\r
-}\r
-\r
-/* Summary */\r
-\r
-.network-summary-bar {\r
-    background-color: rgb(101, 111, 130);\r
-    color: white;\r
-    height: 20px;\r
-    font-size: 11px;\r
-    font-weight: bold;\r
-    padding-top: 3px;\r
-    padding-left: 10px;\r
-    z-index: 2000;\r
-    white-space: pre;\r
-    overflow : hidden;\r
-    text-overflow : ellipsis;\r
-}\r
-\r
-.network-summary-bar-bottom {\r
-    position: absolute;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    padding-top: 3px;\r
-}\r
-\r
-.data-grid td .network-summary-bar {\r
-    white-space: pre;\r
-}\r
-\r
-.network-sidebar .data-grid td.network-summary {\r
-    padding: 0;\r
-}\r
-\r
-/* Viewer */\r
-\r
-.network.panel.viewing-resource .network-sidebar .data-grid td,\r
-.network.panel.viewing-resource .network-sidebar .data-grid th {\r
-    border-right: none;\r
-}\r
-\r
-.network.panel.viewing-resource .data-grid th.corner {\r
-    display: none;\r
-}\r
-\r
-#network-container {\r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    bottom: 0;\r
-    right: 0;\r
-    border-right: 0 none transparent;\r
-    overflow-y: auto;\r
-    overflow-x: hidden;\r
-}\r
-\r
-.network.panel.viewing-resource #network-container {\r
-    border-right: 1px solid rgb(163, 163, 163);\r
-}\r
-\r
-#network-views {\r
-    position: absolute;\r
-    background: rgb(203, 203, 203);\r
-    top: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    left: 0;\r
-}\r
-\r
-#network-close-button {\r
-    position: absolute;\r
-    width: 14px;\r
-    height: 14px;\r
-    background-image: url(Images/closeButtons.png);\r
-    background-position: 0 0;\r
-    background-color: transparent;\r
-    border: 0 none transparent;\r
-    top: 8px;\r
-    left: 5px;\r
-    z-index: 10;\r
-    display: none;\r
-}\r
-\r
-#network-views.small #network-close-button  {\r
-    top: 4px;\r
-}\r
-\r
-#network-close-button:hover {\r
-    background-position: 14px 0;\r
-}\r
-\r
-#network-close-button:active {\r
-    background-position: 28px 0;\r
-}\r
-\r
-.network.panel.viewing-resource #network-close-button  {\r
-    display: block;\r
-}\r
-\r
-\r
-.network-sidebar .data-grid.full-grid-mode .viewer-column {\r
-    display: none;\r
-}\r
-\r
-.network-sidebar .data-grid.brief-grid-mode .viewer-column,\r
-.network-sidebar .data-grid.brief-grid-mode .method-column,\r
-.network-sidebar .data-grid.brief-grid-mode .status-column,\r
-.network-sidebar .data-grid.brief-grid-mode .type-column,\r
-.network-sidebar .data-grid.brief-grid-mode .size-column,\r
-.network-sidebar .data-grid.brief-grid-mode .time-column {\r
-    display: none;\r
-}\r
-\r
-.network.panel.viewing-resource .network-timeline-grid {\r
-    display: none;\r
-}\r
-\r
-.network-sidebar .data-grid.viewing-resource-mode .method-column,\r
-.network-sidebar .data-grid.viewing-resource-mode .status-column,\r
-.network-sidebar .data-grid.viewing-resource-mode .type-column,\r
-.network-sidebar .data-grid.viewing-resource-mode .size-column,\r
-.network-sidebar .data-grid.viewing-resource-mode .time-column,\r
-.network-sidebar .data-grid.viewing-resource-mode .timeline-column {\r
-    display: none;\r
-}\r
-\r
-.network.panel .network-sidebar {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-}\r
-\r
-.network.panel:not(.viewing-resource) .sidebar-resizer-vertical {\r
-    display: none;\r
-}\r
-\r
-.network.panel.viewing-resource .network-sidebar .data-grid-resizer {\r
-    display: none;\r
-}\r
-\r
-.network.panel .scope-bar {\r
-    height: 23px;\r
-    padding-top: 5px;\r
-}\r
-\r
-.network.panel:not(.viewing-resource) .data-grid tr.selected {\r
-    background-color: transparent;\r
-    color: black;\r
-}\r
-\r
-#network-views .network-item-view .tabbed-pane-header {\r
-    height: 31px;\r
-    padding-top: 8px;\r
-    padding-left: 25px;\r
-    white-space: nowrap;\r
-}\r
-\r
-#network-views.small .network-item-view .tabbed-pane-header {\r
-    height: 23px;\r
-    padding-top: 0;\r
-}\r
-\r
-.network.panel.viewing-resource .data-grid .data-container {\r
-    padding-right: 0;\r
-}\r
-\r
-.network-item-view {\r
-    display: none;\r
-    position: absolute;\r
-    background: white;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-}\r
-\r
-.network-item-view.visible {\r
-    display: -webkit-box;\r
-}\r
-\r
-.network-item-view .tabbed-pane-header {\r
-    height: 20px;\r
-    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(236, 236, 236)), to(rgb(217, 217, 217)));\r
-    border-bottom: 1px solid rgb(163, 163, 163);\r
-}\r
-\r
-.network-item-view .scope-bar li {\r
-    border-bottom-left-radius: 0;\r
-    border-bottom-right-radius: 0;\r
-}\r
-\r
-.resource-headers-view {\r
-    display: none;\r
-    padding: 6px;\r
-    -webkit-user-select: text;    \r
-    position: absolute;\r
-    top: 0;\r
-    left: 0;\r
-    right: 0;\r
-    bottom: 0;\r
-    overflow: auto;\r
-}\r
-\r
-.resource-headers-view.visible {\r
-    display: block;\r
-}\r
-\r
-.resource-headers-view .outline-disclosure .parent {\r
-    -webkit-user-select: none;\r
-    font-weight: bold;\r
-}\r
-\r
-.resource-headers-view .outline-disclosure .children li {\r
-    white-space: nowrap;\r
-}\r
-\r
-.resource-headers-view .outline-disclosure li.expanded .header-count {\r
-    display: none;\r
-}\r
-\r
-.resource-headers-view .outline-disclosure .header-name {\r
-    color: rgb(33%, 33%, 33%);\r
-    display: inline-block;\r
-    margin-right: 0.5em;\r
-    font-weight: bold;\r
-    vertical-align: top;\r
-    white-space: pre-wrap;\r
-}\r
-\r
-.resource-headers-view .outline-disclosure .header-value {\r
-    display: inline;\r
-    margin-right: 100px;\r
-    white-space: pre-wrap;\r
-    word-break: break-all;\r
-    margin-top: 1px;\r
-}\r
-\r
-.resource-headers-view .outline-disclosure .raw-form-data {\r
-    white-space: pre-wrap;\r
-}\r
-\r
-.resource-cookies-view {\r
-    display: none;\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    left: 0;\r
-    bottom: 0;\r
-    overflow: auto;\r
-    padding: 12px;\r
-    height: 100%;\r
-}\r
-\r
-.resource-cookies-view.visible {\r
-    display: block;\r
-}\r
-\r
-.resource-cookies-view .data-grid {\r
-    height: 100%;\r
-}\r
-\r
-.resource-cookies-view .data-grid .row-group {\r
-    font-weight: bold;\r
-    font-size: 11px;\r
-}\r
-\r
-.resource-timing-view {\r
-    display: none;\r
-    position: absolute;\r
-    top: 0;\r
-    right: 0;\r
-    left: 0;\r
-    bottom: 0;\r
-    padding: 6px;\r
-    font-weight: bold;\r
-    font-size: 11px;\r
-    color: rgb(30%, 30%, 30%);\r
-}\r
-\r
-.resource-timing-view table {\r
-    border-spacing: 21px 0;\r
-}\r
-\r
-.resource-timing-view .network-timing-bar {\r
-    opacity: 1;\r
-}\r
-\r
-.resource-timing-view .network-timing-bar.proxy {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(239, 228, 176)), to(rgb(139, 128, 76)));\r
-    border-left: 1px solid rgb(139, 128, 76);\r
-}\r
-\r
-.resource-timing-view .network-timing-bar.dns {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(153, 208, 216)), to(rgb(81, 174, 189)));\r
-    border-left: 1px solid rgb(81, 174, 189);\r
-}\r
-\r
-.resource-timing-view .network-timing-bar.connecting {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(203, 232, 145)), to(rgb(160, 214, 56)));\r
-    border-left: 1px solid rgb(160, 214, 56);\r
-}\r
-\r
-.resource-timing-view .network-timing-bar.ssl {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(21, 232, 145)), to(rgb(216, 149, 132)));\r
-    border-left: 1px solid rgb(216, 149, 132);\r
-}\r
-\r
-.resource-timing-view .network-timing-bar.sending {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(232, 192, 182)), to(rgb(216, 147, 130)));\r
-    border-left: 1px solid rgb(216, 147, 130);\r
-}\r
-\r
-.resource-timing-view .network-timing-bar.waiting {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(188, 179, 208)), to(rgb(141, 125, 175)));\r
-    border-left: 1px solid rgb(141, 125, 175);\r
-}\r
-\r
-.resource-timing-view .network-timing-bar.receiving {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(214, 214, 214)), to(rgb(182, 182, 182)));\r
-    border-left: 1px solid rgb(182, 182, 182);\r
-}\r
-\r
-.resource-timing-view.visible {\r
-    display: block;\r
-}\r
-\r
-/* helpScreen.css */\r
-\r
-.help-window-outer {\r
-    position: absolute;\r
-    top: 60px;\r
-    left: 5%;\r
-    width: 90%;\r
-    bottom: 40px;\r
-    z-index: 2000;\r
-}\r
-\r
-body.attached .help-window-outer {\r
-    top: 32px;\r
-    left: 0;\r
-    width: 100%;\r
-    bottom: 24px;\r
-}\r
-\r
-.help-window-main {\r
-    max-height: 100%;\r
-    opacity: 0.85;\r
-    color: white;\r
-    background-color: black;\r
-    display: -webkit-box;\r
-    -webkit-box-orient: vertical;\r
-    border: 20px black solid;\r
-    border-top-width: 0;\r
-    border-radius: 8px;\r
-    -webkit-box-shadow: 10px 10px 8px rgba(40, 40, 40, 0.40);\r
-}\r
-\r
-body.attached .help-window-main {\r
-    border-width: 10px;\r
-    border-radius: 0;\r
-    -webkit-box-shadow: 0 0 0;\r
-}\r
-\r
-.help-window-caption {\r
-    margin: 8px;\r
-}\r
-\r
-body.attached .help-window-caption {\r
-    display: none;\r
-}\r
-\r
-.help-window-title {\r
-    border-bottom: solid 1px lightGrey;\r
-    font-size: 18px;\r
-    padding-bottom: 6px;\r
-}\r
-\r
-.help-content {\r
-    overflow-y: auto;\r
-    overflow-x: hidden;\r
-    scrollbar-width: 11px;\r
-    -webkit-box-flex: 1;\r
-}\r
-\r
-.help-content::-webkit-scrollbar {\r
-    width: 11px;\r
-}\r
-\r
-.help-content::-webkit-scrollbar-corner,\r
-.help-content::-webkit-resizer {\r
-    display: none;\r
-}\r
-\r
-.help-content::-webkit-scrollbar-thumb:vertical {\r
-    background: -webkit-gradient(linear, left top, right top, from(rgb(128, 128, 128)), to(rgb(128, 128, 128)), color-stop(40%, rgb(96, 96, 96)));\r
-    border-radius: 5px;\r
-    min-height: 20px;\r
-}\r
-\r
-.help-content::-webkit-scrollbar-thumb:vertical:hover,\r
-.help-content::-webkit-scrollbar-thumb:vertical:active {\r
-    background: -webkit-gradient(linear, left top, right top, from(rgb(176, 176, 176)), to(rgb(176, 176, 176)), color-stop(40%, rgb(144, 144, 144)));\r
-}\r
-\r
-.help-content::-webkit-scrollbar-track:vertical {\r
-    background: -webkit-gradient(linear, left top, right top, from(rgb(10, 10, 10)), to(rgb(32, 32, 32)), color-stop(25%, rgb(32, 32, 32)));\r
-    border-radius: 5px;\r
-}\r
-\r
-.help-close-button {\r
-    border: 0;\r
-    padding: 0;\r
-    margin: 0px -20px 15px -20px;\r
-    font-size: 14px;\r
-    color: rgb(222, 222, 222);\r
-    background: -webkit-gradient(radial, 30% 30%, 1, 50% 50%, 8, from(rgb(128, 128, 128)), to(rgb(80, 80, 80)));\r
-    border-radius: 8px;\r
-    height: 16px;\r
-    width: 16px;\r
-}\r
-\r
-.help-close-button:hover {\r
-    color: white;\r
-}\r
-\r
-body.platform-mac .help-close-button {\r
-    float: left;\r
-    margin-right: 10px;\r
-    font-size: 12px;\r
-}\r
-\r
-body:not(.platform-mac) .help-close-button {\r
-    float: right;\r
-}\r
-\r
-.help-table {\r
-    width: 100%;\r
-    font-size: 13px;\r
-    -webkit-user-select: auto;\r
-}\r
-\r
-.help-table th {\r
-    padding-top: 6px;\r
-    text-align: left;\r
-    color: yellow;\r
-}\r
-\r
-.help-table td {\r
-    white-space: nowrap;\r
-    vertical-align: top;\r
-}\r
-\r
-.help-key-cell {\r
-    text-align: right;\r
-}\r
-\r
-.help-key {\r
-    color: yellow;\r
-}\r
-\r
-body:not(.platform-mac) .help-key {\r
-    font-weight: bold;\r
-    text-shadow: black 1px 1px 7px;\r
-}\r
-\r
-body.platform-mac .help-key {\r
-    font-family: Lucida Grande, sans-serif;\r
-    font-size: 13px;\r
-}\r
-\r
-.help-combine-keys {\r
-    color: white;\r
-    font-weight: bold;\r
-    margin: 0 0.3em;\r
-    font-size: 12px;\r
-}\r
-\r
-.help-key-delimiter {\r
-    color: white;\r
-    margin: 0 0.5em;\r
-}\r
-\r
-/* popover.css */\r
-\r
-.popover {\r
-    position: absolute;\r
-    -webkit-border-image: url(Images/popoverBackground.png) 25 25 25 25;\r
-    border-width: 25px;\r
-    z-index: 100;\r
-    pointer-events: none;\r
-}\r
-\r
-.popover .content {\r
-    position: absolute;\r
-    top: 0;\r
-    bottom: 0;\r
-    left: 0;\r
-    right: 0;\r
-    pointer-events: auto;\r
-    overflow: auto;\r
-}\r
-\r
-.popover .arrow {\r
-    position: absolute;\r
-    background-image: url(Images/popoverArrows.png);\r
-    width: 19px;\r
-    height: 19px;\r
-    margin-left: 15px;\r
-    margin-top: -25px;\r
-    top: 0;\r
-    left: 0;\r
-}\r
-\r
-.popover.top-left-arrow .arrow {\r
-    /* The default is top-left, no styles needed. */\r
-}\r
-\r
-.popover.top-right-arrow .arrow {\r
-    right: 25px;\r
-    left: auto;\r
-}\r
-\r
-.popover.bottom-left-arrow .arrow {\r
-    top: auto;\r
-    bottom: 0;\r
-    margin-top: 0;\r
-    margin-bottom: -25px;\r
-    background-position: 0 -19px;\r
-}\r
-\r
-.popover.bottom-right-arrow .arrow {\r
-    right: 15px;\r
-    left: auto;\r
-    top: auto;\r
-    bottom: 0;\r
-    margin-top: 0;\r
-    margin-bottom: -25px;\r
-    background-position: 0 -19px;\r
-}\r
-\r
-.popover.left-top-arrow .arrow {\r
-    top: 0;\r
-    margin-top: 15px;\r
-    margin-left: -25px;\r
-    background-position: 0 -38px;\r
-}\r
-\r
-.popover.left-bottom-arrow .arrow {\r
-    top: auto;\r
-    bottom: 0;\r
-    margin-bottom: 15px;\r
-    margin-left: -25px;\r
-    background-position: 0 -38px;\r
-}\r
-\r
-.popover.right-top-arrow .arrow {\r
-    right: 0;\r
-    left: auto;\r
-    top: 0;\r
-    margin-top: 15px;\r
-    margin-right: -25px;\r
-    background-position: 0 -57px;\r
-}\r
-\r
-.popover.right-bottom-arrow .arrow {\r
-    right: 0;\r
-    left: auto;\r
-    top: auto;\r
-    bottom: 0;\r
-    margin-bottom: 15px;\r
-    margin-right: -25px;\r
-    background-position: 0 -57px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar {\r
-    width: 11px;\r
-    height: 11px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-corner {\r
-    display: none;\r
-}\r
-\r
-.popover ::-webkit-resizer {\r
-    display: none;\r
-}\r
-\r
-/* Horizontal Scrollbar Styles */\r
-\r
-.popover ::-webkit-scrollbar:horizontal:corner-present {\r
-    border-right-width: 0;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-thumb:horizontal {\r
-    -webkit-border-image: url(Images/thumbHoriz.png) 0 11 0 11;\r
-    border-color: transparent;\r
-    border-width: 0 11px;\r
-    min-width: 20px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-thumb:horizontal:hover {\r
-    -webkit-border-image: url(Images/thumbHoverHoriz.png) 0 11 0 11;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-thumb:horizontal:active {\r
-    -webkit-border-image: url(Images/thumbActiveHoriz.png) 0 11 0 11;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:horizontal:start {\r
-    margin-left: 5px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:horizontal:end {\r
-    margin-right: 5px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:horizontal:end:corner-present {\r
-    margin-right: 4px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:horizontal:decrement {\r
-    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;\r
-    border-color: transparent;\r
-    border-width: 0 0 0 11px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:horizontal:increment {\r
-    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;\r
-    border-color: transparent;\r
-    border-width: 0 11px 0 0;\r
-}\r
-\r
-/* Vertical Scrollbar Styles */\r
-\r
-\r
-.popover ::-webkit-scrollbar:vertical:corner-present {\r
-    border-bottom-width: 0;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-thumb:vertical {\r
-    -webkit-border-image: url(Images/thumbVert.png) 11 0 11 0;\r
-    border-color: transparent;\r
-    border-width: 11px 0;\r
-    min-height: 20px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-thumb:vertical:hover {\r
-    -webkit-border-image: url(Images/thumbHoverVert.png) 11 0 11 0;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-thumb:vertical:active {\r
-    -webkit-border-image: url(Images/thumbActiveVert.png) 11 0 11 0;\r
-}\r
-\r
-\r
-.popover ::-webkit-scrollbar-track-piece:vertical:start {\r
-    margin-top: 5px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:vertical:end {\r
-    margin-bottom: 5px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:vertical:end:corner-present {\r
-    margin-bottom: 4px;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:vertical:decrement {\r
-    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;\r
-    border-color: transparent;\r
-    border-width: 11px 0 0 0;\r
-}\r
-\r
-.popover ::-webkit-scrollbar-track-piece:vertical:increment {\r
-    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;\r
-    border-color: transparent;\r
-    border-width: 0 0 11px 0;\r
-}\r
-\r
-/* Forced Scrollbar Mode Styles */\r
-\r
-.popover ::-webkit-scrollbar-button {\r
-    display: none;\r
-}\r
-\r
-/* textViewer.css */\r
-\r
-.text-editor {\r
-    position: absolute;\r
-    top:0;\r
-    left:0;\r
-    right:0;\r
-    bottom:0;\r
-    white-space: pre;\r
-    overflow: auto;\r
-}\r
-\r
-.text-editor-lines {\r
-    border: 0;\r
-    -webkit-border-horizontal-spacing: 0;\r
-    -webkit-border-vertical-spacing: 0;\r
-    -webkit-user-select: text;\r
-}\r
-\r
-.webkit-html-message-bubble {\r
-    -webkit-box-shadow: black 0px 2px 5px;\r
-    -webkit-border-radius: 9px;\r
-    -webkit-border-fit: lines;\r
-    font-size: 10px;\r
-    font-family: Lucida Grande, sans-serif;\r
-    font-weight: bold;\r
-    margin: 6px 25px;\r
-    padding: 0 7px 1px;\r
-    z-index:20;\r
-}\r
-\r
-.webkit-html-warning-message {\r
-    background-color: rgb(100%, 62%, 42%);\r
-    border: 2px solid rgb(100%, 52%, 21%);\r
-}\r
-\r
-.webkit-html-error-message {\r
-    background-color: rgb(100%, 42%, 42%);\r
-    border: 2px solid rgb(100%, 31%, 31%);\r
-}\r
-\r
-.webkit-html-message-line {\r
-    padding-left: 23px;\r
-    text-indent: -20px;\r
-}\r
-\r
-.webkit-html-message-line-hover {\r
-    padding-left: 23px;\r
-    text-indent: -20px;\r
-    white-space: auto;\r
-    text-overflow: auto;\r
-    overflow: auto;\r
-}\r
-\r
-.webkit-html-message-icon {\r
-    position: relative;\r
-    top: 2px;\r
-    margin: 0 4px;\r
-}\r
-\r
-.webkit-line-number {\r
-    color: rgb(128, 128, 128);\r
-    background-color: rgb(240, 240, 240);\r
-    border-right: 1px solid rgb(187, 187, 187);\r
-    text-align: right;\r
-    vertical-align: top;\r
-    word-break: normal;\r
-    -webkit-user-select: none;\r
-    padding-right: 4px;\r
-    padding-left: 6px;\r
-}\r
-\r
-.webkit-line-number-outer {\r
-    margin-right: -4px;\r
-    margin-left: -4px;\r
-    border-color: transparent;\r
-    border-style: solid;\r
-    border-width: 0 0 0px 2px;\r
-    vertical-align: top;\r
-}\r
-\r
-.webkit-line-number-inner {\r
-    margin-right: 4px;\r
-}\r
-\r
-.webkit-breakpoint .webkit-line-number-inner, .webkit-breakpoint-conditional .webkit-line-number-inner, .webkit-execution-line .webkit-line-number-inner {\r
-    margin-right: -10px;\r
-}\r
-\r
-.webkit-line-content {\r
-    width: 100%;\r
-    padding-left: 2px;\r
-    vertical-align: top;\r
-}\r
-\r
-.webkit-breakpoint .webkit-line-number-outer {\r
-    color: white;\r
-    border-width: 0 14px 0px 2px;\r
-    -webkit-border-image: url(Images/breakpointBorder.png) 0 14 0 2;\r
-}\r
-\r
-.webkit-breakpoint-conditional .webkit-line-number-outer {\r
-    color: white;\r
-    border-width: 0 14px 0px 2px;\r
-    -webkit-border-image: url(Images/breakpointConditionalBorder.png) 0 14 0 2;\r
-}\r
-\r
-.webkit-execution-line .webkit-line-number-outer {\r
-    color: transparent;\r
-    border-width: 0 14px 0px 2px;\r
-    -webkit-border-image: url(Images/programCounterBorder.png) 0 14 0 2;\r
-}\r
-\r
-.webkit-breakpoint.webkit-execution-line .webkit-line-number-outer {\r
-    color: white;\r
-    -webkit-border-image: url(Images/breakpointCounterBorder.png) 0 14 0 2;\r
-}\r
-\r
-.webkit-breakpoint.webkit-execution-line .webkit-line-number-outer {\r
-    color: transparent;\r
-    -webkit-border-image: url(Images/breakpointCounterBorder.png) 0 14 0 2;\r
-}\r
-\r
-.webkit-breakpoint-conditional.webkit-execution-line .webkit-line-number-outer {\r
-    color: transparent;\r
-    -webkit-border-image: url(Images/breakpointConditionalCounterBorder.png) 0 14 0 2;\r
-}\r
-\r
-.webkit-breakpoint-disabled .webkit-line-number-outer {\r
-    opacity: 0.5;\r
-}\r
-\r
-.breakpoints-deactivated .webkit-breakpoint .webkit-line-number-outer {\r
-    opacity: 0.5;\r
-}\r
-\r
-.breakpoints-deactivated .webkit-breakpoint-disabled .webkit-line-number-outer {\r
-    opacity: 0.3;\r
-}\r
-\r
-.webkit-execution-line .webkit-line-content {\r
-    background-color: rgb(171, 191, 254);\r
-    outline: 1px solid rgb(64, 115, 244);\r
-}\r
-\r
-.diff-container .webkit-added-line .webkit-line-content {\r
-    background-color: rgb(220, 255, 220);\r
-}\r
-\r
-.diff-container .webkit-removed-line .webkit-line-content {\r
-    background-color: rgb(255, 220, 220);\r
-    text-decoration: line-through;\r
-}\r
-\r
-.diff-container .webkit-changed-line .webkit-line-content {\r
-    background-color: rgb(220, 220, 255);\r
-}\r
-\r
-.webkit-search-result {\r
-    -webkit-border-radius: 4px;\r
-    padding: 2px 2px 2px 3px;\r
-    margin: -2px -2px -2px -3px;\r
-    opacity: 0.8;\r
-    -webkit-box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;\r
-    background-color: rgb(241, 234, 0);\r
-    color: black;\r
-}\r
-\r
-.webkit-highlighted-line .webkit-line-content {\r
-    -webkit-animation: "fadeout" 2s 0s;\r
-}\r
-\r
-@-webkit-keyframes fadeout {\r
-    from {background-color: rgb(255, 255, 120); }\r
-    to { background-color: white; }\r
-}\r
-\r
-/* devTools.css */\r
-\r
-.data-grid table {\r
-    line-height: 120%;\r
-}\r
-\r
-body.attached #toolbar {\r
-    height: 34px;\r
-    border-top: 1px solid rgb(100, 100, 100);\r
-    cursor: default; /* overriden */\r
-    padding-left: 0;\r
-}\r
-\r
-/* Chrome theme overrides */\r
-\r
-body.platform-windows #toolbar, body.platform-windows.inactive #toolbar {\r
-    background-image: none;\r
-}\r
-\r
-body.detached.platform-mac-leopard #toolbar {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(175, 175, 175)), to(rgb(151, 151, 151))) !important;\r
-}\r
-\r
-body.detached.platform-mac-leopard.inactive #toolbar {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(221, 221, 221)), to(rgb(207, 207, 207))) !important;\r
-}\r
-\r
-body.detached.platform-mac-snowleopard #toolbar {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(189, 189, 189)), to(rgb(151, 151, 151))) !important;\r
-}\r
-\r
-body.detached.platform-mac-snowleopard.inactive #toolbar {\r
-    background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(215, 215, 215)), to(rgb(207, 207, 207))) !important;\r
-}\r
-\r
-body.platform-linux #scripts-files {\r
-    font-size: 11px;\r
-    font-weight: normal;\r
-    line-height: 12px;\r
-}\r
-\r
-.console-group-messages .section > .header {\r
-    padding: 0 8px 0 0;\r
-    background-image: none;\r
-    border: none;\r
-    min-height: 0;\r
-}\r
-\r
-#resources-filter {\r
-    background: -webkit-gradient(linear, left top, left bottom, from(rgb(233, 233, 233)), to(rgb(233, 233, 233)));\r
-}\r
-\r
-.crumbs .crumb {\r
-    -webkit-border-image: url(Images/segmentChromium.png) 0 12 0 2;\r
-    margin-right: -3px;\r
-    padding-left: 6px;\r
-}\r
-\r
-.crumbs .crumb.selected {\r
-    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;\r
-    color: white;\r
-    text-shadow: rgba(255, 255, 255, 0.5) 0 0px 0;\r
-}\r
-\r
-.crumbs .crumb.selected:hover {\r
-    -webkit-border-image: url(Images/segmentSelectedChromium.png) 0 12 0 2;\r
-}\r
-\r
-.crumbs .crumb.selected.end, .crumbs .crumb.selected.end:hover {\r
-    -webkit-border-image: url(Images/segmentSelectedEndChromium.png) 0 2 0 2;\r
-}\r
-\r
-.crumbs .crumb:hover {\r
-    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;\r
-}\r
-\r
-.crumbs .crumb.dimmed:hover {\r
-    -webkit-border-image: url(Images/segmentHoverChromium.png) 0 12 0 2;\r
-}\r
-\r
-.crumbs .crumb.end:hover {\r
-    -webkit-border-image: url(Images/segmentHoverEndChromium.png) 0 2 0 2;\r
-}\r
-\r
-body.drawer-visible #main-status-bar {\r
-    background-image: url(Images/statusbarResizerVertical.png), url(Images/statusbarBackgroundChromium.png);\r
-}\r
-\r
-.status-bar {\r
-    background-image: url(Images/statusbarBackgroundChromium.png);\r
-}\r
-\r
-button.status-bar-item {\r
-    background-image: url(Images/statusbarButtonsChromium.png);\r
-}\r
-\r
-select.status-bar-item:active {\r
-    -webkit-border-image: url(Images/statusbarMenuButtonSelectedChromium.png) 0 17 0 2;\r
-}\r
-\r
-#drawer {\r
-    background-image: url(Images/statusbarBottomBackgroundChromium.png);\r
-}\r
-\r
-select.status-bar-item {\r
-    -webkit-border-image: url(Images/statusbarMenuButtonChromium.png) 0 17 0 2;\r
-}\r
-\r
-.scope-bar li.selected {\r
-    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);\r
-}\r
-\r
-.scope-bar li:active {\r
-    -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.0);\r
-}\r
-\r
-.timeline-category-statusbar-item input {\r
-    vertical-align: middle;\r
-}\r
-\r
old mode 100755 (executable)
new mode 100644 (file)
index 7681ba0..c73eac2
@@ -1,52 +1,38 @@
-<!--\r
-Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions\r
-are met:\r
-\r
-1.  Redistributions of source code must retain the above copyright\r
-    notice, this list of conditions and the following disclaimer.\r
-2.  Redistributions in binary form must reproduce the above copyright\r
-    notice, this list of conditions and the following disclaimer in the\r
-    documentation and/or other materials provided with the distribution.\r
-3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of\r
-    its contributors may be used to endorse or promote products derived\r
-    from this software without specific prior written permission.\r
-\r
-THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY\r
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\r
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
--->\r
-<!DOCTYPE html>\r
-<html>\r
-<head>\r
-    <meta http-equiv="content-type" content="text/html; charset=utf-8">\r
-    <link rel="stylesheet" type="text/css" href="devTools.css">\r
-    <script type="text/javascript" src="DevTools.js"></script>\r
-</head>\r
-<body class="detached">\r
-    <div id="toolbar">\r
-        <div class="toolbar-item close-left"><button id="close-button-left"></button></div>\r
-        <div class="toolbar-item flexable-space"></div>\r
-        <div class="toolbar-item hidden" id="search-results-matches"></div>\r
-        <div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>\r
-        <div class="toolbar-item close-right"><button id="close-button-right"></button></div>\r
-    </div>\r
-    <div id="main">\r
-        <div id="main-panels" spellcheck="false"></div>\r
-        <div id="main-status-bar" class="status-bar"><div id="anchored-status-bar-items"><button id="dock-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="console-status-bar-item" class="status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><button id="changes-status-bar-item" class="status-bar-item hidden"></button><div id="counters"><div id="changes-count" class="hidden"></div><div id="error-warning-count" class="hidden"></div></div></div></div>\r
-    </div>\r
-    <div id="drawer">\r
-        <div id="console-view"><div id="console-messages" class="monospace"><div id="console-prompt" spellcheck="false"><br></div></div></div>\r
-        <div id="drawer-status-bar" class="status-bar"><div id="other-drawer-status-bar-items"><button id="clear-console-status-bar-item" class="status-bar-item clear-status-bar-item"><div class="glyph"></div><div class="glyph shadow"></div></button><div id="console-filter" class="scope-bar status-bar-item"></div></div></div>\r
-    </div>\r
-</body>\r
-</html>\r
+<!--
+Copyright (C) 2006, 2007, 2008 Apple 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 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.
+-->
+<!doctype html>
+<html>
+<head>
+    <script type="text/javascript" src="buildSystemOnly.js"></script>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval'">
+    <link rel="stylesheet" type="text/css" href="inspector.css">
+    <script type="text/javascript" src="Main.js"></script>
+</head>
+<body class="undocked" id="-blink-dev-tools"></body>
+</html>
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/devtools_extension_api.js b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/devtools_extension_api.js
new file mode 100644 (file)
index 0000000..60f01d2
--- /dev/null
@@ -0,0 +1,1065 @@
+(function() {
+    /*
+ * 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:
+ *
+ *     * 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.
+ */
+
+function defineCommonExtensionSymbols(apiPrivate)
+{
+    if (!apiPrivate.audits)
+        apiPrivate.audits = {};
+    apiPrivate.audits.Severity = {
+        Info: "info",
+        Warning: "warning",
+        Severe: "severe"
+    };
+
+    if (!apiPrivate.console)
+        apiPrivate.console = {};
+    apiPrivate.console.Severity = {
+        Debug: "debug",
+        Log: "log",
+        Warning: "warning",
+        Error: "error"
+    };
+
+    if (!apiPrivate.panels)
+        apiPrivate.panels = {};
+    apiPrivate.panels.SearchAction = {
+        CancelSearch: "cancelSearch",
+        PerformSearch: "performSearch",
+        NextSearchResult: "nextSearchResult",
+        PreviousSearchResult: "previousSearchResult"
+    };
+
+    apiPrivate.Events = {
+        AuditStarted: "audit-started-",
+        ButtonClicked: "button-clicked-",
+        ConsoleMessageAdded: "console-message-added",
+        PanelObjectSelected: "panel-objectSelected-",
+        NetworkRequestFinished: "network-request-finished",
+        OpenResource: "open-resource",
+        PanelSearch: "panel-search-",
+        ResourceAdded: "resource-added",
+        ResourceContentCommitted: "resource-content-committed",
+        TimelineEventRecorded: "timeline-event-recorded",
+        ViewShown: "view-shown-",
+        ViewHidden: "view-hidden-"
+    };
+
+    apiPrivate.Commands = {
+        AddAuditCategory: "addAuditCategory",
+        AddAuditResult: "addAuditResult",
+        AddConsoleMessage: "addConsoleMessage",
+        AddRequestHeaders: "addRequestHeaders",
+        ApplyStyleSheet: "applyStyleSheet",
+        CreatePanel: "createPanel",
+        CreateSidebarPane: "createSidebarPane",
+        CreateStatusBarButton: "createStatusBarButton",
+        EvaluateOnInspectedPage: "evaluateOnInspectedPage",
+        ForwardKeyboardEvent: "_forwardKeyboardEvent",
+        GetConsoleMessages: "getConsoleMessages",
+        GetHAR: "getHAR",
+        GetPageResources: "getPageResources",
+        GetRequestContent: "getRequestContent",
+        GetResourceContent: "getResourceContent",
+        InspectedURLChanged: "inspectedURLChanged",
+        OpenResource: "openResource",
+        Reload: "Reload",
+        Subscribe: "subscribe",
+        SetOpenResourceHandler: "setOpenResourceHandler",
+        SetResourceContent: "setResourceContent",
+        SetSidebarContent: "setSidebarContent",
+        SetSidebarHeight: "setSidebarHeight",
+        SetSidebarPage: "setSidebarPage",
+        ShowPanel: "showPanel",
+        StopAuditCategoryRun: "stopAuditCategoryRun",
+        Unsubscribe: "unsubscribe",
+        UpdateAuditProgress: "updateAuditProgress",
+        UpdateButton: "updateButton"
+    };
+}
+
+/**
+ * @param {number} injectedScriptId
+ * @return {!Object}
+ */
+function injectedExtensionAPI(injectedScriptId)
+{
+
+var apiPrivate = {};
+
+defineCommonExtensionSymbols(apiPrivate);
+
+var commands = apiPrivate.Commands;
+var events = apiPrivate.Events;
+var userAction = false;
+
+// Here and below, all constructors are private to API implementation.
+// For a public type Foo, if internal fields are present, these are on
+// a private FooImpl type, an instance of FooImpl is used in a closure
+// by Foo consutrctor to re-bind publicly exported members to an instance
+// of Foo.
+
+/**
+ * @constructor
+ */
+function EventSinkImpl(type, customDispatch)
+{
+    this._type = type;
+    this._listeners = [];
+    this._customDispatch = customDispatch;
+}
+
+EventSinkImpl.prototype = {
+    addListener: function(callback)
+    {
+        if (typeof callback !== "function")
+            throw "addListener: callback is not a function";
+        if (this._listeners.length === 0)
+            extensionServer.sendRequest({ command: commands.Subscribe, type: this._type });
+        this._listeners.push(callback);
+        extensionServer.registerHandler("notify-" + this._type, this._dispatch.bind(this));
+    },
+
+    removeListener: function(callback)
+    {
+        var listeners = this._listeners;
+
+        for (var i = 0; i < listeners.length; ++i) {
+            if (listeners[i] === callback) {
+                listeners.splice(i, 1);
+                break;
+            }
+        }
+        if (this._listeners.length === 0)
+            extensionServer.sendRequest({ command: commands.Unsubscribe, type: this._type });
+    },
+
+    /**
+     * @param {...} vararg
+     */
+    _fire: function(vararg)
+    {
+        var listeners = this._listeners.slice();
+        for (var i = 0; i < listeners.length; ++i)
+            listeners[i].apply(null, arguments);
+    },
+
+    _dispatch: function(request)
+    {
+         if (this._customDispatch)
+             this._customDispatch.call(this, request);
+         else
+             this._fire.apply(this, request.arguments);
+    }
+}
+
+/**
+ * @constructor
+ */
+function InspectorExtensionAPI()
+{
+    this.audits = new Audits();
+    this.inspectedWindow = new InspectedWindow();
+    this.panels = new Panels();
+    this.network = new Network();
+    defineDeprecatedProperty(this, "webInspector", "resources", "network");
+    this.timeline = new Timeline();
+    this.console = new ConsoleAPI();
+}
+
+/**
+ * @constructor
+ */
+function ConsoleAPI()
+{
+    this.onMessageAdded = new EventSink(events.ConsoleMessageAdded);
+}
+
+ConsoleAPI.prototype = {
+    getMessages: function(callback)
+    {
+        extensionServer.sendRequest({ command: commands.GetConsoleMessages }, callback);
+    },
+
+    addMessage: function(severity, text, url, line)
+    {
+        extensionServer.sendRequest({ command: commands.AddConsoleMessage, severity: severity, text: text, url: url, line: line });
+    },
+
+    get Severity()
+    {
+        return apiPrivate.console.Severity;
+    }
+}
+
+/**
+ * @constructor
+ */
+function Network()
+{
+    /**
+     * @this {EventSinkImpl}
+     */
+    function dispatchRequestEvent(message)
+    {
+        var request = message.arguments[1];
+        request.__proto__ = new Request(message.arguments[0]);
+        this._fire(request);
+    }
+    this.onRequestFinished = new EventSink(events.NetworkRequestFinished, dispatchRequestEvent);
+    defineDeprecatedProperty(this, "network", "onFinished", "onRequestFinished");
+    this.onNavigated = new EventSink(events.InspectedURLChanged);
+}
+
+Network.prototype = {
+    getHAR: function(callback)
+    {
+        function callbackWrapper(result)
+        {
+            var entries = (result && result.entries) || [];
+            for (var i = 0; i < entries.length; ++i) {
+                entries[i].__proto__ = new Request(entries[i]._requestId);
+                delete entries[i]._requestId;
+            }
+            callback(result);
+        }
+        extensionServer.sendRequest({ command: commands.GetHAR }, callback && callbackWrapper);
+    },
+
+    addRequestHeaders: function(headers)
+    {
+        extensionServer.sendRequest({ command: commands.AddRequestHeaders, headers: headers, extensionId: window.location.hostname });
+    }
+}
+
+/**
+ * @constructor
+ */
+function RequestImpl(id)
+{
+    this._id = id;
+}
+
+RequestImpl.prototype = {
+    getContent: function(callback)
+    {
+        function callbackWrapper(response)
+        {
+            callback(response.content, response.encoding);
+        }
+        extensionServer.sendRequest({ command: commands.GetRequestContent, id: this._id }, callback && callbackWrapper);
+    }
+}
+
+/**
+ * @constructor
+ */
+function Panels()
+{
+    var panels = {
+        elements: new ElementsPanel(),
+        sources: new SourcesPanel(),
+    };
+
+    function panelGetter(name)
+    {
+        return panels[name];
+    }
+    for (var panel in panels)
+        this.__defineGetter__(panel, panelGetter.bind(null, panel));
+    this.applyStyleSheet = function(styleSheet) { extensionServer.sendRequest({ command: commands.ApplyStyleSheet, styleSheet: styleSheet }); };
+}
+
+Panels.prototype = {
+    create: function(title, icon, page, callback)
+    {
+        var id = "extension-panel-" + extensionServer.nextObjectId();
+        var request = {
+            command: commands.CreatePanel,
+            id: id,
+            title: title,
+            icon: icon,
+            page: page
+        };
+        extensionServer.sendRequest(request, callback && callback.bind(this, new ExtensionPanel(id)));
+    },
+
+    setOpenResourceHandler: function(callback)
+    {
+        var hadHandler = extensionServer.hasHandler(events.OpenResource);
+
+        function callbackWrapper(message)
+        {
+            // Allow the panel to show itself when handling the event.
+            userAction = true;
+            try {
+                callback.call(null, new Resource(message.resource), message.lineNumber);
+            } finally {
+                userAction = false;
+            }
+        }
+
+        if (!callback)
+            extensionServer.unregisterHandler(events.OpenResource);
+        else
+            extensionServer.registerHandler(events.OpenResource, callbackWrapper);
+
+        // Only send command if we either removed an existing handler or added handler and had none before.
+        if (hadHandler === !callback)
+            extensionServer.sendRequest({ command: commands.SetOpenResourceHandler, "handlerPresent": !!callback });
+    },
+
+    openResource: function(url, lineNumber, callback)
+    {
+        extensionServer.sendRequest({ command: commands.OpenResource, "url": url, "lineNumber": lineNumber }, callback);
+    },
+
+    get SearchAction()
+    {
+        return apiPrivate.panels.SearchAction;
+    }
+}
+
+/**
+ * @constructor
+ */
+function ExtensionViewImpl(id)
+{
+    this._id = id;
+
+    /**
+     * @this {EventSinkImpl}
+     */
+    function dispatchShowEvent(message)
+    {
+        var frameIndex = message.arguments[0];
+        if (typeof frameIndex === "number")
+            this._fire(window.parent.frames[frameIndex]);
+        else
+            this._fire();
+    }
+
+    if (id) {
+        this.onShown = new EventSink(events.ViewShown + id, dispatchShowEvent);
+        this.onHidden = new EventSink(events.ViewHidden + id);
+    }
+}
+
+/**
+ * @constructor
+ * @extends {ExtensionViewImpl}
+ * @param {string} hostPanelName
+ */
+function PanelWithSidebarImpl(hostPanelName)
+{
+    ExtensionViewImpl.call(this, null);
+    this._hostPanelName = hostPanelName;
+    this.onSelectionChanged = new EventSink(events.PanelObjectSelected + hostPanelName);
+}
+
+PanelWithSidebarImpl.prototype = {
+    createSidebarPane: function(title, callback)
+    {
+        var id = "extension-sidebar-" + extensionServer.nextObjectId();
+        var request = {
+            command: commands.CreateSidebarPane,
+            panel: this._hostPanelName,
+            id: id,
+            title: title
+        };
+        function callbackWrapper()
+        {
+            callback(new ExtensionSidebarPane(id));
+        }
+        extensionServer.sendRequest(request, callback && callbackWrapper);
+    },
+
+    __proto__: ExtensionViewImpl.prototype
+}
+
+function declareInterfaceClass(implConstructor)
+{
+    return function()
+    {
+        var impl = { __proto__: implConstructor.prototype };
+        implConstructor.apply(impl, arguments);
+        populateInterfaceClass(this, impl);
+    }
+}
+
+function defineDeprecatedProperty(object, className, oldName, newName)
+{
+    var warningGiven = false;
+    function getter()
+    {
+        if (!warningGiven) {
+            console.warn(className + "." + oldName + " is deprecated. Use " + className + "." + newName + " instead");
+            warningGiven = true;
+        }
+        return object[newName];
+    }
+    object.__defineGetter__(oldName, getter);
+}
+
+function extractCallbackArgument(args)
+{
+    var lastArgument = args[args.length - 1];
+    return typeof lastArgument === "function" ? lastArgument : undefined;
+}
+
+var AuditCategory = declareInterfaceClass(AuditCategoryImpl);
+var AuditResult = declareInterfaceClass(AuditResultImpl);
+var Button = declareInterfaceClass(ButtonImpl);
+var EventSink = declareInterfaceClass(EventSinkImpl);
+var ExtensionPanel = declareInterfaceClass(ExtensionPanelImpl);
+var ExtensionSidebarPane = declareInterfaceClass(ExtensionSidebarPaneImpl);
+var PanelWithSidebar = declareInterfaceClass(PanelWithSidebarImpl);
+var Request = declareInterfaceClass(RequestImpl);
+var Resource = declareInterfaceClass(ResourceImpl);
+var Timeline = declareInterfaceClass(TimelineImpl);
+
+/**
+ * @constructor
+ * @extends {PanelWithSidebar}
+ */
+function ElementsPanel()
+{
+    PanelWithSidebar.call(this, "elements");
+}
+
+ElementsPanel.prototype = {
+    __proto__: PanelWithSidebar.prototype
+}
+
+/**
+ * @constructor
+ * @extends {PanelWithSidebar}
+ */
+function SourcesPanel()
+{
+    PanelWithSidebar.call(this, "sources");
+}
+
+SourcesPanel.prototype = {
+    __proto__: PanelWithSidebar.prototype
+}
+
+/**
+ * @constructor
+ * @extends {ExtensionViewImpl}
+ */
+function ExtensionPanelImpl(id)
+{
+    ExtensionViewImpl.call(this, id);
+    this.onSearch = new EventSink(events.PanelSearch + id);
+}
+
+ExtensionPanelImpl.prototype = {
+    /**
+     * @return {!Object}
+     */
+    createStatusBarButton: function(iconPath, tooltipText, disabled)
+    {
+        var id = "button-" + extensionServer.nextObjectId();
+        var request = {
+            command: commands.CreateStatusBarButton,
+            panel: this._id,
+            id: id,
+            icon: iconPath,
+            tooltip: tooltipText,
+            disabled: !!disabled
+        };
+        extensionServer.sendRequest(request);
+        return new Button(id);
+    },
+
+    show: function()
+    {
+        if (!userAction)
+            return;
+
+        var request = {
+            command: commands.ShowPanel,
+            id: this._id
+        };
+        extensionServer.sendRequest(request);
+    },
+
+    __proto__: ExtensionViewImpl.prototype
+}
+
+/**
+ * @constructor
+ * @extends {ExtensionViewImpl}
+ */
+function ExtensionSidebarPaneImpl(id)
+{
+    ExtensionViewImpl.call(this, id);
+}
+
+ExtensionSidebarPaneImpl.prototype = {
+    setHeight: function(height)
+    {
+        extensionServer.sendRequest({ command: commands.SetSidebarHeight, id: this._id, height: height });
+    },
+
+    setExpression: function(expression, rootTitle, evaluateOptions)
+    {
+        var request = {
+            command: commands.SetSidebarContent,
+            id: this._id,
+            expression: expression,
+            rootTitle: rootTitle,
+            evaluateOnPage: true,
+        };
+        if (typeof evaluateOptions === "object")
+            request.evaluateOptions = evaluateOptions;
+        extensionServer.sendRequest(request, extractCallbackArgument(arguments));
+    },
+
+    setObject: function(jsonObject, rootTitle, callback)
+    {
+        extensionServer.sendRequest({ command: commands.SetSidebarContent, id: this._id, expression: jsonObject, rootTitle: rootTitle }, callback);
+    },
+
+    setPage: function(page)
+    {
+        extensionServer.sendRequest({ command: commands.SetSidebarPage, id: this._id, page: page });
+    },
+
+    __proto__: ExtensionViewImpl.prototype
+}
+
+/**
+ * @constructor
+ */
+function ButtonImpl(id)
+{
+    this._id = id;
+    this.onClicked = new EventSink(events.ButtonClicked + id);
+}
+
+ButtonImpl.prototype = {
+    update: function(iconPath, tooltipText, disabled)
+    {
+        var request = {
+            command: commands.UpdateButton,
+            id: this._id,
+            icon: iconPath,
+            tooltip: tooltipText,
+            disabled: !!disabled
+        };
+        extensionServer.sendRequest(request);
+    }
+};
+
+/**
+ * @constructor
+ */
+function Audits()
+{
+}
+
+Audits.prototype = {
+    /**
+     * @return {!AuditCategory}
+     */
+    addCategory: function(displayName, resultCount)
+    {
+        var id = "extension-audit-category-" + extensionServer.nextObjectId();
+        if (typeof resultCount !== "undefined")
+            console.warn("Passing resultCount to audits.addCategory() is deprecated. Use AuditResult.updateProgress() instead.");
+        extensionServer.sendRequest({ command: commands.AddAuditCategory, id: id, displayName: displayName, resultCount: resultCount });
+        return new AuditCategory(id);
+    }
+}
+
+/**
+ * @constructor
+ */
+function AuditCategoryImpl(id)
+{
+    /**
+     * @this {EventSinkImpl}
+     */
+    function dispatchAuditEvent(request)
+    {
+        var auditResult = new AuditResult(request.arguments[0]);
+        try {
+            this._fire(auditResult);
+        } catch (e) {
+            console.error("Uncaught exception in extension audit event handler: " + e);
+            auditResult.done();
+        }
+    }
+    this._id = id;
+    this.onAuditStarted = new EventSink(events.AuditStarted + id, dispatchAuditEvent);
+}
+
+/**
+ * @constructor
+ */
+function AuditResultImpl(id)
+{
+    this._id = id;
+
+    this.createURL = this._nodeFactory.bind(this, "url");
+    this.createSnippet = this._nodeFactory.bind(this, "snippet");
+    this.createText = this._nodeFactory.bind(this, "text");
+    this.createObject = this._nodeFactory.bind(this, "object");
+    this.createNode = this._nodeFactory.bind(this, "node");
+}
+
+AuditResultImpl.prototype = {
+    addResult: function(displayName, description, severity, details)
+    {
+        // shorthand for specifying details directly in addResult().
+        if (details && !(details instanceof AuditResultNode))
+            details = new AuditResultNode(details instanceof Array ? details : [details]);
+
+        var request = {
+            command: commands.AddAuditResult,
+            resultId: this._id,
+            displayName: displayName,
+            description: description,
+            severity: severity,
+            details: details
+        };
+        extensionServer.sendRequest(request);
+    },
+
+    /**
+     * @return {!Object}
+     */
+    createResult: function()
+    {
+        return new AuditResultNode(Array.prototype.slice.call(arguments));
+    },
+
+    updateProgress: function(worked, totalWork)
+    {
+        extensionServer.sendRequest({ command: commands.UpdateAuditProgress, resultId: this._id, progress: worked / totalWork });
+    },
+
+    done: function()
+    {
+        extensionServer.sendRequest({ command: commands.StopAuditCategoryRun, resultId: this._id });
+    },
+
+    /**
+     * @type {!Object.<string, string>}
+     */
+    get Severity()
+    {
+        return apiPrivate.audits.Severity;
+    },
+
+    /**
+     * @return {!{type: string, arguments: !Array.<string|number>}}
+     */
+    createResourceLink: function(url, lineNumber)
+    {
+        return {
+            type: "resourceLink",
+            arguments: [url, lineNumber && lineNumber - 1]
+        };
+    },
+
+    /**
+     * @return {!{type: string, arguments: !Array.<string|number>}}
+     */
+    _nodeFactory: function(type)
+    {
+        return {
+            type: type,
+            arguments: Array.prototype.slice.call(arguments, 1)
+        };
+    }
+}
+
+/**
+ * @constructor
+ */
+function AuditResultNode(contents)
+{
+    this.contents = contents;
+    this.children = [];
+    this.expanded = false;
+}
+
+AuditResultNode.prototype = {
+    /**
+     * @return {!Object}
+     */
+    addChild: function()
+    {
+        var node = new AuditResultNode(Array.prototype.slice.call(arguments));
+        this.children.push(node);
+        return node;
+    }
+};
+
+/**
+ * @constructor
+ */
+function InspectedWindow()
+{
+    /**
+     * @this {EventSinkImpl}
+     */
+    function dispatchResourceEvent(message)
+    {
+        this._fire(new Resource(message.arguments[0]));
+    }
+
+    /**
+     * @this {EventSinkImpl}
+     */
+    function dispatchResourceContentEvent(message)
+    {
+        this._fire(new Resource(message.arguments[0]), message.arguments[1]);
+    }
+
+    this.onResourceAdded = new EventSink(events.ResourceAdded, dispatchResourceEvent);
+    this.onResourceContentCommitted = new EventSink(events.ResourceContentCommitted, dispatchResourceContentEvent);
+}
+
+InspectedWindow.prototype = {
+    reload: function(optionsOrUserAgent)
+    {
+        var options = null;
+        if (typeof optionsOrUserAgent === "object")
+            options = optionsOrUserAgent;
+        else if (typeof optionsOrUserAgent === "string") {
+            options = { userAgent: optionsOrUserAgent };
+            console.warn("Passing userAgent as string parameter to inspectedWindow.reload() is deprecated. " +
+                         "Use inspectedWindow.reload({ userAgent: value}) instead.");
+        }
+        extensionServer.sendRequest({ command: commands.Reload, options: options });
+    },
+
+    /**
+     * @return {?Object}
+     */
+    eval: function(expression, evaluateOptions)
+    {
+        var callback = extractCallbackArgument(arguments);
+        function callbackWrapper(result)
+        {
+            if (result.isError || result.isException)
+                callback(undefined, result);
+            else
+                callback(result.value);
+        }
+        var request = {
+            command: commands.EvaluateOnInspectedPage,
+            expression: expression
+        };
+        if (typeof evaluateOptions === "object")
+            request.evaluateOptions = evaluateOptions;
+        extensionServer.sendRequest(request, callback && callbackWrapper);
+        return null;
+    },
+
+    getResources: function(callback)
+    {
+        function wrapResource(resourceData)
+        {
+            return new Resource(resourceData);
+        }
+        function callbackWrapper(resources)
+        {
+            callback(resources.map(wrapResource));
+        }
+        extensionServer.sendRequest({ command: commands.GetPageResources }, callback && callbackWrapper);
+    }
+}
+
+/**
+ * @constructor
+ */
+function ResourceImpl(resourceData)
+{
+    this._url = resourceData.url
+    this._type = resourceData.type;
+}
+
+ResourceImpl.prototype = {
+    get url()
+    {
+        return this._url;
+    },
+
+    get type()
+    {
+        return this._type;
+    },
+
+    getContent: function(callback)
+    {
+        function callbackWrapper(response)
+        {
+            callback(response.content, response.encoding);
+        }
+
+        extensionServer.sendRequest({ command: commands.GetResourceContent, url: this._url }, callback && callbackWrapper);
+    },
+
+    setContent: function(content, commit, callback)
+    {
+        extensionServer.sendRequest({ command: commands.SetResourceContent, url: this._url, content: content, commit: commit }, callback);
+    }
+}
+
+/**
+ * @constructor
+ */
+function TimelineImpl()
+{
+    this.onEventRecorded = new EventSink(events.TimelineEventRecorded);
+}
+
+var keyboardEventRequestQueue = [];
+var forwardTimer = null;
+
+function forwardKeyboardEvent(event)
+{
+    const Esc = "U+001B";
+    // We only care about global hotkeys, not about random text
+    if (!event.ctrlKey && !event.altKey && !event.metaKey && !/^F\d+$/.test(event.keyIdentifier) && event.keyIdentifier !== Esc)
+        return;
+    var requestPayload = {
+        eventType: event.type,
+        ctrlKey: event.ctrlKey,
+        altKey: event.altKey,
+        metaKey: event.metaKey,
+        keyIdentifier: event.keyIdentifier,
+        location: event.location,
+        keyCode: event.keyCode
+    };
+    keyboardEventRequestQueue.push(requestPayload);
+    if (!forwardTimer)
+        forwardTimer = setTimeout(forwardEventQueue, 0);
+}
+
+function forwardEventQueue()
+{
+    forwardTimer = null;
+    var request = {
+        command: commands.ForwardKeyboardEvent,
+        entries: keyboardEventRequestQueue
+    };
+    extensionServer.sendRequest(request);
+    keyboardEventRequestQueue = [];
+}
+
+document.addEventListener("keydown", forwardKeyboardEvent, false);
+document.addEventListener("keypress", forwardKeyboardEvent, false);
+
+/**
+ * @constructor
+ */
+function ExtensionServerClient()
+{
+    this._callbacks = {};
+    this._handlers = {};
+    this._lastRequestId = 0;
+    this._lastObjectId = 0;
+
+    this.registerHandler("callback", this._onCallback.bind(this));
+
+    var channel = new MessageChannel();
+    this._port = channel.port1;
+    this._port.addEventListener("message", this._onMessage.bind(this), false);
+    this._port.start();
+
+    window.parent.postMessage("registerExtension", [ channel.port2 ], "*");
+}
+
+ExtensionServerClient.prototype = {
+    /**
+     * @param {function()=} callback
+     */
+    sendRequest: function(message, callback)
+    {
+        if (typeof callback === "function")
+            message.requestId = this._registerCallback(callback);
+        this._port.postMessage(message);
+    },
+
+    /**
+     * @return {boolean}
+     */
+    hasHandler: function(command)
+    {
+        return !!this._handlers[command];
+    },
+
+    registerHandler: function(command, handler)
+    {
+        this._handlers[command] = handler;
+    },
+
+    unregisterHandler: function(command)
+    {
+        delete this._handlers[command];
+    },
+
+    /**
+     * @return {string}
+     */
+    nextObjectId: function()
+    {
+        return injectedScriptId + "_" + ++this._lastObjectId;
+    },
+
+    _registerCallback: function(callback)
+    {
+        var id = ++this._lastRequestId;
+        this._callbacks[id] = callback;
+        return id;
+    },
+
+    _onCallback: function(request)
+    {
+        if (request.requestId in this._callbacks) {
+            var callback = this._callbacks[request.requestId];
+            delete this._callbacks[request.requestId];
+            callback(request.result);
+        }
+    },
+
+    _onMessage: function(event)
+    {
+        var request = event.data;
+        var handler = this._handlers[request.command];
+        if (handler)
+            handler.call(this, request);
+    }
+}
+
+function populateInterfaceClass(interface, implementation)
+{
+    for (var member in implementation) {
+        if (member.charAt(0) === "_")
+            continue;
+        var descriptor = null;
+        // Traverse prototype chain until we find the owner.
+        for (var owner = implementation; owner && !descriptor; owner = owner.__proto__)
+            descriptor = Object.getOwnPropertyDescriptor(owner, member);
+        if (!descriptor)
+            continue;
+        if (typeof descriptor.value === "function")
+            interface[member] = descriptor.value.bind(implementation);
+        else if (typeof descriptor.get === "function")
+            interface.__defineGetter__(member, descriptor.get.bind(implementation));
+        else
+            Object.defineProperty(interface, member, descriptor);
+    }
+}
+
+// extensionServer is a closure variable defined by the glue below -- make sure we fail if it's not there.
+if (!extensionServer)
+    extensionServer = new ExtensionServerClient();
+
+return new InspectorExtensionAPI();
+}
+
+/**
+ * @suppress {checkVars, checkTypes}
+ */
+function platformExtensionAPI(coreAPI)
+{
+    function getTabId()
+    {
+        return tabId;
+    }
+    chrome = window.chrome || {};
+    // Override chrome.devtools as a workaround for a error-throwing getter being exposed
+    // in extension pages loaded into a non-extension process (only happens for remote client
+    // extensions)
+    var devtools_descriptor = Object.getOwnPropertyDescriptor(chrome, "devtools");
+    if (!devtools_descriptor || devtools_descriptor.get)
+        Object.defineProperty(chrome, "devtools", { value: {}, enumerable: true });
+    // Only expose tabId on chrome.devtools.inspectedWindow, not webInspector.inspectedWindow.
+    chrome.devtools.inspectedWindow = {};
+    chrome.devtools.inspectedWindow.__defineGetter__("tabId", getTabId);
+    chrome.devtools.inspectedWindow.__proto__ = coreAPI.inspectedWindow;
+    chrome.devtools.network = coreAPI.network;
+    chrome.devtools.panels = coreAPI.panels;
+
+    // default to expose experimental APIs for now.
+    if (extensionInfo.exposeExperimentalAPIs !== false) {
+        chrome.experimental = chrome.experimental || {};
+        chrome.experimental.devtools = chrome.experimental.devtools || {};
+
+        var properties = Object.getOwnPropertyNames(coreAPI);
+        for (var i = 0; i < properties.length; ++i) {
+            var descriptor = Object.getOwnPropertyDescriptor(coreAPI, properties[i]);
+            Object.defineProperty(chrome.experimental.devtools, properties[i], descriptor);
+        }
+        chrome.experimental.devtools.inspectedWindow = chrome.devtools.inspectedWindow;
+    }
+    if (extensionInfo.exposeWebInspectorNamespace)
+        window.webInspector = coreAPI;
+}
+
+/**
+ * @param {!ExtensionDescriptor} extensionInfo
+ * @return {string}
+ */
+function buildPlatformExtensionAPI(extensionInfo)
+{
+    return "var extensionInfo = " + JSON.stringify(extensionInfo) + ";" +
+       "var tabId = " + WebInspector._inspectedTabId + ";" +
+       platformExtensionAPI.toString();
+}
+
+/**
+ * @param {!ExtensionDescriptor} extensionInfo
+ * @return {string}
+ */
+function buildExtensionAPIInjectedScript(extensionInfo)
+{
+    return "(function(injectedScriptId){ " +
+        "var extensionServer;" +
+        defineCommonExtensionSymbols.toString() + ";" +
+        injectedExtensionAPI.toString() + ";" +
+        buildPlatformExtensionAPI(extensionInfo) + ";" +
+        "platformExtensionAPI(injectedExtensionAPI(injectedScriptId));" +
+        "return {};" +
+        "})";
+}
+
+        var tabId;
+        var extensionInfo = {};
+        var extensionServer;
+        platformExtensionAPI(injectedExtensionAPI("remote-" + window.parent.frames.length));
+    })();
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/elementsPanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/elementsPanel.css
new file mode 100644 (file)
index 0000000..767d39d
--- /dev/null
@@ -0,0 +1,736 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+#elements-content {
+    flex: 1 1;
+    overflow: auto;
+    padding-left: 0;
+    -webkit-transform: translateZ(0);
+}
+
+#elements-crumbs {
+    flex: 0 0 19px;
+    background-color: white;
+    border-top: 1px solid #ccc;
+    overflow: hidden;
+    height: 19px;
+    width: 100%;
+}
+
+#elements-content > ol {
+    display: inline-block;
+    min-height: 100%;
+    -webkit-transform: translateZ(0);
+}
+
+#elements-content .editing {
+    margin-left: 8px;
+}
+
+#elements-content .elements-gutter-decoration {
+    position: absolute;
+    left: 1px;
+    margin-top: 2px;
+    height: 8px;
+    width: 8px;
+    border-radius: 4px;
+    border: 1px solid orange;
+    background-color: orange;
+}
+
+#elements-content .elements-gutter-decoration.elements-has-decorated-children {
+    opacity: 0.5;
+}
+
+#elements-content .CodeMirror {
+    /* Consistent with the .editing class in inspector.css */
+    box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
+    outline: 1px solid rgb(66%, 66%, 66%) !important;
+    background-color: white;
+}
+
+#elements-content .CodeMirror pre {
+    padding: 0;
+}
+
+#elements-content .CodeMirror-lines {
+    padding: 0;
+}
+
+.elements-tree-editor {
+    -webkit-user-select: text;
+    -webkit-user-modify: read-write-plaintext-only;
+}
+
+.metrics {
+    padding: 8px;
+    font-size: 10px;
+    text-align: center;
+    white-space: nowrap;
+}
+
+.metrics .label {
+    position: absolute;
+    font-size: 10px;
+    margin-left: 3px;
+    padding-left: 2px;
+    padding-right: 2px;
+}
+
+.metrics .position {
+    border: 1px rgb(66%, 66%, 66%) dotted;
+    background-color: white;
+    display: inline-block;
+    text-align: center;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .margin {
+    border: 1px dashed;
+    background-color: white;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .border {
+    border: 1px black solid;
+    background-color: white;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .padding {
+    border: 1px grey dashed;
+    background-color: white;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+}
+
+.metrics .content {
+    position: static;
+    border: 1px gray solid;
+    background-color: white;
+    display: inline-block;
+    text-align: center;
+    vertical-align: middle;
+    padding: 3px;
+    margin: 3px;
+    min-width: 80px;
+    overflow: visible;
+}
+
+.metrics .content span {
+    display: inline-block;
+}
+
+.metrics .editing {
+    position: relative;
+    z-index: 100;
+    cursor: text;
+}
+
+.metrics .left {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.metrics .right {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.metrics .top {
+    display: inline-block;
+}
+
+.metrics .bottom {
+    display: inline-block;
+}
+
+.styles-section {
+    padding: 2px 2px 4px 4px;
+    min-height: 18px;
+    white-space: nowrap;
+    background-origin: padding;
+    background-clip: padding;
+    -webkit-user-select: text;
+    border-bottom: 1px solid rgb(191, 191, 191);
+}
+
+.styles-pane .sidebar-separator {
+    border-top: 0px none;
+}
+
+.styles-section.user-rule {
+    display: none;
+}
+
+.show-user-styles .styles-section.user-rule {
+    display: block;
+}
+
+.styles-sidebar-placeholder {
+    height: 16px;
+}
+
+.styles-section.read-only:not(.computed-style) {
+    background-color: rgb(240, 240, 240);
+}
+
+.styles-section .properties li.not-parsed-ok {
+    margin-left: 0;
+}
+
+.styles-section.computed-style .properties li.not-parsed-ok {
+    margin-left: -6px;
+}
+
+.styles-section .properties li.filter-match,
+.styles-section .simple-selector.filter-match {
+    background-color: rgba(255, 255, 0, 0.5);
+}
+
+.styles-section .properties li.overloaded.filter-match {
+    background-color: rgba(255, 255, 0, 0.25);
+}
+
+.styles-section .properties li.not-parsed-ok .exclamation-mark {
+    display: inline-block;
+    position: relative;
+    width: 11px;
+    height: 10px;
+    margin: 0 7px 0 0;
+    top: 1px;
+    left: -36px; /* outdent to compensate for the top-level property indent */
+    -webkit-user-select: none;
+    cursor: default;
+    z-index: 1;
+}
+
+.styles-section .header {
+    white-space: nowrap;
+    background-origin: padding;
+    background-clip: padding;
+}
+
+.styles-section .header .title {
+    word-wrap: break-word;
+    white-space: normal;
+}
+
+.styles-section .header .title .media,
+.styles-section .header .title .media .subtitle {
+    color: rgb(128, 128, 128);
+    overflow: hidden;
+}
+
+.styles-section .header .subtitle {
+    color: rgb(85, 85, 85);
+    float: right;
+    margin-left: 5px;
+    max-width: 100%;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+}
+
+.styles-section .header .subtitle a {
+    color: inherit;
+}
+
+.styles-section .selector {
+    color: #888;
+}
+
+.styles-section .simple-selector.selector-matches {
+    color: #222;
+}
+
+.styles-section a[data-uncopyable] {
+    display: inline-block;
+}
+
+.styles-section a[data-uncopyable]::before {
+    content: attr(data-uncopyable);
+    text-decoration: underline;
+}
+
+.styles-section .properties {
+    display: none;
+    margin: 0;
+    padding: 2px 4px 0 0;
+    list-style: none;
+    clear: both;
+}
+
+.styles-section.matched-styles .properties {
+    padding-left: 0;
+}
+
+.styles-section.no-affect .properties li {
+    opacity: 0.5;
+}
+
+.styles-section.no-affect .properties li.editing {
+    opacity: 1.0;
+}
+
+.styles-section.expanded .properties {
+    display: block;
+}
+
+.styles-section .properties li {
+    margin-left: 12px;
+    padding-left: 22px;
+    white-space: normal;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    cursor: auto;
+}
+
+.styles-section.computed-style.expanded .properties > li {
+    padding-left: 0;
+}
+
+.styles-section.computed-style.expanded .properties > li .webkit-css-property {
+    margin-left: 0;
+}
+
+.styles-section .properties li .webkit-css-property {
+    margin-left: -22px; /* outdent the first line of longhand properties (in an expanded shorthand) to compensate for the "padding-left" shift in .styles-section .properties li */
+}
+
+.styles-section.expanded .properties > li {
+    padding-left: 38px;
+}
+
+.styles-section .properties > li .webkit-css-property {
+    margin-left: -38px; /* outdent the first line of the top-level properties to compensate for the "padding-left" shift in .styles-section .properties > li */
+}
+
+.styles-section .properties > li.child-editing {
+    padding-left: 8px;
+}
+
+.styles-section .properties > li.child-editing .webkit-css-property {
+    margin-left: 0;
+}
+
+.styles-section.matched-styles .properties li {
+    margin-left: 0 !important;
+}
+
+.styles-section .properties li.child-editing {
+    word-wrap: break-word !important;
+    white-space: normal !important;
+    padding-left: 0;
+}
+
+.styles-section .properties ol {
+    display: none;
+    margin: 0;
+    -webkit-padding-start: 12px;
+    list-style: none;
+}
+
+.styles-section .properties ol.expanded {
+    display: block;
+}
+
+.styles-section.matched-styles .properties li.parent .expand-element {
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    margin-right: 2px;
+    margin-left: -6px;
+    opacity: 0.55;
+    width: 8px;
+    height: 10px;
+    display: inline-block;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.styles-section.matched-styles .properties li.parent .expand-element {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.styles-section.matched-styles .properties li.parent .expand-element {
+    background-position: -4px -96px;
+}
+
+.styles-section.matched-styles .properties li.parent.expanded .expand-element {
+    background-position: -20px -96px;
+}
+
+.styles-section .properties li .info {
+    padding-top: 4px;
+    padding-bottom: 3px;
+}
+
+.styles-section.matched-styles:not(.read-only):hover .properties .enabled-button {
+    visibility: visible;
+}
+
+.styles-section.matched-styles:not(.read-only) .properties li.disabled .enabled-button {
+    visibility: visible;
+}
+
+.styles-section .properties .enabled-button {
+    visibility: hidden;
+    float: left;
+    font-size: 10px;
+    margin: 0;
+    vertical-align: top;
+    position: relative;
+    z-index: 1;
+    width: 18px;
+    left: -40px; /* original -2px + (-38px) to compensate for the first line outdent */
+    top: 1px;
+}
+
+.styles-section.matched-styles .properties ol.expanded {
+    margin-left: 16px;
+}
+
+.styles-section .properties .overloaded:not(.has-ignorable-error),
+.styles-section .properties .inactive,
+.styles-section .properties .disabled,
+.styles-section .properties .not-parsed-ok:not(.has-ignorable-error) {
+    text-decoration: line-through;
+}
+
+.styles-section .properties .has-ignorable-error .webkit-css-property {
+    color: inherit;
+}
+
+.styles-section.computed-style .properties .disabled {
+    text-decoration: none;
+    opacity: 0.5;
+}
+
+.styles-section .properties .implicit,
+.styles-section .properties .inherited {
+    opacity: 0.5;
+}
+
+.styles-section .properties .has-ignorable-error {
+    color: gray;
+}
+
+.styles-element-state-pane {
+    overflow: hidden;
+    margin-top: -56px;
+    padding-top: 18px;
+    height: 56px;
+    -webkit-transition: margin-top 0.1s ease-in-out;
+    padding-left: 2px;
+}
+
+.styles-element-state-pane.expanded {
+    border-bottom: 1px solid rgb(189, 189, 189);
+    margin-top: 0;
+}
+
+.styles-element-state-pane > table {
+    width: 100%;
+    border-spacing: 0;
+}
+
+.styles-element-state-pane label {
+    display: flex;
+    margin: 1px;
+}
+
+.styles-selector {
+    cursor: text;
+}
+
+.body .styles-section .properties .inherited {
+    display: none;
+}
+
+.styles-section.styles-show-inherited .properties .inherited {
+    display: block;
+}
+
+.add-attribute {
+    margin-left: 1px;
+    margin-right: 1px;
+    white-space: nowrap;
+}
+
+.section .event-bars {
+    display: none;
+}
+
+.section.expanded .event-bars {
+    display: block;
+}
+
+.event-bar {
+    position: relative;
+    margin-left: 10px;
+}
+
+.event-bar:first-child {
+    margin-top: 1px;
+}
+
+.event-bars .event-bar .header {
+    padding: 0 8px 0 6px;
+    min-height: 16px;
+    opacity: 1.0;
+    white-space: nowrap;
+    background-origin: padding;
+    background-clip: padding;
+}
+
+.event-bars .event-bar .header .title {
+    font-weight: normal;
+    text-shadow: white 0 1px 0;
+}
+
+.event-bars .event-bar .header .subtitle {
+    color: rgba(90, 90, 90, 0.75);
+}
+
+.event-bars .event-bar .header::before {
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    content: "a";
+    color: transparent;
+    text-shadow: none;
+    float: left;
+    width: 8px;
+    margin-right: 4px;
+    margin-top: 2px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.event-bars .event-bar .header::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.event-bars .event-bar .header::before {
+    background-position: -4px -96px;
+}
+
+.event-bars .event-bar.expanded .header::before {
+    background-position: -20px -96px;
+}
+
+.image-preview-container {
+    background: transparent;
+    text-align: center;
+}
+
+.image-preview-container img {
+    margin: 2px auto;
+    max-width: 100px;
+    max-height: 100px;
+    background-image: url(Images/checker.png);
+    -webkit-user-select: text;
+    -webkit-user-drag: auto;
+}
+
+.sidebar-pane.composite {
+    position: absolute;
+}
+
+.sidebar-pane.composite > .body {
+    height: 100%;
+}
+
+.sidebar-pane.composite .metrics {
+    border-bottom: 1px solid rgb(64%, 64%, 64%);
+    height: 206px;
+    display: flex;
+    flex-direction: column;
+    -webkit-align-items: center;
+    -webkit-justify-content: center;
+}
+
+.sidebar-pane .metrics-and-styles,
+.sidebar-pane .metrics-and-computed {
+    display: flex !important;
+    flex-direction: column !important;
+    position: relative;
+}
+
+.sidebar-pane .style-panes-wrapper {
+    flex: 1;
+    overflow-y: auto;
+    position: relative;
+}
+
+.sidebar-pane.composite .metrics-and-computed .sidebar-pane-toolbar,
+.sidebar-pane.composite .metrics-and-styles .sidebar-pane-toolbar {
+    position: absolute;
+}
+
+.sidebar-pane-filter-box {
+    display: flex;
+    border-top: 1px solid rgb(191, 191, 191);
+    flex-basis: 19px;
+}
+
+.sidebar-pane-filter-box > input {
+    outline: none !important;
+    border: none;
+    width: 100%;
+    margin: 0 4px;
+    background: transparent;
+}
+
+.styles-filter-engaged {
+    background-color: rgba(255, 255, 0, 0.5);
+}
+
+.sidebar-pane.composite .metrics-and-computed .sidebar-pane-toolbar {
+    margin-top: 4px;
+    margin-bottom: -4px;
+    position: relative;
+}
+
+.sidebar-pane.composite .platform-fonts .body {
+    padding: 1ex;
+    -webkit-user-select: text;
+}
+
+.sidebar-pane.composite .platform-fonts .sidebar-separator {
+    border-top: none;
+}
+
+.sidebar-pane.composite .platform-fonts .stats-section {
+    margin-bottom: 5px;
+}
+
+.sidebar-pane.composite .platform-fonts .css-font-value {
+    margin-left: 1ex;
+}
+
+.sidebar-pane.composite .platform-fonts .font-stats-item {
+    padding-left: 1em;
+}
+
+.sidebar-pane.composite .platform-fonts .font-stats-item .delimeter {
+    margin: 0 1ex 0 1ex;
+}
+
+.sidebar-pane.composite .metrics-and-styles .metrics {
+    border-bottom: none;
+}
+
+.styles-section.computed-style > .header > .sidebar-pane-subtitle {
+    line-height: 17px;
+    margin: 2px;
+    -webkit-user-select: none;
+}
+
+.styles-section.computed-style > .header > .sidebar-pane-subtitle > input {
+    vertical-align: middle;
+}
+
+.sidebar-pane.composite .sidebar-pane-toolbar > .sidebar-pane-subtitle {
+    left: 8px;
+}
+
+.sidebar-pane > .body > .split-view {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+.panel.elements .sidebar-pane-toolbar > select {
+    float: right;
+    width: 23px;
+    height: 17px;
+    color: transparent;
+    background-color: transparent;
+    border: none;
+    background-repeat: no-repeat;
+    margin: 1px 0 0 0;
+    padding: 0;
+    border-radius: 0;
+    -webkit-appearance: none;
+}
+
+.panel.elements .sidebar-pane-toolbar > select:hover {
+    background-position: -23px 0;
+}
+
+.panel.elements .sidebar-pane-toolbar > select:active {
+    background-position: -46px 0;
+}
+
+.panel.elements .sidebar-pane-toolbar > select.select-settings {
+    background-image: url(Images/paneSettingsButtons.png);
+}
+
+.panel.elements .sidebar-pane-toolbar > select.select-filter {
+    background-image: url(Images/paneFilterButtons.png);
+}
+.panel.elements .sidebar-pane-toolbar > select > option,
+.panel.elements .sidebar-pane-toolbar > select > hr {
+    color: black;
+}
+
+.styles-section:not(.read-only) .properties .webkit-css-property.styles-panel-hovered,
+.styles-section:not(.read-only) .properties .value .styles-panel-hovered,
+.styles-section:not(.read-only) .properties .value.styles-panel-hovered,
+.styles-section:not(.read-only) span.simple-selector.styles-panel-hovered {
+    text-decoration: underline;
+    cursor: default;
+}
+
+.styles-clipboard-only {
+    display: inline-block;
+    width: 0;
+    opacity: 0;
+}
+
+li.child-editing .styles-clipboard-only {
+    display: none;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/filter.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/filter.css
new file mode 100644 (file)
index 0000000..251ab00
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * 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.
+ */
+
+.filter-text-filter {
+    display: flex;
+    margin-left: 2px;
+    margin-right: 2px;
+    flex: 0 1 120px;
+    min-width: 40px;
+}
+
+.filter-text-filter.supports-regex {
+    flex: 0 0 155px;
+}
+
+.filter-text-filter label {
+    margin: auto 0;
+}
+
+.filter-bitset-filter {
+    padding: 0 10px !important;
+    overflow: hidden;
+    display: flex !important;
+}
+
+.filter-bitset-filter li {
+    display: inline-block;
+    margin: auto 2px;
+    padding: 4px 6px 3px 6px;
+    background: transparent;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+    border-radius: 8px;
+}
+
+.filter-bitset-filter-divider {
+    background-color: #ccc;
+    height: 16px;
+    width: 1px;
+    margin: auto 2px;
+    display: inline-block;
+}
+
+.filter-bitset-filter li.selected,
+.filter-bitset-filter li:hover,
+.filter-bitset-filter li:active {
+    color: white;
+    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
+}
+
+.filter-bitset-filter li:hover {
+    background: rgba(0, 0, 0, 0.2);
+}
+
+.filter-bitset-filter li.selected {
+    background: rgba(0, 0, 0, 0.3);
+}
+
+.filter-bitset-filter li:active {
+    background: rgba(0, 0, 0, 0.5);
+}
+
+.filter-combobox-filter {
+    margin-left: 5px;
+    margin-right: 2px;
+    flex: 0 0 auto;
+}
+
+.filter-checkbox-filter {
+    padding-left: 4px;
+    padding-right: 2px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    display: flex;
+}
+
+.filter-checkbox-filter > label {
+    display: flex;
+    margin: auto 0;
+}
+
+.filter-text-invalid {
+    background-color: rgb(255, 200, 200);
+}
+
+.filter-checkbox-filter .checkbox-filter-checkbox {
+    width: 10px;
+    height: 10px;
+    margin: auto 3px;
+    padding: 0;
+    border-radius: 2px;
+    border: solid 1px;
+    display: inline-block;
+    overflow: visible;
+    opacity: 0.8;
+    flex-shrink: 0;
+}
+
+
+.filter-checkbox-filter .checkbox-filter-checkbox-check {
+    -webkit-appearance: none;
+    width: 11px;
+    height: 11px;
+    margin-top: -2px;
+    margin-left: 1px;
+}
+
+.filter-checkbox-filter .checkbox-filter-checkbox-checked {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    background-position: -129px -110px;
+}
+
+.filters-toggle > .glyph {
+    -webkit-mask-position: -32px -48px;
+}
+
+.filters-toggle.toggled-shown .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+.filters-toggle.toggled-active .glyph {
+    background-color: rgb(216, 0, 0);
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/filteredItemSelectionDialog.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/filteredItemSelectionDialog.css
new file mode 100644 (file)
index 0000000..0d1d1a4
--- /dev/null
@@ -0,0 +1,54 @@
+.filtered-item-list-dialog > input {
+    font-size: 11px;
+    width: 100%;
+    height: 24px;
+}
+
+.filtered-item-list-dialog > div.container {
+    position: absolute;
+    top: 38px;
+    bottom: 10px;
+    left: 10px;
+    right: 10px;
+    overflow-y: auto;
+    border: 1px solid rgb(187, 187, 187);
+    background-color: white;
+}
+
+.filtered-item-list-dialog-item {
+    padding: 2px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    color: rgb(95, 95, 95);
+}
+
+.filtered-item-list-dialog-item.selected {
+    background-color: rgb(224, 224, 224);
+}
+
+.filtered-item-list-dialog-item span.highlight {
+    color: #222;
+    font-weight: bold;
+}
+
+.filtered-item-list-dialog-item .filtered-item-list-dialog-title {
+    flex: auto;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+.filtered-item-list-dialog-item .filtered-item-list-dialog-subtitle {
+    flex: none;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    color: rgb(155, 155, 155);
+}
+
+.filtered-item-list-dialog-item.one-row {
+    display: flex;
+}
+
+.filtered-item-list-dialog-item.two-rows {
+    border-bottom: 1px solid rgb(235, 235, 235);
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/flameChart.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/flameChart.css
new file mode 100644 (file)
index 0000000..b6c9057
--- /dev/null
@@ -0,0 +1,69 @@
+.overview-container {
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    width: 100%;
+    height: 80px;
+}
+
+.chart-container {
+    flex: auto;
+}
+
+#flame-chart-overview-grid .resources-dividers-label-bar {
+    pointer-events: auto;
+}
+
+.flame-chart-main-pane {
+    overflow: hidden;
+}
+
+.flame-chart-overview-pane {
+    flex: 0 0 80px !important;
+}
+
+#flame-chart-overview-container {
+    border-bottom: 1px solid rgba(0, 0, 0, 0.3);
+}
+
+.flame-chart-overview-canvas {
+    position: absolute;
+    top: 20px;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.chart-container .entry-info {
+    position: absolute;
+    left: 10px;
+    top: 25px;
+    background-color: rgba(255, 255, 255, 0.8);
+    pointer-events: none;
+}
+
+.chart-container .entry-info .title {
+    font-weight: bold;
+}
+
+.flame-chart-highlight-element {
+    background-color: black;
+    position: absolute;
+    opacity: 0.2;
+    pointer-events: none;
+}
+
+.flame-chart-selected-element {
+    position: absolute;
+    pointer-events: none;
+    border-color: rgb(56, 121, 217);
+    border-width: 2px;
+    border-style: solid;
+    background-color: rgba(56, 121, 217, 0.2);
+}
+
+.flame-chart-v-scroll {
+    flex: 0 0 15px;
+    overflow-x: hidden;
+    overflow-y: scroll;
+}
\ No newline at end of file
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/heapProfiler.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/heapProfiler.css
new file mode 100644 (file)
index 0000000..6e1fb56
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Apple 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.
+ */
+
+.heap-snapshot-sidebar-tree-item .icon {
+    content: url(Images/profileIcon.png);
+}
+
+.heap-snapshot-sidebar-tree-item.small .icon {
+    content: url(Images/profileSmallIcon.png);
+}
+
+.heap-snapshot-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.heap-snapshot-view .pie-chart {
+    margin: 12px 30px;
+}
+
+.heap-snapshot-view .data-grid {
+    border: none;
+}
+
+.heap-snapshot-view .data-grid tr:empty {
+    height: 16px;
+    visibility: hidden;
+}
+
+.heap-snapshot-view .data-grid tr.selected span {
+    color: inherit;
+}
+
+.heap-snapshot-view .data-grid td.count-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.addedCount-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.removedCount-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.countDelta-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.addedSize-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.removedSize-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.sizeDelta-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.shallowSize-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.retainedSize-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid td.distanceToWindow-column {
+    text-align: right;
+}
+
+.heap-snapshot-view .data-grid div.heap-snapshot-multiple-values {
+    float: right;
+}
+
+.heap-snapshot-view .data-grid span.percent-column {
+    color: #999;
+    width: 32px;
+    display: inline-block;
+}
+
+.heap-snapshot-view .console-formatted-object,
+.console-formatted-node {
+    display: inline;
+    position: static;
+}
+
+.detached-dom-tree-node {
+    background-color: #FF9999;
+}
+
+.heap-snapshot-view .console-formatted-string {
+    white-space: nowrap;
+}
+
+.heap-snapshot-view tr:not(.selected) .console-formatted-id {
+    color: grey;
+}
+
+.heap-snapshot-view .delimiter {
+    height: 24px;
+    background-color: #d6dde5;
+}
+
+.heap-snapshot-view .data-grid {
+    flex: auto;
+}
+
+.heap-snapshot-view .heap-tracking-overview {
+    flex: 0 0 80px;
+    height: 80px;
+}
+
+.heap-snapshot-view .retaining-paths-view {
+    overflow: hidden;
+}
+
+.heap-snapshot-view .retainers-view-header {
+    background-image: url(Images/statusbarResizerVertical.png);
+    background-color: rgb(236, 236, 236);
+    border-bottom: 1px solid rgb(179, 179, 179);
+    background-repeat: no-repeat;
+    background-position: right center, center;
+    flex: 0 0 21px;
+}
+
+.heap-snapshot-view .retainers-view-header .title > span {
+    display: inline-block;
+    padding-top: 3px;
+    vertical-align: middle;
+    margin-left: 4px;
+    margin-right: 8px;
+}
+
+.heap-snapshot-view .retainers-view-header * {
+    pointer-events: none;
+}
+
+.heap-snapshot-view tr:not(.selected) td.object-column span.highlight {
+    background-color: rgb(255, 255, 200);
+}
+
+.heap-snapshot-view td.object-column span.grayed {
+    color: gray;
+}
+
+table.heap-snapshot-help {
+    border-spacing: 12px 2px;
+}
+
+.cycled-ancessor-node {
+    opacity: 0.6;
+}
+
+#heap-recording-view .heap-snapshot-view {
+    top: 80px;
+}
+
+.overview-container {
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    width: 100%;
+    height: 80px;
+}
+
+#heap-recording-overview-grid .resources-dividers-label-bar {
+    pointer-events: auto;
+}
+
+#heap-recording-overview-container {
+    border-bottom: 1px solid rgba(0, 0, 0, 0.3);
+}
+
+.heap-recording-overview-canvas {
+    position: absolute;
+    top: 20px;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.heap-snapshot-stats-legend {
+    margin-left: 24px;
+}
+
+.heap-snapshot-stats-legend > div {
+    margin-top: 1px;
+    width: 170px;
+}
+
+.heap-snapshot-stats-swatch {
+    display: inline-block;
+    width: 10px;
+    height: 10px;
+    border: 1px solid rgba(100, 100, 100, 0.3);
+}
+
+.heap-snapshot-stats-swatch.heap-snapshot-stats-empty-swatch {
+    border: none;
+}
+
+.heap-snapshot-stats-name,
+.heap-snapshot-stats-size {
+    display: inline-block;
+    margin-left: 6px;
+}
+
+.heap-snapshot-stats-size {
+    float: right;
+    text-align: right;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/helpScreen.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/helpScreen.css
new file mode 100644 (file)
index 0000000..a6fd786
--- /dev/null
@@ -0,0 +1,681 @@
+.help-window-outer {
+    position: absolute !important;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 2000;
+}
+
+.help-window-main {
+    max-height: 100%;
+    color: white;
+    background-color: rgba(17, 17, 17, 0.85);
+    display: -webkit-flex;
+    -webkit-flex-direction: column;
+    border-top-width: 0;
+    border-radius: 10px;
+}
+
+.help-window-main a {
+    color: rgb(17, 85, 204);
+}
+
+.help-window-caption {
+    border-bottom: solid 1px rgb(153, 153, 153);
+    margin: 0 8px;
+    padding: 0 2px;
+    line-height: 28px;
+}
+
+.help-window-title {
+    font-size: 16px;
+    margin: 0;
+    padding-top: 1px;
+    margin-bottom: -1px;
+}
+
+.help-content {
+    overflow-y: auto;
+    overflow-x: hidden;
+    margin: 8px;
+    padding: 0 4px;
+    flex: auto;
+}
+
+.help-footnote {
+    border-top: 1px solid #EEEEEE;
+    margin: 0;
+    padding: 12px;
+}
+
+.help-window-main .help-container-wrapper::-webkit-scrollbar {
+    width: 11px;
+}
+
+.help-window-main .help-container-wrapper::-webkit-scrollbar-corner,
+.help-window-main .help-container-wrapper::-webkit-resizer {
+    display: none;
+}
+
+.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical {
+    background: linear-gradient(to right, rgb(128, 128, 128), rgb(96, 96, 96) 40%, rgb(128, 128, 128));
+    border-radius: 5px;
+    min-height: 20px;
+}
+
+.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical:hover,
+.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical:active {
+    background: linear-gradient(to right, rgb(176, 176, 176), rgb(144, 144, 144) 40%, rgb(176, 176, 176));
+}
+
+.help-window-main .help-container-wrapper::-webkit-scrollbar-track:vertical {
+    background: linear-gradient(to right, rgb(10, 10, 10), rgb(32, 32, 32) 25%, rgb(32, 32, 32));
+    border-radius: 5px;
+}
+
+.help-close-button {
+    position: absolute;
+    top: 8px;
+    right: 8px;
+}
+
+body.dock-to-bottom .help-content {
+    margin-bottom: 8px;
+}
+
+body.platform-mac .help-window-main .tabbed-pane-header-contents {
+    margin-left: 27px;
+}
+
+body.platform-mac .help-window-main .help-window-title {
+    margin-left: 18px;
+}
+
+.help-container {
+    width: 100%;
+    -webkit-user-select: auto;
+    -webkit-column-width: 470px;
+}
+
+body.platform-mac .settings-tab .help-container {
+    -webkit-column-width: 430px;
+}
+
+body.platform-mac .help-container {
+    -webkit-column-width: 361px;
+}
+
+.help-no-columns {
+    -webkit-column-width: initial !important;
+}
+
+.help-block {
+    display: block;
+    padding-bottom: 9px;
+    width: 470px;
+    -webkit-column-break-inside: avoid;
+}
+
+body.platform-mac .settings-tab .help-block {
+    width: 430px;
+}
+
+.settings-tab.help-container {
+    -webkit-column-width: 410px;
+}
+
+.settings-tab .help-block {
+    width: 410px;
+    margin-left: 20px;
+}
+
+.settings-tab .field-error-message {
+    color: DarkRed;
+}
+
+.help-line {
+    padding-bottom: 5px;
+    margin-bottom: 5px;
+}
+
+.help-key-cell {
+    display: inline-block;
+    width: 270px;
+    text-align: right;
+}
+
+body.platform-mac .help-key-cell {
+    width: 151px;
+}
+
+.help-cell {
+    display: inline;
+}
+
+.help-section-title {
+    font-size: 120%;
+}
+
+.help-key {
+    padding: 0.1em 0.6em;
+    border: 1px solid #ccc;
+    font-size: 11px;
+    background-color: #f7f7f7;
+    color: #333;
+    box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2), 0 0 0 2px #ffffff inset;
+    border-radius: 3px;
+    display: inline-block;
+    margin: 0 0.1em;
+    text-shadow: 0 1px 0 #fff;
+    line-height: 1.5;
+    white-space: nowrap;
+}
+
+body.platform-mac .help-key {
+    font-family: Lucida Grande, sans-serif;
+}
+
+.help-combine-keys,
+.help-key-delimiter {
+    font-size: 9px;
+}
+
+.help-combine-keys {
+    margin: 0 0.3em;
+}
+
+.help-key-delimiter {
+    margin: 0 0.5em;
+}
+
+.help-window-outer fieldset {
+    margin: 0;
+    padding: 0;
+    border: none;
+}
+
+.settings-tab label {
+    padding-right: 4px;
+    display: flex;
+}
+
+#general-tab-content .help-block fieldset legend {
+    font-size: 14px;
+}
+
+.help-block p p {
+    padding-left: 30px;
+}
+
+#enable-devtools-on-startup {
+    margin: 0 0 0 80px;
+    display: inline-block;
+}
+
+.help-content p.help-section {
+    margin: 0 0 15px 0;
+}
+
+.settings-experiments-warning-subsection-warning {
+    color: rgb(200, 0, 0);
+}
+
+.settings-experiments-warning-subsection-message {
+    color: inherit;
+}
+
+#resolution-override-section {
+    margin-left: 13px;
+}
+
+.help-content input[type=checkbox] {
+    margin-right: 7px;
+}
+
+.help-content select {
+    background-color: rgb(64, 64, 64);
+    color: white;
+    border-color: black;
+    padding: 0 4px;
+}
+
+.help-content select:disabled {
+    background-color: rgb(32, 32, 32);
+    color: graytext;
+}
+
+.help-content option {
+    background-color: #EEEEEE;
+    color: #222;
+}
+
+#settings-screen .help-window-main{
+    color: rgb(48, 57, 66);
+    background-color: white;
+    border-radius: 0;
+}
+
+#settings-screen .help-window-main {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    bottom: 10px;
+    left: 10px;
+    height: initial;
+    padding: 21px 0 0 21px;
+    box-shadow: 1px 1px 5px 2px rgba(128, 128, 128, 0.7);
+}
+
+#settings-screen .help-window-label {
+    font-size: 18px;
+    color: inherit;
+    padding-top: 1px;
+}
+
+.help-container-wrapper {
+    position: absolute;
+    top: 54px;
+    left: 15px;
+    right: 0;
+    bottom: 0;
+    overflow: auto;
+}
+
+#settings-screen .tabbed-pane-header {
+    border: none transparent;
+    height: auto;
+    width: 110px;
+    margin-top: 14px;
+    flex: auto;
+}
+
+#settings-screen .tabbed-pane-header-contents {
+    margin: 0;
+}
+
+#settings-screen .tabbed-pane-header-tabs {
+    display: flex;
+    flex-direction: column;
+    padding-top: 5px;
+    width: 100px;
+}
+
+#settings-screen .tabbed-pane-header-tab {
+    background-color: transparent;
+    border: none transparent;
+    font-weight: normal;
+    text-shadow: none;
+    color: #999999;
+    height: 22px;
+    padding-left: 0;
+}
+
+#settings-screen .tabbed-pane-header-tab:not(.selected) {
+    cursor: pointer;
+}
+
+#settings-screen .tabbed-pane-header-tab.selected {
+    color: inherit;
+}
+
+#settings-screen .tabbed-pane-content {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: 8px;
+}
+
+#settings-screen .tabbed-pane-content {
+    left: 120px;
+}
+
+.settings-tab.help-content {
+    margin: 0;
+    padding: 0;
+}
+
+.settings-tab input:not([type]),
+.settings-tab input[type="text"] {
+    border: 1px solid rgb(213, 213, 213);
+    border-radius: 2px;
+    color: #444444;
+    padding: 3px;
+}
+
+.settings-tab input.numeric {
+    text-align: right;
+}
+
+.settings-tab-container {
+    flex: auto;
+    overflow: hidden;
+}
+
+.settings-tab-container header {
+    padding: 14px 0 6px;
+    border-bottom: 1px solid #EEEEEE;
+}
+
+#tab-shortcuts {
+    margin-top: 25px !important;
+}
+
+#experiments-tab-content .help-container {
+    -webkit-column-width: 470px;
+}
+
+#experiments-tab-content .help-block {
+    width: 470px;
+}
+
+.settings-tab-container header > h3 {
+    font-size: 18px;
+    font-weight: normal;
+    margin: 0;
+    padding-bottom: 3px;
+}
+
+.settings-tab .help-section-title {
+    margin-left: -20px;
+    color: #222;
+}
+
+.settings-tab .help-block fieldset:disabled label:hover {
+    color: inherit;
+}
+
+.settings-tab .help-block label:hover {
+    color: #222;
+}
+
+.settings-tab p {
+    margin: 12px 0;
+}
+
+.settings-tab select {
+    background-color: #FAFAFA;
+    border-color: rgb(213, 213, 213);
+    border-radius: 2px;
+    color: inherit;
+    padding: 0 4px;
+}
+
+.settings-tab select:disabled {
+    background-color: rgb(221, 221, 221);
+}
+
+.settings-tab .workspace-settings-row input {
+    width: 190px;
+}
+
+#workspace-tab-content .settings-tab.help-content.help-container {
+    -webkit-column-width: initial;
+}
+
+
+#workspace-tab-content .button:hover {
+    opacity: 1.0 !important;
+}
+
+#workspace-tab-content .workspace-settings-row:hover .button {
+    visibility: visible;
+    opacity: 0.4;
+}
+
+#workspace-tab-content .workspace-settings-row .button {
+    width: 10px;
+    height: 10px;
+    border: none;
+    -webkit-appearance: none;
+    background-color: transparent;
+    visibility: hidden;
+    background-position: center;
+    margin: 0 0 0 4px;
+}
+
+#workspace-tab-content .workspace-settings-row .remove-button {
+    background-image: url(Images/deleteIcon.png);
+}
+
+#workspace-tab-content .workspace-settings-row .add-button {
+    background-image: url(Images/addIcon.png);
+}
+
+#workspace-tab-content .workspace-settings-error {
+    color: red;
+}
+
+.settings-tab-text-button {
+    background-image: linear-gradient(hsl(0, 0%, 93%), hsl(0, 0%, 93%) 38%, hsl(0, 0%, 87%));
+    border: 1px solid hsla(0, 0%, 0%, 0.25);
+    border-radius: 2px;
+    box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.08), inset 0 1px 2px hsla(0, 100%, 100%, 0.75);
+    color: hsl(0, 0%, 27%);
+    font-size: 12px;
+    margin: 0 1px 0 0;
+    text-shadow: 0 1px 0 hsl(0, 0%, 94%);
+    min-height: 2em;
+    padding-left: 10px;
+    padding-right: 10px;
+}
+
+.settings-tab-text-button:disabled {
+    background-image: linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
+    border-color: rgba(80, 80, 80, 0.2);
+    box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75);
+    color: #aaa;
+}
+
+.settings-tab-text-button:not(:disabled):hover {
+    background-image: linear-gradient(hsl(0, 0%, 94%), hsl(0, 0%, 94%) 38%, hsl(0, 0%, 88%));
+    border-color: hsla(0, 0%, 0%, 0.3);
+    box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.12), inset 0 1px 2px hsla(0, 100%, 100%, 0.95);
+    color: hsl(0, 0%, 0%);
+}
+
+.settings-tab-text-button:not(:disabled):active {
+    background-image: linear-gradient(hsl(0, 0%, 91%), hsl(0, 0%, 91%) 38%, hsl(0, 0%, 84%));
+    box-shadow: none;
+    text-shadow: none;
+}
+
+.settings-tab .settings-list-container {
+    background-color: white;
+    margin-bottom: 10px;
+}
+
+.settings-tab .settings-list {
+    border: 1px solid hsl(0, 0%, 85%);
+    border-radius: 2px;
+}
+
+.settings-tab .settings-list .settings-list-item .settings-list-item-contents {
+    width: 100%;
+    height: 40px;
+    -webkit-box-align: center;
+    -webkit-transition: 150ms background-color;
+    display: -webkit-box;
+    padding-right: 3px;
+}
+
+.settings-tab .settings-list .settings-list-item .settings-list-item-contents > :first-child {
+    -webkit-box-align: center;
+    -webkit-box-flex: 1;
+    -webkit-padding-end: 5px;
+    display: -webkit-box;
+}
+
+.settings-tab .settings-list .settings-list-item.selected:not(.editable) {
+    background-color: hsl(0, 0%, 82%);
+}
+
+.settings-tab .settings-list .settings-list-item:hover {
+    background-color: hsl(215, 54%, 93%);
+}
+
+.settings-tab .settings-list .settings-list-item.selected:not(.editable):hover {
+    background-color: hsl(215, 51%, 82%);
+}
+
+.settings-tab .settings-list .settings-list-item .remove-item-button {
+    -webkit-transition: 150ms opacity;
+    background-color: hsla(0, 0%, 0%, 0);
+    background-image: -webkit-image-set(
+        url(Images/settingsListRemove.png) 1x,
+        url(Images/settingsListRemove_2x.png) 2x);
+    background-size: 48px 16px;
+    border: none;
+    display: block;
+    height: 16px;
+    width: 16px;
+    opacity: 0;
+    pointer-events: none;
+}
+
+.settings-tab .settings-list .settings-list-item.selected .remove-item-button,
+.settings-tab .settings-list .settings-list-item:hover .remove-item-button {
+    opacity: 1;
+    pointer-events: auto;
+}
+
+.settings-tab .settings-list .settings-list-item .remove-item-button:hover {
+    background-position-x: -32px;
+}
+
+.settings-tab .settings-list .settings-list-item .remove-item-button:active {
+    background-position-x: -16px;
+}
+
+.settings-list-item-columns {
+    height: 100%;
+}
+
+.settings-tab .settings-list .settings-list-item .list-column {
+    displaY: -webkit-box;
+    -webkit-box-align: center;
+    padding-left: 5px;
+    padding-right: 2px;
+    box-sizing: border-box;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    height: 100%;
+}
+
+.settings-tab .settings-list .settings-list-item .list-column .list-column-editor {
+    width: 100%;
+}
+
+.settings-tab .settings-list .settings-list-item.add-list-item .remove-item-button {
+    visibility: hidden;
+}
+
+.settings-tab .settings-list .settings-list-item.editable .list-column .list-column-editor {
+    display: none;
+}
+
+.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-editor {
+    display: block;
+}
+
+.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-text {
+    display: none;
+}
+
+.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-editor.editable-item-error {
+    background-color: pink;
+}
+
+.list-column-editor {
+    border: 1px solid rgb(213, 213, 213);
+    border-radius: 2px;
+    color: #444444;
+    padding: 3px;
+}
+
+.settings-tab .settings-list .settings-list-item .file-system-path {
+    white-space: nowrap;
+    font-size: 12px;
+    padding-left: 6px;
+    padding-right: 5px;
+    -webkit-box-flex: 1;
+    color: hsl(210, 16%, 22%);
+}
+
+.settings-tab .settings-list .settings-list-item .file-system-path-name {
+    padding-right: 6px;
+    font-weight: bold;
+}
+
+.file-mappings-list .settings-list-item .list-column.settings-list-column-url {
+    width: 50%;
+}
+
+.file-mappings-list .settings-list-item .list-column.settings-list-column-path {
+    width: 50%;
+}
+
+.excluded-folders-list .settings-list-item .list-column.settings-list-column-path {
+    width: 100%;
+}
+
+.settings-dialog {
+    border-radius: 3px;
+    box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2), 0 2px 6px rgba(0,0,0,0.15);
+    display: -webkit-flex;
+    -webkit-flex-direction: column;
+    background: white;
+}
+
+.settings-dialog .dialog-contents {
+    display: flex;
+    flex-direction: column;
+}
+
+.settings-dialog .header {
+    flex: 0 0 auto;
+    color: #333;
+    font-size: 14px;
+    margin: 0;
+    padding: 14px 17px 14px;
+}
+
+.settings-dialog .contents {
+    flex: 1 1 auto;
+    padding: 0 17px;
+    overflow: auto;
+}
+
+.settings-dialog .block-header {
+    color: black;
+    font-size: 1.2em;
+    margin-bottom: 0.8em;
+}
+
+.settings-dialog .done-button {
+    float: right;
+}
+
+.settings-glass-pane {
+    -webkit-box-align: center;
+    -webkit-box-orient: vertical;
+    -webkit-box-pack: center;
+    display: -webkit-box;
+    z-index: 2000 !important;
+    padding: 5px;
+    background-color: rgba(255, 255, 255, 0.4) !important;
+}
+
+.help-indent-labels label {
+    padding-left: 10px;
+}
+
+.help-field-note {
+    opacity: 0.6;
+    padding-left: 19px;
+}
+
+.edit-file-system-dialog .section {
+    min-width: 400px;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/indexedDBViews.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/indexedDBViews.css
new file mode 100644 (file)
index 0000000..2dc038d
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * 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:
+ *
+ *     * 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.
+ */
+
+.indexed-db-database-view {
+    -webkit-user-select: text;
+    margin-top: 5px;
+}
+
+.indexed-db-database-view .outline-disclosure {
+    padding-left: 0;
+}
+
+.indexed-db-database-view .outline-disclosure li {
+    white-space: nowrap;
+}
+
+.indexed-db-database-view .outline-disclosure .attribute-name {
+    color: rgb(33%, 33%, 33%);
+    display: inline-block;
+    margin-right: 0.5em;
+    font-weight: bold;
+    vertical-align: top;
+}
+
+.indexed-db-database-view .outline-disclosure .attribute-value {
+    display: inline;
+    margin-top: 1px;
+}
+
+.indexed-db-data-view .data-view-toolbar {
+    position: relative;
+    margin-top: -1px;
+    height: 24px;
+}
+
+.indexed-db-data-view .data-view-toolbar .back-button img {
+    content: url(Images/back.png);
+}
+
+.indexed-db-data-view .data-view-toolbar .forward-button img {
+    content: url(Images/forward.png);
+}
+
+.indexed-db-data-view .data-view-toolbar .key-input {
+    font-size: 10px;
+    margin-top: 3px;
+    margin-left: 3px;
+    width: 200px;
+}
+
+.indexed-db-data-view .data-grid-container {
+    top: 23px;
+}
+
+.indexed-db-data-view .data-grid {
+    height: 100%;
+    border: 0;
+}
+
+.indexed-db-data-view .data-grid .data-container tr:nth-child(even) {
+    background-color: white;
+}
+
+.indexed-db-data-view .data-grid .data-container tr:nth-child(odd) {
+    background-color: #EAF3FF;
+}
+
+.indexed-db-data-view .data-grid .data-container tr:nth-last-child(1) {
+    background-color: white;
+}
+
+.indexed-db-data-view .data-grid .data-container tr:nth-last-child(1) td {
+    border: 0;
+}
+
+.indexed-db-data-view .data-grid .data-container td {
+    height: 18px;
+}
+
+.indexed-db-data-view .data-grid .data-container td.value-column,
+.indexed-db-data-view .data-grid .data-container td.key-column,
+.indexed-db-data-view .data-grid .data-container td.primaryKey-column {
+    padding: 0;
+}
+
+.indexed-db-data-view .data-grid .data-container td.value-column div.primitive-value,
+.indexed-db-data-view .data-grid .data-container td.key-column div.primitive-value,
+.indexed-db-data-view .data-grid .data-container td.primaryKey-column div.primitive-value {
+    padding-left: 5px;
+    margin-top: 1px;
+}
+
+.indexed-db-data-view .data-grid .data-container td .section .header .title {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/inspector.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/inspector.css
new file mode 100644 (file)
index 0000000..62304a4
--- /dev/null
@@ -0,0 +1,3569 @@
+/* dialog.css */
+
+.dialog {
+    position: absolute;
+    
+    padding: 10px;
+    border-radius: 10px;
+    border: 1px solid gray;
+
+    box-shadow: rgb(40,40,40) 0 0 50px;
+    
+    display: -webkit-flex;
+    -webkit-flex-direction: column;
+    
+    background-image: linear-gradient(to bottom, #E9E9E9, #CFCFCF);
+}
+
+.dialog-contents {
+    width: 100%;
+}
+
+.go-to-line-dialog {
+    font-size: 11px;
+    font-family: 'Lucida Grande', sans-serif;
+}
+
+.go-to-line-dialog input {
+    font-size: 11px;
+}
+
+.go-to-line-dialog button {
+    font-size: 11px;
+    color: rgb(6, 6, 6);
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));
+    border-radius: 12px;
+    -webkit-appearance: none;
+
+    padding: 3px 20px;
+    margin: 0 0 0 10px;
+}
+
+.go-to-line-dialog button:active {
+    background-color: rgb(215, 215, 215);
+    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));
+}
+
+
+/* tabbedPane.css */
+
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>
+ * Copyright (C) 2011 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.
+ */
+.tabbed-pane {
+    flex: auto;
+    overflow: hidden;
+}
+
+.tabbed-pane-content {
+    position: relative;
+    overflow: auto;
+    flex: auto;
+    display: flex;
+    flex-direction: column;
+}
+
+.tabbed-pane-content.has-no-tabs {
+    background-color: lightgray;
+}
+
+.tabbed-pane-placeholder {
+    font-size: 14px;
+    text-align: center;
+    margin-top: 20px;
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+}
+
+.tabbed-pane-header {
+    flex: 0 0 23px;
+    border-bottom: 1px solid rgb(163, 163, 163);
+    overflow: hidden;
+    width: 100%;
+}
+
+.tabbed-pane-header-contents {
+    margin: 0 10px;
+}
+
+.tabbed-pane-header-tabs {
+    float: left;
+}
+
+.tabbed-pane-header-tab {
+    float: left;
+    margin-top: 2px;
+    padding: 2px 4px 2px 4px;
+    height: 21px;
+    border: 1px solid transparent;
+    border-bottom: none;
+    line-height: 15px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    cursor: default;
+}
+
+.tabbed-pane-header-tab.measuring {
+    visibility: hidden;
+}
+
+.tabbed-pane-header-tab.selected {
+    border: 1px solid rgb(163, 163, 163);
+    border-bottom: none;
+}
+
+.tabbed-pane-header-tab.selected {
+    background: white;
+    border-top-color: #bbb;
+}
+
+.tabbed-pane-header-tab .close-button-gray {
+    position: relative;
+    top: 2px;
+    left: 1px;
+    margin-left: 2px;
+    margin-top: -3px;
+    visibility: hidden;
+}
+
+.tabbed-pane-header-tab:hover .close-button-gray,
+.tabbed-pane-header-tab.selected .close-button-gray {
+    visibility: visible;
+}
+
+.tabbed-pane-header-tab-icon {
+    width: 11px;
+    height: 10px;
+    margin-top: 3px;
+    float: left;
+    display: block;
+    margin-right: 1px;
+}
+
+.tabbed-pane-header-tabs-drop-down-container {
+    float: left;
+    position: relative;
+    vertical-align: bottom;
+    padding-left: 3px;
+    line-height: 20px;
+}
+
+.tabbed-pane-header-tabs-drop-down-container.measuring {
+    visibility: hidden;
+}
+
+.tabbed-pane-header-tabs-drop-down {
+    position: relative;
+    opacity: 0.7;
+    color: rgb(30, 30, 30);
+    font-size: 133%;
+    padding: 0 3px;
+}
+
+.tabbed-pane-header-tabs-drop-down:hover {
+    opacity: 1.0;
+}
+
+.tabbed-pane-header-tabs-drop-down:active {
+    opacity: 0.8;
+}
+
+.tabbed-pane-header-tabs-drop-down > select.drop-down-menu {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    opacity: 0;
+    font-size: 75%;
+    width: 20px;
+}
+
+/* inspector.css */
+
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+input[type="search"]:focus,
+input[type="text"]:focus {
+    outline: auto 5px -webkit-focus-ring-color;
+}
+
+input[type="checkbox"] {
+    height: 12px;
+    width: 12px;
+    margin: auto 3px;
+    flex-shrink: 0;
+}
+
+label:hover {
+    cursor: pointer;
+}
+
+label:hover input {
+    box-shadow: 0 0 3px highlight;
+}
+
+fieldset[disabled] label:hover input {
+    box-shadow: none;
+}
+
+.fill {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.view {
+    position: relative;
+    flex: auto;
+}
+
+.hbox {
+    display: flex;
+    flex-direction: row !important;
+    position: relative;
+}
+
+.vbox {
+    display: flex;
+    flex-direction: column !important;
+    position: relative;
+}
+
+.flex-auto {
+    flex: auto;
+}
+
+.inline-block {
+    display: inline-block;
+}
+
+.hidden {
+    display: none !important;
+}
+
+.nowrap,
+.nowrap-below,
+.nowrap-below div,
+.nowrap-below span {
+    white-space: nowrap !important;
+}
+
+.toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(191, 191, 191), rgb(151, 151, 151));
+    padding-left: 1px;
+    border-bottom: 1px solid rgb(64%, 64%, 64%);
+    background-origin: padding-box;
+    background-clip: padding-box;
+}
+
+.toolbar {
+    flex: 0 0 24px;
+    display: flex;
+    flex-direction: row;
+    position: relative;
+}
+
+.toolbar .tabbed-pane-header {
+    border: none;
+}
+
+.toolbar .tabbed-pane-header-contents {
+    margin: 0;
+}
+
+.toolbar .tabbed-pane-header-tab {
+    border-width: 0 2px 0 2px;
+    background: none;
+    padding-right: 3px;
+}
+
+.toolbar .tabbed-pane-header-tab.selected {
+    border-width: 0 2px 0 2px;
+    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;
+}
+
+.toolbar button.status-bar-item {
+    border: none;
+    margin: 0 -2px;
+}
+
+button,
+input,
+select {
+  font-family: inherit;
+  font-size: inherit;
+}
+
+body.inactive .toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(233, 233, 233), rgb(207, 207, 207));
+}
+
+body.dock-to-bottom .toolbar-background {
+    padding-top: 0;
+}
+
+body.dock-to-bottom .toolbar-background .tabbed-pane-header {
+    cursor: ns-resize;
+}
+
+body.dock-to-bottom .toolbar-background .tabbed-pane-header .tabbed-pane-header-tabs {
+    cursor: default;
+}
+
+body.platform-windows .toolbar-background,
+body.platform-windows.inactive .toolbar-background {
+    background-image: none;
+}
+
+body.undocked.platform-mac-leopard .toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(175, 175, 175), rgb(151, 151, 151)) !important;
+    color: #333 !important;
+}
+
+body.undocked.platform-mac-leopard.inactive .toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(221, 221, 221), rgb(207, 207, 207)) !important;
+    color: #555 !important;
+}
+
+body.undocked.platform-mac-snowleopard .toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(189, 189, 189), rgb(167, 167, 167)) !important;
+    color: #333 !important;
+}
+
+body.undocked.platform-mac-snowleopard.inactive .toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(228, 228, 228), rgb(216, 216, 216)) !important;
+    color: #555 !important;
+}
+
+body.undocked.platform-mac .toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(208, 208, 208), rgb(200, 200, 200)) !important;
+    color: #333 !important;
+}
+
+body.undocked.platform-mac.inactive .toolbar-background {
+    background-image: linear-gradient(to bottom, rgb(238, 238, 238), rgb(224, 224, 224)) !important;
+    color: #555 !important;
+}
+
+.toolbar > .tabbed-pane-header {
+    flex: auto;
+}
+
+.toolbar-controls-left {
+    flex: none;
+    opacity: 0.8;
+    padding-top: 1px;
+}
+
+.toolbar-controls-right {
+    flex: none;
+    margin-right: 2px;
+    padding-top: 1px;
+}
+
+.toolbar-controls-right #error-warning-count,
+.toolbar-controls-right .console-status-bar-item,
+.toolbar-controls-right .settings-status-bar-item,
+.toolbar-controls-right .dock-status-bar-item
+{
+    opacity: 0.8;
+}
+
+.scrollable-content {
+    position: static;
+    height: 100%;
+    overflow-y: auto;
+    width: 100%;
+    margin-right: 12px;
+    padding-right: 3px;
+}
+
+.scrollable-content::-webkit-scrollbar {
+    width: 11px;
+}
+
+.scrollable-content::-webkit-scrollbar-corner,
+.scrollable-content::-webkit-resizer {
+    display: none;
+}
+
+.scrollable-content::-webkit-scrollbar-thumb:vertical {
+    background: linear-gradient(to right, rgb(192, 192, 192), rgb(214, 214, 214) 40%, rgb(192, 192, 192));
+    border-radius: 5px;
+    min-height: 20px;
+}
+
+.scrollable-content::-webkit-scrollbar-thumb:vertical:hover,
+.scrollable-content::-webkit-scrollbar-thumb:vertical:active {
+    background: linear-gradient(to right, rgb(230, 230, 230), rgb(252, 252, 252) 40%, rgb(230, 230, 230));
+}
+
+.scrollable-content::-webkit-scrollbar-track:vertical {
+    background: linear-gradient(to right, rgb(128, 128, 128), rgb(164, 164, 164) 25%, rgb(164, 164, 164));
+    border-radius: 5px;
+}
+
+.search-replace {
+    -webkit-appearance: none;
+    border: 0;
+    padding: 0 3px;
+    margin: 0;
+    flex: 1;
+}
+
+.search-replace:focus {
+    outline: none;
+}
+
+#search-input-field {
+    height: 18px;
+}
+
+.toolbar-search {
+    border-spacing: 1px;
+}
+
+.toolbar-search td {
+    padding: 0 5px 0 0;
+}
+
+.toolbar-search td > span {
+    display: flex;
+}
+
+.toolbar-search-navigation-controls {
+    vertical-align: top;
+    background-image: linear-gradient(rgb(228, 228, 228), rgb(206, 206, 206));
+}
+
+.toolbar-search-navigation {
+    display: inline-block;
+    width: 18px;
+    height: 18px;
+    background-repeat: no-repeat;
+    background-position: 4px 7px;
+    border-left: 1px solid rgb(170, 170, 170);
+    opacity: 0.3;
+}
+
+.toolbar-search-navigation.enabled {
+    opacity: 1.0;
+}
+
+.toolbar-search label {
+    margin: auto 0;
+}
+
+.toolbar-search button {
+    border: 1px solid rgb(163, 163, 163);
+    border-radius: 8px;
+    margin: 0;
+    background-image: linear-gradient(rgb(241, 241, 241), rgb(220, 220, 220));
+    width: 100%;
+    height: 20px;
+}
+
+.toolbar-search button:active {
+    background-image: linear-gradient(rgb(185, 185, 185), rgb(156, 156, 156));
+}
+
+.toolbar-search-control {
+    display: -webkit-flex;
+    width: 253px;
+    position: relative;
+    background-color: white;
+    border: 1px solid rgb(163, 163, 163);
+    height: 20px;
+    border-radius: 2px;
+    margin-left: 1px;
+}
+
+.toolbar-replace-control {
+    border: 1px solid rgb(163, 163, 163);
+    height: 20px;
+    border-radius: 2px;
+    width: 100%;
+    margin: auto 0;
+}
+
+.toolbar-search-navigation.enabled:active {
+    background-position: 4px 7px, 0 0;
+}
+
+.toolbar-search-navigation.toolbar-search-navigation-prev {
+    background-image: url(Images/searchPrev.png);
+    border-left: 1px solid rgb(163, 163, 163);
+}
+
+.toolbar-search-navigation.toolbar-search-navigation-prev.enabled:active {
+    background-image: url(Images/searchPrev.png), linear-gradient(rgb(168, 168, 168), rgb(116, 116, 116));
+}
+
+.toolbar-search-navigation.toolbar-search-navigation-next {
+    background-image: url(Images/searchNext.png);
+    border-left: 1px solid rgb(230, 230, 230);
+}
+
+.toolbar-search-navigation.toolbar-search-navigation-next.enabled:active {
+    background-image: url(Images/searchNext.png), linear-gradient(rgb(168, 168, 168), rgb(116, 116, 116));
+}
+
+.search-results-matches {
+    display: inline-block;
+    min-height: 10px;
+    text-align: right;
+    font-size: 11px;
+    padding: 1px 4px;
+    color: rgb(165, 165, 165);
+}
+
+.close-button,
+.close-button-gray {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    display: inline-block;
+}
+
+.close-button {
+    width: 14px;
+    height: 14px;
+    background-position: -128px -96px;
+}
+
+.close-button-gray {
+    width: 13px;
+    height: 13px;
+    background-position: -175px -96px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.close-button,
+.close-button-gray {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.close-button:hover {
+    background-position: -96px -96px;
+}
+
+.close-button:active {
+    background-position: -111px -96px;
+}
+
+.close-button-gray:hover {
+    background-position: -143px -96px;
+}
+
+.close-button-gray:active {
+    background-position: -160px -96px;
+}
+
+body.undocked .toolbar-item .close-button {
+    display: none;
+}
+
+body.remote .toolbar-item .close-button {
+    display: none;
+}
+
+.panel-status-bar {
+    border-top: none;
+    display: flex;
+    background-color: white;
+    flex: 0 0 23px;
+    position: relative;
+}
+
+.panel-status-bar > div {
+    margin: auto 0;
+}
+
+.panel-status-bar label {
+    margin: auto 0;
+    margin-right: 20px;
+    display: flex;
+    white-space: nowrap;
+    overflow: hidden;
+}
+
+.status-bar {
+    position: relative;
+    white-space: nowrap;
+    height: 23px;
+    overflow: hidden;
+    width: 100%;
+    z-index: 12;
+    border-top: 1px solid rgb(202, 202, 202);
+    display: -webkit-flex;
+}
+
+.status-bar > div {
+    display: inline-flex;
+    overflow: visible;
+}
+
+.status-bar-item {
+    display: inline-block;
+    height: 22px;
+    padding: 0;
+    margin-left: -1px;
+    margin-right: 0;
+    vertical-align: top;
+    border: 0 transparent none;
+    background-color: transparent;
+    flex: none;
+}
+
+.status-bar-text {
+    padding-left: 5px;
+    padding-right: 15px;
+    height: auto;
+    margin: auto 0;
+    white-space: nowrap;
+    overflow: hidden;
+}
+
+#drawer-view-anchor {
+    display: inline-block;
+}
+
+.status-bar-item:active {
+    position: relative;
+    z-index: 200;
+}
+
+.glyph {
+    position: absolute;
+    top: -1px;
+    bottom: 1px;
+    left: 0;
+    right: 0;
+    background-color: rgba(0, 0, 0, 0.75);
+    z-index: 1;
+}
+
+.glyph.shadow {
+    top: 0;
+    bottom: 0;
+    background-color: white;
+    z-index: 0;
+}
+
+.long-click-glyph {
+    background-color: rgba(0, 0, 0, 0.75);
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-position: -288px -48px;
+    -webkit-mask-size: 320px 144px;
+    z-index: 1;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.long-click-glyph {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.long-click-glyph.shadow {
+    top: 1px;
+    background-color: white !important;
+    z-index: 0;
+}
+
+button.status-bar-item {
+    position: relative;
+    width: 32px;
+}
+
+.status-bar button.status-bar-item .glyph {
+    margin: 0 -1px;
+}
+
+button.status-bar-item .glyph.shadow {
+    background-color: rgba(255, 255, 255, 0.33);
+}
+
+button.status-bar-item.toggled-on .glyph:not(.shadow) {
+    background-color: rgb(66, 129, 235) !important;
+}
+
+button.status-bar-item:hover .glyph {
+    opacity: 1;
+}
+
+button.status-bar-item:disabled {
+    background-position: 0 0 !important;
+}
+
+button.status-bar-item:disabled .glyph {
+    opacity: 0.5 !important;
+}
+
+button.status-bar-item.extension {
+    background-image: none;
+}
+
+.status-bar-select-container {
+    display: inline-flex;
+    flex-shrink: 0;
+}
+
+.status-bar-select-arrow {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.7;
+    width: 12px;
+    height: 12px;
+    background-position: -18px -96px;
+    display: inline-block;
+    pointer-events: none;
+    margin: auto 0;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.status-bar-select-arrow {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+input.status-bar-item {
+    width: 200px;
+    height: 20px;
+    padding: 3px;
+    margin: 1px 3px;
+    background-color: white;
+    border: solid 1px rgb(236, 236, 236);
+}
+
+input.status-bar-item:focus,
+input.status-bar-item:hover {
+    border: solid 1px rgb(202, 202, 202);
+}
+
+select.status-bar-item {
+    min-width: 48px;
+    color: rgb(48, 48, 48);
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+    -webkit-appearance: none;
+    border: 0;
+    border-radius: 0;
+    padding: 0 15px 0 5px;
+    margin-right: -10px;
+    position: relative;
+    line-height: 22px;
+}
+
+.status-bar-item.checkbox {
+    margin: auto 0;
+    height: auto;
+    display: flex;
+}
+
+.status-bar-item > .glyph {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-size: 320px 144px;
+    opacity: 0.8;
+}
+
+.console-filter > .glyph {
+    -webkit-mask-position: -32px -48px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.status-bar-item > .glyph {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+button.status-bar-item.dock-status-bar-item.toggled-undocked .glyph {
+    -webkit-mask-position: 0 -48px;
+}
+
+button.status-bar-item.dock-status-bar-item.toggled-bottom .glyph {
+    -webkit-mask-position: -32px -24px;
+}
+
+button.status-bar-item.dock-status-bar-item.toggled-right .glyph {
+    -webkit-mask-position: -256px -48px;
+}
+
+button.status-bar-item.dock-status-bar-item.toggled-left .glyph {
+    -webkit-mask-position: -32px -120px;
+}
+
+body.undocked .alternate-status-bar-buttons-bar {
+    margin-left: 1px;
+}
+
+.alternate-status-bar-buttons-bar {
+    position: absolute;
+    width: 31px;
+    bottom: -3px;
+    background: white;
+}
+
+.alternate-status-bar-buttons-bar .status-bar-item {
+    height: 24px;
+    margin-top: -1px;
+    border: 1px solid rgb(202, 202, 202);
+}
+
+.alternate-status-bar-buttons-bar .status-bar-item.emulate-active {
+    background-color: rgb(163,163,163);
+    border: 1px solid rgb(120, 120, 120);
+}
+
+button.status-bar-item.settings-status-bar-item,
+button.status-bar-item.settings-status-bar-item:active {
+    border-right: 0 transparent none;
+}
+
+div.resizer-widget {
+    position: absolute;
+    top: 0;
+    right: 0;
+    height: 24px;
+    width: 16px;
+    background-image: url(Images/statusbarResizerHorizontal.png);
+    background-repeat: no-repeat;
+    background-position: center;
+    z-index: 13;
+}
+
+.ns-resizer-widget {
+    cursor: ns-resize;
+}
+
+.ew-resizer-widget {
+    cursor: ew-resize;
+}
+
+.settings-status-bar-item .glyph {
+    -webkit-mask-position: -160px -24px;
+}
+
+body.remote .dock-status-bar-item {
+    display: none;
+}
+
+.console-status-bar-item .glyph {
+    -webkit-mask-position: -64px -24px;
+}
+
+.screencast-status-bar-item.toggled-left .glyph {
+    -webkit-mask-position: -256px -96px;
+}
+
+.screencast-status-bar-item.toggled-top .glyph {
+    -webkit-mask-position: -288px -96px;
+}
+
+.screencast-status-bar-item.toggled-disabled .glyph {
+    -webkit-mask-position: 0px -120px;
+}
+
+.clear-status-bar-item .glyph {
+    -webkit-mask-position: -64px 0;
+}
+
+.error-icon-small,
+.warning-icon-small,
+.red-ball,
+.green-ball,
+.orange-ball {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    width: 10px;
+    height: 10px;
+    display: inline-block;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.error-icon-small,
+.warning-icon-small,
+.red-ball,
+.green-ball,
+.orange-ball {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.error-icon-small {
+    background-position: -213px -96px;
+}
+
+.warning-icon-small {
+    background-position: -202px -107px;
+}
+
+.red-ball {
+    background-position: -224px -96px;
+}
+
+.green-ball {
+    background-position: -235px -96px;
+}
+
+.orange-ball {
+    background-position: -246px -96px;
+}
+
+#error-warning-count {
+    display: inline-block;
+    padding: 4px 6px 6px 0;
+    font-size: 11px;
+    height: 19px;
+    cursor: pointer;
+    line-height: 14px;
+}
+
+#error-warning-count:hover {
+    border-bottom: 1px solid rgb(96, 96, 96);
+}
+
+#error-warning-count .error-icon-small,
+#error-warning-count .warning-icon-small {
+    vertical-align: -1px;
+    margin-right: 2px;
+}
+
+#error-warning-count .warning-icon-small {
+    margin-left: 6px;
+}
+
+#drawer-tabbed-pane > .tabbed-pane-header {
+    background-color: rgb(236, 236, 236);
+}
+
+#drawer-contents .tabbed-pane-header .tabbed-pane-header-tab {
+    cursor: default;
+}
+
+body.platform-mac .monospace,
+body.platform-mac .source-code {
+    font-size: 11px !important;
+    font-family: Menlo, monospace;
+}
+
+body.platform-mac.platform-mac-tiger .monospace,
+body.platform-mac.platform-mac-tiger .source-code {
+    font-size: 10px !important;
+    font-family: Monaco, monospace;
+}
+
+body.platform-windows .monospace,
+body.platform-windows .source-code {
+    font-size: 12px !important;
+    font-family: Consolas, Lucida Console, monospace;
+}
+
+body.platform-linux .monospace,
+body.platform-linux .source-code {
+    font-size: 11px !important;
+    font-family: dejavu sans mono, monospace;
+}
+
+.console-view {
+    background-color: white;
+}
+
+.console-view-wrapper {
+    background-color: rgb(236, 236, 236);
+}
+
+.console-status-bar,
+.console-filters-header {
+    flex: 0 0 23px;
+    overflow: hidden;
+}
+
+.console-status-bar {
+    display: flex;
+}
+
+#console-messages {
+    flex: 1 1;
+    padding: 2px 0;
+    overflow-y: auto;
+    word-wrap: break-word;
+    -webkit-user-select: text;
+    border-top: 1px solid rgb(230, 230, 230);
+    -webkit-transform: translateZ(0);
+}
+
+#console-prompt {
+    clear: right;
+    position: relative;
+    padding: 1px 22px 1px 0;
+    margin-left: 24px;
+    min-height: 16px;
+    white-space: pre-wrap;
+    -webkit-user-modify: read-write-plaintext-only;
+}
+
+#console-prompt::before {
+    background-position: -192px -96px;
+}
+
+.console-user-command-result.console-log-level::before {
+    background-position: -202px -96px;
+}
+
+.console-message,
+.console-user-command {
+    clear: right;
+    position: relative;
+    border-bottom: 1px solid rgb(240, 240, 240);
+    padding: 1px 22px 1px 0;
+    margin-left: 24px;
+    min-height: 16px;
+}
+
+.console-mesage:first-child {
+    border-top: none;
+}
+
+.console-adjacent-user-command-result {
+    border-bottom: none;
+}
+
+.console-adjacent-user-command-result + .console-user-command-result.console-log-level::before {
+    background-image: none;
+}
+
+.console-timestamp {
+    color: gray;
+    margin-right: 10px;
+    -webkit-user-select: none;
+}
+
+.console-message::before,
+.console-user-command::before,
+#console-prompt::before,
+.console-group-title::before {
+    position: absolute;
+    display: block;
+    content: "";
+    left: -17px;
+    top: 0.8em;
+    width: 10px;
+    height: 10px;
+    margin-top: -6px;
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.console-message::before,
+.console-user-command::before,
+#console-prompt::before,
+.console-group-title::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.console-message > .outline-disclosure li.parent::before {
+    top: 0;
+}
+
+.console-message .outline-disclosure .stacktrace-entry:hover {
+    background-color: rgba(0, 0, 0, 0.05);
+}
+
+.console-message .bubble {
+    display: inline-block;
+    height: 14px;
+    background-color: rgb(128, 151, 189);
+    vertical-align: middle;
+    white-space: nowrap;
+    padding: 1px 4px;
+    margin-top: -1px;
+    margin-right: 4px;
+    margin-left: -18px;
+    text-align: left;
+    font-size: 11px;
+    line-height: normal;
+    font-weight: bold;
+    text-shadow: none;
+    color: white;
+    border-radius: 7px;
+}
+
+.console-message-text {
+    white-space: pre-wrap;
+}
+
+.repeated-message.console-error-level::before,
+.repeated-message.console-warning-level:before,
+.repeated-message.console-debug-level:before,
+.repeated-message.console-info-level:before {
+    visibility: hidden;
+}
+
+.repeated-message .outline-disclosure,
+.repeated-message > .console-message-text {
+    -webkit-flex: 1;
+}
+
+.console-info {
+    color: rgb(128, 128, 128);
+    font-style: italic;
+}
+
+.console-group .console-group > .console-group-messages {
+    margin-left: 16px;
+}
+
+.console-group-title {
+    font-weight: bold;
+}
+
+.console-group-title::before {
+    -webkit-user-select: none;
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-size: 320px 144px;
+    float: left;
+    width: 8px;
+    content: "a";
+    color: transparent;
+    text-shadow: none;
+    margin-left: 3px;
+    margin-top: -7px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.console-group-title::before {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.console-group .console-group-title::before {
+    -webkit-mask-position: -20px -96px;
+    background-color: rgb(110, 110, 110);
+}
+
+.console-group.collapsed .console-group-title::before {
+    -webkit-mask-position: -4px -96px;
+}
+
+.console-group.collapsed > .console-group-messages {
+    display: none;
+}
+
+.console-group {
+    position: relative;
+}
+
+.console-group-bracket {
+    position:absolute;
+    top: 15px;
+    left: 13px;
+    bottom: 5px;
+    width: 3px;
+    border-style: solid;
+    border-color: #A3A3A3;
+    border-width: 0 0 1px 1px;
+}
+
+.console-group.collapsed > .console-group-bracket {
+    display: none;
+}
+
+.console-error-level .console-message-text,
+.console-error-level .section > .header .title {
+    color: red !important;
+}
+
+.console-debug-level .console-message-text {
+    color: blue;
+}
+
+.console-error-level::before,
+.console-warning-level::before,
+.console-debug-level::before,
+.console-info-level::before {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    width: 10px;
+    height: 10px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.console-error-level::before,
+.console-warning-level::before,
+.console-debug-level::before,
+.console-info-level::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.console-warning-level::before {
+    background-position: -202px -107px;
+}
+
+.console-error-level::before {
+    background-position: -213px -96px;
+}
+
+.console-info-level::before {
+    background-position: -213px -107px;
+}
+
+.console-user-command .console-message {
+    margin-left: -24px;
+    padding-right: 0;
+    border-bottom: none;
+}
+
+.console-user-command::before {
+    background-position: -192px -107px;
+}
+
+.console-user-command > .console-message-text {
+    color: rgb(0, 128, 255);
+}
+
+#console-messages .link {
+    text-decoration: underline;
+}
+
+#console-messages .link,
+#console-messages a {
+    color: rgb(33%, 33%, 33%);
+    cursor: pointer;
+}
+
+#console-messages .link:hover,
+#console-messages a:hover {
+    color: rgb(15%, 15%, 15%);
+}
+
+ol.watch-expressions > li.hovered {
+    background-color: #F0F0F0;
+}
+
+.console-message-url {
+    float: right;
+    text-align: right;
+    max-width: 100%;
+    margin-left: 4px;
+}
+
+.console-group-messages .section {
+    margin: 0 0 0 12px !important;
+}
+
+.console-group-messages .section > .header {
+    padding: 0 8px 0 0;
+    background-image: none;
+    border: none;
+    min-height: 0;
+}
+
+.console-group-messages .section > .header::before {
+    margin-left: -12px;
+}
+
+.console-group-messages .section > .header .title {
+    color: #222;
+    font-weight: normal;
+    line-height: 13px;
+}
+
+.console-group-messages .section .properties li .info {
+    padding-top: 0;
+    padding-bottom: 0;
+    color: rgb(60%, 60%, 60%);
+}
+
+.console-group-messages .outline-disclosure {
+    padding-left: 0;
+}
+
+.console-group-messages .outline-disclosure > ol {
+    padding: 0 0 0 12px !important;
+}
+
+.console-group-messages .outline-disclosure,
+.console-group-messages .outline-disclosure ol {
+    font-size: inherit;
+    line-height: 12px;
+}
+
+.console-group-messages .outline-disclosure.single-node li {
+    padding-left: 2px;
+}
+
+.console-group-messages .outline-disclosure li .selection {
+    margin-left: -6px;
+    margin-right: -6px;
+}
+
+.console-group-messages .add-attribute {
+    display: none;
+}
+
+.console-formatted-object,
+.console-formatted-node,
+.console-formatted-array {
+    position: relative;
+    display: inline-block;
+    vertical-align: top;
+    color: inherit;
+}
+
+.console-formatted-node:hover {
+    background-color: rgba(56, 121, 217, 0.1);
+}
+
+.console-formatted-object .section,
+.console-formatted-node .section,
+.console-formatted-array .section {
+    position: static;
+}
+
+.console-formatted-object .section > .header::before {
+    margin-top: 0;
+}
+
+.console-formatted-object .properties,
+.console-formatted-node .properties {
+    padding-left: 0 !important;
+}
+
+.console-formatted-number {
+    color: rgb(28, 0, 207);
+}
+
+.console-formatted-string,
+.console-formatted-regexp {
+    color: rgb(196, 26, 22);
+    white-space: pre;
+    unicode-bidi: -webkit-isolate;
+}
+
+.console-formatted-null,
+.console-formatted-undefined {
+    color: rgb(128, 128, 128);
+}
+
+.console-formatted-preview-node,
+.section .console-formatted-node {
+    color: rgb(136, 18, 128);
+}
+
+.console-object-preview {
+    font-style: italic;
+}
+
+.object-info-state-note {
+    display: inline-block;
+    width: 11px;
+    height: 11px;
+    background-color: rgb(179, 203, 247);
+    color: white;
+    text-align: center;
+    border-radius: 3px;
+    line-height: 13px;
+    margin: 0 6px;
+    font-size: 9px;
+}
+
+.object-info-state-note::before {
+    content: "i";
+}
+
+.section:not(.expanded) .object-info-state-note {
+    display: none;
+}
+
+.error-message {
+    color: red;
+}
+
+.error-input {
+    background-color: rgb(220, 130, 130);
+}
+
+.auto-complete-text,
+.editing .auto-complete-text {
+    color: rgb(128, 128, 128) !important;
+    -webkit-user-select: none;
+    -webkit-user-modify: read-only;
+}
+
+.panel {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 0;
+}
+
+.panel.visible {
+    display: flex;
+}
+
+.panel.extension-panel.visible {
+    display: flex !important;
+    flex-direction: column;
+}
+
+.extension-view {
+    flex: auto;
+}
+
+iframe.extension {
+    width: 100%;
+    height: 100%;
+}
+
+iframe.panel.extension {
+    display: block;
+    height: 100%;
+}
+
+.webkit-line-gutter-backdrop {
+    /* Keep this in sync with view-source.css (.webkit-line-gutter-backdrop) */
+    width: 31px;
+    background-color: rgb(240, 240, 240);
+    border-right: 1px solid rgb(187, 187, 187);
+    position: absolute;
+    z-index: -1;
+    left: 0;
+    top: 0;
+    height: 100%
+}
+
+.outline-disclosure li.hovered:not(.selected) .selection {
+    display: block;
+    left: 3px;
+    right: 3px;
+    background-color: rgba(56, 121, 217, 0.1);
+    border-radius: 5px;
+}
+
+.outline-disclosure li .selection {
+    display: none;
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 15px;
+    z-index: -1;
+}
+
+.outline-disclosure li.selected .selection {
+    display: block;
+    background-color: rgb(212, 212, 212);
+}
+
+.outline-disclosure li.elements-drag-over .selection {
+    display: block;
+    margin-top: -2px;
+    border-top: 2px solid rgb(56, 121, 217);
+}
+
+.outline-disclosure ol:focus li.selected .selection {
+    background-color: rgb(56, 121, 217);
+}
+
+.outline-disclosure ol:focus li.parent.selected::before {
+    background-color: white;
+}
+
+.outline-disclosure > ol {
+    position: relative;
+    padding: 2px 6px !important;
+    margin: 0;
+    cursor: default;
+    min-width: 100%;
+}
+
+.outline-disclosure,
+.outline-disclosure ol {
+    list-style-type: none;
+    -webkit-padding-start: 12px;
+    margin: 0;
+}
+
+.source-code {
+    font-family: monospace;
+    font-size: 11px !important;
+    white-space: pre-wrap;
+}
+
+.outline-disclosure li {
+    padding: 0 0 0 14px;
+    margin-top: 1px;
+    margin-left: -2px;
+    word-wrap: break-word;
+}
+
+.outline-disclosure ol:focus li.selected {
+    color: white;
+}
+
+.outline-disclosure ol:focus li.selected * {
+    color: inherit;
+}
+
+.outline-disclosure li.parent {
+    margin-left: -12px
+}
+
+.outline-disclosure li .webkit-html-tag.close {
+    margin-left: -12px;
+}
+
+.outline-disclosure li.parent::before {
+    float: left;
+    width: 10px;
+    padding-right: 2px;
+}
+
+.outline-disclosure li.parent::before {
+    -webkit-user-select: none;
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-size: 320px 144px;
+    content: "a";
+    color: transparent;
+    text-shadow: none;
+    position: relative;
+    top: 2px;
+    margin-right: 1px;
+    height: 12px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.outline-disclosure li.parent::before {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.outline-disclosure li.parent::before {
+    -webkit-mask-position: -4px -96px;
+    background-color: rgb(110, 110, 110);
+}
+
+.outline-disclosure li.parent.expanded::before {
+    -webkit-mask-position: -20px -96px;
+}
+
+.outline-disclosure ol.children {
+    display: none;
+}
+
+.outline-disclosure ol.children.expanded {
+    display: block;
+}
+
+.placard {
+    position: relative;
+    border-top: 1px solid transparent;
+    padding: 3px 8px 4px 18px;
+    min-height: 18px;
+    white-space: nowrap;
+}
+
+.placard:nth-of-type(2n) {
+    background-color: rgb(234, 243, 255);
+}
+
+.placard.selected {
+    border-top: 1px solid rgb(172, 172, 172);
+    background-image: linear-gradient(to bottom, rgb(182, 182, 182), rgb(162, 162, 162));
+    background-origin: padding-box;
+    background-clip: padding-box;
+}
+
+:focus .placard.selected {
+    border-top: 1px solid rgb(70, 103, 215);
+    background-image: linear-gradient(to bottom, rgb(92, 147, 213), rgb(56, 121, 217));
+}
+
+.placard .title {
+    font-weight: normal;
+    word-wrap: break-word;
+    white-space: normal;
+}
+
+.placard.selected .title {
+    color: white;
+    font-weight: bold;
+}
+
+.placard .subtitle {
+    float: right;
+    font-size: 10px;
+    margin-left: 5px;
+    color: rgba(0, 0, 0, 0.7);
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.placard.selected .subtitle {
+    color: rgba(255, 255, 255, 0.7);
+}
+
+.placard .subtitle a {
+    color: inherit;
+}
+
+.placard-label {
+    text-align: center;
+}
+
+.placard-label .title,
+.placard-label .subtitle {
+    font-style: italic;
+    font-weight: bold;
+    color: #999;
+}
+
+.section {
+    position: relative;
+    margin-top: 1px;
+}
+
+.events-pane .section {
+    margin: 0;
+}
+.events-pane .section:not(:nth-of-type(1)) {
+    border-top: 1px solid rgb(231, 231, 231);
+}
+
+.section > .header {
+    padding: 0px 8px 0 5px;
+    min-height: 18px;
+    white-space: nowrap;
+    background-origin: padding-box;
+    background-clip: padding-box;
+}
+
+.section > .header::before {
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    content: "a";
+    color: transparent;
+    text-shadow: none;
+    float: left;
+    width: 8px;
+    margin-right: 4px;
+    margin-top: 2px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.section > .header::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.section > .header::before {
+    background-position: -4px -96px;
+}
+
+.section.expanded > .header::before {
+    background-position: -20px -96px;
+}
+
+.section > .header .title,
+.event-bar .header .title {
+    font-weight: normal;
+    word-wrap: break-word;
+    white-space: normal;
+    line-height: 18px;
+}
+
+.section > .header .title.blank-title {
+    font-style: italic;
+}
+
+.section > .header label,
+.event-bar .header label {
+    display: none;
+}
+
+.section.expanded .header label,
+.event-bar.expanded .header label {
+    display: inline;
+}
+
+.section > .header .subtitle,
+.event-bar .header .subtitle {
+    float: right;
+    margin-left: 5px;
+    max-width: 55%;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.section > .header .subtitle a {
+    color: inherit;
+}
+
+.section .properties,
+.event-bar .event-properties {
+    display: none;
+}
+
+.section.expanded .properties,
+.event-bar.expanded .event-properties {
+    display: block;
+}
+
+.event-bar .event-properties {
+    padding-left: 16px;
+}
+
+.section.no-affect .properties li {
+    opacity: 0.5;
+}
+
+.section.no-affect .properties li.editing {
+    opacity: 1.0;
+}
+
+.properties-tree {
+    margin: 0;
+    padding: 0 6px 2px;
+    list-style: none;
+    min-height: 18px;
+}
+
+.properties-tree li {
+    margin-left: 12px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-user-select: text;
+    cursor: default;
+    padding-top: 2px;
+    line-height: 12px;
+}
+
+.properties-tree li.parent {
+    margin-left: 1px;
+}
+
+
+.properties-tree li.parent::before {
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    content: "a";
+    width: 8px;
+    float: left;
+    margin-right: 4px;
+    color: transparent;
+    text-shadow: none;
+}
+
+.properties-calculate-value-button:hover {
+    text-decoration: underline;
+}
+
+.properties-accessor-property-name {
+    font-style: italic;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.properties-tree li.parent::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.properties-tree li.parent::before {
+    background-position: -4px -96px;
+}
+
+.properties-tree li.parent.expanded::before {
+    background-position: -20px -96px;
+}
+
+.properties-tree li .info {
+    padding-top: 4px;
+    padding-bottom: 3px;
+}
+
+.properties-tree ol {
+    display: none;
+    margin: 0;
+    -webkit-padding-start: 12px;
+    list-style: none;
+}
+
+.properties-tree ol.expanded {
+    display: block;
+}
+
+.editing {
+    -webkit-user-select: text;
+    box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;
+    outline: 1px solid rgb(66%, 66%, 66%) !important;
+    background-color: white;
+    -webkit-user-modify: read-write-plaintext-only;
+    text-overflow: clip !important;
+    padding-left: 2px;
+    margin-left: -2px;
+    padding-right: 2px;
+    margin-right: -2px;
+    margin-bottom: -1px;
+    padding-bottom: 1px;
+    opacity: 1.0 !important;
+}
+
+.editing,
+.editing * {
+    color: #222 !important;
+    text-decoration: none !important;
+}
+
+.child-editing {
+    color: #222 !important;
+    text-decoration: none !important;
+    overflow: visible !important;
+}
+
+.editing br {
+    display: none;
+}
+
+.section .properties li.editing {
+    margin-left: 10px;
+    text-overflow: clip;
+}
+
+li.editing .swatch, li.editing .enabled-button,
+li.editing-sub-part .delete-button {
+    display: none !important;
+}
+
+.sidebar-tabbed-pane .watch-expressions {
+    margin-top: 17px;
+}
+
+.properties-tree.watch-expressions {
+    padding-left: 0 !important;
+}
+
+.properties-tree.watch-expressions > li {
+    padding-left: 4px;
+}
+
+.properties-tree.watch-expressions > li > .value {
+    display: inline;
+    position: static;
+}
+
+.properties-tree.watch-expressions > li:not(.parent) {
+    margin-left: 1px;
+    padding-left: 15px;
+}
+
+.properties-tree.watch-expressions > li.hovered {
+    padding-right: 14px;
+}
+
+.watch-expressions > li.editing-sub-part .text-prompt {
+    display: block;
+    width: 100%;
+    overflow: hidden;
+}
+
+.watch-expressions > li.editing-sub-part .value,
+.watch-expressions > li.editing-sub-part .separator  {
+    display: none;
+}
+
+.section .properties li.editing-sub-part {
+    padding: 3px 6px 8px 18px;
+    margin: -3px -6px -8px -6px;
+    text-overflow: clip;
+}
+
+.section .properties .delete-button {
+    width: 10px;
+    height: 10px;
+    background-image: url(Images/deleteIcon.png);
+    background-position: 0 0;
+    background-color: transparent;
+    background-repeat: no-repeat;
+    border: 0 none transparent;
+    position: absolute;
+    right: 8px;
+    display: none;
+}
+
+.section .properties li.hovered .delete-button {
+    display: inline;
+}
+
+.section .properties .name,
+.event-properties .name,
+.console-formatted-object .name {
+    color: rgb(136, 19, 145);
+}
+
+.section .properties .dimmed {
+    opacity: 0.6;
+}
+
+.section .properties .value.error {
+    color: red;
+}
+
+.section .properties .number,
+.event-properties .number {
+    color: blue;
+}
+
+.section .properties .keyword,
+.event-properties .keyword {
+    color: rgb(136, 19, 79);
+}
+
+.section .properties .color,
+.event-properties .color {
+    color: rgb(118, 15, 21);
+}
+
+.swatch {
+    margin-left: 1px;
+    margin-right: 2px;
+    width: 10px;
+    height: 10px;
+    position: relative;
+    top: 1px;
+    display: inline-block;
+    background-image: url(Images/checker.png);
+    -webkit-user-select: none;
+}
+
+.swatch-inner {
+    width: 100%;
+    height: 100%;
+    display: inline-block;
+    border: 1px solid rgba(128, 128, 128, 0.6);
+}
+
+.swatch-inner:hover {
+    border: 1px solid rgba(64, 64, 64, 0.8);
+}
+
+.sidebar {
+    overflow-x: hidden;
+    background-color: rgb(232, 232, 232);
+}
+
+.pane-title-button {
+    color: rgb(6, 6, 6);
+    background-color: transparent;
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));
+    border-radius: 12px;
+    -webkit-appearance: none;
+}
+
+.pane-title-button:active {
+    background-color: rgb(215, 215, 215);
+    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));
+}
+
+button.show-all-nodes {
+    font-size: 13px;
+    margin: 0;
+    padding: 0 20px;
+    height: 20px;
+    color: rgb(6, 6, 6);
+    background-color: transparent;
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));
+    border-radius: 12px;
+    -webkit-appearance: none;
+}
+
+body.inactive button.show-all-nodes {
+    color: rgb(130, 130, 130);
+    border-color: rgb(212, 212, 212);
+    background-color: rgb(239, 239, 239);
+    background-image: linear-gradient(to bottom, rgb(250, 250, 250), rgb(235, 235, 235));
+}
+
+button.show-all-nodes:active {
+    background-color: rgb(215, 215, 215);
+    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));
+}
+
+#console-messages.console-filter-top {
+    margin-top: 23px;
+}
+
+.scope-bar {
+    line-height: 19px;
+    padding-right: 10px;
+    overflow: hidden;
+}
+
+.scope-bar li {
+    display: inline-block;
+    margin: 0 2px;
+    padding: 2px 6px;
+    line-height: 12px;
+    background: transparent;
+    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;
+    border-radius: 8px;
+    vertical-align: middle;
+}
+
+.scope-bar-divider {
+    background-color: rgba(0, 0, 0, 0.4);
+    height: 16px;
+    width: 1px;
+    vertical-align: middle;
+    display: inline-block;
+}
+
+.scope-bar li.selected,
+.scope-bar li:hover,
+.scope-bar li:active {
+    color: white;
+    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
+}
+
+.scope-bar li.all {
+    margin: 0 8px;
+}
+
+.scope-bar li:hover {
+    background: rgba(0, 0, 0, 0.2);
+}
+
+.scope-bar li.selected {
+    background: rgba(0, 0, 0, 0.3);
+}
+
+.scope-bar li:active {
+    background: rgba(0, 0, 0, 0.5);
+}
+
+
+.console-warning-level.repeated-message,
+.console-error-level.repeated-message,
+.console-log-level.repeated-message,
+.console-debug-level.repeated-message,
+.console-info-level.repeated-message {
+    display: -webkit-flex;
+}
+
+.console-user-command-result {
+    display: block;
+}
+
+.source-view-frame {
+    width: 100%;
+    height: 100%;
+}
+
+.sidebar-resizer-vertical {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 5px;
+    z-index: 500;
+}
+
+.sidebar-tree,
+.sidebar-tree .children {
+    position: relative;
+    padding: 0;
+    margin: 0;
+    list-style: none;
+}
+
+.sidebar-tree-section {
+    position: relative;
+    height: 18px;
+    padding: 1px 10px 6px 10px;
+    white-space: nowrap;
+    margin-top: 1px;
+    color: rgb(92, 110, 129);
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+}
+
+.sidebar-tree-item {
+    position: relative;
+    height: 36px;
+    padding: 0 5px 0 5px;
+    white-space: nowrap;
+    overflow-x: hidden;
+    overflow-y: hidden;
+    margin-top: 1px;
+    line-height: 34px;
+    border-top: 1px solid transparent;
+}
+
+.sidebar-tree .children {
+    display: none;
+}
+
+.sidebar-tree .children.expanded {
+    display: block;
+}
+
+.sidebar-tree-section + .children > .sidebar-tree-item {
+    padding-left: 10px !important;
+}
+
+.sidebar-tree-section + .children.small > .sidebar-tree-item {
+    padding-left: 17px !important;
+}
+
+.sidebar-tree > .children > .sidebar-tree-item {
+    padding-left: 37px;
+}
+
+.sidebar-tree > .children > .children > .sidebar-tree-item {
+    padding-left: 37px;
+}
+
+.sidebar-tree.hide-disclosure-buttons > .children {
+    display: none;
+}
+
+.sidebar-tree > .children.hide-disclosure-buttons > .children {
+    display: none;
+}
+
+.sidebar-tree.some-expandable:not(.hide-disclosure-buttons) > .sidebar-tree-item:not(.parent) .icon {
+    margin-left: 16px;
+}
+
+.sidebar-tree-item .disclosure-button {
+    float: left;
+    width: 10px;
+    height: 10px;
+    border: 0;
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-size: 320px 144px;
+    -webkit-appearance: none;
+    background-color: rgba(0, 0, 0, 0.75);
+    position: relative;
+    top: 10px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.sidebar-tree-item .disclosure-button {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.sidebar-tree.hide-disclosure-buttons .sidebar-tree-item .disclosure-button {
+    display: none;
+}
+
+.sidebar-tree-item .disclosure-button {
+    -webkit-mask-position: -4px -96px;
+}
+
+.sidebar-tree-item.selected .disclosure-button {
+    background-color: white;
+    -webkit-mask-position: -4px -96px;
+}
+
+.sidebar-tree-item.expanded .disclosure-button {
+    -webkit-mask-position: -20px -96px;
+}
+
+.sidebar-tree-item.selected.expanded .disclosure-button {
+    background-color: white;
+    -webkit-mask-position: -20px -96px;
+}
+
+.sidebar-tree-item .icon {
+    float: left;
+    width: 32px;
+    height: 32px;
+    margin-top: 1px;
+    margin-right: 3px;
+}
+
+.sidebar-tree-item.wait .icon {
+    content: none;
+}
+
+.spinner-icon::before,
+.sidebar-tree-item.wait .icon::before {
+    display: block;
+    width: 24px;
+    height: 24px;
+    margin: 4px;
+    border: 3px solid grey;
+    border-radius: 12px;
+    clip: rect(0px, 15px, 15px, 0px);
+    content: "";
+    position: absolute;
+    -webkit-animation: spinner-animation 1s linear infinite;
+}
+
+.spinner-icon.small::before,
+.sidebar-tree-item.wait.small .icon::before {
+    width: 14px;
+    height: 14px;
+    margin: 1px;
+    clip: rect(0px, 9px, 9px, 0px);
+    border-width: 2px;
+}
+
+.sidebar-tree-item.wait.selected .icon::before {
+    border-color: white;
+}
+
+@-webkit-keyframes spinner-animation {
+    from { -webkit-transform: rotate(0); }
+    to { -webkit-transform: rotate(360deg); }
+}
+
+li .status {
+    float: right;
+    height: 16px;
+    margin-top: 9px;
+    margin-left: 4px;
+    line-height: 1em;
+}
+
+li .status:empty {
+    display: none;
+}
+
+li .status .bubble {
+    display: inline-block;
+    height: 14px;
+    min-width: 16px;
+    margin-top: 1px;
+    background-color: rgb(128, 151, 189);
+    vertical-align: middle;
+    white-space: nowrap;
+    padding: 1px 4px;
+    text-align: center;
+    font-size: 11px;
+    line-height: normal;
+    font-weight: bold;
+    text-shadow: none;
+    color: white;
+    border-radius: 7px;
+}
+
+li .status .bubble:empty {
+    display: none;
+}
+
+li.selected .status .bubble {
+    background-color: white !important;
+    color: rgb(132, 154, 190) !important;
+}
+
+:focus li.selected .status .bubble {
+    color: rgb(36, 98, 172) !important;
+}
+
+body.inactive li.selected .status .bubble {
+    color: rgb(159, 159, 159) !important;
+}
+
+.sidebar-tree.small .sidebar-tree-item,
+.sidebar-tree .children.small .sidebar-tree-item,
+.sidebar-tree-item.small,
+.small .resources-graph-side {
+    height: 20px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .icon,
+.sidebar-tree .children.small .sidebar-tree-item .icon,
+.sidebar-tree-item.small .icon {
+    width: 16px;
+    height: 16px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .status,
+.sidebar-tree .children.small .sidebar-tree-item .status,
+.sidebar-tree-item.small .status {
+    margin-top: 1px;
+}
+
+.sidebar-tree-item.selected {
+    color: white;
+    text-shadow: rgba(0, 0, 0, 0.33) 1px 1px 0;
+    background-origin: padding-box;
+    background-clip: padding-box;
+    background-color: rgb(56, 121, 217);
+}
+
+:focus .sidebar-tree-item.selected {
+    background-color: rgb(56, 121, 217);
+}
+
+body.inactive .sidebar-tree-item.selected {
+    background-color: rgb(180,180,180);
+}
+
+.sidebar-tree-item .titles {
+    display: flex;
+    flex-direction: column;
+    position: relative;
+    top: 5px;
+    line-height: 12px;
+    padding-bottom: 1px;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+}
+
+.titles > .title-container {
+    display: flex;
+}
+
+.sidebar-tree-item .titles.no-subtitle {
+    top: 10px;
+}
+
+.sidebar-tree.small .sidebar-tree-item .titles,
+.sidebar-tree .children.small .sidebar-tree-item .titles,
+.sidebar-tree-item.small .titles {
+    top: 2px;
+    line-height: normal;
+}
+
+.sidebar-tree:not(.small) .sidebar-tree-item:not(.small) .title::after,
+.sidebar-tree .children:not(.small) .sidebar-tree-item .title::after {
+    content: "\A";
+    white-space: pre;
+}
+
+.sidebar-tree-item .subtitle {
+    font-size: 80%;
+}
+
+.sidebar-tree.small .sidebar-tree-item .subtitle,
+.sidebar-tree .children.small .sidebar-tree-item .subtitle,
+.sidebar-tree-item.small .subtitle {
+    display: none;
+}
+
+.sidebar-tree-item.selected .subtitle {
+    color: white;
+}
+
+.bubble.debug,
+.console-debug-level .bubble {
+    background-color: rgb(0, 0, 255) !important;
+}
+
+.bubble.warning,
+.console-warning-level .bubble {
+    background-color: rgb(232, 164, 0) !important;
+}
+
+.bubble.error,
+.console-error-level .bubble {
+    background-color: rgb(216, 35, 35) !important;
+}
+
+.storage-application-cache-status-icon,
+.storage-application-cache-connectivity-icon {
+    margin: 5px 5px 0;
+    vertical-align: middle;
+}
+
+.status-bar-divider {
+    margin-left: 7px;
+    border-right: 1px solid #CCC;
+}
+
+.storage-application-cache-status,
+.storage-application-cache-connectivity {
+    position: relative;
+    top: 4px;
+}
+
+.status-bar-items {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    overflow: hidden;
+    border-left: 1px solid rgb(184, 184, 184);
+    margin-left: -1px;
+}
+
+.node-search-status-bar-item .glyph {
+    -webkit-mask-position: -224px -24px;
+}
+
+.delete-storage-status-bar-item .glyph {
+    -webkit-mask-position: -128px 0;
+}
+
+.clear-storage-status-bar-item .glyph {
+    -webkit-mask-position: -64px 0;
+}
+
+.refresh-storage-status-bar-item .glyph {
+    -webkit-mask-position: 0 0;
+}
+
+.webkit-html-js-node,
+.webkit-html-css-node {
+    white-space: pre;
+}
+
+.source-frame-breakpoint-condition {
+    z-index: 30;
+    padding: 4px;
+    background-color: rgb(203, 226, 255);
+    border-radius: 7px;
+    border: 2px solid rgb(169, 172, 203);
+    width: 90%;
+    pointer-events: auto;
+}
+
+.source-frame-breakpoint-message {
+    background-color: transparent;
+    font-weight: normal;
+    font-size: 11px;
+    text-align: left;
+    text-shadow: none;
+    color: rgb(85, 85, 85);
+    cursor: default;
+    margin: 0 0 2px 0;
+}
+
+#source-frame-breakpoint-condition {
+    margin: 0;
+    border: 1px inset rgb(190, 190, 190) !important;
+    width: 100%;
+    box-shadow: none !important;
+    outline: none !important;
+    -webkit-user-modify: read-write;
+}
+
+.source-frame-popover-title {
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+    font-weight: bold;
+    padding-left: 18px;
+}
+
+.source-frame-popover-tree {
+    border-top: 1px solid rgb(194, 194, 147);
+    overflow: auto;
+    position: absolute;
+    top: 15px;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+.source-frame-eval-expression {
+    outline: 1px solid rgb(163, 41, 34);
+    background-color: rgb(255, 255, 194);
+}
+
+.workers-list {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+
+.resource-content-unavailable {
+    color: rgb(50%, 50%, 50%);
+    font-style: italic;
+    font-size: 14px;
+    text-align: center;
+    padding: 32px;
+}
+
+.node-link {
+    text-decoration: underline;
+    cursor: pointer;
+}
+
+.cursor-pointer {
+    cursor: pointer;
+}
+
+.cursor-auto {
+    cursor: auto;
+}
+
+.please-wait-msg {
+    position: absolute;
+    left: 0;
+    top: 0;
+    border: 4px black solid;
+    border-radius: 4px;
+    background-color: black;
+    opacity: 0.85;
+    color: white;
+    font-size: 12px;
+    font-weight: bold;
+    z-index: 10000;
+}
+
+.resource-view.json {
+    padding: 5px;
+}
+
+.resource-view.html iframe {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+}
+
+.soft-context-menu-glass-pane {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    z-index: 20000;
+}
+
+.soft-context-menu {
+    position: absolute;
+    border: 1px solid rgba(196, 196, 196, 0.9);
+    border-top: 1px solid rgba(196, 196, 196, 0.5);
+    border-bottom: 1px solid rgba(150, 150, 150, 0.9);
+    padding: 4px 0 4px 0;
+    border-radius: 4px;
+    background-color: white;
+    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.25);
+}
+
+.soft-context-menu-item {
+    width: 100%;
+    line-height: 13px;
+    font-size: 14px;
+    border-top: 1px solid transparent;
+    border-bottom: 1px solid transparent;
+    padding: 2px 7px 2px 6px;
+    margin: 0 13px 0 0;
+    white-space: nowrap;
+}
+
+.soft-context-menu-separator {
+    height: 10px;
+    margin: 0 1px;
+}
+
+.soft-context-menu-separator > .separator-line {
+    margin: 0;
+    height: 5px;
+    border-bottom: 1px solid rgb(227, 227, 227);
+    pointer-events: none;
+}
+
+.soft-context-menu-item-mouse-over {
+    border-top: 1px solid rgb(56, 121, 217);
+    border-bottom: 1px solid rgb(56, 121, 217);
+    background-color: rgb(56, 121, 217);
+    color: white;
+}
+
+body.platform-mac .soft-context-menu-item-mouse-over {
+    border-top: 1px solid rgb(90, 131, 236);
+    border-bottom: 1px solid rgb(18, 88, 233);
+    background-image: linear-gradient(to bottom, rgb(100, 140, 243), rgb(36, 101, 243));
+}
+
+.soft-context-menu-item-checkmark {
+    color: rgb(108, 108, 108);
+    pointer-events: none;
+}
+
+.soft-context-menu-item-submenu-arrow {
+    color: #222;
+    float: right;
+    pointer-events: none;
+}
+
+.soft-context-menu-item-mouse-over .soft-context-menu-item-checkmark {
+    color: white;
+}
+
+.search-view {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+.search-drawer-header {
+    flex: none;
+    padding: 4px;
+    display: flex;
+}
+
+.search-drawer-header input[type="text"].search-config-search {
+    -webkit-appearance: none;
+    padding: 0 3px;
+    margin: 0;
+    border: 1px solid rgb(163, 163, 163);
+    height: 20px;
+    border-radius: 2px;
+    color: #303030;
+}
+
+.search-drawer-header input[type="search"].search-config-search:focus {
+    border: 1px solid rgb(190, 190, 190);
+    outline: none;
+}
+
+body.platform-mac .search-drawer-header input[type="search"].search-config-search {
+    top: 1px;
+}
+
+.search-drawer-header label.search-config-label {
+    margin: auto 0;
+    margin-left: 8px;
+    color: #303030;
+    display: flex;
+}
+
+#bottom-status-bar-container {
+    -webkit-flex: 1 1 0;
+    width: 0;
+    overflow: hidden;
+}
+
+.search-status-bar-summary {
+    background-color: rgb(236, 236, 236);
+    border-top: 1px solid #ccc;
+    padding-left: 5px;
+    flex: 0 0 19px;
+}
+
+.search-status-bar-summary .progress-bar-container {
+    margin-top: -4px;
+}
+
+.progress-bar-stop-button-item {
+    width: 19px;
+    height: 24px;
+    overflow: hidden;
+}
+
+.progress-bar-stop-button .glyph {
+    -webkit-mask-position: -96px -48px;
+    background-color: rgb(216, 0, 0) !important;
+}
+
+.search-view .search-results {
+    overflow-y: auto;
+    flex: auto;
+}
+
+#search-results-pane-file-based li {
+    list-style: none;
+}
+
+#search-results-pane-file-based ol {
+    -webkit-padding-start: 0;
+    margin-top: 0;
+}
+
+#search-results-pane-file-based ol.children {
+    display: none;
+}
+
+#search-results-pane-file-based ol.children.expanded {
+    display: block;
+}
+
+#search-results-pane-file-based li.parent::before {
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    width: 12px;
+    content: "a";
+    color: transparent;
+    margin-left: -5px;
+    padding-right: 4px;
+    display: inline-block;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+#search-results-pane-file-based li.parent::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+#search-results-pane-file-based li.parent::before {
+    background-position: -4px -96px;
+}
+
+#search-results-pane-file-based li.parent.expanded::before {
+    background-position: -20px -96px;
+}
+
+#search-results-pane-file-based .search-result {
+    font-size: 11px;
+    padding: 2px 0 2px 10px;
+    word-wrap: normal;
+    white-space: pre;
+    cursor: pointer;
+}
+
+#search-results-pane-file-based .search-result:hover {
+    background-color: rgba(121, 121, 121, 0.1);
+}
+
+#search-results-pane-file-based .search-result .search-result-file-name {
+    font-weight: bold;
+    color: #222;
+}
+
+#search-results-pane-file-based .search-result .search-result-matches-count {
+    margin-left: 5px;
+    color: #222;
+}
+
+#search-results-pane-file-based .show-more-matches {
+    padding: 4px 0;
+    color: #222;
+    cursor: pointer;
+    font-size: 11px;
+    margin-left: 20px;
+}
+
+#search-results-pane-file-based .show-more-matches:hover {
+    text-decoration: underline;
+}
+
+#search-results-pane-file-based .search-match {
+    word-wrap: normal;
+    white-space: pre;
+}
+
+#search-results-pane-file-based .search-match .search-match-line-number {
+    color: rgb(128, 128, 128);
+    text-align: right;
+    vertical-align: top;
+    word-break: normal;
+    padding-right: 4px;
+    padding-left: 6px;
+    margin-right: 5px;
+    border-right: 1px solid #BBB;
+}
+
+#search-results-pane-file-based .search-match:not(:hover) .search-match-line-number {
+    background-color: #F0F0F0;
+}
+
+#search-results-pane-file-based .search-match:hover {
+    background-color: rgba(56, 121, 217, 0.1);
+}
+
+#search-results-pane-file-based .search-match .highlighted-match {
+    background-color: #F1EA00;
+}
+
+#search-results-pane-file-based a {
+    text-decoration: none;
+    display: block;
+}
+
+#search-results-pane-file-based .search-match .search-match-content {
+    color: #000;
+}
+
+.record-cpu-profile-status-bar-item .glyph,
+.record-profile-status-bar-item .glyph {
+    -webkit-mask-position: -288px 0;
+}
+
+button.record-cpu-profile-status-bar-item.toggled-on .glyph:not(.shadow),
+button.record-profile-status-bar-item.toggled-on .glyph:not(.shadow) {
+    -webkit-mask-position: -288px -24px;
+    background-color: rgb(216, 0, 0) !important;
+}
+
+.empty-view,
+.storage-view .storage-table-error {
+    position: absolute;
+    top: 0;
+    bottom: 25%;
+    left: 0;
+    right: 0;
+    font-size: 24px;
+    color: rgb(75%, 75%, 75%);
+    margin-top: auto;
+    margin-bottom: auto;
+    height: 50px;
+    line-height: 26px;
+    text-align: center;
+    font-weight: bold;
+    padding: 10px;
+    white-space: pre-wrap;
+}
+
+/* Generic suggest box style */
+
+.suggest-box.generic-suggest {
+    margin-left: -1px;
+    border-color: rgb(66%, 66%, 66%);
+}
+
+.suggest-box.generic-suggest.above-anchor {
+   border-radius: 5px 5px 5px 0;
+}
+
+.suggest-box.generic-suggest.under-anchor {
+   border-radius: 0 5px 5px 5px;
+}
+
+/* Custom popup scrollers */
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar,
+.custom-popup-vertical-scroll ::-webkit-scrollbar {
+    width: 11px;
+    height: 11px;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-corner,
+.custom-popup-vertical-scroll ::-webkit-scrollbar-corner {
+    display: none;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-resizer,
+.custom-popup-vertical-scroll ::-webkit-resizer {
+    display: none;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-button,
+.custom-popup-vertical-scroll ::-webkit-scrollbar-button {
+    display: none;
+}
+
+/* Custom Horizontal Scrollbar Styles */
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar:horizontal:corner-present {
+    border-right-width: 0;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-thumb:horizontal {
+    -webkit-border-image: url(Images/thumbHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 11px;
+    min-width: 20px;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-thumb:horizontal:hover {
+    -webkit-border-image: url(Images/thumbHoverHoriz.png) 0 11 0 11;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-thumb:horizontal:active {
+    -webkit-border-image: url(Images/thumbActiveHoriz.png) 0 11 0 11;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-track-piece:horizontal:start {
+    margin-left: 5px;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-track-piece:horizontal:end {
+    margin-right: 5px;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-track-piece:horizontal:end:corner-present {
+    margin-right: 4px;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-track-piece:horizontal:decrement {
+    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 0 0 11px;
+}
+
+.custom-popup-horizontal-scroll ::-webkit-scrollbar-track-piece:horizontal:increment {
+    -webkit-border-image: url(Images/trackHoriz.png) 0 11 0 11;
+    border-color: transparent;
+    border-width: 0 11px 0 0;
+}
+
+/* Custom Vertical Scrollbar Styles */
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar:vertical:corner-present {
+    border-bottom-width: 0;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-thumb:vertical {
+    -webkit-border-image: url(Images/thumbVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 11px 0;
+    min-height: 20px;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-thumb:vertical:hover {
+    -webkit-border-image: url(Images/thumbHoverVert.png) 11 0 11 0;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-thumb:vertical:active {
+    -webkit-border-image: url(Images/thumbActiveVert.png) 11 0 11 0;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-track-piece:vertical:start {
+    margin-top: 5px;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-track-piece:vertical:end {
+    margin-bottom: 5px;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-track-piece:vertical:end:corner-present {
+    margin-bottom: 4px;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-track-piece:vertical:decrement {
+    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 11px 0 0 0;
+}
+
+.custom-popup-vertical-scroll ::-webkit-scrollbar-track-piece:vertical:increment {
+    -webkit-border-image: url(Images/trackVert.png) 11 0 11 0;
+    border-color: transparent;
+    border-width: 0 0 11px 0;
+}
+
+.console-context {
+    max-width: 200px;
+}
+
+.root-view {
+    overflow: hidden;
+    position: absolute !important;
+    left: 0;
+    top: 0;
+}
+
+.search-bar {
+    flex: 0 0 23px;
+    background-color: rgb(236, 236, 236);
+}
+
+.search-bar.replaceable {
+    flex: 0 0 44px;
+}
+
+.progress-bar-container {
+    display: inline-flex;
+    margin: 0 8px;
+    -webkit-flex: 1 0;
+}
+
+.progress-bar-container span {
+    padding: 6px;
+}
+
+.progress-bar-container progress {
+    margin-top: 7px;
+    -webkit-flex: 1 0;
+}
+
+body.platform-mac .progress-bar-container progress {
+    margin-top: 6px;
+}
+
+.progress-bar-container button.status-bar-item {
+    border-left: none;
+    margin-top: 1px;
+}
+
+.elements-tree-outline li.parent::before {
+    top: 0 !important;
+}
+
+.elements-tree-outline li.shadow-root + ol {
+    margin-left: 5px;
+    padding-left: 5px;
+    border-left: 1px solid gray;
+}
+
+#drawer-editor-view {
+    flex: auto;
+}
+
+.toolbar-close-button-item {
+    display: inline-block;
+    float: right;
+    padding-right: 4px;
+    padding-top: 4px;
+    padding-left: 2px;
+}
+
+body.undocked .toolbar-close-button-item {
+    display: none;
+}
+
+.root-view > .split-view > .split-view-sidebar {
+    position: relative;
+}
+
+select.drop-down-menu {
+    border: none;
+    -webkit-appearance: none;
+}
+
+/* inspectorCommon.css */
+
+html {
+    height: 100%;
+}
+
+body {
+    cursor: default;
+    position: relative;
+    height: 100%;
+    width: 100%;
+    overflow: hidden;
+    font-family: Lucida Grande, sans-serif;
+    font-size: 12px;
+    margin: 0;
+    tab-size: 4;
+    -webkit-user-select: none;
+    color: #222;
+}
+
+body.platform-linux {
+  color: rgb(48, 57, 66);
+  font-family: Ubuntu, Arial, sans-serif;
+}
+
+body.platform-mac {
+  color: rgb(48, 57, 66);
+  font-family: 'Lucida Grande', sans-serif;
+}
+
+body.platform-windows {
+  font-family: 'Segoe UI', Tahoma, sans-serif;
+}
+
+*, *::before, *::after {
+    box-sizing: border-box;
+}
+
+:focus {
+    outline: none;
+}
+
+img {
+    -webkit-user-drag: none;
+}
+
+iframe,
+a img {
+    border: none;
+}
+
+iframe.view {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+}
+
+.hidden {
+    display: none !important;
+}
+
+.monospace {
+    font-size: 10px !important;
+    font-family: monospace;
+}
+
+.resources-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    z-index: -100;
+    bottom: 0;
+}
+
+.resources-event-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 100%;
+    top: 0;
+    z-index: 300;
+    pointer-events: none;
+}
+
+.resources-dividers-label-bar {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    background-color: rgba(255, 255, 255, 0.85);
+    background-clip: padding-box;
+    height: 20px;
+    z-index: 200;
+    pointer-events: none;
+    overflow: hidden;
+}
+
+.resources-divider {
+    position: absolute;
+    width: 1px;
+    top: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.1);
+}
+
+.resources-event-divider-padding {
+    position: absolute;
+    width: 8px;
+    top: 0;
+    bottom: 0;
+    pointer-events: auto;
+}
+
+.resources-event-divider {
+    position: absolute;
+    width: 2px;
+    top: 0;
+    bottom: 0;
+    z-index: 300;
+}
+
+.resources-divider-label {
+    position: absolute;
+    top: 4px;
+    right: 3px;
+    font-size: 80%;
+    white-space: nowrap;
+    pointer-events: none;
+}
+
+.overview-grid-window-selector {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    background-color: rgba(125, 173, 217, 0.5);
+    z-index: 250;
+    pointer-events: none;
+}
+
+.overview-grid-window {
+    background-color: white;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    height: 20px;
+    z-index: 150;
+}
+
+.overview-grid-dividers-background {
+    left: 0%;
+    right: 0%;
+    top: 0;
+    height: 20px;
+    background-color: black;
+    position: absolute;
+}
+
+.overview-grid-window-rulers {
+    top: 0;
+    bottom: 0;
+    position: absolute;
+    opacity: 0.2;
+    border-right: 1px solid black;
+    border-left: 1px solid black;
+    z-index: 250;
+    pointer-events: none;
+}
+
+.overview-grid-window-resizer {
+    position: absolute;
+    top: 0;
+    height: 20px;
+    width: 5px;
+    margin-left: -2px;
+    margin-right: -3px;
+    background-color: rgb(153, 153, 153);
+    z-index: 500;
+    border-radius: 2px;
+    box-shadow: white 1px 0 0, white -1px 0 0, white 0 1px 0, white 0 -1px 0;
+}
+
+.overview-grid-window-resizer-right {
+    margin-left: -3px;
+    margin-right: -2px;
+}
+
+/* Network timing is shared between popover and network item view pane */
+
+.network-timing-table td {
+    padding: 0;
+}
+
+.network-timing-table td.caution {
+    font-weight: bold;
+    color: rgb(255, 128, 0);
+    padding: 2px 0;
+}
+
+.network-timing-row {
+    position: relative;
+    height: 16px;
+}
+
+.network-timing-bar {
+    position: absolute;
+    background-color: red;
+    border-left: 1px solid red;
+    opacity: 0.4;
+    top: 0;
+    bottom: 0;
+}
+
+.network-timing-bar-title {
+    position: absolute;
+    color: #222;
+    top: 1px;
+}
+
+.highlighted-search-result {
+    border-radius: 1px;
+    padding: 1px;
+    margin: -1px;
+    background-color: rgba(255, 255, 0, 0.8);
+}
+
+.sidebar-separator {
+    background-color: rgb(230, 230, 230);
+    padding: 0 5px;
+    border-top: 1px solid rgb(189, 189, 189);
+    border-bottom: 1px solid rgb(189, 189, 189);
+    color: rgb(50, 50, 50);
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    line-height: 16px;
+}
+
+.sidebar-label {
+    font-size: 11px;
+}
+
+.pie-chart {
+    position: relative;
+}
+
+.pie-chart-foreground {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    text-align: center;
+    z-index: 10;
+    top: 0;
+}
+
+/* inspectorSyntaxHighlight.css */
+
+/*
+ * Copyright (C) 2009 Apple 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 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.
+ */
+.cm-js-keyword {color: rgb(170, 13, 145);}
+.cm-js-number {color: rgb(28, 0, 207);}
+.cm-js-comment {color: rgb(0, 116, 0);}
+.cm-js-string {color: rgb(196, 26, 22);}
+.cm-js-string-2 {color: rgb(196, 26, 22);}
+
+.cm-css-keyword { color: rgb(7, 144, 154);}
+.cm-css-number {color: rgb(50, 0, 255);}
+.cm-css-comment {color: rgb(0, 116, 0);}
+.cm-css-def {color: rgb(200, 0, 0);}
+.cm-css-meta {color: rgb(200, 0, 0);}
+.cm-css-atom {color: rgb(7, 144, 154);}
+.cm-css-string {color: rgb(7, 144, 154);}
+.cm-css-string-2 {color: rgb(7, 144, 154);}
+.cm-css-link {color: rgb(7, 144, 154);}
+.cm-css-variable {color: rgb(200, 0, 0);}
+.cm-css-variable-2 {color: rgb(0, 0, 128);}
+.cm-css-property, .webkit-css-property {color: rgb(200, 0, 0);}
+
+.cm-xml-meta {color: rgb(192, 192, 192);}
+.cm-xml-comment {color: rgb(35, 110, 37);}
+.cm-xml-string {color: rgb(26, 26, 166);}
+.cm-xml-tag {color: rgb(136, 18, 128);}
+.cm-xml-attribute {color: rgb(153, 69, 0);}
+.cm-xml-link {color: #00e;}
+
+.webkit-html-comment {
+    /* Keep this in sync with view-source.css (.webkit-html-comment) */
+    color: rgb(35, 110, 37);
+}
+
+.webkit-html-tag {
+    /* Keep this in sync with view-source.css (.webkit-html-tag) */
+    color: rgb(136, 18, 128);
+}
+
+.webkit-html-pseudo-element {
+    /* This one is non-standard. */
+    color: brown;
+}
+
+.webkit-html-text-node {
+    unicode-bidi: -webkit-isolate;
+}
+
+.webkit-html-entity-value {
+    /* This one is non-standard. */
+    background-color: rgba(0, 0, 0, 0.15);
+    unicode-bidi: -webkit-isolate;
+}
+
+.webkit-html-doctype {
+    /* Keep this in sync with view-source.css (.webkit-html-doctype) */
+    color: rgb(192, 192, 192);
+}
+
+.webkit-html-attribute-name {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */
+    color: rgb(153, 69, 0);
+    unicode-bidi: -webkit-isolate;
+}
+
+.webkit-html-attribute-value {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */
+    color: rgb(26, 26, 166);
+    unicode-bidi: -webkit-isolate;
+}
+
+.webkit-html-external-link,
+.webkit-html-resource-link {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */
+    color: #00e;
+}
+
+.webkit-html-resource-link {
+    /* Required for consistency with view-source.css, since anchors may not have href attributes */
+    text-decoration: underline;
+    cursor: pointer;
+}
+
+.webkit-html-external-link {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link) */
+    text-decoration: none;
+}
+
+.webkit-html-external-link:hover {
+    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */
+    text-decoration: underline;
+}
+
+.webkit-html-end-of-file {
+    /* Keep this in sync with view-source.css (.webkit-html-end-of-file) */
+    color: rgb(255, 0, 0);
+    font-weight: bold;
+}
+
+/* popover.css */
+
+.popover {
+    position: absolute;
+    -webkit-border-image: url(Images/popoverBackground.png) 25 25 25 25;
+    border-width: 25px;
+    z-index: 600;
+    pointer-events: none;
+}
+
+.popover .content {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    pointer-events: auto;
+    overflow: auto;
+    -webkit-user-select: text;
+    line-height: 11px;
+}
+
+.popover .content.fixed-height {
+    overflow: hidden;
+} 
+
+.popover .arrow {
+    position: absolute;
+    background-image: url(Images/popoverArrows.png);
+    width: 19px;
+    height: 19px;
+    margin-left: 15px;
+    margin-top: -25px;
+    top: 0;
+    left: 0;
+}
+
+.popover.top-left-arrow .arrow {
+    /* The default is top-left, no styles needed. */
+}
+
+.popover.top-right-arrow .arrow {
+    right: 25px;
+    left: auto;
+}
+
+.popover.bottom-left-arrow .arrow {
+    top: auto;
+    bottom: 0;
+    margin-top: 0;
+    margin-bottom: -25px;
+    background-position: 0 -19px;
+}
+
+.popover.bottom-right-arrow .arrow {
+    right: 15px;
+    left: auto;
+    top: auto;
+    bottom: 0;
+    margin-top: 0;
+    margin-bottom: -25px;
+    background-position: 0 -19px;
+}
+
+.popover.left-top-arrow .arrow {
+    top: 0;
+    margin-top: 15px;
+    margin-left: -25px;
+    background-position: 0 -38px;
+}
+
+.popover.left-bottom-arrow .arrow {
+    top: auto;
+    bottom: 0;
+    margin-bottom: 15px;
+    margin-left: -25px;
+    background-position: 0 -38px;
+}
+
+.popover.right-top-arrow .arrow {
+    right: 0;
+    left: auto;
+    top: 0;
+    margin-top: 15px;
+    margin-right: -25px;
+    background-position: 0 -57px;
+}
+
+.popover.right-bottom-arrow .arrow {
+    right: 0;
+    left: auto;
+    top: auto;
+    bottom: 0;
+    margin-bottom: 15px;
+    margin-right: -25px;
+    background-position: 0 -57px;
+}
+
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/inspectorCommon.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/inspectorCommon.css
new file mode 100644 (file)
index 0000000..d719f10
--- /dev/null
@@ -0,0 +1,257 @@
+html {
+    height: 100%;
+}
+
+body {
+    cursor: default;
+    position: relative;
+    height: 100%;
+    width: 100%;
+    overflow: hidden;
+    font-family: Lucida Grande, sans-serif;
+    font-size: 12px;
+    margin: 0;
+    tab-size: 4;
+    -webkit-user-select: none;
+    color: #222;
+}
+
+body.platform-linux {
+  color: rgb(48, 57, 66);
+  font-family: Ubuntu, Arial, sans-serif;
+}
+
+body.platform-mac {
+  color: rgb(48, 57, 66);
+  font-family: 'Lucida Grande', sans-serif;
+}
+
+body.platform-windows {
+  font-family: 'Segoe UI', Tahoma, sans-serif;
+}
+
+*, *::before, *::after {
+    box-sizing: border-box;
+}
+
+:focus {
+    outline: none;
+}
+
+img {
+    -webkit-user-drag: none;
+}
+
+iframe,
+a img {
+    border: none;
+}
+
+iframe.view {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+}
+
+.hidden {
+    display: none !important;
+}
+
+.monospace {
+    font-size: 10px !important;
+    font-family: monospace;
+}
+
+.resources-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    z-index: -100;
+    bottom: 0;
+}
+
+.resources-event-dividers {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 100%;
+    top: 0;
+    z-index: 300;
+    pointer-events: none;
+}
+
+.resources-dividers-label-bar {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    background-color: rgba(255, 255, 255, 0.85);
+    background-clip: padding-box;
+    height: 20px;
+    z-index: 200;
+    pointer-events: none;
+    overflow: hidden;
+}
+
+.resources-divider {
+    position: absolute;
+    width: 1px;
+    top: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.1);
+}
+
+.resources-event-divider-padding {
+    position: absolute;
+    width: 8px;
+    top: 0;
+    bottom: 0;
+    pointer-events: auto;
+}
+
+.resources-event-divider {
+    position: absolute;
+    width: 2px;
+    top: 0;
+    bottom: 0;
+    z-index: 300;
+}
+
+.resources-divider-label {
+    position: absolute;
+    top: 4px;
+    right: 3px;
+    font-size: 80%;
+    white-space: nowrap;
+    pointer-events: none;
+}
+
+.overview-grid-window-selector {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    background-color: rgba(125, 173, 217, 0.5);
+    z-index: 250;
+    pointer-events: none;
+}
+
+.overview-grid-window {
+    background-color: white;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    height: 20px;
+    z-index: 150;
+}
+
+.overview-grid-dividers-background {
+    left: 0%;
+    right: 0%;
+    top: 0;
+    height: 20px;
+    background-color: black;
+    position: absolute;
+}
+
+.overview-grid-window-rulers {
+    top: 0;
+    bottom: 0;
+    position: absolute;
+    opacity: 0.2;
+    border-right: 1px solid black;
+    border-left: 1px solid black;
+    z-index: 250;
+    pointer-events: none;
+}
+
+.overview-grid-window-resizer {
+    position: absolute;
+    top: 0;
+    height: 20px;
+    width: 5px;
+    margin-left: -2px;
+    margin-right: -3px;
+    background-color: rgb(153, 153, 153);
+    z-index: 500;
+    border-radius: 2px;
+    box-shadow: white 1px 0 0, white -1px 0 0, white 0 1px 0, white 0 -1px 0;
+}
+
+.overview-grid-window-resizer-right {
+    margin-left: -3px;
+    margin-right: -2px;
+}
+
+/* Network timing is shared between popover and network item view pane */
+
+.network-timing-table td {
+    padding: 0;
+}
+
+.network-timing-table td.caution {
+    font-weight: bold;
+    color: rgb(255, 128, 0);
+    padding: 2px 0;
+}
+
+.network-timing-row {
+    position: relative;
+    height: 16px;
+}
+
+.network-timing-bar {
+    position: absolute;
+    background-color: red;
+    border-left: 1px solid red;
+    opacity: 0.4;
+    top: 0;
+    bottom: 0;
+}
+
+.network-timing-bar-title {
+    position: absolute;
+    color: #222;
+    top: 1px;
+}
+
+.highlighted-search-result {
+    border-radius: 1px;
+    padding: 1px;
+    margin: -1px;
+    background-color: rgba(255, 255, 0, 0.8);
+}
+
+.sidebar-separator {
+    background-color: rgb(230, 230, 230);
+    padding: 0 5px;
+    border-top: 1px solid rgb(189, 189, 189);
+    border-bottom: 1px solid rgb(189, 189, 189);
+    color: rgb(50, 50, 50);
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    line-height: 16px;
+}
+
+.sidebar-label {
+    font-size: 11px;
+}
+
+.pie-chart {
+    position: relative;
+}
+
+.pie-chart-foreground {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    text-align: center;
+    z-index: 10;
+    top: 0;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/layersPanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/layersPanel.css
new file mode 100644 (file)
index 0000000..fbe0551
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * 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;
+}
+
+.layers.panel div.outline-disclosure > ol {
+    margin-left: -12px;
+}
+
+.layers.panel .outline-disclosure ol.children {
+    padding-left: 12px;
+}
+
+.layers.panel .outline-disclosure li {
+    margin-top: 0;
+    margin-bottom: 0;
+    padding: 1 1 1 14px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+.layers.panel .outline-disclosure .dimmed {
+    opacity: 0.6;
+}
+
+.layers-3d-view {
+    overflow: hidden;
+}
+
+.layers-3d-view .rotating-container {
+    -webkit-transform-style: preserve-3d;
+}
+
+.layers-3d-view .rotating-container > .layer-container {
+    -webkit-transform-origin: 0 0;
+}
+
+.layers-3d-view .layer-container {
+    position: absolute;
+    border: 1px solid rgba(40, 40, 40, 0.8);
+    -webkit-transform-style: preserve-3d;
+}
+
+.layers-3d-view .layer-container.invisible {
+    opacity: 0.4;
+    border-type: dashed;
+}
+
+.layer-container .side-wall {
+    position: absolute;
+    background-color: inherit;
+    top: 0px;
+    right: 0px;
+    bottom: 0px;
+    left: 0px;
+    -webkit-transform-origin: 0 0;
+    border: inherit;
+    border-width: 1px;
+}
+
+.layer-container .back-wall {
+    background-color: inherit;
+    border: inherit;
+    border-width: 1px;
+}
+
+.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(100%) 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(100%) rotateY(90deg);
+}
+
+.layer-container.selected {
+    border-color: black;
+}
+
+.layer-container.hovered:not(.selected) {
+    border-color: rgb(150, 150, 255);
+}
+
+.layer-container .paint-rect {
+    position: absolute;
+    border-style: solid;
+}
+
+.layers-3d-view .layer-transparent {
+    position: absolute;
+    background-color: transparent;
+    z-index: 100;
+}
+
+.layer-transparent .back-wall,
+.layer-transparent .side-wall {
+    display: none;
+}
+
+.scroll-rect {
+    border: solid rgb(178, 0, 0);
+    border-width: inherit;
+    background-color: rgba(178, 0, 0, 0.4);
+}
+
+.layer-details-view .empty-view {
+    font-size: 16px;
+}
+
+.layer-details-view table td {
+    padding-left: 8px;
+}
+
+.layer-details-view table td:first-child {
+    font-weight: bold;
+}
+
+.paint-profiler-view canvas {
+    z-index: 200;
+    opacity: 0.8;
+    background-color: white;
+}
+
+.paint-profiler-view {
+    overflow: hidden;
+}
+
+.paint-profiler-view .overview-grid-dividers-background,
+.paint-profiler-view .overview-grid-window {
+    bottom: 0;
+    height: auto;
+}
+
+.paint-profiler-view .overview-grid-window-resizer {
+    z-index: 2000;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/navigatorView.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/navigatorView.css
new file mode 100644 (file)
index 0000000..7a318d8
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.navigator-domain-tree-item .icon {
+    content: url(Images/domain.png);
+}
+
+.navigator-folder-tree-item .icon {
+    opacity: 0.7;
+    content: url(Images/frame.png);
+}
+
+.navigator-script-tree-item .icon {
+    content: url(Images/resourceJSIcon.png);
+}
+
+.navigator-stylesheet-tree-item .icon {
+    content: url(Images/resourceCSSIcon.png);
+}
+
+.navigator-document-tree-item .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+.navigator-other-tree-item .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.navigator > ol {
+    min-height: 100%;
+    display: inline-block;
+}
+
+.navigator li {
+    height: 18px;
+    line-height: 17px;
+    white-space: nowrap;
+}
+
+.navigator :focus li.selected {
+    color: white;
+}
+
+.navigator li.selected .selection {
+    height: 18px;
+}
+
+.navigator > ol.being-edited li.selected .selection {
+    background-color: rgb(56, 121, 217);
+}
+
+
+.navigator .icon {
+    width: 16px;
+    height: 16px;
+    float: left;
+}
+
+.navigator .base-navigator-tree-element-title {
+    display: inline-block;
+    position: relative;
+    padding-left: 2px;
+}
+
+.navigator .base-navigator-tree-element-title.editing {
+    margin: auto;
+}
+
+.navigator-tabbed-pane {
+    flex: auto;
+}
+
+.navigator-tabbed-pane .tabbed-pane-content {
+    overflow: hidden;
+}
+
+.navigator-tabbed-pane .navigator-container {
+    overflow: auto;
+    -webkit-transform: translateZ(0);
+}
+
+.navigator-tabbed-pane .navigator {
+    padding-left: 0;
+    -webkit-transform: translateZ(0);
+}
+
+.navigator-tabbed-pane .tabbed-pane-header-contents {
+    margin-left: 2px;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/networkLogView.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/networkLogView.css
new file mode 100644 (file)
index 0000000..d86a9dd
--- /dev/null
@@ -0,0 +1,581 @@
+/*
+ * 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.
+ */
+
+.network-log-grid.data-grid {
+    border: none;
+    flex: 1 1;
+}
+
+.network-summary-bar {
+    flex: 0 0 19px;
+    padding-left: 5px;
+    line-height: 18px;
+    background-color: rgb(236, 236, 236);
+    border-top: 1px solid #ccc;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.network-summary-bar .warning-icon-small {
+    margin-right: 6px;
+}
+
+.network-log-grid.data-grid table.data {
+    background: transparent;
+}
+
+.network-log-grid.data-grid td {
+    line-height: 17px;
+    height: 41px;
+    border-left: 1px solid rgb(210, 210, 210);
+    vertical-align: middle;
+}
+
+.network-log-grid.data-grid.small td {
+    height: 21px;
+}
+
+.network-log-grid.data-grid th {
+    border-bottom: 1px solid rgb(205, 205, 205);
+    border-left: 1px solid rgb(205, 205, 205);
+    height: 30px;
+}
+
+.network-log-grid.data-grid.small th {
+    height: 22px;
+}
+
+.network-log-grid.data-grid th,
+.network-log-grid.data-grid th.sort-descending,
+.network-log-grid.data-grid th.sort-ascending {
+    background: white;
+}
+
+.network-log-grid.data-grid .data-container {
+    top: 33px;
+}
+
+.network-log-grid.data-grid.small .data-container {
+    top: 23px;
+}
+
+.network-log-grid.data-grid select {
+    -webkit-appearance: none;
+    background-color: transparent;
+    border: none;
+    width: 100%;
+    color: inherit;
+}
+
+.network-log-grid.data-grid.small tr.offscreen {
+    height: 21px;
+}
+
+.network-log-grid.data-grid tr.offscreen {
+    height: 41px;
+}
+
+.network-log-grid.data-grid tr.odd:not(.selected) {
+    background-color: #f3f3f3;
+}
+
+.network-log-grid.data-grid tr.offscreen > td > div {
+    display: none;
+}
+
+.network-log-grid.data-grid tr.filler {
+    background-color: white;
+}
+
+.network-log-grid.data-grid tr:not(.filler) td.name-column {
+    cursor: pointer;
+}
+
+#network-container:not(.brief-mode) .network-log-grid.data-grid td.name-column:hover {
+    text-decoration: underline;
+}
+
+.network-log-grid.data-grid.small .network-graph-side {
+    height: 14px;
+}
+
+.network-log-grid.data-grid th.sortable:active {
+    background-image: none !important;
+}
+
+.network-cell-subtitle {
+    font-weight: normal;
+    color: gray;
+}
+
+.network-error-row,
+.network-error-row .network-cell-subtitle {
+    color: rgb(230, 0, 0);
+}
+
+.initiator-column a {
+    color: inherit;
+}
+
+.network-log-grid.data-grid tr.selected .network-cell-subtitle {
+    color: white;
+}
+
+.network-log-grid tr.highlighted-row {
+    -webkit-animation: "network-row-highlight-fadeout" 2s 0s;
+}
+
+@-webkit-keyframes network-row-highlight-fadeout {
+    from {background-color: rgba(255, 255, 120, 1); }
+    to { background-color: rgba(255, 255, 120, 0); }
+}
+
+.network-header-subtitle {
+    color: gray;
+}
+
+.network-log-grid.data-grid.small .network-cell-subtitle,
+.network-log-grid.data-grid.small .network-header-subtitle {
+    display: none;
+}
+
+/* Resource preview icons */
+
+.network-log-grid.data-grid .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.network-log-grid.data-grid.small .icon {
+    content: url(Images/resourcePlainIconSmall.png);
+}
+
+.network-log-grid.data-grid .network-type-script .icon {
+    content: url(Images/resourceJSIcon.png);
+}
+
+.network-log-grid.data-grid.small .network-type-script .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.network-log-grid.data-grid .network-type-document .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+.network-log-grid.data-grid.small .network-type-document .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.network-log-grid.data-grid .network-type-stylesheet .icon {
+    content: url(Images/resourceCSSIcon.png);
+}
+
+.network-log-grid.data-grid.small .network-type-stylesheet .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.network-log-grid.data-grid .network-type-image .icon {
+    position: relative;
+    background-image: url(Images/resourcePlainIcon.png);
+    background-repeat: no-repeat;
+    content: "";
+}
+
+.network-log-grid.data-grid.small .network-type-image .icon {
+    background-image: url(Images/resourcePlainIconSmall.png);
+    content: "";
+}
+
+.network-log-grid.data-grid .icon {
+    float: left;
+    width: 32px;
+    height: 32px;
+    margin-top: 1px;
+    margin-right: 3px;
+}
+
+.network-log-grid.data-grid th {
+    border-bottom: 1px solid rgb(205,205,205) !important;
+}
+
+.network-log-grid.data-grid.small .icon {
+    width: 16px;
+    height: 16px;
+}
+
+.network-log-grid.data-grid .image-network-icon-preview {
+    position: absolute;
+    margin: auto;
+    top: 3px;
+    bottom: 4px;
+    left: 5px;
+    right: 5px;
+    max-width: 18px;
+    max-height: 21px;
+    min-width: 1px;
+    min-height: 1px;
+}
+
+.network-log-grid.data-grid.small .image-network-icon-preview {
+    top: 2px;
+    bottom: 1px;
+    left: 3px;
+    right: 3px;
+    max-width: 8px;
+    max-height: 11px;
+}
+
+/* Graph styles */
+
+.network-graph-side {
+    position: relative;
+    height: 36px;
+    padding: 0;
+    white-space: nowrap;
+    margin-top: 1px;
+    border-top: 1px solid transparent;
+    overflow: hidden;
+}
+
+.network-graph-bar-area {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+}
+
+.network-graph-bar-area,
+.network-timeline-grid .resources-dividers,
+.network-timeline-grid .resources-event-dividers,
+.network-timeline-grid .resources-dividers-label-bar {
+    right: 12px;
+    left: 12px;
+}
+
+.network-graph-label {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -7px;
+    height: 13px;
+    line-height: 13px;
+    font-size: 90%;
+    color: rgba(0, 0, 0, 0.75);
+    text-shadow: rgba(255, 255, 255, 0.25) 1px 0 0, rgba(255, 255, 255, 0.25) -1px 0 0, rgba(255, 255, 255, 0.333) 0 1px 0, rgba(255, 255, 255, 0.25) 0 -1px 0;
+    z-index: 150;
+    overflow: hidden;
+    text-align: center;
+    visibility: hidden;
+}
+
+.network-graph-side:hover .network-graph-label {
+    visibility: visible;
+}
+
+.network-graph-label:empty {
+    display: none;
+}
+
+.network-graph-label.waiting {
+    margin-right: 5px;
+}
+
+.network-graph-label.waiting-right {
+    margin-left: 5px;
+}
+
+.network-graph-label.before {
+    color: rgba(0, 0, 0, 0.7);
+    text-shadow: none;
+    text-align: right;
+    margin-right: 2px;
+}
+
+.network-graph-label.before::after {
+    padding-left: 2px;
+    height: 6px;
+    content: url(Images/graphLabelCalloutLeft.png);
+}
+
+.network-graph-label.after {
+    color: rgba(0, 0, 0, 0.7);
+    text-shadow: none;
+    text-align: left;
+    margin-left: 2px;
+}
+
+.network-graph-label.after::before {
+    padding-right: 2px;
+    height: 6px;
+    content: url(Images/graphLabelCalloutRight.png);
+}
+
+.network-graph-bar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto -7px;
+    height: 12px;
+    min-width: 14px;
+    opacity: 0.65;
+    border-width: 1px;
+    border-style: solid;
+    border-radius: 7px / 6px;
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8);
+
+    border-color: hsl(0, 0%, 65%);
+    background: linear-gradient(0deg, hsl(0, 0%, 73%), hsl(0, 0%, 78%));
+}
+
+.network-graph-bar.waiting,
+.network-graph-bar.waiting-right {
+    opacity: 0.35;
+}
+
+/* Resource categories */
+
+
+.resource-cached .network-graph-bar {
+    background: hsl(0, 0%, 90%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(0, 0%, 73%),
+                inset 0 1px 0 2px hsla(0, 0%, 76%, 0.85);
+}
+
+.network-type-document .network-graph-bar {
+    border-color: hsl(215, 49%, 52%);
+    background: linear-gradient(0deg, hsl(215, 72%, 61%), hsl(215, 100%, 69%));
+}
+
+.network-type-document.resource-cached .network-graph-bar {
+    background: hsl(215, 99%, 86%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(215, 71%, 61%),
+                inset 0 1px 0 2px hsla(215, 58%, 65%, 0.85);
+}
+
+.network-type-stylesheet .network-graph-bar {
+    border-color: hsl(99, 34%, 52%);
+    background: linear-gradient(0deg, hsl(100, 50%, 61%), hsl(90, 50%, 64%));
+}
+
+.network-type-stylesheet.resource-cached .network-graph-bar {
+    background: hsl(99, 100%, 86%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(99, 72%, 61%),
+                inset 0 1px 0 2px hsla(99, 59%, 65%, 0.85);
+}
+
+.network-type-image .network-graph-bar {
+    border-color: hsl(272, 31%, 52%);
+    background: linear-gradient(0deg, hsl(272, 46%, 61%), hsl(272, 64%, 69%));
+}
+
+.network-type-image.resource-cached .network-graph-bar {
+    background: hsl(272, 65%, 86%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(272, 47%, 61%),
+                inset 0 1px 0 2px hsla(273, 38%, 65%, 0.85);
+}
+
+.network-type-font .network-graph-bar {
+    border-color: hsl(8, 49%, 52%);
+    background: linear-gradient(0deg, hsl(8, 72%, 61%), hsl(8, 100%, 69%));
+}
+
+.network-type-font.resource-cached .network-graph-bar {
+    background: hsl(8, 100%, 86%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(8, 72%, 61%),
+                inset 0 1px 0 2px hsla(8, 59%, 65%, 0.85);
+}
+
+.network-type-script .network-graph-bar {
+    border-color: hsl(31, 49%, 52%);
+    background: linear-gradient(0deg, hsl(31, 72%, 61%), hsl(31, 100%, 69%));
+}
+
+.network-type-script.resource-cached .network-graph-bar {
+    background: hsl(31, 100%, 86%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(31, 78%, 61%),
+                inset 0 1px 0 2px hsla(31, 64%, 65%, 0.85);
+}
+
+.network-type-xhr .network-graph-bar {
+    border-color: hsl(53, 49%, 52%);
+    background: linear-gradient(0deg, hsl(53, 72%, 61%), hsl(53, 100%, 69%));
+}
+
+.network-type-xhr.resource-cached .network-graph-bar {
+    background: hsl(53, 100%, 86%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(53, 72%, 61%),
+                inset 0 1px 0 2px hsla(54, 59%, 65%, 0.85);
+}
+
+.network-type-websocket .network-graph-bar {
+    border-color: hsl(0, 0%, 65%);
+    background: linear-gradient(0deg, hsl(0, 0%, 73%), hsl(0, 0%, 78%));
+}
+
+.network-type-websocket.resource-cached .network-graph-bar {
+    background: hsl(0, 0%, 90%);
+    box-shadow: inset 0 1px 1px 0px rgba(255, 255, 255, 0.8),
+                inset 0 0 0 2px hsl(0, 0%, 73%),
+                inset 0 1px 0 2px hsla(0, 0%, 76%, 0.85);
+}
+
+.network-dim-cell {
+    color: grey;
+}
+
+/* Dividers */
+
+.network-timeline-grid {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 14px; /* Keep in sync with td.corner width */
+    pointer-events: none;
+}
+
+.data-grid td.timeline-column {
+    padding-left: 0;
+    padding-right: 0;
+}
+
+.network-event-divider-padding {
+    position: absolute;
+    width: 8px;
+    top: 0;
+    bottom: 0;
+    pointer-events: auto;
+}
+
+.network-event-divider {
+    position: absolute;
+    width: 2px;
+    top: 31px;
+    bottom: 0;
+    z-index: 300;
+}
+
+.network-timeline-grid.small .network-event-divider {
+    top: 23px;
+}
+
+.network-red-divider {
+    background-color: rgba(255, 0, 0, 0.5);
+}
+
+.network-blue-divider {
+    background-color: rgba(0, 0, 255, 0.5);
+}
+
+.network-log-grid.data-grid .resources-dividers {
+    z-index: 0;
+}
+
+.network-log-grid.data-grid .resources-dividers-label-bar {
+    background-color: transparent;
+    border: none;
+    height: 30px;
+    pointer-events: none;
+}
+
+.network-timeline-grid.small .resources-dividers-label-bar {
+    height: 23px;
+}
+
+.network-timeline-grid .resources-divider-label {
+    top: 0;
+    margin-top: -5px;
+}
+
+.network-timeline-grid .resources-dividers-label-bar .resources-divider {
+    top: 23px;
+}
+
+.network-timeline-grid.small .resources-dividers-label-bar .resources-divider {
+    top: 15px;
+}
+
+.network-timeline-grid .resources-divider:first-child .resources-divider-label {
+    display: none;
+}
+
+.network-timeline-grid .resources-dividers-label-bar .resources-divider:first-child {
+    background-color: transparent;
+}
+
+/* Filters */
+
+.network-log-grid.data-grid table.data tr.revealed.network-item.filtered-out {
+    display: none;
+}
+
+/* Summary */
+
+.network-log-grid.data-grid tr.filler td {
+    padding-bottom: 20px !important;
+}
+
+#network-container {
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+/* Brief mode peculiarities. */
+#network-container.brief-mode .network-timeline-grid {
+    display: none;
+}
+
+#network-container.brief-mode td,
+#network-container.brief-mode th {
+    border-left: none;
+}
+
+#network-container.brief-mode .network-log-grid.data-grid .data-grid-resizer {
+    display: none;
+}
+
+#network-container.brief-mode .network-timeline-grid {
+    display: none;
+}
+
+#network-container:not(.brief-mode) .data-grid tr.selected {
+    background-color: transparent;
+    color: #222;
+}
+
+#network-container.brief-mode .data-grid .data-container {
+    padding-right: 0;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/networkPanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/networkPanel.css
new file mode 100644 (file)
index 0000000..d9e0d0f
--- /dev/null
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.network-larger-resources-status-bar-item .glyph {
+    -webkit-mask-position: -224px 0;
+}
+
+#network-views {
+    background: rgb(203, 203, 203);
+}
+
+#network-close-button {
+    position: absolute;
+    top: 8px;
+    left: 5px;
+    z-index: 10;
+    display: none;
+}
+
+#network-views.small #network-close-button {
+    top: 4px;
+}
+
+.network.panel.viewing-resource #network-close-button {
+    display: block;
+}
+
+.network.panel .sidebar {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    width: auto;
+    border: none;
+    background: inherit;
+}
+
+.network.panel:not(.viewing-resource) .sidebar-resizer-vertical {
+    display: none;
+}
+
+.network.panel .data-grid th.sort-descending,
+.network.panel .data-grid th.sort-ascending {
+    background: white;
+}
+
+#network-views .network-item-view .tabbed-pane-header {
+    flex: 0 0 31px;
+    padding-top: 8px;
+    padding-left: 13px;
+    white-space: nowrap;
+}
+
+#network-views.small .network-item-view .tabbed-pane-header {
+    flex-basis: 23px;
+    padding-top: 0;
+}
+
+.network-item-view {
+    display: none;
+    background: white;
+}
+
+.network-item-view.visible {
+    display: -webkit-flex;
+}
+
+.network-item-view .tabbed-pane-header {
+    border-bottom: 1px solid rgb(205, 205, 205);
+}
+
+.resource-headers-view {
+    display: none;
+    margin: 6px;
+    -webkit-user-select: text;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    overflow: auto;
+}
+
+.resource-headers-view.visible {
+    display: block;
+}
+
+.resource-headers-view .outline-disclosure .parent {
+    -webkit-user-select: none;
+    font-weight: bold;
+}
+
+.resource-headers-view .outline-disclosure .parent .section * {
+    font-weight: normal;
+}
+
+.resource-headers-view .outline-disclosure .children li {
+    white-space: nowrap;
+}
+
+.resource-headers-view .outline-disclosure li.expanded .caution {
+    color: rgb(255, 128, 0);
+}
+
+.resource-headers-view .outline-disclosure li:not(.expanded) .caution {
+    display: none;
+}
+
+.resource-headers-view .outline-disclosure li.expanded .header-count {
+    display: none;
+}
+
+.resource-headers-view .outline-disclosure li .header-toggle {
+    display: none;
+}
+
+.resource-headers-view .outline-disclosure li .status-from-cache {
+    color: gray;
+}
+
+.resource-headers-view .outline-disclosure li.expanded .header-toggle {
+    display: inline;
+    margin-left: 30px;
+    font-weight: normal;
+    color: rgb(45%, 45%, 45%);
+}
+
+.resource-headers-view .outline-disclosure li .header-toggle:hover {
+    color: rgb(20%, 20%, 45%);
+    cursor: pointer;
+}
+
+.resource-headers-view .outline-disclosure .header-name {
+    color: rgb(33%, 33%, 33%);
+    display: inline-block;
+    margin-right: 0.5em;
+    font-weight: bold;
+    vertical-align: top;
+    white-space: pre-wrap;
+}
+
+.resource-headers-view .outline-disclosure .header-value {
+    display: inline;
+    margin-right: 100px;
+    white-space: pre-wrap;
+    word-break: break-all;
+    margin-top: 1px;
+}
+
+.resource-cookies-view {
+    display: none;
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+    overflow: auto;
+    margin: 12px;
+    height: 100%;
+}
+
+.resource-cookies-view.visible {
+    display: flex;
+}
+
+.resource-cookies-view .data-grid {
+    flex: auto;
+    height: 100%;
+}
+
+.resource-cookies-view .data-grid .row-group {
+    font-weight: bold;
+    font-size: 11px;
+}
+
+.resource-timing-view {
+    display: none;
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+    margin: 6px;
+    font-weight: bold;
+    font-size: 11px;
+    color: rgb(30%, 30%, 30%);
+}
+
+.resource-timing-view table {
+    border-spacing: 21px 0;
+}
+
+.resource-timing-view .network-timing-bar {
+    opacity: 1;
+}
+
+.resource-timing-view .network-timing-bar.blocking,
+.resource-timing-view .network-timing-bar.proxy {
+    background-image: linear-gradient(to bottom, rgb(242, 242, 194), rgb(204, 204, 102));
+    border-left: 1px solid rgb(204, 204, 102);
+}
+
+.resource-timing-view .network-timing-bar.dns {
+    background-image: linear-gradient(to bottom, rgb(194, 242, 194), rgb(102, 204, 102));
+    border-left: 1px solid rgb(102, 204, 102);
+}
+
+.resource-timing-view .network-timing-bar.connecting,
+.resource-timing-view .network-timing-bar.ssl {
+    background-image: linear-gradient(to bottom, rgb(194, 242, 242), rgb(102, 204, 204));
+    border-left: 1px solid rgb(102, 204, 204);
+}
+
+.resource-timing-view .network-timing-bar.sending {
+    background-image: linear-gradient(to bottom, rgb(194, 194, 242), rgb(102, 102, 204));
+    border-left: 1px solid rgb(102, 102, 204);
+}
+
+.resource-timing-view .network-timing-bar.waiting {
+    background-image: linear-gradient(to bottom, rgb(242, 194, 242), rgb(204, 102, 204));
+    border-left: 1px solid rgb(204, 102, 204);
+}
+
+.resource-timing-view .network-timing-bar.receiving {
+    background-image: linear-gradient(to bottom, rgb(242, 194, 194), rgb(204, 102, 102));
+    border-left: 1px solid rgb(204, 102, 102);
+}
+
+.resource-timing-view.visible {
+    display: block;
+}
+
+.resource-websocket {
+    -webkit-user-select: text;
+}
+
+.resource-websocket,
+.resource-websocket .data-grid {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    border: none;
+}
+
+.resource-websocket .data-grid .data {
+    background-image: none;
+}
+
+.resource-websocket td {
+    padding-top: 3px;
+    padding-bottom: 3px;
+    border-top: 1px solid rgb(240, 240, 240);
+}
+
+.resource-websocket .data-column div {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.resource-websocket-row-outcoming {
+    background-color: rgb(226, 247, 218);
+}
+
+.resource-websocket-row-outcoming:not(.selected) td {
+    border-left-color: rgb(177, 209, 165);
+}
+
+.resource-websocket-row-outcoming:not(.selected) td, .resource-websocket-row-outcoming:not(.selected) + tr td {
+    border-top-color: rgb(199, 236, 185);
+}
+
+.resource-websocket-row-opcode {
+    background-color: rgb(255, 255, 232);
+    color: rgb(170, 111, 71);
+}
+
+.resource-websocket-row-opcode td {
+    border-color: rgb(211, 187, 171);
+}
+
+.resource-websocket-row-opcode td, .resource-websocket-row-opcode + tr td {
+    border-top-color: rgb(248, 240, 210);
+}
+
+.resource-websocket-row-error {
+    background-color: rgb(255, 237, 237);
+    color: rgb(182, 0, 0);
+}
+
+.panel.network .split-view {
+    flex: auto;
+    position: relative;
+}
+
+.network-filters-header {
+    flex: 0 0 23px;
+    padding-right: 4px;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/overrides.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/overrides.css
new file mode 100644 (file)
index 0000000..684cbba
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * 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.
+ */
+
+
+.overrides-view .tabbed-pane {
+    flex-direction: row !important;
+}
+
+.overrides-view .tabbed-pane-header {
+    border: none transparent !important;
+    width: auto;
+    flex: 0 0 auto;
+}
+
+.overrides-view .tabbed-pane-content {
+    padding-top: 10px;
+    padding-left: 10px;
+    padding-right: 10px;
+    overflow-x: hidden;
+}
+
+.overrides-view .tabbed-pane-header-contents {
+    margin: 0;
+}
+
+.overrides-view .tabbed-pane-header-tabs {
+    display: flex;
+    flex-direction: column;
+    padding-top: 5px;
+    width: 100px;
+}
+
+.overrides-view .tabbed-pane-header-tab {
+    background-color: transparent;
+    border: none transparent;
+    font-weight: normal;
+    text-shadow: none;
+    color: #777;
+    height: 22px;
+    padding-left: 0;
+    padding-left: 10px;
+    border-left: 4px solid transparent;
+}
+
+.overrides-view .tabbed-pane-header-tab:not(.selected) {
+    cursor: pointer !important;
+}
+
+.overrides-view .tabbed-pane-header-tab.selected {
+    color: inherit;
+    border: none transparent;
+    border-left: 4px solid #666;
+}
+
+.overrides-view fieldset {
+    border: none;
+    padding: 0 0 5px 15px;
+}
+
+.overrides-user-agent fieldset {
+    padding-top: 5px;
+}
+
+.overrides-device > select {
+    margin-bottom: 10px;
+    width: 400px;
+    max-width: 90%;
+}
+
+.overrides-device button {
+    margin-right: 10px;
+}
+
+.overrides-device > label {
+    display: block;
+    margin-bottom: 7px;
+    white-space: nowrap;
+}
+
+.overrides-device-value {
+    padding-left: 10px;
+    color: gray;
+}
+
+.overrides-device-value-label {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    margin-top: 10px;
+}
+
+.overrides-viewport {
+    width: 100%;
+}
+
+.overrides-viewport input {
+    text-align: right;
+}
+
+.overrides-viewport input[type=range] {
+    width: 100%;
+}
+
+button.overrides-swap {
+    height: 20px;
+}
+
+.overrides-view label {
+    display: flex;
+    height: auto;
+}
+
+.overrides-viewport label {
+    margin-bottom: 10px;
+}
+
+.overrides-viewport table {
+    margin-bottom: 5px;
+}
+
+.overrides-viewport > label {
+    margin-bottom: 8px;
+}
+
+.overrides-viewport .help-footnote {
+    border-top: 1px solid #EEEEEE;
+    margin: 0;
+    padding: 12px;
+}
+
+.overrides-user-agent input[type=text] {
+    width: 400px;
+    max-width: 90%;
+}
+
+.overrides-user-agent select {
+    margin: 7px 0;
+}
+
+.overrides-sensors > label {
+    margin-bottom: 10px;
+}
+
+.overrides-device, .overrides-viewport, .overrides-user-agent, .overrides-sensors {
+    flex: none !important;
+}
+
+.overrides-sensors input {
+    text-align: right;
+}
+
+.overrides-activate-device #tab-device,
+.overrides-activate-viewport #tab-viewport,
+.overrides-activate-user-agent #tab-user-agent,
+.overrides-activate-sensors #tab-sensors {
+    color: rgb(25, 100, 228);
+    opacity: 0.8;
+}
+
+.overrides-activate-device #tab-device.selected,
+.overrides-activate-viewport #tab-viewport.selected,
+.overrides-activate-user-agent #tab-user-agent.selected,
+.overrides-activate-sensors #tab-sensors.selected {
+    opacity: 1;
+}
+
+.overrides-view input[type=text]:enabled:focus,
+.overrides-view select:enabled:focus {
+    -webkit-transition: border-color 200ms;
+    border-color: rgb(77, 144, 254);
+    outline: none;
+}
+
+.overrides-view input[type=text],
+.overrides-view select {
+    border: 1px solid #bfbfbf;
+    border-radius: 2px;
+    box-sizing: border-box;
+    color: #444;
+    font: inherit;
+    border-width: 1px;
+}
+
+.overrides-view input[type=text] {
+    margin: 0;
+    min-height: 2em;
+    padding: 3px;
+}
+
+.overrides-view .overrides-footer {
+    flex: none;
+    padding: 0 0 1px 3px;
+    border-top: 1px solid rgb(203,203,203);
+    background-color: rgb(236,236,236);
+}
+
+.overrides-view .overrides-footer::before {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    width: 10px;
+    height: 10px;
+    content: "";
+    position: relative;
+    top: 2px;
+    background-position: -202px -107px;
+    float: left;
+    margin-right: 4px;
+}
+
+.overrides-view .overrides-footer .warning-icon-small {
+    margin-right: 3px;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/panelEnablerView.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/panelEnablerView.css
new file mode 100644 (file)
index 0000000..2290ab9
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.panel-enabler-view {
+    background-color: white;
+    font-size: 13px;
+    text-align: center;
+    overflow-x: hidden;
+    overflow-y: overlay;
+    flex: auto;
+    display: flex;
+}
+
+.panel-enabler-view h1 {
+    color: rgb(110, 116, 128);
+    font-size: 16px;
+    line-height: 20px;
+    font-weight: normal;
+    margin-top: 0;
+}
+
+.panel-enabler-view img {
+    height: 100%;
+    min-height: 200px;
+    max-width: 100%;
+    top: 0;
+    bottom: 0;
+    padding: 20px 0 20px 20px;
+    margin: auto;
+    vertical-align: middle;
+}
+
+.panel-enabler-view img.hidden {
+    display: initial !important;
+    width: 0;
+}
+
+.panel-enabler-view .flexible-space {
+    -webkit-flex: 1;
+}
+
+.panel-enabler-view form {
+    display: inline-block;
+    vertical-align: middle;
+    width: 330px;
+    margin: 0;
+    padding: 15px;
+    white-space: normal;
+}
+
+.panel-enabler-view label {
+    position: relative;
+    display: block;
+    text-align: left;
+    word-break: break-word;
+    margin: 0 0 5px 20px;
+}
+
+.panel-enabler-view button:not(.status-bar-item) {
+    font-size: 13px;
+    margin: 6px 0 0 0;
+    padding: 2px 20px;
+    height: 24px;
+    color: rgb(6, 6, 6);
+    border: 1px solid rgb(165, 165, 165);
+    background-color: rgb(237, 237, 237);
+    background-image: linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));
+    border-radius: 12px;
+    -webkit-appearance: none;
+}
+
+body.inactive .panel-enabler-view button:not(.status-bar-item),
+.panel-enabler-view button:disabled:not(.status-bar-item) {
+    color: rgb(130, 130, 130);
+    border-color: rgb(212, 212, 212);
+    background-color: rgb(239, 239, 239);
+    background-image: linear-gradient(to bottom, rgb(250, 250, 250), rgb(235, 235, 235));
+}
+
+.panel-enabler-view button:active:not(.status-bar-item) {
+    background-color: rgb(215, 215, 215);
+    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));
+}
+
+.panel-enabler-view input[type="radio"] {
+    height: 17px;
+    width: 17px;
+    min-width: 17px;
+    border: 1px solid rgb(165, 165, 165);
+    background-image: linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));
+    border-radius: 8px;
+    -webkit-appearance: none;
+    vertical-align: middle;
+    margin: 0 5px 5px 0;
+}
+
+.panel-enabler-view input[type="radio"]:active:not(:disabled) {
+    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));
+}
+
+.panel-enabler-view input[type="radio"]:checked {
+    background: url(Images/radioDot.png) center no-repeat,
+                linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));
+}
+
+.panel-enabler-view input[type="radio"]:checked:active {
+    background: url(Images/radioDot.png) center no-repeat,
+                linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/profilesPanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/profilesPanel.css
new file mode 100644 (file)
index 0000000..d6400c8
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+/* Profiler Style */
+
+#profile-views {
+    flex: auto;
+    position: relative;
+}
+
+.profile-view .data-grid table.data {
+    background: white;
+}
+
+.profile-view .data-grid tr:not(.filler):hover td {
+    background-color: rgba(0, 0, 0, 0.1);
+}
+
+.profiles.panel .status-bar {
+    border-bottom: 1px solid rgb(202, 202, 202);
+    border-top: none;
+}
+
+.profiles-status-bar {
+    background-color: rgb(236, 236, 236);
+    flex: 0 0 23px;
+}
+
+.profile-launcher-view-tree-item > .icon {
+    width: 4px !important;
+    visibility: hidden;
+}
+
+.profiles-sidebar-tree-box {
+    overflow: auto;
+    flex: auto;
+}
+
+.profiles-sidebar-tree-box > ol {
+    overflow: auto;
+    flex: auto;
+}
+
+.profile-sidebar-tree-item .icon {
+    content: url(Images/profileIcon.png);
+}
+
+.profile-sidebar-tree-item.small .icon {
+    content: url(Images/profileSmallIcon.png);
+}
+
+.profile-group-sidebar-tree-item .icon {
+    content: url(Images/profileGroupIcon.png);
+}
+
+.sidebar-tree-item .title-container > .save-link {
+    text-decoration: underline;
+    margin-left: auto;
+    display: none;
+}
+
+.sidebar-tree-item.selected .title-container > .save-link {
+    display: block;
+}
+
+.cpu-profile-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.cpu-profile-view.visible {
+    display: flex;
+}
+
+.cpu-profile-view .data-grid {
+    border: none;
+    flex: auto;
+}
+
+.cpu-profile-view .data-grid th.average-column {
+    text-align: center;
+}
+
+.cpu-profile-view .data-grid td.average-column {
+    text-align: right;
+}
+
+.cpu-profile-view .data-grid th.self-column {
+    text-align: center;
+}
+
+.cpu-profile-view .data-grid td.self-column {
+    text-align: right;
+}
+
+.cpu-profile-view .data-grid th.total-column {
+    text-align: center;
+}
+
+.cpu-profile-view .data-grid td.total-column {
+    text-align: right;
+}
+
+.cpu-profile-view .data-grid .calls-column {
+    text-align: center;
+}
+
+.profile-node-file {
+    float: right;
+    color: gray;
+}
+
+.profile-warn-marker {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    background-position: -202px -107px;
+    width: 10px;
+    height: 10px;
+    vertical-align: -1px;
+    margin-right: 2px;
+    display: inline-block;
+}
+
+.data-grid tr.selected .profile-node-file {
+    color: rgb(33%, 33%, 33%);
+}
+
+.data-grid:focus tr.selected .profile-node-file {
+    color: white;
+}
+
+.percent-time-status-bar-item .glyph {
+    -webkit-mask-position: -192px -24px;
+}
+
+.focus-profile-node-status-bar-item .glyph {
+    -webkit-mask-position: -96px 0;
+}
+
+.exclude-profile-node-status-bar-item .glyph {
+    -webkit-mask-position: -128px 0;
+}
+
+.reset-profile-status-bar-item .glyph {
+    -webkit-mask-position: 0 0;
+}
+
+.garbage-collect-status-bar-item .glyph {
+    -webkit-mask-position: -128px -24px;
+}
+
+.profile-launcher-view-content {
+    padding: 0 16px;
+    text-align: left;
+}
+
+.control-profiling {
+    -webkit-align-self: flex-start;
+    margin-right: 50px;
+}
+
+.profile-launcher-view > .profile-launcher-view-content > .load-profile {
+    margin-left: 20px;
+}
+
+.profile-launcher-view-content h1 {
+    padding: 15px 0 10px;
+}
+
+.panel-enabler-view.profile-launcher-view form {
+    padding: 0;
+    font-size: 13px;
+    width: 100%;
+}
+
+.panel-enabler-view.profile-launcher-view label {
+    margin: 0;
+}
+
+.profile-launcher-view-content p {
+    color: grey;
+    margin-top: 1px;
+    margin-left: 22px;
+}
+
+.profile-launcher-view-content button.running:not(.status-bar-item) {
+    color: red;
+}
+
+body.inactive .profile-launcher-view-content button.running:not(.status-bar-item) {
+    color: rgb(220, 130, 130);
+}
+
+.highlighted-row {
+    -webkit-animation: "row_highlight" 2s 0s;
+}
+
+@-webkit-keyframes row_highlight {
+    from {background-color: rgba(255, 255, 120, 1); }
+    to { background-color: rgba(255, 255, 120, 0); }
+}
+
+.profile-canvas-decoration .warning-icon-small {
+    margin-right: 4px;
+}
+
+.profile-canvas-decoration {
+    color: red;
+    margin: -14px 0 13px 22px;
+    padding-left: 14px;
+}
+
+.profile-canvas-decoration button {
+    margin: 0 0 0 10px !important;
+}
+
+.profile-entry-info {
+    position: absolute;
+    bottom: 20px;
+    left: 20px;
+    height: 120px;
+    background-color: rgba(255, 255, 255, 0.7);
+    pointer-events: none;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/resourceView.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/resourceView.css
new file mode 100644 (file)
index 0000000..9f17718
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.resource-view {
+    display: none;
+    overflow: auto;
+}
+
+.resource-view.visible {
+    display: flex;
+}
+
+.resource-view > * {
+    flex: none;
+}
+
+.resource-view.font {
+    font-size: 60px;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    text-align: center;
+    padding: 15px;
+}
+
+.resource-view .script-view {
+    background-color: rgb(240, 240, 240);
+}
+
+.resource-view.image > .image {
+    padding: 20px 20px 10px 20px;
+    text-align: center;
+}
+
+.resource-view.image > .info {
+    padding-bottom: 10px;
+    font-size: 11px;
+    -webkit-user-select: text;
+}
+
+.resource-view.image img.resource-image-view {
+    max-width: 100%;
+    max-height: 1000px;
+    background-image: url(Images/checker.png);
+    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.5);
+    -webkit-user-select: text;
+    -webkit-user-drag: auto;
+}
+
+.resource-status-image {
+    margin-top: -2px;
+    margin-right: 3px;
+    vertical-align: middle;
+}
+
+.resource-view.image .title {
+    text-align: center;
+    font-size: 13px;
+}
+
+.resource-view.image .infoList {
+    margin: 0;
+}
+
+.resource-view.image .infoList dt {
+    font-weight: bold;
+    display: inline-block;
+    width: 50%;
+    text-align: right;
+    color: rgb(76, 76, 76);
+}
+
+.resource-view.image .infoList dd {
+    display: inline-block;
+    padding-left: 8px;
+    width: 50%;
+    text-align: left;
+    margin: 0;
+}
+
+.resource-view.image .infoList dd::after {
+    white-space: pre;
+    content: "\A";
+}
+
+.script-view-fallback {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+    -webkit-user-select: text;
+    background-color: inherit;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/resourcesPanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/resourcesPanel.css
new file mode 100644 (file)
index 0000000..6a9bcbe
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.resources.panel .sidebar-resizer-vertical {
+    top: 23px;
+}
+
+.resources.panel .sidebar {
+    padding-left: 0;
+    z-index: 10;
+    display: block;
+}
+
+.resources.panel .sidebar li {
+    height: 18px;
+    white-space: nowrap;
+}
+
+.resources.panel .sidebar li.selected {
+    color: white;
+    text-shadow: rgba(0, 0, 0, 0.33) 1px 1px 0;
+}
+
+.resources.panel .sidebar li.selected .selection {
+    background-image: linear-gradient(to bottom, rgb(162, 177, 207), rgb(120, 138, 177));
+    border-top: 1px solid #979797;
+    height: 18px;
+}
+
+.resources.panel .sidebar :focus li.selected .selection {
+    background-image: linear-gradient(to bottom, rgb(92, 147, 213), rgb(21, 83, 170));
+    border-top: 1px solid rgb(68, 128, 200);
+}
+
+body.inactive .resources.panel .sidebar li.selected .selection {
+    background-image: linear-gradient(to bottom, rgb(180, 180, 180), rgb(138, 138, 138));
+    border-top: 1px solid rgb(151, 151, 151);
+}
+
+.resources.panel .sidebar .icon {
+    width: 16px;
+    height: 16px;
+    float: left;
+}
+
+.resources.panel .base-storage-tree-element-title {
+    overflow: hidden;
+    position: relative;
+    text-overflow: ellipsis;
+    padding-left: 2px;
+    top: 1px;
+}
+
+.resources-main {
+    position: absolute;
+    top: 0;
+    bottom: 23px;
+    left: 0;
+    right: 0;
+    display: flex;
+}
+
+.resources-status-bar {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    height: 23px;
+    background-color: rgb(236, 236, 236);
+}
+
+li.selected .base-storage-tree-element-subtitle {
+    color: white;
+}
+
+.base-storage-tree-element-subtitle {
+    padding-left: 2px;
+    color: rgb(80, 80, 80);
+    text-shadow: none;
+}
+
+.resources.panel .status {
+    float: right;
+    height: 16px;
+    margin-top: 1px;
+    margin-left: 4px;
+    line-height: 1em;
+}
+
+.resources.panel li .status .bubble {
+    height: 13px;
+    padding-top: 0;
+}
+
+.storage-view {
+    display: none;
+    overflow: hidden;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+}
+
+.storage-view.visible {
+    display: flex;
+}
+
+.storage-view {
+    overflow: hidden;
+}
+
+.storage-view .data-grid:not(.inline) {
+    border: none;
+    flex: auto;
+}
+
+.storage-view .storage-table-error {
+    color: rgb(66%, 33%, 33%);
+}
+
+.storage-view.query {
+    padding: 2px 0;
+    overflow-y: overlay;
+    overflow-x: hidden;
+}
+
+.database-query-prompt {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px;
+    white-space: pre-wrap;
+    -webkit-user-modify: read-write-plaintext-only;
+    -webkit-user-select: text;
+}
+
+.database-user-query::before,
+.database-query-prompt::before,
+.database-query-result::before {
+    position: absolute;
+    display: block;
+    content: "";
+    left: 7px;
+    top: 0.8em;
+    width: 10px;
+    height: 10px;
+    margin-top: -7px;
+    -webkit-user-select: none;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.database-user-query::before,
+.database-query-prompt::before,
+.database-query-result::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.database-query-prompt::before {
+    background-position: -192px -96px;
+}
+
+.database-user-query {
+    position: relative;
+    border-bottom: 1px solid rgb(245, 245, 245);
+    padding: 1px 22px 1px 24px;
+    min-height: 16px;
+}
+
+.database-user-query::before {
+    background-position: -192px -107px;
+}
+
+.database-query-text {
+    color: rgb(0, 128, 255);
+    -webkit-user-select: text;
+}
+
+.database-query-result {
+    position: relative;
+    padding: 1px 22px 1px 24px;
+    min-height: 16px;
+    margin-left: -24px;
+    padding-right: 0;
+}
+
+.database-query-result.error {
+    color: red;
+    -webkit-user-select: text;
+}
+
+.database-query-result.error::before {
+    background-position: -213px -96px;
+}
+
+.resource-sidebar-tree-item .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item .icon {
+    content: url(Images/resourcePlainIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-type-image .icon {
+    position: relative;
+    background-image: url(Images/resourcePlainIcon.png);
+    background-repeat: no-repeat;
+    content: "";
+}
+
+.resources-type-image .image-resource-icon-preview {
+    position: absolute;
+    margin: auto;
+    top: 3px;
+    bottom: 4px;
+    left: 5px;
+    right: 5px;
+    max-width: 18px;
+    max-height: 21px;
+    min-width: 1px;
+    min-height: 1px;
+}
+
+.children.small .resource-sidebar-tree-item.resources-type-image .icon {
+    background-image: url(Images/resourcePlainIconSmall.png);
+    content: "";
+}
+
+.children.small .resources-type-image .image-resource-icon-preview {
+    top: 2px;
+    bottom: 1px;
+    left: 3px;
+    right: 3px;
+    max-width: 8px;
+    max-height: 11px;
+}
+
+.resource-sidebar-tree-item.resources-type-document .icon {
+    content: url(Images/resourceDocumentIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-type-document .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-type-stylesheet .icon {
+    content: url(Images/resourceCSSIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-type-stylesheet .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-type-image .icon {
+    position: relative;
+    background-image: url(Images/resourcePlainIcon.png);
+    background-repeat: no-repeat;
+    content: "";
+}
+
+.children.small .resource-sidebar-tree-item.resources-type-image .icon {
+    background-image: url(Images/resourcePlainIconSmall.png);
+    content: "";
+}
+
+.resource-sidebar-tree-item.resources-type-font .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-type-font .icon {
+    content: url(Images/resourcePlainIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-type-script .icon {
+    content: url(Images/resourceJSIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-type-script .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.resource-sidebar-tree-item.resources-type-xhr .icon {
+    content: url(Images/resourcePlainIcon.png);
+}
+
+.children.small .resource-sidebar-tree-item.resources-type-xhr .icon {
+    content: url(Images/resourceDocumentIconSmall.png);
+}
+
+.frame-storage-tree-item .icon {
+    content: url(Images/frame.png);
+}
+
+.database-storage-tree-item .icon {
+    content: url(Images/database.png);
+}
+
+.database-table-storage-tree-item .icon {
+    content: url(Images/databaseTable.png);
+}
+
+.indexed-db-storage-tree-item .icon {
+    content: url(Images/indexedDB.png);
+}
+
+.indexed-db-object-store-storage-tree-item .icon {
+    content: url(Images/indexedDBObjectStore.png);
+}
+
+.indexed-db-index-storage-tree-item .icon {
+    content: url(Images/indexedDBIndex.png);
+}
+
+.domstorage-storage-tree-item.local-storage .icon {
+    content: url(Images/localStorage.png);
+}
+
+.domstorage-storage-tree-item.session-storage .icon {
+    content: url(Images/sessionStorage.png);
+}
+
+.cookie-storage-tree-item .icon {
+    content: url(Images/cookie.png);
+}
+
+.application-cache-storage-tree-item .icon {
+    content: url(Images/applicationCache.png);
+}
+
+.file-system-storage-tree-item .icon {
+    content: url(Images/fileSystem.png);
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/revisionHistory.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/revisionHistory.css
new file mode 100644 (file)
index 0000000..0c77ec7
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ * 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.
+ */
+
+.outline-disclosure.revision-history-drawer {
+    -webkit-padding-start: 0;
+    overflow: auto;
+}
+
+.outline-disclosure.revision-history-drawer ol {
+    margin-top: 2px;
+    -webkit-padding-start: 0;
+    padding-left: 0 !important;
+}
+
+.outline-disclosure.revision-history-drawer > ol {
+    padding-left: 0;
+}
+
+.outline-disclosure.revision-history-drawer li {
+    padding-left: 6px;
+    margin-top: 0;
+    margin-bottom: 0;
+    height: 13px;
+}
+
+.outline-disclosure.revision-history-drawer li.parent {
+    margin-left: 4px;
+}
+
+.revision-history-link {
+    text-decoration: underline;
+    cursor: pointer;
+    color: #00e;
+    padding: 0 4px;
+}
+
+.revision-history-link-row {
+    padding-left: 16px;
+}
+
+.outline-disclosure.revision-history-drawer .revision-history-line {
+    padding-left: 0;
+    -webkit-user-select: text;
+}
+
+.revision-history-drawer .webkit-line-number {
+    border-right: 1px solid #BBB;
+    background-color: #F0F0F0;    
+}
+
+.revision-history-drawer li.revision-history-revision {
+    padding-left: 16px;
+}
+
+.revision-history-line-added {
+    background-color: rgb(153, 238, 153);
+}
+
+.revision-history-line-removed {
+    background-color: rgb(255, 221, 221);
+}
+
+.revision-history-line-separator .webkit-line-number {
+    color: transparent;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/screencastView.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/screencastView.css
new file mode 100644 (file)
index 0000000..9e61633
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * 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.
+ */
+
+.screencast {
+    overflow: hidden;
+}
+
+.screencast-navigation {
+    -webkit-flex-direction: row;
+    display: -webkit-flex;
+    height: 25px;
+    position: relative;
+}
+
+.screencast-navigation button {
+    -webkit-border-radius: 2px;
+    background-color: transparent;
+    background-image: -webkit-image-set(
+        url(Images/navigationControls.png) 1x,
+        url(Images/navigationControls_2x.png) 2x);
+    background-clip: content-box;
+    background-origin: content-box;
+    background-repeat: no-repeat;
+    border: 1px solid transparent;
+    height: 23px;
+    padding: 3px 2px 1px;
+    width: 23px;
+}
+
+.screencast-navigation button:hover {
+    border-color: #ccc;
+}
+
+.screencast-navigation button:active {
+    border-color: #aaa;
+}
+
+.screencast-navigation button[disabled] {
+    opacity: 0.5;
+}
+
+.screencast-navigation button.back {
+    background-position-x: -1px;
+}
+
+.screencast-navigation button.forward {
+    background-position-x: -18px;
+}
+
+.screencast-navigation button.reload {
+    background-position-x: -37px;
+}
+
+.screencast-navigation input {
+    -webkit-flex: 1;
+    border: 1px solid #aaa;
+    border-radius: 2px;
+    margin: 1px;
+    padding-left: 5px;
+}
+
+.screencast-navigation input:focus {
+    border: 1px solid #aaa;
+    outline: none !important;
+}
+
+.screencast-navigation .progress {
+    background-color: rgb(66, 129, 235);
+    height: 3px;
+    left: 0;
+    position: absolute;
+    top: 100%;  /* Align with the bottom edge of the parent. */
+    width: 0;
+    z-index: 2;  /* Above .screencast-glasspane. */
+}
+
+.screencast-viewport {
+    border: 20px solid #333;
+    border-radius: 20px;
+    position: absolute;
+    top: 36px;
+    left: 10px;
+    right: 10px;
+    bottom: 10px;
+}
+
+.screencast canvas {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+}
+
+.screencast-px {
+    color: rgb(128, 128, 128);
+}
+
+.screencast-element-title {
+    position: absolute;
+    z-index: 10;
+}
+
+.screencast-tag-name {
+    /* Keep this in sync with view-source.css (.webkit-html-tag) */
+    color: rgb(136, 18, 128);
+}
+
+.screencast-node-id {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */
+    color: rgb(26, 26, 166);
+}
+
+.screencast-class-name {
+    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */
+    color: rgb(153, 69, 0);
+}
+
+.screencast-glasspane {
+  -webkit-box-orient: horizontal;
+  -webkit-box-align: center;
+  -webkit-box-pack: center;
+  background-color: rgba(255, 255, 255, 0.8);
+  bottom: 0;
+  display: -webkit-box;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 25px;  /* Align with the botton edge of .screencast .navigation. */
+  font-size: 30px;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sidebarPane.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sidebarPane.css
new file mode 100644 (file)
index 0000000..4830584
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.sidebar-pane {
+    position: relative;
+}
+
+.sidebar-pane > .body {
+    position: relative;
+    display: none;
+}
+
+.sidebar-pane > .body .info {
+    text-align: center;
+    font-style: italic;
+    font-size: 90%;
+    padding: 6px;
+    color: #888;
+}
+
+.sidebar-pane > .body .placard + .info {
+    border-top: 1px solid rgb(189, 189, 189);
+    background-color: rgb(255, 255, 194);
+}
+
+.sidebar-pane.visible > .body {
+    display: block;
+}
+
+.sidebar-pane .section .properties {
+    padding-left: 16px;
+}
+
+.sidebar-tabbed-pane .tabbed-pane-header {
+    border-bottom: 1px solid rgb(202, 202, 202);
+    background-color: rgb(236, 236, 236);
+}
+
+.sidebar-pane-stack > .sidebar-pane.visible:nth-last-of-type(1) {
+    border-bottom: 1px solid rgb(189, 189, 189);
+}
+
+.sidebar-pane-title {
+    position: relative;
+    background: rgb(240, 240, 240);
+    height: 20px;
+    padding: 0 5px;
+    border-top: 1px solid rgb(189, 189, 189);
+    border-bottom: 1px solid rgb(189, 189, 189);
+    line-height: 18px;
+    background-origin: padding;
+    background-clip: padding;
+    margin-top: -1px;
+    white-space: nowrap;
+}
+
+.sidebar-pane-title:active {
+    background-color: rgb(204, 204, 204);
+    border-top: 1px solid rgb(178, 178, 178);
+    border-bottom: 1px solid rgb(178, 178, 178);
+}
+
+.sidebar-pane-title::before {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    float: left;
+    width: 11px;
+    height: 11px;
+    margin-right: 2px;
+    content: "a";
+    color: transparent;
+    position: relative;
+    top: 3px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.sidebar-pane-title::before {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.sidebar-pane-title::before {
+    background-position: -4px -96px;
+}
+
+.sidebar-pane-title.expanded::before {
+    background-position: -20px -96px;
+}
+
+.sidebar-pane-toolbar {
+    line-height: 18px;
+    left: 0;
+    right: 4px;
+    top: 0;
+    height: 20px;
+    position: absolute;
+    pointer-events: none;
+}
+
+.sidebar-pane-toolbar > * {
+    pointer-events: auto;
+}
+
+.sidebar-pane-toolbar > .pane-title-button,
+.sidebar-pane-toolbar > label {
+    float: right;
+    height: 19px;
+    background-color: transparent;
+    border: none;
+    background-repeat: no-repeat;
+    margin: 1px 0 0 0;
+    padding: 0;
+    border-radius: 0;
+    -webkit-appearance: none;
+}
+
+.sidebar-pane-toolbar > .pane-title-button {
+    width: 23px;
+    color: transparent;
+}
+
+.sidebar-pane-toolbar > .pane-title-button:hover {
+    background-position: -23px 0;
+}
+
+.sidebar-pane-toolbar > .pane-title-button:active,
+.sidebar-pane-toolbar > .pane-title-button.toggled {
+    background-position: -46px 0;
+}
+
+.sidebar-pane-toolbar > .pane-title-button.add {
+    background-image: url(Images/paneAddButtons.png);
+}
+
+.sidebar-pane-toolbar > .pane-title-button.element-state {
+    background-image: url(Images/paneElementStateButtons.png);
+}
+
+.sidebar-pane-toolbar > .pane-title-button.refresh {
+    background-image: url(Images/paneRefreshButtons.png);
+}
+
+.sidebar-pane-toolbar > label.scripts-callstack-async {
+    margin: auto;
+    margin-right: 5px;
+    display: flex;
+}
+
+.sidebar-pane-subtitle {
+    position: absolute;
+    right: 0;
+}
+
+body.platform-windows .sidebar-pane-subtitle {
+    padding-top: 1px;
+}
+
+.section > .header input[type=checkbox] {
+    height: 1em;
+    width: 1em;
+    margin-left: 0;
+    margin-top: 0;
+    margin-bottom: 0.25em;
+    vertical-align: bottom;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sourcesPanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sourcesPanel.css
new file mode 100644 (file)
index 0000000..6416333
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+.scripts-pause-on-exceptions-status-bar-item .glyph {
+    -webkit-mask-position: -256px 0;
+}
+
+.scripts-pause-on-exceptions-status-bar-item.toggled-on .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+.evaluate-snippet-status-bar-item .glyph {
+    -webkit-mask-position: -64px -48px;
+}
+
+.evaluate-snippet-status-bar-item.toggled .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+.scripts-debug-toolbar {
+    position: absolute;
+    top: 0;
+    width: 100%;
+    background-color: rgb(236, 236, 236);
+    overflow: hidden;
+    white-space: nowrap;
+}
+
+.scripts-debug-toolbar-drawer {
+    flex: 0 0 46px;
+    -webkit-transition: margin-top 0.1s ease-in-out;
+    margin-top: -23px;
+    line-height: 23px;
+    padding-top: 22px;
+    border-bottom: 1px solid rgb(202, 202, 202);
+    background-color: white;
+    overflow: hidden;
+}
+
+.scripts-debug-toolbar-drawer.expanded {
+    margin-top: 0;
+}
+
+.scripts-debug-toolbar-drawer > label {
+    display: flex;
+    padding-left: 3px;
+    border-top: 1px solid rgb(196,196,196);
+}
+
+#scripts-editor-toolbar {
+    position: relative;
+    margin-top: -1px;
+    height: 24px;
+}
+
+.scripts-run-snippet .glyph {
+    -webkit-mask-position: -64px -48px;
+}
+
+.scripts-pause .glyph {
+    -webkit-mask-position: -32px -72px;
+}
+
+.scripts-pause.toggled-on .glyph {
+    -webkit-mask-position: 0 -72px;
+}
+
+.scripts-step-over .glyph {
+    -webkit-mask-position: -128px -72px;
+}
+
+.scripts-step-into .glyph {
+    -webkit-mask-position: -64px -72px;
+}
+
+.scripts-step-out .glyph {
+    -webkit-mask-position: -96px -72px;
+}
+
+.scripts-long-resume .glyph {
+    -webkit-mask-position: -64px -48px;
+}
+
+.scripts-toggle-breakpoints.toggled-on .glyph {
+    -webkit-mask-position: -32px 0;
+}
+
+.scripts-toggle-breakpoints .glyph {
+    -webkit-mask-position: 0 -24px;
+}
+
+.dedicated-worker-item {
+    margin: 5px 0 5px 1px;
+}
+
+#shared-workers-list {
+    margin: 5px 0 5px 20px;
+    font-style:italic;
+}
+
+#pause-workers-checkbox > input {
+    position: relative;
+    top: 2px;
+}
+
+.panel.sources #sources-editor-container-tabbed-pane .tabbed-pane-header-contents {
+    margin-left: 22px;
+    margin-right: 36px;
+}
+
+.panel.sources .split-view button.scripts-debugger-show-hide-button.right-sidebar-show-hide-button.toggled-hide {
+    margin-right: 15px;
+}
+
+.panel.sources .split-view #scripts-debug-sidebar-resizer-widget.ns-resizer-widget {
+    -webkit-transform: rotate(90deg);
+    right: 17px;
+    bottom: 4px;
+    top: auto;
+    height: 10px;
+    width: 18px;
+}
+
+.panel.sources .split-view.hbox #scripts-debug-sidebar-resizer-widget {
+    bottom: 0;
+}
+
+.panel.sources .scripts-debugger-show-hide-button {
+    display: block;
+}
+
+.panel.sources button.status-bar-item.scripts-navigator-show-hide-button {
+    display: block;
+    top: 4px;
+    left: 4px;
+}
+
+.panel.sources .navigator-tabbed-pane .tabbed-pane-header {
+    background-color: rgb(236, 236, 236);
+}
+
+.function-location-link {
+    float: right;
+    margin-left: 10px;
+}
+
+.function-popover-title {
+    border-bottom: 1px solid #AAA;
+    margin-bottom: 3px;
+    padding-bottom: 2px;
+}
+
+.function-popover-title .function-name {
+    font-weight: bold;
+}
+
+.workers-list > li {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    margin-left: 1em;
+    font-size: 12px;
+}
+
+a.worker-item {
+    color: rgb(33%, 33%, 33%);
+    cursor: pointer;
+    text-decoration: none;
+}
+
+a.worker-item:hover {
+    color: rgb(15%, 15%, 15%);
+}
+
+.panel.sources .sidebar-pane-stack {
+    overflow: auto;
+}
+
+.threads-toolbar {
+    padding-left: 10px;
+    margin-top: -1px;
+}
+
+.panel.sources .drag-mask {
+    background-color: rgba(255,255,255,0.8);
+    z-index: 1000;
+}
+
+.panel.sources .drag-mask-inner {
+    font-size: 30px;
+    color: #999;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin: 20px;
+    border: 4px dashed #ddd;
+    pointer-events: none;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sourcesView.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/sourcesView.css
new file mode 100644 (file)
index 0000000..369d820
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * 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.
+ */
+
+#sources-panel-sources-view {
+    flex: auto;
+    position: relative;
+}
+
+#sources-editor-container-tabbed-pane {
+    flex: auto;
+}
+
+#sources-editor-container-tabbed-pane .tabbed-pane-header-tab {
+    border-bottom: 1px solid #BBB;
+}
+
+#sources-panel-sources-view .tabbed-pane-header {
+    background-color: rgb(236, 236, 236);
+}
+
+#sources-panel-sources-view .sources-status-bar {
+    display: flex;
+    position: relative;
+    flex: 0 0 20px;
+    background-color: rgb(236, 236, 236);
+    border-top: 1px solid rgb(196,196,196);
+}
+
+#sources-panel-sources-view .sources-status-bar .status-bar-item {
+    margin-top: -1px;
+    height: 20px;
+}
+
+#sources-panel-sources-view .sources-status-bar .status-bar-item.status-bar-text {
+    margin: auto 0;
+    height: auto;
+}
+
+#sources-panel-sources-view .source-frame-cursor-position {
+    -webkit-user-select: text;
+}
+
+#sources-panel-sources-view .sources-toggle-pretty-print-status-bar-item .glyph {
+    -webkit-mask-position: -256px -24px;
+}
+
+#sources-panel-sources-view .sources-toggle-pretty-print-status-bar-item.toggled .glyph {
+    background-color: rgb(66, 129, 235);
+}
+
+.source-frame-debugger-script {
+    background-color: rgba(255, 255, 194, 0.5);
+}
+
+.source-frame-unsaved-committed-changes {
+    background-color: rgba(255, 225, 205, 0.40);
+}
+
+.editor-container-unsaved-committed-changes-icon {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    background-position: -202px -107px;
+}
+
+button.status-bar-item.scripts-debugger-show-hide-button {
+    display: none;
+}
+
+button.status-bar-item.scripts-navigator-show-hide-button {
+    display: none;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/spectrum.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/spectrum.css
new file mode 100644 (file)
index 0000000..b9331fb
--- /dev/null
@@ -0,0 +1,115 @@
+/* https://github.com/bgrins/spectrum */
+.spectrum-container {
+    position: absolute;
+    top: 0;
+    left: 0;
+    display: inline-block;
+    background: rgba(230, 230, 230, 1) !important;
+    border: 1px solid #646464;
+    padding: 10px;
+    width: 220px;
+    z-index: 10;
+    -webkit-user-select: none;
+}
+
+.spectrum-top {
+    position: relative;
+    width: 100%;
+    display: inline-block;
+}
+
+.spectrum-color {
+    position: absolute;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 40px;
+}
+
+.spectrum-display-value {
+    -webkit-user-select: text;
+    position: relative;
+    left: 2px;
+    top: -6px;
+}
+
+.spectrum-hue {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 170px;
+    -webkit-box-reflect: right -28px;
+}
+
+.spectrum-fill {
+    /* Same as spectrum-color width to force aspect ratio. */
+    margin-top: 150px;
+}
+
+.spectrum-range-container {
+    position: relative;
+    padding-bottom: 5px;
+}
+
+.spectrum-range-container * {
+    font-size: 11px;
+    vertical-align: middle;
+}
+
+.spectrum-range-container label {
+    display: inline-block;
+    padding-right: 4px;
+}
+
+.spectrum-range-container input {
+    position: absolute;
+    left: 15px;
+    right: 40px;
+    margin: 3px 0 0 0;
+}
+
+.spectrum-dragger,
+.spectrum-slider {
+    -webkit-user-select: none;
+}
+
+.spectrum-sat {
+    background-image: linear-gradient(to right, white, rgba(204, 154, 129, 0));
+}
+
+.spectrum-val {
+    background-image: linear-gradient(to top, black, rgba(204, 154, 129, 0));
+}
+
+.spectrum-hue {
+    background: linear-gradient(to top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
+}
+
+.spectrum-dragger {
+    border-radius: 5px;
+    height: 5px;
+    width: 5px;
+    border: 1px solid white;
+    cursor: pointer;
+    position: absolute;
+    top: 0;
+    left: 0;
+    background: black;
+}
+
+.spectrum-slider {
+    position: absolute;
+    top: 0;
+    cursor: pointer;
+    border: 1px solid black;
+    height: 4px;
+    left: -1px;
+    right: -1px;
+}
+
+.spectrum-container .swatch {
+    width: 20px;
+    height:20px;
+    margin: 0;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/splitView.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/splitView.css
new file mode 100644 (file)
index 0000000..f735ebd
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+.split-view {
+    display: flex;
+    overflow: hidden;
+}
+
+.split-view-contents {
+    overflow: auto;
+    display: flex;
+    position: relative;
+    flex-direction: column;
+}
+
+.split-view-sidebar {
+    flex: none;
+}
+
+.split-view-main, .split-view-sidebar.maximized {
+    flex: auto;
+}
+
+.split-view.hbox > .split-view-resizer {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 6px;
+    z-index: 500;
+}
+
+.split-view.vbox > .split-view-resizer {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 6px;
+    z-index: 500;
+}
+
+.split-view-resizer-border {
+    pointer-events: none;
+}
+
+.split-view.vbox > .split-view-resizer > .split-view-resizer-border {
+    width: 100%;
+    margin-top: 3px;
+    height: 1px;
+    border-top: 1px solid rgb(64%, 64%, 64%);
+}
+
+.split-view.hbox > .split-view-resizer > .split-view-resizer-border {
+    height: 100%;
+    margin-left: 3px;
+    width: 1px;
+    border-left: 1px solid rgb(64%, 64%, 64%);
+}
+
+.split-view button.sidebar-show-hide-button {
+    position: absolute;
+    background-image: none;
+    height: 16px;
+    width: 16px;
+    border: none;
+    z-index: 10;
+}
+
+.split-view button.left-sidebar-show-hide-button,
+.split-view button.top-sidebar-show-hide-button {
+    top: 4px;
+    left: 4px;
+}
+
+.split-view button.left-sidebar-show-hide-button:active,
+.split-view button.top-sidebar-show-hide-button:active {
+    top: 5px;
+    left: 3px;
+}
+
+.split-view button.right-sidebar-show-hide-button {
+    top: 4px;
+    right:2px;
+}
+
+.split-view button.right-sidebar-show-hide-button:active {
+    top: 5px;
+    right: 1px;
+}
+
+.split-view button.bottom-sidebar-show-hide-button {
+    bottom: 0px;
+    right: 1px;
+}
+
+.split-view button.bottom-sidebar-show-hide-button:active {
+    bottom: 0;
+    right: 0;
+}
+
+.split-view button.left-sidebar-show-hide-button.toggled-show > .glyph {
+    -webkit-mask-position: -168px -76px; /* |> */
+}
+
+.split-view button.left-sidebar-show-hide-button.toggled-hide > .glyph {
+    -webkit-mask-position: -199px -76px; /* |< */
+}
+
+.split-view button.right-sidebar-show-hide-button.toggled-show > .glyph {
+    -webkit-mask-position: -296px -76px; /* <| */
+}
+
+.split-view button.right-sidebar-show-hide-button.toggled-hide > .glyph {
+    -webkit-mask-position: -264px -76px; /* >| */
+}
+
+.split-view button.top-sidebar-show-hide-button.toggled-show > .glyph {
+    -webkit-mask-position: -168px -76px; /* |> */
+    -webkit-transform: rotate(90deg);
+}
+
+.split-view button.top-sidebar-show-hide-button.toggled-hide > .glyph {
+    -webkit-mask-position: -199px -76px; /* |< */
+    -webkit-transform: rotate(90deg);
+}
+
+.split-view button.bottom-sidebar-show-hide-button.toggled-show > .glyph {
+    -webkit-mask-position: -296px -76px; /* <| */
+    -webkit-transform: rotate(90deg);
+}
+
+.split-view button.bottom-sidebar-show-hide-button.toggled-hide > .glyph {
+    -webkit-mask-position: -264px -76px; /* >| */
+    -webkit-transform: rotate(90deg);
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/textPrompt.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/textPrompt.css
new file mode 100644 (file)
index 0000000..653d7c2
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+.suggest-box {
+    position: absolute;
+    background-color: #FFFFFF;
+    display: block;
+    border: 1px solid black;
+    padding: 2px;
+    z-index: 600;
+}
+
+.suggest-box .container {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    overflow-x: hidden;
+    overflow-y: auto;
+}
+
+.suggest-box-content-item {
+    padding: 1px;
+    margin: 0;
+    font-size: 11px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    border: 1px solid transparent;
+}
+
+.suggest-box-content-item .prefix {
+    font-weight: bold;
+}
+
+.suggest-box-content-item.selected {
+    background-color: rgba(56, 121, 217, 0.1);
+}
+
+.suggest-box-content-item:hover:not(.selected) {
+    border: 1px solid rgb(204, 204, 204);
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/timelinePanel.css b/src/chrome/tools/test/reference_build/chrome_linux/resources/inspector/timelinePanel.css
new file mode 100644 (file)
index 0000000..be18c99
--- /dev/null
@@ -0,0 +1,832 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Anthony Ricaud <rik@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.
+ */
+
+#timeline-overview-panel {
+    flex: 0 0 81px;
+    position: relative;
+    border-bottom: 1px solid rgb(140, 140, 140);
+}
+
+#timeline-overview-panel .timeline-graph-bar {
+    pointer-events: none;
+}
+
+.timeline-records-title, .timeline-records-list {
+    background-color: rgb(236, 236, 236);
+}
+
+.timeline-records-title {
+    padding: 3px 3px 3px 5px;
+    flex: 0 0 19px;
+    color: rgb(92, 110, 129); text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+}
+
+.timeline-records-list {
+    flex: auto;
+}
+
+#timeline-overview-sidebar {
+    flex: none;
+    padding-right: 10px;
+    border-right: 1px solid rgb(64%, 64%, 64%);
+}
+
+#timeline-overview-grid {
+    background-color: rgb(255, 255, 255);
+}
+
+.timeline-frames-view .timeline-records-counter {
+    display: none;
+}
+
+.timeline-frames-view #timeline-overview-grid {
+    display: none;
+}
+
+#timeline-overview-grid .resources-dividers-label-bar {
+    pointer-events: auto;
+}
+
+.timeline-frames-view .overview-grid-window,
+.timeline-frames-view .overview-grid-dividers-background {
+    height: 100%;
+}
+
+#timeline-overview-grid #resources-graphs {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 80px;
+}
+
+#timeline-container {
+    border-right: 0 none transparent;
+    overflow-y: scroll;
+    overflow-x: hidden;
+}
+
+.timeline-records-view {
+    overflow: hidden !important;
+}
+
+.timeline-details-split {
+    flex: auto;
+}
+
+.timeline-view {
+    flex: auto;
+}
+
+.timeline-view-stack {
+    flex: auto;
+    display: flex;
+}
+
+#timeline-container .webkit-html-external-link,
+#timeline-container .webkit-html-resource-link {
+    color: inherit;
+}
+
+.timeline-tree-item {
+    height: 18px;
+    line-height: 15px;
+    padding-right: 5px;
+    padding-left: 5px;
+    padding-top: 2px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+.timeline-tree-item.selected {
+    background-color: rgb(56, 121, 217) !important;
+    color: white;
+}
+
+.timeline-tree-item.hovered:not(.selected),
+.timeline-graph-side.hovered {
+    background-color: rgba(0, 0, 0, 0.05) !important;
+}
+
+.timeline-expandable {
+    position: absolute;
+    border-left: 1px solid rgb(163, 163, 163);
+    pointer-events: none;
+}
+
+.timeline-expandable-left {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 3px;
+    border-top: 1px solid rgb(163, 163, 163);
+    border-bottom: 1px solid rgb(163, 163, 163);
+}
+
+.timeline-tree-item-expand-arrow {
+    display: inline-block;
+    -webkit-user-select: none;
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-size: 320px 144px;
+    width: 10px;
+    height: 10px;
+    content: "";
+    background-color: rgb(110, 110, 110);
+    position: relative;
+    top: -1px;
+    left: -1px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.timeline-tree-item-expand-arrow {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.timeline-tree-item-expand-arrow.parent {
+    -webkit-mask-position: -4px -96px;
+}
+
+.timeline-tree-item-expand-arrow.parent.expanded {
+    -webkit-mask-position: -20px -96px;
+}
+
+.timeline-expandable-arrow {
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    opacity: 0.5;
+    width: 10px;
+    height: 10px;
+    position: relative;
+    top: 3px;
+    left: 2px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.timeline-expandable-arrow {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.timeline-expandable-collapsed .timeline-expandable-arrow {
+    background-position: -4px -96px;
+}
+
+.timeline-expandable-expanded .timeline-expandable-arrow {
+    background-position: -20px -96px;
+}
+
+.timeline-tree-item .type {
+    padding-left: 5px;
+}
+
+.timeline-tree-item .count {
+    font-weight: bold;
+}
+
+.timeline-tree-item .timeline-tree-icon {
+    position: relative;
+    top: -1px;
+    left: 1px;
+    width: 7px;
+    height: 7px;
+    border-radius: 1px;
+    border: solid 1px;
+    display: inline-block;
+}
+
+.timeline-tree-item.background .timeline-tree-icon {
+    background: none !important;
+}
+
+.timeline-tree-item-warning {
+    display: block;
+    background-image: url(Images/statusbarButtonGlyphs.png);
+    background-size: 320px 144px;
+    width: 10px;
+    height: 10px;
+    float: right;
+    background-position: -202px -107px;
+    position: relative;
+    top: 2px;
+}
+
+.timeline-tree-item-child-warning {
+    opacity: 0.6;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+.timeline-tree-item-warning {
+    background-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.timeline-tree-item .data.dimmed {
+    color: rgba(0, 0, 0, 0.7);
+    pointer-events: none;
+    padding-left: 4px;
+}
+
+.timeline-tree-item.selected .data.dimmed {
+    color: rgba(255, 255, 255, 0.8);
+    pointer-events: auto;
+}
+
+.timeline-tree-item.selected .timeline-tree-item-expand-arrow {
+    background-color: white;
+}
+
+#timeline-overview-events,
+#timeline-overview-memory,
+#timeline-overview-power {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    top: 20px;
+    z-index: 160;
+}
+
+#timeline-overview-memory,
+#timeline-overview-power  {
+    top: 25px;
+}
+
+#timeline-overview-pane {
+    flex: 0 0 80px;
+    position: relative;
+    overflow: hidden;
+}
+
+#timeline-overview-container {
+    display: flex;
+    flex: auto;
+    position: relative;
+    height: 80px;
+    overflow: hidden;
+}
+
+#timeline-overview-container canvas {
+    width: 100%;
+    height: 100%;
+}
+
+#timeline-overview-frames canvas {
+    z-index: 200;
+    background-color: rgba(255, 255, 255, 0.8);
+}
+
+#timeline-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    max-height: 100%;
+    top: 20px;
+}
+
+.timeline-graph-side {
+    position: relative;
+    height: 18px;
+    padding: 0 5px;
+    white-space: nowrap;
+    margin-top: 0;
+    border-top: 1px solid transparent;
+    overflow: hidden;
+}
+
+.timeline-graph-side.selected {
+    background-color: rgba(56, 121, 217, 0.1) !important;
+}
+
+.timeline-graph-bar-area {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 0;
+    left: 3px;
+    pointer-events: none;
+}
+
+.timeline-graph-bar {
+    position: absolute;
+    top: -1px;
+    bottom: 0;
+    margin: auto -2px;
+    height: 10px;
+    min-width: 5px;
+    z-index: 180;
+    pointer-events: visibleFill;
+    border-radius: 1px;
+    border: 1px solid;
+}
+
+.timeline-graph-bar.with-children {
+    opacity: 0.25;
+    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
+}
+
+.timeline-graph-bar.cpu {
+    opacity: 0.7;
+}
+
+.timeline-graph-side.background .timeline-graph-bar {
+    background: transparent !important;
+    border-width: 2px;
+}
+
+.timeline-aggregated-category {
+    display: inline-block;
+    height: 11px;
+    margin-right: 2px;
+    margin-left: 6px;
+    position: relative;
+    top: 2px;
+    width: 10px;
+    border: solid 1px;
+}
+
+.popover .timeline-aggregated-category.timeline-loading {
+    margin-left: 0;
+}
+
+.popover ul {
+    margin: 0;
+    padding: 0;
+    list-style-type: none;
+}
+
+.garbage-collect-status-bar-item .glyph {
+    -webkit-mask-position: -128px -24px;
+}
+
+#resources-container-content {
+    overflow: hidden;
+    min-height: 100%;
+}
+
+#resources-graphs {
+    position: absolute;
+    left: 0;
+    right: 0;
+    max-height: 100%;
+    top: 112px;
+}
+
+.resources-graph-side {
+    position: relative;
+    height: 36px;
+    padding: 0 5px;
+    white-space: nowrap;
+    margin-top: 1px;
+    border-top: 1px solid transparent;
+    overflow: hidden;
+}
+
+.resources-graph-bar-area {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 8px;
+    left: 9px;
+}
+
+#timeline-overview-sidebar .sidebar-tree {
+    flex: auto;
+}
+
+#timeline-overview-sidebar .sidebar-tree-item {
+    height: auto;
+    flex: auto;
+    margin: 1px 0 1px 0;
+    border-top: none;
+    display: flex;
+    align-items: center;
+    border-left: 6px solid transparent;
+    padding-left: 0;
+    color: #666;
+}
+
+#timeline-overview-sidebar .sidebar-tree-item:hover {
+    color: inherit;
+}
+
+#timeline-overview-sidebar .sidebar-tree-item.selected {
+    font-weight: bold;
+    color: inherit;
+    text-shadow: none;
+    background: none;
+    border-left: 6px solid #555;
+}
+
+#timeline-overview-sidebar .sidebar-tree-item .titles.no-subtitle {
+    top: initial;
+}
+
+#timeline-overview-sidebar .icon {
+    height: 24px;
+    margin: 0;
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs.png);
+    -webkit-mask-size: 320px 144px;
+    background-color: black;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5) {
+#timeline-overview-sidebar .icon {
+    -webkit-mask-image: url(Images/statusbarButtonGlyphs_2x.png);
+}
+} /* media */
+
+.timeline-overview-sidebar-events .icon {
+    -webkit-mask-position: -192px -48px;
+}
+
+.timeline-overview-sidebar-frames .icon {
+    -webkit-mask-position: -160px -48px;
+}
+
+.timeline-overview-sidebar-memory .icon {
+    -webkit-mask-position: -224px -48px;
+}
+
+.timeline-overview-sidebar-power .icon {
+    -webkit-mask-position: -64px -120px;
+}
+
+.memory-graph-label {
+    position: absolute;
+    left: 5px;
+    font-size: 9px;
+    color: rgb(50%, 50%, 50%);
+    white-space: nowrap;
+}
+
+.max.memory-graph-label {
+    top: 5px;
+}
+
+.min.memory-graph-label {
+    bottom: 5px;
+}
+
+#memory-graphs-canvas-container {
+    overflow: hidden;
+    flex: auto;
+    position: relative;
+}
+
+#memory-counters-graph {
+    flex: auto;
+}
+
+#memory-graphs-canvas-container .memory-counter-marker {
+    position: absolute;
+    border-radius: 3px;
+    width: 5px;
+    height: 5px;
+    margin-left: -3px;
+    margin-top: -2px;
+}
+
+#memory-graphs-container .split-view-contents-first {
+    background-color: rgb(236, 236, 236);
+    overflow-y: hidden;
+}
+
+#memory-graphs-container .sidebar-tree-section {
+    padding-left: 5px;
+}
+
+.memory-counter-sidebar-info {
+    margin: 5px;
+    white-space: nowrap;
+}
+
+.memory-counter-sidebar-info .swatch {
+    background-image: none;
+    border: 1px solid rgba(0,0,0,0.3);
+    opacity: 0.5;
+}
+
+.memory-counter-sidebar-info.bottom-border-visible {
+    border-bottom: 1px solid #AAA;
+}
+
+.memory-counter-sidebar-info .title {
+    margin: 4px;
+}
+
+.memory-counter-value {
+    margin: 4px;
+}
+
+#counter-values-bar {
+    flex: 0 0 18px;
+    border-bottom: solid 1px lightgray;
+    width: 100%;
+    overflow: hidden;
+    line-height: 18px;
+}
+
+.timeline .resources-event-divider {
+    height: 19px;
+    width: 8px;
+    border-left-width: 2px;
+    border-left-style: solid;
+    bottom: auto;
+    pointer-events: auto;
+}
+
+.resources-red-divider {
+    border-color: rgba(255, 0, 0, 0.5);
+}
+
+.resources-blue-divider {
+    border-color: rgba(0, 0, 255, 0.5);
+}
+
+.resources-orange-divider {
+    border-color: rgba(255, 178, 23, 0.5);
+}
+
+.resources-green-divider {
+    border-color: rgba(0, 130, 0, 0.5);
+}
+
+.resources-divider:last-child {
+    border-color: transparent;
+}
+
+.timeline .resources-event-divider.timeline-frame-divider {
+    background-color: rgba(180, 180, 180, 0.8);
+    border-style: none;
+    width: 1px;
+    height: 100%;
+    pointer-events: none;
+}
+
+.timeline-frame-container {
+    height: 19px;
+    overflow: hidden;
+    background-color: rgb(220, 220, 220);
+    opacity: 0.8;
+    color: black;
+    text-align: center;
+    padding-top: 3px;
+    z-index: 220;
+    pointer-events: auto;
+}
+
+.timeline-frame-strip {
+    position: absolute;
+    height: 19px;
+}
+
+#timeline-grid-header {
+    pointer-events: none;
+    height: 19px;
+}
+
+#timeline-graph-records-header {
+    pointer-events: none;
+    height: 19px;
+    padding: 1px 0;
+    justify-content: center;
+}
+
+.timeline-utilization-strip {
+    z-index: 250;
+    overflow: hidden;
+    flex: 0 1 12px;
+    position: relative;
+    height: 9px;
+}
+
+.timeline-utilization-strip .timeline-graph-bar {
+    border-color: rgb(192, 192, 192);
+    background-color: rgba(0, 0, 0, 0.1);
+    margin: 1.5px auto;
+    height: auto;
+}
+
+.timeline-utilization-strip.gpu .timeline-graph-bar {
+    background-color: #00a;
+    border: none;
+    opacity: 0.3;
+    min-width: 0;
+}
+
+.timeline-utilization-strip.gpu .timeline-graph-bar.gpu-task-foreign {
+    background-color: #aaa;
+}
+
+.timeline-cpu-curtain-left, .timeline-cpu-curtain-right {
+    background-color: rgba(210, 210, 210, 0.5);
+    position: absolute;
+    top: 0;
+    height: 100%;
+    z-index: 300;
+}
+
+.timeline-cpu-curtain-left {
+    left: 0;
+}
+
+.timeline-cpu-curtain-right {
+    right: 0;
+}
+
+.image-preview-container {
+    background: transparent;
+    text-align: left;
+    border-spacing: 0;
+}
+
+.image-preview-container img {
+    max-width: 100px;
+    max-height: 100px;
+    background-image: url(Images/checker.png);
+    -webkit-user-select: text;
+    -webkit-user-drag: auto;
+}
+
+.image-container {
+    padding: 0;
+}
+
+.memory-category-value {
+    float: right;
+}
+
+.timeline-filters-header {
+    flex: 0 0 23px;
+    overflow: hidden;
+}
+
+.timeline-details {
+    -webkit-user-select: text;
+    vertical-align: top;
+}
+
+.timeline-details-title {
+    border-bottom: 1px solid #B8B8B8;
+    font-weight: bold;
+    padding-bottom: 5px;
+    padding-top: 0;
+    white-space: nowrap;
+}
+
+.timeline-details-row-title {
+    font-weight: bold;
+    text-align: right;
+    white-space: nowrap;
+}
+
+.timeline-details-row-data {
+    white-space: nowrap;
+}
+
+.timeline-details-view {
+    color: #333;
+    overflow: hidden;
+}
+
+.timeline-details-view-title {
+    padding: 2px 5px;
+    flex: 0 0 19px;
+    border-bottom: 1px solid rgb(202, 202, 202);
+    background-color: rgb(236, 236, 236);
+    white-space: nowrap;
+    display: flex;
+    color: rgb(92, 110, 129);
+    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+.timeline-details-view-body {
+    padding-top: 2px;
+    flex: auto;
+    overflow: auto;
+    position: relative;
+}
+
+.timeline-details-view-block {
+    flex: none;
+}
+
+.timeline-details-view-row {
+    padding: 2px 0 2px 6px;
+    white-space: nowrap;
+}
+
+.timeline-details-view-row-title {
+    font-weight: bold;
+    color: rgb(48, 57, 66);
+}
+
+.timeline-details-view-row-value {
+    padding-left: 10px;
+}
+
+.timeline-details-view-row-details {
+    padding-left: 10px;
+}
+
+.timeline-details-view-row-details .image-preview-container {
+    padding: 10px;
+}
+
+.timeline-details-view-row-stack-trace {
+    padding: 4px 0 4px 20px;
+}
+
+.timeline-details-view-row-stack-trace div {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}
+
+.timeline-details-view-row-stack-trace .webkit-html-external-link,
+.timeline-details-view-row-stack-trace .webkit-html-resource-link {
+    color: #333 !important;
+}
+
+.timeline-memory-split {
+    flex: auto;
+}
+
+.timeline-memory-split > .split-view-contents-first {
+    overflow: hidden;
+}
+
+.timeline-aggregated-info {
+    flex: none;
+    position: relative;
+    margin: 8px 2px;
+    width: 200px;
+}
+
+.timeline-aggregated-info-legend > div {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}
+
+.timeline-aggregated-info .pie-chart {
+    margin-left: 20px;
+    margin-bottom: 10px;
+}
+
+.timeline-flamechart-view #timeline-overview-grid {
+    display: none;
+}
+
+.timeline-flamechart-view .flame-chart-main-pane .resources-divider-label {
+    text-align: center;
+}
+
+.timeline-flamechart {
+    overflow: hidden;
+}
+
+.timeline-progress-pane {
+    position: absolute;
+    top: 0px;
+    right: 0px;
+    bottom: 0px;
+    left: 0px;
+    color: #777;
+    background-color: rgba(255, 255, 255, 0.8);
+    font-size: 30px;
+    z-index: 500;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.exe b/src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.exe
deleted file mode 100644 (file)
index 42407cd..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.exe and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.pdb b/src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.pdb
deleted file mode 100644 (file)
index c09502e..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/servers/chrome_launcher.pdb and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.dll b/src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.dll
deleted file mode 100644 (file)
index 5535444..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.dll and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.pdb b/src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.pdb
deleted file mode 100644 (file)
index f59f63d..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/servers/npchrome_frame.pdb and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/wow_helper.exe b/src/chrome/tools/test/reference_build/chrome_linux/wow_helper.exe
deleted file mode 100755 (executable)
index f9bfb4b..0000000
Binary files a/src/chrome/tools/test/reference_build/chrome_linux/wow_helper.exe and /dev/null differ
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/xdg-mime b/src/chrome/tools/test/reference_build/chrome_linux/xdg-mime
new file mode 100755 (executable)
index 0000000..e0d9799
--- /dev/null
@@ -0,0 +1,1402 @@
+#!/bin/sh
+#---------------------------------------------
+#   xdg-mime
+#
+#   Utility script to manipulate MIME related information
+#   on XDG compliant systems.
+#
+#   Refer to the usage() function below for usage.
+#
+#   Copyright 2009-2010, Fathi Boudra <fabo@freedesktop.org>
+#   Copyright 2009-2010, Rex Dieter <rdieter@fedoraproject.org>
+#   Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
+#   Copyright 2006, Jeremy White <jwhite@codeweavers.com>
+#
+#   LICENSE:
+#
+#   Permission is hereby granted, free of charge, to any person obtaining a
+#   copy of this software and associated documentation files (the "Software"),
+#   to deal in the Software without restriction, including without limitation
+#   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+#   and/or sell copies of the Software, and to permit persons to whom the
+#   Software is furnished to do so, subject to the following conditions:
+#
+#   The above copyright notice and this permission notice shall be included
+#   in all copies or substantial portions of the Software.
+#
+#   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+#   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+#   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+#   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+#   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+#   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+#   OTHER DEALINGS IN THE SOFTWARE.
+#
+#---------------------------------------------
+
+manualpage()
+{
+cat << _MANUALPAGE
+Name
+
+xdg-mime - command line tool for querying information about file type handling
+and adding descriptions for new file types
+
+Synopsis
+
+xdg-mime query { filetype | default } ...
+
+xdg-mime default application mimetype(s)
+
+xdg-mime install [--mode mode] [--novendor] mimetypes-file
+
+xdg-mime uninstall [--mode mode] mimetypes-file
+
+xdg-mime { --help | --manual | --version }
+
+Description
+
+The xdg-mime program can be used to query information about file types and to
+add descriptions for new file types.
+
+Commands
+
+query
+
+    Returns information related to file types.
+
+    The query option is for use inside a desktop session only. It is not
+    recommended to use xdg-mime query as root.
+
+    The following queries are supported:
+
+    query filetype FILE: Returns the file type of FILE in the form of a MIME
+    type.
+
+    query default mimetype: Returns the default application that the desktop
+    environment uses for opening files of type mimetype. The default
+    application is identified by its *.desktop file.
+
+default
+
+    Ask the desktop environment to make application the default application for
+    opening files of type mimetype. An application can be made the default for
+    several file types by specifying multiple mimetypes.
+
+    application is the desktop file id of the application and has the form
+    vendor-name.desktop application must already be installed in the desktop
+    menu before it can be made the default handler. The aplication's desktop
+    file must list support for all the MIME types that it wishes to be the
+    default handler for.
+
+    Requests to make an application a default handler may be subject to system
+    policy or approval by the end-user. xdg-mime query can be used to verify
+    whether an application is the actual default handler for a specific file
+    type.
+
+    The default option is for use inside a desktop session only. It is not
+    recommended to use xdg-mime default as root.
+
+install
+    Adds the file type descriptions provided in mimetypes-file to the desktop
+    environment. mimetypes-file must be a XML file that follows the
+    freedesktop.org Shared MIME-info Database specification and that has a
+    mime-info element as its document root. For each new file type one or more
+    icons with name type-subtype must be installed with the xdg-icon-resource
+    command in the mimetypes context. For example the filetype application/
+    vnd.oasis.opendocument.text requires an icon named
+    application-vnd.oasis.opendocument.text to be installed (unless the file
+    type recommends another icon name).
+uninstall
+    Removes the file type descriptions provided in mimetypes-file and
+    previously added with xdg-mime install from the desktop environment.
+    mimetypes-file must be a XML file that follows the freedesktop.org Shared
+    MIME-info Database specification and that has a mime-info element as its
+    document root.
+
+Options
+
+--mode mode
+
+    mode can be user or system. In user mode the file is (un)installed for the
+    current user only. In system mode the file is (un)installed for all users
+    on the system. Usually only root is allowed to install in system mode.
+
+    The default is to use system mode when called by root and to use user mode
+    when called by a non-root user.
+
+--novendor
+
+    Normally, xdg-mime checks to ensure that the mimetypes-file to be installed
+    has a proper vendor prefix. This option can be used to disable that check.
+
+    A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated
+    with a dash ("-"). Companies and organizations are encouraged to use a word
+    or phrase, preferably the organizations name, for which they hold a
+    trademark as their vendor prefix. The purpose of the vendor prefix is to
+    prevent name conflicts.
+
+--help
+    Show command synopsis.
+--manual
+    Show this manualpage.
+--version
+    Show the xdg-utils version information.
+
+Environment Variables
+
+xdg-mime honours the following environment variables:
+
+XDG_UTILS_DEBUG_LEVEL
+    Setting this environment variable to a non-zero numerical value makes
+    xdg-mime do more verbose reporting on stderr. Setting a higher value
+    increases the verbosity.
+XDG_UTILS_INSTALL_MODE
+    This environment variable can be used by the user or administrator to
+    override the installation mode. Valid values are user and system.
+
+Exit Codes
+
+An exit code of 0 indicates success while a non-zero exit code indicates
+failure. The following failure codes can be returned:
+
+1
+    Error in command line syntax.
+2
+    One of the files passed on the command line did not exist.
+3
+    A required tool could not be found.
+4
+    The action failed.
+5
+    No permission to read one of the files passed on the command line.
+
+See Also
+
+xdg-icon-resource(1), xdg-desktop-menu(1)
+
+Examples
+
+xdg-mime query filetype /tmp/foobar.png
+
+Prints the MIME type of the file /tmp/foobar.png, in this case image/png
+
+xdg-mime query default image/png
+
+Prints the .desktop filename of the application which is registered to open PNG
+files.
+
+xdg-mime install shinythings-shiny.xml
+
+Adds a file type description for "shiny"-files. "shinythings-" is used as the
+vendor prefix. The file type description could look as folows.
+
+shinythings-shiny.xml:
+
+<?xml version="1.0"?>
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+  <mime-type type="text/x-shiny">
+    <comment>Shiny new file type</comment>
+    <glob pattern="*.shiny"/>
+    <glob pattern="*.shi"/>
+  </mime-type>
+</mime-info>
+
+An icon for this new file type must also be installed, for example with:
+
+xdg-icon-resource install --context mimetypes --size 64 shiny-file-icon.png text-x-shiny
+
+_MANUALPAGE
+}
+
+usage()
+{
+cat << _USAGE
+xdg-mime - command line tool for querying information about file type handling
+and adding descriptions for new file types
+
+Synopsis
+
+xdg-mime query { filetype | default } ...
+
+xdg-mime default application mimetype(s)
+
+xdg-mime install [--mode mode] [--novendor] mimetypes-file
+
+xdg-mime uninstall [--mode mode] mimetypes-file
+
+xdg-mime { --help | --manual | --version }
+
+_USAGE
+}
+
+#@xdg-utils-common@
+
+#----------------------------------------------------------------------------
+#   Common utility functions included in all XDG wrapper scripts
+#----------------------------------------------------------------------------
+
+DEBUG()
+{
+  [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
+  [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
+  shift
+  echo "$@" >&2
+}
+
+# This handles backslashes but not quote marks.
+first_word()
+{
+    read first rest
+    echo "$first"
+}
+
+#-------------------------------------------------------------
+# map a binary to a .desktop file
+binary_to_desktop_file()
+{
+    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
+    binary="`which "$1"`"
+    binary="`readlink -f "$binary"`"
+    base="`basename "$binary"`"
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" ] || continue
+        [ -d "$dir/applications" -o -d "$dir/applnk" ] || continue
+        for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.desktop "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do
+            [ -r "$file" ] || continue
+            # Check to make sure it's worth the processing.
+            grep -q "^Exec.*$base" "$file" || continue
+            # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop").
+            grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue
+            command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
+            command="`which "$command"`"
+            if [ x"`readlink -f "$command"`" = x"$binary" ]; then
+                # Fix any double slashes that got added path composition
+                echo "$file" | sed -e 's,//*,/,g'
+                return
+            fi
+        done
+    done
+}
+
+#-------------------------------------------------------------
+# map a .desktop file to a binary
+## FIXME: handle vendor dir case
+desktop_file_to_binary()
+{
+    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
+    desktop="`basename "$1"`"
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" -a -d "$dir/applications" ] || continue
+        file="$dir/applications/$desktop"
+        [ -r "$file" ] || continue
+        # Remove any arguments (%F, %f, %U, %u, etc.).
+        command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
+        command="`which "$command"`"
+        readlink -f "$command"
+        return
+    done
+}
+
+#-------------------------------------------------------------
+# Exit script on successfully completing the desired operation
+
+exit_success()
+{
+    if [ $# -gt 0 ]; then
+        echo "$@"
+        echo
+    fi
+
+    exit 0
+}
+
+
+#-----------------------------------------
+# Exit script on malformed arguments, not enough arguments
+# or missing required option.
+# prints usage information
+
+exit_failure_syntax()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-mime: $@" >&2
+        echo "Try 'xdg-mime --help' for more information." >&2
+    else
+        usage
+        echo "Use 'man xdg-mime' or 'xdg-mime --manual' for additional info."
+    fi
+
+    exit 1
+}
+
+#-------------------------------------------------------------
+# Exit script on missing file specified on command line
+
+exit_failure_file_missing()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-mime: $@" >&2
+    fi
+
+    exit 2
+}
+
+#-------------------------------------------------------------
+# Exit script on failure to locate necessary tool applications
+
+exit_failure_operation_impossible()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-mime: $@" >&2
+    fi
+
+    exit 3
+}
+
+#-------------------------------------------------------------
+# Exit script on failure returned by a tool application
+
+exit_failure_operation_failed()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-mime: $@" >&2
+    fi
+
+    exit 4
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to read a specified file
+
+exit_failure_file_permission_read()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-mime: $@" >&2
+    fi
+
+    exit 5
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to write a specified file
+
+exit_failure_file_permission_write()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-mime: $@" >&2
+    fi
+
+    exit 6
+}
+
+check_input_file()
+{
+    if [ ! -e "$1" ]; then
+        exit_failure_file_missing "file '$1' does not exist"
+    fi
+    if [ ! -r "$1" ]; then
+        exit_failure_file_permission_read "no permission to read file '$1'"
+    fi
+}
+
+check_vendor_prefix()
+{
+    file_label="$2"
+    [ -n "$file_label" ] || file_label="filename"
+    file=`basename "$1"`
+    case "$file" in
+       [a-zA-Z]*-*)
+         return
+         ;;
+    esac
+
+    echo "xdg-mime: $file_label '$file' does not have a proper vendor prefix" >&2
+    echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
+    echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
+    echo "Use --novendor to override or 'xdg-mime --manual' for additional info." >&2
+    exit 1
+}
+
+check_output_file()
+{
+    # if the file exists, check if it is writeable
+    # if it does not exists, check if we are allowed to write on the directory
+    if [ -e "$1" ]; then
+        if [ ! -w "$1" ]; then
+            exit_failure_file_permission_write "no permission to write to file '$1'"
+        fi
+    else
+        DIR=`dirname "$1"`
+        if [ ! -w "$DIR" -o ! -x "$DIR" ]; then
+            exit_failure_file_permission_write "no permission to create file '$1'"
+        fi
+    fi
+}
+
+#----------------------------------------
+# Checks for shared commands, e.g. --help
+
+check_common_commands()
+{
+    while [ $# -gt 0 ] ; do
+        parm="$1"
+        shift
+
+        case "$parm" in
+            --help)
+            usage
+            echo "Use 'man xdg-mime' or 'xdg-mime --manual' for additional info."
+            exit_success
+            ;;
+
+            --manual)
+            manualpage
+            exit_success
+            ;;
+
+            --version)
+            echo "xdg-mime 1.1.0 rc1"
+            exit_success
+            ;;
+        esac
+    done
+}
+
+check_common_commands "$@"
+
+[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
+if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
+    # Be silent
+    xdg_redirect_output=" > /dev/null 2> /dev/null"
+else
+    # All output to stderr
+    xdg_redirect_output=" >&2"
+fi
+
+#--------------------------------------
+# Checks for known desktop environments
+# set variable DE to the desktop environments name, lowercase
+
+detectDE()
+{
+    # see https://bugs.freedesktop.org/show_bug.cgi?id=34164
+    unset GREP_OPTIONS
+
+    if [ -n "${XDG_CURRENT_DESKTOP}" ]; then
+      case "${XDG_CURRENT_DESKTOP}" in
+         GNOME)
+           DE=gnome;
+           ;;
+         KDE)
+           DE=kde;
+           ;;
+         LXDE)
+           DE=lxde;
+           ;;
+         XFCE)
+           DE=xfce
+      esac
+    fi
+
+    if [ x"$DE" = x"" ]; then
+      # classic fallbacks
+      if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
+      elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
+      elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
+      elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
+      elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce
+      fi
+    fi
+
+    if [ x"$DE" = x"" ]; then
+      # fallback to checking $DESKTOP_SESSION
+      case "$DESKTOP_SESSION" in
+         gnome)
+           DE=gnome;
+           ;;
+         LXDE)
+           DE=lxde; 
+           ;;
+         xfce|xfce4)
+           DE=xfce;
+           ;;
+      esac
+    fi
+
+    if [ x"$DE" = x"" ]; then
+      # fallback to uname output for other platforms
+      case "$(uname 2>/dev/null)" in 
+        Darwin)
+          DE=darwin;
+          ;;
+      esac
+    fi
+
+    if [ x"$DE" = x"gnome" ]; then
+      # gnome-default-applications-properties is only available in GNOME 2.x
+      # but not in GNOME 3.x
+      which gnome-default-applications-properties > /dev/null 2>&1  || DE="gnome3"
+    fi
+}
+
+#----------------------------------------------------------------------------
+# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
+# It also always returns 1 in KDE 3.4 and earlier
+# Simply return 0 in such case
+
+kfmclient_fix_exit_code()
+{
+    version=`LC_ALL=C.UTF-8 kde-config --version 2>/dev/null | grep '^KDE'`
+    major=`echo $version | sed 's/KDE.*: \([0-9]\).*/\1/'`
+    minor=`echo $version | sed 's/KDE.*: [0-9]*\.\([0-9]\).*/\1/'`
+    release=`echo $version | sed 's/KDE.*: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
+    test "$major" -gt 3 && return $1
+    test "$minor" -gt 5 && return $1
+    test "$release" -gt 4 && return $1
+    return 0
+}
+
+update_mime_database()
+{
+   if [ x"$mode" = x"user" -a -n "$DISPLAY" ] ; then
+      detectDE
+      if [ x"$DE" = x"kde" ] ; then
+         DEBUG 1 "Running kbuildsycoca"
+         if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
+             eval 'kbuildsycoca4'$xdg_redirect_output
+         else
+             eval 'kbuildsycoca'$xdg_redirect_output
+         fi
+      fi
+   fi
+   for x in `echo "$PATH:/opt/gnome/bin" | sed 's/:/ /g'`; do
+      if [ -x $x/update-mime-database ] ; then
+         DEBUG 1 "Running $x/update-mime-database $1"
+         eval '$x/update-mime-database $1'$xdg_redirect_output
+         return
+      fi
+   done
+}
+
+info_kde()
+{
+    if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
+        DEBUG 1 "Running kmimetypefinder \"$1\""
+        kmimetypefinder "$1" 2>/dev/null | head -n 1
+    else
+        DEBUG 1 "Running kfile \"$1\""
+        kfile "$1" 2> /dev/null | head -n 1 | cut -d "(" -f 2 | cut -d ")" -f 1
+    fi
+
+    if [ $? -eq 0 ]; then
+        exit_success
+    else
+        exit_failure_operation_failed
+    fi
+}
+
+info_gnome()
+{
+    if gvfs-info --help 2>/dev/null 1>&2; then
+        DEBUG 1 "Running gvfs-info \"$1\""
+        gvfs-info "$1" 2> /dev/null | grep standard::content-type | cut -d' ' -f4
+    elif gnomevfs-info --help 2>/dev/null 1>&2; then
+       DEBUG 1 "Running gnomevfs-info \"$1\""
+       gnomevfs-info --slow-mime "$1" 2> /dev/null | grep "^MIME" | cut -d ":" -f 2 | sed s/"^ "//
+    else
+       # according to https://bugs.freedesktop.org/show_bug.cgi?id=33094#c5
+       # neither gvfs-info or gnomevfs-info are present in a default Ubuntu Natty
+       # install, so fallback to info_generic
+       info_generic "$1"
+    fi
+
+    if [ $? -eq 0 ]; then
+        exit_success
+    else
+        exit_failure_operation_failed
+    fi
+}
+
+info_generic()
+{
+    if mimetype --version >/dev/null 2>&1; then
+        DEBUG 1 "Running mimetype -b \"$1\""
+        mimetype -b "$1"
+    else
+        DEBUG 1 "Running file --mime-type \"$1\""
+        /usr/bin/file --mime-type "$1" 2> /dev/null | cut -d ":" -f 2 | sed s/"^ "//
+    fi
+
+    if [ $? -eq 0 ]; then
+        exit_success
+    else
+        exit_failure_operation_failed
+    fi
+}
+
+make_default_kde()
+{
+    # $1 is vendor-name.desktop
+    # $2 is mime/type
+    #
+    # On KDE 3, add to $KDE_CONFIG_PATH/profilerc:
+    # [$2 - 1]
+    # Application=$1
+    #
+    # Remove all [$2 - *] sections, or even better,
+    # renumber [$2 - *] sections and remove duplicate
+    #
+    # On KDE 4, add $2=$1 to $XDG_DATA_APPS/mimeapps.list
+    #
+    # Example file:
+    #
+    # [Added Associations]
+    # text/plain=kde4-kate.desktop;kde4-kwrite.desktop;
+    #
+    # [Removed Associations]
+    # text/plain=gnome-gedit.desktop;gnu-emacs.desktop;
+    vendor="$1"
+    mimetype="$2"
+    if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
+        default_dir=`kde4-config --path xdgdata-apps 2> /dev/null | cut -d ':' -f 1`
+        default_file="$default_dir/mimeapps.list"
+    else
+        default_dir=`kde-config --path config 2> /dev/null | cut -d ':' -f 1`
+        default_file="$default_dir/profilerc"
+    fi
+    if [ -z "$default_dir" ]; then
+        DEBUG 2 "make_default_kde: No kde runtime detected"
+        return
+    fi
+    DEBUG 2 "make_default_kde $vendor $mimetype"
+    DEBUG 1 "Updating $default_file"
+    mkdir -p "$default_dir"
+    [ -f "$default_file" ] || touch "$default_file"
+    if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
+        [ -f "$default_file" ] || touch "$default_file"
+        awk -v application="$vendor" -v mimetype="$mimetype" '
+    BEGIN {
+        prefix=mimetype "="
+        associations=0
+        found=0
+        blanks=0
+    }
+    {
+        suppress=0
+        if (index($0, "[Added Associations]") == 1) {
+            associations=1
+        } else if (index($0, "[") == 1) {
+            if (associations && !found) {
+                print prefix application
+                found=1
+            }
+            associations=0
+        } else if ($0 == "") {
+            blanks++
+            suppress=1
+        } else if (associations && index($0, prefix) == 1) {
+            value=substr($0, length(prefix) + 1, length)
+            split(value, apps, ";")
+            value=application ";"
+            count=0
+            for (i in apps) {
+              count++
+            }
+            for (i=0; i < count; i++) {
+                if (apps[i] != application && apps[i] != "") {
+                    value=value apps[i] ";"
+                }
+            }
+            $0=prefix value
+            found=1
+        }
+        if (!suppress) {
+            while (blanks > 0) {
+                print ""
+                blanks--
+            }
+            print $0
+        }
+    }
+    END {
+        if (!found) {
+            if (!associations) {
+                print "[Added Associations]"
+            }
+            print prefix application
+        }
+        while (blanks > 0) {
+            print ""
+            blanks--
+        }
+    }
+' "$default_file" > "${default_file}.new" && mv "${default_file}.new" "$default_file"
+        eval 'kbuildsycoca4'$xdg_redirect_output
+    else
+        awk -v application="$vendor" -v mimetype="$mimetype" '
+    BEGIN {
+        header_start="[" mimetype " - "
+        suppress=0
+    }
+    {
+        if (index($0, header_start) == 1 )
+            suppress=1
+        else
+            if (/^\[/) { suppress=0 }
+
+        if (!suppress) {
+            print $0
+        }
+    }
+    END {
+        print ""
+        print "[" mimetype " - 1]"
+        print "Application=" application
+        print "AllowAsDefault=true"
+        print "GenericServiceType=Application"
+        print "Preference=1"
+        print "ServiceType=" mimetype
+    }
+' "$default_file" > "${default_file}.new" && mv "${default_file}.new" "$default_file"
+    fi
+}
+
+make_default_generic()
+{
+    # $1 is vendor-name.desktop
+    # $2 is mime/type
+    # Add $2=$1 to XDG_DATA_HOME/applications/mimeapps.list
+    xdg_user_dir="$XDG_DATA_HOME"
+    [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
+    default_file="$xdg_user_dir/applications/mimeapps.list"
+    DEBUG 2 "make_default_generic $1 $2"
+    DEBUG 1 "Updating $default_file"
+    [ -f "$default_file" ] || touch "$default_file"
+    awk -v mimetype="$2" -v application="$1" '
+    BEGIN {
+        prefix=mimetype "="
+        indefault=0
+        added=0
+        blanks=0
+        found=0
+    }
+    {
+        suppress=0
+        if (index($0, "[Default Applications]") == 1) {
+            indefault=1
+            found=1
+        } else if (index($0, "[") == 1) {
+            if (!added && indefault) {
+                print prefix application
+                added=1
+            }
+            indefault=0
+        } else if ($0 == "") {
+            suppress=1
+            blanks++
+        } else if (indefault && !added && index($0, prefix) == 1) {
+                $0=prefix application
+                added=1
+        }
+        if (!suppress) {
+            while (blanks > 0) {
+                print ""
+                blanks--
+            }
+            print $0
+        }
+    }
+    END {
+        if (!added) {
+            if (!found) {
+                print ""
+                print "[Default Applications]"
+            }
+            print prefix application
+        }
+        while (blanks > 0) {
+            print ""
+            blanks--
+        }
+    }
+' "$default_file" > "${default_file}.new" && mv "${default_file}.new" "$default_file"
+}
+
+defapp_generic()
+{
+    MIME="$1"
+    xdg_user_dir="$XDG_DATA_HOME"
+    [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
+    xdg_user_dir="$xdg_user_dir/$xdg_dir_name"
+    xdg_system_dirs="$XDG_DATA_DIRS"
+    [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
+
+    for x in `echo "$xdg_user_dir" | sed 's/:/ /g'`; do
+        mimeapps_list="$x/applications/mimeapps.list"
+        if [ -f "$mimeapps_list" ] ; then
+            DEBUG 2 "Checking $mimeapps_list"
+            trader_result=`awk -v mimetype="$MIME" '
+    BEGIN {
+        prefix=mimetype "="
+        indefault=0
+        found=0
+    }
+    {
+        if (index($0, "[Default Applications]") == 1) {
+            indefault=1
+        } else if (index($0, "[") == 1) {
+            indefault=0
+        } else if (!found && indefault && index($0, prefix) == 1) {
+            print substr($0, length(prefix) +1, length)
+            found=1
+        }
+    }
+' $mimeapps_list`
+            if [ -n "$trader_result" ] ; then
+                echo $trader_result
+                exit_success
+            fi
+        fi
+    done
+
+    for x in `echo "$xdg_system_dirs" | sed 's/:/ /g'`; do
+       DEBUG 2 "Checking $x/applications/defaults.list"
+       trader_result=`grep "$MIME=" $x/applications/defaults.list 2> /dev/null | cut -d '=' -f 2 | cut -d ';' -f 1`
+       if [ -n "$trader_result" ] ; then
+          echo $trader_result
+          exit_success
+       fi
+    done
+    exit_success
+}
+
+defapp_kde()
+{
+    MIME="$1"
+    if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
+        KTRADER=`which ktraderclient 2> /dev/null`
+        MIMETYPE="--mimetype"
+        SERVICETYPE="--servicetype"
+    else
+        KTRADER=`which ktradertest 2> /dev/null`
+    fi
+    if [ -n "$KTRADER" ] ; then
+        DEBUG 1 "Running KDE trader query \"$MIME\" mimetype and \"Application\" servicetype"
+        trader_result=`$KTRADER $MIMETYPE "$MIME" $SERVICETYPE Application 2>/dev/null \
+            | grep DesktopEntryPath | head -n 1 | cut -d ':' -f 2 | cut -d \' -f 2`
+        if [ -n "$trader_result" ] ; then
+            basename "$trader_result"
+            exit_success
+        else
+            exit_failure_operation_failed
+        fi
+    else
+        defapp_generic "$1"
+    fi
+}
+
+[ x"$1" != x"" ] || exit_failure_syntax
+
+mode=
+action=
+filename=
+mimetype=
+
+case $1 in
+  install)
+    action=install
+    ;;
+
+  uninstall)
+    action=uninstall
+    ;;
+
+  query)
+    shift
+
+    if [ -z "$1" ] ; then
+        exit_failure_syntax "query type argument missing"
+    fi
+
+    case $1 in
+      filetype)
+        action=info
+
+        filename="$2"
+        if [ -z "$filename" ] ; then
+            exit_failure_syntax "FILE argument missing"
+        fi
+        case $filename in
+          -*)
+            exit_failure_syntax "unexpected option '$filename'"
+            ;;
+        esac
+        check_input_file "$filename"
+        filename=`readlink -f -- "$filename"`
+        ;;
+
+      default)
+        action=defapp
+        mimetype="$2"
+        if [ -z "$mimetype" ] ; then
+            exit_failure_syntax "mimetype argument missing"
+        fi
+        case $mimetype in
+          -*)
+            exit_failure_syntax "unexpected option '$mimetype'"
+            ;;
+
+          */*)
+            # Ok
+            ;;
+
+          *)
+            exit_failure_syntax "mimetype '$mimetype' is not in the form 'minor/major'"
+            ;;
+        esac
+        ;;
+
+      *)
+      exit_failure_syntax "unknown query type '$1'"
+      ;;
+    esac
+    ;;
+
+  default)
+    action=makedefault
+    shift
+
+    if [ -z "$1" ] ; then
+        exit_failure_syntax "application argument missing"
+    fi
+    case $1 in
+      -*)
+        exit_failure_syntax "unexpected option '$1'"
+        ;;
+
+      *.desktop)
+        filename="$1"
+        ;;
+
+      *)
+        exit_failure_syntax "malformed argument '$1', expected *.desktop"
+        ;;
+    esac
+    ;;
+
+  *)
+  exit_failure_syntax "unknown command '$1'"
+  ;;
+esac
+
+shift
+
+
+if [ "$action" = "makedefault" ]; then
+    if [ -z "$1" ] ; then
+        exit_failure_syntax "mimetype argument missing"
+    fi
+
+    while [ $# -gt 0 ] ; do
+        case $1 in
+          -*)
+            exit_failure_syntax "unexpected option '$1'"
+            ;;
+        esac
+        mimetype="$1"
+        shift
+
+        make_default_kde "$filename" "$mimetype"
+        make_default_generic "$filename" "$mimetype"
+    done
+    exit_success
+fi
+
+if [ "$action" = "info" ]; then
+    detectDE
+
+    if [ x"$DE" = x"" ]; then
+        if [ -x /usr/bin/file ]; then
+            DE=generic
+        fi
+    fi
+
+    case "$DE" in
+        kde)
+        info_kde "$filename"
+        ;;
+
+        gnome*)
+        info_gnome "$filename"
+        ;;
+
+        *)
+        info_generic "$filename"
+        ;;
+    esac
+    exit_failure_operation_impossible "no method available for quering MIME type of '$filename'"
+fi
+
+if [ "$action" = "defapp" ]; then
+    detectDE
+
+    case "$DE" in
+        kde)
+        defapp_kde "$mimetype"
+        ;;
+
+        *)
+        defapp_generic "$mimetype"
+        ;;
+    esac
+    exit_failure_operation_impossible "no method available for quering default application for '$mimetype'"
+fi
+
+vendor=true
+while [ $# -gt 0 ] ; do
+    parm="$1"
+    shift
+
+    case $parm in
+      --mode)
+        if [ -z "$1" ] ; then
+            exit_failure_syntax "mode argument missing for --mode"
+        fi
+        case "$1" in
+          user)
+            mode="user"
+            ;;
+
+          system)
+            mode="system"
+            ;;
+
+          *)
+            exit_failure_syntax "unknown mode '$1'"
+            ;;
+        esac
+        shift
+        ;;
+
+      --novendor)
+        vendor=false
+        ;;
+
+      -*)
+        exit_failure_syntax "unexpected option '$parm'"
+        ;;
+
+      *)
+        if [ -n "$filename" ] ; then
+            exit_failure_syntax "unexpected argument '$parm'"
+        fi
+
+        filename="$parm"
+        check_input_file "$filename"
+        ;;
+    esac
+done
+
+if [ -z "$action" ] ; then
+    exit_failure_syntax "command argument missing"
+fi
+
+if [ -n "$XDG_UTILS_INSTALL_MODE" ] ; then
+    if [ "$XDG_UTILS_INSTALL_MODE" = "system" ] ; then
+        mode="system"
+    elif [ "$XDG_UTILS_INSTALL_MODE" = "user" ] ; then
+        mode="user"
+    fi
+fi
+
+if [ -z "$mode" ] ; then
+    if [ `whoami` = "root" ] ; then
+        mode="system"
+    else
+        mode="user"
+    fi
+fi
+
+if [ -z "$filename" ] ; then
+    exit_failure_syntax "mimetypes-file argument missing"
+fi
+
+if [ "$vendor" =  "true" -a "$action" = "install" ] ; then
+    check_vendor_prefix "$filename"
+fi
+
+xdg_base_dir=
+xdg_dir_name=mime/packages/
+
+xdg_user_dir="$XDG_DATA_HOME"
+[ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
+[ x"$mode" = x"user" ] && xdg_base_dir="$xdg_user_dir/mime"
+xdg_user_dir="$xdg_user_dir/$xdg_dir_name"
+
+xdg_system_dirs="$XDG_DATA_DIRS"
+[ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
+for x in `echo $xdg_system_dirs | sed 's/:/ /g'`; do
+    if [ -w $x/$xdg_dir_name ] ; then
+        [ x"$mode" = x"system" ] && xdg_base_dir="$x/mime"
+        xdg_global_dir="$x/$xdg_dir_name"
+        break
+    fi
+done
+[ -w $xdg_global_dir ] || xdg_global_dir=
+DEBUG 3 "xdg_user_dir: $xdg_user_dir"
+DEBUG 3 "xdg_global_dir: $xdg_global_dir"
+
+# Find KDE3 mimelnk directory
+kde_user_dir=
+kde_global_dir=
+kde_global_dirs=`kde${KDE_SESSION_VERSION}-config --path mime 2> /dev/null`
+DEBUG 3 "kde_global_dirs: $kde_global_dirs"
+first=
+for x in `echo $kde_global_dirs | sed 's/:/ /g'` ; do
+    if [ -z "$first" ] ; then
+        first=false
+        kde_user_dir="$x"
+    elif [ -w $x ] ; then
+        kde_global_dir="$x"
+    fi
+done
+DEBUG 3 "kde_user_dir: $kde_user_dir"
+DEBUG 3 "kde_global_dir: $kde_global_dir"
+
+# TODO: Gnome legacy support
+# See http://forums.fedoraforum.org/showthread.php?t=26875
+gnome_user_dir="$HOME/.gnome/apps"
+gnome_global_dir=/usr/share/gnome/apps
+[ -w $gnome_global_dir ] || gnome_global_dir=
+DEBUG 3 "gnome_user_dir: $gnome_user_dir"
+DEBUG 3 "gnome_global_dir: $gnome_global_dir"
+
+if [ x"$mode" = x"user" ] ; then
+    xdg_dir="$xdg_user_dir"
+    kde_dir="$kde_user_dir"
+    gnome_dir="$gnome_user_dir"
+    my_umask=077
+else
+    xdg_dir="$xdg_global_dir"
+    kde_dir="$kde_global_dir"
+    gnome_dir="$gnome_global_dir"
+    my_umask=022
+    if [ -z "${xdg_dir}${kde_dir}${gnome_dir}" ] ; then
+        exit_failure_operation_impossible "No writable system mimetype directory found."
+    fi
+fi
+
+# echo "[xdg|$xdg_user_dir|$xdg_global_dir]"
+# echo "[kde|$kde_user_dir|$kde_global_dir]"
+# echo "[gnome|$gnome_user_dir|$gnome_global_dir]"
+# echo "[using|$xdg_dir|$kde_dir|$gnome_dir]"
+
+basefile=`basename "$filename"`
+#[ -z $vendor ] || basefile="$vendor-$basefile"
+
+mimetypes=
+if [ -n "$kde_dir" ] ; then
+    DEBUG 2 "KDE3 mimelnk directory found, extracting mimetypes from XML file"
+
+    mimetypes=`awk < "$filename" '
+# Strip XML comments
+BEGIN {
+ suppress=0
+}
+{
+ do
+    if (suppress) {
+       if (match($0,/-->/)) {
+           $0=substr($0,RSTART+RLENGTH)
+           suppress=0
+       }
+       else {
+           break
+       }
+    }
+    else {
+       if (match($0,/<!--/)) {
+           if (RSTART>1) print substr($0,0,RSTART)
+           $0=substr($0,RSTART+RLENGTH)
+           suppress=1
+       }
+       else {
+           if ($0) print $0
+           break
+       }
+    }
+ while(1)
+}
+' | awk '
+# List MIME types listed in <mime-type> tags
+BEGIN {
+  RS="<"
+}
+/^mime-info/, /^\/mime-info/ {
+  if (match($0,/^mime-type/)) {
+    if (match($0,/type="[^"]*/) || match($0,/type='"'"'[^'"'"']*/)) {
+      print substr($0,RSTART+6,RLENGTH-6)
+    }
+  }
+}'`
+fi
+
+DEBUG 1 "$action mimetype in $xdg_dir"
+
+case $action in
+    install)
+        save_umask=`umask`
+        umask $my_umask
+
+        for x in $xdg_dir ; do
+            mkdir -p $x
+            eval 'cp $filename $x/$basefile'$xdg_redirect_output
+        done
+
+        if [ -n "$mimetypes" ] ; then
+            # No quotes around $mimetypes
+            for x in $mimetypes ; do
+                DEBUG 1 "Installing $kde_dir/$x.desktop (KDE 3.x support)"
+                mkdir -p `dirname $kde_dir/$x.desktop`
+                awk < "$filename" '
+# Strip XML comments
+BEGIN {
+ suppress=0
+}
+{
+ do
+    if (suppress) {
+       if (match($0,/-->/)) {
+           $0=substr($0,RSTART+RLENGTH)
+           suppress=0
+       }
+       else {
+           break
+       }
+    }
+    else {
+       if (match($0,/<!--/)) {
+           if (RSTART>1) print substr($0,0,RSTART)
+           $0=substr($0,RSTART+RLENGTH)
+           suppress=1
+       }
+       else {
+           if ($0) print $0
+           break
+       }
+    }
+ while(1)
+}
+' | awk > $kde_dir/$x.desktop '
+# Extract mimetype $x from the XML file $filename
+# Note that bash requires us to escape a single quote as '"'"'
+BEGIN {
+  the_type=ARGV[1]
+  the_source=ARGV[2]
+  ARGC=1
+  RS="<"
+  found=0
+  glob_patterns=""
+}
+/^mime-info/, /^\/mime-info/ {
+  if (match($0,/^mime-type/)) {
+    if (match($0,/type="[^"]*/) || match($0,/type='"'"'[^'"'"']*/)) {
+      if (substr($0,RSTART+6,RLENGTH-6) == the_type) {
+        found=1
+        print "[Desktop Entry]"
+        print "# Installed by xdg-mime from " the_source
+        print "Type=MimeType"
+        print "MimeType=" the_type
+        the_icon=the_type
+        sub("/", "-", the_icon)
+        print "Icon=" the_icon
+      }
+    }
+  }
+  else if (found) {
+    if (match($0,/^\/mime-type/)) {
+      if (glob_patterns)
+         print "Patterns=" glob_patterns
+      exit 0
+    }
+
+    if (match($0,/^sub-class-of/)) {
+      if (match($0,/type="[^"]*/) || match($0,/type='"'"'[^'"'"']*/)) {
+        print "X-KDE-IsAlso=" substr($0,RSTART+6,RLENGTH-6)
+      }
+      else {
+        print "Error: '"'"'type'"'"' argument missing in " RS $0
+        exit 1
+      }
+    }
+    if (match($0,/^glob/)) {
+      if (match($0,/pattern="[^"]*/) || match($0,/pattern='"'"'[^'"'"']*/)) {
+        glob_patterns = glob_patterns substr($0,RSTART+9,RLENGTH-9) ";"
+      }
+      else {
+        print "Error: '"'"'pattern'"'"' argument missing in " RS $0
+        exit 1
+      }
+    }
+    if (match($0,/^comment/)) {
+      if (match($0,/xml:lang="[^"]*/) || match($0,/xml:lang='"'"'[^'"'"']*/)) {
+        lang=substr($0,RSTART+10,RLENGTH-10)
+      }
+      else {
+        lang=""
+      }
+      if (match($0,/>/)) {
+        comment=substr($0,RSTART+1)
+        sub("&lt;", "<", comment)
+        sub("&gt;", ">", comment)
+        sub("&amp;", "\\&", comment)
+        if (lang)
+           print "Comment[" lang "]=" comment
+        else
+           print "Comment=" comment
+      }
+    }
+  }
+}
+END {
+  if (!found) {
+    print "Error: Mimetype '"'"'" the_type "'"'"' not found"
+    exit 1
+  }
+}
+' $x $basefile
+                if [ "$?" = "1" ] ; then
+                    grep -A 10 "^Error:" $kde_dir/$x.desktop >&2
+                    rm $kde_dir/$x.desktop
+                    exit 1
+                fi
+            done
+        fi
+
+        umask $save_umask
+        ;;
+
+    uninstall)
+        for x in $xdg_dir ; do
+            rm -f $x/$basefile
+        done
+
+        # No quotes around $mimetypes
+        for x in $mimetypes ; do
+            if grep '^# Installed by xdg-mime' $kde_dir/$x.desktop >/dev/null 2>&1; then
+                DEBUG 1 "Removing $kde_dir/$x.desktop (KDE 3.x support)"
+                rm -f $kde_dir/$x.desktop
+            fi
+        done
+        ;;
+esac
+
+update_mime_database $xdg_base_dir
+
+exit_success
+
diff --git a/src/chrome/tools/test/reference_build/chrome_linux/xdg-settings b/src/chrome/tools/test/reference_build/chrome_linux/xdg-settings
new file mode 100755 (executable)
index 0000000..e101297
--- /dev/null
@@ -0,0 +1,1187 @@
+#!/bin/sh
+#---------------------------------------------
+#   xdg-settings
+#
+#   Utility script to get various settings from the desktop environment.
+#
+#   Refer to the usage() function below for usage.
+#
+#   Copyright 2009, Google Inc.
+#
+#   LICENSE:
+#
+#   Permission is hereby granted, free of charge, to any person obtaining a
+#   copy of this software and associated documentation files (the "Software"),
+#   to deal in the Software without restriction, including without limitation
+#   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+#   and/or sell copies of the Software, and to permit persons to whom the
+#   Software is furnished to do so, subject to the following conditions:
+#
+#   The above copyright notice and this permission notice shall be included
+#   in all copies or substantial portions of the Software.
+#
+#   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+#   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+#   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+#   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+#   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+#   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+#   OTHER DEALINGS IN THE SOFTWARE.
+#
+#---------------------------------------------
+
+manualpage()
+{
+cat << _MANUALPAGE
+Name
+
+xdg-settings - get various settings from the desktop environment
+
+Synopsis
+
+xdg-settings { get | check | set } {property} [subproperty] [value]
+
+xdg-settings { --help | --list | --manual | --version }
+
+Description
+
+xdg-settings gets various settings from the desktop environment. For instance,
+desktop environments often provide proxy configuration and default web browser
+settings. Using xdg-settings these parameters can be extracted for use by
+applications that do not use the desktop environment's libraries (which would
+use the settings natively).
+
+xdg-settings is for use inside a desktop session only. It is not recommended to
+use xdg-settings as root.
+
+Options
+
+--help
+    Show command synopsis.
+--list
+    List all properties xdg-settings knows about.
+--manual
+    Show this manualpage.
+--version
+    Show the xdg-utils version information.
+
+Properties
+
+When using xdg-settings to get, check or set a destkop setting, properties and
+possibly sub-properties are used to specify the setting to be changed.
+
+Some properties (such as default-web-browser) fully describe the setting to be
+changed. Other properties (such as default-url-scheme-handler) require more
+information (in this case the actual scheme to set the default handler for)
+which must be provided in a sub-property.
+
+Exit Codes
+
+An exit code of 0 indicates success while a non-zero exit code indicates
+failure. The following failure codes can be returned:
+
+1
+    Error in command line syntax.
+2
+    One of the files passed on the command line did not exist.
+3
+    A required tool could not be found.
+4
+    The action failed.
+
+Examples
+
+Get the desktop file name of the current default web browser
+
+        xdg-settings get default-web-browser
+
+
+Check whether the default web browser is firefox.desktop, which can be false
+even if "get default-web-browser" says that is the current value (if only some
+of the underlying settings actually reflect that value)
+
+        xdg-settings check default-web-browser firefox.desktop
+
+
+Set the default web browser to google-chrome.desktop
+
+        xdg-settings set default-web-browser google-chrome.desktop
+
+
+Set the default mailto URL scheme handler to be evolution.desktop
+
+        xdg-settings set default-url-scheme-handler mailto evolution.desktop
+
+
+_MANUALPAGE
+}
+
+usage()
+{
+cat << _USAGE
+xdg-settings - get various settings from the desktop environment
+
+Synopsis
+
+xdg-settings { get | check | set } {property} [subproperty] [value]
+
+xdg-settings { --help | --list | --manual | --version }
+
+_USAGE
+}
+
+#@xdg-utils-common@
+
+#----------------------------------------------------------------------------
+#   Common utility functions included in all XDG wrapper scripts
+#----------------------------------------------------------------------------
+
+DEBUG()
+{
+  [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
+  [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
+  shift
+  echo "$@" >&2
+}
+
+# This handles backslashes but not quote marks.
+first_word()
+{
+    read first rest
+    echo "$first"
+}
+
+#-------------------------------------------------------------
+# map a binary to a .desktop file
+binary_to_desktop_file()
+{
+    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
+    binary="`which "$1"`"
+    binary="`readlink -f "$binary"`"
+    base="`basename "$binary"`"
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" ] || continue
+        [ -d "$dir/applications" -o -d "$dir/applnk" ] || continue
+        for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.desktop "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do
+            [ -r "$file" ] || continue
+            # Check to make sure it's worth the processing.
+            grep -q "^Exec.*$base" "$file" || continue
+            # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop").
+            grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue
+            command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
+            command="`which "$command"`"
+            if [ x"`readlink -f "$command"`" = x"$binary" ]; then
+                # Fix any double slashes that got added path composition
+                echo "$file" | sed -e 's,//*,/,g'
+                return
+            fi
+        done
+    done
+}
+
+#-------------------------------------------------------------
+# map a .desktop file to a binary
+## FIXME: handle vendor dir case
+desktop_file_to_binary()
+{
+    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
+    desktop="`basename "$1"`"
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" -a -d "$dir/applications" ] || continue
+        file="$dir/applications/$desktop"
+        [ -r "$file" ] || continue
+        # Remove any arguments (%F, %f, %U, %u, etc.).
+        command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
+        command="`which "$command"`"
+        readlink -f "$command"
+        return
+    done
+}
+
+#-------------------------------------------------------------
+# Exit script on successfully completing the desired operation
+
+exit_success()
+{
+    if [ $# -gt 0 ]; then
+        echo "$@"
+        echo
+    fi
+
+    exit 0
+}
+
+
+#-----------------------------------------
+# Exit script on malformed arguments, not enough arguments
+# or missing required option.
+# prints usage information
+
+exit_failure_syntax()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-settings: $@" >&2
+        echo "Try 'xdg-settings --help' for more information." >&2
+    else
+        usage
+        echo "Use 'man xdg-settings' or 'xdg-settings --manual' for additional info."
+    fi
+
+    exit 1
+}
+
+#-------------------------------------------------------------
+# Exit script on missing file specified on command line
+
+exit_failure_file_missing()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-settings: $@" >&2
+    fi
+
+    exit 2
+}
+
+#-------------------------------------------------------------
+# Exit script on failure to locate necessary tool applications
+
+exit_failure_operation_impossible()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-settings: $@" >&2
+    fi
+
+    exit 3
+}
+
+#-------------------------------------------------------------
+# Exit script on failure returned by a tool application
+
+exit_failure_operation_failed()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-settings: $@" >&2
+    fi
+
+    exit 4
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to read a specified file
+
+exit_failure_file_permission_read()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-settings: $@" >&2
+    fi
+
+    exit 5
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to write a specified file
+
+exit_failure_file_permission_write()
+{
+    if [ $# -gt 0 ]; then
+        echo "xdg-settings: $@" >&2
+    fi
+
+    exit 6
+}
+
+check_input_file()
+{
+    if [ ! -e "$1" ]; then
+        exit_failure_file_missing "file '$1' does not exist"
+    fi
+    if [ ! -r "$1" ]; then
+        exit_failure_file_permission_read "no permission to read file '$1'"
+    fi
+}
+
+check_vendor_prefix()
+{
+    file_label="$2"
+    [ -n "$file_label" ] || file_label="filename"
+    file=`basename "$1"`
+    case "$file" in
+       [a-zA-Z]*-*)
+         return
+         ;;
+    esac
+
+    echo "xdg-settings: $file_label '$file' does not have a proper vendor prefix" >&2
+    echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
+    echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
+    echo "Use --novendor to override or 'xdg-settings --manual' for additional info." >&2
+    exit 1
+}
+
+check_output_file()
+{
+    # if the file exists, check if it is writeable
+    # if it does not exists, check if we are allowed to write on the directory
+    if [ -e "$1" ]; then
+        if [ ! -w "$1" ]; then
+            exit_failure_file_permission_write "no permission to write to file '$1'"
+        fi
+    else
+        DIR=`dirname "$1"`
+        if [ ! -w "$DIR" -o ! -x "$DIR" ]; then
+            exit_failure_file_permission_write "no permission to create file '$1'"
+        fi
+    fi
+}
+
+#----------------------------------------
+# Checks for shared commands, e.g. --help
+
+check_common_commands()
+{
+    while [ $# -gt 0 ] ; do
+        parm="$1"
+        shift
+
+        case "$parm" in
+            --help)
+            usage
+            echo "Use 'man xdg-settings' or 'xdg-settings --manual' for additional info."
+            exit_success
+            ;;
+
+            --manual)
+            manualpage
+            exit_success
+            ;;
+
+            --version)
+            echo "xdg-settings 1.1.0 rc1"
+            exit_success
+            ;;
+        esac
+    done
+}
+
+check_common_commands "$@"
+
+[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
+if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
+    # Be silent
+    xdg_redirect_output=" > /dev/null 2> /dev/null"
+else
+    # All output to stderr
+    xdg_redirect_output=" >&2"
+fi
+
+#--------------------------------------
+# Checks for known desktop environments
+# set variable DE to the desktop environments name, lowercase
+
+detectDE()
+{
+    # see https://bugs.freedesktop.org/show_bug.cgi?id=34164
+    unset GREP_OPTIONS
+
+    if [ -n "${XDG_CURRENT_DESKTOP}" ]; then
+      case "${XDG_CURRENT_DESKTOP}" in
+         GNOME)
+           DE=gnome;
+           ;;
+         KDE)
+           DE=kde;
+           ;;
+         LXDE)
+           DE=lxde;
+           ;;
+         XFCE)
+           DE=xfce
+      esac
+    fi
+
+    if [ x"$DE" = x"" ]; then
+      # classic fallbacks
+      if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
+      elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
+      elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
+      elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
+      elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce
+      fi
+    fi
+
+    if [ x"$DE" = x"" ]; then
+      # fallback to checking $DESKTOP_SESSION
+      case "$DESKTOP_SESSION" in
+         gnome)
+           DE=gnome;
+           ;;
+         LXDE)
+           DE=lxde; 
+           ;;
+         xfce|xfce4)
+           DE=xfce;
+           ;;
+      esac
+    fi
+
+    if [ x"$DE" = x"" ]; then
+      # fallback to uname output for other platforms
+      case "$(uname 2>/dev/null)" in 
+        Darwin)
+          DE=darwin;
+          ;;
+      esac
+    fi
+
+    if [ x"$DE" = x"gnome" ]; then
+      # gnome-default-applications-properties is only available in GNOME 2.x
+      # but not in GNOME 3.x
+      which gnome-default-applications-properties > /dev/null 2>&1  || DE="gnome3"
+    fi
+}
+
+#----------------------------------------------------------------------------
+# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
+# It also always returns 1 in KDE 3.4 and earlier
+# Simply return 0 in such case
+
+kfmclient_fix_exit_code()
+{
+    version=`LC_ALL=C.UTF-8 kde-config --version 2>/dev/null | grep '^KDE'`
+    major=`echo $version | sed 's/KDE.*: \([0-9]\).*/\1/'`
+    minor=`echo $version | sed 's/KDE.*: [0-9]*\.\([0-9]\).*/\1/'`
+    release=`echo $version | sed 's/KDE.*: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
+    test "$major" -gt 3 && return $1
+    test "$minor" -gt 5 && return $1
+    test "$release" -gt 4 && return $1
+    return 0
+}
+
+check_desktop_filename()
+{
+    case "$1" in
+      */*)
+        exit_failure_syntax "invalid application name"
+        ;;
+      *.desktop)
+        return
+        ;;
+      *)
+        exit_failure_syntax "invalid application name"
+        ;;
+    esac
+}
+
+# {{{ default browser
+# {{{ utility functions
+
+# In order to remove an application from the automatically-generated list of
+# applications for handling a given MIME type, the desktop environment may copy
+# the global .desktop file into the user's .local directory, and remove that
+# MIME type from its list. In that case, we must restore the MIME type to the
+# application's list of MIME types before we can set it as the default for that
+# MIME type. (We can't just delete the local version, since the user may have
+# made other changes to it as well. So, tweak the existing file.)
+# This function is hard-coded for text/html but it could be adapted if needed.
+fix_local_desktop_file()
+{
+    if test -z "$2" ; then
+        MIME="text/html"
+    else
+        MIME="$2"
+    fi
+    apps="${XDG_DATA_HOME:-$HOME/.local/share}/applications"
+    # No local desktop file?
+    [ ! -f "$apps/$1" ] && return
+    MIMETYPES="`grep "^MimeType=" "$apps/$1" | cut -d= -f 2-`"
+    case "$MIMETYPES" in
+      $MIME\;*|*\;$MIME\;*|*\;$MIME\;|*\;$MIME)
+        # Already has the mime-type? Great!
+        return 0
+        ;;
+    esac
+
+    # Add the mime-type to the list
+    temp="`mktemp "$apps/$1.XXXXXX"`" || return
+    grep -v "^MimeType=" "$apps/$1" >> "$temp"
+    echo "MimeType=$MIME;$MIMETYPES" >> "$temp"
+
+    oldlines="`wc -l < "$apps/$1"`"
+    newlines="`wc -l < "$temp"`"
+    # The new file should have at least as many lines as the old.
+    if [ $oldlines -le $newlines ]; then
+        mv "$temp" "$apps/$1"
+        # This can take a little bit to get noticed.
+        sleep 4
+    else
+        rm -f "$temp"
+        return 1
+    fi
+}
+
+# }}} utility functions
+# {{{ MIME utilities
+
+xdg_mime_fixup()
+{
+    # xdg-mime may use ktradertest, which will fork off a copy of kdeinit if
+    # one does not already exist. It will exit after about 15 seconds if no
+    # further processes need it around. But since it does not close its stdout,
+    # the shell (via grep) will wait around for kdeinit to exit. If we start a
+    # copy here, that copy will be used in xdg-mime and we will avoid waiting.
+    if [ "$DE" = kde -a -z "$XDG_MIME_FIXED" ]; then
+        ktradertest text/html Application > /dev/null 2>&1
+        # Only do this once, as we only need it once.
+        XDG_MIME_FIXED=yes
+    fi
+}
+
+get_browser_mime()
+{
+    if test -z "$1" ; then
+        MIME="text/html"
+    else
+        MIME="$1"
+    fi
+    xdg_mime_fixup
+    xdg-mime query default "$MIME"
+}
+
+set_browser_mime()
+{
+    xdg_mime_fixup
+    if test -z "$2" ; then
+        MIME="text/html"
+    else
+        MIME="$2"
+    fi
+    orig="`get_browser_mime $MIME`"
+    # Fixing the local desktop file can actually change the default browser all
+    # by itself, so we fix it only after querying to find the current default.
+    fix_local_desktop_file "$1" "$MIME" || return
+    mkdir -p "${XDG_DATA_HOME:-$HOME/.local/share}/applications"
+    xdg-mime default "$1" "$MIME" || return
+    if [ x"`get_browser_mime`" != x"$1" ]; then
+        # Put back the original value
+        xdg-mime default "$orig" "$MIME"
+        exit_failure_operation_failed
+    fi
+}
+
+# }}} MIME utilities
+# {{{ KDE utilities
+
+# Reads the KDE configuration setting, compensating for a bug in some versions of kreadconfig.
+read_kde_config()
+{
+    configfile="$1"
+    configsection="$2"
+    configkey="$3"
+    application="`kreadconfig --file $configfile --group $configsection --key $configkey`"
+    if [ x"$application" != x ]; then
+        echo "$application"
+    else
+        # kreadconfig in KDE 4 may not notice Key[$*]=... localized settings, so
+        # check by hand if it didn't find anything (oddly kwriteconfig works
+        # fine though).
+        configfile_dir=`kde${KDE_SESSION_VERSION}-config --path config  | cut -d ':' -f 1`
+        configfile_path="$configfile_dir/$configfile"
+        [ ! -f "$configfile_path" ] && return
+        # This will only take the first value if there is more than one.
+        grep "^$configkey"'\[$[^]=]*\]=' "$configfile_path" | head -n 1 | cut -d= -f 2-
+    fi
+}
+
+# }}} KDE utilities
+# {{{ KDE
+
+# Resolves the KDE browser setting to a binary: if prefixed with !, simply removes it;
+# otherwise, uses desktop_file_to_binary to get the binary out of the desktop file.
+resolve_kde_browser()
+{
+    [ -z "$browser" ] && return
+    case "$browser" in
+      !*)
+        echo "${browser#!}"
+        ;;
+      *)
+        desktop_file_to_binary "$browser"
+        ;;
+    esac
+}
+
+# Does the opposite of resolve_kde_browser: if prefixed with !, tries to find a desktop
+# file corresponding to the binary, otherwise just returns the desktop file name.
+resolve_kde_browser_desktop()
+{
+    [ -z "$browser" ] && return
+    case "$browser" in
+      !*)
+        desktop="`binary_to_desktop_file "${browser#!}"`"
+        basename "$desktop"
+        ;;
+      *)
+        echo "$browser"
+        ;;
+    esac
+}
+
+read_kde_browser()
+{
+    read_kde_config kdeglobals General BrowserApplication
+}
+
+get_browser_kde()
+{
+    browser="`read_kde_browser`"
+    if [ x"$browser" = x ]; then
+        # No explicit default browser; KDE will use the MIME type text/html.
+        get_browser_mime
+    else
+        resolve_kde_browser_desktop
+    fi
+}
+
+check_browser_kde()
+{
+    check="`desktop_file_to_binary "$1"`"
+    if [ -z "$check" ]; then
+        echo no
+        exit_success
+    fi
+    browser="`read_kde_browser`"
+    binary="`resolve_kde_browser`"
+    # Because KDE will use the handler for MIME type text/html if this value
+    # is empty, we allow either the empty string or a match to $check here.
+    if [ x"$binary" != x -a x"$binary" != x"$check" ]; then
+        echo no
+        exit_success
+    fi
+    browser="`get_browser_mime`"
+    binary="`desktop_file_to_binary "$browser"`"
+    if [ x"$binary" != x"$check" ]; then
+        echo no
+        exit_success
+    fi
+    echo yes
+    exit_success
+}
+
+set_browser_kde()
+{
+    set_browser_mime "$1" || return
+    kwriteconfig --file kdeglobals --group General --key BrowserApplication "$1"
+}
+
+# }}} KDE
+# {{{ GNOME
+
+get_browser_gnome()
+{
+    binary="`gconftool-2 --get /desktop/gnome/applications/browser/exec | first_word`"
+    if [ x"$binary" = x ]; then
+        # No default browser; GNOME might use the MIME type text/html.
+        get_browser_mime
+    else
+        # gconftool gives the binary (maybe with %s etc. afterward),
+        # but we want the desktop file name, not the binary. So, we
+        # have to find the desktop file to which it corresponds.
+        desktop="`binary_to_desktop_file "$binary"`"
+        basename "$desktop"
+    fi
+}
+
+check_browser_gnome()
+{
+    check="`desktop_file_to_binary "$1"`"
+    if [ -z "$check" ]; then
+        echo no
+        exit_success
+    fi
+    binary="`gconftool-2 --get /desktop/gnome/applications/browser/exec | first_word`"
+    if [ x"$binary" != x"$check" ]; then
+        echo no
+        exit_success
+    fi
+    # Check HTTP and HTTPS, but not about: and unknown:.
+    for protocol in http https; do
+        binary="`gconftool-2 --get /desktop/gnome/url-handlers/$protocol/command | first_word`"
+        if [ x"$binary" != x"$check" ]; then
+            echo no
+            exit_success
+        fi
+    done
+    browser="`get_browser_mime`"
+    binary="`desktop_file_to_binary "$browser"`"
+    if [ x"$binary" != x"$check" ]; then
+        echo no
+        exit_success
+    fi
+    echo yes
+    exit_success
+}
+
+set_browser_gnome()
+{
+    binary="`desktop_file_to_binary "$1"`"
+    [ "$binary" ] || exit_failure_file_missing
+    set_browser_mime "$1" || return
+
+    # Set the default browser.
+    gconftool-2 --type string --set /desktop/gnome/applications/browser/exec "$binary"
+    gconftool-2 --type bool --set /desktop/gnome/applications/browser/needs_term false
+    gconftool-2 --type bool --set /desktop/gnome/applications/browser/nremote true
+    # Set the handler for HTTP and HTTPS.
+    for protocol in http https; do
+        gconftool-2 --type string --set /desktop/gnome/url-handlers/$protocol/command "$binary %s"
+        gconftool-2 --type bool --set /desktop/gnome/url-handlers/$protocol/needs_terminal false
+        gconftool-2 --type bool --set /desktop/gnome/url-handlers/$protocol/enabled true
+    done
+    # Set the handler for about: and unknown URL types.
+    for protocol in about unknown; do
+        gconftool-2 --type string --set /desktop/gnome/url-handlers/$protocol/command "$binary %s"
+    done
+}
+
+# }}} GNOME
+# {{{ GNOME 3.x
+
+get_browser_gnome3()
+{
+    get_browser_mime "x-scheme-handler/http"
+}
+
+check_browser_gnome3()
+{
+    desktop="$1"
+    check="`desktop_file_to_binary "$1"`"
+    if [ -z "$check" ]; then
+        echo no
+        exit_success
+    fi
+    # Check HTTP and HTTPS, but not about: and unknown:.
+    for protocol in http https; do
+        browser="`get_browser_mime "x-scheme-handler/$protocol"`"
+        if [ x"$browser" != x"$desktop" ]; then
+            echo no
+            exit_success
+        fi
+    done
+    echo yes
+    exit_success
+}
+
+set_browser_gnome3()
+{
+    binary="`desktop_file_to_binary "$1"`"
+    [ "$binary" ] || exit_failure_file_missing
+    set_browser_mime "$1" || return
+
+    # Set the default browser.
+    for protocol in http https about unknown; do
+        set_browser_mime "$1" "x-scheme-handler/$protocol" || return
+    done
+}
+# }}} GNOME 3.x
+# {{{ xfce
+
+get_browser_xfce()
+{
+    search="${XDG_CONFIG_HOME:-$HOME/.config}:${XDG_CONFIG_DIRS:-/etc/xdg}"
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" -a -d "$dir/xfce4" ] || continue
+        file="$dir/xfce4/helpers.rc"
+        [ -r "$file" ] || continue
+        grep -q "^WebBrowser=" "$file" || continue
+        desktop="`grep "^WebBrowser=" "$file" | cut -d= -f 2-`"
+        echo "$desktop.desktop"
+        return
+    done
+    exit_failure_operation_failed
+}
+
+check_browser_xfce()
+{
+    browser="`get_browser_xfce`"
+    if [ x"$browser" != x"$1" ]; then
+        echo no
+        exit_success
+    fi
+    echo yes
+    exit_success
+}
+
+check_xfce_desktop_file()
+{
+    # Annoyingly, xfce wants its .desktop files in a separate directory instead
+    # of the standard locations, and requires a few custom tweaks to them:
+    # "Type" must be "X-XFCE-Helper"
+    # "X-XFCE-Category" must be "WebBrowser" (for web browsers, anyway)
+    # "X-XFCE-Commands" and "X-XFCE-CommandsWithParameter" must be set
+    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" -a -d "$dir/xfce4/helpers" ] || continue
+        file="$dir/xfce4/helpers/$1"
+        # We have the file, no need to create it.
+        [ -r "$file" ] && return
+    done
+    IFS=:
+    for dir in $search; do
+        unset IFS
+        [ "$dir" -a -d "$dir/applications" ] || continue
+        file="$dir/applications/$1"
+        if [ -r "$file" ]; then
+            # Found a file to convert.
+            target="${XDG_DATA_HOME:-$HOME/.local/share}/xfce4/helpers"
+            mkdir -p "$target"
+            grep -v "^Type=" "$file" > "$target/$1"
+            echo "Type=X-XFCE-Helper" >> "$target/$1"
+            echo "X-XFCE-Category=WebBrowser" >> "$target/$1"
+            # Change %F, %f, %U, and %u to "%s".
+            command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | sed -e 's/%[FfUu]/"%s"/g'`"
+            echo "X-XFCE-Commands=`echo "$command" | first_word`" >> "$target/$1"
+            echo "X-XFCE-CommandsWithParameter=$command" >> "$target/$1"
+            return
+        fi
+    done
+    return 1
+}
+
+set_browser_xfce()
+{
+    check_xfce_desktop_file "$1" || exit_failure_operation_failed
+
+    helper_dir="${XDG_CONFIG_HOME:-$HOME/.config}/xfce4"
+    if [ ! -d "$helper_dir" ]; then
+        mkdir -p "$helper_dir" || exit_failure_operation_failed
+    fi
+
+    helpers_rc="$helper_dir/helpers.rc"
+    # Create the file if it does not exist to avoid special cases below.
+    if [ ! -r "$helpers_rc" ]; then
+        touch "$helpers_rc" || exit_failure_operation_failed
+    fi
+
+    temp="`mktemp "$helpers_rc.XXXXXX"`" || return
+    grep -v "^WebBrowser=" "$helpers_rc" >> "$temp"
+    echo "WebBrowser=${1%.desktop}" >> "$temp"
+
+    oldlines="`wc -l < "$helpers_rc"`"
+    newlines="`wc -l < "$temp"`"
+    # The new file should have at least as many lines as the old.
+    if [ $oldlines -le $newlines ]; then
+        mv "$temp" "$helpers_rc"
+    else
+        rm -f "$temp"
+        return 1
+    fi
+}
+
+# }}} xfce
+# }}} default browser
+
+# {{{ default url scheme handler
+
+exit_unimplemented_default_handler()
+{
+    exit_failure_operation_impossible "default-url-scheme-handler not implemented for $DE"
+}
+
+# {{{ KDE
+
+# Recent versions of KDE support default scheme handler applications using the
+# mime type of x-scheme-handler/scheme. Older versions will not support this
+# but do have support for setting a default mail handler. There is also a
+# system in KDE where .protocol files can be used, however this is not
+# supported by this script. When reading a scheme handler we will use the
+# default mail handler for the mailto scheme, otherwise we will use the mime
+# type x-scheme-handler/scheme.
+
+get_url_scheme_handler_kde()
+{
+    if [ "$1" = "mailto" ]; then
+        handler="`read_kde_config emaildefaults PROFILE_Default EmailClient | first_word`"
+        echo "handler is $handler"
+        if [ x"$handler" != x ]; then
+            binary_to_desktop_file "$handler"
+        else
+            get_browser_mime "x-scheme-handler/$1"
+        fi
+    else 
+        get_browser_mime "x-scheme-handler/$1"
+    fi
+}
+
+check_url_scheme_handler_kde()
+{
+    check="`desktop_file_to_binary "$2"`"
+    if [ -z "$check" ]; then
+        echo no
+        exit_success
+    fi
+    if [ x"$1" = "mailto" ]; then
+        binary="`read_kde_config emaildefaults PROFILE_Default EmailClient`"
+        if [ x"$binary" != x"$check" ]; then
+            echo no
+            exit_success
+        fi
+    fi
+    handler="`get_browser_mime x-scheme-handler/$1`"
+    binary="`desktop_file_to_binary "$handler"`"
+    if [ x"$binary" != x"$check" ]; then
+        echo no
+        exit_success
+    fi
+    echo yes
+    exit_success
+}
+
+set_url_scheme_handler_kde()
+{
+    set_browser_mime "$2" "x-scheme-handler/$1" || return
+    if [ "$1" = "mailto" ]; then
+        binary="`desktop_file_to_binary "$2"`"
+        kwriteconfig --file emaildefaults --group PROFILE_Default --key EmailClient "$binary"
+    fi
+}
+
+# }}} KDE
+# {{{ GNOME
+
+get_url_scheme_handler_gnome()
+{
+    binary="`gconftool-2 --get /desktop/gnome/url-handlers/$1/command | first_word`"
+    if [ x"$binary" != x"" ]; then
+        # gconftool gives the binary (maybe with %s etc. afterward),
+        # but we want the desktop file name, not the binary. So, we
+        # have to find the desktop file to which it corresponds.
+        desktop="`binary_to_desktop_file "$binary"`"
+        basename "$desktop"
+    fi
+}
+
+check_url_scheme_handler_gnome()
+{
+    check="`desktop_file_to_binary "$2"`"
+    if [ -z "$check" ]; then
+        echo no
+        exit_success
+    fi
+    binary="`gconftool-2 --get /desktop/gnome/url-handlers/$1/command | first_word`"
+    if [ x"$binary" != x"$check" ]; then
+        echo no
+        exit_success
+    fi
+    echo yes
+    exit_success
+}
+
+set_url_scheme_handler_gnome()
+{
+    binary="`desktop_file_to_binary "$2"`"
+    [ "$binary" ] || exit_failure_file_missing
+
+    gconftool-2 --type string --set /desktop/gnome/url-handlers/$1/command "$binary %s"
+    gconftool-2 --type bool --set /desktop/gnome/url-handlers/$1/needs_terminal false
+    gconftool-2 --type bool --set /desktop/gnome/url-handlers/$1/enabled true
+}
+
+# }}} GNOME
+# {{{ GNOME 3.x
+
+get_url_scheme_handler_gnome3()
+{
+    get_browser_mime "x-scheme-handler/$1"
+}
+
+check_url_scheme_handler_gnome3()
+{
+    desktop="$2"
+    check="`desktop_file_to_binary "$2"`"
+    if [ -z "$check" ]; then
+        echo no
+        exit_success
+    fi
+    browser="`get_browser_mime "x-scheme-handler/$1"`"
+    if [ x"$browser" != x"$desktop" ]; then
+        echo no
+        exit_success
+    fi
+    echo yes
+    exit_success
+}
+
+set_url_scheme_handler_gnome3()
+{
+    binary="`desktop_file_to_binary "$2"`"
+    [ "$binary" ] || exit_failure_file_missing
+    set_browser_mime "$2" || return
+
+    # Set the default browser.
+    set_browser_mime "$2" "x-scheme-handler/$1" || return
+}
+
+# }}} GNOME 3.x
+# {{{ xfce
+
+get_url_scheme_handler_xfce()
+{
+    exit_unimplemented_default_handler "$1"
+}
+
+check_url_scheme_handler_xfce()
+{
+    exit_unimplemented_default_handler "$1"
+}
+
+set_url_scheme_handler_xfce()
+{
+    exit_unimplemented_default_handler "$1"
+}
+
+# }}} xfce
+# }}} default protocol handler
+
+dispatch_specific()
+{
+    # The PROP comments in this function are used to generate the output of
+    # the --list option. The formatting is important. Make sure to line up the
+    # property descriptions with spaces so that it will look nice.
+    if [ x"$op" = x"get" ]; then
+        case "$parm" in
+          default-web-browser) # PROP:           Default web browser
+            get_browser_$DE
+            ;;
+
+          default-url-scheme-handler) # PROP:    Default handler for URL scheme
+            get_url_scheme_handler_$DE "$1"
+            ;;
+
+          *)
+            exit_failure_syntax
+            ;;
+        esac
+    elif [ x"$op" = x"check" ]; then
+        case "$parm" in
+          default-web-browser)
+            check_desktop_filename "$1"
+            check_browser_$DE "$1"
+            ;;
+
+          default-url-scheme-handler)
+            check_desktop_filename "$2"
+            check_url_scheme_handler_$DE "$1" "$2"
+            ;;
+
+          *)
+            exit_failure_syntax
+            ;;
+        esac
+    else # set
+        case "$parm" in
+          default-web-browser)
+           [ $# -eq 1 ] || exit_failure_syntax "unexpected/missing argument"
+            check_desktop_filename "$1"
+            set_browser_$DE "$1"
+            ;;
+
+          default-url-scheme-handler)
+           [ $# -eq 2 ] || exit_failure_syntax "unexpected/missing argument"
+            check_desktop_filename "$2"
+            set_url_scheme_handler_$DE "$1" "$2"
+            ;;
+
+          *)
+            exit_failure_syntax
+            ;;
+        esac
+    fi
+
+    if [ $? -eq 0 ]; then
+        exit_success
+    else
+        exit_failure_operation_failed
+    fi
+}
+
+dispatch_generic()
+{
+    # We only know how to get or check the default web browser.
+    [ x"$op" != x"get" -a x"$op" != x"check" ] && exit_failure_operation_impossible
+    [ x"$parm" != x"default-web-browser" ] && exit_failure_operation_impossible
+
+    # First look in $BROWSER
+    if [ x"$BROWSER" != x ]; then
+        binary="`which "${BROWSER%%:*}"`"
+    else
+        # Debian and Ubuntu (and others?) have x-www-browser.
+        binary="`which x-www-browser`"
+    fi
+
+    [ "$binary" ] || exit_failure_operation_failed
+
+    binary="`readlink -f "$binary"`"
+
+    [ "$binary" ] || exit_failure_operation_failed
+
+    if [ x"$op" = x"get" ]; then
+        desktop="`binary_to_desktop_file "$binary"`"
+        basename "$desktop"
+    else
+        # $op = "check"
+        check="`desktop_file_to_binary "$1"`"
+        if [ -z "$check" ]; then
+            echo no
+            exit_success
+        fi
+        if [ x"$binary" != x"$check" ]; then
+            echo no
+            exit_success
+        fi
+        echo yes
+    fi
+    exit_success
+}
+
+if [ x"$1" = x"--list" ]; then
+    echo "Known properties:"
+    # Extract the property names from dispatch_specific() above.
+    grep "^[   ]*[^)]*) # PROP:" "$0" | sed -e 's/^[   ]*\([^)]*\)) # PROP: \(.*\)$/  \1 \2/' | sort
+    exit_success
+fi
+
+[ x"$1" != x ] || exit_failure_syntax "no operation given"
+[ x"$2" != x ] || exit_failure_syntax "no parameter name given"
+[ x"$1" = x"get" -o x"$3" != x ] || exit_failure_syntax "no parameter value given"
+
+op="$1"
+parm="$2"
+shift 2
+
+if [ x"$op" != x"get" -a x"$op" != x"check" -a x"$op" != x"set" ]; then
+  exit_failure_syntax "invalid operation"
+fi
+
+detectDE
+
+case "$DE" in
+    kde|gnome*|xfce)
+    dispatch_specific "$@"
+    ;;
+
+    generic)
+    dispatch_generic "$@"
+    ;;
+
+    *)
+    exit_failure_operation_impossible "unknown desktop environment"
+    ;;
+esac
index 4ae72c0..efb9c97 100644 (file)
@@ -35,11 +35,13 @@ const wchar_t* g_troublesome_dlls[kTroublesomeDllsMaxCount] = {
   L"activedetect64.dll",                // Lenovo One Key Theater.
   L"bitguard.dll",                      // Unknown (suspected malware).
   L"chrmxtn.dll",                       // Unknown (keystroke logger).
+  L"datamngr.dll",                      // Unknown (suspected adware).
   L"hk.dll",                            // Unknown (keystroke logger).
   L"libsvn_tsvn32.dll",                 // TortoiseSVN.
   L"lmrn.dll",                          // Unknown.
   L"scdetour.dll",                      // Quick Heal Antivirus.
                                         // See crbug.com/382561.
+  L"systemk.dll",                       // Unknown (suspected adware).
   L"windowsapihookdll32.dll",           // Lenovo One Key Theater.
                                         // See crbug.com/379218.
   L"windowsapihookdll64.dll",           // Lenovo One Key Theater.
index c7b6477..5afe8f2 100644 (file)
@@ -13,6 +13,8 @@
 #include "chromeos/chromeos_export.h"
 #include "chromeos/ime/input_method_descriptor.h"
 
+class Profile;
+
 namespace ui {
 class Accelerator;
 }  // namespace ui
@@ -139,11 +141,13 @@ class CHROMEOS_EXPORT InputMethodManager {
   // Adds an input method extension. This function does not takes ownership of
   // |instance|.
   virtual void AddInputMethodExtension(
+      Profile* profile,
       const std::string& imm_id,
       InputMethodEngineInterface* instance) = 0;
 
   // Removes an input method extension.
-  virtual void RemoveInputMethodExtension(const std::string& id) = 0;
+  virtual void RemoveInputMethodExtension(Profile* profile,
+                                          const std::string& id) = 0;
 
   // Returns a list of descriptors for all Input Method Extensions.
   virtual void GetInputMethodExtensions(InputMethodDescriptors* result) = 0;
index 1f6a3c4..56c4cf9 100644 (file)
@@ -573,6 +573,10 @@ void InitCrashReporter(const std::string& process_type_switch) {
       google_breakpad::ExceptionHandler::HANDLER_NONE,
       dump_type, pipe_name.c_str(), custom_info);
 
+  // Set the DumpWithoutCrashingFunction for this instance of base.lib.  Other
+  // executable images linked with base should set this again for
+  // DumpWithoutCrashing to function correctly.
+  // See chrome_main.cc for example.
   base::debug::SetDumpWithoutCrashingFunction(&DumpProcessWithoutCrash);
 
   if (g_breakpad->IsOutOfProcess()) {
index 09448d7..ab19283 100644 (file)
@@ -7,9 +7,11 @@
 #include <CommonCrypto/CommonCryptor.h>  // for kCCBlockSizeAES128
 
 #include "base/command_line.h"
+#include "base/debug/leak_annotations.h"
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/synchronization/lock.h"
 #include "components/os_crypt/keychain_password_mac.h"
 #include "components/os_crypt/os_crypt_switches.h"
 #include "crypto/apple_keychain.h"
@@ -38,10 +40,17 @@ static bool use_mock_keychain = false;
 const char kEncryptionVersionPrefix[] = "v10";
 
 // Generates a newly allocated SymmetricKey object based on the password found
-// in the Keychain.  The generated key is for AES encryption.  Ownership of the
-// key is passed to the caller.  Returns NULL key in the case password access
-// is denied or key generation error occurs.
+// in the Keychain.  The generated key is for AES encryption.  Returns NULL key
+// in the case password access is denied or key generation error occurs.
 crypto::SymmetricKey* GetEncryptionKey() {
+  static crypto::SymmetricKey* cached_encryption_key = NULL;
+  static bool key_is_cached = false;
+  static base::Lock lock;
+  base::AutoLock auto_lock(lock);
+
+  if (key_is_cached)
+    return cached_encryption_key;
+
   static bool mock_keychain_command_line_flag =
       CommandLine::ForCurrentProcess()->HasSwitch(
           os_crypt::switches::kUseMockKeychain);
@@ -55,21 +64,26 @@ crypto::SymmetricKey* GetEncryptionKey() {
     password = encryptor_password.GetPassword();
   }
 
+  // Subsequent code must guarantee that the correct key is cached before
+  // returning.
+  key_is_cached = true;
+
   if (password.empty())
-    return NULL;
+    return cached_encryption_key;
 
   std::string salt(kSalt);
 
-  // Create an encryption key from our password and salt.
-  scoped_ptr<crypto::SymmetricKey> encryption_key(
+  // Create an encryption key from our password and salt. The key is
+  // intentionally leaked.
+  cached_encryption_key =
       crypto::SymmetricKey::DeriveKeyFromPassword(crypto::SymmetricKey::AES,
                                                   password,
                                                   salt,
                                                   kEncryptionIterations,
-                                                  kDerivedKeySizeInBits));
-  DCHECK(encryption_key.get());
-
-  return encryption_key.release();
+                                                  kDerivedKeySizeInBits);
+  ANNOTATE_LEAKING_OBJECT_PTR(cached_encryption_key);
+  DCHECK(cached_encryption_key);
+  return cached_encryption_key;
 }
 
 }  // namespace
@@ -96,13 +110,13 @@ bool OSCrypt::EncryptString(const std::string& plaintext,
     return true;
   }
 
-  scoped_ptr<crypto::SymmetricKey> encryption_key(GetEncryptionKey());
-  if (!encryption_key.get())
+  crypto::SymmetricKey* encryption_key = GetEncryptionKey();
+  if (!encryption_key)
     return false;
 
   std::string iv(kCCBlockSizeAES128, ' ');
   crypto::Encryptor encryptor;
-  if (!encryptor.Init(encryption_key.get(), crypto::Encryptor::CBC, iv))
+  if (!encryptor.Init(encryption_key, crypto::Encryptor::CBC, iv))
     return false;
 
   if (!encryptor.Encrypt(plaintext, ciphertext))
@@ -134,13 +148,13 @@ bool OSCrypt::DecryptString(const std::string& ciphertext,
   std::string raw_ciphertext =
       ciphertext.substr(strlen(kEncryptionVersionPrefix));
 
-  scoped_ptr<crypto::SymmetricKey> encryption_key(GetEncryptionKey());
-  if (!encryption_key.get())
+  crypto::SymmetricKey* encryption_key = GetEncryptionKey();
+  if (!encryption_key)
     return false;
 
   std::string iv(kCCBlockSizeAES128, ' ');
   crypto::Encryptor encryptor;
-  if (!encryptor.Init(encryption_key.get(), crypto::Encryptor::CBC, iv))
+  if (!encryptor.Init(encryption_key, crypto::Encryptor::CBC, iv))
     return false;
 
   if (!encryptor.Decrypt(raw_ciphertext, plaintext))
index 12394fa..b541e80 100644 (file)
@@ -9,6 +9,7 @@ namespace policy {
 const char kMetricToken[] = "Enterprise.DMToken";
 const char kMetricPolicy[] = "Enterprise.Policy";
 const char kMetricEnrollment[] = "Enterprise.Enrollment";
+const char kMetricEnrollmentRecovery[] = "Enterprise.EnrollmentRecovery";
 const char kMetricPolicyRefresh[] = "Enterprise.PolicyRefresh";
 const char kMetricPolicyInvalidations[] = "Enterprise.PolicyInvalidations";
 
index daac653..79bdcf1 100644 (file)
@@ -167,6 +167,10 @@ enum MetricEnrollment {
   kMetricEnrollmentDeprovisioned,
   // Enrollment failed because the device doesn't belong to the domain.
   kMetricEnrollmentDomainMismatch,
+  // Enrollment has been triggered, the credential screen has been shown.
+  kMetricEnrollmentTriggered,
+  // The user retried to submitted credentials.
+  kMetricEnrollmentRetried,
 
   kMetricEnrollmentSize  // Must be the last.
 };
@@ -212,6 +216,7 @@ enum PolicyInvalidationType {
 POLICY_EXPORT extern const char kMetricToken[];
 POLICY_EXPORT extern const char kMetricPolicy[];
 POLICY_EXPORT extern const char kMetricEnrollment[];
+POLICY_EXPORT extern const char kMetricEnrollmentRecovery[];
 POLICY_EXPORT extern const char kMetricPolicyRefresh[];
 POLICY_EXPORT extern const char kMetricPolicyInvalidations[];
 
index fda02d1..5fa8739 100644 (file)
           ExtensionInstallBlacklist ከዚህ መምሪያ ቅድሚያ ይሰጠዋል። ይህም ማለት በተከለከሉት ዝርዝር ውስጥ ያለ ቅጥያ አይጫንም፣ በዚህ ዝርዝር ውስጥ ካለ ጣቢያ የመጠ ቢሆንም እንኳ።</translation>
 <translation id="2113068765175018713">በራስ-ሰር ዳግም በማስነሳት መሳሪያ በርቶ የሚቆይበትን ጊዜ ይገድቡ</translation>
 <translation id="4224610387358583899">የማያ ገጽ መቆለፍ መዘግየቶች</translation>
-<translation id="5388730678841939057">á\89 á\88«á\88µ-á\88°á\88­ á\8c½á\8b³á\89µ á\8c\8aá\8b\9c á\8b¨á\8b²á\88µá\8a­ á\89¦á\89³ á\8a\90á\8c» á\88\88á\88\9bá\88µá\88\88á\89\80á\89\85 á\88µá\88« á\88\8bá\8b­ á\8b¨á\88\9aá\8b\8dá\88\88á\8b\8dá\8a\95 á\88µá\89µá\88«á\89´á\8c\82 ይመርጣል (ተቀባይነት ያላገኘ)</translation>
+<translation id="5388730678841939057">á\89 á\88«á\88µ-á\88°á\88­ á\8c½á\8b³á\89µ á\8c\8aá\8b\9c á\8b¨á\8b²á\88µá\8a­ á\89¦á\89³ á\8a\90á\8c» á\88\88á\88\9bá\88µá\88\88á\89\80á\89\85 á\88µá\88« á\88\8bá\8b­ á\8b¨á\88\9aá\8b\8dá\88\88á\8b\8dá\8a\95 á\88µá\88\8dá\89µ ይመርጣል (ተቀባይነት ያላገኘ)</translation>
 <translation id="7848840259379156480"><ph name="PRODUCT_FRAME_NAME"/> ሲጫን ነባሪውን የኤች ቲ ኤም ኤል ማሳያ እንዲያዋቅሩ ያስችልዎታል።
       ነባሪው ቅንብር አስተናጋጅ አሳሹ ማሳየቱን እንዲያደርግ ነው፣ ግን እንደ አማራጭ
       ይህንን ሽረው <ph name="PRODUCT_FRAME_NAME"/> የኤች ቲ ኤም ኤል ገጾች በነባሪነት እንዲያሳይ ማድረግ ይችላሉ።</translation>
index 9b7261e..7304b20 100644 (file)
@@ -1307,7 +1307,7 @@ Si aquesta opció està desactivada o no especificada, no apareix cap botó gran
 <translation id="2299220924812062390">Especifica una llista de connectors activats</translation>
 <translation id="4325690621216251241">Afegeix un botó de tancament de sessió a la safata del sistema</translation>
 <translation id="924557436754151212">Importació de les contrasenyes desades des del navegador predeterminat en la primera execució</translation>
-<translation id="1465619815762735808">Clic per reproduir</translation>
+<translation id="1465619815762735808">Clic per executar</translation>
 <translation id="7227967227357489766">Defineix la llista d'usuaris que poden iniciar la sessió al dispositiu. El text introduït té el format <ph name="USER_WHITELIST_ENTRY_FORMAT"/>, com ara <ph name="USER_WHITELIST_ENTRY_EXAMPLE"/>. Perquè els usuaris arbitraris puguin accedir a un domini, utilitzeu text que tingui el format <ph name="USER_WHITELIST_ENTRY_WILDCARD"/>.
 
       Si no es configura aquesta política, no hi ha cap restricció sobre on poden iniciar la sessió els usuaris. Tingueu en compte que per crear usuaris nous, la política <ph name="DEVICEALLOWNEWUSERS_POLICY_NAME"/> també ha d'estar configurada adequadament.</translation>
index b6f4a72..a51b863 100644 (file)
@@ -65,11 +65,11 @@ Hodnota prodloužení musí být 100 % nebo více.</translation>
 
           Pokud zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultImagesSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation>
 <translation id="4680961954980851756">Aktivovat Automatické vyplňování</translation>
-<translation id="5183383917553127163">Umožňuje určit rozšíření, kterých se netýká černá listina.
+<translation id="5183383917553127163">Umožňuje určit rozšíření, kterých se netýká seznam zakázaných rozšíření.
 
-          Pokud je na černé listině uvedena hodnota *, znamená to, že jsou na ní všechna rozšíření a uživatelé mohou instalovat pouze rozšíření uvedená na bílé listině.
+          Pokud je na seznamu zakázaných rozšíření uvedena hodnota *, znamená to, že jsou na ní všechna rozšíření a uživatelé mohou instalovat pouze rozšíření uvedená v seznamu povolených rozšíření.
 
-          Ve výchozím nastavení jsou všechna rozšíření na bílé listině. Pokud však byla všechna rozšíření pomocí zásady umístěna na černou listinu, lze tuto zásadu pomocí bílé listiny přepsat.</translation>
+          Ve výchozím nastavení jsou všechna rozšíření na seznamu povolených. Pokud však byla všechna rozšíření pomocí zásady umístěna na seznam zakázaných rozšíření, lze tuto zásadu pomocí seznamu povolených přepsat.</translation>
 <translation id="5921888683953999946">Nastavuje výchozí stav funkce usnadnění přístupu pomocí velkého kurzoru na přihlašovací obrazovce.
 
 Pokud je tato zásada nastavena na hodnotu true, bude při zobrazení přihlašovací obrazovky velký kurzor aktivní.
@@ -233,9 +233,9 @@ Pokud bude tato zásada ponechána nenastavená nebo bude seznam prázdný, bude
 <translation id="5966615072639944554">Rozšíření, která mohou používat rozhraní API vzdáleného ověření identity</translation>
 <translation id="1617235075406854669">Aktivovat smazání historie prohlížeče a stahování</translation>
 <translation id="5290940294294002042">Určete seznam pluginů, které uživatel může povolit nebo zakázat</translation>
-<translation id="3153348162326497318">Umožňuje určit rozšíření, která uživatelé NEMOHOU nainstalovat. Pokud se na černé listině vyskytne rozšíření, které již bylo nainstalováno, bude odebráno
+<translation id="3153348162326497318">Umožňuje určit rozšíření, která uživatelé NEMOHOU nainstalovat. Pokud se na seznamu zakázaných vyskytne rozšíření, které již bylo nainstalováno, bude odebráno.
 
-          Pokud je na černé listině uvedena hodnota *, znamená to, že jsou zakázána všechna rozšíření, která nejsou explicitně uvedena na bílé listině.
+          Pokud je na seznamu zakázaných rozšíření uvedena hodnota *, znamená to, že jsou zakázána všechna rozšíření, která nejsou explicitně uvedena na seznamu povolených rozšíření.
 
          Pokud zásadu nenastavíte, mohou uživatelé v aplikaci <ph name="PRODUCT_NAME"/> instalovat libovolná rozšíření.</translation>
 <translation id="3067188277482006117">Pokud má hodnotu true, uživatel může pomocí hardwaru, který je součástí zařízení Chrome, vzdáleně sdělit svou identitu funkci Privacy CA prostřednictvím rozhraní Enterprise Platform Keys API chrome.enterprise.platformKeysPrivate.challengeUserKey().
@@ -654,11 +654,11 @@ Pokud tuto zásadu ponecháte nenastavenou, bude tato možnost aktivována a už
 
           Příklad: Zásada <ph name="EXTENSION_POLICY_EXAMPLE"/> nainstaluje rozšíření <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME"/> ze standardní adresy URL Internetového obchodu Chrome. Další informace o hostování rozšíření naleznete na adrese <ph name="LINK_TO_EXTENSION_DOC2"/>.
 
-          Rozšíření nainstalovaná pomocí této zásady nemohou uživatelé odinstalovat. Pokud rozšíření z tohoto seznamu odeberete, bude prohlížečem <ph name="PRODUCT_NAME"/> automaticky odinstalováno. Rozšíření uvedená v tomto seznamu jsou také automaticky přidána na bílou listinu a zásada ExtensionsInstallBlacklist je neovlivňuje.
+          Rozšíření nainstalovaná pomocí této zásady nemohou uživatelé odinstalovat. Pokud rozšíření z tohoto seznamu odeberete, bude prohlížečem <ph name="PRODUCT_NAME"/> automaticky odinstalováno. Rozšíření uvedená v tomto seznamu jsou také automaticky přidána na seznam povolených rozšíření a zásada ExtensionsInstallBlacklist je neovlivňuje.
 
           Není-li tato zásada nastavena na konkrétní hodnotu, uživatel může z prohlížeče <ph name="PRODUCT_NAME"/> odinstalovat libovolné rozšíření.</translation>
 <translation id="6899705656741990703">Zjistit nastavení proxy serveru automaticky</translation>
-<translation id="4639407427807680016">Názvy hostitelů zasílání nativních zpráv, kterým chcete udělit výjimku z černé listiny.</translation>
+<translation id="4639407427807680016">Názvy hostitelů zasílání nativních zpráv, kterým chcete udělit výjimku ze seznamu zakázaných položek.</translation>
 <translation id="8382184662529825177">Povolit použití vzdáleného ověření identity k ochraně obsahu v zařízení</translation>
 <translation id="7003334574344702284">Je-li tato zásada aktivovaná, vynucuje import uložených hesel z předchozího výchozího prohlížeče. Aktivace této zásady má také vliv na dialogové okno importu.
 
@@ -732,7 +732,7 @@ Pokud tuto zásadu ponecháte nenastavenou, bude tato možnost aktivována a už
       Pokud toto nastavení aktivujete nebo deaktivujete, uživatelé je v aplikaci <ph name="PRODUCT_NAME"/> nebudou moci změnit ani přepsat.
 
       Pokud nastavení neupravíte, mohou si uživatelé vybrat, zda bude funkci používat, či nikoliv.</translation>
-<translation id="9035964157729712237">ID rozšíření, která mají být vyňata z černé listiny</translation>
+<translation id="9035964157729712237">ID rozšíření, která mají být vyňata ze seznamu zakázaných</translation>
 <translation id="8244525275280476362">Maximální zpoždění načítání po zneplatnění zásady</translation>
 <translation id="8587229956764455752">Povolit vytváření nových uživatelských účtů</translation>
 <translation id="7417972229667085380">Procento prodloužení prodlevy režimu nečinnosti v režimu prezentace (podpora ukončena)</translation>
@@ -749,11 +749,11 @@ Pokud tuto zásadu ponecháte nenastavenou, bude tato možnost aktivována a už
       Pokud toto nastavení aktivujete nebo deaktivujete, uživatelé je nebudou moci změnit ani přepsat.
 
       Není-li zásada nastavena, mohou si uživatelé vybrat, zda chtějí být vyzváni k zadání hesla k odemčení zařízení, nebo nikoliv.</translation>
-<translation id="383466854578875212">Umožňuje určit, na které hostitele zasílání nativních zpráv se nebude vztahovat černá listina.
+<translation id="383466854578875212">Umožňuje určit, na které hostitele zasílání nativních zpráv se nebude vztahovat seznam zakázaných hostitelů.
 
-          Hodnota * v černé listině znamená, že jsou všichni hostitelé zasílání nativních zpráv zakázáni a že budou načteni pouze hostitelé uvedení na bílé listině.
+          Hodnota * v seznamu zakázaných znamená, že jsou všichni hostitelé zasílání nativních zpráv zakázáni a že budou načteni pouze hostitelé uvedení na seznamu povolených hostitelů.
 
-          Ve výchozím nastavení jsou povoleni všichni hostitelé zasílání nativních zpráv. Pokud však byly všichni hostitelé zasílání nativních zpráv pomocí zásady přidáni na černou listinu, je možné tuto zásadu pomocí bílé listiny přepsat.</translation>
+          Ve výchozím nastavení jsou povoleni všichni hostitelé zasílání nativních zpráv. Pokud však byly všichni hostitelé zasílání nativních zpráv pomocí zásady přidáni na seznam zakázaných, je možné tuto zásadu pomocí seznamu povolených hostitelů přepsat.</translation>
 <translation id="6022948604095165524">Akce při spuštění</translation>
 <translation id="9042911395677044526">Umožňuje přenést nastavení sítě, která se uplatní pro jednotlivé uživatele v zařízení se systémem <ph name="PRODUCT_OS_NAME"/>. Konfigurace sítě je řetězec ve formátu JSON, který se řídí definicí formátu Open Network Configuration popsanou na stránce <ph name="ONC_SPEC_URL"/>.</translation>
 <translation id="7128918109610518786">Seznam identifikátorů aplikací, které se v <ph name="PRODUCT_OS_NAME"/> zobrazují jako připnuté na liště spouštěče.
@@ -820,11 +820,11 @@ POZNÁMKA: Tato zásada je v současnosti podporována pouze v režimu veřejné
 <translation id="7912255076272890813">Konfigurovat povolené typy aplikací nebo rozšíření</translation>
 <translation id="817455428376641507">Povoluje přístup k adresám URL uvedeným v seznamu, které tedy představují výjimky ze seznamu zakázaných adres URL.
 
-      Formát položek v tomto seznamu naleznete v popisu zásady pro vytvoření černé listiny adres URL.
+      Formát položek v tomto seznamu naleznete v popisu zásady pro vytvoření seznamu zakázaných adres URL.
 
-      Pomocí této zásady můžete určit výjimky z omezující černé listiny. Příklad: Přidáním pravidla „*“ na černou listinu zablokujete všechny požadavky. Pomocí této zásady poté můžete povolit přístup omezenému seznamu adres URL. Můžete definovat výjimky v podobě schémat, subdomén, portů nebo konkrétních cest.
+      Pomocí této zásady můžete určit výjimky ze seznamu zakázaných adres. Příklad: Přidáním pravidla „*“ na seznam zakázaných zablokujete všechny požadavky. Pomocí této zásady poté můžete povolit přístup omezenému seznamu adres URL. Můžete definovat výjimky v podobě schémat, subdomén, portů nebo konkrétních cest.
 
-      Zda je adresa URL blokována nebo povolena, určuje vždy nejkonkrétnější filtr, přičemž bílá listina má přednost před černou listinou.
+      Zda je adresa URL blokována nebo povolena, určuje vždy nejkonkrétnější filtr, přičemž seznam povolených má přednost před seznamem zakázaných adres.
 
       Počet záznamů v této zásadě je omezen na 1000. Všechny další záznamy budou ignorovány.
 
@@ -838,7 +838,7 @@ Pokud je tato zásada nastavena na hodnotu false, režim vysokého kontrastu bud
 Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat.
 
 Pokud ji ponecháte nenastavenou, režim vysokého kontrastu bude ve výchozím nastavení deaktivován, ale uživatelé jej budou moci kdykoli aktivovat.</translation>
-<translation id="2201555246697292490">Konfigurace bílé listiny zasílání nativních zpráv</translation>
+<translation id="2201555246697292490">Konfigurace seznamu povolených hostitelů zasílání nativních zpráv</translation>
 <translation id="6177482277304066047">Nastavuje cílovou verzi automatické aktualizace.
 
       Určuje předponu cílové verze, na kterou se má <ph name="PRODUCT_OS_NAME"/> aktualizovat. Pokud zařízení obsahuje starší verzi, než jakou určuje předpona, bude systém aktualizován na poslední verzi s danou předponou. Jestliže zařízení již obsahuje novější verzi, nestane se nic (tj. nedojde k přechodu na nižší verzi) a zařízení zůstane u stávající verze. Formát předpony funguje na základě komponent, jak ukazuje následující příklad:
@@ -872,7 +872,7 @@ Pokud ji ponecháte nenastavenou, režim vysokého kontrastu bude ve výchozím
       Seznam rozšíření, která se automaticky nainstalují pro uživatele ukázky v zařízeních v režimu prodeje. Tato rozšíření se uloží v zařízení a po instalaci mohou být nainstalována v režimu offline.
 
       Každý záznam v seznamu obsahuje adresář, který musí zahrnovat ID rozšíření v poli „extension-id“ a jeho webovou adresu pro aktualizace v poli „update-url“.</translation>
-<translation id="9096086085182305205">Bílá listina serverů pro ověřování</translation>
+<translation id="9096086085182305205">Seznam povolených serverů pro ověřování</translation>
 <translation id="4980301635509504364">Povoluje nebo zakazuje záznam videa.
 
 Pokud je tato zásada aktivní nebo není nakonfigurována (výchozí nastavení), uživatel bude vyzván k udělení přístupu pro záznam videa (s výjimkou adres URL nakonfigurovaných v seznamu VideoCaptureAllowedUrls, kterým bude přístup udělen bez vyzvání).
@@ -958,7 +958,7 @@ Tato zásada ovlivňuje kromě integrované webové kamery i všechny ostatní v
 <translation id="5586942249556966598">Nedělat nic</translation>
 <translation id="131353325527891113">Zobrazit uživatelská jména na přihlašovací obrazovce</translation>
 <translation id="5365946944967967336">Zobrazit na liště tlačítko Domů</translation>
-<translation id="3709266154059827597">Konfigurace černé listiny instalace rozšíření</translation>
+<translation id="3709266154059827597">Konfigurace seznamu zakázaných položek instalace rozšíření</translation>
 <translation id="1933378685401357864">Obrázek tapety</translation>
 <translation id="8451988835943702790">Jako domovskou použít stránku Nová karta</translation>
 <translation id="4617338332148204752">Přeskočení kontroly metaznaček ve službě <ph name="PRODUCT_FRAME_NAME"/></translation>
@@ -1169,7 +1169,7 @@ Pokud ji ponecháte nenastavenou, velký kurzor bude ve výchozím nastavení de
 
       Pokud tuto zásadu nenastavíte, bude použita výchozí velikost a uživatel ji bude moci přepsat pomocí příznaku  „--disk-cache-size“.</translation>
 <translation id="5475361623548884387">Povolit tisk</translation>
-<translation id="7287359148642300270">Určuje, které servery mají být umístěny na bílou listinu pro integrované ověření. Integrované ověření je povoleno pouze v případě, že <ph name="PRODUCT_NAME"/> obdrží výzvu ověřování ze proxy serveru nebo jiného serveru, které jsou uvedeny v tomto seznamu povolených serverů. 
+<translation id="7287359148642300270">Určuje, které servery mají být umístěny na seznam povolených pro integrované ověření. Integrované ověření je povoleno pouze v případě, že <ph name="PRODUCT_NAME"/> obdrží výzvu ověřování ze proxy serveru nebo jiného serveru, které jsou uvedeny v tomto seznamu povolených serverů. 
           
           Chcete-li zadat několik názvů serverů, oddělte je čárkami. Zástupné znaky (*) jsou povoleny.
 
@@ -1254,7 +1254,7 @@ Pokud ji ponecháte nenastavenou, velký kurzor bude ve výchozím nastavení de
 
           Tato zásada je určena k internímu použití prohlížečem Chrome.</translation>
 <translation id="913195841488580904">Blokování přístupu k seznamu adres URL</translation>
-<translation id="5461308170340925511">Nakonfiguruje zásady související s rozšířeními. Uživatel nebude moci instalovat rozšíření na černé listině, pokud nebudou autorizována. U aplikace <ph name="PRODUCT_NAME"/> také můžete vynutit automatickou instalaci rozšíření jejich zadáním do zásady <ph name="EXTENSIONINSTALLFORCELIST_POLICY_NAME"/>. Rozšíření, jejichž instalace je vynucena, budou nainstalována bez ohledu na to, zda jsou uvedena na černé listině.</translation>
+<translation id="5461308170340925511">Nakonfiguruje zásady související s rozšířeními. Uživatel nebude moci instalovat rozšíření na seznamu zakázaných rozšíření, pokud nebudou autorizována. U aplikace <ph name="PRODUCT_NAME"/> také můžete vynutit automatickou instalaci rozšíření jejich zadáním do zásady <ph name="EXTENSIONINSTALLFORCELIST_POLICY_NAME"/>. Rozšíření, jejichž instalace je vynucena, budou nainstalována bez ohledu na to, zda jsou uvedena na seznamu zakázaných.</translation>
 <translation id="3292147213643666827">Umožňuje prohlížeči <ph name="PRODUCT_NAME"/> fungovat jako proxy server mezi službou <ph name="CLOUD_PRINT_NAME"/> a staršími tiskárnami připojenými k počítači.
 
       Pokud je toto nastavení aktivované nebo není nakonfigurované, mohou uživatelé proxy server pro tisk z cloudu aktivovat ověřením pomocí účtu Google.
@@ -1274,7 +1274,7 @@ Pokud ji ponecháte nenastavenou, velký kurzor bude ve výchozím nastavení de
 
       Táto zásada má umožnit striktní zakázání pluginů tam, kde seznam DisabledPlugins obsahuje zástupné znaky, jako například deaktivovat všechny pluginy „*“ nebo deaktivovat všechny pluginy Java „'*Java*“, avšak správce chce určité verze povolit (například „IcedTea Java 2.3“). Tuto konkrétní verzi lze určit v této zásadě.
 
-      Upozorňujeme, že je třeba zadat výjimku pro název pluginu i pro název skupiny pluginů. Jednotlivé skupiny pluginů se na stránce about:plugins zobrazují v samostatných sekcích a každá sekce může obsahovat jeden nebo více pluginů. Plugin Shockwave Flash například patří do skupiny Adobe Flash Player. Pokud má být vyloučen z černé listiny, musí být v seznamu výjimek uvedeny oba názvy.
+      Upozorňujeme, že je třeba zadat výjimku pro název pluginu i pro název skupiny pluginů. Jednotlivé skupiny pluginů se na stránce about:plugins zobrazují v samostatných sekcích a každá sekce může obsahovat jeden nebo více pluginů. Plugin Shockwave Flash například patří do skupiny Adobe Flash Player. Pokud má být vyloučen ze seznamu zakázaných, musí být v seznamu výjimek uvedeny oba názvy.
 
       Pokud tato zásada není nastavena, bude jakýkoliv plugin, který odpovídá vzoru v seznamu DisabledPlugins, uzamčen jako deaktivovaný a uživatelé jej nebudou moci aktivovat.</translation>
 <translation id="8951350807133946005">Nastavit adresář mezipaměti na disku</translation>
@@ -1382,7 +1382,7 @@ Pokud ji ponecháte nenastavenou, velký kurzor bude ve výchozím nastavení de
 
       Pokud je tato zásada ponechána nenastavená, uživatel si může zvolit, jaký obrázek bude mít zobrazený na ploše a na pozadí přihlašovací obrazovky.</translation>
 <translation id="2761483219396643566">Prodleva upozornění na nečinnost při napájení z baterie</translation>
-<translation id="6281043242780654992">Konfiguruje zásady pro zasílání nativních zpráv. Hostitelé zasílání nativních zpráv uvedení na černé listině nebudou povoleni (pokud nebudou uvedeni na bílé listině).</translation>
+<translation id="6281043242780654992">Konfiguruje zásady pro zasílání nativních zpráv. Hostitelé zasílání nativních zpráv uvedení na seznamu zakázaných nebudou povoleni (pokud nebudou uvedeni na seznamu povolených hostitelů).</translation>
 <translation id="1468307069016535757">Nastavuje výchozí stav funkce usnadnění přístupu pomocí režimu vysokého kontrastu na přihlašovací obrazovce.
 
 Pokud je tato zásada nastavena na hodnotu true, bude při zobrazení obrazovky přihlášení režim vysokého kontrastu aktivní.
@@ -1494,7 +1494,7 @@ Pokud ji ponecháte nenastavenou, bude hlasová odezva ve výchozím nastavení
           Pokud zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultNotificationsSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation>
 <translation id="527237119693897329">Umožňuje zadat, kteří hostitelé zasílání nativních zpráv se nemají načítat.
 
-          Hodnota * v černé listině znamená, že jsou zakázáni všichni hostitelé zasílání nativních zpráv, kteří nejsou uvedeni na bílé listině.
+          Hodnota * v seznamu zakázaných hostitelů znamená, že jsou zakázáni všichni hostitelé zasílání nativních zpráv, kteří nejsou uvedeni na seznamu povolených.
 
           Pokud je tato zásada ponechána nenastavená, <ph name="PRODUCT_NAME"/> bude načítat všechny nainstalované hostitele zasílání nativních zpráv.</translation>
 <translation id="749556411189861380">Hlásí verzi operačního systému a firmwaru v registrovaných zařízeních.
@@ -1560,7 +1560,7 @@ Pokud ji ponecháte nenastavenou, bude hlasová odezva ve výchozím nastavení
 
       Pokud tuto zásadu nenastavíte, bude použita výchozí velikost a uživatel ji bude moci přepsat pomocí příznaku  „--media-cache-size“.</translation>
 <translation id="5142301680741828703">Následující vzory adres URL vykreslovat vždy v pluginu <ph name="PRODUCT_FRAME_NAME"/></translation>
-<translation id="4625915093043961294">Konfigurovat bílou listinu pro instalaci rozšíření</translation>
+<translation id="4625915093043961294">Konfigurovat seznam povolených pro instalaci rozšíření</translation>
 <translation id="5893553533827140852">Pokud je toto nastavení povoleno, žádosti gnubby o ověření budou zprostředkovány přes připojení ke vzdálenému hostiteli.
 
           Pokud je toto nastavení zakázáno nebo není nakonfigurováno, žádosti gnubby o ověření nebudou zprostředkovány.</translation>
@@ -1632,7 +1632,7 @@ Pokud ji ponecháte nenastavenou, lupa bude ve výchozím nastavení deaktivová
           Zásada bude dodržována pouze v případě, že je aktivní zásada DefaultSearchProviderEnabled.</translation>
 <translation id="7194407337890404814">Název výchozího poskytovatele vyhledávání</translation>
 <translation id="1843117931376765605">Obnovovací frekvence zásad pro uživatele</translation>
-<translation id="5535973522252703021">Bílá listina serverů pro delegování ověření protokolu Kerberos</translation>
+<translation id="5535973522252703021">Seznam povolených serverů pro delegování ověření protokolu Kerberos</translation>
 <translation id="9187743794267626640">Zakázat připojení externího úložiště</translation>
 <translation id="6353901068939575220">Udává parametry, které budou použity při vyhledávání adresy URL pomocí metody POST. Sestává z párů název–hodnota oddělených čárkou. Pokud je hodnotou parametr šablony (např. {searchTerms} v příkladu výše), bude nahrazen skutečnými údaji vyhledávacích dotazů.
 
@@ -1812,7 +1812,7 @@ Až bude okamžité přihlašování podporovat všechny přihlašovací procesy
        Deaktivací tohoto nastavení umožníte, aby prvky webové stránky, které nepocházejí z domény uvedené v adresním řádku prohlížeče, mohly nastavovat soubory cookie.
 
      Pokud zásadu nenastavíte, budou soubory cookie třetích stran povoleny, uživatelé však budou moci toto nastavení změnit.</translation>
-<translation id="4604931264910482931">Konfigurace černé listiny zasílání nativních zpráv</translation>
+<translation id="4604931264910482931">Konfigurace seznamu zakázaných položek zasílání nativních zpráv</translation>
 <translation id="6810445994095397827">Blokovat JavaScript na těchto stránkách</translation>
 <translation id="6672934768721876104">Tato zásada se již nepoužívá. Namísto ní prosím použijte zásadu ProxyMode.
 
index 2c15626..09d1a3d 100644 (file)
 
       Hvis denne politik ikke indstilles, vil den blive aktiveret, men brugeren vil være i stand til at ændre den.</translation>
 <translation id="268577405881275241">Aktivér proxyfunktionen for datakomprimering</translation>
-<translation id="3820526221169548563">Aktivér tilgængelighedsfunktionen Skærmtastatur.
+<translation id="3820526221169548563">Aktivér hjælpefunktionen Skærmtastatur.
 
-          Hvis denne politik er angivet til Sand, vil tilgængelighedsfunktionen Skærmtastatur altid være slået til.
+          Hvis denne politik er angivet som Sand, vil hjælpefunktionen Skærmtastatur altid være slået til.
 
-          Hvis denne politik er angivet til Falsk, vil tilgængelighedsfunktionen Skærmtastatur altid være slået fra.
+          Hvis denne politik er angivet som Falsk, vil hjælpefunktionen Skærmtastatur altid være slået fra.
 
           Hvis du indstiller denne politik, kan brugerne ikke ændre eller tilsidesætte den.
 
 
       En webadresse har formatet &quot;netværk://vært:port/sti&quot;.
       Det valgfrie netværk kan være http, https eller ftp. Kun dette netværk blokeres. Hvis ingen er angivet, blokeres alle netværk.
-      Værten kan være et hostname eller en IP-adresse. Underdomæner af et hostname vil også blive blokeret. Medtag et &quot;.&quot; før hostname for at forhindre blokering af underdomæner. Det særlige hostname &quot;*&quot; blokerer alle domæner.
+      Værten kan være et hostname eller en IP-adresse. Underdomæner af et hostname vil også blive blokeret. Inkluder et &quot;.&quot; før hostname for at forhindre blokering af underdomæner. Det særlige hostname &quot;*&quot; blokerer alle domæner.
       Den valgfrie port består af et gyldigt portnummer mellem 1 og 65.535. Hvis intet nummer angives, blokeres alle porte.
       Hvis den valgfri sti er angivet, blokeres kun stier med det pågældende præfiks.
 
@@ -888,7 +888,7 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
       størrelser er kvantiseret, og opdateringshastigheden er begrænset af sikkerhedsmæssige hensyn. Du kan få
       nøjagtige data i realtid ved at bruge værktøjer som f.eks. Telemetri.</translation>
 <translation id="8731693562790917685">Indstillinger for indhold giver dig mulighed for at angive, hvordan en bestemt type indhold (for eksempel cookies, billeder eller JavaScript) skal behandles.</translation>
-<translation id="2411919772666155530">Bloker meddelelser på disse websites</translation>
+<translation id="2411919772666155530">Bloker underretninger på disse websites</translation>
 <translation id="7332963785317884918">Denne politik er udfaset. <ph name="PRODUCT_OS_NAME"/> vil altid anvende oprydningsstrategien &quot;RemoveLRU&quot;.
 
       Kontrollerer adfærden for automatisk oprydning på <ph name="PRODUCT_OS_NAME"/>-enheder. Automatisk oprydning udløses, når mængden af ledig plads på harddisken når et kritisk niveau, i et forsøg på at frigøre plads.
@@ -1063,7 +1063,7 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
           Hvis du aktiverer denne indstilling, kan brugere ikke ændre eller overskrive den i <ph name="PRODUCT_NAME"/>.
 
           Hvis du deaktiverer denne indstilling, svarer det til ikke at konfigurere den. Brugeren vil fortsat kunne ændre den i <ph name="PRODUCT_NAME"/>.</translation>
-<translation id="2872961005593481000">Luk</translation>
+<translation id="2872961005593481000">Sluk</translation>
 <translation id="4445684791305970001">Deaktiverer udviklerværktøjerne og JavaScript-konsollen. Hvis du aktiverer denne indstilling, kan man ikke få adgang til udviklerværktøjerne, og webstedselementer kan ikke inspiceres. Alle tastaturgenveje og menuer eller genvejsmenuer, der åbner udviklerværktøjerne eller JavaScript-konsollen, vil blive deaktiveret. Hvis du deaktiverer denne indstilling eller ikke angiver den, tillades brugen af udviklerværktøjer og JavaScript-konsollen.</translation>
 <translation id="9203071022800375458">Deaktiverer skærmbilleder.
 
@@ -1088,10 +1088,16 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
 <translation id="389421284571827139">Giver dig mulighed for at angive den proxyserver, der anvendes af <ph name="PRODUCT_NAME"/>, og forhindrer brugerne i at ændre proxyindstillingerne. Hvis du vælger aldrig at bruge en proxyserver og altid opretter forbindelse direkte, ignoreres alle andre valgmuligheder. Hvis du vælger at registrere proxyserveren automatisk, ignoreres alle andre valgmuligheder. Få detaljerede eksempler på: <ph name="PROXY_HELP_URL"/> Hvis du aktiverer denne indstilling, ignorerer <ph name="PRODUCT_NAME"/> alle proxyrelaterede valgmuligheder, der specificeres fra kommandolinjen. Hvis disse politikker ikke angives, kan brugerne selv vælge proxyindstillingerne.</translation>
 <translation id="681446116407619279">Understøttede godkendelsesskemaer</translation>
 <translation id="4027608872760987929">Aktiver standardsøgemaskine</translation>
-<translation id="2223598546285729819">Standardindstilling for meddelelser</translation>
+<translation id="2223598546285729819">Standardindstilling for underretninger</translation>
 <translation id="6158324314836466367">Navn på virksomhedens webshop (udfaset)</translation>
 <translation id="3984028218719007910">Bestemmer, om <ph name="PRODUCT_OS_NAME"/> bevarer lokale kontodata efter logout. Hvis den er angivet til sand, er der ingen vedvarende konti, der bevares af <ph name="PRODUCT_OS_NAME"/>, og alle data fra brugersessionen kasseres efter logout. Hvis denne politik er angivet til falsk eller ikke er konfigureret, kan enheden beholde (krypterede) lokale brugerdata.</translation>
-<translation id="3793095274466276777">Konfigurerer standardbrowserens tjek i <ph name="PRODUCT_NAME"/> og forhindrer brugerne i at ændre dem. Hvis du aktiverer denne indstilling, tjekker <ph name="PRODUCT_NAME"/> altid ved opstart, om den er standardbrowser, og registrerer automatisk sig selv, hvis det er muligt. Hvis denne indstilling deaktiveres, tjekker <ph name="PRODUCT_NAME"/> aldrig se om den er standardbrowseren, og deaktivere brugerens kontrol over denne indstilling. Hvis denne indstilling ikke er angivet, vil <ph name="PRODUCT_NAME"/> tillade brugere at tjekke, om den er standardbrowseren, og om der skal vises meddelelser til brugeren, når den ikke er det.</translation>
+<translation id="3793095274466276777">Konfigurerer standardbrowserens tjek i <ph name="PRODUCT_NAME"/> og forhindrer brugerne i at ændre dem. 
+
+Hvis du aktiverer denne indstilling, tjekker <ph name="PRODUCT_NAME"/> altid ved opstart, om den er standardbrowser, og registrerer automatisk sig selv, hvis det er muligt. 
+
+Hvis denne indstilling deaktiveres, tjekker <ph name="PRODUCT_NAME"/> aldrig se om den er standardbrowseren, og deaktivere brugerens kontrol over denne indstilling. 
+
+Hvis denne indstilling ikke er angivet, vil <ph name="PRODUCT_NAME"/> tillade brugere at tjekke, om den er standardbrowseren, og om der skal vises underretninger til brugeren, når den ikke er det.</translation>
 <translation id="3504791027627803580">Angiver webadressen på den søgemaskine, der bruges til billedsøgning. Søgeanmodninger sendes ved hjælp af GET-metoden. Hvis politikken DefaultSearchProviderImageURLPostParams er angivet, vil anmodninger om billedsøgning anvende POST-metoden i stedet.
 
           Denne politik er valgfri. Hvis den ikke er angivet, anvendes der ikke nogen billedsøgning.
@@ -1135,11 +1141,11 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
 <translation id="2805707493867224476">Tillad, at alle websites viser pop op-vinduer</translation>
 <translation id="1727394138581151779">Bloker alle plugins</translation>
 <translation id="8118665053362250806">Angiv størrelse på mediediskcache</translation>
-<translation id="6565312346072273043">Angiv standardtilstanden for tilgængelighedsfunktionen Skærmtastatur på loginskærmen.
+<translation id="6565312346072273043">Angiv standardtilstanden for hjælpefunktionen Skærmtastatur på loginskærmen.
 
-          Hvis denne politik er angivet til Sand, aktiveres skærmtastaturet, når loginskærmen vises.
+          Hvis denne politik er angivet som Sand, aktiveres skærmtastaturet, når loginskærmen vises.
 
-          Hvis denne politik er angivet til Falsk, deaktiveres skærmtastaturet, når loginskærmen vises.
+          Hvis denne politik er angivet som Falsk, deaktiveres skærmtastaturet, når loginskærmen vises.
 
           Hvis du har indstillet denne politik, kan brugerne midlertidigt tilsidesætte den ved at aktivere eller deaktivere skærmtastaturet. Brugerens valg er dog ikke permanent, og standardindstillingen gendannes, når loginskærmen vises på ny, eller når brugeren har været inaktiv på loginskærmen i et minut.
 
@@ -1391,11 +1397,11 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
 <translation id="3891357445869647828">Aktiver JavaScript</translation>
 <translation id="2274864612594831715">Denne politik konfigurerer aktiveringen af det virtuelle tastatur som inputenhed i ChromeOS. Brugere kan ikke tilsidesætte denne politik.
 
-      Hvis politikken er indstillet til sand, vil det virtuelle tastatur på skærmen altid være aktiveret.
+      Hvis politikken er angivet som Sand, vil det virtuelle tastatur på skærmen altid være aktiveret.
 
-      Hvis den er sat til falsk, vil det virtuelle tastatur på skærmen altid være deaktiveret.
+      Hvis den er angivet som Falsk, vil det virtuelle tastatur på skærmen altid være deaktiveret.
 
-      Hvis du har indstillet denne politik, kan brugere ikke ændre eller tilsidesætte den. Brugere kan dog stadig aktivere/deaktivere et tilgængelighedstastatur på skærmen, som har forrang over det virtuelle tastatur, der kontrolleres af denne politik. Se mere om kontrol af tilgængelighedstastaturet på skærmen i politikken |VirtualKeyboardEnabled|.
+      Hvis du har indstillet denne politik, kan brugere ikke ændre eller tilsidesætte den. Brugere kan dog stadig aktivere/deaktivere et skærmtastatur som hjælpefunktion, som har forrang over det virtuelle tastatur, der kontrolleres af denne politik. Se mere om kontrol af skærmtastaturet som hjælpefunktion i politikken |VirtualKeyboardEnabled|.
 
       Hvis denne politik ikke indstilles, er tastaturet på skærmen slået fra til at starte med, men kan til enhver tid aktiveres af brugeren. Der kan også benyttes heuristiske regler til at bestemme, hvornår tastaturet skal vises.</translation>
 <translation id="6774533686631353488">Tillad indbyggede beskedhosts, der er installeret på brugerniveau (installeret uden administratortilladelser).</translation>
@@ -1524,7 +1530,7 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
 
       Den eksperimentelle indstilling fjernes på et tidspunkt i fremtiden, når inLine-login understøtter alle SSO-loginprocesser fuldt ud.</translation>
 <translation id="4121350739760194865">Undgå, at appkampagner vises på ny fane-siden</translation>
-<translation id="2127599828444728326">Tillad meddelelser på disse websites</translation>
+<translation id="2127599828444728326">Tillad underretninger på disse websites</translation>
 <translation id="3973371701361892765">Skjul aldrig hylden automatisk</translation>
 <translation id="7635471475589566552">Konfigurerer applikationens landestandard i <ph name="PRODUCT_NAME"/> og forhindrer brugerne i at ændre landestandarden. Hvis du aktiverer denne indstilling, anvender <ph name="PRODUCT_NAME"/> den angivne landestandard. Hvis den konfigurerede landestandard ikke understøttes, bruges &quot;en-US&quot; i stedet. Hvis denne indstilling er deaktiveret eller ikke konfigureret, bruger <ph name="PRODUCT_NAME"/> enten den brugerdefinerede landestandard (hvis denne er konfigureret), systemets landestandard eller reservelandestandarden &quot;en-US&quot;.</translation>
 <translation id="2948087343485265211">Angiver, om lydaktivitet påvirker strømstyring.
@@ -1566,7 +1572,7 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
 <translation id="4604931264910482931">Konfigurer spærrelisten for indbyggede beskedhosts</translation>
 <translation id="6810445994095397827">Bloker JavaScript på disse websites</translation>
 <translation id="6672934768721876104">Denne politik er forældet, brug ProxyMode i stedet. Giver dig mulighed for at angive den proxyserver, der anvendes af <ph name="PRODUCT_NAME"/>, og forhindrer brugerne i at ændre proxyindstillingerne. Hvis du vælger aldrig at bruge en proxyserver og altid oprette forbindelse direkte, ignoreres alle andre valgmuligheder. Hvis du vælger indstillinger for systemproxy eller automatisk registrering af proxyserver, ignoreres alle andre muligheder. Hvis du vælger indstillinger for manuel proxy, kan du angive yderligere indstillinger i &quot;Adresse eller webadresse på proxyserver&quot;, &quot;Webadresse til en proxy .pac-fil&quot; og &quot;Komma-adskilt liste over regler for tilsidesættelse af proxy&quot;. Få detaljerede eksempler på: <ph name="PROXY_HELP_URL"/> Hvis du aktiverer denne indstilling, ignorerer <ph name="PRODUCT_NAME"/> alle proxyrelaterede valgmuligheder, der angives via kommandolinjen. Hvis denne politik ikke angives, kan brugerne selv vælge proxyindstillingerne.</translation>
-<translation id="3780152581321609624">Medtag en port, der ikke er standard, i Kerberos-SPN</translation>
+<translation id="3780152581321609624">Inkluder en port, der ikke er standard, i Kerberos-SPN</translation>
 <translation id="1749815929501097806">Angiver de Servicevilkår, som brugeren skal acceptere, inden en enhedslokal kontosession kan påbegyndes.
 
       Hvis denne politik indstilles, downloader <ph name="PRODUCT_OS_NAME"/> servicevilkårene og præsenterer dem for brugeren, når en enhedslokal kontosession påbegyndes. Brugeren får først tilladelse til sessionen, når servicevilkårene accepteres.
@@ -1623,15 +1629,15 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
       Når denne politik er angivet, åbnes de administrerede bogmærker som standard, når visningen Bogmærker åbnes i Chrome.
 
       Administrerede bogmærker synkroniseres ikke med brugerkontoen.</translation>
-<translation id="6757375960964186754">Vis tilgængelighedsindstillingerne for <ph name="PRODUCT_OS_NAME"/> i systemmenuen.
+<translation id="6757375960964186754">Vis hjælpeindstillingerne for <ph name="PRODUCT_OS_NAME"/> i systemmenuen.
 
-          Hvis denne politik er angivet til Sand, vises tilgængelighedsindstillingerne altid i proceslinjemenuen.
+          Hvis denne politik er angivet som Sand, vises hjælpeindstillingerne altid i proceslinjemenuen.
 
-          Hvis denne politik er angivet til Falsk, vises tilgængelighedsindstillingerne aldrig i proceslinjemenuen.
+          Hvis denne politik er angivet som Falsk, vises hjælpeindstillingerne aldrig i proceslinjemenuen.
 
           Hvis du har indstillet denne politik, kan brugerne ikke ændre eller tilsidesætte den.
 
-          Hvis denne politik ikke er indstillet, vises tilgængelighedsindstillingerne ikke i proceslinjemenuen, men brugeren kan forårsage, at tilgængelighedsindstillingerne vises via siden Indstillinger.</translation>
+          Hvis denne politik ikke er indstillet, vises hjælpeindstillingerne ikke i proceslinjemenuen, men brugeren kan forårsage, at hjælpeindstillingerne vises via siden Indstillinger.</translation>
 <translation id="8303314579975657113">Angiver, hvilket GSSAPI-samling der skal bruges til HTTP-godkendelse. Du kan enten angive et samlingsnavn eller en hel sti. Hvis der ikke angives en indstilling, går <ph name="PRODUCT_NAME"/> tilbage til at bruge et standardsamlingsnavn.</translation>
 <translation id="8549772397068118889">Vis en advarsel, når du er på websites uden for indholdspakkerne</translation>
 <translation id="7749402620209366169">Aktiverer godkendelse med to faktorer for værter med fjernadgang i stedet for en brugerangivet pinkode.
@@ -1706,9 +1712,9 @@ Hvis denne politik slås fra eller indstilles til False (falsk), er udviklertils
           Hvis denne politik ikke indstilles, kan brugeren selv vælge sin startside, hvis HomepageIsNewTabPage heller ikke er indstillet.</translation>
 <translation id="3806576699227917885">Tillad lydafspilning.
 
-      Hvis denne politik er angivet til Falsk, vil lydoutput ikke være tilgængeligt på enheden, mens brugeren er logget ind.
+      Hvis denne politik er angivet som Falsk, vil lydoutput ikke være tilgængeligt på enheden, mens brugeren er logget ind.
 
-      Denne politik påvirker alle former for lydoutput, og ikke kun de indbyggede højttalere. Tilgængelighedsfunktioner for lyd forhindres også af denne politik. Hvis brugeren har behov for en skærmlæser, skal du ikke aktivere denne politik.
+      Denne politik påvirker alle former for lydoutput, og ikke kun de indbyggede højttalere. Hjælpefunktioner for lyd forhindres også af denne politik. Hvis brugeren har behov for en skærmlæser, skal du ikke aktivere denne politik.
 
       Hvis denne indstilling er angivet til Sand eller ikke er konfigureret, kan brugerne bruge alle understøttede former for lydoutput på deres enhed.</translation>
 <translation id="6517678361166251908">Tillad gnubby-godkendelse</translation>
index 1502fc5..19dc4a3 100644 (file)
@@ -94,7 +94,7 @@ Diese Richtlinien dienen ausschließlich zur internen Verwendung in Chrome.</tra
 
       Wenn Sie keine Einstellung für diese Richtlinie festlegen, können Nutzer ihr Avatarbild auf dem Anmeldebildschirm auswählen.</translation>
 <translation id="2204753382813641270">Automatisches Ausblenden der Ablage verwalten</translation>
-<translation id="3816312845600780067">Tastaturkürzel zur Umgehung der automatischen Anmeldung aktivieren</translation>
+<translation id="3816312845600780067">Tastenkombination zur Umgehung der automatischen Anmeldung aktivieren</translation>
 <translation id="3214164532079860003">Bei Aktivierung erzwingt diese Richtlinie, dass die Startseite vom aktuellen Standardbrowser importiert wird. Wenn sie deaktiviert ist, wird die Startseite nicht importiert. Sollte sie nicht konfiguriert sein, so wird der Nutzer gefragt, ob ein Import erfolgen soll, oder der Import findet automatisch statt.</translation>
 <translation id="5330684698007383292">Verarbeitung der folgenden Inhaltstypen durch <ph name="PRODUCT_FRAME_NAME"/> zulassen</translation>
 <translation id="6647965994887675196">Wurde &quot;true&quot; festgelegt, können betreute Nutzer erstellt und verwendet werden.
@@ -810,7 +810,7 @@ Falls die Richtlinie auf &quot;false&quot; gesetzt oder nicht festgelegt wird, k
 <translation id="1240643596769627465">Gibt die URL der Suchmaschine an, die zur Ausgabe von Instant-Ergebnissen verwendet wird. Die URL sollte den String <ph name="SEARCH_TERM_MARKER"/> enthalten. Dieser wird bei der Suchanfrage mit dem Text ersetzt, den der Nutzer bis dahin eingegeben hat. Diese Richtlinie ist optional. Wenn keine Festlegung erfolgt, so werden keine Instant-Ergebnisse ausgegeben. Diese Richtlinie wird nur dann umgesetzt, wenn die Richtlinie &quot;DefaultSearchProviderEnabled&quot; aktiviert ist.</translation>
 <translation id="6693751878507293182">Wenn Sie diese Einstellung aktivieren, wird die automatische Suche und Installation fehlender Plug-ins in <ph name="PRODUCT_NAME"/> deaktiviert. Ist sie deaktiviert oder nicht konfiguriert, so ist die Plug-in-Suche aktiv.</translation>
 <translation id="2650049181907741121">Auszuführende Aktion beim Zuklappen des Geräts</translation>
-<translation id="7880891067740158163">Ermöglicht Ihnen die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, für die <ph name="PRODUCT_NAME"/> automatisch ein Client-Zertifikat auswählen soll, wenn die Website ein Zertifikat anfordert. Wenn diese Richtlinie nicht konfiguriert ist, erfolgt keine automatische Auswahl für Websites.</translation>
+<translation id="7880891067740158163">Ermöglicht Ihnen die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, für die <ph name="PRODUCT_NAME"/> automatisch ein Clientzertifikat auswählen soll, wenn die Website ein Zertifikat anfordert. Wenn diese Richtlinie nicht konfiguriert ist, erfolgt keine automatische Auswahl für Websites.</translation>
 <translation id="3866249974567520381">Beschreibung</translation>
 <translation id="5192837635164433517">Aktiviert die Verwendung alternativer Fehlerseiten, die in <ph name="PRODUCT_NAME"/> integriert sind, etwa &quot;Seite nicht gefunden&quot;, und verhindert, dass die Einstellung durch Nutzer geändert wird. Wenn Sie diese Einstellung aktivieren, kommen alternative Fehlerseiten zum Einsatz. Sollten Sie sie deaktivieren, werden alternative Fehlerseiten grundsätzlich nicht verwendet. Ist diese Einstellung aktiviert oder deaktiviert, können Nutzer sie in <ph name="PRODUCT_NAME"/> nicht ändern oder außer Kraft setzen. Wird die Richtlinie nicht konfiguriert, so ist die Funktion aktiv, aber der Nutzer kann dies ändern.</translation>
 <translation id="2236488539271255289">Speichern von lokalen Daten für keine Website zulassen</translation>
@@ -1016,10 +1016,10 @@ Falls die Richtlinie auf &quot;false&quot; gesetzt oder nicht festgelegt wird, k
 
           Die Deaktivierung dieser Einstellung entspricht einer nicht konfigurierten Option. Ein Nutzer kann sie dann in <ph name="PRODUCT_NAME"/> ändern.</translation>
 <translation id="2872961005593481000">Herunterfahren</translation>
-<translation id="4445684791305970001">Deaktiviert die Entwickler-Tools und die JavaScript-Konsole. Wenn Sie diese Einstellung aktivieren, besteht kein Zugriff mehr auf die Entwickler-Tools, sodass Website-Elemente nicht mehr überprüft werden können. Jegliche Tastaturkürzel und Menü- und Kontextmenüeinträge zum Öffnen der Entwickler-Tools oder der JavaScript-Konsole werden deaktiviert. Ist diese Option deaktiviert oder nicht konfiguriert, so können die Entwickler-Tools und die JavaScript-Konsole verwendet werden.</translation>
+<translation id="4445684791305970001">Deaktiviert die Entwickler-Tools und die JavaScript-Konsole. Wenn Sie diese Einstellung aktivieren, besteht kein Zugriff mehr auf die Entwickler-Tools, sodass Website-Elemente nicht mehr überprüft werden können. Jegliche Tastenkombinationen und Menü- und Kontextmenüeinträge zum Öffnen der Entwickler-Tools oder der JavaScript-Konsole werden deaktiviert. Ist diese Option deaktiviert oder nicht konfiguriert, so können die Entwickler-Tools und die JavaScript-Konsole verwendet werden.</translation>
 <translation id="9203071022800375458">Deaktiviert die Aufnahme von Screenshots.
 
-      Wenn die Richtlinie aktiviert ist, können keine Screenshots über Tastaturkürzel oder Erweiterungs-APIs aufgenommen werden.
+      Wenn die Richtlinie aktiviert ist, können keine Screenshots über Tastenkombinationen oder Erweiterungs-APIs aufgenommen werden.
 
       Ist die Richtlinie deaktiviert oder nicht konfiguriert, ist die Aufnahme von Screenshots möglich.</translation>
 <translation id="5697306356229823047">Gerätenutzer aufzeichnen</translation>
@@ -1213,7 +1213,7 @@ Diese Richtlinien dienen ausschließlich zur internen Verwendung in Chrome.</tra
 <translation id="1504431521196476721">Remote-Bestätigung</translation>
 <translation id="1881299719020653447">Web Store auf der Seite &quot;Neuer Tab&quot; und im App Launcher ausblenden</translation>
 <translation id="930930237275114205">Verzeichnis für <ph name="PRODUCT_FRAME_NAME"/>-Nutzerdaten festlegen</translation>
-<translation id="244317009688098048">Aktiviert Tastaturkürzel zur Umgehung der automatischen Anmeldung.
+<translation id="244317009688098048">Aktiviert Tastenkombination zur Umgehung der automatischen Anmeldung.
 
 Falls diese Richtlinie auf &quot;true&quot; gesetzt oder nicht festgelegt wird und bei einem gerätespezifischen lokalen Konto eine verzögerungsfreie automatische Anmeldung konfiguriert ist, dann erlaubt es <ph name="PRODUCT_OS_NAME"/>, mit dem Tastaturkürzel Strg+Alt+S die automatische Anmeldung zu umgehen und stattdessen den Anmeldebildschirm aufzurufen.
 
index 752ceb5..4fad985 100644 (file)
@@ -206,7 +206,7 @@ Käytännön arvot tulee määrittää millisekunteina. Arvoja voi valita välil
 <translation id="3765260570442823273">Käyttämättömän käyttökerran uloskirjausvaroituksen kesto</translation>
 <translation id="7302043767260300182">Ruudun lukituksen viive käytettäessä laitetta verkkovirralla</translation>
 <translation id="7331962793961469250">Kun asetus on True, Chrome Web Storen sovelluksien mainoksia ei näytetä Uusi välilehti -sivulla. Kun asetus on False tai sitä ei ole valittu, Chrome Web Storen sovelluksien mainoksia näytetään Uusi välilehti -sivulla.</translation>
-<translation id="7271085005502526897">Tuo aloitussivu oletusselaimesta ensimmäisellä käyttökerralla</translation>
+<translation id="7271085005502526897">Tuo saapumissivu oletusselaimesta ensimmäisellä käyttökerralla</translation>
 <translation id="6036523166753287175">Ota käyttöön palomuurin siirto etäisännästä</translation>
 <translation id="1096105751829466145">Oletushakupalvelu</translation>
 <translation id="7567380065339179813">Salli laajennukset näissä sivustoissa</translation>
index 20b3e71..9d96264 100644 (file)
       ध्यान दें: वर्तमान में, प्रवेश स्क्रीन के दिखाई देने या कियोस्क स्क्रीन के प्रगति में रहने के दौरान ही स्वचालित रीबूट सक्षम होते हैं. इसे भविष्य में बदला जा सकता है और इस बात पर ध्यान दिए बिना नीति हमेशा लागू होगी, कि क्या कोई विशेष प्रकार का सत्र प्रगति में है या नहीं.
 
       नीति मान सेकंड में निर्दिष्ट किया जाना चाहिए. मान कम से कम 3600 (एक घंटे) में क्लैंप होने चाहिए.</translation>
-<translation id="5304269353650269372">à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\87नपà¥\81à¤\9f à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿ à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95रतà¥\80 à¤¹à¥\88 à¤\9cिसà¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¬à¥\88à¤\9fरà¥\80 à¤ªà¥\89वर à¤ªà¤° à¤\9aलाà¤\8f à¤\9cानà¥\87 à¤ªà¤° à¤\8fà¤\95 à¤\9aà¥\87तावनà¥\80 à¤¸à¤\82वाद दिखाया जाता है.
+<translation id="5304269353650269372">à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\87नपà¥\81à¤\9f à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿ à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95रतà¥\80 à¤¹à¥\88 à¤\9cिसà¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¬à¥\88à¤\9fरà¥\80 à¤ªà¥\89वर à¤ªà¤° à¤\9aलाà¤\8f à¤\9cानà¥\87 à¤ªà¤° à¤\8fà¤\95 à¤\9aà¥\87तावनà¥\80 à¤¡à¥\89यलà¥\89à¤\97 दिखाया जाता है.
 
-          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤¸à¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b <ph name="PRODUCT_OS_NAME"/> à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8b à¤¯à¤¹ à¤\9aà¥\87तावनà¥\80 à¤¸à¤\82वाद ‍दिखाए कि प्रयोग में नहींता की कार्यवाही की जाने वाली है, उसके पहले ही यह नीति उस समयावधि को निर्दिष्ट करती है जिसमें उपयोगकर्ता को प्रयोग में नहीं रहना है
+          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤¸à¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b <ph name="PRODUCT_OS_NAME"/> à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8b à¤¯à¤¹ à¤\9aà¥\87तावनà¥\80 à¤¡à¥\89यलà¥\89à¤\97 ‍दिखाए कि प्रयोग में नहींता की कार्यवाही की जाने वाली है, उसके पहले ही यह नीति उस समयावधि को निर्दिष्ट करती है जिसमें उपयोगकर्ता को प्रयोग में नहीं रहना है
 
-          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤\85नसà¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b à¤\95à¥\8bà¤\88 à¤\9aà¥\87तावनà¥\80 à¤¸à¤\82वाद नहीं दिखाया जाता.
+          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤\85नसà¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b à¤\95à¥\8bà¤\88 à¤\9aà¥\87तावनà¥\80 à¤¡à¥\89यलà¥\89à¤\97 नहीं दिखाया जाता.
 
           नीति का मान मिलीसेकंड में निर्दिष्ट किया जाना चाहिए. मानों को प्रयोग में नहीं विलंब से कम या उसके बराबर रहने के लिए क्लैम्प किया जाता है.</translation>
 <translation id="7818131573217430250">प्रवेश स्क्रीन पर उच्च कंट्रास्ट मोड की डिफ़ॉल्ट स्थिति सेट करें</translation>
           यदि आप इस नीति को सेट करते हैं, तो उपयोगकर्ता स्क्रीन आवर्धक को सक्षम या अक्षम करके इसे अस्थायी रूप से ओवरराइट कर सकते हैं. हालांकि, उपयोगकर्ता की पसंद स्थायी नहीं होती है और प्रवेश स्क्रीन के पुन: दिखाई देने या उपयोगकर्ता द्वारा प्रवेश स्क्रीन पर एक मिनट तक प्रयोग में नहीं रहने पर डिफ़ॉल्ट पुनर्स्थापित हो जाता है.
 
           यदि नीति सेट किए बिना छोड़ दी जाती है, तो प्रवेश स्क्रीन के पहली बार दिखाई देने पर स्क्रीन आवर्धक अक्षम हो जाता है. उपयोगकर्ता किसी भी समय स्क्रीन आवर्धक को सक्षम या अक्षम कर सकते हैं और उपयोगकर्ताओं के बीच प्रवेश स्क्रीन पर इसकी स्थिति स्थायी हो जाती है.</translation>
-<translation id="5423001109873148185">यह à¤¨à¥\80ति à¤¸à¤\95à¥\8dषम à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤° à¤\96à¥\8bà¤\9c à¤\87à¤\82à¤\9cन à¤\95à¥\8b à¤µà¤°à¥\8dतमान à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤\86यात à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dâ\80\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤¸à¤\95à¥\8dषम à¤\95िया à¤\9cाता à¤¹à¥\88, à¤¤à¥\8b à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¸à¤\82वाद को भी प्रभावित करती है. यदि अक्षम किया जाता है, तो डिफ़ॉल्‍ट खोज इंजन आयात नहीं होता. यदि इसे सेट नहीं किया जाए, तो उपयोगकर्ता से आयात करने के संबंध में पूछा जा सकता है, या आयात करना स्‍वचालित रूप से हो सकता है.</translation>
+<translation id="5423001109873148185">यह à¤¨à¥\80ति à¤¸à¤\95à¥\8dषम à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤° à¤\96à¥\8bà¤\9c à¤\87à¤\82à¤\9cन à¤\95à¥\8b à¤µà¤°à¥\8dतमान à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤\86यात à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dâ\80\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤¸à¤\95à¥\8dषम à¤\95िया à¤\9cाता à¤¹à¥\88, à¤¤à¥\8b à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¡à¥\89यलà¥\89à¤\97 को भी प्रभावित करती है. यदि अक्षम किया जाता है, तो डिफ़ॉल्‍ट खोज इंजन आयात नहीं होता. यदि इसे सेट नहीं किया जाए, तो उपयोगकर्ता से आयात करने के संबंध में पूछा जा सकता है, या आयात करना स्‍वचालित रूप से हो सकता है.</translation>
 <translation id="3288595667065905535">चैनल रि‍लीज़ करें</translation>
 <translation id="2785954641789149745"><ph name="PRODUCT_NAME"/> की सुरक्षित ब्राउज़िंग सुविधा को सक्षम करती है और उपयोगकर्ताओं को इस सेटिंग को बदलने से रोकती है.
 
 <translation id="3381968327636295719">डिफ़ॉल्‍ट रूप से होस्‍ट ब्राउज़र का उपयोग करें</translation>
 <translation id="3627678165642179114">वर्तनी परीक्षण वेब सेवा को सक्षम या अक्षम करें</translation>
 <translation id="6520802717075138474">पहली बार चलाने पर डिफ़ॉल्‍ट ब्राउज़र से खोज इंजन आयात करें</translation>
-<translation id="4039085364173654945">यह à¤¨à¤¿à¤¯à¤\82तà¥\8dरित à¤\95रता à¤¹à¥\88 à¤\95ि à¤\95िसà¥\80 à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤¤à¥\83तà¥\80य-पà¤\95à¥\8dष à¤\89प-सामà¤\97à¥\8dरà¥\80 à¤\95à¥\8b à¤\95à¥\8bà¤\88 HTTP à¤®à¥\82ल à¤ªà¥\8dरमाणà¥\80à¤\95रण à¤¸à¤\82वाद à¤¬à¥\89à¤\95à¥\8dâ\80\8dस à¤ªà¥\89प-à¤\85प à¤\95रनà¥\87 à¤\95à¥\80 à¤\85नà¥\81मति à¤¹à¥\88 à¤¯à¤¾ à¤¨à¤¹à¥\80à¤\82. à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dâ\80\8dयत: à¤¯à¤¹ à¤«à¤¼à¤¿à¤¶à¤¿à¤\82à¤\97 à¤¸à¥\87 à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤\85à¤\95à¥\8dषम à¤¹à¥\8bता à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤\87स à¤¨à¥\80ति à¤\95à¥\8b à¤¸à¥\87à¤\9f à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cाता à¤¹à¥\88, à¤¤à¥\8b, à¤¯à¤¹ à¤\85à¤\95à¥\8dषम à¤¹à¥\8bतà¥\80 à¤¹à¥\88 à¤\94र à¤¤à¥\83तà¥\80य-पà¤\95à¥\8dष à¤\89प-सामà¤\97à¥\8dरà¥\80 à¤\95à¥\8b, HTTP à¤®à¥\82ल à¤ªà¥\8dरमाणà¥\80à¤\95रण à¤¸à¤\82वाद बॉक्‍स पॉप अप करने की अनुमति नहीं होगी.</translation>
+<translation id="4039085364173654945">यह à¤¨à¤¿à¤¯à¤\82तà¥\8dरित à¤\95रता à¤¹à¥\88 à¤\95ि à¤\95िसà¥\80 à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤¤à¥\83तà¥\80य-पà¤\95à¥\8dष à¤\89प-सामà¤\97à¥\8dरà¥\80 à¤\95à¥\8b à¤\95à¥\8bà¤\88 HTTP à¤®à¥\82ल à¤ªà¥\8dरमाणà¥\80à¤\95रण à¤¡à¥\89यलà¥\89à¤\97 à¤¬à¥\89à¤\95à¥\8dâ\80\8dस à¤ªà¥\89प-à¤\85प à¤\95रनà¥\87 à¤\95à¥\80 à¤\85नà¥\81मति à¤¹à¥\88 à¤¯à¤¾ à¤¨à¤¹à¥\80à¤\82. à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dâ\80\8dयत: à¤¯à¤¹ à¤«à¤¼à¤¿à¤¶à¤¿à¤\82à¤\97 à¤¸à¥\87 à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤\85à¤\95à¥\8dषम à¤¹à¥\8bता à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤\87स à¤¨à¥\80ति à¤\95à¥\8b à¤¸à¥\87à¤\9f à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cाता à¤¹à¥\88, à¤¤à¥\8b, à¤¯à¤¹ à¤\85à¤\95à¥\8dषम à¤¹à¥\8bतà¥\80 à¤¹à¥\88 à¤\94र à¤¤à¥\83तà¥\80य-पà¤\95à¥\8dष à¤\89प-सामà¤\97à¥\8dरà¥\80 à¤\95à¥\8b, HTTP à¤®à¥\82ल à¤ªà¥\8dरमाणà¥\80à¤\95रण à¤¡à¥\89यलà¥\89à¤\97 बॉक्‍स पॉप अप करने की अनुमति नहीं होगी.</translation>
 <translation id="4946368175977216944">Chrome के प्रारंभ होने पर उसमें लागू होने वाले फ़्लैग निर्दिष्ट करती है. निर्दिष्ट फ़्लैग Chrome के प्रारंभ होने से भी पहले लागू कर दिए जाते हैं, यहां तक साइन-इन स्क्रीन के लिए भी.</translation>
 <translation id="7447786363267535722">पासवर्ड को सहेजना और <ph name="PRODUCT_NAME"/> में सहेजे गए पासवर्ड का उपयोग करना सक्षम करती है. यदि आप इस सेटिंग को सक्षम करते हैं, तो उपयोगकर्ता <ph name="PRODUCT_NAME"/> पासवर्ड याद रख सकते हैं और अगली बार साइट में प्रवेश करने पर स्‍वत: प्रदान कर सकते हैं. यदि आप इस सेटिंग को अक्षम करते हैं, तो उपयोगकर्ता पासवर्ड नहीं सहेज सकते हैं या पहले से सहेजे गए पासवर्ड का उपयोग नहीं कर सकते हैं. यदि आप इस सेटिंग को सक्षम या अक्षम करते हैं, तो, उपयोगकर्ता <ph name="PRODUCT_NAME"/> में इस सेटिंग को परिवर्तित या ओवरराइड नहीं कर सकते. यदि इस नीति को सेट नहीं किया जाता है, तो यह अक्षम हो जाएगा लेकिन उपयोगकर्ता इसे बदल सकेंगे.</translation>
 <translation id="1138294736309071213">यह नीति केवल रिटेल मोड में सक्रिय है.
 <translation id="6417861582779909667">आपको ऐसे url प्रतिमानों की सूची सेट करने देती है, जो उन साइटों को निर्दिष्ट करते हैं जिन्‍हें कुकी सेट करने की अनुमति नहीं है. यदि इस नीति को सेट किए बिना छोड़ दिया जाता है, तो सभी साइटों के लिए वैश्विक डिफ़ॉल्‍ट मान का उपयोग 'DefaultCookiesSetting' से किया जाएगा, यदि इसे सेट किया गया हो, या अन्‍यथा इसका उपयोग उपयोगकर्ता के व्‍यक्तिगत कॉन्‍फ़िगरेशन से किया जाएगा.</translation>
 <translation id="5776485039795852974">साइट द्वारा प्रत्येक बार डेस्कटॉप सूचना प्रदर्शित करने पर पूछें</translation>
 <translation id="5047604665028708335">सामग्री पैक से बाहर की साइटों की एक्‍सेस की अनुमति दें</translation>
-<translation id="5052081091120171147">यह à¤¨à¥\80ति, à¤¸à¤\95à¥\8dषम à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤¬à¥\8dराà¤\89à¤\9c़िà¤\82à¤\97 à¤\87तिहास à¤\95à¥\8b à¤µà¤°à¥\8dतमान à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤\86यात à¤\95िà¤\8f à¤\9cानà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dâ\80\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¸à¤\95à¥\8dषम à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤°, à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¸à¤\82वाद को भी प्रभावित करती है. अक्षम किए जाने पर, कोई ब्राउज़िंग इतिहास आयात नहीं किया जाता. यदि इसे सेट नहीं किया जाता है, तो उपयोगकर्ता से आयात करने के लिए पूछा जा सकता है, या स्‍वत: आयात हो सकता है.</translation>
+<translation id="5052081091120171147">यह à¤¨à¥\80ति, à¤¸à¤\95à¥\8dषम à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤¬à¥\8dराà¤\89à¤\9c़िà¤\82à¤\97 à¤\87तिहास à¤\95à¥\8b à¤µà¤°à¥\8dतमान à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤\86यात à¤\95िà¤\8f à¤\9cानà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dâ\80\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¸à¤\95à¥\8dषम à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤°, à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¡à¥\89यलà¥\89à¤\97 को भी प्रभावित करती है. अक्षम किए जाने पर, कोई ब्राउज़िंग इतिहास आयात नहीं किया जाता. यदि इसे सेट नहीं किया जाता है, तो उपयोगकर्ता से आयात करने के लिए पूछा जा सकता है, या स्‍वत: आयात हो सकता है.</translation>
 <translation id="6786747875388722282">एक्‍सटेंशन</translation>
 <translation id="7132877481099023201">ऐसे URL जिन्हें संकेत किए बिना ही वीडियो कैप्चर उपकरणों की एक्सेस दी जाएगी</translation>
 <translation id="8947415621777543415">उपकरण स्थान की रिपोर्ट करें</translation>
 <translation id="6899705656741990703">प्रॉक्सी सेटिंग का अपने आप पता लगाएं</translation>
 <translation id="4639407427807680016">कालीसूची से छूट के लिए स्थानीय संदेश सेवा होस्ट के नाम</translation>
 <translation id="8382184662529825177">उपकरण के लिए सामग्री सुरक्षा हेतु दूरस्थ अनुप्रमाणन के उपयोग को सक्षम करें</translation>
-<translation id="7003334574344702284">यह à¤¨à¥\80ति à¤¸à¤\95à¥\8dषम à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤¸à¤¹à¥\87à¤\9cà¥\87 à¤\97à¤\8f à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\8b à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤\86यात à¤¹à¥\8bनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dâ\80\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¸à¤\95à¥\8dषम à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤°, à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¸à¤\82वाद को भी प्रभावित करती है. अक्षम किए जाने पर, सहेजे गए पासवर्ड आयात नहीं किए जाते. यदि इसे सेट नहीं किया जाता है, तो उपयोगकर्ता से आयात करने के लिए पूछा जा सकता है, या आयात स्वतः हो सकता है.</translation>
+<translation id="7003334574344702284">यह à¤¨à¥\80ति à¤¸à¤\95à¥\8dषम à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤¸à¤¹à¥\87à¤\9cà¥\87 à¤\97à¤\8f à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\8b à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤\86यात à¤¹à¥\8bनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dâ\80\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¸à¤\95à¥\8dषम à¤\95िà¤\8f à¤\9cानà¥\87 à¤ªà¤°, à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¡à¥\89यलà¥\89à¤\97 को भी प्रभावित करती है. अक्षम किए जाने पर, सहेजे गए पासवर्ड आयात नहीं किए जाते. यदि इसे सेट नहीं किया जाता है, तो उपयोगकर्ता से आयात करने के लिए पूछा जा सकता है, या आयात स्वतः हो सकता है.</translation>
 <translation id="6258193603492867656">यह निर्दिष्‍ट करता है कि जनरेट किए गए Kerberos SPN में गैर-मानक पोर्ट शामिल होना चाहिए. यदि आपने सेटिंग सक्षम की है, और गैर-मानक पोर्ट (अर्थात्, 80 या 443 के अलावा) दर्ज किया है, तो इसे जनरेट किए गए Kerberos SPN में शामिल किया जाएगा. यदि आप यह सेटिंग अक्षम करते हैं या सेट किए बिना छोड़ देते हैं, तो जनरेट किया गया Kerberos SPN किसी भी स्‍थिति में पोर्ट को शामिल नहीं करेगा.</translation>
 <translation id="3236046242843493070">वे URL आकार, जिनसे एक्सटेंशन, ऐप्स , और उपयोगकर्ता स्क्रिप्ट को इंस्टॉल करने की अनुमति मिलती है</translation>
 <translation id="2498238926436517902">शेल्फ़ को हमेशा स्वत:-छिपाएं</translation>
       इस सेटिंग का उपयोग परीक्षण के लिए TLS डोमेन-आबद्ध प्रमाणपत्र एक्सटेंशन को सक्षम करने में किया जाता है.  भविष्य में इस प्रयोगात्मक सेटिंग को निकाल दिया जाएगा.</translation>
 <translation id="5770738360657678870">डेव चैनल (अस्‍थि‍र हो सकता है)</translation>
 <translation id="2959898425599642200">प्रॉक्सी बायपास नियम</translation>
-<translation id="228659285074633994">à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\87नपà¥\81à¤\9f à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿ à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95रतà¥\80 à¤¹à¥\88 à¤\9cिसà¤\95à¥\87 à¤¬à¤¾à¤¦ AC à¤ªà¥\89वर à¤ªà¤° à¤\9aलाà¤\8f à¤\9cानà¥\87 à¤ªà¤° à¤\8fà¤\95 à¤\9aà¥\87तावनà¥\80 à¤¸à¤\82वाद दिखाया जाता है.
+<translation id="228659285074633994">à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\87नपà¥\81à¤\9f à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿ à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95रतà¥\80 à¤¹à¥\88 à¤\9cिसà¤\95à¥\87 à¤¬à¤¾à¤¦ AC à¤ªà¥\89वर à¤ªà¤° à¤\9aलाà¤\8f à¤\9cानà¥\87 à¤ªà¤° à¤\8fà¤\95 à¤\9aà¥\87तावनà¥\80 à¤¡à¥\89यलà¥\89à¤\97 दिखाया जाता है.
 
-          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤¸à¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b <ph name="PRODUCT_OS_NAME"/> à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8b à¤¯à¤¹ à¤\9aà¥\87तावनà¥\80 à¤¸à¤\82वाद ‍दिखाए कि प्रयोग में नहींता की कार्यवाही की जाने वाली है, उसके पहले ही यह नीति उस समयावधि को निर्दिष्ट करती है जिसमें उपयोगकर्ता को प्रयोग में नहीं रहना है.
+          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤¸à¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b <ph name="PRODUCT_OS_NAME"/> à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8b à¤¯à¤¹ à¤\9aà¥\87तावनà¥\80 à¤¡à¥\89यलà¥\89à¤\97 ‍दिखाए कि प्रयोग में नहींता की कार्यवाही की जाने वाली है, उसके पहले ही यह नीति उस समयावधि को निर्दिष्ट करती है जिसमें उपयोगकर्ता को प्रयोग में नहीं रहना है.
 
-          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤\85नसà¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b à¤\95à¥\8bà¤\88 à¤\9aà¥\87तावनà¥\80 à¤¸à¤\82वाद नहीं दिखाया जाता.
+          à¤\9cब à¤¯à¤¹ à¤¨à¥\80ति à¤\85नसà¥\87à¤\9f à¤¹à¥\8bतà¥\80 à¤¹à¥\88, à¤¤à¥\8b à¤\95à¥\8bà¤\88 à¤\9aà¥\87तावनà¥\80 à¤¡à¥\89यलà¥\89à¤\97 नहीं दिखाया जाता.
 
           नीति का मान मिलीसेकंड में निर्दिष्ट किया जाना चाहिए. मानों को प्रयोग में नहीं विलंब से कम या उसके बराबर रहने के लिए क्लैम्प किया जाता है.</translation>
 <translation id="1327466551276625742">ऑफ़लाइन होने पर नेटवर्क कॉन्फ़िगरेशन संकेत को सक्षम करें</translation>
       यदि आप यह सेटिंग सक्षम करते हैं, तो Google खोज में सुरक्षित खोज हमेशा सक्रिय होती है.
 
       यदि आप यह सेटिंग अक्षम करते हैं या कोई मान सेट नहीं करते हैं, तो Google खोज में सुरक्षित खोज को लागू नहीं किया जाता.</translation>
-<translation id="6017568866726630990">पà¥\8dरिà¤\82à¤\9f à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤\95à¥\87 à¤¬à¤\9cाय à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरिà¤\82à¤\9f à¤¸à¤\82वाद दिखाएं.
+<translation id="6017568866726630990">पà¥\8dरिà¤\82à¤\9f à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤\95à¥\87 à¤¬à¤\9cाय à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरिà¤\82à¤\9f à¤¡à¥\89यलà¥\89à¤\97 दिखाएं.
 
-      à¤\9cब à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤\95à¥\8dषम à¤¹à¥\8b, à¤¤à¥\8b à¤\95िसà¥\80 à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¦à¥\8dवारा à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤ªà¥\8dरिà¤\82à¤\9f à¤\95िà¤\8f à¤\9cानà¥\87 à¤\95ा à¤\85नà¥\81रà¥\8bध à¤\95रनà¥\87 à¤ªà¤°, <ph name="PRODUCT_NAME"/> à¤\85à¤\82तरà¥\8dनिहित à¤ªà¥\8dरिà¤\82à¤\9f à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤\95à¥\87 à¤¬à¤\9cाय à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरिà¤\82à¤\9f à¤¸à¤\82वाद खोलेगा.
+      à¤\9cब à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤\95à¥\8dषम à¤¹à¥\8b, à¤¤à¥\8b à¤\95िसà¥\80 à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¦à¥\8dवारा à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤ªà¥\8dरिà¤\82à¤\9f à¤\95िà¤\8f à¤\9cानà¥\87 à¤\95ा à¤\85नà¥\81रà¥\8bध à¤\95रनà¥\87 à¤ªà¤°, <ph name="PRODUCT_NAME"/> à¤\85à¤\82तरà¥\8dनिहित à¤ªà¥\8dरिà¤\82à¤\9f à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤\95à¥\87 à¤¬à¤\9cाय à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरिà¤\82à¤\9f à¤¡à¥\89यलà¥\89à¤\97 खोलेगा.
 
       यदि यह नीति सेट नहीं की जाती या गलत पर सेट कर दी जाती है, तो प्रिंट आदेश प्रिंट पूर्वावलोकन स्क्रीन ट्रिगर कर देते हैं.</translation>
 <translation id="7933141401888114454">पर्यवेक्षित उपयोगकर्ताओं का बनाया जाना सक्षम करती है</translation>
           यहां चार प्रकार की कार्यवाहियां दी गई हैं:
           * |ScreenDim| द्वारा निर्दिष्ट किए गए समय के लिए उपयोगकर्ता के निष्क्रिय रहने पर स्क्रीन का प्रकाश कम हो जाएगा.
           * |ScreenOff| द्वारा निर्दिष्ट किए गए समय के लिए उपयोगकर्ता के निष्क्रिय रहने पर स्क्रीन बंद हो जाएगी.
-          * |IdleWarning| à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95िà¤\8f à¤\97à¤\8f à¤¸à¤®à¤¯ à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\87 à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरिय à¤°à¤¹à¤¨à¥\87 à¤ªà¤° à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8b à¤¯à¤¹ à¤¬à¤¤à¤¾à¤¤à¤¾ à¤¹à¥\81à¤\86 à¤\9aà¥\87तावनà¥\80 à¤¸à¤\82वाद दिखाई देगा, कि निष्क्रिय कार्यवाही की जाने वाली है.
+          * |IdleWarning| à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95िà¤\8f à¤\97à¤\8f à¤¸à¤®à¤¯ à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\87 à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरिय à¤°à¤¹à¤¨à¥\87 à¤ªà¤° à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8b à¤¯à¤¹ à¤¬à¤¤à¤¾à¤¤à¤¾ à¤¹à¥\81à¤\86 à¤\9aà¥\87तावनà¥\80 à¤¡à¥\89यलà¥\89à¤\97 दिखाई देगा, कि निष्क्रिय कार्यवाही की जाने वाली है.
           * |Idle| द्वारा निर्दिष्ट किए गए समय के लिए उपयोगकर्ता के निष्क्रिय रहने पर |IdleAction| द्वारा निर्दिष्ट की गई कार्यवाही की जाएगी.
 
           उपरोक्त प्रत्येक कार्यवाही के लिए, विलंब को मिलीसेकंड में निर्दिष्ट किया जाना चाहिए, और संबंधित कार्यवाही प्रारंभ करने के लिए मान का शून्य से अधिक पर सेट होना आवश्यक है. यदि विलंब शू्न्य पर सेट हो, तो <ph name="PRODUCT_OS_NAME"/> संबंधित कार्यवाही नहीं होगी.
 <translation id="5893553533827140852">यदि यह सेटिंग सक्षम है, तब gnubby प्रमाणन अनुरोध पूरे दूरस्थ होस्ट कनेक्शन पर प्रॉक्सी किया जाएगा.
 
           यदि यह सेटिंग अक्षम है या कॉन्फ़िगर नहीं है, तो gnubby प्रमाणन अनुरोध प्रॉक्सी नहीं किए जाएंगे.</translation>
-<translation id="187819629719252111"><ph name="PRODUCT_NAME"/> à¤\95à¥\8b à¤«à¤¾à¤\87ल à¤\9aयन à¤¸à¤\82वाद à¤ªà¥\8dरदरà¥\8dशित à¤\95रनà¥\87 à¤\95à¥\80 à¤\85नà¥\81मति à¤¦à¥\87à¤\95र à¤®à¤¶à¥\80न à¤ªà¤° à¤¸à¥\8dथानà¥\80य à¤«à¤¼à¤¾à¤\87ल à¤ªà¤° à¤ªà¤¹à¥\81à¤\82à¤\9a à¤¦à¥\87तà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤\86प à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤\95à¥\8dषम à¤\95रतà¥\87 à¤¹à¥\88à¤\82, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤°à¥\82प à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\9aयन à¤¸à¤\82वाद à¤\96à¥\8bल à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82. à¤¯à¤¦à¤¿ à¤\86प à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤\85à¤\95à¥\8dषम à¤\95रतà¥\87 à¤¹à¥\88à¤\82, à¤¤à¥\8b à¤\9cब à¤­à¥\80 à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8bà¤\88 à¤\90सा à¤\95ारà¥\8dय à¤\95रता à¤¹à¥\88, à¤\9cिसà¤\95à¥\87 à¤\95ारण à¥\9eाà¤\87ल à¤\9aयन à¤¸à¤\82वाद à¤ªà¥\8dरà¤\95à¤\9f à¤¹à¥\8bता à¤¹à¥\88 (à¤\9cà¥\88सà¥\87 à¤¬à¥\81à¤\95मारà¥\8dà¤\95 à¤\86यात à¤\95रना, à¤«à¤¼à¤¾à¤\87ल à¤\85पलà¥\8bड à¤\95रना, à¤²à¤¿à¤\82à¤\95 à¤¸à¤¹à¥\87à¤\9cना à¤\86दि) à¤¤à¥\8b à¤\87सà¤\95à¥\87 à¤¬à¤\9cाय à¤\8fà¤\95 à¤¸à¤\82दà¥\87श à¤ªà¥\8dरदरà¥\8dशित à¤¹à¥\8bता à¤¹à¥\88 à¤\94र à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\9aयन à¤¸à¤\82वाद à¤ªà¤° à¤°à¤¦à¥\8dद à¤\95रà¥\87à¤\82 à¤\95à¥\8dलिà¤\95 à¤\95रनà¥\87 à¤\95à¥\80 à¤\85पà¥\87à¤\95à¥\8dषा à¤\95à¥\80 à¤\9cातà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¥\87à¤\9f à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤°à¥\82प à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\9aयन à¤¸à¤\82वाद खोल सकते हैं.</translation>
+<translation id="187819629719252111"><ph name="PRODUCT_NAME"/> à¤\95à¥\8b à¤«à¤¾à¤\87ल à¤\9aयन à¤¡à¥\89यलà¥\89à¤\97 à¤ªà¥\8dरदरà¥\8dशित à¤\95रनà¥\87 à¤\95à¥\80 à¤\85नà¥\81मति à¤¦à¥\87à¤\95र à¤®à¤¶à¥\80न à¤ªà¤° à¤¸à¥\8dथानà¥\80य à¤«à¤¼à¤¾à¤\87ल à¤ªà¤° à¤ªà¤¹à¥\81à¤\82à¤\9a à¤¦à¥\87तà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤\86प à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤\95à¥\8dषम à¤\95रतà¥\87 à¤¹à¥\88à¤\82, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤°à¥\82प à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\9aयन à¤¡à¥\89यलà¥\89à¤\97 à¤\96à¥\8bल à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82. à¤¯à¤¦à¤¿ à¤\86प à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤\85à¤\95à¥\8dषम à¤\95रतà¥\87 à¤¹à¥\88à¤\82, à¤¤à¥\8b à¤\9cब à¤­à¥\80 à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\8bà¤\88 à¤\90सा à¤\95ारà¥\8dय à¤\95रता à¤¹à¥\88, à¤\9cिसà¤\95à¥\87 à¤\95ारण à¥\9eाà¤\87ल à¤\9aयन à¤¡à¥\89यलà¥\89à¤\97 à¤ªà¥\8dरà¤\95à¤\9f à¤¹à¥\8bता à¤¹à¥\88 (à¤\9cà¥\88सà¥\87 à¤¬à¥\81à¤\95मारà¥\8dà¤\95 à¤\86यात à¤\95रना, à¤«à¤¼à¤¾à¤\87ल à¤\85पलà¥\8bड à¤\95रना, à¤²à¤¿à¤\82à¤\95 à¤¸à¤¹à¥\87à¤\9cना à¤\86दि) à¤¤à¥\8b à¤\87सà¤\95à¥\87 à¤¬à¤\9cाय à¤\8fà¤\95 à¤¸à¤\82दà¥\87श à¤ªà¥\8dरदरà¥\8dशित à¤¹à¥\8bता à¤¹à¥\88 à¤\94र à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\9aयन à¤¡à¥\89यलà¥\89à¤\97 à¤ªà¤° à¤°à¤¦à¥\8dद à¤\95रà¥\87à¤\82 à¤\95à¥\8dलिà¤\95 à¤\95रनà¥\87 à¤\95à¥\80 à¤\85पà¥\87à¤\95à¥\8dषा à¤\95à¥\80 à¤\9cातà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤¯à¤¹ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¥\87à¤\9f à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤°à¥\82प à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\9aयन à¤¡à¥\89यलà¥\89à¤\97 खोल सकते हैं.</translation>
 <translation id="4507081891926866240">उन URL आकारों की सूची कस्‍टमाइज़ करती है जिसे हमेशा <ph name="PRODUCT_FRAME_NAME"/> द्वारा रेंडर किया जाना चाहिए.
 
           यदि यह नीति सेट नहीं की जाती है तो सभी साइटों के लिए डिफ़ाल्‍ट रेंडरर का उपयोग 'ChromeFrameRendererSettings' नीति द्वारा निर्दिष्ट किए अनुसार किया जाएगा.
 
           यदि यह नीति सेट किए बिना छोड़ दी जाती है, तो सभी साइटों के लिए 'DefaultJavaScriptSetting' नीति के सेट होने पर इससे, या अन्‍यथा उपयोगकर्ता के व्‍यक्तिगत कॉन्‍फ़‍िगरेशन से वैश्विक डिफ़ॉल्‍ट मान का उपयोग किया जाएगा.</translation>
 <translation id="2757054304033424106">एक्सटेंशन/ऐप्स  के ऐसे प्रकार जिन्हें इंस्टॉल किए जाने की अनुमति है</translation>
-<translation id="7053678646221257043">यह à¤¨à¥\80ति à¤¸à¤\95à¥\8dषम à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤µà¤°à¥\8dतमान à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤¬à¥\81à¤\95मारà¥\8dà¤\95 à¤\86यातित à¤\95िà¤\8f à¤\9cानà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤¸à¤\95à¥\8dषम à¤¹à¥\88, à¤¤à¥\8b à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¸à¤\82वाद को भी प्रभावित कर सकती है.
+<translation id="7053678646221257043">यह à¤¨à¥\80ति à¤¸à¤\95à¥\8dषम à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤µà¤°à¥\8dतमान à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dâ\80\8dà¤\9f à¤¬à¥\8dराà¤\89à¤\9c़र à¤¸à¥\87 à¤¬à¥\81à¤\95मारà¥\8dà¤\95 à¤\86यातित à¤\95िà¤\8f à¤\9cानà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¬à¤¾à¤§à¥\8dय à¤\95रतà¥\80 à¤¹à¥\88. à¤¯à¤¦à¤¿ à¤¸à¤\95à¥\8dषम à¤¹à¥\88, à¤¤à¥\8b à¤¯à¤¹ à¤¨à¥\80ति à¤\86यात à¤¡à¥\89यलà¥\89à¤\97 को भी प्रभावित कर सकती है.
 
       यदि अक्षम है, तो कोई बुकमार्क आयात नहीं किया जाता है.
 
 
           यदि यह नीति सेट किए बिना छोड़ दी जाती है तो या तो 'DefaultPopupsSetting' के सेट होने पर इससे सभी साइटों के लिए वैश्विक डिफ़ॉल्ट मान का उपयोग किया जाएगा, या अन्‍यथा उपयोगकर्ता के व्‍यक्तिगत कॉन्फ़िगरेशन का उपयोग किया जाएगा.</translation>
 <translation id="5645779841392247734">इन साइटों पर कुकी की अनुमति दें</translation>
-<translation id="4043912146394966243"> OS अपडेट के लिए अनुमति प्राप्त कनेक्शन के प्रकार. OS अपडेट अपने आकार के कारण संभावित रूप से कनेक्शन पर अत्यधिक भार डालते हैं और इसके कारण अतिरिक्त शुल्क लग सकते हैं. इसीलिए, उन्हें महंगे माने जाने वाले कनेक्शन प्रकारों जैसे WiMax, Bluetooth और कभी-कभी सेल्युलर के लिए डिफ़ॉल्ट रूप से सक्षम नहीं किया जाता है.
+<translation id="4043912146394966243"> OS अपडेट के लिए अनुमति प्राप्त कनेक्शन के प्रकार. OS अपडेट अपने आकार के कारण संभावित रूप से कनेक्शन पर अत्यधिक भार डालते हैं और इसके कारण अतिरिक्त शुल्क लग सकते हैं. इसीलिए, उन्हें महंगे माने जाने वाले कनेक्शन प्रकारों जैसे WiMax, ब्लूटूथ और कभी-कभी सेल्युलर के लिए डिफ़ॉल्ट रूप से सक्षम नहीं किया जाता है.
 
       मान्यता प्राप्त कनेक्शन प्रकार पहचानकर्ता हैं &quot;इथरनेट&quot;, &quot;wifi&quot;, &quot;wimax&quot;, &quot;bluetooth&quot; और &quot;सेल्युलर&quot;.</translation>
 <translation id="6652197835259177259">स्थानीय रूप से प्रबंधित उपयोगकर्ताओं की सेटिंग</translation>
       निर्दिष्ट नहीं होने पर, विविधता सीड URL में बदलाव नहीं करेगी.</translation>
 <translation id="7049373494483449255">प्रिंट के लिए <ph name="CLOUD_PRINT_NAME"/> में दस्‍तावेज़ सबमिट करने हेतु <ph name="PRODUCT_NAME"/> को सक्षम करता है. ध्‍यान दें: यह केवल <ph name="PRODUCT_NAME"/> में <ph name="CLOUD_PRINT_NAME"/> समर्थन को प्रभावित करता है. यह उपयोगकर्ताओं को वेबसाइटों पर प्रिंट कार्य सबमिट करने से नहीं रोकता है.
 
-      à¤¯à¤¦à¤¿ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤\95à¥\8dषम à¤¹à¥\88 à¤¯à¤¾ à¤\95à¥\89नà¥\8dâ\80\8dफ़िà¤\97र à¤¨à¤¹à¥\80à¤\82 à¤\95à¥\80 à¤\97à¤\88 à¤¹à¥\88, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता <ph name="PRODUCT_NAME"/> à¤ªà¥\8dरिà¤\82à¤\9f à¤¸à¤\82वाद से <ph name="CLOUD_PRINT_NAME"/> में प्रिंट कर सकता है.
+      à¤¯à¤¦à¤¿ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤¸à¤\95à¥\8dषम à¤¹à¥\88 à¤¯à¤¾ à¤\95à¥\89नà¥\8dâ\80\8dफ़िà¤\97र à¤¨à¤¹à¥\80à¤\82 à¤\95à¥\80 à¤\97à¤\88 à¤¹à¥\88, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता <ph name="PRODUCT_NAME"/> à¤ªà¥\8dरिà¤\82à¤\9f à¤¡à¥\89यलà¥\89à¤\97 से <ph name="CLOUD_PRINT_NAME"/> में प्रिंट कर सकता है.
 
-      à¤¯à¤¦à¤¿ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤\85à¤\95à¥\8dषम à¤¹à¥\88, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता <ph name="PRODUCT_NAME"/> à¤ªà¥\8dरिà¤\82à¤\9f à¤¸à¤\82वाद से <ph name="CLOUD_PRINT_NAME"/> में प्रिंट नहीं कर सकता</translation>
+      à¤¯à¤¦à¤¿ à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤\85à¤\95à¥\8dषम à¤¹à¥\88, à¤¤à¥\8b à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता <ph name="PRODUCT_NAME"/> à¤ªà¥\8dरिà¤\82à¤\9f à¤¡à¥\89यलà¥\89à¤\97 से <ph name="CLOUD_PRINT_NAME"/> में प्रिंट नहीं कर सकता</translation>
 <translation id="4088589230932595924">गुप्त मोड बाध्‍य किया गया</translation>
 <translation id="5862253018042179045">प्रवेश स्क्रीन पर बोले गए फ़ीडबैक पहुंच-योग्यता सुविधा की डिफ़ॉल्ट स्थिति सेट करें.
 
index 8291a71..b703054 100644 (file)
           Nilai kebijakan harus ditentukan dalam milidetik. Nilai dibatasi agar kurang dari atau sama dengan penundaan menganggur.</translation>
 <translation id="1327466551276625742">Aktifkan permintaan konfigurasi jaringan saat offline</translation>
 <translation id="7937766917976512374">Izinkan atau tolak penangkapan video</translation>
-<translation id="427632463972968153">Menentukan parameter yang digunakan saat melakukan penelusuran gambar dengan POST. Berisi pasangan nama/nilai yang dipisahkan koma. Jika nilai adalah parameter template, seperti {imageThumbnail} contoh di atas, akan diganti dengan data thumbnail gambar nyata.
+<translation id="427632463972968153">Menentukan parameter yang digunakan saat melakukan penelusuran gambar dengan POST. Berisi pasangan nama/nilai yang dipisahkan koma. Jika nilai adalah parameter template, seperti {imageGambar kecil} contoh di atas, akan diganti dengan data thumbnail gambar nyata.
 
           Kebijakan ini bersifat opsional. Jika tidak disetel, permintaan penelusuran akan dikirim menggunakan metode GET.
 
index 2727846..67b37bb 100644 (file)
@@ -793,7 +793,7 @@ ExtensionInstallForcelist ಮೂಲಕ ಸ್ಥಾಪನೆಯನ್ನು ಆ
 
             ಈ ನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರನ್ನು ನಿಷ್ಫಲವಾಗುವುದರಿಂದ ವೀಡಿಯೊ ಚಟುವಟಿಕೆಯನ್ನು ತಡೆಯುವುದಿಲ್ಲ.</translation>
 <translation id="3965339130942650562">ತಟಸ್ಥ ಬಳಕೆದಾರ ಲಾಗ್-ಔಟ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವವರೆಗೆ ಅವಧಿ ಮುಗಿದಿದೆ</translation>
-<translation id="5814301096961727113">ಲಾà²\97ಿನà³\8d à²ªà²°à²¦à³\86ಯಲà³\8dಲಿ à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯ ಡೀಫಾಲ್ಟ್ ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸಿ</translation>
+<translation id="5814301096961727113">ಲಾà²\97ಿನà³\8d à²ªà²°à²¦à³\86ಯಲà³\8dಲಿ à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯ ಡೀಫಾಲ್ಟ್ ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸಿ</translation>
 <translation id="1950814444940346204">ಅಸಮ್ಮತಿಸಲಾದ ವೆಬ್‌ ಪ್ಲ್ಯಾಟ್‌ಫಾರ್ಮ್‌ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="9084985621503260744">ಪವರ್ ನಿರ್ವಹಣೆಯ ಮೇಲೆ ವೀಡಿಯೊ ಚಟುವಟಿಕೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆಯೇ ಎಂಬುದನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ</translation>
 <translation id="7091198954851103976">ಯಾವಾಗಲೂ ಪ್ರಮಾಣೀಕರಣದ ಅಗತ್ಯವಿರುವ ಪ್ಲಗಿನ್‌ಗಳನ್ನು ಚಾಲನೆ ಮಾಡುತ್ತದೆ</translation>
@@ -827,7 +827,7 @@ ExtensionInstallForcelist ಮೂಲಕ ಸ್ಥಾಪನೆಯನ್ನು ಆ
           ಈ ನೀತಿಯನ್ನು ನೀವು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರಿಗೆ ಅದನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
 
           ಒಂದು ವೇಳೆ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಬಿಟ್ಟರೆ, ದೊಡ್ಡ ಕರ್ಸರ್ ಅನ್ನು ಪ್ರಾರಂಭದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದು ಆದರೆ ಬಳಕೆದಾರರಿಂದ ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಬಹುದಾಗಿದೆ.</translation>
-<translation id="2633084400146331575">ಮಾತನಾಡà³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
+<translation id="2633084400146331575">ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="687046793986382807">ಈ ನೀತಿಯನ್ನು <ph name="PRODUCT_NAME"/> ಆವೃತ್ತಿ 35 ರ ರೂಪದಲ್ಲಿ ಹಿಂತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ.
 
       ಆಯ್ಕೆಯ ಮೌಲ್ಯವನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಮೆಮೊರಿ ಮಾಹಿತಿಯನ್ನು ಹೇಗೋ ಪುಟಕ್ಕೆ ವರದಿ ಮಾಡಲಾಗುತ್ತದೆ, ಆದರೆ ವರದಿ ಮಾಡಲಾಗಿರುವ ಗಾತ್ರಗಳನ್ನು ಕ್ವಾಂಟೀಕರಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ನವೀಕರಣಗಳ ದರವನ್ನು ಭದ್ರತಾ ಕಾರಣಗಳಿಗಾಗಿ ಮಿತಗೊಳಿಸಲಾಗುತ್ತದೆ. ನೈಜ-ಸಮಯದ ನಿಖರ ಡೇಟಾವನ್ನು ಪಡೆದುಕೊಳ್ಳಲು,
@@ -1234,15 +1234,15 @@ ExtensionInstallForcelist ಮೂಲಕ ಸ್ಥಾಪನೆಯನ್ನು ಆ
          ರಿಮೋಟ್ ಪ್ರವೇಶ ಕ್ಲೈಂಟ್‌ಗಳಿಗೆ ಈ ನೀತಿ ಸೆಟ್ಟಿಂಗ್‌ ಮೂಲಕ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ. TalkGadget ಪ್ರವೇಶಿಸಲು ಯಾವಾಗಲೂ ಅವುಗಳು 'chromoting-client.talkgadget.google.com' ಬಳಸುತ್ತವೆ.</translation>
 <translation id="1103860406762205913">ಹಳೆಯ ವೆಬ್ ಆಧಾರಿತ ಸೈನ್ ಇನ್ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ</translation>
 <translation id="5765780083710877561">ವಿವರಣೆ:</translation>
-<translation id="6915442654606973733">ಮಾತನಾಡà³\81ವ ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.
+<translation id="6915442654606973733">ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.
 
-          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¸à²°à²¿ à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯು ಯಾವಾಗಲೂ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
+          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¸à²°à²¿ à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯು ಯಾವಾಗಲೂ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
 
-          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¤à²ªà³\8dಪà³\81 à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಯಾವಾಗಲೂ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
+          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¤à²ªà³\8dಪà³\81 à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಯಾವಾಗಲೂ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
 
           ನೀವು ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರು ಅದನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
 
-          à²\92à²\82ದà³\81 à²µà³\87ಳà³\86 à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿಸದà³\87 à²¬à²¿à²\9fà³\8dà²\9fರà³\86, à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪ್ರಾರಂಭದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳ್ಳುತ್ತದೆ ಆದರೆ ಬಳಕೆದಾರರು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಬಹುದಾಗಿದೆ.</translation>
+          à²\92à²\82ದà³\81 à²µà³\87ಳà³\86 à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿಸದà³\87 à²¬à²¿à²\9fà³\8dà²\9fರà³\86, à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪ್ರಾರಂಭದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳ್ಳುತ್ತದೆ ಆದರೆ ಬಳಕೆದಾರರು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಬಹುದಾಗಿದೆ.</translation>
 <translation id="7796141075993499320">ಪ್ಲಗಿನ್‌ಗಳನ್ನು ಚಾಲನೆ ಮಾಡಲು ಅನುಮತಿಸಿರುವಂತಹ ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವಂತಹ url ನಮೂನೆಗಳ ಪಟ್ಟಿಯನ್ನು ಹೊಂದಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟಲ್ಲಿ 'DefaultPluginsSetting' ನೀತಿಯಿಂದ ಹೊಂದಿಸಿದರೆ ಅಥವಾ ಬಳಕೆದಾರರ ವೈಯಕ್ತಿಕ ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಎಲ್ಲ ಸೈಟ್‌ಗಳಿಗೆ ಜಾಗತಿಕ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="3809527282695568696">'URLಗಳ ಪಟ್ಟಿಯನ್ನು ತೆರೆ' ಅನ್ನು ಪ್ರಾರಂಭಿಕ ಕ್ರಿಯೆಯಾಗಿ ಆಯ್ಕೆಮಾಡಿದರೆ, ತೆರೆಯಲಾಗಿರುವ URLಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವಂತೆ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ ಪ್ರಾರಂಭದಲ್ಲಿ ಯಾವುದೇ URL ಅನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ. 'RestoreOnStartup' ನೀತಿಯನ್ನು 'RestoreOnStartupIsURLs' ಗೆ ಹೊಂದಿಸಲಾಗಿದ್ದರೆ ಮಾತ್ರ ಈ ನೀತಿಯು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.</translation>
 <translation id="649418342108050703">3D ಗ್ರಾಫಿಕ್ಸ್ APIಗಳಿಗಾಗಿ ಬೆಂಬಲವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ವೆಬ್ ಪುಟಗಳು ಗ್ರಾಫಿಕ್ಸ್ ಪ್ರಕ್ರಿಯೆ ಯೂನಿಟ್ (GPU) ನ ಪ್ರವೇಶವನ್ನು ಪಡೆಯುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನಿರ್ದಿಷ್ಟವಾಗಿ, ವೆಬ್ ಪುಟಗಳು WebGL API ಅನ್ನು ಪ್ರವೇಶಿಸುವುದಿಲ್ಲ ಮತ್ತು ಪ್ಲಗಿನ್‌ಗಳು Pepper 3D API ಅನ್ನು ಬಳಸುವುದಿಲ್ಲ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಅಥವಾ ಹೊಂದಿಸದೆ ಬಿಡುವುದರಿಂದ ಸಂಭವನೀಯವಾಗಿ ವೆಬ್ ಪುಟಗಳು WebGL API ಬಳಸಲು ಮತ್ತು ಪ್ಲಗಿನ್‌ಗಳಿಗೆ Pepper 3D API ಅನ್ನು ಬಳಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಈ APIಗಳನ್ನು ಬಳಸುವ ಸಲುವಾಗಿ ಬ್ರೌಸರ್‌ನ ಡೀಫಾಲ್ಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಆದೇಶ ಸಾಲಿನ ವಾದಗಳ ಇನ್ನೂ ಅಗತ್ಯವಿರಬಹುದು.</translation>
@@ -1681,15 +1681,15 @@ ExtensionInstallForcelist ಮೂಲಕ ಸ್ಥಾಪನೆಯನ್ನು ಆ
 
       ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಬಳಕೆದಾರರಿಗೆ <ph name="PRODUCT_NAME"/> ಮುದ್ರಣ ಸಂವಾದದಿಂದ <ph name="CLOUD_PRINT_NAME"/> ಗೆ ಮುದ್ರಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="4088589230932595924">ಅಜ್ಞಾತ ಮೋಡ್ ಅನ್ನು ಒತ್ತಾಯಿಸಲಾಗಿದೆ</translation>
-<translation id="5862253018042179045">ಲಾà²\97ಿನà³\8d à²ªà²°à²¦à³\86ಯಲà³\8dಲಿ à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯದ ಡೀಫಾಲ್ಟ್ ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸಿ.
+<translation id="5862253018042179045">ಲಾà²\97ಿನà³\8d à²ªà²°à²¦à³\86ಯಲà³\8dಲಿ à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯದ ಡೀಫಾಲ್ಟ್ ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸಿ.
 
-          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¸à²°à²¿ à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²²à²¾à²\97ಿನà³\8d à²ªà²°à²¦à³\86 à²ªà³\8dರದರà³\8dಶಿಸಿದಾà²\97 à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
+          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¸à²°à²¿ à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²²à²¾à²\97ಿನà³\8d à²ªà²°à²¦à³\86 à²ªà³\8dರದರà³\8dಶಿಸಿದಾà²\97 à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
 
-          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¤à²ªà³\8dಪà³\81 à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²²à²¾à²\97ಿನà³\8d à²ªà²°à²¦à³\86 à²ªà³\8dರದರà³\8dಶನà²\97à³\8aಳà³\8dಳà³\81ವಾà²\97 à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
+          à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¤à²ªà³\8dಪà³\81 à²\8eà²\82ದà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²²à²¾à²\97ಿನà³\8d à²ªà²°à²¦à³\86 à²ªà³\8dರದರà³\8dಶನà²\97à³\8aಳà³\8dಳà³\81ವಾà²\97 à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.
 
-          à²¨à³\80ವà³\81 à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²¬à²³à²\95à³\86ದಾರರà³\81 à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದರ ಮೂಲಕ ಅದನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ಅತಿಕ್ರಿಮಿಸಬಹುದು. ಅದಾಗ್ಯೂ, ಬಳಕೆದಾರರ ಆಯ್ಕೆಯು ನಿರಂತರವಾಗಿರುವುದಿಲ್ಲ ಮತ್ತು ಲಾಗಿನ್ ಪರದೆಯು ಹೊಸದನ್ನು ಪ್ರದರ್ಶಿಸುವಾಗ ಅಥವಾ ಬಳಕೆದಾರರು ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿ ನಿಮಿಷಗಳ ಕಾಲ ತಟಸ್ಥವಾಗಿ ಉಳಿದಿರುವಾಗಲೆಲ್ಲಾ ಡೀಫಾಲ್ಟ್ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತದೆ.
+          à²¨à³\80ವà³\81 à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿಸಿದರà³\86, à²¬à²³à²\95à³\86ದಾರರà³\81 à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದರ ಮೂಲಕ ಅದನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ಅತಿಕ್ರಿಮಿಸಬಹುದು. ಅದಾಗ್ಯೂ, ಬಳಕೆದಾರರ ಆಯ್ಕೆಯು ನಿರಂತರವಾಗಿರುವುದಿಲ್ಲ ಮತ್ತು ಲಾಗಿನ್ ಪರದೆಯು ಹೊಸದನ್ನು ಪ್ರದರ್ಶಿಸುವಾಗ ಅಥವಾ ಬಳಕೆದಾರರು ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿ ನಿಮಿಷಗಳ ಕಾಲ ತಟಸ್ಥವಾಗಿ ಉಳಿದಿರುವಾಗಲೆಲ್ಲಾ ಡೀಫಾಲ್ಟ್ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತದೆ.
 
-          à²\92à²\82ದà³\81 à²µà³\87ಳà³\86 à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿಸದà³\87 à²¬à²¿à²\9fà³\8dà²\9fರà³\86, à²²à²¾à²\97ಿನà³\8d à²ªà²°à²¦à³\86ಯà³\81 à²®à³\8aದಲà³\81 à²ªà³\8dರದರà³\8dಶನà²\97à³\8aà²\82ಡಾà²\97 à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ à²ªà³\8dರತಿà²\95à³\8dರಿಯà³\86 à²¨à²¿à²·à³\8dà²\95à³\8dರಿಯà²\97à³\8aಳà³\8dಳà³\81ತà³\8dತದà³\86. à²¬à²³à²\95à³\86ದಾರರà³\81 à²®à²¾à²¤à²¨à²¾à²¡à³\81ವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು ಮತ್ತು ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿರುವ ಅದರ ಸ್ಥಿತಿಯು ಬಳಕೆದಾರರ ನಡುವೆ ನಿರಂತರವಾಗಿರುತ್ತದೆ.</translation>
+          à²\92à²\82ದà³\81 à²µà³\87ಳà³\86 à²\88 à²¨à³\80ತಿಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿಸದà³\87 à²¬à²¿à²\9fà³\8dà²\9fರà³\86, à²²à²¾à²\97ಿನà³\8d à²ªà²°à²¦à³\86ಯà³\81 à²®à³\8aದಲà³\81 à²ªà³\8dರದರà³\8dಶನà²\97à³\8aà²\82ಡಾà²\97 à²®à²¾à²¤à²¿à²¨ à²ªà³\8dರತಿà²\95à³\8dರಿಯà³\86 à²¨à²¿à²·à³\8dà²\95à³\8dರಿಯà²\97à³\8aಳà³\8dಳà³\81ತà³\8dತದà³\86. à²¬à²³à²\95à³\86ದಾರರà³\81 à²®à²¾à²¤à²¿à²¨ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು ಮತ್ತು ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿರುವ ಅದರ ಸ್ಥಿತಿಯು ಬಳಕೆದಾರರ ನಡುವೆ ನಿರಂತರವಾಗಿರುತ್ತದೆ.</translation>
 <translation id="8197918588508433925">ರಿಮೋಟ್ ದೃಢೀಕರಣಕ್ಕಾಗಿ ಎಂಟರ್‌ಪ್ರೈಸ್ ಪ್ಲ್ಯಾಟ್‌ಫಾರ್ಮ್ ಕೀಗಳ API chrome.enterprise.platformKeysPrivate.challengeUserKey() ಅನ್ನು ಬಳಸಲು ಈ ನೀತಿಯು ಅನುಮತಿಸಲಾದ ವಿಸ್ತರಣೆಗಳನ್ನು ಸೂಚಿಸುತ್ತದೆ. API ಬಳಸಲು ವಿಸ್ತರಣೆಗಳನ್ನು ಈ ಪಟ್ಟಿಗೆ ಸೇರಿಸಬೇಕು.
 
           ವಿಸ್ತರಣೆಯು ಈ ಪಟ್ಟಿಯಲ್ಲಿರದಿದ್ದರೆ, ಅಥವಾ ಪಟ್ಟಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, API ಗೆ ಮಾಡುವ ಕರೆಯು ದೋಷದ ಕೋಡ್‌ನೊಂದಿಗೆ ವಿಫಲವಾಗುತ್ತದೆ.</translation>
index 2290b23..9669b9a 100644 (file)
@@ -105,11 +105,11 @@ Denne regelen brukes internt av Chrome.</translation>
 <translation id="3816312845600780067">Aktiver hurtigtasten for avbrytelse av automatisk pålogging</translation>
 <translation id="3214164532079860003">Denne retningslinjen tvinger startsiden til å bli importert fra nåværende standard nettleser hvis den er aktivert. Hvis retningslinjen er deaktivert, importeres ikke startsiden. Hvis retningslinjen ikke er angitt, er det mulig at brukeren får spørsmål om hvorvidt vedkommende ønsker å importere, eller så kan importeringen skje automatisk.</translation>
 <translation id="5330684698007383292">Gi <ph name="PRODUCT_FRAME_NAME"/> tillatelse til å håndtere de følgende innholdstypene</translation>
-<translation id="6647965994887675196">Hvis angitt til «true», kan overvåkede brukere opprettes og brukes.
+<translation id="6647965994887675196">Hvis angitt til «true», kan administrerte brukere opprettes og brukes.
 
-          Hvis angitt til «false» eller ikke konfigurert, er oppretting og bruk av overvåkede brukere deaktivert. Alle eksisterende overvåkede brukere skjules.
+          Hvis angitt til «false» eller ikke konfigurert, er oppretting og bruk av administrerte brukere deaktivert. Alle eksisterende administrerte brukere skjules.
 
-          MERK: Standardatferden for forbruker- og bedriftsenheter er ikke den samme. På forbrukerenheter er overvåkede brukere aktivert som standard, men på bedriftsenheter er de deaktivert.</translation>
+          MERK: Standardatferden for forbruker- og bedriftsenheter er ikke den samme. På forbrukerenheter er administrerte brukere aktivert som standard, men på bedriftsenheter er de deaktivert.</translation>
 <translation id="69525503251220566">Parameteret som tilbyr search-by-image-funksjonen for standardsøkemotoren</translation>
 <translation id="5469825884154817306">Blokkér bilder på disse nettstedene</translation>
 <translation id="8412312801707973447">Angir om OCSP/CRL-kontroller utføres på nettet</translation>
@@ -316,7 +316,7 @@ Denne regelen brukes internt av Chrome.</translation>
       På alle plattformer unntatt <ph name="PRODUCT_OS_NAME"/>, er kioskmodus utilgjengelig når fullskjermmodus er deaktivert.</translation>
 <translation id="8828766846428537606">Angir standard startside i <ph name="PRODUCT_NAME"/> og forhindrer brukerne i å endre den. Brukerens innstillinger for startside blir kun fullstendig overstyrt dersom du enten angir nettstedet på siden Ny fane som startside, eller angir den til å være en spesifikk nettadresse du velger. Hvis du ikke spesifiserer nettadressen for startsiden, kan brukeren fremdeles angi nettstedet på siden Ny fane som startside ved å spesifisere «chrome://newtab».</translation>
 <translation id="2231817271680715693">Importér nettleserlogg fra standard nettleser ved første kjøring</translation>
-<translation id="1353966721814789986">Oppstartssider</translation>
+<translation id="1353966721814789986">Oppstartsider</translation>
 <translation id="7173856672248996428">Midlertidig profil</translation>
 <translation id="1841130111523795147">Tillater brukeren å logge seg på <ph name="PRODUCT_NAME"/> og hindrer brukere i å endre denne innstillingen. 
 
@@ -325,7 +325,7 @@ Denne regelen brukes internt av Chrome.</translation>
 <translation id="4668325077104657568">Standardinnstilling for bilder</translation>
 <translation id="4492287494009043413">Deaktiver mulighet til å ta skjermdumper</translation>
 <translation id="6368403635025849609">Tillat JavaScript på disse nettstedene</translation>
-<translation id="6074963268421707432">Ikke tillat noen nettsteder å vise skrivebordsvarslinger</translation>
+<translation id="6074963268421707432">Ikke tillat noen nettsteder å vise skrivebordsvarsler</translation>
 <translation id="8614804915612153606">Deaktiverer automatiske oppdateringer</translation>
 <translation id="4834526953114077364">Det fjernes brukere til nok plass er frigjort, i rekkefølgen «lengst tid siden forrige gang brukt og ikke pålogget de siste tre månedene»</translation>
 <translation id="382476126209906314">Konfigurer TalkGadget-prefikset for verter med ekstern adgang</translation>
@@ -863,7 +863,7 @@ Hvis denne retningslinjen ikke angis, svartelistes ingen nettadresser i nettlese
       Når denne innstillingen aktiveres, åpner <ph name="PRODUCT_NAME"/> utskriftsdialogen for systemet i stedet for den innebygde utskriftsforhåndsvisningen når en bruker ber om å skrive ut en side.
 
       Hvis denne innstillingen ikke angis, eller angis som feil, kommer utskriftskommandoene til å utløse forhåndsvisningsskjermen for utskrifter.</translation>
-<translation id="7933141401888114454">Slå på oppretting av overvåkede brukere</translation>
+<translation id="7933141401888114454">Slå på oppretting av administrerte brukere</translation>
 <translation id="2824715612115726353">Aktiver inkognitomodus</translation>
 <translation id="1057535219415338480">Aktiverer nettverksforslag i <ph name="PRODUCT_NAME"/> og hindrer brukerne i å endre denne innstillingen.
 
@@ -1253,7 +1253,7 @@ skjermtastaturet når som helst og statusen den har på påloggingsskjermen er v
      Hvis denne innstillingen er aktivert, lagres ikke nettleserloggen.
 
       Hvis denne innstillingen er deaktivert, lagres nettleserloggen.</translation>
-<translation id="7295019613773647480">Aktiver overvåkede brukere</translation>
+<translation id="7295019613773647480">Aktivér administrerte brukere</translation>
 <translation id="2759224876420453487">Kontrollér brukeradferd i flerprofilsøkter</translation>
 <translation id="3844092002200215574">Konfigurerer katalogen som <ph name="PRODUCT_NAME"/> skal bruke til lagring av bufrede filer på disken.
 
@@ -1371,9 +1371,9 @@ skjermtastaturet når som helst og statusen den har på påloggingsskjermen er v
 <translation id="8864975621965365890">Ignorerer avslagsforespørselen som vises når et nettsted gjengis av <ph name="PRODUCT_FRAME_NAME"/>.</translation>
 <translation id="3264793472749429012">Kodinger av standard søkeleverandør</translation>
 <translation id="285480231336205327">Aktiver modus for høy kontrast</translation>
-<translation id="5366977351895725771">Hvis angitt til «false» kan ikke denne brukeren opprette overvåkede brukere. Eksisterende overvåkede brukere er fortsatt tilgjengelige.
+<translation id="5366977351895725771">Hvis angitt til «false» kan ikke denne brukeren opprette administrerte brukere. Eksisterende administrerte brukere er fortsatt tilgjengelige.
 
-          Hvis angitt til «true» eller ikke konfigurert, kan denne brukeren opprette og administrere overvåkede brukere.</translation>
+          Hvis angitt til «true» eller ikke konfigurert, kan denne brukeren opprette og administrere administrerte brukere.</translation>
 <translation id="5469484020713359236">Gjør at du kan angi en liste over nettadressemønstre som spesifiserer hvilke nettsteder som får angi informasjonskapsler.
 
           Hvis denne retningslinjen ikke angis, brukes den globale standardverdien for alle nettsteder, enten fra retningslinjen DefaultCookiesSetting hvis den er angitt, eller fra brukerens egen konfigurasjon hvis den nevnte retningslinjen ikke er angitt.</translation>
index 4c06614..4c9b836 100644 (file)
 <translation id="4733471537137819387">Políticas relacionadas à autenticação integrada de HTTP.</translation>
 <translation id="8501011084242226370">Especifica uma lista de plug-ins que o usuário pode ativar ou desativar no <ph name="PRODUCT_NAME"/>.
 
-      Os caracteres coringa &quot;*&quot; e &quot;?&quot; podem ser usados para corresponder a sequências de caracteres arbitrários. &quot;*&quot; corresponde a um número arbitrário de caracteres, enquanto &quot;?&quot; especifica um caractere único opcional, isto é, corresponde a zero ou um caractere. O caractere de escape é &quot;\&quot;. Dessa forma, para corresponder aos caracteres &quot;*&quot;, &quot;?&quot; ou &quot;\&quot; em si, é possível colocar um &quot;\&quot; na frente deles.
+      Os caracteres curinga &quot;*&quot; e &quot;?&quot; podem ser usados para corresponder a sequências de caracteres arbitrários. &quot;*&quot; corresponde a um número arbitrário de caracteres, enquanto &quot;?&quot; especifica um caractere único opcional, isto é, corresponde a zero ou um caractere. O caractere de escape é &quot;\&quot;. Dessa forma, para corresponder aos caracteres &quot;*&quot;, &quot;?&quot; ou &quot;\&quot; em si, é possível colocar um &quot;\&quot; na frente deles.
 
       Se você ativar essa configuração, a lista de plug-ins especificada poderá ser usada no <ph name="PRODUCT_NAME"/>. Os usuários também podem ativá-los ou desativá-los em &quot;about:plugins&quot;, mesmo que o plug-in também corresponda a um padrão em &quot;DisabledPlugins&quot;. Além disso, é possível ativar e desativar plug-ins que não correspondam a nenhum padrão em &quot;DisabledPlugins&quot;, &quot;DisabledPluginsExceptions&quot; e &quot;EnabledPlugins&quot;.
 
-      Essa política permite a criação de uma lista negra de plug-ins estrita, em que a lista &quot;DisabledPlugins&quot; contém entradas com caracteres coringa, como &quot;Desativar todos os plug-ins &quot;*&quot;&quot; ou 'Desativar todos os plug-ins Java &quot;*Java*&quot;&quot;, mas o administrador deseja ativar alguma versão específica, como &quot;IcedTea Java 2.3&quot;. Essas versões específicas podem ser indicadas nessa política.
+      Essa política permite a criação de uma lista negra de plug-ins estrita, em que a lista &quot;DisabledPlugins&quot; contém entradas com caracteres curinga, como &quot;Desativar todos os plug-ins &quot;*&quot;&quot; ou 'Desativar todos os plug-ins Java &quot;*Java*&quot;&quot;, mas o administrador deseja ativar alguma versão específica, como &quot;IcedTea Java 2.3&quot;. Essas versões específicas podem ser indicadas nessa política.
 
       Observe que tanto o nome do plug-in como o nome do grupo do plug-in devem ser isentados. Cada grupo de plug-ins é exibido em uma seção separada em &quot;about:plugins&quot;. Cada seção pode ter um ou mais plug-ins. Por exemplo, o plug-in &quot;Shockwave Flash&quot; pertence ao grupo &quot;Adobe Flash Player&quot;, e os dois nomes devem ter uma correspondência na lista de exceções, se esse plug-in tiver que ser isentado da lista negra.
 
index 0b63e3c..39c5208 100644 (file)
@@ -4,7 +4,7 @@
 <translation id="1503959756075098984">ID-uri pentru extensii și adrese URL pentru actualizări de instalat în fundal</translation>
 <translation id="793134539373873765">Specifică dacă trebuie utilizată o rețea p2p pentru încărcările utile ale actualizărilor sistemului de operare. Dacă politica este activată, dispozitivele vor utiliza în comun și vor încerca să consume încărcările utile ale actualizărilor în rețeaua LAN, ceea ce ar putea reduce utilizarea lățimii de bandă de internet și ar evita congestionarea traficului. Dacă încărcarea utilă a actualizărilor nu este disponibilă în rețeaua LAN, dispozitivul va utiliza pentru descărcare un server cu actualizări. Dacă politica nu este activată sau nu este configurată, nu va fi utilizată o rețea p2p.</translation>
 <translation id="2463365186486772703">Limba aplicației</translation>
-<translation id="1397855852561539316">Adresă URL pentru sugerarea unui furnizor de căutare prestabilit</translation>
+<translation id="1397855852561539316">Adresă URL de sugerare a furnizorului de căutare prestabilit</translation>
 <translation id="3347897589415241400">Comportamentul prestabilit pentru site-urile care nu sunt incluse în niciun pachet de conținut.
 
           Această politică este destinată să fie utilizată la nivel intern de Chrome.</translation>
 <translation id="7443616896860707393">Mesaje de solicitare pentru autentificarea HTTP de bază indiferent de sursă</translation>
 <translation id="2337466621458842053">Vă permite să setați o listă de modele pentru adresele URL care specifică site-urile care au permisiunea să afișeze imagini. Dacă această politică rămâne nesetată, valoarea prestabilită la nivel global va fi folosită pentru toate site-urile, fie din politica „DefaultImagesSetting”, în cazul în care politica este setată, fie din configurația personală a utilizatorului, în caz contrar.</translation>
 <translation id="4680961954980851756">Activați completarea automată</translation>
-<translation id="5183383917553127163">Vă permite să specificați ce extensii nu sunt pasibile să apară pe lista neagră. O valoare * în lista neagră înseamnă că toate extensiile sunt introduse pe lista neagră, iar utilizatorii pot instala numai extensiile specificate în lista albă. În mod prestabilit, toate extensiile sunt introduse pe lista albă, dar dacă acestea au fost introduse pe lista neagră conform politicii, lista albă poate fi folosită pentru a înlocui respectiva politică.</translation>
+<translation id="5183383917553127163">Vă permite să specificați ce extensii nu sunt pasibile să apară pe lista neagră.
+
+          O valoare * în lista neagră înseamnă că toate extensiile sunt introduse pe lista neagră, iar utilizatorii pot instala numai extensiile specificate în lista albă.
+
+          În mod prestabilit, toate extensiile sunt introduse pe lista albă, dar dacă acestea au fost introduse pe lista neagră conform politicii, lista albă poate fi folosită pentru a înlocui respectiva politică.</translation>
 <translation id="5921888683953999946">Setați funcția de accesibilitate pentru cursorul mare ca stare prestabilită pe ecranul de conectare.
 
           Dacă această politică este activată, cursorul mare va fi activat când este afișat ecranul de conectare.
@@ -66,7 +70,7 @@
           Dacă această politică este configurată, utilizatorii o pot ignora temporar, activând sau dezactivând cursorul mare. Totuși, alegerea utilizatorului nu este definitivă și se revine la setările prestabilite de fiecare dată când este afișat din nou ecranul de conectare sau când utilizatorul este inactiv pe ecranul de conectare timp de un minut.
 
           Dacă această politică nu este configurată, cursorul mare este dezactivat la afișarea inițială a ecranului de conectare. Utilizatorii pot oricând să activeze sau să dezactiveze cursorul mare, iar starea sa pe ecranul de conectare persistă de la un utilizator la altul.</translation>
-<translation id="3185009703220253572">începând cu versiunea <ph name="SINCE_VERSION"/></translation>
+<translation id="3185009703220253572">de la versiunea <ph name="SINCE_VERSION"/></translation>
 <translation id="5298412045697677971">Configurați imaginea cu avatarul de utilizator.
 
       Cu această politică puteți să configurați imaginea cu avatarul care reprezintă utilizatorul pe ecranul de conectare. Politica este setată prin specificarea adresei URL de la care <ph name="PRODUCT_OS_NAME"/> poate descărca imaginea cu avatarul și a unui cod hash criptografic utilizat pentru a verifica integritatea descărcării. Imaginea trebuie să fie în format JPEG, iar dimensiunea acesteia nu trebuie să depășească 512 KB. Adresa URL trebuie să poată fi accesată fără autentificare.
           Dacă este dezactivată sau dacă nu este configurată, apelurile către API nu vor reuși și vor genera un cod de eroare.</translation>
 <translation id="5809728392451418079">Setați numele afișat pentru conturile locale de pe gadget</translation>
 <translation id="1427655258943162134">Adresa IP sau adresa URL a serverului proxy</translation>
-<translation id="1827523283178827583">Utilizați servere proxy fixe</translation>
+<translation id="1827523283178827583">Utilizează servere proxy fixe</translation>
 <translation id="3021409116652377124">Dezactivați instrumentul de găsire de pluginuri</translation>
 <translation id="7236775576470542603">Setați tipul prestabilit al lupei pentru ecran activate pe ecranul de conectare.
 
           Această politică este opțională. Dacă nu este setată, nu se va efectua înlocuirea termenilor de căutare.
 
           Această politică este respectată doar dacă este activată politica „DefaultSearchProviderEnabled”.</translation>
-<translation id="5912364507361265851">Permite utilizatorilor să afișeze parolele în managerul de parole</translation>
+<translation id="5912364507361265851">Permiteți utilizatorilor să afișeze parolele în managerul de parole</translation>
 <translation id="5318185076587284965">Activați folosirea serverelor de transmisie de către gazdele de acces la distanță</translation>
 <translation id="510186355068252378">Dezactivează sincronizarea datelor în <ph name="PRODUCT_NAME"/> folosind serviciile de sincronizare găzduite de Google și împiedică utilizatorii să modifice această setare. Dacă activați această setare, utilizatorii nu o pot modifica sau anula în <ph name="PRODUCT_NAME"/>. Dacă această politică este nesetată, utilizatorul va putea să aleagă dacă să folosească sau nu Sincronizare Google.</translation>
 <translation id="7953256619080733119">Gazde pentru excepții adăugate manual ale utilizatorilor gestionați</translation>
       Dacă politica este dezactivată, utilizatorul, aplicațiile sau extensiile nu pot iniția modul ecran complet.
 
       Când modul ecran complet este dezactivat, modul chioșc nu este disponibil pe nicio platformă, exceptând <ph name="PRODUCT_OS_NAME"/>.</translation>
-<translation id="8828766846428537606">Configurează pagina de pornire prestabilită în <ph name="PRODUCT_NAME"/> și împiedică utilizatorii să o modifice. Dacă selectați ca pagina de pornire să fie pagina Filă nouă sau o adresă URL (și indicați o adresă URL pentru aceasta), setările pentru pagina de pornire a utilizatorului sunt în întregime blocate. Dacă nu specificați adresa URL a paginii de pornire, utilizatorul poate seta ca pagina de pornire să fie pagina Filă nouă, specificând „chrome://newtab”.</translation>
+<translation id="8828766846428537606">Configurează pagina de pornire prestabilită din <ph name="PRODUCT_NAME"/> și împiedică utilizatorii să o modifice.
+
+      Dacă selectați ca pagina de pornire să fie pagina Filă nouă sau o adresă URL (și indicați o adresă URL pentru aceasta), setările pentru pagina de pornire a utilizatorului sunt în întregime blocate. Dacă nu specificați adresa URL a paginii de pornire, utilizatorul poate seta ca pagina de pornire să fie pagina Filă nouă specificând „chrome://newtab”.</translation>
 <translation id="2231817271680715693">Importați istoricul de navigare din browserul prestabilit, la prima rulare</translation>
 <translation id="1353966721814789986">Pagini de pornire</translation>
 <translation id="7173856672248996428">Profil efemer</translation>
 <translation id="1841130111523795147">Permite utilizatorului să se conecteze la <ph name="PRODUCT_NAME"/> și îi împiedică pe utilizatori să modifice această setare.
 
       Dacă setați această politică, puteți să stabiliți dacă un utilizator se poate conecta sau nu la <ph name="PRODUCT_NAME"/>.</translation>
-<translation id="5564962323737505851">Configurează managerul de parole. Dacă managerul de parole este activat, puteți alege să activați sau să dezactivați permisiunea ca utilizatorul să afișeze în text clar parolele stocate.</translation>
+<translation id="5564962323737505851">Configurează managerul de parole. Dacă managerul de parole este activat, puteți opta să activați sau să dezactivați posibilitatea unui utilizator de a afișa parolele stocate ca text simplu.</translation>
 <translation id="4668325077104657568">Setare pentru imagini prestabilite</translation>
 <translation id="4492287494009043413">Dezactivați capturile de ecran</translation>
 <translation id="6368403635025849609">Permiteți JavaScript pe aceste site-uri</translation>
-<translation id="6074963268421707432">Nu permiteți niciunui site să afișeze notificări pe desktop</translation>
+<translation id="6074963268421707432">Nu permite niciunui site să afișeze notificări pe desktop</translation>
 <translation id="8614804915612153606">Dezactivează actualizarea automată</translation>
 <translation id="4834526953114077364">Utilizatorii care nu s-au conectat în ultimele 3 luni sunt eliminați până când există suficient spațiu liber</translation>
 <translation id="382476126209906314">Configurarea prefixului TalkGadget pentru gazdele de acces la distanță</translation>
 
       Valoarea politicii trebuie să fie specificată în secunde.</translation>
 <translation id="3758249152301468420">Dezactivați instrumentele pentru dezvoltatori</translation>
-<translation id="8665076741187546529">Configurează lista extensiilor cu instalare forțată</translation>
+<translation id="8665076741187546529">Configurați lista extensiilor cu instalare forțată</translation>
 <translation id="2386768843390156671">Activează instalarea la nivel de utilizator a gazdelor de mesagerie nativă.
 
           Dacă această setare este activată, <ph name="PRODUCT_NAME"/> permite
 
       Această politică este specificată în milisecunde.</translation>
 <translation id="7275334191706090484">Marcaje gestionate</translation>
-<translation id="3570008976476035109">Blocați pluginuri de pe aceste site-uri</translation>
+<translation id="3570008976476035109">Blocați pluginurile pe aceste site-uri</translation>
 <translation id="8749370016497832113">Permite ștergerea istoricului browserului și a istoricului descărcărilor din <ph name="PRODUCT_NAME"/> și îi împiedică pe utilizatori să modifice această setare.
 
       Rețineți că, și după dezactivarea acestei politici, nu se garantează păstrarea istoricului navigării și a istoricului descărcărilor: utilizatorii pot edita sau șterge în mod direct fișierele din baza de date a istoricului, iar browserul poate oricând să termine sau să arhiveze oricare dintre elementele din istoric sau pe toate acestea.
       Dacă această setare este activată sau neconfigurată, istoricul navigării și istoricul descărcărilor pot fi șterse.
 
       Dacă această setare este dezactivată, istoricul navigării și istoricul descărcărilor nu pot fi șterse.</translation>
-<translation id="2884728160143956392">Permiteți cookie-uri numai pentru sesiune pe aceste site-uri</translation>
+<translation id="2884728160143956392">Permiteți cookie-uri de sesiune pe aceste site-uri</translation>
 <translation id="3021272743506189340">Dacă este activată, dezactivează sincronizarea Google Drive în aplicația Fișiere din sistemul de operare Chrome atunci când se utilizează o conexiune celulară. În acest caz, datele sunt sincronizate cu Google Drive numai dacă există o conexiune prin WiFi sau Ethernet.
 
           Dacă nu este configurată sau este dezactivată, utilizatorii vor putea să transfere fișiere pe Google Drive prin conexiuni celulare.</translation>
       Dacă politica nu este configurată, dispozitivul va utiliza formatul prestabilit al ceasului cu 24 de ore.</translation>
 <translation id="8764119899999036911">Specifică dacă numele SPN generat în protocolul Kerberos are la bază numele DNS canonic sau numele inițial introdus. Dacă activați această setare, căutarea CNAME va fi ignorată, iar numele serverului va fi utilizat așa cum este introdus. Dacă dezactivați această setare sau o lăsați nesetată, numele canonic al serverului va fi determinat prin intermediul căutării CNAME.</translation>
 <translation id="5056708224511062314">Lupă ecran dezactivată</translation>
-<translation id="4377599627073874279">Permiteți tuturor site-urilor să afișeze toate imaginile</translation>
+<translation id="4377599627073874279">Permite tuturor site-urilor să afișeze toate imaginile</translation>
 <translation id="7195064223823777550">Specificați ce se întâmplă atunci când utilizatorul închide capacul.
 
           Dacă această politică este setată, specifică măsura luată de <ph name="PRODUCT_OS_NAME"/> atunci când utilizatorul închide capacul dispozitivului.
       Dacă valoarea acestei politici este configurată și diferă de 0, atunci utilizatorul demonstrativ conectat în prezent va fi deconectat automat după o perioadă de inactivitate specificată.
 
       Valoarea pentru politică trebuie specificată în milisecunde.</translation>
-<translation id="7683777542468165012">Actualizare dinamică a politicii</translation>
+<translation id="7683777542468165012">Actualizați politica dinamică</translation>
 <translation id="1160939557934457296">Dezactivați continuarea navigării de pe pagina de avertisment Navigare sigură</translation>
 <translation id="8987262643142408725">Dezactivați divizarea înregistrărilor SSL</translation>
 <translation id="4529945827292143461">Personalizați lista cu modele pentru adresele URL care trebuie să fie întotdeauna afișate de browserul gazdă. Dacă această politică nu este setată, programul de redare prestabilit va fi folosit pentru toate site-urile așa cum se specifică în politica „ChromeFrameRendererSettings”. Pentru exemple de modele, accesați http://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation>
       Dacă politica este dezactivată, lista cu interfețe nu va fi raportată.</translation>
 <translation id="4962195944157514011">Specifică adresa URL a motorului de căutare utilizat la efectuarea unei căutări prestabilite. Adresa URL trebuie să conțină șirul „<ph name="SEARCH_TERM_MARKER"/>”, care va fi înlocuit în momentul interogării cu termenii căutați de către utilizator. Această opțiune trebuie setată dacă este activată politica „DefaultSearchProviderEnabled” și va fi respectată numai în cazul acesta.</translation>
 <translation id="6009903244351574348">Permiteți ca <ph name="PRODUCT_FRAME_NAME"/> să gestioneze tipurile de conținut enumerate. Dacă această politică nu este setată, programul de redare prestabilit va fi folosit pentru toate site-urile așa cum se specifică în politica „ChromeFrameRendererSettings”.</translation>
-<translation id="3381968327636295719">Utilizați în mod prestabilit browserul gazdă</translation>
+<translation id="3381968327636295719">Utilizează în mod prestabilit browserul gazdă</translation>
 <translation id="3627678165642179114">Activați sau dezactivați serviciul web de verificare a ortografiei</translation>
 <translation id="6520802717075138474">Importați motoarele de căutare din browserul prestabilit, la prima rulare</translation>
 <translation id="4039085364173654945">Stabilește dacă subconținutul terță parte dintr-o anumită pagină poate afișa într-o ferestră de tip pop-up o casetă de dialog pentru autentificarea HTTP de bază. De obicei, aceasta este dezactivată ca măsură de precauție împotriva atacurilor de tip phishing. Dacă această politică nu este setată, această funcție este dezactivată, iar subconținutul terță parte nu va avea permisiunea de a afișa într-o ferestră de tip pop-up o casetă de dialog pentru autentificarea HTTP de bază.</translation>
 
       Formatul valorii respectă denumirile fusurilor orare din „Baza de date de fusuri orare IANA” (accesați „http://en.wikipedia.org/wiki/List_of_tz_database_time”). Mai exact, majoritatea fusurilor orare sunt denumite după „continent/oraș_mare” sau „ocean/oraș_mare”.</translation>
 <translation id="3646859102161347133">Setați tipul lupei pentru ecran</translation>
-<translation id="3528000905991875314">Activați paginile de eroare alternative</translation>
+<translation id="3528000905991875314">Activați pagini de eroare alternative</translation>
 <translation id="1283072268083088623">Specifică schemele de autentificare HTTP acceptate de <ph name="PRODUCT_NAME"/>. Valorile posibile sunt „basic”, „digest”, „ntml” și „negotiate”. Separați valorile multiple prin virgulă. Dacă această politică este lăsată nesetată, vor fi utilizate toate cele patru scheme.</translation>
 <translation id="1017967144265860778">Gestionarea consumului de energie pe ecranul de conectare</translation>
 <translation id="4914647484900375533">Activează funcția Instant din <ph name="PRODUCT_NAME"/> și nu le permite utilizatorilor să modifice această setare.
       Dacă această setare nu este configurată, utilizatorul poate alege să utilizeze sau nu această funcție.
 
       Această setare a fost eliminată din Chrome 29 și versiunile ulterioare.</translation>
-<translation id="6114416803310251055">învechită</translation>
-<translation id="8493645415242333585">Dezactivați istoricul salvărilor din browser</translation>
+<translation id="6114416803310251055">învechit</translation>
+<translation id="8493645415242333585">Dezactivați salvarea istoricului browserului</translation>
 <translation id="2747783890942882652">Configurează numele de domeniu gazdă care va fi impus gazdelor de acces la distanță și nu le permite utilizatorilor să-l modifice.
 
           Dacă este activată această setare, atunci se poate permite accesul la gazde numai utilizând conturi înregistrate pe respectivul nume de domeniu.
 
           Dacă această setare este dezactivată sau neconfigurată, atunci se poate permite accesul la gazde utilizând orice cont.</translation>
 <translation id="6417861582779909667">Vă permite să setați o listă cu modele pentru adresele URL ce specifică site-urile care nu sunt autorizate să seteze cookie-uri. Dacă această politică este lăsată nesetată, valoarea prestabilită la nivel global va fi folosită pentru toate site-urile, din politica „DefaultCookiesSetting” în cazul în care este setată sau din configurația personală a utilizatorului, în caz contrar.</translation>
-<translation id="5776485039795852974">Doresc să fiu întrebat(ă) de fiecare dată când un site vrea să afișeze notificări pe desktop</translation>
+<translation id="5776485039795852974">Notifică-mă dacă un site vrea să afișeze notificări pe desktop</translation>
 <translation id="5047604665028708335">Se permite accesul la site-urile din afara pachetelor de conținut</translation>
 <translation id="5052081091120171147">Dacă este activată, această politică forțează importarea istoricului de navigare din browserul prestabilit actual. Dacă este activată, această politică afectează, de asemenea, caseta de dialog de importare. Dacă este dezactivată, istoricul de navigare nu va fi importat. În cazul în care nu este setată, utilizatorul poate fi întrebat dacă dorește importarea sau aceasta poate avea loc în mod automat.</translation>
 <translation id="6786747875388722282">Extensii</translation>
       Dacă politica este dezactivată sau lăsată nesetată, conectarea face legătura cu profilurile obișnuite.</translation>
 <translation id="6997592395211691850">Dacă verificările OCSP/CRL online sunt necesare sau nu pentru ancorele de încredere locale</translation>
 <translation id="152657506688053119">Lista adreselor URL alternative pentru furnizorul de căutare prestabilit</translation>
-<translation id="8992176907758534924">Nu permiteți niciunui site să afișeze imagini</translation>
+<translation id="8992176907758534924">Nu permite niciunui site să afișeze imagini</translation>
 <translation id="262740370354162807">Activează trimiterea documentelor la <ph name="CLOUD_PRINT_NAME"/></translation>
 <translation id="7717938661004793600">Configurați funcțiile de accesibilitate pentru <ph name="PRODUCT_OS_NAME"/>.</translation>
 <translation id="5182055907976889880">Configurați Google Drive în <ph name="PRODUCT_OS_NAME"/>.</translation>
 <translation id="8704831857353097849">Lista pluginurilor dezactivate</translation>
-<translation id="467449052039111439">Deschideți o listă de adrese URL</translation>
+<translation id="467449052039111439">Deschide o listă de adrese URL</translation>
 <translation id="1988371335297483117">Încărcările utile pentru actualizările automate pe <ph name="PRODUCT_OS_NAME"/> pot fi descărcate prin HTTP, în loc de HTTPS. Acest lucru permite stocarea transparentă în memoria cache HTTP a descărcărilor HTTP.
 
       Dacă politica este activată, <ph name="PRODUCT_OS_NAME"/> va încerca să descarce încărcările utile pentru actualizările automate prin HTTP. Dacă politica este dezactivată sau nu este configurată, la descărcarea încărcărilor utile pentru actualizări automate se va utiliza HTTPS.</translation>
-<translation id="5883015257301027298">Setare prestabilită pentru cookie-uri</translation>
+<translation id="5883015257301027298">Setări prestabilite cu privire la cookie-uri</translation>
 <translation id="5017500084427291117">Blochează accesul la adresele URL incluse pe listă.
 
       Politica împiedică utilizatorul să încarce pagini web de la adresele URL incluse pe lista neagră.
 <translation id="7260277299188117560">Actualizare automată p2p este activată</translation>
 <translation id="5316405756476735914">Vă permite să setați dacă site-urile web au sau nu permisiunea de a seta datele locale. Setarea datelor locale poate fi permisă sau refuzată în bloc pentru toate site-urile web. Dacă această politică nu este setată, va fi utilizată politica „AllowCookies”, dar utilizatorul o va putea schimba.</translation>
 <translation id="4250680216510889253">Nu</translation>
-<translation id="1522425503138261032">Permiteți site-urilor să urmărească locația fizică a utilizatorilor</translation>
+<translation id="1522425503138261032">Permite site-urilor să urmărească locația fizică a utilizatorilor</translation>
 <translation id="6467433935902485842">Vă permite să setați o listă cu modele pentru adresele URL ce specifică site-urile care nu au permisiunea de a rula pluginuri. Dacă această politică este lăsată nesetată, valoarea prestabilită la nivel global va fi folosită pentru toate site-urile, fie din politica „DefaultPluginsSetting”, în cazul în care aceasta este setată, fie din configurația personală a utilizatorului, în caz contrar.</translation>
 <translation id="4423597592074154136">Specificați manual setările proxy</translation>
 <translation id="209586405398070749">Canalul în versiune stabilă</translation>
       &quot;1412.2.&quot;: actualizare la orice versiune subordonată pentru 1412.2 (de exemplu, 1412.2.34 sau 1412.2.2);
       &quot;1412.24.34&quot;: actualizare numai la această versiune.</translation>
 <translation id="8102913158860568230">Setarea implicită pentru mediastream</translation>
-<translation id="6641981670621198190">Dezactivați asistența pentru API-uri grafice 3D</translation>
+<translation id="6641981670621198190">Dezactivați compatibilitatea pentru API-uri grafice 3D</translation>
 <translation id="5196805177499964601">Blocați modul pentru dezvoltatori.
 
       Dacă politica este activată, <ph name="PRODUCT_OS_NAME"/> nu va permite pornirea dispozitivului în modul pentru dezvoltatori. Sistemul va refuza pornirea și va afișa un ecran de eroare atunci când comutatorul modului pentru dezvoltatori este pornit.
       video va fi disponibilă numai pentru adresele URL configurate în VideoCaptureAllowedUrls.
 
       Această politică afectează toate tipurile de intrări video, și nu doar camera integrată.</translation>
-<translation id="7063895219334505671">Permiteți ferestre de tip pop-up de pe aceste site-uri</translation>
+<translation id="7063895219334505671">Permiteți ferestre pop-up de pe aceste site-uri</translation>
 <translation id="3756011779061588474">Blocați modul pentru dezvoltatori</translation>
 <translation id="4052765007567912447">Stabilește dacă utilizatorul poate afișa parolele în text clar în managerul de parole. Dacă dezactivați această setare, nu se permite afișarea în text clar în fereastra managerului de parole a parolelor stocate. Dacă activați sau nu configurați această setare, utilizatorii pot vedea în text clar parolele în managerul de parole.</translation>
 <translation id="5936622343001856595">Forțează activarea Căutării sigure pentru interogările de pe Căutarea Google pe web și nu permite utilizatorilor să modifice această setare.
       Dacă această politică nu este setată, această setare va fi activată, dar utilizatorul va putea să o schimbe.</translation>
 <translation id="4541530620466526913">Conturi locale de pe gadget</translation>
 <translation id="5815129011704381141">Repornește automat după actualizare</translation>
-<translation id="1757688868319862958">Permite <ph name="PRODUCT_NAME"/> să ruleze pluginuri care necesită autorizarea. Dacă activați această setare, pluginurile care nu sunt învechite rulează întotdeauna. Dacă această setare este dezactivată sau nu este setată, utilizatorilor li se va solicita permisiunea pentru a rula pluginuri care necesită autorizarea. Acestea sunt pluginuri care pot compromite securitatea.</translation>
+<translation id="1757688868319862958">Permite <ph name="PRODUCT_NAME"/> să ruleze pluginuri care necesită autorizarea.
+
+      Dacă activați această setare, pluginurile care nu sunt învechite rulează întotdeauna.
+
+      Dacă această setare este dezactivată sau nu este configurată, utilizatorilor li se va solicita permisiunea pentru a rula pluginuri care necesită autorizarea. Acestea sunt pluginuri care pot compromite securitatea.</translation>
 <translation id="6392973646875039351">Activează funcția de Completare automată din <ph name="PRODUCT_NAME"/> și permite utilizatorilor să completeze în mod automat formularele web folosind informațiile stocate anterior, cum ar fi informațiile adresei fizice sau ale cardului de credit. Dacă dezactivați această setare, Completarea automată va fi inaccesibilă pentru utilizatori. Dacă activați această setare sau nu configurați o valoare, Completarea automată va rămâne sub controlul utilizatorului. Acest lucru va permite utilizatorilor să configureze profiluri pentru Completarea automată și să activeze sau să dezactiveze funcția Completare automată după cum doresc.</translation>
 <translation id="6157537876488211233">Lista de valori separate prin virgulă a regulilor de ocolire a proxy-ului</translation>
 <translation id="7788511847830146438">Per profil</translation>
 <translation id="5814301096961727113">Setați starea prestabilită de feedback vocal pe ecranul de conectare.</translation>
 <translation id="1950814444940346204">Activați funcții învechite ale platformei web</translation>
 <translation id="9084985621503260744">Specificați dacă activitatea video afectează gestionarea consumului de energie</translation>
-<translation id="7091198954851103976">Rulează întotdeauna pluginuri care necesită autorizare</translation>
+<translation id="7091198954851103976">Rulați întotdeauna pluginuri care necesită autorizare</translation>
 <translation id="1708496595873025510">Setează o limită la preluarea valorii de bază pentru Variante</translation>
 <translation id="8870318296973696995">Pagina de pornire</translation>
 <translation id="1240643596769627465">Specifică adresa URL a motorului de căutare utilizat pentru a oferi rezultate instantanee. Adresa URL trebuie să conțină șirul <ph name="SEARCH_TERM_MARKER"/>, care va fi înlocuit în momentul interogării cu textul pe care utilizatorul l-a introdus până atunci. Această politică este opțională. Dacă nu este setată, nu vor fi furnizate rezultate ale căutării instantanee. Această politică este urmată numai în cazul în care este activată politica „DefaultSearchProviderEnabled”.</translation>
 <translation id="7880891067740158163">Vă permite să specificați o listă de modele pentru adresele URL ce indică site-urile pentru care <ph name="PRODUCT_NAME"/> ar trebui să selecteze în mod automat un certificat de client, în cazul în care site-ul solicită un certificat. Dacă această politică nu este setată, nu se va realiza selectarea automată pentru niciun site.</translation>
 <translation id="3866249974567520381">Descriere</translation>
 <translation id="5192837635164433517">Activează utilizarea unor pagini de eroare alternative care sunt create în <ph name="PRODUCT_NAME"/> (cum ar fi „Pagina nu a fost găsită”) și împiedică modificarea acestei setări de către utilizatori. Dacă activați această setare, sunt utilizate pagini de eroare alternative. Dacă dezactivați această setare, paginile de eroare alternative nu sunt utilizate niciodată. Dacă activați sau dezactivați această setare, utilizatorii nu o pot modifica sau anula în <ph name="PRODUCT_NAME"/>. Dacă politica este lăsată nesetată, această setare va fi activată, dar utilizatorul va putea să o schimbe.</translation>
-<translation id="2236488539271255289">Nu permiteți niciunui site să seteze datele locale</translation>
+<translation id="2236488539271255289">Nu permite niciunui site să seteze date locale</translation>
 <translation id="4467952432486360968">Blocați cookie-urile terță parte</translation>
 <translation id="1305864769064309495">Un dicționar care asociază adresele URL cu un semnalizator boolean care specifică dacă se permite accesul la gazdă (politică activată) sau nu (politică dezactivată).
 
       Informațiile privind memoria sunt raportate oricum în pagină, indiferent de valoarea opțiunii, dar dimensiunile raportate sunt
       cuantificate, iar frecvența actualizărilor este limitată din motive de securitate. Pentru a obține date exacte în timp real,
       folosiți instrumente ca Telemetrie.</translation>
-<translation id="8731693562790917685">Setările pentru conținut vă permit să specificați modul în care este gestionat conținutul de un anumit tip (de ex., cookie-uri, imagini sau JavaScript).</translation>
+<translation id="8731693562790917685">Folosind Setările privind conținutul, puteți să specificați modul în care este gestionat conținutul de un anumit tip (de ex., cookie-uri, imagini sau JavaScript).</translation>
 <translation id="2411919772666155530">Blocați notificările pe aceste site-uri</translation>
 <translation id="7332963785317884918">Această politică este învechită. <ph name="PRODUCT_OS_NAME"/> va folosi întotdeauna strategia de curățare „RemoveLRU”.
 
 <translation id="7651739109954974365">Această politică stabilește dacă roamingul de date trebuie să fie activat pentru dispozitiv. Dacă această politică este activată, roamingul de date este permis. Dacă politica nu este configurată sau este neactivată, roamingul de date nu va fi disponibil.</translation>
 <translation id="6244210204546589761">Adrese URL care se deschid la pornire</translation>
 <translation id="7468416082528382842">Locația din registry-ul Windows:</translation>
-<translation id="1808715480127969042">Blocați cookie-uri de pe aceste site-uri</translation>
+<translation id="1808715480127969042">Blocați cookie-urile de pe aceste site-uri</translation>
 <translation id="1908884158811109790">Dezactivează Google Drive prin conexiuni celulare în aplicația Fișiere din sistemul de operare Chrome</translation>
 <translation id="7340034977315324840">Raportați perioadele de activitate ale dispozitivului</translation>
 <translation id="4928632305180102854">Această politică stabilește dacă <ph name="PRODUCT_OS_NAME"/> permite crearea de noi conturi de utilizator. Dacă această politică nu este activată, utilizatorii care nu au deja un cont nu se vor putea conecta.
           Valoarea politicii trebuie specificată în milisecunde. Valorile trebuie să fie mai mici decât intervalul de inactivitate.</translation>
 <translation id="1454846751303307294">Vă permite să setați o listă de modele pentru adresele URL ce specifică site-urile care nu au permisiunea de a rula JavaScript. Dacă această politică nu este setată, va fi utilizată valoarea prestabilită la nivel global pentru toate site-urile, fie din politica „DefaultJavaScriptSetting”, dacă aceasta este setată, fie din configurația personală a utilizatorului, în caz contrar.</translation>
 <translation id="538108065117008131">Permite <ph name="PRODUCT_FRAME_NAME"/> să gestioneze următoarele tipuri de conținut.</translation>
-<translation id="2312134445771258233">Vă permite să configurați paginile încărcate la pornire. Conținutul listei „Adrese URL care se deschid la pornire” este ignorat, cu excepția cazului în care selectați „Deschideți o listă cu adrese URL” în „Acțiune la pornire”.</translation>
+<translation id="2312134445771258233">Puteți să configurați paginile încărcate la pornire.
+
+      Conținutul listei „Adrese URL care se deschid la pornire” este ignorat, cu excepția cazului în care selectați „Deschideți o listă cu adrese URL” în „Acțiune la pornire”.</translation>
 <translation id="1464848559468748897">Controlează comportamentul utilizatorilor în timpul unei sesiuni cu profiluri multiple pe dispozitivele <ph name="PRODUCT_OS_NAME"/>.
 
       Dacă politica este setată la „MultiProfileUserBehaviorUnrestricted”, utilizatorul poate fi atât unul principal, cât și unul secundar într-o sesiune cu profiluri multiple.
 <translation id="350797926066071931">Activați serviciul Google Traducere</translation>
 <translation id="3711895659073496551">Suspendați</translation>
 <translation id="4010738624545340900">Permiteți invocarea casetelor de dialog pentru selectarea fișierelor</translation>
-<translation id="4518251772179446575">Doresc să fiu întrebat(ă) de fiecare dată când un site vrea să urmărească locația fizică a utilizatorilor</translation>
-<translation id="402759845255257575">Nu permiteți niciunui site să ruleze JavaScript</translation>
+<translation id="4518251772179446575">Notifică-mă dacă un site încearcă să urmărească locația fizică a utilizatorilor</translation>
+<translation id="402759845255257575">Nu permite niciunui site să ruleze JavaScript</translation>
 <translation id="5457924070961220141">Vă permite să configurați motorul de redare HTML prestabilit atunci când <ph name="PRODUCT_FRAME_NAME"/> este instalat. Setarea prestabilită este să permiteți browserului gazdă să efectueze redarea, dar opțional o puteți anula, pentru ca <ph name="PRODUCT_FRAME_NAME"/> să redea paginile HTML în mod prestabilit.</translation>
-<translation id="706669471845501145">Permiteți site-urilor să afișeze notificări pe desktop</translation>
+<translation id="706669471845501145">Permite site-urilor să afișeze notificări pe desktop</translation>
 <translation id="7529144158022474049">Factor de difuzare pentru actualizări automate</translation>
 <translation id="2188979373208322108">Activează bara de marcaje în <ph name="PRODUCT_NAME"/>. Dacă activați această setare, <ph name="PRODUCT_NAME"/> va afișa o bară de marcaje. Dacă dezactivați această setare, utilizatorii nu vor vedea niciodată bara de marcaje. Dacă activați sau dezactivați această setare, utilizatorii nu o pot modifica sau anula în <ph name="PRODUCT_NAME"/>. Dacă această setare este lăsată nesetată, utilizatorul poate decide să folosească sau nu această funcție.</translation>
 <translation id="7593523670408385997">Configurează dimensiunea memoriei cache pe care <ph name="PRODUCT_NAME"/> o va utiliza pentru a stoca pe disc fișierele salvate în memoria cache.
           Dacă setarea este activată sau este neconfigurată, atestarea de la distanță poate fi utilizată pentru protejarea conținutului.</translation>
 <translation id="4632343302005518762">Permiteți ca <ph name="PRODUCT_FRAME_NAME"/> să gestioneze tipurile de conținut indicate</translation>
 <translation id="13356285923490863">Numele politicii</translation>
-<translation id="557658534286111200">Activează sau dezactivează editarea marcajelor</translation>
+<translation id="557658534286111200">Activați sau dezactivați editarea marcajelor</translation>
 <translation id="5378985487213287085">Vă permite să setați dacă site-urile web au permisiunea de a afișa notificări pe desktop. Afișarea notificărilor pe desktop poate fi permisă în mod prestabilit, refuzată în mod prestabilit sau utilizatorul poate fi întrebat de fiecare dată când un site web vrea să afișeze notificări pe desktop. Dacă această politică nu este setată, va fi utilizată politica „AskNotifications”, iar utilizatorul va putea să o schimbe.</translation>
 <translation id="2386362615870139244">Permiteți blocarea activării ecranului</translation>
 <translation id="6908640907898649429">Configurează furnizorul de căutare prestabilit. Puteți specifica furnizorul de căutare prestabilit pe care utilizatorul îl va folosi sau puteți alege să dezactivați căutarea prestabilită.</translation>
 <translation id="2223598546285729819">Setare prestabilită pentru notificări</translation>
 <translation id="6158324314836466367">Numele magazinului web pentru întreprinderi (politică învechită)</translation>
 <translation id="3984028218719007910">Această politică stabilește dacă <ph name="PRODUCT_OS_NAME"/> păstrează datele contului local după deconectare. Dacă politica este activată, <ph name="PRODUCT_OS_NAME"/> nu va păstra conturi persistente, iar toate datele din sesiunea utilizatorului vor fi eliminate după deconectare. Dacă această politică nu este activată sau nu este configurată, dispozitivul poate păstra (criptate) datele locale ale utilizatorului.</translation>
-<translation id="3793095274466276777">Configurează verificările pentru browserul prestabilit în <ph name="PRODUCT_NAME"/> și împiedică modificarea acestora de către utilizatori. Dacă activați această setare, <ph name="PRODUCT_NAME"/> va verifica întotdeauna la pornire dacă este browserul prestabilit și se va înregistra în mod automat dacă este posibil. Dacă această setare este dezactivată, <ph name="PRODUCT_NAME"/> nu va verifica niciodată dacă este browserul prestabilit și va dezactiva comenzile utilizatorului pentru setarea acestei opțiuni. Dacă această setare nu este setată, <ph name="PRODUCT_NAME"/> va permite utilizatorului să stabilească dacă acesta este browserul prestabilit și dacă trebuie afișate notificări pentru utilizator atunci când nu este.</translation>
+<translation id="3793095274466276777">Configurează verificările pentru browserul prestabilit în <ph name="PRODUCT_NAME"/> și împiedică modificarea acestora de către utilizatori.
+
+      Dacă activați această setare, <ph name="PRODUCT_NAME"/> va verifica întotdeauna la pornire dacă este browserul prestabilit și se va înregistra automat dacă este posibil.
+
+      Dacă această setare este dezactivată, <ph name="PRODUCT_NAME"/> nu va verifica niciodată dacă este browserul prestabilit și va dezactiva comenzile utilizatorului pentru setarea acestei opțiuni.
+
+      Dacă această setare nu este configurată, <ph name="PRODUCT_NAME"/> va permite utilizatorului să stabilească dacă acesta este browserul prestabilit și dacă trebuie afișate notificări pentru utilizator atunci când nu este.</translation>
 <translation id="3504791027627803580">Specifică adresa URL a motorului de căutare utilizat pentru a oferi căutarea de imagini. Solicitările de căutare vor fi trimise prin metoda GET. Dacă este setată politica „DefaultSearchProviderImageURLPostParams”, solicitările pentru căutarea de imagini vor utiliza metoda POST.
 
           Această politică este opțională. Dacă nu este setată, nu va fi utilizată căutarea de imagini.
           Această politică este urmată numai dacă este activată politica „DefaultSearchProviderEnabled”.</translation>
 <translation id="7529100000224450960">Vă permite să setați o listă de modele pentru adresele URL care specifică site-urile ce au permisiunea să deschidă ferestre de tip pop-up. Dacă această politică nu este setată, va fi utilizată valoarea prestabilită la nivel global pentru toate site-urile, fie din politica „DefaultPopupsSetting”, în cazul în care aceasta este setată, fie din configurația personală a utilizatorului, în caz contrar.</translation>
 <translation id="6155936611791017817">Setați cursorul mare pe ecranul de conectare ca stare prestabilită</translation>
-<translation id="1530812829012954197">Redați întotdeauna următoarele modele pentru adresele URL în browserul gazdă</translation>
+<translation id="1530812829012954197">Redați întotdeauna următoarele șabloane de adrese URL în browserul gazdă</translation>
 <translation id="9026000212339701596">Un dicționar care asociază numele de gazdă cu un semnalizator boolean care specifică dacă se permite accesul la gazdă (politică activată) sau nu (politică dezactivată).
 
           Această politică este destinată să fie utilizată la nivel intern de Chrome.</translation>
 <translation id="6373222873250380826">Atunci când politica este activată, se dezactivează actualizările automate.
 
       Dispozitivele cu <ph name="PRODUCT_OS_NAME"/> verifică în mod automat existența unor actualizări atunci când această setare nu este configurată sau nu este activată.</translation>
-<translation id="6190022522129724693">Setare prestabilită pentru ferestre de tip pop-up</translation>
-<translation id="847472800012384958">Nu permiteți niciunui site să afișeze ferestre de tip pop-up</translation>
+<translation id="6190022522129724693">Setare prestabilită pentru ferestrele pop-up</translation>
+<translation id="847472800012384958">Nu permite niciunui site să afișeze ferestre pop-up</translation>
 <translation id="4733471537137819387">Politici referitoare la autentificarea integrată HTTP.</translation>
 <translation id="8501011084242226370">Specifică o listă de pluginuri pe care utilizatorul le poate activa sau dezactiva în <ph name="PRODUCT_NAME"/>.
 
 <translation id="603410445099326293">Parametrii pentru adresa URL a sugestiei care utilizează POST</translation>
 <translation id="2592091433672667839">Durata de inactivitate înainte ca screen saverul să fie afișat pe ecranul de conectare în modul Vânzare</translation>
 <translation id="166427968280387991">Server proxy</translation>
-<translation id="2805707493867224476">Permiteți tuturor site-urilor să afișeze ferestre de tip pop-up</translation>
-<translation id="1727394138581151779">Blocați toate pluginurile</translation>
+<translation id="2805707493867224476">Permite tuturor site-urilor să afișeze ferestre pop-up</translation>
+<translation id="1727394138581151779">Blochează toate pluginurile</translation>
 <translation id="8118665053362250806">Setați dimensiunea pentru memorare în cache pe disc pentru media</translation>
 <translation id="6565312346072273043">Setează starea prestabilită a funcției de accesibilitate cu tastatura pe ecran din ecranul de conectare.
 
           Dacă politica este configurată, utilizatorii o pot suprascrie temporar activând sau dezactivând tastatura pe ecran. Cu toate acestea, alegerea utilizatorului nu se păstrează, iar setarea implicită este restabilită ori de câte ori ecranul de conectare este afișat din nou sau utilizatorul este inactiv pe ecranul de conectare timp de un minut.
 
           Dacă politica nu este configurată, tastatura pe ecran este dezactivată la prima afișare a ecranului de conectare. Utilizatorii pot activa sau dezactiva oricând tastatura pe ecran, iar starea acesteia pe ecranul de conectare se păstrează de la un utilizator la altul.</translation>
-<translation id="7079519252486108041">Blocați ferestre de tip pop-up de pe aceste site-uri</translation>
+<translation id="7079519252486108041">Blocați ferestrele pop-up de pe aceste site-uri</translation>
 <translation id="1859633270756049523">Limitați durata sesiunii</translation>
-<translation id="7433714841194914373">Activați Google Instant</translation>
+<translation id="7433714841194914373">Activați Instant</translation>
 <translation id="4983201894483989687">Permiteți rularea pluginurilor învechite</translation>
 <translation id="443665821428652897">Ștergeți datele site-urilor la închiderea browserului (învechită)</translation>
 <translation id="3823029528410252878">Dezactivează istoricul salvărilor din browser în <ph name="PRODUCT_NAME"/> și împiedică modificarea acestei setări de către utilizatori. Dacă această setare este activată, istoricul navigării nu este salvat. Dacă această setare este dezactivată sau nu este setată, istoricul navigării este salvat.</translation>
 <translation id="7273823081800296768">Dacă această setare este activată sau nu este configurată, utilizatorii pot alege să împerecheze clienții și gazdele în momentul conectării, eliminând necesitatea de a introduce un PIN de fiecare dată.
 
           Dacă setarea este dezactivată, această funcție nu va fi disponibilă.</translation>
-<translation id="1675002386741412210">Acceptată pentru:</translation>
+<translation id="1675002386741412210">Acceptat de:</translation>
 <translation id="1608755754295374538">Adresele URL cărora li se va acorda acces automat la dispozitivele de capturare a conținutului audio</translation>
 <translation id="3547954654003013442">Setări proxy</translation>
 <translation id="5921713479449475707">Permite descărcarea actualizărilor automate prin HTTP</translation>
 
       Dacă lăsați politica neconfigurată, utilizatorii vor avea posibilitatea de a alege dacă folosesc sau nu funcția serverului proxy pentru comprimarea datelor.</translation>
 <translation id="2170233653554726857">Activați optimizarea pentru WPAD</translation>
-<translation id="7424751532654212117">Lista cu excepții de la lista cu pluginuri dezactivate</translation>
+<translation id="7424751532654212117">Lista de excepții de la lista cu pluginuri dezactivate</translation>
 <translation id="6233173491898450179">Setați directorul de descărcare</translation>
 <translation id="8908294717014659003">Vă permite să stabiliți dacă site-urile web au acces la dispozitivele de captură media. Accesul la dispozitivele de captură media poate fi permis în mod prestabilit sau se poate solicita confirmarea utilizatorului de fiecare dată când un site web dorește acces la dispozitivele de captură media.
 
       Dacă politica nu este configurată, utilizatorul poate opta pentru a afișa sau pentru a ascunde comanda rapidă pentru aplicații din meniul contextual al barei de marcaje.
 
       Dacă politica este configurată, utilizatorul nu o poate modifica, iar comanda rapidă pentru aplicații este afișată întotdeauna sau nu este afișată niciodată.</translation>
-<translation id="2299220924812062390">Specificați o listă cu pluginuri activate</translation>
+<translation id="2299220924812062390">Specificați o listă de pluginuri activate</translation>
 <translation id="4325690621216251241">Adăugați un buton de deconectare în bara de sistem</translation>
 <translation id="924557436754151212">Importați parolele salvate din browserul prestabilit, la prima rulare</translation>
-<translation id="1465619815762735808">Faceți clic pentru redare</translation>
+<translation id="1465619815762735808">Dați clic pentru redare</translation>
 <translation id="7227967227357489766">Această politică definește lista de utilizatori care au permisiunea de a se conecta la dispozitiv. Intrările sunt de forma <ph name="USER_WHITELIST_ENTRY_FORMAT"/>, cum ar fi <ph name="USER_WHITELIST_ENTRY_EXAMPLE"/>. Pentru a accepta utilizatori arbitrari pe un anumit domeniu, utilizați intrări de forma <ph name="USER_WHITELIST_ENTRY_WILDCARD"/>.
 
       Dacă această politică nu este configurată, nu există restricții cu privire la utilizatorii cărora li se permite să se conecteze. Rețineți că la crearea unor noi utilizatori, este necesar în continuare ca politica <ph name="DEVICEALLOWNEWUSERS_POLICY_NAME"/> să fie configurată în mod corespunzător.</translation>
           Dacă politica nu este setată, se utilizează o perioadă de timp prestabilită.
 
           Valoarea politicii trebuie specificată în milisecunde. Valorile trebuie să fie mai mici sau egale cu intervalul de inactivitate.</translation>
-<translation id="1897365952389968758">Permiteți tuturor site-urilor să ruleze JavaScript</translation>
+<translation id="1897365952389968758">Permite tuturor site-urilor să ruleze JavaScript</translation>
 <translation id="922540222991413931">Configurați sursele pentru instalarea extensiilor, a aplicațiilor și a scripturilor de utilizator</translation>
 <translation id="7323896582714668701">Parametri de linie de comandă suplimentari pentru <ph name="PRODUCT_NAME"/></translation>
 <translation id="6931242315485576290">Dezactivați sincronizarea datelor cu Google</translation>
       Dacă valoarea pentru această politică este 0, se va utiliza dimensiunea prestabilită a memoriei cache, dar utilizatorul nu o va putea modifica.
 
       Dacă această politică nu este setată, se va utiliza dimensiunea prestabilită, iar utilizatorul o va putea modifica folosind parametrul --media-cache-size.</translation>
-<translation id="5142301680741828703">Redați întotdeauna următoarele modele pentru adresele URL în <ph name="PRODUCT_FRAME_NAME"/></translation>
+<translation id="5142301680741828703">Redați întotdeauna următoarele șabloane de adrese URL în <ph name="PRODUCT_FRAME_NAME"/></translation>
 <translation id="4625915093043961294">Configurați lista albă pentru instalarea extensiilor</translation>
 <translation id="5893553533827140852">Dacă această setare este activată, solicitările de autentificare gnubby vor fi trimise printr-un proxy folosindu-se o conexiune a gazdei la distanță.
 
 <translation id="3101501961102569744">Alegeți modul de specificare a setărilor serverului proxy</translation>
 <translation id="1803646570632580723">Listare aplicații fixate de afișat în lansator</translation>
 <translation id="1062011392452772310">Activați atestarea la distanță pentru dispozitiv</translation>
-<translation id="7774768074957326919">Utilizați setările proxy-ului pentru sistem</translation>
+<translation id="7774768074957326919">Utilizează setările proxy-ului pentru sistem</translation>
 <translation id="3891357445869647828">Activați JavaScript</translation>
 <translation id="2274864612594831715">Această politică configurează activarea tastaturii virtuale ca dispozitiv de introducere a textului în sistemul de operare Chrome. Utilizatorii nu pot înlocui această politică.
 
 
       Dacă politica nu este configurată, tastatura pe ecran este dezactivată inițial, dar poate fi activată oricând de utilizator. De asemenea, pot fi utilizate reguli euristice pentru a se decide când să se afișeze tastatura.</translation>
 <translation id="6774533686631353488">Permiteți gazde de mesagerie nativă la nivel de utilizator (instalate fără permisiuni de administrator)</translation>
-<translation id="868187325500643455">Permiteți tuturor site-urilor să ruleze automat pluginuri</translation>
+<translation id="868187325500643455">Permite tuturor site-urilor să ruleze automat pluginuri</translation>
 <translation id="7421483919690710988">Setați dimensiunea în octeți a memoriei cache pe disc pentru conținut media</translation>
 <translation id="5226033722357981948">Specificați dacă instrumentul de găsire de pluginuri ar trebui dezactivat</translation>
 <translation id="7234280155140786597">Numele gazdelor de mesagerie nativă interzise (sau * pentru toate)</translation>
 <translation id="2324547593752594014">Permite conectarea la Chrome</translation>
 <translation id="172374442286684480">Permiteți tuturor site-urilor să seteze date locale</translation>
 <translation id="1151353063931113432">Permiteți imagini de pe aceste site-uri</translation>
-<translation id="1297182715641689552">Utilizați un script .pac pentru proxy</translation>
+<translation id="1297182715641689552">Utilizează un script .pac pentru proxy</translation>
 <translation id="2976002782221275500">Indică intervalul de timp fără intervenția utilizatorului după care luminozitatea ecranului este redusă atunci când dispozitivul funcționează pe baterie.
 
           Dacă politica este setată la o valoare mai mare decât zero, specifică intervalul de timp în care utilizatorul trebuie să fie inactiv înainte ca <ph name="PRODUCT_OS_NAME"/> să reducă luminozitatea ecranului.
 <translation id="2113068765175018713">Limitează durata de funcționare a dispozitivului prin repornirea automată a acestuia</translation>
 <translation id="4224610387358583899">Intervalele până la blocarea ecranului</translation>
 <translation id="5388730678841939057">Selectează strategia folosită pentru eliberarea spațiului pe disc în timpul curățării automate (învechită)</translation>
-<translation id="7848840259379156480">Vă permite să configurați motorul de redare HTML prestabilit atunci când <ph name="PRODUCT_FRAME_NAME"/> este instalat. Setarea prestabilită este să permiteți browserului gazdă să efectueze redarea, dar opțional o puteți anula, pentru ca <ph name="PRODUCT_FRAME_NAME"/> să redea paginile HTML în mod prestabilit.</translation>
+<translation id="7848840259379156480">Vă permite să configurați motorul de redare HTML prestabilit atunci când <ph name="PRODUCT_FRAME_NAME"/> este instalat.
+      Setarea prestabilită este să permiteți browserului gazdă să efectueze redarea, dar
+      opțional o puteți anula, pentru ca <ph name="PRODUCT_FRAME_NAME"/> să redea paginile HTML în mod prestabilit.</translation>
 <translation id="186719019195685253">Acțiunea de urmat după trecerea intervalului de inactivitate dacă se utilizează o sursă de c.a.</translation>
 <translation id="197143349065136573">Activează vechiul flux de conectare online.
 
 <translation id="1734716591049455502">Configurați opțiunile de acces la distanță</translation>
 <translation id="7336878834592315572">Păstrați cookie-urile pe durata sesiunii</translation>
 <translation id="7715711044277116530">Procentajul cu care se ajustează intervalul până la reducerea luminozității ecranului în modul de prezentare</translation>
-<translation id="8777120694819070607">Permite <ph name="PRODUCT_NAME"/> să ruleze pluginuri învechite. Dacă activați această setare, pluginurile învechite sunt utilizate ca pluginuri normale. Dacă dezactivați această setare, pluginurile învechite nu vor fi utilizate, iar utilizatorilor nu li se va solicita permisiunea de a le rula. Dacă această setare nu este configurată, utilizatorilor li se va solicita permisiunea de a rula pluginuri învechite.</translation>
-<translation id="2629448496147630947">Configurați opțiunile de acces la distanță în <ph name="PRODUCT_NAME"/>. Aceste funcții sunt ignorate, cu excepția cazului în care este instalată aplicația web de acces la distanță.</translation>
+<translation id="8777120694819070607">Permite produsului <ph name="PRODUCT_NAME"/> să ruleze pluginuri neactualizate.
+
+      Dacă activați această setare, pluginurile neactualizate sunt utilizate ca pluginuri normale.
+
+      Dacă dezactivați această setare, pluginurile neactualizate nu vor fi utilizate, iar utilizatorilor nu li se va solicita permisiunea de a le rula.
+
+      Dacă această setare nu este configurată, utilizatorilor li se va solicita permisiunea de a rula pluginuri neactualizate.</translation>
+<translation id="2629448496147630947">Configurați opțiunile de acces la distanță în <ph name="PRODUCT_NAME"/>.
+
+      Aceste funcții sunt ignorate, cu excepția cazului în care este instalată aplicația web de acces la distanță.</translation>
 <translation id="4001275826058808087">Administratorii IT pentru dispozitivele companiei pot utiliza acest marcaj pentru a controla dacă utilizatorii pot valorifica oferte prin înregistrarea sistemului de operare Chrome.
 
       Dacă politica este activată sau nu este configurată, utilizatorii pot valorifica oferte prin înregistrarea sistemului de operare Chrome.
       Dacă această politică este lăsată nesetată, va fi utilizat directorul prestabilit pentru descărcare, dar utilizatorul îl va putea schimba.</translation>
 <translation id="7381326101471547614">Dezactivează utilizarea protocolul SPDY în <ph name="PRODUCT_NAME"/>. Dacă această politică este activată, protocolul SPDY nu va fi disponibil în <ph name="PRODUCT_NAME"/>. Dezactivarea acestei politici va permite utilizarea protocolului SPDY. Dacă această politică rămâne nesetată, SPDY va fi disponibil.</translation>
 <translation id="2208976000652006649">Parametrii pentru adresa URL a căutării care utilizează POST</translation>
-<translation id="1583248206450240930">Utilizați <ph name="PRODUCT_FRAME_NAME"/> în mod prestabilit</translation>
-<translation id="1047128214168693844">Nu permiteți niciunui site să urmărească locația fizică a utilizatorilor</translation>
+<translation id="1583248206450240930">Utilizează <ph name="PRODUCT_FRAME_NAME"/> în mod prestabilit</translation>
+<translation id="1047128214168693844">Nu permite niciunui site să urmărească locația fizică a utilizatorilor</translation>
 <translation id="4101778963403261403">Configurează tipul paginii de pornire prestabilite în <ph name="PRODUCT_NAME"/> și împiedică modificarea de către utilizatori a preferințelor pentru pagina de pornire. Pagina de pornire poate fi setată la o adresă URL pe care o specificați sau la pagina Filă nouă. Dacă activați această setare, este utilizată întotdeauna pagina Filă nouă pentru pagina de pornire, iar locația adresei URL a paginii de pornire este ignorată. Dacă dezactivați această setare, pagina de pornire a utilizatorului nu va fi niciodată pagina Filă nouă, cu excepția cazului în care adresa URL a acesteia este setată la „chrome://newtab”. Dacă activați sau dezactivați această setare, utilizatorii nu își pot schimba tipul paginii de pornire în <ph name="PRODUCT_NAME"/>. Dacă nu setați această politică, utilizatorul va putea să aleagă pe cont propriu dacă pagina Filă nouă este pagina sa de pornire.</translation>
 <translation id="8970205333161758602">Eliminați solicitarea de refuzare <ph name="PRODUCT_FRAME_NAME"/></translation>
-<translation id="3273221114520206906">Setare JavaScript standard</translation>
+<translation id="3273221114520206906">Setare JavaScript prestabilită</translation>
 <translation id="4025586928523884733">Blochează cookie-urile terță parte. Activarea acestei setări împiedică setarea cookie-urilor de către elemente ale paginii web care nu aparțin domeniului din bara de adrese a browserului. Dezactivarea acestei setări permite setarea cookie-urilor de elemente ale paginii web care nu aparțin domeniului din bara de adrese a browserului și îi împiedică pe utilizatori să schimbe această setare. Dacă această politică nu este setată, cookie-urile terță parte vor fi activate, dar utilizatorul va putea să schimbe acest lucru.</translation>
 <translation id="4604931264910482931">Configurați lista neagră a mesageriei native</translation>
 <translation id="6810445994095397827">Blocați JavaScript de pe aceste site-uri</translation>
 
       Politica trebuie setată la o adresă URL de la care <ph name="PRODUCT_OS_NAME"/> poate descărca Termenii și condițiile. Termenii și condițiile trebuie să fie în format de text simplu, de tip MIME text/plain. Nu se permite limbajul de markup.</translation>
 <translation id="2623014935069176671">Se așteaptă prima activitate a utilizatorului</translation>
-<translation id="2660846099862559570">Nu utilizați niciodată un proxy</translation>
+<translation id="2660846099862559570">Nu utiliza niciodată un proxy</translation>
 <translation id="637934607141010488">Raportează lista cu utilizatorii dispozitivului care s-au conectat recent.
 
       Dacă politica este dezactivată, utilizatorii nu vor fi raportați.</translation>
 <translation id="102492767056134033">Setați starea prestabilită a tastaturii pe ecran din ecranul de conectare</translation>
 <translation id="523505283826916779">Setări de accesibilitate</translation>
 <translation id="1948757837129151165">Politici pentru autentificarea HTTP</translation>
-<translation id="5946082169633555022">Canalul beta</translation>
+<translation id="5946082169633555022">Canal în versiune beta</translation>
 <translation id="7187256234726597551">Dacă această politică este activată, atestarea la distanță este permisă pentru dispozitiv. De asemenea, un certificat va fi generat și încărcat în mod automat pe Serverul de gestionare a dispozitivelor.
 
           Dacă această politică nu este activată sau configurată, nu se va genera niciun certificat și apelurile către API-ul pentru extensia enterprise.platformKeysPrivate nu vor reuși.</translation>
index 3722cb9..ec0ea8b 100644 (file)
@@ -1,28 +1,28 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
-<translation id="1503959756075098984">ID rozšírení a adresy URL aktualizácií, ktoré sa majú nainštalovať na pozadí</translation>
+<translation id="1503959756075098984">ID rozšírení a webové adresy aktualizácií, ktoré sa majú nainštalovať na pozadí</translation>
 <translation id="793134539373873765">Určuje, či sa pri aktualizovaní OS má použiť protokol p2p. Ak je táto možnosť nastavená na hodnotu True, zariadenia budú zdieľať aktualizácie a pokúsia sa ich sťahovať v sieti LAN, čím potenciálne znížia využitie a preťaženie rýchlosti pripojenia. Ak sa aktualizácie nedajú vykonať v sieti LAN, zariadenie ich prevezme z aktualizačného servera. Ak je táto možnosť nastavená na hodnotu False alebo nie je nakonfigurovaná, protokol p2p sa nepoužije.</translation>
 <translation id="2463365186486772703">Miestne nastavenie aplikácie</translation>
-<translation id="1397855852561539316">Adresa URL návrhu predvoleného poskytovateľa vyhľadávania</translation>
+<translation id="1397855852561539316">Webová adresa návrhu predvoleného poskytovateľa vyhľadávania</translation>
 <translation id="3347897589415241400">Predvolené správanie stránok, ktoré sa nenachádzajú v žiadnom obsahovom balíku.
 
           Toto pravidlo sa vzťahuje len na interné používanie prehliadača Chrome.</translation>
 <translation id="7040229947030068419">Vzorová hodnota:</translation>
-<translation id="1213523811751486361">Určuje adresu URL vyhľadávača, ktorý poskytuje návrhy pre vyhľadávanie. Adresa URL by mala obsahovať reťazec <ph name="SEARCH_TERM_MARKER"/>, ktorý bude počas posielania dopytu nahradený textom zadávaným používateľom.
+<translation id="1213523811751486361">Určuje webovú adresu vyhľadávača, ktorý poskytuje návrhy pre vyhľadávanie. Webová adresa by mala obsahovať reťazec <ph name="SEARCH_TERM_MARKER"/>, ktorý bude počas posielania dopytu nahradený textom zadávaným používateľom.
 
-          Toto pravidlo je voliteľné. Ak nebude nastavené, nepoužije sa žiadna adresa URL návrhu.
+          Toto pravidlo je voliteľné. Ak nebude nastavené, nepoužije sa žiadna webová adresa návrhu.
 
           Toto pravidlo bude dodržané len v prípade, ak je povolené pravidlo „DefaultSearchProviderEnabled“.</translation>
 <translation id="6106630674659980926">Povoliť správcu hesiel</translation>
 <translation id="7109916642577279530">Povolí alebo zamietne zaznamenávanie zvuku.
 
       Ak je toto pravidlo povolené alebo nenakonfigurované (predvolené), používateľovi sa zobrazí výzva
-      na prístup k zaznamenávaniu zvuku. Výnimkou sú adresy URL, ktoré sú nakonfigurované
+      na prístup k zaznamenávaniu zvuku. Výnimkou sú webové adresy, ktoré sú nakonfigurované
       v zozname AudioCaptureAllowedUrls a majú povolený prístup bez zobrazenia výzvy.
 
       Ak je pravidlo zakázané, používateľovi sa nikdy nezobrazí výzva a zaznamenávanie
-      zvuku bude k dispozícii iba pre adresy URL, ktoré sú nakonfigurované v zozname AudioCaptureAllowedUrls.
+      zvuku bude k dispozícii iba pre webové adresy, ktoré sú nakonfigurované v zozname AudioCaptureAllowedUrls.
 
       Toto pravidlo má vplyv na všetky typy zvukových vstupov, a nie len na vstavaný mikrofón.</translation>
 <translation id="7267809745244694722">Zmena predvoleného správania klávesov pre médiá na funkčné klávesy</translation>
@@ -65,7 +65,7 @@
 
           Škálovací faktor musí mať hodnotu aspoň 100 %.</translation>
 <translation id="7443616896860707393">Požiadavky typu cross-origin štandardu HTTP Basic Auth</translation>
-<translation id="2337466621458842053">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, na ktorých sa môžu zobrazovať obrázky.
+<translation id="2337466621458842053">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, na ktorých sa môžu zobrazovať obrázky.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultImagesSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="4680961954980851756">Povoliť automatické dopĺňanie</translation>
 <translation id="3185009703220253572">od verzie <ph name="SINCE_VERSION"/></translation>
 <translation id="5298412045697677971">Konfigurácia používateľského obrázka avatara.
 
-      Toto pravidlo vám dovoľuje nakonfigurovať si obrázok avatara, ktorý reprezentuje používateľa na prihlasovacej obrazovke. Pravidlo je nastavené špecifikovaním adresy URL, z ktorej si produkt <ph name="PRODUCT_OS_NAME"/> môže stiahnuť obrázok avatara a kryptografický kód hash použitý na overenie integrity sťahovania. Obrázok musí byť vo formáte JPEG a jeho veľkosť nesmie prekročiť 512 kB. Adresa URL musí byť prístupná bez overenia totožnosti.
+      Toto pravidlo vám dovoľuje nakonfigurovať si obrázok avatara, ktorý reprezentuje používateľa na prihlasovacej obrazovke. Pravidlo je nastavené špecifikovaním webovej adresy, z ktorej si produkt <ph name="PRODUCT_OS_NAME"/> môže stiahnuť obrázok avatara a kryptografický kód hash použitý na overenie integrity sťahovania. Obrázok musí byť vo formáte JPEG a jeho veľkosť nesmie prekročiť 512 kB. Webová adresa musí byť prístupná bez overenia totožnosti.
 
-      Obrázok avatara je stiahnutý a uložený do vyrovnávacej pamäte. Pri každej zmene adresy URL alebo kódu hash sa znova stiahne.
+      Obrázok avatara je stiahnutý a uložený do vyrovnávacej pamäte. Pri každej zmene webovej adresy alebo kódu hash sa znova stiahne.
 
-      Pravidlo by malo byť špecifikované ako reťazec, ktorý vyjadruje adresu URL a kód hash vo formáte JSON a riadi sa nasledujúcou schémou:
+      Pravidlo by malo byť špecifikované ako reťazec, ktorý vyjadruje webovú adresu a kód hash vo formáte JSON a riadi sa nasledujúcou schémou:
       {
         &quot;type&quot;: &quot;object&quot;,
         &quot;properties&quot;: {
           &quot;url&quot;: {
-            &quot;description&quot;: &quot;Adresa URL, z ktorej môže byť stiahnutý obrázok avatara.&quot;,
+            &quot;description&quot;: &quot;Webová adresa, z ktorej môže byť stiahnutý obrázok avatara.&quot;,
             &quot;type&quot;: &quot;string&quot;
           },
           &quot;hash&quot;: {
 
       Zakáže v prehliadači <ph name="PRODUCT_NAME"/> schémy protokolov uvedené v zozname.
 
-      Adresy URL so schémou z tohoto zoznamu sa nenačítajú ani sa na ne nebude dať prejsť.
+      Webové adresy so schémou z tohoto zoznamu sa nenačítajú ani sa na ne nebude dať prejsť.
 
       Ak je toto pravidlo nenastavené alebo je zoznam prázdny, bude sa dať v prehliadači <ph name="PRODUCT_NAME"/> pristupovať ku všetkým schémam.</translation>
 <translation id="3213821784736959823">Ovláda, či sa v prehliadači <ph name="PRODUCT_NAME"/> používa vstavaný klient DNS.
@@ -165,7 +165,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak toto pravidlo nastavíte, používatelia ho nemôžu zmeniť ani nahradiť.
 
       Hodnota pravidla by mala byť uvedená v milisekundách. Hodnoty musia byť v rozsahu od 30 sekúnd do 24 hodín.</translation>
-<translation id="9200828125069750521">Parametre pre adresu URL obrázkov, ktorá používa metódu POST</translation>
+<translation id="9200828125069750521">Parametre pre webovú adresu obrázkov, ktorá používa metódu POST</translation>
 <translation id="2769952903507981510">Konfigurácia povinného názvu domény pre hostiteľov vzdialeného prístupu</translation>
 <translation id="8294750666104911727">Stránky s prvkom X-UA-Compatible nastaveným na hodnotu chrome=1 sa obvykle vykreslia v rámci služby <ph name="PRODUCT_FRAME_NAME"/> bez ohľadu na pravidlo ChromeFrameRendererSettings.
 
@@ -250,7 +250,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
           Ak je hodnota pravidla nastavená na možnosť False alebo pravidlo nie je nastavené vôbec, volania rozhrania API zlyhajú a nahlásia kód chyby.</translation>
 <translation id="5809728392451418079">Nastaviť zobrazovaný názov pre miestne účty na zariadení</translation>
-<translation id="1427655258943162134">Adresa alebo adresa URL servera proxy</translation>
+<translation id="1427655258943162134">Adresa alebo webová adresa servera proxy</translation>
 <translation id="1827523283178827583">Použiť fixné servery proxy</translation>
 <translation id="3021409116652377124">Zakázať nástroj na hľadanie doplnkov</translation>
 <translation id="7236775576470542603">Nastaví predvolený typ lupy obrazovky, ktorý je povolený na prihlasovacej obrazovke.
@@ -292,9 +292,9 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
           Ak sa rozhodnete používať systémové nastavenia servera proxy alebo server proxy zisťovať automaticky, všetky ostatné možnosti budú ignorované.
 
-          Ak zvolíte režim pevne daného servera proxy, môžete zvoliť ďalšie možnosti v častiach „Adresa alebo adresa URL servera proxy“ a „Zoznam pravidiel vynechania servera proxy oddelených čiarkami“.
+          Ak zvolíte režim pevne daného servera proxy, môžete zvoliť ďalšie možnosti v častiach „Adresa alebo webová adresa servera proxy“ a „Zoznam pravidiel vynechania servera proxy oddelených čiarkami“.
 
-          Ak sa rozhodnete použiť skript PAC servera proxy, je potrebné zadať v časti „Adresa URL súboru PAC servera proxy“ adresu URL.
+          Ak sa rozhodnete použiť skript PAC servera proxy, je potrebné zadať v časti „Webová adresa súboru PAC servera proxy“ webovú adresu.
 
           Podrobné príklady nájdete na tejto adrese:
           <ph name="PROXY_HELP_URL"/>
@@ -309,7 +309,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="2067011586099792101">Blokovať prístup ku stránkam mimo balíkov obsahu</translation>
 <translation id="4980635395568992380">Typ údajov:</translation>
 <translation id="3096595567015595053">Zoznam povolených doplnkov</translation>
-<translation id="3048744057455266684">Ak je toto pravidlo nastavené a adresa URL vyhľadávania navrhnutá vo všeobecnom poli obsahuje tento parameter v reťazci dopytu alebo v identifikátore fragmentu, potom odporúčanie zobrazí hľadané výrazy a poskytovateľa vyhľadávania namiesto nespracovanej adresy URL vyhľadávania.
+<translation id="3048744057455266684">Ak je toto pravidlo nastavené a webová adresa vyhľadávania navrhnutá vo všeobecnom poli obsahuje tento parameter v reťazci dopytu alebo v identifikátore fragmentu, potom odporúčanie zobrazí hľadané výrazy a poskytovateľa vyhľadávania namiesto nespracovanej webovej adresy vyhľadávania.
 
           Toto pravidlo je voliteľné. Ak nie je nastavené, nedôjde k žiadnej výmene hľadaných výrazov.
 
@@ -332,7 +332,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak je toto pravidlo nastavené na hodnotu false, do režimu celej obrazovky nemôžu vstúpiť ani používatelia, ani aplikácie či rozšírenia.
 
       Keď je režim celej obrazovky zakázaný, je na všetkých platformách okrem systému <ph name="PRODUCT_OS_NAME"/> zakázaný aj režim verejného terminálu.</translation>
-<translation id="8828766846428537606">Nakonfiguruje v prehliadači <ph name="PRODUCT_NAME"/> predvolenú domovskú stránku a zabráni ju používateľom zmeniť. Nastavenia domovskej stránky používateľa sú úplne uzamknuté len vtedy, ak nastavíte domovskú stránku na stránku Nová karta alebo na vopred určenú adresu URL domovskej stránky. Ak túto adresu URL neurčíte, používateľ bude stále môcť nastaviť domovskú stránku na stránku Nová karta pomocou príkazu „chrome://newtab“.</translation>
+<translation id="8828766846428537606">Nakonfiguruje v prehliadači <ph name="PRODUCT_NAME"/> predvolenú domovskú stránku a zabráni ju používateľom zmeniť. Nastavenia domovskej stránky používateľa sú úplne uzamknuté len vtedy, ak nastavíte domovskú stránku na stránku Nová karta alebo na vopred určenú webovú adresu domovskej stránky. Ak túto webovú adresu neurčíte, používateľ bude stále môcť nastaviť domovskú stránku na stránku Nová karta pomocou príkazu „chrome://newtab“.</translation>
 <translation id="2231817271680715693">Importovať históriu prehliadania z predvoleného prehliadača pri prvom spustení</translation>
 <translation id="1353966721814789986">Stránky pri spustení</translation>
 <translation id="7173856672248996428">Efemérny profil</translation>
@@ -499,7 +499,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
           Ak toto pravidlo nastavené nie je, vykoná sa predvolená akcia, ktorou je režim spánku.
 
           Ak zvolíte prechod do režimu spánku, môžete nastaviť, či má systém <ph name="PRODUCT_OS_NAME"/> pred prechodom do režimu spánku obrazovku uzamknúť alebo nie.</translation>
-<translation id="3915395663995367577">Adresa URL súboru PAC servera proxy</translation>
+<translation id="3915395663995367577">Webová adresa súboru PAC servera proxy</translation>
 <translation id="1022361784792428773">ID rozšírení, ktorých inštalácia by mala byť používateľovi zakázaná (alebo hodnota * pre všetky)</translation>
 <translation id="6064943054844745819">Určí zoznam zastaraných funkcií webovej platformy, ktoré sa majú znova povoliť.
 
@@ -518,7 +518,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="7683777542468165012">Obnovenie dynamického pravidla</translation>
 <translation id="1160939557934457296">Zakázať pokračovanie zo stránky s upozornením Bezpečného prehliadania</translation>
 <translation id="8987262643142408725">Zakázať delenie záznamov protokolu SSL</translation>
-<translation id="4529945827292143461">Prispôsobte si zoznam vzorov adries URL, ktoré by mali byť vždy vykresľované hostiteľským prehliadačom.
+<translation id="4529945827292143461">Prispôsobte si zoznam vzorov webových adries, ktoré by mali byť vždy vykresľované hostiteľským prehliadačom.
 
           Ak toto pravidlo nenastavíte, pre všetky webové stránky sa použije predvolený vykresľovací modul (ako je určené pravidlom „ChromeFrameRendererSettings“).
 
@@ -531,7 +531,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak je toto nastavenie zakázané, webové stránky nebudú môcť používať jazyk JavaScript a používateľ toto nastavenie nebude môcť zmeniť.
 
       Ak toto pravidlo ponecháte nenastavené, webové stránky budú môcť používať jazyk JavaScript, ale používateľ bude môcť toto nastavenie zmeniť.</translation>
-<translation id="1942957375738056236">Tu môžete zadať adresu URL servera proxy.
+<translation id="1942957375738056236">Tu môžete zadať webovú adresu servera proxy.
 
           Toto pravidlo sa prejaví len v prípade, ak ste v časti „Zvoľte spôsob konfigurácie nastavení servera proxy“ zvolili ručné nastavenia servera proxy.
 
@@ -574,7 +574,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="8140204717286305802">Nahlásenie zoznamu sieťových rozhraní s typmi a adresami hardvéru pre server.
 
       Ak je pravidlo nastavené na hodnotu False, zoznam rozhraní sa nenahlási.</translation>
-<translation id="4962195944157514011">Určuje adresu URL vyhľadávača používaného pri predvolenom vyhľadávaní. Adresa URL by mala obsahovať reťazec <ph name="SEARCH_TERM_MARKER"/>, ktorý bude počas posielania dopytu nahradený používateľom hľadanými výrazmi.
+<translation id="4962195944157514011">Určuje webovú adresu vyhľadávača používaného pri predvolenom vyhľadávaní. Webová adresa by mala obsahovať reťazec <ph name="SEARCH_TERM_MARKER"/>, ktorý bude počas posielania dopytu nahradený používateľom hľadanými výrazmi.
 
           Táto možnosť musí byť nastavená v prípade, že je povolené pravidlo „DefaultSearchProviderEnabled“ a bude dodržané len v takom prípade.</translation>
 <translation id="6009903244351574348">Umožňuje doplnku <ph name="PRODUCT_FRAME_NAME"/> spracovávať uvedené typy obsahu.
@@ -601,7 +601,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Určuje čas, ktorý musí uplynúť pred zobrazením šetriča obrazovky na prihlasovacej obrazovke v režime určenom pre predaj.
 
       Hodnota pre toto pravidlo by mala byť zadaná v milisekundách.</translation>
-<translation id="6368011194414932347">Konfigurovať adresu URL domovskej stránky</translation>
+<translation id="6368011194414932347">Konfigurovať webovú adresu domovskej stránky</translation>
 <translation id="2877225735001246144">Zakázať hľadanie záznamov CNAME pri absolvovaní overenia Kerberos</translation>
 <translation id="9120299024216374976">Určuje, ktoré časové pásmo sa má v zariadení použiť. Používatelia môžu prepísať stanovené časové pásmo pre aktuálnu reláciu. Po odhlásení sa však nastaví späť na pôvodne určené časové pásmo. V prípade zadania nesprávnej hodnoty je pravidlo namiesto toho stále aktivované pomocou možnosti GMT. Ak reťazec zostane prázdny, bude sa pravidlo ignorovať.
 
@@ -640,7 +640,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
           Ak je toto nastavenie povolené, hostitelia môžu byť zdieľaní iba prostredníctvom účtov zaregistrovaných v danom názve domény.
 
           Ak je toto nastavenie zakázané alebo nie je nastavené, hostiteľov je možné zdieľať prostredníctvom ľubovoľného účtu.</translation>
-<translation id="6417861582779909667">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré nemôžu nastavovať súbory cookie.
+<translation id="6417861582779909667">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré nemôžu nastavovať súbory cookie.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultCookiesSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="5776485039795852974">Opýtať sa vždy, keď chcú stránky zobrazovať upozornenia na pracovnej ploche</translation>
@@ -651,7 +651,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
       Ak nie je nastavené, môže sa používateľovi zobraziť výzva, či chce históriu prehliadania importovať, alebo môže import prebehnúť automaticky.</translation>
 <translation id="6786747875388722282">Rozšírenia</translation>
-<translation id="7132877481099023201">Adresy URL, ktorým bude udelený prístup k zariadeniam na zaznamenávanie videa bez zobrazenia výzvy</translation>
+<translation id="7132877481099023201">Webové adresy, ktorým bude udelený prístup k zariadeniam na zaznamenávanie videa bez zobrazenia výzvy</translation>
 <translation id="8947415621777543415">Nahlasovať polohu zariadenia</translation>
 <translation id="1655229863189977773">Nastaviť veľkosť vyrovnávacej pamäte disku v bajtoch</translation>
 <translation id="3358275192586364144">Povolí optimalizáciu služby <ph name="PRODUCT_NAME"/> pomocou protokolu WPAD a zabráni používateľom meniť toto nastavenie.
@@ -662,11 +662,11 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       nebude môcť zmeniť.</translation>
 <translation id="6376842084200599664">Umožňuje zadať zoznam rozšírení, ktoré sa nainštalujú na pozadí bez interakcie používateľa.
 
-          Jednotlivé položky zoznamu predstavujú reťazec, ktorý obsahuje ID rozšírenia a adresu URL aktualizácie oddelené dvojbodkou (<ph name="SEMICOLON"/>). ID rozšírenia je reťazec 32 písmen, ktorý môžete nájsť napríklad na stránke <ph name="CHROME_EXTENSIONS_LINK"/> v režime vývojára. Adresa URL aktualizácie by mala smerovať na dokument XML s manifestom aktualizácie v súlade s návodom na stránke <ph name="LINK_TO_EXTENSION_DOC1"/>. Upozorňujeme, že adresa URL aktualizácie uvedená v tomto pravidle sa použije iba pri počiatočnej inštalácii a pri následných aktualizáciách rozšírenia sa použije aktualizovaná adresa URL uvedená v manifeste rozšírenia.
+          Jednotlivé položky zoznamu predstavujú reťazec, ktorý obsahuje ID rozšírenia a webovú adresu aktualizácie oddelené dvojbodkou (<ph name="SEMICOLON"/>). ID rozšírenia je reťazec 32 písmen, ktorý môžete nájsť napríklad na stránke <ph name="CHROME_EXTENSIONS_LINK"/> v režime vývojára. Webová adresa aktualizácie by mala smerovať na dokument XML s manifestom aktualizácie v súlade s návodom na stránke <ph name="LINK_TO_EXTENSION_DOC1"/>. Upozorňujeme, že webová adresa aktualizácie uvedená v tomto pravidle sa použije iba pri počiatočnej inštalácii a pri následných aktualizáciách rozšírenia sa použije aktualizovaná webová adresa uvedená v manifeste rozšírenia.
 
-          Prehliadač <ph name="PRODUCT_NAME"/> prijme v prípade každej položky rozšírenie určené ID rozšírenia z aktualizačnej služby umiestnenej na zadanej adrese URL aktualizácie a nainštaluje ho na pozadí.
+          Prehliadač <ph name="PRODUCT_NAME"/> prijme v prípade každej položky rozšírenie určené ID rozšírenia z aktualizačnej služby umiestnenej na zadanej webovej adrese aktualizácie a nainštaluje ho na pozadí.
 
-          Položka <ph name="EXTENSION_POLICY_EXAMPLE"/> napríklad nainštaluje rozšírenie <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME"/> z bežnej adresy URL aktualizácie pre Internetový obchod Chrome. Viac informácií o rozšíreniach nájdete na adrese: <ph name="LINK_TO_EXTENSION_DOC2"/>.
+          Položka <ph name="EXTENSION_POLICY_EXAMPLE"/> napríklad nainštaluje rozšírenie <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME"/> z bežnej webovej adresy aktualizácie pre Internetový obchod Chrome. Viac informácií o rozšíreniach nájdete na adrese: <ph name="LINK_TO_EXTENSION_DOC2"/>.
 
           Používatelia nebudú môcť odinštalovať rozšírenia, ktoré sú určené v tomto pravidle. Ak z tohto zoznamu odstránite niektoré z rozšírení, prehliadač <ph name="PRODUCT_NAME"/> ho automaticky odinštaluje. Rozšírenia uvedené v tomto zozname sa tiež automaticky pridajú na bielu listinu pre inštaláciu a nastavenie ExtensionsInstallBlacklist na ne nebude mať vplyv.
 
@@ -684,7 +684,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
           Ak toto nastavenie povolíte a zadáte neštandardný port (t.j. iný port ako 80 či 443), zahrnie sa do vygenerovaného hlavného názvu služby protokolu Kerberos.
 
           Ak toto nastavenie zakážete alebo ho ponecháte nenastavené, port sa do vygenerovaného hlavného názvu služby protokolu Kerberos v žiadnom prípade nezahrnie.</translation>
-<translation id="3236046242843493070">Vzory adries URL na povolenie zdrojov inštalácie rozšírenia, aplikácie a skriptov používateľa</translation>
+<translation id="3236046242843493070">Vzory webových adries na povolenie zdrojov inštalácie rozšírenia, aplikácie a skriptov používateľa</translation>
 <translation id="2498238926436517902">Poličku vždy skrývať automaticky</translation>
 <translation id="253135976343875019">Oneskorenie upozornenia na nečinnosť pri napájaní zo siete</translation>
 <translation id="480987484799365700">Ak sa povolí toto pravidlo, vynúti prepnutie profilu do efemérneho režimu. Ak sa pravidlo určí ako pravidlo pre operačný systém (napr. pravidlo GPO v systéme Windows), bude platiť pre každý profil v systéme; ak sa pravidlo nastaví ako cloudové pravidlo, bude platiť iba pre profil prihlásený pomocou spravovaného účtu.
@@ -695,35 +695,35 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
       Ak sa toto pravidlo zakáže alebo ponechá nenastavené, po prihlásení sa použijú bežné profily.</translation>
 <translation id="6997592395211691850">Toto pravidlo určuje, či sa pre miestne dôveryhodné ukotvenia vyžadujú kontroly OCSP/CRL online</translation>
-<translation id="152657506688053119">Zoznam alternatívnych adries URL pre predvoleného poskytovateľa vyhľadávania</translation>
+<translation id="152657506688053119">Zoznam alternatívnych webových adries pre predvoleného poskytovateľa vyhľadávania</translation>
 <translation id="8992176907758534924">Zakázať všetkým stránkam zobrazovať obrázky</translation>
 <translation id="262740370354162807">Povolí odoslanie dokumentov do služby <ph name="CLOUD_PRINT_NAME"/></translation>
 <translation id="7717938661004793600">Konfigurujte funkcie zjednodušenia prístupu v systéme <ph name="PRODUCT_OS_NAME"/>.</translation>
 <translation id="5182055907976889880">Konfigurácia služby Disk Google v systéme <ph name="PRODUCT_OS_NAME"/>.</translation>
 <translation id="8704831857353097849">Zoznam zakázaných doplnkov</translation>
-<translation id="467449052039111439">Otvoriť zoznam adries URL</translation>
+<translation id="467449052039111439">Otvoriť zoznam webových adries</translation>
 <translation id="1988371335297483117">Dátové časti automatických aktualizácií systému <ph name="PRODUCT_OS_NAME"/> je možné namiesto protokolu HTTPS stiahnuť prostredníctvom protokolu HTTP. To umožňuje sťahovanie protokolu HTTP transparentne ukladať do vyrovnávacej pamäte protokolu HTTP.
 
       Ak toto pravidlo nastavíte na hodnotu true, systém <ph name="PRODUCT_OS_NAME"/> sa bude pokúšať sťahovať dátové časti automatických aktualizácií prostredníctvom protokolu HTTP. Ak pravidlo nastavíte na hodnotu false alebo ho nenastavíte, na sťahovanie dátových častí automatických aktualizácií sa použije protokol HTTPS.</translation>
 <translation id="5883015257301027298">Predvolené nastavenie súborov cookie</translation>
-<translation id="5017500084427291117">Umožňuje zablokovať prístup k adresám URL uvedeným v zozname.
+<translation id="5017500084427291117">Umožňuje zablokovať prístup k webovým adresám uvedeným v zozname.
 
-      Toto pravidlo bráni používateľom načítať webové stránky zo zoznamu zakázaných adries URL.
+      Toto pravidlo bráni používateľom načítať webové stránky zo zoznamu zakázaných webových adries.
 
-      Adresa URL má formát „schéma://hostiteľ:port/cesta“.
+      Webová adresa má formát „schéma://hostiteľ:port/cesta“.
       Ako schému je možné zvoliť http, https alebo ftp. Blokovaný bude len zvolený typ schémy. Ak schému neuvediete, budú blokované všetky schémy.
       Hostiteľom môže byť názov hostiteľa alebo adresa IP. Blokovaná bude aj subdoména názvu hostiteľa. Ak chcete zabrániť blokovaniu subdomén, zadajte pred názov hostiteľa bodku „.“.  Špeciálny názov hostiteľa „*“ zablokuje všetky domény.
       Ako port je možné zvoliť platné číslo portu v rozpätí od 1 do 65 535. Ak port neuvediete, budú blokované všetky porty.
       Ak je určená voliteľná cesta, budú blokované iba cesty s príslušnou predponou.
 
-      Výnimky môžu byť definované v pravidle zoznamu povolených adries URL. Počet záznamov v tomto pravidle je obmedzený na 1 000. Všetky ďalšie záznamy budú ignorované.
+      Výnimky môžu byť definované v pravidle zoznamu povolených webových adries. Počet záznamov v tomto pravidle je obmedzený na 1 000. Všetky ďalšie záznamy budú ignorované.
 
-      Ak toto pravidlo nie je nastavené, do zoznamu zakázaných adries URL sa nebudú v prehliadači pridávať žiadne adresy URL.</translation>
+      Ak toto pravidlo nie je nastavené, do zoznamu zakázaných webových adries sa nebudú v prehliadači pridávať žiadne webové adresy.</translation>
 <translation id="2762164719979766599">Určuje zoznam miestnych účtov na zariadení, ktoré sa majú zobrazovať na obrazovke prihlásenia.
 
       Každá položka v zozname určuje identifikátor, ktorý sa používa interne na rozpoznanie odlišných miestnych účtov na zariadení.</translation>
 <translation id="8955719471735800169">Späť na začiatok</translation>
-<translation id="4557134566541205630">Predvolená adresa URL stránky novej karty poskytovateľa vyhľadávania</translation>
+<translation id="4557134566541205630">Predvolená webová adresa stránky novej karty poskytovateľa vyhľadávania</translation>
 <translation id="546726650689747237">Oneskorenie zníženia jasu obrazovky pri používaní napájacieho zdroja</translation>
 <translation id="4988291787868618635">Akcia po určitej dobe nečinnosti</translation>
 <translation id="7260277299188117560">Protokol p2p na automatické aktualizácie je povolený</translation>
@@ -732,7 +732,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
           Ak toto pravidlo ponecháte nenastavené, použije sa pravidlo „AllowCookies“ a používateľ to bude môcť zmeniť.</translation>
 <translation id="4250680216510889253">Nie</translation>
 <translation id="1522425503138261032">Povoliť stránkam sledovať fyzickú polohu používateľov</translation>
-<translation id="6467433935902485842">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré nemôžu spúšťať doplnky.
+<translation id="6467433935902485842">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré nemôžu spúšťať doplnky.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultPluginsSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="4423597592074154136">Ručne určiť nastavenia servera proxy</translation>
@@ -753,7 +753,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="6211428344788340116">Nahlásenie časov aktivity zariadenia.
 
       Ak toto pravidlo nenastavíte alebo ho nastavíte na hodnotu True, registrované zariadenia budú nahlasovať časové obdobia, kedy používateľ zariadenie aktívne používa. Ak je nastavené na hodnotu False, časy aktivity zariadenia sa nebudú zaznamenávať ani nahlasovať.</translation>
-<translation id="3964909636571393861">Umožňuje prístup k zoznamu adries URL</translation>
+<translation id="3964909636571393861">Umožňuje prístup k zoznamu webových adries</translation>
 <translation id="1811270320106005269">Povolí uzamknutie v prípade, ak sú zariadenia nečinné alebo pozastavené.
 
       Ak toto nastavenie povolíte, pri pokuse o odomknutie zariadenia a prebudenie z režimu spánku sa používateľom zobrazí výzva na zadanie hesla.
@@ -825,7 +825,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
           Toto pravidlo sa rešpektuje iba v prípade, ak je povolené pravidlo DefaultSearchProviderEnabled.</translation>
 <translation id="8818646462962777576">Vzory v tomto zozname sa porovnajú s pôvodom
-      zabezpečenia adresy URL, ktorá poslala žiadosť. Ak sa nájde zhoda,
+      zabezpečenia webovej adresy, ktorá poslala žiadosť. Ak sa nájde zhoda,
       prístup k zariadeniam na zaznamenávanie zvuku sa udelí bez výzvy.
 
       POZNÁMKA: Toto pravidlo je v súčasnosti podporované iba v režime kiosku.</translation>
@@ -834,13 +834,13 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="6401669939808766804">Odhlásiť používateľa</translation>
 <translation id="4826326557828204741">Akcia, ktorá sa má vykonať po uplynutí určitého času nečinnosti počas prevádzky na batérii</translation>
 <translation id="7912255076272890813">Nakonfigurovať povolené typy aplikácií/rozšírení</translation>
-<translation id="817455428376641507">Umožňuje pristupovať k adresám URL uvedeným v zozname, ktoré predstavujú výnimky pre zoznam zakázaných adries URL.
+<translation id="817455428376641507">Umožňuje pristupovať k webovým adresám uvedeným v zozname, ktoré predstavujú výnimky pre zoznam zakázaných webových adries.
 
-      Informácie o formáte položiek v zozname nájdete v popise pravidla na zablokovanie adries URL.
+      Informácie o formáte položiek v zozname nájdete v popise pravidla na zablokovanie webových adries.
 
-      Toto pravidlo umožňuje otvárať výnimky pre zoznamy zakázaných adries URL. Na zoznam zakázaných položiek môžete napríklad pridať položku „*“, ktorá zablokuje všetky žiadosti, a pomocou tohto pravidla následne môžete povoliť prístup k obmedzenému zoznamu adries URL. Môže sa použiť na otváranie určitých schém, subdomén a ďalších domén, portov alebo konkrétnych ciest.
+      Toto pravidlo umožňuje otvárať výnimky pre zoznamy zakázaných webových adries. Na zoznam zakázaných položiek môžete napríklad pridať položku „*“, ktorá zablokuje všetky žiadosti, a pomocou tohto pravidla následne môžete povoliť prístup k obmedzenému zoznamu webových adries. Môže sa použiť na otváranie určitých schém, subdomén a ďalších domén, portov alebo konkrétnych ciest.
 
-      O povolení alebo zablokovaní adresy URL rozhodne najkonkrétnejší filter. Biela listina má prednosť pred zoznamom zakázaných položiek.
+      O povolení alebo zablokovaní webové adresy rozhodne najkonkrétnejší filter. Biela listina má prednosť pred zoznamom zakázaných položiek.
 
       Toto pravidlo je obmedzené na 1 000 položiek. Ostatné položky sa budú ignorovať.
 
@@ -886,16 +886,16 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
       Zoznam rozšírení, ktoré sa automaticky nainštalujú pre používateľa ukážky v zariadeniach v režime predaja. Tieto rozšírenia sa uložia v zariadení a po inštalácii môžu byť nainštalované v režime offline.
 
-      Každý záznam v zozname obsahuje adresár, ktorý musí zahŕňať ID rozšírenia v poli „extension-id“ a jeho adresu URL pre aktualizácie v poli „update-url“.</translation>
+      Každý záznam v zozname obsahuje adresár, ktorý musí zahŕňať ID rozšírenia v poli „extension-id“ a jeho webovú adresu pre aktualizácie v poli „update-url“.</translation>
 <translation id="9096086085182305205">Zoznam povolených overovacích serverov</translation>
 <translation id="4980301635509504364">Povolí alebo zamietne zaznamenávanie videa.
 
       Ak je toto pravidlo povolené alebo nenakonfigurované (predvolené), používateľovi sa zobrazí výzva
-      na prístup k zaznamenávaniu videa. Výnimkou sú adresy URL, ktoré sú nakonfigurované
+      na prístup k zaznamenávaniu videa. Výnimkou sú webové adresy, ktoré sú nakonfigurované
       v zozname VideoCaptureAllowedUrls a majú povolený prístup bez zobrazenia výzvy.
 
       Ak je pravidlo zakázané, používateľovi sa nikdy nezobrazí výzva a zaznamenávanie
-      videa bude k dispozícii iba pre adresy URL, ktoré sú nakonfigurované v zozname VideoCaptureAllowedUrls.
+      videa bude k dispozícii iba pre webové adresy, ktoré sú nakonfigurované v zozname VideoCaptureAllowedUrls.
 
       Toto pravidlo má vplyv na všetky typy vstupov videa, a nie len na vstavanú kameru.</translation>
 <translation id="7063895219334505671">Povoliť na týchto stránkach kontextové okná</translation>
@@ -946,7 +946,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="7091198954851103976">Vždy spustí doplnky, ktoré vyžadujú autorizáciu</translation>
 <translation id="1708496595873025510">Nastaviť obmedzenie pre načítanie počiatočnej hodnoty variácie</translation>
 <translation id="8870318296973696995">Domovská stránka</translation>
-<translation id="1240643596769627465">Určuje adresu URL vyhľadávača, ktorý poskytuje výsledky dynamického vyhľadávania. Adresa URL by mala obsahovať reťazec <ph name="SEARCH_TERM_MARKER"/>, ktorý bude počas posielania dopytu nahradený textom zadávaným používateľom.
+<translation id="1240643596769627465">Určuje webovú adresu vyhľadávača, ktorý poskytuje výsledky dynamického vyhľadávania. Webová adresa by mala obsahovať reťazec <ph name="SEARCH_TERM_MARKER"/>, ktorý bude počas posielania dopytu nahradený textom zadávaným používateľom.
 
           Toto pravidlo je voliteľné. Ak ho nenastavíte, nebudú sa vám zobrazovať žiadne výsledky dynamického vyhľadávania.
 
@@ -955,7 +955,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
       Ak túto možnosť nastavíte ako zakázanú alebo ju ponecháte nenastavenú, nástroj na vyhľadávanie doplnkov bude aktívny.</translation>
 <translation id="2650049181907741121">Akcia pri zavretí veka</translation>
-<translation id="7880891067740158163">Umožňuje uviesť zoznam vzorov adries URL webových stránok, pre ktoré by mal prehliadač <ph name="PRODUCT_NAME"/> automaticky vybrať certifikáty klienta (ak webová stránka certifikát vyžaduje).
+<translation id="7880891067740158163">Umožňuje uviesť zoznam vzorov webových adries webových stránok, pre ktoré by mal prehliadač <ph name="PRODUCT_NAME"/> automaticky vybrať certifikáty klienta (ak webová stránka certifikát vyžaduje).
 
           Ak toto pravidlo ponecháte nenastavené, automatický výber sa nevykoná pre žiadnu webovú stránku.</translation>
 <translation id="3866249974567520381">Popis</translation>
@@ -970,7 +970,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak bude toto nastavenie ponecháte nenastavené, povolí sa, no používateľ to bude môcť zmeniť.</translation>
 <translation id="2236488539271255289">Nepovoliť žiadnym stránkam nastaviť miestne údaje</translation>
 <translation id="4467952432486360968">Blokovať súbory cookie tretej strany</translation>
-<translation id="1305864769064309495">Slovník s mapovaním adries URL na boolovské identifikátory, ktoré určujú, či bude prístup k hostiteľovi povolený (true) alebo zablokovaný (false).
+<translation id="1305864769064309495">Slovník s mapovaním webových adries na boolovské identifikátory, ktoré určujú, či bude prístup k hostiteľovi povolený (true) alebo zablokovaný (false).
 
           Toto pravidlo sa vzťahuje iba na interné používanie prehliadača Chrome.</translation>
 <translation id="5586942249556966598">Nevykonať žiadnu akciu</translation>
@@ -986,7 +986,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
           Nastavením zvyšku predvolených pravidiel vyhľadávania môžete určiť predvoleného poskytovateľa vyhľadávania, ktorý sa má použiť.
 
-          Ak ich nenastavíte, používateľ si bude môcť zvoliť predvoleného poskytovateľa. Ak toto nastavenie zakážete, pri zadaní textu (ktorý nie je adresou URL) do všeobecného poľa neprebehne žiadne vyhľadávanie.
+          Ak ich nenastavíte, používateľ si bude môcť zvoliť predvoleného poskytovateľa. Ak toto nastavenie zakážete, pri zadaní textu (ktorý nie je webovou adresou) do všeobecného poľa neprebehne žiadne vyhľadávanie.
 
           Ak nastavenie povolíte alebo zakážete, používatelia nebudú môcť v prehliadači <ph name="PRODUCT_NAME"/> dané nastavenie zmeniť ani prekonať.
 
@@ -1017,7 +1017,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak sa toto pravidlo nastaví na hodnotu RemoveLRUIfDormant, automatické čistenie bude odstraňovať používateľov, ktorí sa neprihlásili aspoň tri mesiace v poradí od najdlhšie neprihláseného používateľa dovtedy, kým sa neuvoľní dostatok voľného miesta.
 
       Ak sa toto pravidlo nenastaví, automatické čistenie použije predvolenú vstavanú stratégiu, ktorá v súčasnosti predstavuje stratégiu RemoveLRUIfDormant.</translation>
-<translation id="6923366716660828830">Určuje názov predvoleného poskytovateľa vyhľadávania. Ak sa pole nevyplní alebo bude pravidlo ponechané nenastavené, použije sa názov hostiteľa určený adresou URL vyhľadávania.
+<translation id="6923366716660828830">Určuje názov predvoleného poskytovateľa vyhľadávania. Ak sa pole nevyplní alebo bude pravidlo ponechané nenastavené, použije sa názov hostiteľa určený webovou adresou vyhľadávania.
 
           Toto pravidlo sa vezme do úvahy len v prípade, ak je povolené pravidlo „DefaultSearchProviderEnabled“.</translation>
 <translation id="4869787217450099946">Určuje, či sú povolené uzamknutia obrazovky v aktívnom režime. Rozšírenia môžu o uzamknutie obrazovky v aktívnom režime požiadať prostredníctvom rozhrania API na správu napájania pre rozšírenia.
@@ -1041,7 +1041,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
           Hodnota pravidla by mala byť uvedená v milisekundách. Hodnoty musia byť nižšie ako oneskorenie režimu nečinnosti.</translation>
 <translation id="7651739109954974365">Určuje, či bude v zariadení povolený roaming pre dátové prenosy. Ak je pravidlo nastavené na hodnotu true, roaming pre dátové prenosy bude povolený. Ak ho ponecháte nenakonfigurované alebo ho nastavíte na hodnotu false, roaming pre dátové prenosy nebude k dispozícii.</translation>
-<translation id="6244210204546589761">Adresy URL otvárané pri spustení</translation>
+<translation id="6244210204546589761">Webové adresy otvárané pri spustení</translation>
 <translation id="7468416082528382842">Umiestnenie v registri systému Windows:</translation>
 <translation id="1808715480127969042">Blokovať súbory cookie na týchto webových stránkach</translation>
 <translation id="1908884158811109790">Zakázať v aplikácii Súbory systému OS Chrome používanie služby Disk Google prostredníctvom mobilných pripojení</translation>
@@ -1085,11 +1085,11 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
           Odporúčaný spôsob uzamknutia obrazovky pri nečinnosti je povoliť uzamknutie obrazovky pri pozastavení a pozastaviť tak systém <ph name="PRODUCT_OS_NAME"/> po uplynutí času nečinnosti. Toto pravidlo použite iba v prípade, že chcete obrazovku uzamknúť podstatne skôr ako má dôjsť k pozastaveniu, alebo v prípade, že pozastavenie pri nečinnosti nechcete vôbec používať.
 
           Hodnota tohto pravidla sa zadáva v milisekundách. Ak zadáte hodnotu vyššiu ako je čas nečinnosti, použije sa hodnota času nečinnosti.</translation>
-<translation id="1454846751303307294">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré nemôžu spúšťať kód JavaScript.
+<translation id="1454846751303307294">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré nemôžu spúšťať kód JavaScript.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultJavaScriptSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="538108065117008131">Povoliť doplnku <ph name="PRODUCT_FRAME_NAME"/> spracovávať tieto typy obsahu.</translation>
-<translation id="2312134445771258233">Umožňuje konfigurovať stránky, ktoré sa načítavajú pri spustení. Ak ste v časti „Akcie pri spustení“ nezvolili možnosť „Otvoriť zoznam adries URL“, položky v zozname „Adresy URL otvárané pri spustení“ sa ignorujú.</translation>
+<translation id="2312134445771258233">Umožňuje konfigurovať stránky, ktoré sa načítavajú pri spustení. Ak ste v časti „Akcie pri spustení“ nezvolili možnosť „Otvoriť zoznam webových adries“, položky v zozname „Webové adresy otvárané pri spustení“ sa ignorujú.</translation>
 <translation id="1464848559468748897">Určuje správ používateľa v multiprofilovej relácii na zariadeniach so systémom <ph name="PRODUCT_OS_NAME"/>.
 
       Ak je pravidlo nastavené na hodnotu MultiProfileUserBehaviorUnrestricted, používateľ môže byť v multiprofilovej relácii buď primárnym, alebo sekundárnym používateľom.
@@ -1200,7 +1200,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
           Zvolením tejto možnosti zakážete niektoré nastavenia, ktoré sú závislé od relácií alebo vykonávajú akcie pri zavretí prehliadača (napr. vymazanie údajov prehliadania pri ukončení alebo obmedzení súborov cookie len na reláciu).
 
-          Ak zvolíte možnosť Otvoriť zoznam adries, otvoria sa pri spustení produktu <ph name="PRODUCT_NAME"/> adresy uvedené v zozname Adresy URL otvárané pri spustení.
+          Ak zvolíte možnosť Otvoriť zoznam adries, otvoria sa pri spustení produktu <ph name="PRODUCT_NAME"/> adresy uvedené v zozname Webové adresy otvárané pri spustení.
 
           Ak toto nastavenia povolíte, používatelia ho v produkte <ph name="PRODUCT_NAME"/> nemôžu zmeniť ani prepísať.
 
@@ -1251,20 +1251,20 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="6158324314836466367">Názov Internetového obchodu pre podniky (podpora je ukončená)</translation>
 <translation id="3984028218719007910">Určuje, či má systém <ph name="PRODUCT_OS_NAME"/> po odhlásení zachovať miestne údaje o účte. Ak je toto pravidlo nastavené na hodnotu true, systém <ph name="PRODUCT_OS_NAME"/> nebude uchovávať žiadne trvalé účty a všetky údaje z relácií používateľov budú po odhlásení odstránené. Ak je toto pravidlo nastavené na hodnotu false, alebo nie je nakonfigurované, zariadenie môže uchovávať (zašifrované) miestne údaje používateľa.</translation>
 <translation id="3793095274466276777">Slúži na konfiguráciu kontroly predvoleného prehliadača v prehliadači <ph name="PRODUCT_NAME"/> a bráni používateľom toto nastavenie zmeniť. Ak toto nastavenie povolíte, prehliadač <ph name="PRODUCT_NAME"/> pri spustení vždy skontroluje, či je predvoleným prehliadačom, a ak to bude možné, automaticky sa registruje. Ak je toto nastavenie zakázané, prehliadač <ph name="PRODUCT_NAME"/> nebude kontrolovať, či je predvoleným prehliadačom, a zakáže používateľské ovládacie prvky na nastavenie tejto možnosti. Ak toto nastavenie nebolo nakonfigurované, prehliadač <ph name="PRODUCT_NAME"/> umožní používateľovi určiť, či ho chce nastaviť ako predvolený prehliadač a či sa v prípade, ak ním nie je, majú používateľovi zobraziť upozornenia.</translation>
-<translation id="3504791027627803580">Určuje adresu URL vyhľadávača použitého na poskytovanie vyhľadávania obrázkov. Žiadosti o vyhľadávanie sa budú odosielať pomocou metódy GET. Ak je nastavené pravidlo DefaultSearchProviderImageURLPostParams, budú žiadosti o vyhľadávanie obrázkov používať namiesto toho metódu POST.
+<translation id="3504791027627803580">Určuje webovú adresu vyhľadávača použitého na poskytovanie vyhľadávania obrázkov. Žiadosti o vyhľadávanie sa budú odosielať pomocou metódy GET. Ak je nastavené pravidlo DefaultSearchProviderImageURLPostParams, budú žiadosti o vyhľadávanie obrázkov používať namiesto toho metódu POST.
 
           Toto pravidlo je voliteľné. Ak nie je nastavené, nepoužije sa žiadne vyhľadávanie obrázkov.
 
           Toto pravidlo sa rešpektuje iba v prípade, ak je povolené pravidlo DefaultSearchProviderEnabled.</translation>
-<translation id="7529100000224450960">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré môžu otvárať kontextové okná.
+<translation id="7529100000224450960">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré môžu otvárať kontextové okná.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultPopupsSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="6155936611791017817">Nastaviť predvolený stav veľkého kurzora na prihlasovacej obrazovke</translation>
-<translation id="1530812829012954197">Vždy vykresliť nasledujúce vzory adries URL v hostiteľskom prehliadači</translation>
+<translation id="1530812829012954197">Vždy vykresliť nasledujúce vzory webových adries v hostiteľskom prehliadači</translation>
 <translation id="9026000212339701596">Slovník s mapovaním hostiteľov na boolovské identifikátory, ktoré určujú, či bude prístup k hostiteľovi povolený (true) alebo zablokovaný (false).
 
           Toto pravidlo sa vzťahuje iba na interné používanie prehliadača Chrome.</translation>
-<translation id="913195841488580904">Blokovať prístup k zoznamu adries URL</translation>
+<translation id="913195841488580904">Blokovať prístup k zoznamu webových adries</translation>
 <translation id="5461308170340925511">Konfiguruje pravidlá súvisiace s rozšíreniami. Používateľ nemôže inštalovať rozšírenia uvedené na zozname zakázaných rozšírení, dokým nebudú pridané na bielu listinu. V prehliadači <ph name="PRODUCT_NAME"/> môžete tiež vynútiť automatickú inštaláciu rozšírení, ktoré uvediete v časti <ph name="EXTENSIONINSTALLFORCELIST_POLICY_NAME"/>. Vynútené nainštalované rozšírenia sa nainštalujú bez ohľadu na to, či sa nachádzajú na zozname zakázaných rozšírení.</translation>
 <translation id="3292147213643666827">Umožňuje prehliadaču <ph name="PRODUCT_NAME"/> fungovať ako server proxy medzi službou <ph name="CLOUD_PRINT_NAME"/> a staršími tlačiarňami pripojenými k počítaču.
 
@@ -1289,7 +1289,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
       Ak pravidlo nie je nastavené, bude akýkoľvek doplnok, ktorý zodpovedá vzoru v zozname DisabledPlugins, uzamknutý ako deaktivovaný a používatelia ho nebudú môcť aktivovať.</translation>
 <translation id="8951350807133946005">Nastaviť adresár diskovej vyrovnávacej pamäte</translation>
-<translation id="603410445099326293">Parametre pre adresu URL návrhov, ktorá používa metódu POST</translation>
+<translation id="603410445099326293">Parametre pre webovú adresu návrhov, ktorá používa metódu POST</translation>
 <translation id="2592091433672667839">Doba nečinnosti pred zobrazením šetriča obrazovky na prihlasovacej obrazovke v režime určenom pre predaj</translation>
 <translation id="166427968280387991">Server proxy</translation>
 <translation id="2805707493867224476">Povoliť všetkým webovým stránkam zobrazovať kontextové okná</translation>
@@ -1341,13 +1341,13 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="3195451902035818945">Toto pravidlo určuje, či by malo byť delenie záznamov protokolu SSL zakázané. Delenie záznamov je náhradné riešenie pre slabé stránky protokolov SSL 3.0 a TLS 1.0. U niektorých serverov HTTPS a serverov proxy však môže spôsobiť problémy s kompatibilitou. Ak toto pravidlo nie je nastavené, alebo je nastavené na hodnotu False, delenie záznamov sa použije u pripojení SSL / TLS, ktoré používajú šifrovacie nástroje CBC.</translation>
 <translation id="6903814433019432303">Toto pravidlo je aktívne iba v režime určenom pre predaj.
 
-      Určuje súbor adries URL, ktoré sa majú načítať po spustení ukážkovej relácie. Toto pravidlo prepíše akékoľvek ďalšie mechanizmy, ktoré slúžia na nastavenie počiatočných adries URL, a tak sa môže použiť iba v reláciách, ktoré nie sú spojené s konkrétnym používateľom.</translation>
+      Určuje súbor webových adries, ktoré sa majú načítať po spustení ukážkovej relácie. Toto pravidlo prepíše akékoľvek ďalšie mechanizmy, ktoré slúžia na nastavenie počiatočných webových adries, a tak sa môže použiť iba v reláciách, ktoré nie sú spojené s konkrétnym používateľom.</translation>
 <translation id="5868414965372171132">Konfigurácia siete na úrovni používateľa</translation>
-<translation id="8519264904050090490">Spravované výnimky adries URL ručne nastavené používateľom</translation>
+<translation id="8519264904050090490">Spravované výnimky webových adries ručne nastavené používateľom</translation>
 <translation id="4480694116501920047">Vynútenie Bezpečného vyhľadávania</translation>
-<translation id="465099050592230505">Adresa URL Internetového obchodu pre podniky (podpora je ukončená)</translation>
+<translation id="465099050592230505">Webová adresa Internetového obchodu pre podniky (podpora je ukončená)</translation>
 <translation id="2006530844219044261">Správa možností napájania</translation>
-<translation id="1221359380862872747">Po prihlásení v režime ukážky načítať zadané adresy URL</translation>
+<translation id="1221359380862872747">Po prihlásení v režime ukážky načítať zadané webové adresy</translation>
 <translation id="8711086062295757690">Určuje kľúčové slovo, ktoré vo všeobecnom poli spúšťa vyhľadávanie tohto poskytovateľa. Toto pravidlo je voliteľné.
 
           Ak nebude nastavené, poskytovateľ vyhľadávania nebude aktivovaný pomocou žiadneho kľúčového slova.
@@ -1356,8 +1356,8 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="1152117524387175066">Nahlásenie stavu prepínača režimu pre vývojárov pri spustení zariadenia.
 
       Ak je toto pravidlo nastavené na hodnotu False, stav prepínača režimu pre vývojárov sa nebude nahlasovať.</translation>
-<translation id="5774856474228476867">Adresa URL vyhľadávania predvoleného poskytovateľa vyhľadávania</translation>
-<translation id="4650759511838826572">Zakázať schémy protokolu adresy URL</translation>
+<translation id="5774856474228476867">Webová adresa vyhľadávania predvoleného poskytovateľa vyhľadávania</translation>
+<translation id="4650759511838826572">Zakázať schémy protokolu webovej adresy</translation>
 <translation id="7831595031698917016">Určuje maximálne oneskorenie v milisekundách medzi prijatím zrušenia platnosti pravidla a načítaním nového pravidla zo služby správy zariadenia.
 
       Nastavenie tohto pravidla prepíše predvolenú hodnotu 5 000 milisekúnd. Platné hodnoty pre toto pravidlo sú v rozsahu od 1 000 (1 sekunda) do 300 000 (5 minút). Všetky hodnoty mimo tohto rozsahu budú upravené k zodpovedajúcej hranici.
@@ -1366,16 +1366,16 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="8099880303030573137">Oneskorenie režimu nečinnosti pri napájaní z batérie</translation>
 <translation id="1709037111685927635">Konfigurácia obrázka tapety.
 
-      Toto pravidlo umožňuje nakonfigurovať obrázok tapety, ktorý sa používateľovi zobrazuje na pracovnej ploche a na pozadí prihlasovacej obrazovky. Nastavíte ho určením adresy URL, z ktorej môže systém <ph name="PRODUCT_OS_NAME"/> stiahnuť daný obrázok tapety, a určením kryptografickej hodnoty hash, pomocou ktorej sa overí integrita stiahnutého súboru. Obrázok musí byť vo formáte JPEG a jeho veľkosť nesmie prekročiť 16 MB. Adresa URL musí byť prístupná bez overenia totožnosti.
+      Toto pravidlo umožňuje nakonfigurovať obrázok tapety, ktorý sa používateľovi zobrazuje na pracovnej ploche a na pozadí prihlasovacej obrazovky. Nastavíte ho určením webovej adresy, z ktorej môže systém <ph name="PRODUCT_OS_NAME"/> stiahnuť daný obrázok tapety, a určením kryptografickej hodnoty hash, pomocou ktorej sa overí integrita stiahnutého súboru. Obrázok musí byť vo formáte JPEG a jeho veľkosť nesmie prekročiť 16 MB. Webová adresa musí byť prístupná bez overenia totožnosti.
 
-      Obrázok tapety sa stiahne a uloží do vyrovnávacej pamäte. Obrázok sa stiahne znova v prípade, že sa zmení adresa URL alebo hodnota hash.
+      Obrázok tapety sa stiahne a uloží do vyrovnávacej pamäte. Obrázok sa stiahne znova v prípade, že sa zmení webová adresa alebo hodnota hash.
 
-      Toto pravidlo je potrebné zadať ako reťazec, ktorý udáva adresu URL a hodnotu hash vo formáte JSON, a to podľa nasledujúcej schémy:
+      Toto pravidlo je potrebné zadať ako reťazec, ktorý udáva webovú adresu a hodnotu hash vo formáte JSON, a to podľa nasledujúcej schémy:
       {
         &quot;type&quot;: &quot;object&quot;,
         &quot;properties&quot;: {
           &quot;url&quot;: {
-            &quot;description&quot;: &quot;Adresa URL, z ktorej je možné stiahnuť obrázok tapety.&quot;,
+            &quot;description&quot;: &quot;Webová adresa, z ktorej je možné stiahnuť obrázok tapety.&quot;,
             &quot;type&quot;: &quot;string&quot;
           },
           &quot;hash&quot;: {
@@ -1401,15 +1401,15 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
           Ak nastavíte toto pravidlo, používatelia ho budú môcť dočasne prepísať povolením alebo zakázaním režimu vysokého kontrastu. Voľba používateľa však nie je trvalá a predvolené nastavenie sa obnoví zakaždým, keď sa znova zobrazí prihlasovacia obrazovka alebo používateľ bude na prihlasovacej obrazovke nečinný po dobu jednej minúty.
 
           Ak toto pravidlo ponecháte nenastavené, bude režim vysokého kontrastu pri prvom zobrazení prihlasovacej obrazovky zakázaný. Používatelia budú môcť režim vysokého kontrastu kedykoľvek povoliť alebo zakázať a jeho stav na prihlasovacej obrazovke sa zachová aj po zmene používateľov.</translation>
-<translation id="602728333950205286">Adresa URL dynamického vyhľadávania predvoleného poskytovateľa vyhľadávania</translation>
+<translation id="602728333950205286">Webová adresa dynamického vyhľadávania predvoleného poskytovateľa vyhľadávania</translation>
 <translation id="3030000825273123558">Povoliť hlásenia o metrikách</translation>
-<translation id="8465065632133292531">Parametre pre adresu URL okamžitého vyhľadávania, ktorá používa metódu POST</translation>
+<translation id="8465065632133292531">Parametre pre webovú adresu okamžitého vyhľadávania, ktorá používa metódu POST</translation>
 <translation id="6559057113164934677">Nepovoliť žiadnym stránkam používať kameru a mikrofón</translation>
 <translation id="7273823081800296768">Ak je toto nastavenie povolené alebo nie je nakonfigurované, používatelia môžu aktivovať párovanie klientov a hostiteľov v čase pripojenia, čím predídu opakovanému zadávaniu kódu PIN.
 
           Ak je toto nastavenie zakázané, nebude táto funkcia k dispozícii.</translation>
 <translation id="1675002386741412210">Podporované na:</translation>
-<translation id="1608755754295374538">Adresy URL, ktorým bude udelený prístup k zariadeniam na zachytávanie zvuku bez zobrazenia výzvy</translation>
+<translation id="1608755754295374538">Webové adresy, ktorým bude udelený prístup k zariadeniam na zachytávanie zvuku bez zobrazenia výzvy</translation>
 <translation id="3547954654003013442">Nastavenia servera proxy</translation>
 <translation id="5921713479449475707">Povoliť stiahnutia automatických aktualizácií prostredníctvom protokolu HTTP</translation>
 <translation id="4482640907922304445">Zobrazí tlačidlo Domovská stránka na paneli s nástrojmi prehliadača <ph name="PRODUCT_NAME"/>.
@@ -1423,9 +1423,9 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak toto nastavenie ponecháte nenastavené, umožní to používateľovi zvoliť, či chce tlačidlo Domovská stránka zobraziť.</translation>
 <translation id="2518231489509538392">Povoliť prehrávanie zvuku</translation>
 <translation id="8146727383888924340">Povoliť používateľom uplatniť ponuky pri registrácii systému OS Chrome</translation>
-<translation id="7301543427086558500">Určuje zoznam alternatívnych adries URL, ktoré sa môžu použiť na extrahovanie hľadaných výrazov z vyhľadávačov. Adresy URL by mali obsahovať značku <ph name="SEARCH_TERM_MARKER"/>, ktorá sa použije na extrahovanie hľadaných výrazov.
+<translation id="7301543427086558500">Určuje zoznam alternatívnych webových adries, ktoré sa môžu použiť na extrahovanie hľadaných výrazov z vyhľadávačov. Webové adresy by mali obsahovať značku <ph name="SEARCH_TERM_MARKER"/>, ktorá sa použije na extrahovanie hľadaných výrazov.
 
-          Toto pravidlo je nepovinné. Ak ho nenastavíte, nepoužijú sa na extrahovanie hľadaných výrazov žiadne alternatívne adresy URL.
+          Toto pravidlo je nepovinné. Ak ho nenastavíte, nepoužijú sa na extrahovanie hľadaných výrazov žiadne alternatívne webové adresy.
 
           Toto pravidlo sa použije iba v prípade, že je povolené pravidlo DefaultSearchProviderEnabled.</translation>
 <translation id="436581050240847513">Hlásiť sieťové rozhrania zariadenia</translation>
@@ -1436,7 +1436,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="5366977351895725771">Ak toto pravidlo nastavíte na hodnotu false, bude vytváranie a prihlasovanie kontrolovaných používateľov zakázané. Všetci existujúci kontrolovaní používatelia budú stále k dispozícii.
 
           Ak toto pravidlo nenakonfigurujete alebo ho nastavíte na hodnotu true, tento používateľ bude môcť vytvárať a spravovať kontrolovaných používateľov.</translation>
-<translation id="5469484020713359236">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré môžu nastavovať súbory cookie.
+<translation id="5469484020713359236">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré môžu nastavovať súbory cookie.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultCookiesSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="1504431521196476721">Diaľkové overenie</translation>
@@ -1447,7 +1447,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak je toto pravidlo nastavené na hodnotu True alebo nie je nastavené vôbec a účet na miestnom zariadení je nastavený na automatické prihlásenie s nulovým oneskorením, systém <ph name="PRODUCT_OS_NAME"/> bude prijímať klávesovú skratku Ctrl+Alt+S, ktorá umožňuje obísť automatické prihlásenie a okamžite zobraziť prihlasovaciu obrazovku.
 
       Ak je toto pravidlo nastavené na hodnotu False, automatické prihlásenie s nulovým oneskorením (ak je nakonfigurované) sa nedá obísť.</translation>
-<translation id="5208240613060747912">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré nemôžu zobrazovať upozornenia.
+<translation id="5208240613060747912">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré nemôžu zobrazovať upozornenia.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultNotificationsSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="346731943813722404">Toto pravidlo určuje, či oneskorenia správy napájania a limit dĺžky relácie sa majú spustiť iba po zaznamenaní prvej aktivity používateľa v relácii.
@@ -1476,10 +1476,10 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak toto pravidlo povolíte alebo zakážete, používatelia ho nebudú môcť zmeniť ani prepísať.
 
       Ak toto pravidlo ponecháte nenastavené, hlasová odozva bude spočiatku zakázaná, ale používateľ to bude môcť kedykoľvek zmeniť.</translation>
-<translation id="7796141075993499320">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré môžu spúšťať doplnky.
+<translation id="7796141075993499320">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré môžu spúšťať doplnky.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultPluginsSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
-<translation id="3809527282695568696">Ak je ako akcia pri spustení začiarknuté políčko „Otvoriť zoznam adries URL“, umožní vám to zvoliť zoznam adries URL, ktoré sa otvoria. Ak je možnosť ponechaná nenastavená, pri spustení sa neotvorí žiadna adresa URL.
+<translation id="3809527282695568696">Ak je ako akcia pri spustení začiarknuté políčko „Otvoriť zoznam webových adries“, umožní vám to zvoliť zoznam webových adries, ktoré sa otvoria. Ak je možnosť ponechaná nenastavená, pri spustení sa neotvorí žiadna webová adresa.
 
           Toto pravidlo funguje len v prípade, ak je pravidlo „RestoreOnStartup“ nastavené na možnosť „RestoreOnStartupIsURLs“.</translation>
 <translation id="649418342108050703">Zakáže podporu rozhrania API pre grafiku 3D.
@@ -1488,7 +1488,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
       Ak toto nastavenie zakážete alebo ho ponecháte nenastavené, umožníte webovým stránkam používať rozhranie API WebGL a doplnkom umožníte používať rozhranie API Pepper 3D. Predvolené nastavenia prehliadača však aj naďalej môžu vyžadovať postúpenie argumentov príkazového riadka. V opačnom prípade môžu použitie rozhraní API znemožniť.</translation>
 <translation id="2077273864382355561">Oneskorenie vypnutia obrazovky pri napájaní z batérie</translation>
-<translation id="9112897538922695510">Umožňuje zaregistrovať zoznam obslužných nástrojov protokolu. Môže to byť iba odporúčané pravidlo. Vlastnosť |protocol| by mala byť nastavená na schému, ako napríklad „mailto“, a vlasnosť |url| by mala byť nastavená na vzor adresy URL aplikácie, ktorá danú schému obsluhuje. Vzor môže zahrnovať reťazec „%s“, ktorý bude nahradený obsluhovanou adresou URL (ak bude použitý).
+<translation id="9112897538922695510">Umožňuje zaregistrovať zoznam obslužných nástrojov protokolu. Môže to byť iba odporúčané pravidlo. Vlastnosť |protocol| by mala byť nastavená na schému, ako napríklad „mailto“, a vlasnosť |url| by mala byť nastavená na vzor webovej adresy aplikácie, ktorá danú schému obsluhuje. Vzor môže zahrnovať reťazec „%s“, ktorý bude nahradený obsluhovanou webovou adresou (ak bude použitý).
 
           Obslužné nástroje protokolu, ktoré sú registrované týmto pravidlom, budú zlúčené s nástrojmi registrovanými používateľom a budú všetky k dispozícii na použitie. Používateľ môže prepísať obslužné nástroje protokolu nainštalované pravidlom inštaláciou nového predvoleného obslužného nástroja. Obslužný protokol registrovaný pravidlom však nie je možné odstrániť.</translation>
 <translation id="3417418267404583991">Ak je toto pravidlo nastavené na hodnotu true alebo je nenakonfigurované, systém <ph name="PRODUCT_OS_NAME"/> povolí prihlásenie hostí. Prihlásenia hostí predstavujú relácie anonymných používateľov a nevyžadujú heslo.
@@ -1499,7 +1499,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak je zadané pravidlo DeviceIdleLogoutTimeout, určuje toto pravidlo dobu zobrazenia poľa s upozornením a odpočítavaním, ktoré sa používateľovi zobrazí predtým, než dôjde k odhláseniu.
 
       Hodnota pre toto pravidlo by mala byť zadaná v milisekundách.</translation>
-<translation id="237494535617297575">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, na ktorých sa môžu zobrazovať upozornenia.
+<translation id="237494535617297575">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, na ktorých sa môžu zobrazovať upozornenia.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultNotificationsSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="527237119693897329">Umožňuje určiť tých hostiteľov pre odosielanie natívnych správ, ktorí nebudú načítaní.
@@ -1513,9 +1513,9 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="7258823566580374486">Povoliť blokovanie hostiteľov so vzdialeným prístupom</translation>
 <translation id="5560039246134246593">Pridá parameter k načítaniu počiatočnej hodnoty variácie v prehliadači <ph name="PRODUCT_NAME"/>.
 
-      Ak je pravidlo stanovené, pridá sa k adrese URL parameter dopytu s názvom „obmedziť“, ktorý sa použije na načítanie počiatočnej hodnoty variácie. Hodnota parametra bude predstavovať hodnotu stanovenú v tomto pravidle.
+      Ak je pravidlo stanovené, pridá sa k webovej adrese parameter dopytu s názvom „obmedziť“, ktorý sa použije na načítanie počiatočnej hodnoty variácie. Hodnota parametra bude predstavovať hodnotu stanovenú v tomto pravidle.
 
-      Ak pravidlo stanovené nie je, adresa URL počiatočnej hodnoty variácie sa nezmení.</translation>
+      Ak pravidlo stanovené nie je, webová adresa počiatočnej hodnoty variácie sa nezmení.</translation>
 <translation id="944817693306670849">Nastaviť veľkosť vyrovnávacej pamäte disku</translation>
 <translation id="8544375438507658205">Predvolený vykresľovací modul HTML pre doplnok <ph name="PRODUCT_FRAME_NAME"/></translation>
 <translation id="2371309782685318247">Určuje interval v milisekundách, v ktorom budú službe správy zariadenia odosielané žiadosti o informácie o pravidlách pre používateľov.
@@ -1569,7 +1569,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak toto pravidlo bude mať hodnotu 0, použije sa predvolená veľkosť vyrovnávacej pamäte, ale používateľ ju nebude môcť zmeniť.
 
       Ak toto pravidlo nebude nastavené, použije sa predvolená veľkosť a používateľ ju bude môcť prepísať pomocou príznaku --media-cache-size.</translation>
-<translation id="5142301680741828703">Vždy vykreslovať nasledujúce vzory adries URL v doplnku <ph name="PRODUCT_FRAME_NAME"/></translation>
+<translation id="5142301680741828703">Vždy vykreslovať nasledujúce vzory webových adries v doplnku <ph name="PRODUCT_FRAME_NAME"/></translation>
 <translation id="4625915093043961294">Konfigurovať zoznam rozšírení, ktorých inštalácia je povolená</translation>
 <translation id="5893553533827140852">Ak je toto nastavenie povolené, žiadosti o overenie gnubby budú sprostredkované cez vzdialené pripojenie hostiteľa.
 
@@ -1581,7 +1581,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak toto nastavenie zakážete a používateľ vykoná akciu, po ktorej by sa mu v obvyklom prípade zobrazilo dialógové okno na výber súboru (napríklad import záložiek, nahrávanie súborov, ukladanie odkazov a pod.), zobrazí sa mu namiesto tohto dialógového okna správa a prehliadač sa zachová, ako keby používateľ v dialógovom okne na výber súboru klikol na možnosť Zrušiť.
 
       Ak toto nastavenie nenastavíte, používatelia budú môcť otvárať dialógové okná na výber súboru obvyklým spôsobom.</translation>
-<translation id="4507081891926866240">Umožňuje prispôsobiť zoznam vzorov adries URL, ktoré by mal doplnok <ph name="PRODUCT_FRAME_NAME"/> vždy vykresliť.
+<translation id="4507081891926866240">Umožňuje prispôsobiť zoznam vzorov webových adries, ktoré by mal doplnok <ph name="PRODUCT_FRAME_NAME"/> vždy vykresliť.
 
           Ak toto pravidlo nenastavíte, bude pre všetky webové stránky použitý predvolený vykresľovací modul (ako je určené pravidlom „ChromeFrameRendererSettings“).
 
@@ -1617,12 +1617,12 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
           Ak toto pravidlo ponecháte nenastavené, bude lupa obrazovky spočiatku zakázaná. Používatelia budú môcť lupu obrazovky kedykoľvek povoliť.</translation>
 <translation id="3428247105888806363">Povolenie predpovede siete</translation>
-<translation id="3460784402832014830">Určuje adresu URL, ktorú použije vyhľadávač na poskytnutie stránky Nová karta.
+<translation id="3460784402832014830">Určuje webovú adresu, ktorú použije vyhľadávač na poskytnutie stránky Nová karta.
 
           Toto pravidlo je voliteľné. Ak sa nenastaví, neposkytne sa žiadna stránka Nová karta.
 
           Toto pravidlo sa rešpektuje iba v prípade, ak je povolené pravidlo DefaultSearchProviderEnabled.</translation>
-<translation id="6145799962557135888">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré môžu spúšťať kód JavaScript.
+<translation id="6145799962557135888">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré môžu spúšťať kód JavaScript.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultJavaScriptSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="2757054304033424106">Typy rozšírení/aplikácií, ktorých inštalácia je povolená</translation>
@@ -1639,7 +1639,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 
       Ak toto pravidlo ponecháte nenastavené, použije sa predvolená cesta profilu a používateľ ju bude môcť prepísať pomocou príznaku príkazového riadku „--user-data-dir“.</translation>
 <translation id="5067143124345820993">Zoznam používateľov s povolením na prihlásenie</translation>
-<translation id="2514328368635166290">Určuje adresu URL ikony predvoleného poskytovateľa vyhľadávania.
+<translation id="2514328368635166290">Určuje webovú adresu ikony predvoleného poskytovateľa vyhľadávania.
 
           Toto pravidlo je voliteľné. Ak nebude nastavené, pri poskytovateľovi vyhľadávania sa nezobrazí žiadna ikona.
 
@@ -1648,7 +1648,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="1843117931376765605">Frekvencia obnovenia pravidiel pre používateľov</translation>
 <translation id="5535973522252703021">Zoznam povolených serverov delegovania protokolu Kerberos</translation>
 <translation id="9187743794267626640">Zákaz pripojenia externého ukladacieho priestoru</translation>
-<translation id="6353901068939575220">Určuje parametre, ktoré sa použijú vyhľadávaní adresy URL pomocou metódy POST. Pozostáva z párov názov/hodnota oddelených čiarkami. Ak je hodnota parameter šablóny, napr. hodnota {searchTerms} v príklade vyššie, bude nahradená údajmi skutočných vyhľadávaných výrazov.
+<translation id="6353901068939575220">Určuje parametre, ktoré sa použijú vyhľadávaní webovej adresy pomocou metódy POST. Pozostáva z párov názov/hodnota oddelených čiarkami. Ak je hodnota parameter šablóny, napr. hodnota {searchTerms} v príklade vyššie, bude nahradená údajmi skutočných vyhľadávaných výrazov.
 
           Toto pravidlo je voliteľné. Ak nie je nastavené, žiadosť o vyhľadávanie sa odošle pomocou metódy GET.
 
@@ -1656,7 +1656,7 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="5307432759655324440">Dostupnosť režimu Inkognito</translation>
 <translation id="4056910949759281379">Zakázať protokol SPDY</translation>
 <translation id="3808945828600697669">Určiť zoznam zakázaných doplnkov</translation>
-<translation id="4525521128313814366">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré nemôžu zobrazovať obrázky.
+<translation id="4525521128313814366">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré nemôžu zobrazovať obrázky.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultImagesSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="8499172469244085141">Predvolené nastavenia (používatelia ich môžu nahradiť)</translation>
@@ -1670,11 +1670,11 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
       Ak pravidlo nastavené nie je, automatické prihlásenie nenastane.</translation>
 <translation id="5983708779415553259">Predvolené správanie pre webové stránky, ktoré sa nenachádzajú v žiadnom obsahovom balíku</translation>
 <translation id="3866530186104388232">Ak je toto pravidlo nastavené na hodnotu pravda alebo je nenakonfigurované, systém <ph name="PRODUCT_OS_NAME"/> na prihlasovacej obrazovke zobrazí existujúcich používateľov a umožní vybrať jedného z nich. Ak je pravidlo nastavené na hodnotu false, systém <ph name="PRODUCT_OS_NAME"/> použije pri prihlásení výzvu na zadanie používateľského mena a hesla.</translation>
-<translation id="7384902298286534237">Umožňuje vám nastaviť zoznam vzorov adries URL, pomocou ktorého určíte stránky, ktoré majú povolenie na nastavenie súborov cookie iba na jednu reláciu.
+<translation id="7384902298286534237">Umožňuje vám nastaviť zoznam vzorov webových adries, pomocou ktorého určíte stránky, ktoré majú povolenie na nastavenie súborov cookie iba na jednu reláciu.
 
           Ak toto nastavenie ponecháte nenastavené, pre všetky stránky sa použije globálna predvolená hodnota, ktorá je určená buď pravidlom „DefaultCookiesSetting“ (ak je nastavené) alebo iným typom konfigurácie používateľa.
 
-          Ak je pravidlo „RestoreOnStartup“ nastavené tak, aby sa obnovili adresy URL z predchádzajúcej relácie, nebude dodržané, a súbory cookie pre príslušné stránky budú uložené trvalo.</translation>
+          Ak je pravidlo „RestoreOnStartup“ nastavené tak, aby sa obnovili webové adresy z predchádzajúcej relácie, nebude dodržané, a súbory cookie pre príslušné stránky budú uložené trvalo.</translation>
 <translation id="2098658257603918882">Povoliť hlásenie údajov týkajúcich sa používania a zlyhaní</translation>
 <translation id="4633786464238689684">Zmení predvolené správanie klávesov v hornom rade na funkčné klávesy.
 
@@ -1728,11 +1728,11 @@ Ak toto pravidlo nie je nastavené alebo je prázdne, akýkoľvek používateľ
 <translation id="7882585827992171421">Toto pravidlo je aktívne iba v režime určenom pre predaj.
 
       Určuje identifikátor rozšírenia, ktoré sa má použiť ako šetrič obrazovky na prihlasovacej obrazovke. Rozšírenie musí byť súčasťou balíka AppPack, ktorý bol pre túto doménu nakonfigurovaný v rámci pravidla DeviceAppPack.</translation>
-<translation id="1796466452925192872">Umožní vám určiť, ktoré adresy URL majú povolenie inštalovať rozšírenia, aplikácie a motívy.
+<translation id="1796466452925192872">Umožní vám určiť, ktoré webové adresy majú povolenie inštalovať rozšírenia, aplikácie a motívy.
 
-V prehliadači Chrome 21 je inštalácia rozšírení, aplikácií a skriptov používateľa pochádzajúcich z iných zdrojov ako z Internetového obchodu Chrome náročnejšia. Používatelia mohli predtým kliknúť na odkaz na súbor *.crx a prehliadač Chrome by im po niekoľkých upozorneniach ponúkol možnosť inštalácie tohto súboru. Takéto súbory musia byť v prehliadači Chrome 21 stiahnuté a presunuté na stránku s nastaveniami prehliadača Chrome. Toto nastavenie umožňuje, aby mali určité adresy URL starší a jednoduchší proces inštalácie.
+V prehliadači Chrome 21 je inštalácia rozšírení, aplikácií a skriptov používateľa pochádzajúcich z iných zdrojov ako z Internetového obchodu Chrome náročnejšia. Používatelia mohli predtým kliknúť na odkaz na súbor *.crx a prehliadač Chrome by im po niekoľkých upozorneniach ponúkol možnosť inštalácie tohto súboru. Takéto súbory musia byť v prehliadači Chrome 21 stiahnuté a presunuté na stránku s nastaveniami prehliadača Chrome. Toto nastavenie umožňuje, aby mali určité webové adresy starší a jednoduchší proces inštalácie.
 
-Každá položka v tomto zozname predstavuje vzor spárovaný s rozšírením (pozri stránku http://code.google.com/chrome/extensions/match_patterns.html). Používatelia budú môcť jednoducho inštalovať položky z akejkoľvek adresy URL, ktorá sa zhoduje s položkou v tomto zozname.
+Každá položka v tomto zozname predstavuje vzor spárovaný s rozšírením (pozri stránku http://code.google.com/chrome/extensions/match_patterns.html). Používatelia budú môcť jednoducho inštalovať položky z akejkoľvek webové adresy, ktorá sa zhoduje s položkou v tomto zozname.
 
 Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadradený. Rozšírenie na zozname nepovolených položiek nebude nainštalované ani vtedy, ak bude zo stránok, ktoré sú uvedené v tomto zozname.</translation>
 <translation id="2113068765175018713">Obmedziť časové obdobie prevádzky zariadenia automatickým reštartovaním</translation>
@@ -1772,7 +1772,7 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
       Ak je toto pravidlo nastavené na hodnotu true alebo je ponechané bez nastavenia, používatelia si pri registrácii OS Chrome budú môcť uplatniť ponuky.
 
       Ak je toto pravidlo nastavené na hodnotu false, používatelia si nebudú môcť uplatniť ponuky.</translation>
-<translation id="1310699457130669094">Tu môžete zadať adresu URL súboru PAC servera proxy.
+<translation id="1310699457130669094">Tu môžete zadať webovú adresu súboru PAC servera proxy.
 
           Toto pravidlo sa prejaví len v prípade, ak ste v časti „Zvoľte spôsob konfigurácie nastavení servera proxy“ zvolili ručné nastavenia servera proxy.
 
@@ -1791,14 +1791,14 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
 
       Ak toto pravidlo ponecháte nenastavené, použije sa predvolený adresár pre stiahnuté súbory a používateľ ho bude môcť zmeniť.</translation>
 <translation id="7381326101471547614">Zakáže v prehliadači <ph name="PRODUCT_NAME"/> použitie protokolu SPDY. Ak je toto pravidlo povolené, protokol SPDY nebude v prehliadači <ph name="PRODUCT_NAME"/> k dispozícii. Zakázaním tohto pravidla použitie protokolu SPDY umožníte. Ak toto pravidlo ponecháte nenastavené, protokol SPDY bude k dispozícii.</translation>
-<translation id="2208976000652006649">Parametre pre adresu URL vyhľadávania, ktorá používa metódu POST</translation>
+<translation id="2208976000652006649">Parametre pre webovú adresu vyhľadávania, ktorá používa metódu POST</translation>
 <translation id="1583248206450240930">Používať v predvolenom nastavení doplnok <ph name="PRODUCT_FRAME_NAME"/></translation>
 <translation id="1047128214168693844">Nepovoliť žiadnym stránkam sledovať fyzickú polohu používateľov</translation>
-<translation id="4101778963403261403">Slúži na konfiguráciu typu predvolenej domovskej stránky v prehliadači <ph name="PRODUCT_NAME"/> a bráni používateľom zmeniť predvoľby domovskej stránky. Ako domovskú stránku je možné nastaviť adresu URL, ktorú určíte, alebo stránku Nová karta.
+<translation id="4101778963403261403">Slúži na konfiguráciu typu predvolenej domovskej stránky v prehliadači <ph name="PRODUCT_NAME"/> a bráni používateľom zmeniť predvoľby domovskej stránky. Ako domovskú stránku je možné nastaviť webovú adresu, ktorú určíte, alebo stránku Nová karta.
 
-          Ak toto nastavenie povolíte, bude ako domovská stránka vždy použitá stránka Nová karta a adresa URL domovskej stránky bude ignorovaná.
+          Ak toto nastavenie povolíte, bude ako domovská stránka vždy použitá stránka Nová karta a webová adresa domovskej stránky bude ignorovaná.
 
-          Ak toto nastavenie zakážete, karta Nová stránka sa používateľovi ako domovská stránka nikdy nezobrazí (ak nie je adresa URL domovskej stránky nastavená na hodnotu „chrome://newtab“).
+          Ak toto nastavenie zakážete, karta Nová stránka sa používateľovi ako domovská stránka nikdy nezobrazí (ak nie je webová adresa domovskej stránky nastavená na hodnotu „chrome://newtab“).
 
           Ak toto nastavenie povolíte alebo zakážete, používatelia nebudú môcť zmeniť v prehliadači <ph name="PRODUCT_NAME"/> typ domovskej stránky.
 
@@ -1822,7 +1822,7 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
 
           Ak sa rozhodnete používať systémové nastavenia servera proxy alebo server proxy zisťovať automaticky, budú všetky ostatné možnosti ignorované.
 
-          Ak zvolíte možnosť ručného nastavenia servera proxy, môžete zvoliť ďalšie možnosti v častiach „Adresa (alebo adresa URL) servera proxy“, „Adresa URL súboru PAC servera proxy“ a „Zoznam pravidiel vynechania servera proxy oddelených čiarkami“.
+          Ak zvolíte možnosť ručného nastavenia servera proxy, môžete zvoliť ďalšie možnosti v častiach „Adresa (alebo webová adresa) servera proxy“, „Webová adresa súboru PAC servera proxy“ a „Zoznam pravidiel vynechania servera proxy oddelených čiarkami“.
 
           Podrobné príklady nájdete na adrese:
           <ph name="PROXY_HELP_URL"/>
@@ -1837,7 +1837,7 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
 
       Ak toto pravidlo nastavené nie je, Zmluvné podmienky sa nezobrazia.
 
-      Toto pravidlo byť malo byť nastavené ako adresa URL, z ktorej systém <ph name="PRODUCT_OS_NAME"/> môže Zmluvné podmienky stiahnuť. Zmluvné podmienky musia byť uložené vo formáte čistého textu, zobrazované ako typ MIME „text/plain“. Nie sú povolené žiadne značky.</translation>
+      Toto pravidlo byť malo byť nastavené ako webová adresa, z ktorej systém <ph name="PRODUCT_OS_NAME"/> môže Zmluvné podmienky stiahnuť. Zmluvné podmienky musia byť uložené vo formáte čistého textu, zobrazované ako typ MIME „text/plain“. Nie sú povolené žiadne značky.</translation>
 <translation id="2623014935069176671">Počkať na aktivitu používateľa</translation>
 <translation id="2660846099862559570">Nikdy nepoužívať server proxy</translation>
 <translation id="637934607141010488">Nahlásenie zoznamu používateľov zariadenia, ktorí sa nedávno prihlásili.
@@ -1868,7 +1868,7 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
           Ak toto pravidlo nastavené nie je, použije sa predvolená doba.
 
           Hodnota pravidla by mala byť uvedená v milisekundách.</translation>
-<translation id="5512418063782665071">Adresa URL domovskej stránky</translation>
+<translation id="5512418063782665071">Webová adresa domovskej stránky</translation>
 <translation id="2948381198510798695">Pri hostiteľoch v uvedenom zozname prehliadač <ph name="PRODUCT_NAME"/> vynechá všetky servery proxy.
 
           Toto pravidlo sa prejaví len v prípade, ak ste v časti „Zvoľte spôsob konfigurácie nastavení servera proxy“ zvolili ručné nastavenia servera proxy.
@@ -1887,7 +1887,7 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
           Ak je pravidlo nastavené na hodnotu false alebo je nenastavené, nevygeneruje sa žiadny certifikát a volania rozhrania API rozšírenia enterprise.platformKeysPrivate zlyhajú.</translation>
 <translation id="5242696907817524533">Konfiguruje zoznam spravovaných záložiek.
 
-      Pravidlo pozostáva zo zoznamu záložiek a každá záložka predstavuje slovník obsahujúci „názov“ a cieľovú „adresu URL“ záložky.
+      Pravidlo pozostáva zo zoznamu záložiek a každá záložka predstavuje slovník obsahujúci „názov“ a cieľovú „webovú adresu“ záložky.
 
       Tieto záložky sú umiestnené do priečinka Spravované záložky v  časti Mobilné záložky. Používateľ nemôže tieto záložky zmeniť.
 
@@ -1924,7 +1924,7 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
           Ak toto pravidlo nastavené nie je, použije sa predvolená doba.
 
           Hodnota pravidla by mala byť uvedená v milisekundách. Hodnoty musia byť nižšie alebo rovnaké ako oneskorenie režimu nečinnosti.</translation>
-<translation id="384743459174066962">Umožňuje nastaviť zoznam vzorov adries URL určujúcich webové stránky, ktoré nemôžu otvárať kontextové okná.
+<translation id="384743459174066962">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré nemôžu otvárať kontextové okná.
 
           Ak toto pravidlo ponecháte nenastavené, použije sa v prípade všetkých webových stránok globálna predvolená hodnota buď z pravidla „DefaultPopupsSetting“ (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
 <translation id="5645779841392247734">Povoliť súbory cookie na týchto webových stránkach</translation>
@@ -1949,9 +1949,9 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
           Hodnota pravidla by mala byť uvedená v milisekundách. Hodnoty musia byť nižšie alebo rovnaké ako oneskorenie vypnutia obrazovky (pokiaľ je nastavené) a oneskorenie režimu nečinnosti.</translation>
 <translation id="3859780406608282662">Pridá parameter k načítavaniu kanála Variácie systému <ph name="PRODUCT_OS_NAME"/>.
 
-      Ak je pravidlo určené, pridá k adrese URL na načítanie kanála Variácie parameter dopytu s názvom „restrict&quot;. Hodnotou parametra bude hodnota, ktorá sa určí v tomto pravidle.
+      Ak je pravidlo určené, pridá k webovej adrese na načítanie kanála Variácie parameter dopytu s názvom „restrict&quot;. Hodnotou parametra bude hodnota, ktorá sa určí v tomto pravidle.
 
-      Ak pravidlo nie je určené, adresa URL na načítanie kanála Variácie sa neupraví.</translation>
+      Ak pravidlo nie je určené, webová adresa na načítanie kanála Variácie sa neupraví.</translation>
 <translation id="7049373494483449255">Povoľuje prehliadaču <ph name="PRODUCT_NAME"/> odosielať dokumenty na tlač do služby <ph name="CLOUD_PRINT_NAME"/>. Poznámka: Toto pravidlo sa týka len podpory služby <ph name="CLOUD_PRINT_NAME"/> v prehliadači <ph name="PRODUCT_NAME"/>. To však používateľom nebráni v tom, aby odosielali tlačové úlohy na webových stránkach.
 
       Ak je toto nastavenie povolené alebo nie je nakonfigurované, môžu používatelia tlačiť zo služby <ph name="CLOUD_PRINT_NAME"/> pomocou dialógového okna tlače prehliadača <ph name="PRODUCT_NAME"/>.
@@ -1973,13 +1973,13 @@ Zoznam nepovolených položiek ExtensionInstallBlacklist je tomuto pravidlu nadr
 <translation id="2811293057593285123">Keď používateľ prejde na stránky, ktoré sú nahlásené ako potenciálne škodlivé, služba Bezpečné prehliadanie zobrazí stránku s upozornením. Povolenie tohto nastavenia zabráni používateľom pokračovať zo stránky s upozornením na škodlivé stránky.
 
       Ak je toto nastavenie zakázané alebo ak nie je nakonfigurované, používatelia môžu pokračovať na nahlásené stránky aj po zobrazení upozornenia.</translation>
-<translation id="7649638372654023172">Konfiguruje adresu URL predvolenej domovskej stránky v prehliadači <ph name="PRODUCT_NAME"/> a bráni používateľom, aby ju zmenili.
+<translation id="7649638372654023172">Konfiguruje webovú adresu predvolenej domovskej stránky v prehliadači <ph name="PRODUCT_NAME"/> a bráni používateľom, aby ju zmenili.
 
           Domovská stránka je stránka, ktorá sa otvorí po kliknutí na tlačidlo Domovská stránka. Stránky, ktoré sa otvoria pri spustení, ovládajú pravidlá RestoreOnStartup.
 
-          Domovskou stránkou môže byť adresa URL, ktorú tu zadáte, alebo stránka Nová karta. Ak vyberiete stránku Nová karta, bude sa toto pravidlo ignorovať.
+          Domovskou stránkou môže byť webová adresa, ktorú tu zadáte, alebo stránka Nová karta. Ak vyberiete stránku Nová karta, bude sa toto pravidlo ignorovať.
 
-          Ak povolíte toto nastavenie, používatelia nebudú môcť zmeniť adresu URL domovskej stránky prehliadača <ph name="PRODUCT_NAME"/>, avšak budú môcť ako domovskú stránku zvoliť stránku Nová karta.
+          Ak povolíte toto nastavenie, používatelia nebudú môcť zmeniť webovú adresu domovskej stránky prehliadača <ph name="PRODUCT_NAME"/>, avšak budú môcť ako domovskú stránku zvoliť stránku Nová karta.
 
           Ak toto pravidlo nenastavíte, používatelia budú môcť zvoliť domovskú stránku sami v prípade, že nebude nastavené ani pravidlo HomepageIsNewTabPage.</translation>
 <translation id="3806576699227917885">Povoliť prehrávanie zvuku.
index a372331..d668841 100644 (file)
 <translation id="5966615072639944554">ส่วนขยายได้รับอนุญาตให้ใช้ API การยืนยันระยะไกล</translation>
 <translation id="1617235075406854669">เปิดใช้งานการนำออกเบราว์เซอร์และประวัติการดาวน์โหลด</translation>
 <translation id="5290940294294002042">ระบุรายการปลั๊กอินที่ผู้ใช้สามารถเปิดหรือปิดใช้งาน</translation>
-<translation id="3153348162326497318">à¸\8aà¹\88วยà¹\83หà¹\89à¸\84ุà¸\93สามารà¸\96ระà¸\9aุสà¹\88วà¸\99à¸\82ยายà¸\97ีà¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88สามารà¸\96à¸\95ิà¸\94à¸\95ัà¹\89à¸\87 à¸ªà¹\88วà¸\99à¸\82ยายà¸\97ีà¹\88à¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¹\84วà¹\89à¹\81ลà¹\89วà¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81หากอยู่ในรายการที่ไม่อนุญาต ค่ารายการที่ไม่อนุญาต &quot;*&quot; หมายถึงส่วนขยายทั้งหมดอยู่ในรายการที่ไม่อนุญาตนอกจากว่าจะได้รับการระบุไว้อย่างชัดเจนในรายการที่อนุญาต หากนโยบายนี้ไม่มีการตั้งค่าไว้ ผู้ใช้จะสามารถติดตั้งส่วนขยายใดก็ได้ใน <ph name="PRODUCT_NAME"/></translation>
+<translation id="3153348162326497318">à¸\8aà¹\88วยà¹\83หà¹\89à¸\84ุà¸\93สามารà¸\96ระà¸\9aุสà¹\88วà¸\99à¸\82ยายà¸\97ีà¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88สามารà¸\96à¸\95ิà¸\94à¸\95ัà¹\89à¸\87 à¸ªà¹\88วà¸\99à¸\82ยายà¸\97ีà¹\88à¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¹\84วà¹\89à¹\81ลà¹\89วà¸\88ะà¸\96ูà¸\81ลà¸\9aหากอยู่ในรายการที่ไม่อนุญาต ค่ารายการที่ไม่อนุญาต &quot;*&quot; หมายถึงส่วนขยายทั้งหมดอยู่ในรายการที่ไม่อนุญาตนอกจากว่าจะได้รับการระบุไว้อย่างชัดเจนในรายการที่อนุญาต หากนโยบายนี้ไม่มีการตั้งค่าไว้ ผู้ใช้จะสามารถติดตั้งส่วนขยายใดก็ได้ใน <ph name="PRODUCT_NAME"/></translation>
 <translation id="3067188277482006117">หากค่าเป็น True ผู้ใช้สามารถใช้ฮาร์ดแวร์บนอุปกรณ์ Chrome เพื่อยืนยันข้อมูลประจำตัวจากระยะไกลไปยัง CA ข้อมูลส่วนบุคคลผ่านทาง API คีย์แพลตฟอร์มของบริษัท chrome.enterprise.platformKeysPrivate.challengeUserKey()
 
           หากค่าถูกตั้งเป็น False หรือไม่ได้รับการตั้งค่า การเรียกไปยัง API จะล้มเหลวโดยมีรหัสข้อผิดพลาด</translation>
 <translation id="5318185076587284965">เปิดใช้รีเลย์เซิร์ฟเวอร์โดยโฮสต์การเข้าถึงระยะไกล</translation>
 <translation id="510186355068252378">ปิดใช้งานการซิงค์ข้อมูลใน <ph name="PRODUCT_NAME"/> โดยใช้บริการการซิงค์ข้อมูลของ Google และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้ หากคุณเปิดใช้การตั้งค่านี้ ผู้ใช้จะไม่สามารถเปลี่ยนหรือแทนที่การตั้งค่านี้ใน <ph name="PRODUCT_NAME"/> หากนโยบายนี้ไม่มีการตั้งค่าไว้ ผู้ใช้จะสามารถใช้ Google Sync ในการเลือกว่าจะใช้หรือไม่</translation>
 <translation id="7953256619080733119">โฮสต์ข้อยกเว้นแบบกำหนดเองของผู้ใช้ที่ได้รับการจัดการ</translation>
-<translation id="4807950475297505572">à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99ลà¹\88าสุà¸\94à¸\99à¹\89อยà¸\97ีà¹\88สุà¸\94à¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81จนกว่าจะมีที่ว่างเพียงพอ</translation>
+<translation id="4807950475297505572">à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99ลà¹\88าสุà¸\94à¸\99à¹\89อยà¸\97ีà¹\88สุà¸\94à¸\88ะà¸\96ูà¸\81ลà¸\9aจนกว่าจะมีที่ว่างเพียงพอ</translation>
 <translation id="8789506358653607371">อนุญาตโหมดเต็มหน้าจอ
 
       นโยบายนี้จะควบคุมความพร้อมใช้งานของโหมดเต็มหน้าจอ ซึ่งระบบจะซ่อน UI ทั้งหมดของ <ph name="PRODUCT_NAME"/> ไว้และมองเห็นเฉพาะเนื้อหาเว็บเท่านั้น
 <translation id="6368403635025849609">อนุญาตให้ใช้ JavaScript บนไซต์เหล่านี้</translation>
 <translation id="6074963268421707432">ไม่อนุญาตให้ไซต์ใดๆ แสดงการแจ้งเตือนของเดสก์ท็อป</translation>
 <translation id="8614804915612153606">ปิดใช้งานการอัปเดตอัตโนมัติ</translation>
-<translation id="4834526953114077364">à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99ลà¹\88าสุà¸\94à¸\99à¹\89อยà¸\97ีà¹\88สุà¸\94à¸\97ีà¹\88à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aภายà¹\83à¸\99 3 à¹\80à¸\94ือà¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มาà¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81จากกว่าจะมีที่ว่างเพียงพอ</translation>
+<translation id="4834526953114077364">à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99ลà¹\88าสุà¸\94à¸\99à¹\89อยà¸\97ีà¹\88สุà¸\94à¸\97ีà¹\88à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aภายà¹\83à¸\99 3 à¹\80à¸\94ือà¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มาà¸\88ะà¸\96ูà¸\81ลà¸\9aจากกว่าจะมีที่ว่างเพียงพอ</translation>
 <translation id="382476126209906314">กำหนดค่าส่วนนำหน้า TalkGadget สำหรับโฮสต์การเข้าถึงระยะไกล</translation>
 <translation id="6561396069801924653">แสดงตัวเลือกการเข้าถึงในเมนูถาดระบบ</translation>
 <translation id="8104962233214241919">เลือกใบรับรองไคลเอ็นต์สำหรับไซต์เหล่านี้โดยอัตโนมัติ</translation>
       นโยบายนี้จะถูกระบุในหน่วยมิลลิวินาที</translation>
 <translation id="7275334191706090484">บุ๊กมาร์กที่มีการจัดการ</translation>
 <translation id="3570008976476035109">ปิดกั้นปลั๊กอินบนไซต์เหล่านี้</translation>
-<translation id="8749370016497832113">à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸\99ำออà¸\81ประวัติเบราว์เซอร์และประวัติการดาวน์โหลดใน <ph name="PRODUCT_NAME"/> และป้องกันไม่ให้ผู้ใช้เปลี่ยนแปลงการตั้งค่านี้
+<translation id="8749370016497832113">à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารลà¸\9aประวัติเบราว์เซอร์และประวัติการดาวน์โหลดใน <ph name="PRODUCT_NAME"/> และป้องกันไม่ให้ผู้ใช้เปลี่ยนแปลงการตั้งค่านี้
 
-      à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88า à¹\81มà¹\89à¸\88ะà¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¸\81à¹\87à¹\84มà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\81ารรัà¸\9aà¸\9bระà¸\81ัà¸\99วà¹\88าà¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aมà¹\81ละà¸\81ารà¸\94าวà¸\99à¹\8cà¹\82หลà¸\94à¸\88ะà¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89 à¸\9cูà¹\89à¹\83à¸\8aà¹\89อาà¸\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หรือà¸\99ำออà¸\81ไฟล์ฐานข้อมูลประวัติโดยตรง และเบราว์เซอร์อาจหมดอายุหรือเก็บถาวรรายการประวัติทั้งหมดหรือบางส่วนเมื่อใดก็ได้
+      à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88า à¹\81มà¹\89à¸\88ะà¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¸\81à¹\87à¹\84มà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\81ารรัà¸\9aà¸\9bระà¸\81ัà¸\99วà¹\88าà¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aมà¹\81ละà¸\81ารà¸\94าวà¸\99à¹\8cà¹\82หลà¸\94à¸\88ะà¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89 à¸\9cูà¹\89à¹\83à¸\8aà¹\89อาà¸\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หรือลà¸\9aไฟล์ฐานข้อมูลประวัติโดยตรง และเบราว์เซอร์อาจหมดอายุหรือเก็บถาวรรายการประวัติทั้งหมดหรือบางส่วนเมื่อใดก็ได้
 
-      à¸«à¸²à¸\81à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99หรือà¹\84มà¹\88มีà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aมà¹\81ละà¸\81ารà¸\94าวà¸\99à¹\8cà¹\82หลà¸\94อาà¸\88à¸\96ูà¸\81à¸\99ำออà¸\81ได้
+      à¸«à¸²à¸\81à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99หรือà¹\84มà¹\88มีà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า à¸\9bระวัà¸\95ิà¸\81ารà¹\80à¸\82à¹\89าà¸\8aมà¹\81ละà¸\81ารà¸\94าวà¸\99à¹\8cà¹\82หลà¸\94อาà¸\88à¸\96ูà¸\81ลà¸\9aได้
 
-      à¸«à¸²à¸\81à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 à¸\88ะà¹\84มà¹\88สามารà¸\96à¸\99ำออà¸\81ประวัติการเข้าชมและการดาวน์โหลดได้</translation>
+      à¸«à¸²à¸\81à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 à¸\88ะà¹\84มà¹\88สามารà¸\96ลà¸\9aประวัติการเข้าชมและการดาวน์โหลดได้</translation>
 <translation id="2884728160143956392">อนุญาตให้ใช้คุกกี้เฉพาะเซสชันเท่านั้นบนไซต์เหล่านี้</translation>
 <translation id="3021272743506189340">ปิดใช้งานการซิงค์ของ Google ไดรฟ์ในแอป Files ของ Chrome OS ขณะใช้การเชื่อมต่อเครือข่ายเคลื่อนที่เมื่อตั้งค่าเป็น True ในกรณีนี้ ข้อมูลจะซิงค์กับ Google ไดรฟ์เฉพาะเมื่อเชื่อมต่อทาง WiFi หรืออีเทอร์เน็ต
 
           หากไม่ได้รับการตั้งค่าหรือตั้งค่าเป็น False ผู้ใช้จะสามารถถ่ายโอนไฟล์ไปยัง Google ไดรฟ์ผ่านการเชื่อมต่อเครือข่ายเคลื่อนที่ได้</translation>
-<translation id="4655130238810647237">à¹\80à¸\9bิà¸\94หรือà¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81à¹\83à¸\99 <ph name="PRODUCT_NAME"/>  à¸«à¸²à¸\81à¸\84ุà¸\93à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89 à¸\84ุà¸\93à¸\88ะสามารà¸\96à¹\80à¸\9eิà¹\88ม à¸\99ำออà¸\81 à¸«à¸£à¸·à¸­à¹\81à¸\81à¹\89à¹\84à¸\82à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81à¹\84à¸\94à¹\89 à¸\99ีà¹\88ยัà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99à¸\94à¹\89วยà¹\80มืà¹\88อà¹\84มà¹\88มีà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\84วà¹\89 à¸«à¸²à¸\81à¸\84ุà¸\93à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89 à¸\84ุà¸\93à¸\88ะà¹\84มà¹\88สามารà¸\96à¹\80à¸\9eิà¹\88ม à¸\99ำออà¸\81 หรือแก้ไขบุ๊กมาร์กได้ ส่วนบุ๊กมาร์กที่มีอยู่ยังคงสามารถใช้ได้</translation>
+<translation id="4655130238810647237">à¹\80à¸\9bิà¸\94หรือà¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81à¹\83à¸\99 <ph name="PRODUCT_NAME"/>  à¸«à¸²à¸\81à¸\84ุà¸\93à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89 à¸\84ุà¸\93à¸\88ะสามารà¸\96à¹\80à¸\9eิà¹\88ม à¸¥à¸\9a à¸«à¸£à¸·à¸­à¹\81à¸\81à¹\89à¹\84à¸\82à¸\9aุà¹\8aà¸\81มารà¹\8cà¸\81à¹\84à¸\94à¹\89 à¸\99ีà¹\88ยัà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99à¸\94à¹\89วยà¹\80มืà¹\88อà¹\84มà¹\88มีà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\84วà¹\89 à¸«à¸²à¸\81à¸\84ุà¸\93à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89 à¸\84ุà¸\93à¸\88ะà¹\84มà¹\88สามารà¸\96à¹\80à¸\9eิà¹\88ม à¸¥à¸\9a หรือแก้ไขบุ๊กมาร์กได้ ส่วนบุ๊กมาร์กที่มีอยู่ยังคงสามารถใช้ได้</translation>
 <translation id="3496296378755072552">ตัวจัดการรหัสผ่าน</translation>
 <translation id="4372704773119750918">ไม่อนุญาตให้ผู้ใช้องค์กรเป็นส่วนหนึ่งของหลายโปรไฟล์ (หลักหรือรอง)</translation>
 <translation id="7027785306666625591">กำหนดค่าการจัดการพลังงานใน <ph name="PRODUCT_OS_NAME"/>
 
       หากการตั้งค่านี้ไม่ได้ถูกตั้งค่า ผู้ใช้จะสามารถตัดสินใจว่าจะใช้ฟังก์ชันนี้หรือไม่ก็ได้
 
-      à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\99ำออà¸\81จาก Chrome 29 และเวอร์ชันที่สูงกว่าแล้ว</translation>
+      à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81ลà¸\9aจาก Chrome 29 และเวอร์ชันที่สูงกว่าแล้ว</translation>
 <translation id="6114416803310251055">ถูกกำหนดให้เลิกใช้</translation>
 <translation id="8493645415242333585">ปิดใช้งานการบันทึกประวัติเบราว์เซอร์</translation>
 <translation id="2747783890942882652">กำหนดค่าชื่อโดเมนของโฮสต์ที่จำเป็นซึ่งจะถูกกำหนดให้กับโฮสต์การเข้าถึงระยะไกลและป้องกันไม่ให้ผู้ใช้ทำการเปลี่ยนแปลง
 
       ระบุว่าควรเปิดใช้ส่วนขยายใบรับรองที่ผูกกับโดเมน TLS ไหม
 
-      à¹\83à¸\8aà¹\89à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89สà¹\88วà¸\99à¸\82ยายà¹\83à¸\9aรัà¸\9aรอà¸\87à¸\97ีà¹\88à¸\9cูà¸\81à¸\81ัà¸\9aà¹\82à¸\94à¹\80มà¸\99 TLS à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\81ารà¸\97à¸\94สอà¸\9a  à¸£à¸°à¸\9aà¸\9aà¸\88ะà¸\99ำออà¸\81การตั้งค่าเวอร์ชันทดลองนี้ในอนาคต</translation>
+      à¹\83à¸\8aà¹\89à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89สà¹\88วà¸\99à¸\82ยายà¹\83à¸\9aรัà¸\9aรอà¸\87à¸\97ีà¹\88à¸\9cูà¸\81à¸\81ัà¸\9aà¹\82à¸\94à¹\80มà¸\99 TLS à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\81ารà¸\97à¸\94สอà¸\9a  à¸£à¸°à¸\9aà¸\9aà¸\88ะลà¸\9aการตั้งค่าเวอร์ชันทดลองนี้ในอนาคต</translation>
 <translation id="5770738360657678870">เวอร์ชันที่กำลังพัฒนา (อาจไม่เสถียร)</translation>
 <translation id="2959898425599642200">กฎการข้ามพร็อกซี</translation>
 <translation id="228659285074633994">ระบุระยะเวลาที่ไม่มีอินพุตของผู้ใช้หลังจากที่ช่องโต้ตอบคำเตือนปรากฏขึ้นเมื่อทำงานด้วยไฟ AC
 <translation id="1265053460044691532">จำกัดเวลาที่ผู้ใช้ซึ่งตรวจสอบสิทธิ์ผ่าน SAML สามารถเข้าสู่ระบบในแบบออฟไลน์</translation>
 <translation id="5703863730741917647">ระบุการดำเนินการที่จะดำเนินการเมื่อไม่มีการใช้งานจนถึงการหน่วงเวลาที่กำหนด
 
-          à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าà¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\80ลิà¸\81à¹\83à¸\8aà¹\89à¹\81ลà¹\89วà¹\81ละà¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81ออกในอนาคต
+          à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าà¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\80ลิà¸\81à¹\83à¸\8aà¹\89à¹\81ลà¹\89วà¹\81ละà¸\88ะà¸\96ูà¸\81ลà¸\9aออกในอนาคต
 
           นโยบายนี้จะให้ค่าสำรองสำหรับนโยบาย <ph name="IDLEACTIONAC_POLICY_NAME"/> และ <ph name="IDLEACTIONBATTERY_POLICY_NAME"/> ที่เฉพาะเจาะจงยิ่งขึ้น หากนโยบายนี้ถูกกำหนด ค่าของนโยบายจะถูกใช้ในกรณีที่นโยบายที่เฉพาะเจาะจงยิ่งขึ้นตามลำดับไม่ได้ถูกกำหนด
 
 
       ควบคุมพฤติกรรมการล้างข้อมูลอัตโนมัติบนอุปกรณ์ <ph name="PRODUCT_OS_NAME"/> การล้างข้อมูลอัตโนมัติจะเริ่มขึ้นเมื่อพื้นที่ว่างของดิสก์ลดลงถึงระดับวิกฤตเพื่อกู้คืนพื้นที่บางส่วนของดิสก์
 
-      à¸«à¸²à¸\81à¸\81ำหà¸\99à¸\94à¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99 &quot;RemoveLRU&quot; à¸\81ารลà¹\89าà¸\87à¸\82à¹\89อมูลอัà¸\95à¹\82à¸\99มัà¸\95ิà¸\88ะà¸\99ำออà¸\81ผู้ใช้จากอุปกรณ์ไปเรื่อยๆ ตามลำดับการไม่เข้าสู่ระบบนานที่สุดจนกระทั่งมีพื้นที่ว่างเหลือพอ
+      à¸«à¸²à¸\81à¸\81ำหà¸\99à¸\94à¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99 &quot;RemoveLRU&quot; à¸\81ารลà¹\89าà¸\87à¸\82à¹\89อมูลอัà¸\95à¹\82à¸\99มัà¸\95ิà¸\88ะลà¸\9aผู้ใช้จากอุปกรณ์ไปเรื่อยๆ ตามลำดับการไม่เข้าสู่ระบบนานที่สุดจนกระทั่งมีพื้นที่ว่างเหลือพอ
 
-      à¸«à¸²à¸\81à¸\81ำหà¸\99à¸\94à¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99 &quot;RemoveLRUIfDormant&quot; à¸\81ารลà¹\89าà¸\87à¸\82à¹\89อมูลอัà¸\95à¹\82à¸\99มัà¸\95ิà¸\88ะà¸\99ำออà¸\81ผู้ใช้ที่ไม่ได้เข้าสู่ระบบอย่างน้อย 3 เดือนไปเรื่อยๆ ตามลำดับการไม่เข้าสู่ระบบนานที่สุดจนกระทั่งมีพื้นที่ว่างเหลือพอ
+      à¸«à¸²à¸\81à¸\81ำหà¸\99à¸\94à¸\99à¹\82ยà¸\9aายà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99 &quot;RemoveLRUIfDormant&quot; à¸\81ารลà¹\89าà¸\87à¸\82à¹\89อมูลอัà¸\95à¹\82à¸\99มัà¸\95ิà¸\88ะลà¸\9aผู้ใช้ที่ไม่ได้เข้าสู่ระบบอย่างน้อย 3 เดือนไปเรื่อยๆ ตามลำดับการไม่เข้าสู่ระบบนานที่สุดจนกระทั่งมีพื้นที่ว่างเหลือพอ
 
       หากไม่ได้กำหนดค่านโยบายนี้ การล้างข้อมูลอัตโนมัติจะใช้กลยุทธ์เริ่มต้นที่มีในตัว ซึ่งปัจจุบันคือกลยุทธ์ &quot;RemoveLRUIfDormant&quot;</translation>
 <translation id="6923366716660828830">ระบุชื่อของผู้ให้บริการการค้นหาเริ่มต้น หากปล่อยว่างหรือไม่ได้กำหนดไว้ จะใช้ชื่อโฮสต์ที่ระบุไว้โดย URL ค้นหา นโยบายนี้จะใช้เฉพาะในกรณีที่มีการเปิดใช้งานนโยบาย &quot;DefaultSearchProviderEnabled&quot; เท่านั้น</translation>
       หากเปิดใช้การตั้งค่านี้ จะมีการใช้ขั้นตอนการลงชื่อเข้าใช้ผ่านเว็บแบบเก่า
       หากปิดใช้การตั้งค่านี้หรือปล่อยไว้โดยไม่ตั้งค่า จะมีการใช้ขั้นตอนการลงชื่อเข้าใช้ในหน้าแบบใหม่โดยค่าเริ่มต้น ผู้ใช้อาจยังสามารถเปิดใช้ขั้นตอนการลงชื่อเข้าใช้ผ่านเว็บแบบเก่าผ่านธงบรรทัดคำสั่งต่อไปนี้ enable-web-based-signin
 
-      à¹\83à¸\99อà¸\99าà¸\84à¸\95à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¹\81à¸\9aà¸\9aà¸\97à¸\94ลอà¸\87à¸\88ะà¸\96ูà¸\81à¸\99ำออà¸\81ออกเมื่อการลงชื่อเข้าใช้ในหน้าสนับสนุนขั้นตอนการลงชื่อเข้าใช้ SSO ทั้งหมดอย่างสมบูรณ์</translation>
+      à¹\83à¸\99อà¸\99าà¸\84à¸\95à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¹\81à¸\9aà¸\9aà¸\97à¸\94ลอà¸\87à¸\88ะà¸\96ูà¸\81ลà¸\9aออกเมื่อการลงชื่อเข้าใช้ในหน้าสนับสนุนขั้นตอนการลงชื่อเข้าใช้ SSO ทั้งหมดอย่างสมบูรณ์</translation>
 <translation id="4121350739760194865">ป้องกันไม่ให้การส่งเสริมของแอปพลิเคชันไปปรากฏบนหน้าแท็บใหม่</translation>
 <translation id="2127599828444728326">อนุญาตการแจ้งเตือนในไซต์เหล่านี้</translation>
 <translation id="3973371701361892765">ไม่ซ่อนชั้นวางอัตโนมัติเลย</translation>
index 5f11977..3be8043 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
-<translation id="1503959756075098984">ID tiện ích mở rộng và URL cập nhật cần cài đặt tĩnh</translation>
+<translation id="1503959756075098984">ID tiện ích và URL cập nhật cần cài đặt tĩnh</translation>
 <translation id="793134539373873765">Chỉ định có sử dụng p2p cho các phần tải dữ liệu cập nhật OS không. Nếu được đặt thành True, các thiết bị sẽ chia sẻ và cố gắng sử dụng các phần tải dữ liệu cập nhật trên LAN, có thể làm giảm nghẽn và mức sử dụng băng thông Internet. Nếu phần tải dữ liệu cập nhật không khả dụng trên LAN, thiết bị sẽ quay lại tải xuống từ máy chủ cập nhật. Nếu được đặt thành False hay không được định cấu hình, p2p sẽ không được sử dụng.</translation>
 <translation id="2463365186486772703">Ngôn ngữ của ứng dụng</translation>
 <translation id="1397855852561539316">URL đề xuất của nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
@@ -72,7 +72,7 @@
 
           Nếu không thiết lập chính sách này, giá trị mặc định chung từ chính sách 'DefaultImagesSetting' nếu chính sách này được thiết lập hoặc từ cấu hình cá nhân của người dùng sẽ được sử dụng cho tất cả các trang web.</translation>
 <translation id="4680961954980851756">Bật Tự động điền</translation>
-<translation id="5183383917553127163">Cho phép bạn chỉ định các tiện ích mở rộng không thuộc danh sách đen. Giá trị danh sách đen là * có nghĩa là tất cả tiện ích mở rộng đều được đưa vào danh sách đen và người dùng chỉ có thể cài đặt các tiện ích mở rộng trong danh sách trắng. Theo mặc định, tất cả tiện ích mở rộng đều được đưa vào danh sách trắng nhưng nếu tất cả tiện ích mở rộng đều đã được đưa vào danh sách đen theo chính sách thì có thể sử dụng danh sách trắng để ghi đè chính sách đó.</translation>
+<translation id="5183383917553127163">Cho phép bạn chỉ định các tiện ích không thuộc danh sách đen. Giá trị danh sách đen là * có nghĩa là tất cả tiện ích đều được đưa vào danh sách đen và người dùng chỉ có thể cài đặt các tiện ích trong danh sách trắng. Theo mặc định, tất cả tiện ích đều được đưa vào danh sách trắng nhưng nếu tất cả tiện ích đều đã được đưa vào danh sách đen theo chính sách thì có thể sử dụng danh sách trắng để ghi đè chính sách đó.</translation>
 <translation id="5921888683953999946">Đặt trạng thái mặc định của tính năng trợ năng con trỏ lớn trên màn hình đăng nhập.
 
           Nếu chính sách này được đặt thành true, con trỏ lớn sẽ được bật khi màn hình đăng nhập hiển thị.
 <translation id="1096105751829466145">Nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
 <translation id="7567380065339179813">Cho phép plugin trên các trang web này</translation>
 <translation id="4555850956567117258">Cho phép chứng thực từ xa cho người dùng</translation>
-<translation id="5966615072639944554">Tiện ích mở rộng được phép sử dụng API chứng thực từ xa</translation>
+<translation id="5966615072639944554">Tiện ích được phép sử dụng API chứng thực từ xa</translation>
 <translation id="1617235075406854669">Bật xóa lịch sử trình duyệt và lịch sử tải xuống</translation>
 <translation id="5290940294294002042">Chỉ định danh sách plugin mà người dùng có thể bật hoặc tắt</translation>
-<translation id="3153348162326497318">Cho phép bạn chỉ định những tiện ích mở rộng mà người dùng KHÔNG thể cài đặt. Các tiện ích mở rộng đã được cài đặt sẽ bị xóa nếu nằm trong danh sách đen.
+<translation id="3153348162326497318">Cho phép bạn chỉ định những tiện ích mà người dùng KHÔNG thể cài đặt. Các tiện ích đã được cài đặt sẽ bị xóa nếu nằm trong danh sách đen.
 
-          Giá trị danh sách đen của '*' có nghĩa là tất cả tiện ích mở rộng đều nằm trong danh sách đen trừ khi chúng được liệt kê rõ ràng trong danh sách trắng.
+          Giá trị danh sách đen của '*' có nghĩa là tất cả tiện ích đều nằm trong danh sách đen trừ khi chúng được liệt kê rõ ràng trong danh sách trắng.
 
-          Nếu không thiết lập chính sách này, người dùng có thể cài đặt mọi tiện ích mở rộng trong <ph name="PRODUCT_NAME"/>.</translation>
+          Nếu không thiết lập chính sách này, người dùng có thể cài đặt mọi tiện ích trong <ph name="PRODUCT_NAME"/>.</translation>
 <translation id="3067188277482006117">Nếu đúng, người dùng có thể sử dụng phần cứng trên các thiết bị Chrome để chứng thực từ xa danh tính của mình đối với CA bảo mật qua API khóa nền tảng doanh nghiệp chrome.enterprise.platformKeysPrivate.challengeUserKey().
 
           Nếu được đặt thành false hoặc không được đặt, các cuộc gọi API sẽ không thực hiện được với mã lỗi.</translation>
 
       Chính sách này kiểm soát tính khả dụng của chế độ toàn màn hình mà ở chế độ đó tất cả UI <ph name="PRODUCT_NAME"/> bị ẩn và chỉ nội dung web hiển thị.
 
-      Nếu chính sách này được đặt thành true hoặc không được định cấu hình thì người dùng, ứng dụng và tiện ích mở rộng có quyền phù hợp có thể vào chế độ toàn màn hình.
+      Nếu chính sách này được đặt thành true hoặc không được định cấu hình thì người dùng, ứng dụng và tiện ích có quyền phù hợp có thể vào chế độ toàn màn hình.
 
-      Nếu chính sách này được đặt thành false thì không người dùng, ứng dụng hoặc tiện ích mở rộng nào có thể vào chế độ toàn màn hình.
+      Nếu chính sách này được đặt thành false thì không người dùng, ứng dụng hoặc tiện ích nào có thể vào chế độ toàn màn hình.
 
       Trên tất cả các nền tảng ngoại trừ <ph name="PRODUCT_OS_NAME"/>, chế độ kiosk không khả dụng khi chế độ toàn màn hình bị tắt.</translation>
 <translation id="8828766846428537606">Định cấu hình trang chủ mặc định trong <ph name="PRODUCT_NAME"/> và ngăn người dùng thay đổi cấu hình đó. Cài đặt trang chủ của người dùng chỉ được khóa hoàn toàn nếu bạn chọn trang chủ là trang tab mới hoặc đặt trang chủ là một URL và chỉ định URL trang chủ. Nếu bạn không chỉ định URL trang chủ, người dùng sẽ vẫn có thể đặt trang chủ là trang tab mới bằng cách chỉ định 'chrome://newtab'.</translation>
 <translation id="382476126209906314">Định cấu hình tiền tố TalkGadget cho máy chủ truy cập từ xa</translation>
 <translation id="6561396069801924653">Hiển thị tùy chọn trợ năng trong menu của khay hệ thống</translation>
 <translation id="8104962233214241919">Tự động chọn chứng chỉ ứng dụng khách cho các trang web này</translation>
-<translation id="2906874737073861391">Danh sách tiện ích mở rộng trong AppPack</translation>
+<translation id="2906874737073861391">Danh sách tiện ích trong AppPack</translation>
 <translation id="4386578721025870401">Hạn chế thời gian mà người dùng được xác thực qua SAML có thể đăng nhập ngoại tuyến.
 
       Trong khi đăng nhập, Chrome OS có thể xác thực với máy chủ (trực tuyến) hoặc sử dụng mật khẩu được lưu trong bộ nhớ cache (ngoại tuyến).
 
       Giá trị của chính sách được tính bằng giây.</translation>
 <translation id="3758249152301468420">Vô hiệu hóa công cụ dành cho nhà phát triển</translation>
-<translation id="8665076741187546529">Định cấu hình danh sách các tiện ích mở rộng bắt buộc cài đặt</translation>
+<translation id="8665076741187546529">Định cấu hình danh sách các tiện ích bắt buộc cài đặt</translation>
 <translation id="2386768843390156671">Cho phép cài đặt ở mức người dùng các máy chủ Nhắn tin gốc.
 
           Nếu cài đặt này được bật thì <ph name="PRODUCT_NAME"/> cho phép
 
           Phải chỉ định giá trị chính sách bằng mili giây.</translation>
 <translation id="6598235178374410284">Hình đại diện của người dùng</translation>
-<translation id="1675391920437889033">Kiểm soát các loại ứng dụng/tiện ích mở rộng được phép cài đặt.
+<translation id="1675391920437889033">Kiểm soát các loại ứng dụng/tiện ích được phép cài đặt.
 
-          Cài đặt này liệt kê các loại tiện ích mở rộng/ứng dụng được cho phép mà có thể cài đặt được trong <ph name="PRODUCT_NAME"/>. Giá trị là một danh sách chuỗi, mỗi chuỗi phải là một trong số loại sau: &quot;extension&quot;, &quot;theme&quot;, &quot;user_script&quot;, &quot;hosted_app&quot;, &quot;legacy_packaged_app&quot;, &quot;platform_app&quot;. Xem tài liệu về tiện ích mở rộng Chrome để biết thêm thông tin về các loại này.
+          Cài đặt này liệt kê các loại tiện ích/ứng dụng được cho phép mà có thể cài đặt được trong <ph name="PRODUCT_NAME"/>. Giá trị là một danh sách chuỗi, mỗi chuỗi phải là một trong số loại sau: &quot;extension&quot;, &quot;theme&quot;, &quot;user_script&quot;, &quot;hosted_app&quot;, &quot;legacy_packaged_app&quot;, &quot;platform_app&quot;. Xem tài liệu về tiện ích Chrome để biết thêm thông tin về các loại này.
 
-          Lưu ý rằng chính sách này cũng ảnh hưởng đến tiện ích mở rộng và ứng dụng được cài đặt bắt buộc qua ExtensionInstallForcelist.
+          Lưu ý rằng chính sách này cũng ảnh hưởng đến tiện ích và ứng dụng được cài đặt bắt buộc qua ExtensionInstallForcelist.
 
-          Nếu cài đặt này được định cấu hình, tiện ích mở rộng/ứng dụng có loại không nằm trong danh sách sẽ không được cài đặt.
+          Nếu cài đặt này được định cấu hình, tiện ích/ứng dụng có loại không nằm trong danh sách sẽ không được cài đặt.
 
-          Nếu cài đặt này không được định cấu hình, không có giới hạn về tiện ích mở rộng/ứng dụng được chấp nhận nào được đặt ra.</translation>
+          Nếu cài đặt này không được định cấu hình, không có giới hạn về tiện ích/ứng dụng được chấp nhận nào được đặt ra.</translation>
 <translation id="6378076389057087301">Chỉ định xem hoạt động âm thanh có ảnh hưởng đến việc quản lý nguồn không</translation>
 <translation id="8818173863808665831">Báo cáo vị trí địa lý của thiết bị.
 
 
       Nếu cài đặt này được bật hoặc không được định cấu hình, người dùng có thể in.
 
-      Nếu cài đặt này bị tắt, người dùng không thể in từ <ph name="PRODUCT_NAME"/>. In bị tắt trong menu cờ lê, tiện ích mở rộng, ứng dụng JavaScript, v.v.  <ph name="PRODUCT_NAME"/> trong khi in. Để biết ví dụ, ứng dụng Flash nhất định có tùy chọn in trong menu ngữ cảnh, không chịu sự điều chỉnh của chính sách này.</translation>
+      Nếu cài đặt này bị tắt, người dùng không thể in từ <ph name="PRODUCT_NAME"/>. In bị tắt trong menu cờ lê, tiện ích, ứng dụng JavaScript, v.v.  <ph name="PRODUCT_NAME"/> trong khi in. Để biết ví dụ, ứng dụng Flash nhất định có tùy chọn in trong menu ngữ cảnh, không chịu sự điều chỉnh của chính sách này.</translation>
 <translation id="9135033364005346124">Bật proxy <ph name="CLOUD_PRINT_NAME"/></translation>
 <translation id="4519046672992331730">Bật đề xuất tìm kiếm trong thanh địa chỉ của <ph name="PRODUCT_NAME"/> và không cho phép người dùng thay đổi cài đặt này.
 
 
       Nếu chính sách này không được đặt, cài đặt này sẽ được bật nhưng người dùng có thể thay đổi cài đặt này.</translation>
 <translation id="6943577887654905793">Tên tùy chọn Mac/Linux:</translation>
-<translation id="8176035528522326671">Cho phép người dùng doanh nghiệp trở thành người dùng chính duy nhất có nhiều tiểu sử (Hành vi mặc định cho người dùng do doanh nghiệp quản lý)</translation>
+<translation id="8176035528522326671">Cho phép người dùng doanh nghiệp trở thành người dùng chính duy nhất có nhiều hồ sơ (Hành vi mặc định cho người dùng do doanh nghiệp quản lý)</translation>
 <translation id="6925212669267783763">Định cấu hình thư mục mà <ph name="PRODUCT_FRAME_NAME"/> sẽ sử dụng để lưu trữ dữ liệu người dùng.
 
       Nếu bạn thiết lập chính sách này, <ph name="PRODUCT_FRAME_NAME"/> sẽ sử dụng thư mục được cung cấp.
 
       Truy cập http://www.chromium.org/administrators/policy-list-3/user-data-directory-variables để xem danh sách các biến có thể được sử dụng.
 
-      Nếu cài đặt này không được thiết lập, thư mục tiểu sử mặc định sẽ được sử dụng.</translation>
+      Nếu cài đặt này không được thiết lập, thư mục hồ sơ mặc định sẽ được sử dụng.</translation>
 <translation id="8906768759089290519">Bật chế độ khách</translation>
 <translation id="348495353354674884">Bật bàn phím ảo</translation>
 <translation id="2168397434410358693">Độ trễ lúc không sử dụng khi chạy trên nguồn AC</translation>
 
           Nếu hành động là tạm ngừng, <ph name="PRODUCT_OS_NAME"/> có thể được định cấu hình riêng biệt thành khóa hoặc không khóa màn hình trước khi tạm ngừng.</translation>
 <translation id="3915395663995367577">URL tới một tệp .pac proxy</translation>
-<translation id="1022361784792428773">Các ID tiện ích mở rộng mà bạn nên ngăn người dùng cài đặt (hoặc * cho tất cả)</translation>
+<translation id="1022361784792428773">Các ID tiện ích mà bạn nên ngăn người dùng cài đặt (hoặc * cho tất cả)</translation>
 <translation id="6064943054844745819">Chỉ định danh sách tính năng nền tảng web không sử dụng nữa để bật lại.
 
       Chính sách này giúp quản trị viên có khả năng bật lại các tính năng nền tảng web không sử dụng nữa trong một khoảng thời gian giới hạn. Các tính năng này được xác định bằng một thẻ chuỗi và các tính năng tương ứng với các thẻ có trong danh sách mà chính sách này chỉ định sẽ được bật lại.
       - ShowModalDialog_EffectiveUntil20150430
 
       Nếu chính sách này không được đặt hoặc danh sách trống, tất cả các tính năng nền tảng web không sử dụng nữa sẽ vẫn bị tắt.</translation>
-<translation id="3805659594028420438">Bật tiện ích mở rộng chứng chỉ giới hạn miền TLS (không được chấp thuận)</translation>
+<translation id="3805659594028420438">Bật tiện ích chứng chỉ giới hạn miền TLS (không được chấp thuận)</translation>
 <translation id="5499375345075963939">Chính sách này chỉ hoạt động trong chế độ bán lẻ.
 
       Khi giá trị của chính sách này được đặt và giá trị đó khác 0, người dùng hiện được đăng nhập vào bản trình diễn sẽ tự động bị đăng xuất sau khi thời gian không hoạt động của khoảng thời gian đã chỉ định trôi qua.
       Nếu tắt chính sách này, sẽ không có lịch sử duyệt web nào được nhập.
 
       Nếu không thiết lập chính sách này, người dùng có thể được hỏi có nhập hay không hoặc quá trình nhập có thể diễn ra tự động.</translation>
-<translation id="6786747875388722282">Tiện ích mở rộng</translation>
+<translation id="6786747875388722282">Tiện ích</translation>
 <translation id="7132877481099023201">Các URL sẽ được cấp quyền truy cập thiết bị quay video mà không cần phải hiển thị lời nhắc</translation>
 <translation id="8947415621777543415">Báo cáo vị trí thiết bị</translation>
 <translation id="1655229863189977773">Đặt kích thước bộ nhớ cache của đĩa theo byte</translation>
 
       Nếu chính sách này không được thiết lập, cài đặt này sẽ được bật và người dùng sẽ không
       thể thay đổi cài đặt này.</translation>
-<translation id="6376842084200599664">Cho phép bạn chỉ định danh sách các tiện ích mở rộng sẽ được cài đặt ngầm mà không có tương tác của người dùng.
+<translation id="6376842084200599664">Cho phép bạn chỉ định danh sách các tiện ích sẽ được cài đặt ngầm mà không có tương tác của người dùng.
 
-          Từng mục trong danh sách là một chuỗi chứa ID tiện ích mở rộng và URL cập nhật được phân tách bằng dấu chấm phẩy (<ph name="SEMICOLON"/>). ID tiện ích mở rộng là chuỗi gồm 32 chữ cái tìm thấy trên <ph name="CHROME_EXTENSIONS_LINK"/> khi ở chế độ nhà phát triển. URL cập nhật sẽ trỏ tới tài liệu XML kê khai cập nhật như được mô tả tại <ph name="LINK_TO_EXTENSION_DOC1"/>. Lưu ý rằng bộ URL cập nhật trong chính sách này chỉ được sử dụng cho cài đặt ban đầu; các quá trình cập nhật tiếp theo của tiện ích mở rộng sẽ sử dụng URL cập nhật được nêu trong tệp kê khai của tiện ích mở rộng.
+          Từng mục trong danh sách là một chuỗi chứa ID tiện ích và URL cập nhật được phân tách bằng dấu chấm phẩy (<ph name="SEMICOLON"/>). ID tiện ích là chuỗi gồm 32 chữ cái tìm thấy trên <ph name="CHROME_EXTENSIONS_LINK"/> khi ở chế độ nhà phát triển. URL cập nhật sẽ trỏ tới tài liệu XML kê khai cập nhật như được mô tả tại <ph name="LINK_TO_EXTENSION_DOC1"/>. Lưu ý rằng bộ URL cập nhật trong chính sách này chỉ được sử dụng cho cài đặt ban đầu; các quá trình cập nhật tiếp theo của tiện ích sẽ sử dụng URL cập nhật được nêu trong tệp kê khai của tiện ích.
 
-          Đối với từng mục, <ph name="PRODUCT_NAME"/> sẽ truy xuất tiện ích mở rộng được chỉ định bởi ID tiện ích mở rộng từ dịch vụ cập nhật tại URL cập nhật đã chỉ định và cài đặt ngầm tiện ích mở rộng đó.
+          Đối với từng mục, <ph name="PRODUCT_NAME"/> sẽ truy xuất tiện ích được chỉ định bởi ID tiện ích từ dịch vụ cập nhật tại URL cập nhật đã chỉ định và cài đặt ngầm tiện ích đó.
 
-          Ví dụ: <ph name="EXTENSION_POLICY_EXAMPLE"/> sẽ cài đặt tiện ích mở rộng <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME"/> từ URL cập nhật chuẩn trên Cửa hàng Chrome trực tuyến. Để biết thêm thông tin về cách lưu trữ tiện ích mở rộng, hãy xem: <ph name="LINK_TO_EXTENSION_DOC2"/>.
+          Ví dụ: <ph name="EXTENSION_POLICY_EXAMPLE"/> sẽ cài đặt tiện ích <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME"/> từ URL cập nhật chuẩn trên Cửa hàng Chrome trực tuyến. Để biết thêm thông tin về cách lưu trữ tiện ích, hãy xem: <ph name="LINK_TO_EXTENSION_DOC2"/>.
 
-          Người dùng có thể gỡ cài đặt tiện ích mở rộng do chính sách này chỉ định. Nếu bạn xóa tiện tích mở rộng khỏi danh sách này, thì tiện ích mở rộng đó sẽ tự động được gỡ cài đặt bởi <ph name="PRODUCT_NAME"/>. Các tiện ích mở rộng được chỉ định trong danh sách này cũng tự động được đưa vào danh sách trắng cho cài đặt; ExtensionsInstallBlacklist không ảnh hưởng đến chúng.
+          Người dùng có thể gỡ cài đặt tiện ích do chính sách này chỉ định. Nếu bạn xóa tiện tích mở rộng khỏi danh sách này, thì tiện ích đó sẽ tự động được gỡ cài đặt bởi <ph name="PRODUCT_NAME"/>. Các tiện ích được chỉ định trong danh sách này cũng tự động được đưa vào danh sách trắng cho cài đặt; ExtensionsInstallBlacklist không ảnh hưởng đến chúng.
 
-          Nếu chính sách này không được thiết lập, người dùng có thể gỡ cài đặt bất kỳ tiện ích mở rộng nào trong <ph name="PRODUCT_NAME"/>.</translation>
+          Nếu chính sách này không được thiết lập, người dùng có thể gỡ cài đặt bất kỳ tiện ích nào trong <ph name="PRODUCT_NAME"/>.</translation>
 <translation id="6899705656741990703">Cài đặt tự động phát hiện proxy</translation>
 <translation id="4639407427807680016">Tên của các máy chủ nhắn tin gốc cần xóa khỏi danh sách cấm</translation>
 <translation id="8382184662529825177">Cho phép sử dụng chứng thực từ xa để bảo vệ nội dung cho thiết bị</translation>
           Nếu bạn bật cài đặt này và nhập một cổng không chuẩn (tức là một cổng không phải là 80 hoặc 443), cổng này sẽ được bao gồm trong Kerberos SPN được tạo.
 
           Nếu bạn tắt cài đặt này, Kerberos SPN được tạo sẽ không bao gồm cổng trong bất kỳ trường hợp nào.</translation>
-<translation id="3236046242843493070">Mẫu URL để cho phép cài đặt tiện ích mở rộng, ứng dụng và tập lệnh người dùng từ</translation>
+<translation id="3236046242843493070">Mẫu URL để cho phép cài đặt tiện ích, ứng dụng và tập lệnh người dùng từ</translation>
 <translation id="2498238926436517902">Luôn tự động ẩn giá</translation>
 <translation id="253135976343875019">Thời gian chờ cảnh báo trạng thái không sử dụng khi chạy trên nguồn AC</translation>
 <translation id="480987484799365700">Nếu đặt ở trạng thái bật, chính sách này sẽ buộc chuyển cấu hình sang chế độ tạm thời. Nếu chính sách này được chỉ định là chính sách OS (ví dụ: GPO trên Windows) thì chính sách đó sẽ áp dụng cho mọi cấu hình trên hệ thống; nếu chính sách được đặt thành chính sách Đám mây thì chính sách đó sẽ chỉ áp dụng cho cấu hình đã đăng nhập bằng tài khoản được quản lý.
 
-      Trong chế độ này, dữ liệu cấu hình chỉ được duy trì trên đĩa trong thời lượng phiên người dùng. Các tính năng như lịch sử trình duyệt, tiện ích mở rộng và dữ liệu của chúng, các dữ liệu web như cookie và cơ sở dữ liệu web sẽ không được lưu giữ sau khi đóng trình duyệt. Tuy nhiên, điều này không ngăn người dùng tải bất kỳ dữ liệu nào xuống đĩa theo cách thủ công, lưu trang hoặc in trang.
+      Trong chế độ này, dữ liệu cấu hình chỉ được duy trì trên đĩa trong thời lượng phiên người dùng. Các tính năng như lịch sử trình duyệt, tiện ích và dữ liệu của chúng, các dữ liệu web như cookie và cơ sở dữ liệu web sẽ không được lưu giữ sau khi đóng trình duyệt. Tuy nhiên, điều này không ngăn người dùng tải bất kỳ dữ liệu nào xuống đĩa theo cách thủ công, lưu trang hoặc in trang.
 
       Nếu người dùng đã bật đồng bộ hóa thì toàn bộ dữ liệu này sẽ được lưu giữ trong cấu hình đồng bộ hóa của họ giống như các cấu hình thông thường. Chế độ ẩn danh cũng khả dụng nếu không bị tắt rõ ràng theo chính sách.
 
      Nếu bạn bật hoặc tắt cài đặt này, người dùng không thể thay đổi hoặc ghi đè cài đặt này trong <ph name="PRODUCT_NAME"/>.
 
       Nếu không thiết lập cài đặt này, người dùng có thể quyết định có sử dụng chức năng này hay không.</translation>
-<translation id="9035964157729712237">Các ID tiện ích mở rộng được miễn khỏi danh sách đen</translation>
+<translation id="9035964157729712237">Các ID tiện ích được miễn khỏi danh sách đen</translation>
 <translation id="8244525275280476362">Độ trễ tìm nạp tối đa sau khi hủy hiệu lực chính sách</translation>
 <translation id="8587229956764455752">Cho phép tạo tài khoản người dùng mới</translation>
 <translation id="7417972229667085380">Tỷ lệ phần trăm theo đó xác định độ trễ khi không hoạt động trong chế độ bản trình bày (không dùng nữa)</translation>
 <translation id="6394350458541421998">Chính sách này đã chấm dứt kể từ phiên bản <ph name="PRODUCT_OS_NAME"/> 29. Vui lòng sử dụng chính sách PresentationScreenDimDelayScale thay vào đó.</translation>
 <translation id="2956777931324644324">Chính sách này ngừng hoạt động kể từ phiên bản 36 của <ph name="PRODUCT_NAME"/>.
 
-      Chỉ định xem có cần bật tiện ích mở rộng chứng chỉ giới hạn miền TLS hay không.
+      Chỉ định xem có cần bật tiện ích chứng chỉ giới hạn miền TLS hay không.
 
-      Cài đặt này được sử dụng để bật tiện ích mở rộng chứng chỉ giới hạn miền TLS dành cho thử nghiệm.  Cài đặt thử nghiệm này sẽ bị xóa trong tương lai.</translation>
+      Cài đặt này được sử dụng để bật tiện ích chứng chỉ giới hạn miền TLS dành cho thử nghiệm.  Cài đặt thử nghiệm này sẽ bị xóa trong tương lai.</translation>
 <translation id="5770738360657678870">Kênh nhà phát triển (có thể không ổn định)</translation>
 <translation id="2959898425599642200">Quy tắc bỏ qua proxy</translation>
 <translation id="228659285074633994">Chỉ định thời lượng không có thao tác nhập của người dùng mà sau thời lượng đó, hộp thoại cảnh báo sẽ hiển thị khi chạy trên nguồn AC.
 
       LƯU Ý: Chính sách này hiện chỉ được hỗ trợ khi chạy ở chế độ Kiosk.</translation>
 <translation id="489803897780524242">Tham số kiểm soát vị trí cụm từ tìm kiếm cho nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
-<translation id="316778957754360075">Cài đặt này đã bị xóa kể từ phiên bản <ph name="PRODUCT_NAME"/> 29. Phương thức được đề xuất để thiết lập bộ sưu tập tiện ích mở rộng/ứng dụng được tổ chức lưu trữ là đưa trang web lưu trữ gói CRX vào ExtensionInstallSources và đặt liên kết tải xuống trực tiếp vào trong các gói trên trang web. Có thể tạo trình chạy cho trang web đó bằng chính sách ExtensionInstallForcelist.</translation>
+<translation id="316778957754360075">Cài đặt này đã bị xóa kể từ phiên bản <ph name="PRODUCT_NAME"/> 29. Phương thức được đề xuất để thiết lập bộ sưu tập tiện ích/ứng dụng được tổ chức lưu trữ là đưa trang web lưu trữ gói CRX vào ExtensionInstallSources và đặt liên kết tải xuống trực tiếp vào trong các gói trên trang web. Có thể tạo trình chạy cho trang web đó bằng chính sách ExtensionInstallForcelist.</translation>
 <translation id="6401669939808766804">Đăng xuất người dùng</translation>
 <translation id="4826326557828204741">Tác vụ sẽ thực hiện khi đạt độ trễ không hoạt động trong khi chạy bằng nguồn pin</translation>
-<translation id="7912255076272890813">Định cấu hình loại ứng dụng/tiện ích mở rộng được cho phép</translation>
+<translation id="7912255076272890813">Định cấu hình loại ứng dụng/tiện ích được cho phép</translation>
 <translation id="817455428376641507">Cho phép truy cập vào các URL đã liệt kê, ngoại trừ danh sách đen URL.
 
       Xem mô tả về chính sách danh sách đen URL để biết định dạng của các mục nhập trong danh sách này.
 <translation id="6367755442345892511">Kênh phát hành có thể được định cấu hình bởi người dùng hay không</translation>
 <translation id="3868347814555911633">Chính sách này chỉ hoạt động trong chế độ bán lẻ.
 
-      Liệt kê các tiện ích mở rộng được tự động cài đặt cho người dùng Bản trình diễn, cho các thiết bị ở chế độ bán lẻ. Các tiện ích mở rộng này được lưu trong thiết bị và có thể được cài đặt khi ngoại tuyến, sau quá trình cài đặt này.
+      Liệt kê các tiện ích được tự động cài đặt cho người dùng Bản trình diễn, cho các thiết bị ở chế độ bán lẻ. Các tiện ích này được lưu trong thiết bị và có thể được cài đặt khi ngoại tuyến, sau quá trình cài đặt này.
 
-      Mỗi mục nhập trong danh sách chứa một từ điển. Từ điển này phải bao gồm ID tiện ích mở rộng trong trường 'extension-id' và URL cập nhật trong trường 'update-url'.</translation>
+      Mỗi mục nhập trong danh sách chứa một từ điển. Từ điển này phải bao gồm ID tiện ích trong trường 'extension-id' và URL cập nhật trong trường 'update-url'.</translation>
 <translation id="9096086085182305205">Danh sách trắng máy chủ xác thực</translation>
 <translation id="4980301635509504364">Cho phép hoặc từ chối quay video.
 
       Nếu cài đặt này bị vô hiệu hoặc không được đặt, người dùng sẽ được yêu cầu cho phép chạy plugin yêu cầu ủy quyền. Đây là những plugin có thể ảnh hưởng đến bảo mật.</translation>
 <translation id="6392973646875039351">Bật tính năng Tự động điền của <ph name="PRODUCT_NAME"/> và cho phép người dùng tự động hoàn thành các biểu mẫu web bằng cách sử dụng thông tin được lưu trữ trước đây, chẳng hạn như địa chỉ hoặc thông tin thẻ tín dụng. Nếu bạn tắt cài đặt này, người dùng sẽ không sử dụng được tính năng Tự động điền. Nếu bạn bật cài đặt này hoặc không đặt giá trị, Tự động điền sẽ vẫn thuộc quyền kiểm soát của người dùng. Điều này sẽ cho phép họ thiết lập cấu hình Tự động điền và bật hoặc tắt Tự động điền tùy theo ý họ.</translation>
 <translation id="6157537876488211233">Danh sách quy tắc bỏ qua proxy được phân cách bằng dấu phẩy</translation>
-<translation id="7788511847830146438">Cho mỗi tiểu sử</translation>
+<translation id="7788511847830146438">Cho mỗi hồ sơ</translation>
 <translation id="2516525961735516234">Chỉ định liệu hoạt động video có ảnh hưởng đến việc quản lý nguồn hay không.
 
           Nếu chính sách này được đặt thành True hoặc không được đặt, người dùng không được xem là không sử dụng trong khi đang phát video. Điều này ngăn đạt tới thời gian chờ khi không sử dụng, thời gian chờ mờ màn hình, thời gian chờ tắt màn hình cũng như thời gian chờ khóa màn hình và thực hiện các hành động tương ứng.
 <translation id="5586942249556966598">Không làm gì</translation>
 <translation id="131353325527891113">Hiển thị tên người dùng trên màn hình đăng nhập</translation>
 <translation id="5365946944967967336">Hiển thị nút Trang chủ trên thanh công cụ</translation>
-<translation id="3709266154059827597">Định cấu hình danh sách đen cài đặt tiện ích mở rộng</translation>
+<translation id="3709266154059827597">Định cấu hình danh sách đen cài đặt tiện ích</translation>
 <translation id="1933378685401357864">Hình nền</translation>
 <translation id="8451988835943702790">Sử dụng trang Tab mới làm trang chủ</translation>
 <translation id="4617338332148204752">Bỏ qua kiểm tra thẻ meta trong <ph name="PRODUCT_FRAME_NAME"/></translation>
 <translation id="6923366716660828830">Chỉ định tên của nhà cung cấp dịch vụ tìm kiếm mặc định. Nếu để trống hoặc không đặt, tên máy chủ lưu trữ do URL tìm kiếm chỉ định sẽ được sử dụng.
 
           Chính sách này chỉ được xem xét nếu chính sách 'DefaultSearchProviderEnabled' được bật.</translation>
-<translation id="4869787217450099946">Xác định xem khóa chế độ thức màn hình có được phép hay không. Khóa chế độ thức màn hình có thể được tiện ích mở rộng yêu cầu qua API tiện ích mở rộng quản lý công suất.
+<translation id="4869787217450099946">Xác định xem khóa chế độ thức màn hình có được phép hay không. Khóa chế độ thức màn hình có thể được tiện ích yêu cầu qua API tiện ích quản lý công suất.
 
           Nếu chính sách này được đặt thành true hoặc không được đặt, khóa chế độ thức màn hình sẽ được đặt để quản lý công suất.
 
       Đặt thành tắt hoặc không đặt tùy chọn này sẽ cho phép người dùng sử dụng các Công cụ dành cho nhà phát triển và bảng điều khiển JavaScript.</translation>
 <translation id="9203071022800375458">Tắt tính năng chụp ảnh chụp màn hình.
 
-      Nếu được bật, không thể chụp các ảnh chụp màn hình bằng phím tắt hoặc các API tiện ích mở rộng.
+      Nếu được bật, không thể chụp các ảnh chụp màn hình bằng phím tắt hoặc các API tiện ích.
 
       Nếu bị tắt hoặc không được chỉ định, tính năng chụp ảnh chụp màn hình sẽ được phép.</translation>
 <translation id="5697306356229823047">Báo cáo người dùng thiết bị</translation>
 
           Chính sách này được chính Chrome sử dụng nội bộ.</translation>
 <translation id="913195841488580904">Chặn truy cập vào danh sách các URL</translation>
-<translation id="5461308170340925511">Định cấu hình các chính sách liên quan tới tiện ích mở rộng. Người dùng không được phép cài đặt các tiện ích mở rộng được liệt kê trong danh sách cấm trừ khi chúng được liệt kê trong danh sách cho phép. Bạn cũng có thể buộc <ph name="PRODUCT_NAME"/> tự động cài đặt tiện ích mở rộng bằng cách chỉ định chúng trong <ph name="EXTENSIONINSTALLFORCELIST_POLICY_NAME"/>. Các tiện ích mở rộng bị buộc cài đặt sẽ được cài đặt bất kể chúng có nằm trong danh sách cấm hay không.</translation>
+<translation id="5461308170340925511">Định cấu hình các chính sách liên quan tới tiện ích. Người dùng không được phép cài đặt các tiện ích được liệt kê trong danh sách cấm trừ khi chúng được liệt kê trong danh sách cho phép. Bạn cũng có thể buộc <ph name="PRODUCT_NAME"/> tự động cài đặt tiện ích bằng cách chỉ định chúng trong <ph name="EXTENSIONINSTALLFORCELIST_POLICY_NAME"/>. Các tiện ích bị buộc cài đặt sẽ được cài đặt bất kể chúng có nằm trong danh sách cấm hay không.</translation>
 <translation id="3292147213643666827">Cho phép <ph name="PRODUCT_NAME"/> hoạt động như một proxy giữa <ph name="CLOUD_PRINT_NAME"/> và các máy in kế thừa kết nối với máy.
 
       Nếu cài đặt này được bật hoặc không được định cấu hình, người dùng có thể bật proxy máy in máy chủ ảo bằng cách xác thực bằng tài khoản Google của họ.
 
           Phải chỉ định giá trị chính sách bằng mili giây. Các giá trị được giới hạn ở mức nhỏ hơn độ trễ khi không sử dụng.</translation>
 <translation id="1897365952389968758">Cho phép tất cả các trang web chạy JavaScript</translation>
-<translation id="922540222991413931">Định cấu hình nguồn cài đặt tiện ích mở rộng, ứng dụng và tập lệnh người dùng</translation>
+<translation id="922540222991413931">Định cấu hình nguồn cài đặt tiện ích, ứng dụng và tập lệnh người dùng</translation>
 <translation id="7323896582714668701">Tham số dòng lệnh bổ sung cho <ph name="PRODUCT_NAME"/></translation>
 <translation id="6931242315485576290">Tắt đồng bộ hóa dữ liệu với Google</translation>
 <translation id="1330145147221172764">Bật bàn phím ảo</translation>
 
       Nếu chính sách này không được đặt, kích thước mặc định sẽ được sử dụng và người dùng có thể ghi đè kích thước đó bằng cờ --media-cache-size.</translation>
 <translation id="5142301680741828703">Luôn hiển thị các mẫu URL sau đây trong <ph name="PRODUCT_FRAME_NAME"/></translation>
-<translation id="4625915093043961294">Định cấu hình danh sách trắng cài đặt tiện ích mở rộng</translation>
+<translation id="4625915093043961294">Định cấu hình danh sách trắng cài đặt tiện ích</translation>
 <translation id="5893553533827140852">Nếu cài đặt này được bật, yêu cầu xác thực gnubby sẽ được proxy qua kết nối máy chủ từ xa.
 
           Nếu cài đặt này bị tắt hoặc không được định cấu hình, yêu cầu xác thực gnubby sẽ không được proxy.</translation>
 <translation id="6145799962557135888">Cho phép bạn thiết lập danh sách các mẫu url chỉ định những trang web được phép chạy JavaScript.
 
           Nếu không thiết lập chính sách này, giá trị mặc định chung từ chính sách 'DefaultImagesSetting' nếu chính sách này được thiết lập hoặc từ cấu hình cá nhân của người dùng sẽ được sử dụng cho tất cả các trang web.</translation>
-<translation id="2757054304033424106">Các loại tiện ích mở rộng/ứng dụng được phép cài đặt</translation>
+<translation id="2757054304033424106">Các loại tiện ích/ứng dụng được phép cài đặt</translation>
 <translation id="7053678646221257043">Chính sách này nếu được bật sẽ buộc dấu trang phải được nhập từ trình duyệt mặc định hiện tại. Nếu được bật, chính sách này cũng ảnh hưởng đến hộp thoại nhập.
 
       Nếu tắt chính sách này, sẽ không có dấu trang nào được nhập.
 
       Truy cập http://www.chromium.org/administrators/policy-list-3/user-data-directory-variables để xem danh sách các biến có thể được sử dụng.
 
-      Nếu chính sách này không được thiết lập, đường dẫn tiểu sử mặc định sẽ được sử dụng và người dùng sẽ có thể ghi đè đường dẫn đó với cờ dòng lệnh '--user-data-dir'.</translation>
+      Nếu chính sách này không được thiết lập, đường dẫn hồ sơ mặc định sẽ được sử dụng và người dùng sẽ có thể ghi đè đường dẫn đó với cờ dòng lệnh '--user-data-dir'.</translation>
 <translation id="5067143124345820993">Danh sách trắng những người dùng được phép đăng nhập</translation>
 <translation id="2514328368635166290">Chỉ định URL biểu tượng yêu thích của nhà cung cấp dịch vụ tìm kiếm mặc định.
 
 <translation id="5105313908130842249">Độ trễ khóa màn hình khi chạy trên nguồn pin</translation>
 <translation id="7882585827992171421">Chính sách này chỉ hoạt động trong chế độ bán lẻ.
 
-      Xác định id của tiện ích mở rộng được sử dụng làm trình bảo vệ màn hình trên màn hình đăng nhập. Tiện ích mở rộng phải thuộc AppPack được định cấu hình cho miền này thông qua chính sách DeviceAppPack.</translation>
-<translation id="1796466452925192872">Cho phép bạn chỉ định URL nào được phép cài đặt tiện ích mở rộng, ứng dụng và chủ đề.
+      Xác định id của tiện ích được sử dụng làm trình bảo vệ màn hình trên màn hình đăng nhập. Tiện ích phải thuộc AppPack được định cấu hình cho miền này thông qua chính sách DeviceAppPack.</translation>
+<translation id="1796466452925192872">Cho phép bạn chỉ định URL nào được phép cài đặt tiện ích, ứng dụng và chủ đề.
 
-          Kể từ Chrome 21, sẽ khó để cài đặt tiện ích mở rộng, ứng dụng và tập lệnh người dùng từ bên ngoài Cửa hàng Chrome trực tuyến. Trước đây, người dùng có thể nhấp vào liên kết tới tệp *.crx và Chrome sẽ cài đặt tệp sau một vài cảnh báo. Sau Chrome 21, các tệp như vậy phải được tải xuống và kéo vào trang cài đặt Chrome. Cài đặt này cho phép các URL cụ thể có quy trình cài đặt cũ, dễ dàng hơn.
+          Kể từ Chrome 21, sẽ khó để cài đặt tiện ích, ứng dụng và tập lệnh người dùng từ bên ngoài Cửa hàng Chrome trực tuyến. Trước đây, người dùng có thể nhấp vào liên kết tới tệp *.crx và Chrome sẽ cài đặt tệp sau một vài cảnh báo. Sau Chrome 21, các tệp như vậy phải được tải xuống và kéo vào trang cài đặt Chrome. Cài đặt này cho phép các URL cụ thể có quy trình cài đặt cũ, dễ dàng hơn.
 
-          Từng mục trong danh sách này là một mẫu khớp với kiểu tiện ích mở rộng (xem http://code.google.com/chrome/extensions/match_patterns.html). Người dùng sẽ có thể cài đặt các mục dễ dàng từ bất kỳ URL nào khớp với mục trong danh sách này. Cả vị trí tệp *.crx lẫn trang nơi tải xuống bắt đầu (nghĩa là liên kết tham chiếu) đều phải được phép theo các mẫu này.
+          Từng mục trong danh sách này là một mẫu khớp với kiểu tiện ích (xem http://code.google.com/chrome/extensions/match_patterns.html). Người dùng sẽ có thể cài đặt các mục dễ dàng từ bất kỳ URL nào khớp với mục trong danh sách này. Cả vị trí tệp *.crx lẫn trang nơi tải xuống bắt đầu (nghĩa là liên kết tham chiếu) đều phải được phép theo các mẫu này.
 
-          ExtensionInstallBlacklist được ưu tiên hơn so với chính sách này. Điều đó có nghĩa là tiện ích mở rộng trên danh sách đen sẽ không được cài đặt, ngay cả nếu cài đặt này diễn ra từ một trang web trên danh sách này.</translation>
+          ExtensionInstallBlacklist được ưu tiên hơn so với chính sách này. Điều đó có nghĩa là tiện ích trên danh sách đen sẽ không được cài đặt, ngay cả nếu cài đặt này diễn ra từ một trang web trên danh sách này.</translation>
 <translation id="2113068765175018713">Giới hạn thời gian hoạt động của thiết bị bằng cách tự động khởi động lại</translation>
 <translation id="4224610387358583899">Độ trễ khóa màn hình</translation>
 <translation id="5388730678841939057">Lựa chọn chiến lược dùng để giải phóng dung lượng đĩa trong khi dọn sạch tự động (không được dùng nữa)</translation>
           Nếu bạn đặt chính sách này, người dùng có thể tạm thời ghi đè chính sách bằng cách bật hoặc tắt phản hồi bằng giọng nói. Tuy nhiên, lựa chọn của người dùng không được duy trì mãi và cài đặt mặc định được khôi phục bất cứ khi nào màn hình đăng nhập mới được hiển thị hoặc người dùng không thực hiện thao tác nào trên màn hình đăng nhập trong một phút.
 
           Nếu không đặt chính sách này, phản hồi bằng giọng nói bị tắt khi màn hình đăng nhập hiển thị lần đầu. Người dùng có thể bật hoặc tắt phản hồi bằng giọng nói bất cứ lúc nào và trạng thái của tính năng này trên màn hình đăng nhập được duy trì giữa những người dùng.</translation>
-<translation id="8197918588508433925">Chính sách này nêu rõ các tiện ích mở rộng cụ thể để sử dụng API khóa nền tảng doanh nghiệp chrome.enterprise.platformKeysPrivate.challengeUserKey() để chứng thực từ xa. Các tiện ích mở rộng phải được thêm vào danh sách này để sử dụng API.
+<translation id="8197918588508433925">Chính sách này nêu rõ các tiện ích cụ thể để sử dụng API khóa nền tảng doanh nghiệp chrome.enterprise.platformKeysPrivate.challengeUserKey() để chứng thực từ xa. Các tiện ích phải được thêm vào danh sách này để sử dụng API.
 
-          Nếu tiện ích mở rộng không có trong danh sách hoặc danh sách không được đặt thì cuộc gọi đến API sẽ không thực hiện được với mã lỗi.</translation>
+          Nếu tiện ích không có trong danh sách hoặc danh sách không được đặt thì cuộc gọi đến API sẽ không thực hiện được với mã lỗi.</translation>
 <translation id="2811293057593285123">Dịch vụ Duyệt web an toàn hiển thị trang cảnh báo khi người dùng điều hướng đến trang web được gắn cờ là có thể độc hại. Bật cài đặt này sẽ ngăn người dùng vẫn tiếp tục truy cập từ trang cảnh báo tới trang web độc hại.
 
       Nếu cài đặt này bị tắt hoặc không được định cấu hình thì người dùng có thể chọn để tiếp tục tới trang bị gắn cờ sau khi được hiển thị cảnh báo.</translation>
index 8dd5900..d9a5238 100644 (file)
 
     列出系统自动为演示用户安装的扩展程序(它们将安装在零售模式下的设备上)。安装后,这些扩展程序保存在该设备中,并且可以在离线状态下安装。
 
-      每个列表条目都包含一个典,其“extension-id”字段必须包含扩展程序 ID,而其“update-url”字段必须包含更新网址。</translation>
+      每个列表条目都包含一个典,其“extension-id”字段必须包含扩展程序 ID,而其“update-url”字段必须包含更新网址。</translation>
 <translation id="9096086085182305205">身份验证服务器白名单</translation>
 <translation id="4980301635509504364">允许或拒绝视频捕获。
 
index 2a943cb..1442426 100644 (file)
@@ -17,6 +17,7 @@
 #include "components/signin/core/browser/signin_client.h"
 #include "components/signin/core/browser/signin_internals_util.h"
 #include "components/signin/core/browser/signin_manager_cookie_helper.h"
+#include "components/signin/core/browser/signin_metrics.h"
 #include "components/signin/core/common/signin_pref_names.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_urls.h"
@@ -171,9 +172,11 @@ void SigninManager::HandleAuthError(const GoogleServiceAuthError& error) {
   FOR_EACH_OBSERVER(Observer, observer_list_, GoogleSigninFailed(error));
 }
 
-void SigninManager::SignOut() {
+void SigninManager::SignOut(
+    signin_metrics::ProfileSignout signout_source_metric) {
   DCHECK(IsInitialized());
 
+  signin_metrics::LogSignout(signout_source_metric);
   if (GetAuthenticatedUsername().empty()) {
     if (AuthInProgress()) {
       // If the user is in the process of signing in, then treat a call to
@@ -235,7 +238,7 @@ void SigninManager::Initialize(PrefService* local_state) {
   if ((!user.empty() && !IsAllowedUsername(user)) || !IsSigninAllowed()) {
     // User is signed in, but the username is invalid - the administrator must
     // have changed the policy since the last signin, so sign out the user.
-    SignOut();
+    SignOut(signin_metrics::SIGNIN_PREF_CHANGED_DURING_SIGNIN);
   }
 
   InitTokenService();
@@ -257,7 +260,7 @@ void SigninManager::OnGoogleServicesUsernamePatternChanged() {
       !IsAllowedUsername(GetAuthenticatedUsername())) {
     // Signed in user is invalid according to the current policy so sign
     // the user out.
-    SignOut();
+    SignOut(signin_metrics::GOOGLE_SERVICE_NAME_PATTERN_CHANGED);
   }
 }
 
@@ -267,7 +270,7 @@ bool SigninManager::IsSigninAllowed() const {
 
 void SigninManager::OnSigninAllowedPrefChanged() {
   if (!IsSigninAllowed())
-    SignOut();
+    SignOut(signin_metrics::SIGNOUT_PREF_CHANGED);
 }
 
 // static
index 8c72c33..275621a 100644 (file)
@@ -34,6 +34,7 @@
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/signin/core/browser/signin_internals_util.h"
 #include "components/signin/core/browser/signin_manager_base.h"
+#include "components/signin/core/browser/signin_metrics.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "google_apis/gaia/merge_session_helper.h"
 #include "net/cookies/canonical_cookie.h"
@@ -87,7 +88,7 @@ class SigninManager : public SigninManagerBase {
 
   // Sign a user out, removing the preference, erasing all keys
   // associated with the user, and canceling all auth in progress.
-  virtual void SignOut();
+  virtual void SignOut(signin_metrics::ProfileSignout signout_source_metric);
 
   // On platforms where SigninManager is responsible for dealing with
   // invalid username policy updates, we need to check this during
index bb74e58..5530d4c 100644 (file)
@@ -59,4 +59,9 @@ void LogSigninAddAccount() {
   UMA_HISTOGRAM_BOOLEAN("Signin.AddAccount", true);
 }
 
+void LogSignout(ProfileSignout metric) {
+  UMA_HISTOGRAM_ENUMERATION("Signin.SignoutProfile", metric,
+                            NUM_PROFILE_SIGNOUT_METRICS);
+}
+
 }  // namespace signin_metrics
index 9eb78ad..cee56a2 100644 (file)
@@ -20,6 +20,32 @@ enum DifferentPrimaryAccounts {
   NUM_DIFFERENT_PRIMARY_ACCOUNT_METRICS,
 };
 
+// Track all the ways a profile can become signed out as a histogram.
+enum ProfileSignout {
+  // The value used within unit tests
+  SIGNOUT_TEST = 0,
+  // The preference or policy controlling if signin is valid has changed.
+  SIGNOUT_PREF_CHANGED = 0,
+  // The valid pattern for signing in to the Google service changed.
+  GOOGLE_SERVICE_NAME_PATTERN_CHANGED,
+  // The preference or policy controlling if signin is valid changed during
+  // the signin process.
+  SIGNIN_PREF_CHANGED_DURING_SIGNIN,
+  // User clicked to signout from the settings page.
+  USER_CLICKED_SIGNOUT_SETTINGS,
+  // The signin process was aborted, but signin had succeeded, so signout. This
+  // may be due to a server response, policy definition or user action.
+  ABORT_SIGNIN,
+  // The sync server caused the profile to be signed out.
+  SERVER_FORCED_DISABLE,
+  // The credentials are being transfered to a new profile, so the old one is
+  // signed out.
+  TRANSFER_CREDENTIALS,
+
+  // Keep this as the last enum.
+  NUM_PROFILE_SIGNOUT_METRICS,
+};
+
 // Log to UMA histograms and UserCounts stats about a single execution of the
 // AccountReconciler.
 // |total_number_accounts| - How many accounts are in the browser for this
@@ -44,6 +70,9 @@ void LogSigninAccountReconciliation(int total_number_accounts,
 // Track a successful signin.
 void LogSigninAddAccount();
 
+// Track a profile signout.
+void LogSignout(ProfileSignout metric);
+
 }  // namespace signin_metrics
 
 #endif  // COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_METRICS_H_
index 52a993d..568d896 100644 (file)
 <translation id="5439770059721715174">Mallin todennusvirhe kohdassa <ph name="ERROR_PATH"/>: <ph name="ERROR"/></translation>
 <translation id="8349305172487531364">Kirjanmerkkipalkki</translation>
 <translation id="7956713633345437162">Mobiilikirjanmerkit</translation>
-<translation id="5089810972385038852">Osavaltio</translation>
+<translation id="5089810972385038852">Osavaltio/alue</translation>
 <translation id="647261751007945333">Laitekäytännöt</translation>
 <translation id="678528074488531090">Todennusvirhe: <ph name="VALIDATION_ERROR"/>.</translation>
 <translation id="213826338245044447">Mobiilikirjanmerkit</translation>
index ab627a9..301bbff 100644 (file)
@@ -34,7 +34,7 @@
 <translation id="7378627244592794276">Nei takk</translation>
 <translation id="2704283930420550640">Verdien samsvarer ikke med formatet.</translation>
 <translation id="8943805475239098364">Ønsker du å søke med <ph name="NEW_GOOGLE_HOST"/> i stedet for <ph name="CURRENT_GOOGLE_HOST"/>?</translation>
-<translation id="4850886885716139402">Vis</translation>
+<translation id="4850886885716139402">Visning</translation>
 <translation id="8091372947890762290">Aktivering venter på tjeneren</translation>
 <translation id="719464814642662924">Visa</translation>
 <translation id="6839929833149231406">Område</translation>
index 2bef444..9866163 100644 (file)
@@ -3,7 +3,7 @@
 <translationbundle lang="pt-BR">
 <translation id="7485870689360869515">Nenhum dado encontrado</translation>
 <translation id="3884278016824448484">Identificador de dispositivo em conflito</translation>
-<translation id="6779575937362063477">Este tipo de cartão não é suportado pela Carteira virtual do Google. Selecione outro cartão.</translation>
+<translation id="6779575937362063477">Este tipo de cartão não é suportado pela Google Wallet. Selecione outro cartão.</translation>
 <translation id="5172758083709347301">Máquina</translation>
 <translation id="7180611975245234373">Atualizar</translation>
 <translation id="777702478322588152">Prefeitura</translation>
index 274abf1..4d2205e 100644 (file)
@@ -7,7 +7,7 @@
 <translation id="5172758083709347301">Computer</translation>
 <translation id="7180611975245234373">Actualizați</translation>
 <translation id="777702478322588152">Prefectură</translation>
-<translation id="7600965453749440009">Nu traduce niciodată când pagina este în <ph name="LANGUAGE"/></translation>
+<translation id="7600965453749440009">Nu traduce niciodată din <ph name="LANGUAGE"/></translation>
 <translation id="2262243747453050782">Eroare HTTP</translation>
 <translation id="1339601241726513588">Domeniu de înregistrare:</translation>
 <translation id="7298195798382681320">Recomandate</translation>
 <translation id="277499241957683684">Lipsește o înregistrare pentru gadget</translation>
 <translation id="8553075262323480129">Traducerea nu a reușit, deoarece nu a putut fi stabilită limba paginii.</translation>
 <translation id="7935318582918952113">DOM Distiller</translation>
-<translation id="1103523840287552314">Traduceți întotdeauna când pagina este în <ph name="LANGUAGE"/></translation>
+<translation id="1103523840287552314">Tradu întotdeauna din <ph name="LANGUAGE"/></translation>
 <translation id="1227633850867390598">Ascundeți valoarea</translation>
 <translation id="6753269504797312559">Valoarea politicii</translation>
 <translation id="8834246243508017242">Activați completarea automată folosind Agenda…</translation>
 <translation id="7275334191706090484">Marcaje gestionate</translation>
-<translation id="7400418766976504921">Adresa URL</translation>
+<translation id="7400418766976504921">Adresă URL</translation>
 <translation id="7378627244592794276">Nu</translation>
 <translation id="2704283930420550640">Valoarea nu se potrivește cu formatul.</translation>
 <translation id="8943805475239098364">Doriți să căutați cu <ph name="NEW_GOOGLE_HOST"/> în loc de <ph name="CURRENT_GOOGLE_HOST"/>?</translation>
 <translation id="337363190475750230">Scos din uz</translation>
 <translation id="2367567093518048410">Nivel</translation>
 <translation id="7610193165460212391">Valoarea este în afara intervalului <ph name="VALUE"/>.</translation>
-<translation id="370665806235115550">Se încarcă...</translation>
+<translation id="370665806235115550">Se încarcă</translation>
 <translation id="2096368010154057602">Departament</translation>
 <translation id="4258748452823770588">Semnătură greșită</translation>
 <translation id="3024663005179499861">Tip de politică greșit</translation>
 <translation id="3450660100078934250">MasterCard</translation>
-<translation id="2107287771748948380"><ph name="OBFUSCATED_CC_NUMBER"/>, exp.: <ph name="CC_EXPIRATION_DATE"/></translation>
+<translation id="2107287771748948380"><ph name="OBFUSCATED_CC_NUMBER"/>, exp: <ph name="CC_EXPIRATION_DATE"/></translation>
 <translation id="4148925816941278100">American Express</translation>
 <translation id="225207911366869382">Valoarea este învechită pentru această politică.</translation>
 <translation id="3145945101586104090">Răspunsul nu a putut fi decodificat</translation>
 <translation id="883848425547221593">Alte marcaje</translation>
 <translation id="2181821976797666341">Politici</translation>
 <translation id="3174168572213147020">Insulă</translation>
-<translation id="9137013805542155359">Afișați originalul</translation>
+<translation id="9137013805542155359">Afișați varianta originală</translation>
 <translation id="2213606439339815911">Se preiau intrările...</translation>
 <translation id="6263376278284652872">Marcaje <ph name="DOMAIN"/></translation>
 <translation id="498957508165411911">Se traduce din <ph name="ORIGINAL_LANGUAGE"/> în <ph name="TARGET_LANGUAGE"/>?</translation>
-<translation id="7186367841673660872">Această pagină a fost tradusă din<ph name="ORIGINAL_LANGUAGE"/>în<ph name="LANGUAGE_LANGUAGE"/></translation>
-<translation id="7139724024395191329">Emirat</translation>
+<translation id="7186367841673660872">Această pagină a fost tradusă din <ph name="ORIGINAL_LANGUAGE"/> în <ph name="LANGUAGE_LANGUAGE"/></translation>
+<translation id="7139724024395191329">Emiratul</translation>
 <translation id="5145883236150621069">Răspunsul pentru politică include un cod de eroare</translation>
-<translation id="7983301409776629893">Doresc să se traducă întotdeauna din <ph name="ORIGINAL_LANGUAGE"/> în <ph name="TARGET_LANGUAGE"/></translation>
-<translation id="6970216967273061347">District</translation>
+<translation id="7983301409776629893">Tradu întotdeauna din <ph name="ORIGINAL_LANGUAGE"/> în <ph name="TARGET_LANGUAGE"/></translation>
+<translation id="6970216967273061347">Județ</translation>
 <translation id="3010559122411665027">Intrarea din listă „<ph name="ENTRY_INDEX"/>”: <ph name="ERROR"/></translation>
-<translation id="6445051938772793705">Țara</translation>
+<translation id="6445051938772793705">Țară</translation>
 <translation id="5031870354684148875">Despre Google Traducere</translation>
 <translation id="6891596781022320156">Nivelul politicii nu este acceptat.</translation>
 <translation id="2025186561304664664">Proxy-ul este setat la Configurat automat.</translation>
 <translation id="8571890674111243710">Se traduce pagina în <ph name="LANGUAGE"/>...</translation>
 <translation id="4117700440116928470">Domeniul politicii nu este acceptat.</translation>
 <translation id="2114841414352855701">Politica este ignorată, deoarece a fost înlocuită de <ph name="POLICY_NAME"/>.</translation>
-<translation id="3228969707346345236">Traducerea nu a reușit, deoarece pagina este deja în <ph name="LANGUAGE"/>.</translation>
+<translation id="3228969707346345236">Pagina nu a fost tradusă, deoarece aceasta este deja în <ph name="LANGUAGE"/>.</translation>
 <translation id="8891727572606052622">Mod proxy nevalid.</translation>
 <translation id="6008256403891681546">JCB</translation>
 <translation id="7752995774971033316">Negestionat</translation>
 <translation id="2270192940992995399">Articolul nu a fost găsit.</translation>
 <translation id="4726672564094551039">Reîncărcați politicile</translation>
 <translation id="2392959068659972793">Afișați politicile care nu au valori setate</translation>
-<translation id="5190835502935405962">Bara de marcaje</translation>
+<translation id="5190835502935405962">Bară de marcaje</translation>
 <translation id="6965978654500191972">Dispozitiv</translation>
 <translation id="8249320324621329438">Ultima preluare:</translation>
-<translation id="1285320974508926690">Nu doresc să se traducă niciodată acest site</translation>
-<translation id="6282194474023008486">Cod poştal</translation>
+<translation id="1285320974508926690">Nu traduce niciodată acest site</translation>
+<translation id="6282194474023008486">Cod poștal</translation>
 <translation id="443673843213245140">Utilizarea unui proxy este dezactivată, dar o configurare proxy este specificată în mod explicit.</translation>
 <translation id="3623476034248543066">Afișați valoarea</translation>
 <translation id="9020542370529661692">Această pagină a fost tradusă în <ph name="TARGET_LANGUAGE"/></translation>
 <translation id="8488350697529856933">Se aplică pentru</translation>
 <translation id="6165508094623778733">Aflați mai multe</translation>
 <translation id="5565735124758917034">Activ</translation>
-<translation id="7568593326407688803">Această pagină este în<ph name="ORIGINAL_LANGUAGE"/>Doriți să o traduceți?</translation>
+<translation id="7568593326407688803">Această pagină este în <ph name="ORIGINAL_LANGUAGE"/> Doriți să o traduceți?</translation>
 <translation id="8876793034577346603">Configurația rețelei nu a putut fi analizată.</translation>
 <translation id="106701514854093668">Marcaje desktop</translation>
 <translation id="6154808779448689242">Indicativul returnat pentru politică nu corespunde cu indicativul actual</translation>
index fd2ad59..d5648e9 100644 (file)
@@ -30,7 +30,7 @@
 <translation id="6753269504797312559">Hodnota pravidla</translation>
 <translation id="8834246243508017242">Povoliť automatické dopĺňanie pomocou Kontaktov…</translation>
 <translation id="7275334191706090484">Spravované záložky</translation>
-<translation id="7400418766976504921">Adresa URL</translation>
+<translation id="7400418766976504921">Webová adresa</translation>
 <translation id="7378627244592794276">Nie</translation>
 <translation id="2704283930420550640">Hodnota nezodpovedá formátu.</translation>
 <translation id="8943805475239098364">Hľadať pomocou novej stránky <ph name="NEW_GOOGLE_HOST"/> namiesto súčasnej stránky <ph name="CURRENT_GOOGLE_HOST"/>?</translation>
 <translation id="8091372947890762290">Aktivácia čaká na server</translation>
 <translation id="719464814642662924">Visa</translation>
 <translation id="6839929833149231406">Oblasť</translation>
-<translation id="1871208020102129563">Proxy je nastavené na použitie pevne daných serverov proxy, nie skriptov PAC adresy URL.</translation>
+<translation id="1871208020102129563">Proxy je nastavené na použitie pevne daných serverov proxy, nie skriptov PAC webovej adresy.</translation>
 <translation id="3380365263193509176">Neznáma chyba</translation>
 <translation id="112840717907525620">Vyrovnávacia pamäť pravidla je v poriadku</translation>
 <translation id="3452404311384756672">Interval načítania:</translation>
 <translation id="7441627299479586546">Chybný predmet pravidla</translation>
 <translation id="3885155851504623709">Okrsok</translation>
-<translation id="6973656660372572881">Určené sú pevne dané servery proxy aj skript PAC adresy URL.</translation>
+<translation id="6973656660372572881">Určené sú pevne dané servery proxy aj skript PAC webovej adresy.</translation>
 <translation id="7108649287766967076">Preklad do jazyka <ph name="TARGET_LANGUAGE"/> zlyhal.</translation>
 <translation id="4103249731201008433">Sériové číslo zariadenia je neplatné</translation>
 <translation id="3667681724235208644">Zobraziť pôvodnú stránku</translation>
-<translation id="4079302484614802869">Konfigurácia proxy je nastavená na použitie skriptu PAC adresy URL, nie pevne daných serverov proxy.</translation>
+<translation id="4079302484614802869">Konfigurácia proxy je nastavená na použitie skriptu PAC webovej adresy, nie pevne daných serverov proxy.</translation>
 <translation id="5540224163453853">Požadovaný článok sa nepodarilo nájsť.</translation>
 <translation id="5523118979700054094">Názov pravidla</translation>
 <translation id="7791543448312431591">Pridať</translation>
@@ -95,7 +95,7 @@
 <translation id="5455374756549232013">Chybná časová pečiatka pravidla</translation>
 <translation id="1962204205936693436">Záložky (<ph name="DOMAIN"/>)</translation>
 <translation id="1973335181906896915">Chyba serializácie</translation>
-<translation id="5989320800837274978">Nie sú určené pevne dané servery proxy ani skript PAC adresy URL.</translation>
+<translation id="5989320800837274978">Nie sú určené pevne dané servery proxy ani skript PAC webovej adresy.</translation>
 <translation id="7805768142964895445">Stav</translation>
 <translation id="536296301121032821">Nastavenia pravidla sa nepodarilo uložiť</translation>
 <translation id="5439770059721715174">Pri overení schémy sa vyskytla chyba na mieste <ph name="ERROR_PATH"/>: <ph name="ERROR"/></translation>
     podpis poľa: <ph name="FIELD_SIGNATURE"/>
     podpis formulára: <ph name="FORM_SIGNATURE"/>
     ID experimentu: „<ph name="EXPERIMENT_ID"/>“</translation>
-<translation id="2479410451996844060">Neplatná adresa URL vyhľadávania.</translation>
+<translation id="2479410451996844060">Neplatná webová adresa vyhľadávania.</translation>
 <translation id="5509780412636533143">Spravované záložky</translation>
 <translation id="8866481888320382733">Pri analýze nastavení pravidla sa vyskytla chyba</translation>
 <translation id="6644283850729428850">Toto pravidlo bolo označené ako zastarané.</translation>
index 82353ee..342e170 100644 (file)
 <translation id="8876793034577346603">无法解析网络配置。</translation>
 <translation id="106701514854093668">桌面书签</translation>
 <translation id="6154808779448689242">返回的策略令牌与当前令牌不匹配</translation>
-<translation id="7961015016161918242">从来没有</translation>
+<translation id="7961015016161918242">永不保存</translation>
 <translation id="2835170189407361413">清除表单</translation>
 <translation id="6550675742724504774">选项</translation>
 <translation id="8804164990146287819">隐私权政策</translation>
index f00de48..85dd4b8 100644 (file)
@@ -381,7 +381,7 @@ void NonUIDataTypeController::
   }
 
   std::string datatype_context;
-  if (shared_change_processor_->GetDataTypeContext(&datatype_context)) {
+  if (shared_change_processor->GetDataTypeContext(&datatype_context)) {
     local_service_->UpdateDataTypeContext(
         type(), syncer::SyncChangeProcessor::NO_REFRESH, datatype_context);
   }
index fa4e03c..68ca0c2 100644 (file)
@@ -321,24 +321,41 @@ TEST(URLFixerTest, FixupURL) {
 
   // Check the TLD-appending functionality.
   FixupCase tld_cases[] = {
-    {"google", "http://www.google.com/"},
-    {"google.", "http://www.google.com/"},
-    {"google..", "http://www.google.com/"},
-    {".google", "http://www.google.com/"},
-    {"www.google", "http://www.google.com/"},
-    {"google.com", "http://google.com/"},
-    {"http://google", "http://www.google.com/"},
-    {"..google..", "http://www.google.com/"},
-    {"http://www.google", "http://www.google.com/"},
-    {"9999999999999999", "http://www.9999999999999999.com/"},
-    {"google/foo", "http://www.google.com/foo"},
-    {"google.com/foo", "http://google.com/foo"},
-    {"google/?foo=.com", "http://www.google.com/?foo=.com"},
-    {"www.google/?foo=www.", "http://www.google.com/?foo=www."},
-    {"google.com/?foo=.com", "http://google.com/?foo=.com"},
-    {"http://www.google.com", "http://www.google.com/"},
-    {"google:123", "http://www.google.com:123/"},
-    {"http://google:123", "http://www.google.com:123/"},
+      {"somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld.",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld..",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {".somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"www.somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld.com",
+       "http://somedomainthatwillnotbeagtld.com/"},
+      {"http://somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"..somedomainthatwillnotbeagtld..",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"http://www.somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"9999999999999999", "http://www.9999999999999999.com/"},
+      {"somedomainthatwillnotbeagtld/foo",
+       "http://www.somedomainthatwillnotbeagtld.com/foo"},
+      {"somedomainthatwillnotbeagtld.com/foo",
+       "http://somedomainthatwillnotbeagtld.com/foo"},
+      {"somedomainthatwillnotbeagtld/?foo=.com",
+       "http://www.somedomainthatwillnotbeagtld.com/?foo=.com"},
+      {"www.somedomainthatwillnotbeagtld/?foo=www.",
+       "http://www.somedomainthatwillnotbeagtld.com/?foo=www."},
+      {"somedomainthatwillnotbeagtld.com/?foo=.com",
+       "http://somedomainthatwillnotbeagtld.com/?foo=.com"},
+      {"http://www.somedomainthatwillnotbeagtld.com",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld:123",
+       "http://www.somedomainthatwillnotbeagtld.com:123/"},
+      {"http://somedomainthatwillnotbeagtld:123",
+       "http://www.somedomainthatwillnotbeagtld.com:123/"},
   };
   for (size_t i = 0; i < arraysize(tld_cases); ++i) {
     FixupCase value = tld_cases[i];
index d373f7b..85169bd 100644 (file)
@@ -93,8 +93,27 @@ class DumpAccessibilityTreeTest : public ContentBrowserTest {
     filters->push_back(Filter(base::ASCIIToUTF16("*=''"), Filter::DENY));
   }
 
-  void ParseFilters(const std::string& test_html,
-                    std::vector<Filter>* filters) {
+  // Parse the test html file and parse special directives, usually
+  // beginning with an '@' and inside an HTML comment, that control how the
+  // test is run and how the results are interpreted.
+  //
+  // When the accessibility tree is dumped as text, each attribute is
+  // run through filters before being appended to the string. An "allow"
+  // filter specifies attribute strings that should be dumped, and a "deny"
+  // filter specifies strings that should be suppressed. As an example,
+  // @MAC-ALLOW:AXSubrole=* means that the AXSubrole attribute should be
+  // printed, while @MAC-ALLOW:AXSubrole=AXList* means that any subrole
+  // beginning with the text "AXList" should be printed.
+  //
+  // The @WAIT-FOR:text directive allows the test to specify that the document
+  // may dynamically change after initial load, and the test is to wait
+  // until the given string (e.g., "text") appears in the resulting dump.
+  // A test can make some changes to the document, then append a magic string
+  // indicating that the test is done, and this framework will wait for that
+  // string to appear before comparing the results.
+  void ParseHtmlForExtraDirectives(const std::string& test_html,
+                                   std::vector<Filter>* filters,
+                                   std::string* wait_for) {
     std::vector<std::string> lines;
     base::SplitString(test_html, '\n', &lines);
     for (std::vector<std::string>::const_iterator iter = lines.begin();
@@ -107,6 +126,7 @@ class DumpAccessibilityTreeTest : public ContentBrowserTest {
           AccessibilityTreeFormatter::GetAllowString();
       const std::string& deny_str =
           AccessibilityTreeFormatter::GetDenyString();
+      const std::string& wait_str = "@WAIT-FOR:";
       if (StartsWithASCII(line, allow_empty_str, true)) {
         filters->push_back(
           Filter(base::UTF8ToUTF16(line.substr(allow_empty_str.size())),
@@ -119,6 +139,8 @@ class DumpAccessibilityTreeTest : public ContentBrowserTest {
         filters->push_back(Filter(base::UTF8ToUTF16(
                                       line.substr(deny_str.size())),
                                   Filter::DENY));
+      } else if (StartsWithASCII(line, wait_str, true)) {
+        *wait_for = line.substr(wait_str.size());
       }
     }
   }
@@ -170,32 +192,52 @@ void DumpAccessibilityTreeTest::RunTest(
     return;
   }
 
+  // Parse filters and other directives in the test file.
+  std::vector<Filter> filters;
+  std::string wait_for;
+  AddDefaultFilters(&filters);
+  ParseHtmlForExtraDirectives(html_contents, &filters, &wait_for);
+
   // Load the page.
   base::string16 html_contents16;
   html_contents16 = base::UTF8ToUTF16(html_contents);
   GURL url = GetTestUrl("accessibility",
                         html_file.BaseName().MaybeAsASCII().c_str());
-  AccessibilityNotificationWaiter waiter(
-      shell(), AccessibilityModeComplete,
-      ui::AX_EVENT_LOAD_COMPLETE);
+
+  // If there's a @WAIT-FOR directive, set up an accessibility notification
+  // waiter that returns on any event; we'll stop when we get the text we're
+  // waiting for, or time out. Otherwise just wait specifically for
+  // the "load complete" event.
+  scoped_ptr<AccessibilityNotificationWaiter> waiter;
+  if (!wait_for.empty()) {
+    waiter.reset(new AccessibilityNotificationWaiter(
+        shell(), AccessibilityModeComplete, ui::AX_EVENT_NONE));
+  } else {
+    waiter.reset(new AccessibilityNotificationWaiter(
+        shell(), AccessibilityModeComplete, ui::AX_EVENT_LOAD_COMPLETE));
+  }
+
+  // Load the test html.
   NavigateToURL(shell(), url);
-  waiter.WaitForNotification();
 
+  // Wait for notifications. If there's a @WAIT-FOR directive, break when
+  // the text we're waiting for appears in the dump, otherwise break after
+  // the first notification, which will be a load complete.
   RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>(
       shell()->web_contents()->GetRenderWidgetHostView());
-  AccessibilityTreeFormatter formatter(
-      host_view->GetBrowserAccessibilityManager()->GetRoot());
-
-  // Parse filters in the test file.
-  std::vector<Filter> filters;
-  AddDefaultFilters(&filters);
-  ParseFilters(html_contents, &filters);
-  formatter.SetFilters(filters);
+  std::string actual_contents;
+  do {
+    waiter->WaitForNotification();
+    base::string16 actual_contents_utf16;
+    AccessibilityTreeFormatter formatter(
+        host_view->GetBrowserAccessibilityManager()->GetRoot());
+    formatter.SetFilters(filters);
+    formatter.FormatAccessibilityTree(&actual_contents_utf16);
+    actual_contents = base::UTF16ToUTF8(actual_contents_utf16);
+  } while (!wait_for.empty() &&
+           actual_contents.find(wait_for) == std::string::npos);
 
   // Perform a diff (or write the initial baseline).
-  base::string16 actual_contents_utf16;
-  formatter.FormatAccessibilityTree(&actual_contents_utf16);
-  std::string actual_contents = base::UTF16ToUTF8(actual_contents_utf16);
   std::vector<std::string> actual_lines, expected_lines;
   Tokenize(actual_contents, "\n", &actual_lines);
   Tokenize(expected_contents, "\n", &expected_lines);
@@ -515,6 +557,10 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityTableSpans) {
   RunTest(FILE_PATH_LITERAL("table-spans.html"));
 }
 
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityTransition) {
+  RunTest(FILE_PATH_LITERAL("transition.html"));
+}
+
 IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
                        AccessibilityToggleButton) {
   RunTest(FILE_PATH_LITERAL("togglebutton.html"));
index c89cdc0..777a01e 100644 (file)
@@ -4,6 +4,9 @@
 
 #include "content/public/browser/android/devtools_auth.h"
 
+#include <unistd.h>
+#include <sys/types.h>
+
 #include "base/logging.h"
 
 namespace content {
@@ -15,8 +18,9 @@ bool CanUserConnectToDevTools(uid_t uid, gid_t gid) {
     return false;
   }
   if (gid == uid &&
-      (strcmp("root", creds->pw_name) == 0 ||  // For rooted devices
-       strcmp("shell", creds->pw_name) == 0)) {  // For non-rooted devices
+      (strcmp("root", creds->pw_name) == 0 ||   // For rooted devices
+       strcmp("shell", creds->pw_name) == 0 ||  // For non-rooted devices
+       uid == getuid())) {  // From processes signed with the same key
     return true;
   }
   LOG(WARNING) << "DevTools: connection attempt from " << creds->pw_name;
index 4449ca1..c19173c 100644 (file)
@@ -86,6 +86,18 @@ scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> WrapContext(
           context.Pass(), GetDefaultAttribs()));
 }
 
+scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
+WrapContextWithAttributes(
+    scoped_ptr<gpu::GLInProcessContext> context,
+    const blink::WebGraphicsContext3D::Attributes& attributes) {
+  if (!context.get())
+    return scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>();
+
+  return scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>(
+      WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
+          context.Pass(), attributes));
+}
+
 class VideoContextProvider
     : public StreamTextureFactorySynchronousImpl::ContextProvider {
  public:
@@ -203,7 +215,8 @@ SynchronousCompositorFactoryImpl::CreateStreamTextureFactory(int frame_id) {
 blink::WebGraphicsContext3D*
 SynchronousCompositorFactoryImpl::CreateOffscreenGraphicsContext3D(
     const blink::WebGraphicsContext3D::Attributes& attributes) {
-  return WrapContext(CreateOffscreenContext(attributes)).release();
+  return WrapContextWithAttributes(CreateOffscreenContext(attributes),
+                                   attributes).release();
 }
 
 void SynchronousCompositorFactoryImpl::CompositorInitializedHardwareDraw() {
@@ -246,8 +259,9 @@ void SynchronousCompositorFactoryImpl::SetDeferredGpuService(
   service_ = service;
 }
 
-void SynchronousCompositorFactoryImpl::DisableRecordFullLayer() {
-  record_full_layer_ = false;
+void SynchronousCompositorFactoryImpl::SetRecordFullDocument(
+    bool record_full_document) {
+  record_full_layer_ = record_full_document;
 }
 
 }  // namespace content
index 5565da9..ddaef40 100644 (file)
@@ -50,7 +50,7 @@ class SynchronousCompositorFactoryImpl : public SynchronousCompositorFactory {
 
   void SetDeferredGpuService(
       scoped_refptr<gpu::InProcessCommandBuffer::Service> service);
-  void DisableRecordFullLayer();
+  void SetRecordFullDocument(bool record_full_document);
   void CompositorInitializedHardwareDraw();
   void CompositorReleasedHardwareDraw();
 
index 7a40281..1b5ccb7 100644 (file)
@@ -90,8 +90,8 @@ void SynchronousCompositor::SetGpuService(
 }
 
 // static
-void SynchronousCompositor::DisableRecordFullLayer() {
-  g_factory.Get().DisableRecordFullLayer();
+void SynchronousCompositor::SetRecordFullDocument(bool record_full_document) {
+  g_factory.Get().SetRecordFullDocument(record_full_document);
 }
 
 bool SynchronousCompositorImpl::InitializeHwDraw() {
index 803c579..0aa9c0b 100644 (file)
@@ -264,12 +264,12 @@ void WebContentsObserverAndroid::DidDetachInterstitialPage() {
   Java_WebContentsObserverAndroid_didDetachInterstitialPage(env, obj.obj());
 }
 
-void WebContentsObserverAndroid::DidChangeBrandColor(SkColor color) {
+void WebContentsObserverAndroid::DidChangeThemeColor(SkColor color) {
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
   if (obj.is_null())
     return;
-  Java_WebContentsObserverAndroid_didChangeBrandColor(env, obj.obj(), color);
+  Java_WebContentsObserverAndroid_didChangeThemeColor(env, obj.obj(), color);
 }
 
 void WebContentsObserverAndroid::DidFailLoadInternal(
index 09b98b6..e13606c 100644 (file)
@@ -81,7 +81,7 @@ class WebContentsObserverAndroid : public WebContentsObserver {
   virtual void WebContentsDestroyed() OVERRIDE;
   virtual void DidAttachInterstitialPage() OVERRIDE;
   virtual void DidDetachInterstitialPage() OVERRIDE;
-  virtual void DidChangeBrandColor(SkColor color) OVERRIDE;
+  virtual void DidChangeThemeColor(SkColor color) OVERRIDE;
 
   void DidFailLoadInternal(bool is_provisional_load,
                            bool is_main_frame,
index b49a982..5e65042 100644 (file)
@@ -511,10 +511,10 @@ base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus(
 
 void ChildProcessLauncher::SetProcessBackgrounded(bool background) {
   BrowserThread::PostTask(
-      BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
-      base::Bind(
-          &ChildProcessLauncher::Context::SetProcessBackgrounded,
-          GetHandle(), background));
+     BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
+     base::Bind(
+         &ChildProcessLauncher::Context::SetProcessBackgrounded,
+         GetHandle(), background));
 }
 
 void ChildProcessLauncher::SetTerminateChildOnShutdown(
index 4a24254..b050152 100644 (file)
@@ -5,10 +5,12 @@
 #include "content/browser/devtools/devtools_browser_target.h"
 
 #include "base/bind.h"
+#include "base/lazy_instance.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop_proxy.h"
 #include "base/stl_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/server/http_server.h"
@@ -42,6 +44,9 @@ void DevToolsBrowserTarget::RegisterDomainHandler(
   }
 }
 
+typedef std::map<std::string, DevToolsBrowserTarget*> DomainMap;
+base::LazyInstance<DomainMap>::Leaky g_used_domains = LAZY_INSTANCE_INITIALIZER;
+
 void DevToolsBrowserTarget::HandleMessage(const std::string& data) {
   DCHECK_EQ(message_loop_proxy_, base::MessageLoopProxy::current());
   std::string error_response;
@@ -57,9 +62,21 @@ void DevToolsBrowserTarget::HandleMessage(const std::string& data) {
     Respond(command->NoSuchMethodErrorResponse()->Serialize());
     return;
   }
+  DomainMap& used_domains(g_used_domains.Get());
+  std::string domain = command->domain();
+  DomainMap::iterator jt = used_domains.find(domain);
+  if (jt == used_domains.end()) {
+    used_domains[domain] = this;
+  } else if (jt->second != this) {
+    std::string message =
+        base::StringPrintf("'%s' is held by another connection",
+                           domain.c_str());
+    Respond(command->ServerErrorResponse(message)->Serialize());
+    return;
+  }
 
   DevToolsProtocol::Handler* handler = it->second;
-  bool handle_directly = handle_on_ui_thread_.find(command->domain()) ==
+  bool handle_directly = handle_on_ui_thread_.find(domain) ==
       handle_on_ui_thread_.end();
   if (handle_directly) {
     scoped_refptr<DevToolsProtocol::Response> response =
@@ -88,6 +105,18 @@ void DevToolsBrowserTarget::Detach() {
 
   http_server_ = NULL;
 
+  DomainMap& used_domains(g_used_domains.Get());
+  for (DomainMap::iterator it = used_domains.begin();
+       it != used_domains.end();) {
+    if (it->second == this) {
+      DomainMap::iterator to_erase = it;
+      ++it;
+      used_domains.erase(to_erase);
+    } else {
+      ++it;
+    }
+  }
+
   std::vector<DevToolsProtocol::Handler*> ui_handlers;
   for (std::set<std::string>::iterator domain_it = handle_on_ui_thread_.begin();
        domain_it != handle_on_ui_thread_.end();
index bd1be4b..d1b5b1e 100644 (file)
@@ -328,23 +328,21 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest(
   std::string browser_prefix = "/devtools/browser";
   size_t browser_pos = request.path.find(browser_prefix);
   if (browser_pos == 0) {
-    if (browser_target_) {
-      server_->Send500(connection_id, "Another client already attached");
-      return;
-    }
-    browser_target_ = new DevToolsBrowserTarget(server_.get(), connection_id);
-    browser_target_->RegisterDomainHandler(
+    scoped_refptr<DevToolsBrowserTarget> browser_target =
+        new DevToolsBrowserTarget(server_.get(), connection_id);
+    browser_target->RegisterDomainHandler(
         devtools::Tracing::kName,
         new DevToolsTracingHandler(DevToolsTracingHandler::Browser),
         true /* handle on UI thread */);
-    browser_target_->RegisterDomainHandler(
+    browser_target->RegisterDomainHandler(
         TetheringHandler::kDomain,
         new TetheringHandler(delegate_.get()),
         false /* handle on this thread */);
-    browser_target_->RegisterDomainHandler(
+    browser_target->RegisterDomainHandler(
         devtools::SystemInfo::kName,
         new DevToolsSystemInfoHandler(),
         true /* handle on UI thread */);
+    browser_targets_[connection_id] = browser_target;
 
     server_->AcceptWebSocket(connection_id, request);
     return;
@@ -363,8 +361,9 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest(
 void DevToolsHttpHandlerImpl::OnWebSocketMessage(
     int connection_id,
     const std::string& data) {
-  if (browser_target_ && connection_id == browser_target_->connection_id()) {
-    browser_target_->HandleMessage(data);
+  BrowserTargets::iterator it = browser_targets_.find(connection_id);
+  if (it != browser_targets_.end()) {
+    it->second->HandleMessage(data);
     return;
   }
 
@@ -379,9 +378,10 @@ void DevToolsHttpHandlerImpl::OnWebSocketMessage(
 }
 
 void DevToolsHttpHandlerImpl::OnClose(int connection_id) {
-  if (browser_target_ && browser_target_->connection_id() == connection_id) {
-    browser_target_->Detach();
-    browser_target_ = NULL;
+  BrowserTargets::iterator it = browser_targets_.find(connection_id);
+  if (it != browser_targets_.end()) {
+    it->second->Detach();
+    browser_targets_.erase(it);
     return;
   }
 
index d55237d..0d08d98 100644 (file)
@@ -125,7 +125,8 @@ class DevToolsHttpHandlerImpl
   base::FilePath active_port_output_directory_;
   typedef std::map<std::string, DevToolsTarget*> TargetMap;
   TargetMap target_map_;
-  scoped_refptr<DevToolsBrowserTarget> browser_target_;
+  typedef std::map<int, scoped_refptr<DevToolsBrowserTarget> > BrowserTargets;
+  BrowserTargets browser_targets_;
   DISALLOW_COPY_AND_ASSIGN(DevToolsHttpHandlerImpl);
 };
 
index 0c56040..3aafd1c 100644 (file)
@@ -193,6 +193,8 @@ void DevToolsManagerImpl::RemoveAgentStateCallback(const Callback& callback) {
 void DevToolsManagerImpl::NotifyObservers(DevToolsAgentHost* agent_host,
                                           bool attached) {
   CallbackContainer copy(callbacks_);
+  if (delegate_)
+    delegate_->DevToolsAgentStateChanged(agent_host, attached);
   for (CallbackContainer::iterator it = copy.begin(); it != copy.end(); ++it)
      (*it)->Run(agent_host, attached);
 }
index c5d163e..5e127f1 100644 (file)
@@ -27,7 +27,8 @@ enum Error {
   kErrorInvalidRequest = -32600,
   kErrorNoSuchMethod = -32601,
   kErrorInvalidParams = -32602,
-  kErrorInternalError = -32603
+  kErrorInternalError = -32603,
+  kErrorServerError = -32000
 };
 
 }  // namespace
@@ -84,6 +85,11 @@ DevToolsProtocol::Command::NoSuchMethodErrorResponse() {
 }
 
 scoped_refptr<DevToolsProtocol::Response>
+DevToolsProtocol::Command::ServerErrorResponse(const std::string& message) {
+  return new Response(id_, kErrorServerError, message);
+}
+
+scoped_refptr<DevToolsProtocol::Response>
 DevToolsProtocol::Command::AsyncResponsePromise() {
   scoped_refptr<DevToolsProtocol::Response> promise =
       new DevToolsProtocol::Response(0, NULL);
index 65a4925..cbc075b 100644 (file)
@@ -64,6 +64,9 @@ class DevToolsProtocol {
     // Creates error response.
     scoped_refptr<Response> NoSuchMethodErrorResponse();
 
+    // Creates error response.
+    scoped_refptr<Response> ServerErrorResponse(const std::string& message);
+
     // Creates async response promise.
     scoped_refptr<Response> AsyncResponsePromise();
 
index 733f899..ae454ae 100644 (file)
@@ -174,6 +174,7 @@ bool IsRendererDebugURL(const GURL& url) {
     return true;
 
   return url == GURL(kChromeUICrashURL) ||
+         url == GURL(kChromeUIDumpURL) ||
          url == GURL(kChromeUIKillURL) ||
          url == GURL(kChromeUIHangURL) ||
          url == GURL(kChromeUIShorthangURL);
index a6b00f7..e12df2a 100644 (file)
@@ -427,22 +427,11 @@ void NavigatorImpl::DidNavigate(
       // change WebContents::GetRenderViewHost to return the new host, instead
       // of the one that may have just been swapped out.
       if (delegate_->CanOverscrollContent()) {
-        bool page_id_changed;
-        bool url_changed;
-        NavigationEntry* current_entry = controller_->GetLastCommittedEntry();
-        if (current_entry) {
-          page_id_changed = params.page_id > 0 &&
-              params.page_id != current_entry->GetPageID();
-          url_changed = params.url != current_entry->GetURL();
-        } else {
-          page_id_changed = params.page_id > 0;
-          url_changed = params.url != GURL::EmptyGURL();
-        }
-
-        // We only want to take the screenshot if the are navigating to a
-        // different history entry than the current one. So if neither the
-        // page id nor the url changed - don't take the screenshot.
-        if (page_id_changed || url_changed)
+        // Don't take screenshots if we are staying on the same page. We want
+        // in-page navigations to be super fast, and taking a screenshot
+        // currently blocks GPU for a longer time than we are willing to
+        // tolerate in this use case.
+        if (!params.was_within_same_page)
           controller_->TakeScreenshot();
       }
 
index 01fc786..e2d1654 100644 (file)
@@ -27,12 +27,13 @@ BrowserGpuChannelHostFactory* BrowserGpuChannelHostFactory::instance_ = NULL;
 
 struct BrowserGpuChannelHostFactory::CreateRequest {
   CreateRequest()
-      : event(true, false), gpu_host_id(0), route_id(MSG_ROUTING_NONE) {}
+      : event(true, false), gpu_host_id(0), route_id(MSG_ROUTING_NONE),
+        result(CREATE_COMMAND_BUFFER_FAILED) {}
   ~CreateRequest() {}
   base::WaitableEvent event;
   int gpu_host_id;
   int32 route_id;
-  bool succeeded;
+  CreateCommandBufferResult result;
 };
 
 class BrowserGpuChannelHostFactory::EstablishRequest
@@ -267,12 +268,12 @@ void BrowserGpuChannelHostFactory::CreateViewCommandBufferOnIO(
 
 // static
 void BrowserGpuChannelHostFactory::CommandBufferCreatedOnIO(
-    CreateRequest* request, bool succeeded) {
-  request->succeeded = succeeded;
+    CreateRequest* request, CreateCommandBufferResult result) {
+  request->result = result;
   request->event.Signal();
 }
 
-bool BrowserGpuChannelHostFactory::CreateViewCommandBuffer(
+CreateCommandBufferResult BrowserGpuChannelHostFactory::CreateViewCommandBuffer(
       int32 surface_id,
       const GPUCreateCommandBufferConfig& init_params,
       int32 route_id) {
@@ -292,7 +293,7 @@ bool BrowserGpuChannelHostFactory::CreateViewCommandBuffer(
                "BrowserGpuChannelHostFactory::CreateViewCommandBuffer");
   base::ThreadRestrictions::ScopedAllowWait allow_wait;
   request.event.Wait();
-  return request.succeeded;
+  return request.result;
 }
 
 void BrowserGpuChannelHostFactory::CreateImageOnIO(
index a442d16..dc85f67 100644 (file)
@@ -29,7 +29,7 @@ class CONTENT_EXPORT BrowserGpuChannelHostFactory
   virtual scoped_refptr<base::MessageLoopProxy> GetIOLoopProxy() OVERRIDE;
   virtual scoped_ptr<base::SharedMemory> AllocateSharedMemory(
       size_t size) OVERRIDE;
-  virtual bool CreateViewCommandBuffer(
+  virtual CreateCommandBufferResult CreateViewCommandBuffer(
       int32 surface_id,
       const GPUCreateCommandBufferConfig& init_params,
       int32 route_id) OVERRIDE;
@@ -85,7 +85,8 @@ class CONTENT_EXPORT BrowserGpuChannelHostFactory
       CreateRequest* request,
       int32 surface_id,
       const GPUCreateCommandBufferConfig& init_params);
-  static void CommandBufferCreatedOnIO(CreateRequest* request, bool succeeded);
+  static void CommandBufferCreatedOnIO(CreateRequest* request,
+                                       CreateCommandBufferResult result);
   void CreateImageOnIO(
       gfx::PluginWindowHandle window,
       int32 image_id,
index 721fa41..9176b6d 100644 (file)
@@ -644,7 +644,9 @@ void GpuProcessHost::CreateViewCommandBuffer(
     surface_refs_.insert(std::make_pair(surface_id,
         GpuSurfaceTracker::GetInstance()->GetSurfaceRefForSurface(surface_id)));
   } else {
-    callback.Run(false);
+    // Could distinguish here between compositing_surface being NULL
+    // and Send failing, if desired.
+    callback.Run(CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST);
   }
 }
 
@@ -743,7 +745,7 @@ void GpuProcessHost::OnChannelEstablished(
                GpuDataManagerImpl::GetInstance()->GetGPUInfo());
 }
 
-void GpuProcessHost::OnCommandBufferCreated(bool succeeded) {
+void GpuProcessHost::OnCommandBufferCreated(CreateCommandBufferResult result) {
   TRACE_EVENT0("gpu", "GpuProcessHost::OnCommandBufferCreated");
 
   if (create_command_buffer_requests_.empty())
@@ -752,7 +754,7 @@ void GpuProcessHost::OnCommandBufferCreated(bool succeeded) {
   CreateCommandBufferCallback callback =
       create_command_buffer_requests_.front();
   create_command_buffer_requests_.pop();
-  callback.Run(succeeded);
+  callback.Run(result);
 }
 
 void GpuProcessHost::OnDestroyCommandBuffer(int32 surface_id) {
@@ -1054,7 +1056,7 @@ void GpuProcessHost::SendOutstandingReplies() {
     CreateCommandBufferCallback callback =
         create_command_buffer_requests_.front();
     create_command_buffer_requests_.pop();
-    callback.Run(false);
+    callback.Run(CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST);
   }
 }
 
index 079b549..cf78946 100644 (file)
@@ -19,6 +19,7 @@
 #include "content/common/content_export.h"
 #include "content/common/gpu/gpu_memory_uma_stats.h"
 #include "content/common/gpu/gpu_process_launch_causes.h"
+#include "content/common/gpu/gpu_result_codes.h"
 #include "content/public/browser/browser_child_process_host_delegate.h"
 #include "content/public/browser/gpu_data_manager.h"
 #include "gpu/command_buffer/common/constants.h"
@@ -63,7 +64,8 @@ class GpuProcessHost : public BrowserChildProcessHostDelegate,
   typedef base::Callback<void(const IPC::ChannelHandle&, const gpu::GPUInfo&)>
       EstablishChannelCallback;
 
-  typedef base::Callback<void(bool)> CreateCommandBufferCallback;
+  typedef base::Callback<void(CreateCommandBufferResult)>
+      CreateCommandBufferCallback;
 
   typedef base::Callback<void(const gfx::Size)> CreateImageCallback;
 
@@ -171,7 +173,7 @@ class GpuProcessHost : public BrowserChildProcessHostDelegate,
   // Message handlers.
   void OnInitialized(bool result, const gpu::GPUInfo& gpu_info);
   void OnChannelEstablished(const IPC::ChannelHandle& channel_handle);
-  void OnCommandBufferCreated(bool succeeded);
+  void OnCommandBufferCreated(CreateCommandBufferResult result);
   void OnDestroyCommandBuffer(int32 surface_id);
   void OnImageCreated(const gfx::Size size);
   void OnGpuMemoryBufferCreated(const gfx::GpuMemoryBufferHandle& handle);
index 09644d6..0e5abc6 100644 (file)
@@ -675,15 +675,8 @@ bool ResourceDispatcherHostImpl::HandleExternalProtocol(ResourceLoader* loader,
   if (job_factory->IsHandledURL(url))
     return false;
 
-  bool initiated_by_user_gesture =
-      (loader->request()->load_flags() & net::LOAD_MAYBE_USER_GESTURE) != 0;
-  bool handled = delegate_->HandleExternalProtocol(url, info->GetChildID(),
-                                                   info->GetRouteID(),
-                                                   initiated_by_user_gesture);
-  // Consume the user gesture if the external protocol dialog is shown.
-  if (handled)
-    last_user_gesture_time_ = base::TimeTicks();
-  return handled;
+  return delegate_->HandleExternalProtocol(
+      url, info->GetChildID(), info->GetRouteID());
 }
 
 void ResourceDispatcherHostImpl::DidStartRequest(ResourceLoader* loader) {
index 87d9969..cfcfd5a 100644 (file)
@@ -358,9 +358,13 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp3) {
   EXPECT_EQ(kNot, CanPlay("'video/mpeg'"));
   EXPECT_EQ(kNot, CanPlay("'video/x-mp3'"));
 
-  // audio/mpeg does not allow any codecs parameter
+  // audio/mpeg without a codecs parameter (RFC 3003 compliant)
   EXPECT_EQ(kPropProbably, CanPlay("'audio/mpeg'"));
 
+  // audio/mpeg with mp3 in codecs parameter. (Not RFC compliant, but
+  // very common in the wild so it is a defacto standard).
+  EXPECT_EQ(kPropProbably, CanPlay("'audio/mpeg; codecs=\"mp3\"'"));
+
   EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc1\"'"));
   EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc3\"'"));
 
index 9103314..0449ae7 100644 (file)
@@ -64,6 +64,8 @@ class CompositingIOSurfaceLayerClient {
 // Called when a new frame is received.
 - (void)gotNewFrame;
 
+- (void)setNeedsDisplayAndDisplayAndAck;
+- (void)displayIfNeededAndAck;
 @end
 
 #endif  // CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_LAYER_MAC_H_
index 040d8f9..bda4c5f 100644 (file)
@@ -18,7 +18,6 @@
 #include "ui/gl/gpu_switching_manager.h"
 
 @interface CompositingIOSurfaceLayer(Private)
-- (void)immediatelyForceDisplayAndAck;
 - (void)ackPendingFrame:(bool)success;
 - (void)timerFired;
 @end
@@ -101,7 +100,7 @@ class CompositingIOSurfaceLayerHelper {
   if (context_ && context_->is_vsync_disabled()) {
     // If vsync is disabled, draw immediately and don't bother trying to use
     // the isAsynchronous property to ensure smooth animation.
-    [self immediatelyForceDisplayAndAck];
+    [self setNeedsDisplayAndDisplayAndAck];
   } else {
     needs_display_ = YES;
     if (![self isAsynchronous])
@@ -111,8 +110,20 @@ class CompositingIOSurfaceLayerHelper {
 
 // Private methods:
 
-- (void)immediatelyForceDisplayAndAck {
+- (void)setNeedsDisplayAndDisplayAndAck {
+  // Workaround for crbug.com/395827
+  if ([self isAsynchronous])
+    [self setAsynchronous:NO];
+
   [self setNeedsDisplay];
+  [self displayIfNeededAndAck];
+}
+
+- (void)displayIfNeededAndAck {
+  // Workaround for crbug.com/395827
+  if ([self isAsynchronous])
+    [self setAsynchronous:NO];
+
   [self displayIfNeeded];
 
   // Calls to setNeedsDisplay can sometimes be ignored, especially if issued
@@ -134,7 +145,7 @@ class CompositingIOSurfaceLayerHelper {
 
 - (void)timerFired {
   if (has_pending_frame_)
-    [self immediatelyForceDisplayAndAck];
+    [self setNeedsDisplayAndDisplayAndAck];
 }
 
 // The remaining methods implement the CAOpenGLLayer interface.
index 6232bcd..47f037d 100644 (file)
@@ -341,9 +341,14 @@ UIResourceProvider& CompositorImpl::GetUIResourceProvider() {
 }
 
 void CompositorImpl::SetRootLayer(scoped_refptr<cc::Layer> root_layer) {
-  root_layer_->RemoveAllChildren();
-  if (root_layer)
+  if (subroot_layer_) {
+    subroot_layer_->RemoveFromParent();
+    subroot_layer_ = NULL;
+  }
+  if (root_layer) {
+    subroot_layer_ = root_layer;
     root_layer_->AddChild(root_layer);
+  }
 }
 
 void CompositorImpl::SetWindowSurface(ANativeWindow* window) {
index e3cc42e..4792d90 100644 (file)
@@ -132,7 +132,11 @@ class CONTENT_EXPORT CompositorImpl
       bool is_transient);
   void OnGpuChannelEstablished();
 
+  // root_layer_ is the persistent internal root layer, while subroot_layer_
+  // is the one attached by the compositor client.
   scoped_refptr<cc::Layer> root_layer_;
+  scoped_refptr<cc::Layer> subroot_layer_;
+
   scoped_ptr<cc::LayerTreeHost> host_;
   content::UIResourceProviderImpl ui_resource_provider_;
 
index 3c22956..1cbfaf0 100644 (file)
@@ -200,9 +200,9 @@ void GpuMessageFilter::EstablishChannelCallback(
 }
 
 void GpuMessageFilter::CreateCommandBufferCallback(
-    scoped_ptr<IPC::Message> reply, bool succeeded) {
+    scoped_ptr<IPC::Message> reply, CreateCommandBufferResult result) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  GpuHostMsg_CreateViewCommandBuffer::WriteReplyParams(reply.get(), succeeded);
+  GpuHostMsg_CreateViewCommandBuffer::WriteReplyParams(reply.get(), result);
   Send(reply.release());
 }
 
index 327cd76..559415e 100644 (file)
@@ -13,6 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner_helpers.h"
 #include "content/common/gpu/gpu_process_launch_causes.h"
+#include "content/common/gpu/gpu_result_codes.h"
 #include "content/public/browser/browser_message_filter.h"
 #include "ui/gfx/native_widget_types.h"
 
@@ -66,7 +67,7 @@ class GpuMessageFilter : public BrowserMessageFilter {
                                 const IPC::ChannelHandle& channel,
                                 const gpu::GPUInfo& gpu_info);
   void CreateCommandBufferCallback(scoped_ptr<IPC::Message> reply,
-                                   bool succeeded);
+                                   CreateCommandBufferResult result);
 
   void BeginAllFrameSubscriptions();
   void EndAllFrameSubscriptions();
index bb3bd03..1b30815 100644 (file)
@@ -63,6 +63,8 @@ class InputRouter : public IPC::Listener {
     MOBILE_VIEWPORT   = 1 << 1
   };
   virtual void OnViewUpdated(int view_flags) = 0;
+
+  virtual bool HasPendingEvents() const = 0;
 };
 
 }  // namespace content
index b49c778..e06113b 100644 (file)
@@ -74,6 +74,7 @@ class CONTENT_EXPORT InputRouterImpl
   virtual const NativeWebKeyboardEvent* GetLastKeyboardEvent() const OVERRIDE;
   virtual bool ShouldForwardTouchEvent() const OVERRIDE;
   virtual void OnViewUpdated(int view_flags) OVERRIDE;
+  virtual bool HasPendingEvents() const OVERRIDE;
 
   // IPC::Listener
   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
@@ -205,8 +206,6 @@ private:
   // all events have been dispatched (i.e., |HasPendingEvents()| is false).
   void SignalFlushedIfNecessary();
 
-  bool HasPendingEvents() const;
-
   bool IsInOverscrollGesture() const;
 
   int routing_id() const { return routing_id_; }
index c7d5cc6..2ee0247 100644 (file)
@@ -130,6 +130,11 @@ bool TouchEmulator::HandleMouseEvent(const WebMouseEvent& mouse_event) {
   if (!enabled_)
     return false;
 
+  if (mouse_event.button == WebMouseEvent::ButtonRight &&
+      mouse_event.type == WebInputEvent::MouseDown) {
+    client_->ShowContextMenuAtPoint(gfx::Point(mouse_event.x, mouse_event.y));
+  }
+
   if (mouse_event.button != WebMouseEvent::ButtonLeft)
     return true;
 
index 92f382f..34ad109 100644 (file)
@@ -19,6 +19,7 @@ class CONTENT_EXPORT TouchEmulatorClient {
   virtual void ForwardGestureEvent(const blink::WebGestureEvent& event) = 0;
   virtual void ForwardTouchEvent(const blink::WebTouchEvent& event) = 0;
   virtual void SetCursor(const WebCursor& cursor) = 0;
+  virtual void ShowContextMenuAtPoint(const gfx::Point& point) = 0;
 };
 
 }  // namespace content
index 8fdfd54..cc6ec91 100644 (file)
@@ -84,6 +84,8 @@ class TouchEmulatorTest : public testing::Test,
 
   virtual void SetCursor(const WebCursor& cursor) OVERRIDE {}
 
+  virtual void ShowContextMenuAtPoint(const gfx::Point& point) OVERRIDE {}
+
  protected:
   TouchEmulator* emulator() const {
     return emulator_.get();
index 2be9ec7..86799c9 100644 (file)
@@ -25,9 +25,6 @@ namespace content {
 // accessibility support.
 const int kIdScreenReaderHoneyPot = 1;
 
-// A version of the OBJID_CLIENT constant that works in 64-bit mode too.
-static const LPARAM kObjIdClient = static_cast<ULONG>(OBJID_CLIENT);
-
 LegacyRenderWidgetHostHWND::~LegacyRenderWidgetHostHWND() {
   ::DestroyWindow(hwnd());
 }
@@ -138,14 +135,18 @@ LRESULT LegacyRenderWidgetHostHWND::OnEraseBkGnd(UINT message,
 LRESULT LegacyRenderWidgetHostHWND::OnGetObject(UINT message,
                                                 WPARAM w_param,
                                                 LPARAM l_param) {
-  if (kIdScreenReaderHoneyPot == l_param) {
+  // Only the lower 32 bits of l_param are valid when checking the object id
+  // because it sometimes gets sign-extended incorrectly (but not always).
+  DWORD obj_id = static_cast<DWORD>(static_cast<DWORD_PTR>(l_param));
+
+  if (kIdScreenReaderHoneyPot == obj_id) {
     // When an MSAA client has responded to our fake event on this id,
     // enable screen reader support.
     BrowserAccessibilityState::GetInstance()->OnScreenReaderDetected();
     return static_cast<LRESULT>(0L);
   }
 
-  if (kObjIdClient != l_param || !manager_)
+  if (OBJID_CLIENT != obj_id || !manager_)
     return static_cast<LRESULT>(0L);
 
   base::win::ScopedComPtr<IAccessible> root(
index 52a3890..d281bdf 100644 (file)
@@ -1072,6 +1072,11 @@ void RenderWidgetHostImpl::SetCursor(const WebCursor& cursor) {
   view_->UpdateCursor(cursor);
 }
 
+void RenderWidgetHostImpl::ShowContextMenuAtPoint(const gfx::Point& point) {
+  Send(new ViewMsg_ShowContextMenu(
+      GetRoutingID(), ui::MENU_SOURCE_MOUSE, point));
+}
+
 void RenderWidgetHostImpl::SendCursorVisibilityState(bool is_visible) {
   Send(new InputMsg_CursorVisibilityChange(GetRoutingID(), is_visible));
 }
@@ -1189,17 +1194,12 @@ void RenderWidgetHostImpl::RendererExited(base::TerminationStatus status,
 
   waiting_for_screen_rects_ack_ = false;
 
-  // Reset to ensure that input routing works with a new renderer.
-  input_router_.reset(new InputRouterImpl(
-      process_, this, this, routing_id_, GetInputRouterConfigForPlatform()));
-
   // Must reset these to ensure that keyboard events work with a new renderer.
   suppress_next_char_events_ = false;
 
   // Reset some fields in preparation for recovering from a crash.
   ResetSizeAndRepaintPendingFlags();
   current_size_.SetSize(0, 0);
-  is_hidden_ = false;
 
   // Reset this to ensure the hung renderer mechanism is working properly.
   in_flight_event_count_ = 0;
@@ -1211,6 +1211,13 @@ void RenderWidgetHostImpl::RendererExited(base::TerminationStatus status,
     view_ = NULL;  // The View should be deleted by RenderProcessGone.
   }
 
+  // Reconstruct the input router to ensure that it has fresh state for a new
+  // renderer. Otherwise it may be stuck waiting for the old renderer to ack an
+  // event. (In particular, the above call to view_->RenderProcessGone will
+  // destroy the aura window, which may dispatch a synthetic mouse move.)
+  input_router_.reset(new InputRouterImpl(
+      process_, this, this, routing_id_, GetInputRouterConfigForPlatform()));
+
   synthetic_gesture_controller_.reset();
 }
 
@@ -2160,8 +2167,22 @@ void RenderWidgetHostImpl::FrameSwapped(const ui::LatencyInfo& latency_info) {
   if (latency_info.FindLatency(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
                                GetLatencyComponentId(),
                                &window_snapshot_component)) {
-    WindowSnapshotReachedScreen(
-        static_cast<int>(window_snapshot_component.sequence_number));
+    int sequence_number = static_cast<int>(
+        window_snapshot_component.sequence_number);
+#if defined(OS_MACOSX)
+    // On Mac, when using CoreAnmation, there is a delay between when content
+    // is drawn to the screen, and when the snapshot will actually pick up
+    // that content. Insert a manual delay of 1/6th of a second (to simulate
+    // 10 frames at 60 fps) before actually taking the snapshot.
+    base::MessageLoop::current()->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&RenderWidgetHostImpl::WindowSnapshotReachedScreen,
+                   weak_factory_.GetWeakPtr(),
+                   sequence_number),
+        base::TimeDelta::FromSecondsD(1. / 6));
+#else
+    WindowSnapshotReachedScreen(sequence_number);
+#endif
   }
 
   ui::LatencyInfo::LatencyComponent rwh_component;
index 65fa860..e883502 100644 (file)
@@ -295,6 +295,7 @@ class CONTENT_EXPORT RenderWidgetHostImpl
   virtual void ForwardTouchEvent(
       const blink::WebTouchEvent& touch_event) OVERRIDE;
   virtual void SetCursor(const WebCursor& cursor) OVERRIDE;
+  virtual void ShowContextMenuAtPoint(const gfx::Point& point) OVERRIDE;
 
   // Queues a synthetic gesture for testing purposes.  Invokes the on_complete
   // callback when the gesture is finished running.
index 0e6a9d1..710719c 100644 (file)
@@ -104,6 +104,7 @@ class MockInputRouter : public InputRouter {
   }
   virtual bool ShouldForwardTouchEvent() const OVERRIDE { return true; }
   virtual void OnViewUpdated(int view_flags) OVERRIDE {}
+  virtual bool HasPendingEvents() const OVERRIDE { return false; }
 
   // IPC::Listener
   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
@@ -327,6 +328,17 @@ class TestView : public TestRenderWidgetHostView {
       return mock_physical_backing_size_;
     return TestRenderWidgetHostView::GetPhysicalBackingSize();
   }
+#if defined(USE_AURA)
+  virtual ~TestView() {
+    // Simulate the mouse exit event dispatched when an aura window is
+    // destroyed. (MakeWebMouseEventFromAuraEvent translates ET_MOUSE_EXITED
+    // into WebInputEvent::MouseMove.)
+    rwh_->input_router()->SendMouseEvent(
+        MouseEventWithLatencyInfo(
+            SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove),
+            ui::LatencyInfo()));
+  }
+#endif
 
  protected:
   WebMouseWheelEvent unhandled_wheel_event_;
@@ -1416,4 +1428,13 @@ TEST_F(RenderWidgetHostTest, InputEventRWHLatencyComponent) {
   SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
 }
 
+TEST_F(RenderWidgetHostTest, RendererExitedResetsInputRouter) {
+  // RendererExited will delete the view.
+  host_->SetView(new TestView(host_.get()));
+  host_->RendererExited(base::TERMINATION_STATUS_PROCESS_CRASHED, -1);
+
+  // Make sure the input router is in a fresh state.
+  ASSERT_FALSE(host_->input_router()->HasPendingEvents());
+}
+
 }  // namespace content
index b370e02..8fb2e4a 100644 (file)
@@ -442,13 +442,6 @@ class CONTENT_EXPORT RenderWidgetHostViewMac
   // screen.
   std::vector<ui::LatencyInfo> pending_latency_info_;
 
-  // When taking a screenshot when using CoreAnimation, add a delay of
-  // a few frames to ensure that the contents have reached the screen
-  // before reporting latency info.
-  uint32 pending_latency_info_delay_;
-  base::WeakPtrFactory<RenderWidgetHostViewMac>
-      pending_latency_info_delay_weak_ptr_factory_;
-
   NSWindow* pepper_fullscreen_window() const {
     return pepper_fullscreen_window_;
   }
@@ -481,7 +474,6 @@ class CONTENT_EXPORT RenderWidgetHostViewMac
   void AddPendingLatencyInfo(
       const std::vector<ui::LatencyInfo>& latency_info);
   void SendPendingLatencyInfoToHost();
-  void TickPendingLatencyInfoDelay();
 
   void SendPendingSwapAck();
 
index dce9a5e..375833c 100644 (file)
@@ -455,8 +455,6 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
     : render_widget_host_(RenderWidgetHostImpl::From(widget)),
       text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
       can_compose_inline_(true),
-      pending_latency_info_delay_(0),
-      pending_latency_info_delay_weak_ptr_factory_(this),
       backing_store_scale_factor_(1),
       is_loading_(false),
       weak_factory_(this),
@@ -800,6 +798,9 @@ void RenderWidgetHostViewMac::WasShown() {
 
   // Call setNeedsDisplay before pausing for new frames to come in -- if any
   // do, and are drawn, then the needsDisplay bit will be cleared.
+  // Workaround for crbug.com/395827
+  if ([compositing_iosurface_layer_ isAsynchronous])
+    [compositing_iosurface_layer_ setAsynchronous:NO];
   [compositing_iosurface_layer_ setNeedsDisplay];
   PauseForPendingResizeOrRepaintsAndDraw();
 }
@@ -1698,8 +1699,8 @@ void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer(
 }
 
 void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() {
-  if (compositing_iosurface_)
-    compositing_iosurface_->UnrefIOSurface();
+  if (!render_widget_host_->is_hidden())
+    DestroyCompositedIOSurfaceAndLayer();
 }
 
 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() {
@@ -2062,44 +2063,12 @@ gfx::Rect RenderWidgetHostViewMac::GetScaledOpenGLPixelRect(
 
 void RenderWidgetHostViewMac::AddPendingLatencyInfo(
     const std::vector<ui::LatencyInfo>& latency_info) {
-  // If a screenshot is being taken when using CoreAnimation, send a few extra
-  // calls to setNeedsDisplay and wait for their resulting display calls,
-  // before reporting that the frame has reached the screen.
-  bool should_defer = false;
-  for (size_t i = 0; i < latency_info.size(); i++) {
-    if (latency_info[i].FindLatency(
-            ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
-            render_widget_host_->GetLatencyComponentId(),
-            NULL)) {
-      should_defer = true;
-    }
-  }
-  if (should_defer) {
-    // Multiple pending screenshot requests will work, but if every frame
-    // requests a screenshot, then the delay will never expire. Assert this
-    // here to avoid this.
-    CHECK_EQ(pending_latency_info_delay_, 0u);
-    // Wait a fixed number of frames (calls to CALayer::display) before
-    // claiming that the screenshot has reached the screen. This number
-    // comes from taking the first number where tests didn't fail (six),
-    // and doubling it.
-    const uint32 kScreenshotLatencyDelayInFrames = 12;
-    pending_latency_info_delay_ = kScreenshotLatencyDelayInFrames;
-    TickPendingLatencyInfoDelay();
-  }
-
   for (size_t i = 0; i < latency_info.size(); i++) {
     pending_latency_info_.push_back(latency_info[i]);
   }
 }
 
 void RenderWidgetHostViewMac::SendPendingLatencyInfoToHost() {
-  if (pending_latency_info_delay_) {
-    pending_latency_info_delay_ -= 1;
-    return;
-  }
-  pending_latency_info_delay_weak_ptr_factory_.InvalidateWeakPtrs();
-
   for (size_t i = 0; i < pending_latency_info_.size(); i++) {
     pending_latency_info_[i].AddLatencyNumber(
         ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
@@ -2108,28 +2077,6 @@ void RenderWidgetHostViewMac::SendPendingLatencyInfoToHost() {
   pending_latency_info_.clear();
 }
 
-void RenderWidgetHostViewMac::TickPendingLatencyInfoDelay() {
-  if (compositing_iosurface_layer_) {
-    // Keep calling gotNewFrame in a loop until enough display calls come in.
-    // Each call will be separated by about a vsync.
-    base::MessageLoop::current()->PostTask(
-        FROM_HERE,
-        base::Bind(&RenderWidgetHostViewMac::TickPendingLatencyInfoDelay,
-                   pending_latency_info_delay_weak_ptr_factory_.GetWeakPtr()));
-    [compositing_iosurface_layer_ gotNewFrame];
-  }
-  if (software_layer_) {
-    // In software mode there is not an explicit setNeedsDisplay/display loop,
-    // so just wait a pretend-vsync at 60 Hz.
-    base::MessageLoop::current()->PostDelayedTask(
-        FROM_HERE,
-        base::Bind(&RenderWidgetHostViewMac::TickPendingLatencyInfoDelay,
-                   pending_latency_info_delay_weak_ptr_factory_.GetWeakPtr()),
-        base::TimeDelta::FromMilliseconds(1000/60));
-    SendPendingLatencyInfoToHost();
-  }
-}
-
 void RenderWidgetHostViewMac::AddPendingSwapAck(
     int32 route_id, int gpu_host_id, int32 renderer_id) {
   // Note that multiple un-acked swaps can come in the event of a GPU process
@@ -2173,7 +2120,7 @@ void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
   // to keep the window and the window's contents in sync.
   [cocoa_view_ displayIfNeeded];
   [software_layer_ displayIfNeeded];
-  [compositing_iosurface_layer_ displayIfNeeded];
+  [compositing_iosurface_layer_ displayIfNeededAndAck];
 }
 
 void RenderWidgetHostViewMac::LayoutLayers() {
@@ -2224,8 +2171,10 @@ void RenderWidgetHostViewMac::LayoutLayers() {
       // displayed. Calling displayIfNeeded will ensure that the right size
       // frame is drawn to the screen.
       // http://crbug.com/350817
-      [compositing_iosurface_layer_ setNeedsDisplay];
-      [compositing_iosurface_layer_ displayIfNeeded];
+      // Workaround for crbug.com/395827
+      if ([compositing_iosurface_layer_ isAsynchronous])
+        [compositing_iosurface_layer_ setAsynchronous:NO];
+      [compositing_iosurface_layer_ setNeedsDisplayAndDisplayAndAck];
     }
   }
 
index 0197bcf..05a2452 100644 (file)
@@ -52,6 +52,8 @@ bool SpeechRecognitionDispatcherHost::OnMessageReceived(
                         OnAbortRequest)
     IPC_MESSAGE_HANDLER(SpeechRecognitionHostMsg_StopCaptureRequest,
                         OnStopCaptureRequest)
+    IPC_MESSAGE_HANDLER(SpeechRecognitionHostMsg_AbortAllRequests,
+                        OnAbortAllRequests)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -164,6 +166,11 @@ void SpeechRecognitionDispatcherHost::OnAbortRequest(int render_view_id,
     SpeechRecognitionManager::GetInstance()->AbortSession(session_id);
 }
 
+void SpeechRecognitionDispatcherHost::OnAbortAllRequests(int render_view_id) {
+  SpeechRecognitionManager::GetInstance()->AbortAllSessionsForRenderView(
+      render_process_id_, render_view_id);
+}
+
 void SpeechRecognitionDispatcherHost::OnStopCaptureRequest(
     int render_view_id, int request_id) {
   int session_id = SpeechRecognitionManager::GetInstance()->GetSession(
index f8853f1..72e7ee1 100644 (file)
@@ -71,6 +71,7 @@ class CONTENT_EXPORT SpeechRecognitionDispatcherHost
       bool filter_profanities);
   void OnAbortRequest(int render_view_id, int request_id);
   void OnStopCaptureRequest(int render_view_id, int request_id);
+  void OnAbortAllRequests(int render_view_id);
 
   int render_process_id_;
   scoped_refptr<net::URLRequestContextGetter> context_getter_;
index d28fa92..efcd1fc 100644 (file)
@@ -280,7 +280,8 @@ void TouchEditableImplAura::OpenContextMenu(const gfx::Point& anchor) {
   gfx::Point point = anchor;
   ConvertPointFromScreen(&point);
   RenderWidgetHost* host = rwhva_->GetRenderWidgetHost();
-  host->Send(new ViewMsg_ShowContextMenu(host->GetRoutingID(), point));
+  host->Send(new ViewMsg_ShowContextMenu(
+      host->GetRoutingID(), ui::MENU_SOURCE_TOUCH_EDIT_MENU, point));
   EndTouchEditing(false);
 }
 
index 68e7883..e1e38e3 100644 (file)
@@ -509,8 +509,8 @@ bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host,
     IPC_MESSAGE_HANDLER(FrameHostMsg_PluginCrashed, OnPluginCrashed)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DomOperationResponse,
                         OnDomOperationResponse)
-    IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeBrandColor,
-                        OnBrandColorChanged)
+    IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeThemeColor,
+                        OnThemeColorChanged)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad,
                         OnDocumentLoadedInFrame)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad)
@@ -2518,9 +2518,9 @@ bool WebContentsImpl::CanOverscrollContent() const {
   return false;
 }
 
-void WebContentsImpl::OnBrandColorChanged(SkColor brand_color) {
+void WebContentsImpl::OnThemeColorChanged(SkColor theme_color) {
   FOR_EACH_OBSERVER(WebContentsObserver, observers_,
-                    DidChangeBrandColor(brand_color));
+                    DidChangeThemeColor(theme_color));
 }
 
 void WebContentsImpl::OnDidLoadResourceFromMemoryCache(
index 01b5fd0..8d5c01d 100644 (file)
@@ -698,7 +698,7 @@ class CONTENT_EXPORT WebContentsImpl
                          const IPC::Message& message);
 
   // IPC message handlers.
-  void OnBrandColorChanged(SkColor brand_color);
+  void OnThemeColorChanged(SkColor theme_color);
   void OnDidLoadResourceFromMemoryCache(const GURL& url,
                                         const std::string& security_info,
                                         const std::string& http_request,
index 685097e..41dab4c 100644 (file)
@@ -397,42 +397,39 @@ IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, DISABLED_OverscrollScreenshot) {
   set_min_screenshot_interval(0);
 
   // Do a few navigations initiated by the page.
+  // Screenshots should never be captured since these are all in-page
+  // navigations.
   ExecuteSyncJSFunction(main_frame, "navigate_next()");
   EXPECT_EQ(1, GetCurrentIndex());
   ExecuteSyncJSFunction(main_frame, "navigate_next()");
   EXPECT_EQ(2, GetCurrentIndex());
   screenshot_manager()->WaitUntilScreenshotIsReady();
 
-  // The current entry won't have any screenshots. But the entries in the
-  // history should now have screenshots.
   NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry(
       web_contents->GetController().GetEntryAtIndex(2));
   EXPECT_FALSE(entry->screenshot().get());
 
   entry = NavigationEntryImpl::FromNavigationEntry(
       web_contents->GetController().GetEntryAtIndex(1));
-  EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry));
+  EXPECT_FALSE(screenshot_manager()->ScreenshotSetForEntry(entry));
 
   entry = NavigationEntryImpl::FromNavigationEntry(
       web_contents->GetController().GetEntryAtIndex(0));
-  EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry));
+  EXPECT_FALSE(screenshot_manager()->ScreenshotSetForEntry(entry));
 
-  // Navigate again. Index 2 should now have a screenshot.
   ExecuteSyncJSFunction(main_frame, "navigate_next()");
-  EXPECT_EQ(3, GetCurrentIndex());
   screenshot_manager()->WaitUntilScreenshotIsReady();
 
   entry = NavigationEntryImpl::FromNavigationEntry(
       web_contents->GetController().GetEntryAtIndex(2));
-  EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry));
+  EXPECT_FALSE(screenshot_manager()->ScreenshotSetForEntry(entry));
 
   entry = NavigationEntryImpl::FromNavigationEntry(
       web_contents->GetController().GetEntryAtIndex(3));
   EXPECT_FALSE(entry->screenshot().get());
-
   {
     // Now, swipe right to navigate backwards. This should navigate away from
-    // index 3 to index 2, and index 3 should have a screenshot.
+    // index 3 to index 2.
     base::string16 expected_title = base::ASCIIToUTF16("Title: #2");
     content::TitleWatcher title_watcher(web_contents, expected_title);
     aura::Window* content = web_contents->GetContentNativeView();
@@ -449,7 +446,7 @@ IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, DISABLED_OverscrollScreenshot) {
     screenshot_manager()->WaitUntilScreenshotIsReady();
     entry = NavigationEntryImpl::FromNavigationEntry(
         web_contents->GetController().GetEntryAtIndex(3));
-    EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry));
+    EXPECT_FALSE(screenshot_manager()->ScreenshotSetForEntry(entry));
   }
 
   // Navigate a couple more times.
@@ -473,7 +470,7 @@ IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, DISABLED_OverscrollScreenshot) {
     screenshot_manager()->WaitUntilScreenshotIsReady();
     entry = NavigationEntryImpl::FromNavigationEntry(
         web_contents->GetController().GetEntryAtIndex(4));
-    EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry));
+    EXPECT_FALSE(screenshot_manager()->ScreenshotSetForEntry(entry));
   }
 }
 
@@ -555,9 +552,8 @@ IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest,
   EXPECT_EQ(NULL, screenshot_manager()->screenshot_taken_for());
 }
 
-// Tests that navigations resulting from reloads and history.replaceState
-// do not capture screenshots while navigations resulting from
-// histrory.pushState do.
+// Tests that navigations resulting from reloads, history.replaceState,
+// and history.pushState do not capture screenshots.
 IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, ReplaceStateReloadPushState) {
   ASSERT_NO_FATAL_FAILURE(
       StartTestWithPage("files/overscroll_navigation.html"));
@@ -575,12 +571,18 @@ IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, ReplaceStateReloadPushState) {
   web_contents->GetController().Reload(true);
   WaitForLoadStop(web_contents);
   // reloading the page shouldn't capture a screenshot
-  EXPECT_FALSE(screenshot_manager()->screenshot_taken_for());
+  // TODO (mfomitchev): currently broken. Uncomment when
+  // FrameHostMsg_DidCommitProvisionalLoad_Params.was_within_same_page
+  // is populated properly when reloading the page.
+  //EXPECT_FALSE(screenshot_manager()->screenshot_taken_for());
   screenshot_manager()->Reset();
   ExecuteSyncJSFunction(main_frame, "use_push_state()");
   screenshot_manager()->WaitUntilScreenshotIsReady();
-  // pushing a state should capture a screenshot
-  EXPECT_TRUE(screenshot_manager()->screenshot_taken_for());
+  // pushing a state shouldn't capture a screenshot
+  // TODO (mfomitchev): currently broken. Uncomment when
+  // FrameHostMsg_DidCommitProvisionalLoad_Params.was_within_same_page
+  // is populated properly when pushState is used.
+  //EXPECT_FALSE(screenshot_manager()->screenshot_taken_for());
 }
 
 // TODO(sadrul): This test is disabled because it reparents in a way the
index 89ff408..3222b41 100644 (file)
@@ -579,7 +579,9 @@ void ChildThread::OnProcessBackgrounded(bool background) {
 #ifdef OS_WIN
   // Windows Vista+ has a fancy process backgrounding mode that can only be set
   // from within the process.
-  base::Process::Current().SetProcessBackgrounded(background);
+  // TODO(wfh) Do not set background from within process until the issue with
+  // white tabs is resolved.  See http://crbug.com/398103.
+  // base::Process::Current().SetProcessBackgrounded(background);
 #endif  // OS_WIN
 }
 
index ad1a1a9..c5c18af 100644 (file)
@@ -1504,6 +1504,9 @@ Status GenerateRsaKeyPair(const blink::WebCryptoAlgorithm& algorithm,
     return Status::OperationError();
 
   PK11RSAGenParams rsa_gen_params;
+  // keySizeInBits is a signed type, don't pass in a negative value.
+  if (modulus_length_bits > INT_MAX)
+    return Status::OperationError();
   rsa_gen_params.keySizeInBits = modulus_length_bits;
   rsa_gen_params.pe = public_exponent;
 
@@ -1531,7 +1534,7 @@ Status GenerateRsaKeyPair(const blink::WebCryptoAlgorithm& algorithm,
 
   // Note: NSS does not generate an sec_public_key if the call below fails,
   // so there is no danger of a leaked sec_public_key.
-  SECKEYPublicKey* sec_public_key;
+  SECKEYPublicKey* sec_public_key = NULL;
   crypto::ScopedSECKEYPrivateKey scoped_sec_private_key(
       PK11_GenerateKeyPairWithOpFlags(slot.get(),
                                       CKM_RSA_PKCS_KEY_PAIR_GEN,
@@ -1541,7 +1544,7 @@ Status GenerateRsaKeyPair(const blink::WebCryptoAlgorithm& algorithm,
                                       operation_flags,
                                       operation_flags_mask,
                                       NULL));
-  if (!private_key)
+  if (!scoped_sec_private_key)
     return Status::OperationError();
 
   blink::WebCryptoKeyAlgorithm key_algorithm;
index 3586240..f4afaf7 100644 (file)
@@ -2603,6 +2603,36 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) {
             ExportKey(blink::WebCryptoKeyFormatSpki, private_key, &output));
 }
 
+TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsaBadModulusLength)) {
+  const unsigned int kBadModulus[] = {
+      0,
+      255,         // Not a multiple of 8.
+      1023,        // Not a multiple of 8.
+      0xFFFFFFFF,  // Cannot fit in a signed int.
+      16384 + 8,   // 16384 is the maxmimum length that NSS succeeds for.
+  };
+
+  const std::vector<uint8> public_exponent = HexStringToBytes("010001");
+
+  for (size_t i = 0; i < arraysize(kBadModulus); ++i) {
+    const unsigned int modulus_length = kBadModulus[i];
+    blink::WebCryptoAlgorithm algorithm = CreateRsaHashedKeyGenAlgorithm(
+        blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5,
+        blink::WebCryptoAlgorithmIdSha256,
+        modulus_length,
+        public_exponent);
+    bool extractable = true;
+    const blink::WebCryptoKeyUsageMask usage_mask = 0;
+    blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull();
+    blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull();
+
+    EXPECT_FALSE(
+        GenerateKeyPair(
+            algorithm, extractable, usage_mask, &public_key, &private_key)
+            .IsSuccess());
+  }
+}
+
 // Try generating RSA key pairs using unsupported public exponents. Only
 // exponents of 3 and 65537 are supported. While both OpenSSL and NSS can
 // support other values, OpenSSL hangs when given invalid exponents, so use a
index c6aa5a1..ee1326c 100644 (file)
@@ -617,9 +617,9 @@ IPC_MESSAGE_ROUTED3(FrameHostMsg_MediaPlayingNotification,
 IPC_MESSAGE_ROUTED1(FrameHostMsg_MediaPausedNotification,
                     int64 /* player_cookie, distinguishes instances */)
 
-// Notify browser the brand color has been changed.
-IPC_MESSAGE_ROUTED1(FrameHostMsg_DidChangeBrandColor,
-                    SkColor /* brand_color */)
+// Notify browser the theme color has been changed.
+IPC_MESSAGE_ROUTED1(FrameHostMsg_DidChangeThemeColor,
+                    SkColor /* theme_color */)
 
 // Response for FrameMsg_TextSurroundingSelectionRequest, |startOffset| and
 // |endOffset| are the offsets of the selection in the returned |content|.
index dc1a3ce..6312dee 100644 (file)
@@ -142,20 +142,25 @@ CommandBufferProxyImpl* GpuChannelHost::CreateViewCommandBuffer(
   init_params.active_url = active_url;
   init_params.gpu_preference = gpu_preference;
   int32 route_id = GenerateRouteID();
-  if (!factory_->CreateViewCommandBuffer(surface_id, init_params, route_id)) {
+  CreateCommandBufferResult result = factory_->CreateViewCommandBuffer(
+      surface_id, init_params, route_id);
+  if (result != CREATE_COMMAND_BUFFER_SUCCEEDED) {
     LOG(ERROR) << "GpuChannelHost::CreateViewCommandBuffer failed.";
 
-    // The most likely reason CreateViewCommandBuffer will fail is
-    // that the GPU process crashed. In this case the GPU channel
-    // needs to be considered lost. The caller will then set up a new
-    // connection, and the GPU channel and any view command buffers
-    // will all be associated with the same GPU process.
-    DCHECK(MessageLoopProxy::current().get());
-
-    scoped_refptr<base::MessageLoopProxy> io_loop = factory_->GetIOLoopProxy();
-    io_loop->PostTask(FROM_HERE,
-                      base::Bind(&GpuChannelHost::MessageFilter::OnChannelError,
-                                 channel_filter_.get()));
+    if (result == CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST) {
+      // The GPU channel needs to be considered lost. The caller will
+      // then set up a new connection, and the GPU channel and any
+      // view command buffers will all be associated with the same GPU
+      // process.
+      DCHECK(MessageLoopProxy::current().get());
+
+      scoped_refptr<base::MessageLoopProxy> io_loop =
+          factory_->GetIOLoopProxy();
+      io_loop->PostTask(
+          FROM_HERE,
+          base::Bind(&GpuChannelHost::MessageFilter::OnChannelError,
+                     channel_filter_.get()));
+    }
 
     return NULL;
   }
index 4f5b74f..07d5a61 100644 (file)
@@ -17,6 +17,7 @@
 #include "base/synchronization/lock.h"
 #include "content/common/content_export.h"
 #include "content/common/gpu/gpu_process_launch_causes.h"
+#include "content/common/gpu/gpu_result_codes.h"
 #include "content/common/message_router.h"
 #include "gpu/config/gpu_info.h"
 #include "ipc/ipc_channel_handle.h"
@@ -68,7 +69,7 @@ class CONTENT_EXPORT GpuChannelHostFactory {
   virtual base::MessageLoop* GetMainLoop() = 0;
   virtual scoped_refptr<base::MessageLoopProxy> GetIOLoopProxy() = 0;
   virtual scoped_ptr<base::SharedMemory> AllocateSharedMemory(size_t size) = 0;
-  virtual bool CreateViewCommandBuffer(
+  virtual CreateCommandBufferResult CreateViewCommandBuffer(
       int32 surface_id,
       const GPUCreateCommandBufferConfig& init_params,
       int32 route_id) = 0;
index 727bb89..005a4aa 100644 (file)
@@ -527,7 +527,7 @@ void GpuChannel::StubSchedulingChanged(bool scheduled) {
   }
 }
 
-bool GpuChannel::CreateViewCommandBuffer(
+CreateCommandBufferResult GpuChannel::CreateViewCommandBuffer(
     const gfx::GLSurfaceHandle& window,
     int32 surface_id,
     const GPUCreateCommandBufferConfig& init_params,
@@ -568,10 +568,10 @@ bool GpuChannel::CreateViewCommandBuffer(
   if (!router_.AddRoute(route_id, stub.get())) {
     DLOG(ERROR) << "GpuChannel::CreateViewCommandBuffer(): "
                    "failed to add route";
-    return false;
+    return CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST;
   }
   stubs_.AddWithID(stub.release(), route_id);
-  return true;
+  return CREATE_COMMAND_BUFFER_SUCCEEDED;
 }
 
 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) {
index e181a3e..7ad270f 100644 (file)
@@ -17,6 +17,7 @@
 #include "build/build_config.h"
 #include "content/common/gpu/gpu_command_buffer_stub.h"
 #include "content/common/gpu/gpu_memory_manager.h"
+#include "content/common/gpu/gpu_result_codes.h"
 #include "content/common/message_router.h"
 #include "ipc/ipc_sync_channel.h"
 #include "ui/gfx/native_widget_types.h"
@@ -107,7 +108,7 @@ class GpuChannel : public IPC::Listener, public IPC::Sender {
   // other channels.
   void StubSchedulingChanged(bool scheduled);
 
-  bool CreateViewCommandBuffer(
+  CreateCommandBufferResult CreateViewCommandBuffer(
       const gfx::GLSurfaceHandle& window,
       int32 surface_id,
       const GPUCreateCommandBufferConfig& init_params,
index 899da86..7c96d79 100644 (file)
@@ -171,15 +171,15 @@ void GpuChannelManager::OnCreateViewCommandBuffer(
     const GPUCreateCommandBufferConfig& init_params,
     int32 route_id) {
   DCHECK(surface_id);
-  bool succeeded = false;
+  CreateCommandBufferResult result = CREATE_COMMAND_BUFFER_FAILED;
 
   GpuChannelMap::const_iterator iter = gpu_channels_.find(client_id);
   if (iter != gpu_channels_.end()) {
-    succeeded = iter->second->CreateViewCommandBuffer(
+    result = iter->second->CreateViewCommandBuffer(
         window, surface_id, init_params, route_id);
   }
 
-  Send(new GpuHostMsg_CommandBufferCreated(succeeded));
+  Send(new GpuHostMsg_CommandBufferCreated(result));
 }
 
 void GpuChannelManager::CreateImage(
index 169270e..02c3c38 100644 (file)
@@ -12,6 +12,7 @@
 #include "content/common/content_export.h"
 #include "content/common/gpu/gpu_memory_uma_stats.h"
 #include "content/common/gpu/gpu_process_launch_causes.h"
+#include "content/common/gpu/gpu_result_codes.h"
 #include "content/public/common/common_param_traits.h"
 #include "content/public/common/gpu_memory_stats.h"
 #include "gpu/command_buffer/common/capabilities.h"
@@ -43,6 +44,8 @@
 
 IPC_ENUM_TRAITS_MAX_VALUE(content::CauseForGpuLaunch,
                           content::CAUSE_FOR_GPU_LAUNCH_MAX_ENUM - 1)
+IPC_ENUM_TRAITS_MAX_VALUE(content::CreateCommandBufferResult,
+                          content::CREATE_COMMAND_BUFFER_RESULT_LAST);
 IPC_ENUM_TRAITS_MAX_VALUE(gfx::GpuPreference,
                           gfx::GpuPreferenceLast)
 IPC_ENUM_TRAITS_MAX_VALUE(gfx::SurfaceType,
@@ -335,7 +338,7 @@ IPC_SYNC_MESSAGE_CONTROL3_1(GpuHostMsg_CreateViewCommandBuffer,
                             int32, /* surface_id */
                             GPUCreateCommandBufferConfig, /* init_params */
                             int32, /* route_id */
-                            bool /* succeeded */)
+                            content::CreateCommandBufferResult /* result */)
 
 // Response from GPU to a GputMsg_Initialize message.
 IPC_MESSAGE_CONTROL2(GpuHostMsg_Initialized,
@@ -362,7 +365,7 @@ IPC_MESSAGE_CONTROL1(GpuMsg_LoadedShader,
 
 // Respond from GPU to a GpuMsg_CreateViewCommandBuffer message.
 IPC_MESSAGE_CONTROL1(GpuHostMsg_CommandBufferCreated,
-                     bool /* succeeded */)
+                     content::CreateCommandBufferResult /* result */)
 
 // Request from GPU to free the browser resources associated with the
 // command buffer.
diff --git a/src/content/common/gpu/gpu_result_codes.h b/src/content/common/gpu/gpu_result_codes.h
new file mode 100644 (file)
index 0000000..11f4272
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_COMMON_GPU_GPU_RESULT_CODES_H_
+#define CONTENT_COMMON_GPU_GPU_RESULT_CODES_H_
+
+namespace content {
+
+enum CreateCommandBufferResult {
+  CREATE_COMMAND_BUFFER_SUCCEEDED,
+  CREATE_COMMAND_BUFFER_FAILED,
+  CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST,
+  CREATE_COMMAND_BUFFER_RESULT_LAST =
+      CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST
+};
+
+}  // namespace content
+
+#endif  // CONTENT_COMMON_GPU_GPU_RESULT_CODES_H_
index 4840abd..5e4fcf5 100644 (file)
@@ -70,12 +70,19 @@ IPC_MESSAGE_CONTROL1(SpeechRecognitionHostMsg_StartRequest,
                      SpeechRecognitionHostMsg_StartRequest_Params)
 
 // Requests the speech recognition service to abort speech recognition on
-// behalf of the given |render_view_id|. If speech recognition is not happening
-// or is happening on behalf of some other render view, this call does nothing.
+// behalf of the given |render_view_id| and |request_id|. If there are no
+// sessions associated with the |request_id| in the render view, this call
+// does nothing.
 IPC_MESSAGE_CONTROL2(SpeechRecognitionHostMsg_AbortRequest,
                      int /* render_view_id */,
                      int /* request_id */)
 
+// Requests the speech recognition service to abort all speech recognitions on
+// behalf of the given |render_view_id|. If speech recognition is not happening
+// or is happening on behalf of some other render view, this call does nothing.
+IPC_MESSAGE_CONTROL1(SpeechRecognitionHostMsg_AbortAllRequests,
+                     int /* render_view_id */)
+
 // Requests the speech recognition service to stop audio capture on behalf of
 // the given |render_view_id|. Any audio recorded so far will be fed to the
 // speech recognizer. If speech recognition is not happening nor or is
index 3815910..d12ba35 100644 (file)
@@ -617,7 +617,8 @@ IPC_MESSAGE_ROUTED1(ViewMsg_SetInitialFocus,
 
 // Sent to inform the renderer to invoke a context menu.
 // The parameter specifies the location in the render view's coordinates.
-IPC_MESSAGE_ROUTED1(ViewMsg_ShowContextMenu,
+IPC_MESSAGE_ROUTED2(ViewMsg_ShowContextMenu,
+                    ui::MenuSourceType,
                     gfx::Point /* location where menu should be shown */)
 
 IPC_MESSAGE_ROUTED0(ViewMsg_Stop)
index 6d3250b..2ae3c11 100644 (file)
       'common/gpu/gpu_memory_uma_stats.h',
       'common/gpu/gpu_messages.h',
       'common/gpu/gpu_process_launch_causes.h',
+      'common/gpu/gpu_result_codes.h',
       'common/gpu/gpu_surface_lookup.cc',
       'common/gpu/gpu_surface_lookup.h',
       'common/gpu/gpu_watchdog.h',
index 8831a99..b2973f9 100644 (file)
       'renderer/media/rtc_video_encoder_factory.h',
       'renderer/media/rtc_video_renderer.cc',
       'renderer/media/rtc_video_renderer.h',
-      'renderer/media/video_frame_deliverer.cc',
-      'renderer/media/video_frame_deliverer.h',
       'renderer/media/video_source_handler.cc',
       'renderer/media/video_source_handler.h',
       'renderer/media/video_track_adapter.cc',
index 743453b..e9f641d 100644 (file)
                   '<(PRODUCT_DIR)/icudtl.dat',
                 ],
               }],
-              ['component != "shared_library" and target_arch != "arm64" and target_arch != "x64"', {
-                # Only enable the chromium linker on regular builds, since the
-                # component build crashes on Android 4.4. See b/11379966
-                'use_chromium_linker': '1',
-              }],
             ],
           },
           'conditions': [
index 2d5e3db..62cf021 100644 (file)
@@ -54,6 +54,8 @@
 #endif
 
 #if defined(OS_WIN)
+const char kWidevineCdmAdapterFileName[] = "widevinecdmadapter.dll";
+
 extern sandbox::TargetServices* g_target_services;
 
 // Used by EnumSystemLocales for warming up.
@@ -326,13 +328,16 @@ void PpapiThread::OnLoadPlugin(const base::FilePath& path,
   // can be loaded. TODO(cpu): consider changing to the loading style of
   // regular plugins.
   if (g_target_services) {
-    // Let Flash load DXVA before lockdown on Vista+.
-    if (permissions.HasPermission(ppapi::PERMISSION_FLASH)) {
+    // Let Flash and Widevine CDM adapter load DXVA before lockdown on Vista+.
+    if (permissions.HasPermission(ppapi::PERMISSION_FLASH) ||
+        path.BaseName().MaybeAsASCII() == kWidevineCdmAdapterFileName) {
       if (base::win::OSInfo::GetInstance()->version() >=
           base::win::VERSION_VISTA) {
         LoadLibraryA("dxva2.dll");
       }
+    }
 
+    if (permissions.HasPermission(ppapi::PERMISSION_FLASH)) {
       if (base::win::OSInfo::GetInstance()->version() >=
           base::win::VERSION_WIN7) {
         base::CPU cpu;
index b026ec2..6c4a61b 100644 (file)
@@ -29,7 +29,7 @@ import org.chromium.ui.base.WindowAndroid;
 public class ContentViewRenderView extends FrameLayout {
     // The native side of this object.
     private long mNativeContentViewRenderView;
-    private final SurfaceHolder.Callback mSurfaceCallback;
+    private SurfaceHolder.Callback mSurfaceCallback;
 
     private final SurfaceView mSurfaceView;
     protected ContentViewCore mContentViewCore;
@@ -125,25 +125,22 @@ public class ContentViewRenderView extends FrameLayout {
         });
     }
 
-    public ContentViewRenderView(Context context, WindowAndroid rootWindow) {
-        this(context, rootWindow, CompositingSurfaceType.SURFACE_VIEW);
+    public ContentViewRenderView(Context context) {
+        this(context, CompositingSurfaceType.SURFACE_VIEW);
     }
 
     /**
-     * Constructs a new ContentViewRenderView that should be can to a view hierarchy.
-     * Native code should add/remove the layers to be rendered through the ContentViewLayerRenderer.
+     * Constructs a new ContentViewRenderView.
+     * This should be called and the {@link ContentViewRenderView} should be added to the view
+     * hierarchy before the first draw to avoid a black flash that is seen every time a
+     * {@link SurfaceView} is added.
      * @param context The context used to create this.
      * @param surfaceType TextureView is used as compositing target surface,
      *                    otherwise SurfaceView is used.
      */
-    public ContentViewRenderView(Context context, WindowAndroid rootWindow,
-        CompositingSurfaceType surfaceType) {
+    public ContentViewRenderView(Context context, CompositingSurfaceType surfaceType) {
         super(context);
-        assert rootWindow != null;
-        mNativeContentViewRenderView = nativeInit(rootWindow.getNativePointer());
-        assert mNativeContentViewRenderView != 0;
 
-        initContentReadbackHandler();
         mCompositingSurfaceType = surfaceType;
         if (surfaceType == CompositingSurfaceType.TEXTURE_VIEW) {
             initTextureView(context);
@@ -161,6 +158,26 @@ public class ContentViewRenderView extends FrameLayout {
 
         mSurfaceView = createSurfaceView(getContext());
         mSurfaceView.setZOrderMediaOverlay(true);
+
+        setSurfaceViewBackgroundColor(Color.WHITE);
+        addView(mSurfaceView,
+                new FrameLayout.LayoutParams(
+                        FrameLayout.LayoutParams.MATCH_PARENT,
+                        FrameLayout.LayoutParams.MATCH_PARENT));
+        mSurfaceView.setVisibility(GONE);
+    }
+
+    /**
+     * Initialization that requires native libraries should be done here.
+     * Native code should add/remove the layers to be rendered through the ContentViewLayerRenderer.
+     * @param rootWindow The {@link WindowAndroid} this render view should be linked to.
+     */
+    public void onNativeLibraryLoaded(WindowAndroid rootWindow) {
+        assert !mSurfaceView.getHolder().getSurface().isValid() :
+                "Surface created before native library loaded.";
+        assert rootWindow != null;
+        mNativeContentViewRenderView = nativeInit(rootWindow.getNativePointer());
+        assert mNativeContentViewRenderView != 0;
         mSurfaceCallback = new SurfaceHolder.Callback() {
             @Override
             public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
@@ -187,16 +204,12 @@ public class ContentViewRenderView extends FrameLayout {
                 nativeSurfaceDestroyed(mNativeContentViewRenderView);
             }
         };
-        mSurfaceView.getHolder().addCallback(mSurfaceCallback);
-        setSurfaceViewBackgroundColor(Color.WHITE);
 
-        addView(mSurfaceView,
-                new FrameLayout.LayoutParams(
-                        FrameLayout.LayoutParams.MATCH_PARENT,
-                        FrameLayout.LayoutParams.MATCH_PARENT));
-    }
+        if (mCompositingSurfaceType == CompositingSurfaceType.SURFACE_VIEW) {
+            mSurfaceView.getHolder().addCallback(mSurfaceCallback);
+            mSurfaceView.setVisibility(VISIBLE);
+        }
 
-    private void initContentReadbackHandler() {
         mContentReadbackHandler = new ContentReadbackHandler() {
             @Override
             protected boolean readyForReadback() {
index d37e50e..c8a3a51 100644 (file)
@@ -163,11 +163,11 @@ public abstract class WebContentsObserverAndroid {
     }
 
     /**
-     * Called when the brand color was changed.
+     * Called when the theme color was changed.
      * @param color the new color in ARGB format
      */
     @CalledByNative
-    public void didChangeBrandColor(int color) {
+    public void didChangeThemeColor(int color) {
     }
 
     /**
index e759e85..8e7987b 100644 (file)
@@ -4,7 +4,6 @@
 
 package org.chromium.content.browser.input;
 
-import android.app.DatePickerDialog.OnDateSetListener;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.widget.DatePicker;
@@ -23,7 +22,7 @@ class ChromeDatePickerDialog extends android.app.DatePickerDialog {
             int year,
             int monthOfYear,
             int dayOfMonth) {
-        super(context, 0, null, year, monthOfYear, dayOfMonth);
+        super(context, 0, callBack, year, monthOfYear, dayOfMonth);
         mCallBack = callBack;
     }
 
index 44bf207..f2c91e6 100644 (file)
@@ -16,6 +16,7 @@ import android.widget.DatePicker;
 import android.widget.ListView;
 import android.widget.TimePicker;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.content.R;
 import org.chromium.content.browser.input.DateTimePickerDialog.OnDateTimeSetListener;
 import org.chromium.content.browser.input.MultiFieldTimePickerDialog.OnMultiFieldTimeSetListener;
@@ -246,10 +247,11 @@ public class InputDialogContainer {
             mDialog = new WeekPickerDialog(mContext, new MonthOrWeekListener(dialogType),
                     year, week, min, max);
         }
-
-        mDialog.setButton(DialogInterface.BUTTON_POSITIVE,
-                mContext.getText(R.string.date_picker_dialog_set),
-                (DialogInterface.OnClickListener) mDialog);
+        if (ApiCompatibilityUtils.datePickerRequiresAccept()) {
+            mDialog.setButton(DialogInterface.BUTTON_POSITIVE,
+                    mContext.getText(R.string.date_picker_dialog_set),
+                    (DialogInterface.OnClickListener) mDialog);
+        }
 
         mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
                 mContext.getText(android.R.string.cancel),
index 0905a22..f4b9dbb 100644 (file)
@@ -24,7 +24,7 @@
 <translation id="7096034533295549981">Se încarcă video</translation>
 <translation id="1542044944667958430">Căutare pe web</translation>
 <translation id="6849295950938417341">Instrumentul de creare a profilului nu a putut porni</translation>
-<translation id="6527303717912515753">Distribuiți</translation>
+<translation id="6527303717912515753">Trimiteți</translation>
 <translation id="1822429046913737220">AM/PM</translation>
 <translation id="5789643057113097023">.</translation>
 <translation id="1768717197362323622">Milisecundă</translation>
index 2bec50f..62485f1 100644 (file)
@@ -64,9 +64,10 @@ class CONTENT_EXPORT SynchronousCompositor {
       scoped_refptr<gpu::InProcessCommandBuffer::Service> service);
 
   // By default, synchronous compopsitor records the full layer, not only
-  // what is inside and around the view port. Call this on start up to revert
-  // to default behavior when synchronous compositor is not used.
-  static void DisableRecordFullLayer();
+  // what is inside and around the view port. This can be used to switch
+  // between this record-full-layer behavior and normal record-around-viewport
+  // behavior.
+  static void SetRecordFullDocument(bool record_full_document);
 
   // Synchronously initialize compositor for hardware draw. Can only be called
   // while compositor is in software only mode, either after compositor is
index 57579b1..d34e7af 100644 (file)
@@ -22,6 +22,9 @@ class DevToolsManagerDelegate {
   virtual void Inspect(BrowserContext* browser_context,
                        DevToolsAgentHost* agent_host) = 0;
 
+  virtual void DevToolsAgentStateChanged(DevToolsAgentHost* agent_host,
+                                         bool attached) = 0;
+
   // Result ownership is passed to the caller.
   virtual base::DictionaryValue* HandleCommand(
       DevToolsAgentHost* agent_host,
index b7b96c3..607b1af 100644 (file)
@@ -46,11 +46,9 @@ ResourceDispatcherHostLoginDelegate*
   return NULL;
 }
 
-bool ResourceDispatcherHostDelegate::HandleExternalProtocol(
-    const GURL& url,
-    int child_id,
-    int route_id,
-    bool initiated_by_user_gesture) {
+bool ResourceDispatcherHostDelegate::HandleExternalProtocol(const GURL& url,
+                                                            int child_id,
+                                                            int route_id) {
   return true;
 }
 
index 45796ba..cb8b683 100644 (file)
@@ -84,12 +84,9 @@ class CONTENT_EXPORT ResourceDispatcherHostDelegate {
   // Launches the url for the given tab. Returns true if an attempt to handle
   // the url was made, e.g. by launching an app. Note that this does not
   // guarantee that the app successfully handled it.
-  // Some external protocol handlers only run in the context of a user gesture,
-  // so initiated_by_user_gesture should be passed accordingly.
   virtual bool HandleExternalProtocol(const GURL& url,
                                       int child_id,
-                                      int route_id,
-                                      bool initiated_by_user_gesture);
+                                      int route_id);
 
   // Returns true if we should force the given resource to be downloaded.
   // Otherwise, the content layer decides.
index c946b02..72c6ff6 100644 (file)
@@ -329,8 +329,8 @@ class CONTENT_EXPORT WebContentsObserver : public IPC::Listener,
   virtual void AccessibilityEventReceived(
       const std::vector<AXEventNotificationDetails>& details) {}
 
-  // Invoked when brand color is changed to |brand_color|.
-  virtual void DidChangeBrandColor(SkColor brand_color) {}
+  // Invoked when theme color is changed to |theme_color|.
+  virtual void DidChangeThemeColor(SkColor theme_color) {}
 
   // Invoked if an IPC message is coming from a specific RenderFrameHost.
   virtual bool OnMessageReceived(const IPC::Message& message,
index a19b8b1..ac65ded 100644 (file)
@@ -33,6 +33,7 @@ const char kChromeUITracingHost[] = "tracing";
 const char kChromeUIWebRTCInternalsHost[] = "webrtc-internals";
 
 const char kChromeUICrashURL[] = "chrome://crash";
+const char kChromeUIDumpURL[] = "chrome://crashdump";
 const char kChromeUIGpuCleanURL[] = "chrome://gpuclean";
 const char kChromeUIGpuCrashURL[] = "chrome://gpucrash";
 const char kChromeUIGpuHangURL[] = "chrome://gpuhang";
index d1d0ddc..7f125f7 100644 (file)
@@ -42,6 +42,7 @@ CONTENT_EXPORT extern const char kChromeUIWebRTCInternalsHost[];
 
 // Full about URLs (including schemes).
 CONTENT_EXPORT extern const char kChromeUICrashURL[];
+CONTENT_EXPORT extern const char kChromeUIDumpURL[];
 CONTENT_EXPORT extern const char kChromeUIGpuCleanURL[];
 CONTENT_EXPORT extern const char kChromeUIGpuCrashURL[];
 CONTENT_EXPORT extern const char kChromeUIGpuHangURL[];
index fc2c228..2c32f67 100644 (file)
@@ -169,6 +169,15 @@ public class DOMUtils {
         return getNodeField("value", viewCore, nodeId, String.class);
     }
 
+    /**
+     * Returns the string value of a field of the node by its id.
+     */
+    public static String getNodeField(String fieldName, final ContentViewCore viewCore,
+            String nodeId)
+            throws InterruptedException, TimeoutException {
+        return getNodeField(fieldName, viewCore, nodeId, String.class);
+    }
+
     private static <T> T getNodeField(String fieldName, final ContentViewCore viewCore,
             String nodeId, Class<T> valueType)
             throws InterruptedException, TimeoutException {
index 2e72dde..e7765d4 100644 (file)
@@ -177,16 +177,21 @@ void RendererAccessibilityComplete::SendPendingAccessibilityEvents() {
   // Generate an event message from each Blink event.
   std::vector<AccessibilityHostMsg_EventParams> event_msgs;
 
+  // If there's a layout complete message, we need to send location changes.
+  bool had_layout_complete_messages = false;
+
   // Loop over each event and generate an updated event message.
   for (size_t i = 0; i < src_events.size(); ++i) {
-    AccessibilityHostMsg_EventParams& event =
-        src_events[i];
+    AccessibilityHostMsg_EventParams& event = src_events[i];
+    if (event.event_type == ui::AX_EVENT_LAYOUT_COMPLETE)
+      had_layout_complete_messages = true;
+
+    WebAXObject obj = document.accessibilityObjectFromID(event.id);
 
-    WebAXObject obj = document.accessibilityObjectFromID(
-        event.id);
     // Make sure the object still exists.
     if (!obj.updateBackingStoreAndCheckValidity())
       continue;
+
     // Make sure it's a descendant of our root node - exceptions include the
     // scroll area that's the parent of the main document (we ignore it), and
     // possibly nodes attached to a different document.
@@ -207,6 +212,13 @@ void RendererAccessibilityComplete::SendPendingAccessibilityEvents() {
     serializer_.SerializeChanges(obj, &event_msg.update);
     event_msgs.push_back(event_msg);
 
+    // For each node in the update, set the location in our map from
+    // ids to locations.
+    for (size_t i = 0; i < event_msg.update.nodes.size(); ++i) {
+      locations_[event_msg.update.nodes[i].id] =
+          event_msg.update.nodes[i].location;
+    }
+
     VLOG(0) << "Accessibility event: " << ui::ToString(event.event_type)
             << " on node id " << event_msg.id
             << "\n" << event_msg.update.ToString();
@@ -214,7 +226,8 @@ void RendererAccessibilityComplete::SendPendingAccessibilityEvents() {
 
   Send(new AccessibilityHostMsg_Events(routing_id(), event_msgs));
 
-  SendLocationChanges();
+  if (had_layout_complete_messages)
+    SendLocationChanges();
 }
 
 void RendererAccessibilityComplete::SendLocationChanges() {
@@ -246,6 +259,12 @@ void RendererAccessibilityComplete::SendLocationChanges() {
 
     // Save the new location.
     new_locations[id] = new_location;
+
+    // Explore children of this object.
+    std::vector<blink::WebAXObject> children;
+    tree_source_.GetChildren(obj, &children);
+    for (size_t i = 0; i < children.size(); ++i)
+      objs_to_explore.push(children[i]);
   }
   locations_.swap(new_locations);
 
index 26f632d..6cb0bfb 100644 (file)
@@ -51,7 +51,7 @@ BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
       render_view_routing_id_(render_view->GetRoutingID()),
       container_(NULL),
       paint_ack_received_(true),
-      last_device_scale_factor_(1.0f),
+      last_device_scale_factor_(GetDeviceScaleFactor()),
       sad_guest_(NULL),
       guest_crashed_(false),
       is_auto_size_state_dirty_(false),
@@ -532,6 +532,10 @@ bool BrowserPlugin::initialize(WebPluginContainer* container) {
   bindings_.reset(new BrowserPluginBindings(this));
   container_ = container;
   container_->setWantsWheelEvents(true);
+  // This is a way to notify observers of our attributes that we have the
+  // bindings ready. This also means that this plugin is available in render
+  // tree.
+  UpdateDOMAttribute("internalbindings", "true");
   return true;
 }
 
index 6cd8218..1684c27 100644 (file)
@@ -10,6 +10,8 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/strings/string_util.h"
+#include "base/threading/thread_checker.h"
+#include "base/time/time.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/eme_codec.h"
 #include "content/public/renderer/content_renderer_client.h"
@@ -87,6 +89,8 @@ class KeySystems {
  public:
   static KeySystems& GetInstance();
 
+  void UpdateIfNeeded();
+
   bool IsConcreteSupportedKeySystem(const std::string& key_system);
 
   bool IsSupportedKeySystemWithMediaMimeType(
@@ -104,6 +108,8 @@ class KeySystems {
   void AddCodecMask(const std::string& codec, uint32 mask);
 
  private:
+  void UpdateSupportedKeySystems();
+
   void AddConcreteSupportedKeySystems(
       const std::vector<KeySystemInfo>& concrete_key_systems);
 
@@ -161,18 +167,26 @@ class KeySystems {
   CodecMaskMap container_codec_masks_;
   CodecMaskMap codec_masks_;
 
+  bool needs_update_;
+  base::Time last_update_time_;
+
+  // Makes sure all methods are called from the same thread.
+  base::ThreadChecker thread_checker_;
+
   DISALLOW_COPY_AND_ASSIGN(KeySystems);
 };
 
 static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER;
 
 KeySystems& KeySystems::GetInstance() {
-  return g_key_systems.Get();
+  KeySystems& key_systems = g_key_systems.Get();
+  key_systems.UpdateIfNeeded();
+  return key_systems;
 }
 
 // Because we use a LazyInstance, the key systems info must be populated when
 // the instance is lazily initiated.
-KeySystems::KeySystems() {
+KeySystems::KeySystems() : needs_update_(true) {
   // Build container and codec masks for quick look up.
   for (size_t i = 0; i < arraysize(kContainerCodecMasks); ++i) {
     const CodecMask& container_codec_mask = kContainerCodecMasks[i];
@@ -187,18 +201,60 @@ KeySystems::KeySystems() {
     codec_masks_[codec_mask.type] = codec_mask.mask;
   }
 
+  UpdateSupportedKeySystems();
+
+#if defined(WIDEVINE_CDM_AVAILABLE)
+  key_systems_support_uma_.AddKeySystemToReport(kWidevineKeySystem);
+#endif  // defined(WIDEVINE_CDM_AVAILABLE)
+}
+
+void KeySystems::UpdateIfNeeded() {
+#if defined(WIDEVINE_CDM_AVAILABLE)
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (!needs_update_)
+    return;
+
+  // The update could involve a sync IPC to the browser process. Use a minimum
+  // update interval to avoid unnecessary frequent IPC to the browser.
+  static const int kMinUpdateIntervalInSeconds = 1;
+  base::Time now = base::Time::Now();
+  if (now - last_update_time_ <
+      base::TimeDelta::FromSeconds(kMinUpdateIntervalInSeconds)) {
+    return;
+  }
+
+  UpdateSupportedKeySystems();
+#endif
+}
+
+void KeySystems::UpdateSupportedKeySystems() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(needs_update_);
+  concrete_key_system_map_.clear();
+  parent_key_system_map_.clear();
+
+  // Build KeySystemInfo.
   std::vector<KeySystemInfo> key_systems_info;
   GetContentClient()->renderer()->AddKeySystems(&key_systems_info);
   // Clear Key is always supported.
   AddClearKey(&key_systems_info);
+
   AddConcreteSupportedKeySystems(key_systems_info);
-#if defined(WIDEVINE_CDM_AVAILABLE)
-  key_systems_support_uma_.AddKeySystemToReport(kWidevineKeySystem);
-#endif  // defined(WIDEVINE_CDM_AVAILABLE)
+
+#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
+  if (IsConcreteSupportedKeySystem(kWidevineKeySystem))
+    needs_update_ = false;
+#endif
+
+  last_update_time_ = base::Time::Now();
 }
 
 void KeySystems::AddConcreteSupportedKeySystems(
     const std::vector<KeySystemInfo>& concrete_key_systems) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(concrete_key_system_map_.empty());
+  DCHECK(parent_key_system_map_.empty());
+
   for (size_t i = 0; i < concrete_key_systems.size(); ++i) {
     const KeySystemInfo& key_system_info = concrete_key_systems[i];
     AddConcreteSupportedKeySystem(key_system_info.key_system,
@@ -219,6 +275,7 @@ void KeySystems::AddConcreteSupportedKeySystem(
 #endif
     SupportedCodecs supported_codecs,
     const std::string& parent_key_system) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!IsConcreteSupportedKeySystem(concrete_key_system))
       << "Key system '" << concrete_key_system << "' already registered";
   DCHECK(parent_key_system_map_.find(concrete_key_system) ==
@@ -247,6 +304,7 @@ void KeySystems::AddConcreteSupportedKeySystem(
 }
 
 bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   return concrete_key_system_map_.find(key_system) !=
       concrete_key_system_map_.end();
 }
@@ -254,6 +312,7 @@ bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) {
 bool KeySystems::IsSupportedContainer(
     const std::string& container,
     SupportedCodecs key_system_supported_codecs) const {
+  DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!container.empty());
 
   // When checking container support for EME, "audio/foo" should be treated the
@@ -280,6 +339,7 @@ bool KeySystems::IsSupportedContainerAndCodecs(
     const std::string& container,
     const std::vector<std::string>& codecs,
     SupportedCodecs key_system_supported_codecs) const {
+  DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!container.empty());
   DCHECK(!codecs.empty());
   DCHECK(IsSupportedContainer(container, key_system_supported_codecs));
@@ -312,6 +372,8 @@ bool KeySystems::IsSupportedKeySystemWithMediaMimeType(
     const std::string& mime_type,
     const std::vector<std::string>& codecs,
     const std::string& key_system) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
   // If |key_system| is a parent key_system, use its concrete child.
   // Otherwise, use |key_system|.
   std::string concrete_key_system;
@@ -356,6 +418,8 @@ bool KeySystems::IsSupportedKeySystemWithMediaMimeType(
 }
 
 bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
   KeySystemPropertiesMap::iterator key_system_iter =
       concrete_key_system_map_.find(concrete_key_system);
   if (key_system_iter == concrete_key_system_map_.end()) {
@@ -368,6 +432,8 @@ bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) {
 
 #if defined(ENABLE_PEPPER_CDMS)
 std::string KeySystems::GetPepperType(const std::string& concrete_key_system) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
   KeySystemPropertiesMap::iterator key_system_iter =
       concrete_key_system_map_.find(concrete_key_system);
   if (key_system_iter == concrete_key_system_map_.end()) {
@@ -382,13 +448,17 @@ std::string KeySystems::GetPepperType(const std::string& concrete_key_system) {
 #endif
 
 void KeySystems::AddContainerMask(const std::string& container, uint32 mask) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(container_codec_masks_.find(container) ==
          container_codec_masks_.end());
+
   container_codec_masks_[container] = static_cast<EmeCodec>(mask);
 }
 
 void KeySystems::AddCodecMask(const std::string& codec, uint32 mask) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(codec_masks_.find(codec) == codec_masks_.end());
+
   codec_masks_[codec] = static_cast<EmeCodec>(mask);
 }
 
index 81e1626..d47fae5 100644 (file)
@@ -662,4 +662,33 @@ TEST_F(MediaStreamVideoSourceTest, IsConstraintSupported) {
       "something unsupported"));
 }
 
+// Test that the constraint negotiation can handle 0.0 fps as frame rate.
+TEST_F(MediaStreamVideoSourceTest, Use0FpsSupportedFormat) {
+  media::VideoCaptureFormats formats;
+  formats.push_back(media::VideoCaptureFormat(
+      gfx::Size(640, 480), 0.0f, media::PIXEL_FORMAT_I420));
+  formats.push_back(media::VideoCaptureFormat(
+      gfx::Size(320, 240), 0.0f, media::PIXEL_FORMAT_I420));
+  mock_source()->SetSupportedFormats(formats);
+
+  blink::WebMediaConstraints constraints;
+  constraints.initialize();
+  blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
+  mock_source()->CompleteGetSupportedFormats();
+  mock_source()->StartMockedSource();
+  EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
+
+  MockMediaStreamVideoSink sink;
+  MediaStreamVideoSink::AddToVideoTrack(
+      &sink, sink.GetDeliverFrameCB(), track);
+  EXPECT_EQ(0, sink.number_of_frames());
+  DeliverVideoFrameAndWaitForRenderer(320, 240, &sink);
+  EXPECT_EQ(1, sink.number_of_frames());
+  // Expect the delivered frame to be passed unchanged since its smaller than
+  // max requested.
+  EXPECT_EQ(320, sink.frame_size().width());
+  EXPECT_EQ(240, sink.frame_size().height());
+  MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track);
+}
+
 }  // namespace content
index 0ad7159..da26aac 100644 (file)
 
 #include "content/renderer/media/media_stream_video_track.h"
 
+#include <utility>
+
 #include "base/bind.h"
-#include "content/renderer/media/video_frame_deliverer.h"
 #include "media/base/bind_to_current_loop.h"
 
 namespace content {
 
-// Helper class used for delivering video frames to MediaStreamSinks on the
-// IO-thread.
-// Frames are delivered to an instance of this class from a
-// MediaStreamVideoSource on the IO-thread to the method DeliverFrameOnIO.
-// Frames are only delivered to the sinks if the track is enabled.
-class MediaStreamVideoTrack::FrameDeliverer : public VideoFrameDeliverer {
+namespace {
+void ResetCallback(scoped_ptr<VideoCaptureDeliverFrameCB> callback) {
+  // |callback| will be deleted when this exits.
+}
+}  // namespace
+
+// MediaStreamVideoTrack::FrameDeliverer is a helper class used for registering
+// VideoCaptureDeliverFrameCB on the main render thread to receive video frames
+// on the IO-thread.
+// Frames are only delivered to the sinks if the track is enabled. If the track
+// is disabled, a black frame is instead forwarded to the sinks at the same
+// frame rate.
+class MediaStreamVideoTrack::FrameDeliverer
+    : public base::RefCountedThreadSafe<FrameDeliverer> {
  public:
   FrameDeliverer(
-      const scoped_refptr<base::MessageLoopProxy>& io_message_loop_proxy,
-      bool enabled)
-      : VideoFrameDeliverer(io_message_loop_proxy),
-        enabled_(enabled) {
-  }
+      const scoped_refptr<base::MessageLoopProxy>& io_message_loop,
+      bool enabled);
 
-  // Add |sink| to receive state changes on the main render thread.
-  // Video frames will be delivered to |callback| on the IO thread.
-  void AddSink(MediaStreamVideoSink* sink,
-               const VideoCaptureDeliverFrameCB& callback) {
-    DCHECK(thread_checker().CalledOnValidThread());
-    DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
-    sinks_.push_back(sink);
-    AddCallback(sink, callback);
-  }
+  void SetEnabled(bool enabled);
 
-  void RemoveSink(MediaStreamVideoSink* sink) {
-    DCHECK(thread_checker().CalledOnValidThread());
-    std::vector<MediaStreamVideoSink*>::iterator it =
-        std::find(sinks_.begin(), sinks_.end(), sink);
-    DCHECK(it != sinks_.end());
-    sinks_.erase(it);
-    RemoveCallback(sink);
-  }
+  // Add |callback| to receive video frames on the IO-thread.
+  // Must be called on the main render thread.
+  void AddCallback(void* id, const VideoCaptureDeliverFrameCB& callback);
 
-  void SetEnabled(bool enabled) {
-    DCHECK(thread_checker().CalledOnValidThread());
-    io_message_loop()->PostTask(
-        FROM_HERE,
-        base::Bind(&MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO,
-                   this, enabled));
-  }
+  // Removes |callback| associated with |id| from receiving video frames if |id|
+  // has been added. It is ok to call RemoveCallback even if the |id| has not
+  // been added. Note that the added callback will be reset on the main thread.
+  // Must be called on the main render thread.
+  void RemoveCallback(void* id);
 
-  virtual void DeliverFrameOnIO(
-      const scoped_refptr<media::VideoFrame>& frame,
-      const media::VideoCaptureFormat& format,
-      const base::TimeTicks& estimated_capture_time) OVERRIDE {
-    DCHECK(io_message_loop()->BelongsToCurrentThread());
-    if (!enabled_)
-      return;
-    VideoFrameDeliverer::DeliverFrameOnIO(frame, format,
-                                          estimated_capture_time);
-  }
+  // Triggers all registered callbacks with |frame|, |format| and
+  // |estimated_capture_time| as parameters. Must be called on the IO-thread.
+  void DeliverFrameOnIO(const scoped_refptr<media::VideoFrame>& frame,
+                        const media::VideoCaptureFormat& format,
+                        const base::TimeTicks& estimated_capture_time);
 
-  const std::vector<MediaStreamVideoSink*>& sinks() const { return sinks_; }
-
- protected:
-  virtual ~FrameDeliverer() {
-    DCHECK(sinks_.empty());
-  }
+ private:
+  friend class base::RefCountedThreadSafe<FrameDeliverer>;
+  virtual ~FrameDeliverer();
+  void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback);
+  void RemoveCallbackOnIO(
+      void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop);
 
-  void SetEnabledOnIO(bool enabled) {
-    DCHECK(io_message_loop()->BelongsToCurrentThread());
-    enabled_ = enabled;
-  }
+  void SetEnabledOnIO(bool enabled);
+  // Returns |black_frame_| where the size and time stamp is set to the same as
+  // as in |reference_frame|.
+  const scoped_refptr<media::VideoFrame>& GetBlackFrame(
+      const scoped_refptr<media::VideoFrame>& reference_frame);
 
- private:
-  // The below members are used on the main render thread.
-  std::vector<MediaStreamVideoSink*> sinks_;
+  // Used to DCHECK that AddCallback and RemoveCallback are called on the main
+  // render thread.
+  base::ThreadChecker thread_checker_;
+  scoped_refptr<base::MessageLoopProxy> io_message_loop_;
 
-  // The below parameters are used on the IO-thread.
   bool enabled_;
+  scoped_refptr<media::VideoFrame> black_frame_;
+
+  typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair;
+  std::vector<VideoIdCallbackPair> callbacks_;
 
   DISALLOW_COPY_AND_ASSIGN(FrameDeliverer);
 };
 
+MediaStreamVideoTrack::FrameDeliverer::FrameDeliverer(
+    const scoped_refptr<base::MessageLoopProxy>& io_message_loop, bool enabled)
+    : io_message_loop_(io_message_loop),
+      enabled_(enabled) {
+  DCHECK(io_message_loop_);
+}
+
+MediaStreamVideoTrack::FrameDeliverer::~FrameDeliverer() {
+  DCHECK(callbacks_.empty());
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::AddCallback(
+    void* id,
+    const VideoCaptureDeliverFrameCB& callback) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  io_message_loop_->PostTask(
+      FROM_HERE,
+      base::Bind(&FrameDeliverer::AddCallbackOnIO,
+                 this, id, callback));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::AddCallbackOnIO(
+    void* id,
+    const VideoCaptureDeliverFrameCB& callback) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  callbacks_.push_back(std::make_pair(id, callback));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::RemoveCallback(void* id) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  io_message_loop_->PostTask(
+      FROM_HERE,
+      base::Bind(&FrameDeliverer::RemoveCallbackOnIO,
+                 this, id, base::MessageLoopProxy::current()));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::RemoveCallbackOnIO(
+    void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
+  for (; it != callbacks_.end(); ++it) {
+    if (it->first == id) {
+      // Callback is copied to heap and then deleted on the target thread.
+      scoped_ptr<VideoCaptureDeliverFrameCB> callback;
+      callback.reset(new VideoCaptureDeliverFrameCB(it->second));
+      callbacks_.erase(it);
+      message_loop->PostTask(
+          FROM_HERE, base::Bind(&ResetCallback, base::Passed(&callback)));
+      return;
+    }
+  }
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::SetEnabled(bool enabled) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  io_message_loop_->PostTask(
+      FROM_HERE,
+      base::Bind(&FrameDeliverer::SetEnabledOnIO,
+                 this, enabled));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO(bool enabled) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  enabled_ = enabled;
+  if (enabled_)
+    black_frame_ = NULL;
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO(
+    const scoped_refptr<media::VideoFrame>& frame,
+    const media::VideoCaptureFormat& format,
+    const base::TimeTicks& estimated_capture_time) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  const scoped_refptr<media::VideoFrame>& video_frame =
+      enabled_ ? frame : GetBlackFrame(frame);
+
+  for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
+       it != callbacks_.end(); ++it) {
+    it->second.Run(video_frame, format, estimated_capture_time);
+  }
+}
+
+const scoped_refptr<media::VideoFrame>&
+MediaStreamVideoTrack::FrameDeliverer::GetBlackFrame(
+    const scoped_refptr<media::VideoFrame>& reference_frame) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  if (!black_frame_ ||
+      black_frame_->natural_size() != reference_frame->natural_size())
+    black_frame_ =
+        media::VideoFrame::CreateBlackFrame(reference_frame->natural_size());
+
+  black_frame_->set_timestamp(reference_frame->timestamp());
+  return black_frame_;
+}
+
 // static
 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack(
     MediaStreamVideoSource* source,
@@ -126,6 +212,7 @@ MediaStreamVideoTrack::MediaStreamVideoTrack(
 
 MediaStreamVideoTrack::~MediaStreamVideoTrack() {
   DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(sinks_.empty());
   Stop();
   DVLOG(3) << "~MediaStreamVideoTrack()";
 }
@@ -133,12 +220,18 @@ MediaStreamVideoTrack::~MediaStreamVideoTrack() {
 void MediaStreamVideoTrack::AddSink(
     MediaStreamVideoSink* sink, const VideoCaptureDeliverFrameCB& callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  frame_deliverer_->AddSink(sink, callback);
+  DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
+  sinks_.push_back(sink);
+  frame_deliverer_->AddCallback(sink, callback);
 }
 
 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  frame_deliverer_->RemoveSink(sink);
+  std::vector<MediaStreamVideoSink*>::iterator it =
+      std::find(sinks_.begin(), sinks_.end(), sink);
+  DCHECK(it != sinks_.end());
+  sinks_.erase(it);
+  frame_deliverer_->RemoveCallback(sink);
 }
 
 void MediaStreamVideoTrack::SetEnabled(bool enabled) {
@@ -146,9 +239,8 @@ void MediaStreamVideoTrack::SetEnabled(bool enabled) {
   MediaStreamTrack::SetEnabled(enabled);
 
   frame_deliverer_->SetEnabled(enabled);
-  const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks();
-  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin();
-       it != sinks.end(); ++it) {
+  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks_.begin();
+       it != sinks_.end(); ++it) {
     (*it)->OnEnabledChanged(enabled);
   }
 }
@@ -165,9 +257,8 @@ void MediaStreamVideoTrack::Stop() {
 void MediaStreamVideoTrack::OnReadyStateChanged(
     blink::WebMediaStreamSource::ReadyState state) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks();
-  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin();
-       it != sinks.end(); ++it) {
+  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks_.begin();
+       it != sinks_.end(); ++it) {
     (*it)->OnReadyStateChanged(state);
   }
 }
index 040686c..6fecbe1 100644 (file)
@@ -41,12 +41,12 @@ class CONTENT_EXPORT MediaStreamVideoTrack : public MediaStreamTrack {
   static MediaStreamVideoTrack* GetVideoTrack(
       const blink::WebMediaStreamTrack& track);
 
-  // Constructor for local video tracks.
-   MediaStreamVideoTrack(
-       MediaStreamVideoSource* source,
-       const blink::WebMediaConstraints& constraints,
-       const MediaStreamVideoSource::ConstraintsCallback& callback,
-       bool enabled);
+  // Constructor for video tracks.
+  MediaStreamVideoTrack(
+      MediaStreamVideoSource* source,
+      const blink::WebMediaConstraints& constraints,
+      const MediaStreamVideoSource::ConstraintsCallback& callback,
+      bool enabled);
   virtual ~MediaStreamVideoTrack();
 
   virtual void SetEnabled(bool enabled) OVERRIDE;
@@ -80,6 +80,8 @@ class CONTENT_EXPORT MediaStreamVideoTrack : public MediaStreamTrack {
                const VideoCaptureDeliverFrameCB& callback);
   void RemoveSink(MediaStreamVideoSink* sink);
 
+  std::vector<MediaStreamVideoSink*> sinks_;
+
   // |FrameDeliverer| is an internal helper object used for delivering video
   // frames on the IO-thread using callbacks to all registered tracks.
   class FrameDeliverer;
index 9b281a6..2571ee4 100644 (file)
@@ -18,6 +18,9 @@
 
 namespace content {
 
+const uint8 kBlackValue = 0x00;
+const uint8 kColorValue = 0xAB;
+
 ACTION_P(RunClosure, closure) {
   closure.Run();
 }
@@ -43,9 +46,10 @@ class MediaStreamVideoTrackTest : public ::testing::Test {
     EXPECT_CALL(*sink, OnVideoFrame()).WillOnce(
         RunClosure(quit_closure));
     scoped_refptr<media::VideoFrame> frame =
-        media::VideoFrame::CreateBlackFrame(
+        media::VideoFrame::CreateColorFrame(
             gfx::Size(MediaStreamVideoSource::kDefaultWidth,
-                      MediaStreamVideoSource::kDefaultHeight));
+                      MediaStreamVideoSource::kDefaultHeight),
+            kColorValue, kColorValue, kColorValue, base::TimeDelta());
     mock_source()->DeliverVideoFrame(frame);
     run_loop.Run();
   }
@@ -163,24 +167,20 @@ TEST_F(MediaStreamVideoTrackTest, SetEnabled) {
 
   DeliverVideoFrameAndWaitForRenderer(&sink);
   EXPECT_EQ(1, sink.number_of_frames());
+  EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
 
   video_track->SetEnabled(false);
   EXPECT_FALSE(sink.enabled());
 
-  scoped_refptr<media::VideoFrame> frame =
-      media::VideoFrame::CreateBlackFrame(
-          gfx::Size(MediaStreamVideoSource::kDefaultWidth,
-                    MediaStreamVideoSource::kDefaultHeight));
-  mock_source()->DeliverVideoFrame(frame);
-  // Wait for the IO thread to complete delivering frames.
-  io_message_loop()->RunUntilIdle();
-  EXPECT_EQ(1, sink.number_of_frames());
+  DeliverVideoFrameAndWaitForRenderer(&sink);
+  EXPECT_EQ(2, sink.number_of_frames());
+  EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
 
   video_track->SetEnabled(true);
   EXPECT_TRUE(sink.enabled());
-  mock_source()->DeliverVideoFrame(frame);
   DeliverVideoFrameAndWaitForRenderer(&sink);
-  EXPECT_EQ(2, sink.number_of_frames());
+  EXPECT_EQ(3, sink.number_of_frames());
+  EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
   MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track);
 }
 
index 347ca62..7a054ab 100644 (file)
@@ -31,6 +31,7 @@ void MockMediaStreamVideoSink::DeliverVideoFrame(
     const scoped_refptr<media::VideoFrame>& frame,
     const media::VideoCaptureFormat& format,
     const base::TimeTicks& estimated_capture_time) {
+  last_frame_ = frame;
   ++number_of_frames_;
   format_ = frame->format();
   frame_size_ = frame->natural_size();
index 682a617..2f73761 100644 (file)
@@ -32,6 +32,7 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
   int number_of_frames() const { return number_of_frames_; }
   media::VideoFrame::Format format() const { return format_; }
   gfx::Size frame_size() const { return frame_size_; }
+  scoped_refptr<media::VideoFrame> last_frame() const { return last_frame_; };
 
   bool enabled() const { return enabled_; }
   blink::WebMediaStreamSource::ReadyState state() const { return state_; }
@@ -47,6 +48,7 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
   media::VideoFrame::Format format_;
   blink::WebMediaStreamSource::ReadyState state_;
   gfx::Size frame_size_;
+  scoped_refptr<media::VideoFrame> last_frame_;
   base::WeakPtrFactory<MockMediaStreamVideoSink> weak_factory_;
 };
 
index c45a24a..323f0a3 100644 (file)
@@ -81,12 +81,6 @@ void RTCVideoRenderer::OnReadyStateChanged(
     RenderSignalingFrame();
 }
 
-void RTCVideoRenderer::OnEnabledChanged(bool enabled) {
-  DCHECK(message_loop_proxy_->BelongsToCurrentThread());
-  if (!enabled)
-    RenderSignalingFrame();
-}
-
 void RTCVideoRenderer::OnVideoFrame(
     const scoped_refptr<media::VideoFrame>& frame,
     const media::VideoCaptureFormat& format,
@@ -108,7 +102,7 @@ void RTCVideoRenderer::OnVideoFrame(
 
 void RTCVideoRenderer::RenderSignalingFrame() {
   // This is necessary to make sure audio can play if the video tag src is
-  // a MediaStream video track that has been rejected, ended or disabled.
+  // a MediaStream video track that has been rejected or ended.
   // It also ensure that the renderer don't hold a reference to a real video
   // frame if no more frames are provided. This is since there might be a
   // finite number of available buffers. E.g, video that
index e205b6b..6add0df 100644 (file)
@@ -61,7 +61,6 @@ class CONTENT_EXPORT RTCVideoRenderer
   // VideoTrackSink implementation. Called on the main thread.
   virtual void OnReadyStateChanged(
       blink::WebMediaStreamSource::ReadyState state) OVERRIDE;
-  virtual void OnEnabledChanged(bool enabled) OVERRIDE;
 
   void RenderSignalingFrame();
 
diff --git a/src/content/renderer/media/video_frame_deliverer.cc b/src/content/renderer/media/video_frame_deliverer.cc
deleted file mode 100644 (file)
index 05c7749..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/media/video_frame_deliverer.h"
-
-#include "base/bind.h"
-#include "base/location.h"
-
-namespace content {
-namespace {
-void ResetCallback(scoped_ptr<VideoCaptureDeliverFrameCB> callback) {
-  // |callback| will be deleted when this exits.
-}
-}  // namespace
-
-VideoFrameDeliverer::VideoFrameDeliverer(
-    const scoped_refptr<base::MessageLoopProxy>& io_message_loop)
-    : io_message_loop_(io_message_loop) {
-  DCHECK(io_message_loop_);
-}
-
-VideoFrameDeliverer::~VideoFrameDeliverer() {
-  DCHECK(callbacks_.empty());
-}
-
-void VideoFrameDeliverer::AddCallback(
-    void* id,
-    const VideoCaptureDeliverFrameCB& callback) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  io_message_loop_->PostTask(
-      FROM_HERE,
-      base::Bind(&VideoFrameDeliverer::AddCallbackOnIO,
-                 this, id, callback));
-}
-
-void VideoFrameDeliverer::AddCallbackOnIO(
-    void* id,
-    const VideoCaptureDeliverFrameCB& callback) {
-  DCHECK(io_message_loop_->BelongsToCurrentThread());
-  callbacks_.push_back(std::make_pair(id, callback));
-}
-
-void VideoFrameDeliverer::RemoveCallback(void* id) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  io_message_loop_->PostTask(
-      FROM_HERE,
-      base::Bind(&VideoFrameDeliverer::RemoveCallbackOnIO,
-                 this, id, base::MessageLoopProxy::current()));
-}
-
-void VideoFrameDeliverer::RemoveCallbackOnIO(
-    void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop) {
-  DCHECK(io_message_loop_->BelongsToCurrentThread());
-  std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
-  for (; it != callbacks_.end(); ++it) {
-    if (it->first == id) {
-      // Callback is copied to heap and then deleted on the target thread.
-      // The following code ensures that the callback is not referenced on
-      // the stack.
-      scoped_ptr<VideoCaptureDeliverFrameCB> callback;
-      {
-        callback.reset(new VideoCaptureDeliverFrameCB(it->second));
-        callbacks_.erase(it);
-      }
-      message_loop->PostTask(
-          FROM_HERE, base::Bind(&ResetCallback, base::Passed(&callback)));
-      return;
-    }
-  }
-}
-
-void VideoFrameDeliverer::DeliverFrameOnIO(
-    const scoped_refptr<media::VideoFrame>& frame,
-    const media::VideoCaptureFormat& format,
-    const base::TimeTicks& estimated_capture_time) {
-  DCHECK(io_message_loop_->BelongsToCurrentThread());
-  for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
-       it != callbacks_.end(); ++it) {
-    it->second.Run(frame, format, estimated_capture_time);
-  }
-}
-
-}  // namespace content
diff --git a/src/content/renderer/media/video_frame_deliverer.h b/src/content/renderer/media/video_frame_deliverer.h
deleted file mode 100644 (file)
index a1f4b9d..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_MEDIA_VIDEO_FRAME_DELIVERER_H_
-#define CONTENT_RENDERER_MEDIA_VIDEO_FRAME_DELIVERER_H_
-
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop_proxy.h"
-#include "base/threading/thread_checker.h"
-#include "content/common/media/video_capture.h"
-#include "content/public/renderer/media_stream_video_sink.h"
-#include "media/base/video_frame.h"
-
-namespace content {
-
-// VideoFrameDeliverer is a helper class used for registering
-// VideoCaptureDeliverFrameCB on the main render thread to receive video frames
-// on the IO-thread.
-// Its used by MediaStreamVideoTrack.
-class VideoFrameDeliverer
-    : public base::RefCountedThreadSafe<VideoFrameDeliverer> {
- public:
-  explicit VideoFrameDeliverer(
-      const scoped_refptr<base::MessageLoopProxy>& io_message_loop);
-
-  // Add |callback| to receive video frames on the IO-thread.
-  // Must be called on the main render thread.
-  void AddCallback(void* id, const VideoCaptureDeliverFrameCB& callback);
-
-  // Removes |callback| associated with |id| from receiving video frames if |id|
-  // has been added. It is ok to call RemoveCallback even if the |id| has not
-  // been added. Note that the added callback will be reset on the main thread.
-  // Must be called on the main render thread.
-  void RemoveCallback(void* id);
-
-  // Triggers all registered callbacks with |frame|, |format| and
-  // |estimated_capture_time| as parameters. Must be called on the IO-thread.
-  virtual void DeliverFrameOnIO(
-      const scoped_refptr<media::VideoFrame>& frame,
-      const media::VideoCaptureFormat& format,
-      const base::TimeTicks& estimated_capture_time);
-
-  const scoped_refptr<base::MessageLoopProxy>& io_message_loop() const {
-    return io_message_loop_;
-  }
-
- protected:
-  void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback);
-
-  // Callback will be removed and then reset on the designated message loop.
-  // It is ok to call RemoveCallback even if |id| has not been added.
-  void RemoveCallbackOnIO(
-      void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop);
-
- protected:
-  virtual ~VideoFrameDeliverer();
-  const base::ThreadChecker& thread_checker() const {
-    return thread_checker_;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<VideoFrameDeliverer>;
-
-  // Used to DCHECK that AddCallback and RemoveCallback are called on the main
-  // render thread.
-  base::ThreadChecker thread_checker_;
-  scoped_refptr<base::MessageLoopProxy> io_message_loop_;
-
-  typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair;
-  std::vector<VideoIdCallbackPair> callbacks_;
-
-  DISALLOW_COPY_AND_ASSIGN(VideoFrameDeliverer);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_MEDIA_VIDEO_FRAME_DELIVERER_H_
index 2033195..abcab8f 100644 (file)
@@ -265,8 +265,6 @@ int32_t PepperVideoDecoderHost::OnHostMsgRecyclePicture(
   if (!initialized_)
     return PP_ERROR_FAILED;
   DCHECK(decoder_);
-  if (reset_reply_context_.is_valid())
-    return PP_ERROR_FAILED;
 
   decoder_->ReusePictureBuffer(texture_id);
   return PP_OK;
index afd7f57..50a6398 100644 (file)
@@ -556,12 +556,6 @@ void VideoDecoderShim::OnResetComplete() {
   // Dismiss any old textures now.
   while (!textures_to_dismiss_.empty())
     DismissTexture(*textures_to_dismiss_.begin());
-  // Make all textures available.
-  for (TextureIdMap::const_iterator it = texture_id_map_.begin();
-       it != texture_id_map_.end();
-       ++it) {
-    available_textures_.insert(it->first);
-  }
 
   state_ = DECODING;
   host_->NotifyResetDone();
index 3960102..6f3fa70 100644 (file)
@@ -287,6 +287,12 @@ static void MaybeHandleDebugURL(const GURL& url) {
     return;
   if (url == GURL(kChromeUICrashURL)) {
     CrashIntentionally();
+  } else if (url == GURL(kChromeUIDumpURL)) {
+    // This URL will only correctly create a crash dump file if content is
+    // hosted in a process that has correctly called
+    // base::debug::SetDumpWithoutCrashingFunction.  Refer to the documentation
+    // of base::debug::DumpWithoutCrashing for more details.
+    base::debug::DumpWithoutCrashing();
   } else if (url == GURL(kChromeUIKillURL)) {
     base::KillProcess(base::GetCurrentProcessHandle(), 1, false);
   } else if (url == GURL(kChromeUIHangURL)) {
@@ -2161,12 +2167,12 @@ void RenderFrameImpl::didUpdateCurrentHistoryItem(blink::WebLocalFrame* frame) {
   render_view_->didUpdateCurrentHistoryItem(frame);
 }
 
-void RenderFrameImpl::didChangeBrandColor() {
+void RenderFrameImpl::didChangeThemeColor() {
   if (frame_->parent())
     return;
 
-  Send(new FrameHostMsg_DidChangeBrandColor(
-      routing_id_, frame_->document().brandColor()));
+  Send(new FrameHostMsg_DidChangeThemeColor(
+      routing_id_, frame_->document().themeColor()));
 }
 
 blink::WebNotificationPresenter* RenderFrameImpl::notificationPresenter() {
@@ -2263,11 +2269,11 @@ bool RenderFrameImpl::runModalBeforeUnloadDialog(
 void RenderFrameImpl::showContextMenu(const blink::WebContextMenuData& data) {
   ContextMenuParams params = ContextMenuParamsBuilder::Build(data);
   params.source_type = GetRenderWidget()->context_menu_source_type();
-  if (params.source_type == ui::MENU_SOURCE_TOUCH_EDIT_MENU) {
-    params.x = GetRenderWidget()->touch_editing_context_menu_location().x();
-    params.y = GetRenderWidget()->touch_editing_context_menu_location().y();
-  }
   GetRenderWidget()->OnShowHostContextMenu(&params);
+  if (GetRenderWidget()->has_host_context_menu_location()) {
+    params.x = GetRenderWidget()->host_context_menu_location().x();
+    params.y = GetRenderWidget()->host_context_menu_location().y();
+  }
 
   // Plugins, e.g. PDF, don't currently update the render view when their
   // selected text changes, but the context menu params do contain the updated
index 71be416..09d220c 100644 (file)
@@ -307,7 +307,7 @@ class CONTENT_EXPORT RenderFrameImpl
                                      const blink::WebHistoryItem& item,
                                      blink::WebHistoryCommitType commit_type);
   virtual void didUpdateCurrentHistoryItem(blink::WebLocalFrame* frame);
-  virtual void didChangeBrandColor();
+  virtual void didChangeThemeColor();
   virtual blink::WebNotificationPresenter* notificationPresenter();
   virtual void didChangeSelection(bool is_empty_selection);
   virtual blink::WebColorChooser* createColorChooser(
index 6e124b3..3c51f84 100644 (file)
@@ -172,6 +172,12 @@ const int kIdleCPUUsageThresholdInPercents = 3;
 const int kMinRasterThreads = 1;
 const int kMaxRasterThreads = 64;
 
+// Maximum allocation size allowed for image scaling filters that
+// require pre-scaling. Skia will fallback to a filter that doesn't
+// require pre-scaling if the default filter would require an
+// allocation that exceeds this limit.
+const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024;
+
 // Keep the global RenderThreadImpl in a TLS slot so it is impossible to access
 // incorrectly from the wrong thread.
 base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl> >
@@ -307,7 +313,7 @@ void RenderThreadImpl::HistogramCustomizer::SetCommonHost(
   if (host != common_host_) {
     common_host_ = host;
     common_host_histogram_suffix_ = HostToCustomHistogramSuffix(host);
-    v8::V8::SetCreateHistogramFunction(CreateHistogram);
+    blink::mainThreadIsolate()->SetCreateHistogramFunction(CreateHistogram);
   }
 }
 
@@ -333,10 +339,6 @@ void RenderThreadImpl::Init() {
       base::PlatformThread::CurrentId(),
       kTraceEventRendererMainThreadSortIndex);
 
-  v8::V8::SetCounterFunction(base::StatsTable::FindLocation);
-  v8::V8::SetCreateHistogramFunction(CreateHistogram);
-  v8::V8::SetAddHistogramSampleFunction(AddHistogramSample);
-
 #if defined(OS_MACOSX) || defined(OS_ANDROID)
   // On Mac and Android, the select popups are rendered by the browser.
   blink::WebView::setUseExternalPopupMenus(true);
@@ -522,8 +524,13 @@ void RenderThreadImpl::Shutdown() {
 
   // Wait for all databases to be closed.
   if (webkit_platform_support_) {
+    // WaitForAllDatabasesToClose might run a nested message loop. To avoid
+    // processing timer events while we're already in the process of shutting
+    // down blink, put a ScopePageLoadDeferrer on the stack.
+    WebView::willEnterModalLoop();
     webkit_platform_support_->web_database_observer_impl()->
         WaitForAllDatabasesToClose();
+    WebView::didExitModalLoop();
   }
 
   // Shutdown in reverse of the initialization order.
@@ -737,6 +744,12 @@ void RenderThreadImpl::EnsureWebKitInitialized() {
   webkit_platform_support_.reset(new RendererWebKitPlatformSupportImpl);
   blink::initialize(webkit_platform_support_.get());
 
+  v8::Isolate* isolate = blink::mainThreadIsolate();
+
+  isolate->SetCounterFunction(base::StatsTable::FindLocation);
+  isolate->SetCreateHistogramFunction(CreateHistogram);
+  isolate->SetAddHistogramSampleFunction(AddHistogramSample);
+
   const CommandLine& command_line = *CommandLine::ForCurrentProcess();
 
   bool enable = command_line.HasSwitch(switches::kEnableThreadedCompositing);
@@ -820,6 +833,9 @@ void RenderThreadImpl::EnsureWebKitInitialized() {
   if (!command_line.HasSwitch(switches::kEnableDeferredImageDecoding) &&
       !is_impl_side_painting_enabled_)
     SkGraphics::SetImageCacheByteLimit(0u);
+
+  SkGraphics::SetImageCacheSingleAllocationByteLimit(
+      kImageCacheSingleAllocationByteLimit);
 }
 
 void RenderThreadImpl::RegisterSchemes() {
@@ -899,6 +915,9 @@ void RenderThreadImpl::IdleHandler() {
   if (!v8::V8::IdleNotification()) {
     continue_timer = true;
   }
+  if (!base::DiscardableMemory::ReduceMemoryUsage()) {
+    continue_timer = true;
+  }
 
   // Schedule next invocation.
   // Dampen the delay using the algorithm (if delay is in seconds):
@@ -940,10 +959,17 @@ void RenderThreadImpl::IdleHandlerInForegroundTab() {
     int idle_hint = static_cast<int>(new_delay_ms / 10);
     if (cpu_usage < kIdleCPUUsageThresholdInPercents) {
       base::allocator::ReleaseFreeMemory();
-      if (v8::V8::IdleNotification(idle_hint)) {
-        // V8 finished collecting garbage.
+
+      bool finished_idle_work = true;
+      if (!v8::V8::IdleNotification(idle_hint))
+        finished_idle_work = false;
+      if (!base::DiscardableMemory::ReduceMemoryUsage())
+        finished_idle_work = false;
+
+      // V8 finished collecting garbage and discardable memory system has no
+      // more idle work left.
+      if (finished_idle_work)
         new_delay_ms = kLongIdleHandlerDelayMs;
-      }
     }
   }
   ScheduleIdleHandler(new_delay_ms);
@@ -1117,7 +1143,7 @@ scoped_ptr<base::SharedMemory> RenderThreadImpl::AllocateSharedMemory(
       HostAllocateSharedMemoryBuffer(size));
 }
 
-bool RenderThreadImpl::CreateViewCommandBuffer(
+CreateCommandBufferResult RenderThreadImpl::CreateViewCommandBuffer(
       int32 surface_id,
       const GPUCreateCommandBufferConfig& init_params,
       int32 route_id) {
@@ -1126,17 +1152,17 @@ bool RenderThreadImpl::CreateViewCommandBuffer(
                "surface_id",
                surface_id);
 
-  bool succeeded = false;
+  CreateCommandBufferResult result = CREATE_COMMAND_BUFFER_FAILED;
   IPC::Message* message = new GpuHostMsg_CreateViewCommandBuffer(
       surface_id,
       init_params,
       route_id,
-      &succeeded);
+      &result);
 
   // Allow calling this from the compositor thread.
   thread_safe_sender()->Send(message);
 
-  return succeeded;
+  return result;
 }
 
 void RenderThreadImpl::CreateImage(
index d8d50c8..f725af5 100644 (file)
@@ -19,6 +19,7 @@
 #include "content/child/child_thread.h"
 #include "content/common/content_export.h"
 #include "content/common/gpu/client/gpu_channel_host.h"
+#include "content/common/gpu/gpu_result_codes.h"
 #include "content/public/renderer/render_thread.h"
 #include "net/base/network_change_notifier.h"
 #include "third_party/WebKit/public/platform/WebConnectionType.h"
@@ -410,7 +411,7 @@ class CONTENT_EXPORT RenderThreadImpl : public RenderThread,
   virtual scoped_refptr<base::MessageLoopProxy> GetIOLoopProxy() OVERRIDE;
   virtual scoped_ptr<base::SharedMemory> AllocateSharedMemory(
       size_t size) OVERRIDE;
-  virtual bool CreateViewCommandBuffer(
+  virtual CreateCommandBufferResult CreateViewCommandBuffer(
       int32 surface_id,
       const GPUCreateCommandBufferConfig& init_params,
       int32 route_id) OVERRIDE;
index a25b69c..2fc0a9c 100644 (file)
@@ -45,6 +45,7 @@
 #include "third_party/WebKit/public/platform/WebString.h"
 #include "third_party/WebKit/public/platform/WebURLResponse.h"
 #include "third_party/WebKit/public/web/WebDataSource.h"
+#include "third_party/WebKit/public/web/WebDeviceEmulationParams.h"
 #include "third_party/WebKit/public/web/WebHistoryItem.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
@@ -2337,4 +2338,34 @@ TEST_F(RenderViewImplTest, OnSetAccessibilityMode) {
             view()->renderer_accessibility()->GetType());
 }
 
+TEST_F(RenderViewImplTest, ScreenMetricsEmulation) {
+  LoadHTML("<body style='min-height:1000px;'></body>");
+
+  blink::WebDeviceEmulationParams params;
+  base::string16 get_width = base::ASCIIToUTF16("Number(window.innerWidth)");
+  base::string16 get_height = base::ASCIIToUTF16("Number(window.innerHeight)");
+  int width, height;
+
+  params.viewSize.width = 327;
+  params.viewSize.height = 415;
+  view()->EnableScreenMetricsEmulation(params);
+  EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_width, &width));
+  EXPECT_EQ(params.viewSize.width, width);
+  EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_height, &height));
+  EXPECT_EQ(params.viewSize.height, height);
+
+  params.viewSize.width = 1005;
+  params.viewSize.height = 1102;
+  view()->EnableScreenMetricsEmulation(params);
+  EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_width, &width));
+  EXPECT_EQ(params.viewSize.width, width);
+  EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_height, &height));
+  EXPECT_EQ(params.viewSize.height, height);
+
+  view()->DisableScreenMetricsEmulation();
+
+  view()->EnableScreenMetricsEmulation(params);
+  // Don't disable here to test that emulation is being shutdown properly.
+}
+
 }  // namespace content
index 0eed3aa..3a68a86 100644 (file)
@@ -3245,6 +3245,8 @@ void RenderViewImpl::OnWasHidden() {
 #if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
   RenderThreadImpl::current()->video_capture_impl_manager()->
       SuspendDevices(true);
+  if (speech_recognition_dispatcher_)
+    speech_recognition_dispatcher_->AbortAllRecognitions();
 #endif
 
   if (webview())
@@ -3562,7 +3564,7 @@ void RenderViewImpl::SetScreenMetricsEmulationParameters(
     float device_scale_factor,
     const gfx::Point& root_layer_offset,
     float root_layer_scale) {
-  if (webview()) {
+  if (webview() && compositor()) {
     webview()->setCompositorDeviceScaleFactorOverride(device_scale_factor);
     webview()->setRootLayerTransform(
         blink::WebSize(root_layer_offset.x(), root_layer_offset.y()),
@@ -3777,11 +3779,14 @@ void RenderViewImpl::DidHideExternalPopupMenu() {
 }
 #endif
 
-void RenderViewImpl::OnShowContextMenu(const gfx::Point& location) {
-  context_menu_source_type_ = ui::MENU_SOURCE_TOUCH_EDIT_MENU;
-  touch_editing_context_menu_location_ = location;
+void RenderViewImpl::OnShowContextMenu(
+    ui::MenuSourceType source_type, const gfx::Point& location) {
+  context_menu_source_type_ = source_type;
+  has_host_context_menu_location_ = true;
+  host_context_menu_location_ = location;
   if (webview())
     webview()->showContextMenu();
+  has_host_context_menu_location_ = false;
 }
 
 void RenderViewImpl::OnEnableViewSourceMode() {
index 324c4c7..4827abb 100644 (file)
@@ -685,7 +685,8 @@ class CONTENT_EXPORT RenderViewImpl
   void OnCancelDownload(int32 download_id);
   void OnClearFocusedElement();
   void OnClosePage();
-  void OnShowContextMenu(const gfx::Point& location);
+  void OnShowContextMenu(ui::MenuSourceType source_type,
+                         const gfx::Point& location);
   void OnCopyImageAt(int x, int y);
   void OnSaveImageAt(int x, int y);
   void OnDeterminePageLanguage();
index e5ea9a6..8dfd4aa 100644 (file)
@@ -397,7 +397,8 @@ RenderWidget::RenderWidget(blink::WebPopupType popup_type,
 #endif
       popup_origin_scale_for_emulation_(0.f),
       resizing_mode_selector_(new ResizingModeSelector()),
-      context_menu_source_type_(ui::MENU_SOURCE_MOUSE) {
+      context_menu_source_type_(ui::MENU_SOURCE_MOUSE),
+      has_host_context_menu_location_(false) {
   if (!swapped_out)
     RenderProcess::current()->AddRefProcess();
   DCHECK(RenderThread::Get());
@@ -1320,6 +1321,7 @@ void RenderWidget::QueueSyntheticGesture(
 }
 
 void RenderWidget::Close() {
+  screen_metrics_emulator_.reset();
   if (webwidget_) {
     webwidget_->willCloseLayerTreeView();
     compositor_.reset();
index cfba42a..7dd43c9 100644 (file)
@@ -105,9 +105,13 @@ class CONTENT_EXPORT RenderWidget
   bool closing() const { return closing_; }
   bool is_swapped_out() { return is_swapped_out_; }
   ui::MenuSourceType context_menu_source_type() {
-    return context_menu_source_type_; }
-  gfx::Point touch_editing_context_menu_location() {
-    return touch_editing_context_menu_location_;
+    return context_menu_source_type_;
+  }
+  bool has_host_context_menu_location() {
+    return has_host_context_menu_location_;
+  }
+  gfx::Point host_context_menu_location() {
+    return host_context_menu_location_;
   }
 
   // Functions to track out-of-process frames for special notifications.
@@ -704,7 +708,8 @@ class CONTENT_EXPORT RenderWidget
   ObserverList<RenderFrameImpl> render_frames_;
 
   ui::MenuSourceType context_menu_source_type_;
-  gfx::Point touch_editing_context_menu_location_;
+  bool has_host_context_menu_location_;
+  gfx::Point host_context_menu_location_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidget);
 };
index 3d76c20..178abf4 100644 (file)
@@ -35,6 +35,11 @@ SpeechRecognitionDispatcher::SpeechRecognitionDispatcher(
 SpeechRecognitionDispatcher::~SpeechRecognitionDispatcher() {
 }
 
+void SpeechRecognitionDispatcher::AbortAllRecognitions() {
+  Send(new SpeechRecognitionHostMsg_AbortAllRequests(
+      routing_id()));
+}
+
 bool SpeechRecognitionDispatcher::OnMessageReceived(
     const IPC::Message& message) {
   bool handled = true;
index 297f174..bae0e5d 100644 (file)
@@ -28,6 +28,9 @@ class SpeechRecognitionDispatcher : public RenderViewObserver,
   explicit SpeechRecognitionDispatcher(RenderViewImpl* render_view);
   virtual ~SpeechRecognitionDispatcher();
 
+  // Aborts all speech recognitions.
+  void AbortAllRecognitions();
+
  private:
   // RenderViewObserver implementation.
   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
index 2f83d28..aab6caa 100644 (file)
@@ -79,7 +79,7 @@ public class ShellManager extends FrameLayout {
     public void setWindow(WindowAndroid window) {
         assert window != null;
         mWindow = window;
-        mContentViewRenderView = new ContentViewRenderView(getContext(), window) {
+        mContentViewRenderView = new ContentViewRenderView(getContext()) {
             @Override
             protected void onReadyToRender() {
                 if (sStartup) {
@@ -88,6 +88,7 @@ public class ShellManager extends FrameLayout {
                 }
             }
         };
+        mContentViewRenderView.onNativeLibraryLoaded(window);
     }
 
     /**
index ba0331c..deb3deb 100644 (file)
@@ -56,6 +56,10 @@ AccessibilityNotificationWaiter::~AccessibilityNotificationWaiter() {
 
 void AccessibilityNotificationWaiter::WaitForNotification() {
   loop_runner_->Run();
+
+  // Each loop runner can only be called once. Create a new one in case
+  // the caller wants to call this again to wait for the next notification.
+  loop_runner_ = new MessageLoopRunner();
 }
 
 const ui::AXTree& AccessibilityNotificationWaiter::GetAXTree() const {
@@ -64,7 +68,7 @@ const ui::AXTree& AccessibilityNotificationWaiter::GetAXTree() const {
 
 void AccessibilityNotificationWaiter::OnAccessibilityEvent(
     ui::AXEvent event_type, int event_target_id) {
-  if (!IsAboutBlank() && (event_to_wait_for_ == ui::AX_EVENT_NONE ||
+   if (!IsAboutBlank() && (event_to_wait_for_ == ui::AX_EVENT_NONE ||
                           event_to_wait_for_ == event_type)) {
     event_target_id_ = event_target_id;
     loop_runner_->Quit();
index 5111e3c..3c134ea 100644 (file)
@@ -24,7 +24,6 @@ class Shell;
 class AccessibilityNotificationWaiter {
  public:
   explicit AccessibilityNotificationWaiter(Shell* shell);
-
   AccessibilityNotificationWaiter(
       Shell* shell,
       AccessibilityMode accessibility_mode,
diff --git a/src/content/test/data/accessibility/transition-expected-android.txt b/src/content/test/data/accessibility/transition-expected-android.txt
new file mode 100644 (file)
index 0000000..37ef40e
--- /dev/null
@@ -0,0 +1,5 @@
+#<skip - Android doesn't output the location and size of objects.>
+android.webkit.WebView focusable scrollable
+    android.view.View
+        android.widget.Button clickable focusable focused name='GrowButton'
+        android.view.View clickable name='Done'
diff --git a/src/content/test/data/accessibility/transition-expected-mac.txt b/src/content/test/data/accessibility/transition-expected-mac.txt
new file mode 100644 (file)
index 0000000..f2043b1
--- /dev/null
@@ -0,0 +1,4 @@
+AXWebArea
+    AXGroup
+        AXButton AXTitle='GrowButton' size=(600, 300)
+        AXStaticText AXValue='Done'
diff --git a/src/content/test/data/accessibility/transition-expected-win.txt b/src/content/test/data/accessibility/transition-expected-win.txt
new file mode 100644 (file)
index 0000000..743cb39
--- /dev/null
@@ -0,0 +1,4 @@
+ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
+    IA2_ROLE_SECTION READONLY
+        ROLE_SYSTEM_PUSHBUTTON name='GrowButton' FOCUSABLE size=(600, 300)
+        ROLE_SYSTEM_STATICTEXT name='Done'
diff --git a/src/content/test/data/accessibility/transition.html b/src/content/test/data/accessibility/transition.html
new file mode 100644 (file)
index 0000000..df42c6a
--- /dev/null
@@ -0,0 +1,58 @@
+<!doctype html>
+<!--
+This tests that location changes are sent when an element animates
+using CSS transitions. The test animates the size of a button when
+focused, then adds the magic text "Done" to the document when
+the transition finishes. The WAIT-FOR directive below instructs
+the test framework to keep waiting for accessibility events and
+not diff the dump against the expectations until the text "Done"
+appears in the dump.
+
+@MAC-ALLOW:size=(400, 200)
+@MAC-ALLOW:size=(600, 300)
+@WIN-ALLOW:size=(400, 200)
+@WIN-ALLOW:size=(600, 300)
+@WAIT-FOR:Done
+-->
+<html>
+<head>
+<style>
+body {
+  width: 800px;
+  height: 600px;
+  margin: 0;
+  padding: 0;
+  border: 0;
+  overflow: hidden;
+}
+#growbutton {
+  width: 400px;
+  height: 200px;
+  margin: 0;
+  padding: 0;
+}
+#growbutton:focus {
+  width: 600px;
+  height: 300px;
+  transition: all 0.1s ease-in-out;
+}
+</style>
+</head>
+<body>
+
+<button id="growbutton">GrowButton</button>
+
+<script>
+  var growButton = document.getElementById('growbutton');
+  var done = false;
+  growButton.addEventListener('webkitTransitionEnd', function() {
+    if (!done) {
+      document.body.appendChild(document.createTextNode('Done'));
+      done = true;
+    }
+  }, false);
+  growButton.focus();  
+</script>
+
+</body>
+</html>
diff --git a/src/content/test/data/gpu/webgl_with_select_element.html b/src/content/test/data/gpu/webgl_with_select_element.html
new file mode 100644 (file)
index 0000000..43f7d69
--- /dev/null
@@ -0,0 +1,77 @@
+<html>
+<head>
+<script type="text/javascript">
+var gl;
+// For some reason, when running this test in automated fashion, it
+// triggers the bug reliably if the first frame with back-to-back
+// events happens a certain number of frames into the test execution.
+var numFrames = 202;
+var intensity = 255;
+var contextWasLost = false;
+
+function contextLostHandler(e) {
+  contextWasLost = true;
+}
+
+function draw() {
+  if (--intensity == 0) {
+    intensity = 255;
+  }
+
+  gl.clearColor(intensity / 255.0, 0, 0, 1);
+  gl.clear(gl.COLOR_BUFFER_BIT);
+
+  if (numFrames % 2 == 0) {
+    // Toggle the state of the drop-down every other frame. Every now
+    // and then, dispatch two events back to back. This really seems to
+    // trigger the bug.
+    var maxIteration = 1;
+    if (numFrames % 6 == 0) {
+      maxIteration = 2;
+    }
+    for (var ii = 0; ii < maxIteration; ++ii) {
+      var e = document.createEvent('MouseEvent');
+      e.initMouseEvent('mousedown', true, true, window);
+      var s = document.getElementById('dropdown');
+      s.dispatchEvent(e);
+    }
+  }
+
+  if (--numFrames > 0) {
+    requestAnimationFrame(draw);
+  } else {
+    if (contextWasLost) {
+      window.domAutomationController.send("FAILED");
+    } else {
+      window.domAutomationController.send("SUCCESS");
+    }
+  }
+}
+
+function onLoad() {
+  window.domAutomationController.send("LOADED");
+
+  var canvas = document.getElementById("canvas1");
+  if (!canvas)
+    return;
+  canvas.addEventListener("webglcontextlost", contextLostHandler, false);
+
+  gl = canvas.getContext("webgl");
+  if (!gl)
+    return;
+
+  requestAnimationFrame(draw);
+}
+</script>
+</head>
+<body onload="onLoad()">
+<select id="dropdown">
+  <option value="option1">option1</option>
+  <option value="option2">option2</option>
+  <option value="option3">option3</option>
+  <option value="option4">option4</option>
+</select>
+<canvas id="canvas1" width="32px" height="32px">
+</canvas>
+</body>
+</html>
index 12fc696..e4f2500 100644 (file)
@@ -62,7 +62,7 @@ function use_replace_state() {
 }
 
 function use_push_state() {
-  window.history.pushState({}, 'foo2');
+  window.history.pushState({}, 'foo2', 'newpath');
 }
 
 onload = function() {
index 092747a..25b307a 100644 (file)
@@ -123,6 +123,21 @@ class _ContextLostValidator(page_test.PageTest):
         'window.domAutomationController._succeeded'):
         raise page_test.Failure(
           'Test failed (context not restored properly?)')
+    else:
+      completed = False
+      try:
+        print "Waiting for page to finish."
+        util.WaitFor(lambda: tab.EvaluateJavaScript(
+            'window.domAutomationController._finished'), wait_timeout)
+        completed = True
+      except util.TimeoutException:
+        pass
+
+      if not completed:
+        raise page_test.Failure('Test didn\'t complete')
+      if not tab.EvaluateJavaScript(
+        'window.domAutomationController._succeeded'):
+        raise page_test.Failure('Test failed')
 
 class WebGLContextLostFromGPUProcessExitPage(page.Page):
   def __init__(self, page_set, base_dir):
@@ -174,6 +189,22 @@ class WebGLContextLostFromQuantityPage(page.Page):
     action_runner.WaitForJavaScriptCondition(
         'window.domAutomationController._loaded')
 
+class WebGLContextLostFromSelectElementPage(page.Page):
+  def __init__(self, page_set, base_dir):
+    super(WebGLContextLostFromSelectElementPage, self).__init__(
+      url='file://webgl_with_select_element.html',
+      page_set=page_set,
+      base_dir=base_dir,
+      name='ContextLost.WebGLContextLostFromSelectElement')
+    self.script_to_evaluate_on_commit = harness_script
+    self.kill_gpu_process = False
+    self.force_garbage_collection = False
+
+  def RunNavigateSteps(self, action_runner):
+    action_runner.NavigateToPage(self)
+    action_runner.WaitForJavaScriptCondition(
+        'window.domAutomationController._loaded')
+
 class ContextLost(test_module.Test):
   enabled = True
   test = _ContextLostValidator
@@ -188,4 +219,5 @@ class ContextLost(test_module.Test):
     ps.AddPage(WebGLContextLostFromGPUProcessExitPage(ps, ps.base_dir))
     ps.AddPage(WebGLContextLostFromLoseContextExtensionPage(ps, ps.base_dir))
     ps.AddPage(WebGLContextLostFromQuantityPage(ps, ps.base_dir))
+    ps.AddPage(WebGLContextLostFromSelectElementPage(ps, ps.base_dir))
     return ps
index 0e9aaf0..a55ebf6 100644 (file)
@@ -42,9 +42,16 @@ namespace content {
 TestWebKitPlatformSupport::TestWebKitPlatformSupport() {
   url_loader_factory_.reset(new WebURLLoaderMockFactory());
   mock_clipboard_.reset(new MockWebClipboardImpl());
-  v8::V8::SetCounterFunction(base::StatsTable::FindLocation);
+
+  // Create an anonymous stats table since we don't need to share between
+  // processes.
+  stats_table_.reset(
+      new base::StatsTable(base::StatsTable::TableIdentifier(), 20, 200));
+  base::StatsTable::set_current(stats_table_.get());
 
   blink::initialize(this);
+  blink::mainThreadIsolate()->SetCounterFunction(
+      base::StatsTable::FindLocation);
   blink::setLayoutTestMode(true);
   blink::WebSecurityPolicy::registerURLSchemeAsLocal(
       blink::WebString::fromUTF8("test-shell-resource"));
@@ -97,6 +104,8 @@ TestWebKitPlatformSupport::~TestWebKitPlatformSupport() {
   url_loader_factory_.reset();
   mock_clipboard_.reset();
   blink::shutdown();
+  base::StatsTable::set_current(NULL);
+  stats_table_.reset();
 }
 
 blink::WebMimeRegistry* TestWebKitPlatformSupport::mimeRegistry() {
index 469d6bf..3c983dc 100644 (file)
 #include "content/test/weburl_loader_mock_factory.h"
 #include "third_party/WebKit/public/platform/WebUnitTestSupport.h"
 
+namespace base {
+class StatsTable;
+}
+
 namespace blink {
 class WebLayerTreeView;
 }
@@ -91,6 +95,7 @@ class TestWebKitPlatformSupport
   base::ScopedTempDir file_system_root_;
   scoped_ptr<WebURLLoaderMockFactory> url_loader_factory_;
   WebCompositorSupportImpl compositor_support_;
+  scoped_ptr<base::StatsTable> stats_table_;
 
 #if defined(OS_WIN) || defined(OS_MACOSX)
   blink::WebThemeEngine* active_theme_engine_;
index fb3b50d..aadfa3b 100644 (file)
@@ -378,6 +378,8 @@ void ExtensionFunctionDispatcher::DispatchWithCallbackInternal(
   if (violation_error.empty()) {
     scoped_ptr<base::ListValue> args(params.arguments.DeepCopy());
 
+    // See crbug.com/39178.
+    ExtensionsBrowserClient::Get()->PermitExternalProtocolHandler();
     NotifyApiFunctionCalled(
         extension->id(), params.name, args.Pass(), browser_context_);
     UMA_HISTOGRAM_SPARSE_SLOWLY("Extensions.FunctionCalls",
index 293b2af..137f58e 100644 (file)
@@ -149,6 +149,10 @@ class ExtensionsBrowserClient {
   // version for later comparison.
   virtual bool DidVersionUpdate(content::BrowserContext* context) = 0;
 
+  // Permits an external protocol handler to be launched. See
+  // ExternalProtocolHandler::PermitLaunchUrl() in Chrome.
+  virtual void PermitExternalProtocolHandler() = 0;
+
   // Creates a new AppSorting instance.
   virtual scoped_ptr<AppSorting> CreateAppSorting() = 0;
 
index dcd467f..dd46396 100644 (file)
@@ -135,6 +135,9 @@ bool TestExtensionsBrowserClient::DidVersionUpdate(BrowserContext* context) {
   return false;
 }
 
+void TestExtensionsBrowserClient::PermitExternalProtocolHandler() {
+}
+
 scoped_ptr<AppSorting> TestExtensionsBrowserClient::CreateAppSorting() {
   return scoped_ptr<AppSorting>();
 }
index b793259..ae1ee33 100644 (file)
@@ -66,6 +66,7 @@ class TestExtensionsBrowserClient : public ExtensionsBrowserClient {
   virtual scoped_ptr<ExtensionHostDelegate> CreateExtensionHostDelegate()
       OVERRIDE;
   virtual bool DidVersionUpdate(content::BrowserContext* context) OVERRIDE;
+  virtual void PermitExternalProtocolHandler() OVERRIDE;
   virtual scoped_ptr<AppSorting> CreateAppSorting() OVERRIDE;
   virtual bool IsRunningInForcedAppMode() OVERRIDE;
   virtual ApiActivityMonitor* GetApiActivityMonitor(
index 72717f7..b6c87d4 100644 (file)
@@ -17,6 +17,7 @@
 #include "extensions/common/url_pattern_set.h"
 #include "extensions/common/user_script.h"
 #include "url/gurl.h"
+#include "url/url_constants.h"
 
 namespace extensions {
 
@@ -24,12 +25,6 @@ namespace {
 
 PermissionsData::PolicyDelegate* g_policy_delegate = NULL;
 
-// Returns true if this extension id is from a trusted provider.
-bool ShouldSkipPermissionWarnings(const std::string& extension_id) {
-  // See http://b/4946060 for more details.
-  return extension_id == std::string("nckgahadagoaajjgafhacjanaoiihapd");
-}
-
 }  // namespace
 
 PermissionsData::PermissionsData(const Extension* extension)
@@ -70,6 +65,54 @@ bool PermissionsData::CanExecuteScriptEverywhere(const Extension* extension) {
          whitelist.end();
 }
 
+bool PermissionsData::ShouldSkipPermissionWarnings(
+    const std::string& extension_id) {
+  // See http://b/4946060 for more details.
+  return extension_id == std::string("nckgahadagoaajjgafhacjanaoiihapd");
+}
+
+// static
+bool PermissionsData::IsRestrictedUrl(const GURL& document_url,
+                                      const GURL& top_frame_url,
+                                      const Extension* extension,
+                                      std::string* error) {
+  if (CanExecuteScriptEverywhere(extension))
+    return false;
+
+  // Check if the scheme is valid for extensions. If not, return.
+  if (!URLPattern::IsValidSchemeForExtensions(document_url.scheme()) &&
+      document_url.spec() != url::kAboutBlankURL) {
+    if (error) {
+      *error = ErrorUtils::FormatErrorMessage(
+                   manifest_errors::kCannotAccessPage,
+                   document_url.spec());
+    }
+    return true;
+  }
+
+  if (!ExtensionsClient::Get()->IsScriptableURL(document_url, error))
+    return true;
+
+  bool allow_on_chrome_urls = base::CommandLine::ForCurrentProcess()->HasSwitch(
+                                  switches::kExtensionsOnChromeURLs);
+  if (document_url.SchemeIs(content::kChromeUIScheme) &&
+      !allow_on_chrome_urls) {
+    if (error)
+      *error = manifest_errors::kCannotAccessChromeUrl;
+    return true;
+  }
+
+  if (top_frame_url.SchemeIs(kExtensionScheme) &&
+      top_frame_url.host() != extension->id() &&
+      !allow_on_chrome_urls) {
+    if (error)
+      *error = manifest_errors::kCannotAccessExtensionUrl;
+    return true;
+  }
+
+  return false;
+}
+
 void PermissionsData::SetActivePermissions(
     const PermissionSet* permissions) const {
   base::AutoLock auto_lock(runtime_lock_);
@@ -283,30 +326,8 @@ bool PermissionsData::CanRunOnPage(const Extension* extension,
     return false;
   }
 
-  bool can_execute_everywhere = CanExecuteScriptEverywhere(extension);
-  if (!can_execute_everywhere &&
-      !ExtensionsClient::Get()->IsScriptableURL(document_url, error)) {
+  if (IsRestrictedUrl(document_url, top_frame_url, extension, error))
     return false;
-  }
-
-  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kExtensionsOnChromeURLs)) {
-    if (document_url.SchemeIs(content::kChromeUIScheme) &&
-        !can_execute_everywhere) {
-      if (error)
-        *error = manifest_errors::kCannotAccessChromeUrl;
-      return false;
-    }
-  }
-
-  if (top_frame_url.SchemeIs(kExtensionScheme) &&
-      top_frame_url.GetOrigin() !=
-          Extension::GetBaseURLFromExtensionId(extension->id()).GetOrigin() &&
-      !can_execute_everywhere) {
-    if (error)
-      *error = manifest_errors::kCannotAccessExtensionUrl;
-    return false;
-  }
 
   if (HasTabSpecificPermissionToExecuteScript(tab_id, top_frame_url))
     return true;
index a23fb2b..bcdc7c3 100644 (file)
@@ -68,6 +68,18 @@ class PermissionsData {
   // whitelist of extensions that can script all pages.
   static bool CanExecuteScriptEverywhere(const Extension* extension);
 
+  // Returns true if we should skip the permisisons warning for the extension
+  // with the given |extension_id|.
+  static bool ShouldSkipPermissionWarnings(const std::string& extension_id);
+
+  // Returns true if the given |url| is restricted for the given |extension|,
+  // as is commonly the case for chrome:// urls.
+  // NOTE: You probably want to use CanAccessPage().
+  static bool IsRestrictedUrl(const GURL& document_url,
+                              const GURL& top_frame_url,
+                              const Extension* extension,
+                              std::string* error);
+
   // Sets the runtime permissions of the given |extension| to |permissions|.
   void SetActivePermissions(const PermissionSet* active) const;
 
index dc3aa86..3df1d44 100644 (file)
@@ -87,6 +87,71 @@ bool RequiresActionForScriptExecution(const std::string& extension_id,
       GURL::EmptyGURL());
 }
 
+// Checks that urls are properly restricted for the given extension.
+void CheckRestrictedUrls(const Extension* extension,
+                         bool block_chrome_urls) {
+  // We log the name so we know _which_ extension failed here.
+  const std::string& name = extension->name();
+  const GURL chrome_settings_url("chrome://settings/");
+  const GURL chrome_extension_url("chrome-extension://foo/bar.html");
+  const GURL google_url("https://www.google.com/");
+  const GURL self_url("chrome-extension://" + extension->id() + "/foo.html");
+  const GURL invalid_url("chrome-debugger://foo/bar.html");
+
+  std::string error;
+  EXPECT_EQ(block_chrome_urls,
+            PermissionsData::IsRestrictedUrl(
+                chrome_settings_url,
+                chrome_settings_url,
+                extension,
+                &error)) << name;
+  if (block_chrome_urls)
+    EXPECT_EQ(manifest_errors::kCannotAccessChromeUrl, error) << name;
+  else
+    EXPECT_TRUE(error.empty()) << name;
+
+  error.clear();
+  EXPECT_EQ(block_chrome_urls,
+            PermissionsData::IsRestrictedUrl(
+                chrome_extension_url,
+                chrome_extension_url,
+                extension,
+                &error)) << name;
+  if (block_chrome_urls)
+    EXPECT_EQ(manifest_errors::kCannotAccessExtensionUrl, error) << name;
+  else
+    EXPECT_TRUE(error.empty()) << name;
+
+  // Google should never be a restricted url.
+  error.clear();
+  EXPECT_FALSE(PermissionsData::IsRestrictedUrl(
+      google_url, google_url, extension, &error)) << name;
+  EXPECT_TRUE(error.empty()) << name;
+
+  // We should always be able to access our own extension pages.
+  error.clear();
+  EXPECT_FALSE(PermissionsData::IsRestrictedUrl(
+      self_url, self_url, extension, &error)) << name;
+  EXPECT_TRUE(error.empty()) << name;
+
+  // We should only allow other schemes for extensions when it's a whitelisted
+  // extension.
+  error.clear();
+  bool allow_on_other_schemes =
+      PermissionsData::CanExecuteScriptEverywhere(extension);
+  EXPECT_EQ(!allow_on_other_schemes,
+            PermissionsData::IsRestrictedUrl(
+                invalid_url, invalid_url, extension, &error)) << name;
+  if (!allow_on_other_schemes) {
+    EXPECT_EQ(ErrorUtils::FormatErrorMessage(
+                  manifest_errors::kCannotAccessPage,
+                  invalid_url.spec()),
+              error) << name;
+  } else {
+    EXPECT_TRUE(error.empty());
+  }
+}
+
 }  // namespace
 
 TEST(ExtensionPermissionsTest, EffectiveHostPermissions) {
@@ -242,6 +307,28 @@ TEST(ExtensionPermissionsTest, RequiresActionForScriptExecution) {
       extension, 0, GURL("https://www.google.com/")));
 }
 
+TEST(ExtensionPermissionsTest, IsRestrictedUrl) {
+  scoped_refptr<const Extension> extension =
+      GetExtensionWithHostPermission("normal_extension",
+                                     kAllHostsPermission,
+                                     Manifest::INTERNAL);
+  // Chrome urls should be blocked for normal extensions.
+  CheckRestrictedUrls(extension, true);
+
+  scoped_refptr<const Extension> component =
+      GetExtensionWithHostPermission("component",
+                                     kAllHostsPermission,
+                                     Manifest::COMPONENT);
+  // Chrome urls should be accessible by component extensions.
+  CheckRestrictedUrls(component, false);
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      switches::kExtensionsOnChromeURLs);
+  // Enabling the switch should allow all extensions to access chrome urls.
+  CheckRestrictedUrls(extension, false);
+
+}
+
 TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyAPIPermissions) {
   scoped_refptr<Extension> extension;
   extension = LoadManifest("permissions", "many-apis.json");
@@ -553,8 +640,8 @@ TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) {
   EXPECT_TRUE(AllowedScript(extension.get(), https_url, http_url_with_path));
   EXPECT_TRUE(AllowedScript(extension.get(), http_url, within_extension_url));
   EXPECT_TRUE(AllowedScript(extension.get(), https_url, within_extension_url));
-  EXPECT_TRUE(BlockedScript(extension.get(), http_url, extension_url));
-  EXPECT_TRUE(BlockedScript(extension.get(), https_url, extension_url));
+  EXPECT_TRUE(AllowedScript(extension.get(), http_url, extension_url));
+  EXPECT_TRUE(AllowedScript(extension.get(), https_url, extension_url));
 
   const PermissionsData* permissions_data = extension->permissions_data();
   EXPECT_FALSE(permissions_data->HasHostPermission(settings_url));
index c7a3711..1167918 100644 (file)
@@ -50,6 +50,7 @@ const char kParseErrorEmptyHost[] = "Host can not be empty.";
 const char kParseErrorInvalidHostWildcard[] = "Invalid host wildcard.";
 const char kParseErrorEmptyPath[] = "Empty path.";
 const char kParseErrorInvalidPort[] = "Invalid port.";
+const char kParseErrorInvalidHost[] = "Invalid host.";
 
 // Message explaining each URLPattern::ParseResult.
 const char* const kParseResultMessages[] = {
@@ -61,6 +62,7 @@ const char* const kParseResultMessages[] = {
   kParseErrorInvalidHostWildcard,
   kParseErrorEmptyPath,
   kParseErrorInvalidPort,
+  kParseErrorInvalidHost,
 };
 
 COMPILE_ASSERT(URLPattern::NUM_PARSE_RESULTS == arraysize(kParseResultMessages),
@@ -109,6 +111,15 @@ std::string StripTrailingWildcard(const std::string& path) {
 
 }  // namespace
 
+// static
+bool URLPattern::IsValidSchemeForExtensions(const std::string& scheme) {
+  for (size_t i = 0; i < arraysize(kValidSchemes); ++i) {
+    if (scheme == kValidSchemes[i])
+      return true;
+  }
+  return false;
+}
+
 URLPattern::URLPattern()
     : valid_schemes_(SCHEME_NONE),
       match_all_urls_(false),
@@ -244,6 +255,10 @@ URLPattern::ParseResult URLPattern::Parse(const std::string& pattern) {
   if (host_.find('*') != std::string::npos)
     return PARSE_ERROR_INVALID_HOST_WILDCARD;
 
+  // Null characters are not allowed in hosts.
+  if (host_.find('\0') != std::string::npos)
+    return PARSE_ERROR_INVALID_HOST;
+
   return PARSE_SUCCESS;
 }
 
index 70109db..125a674 100644 (file)
@@ -72,12 +72,16 @@ class URLPattern {
     PARSE_ERROR_INVALID_HOST_WILDCARD,
     PARSE_ERROR_EMPTY_PATH,
     PARSE_ERROR_INVALID_PORT,
+    PARSE_ERROR_INVALID_HOST,
     NUM_PARSE_RESULTS
   };
 
   // The <all_urls> string pattern.
   static const char kAllUrlsPattern[];
 
+  // Returns true if the given |scheme| is considered valid for extensions.
+  static bool IsValidSchemeForExtensions(const std::string& scheme);
+
   explicit URLPattern(int valid_schemes);
 
   // Convenience to construct a URLPattern from a string. If the string is not
index 3e0c816..4036aba 100644 (file)
@@ -44,6 +44,15 @@ TEST(ExtensionURLPatternTest, ParseInvalid) {
               pattern.Parse(kInvalidPatterns[i].pattern))
         << kInvalidPatterns[i].pattern;
   }
+
+  {
+    // Cannot use a C string, because this contains a null byte.
+    std::string null_host("http://\0www/", 12);
+    URLPattern pattern(URLPattern::SCHEME_ALL);
+    EXPECT_EQ(URLPattern::PARSE_ERROR_INVALID_HOST,
+              pattern.Parse(null_host))
+        << null_host;
+  }
 };
 
 TEST(ExtensionURLPatternTest, Ports) {
index 8d23df1..a1719ab 100644 (file)
@@ -6,27 +6,27 @@
 <translation id="8978038008714088448">Læse og redigere dine data på <ph name="WEBSITE_1"/></translation>
 <translation id="4205302772098850608">Læse og redigere dine data på <ph name="WEBSITE_1"/>, <ph name="WEBSITE_2"/> og <ph name="WEBSITE_3"/></translation>
 <translation id="3828484226910527078">Få adgang til USB-enheden</translation>
-<translation id="6384275966486438344">Skift dine søgeindstillinger til: <ph name="SEARCH_HOST"/></translation>
-<translation id="5911798608827489036">Udveksl data med en computer på det lokale netværk eller internettet</translation>
+<translation id="6384275966486438344">Skifte dine søgeindstillinger til: <ph name="SEARCH_HOST"/></translation>
+<translation id="5911798608827489036">Udveksle data med en computer på det lokale netværk eller internettet</translation>
 <translation id="4719685943208231314">Få adgang til USB-enheden fra <ph name="VENDOR_NAME"/></translation>
 <translation id="657064425229075395">Baggrundsscriptet  &quot;<ph name="BACKGROUND_SCRIPT"/>&quot; kunne ikke indlæses.</translation>
-<translation id="8597109877291678953">Udveksl data med den computer, der er navngivet <ph name="HOSTNAME"/></translation>
+<translation id="8597109877291678953">Udveksle data med computeren ved navn <ph name="HOSTNAME"/></translation>
 <translation id="5456409301717116725">Denne udvidelse inkluderer nøglefilen &quot;<ph name="KEY_PATH"/>&quot;. Det ønsker du sandsynligvis ikke at gøre.</translation>
 <translation id="2350172092385603347">Lokalisering anvendt, men default_locale blev ikke angivet i manifestet.</translation>
 <translation id="8058376558882514200">Få adgang til USB-enheden <ph name="PRODUCT_NAME"/> fra <ph name="VENDOR_NAME"/></translation>
 <translation id="8774379383902544371">Få adgang til USB-enheder</translation>
 <translation id="149347756975725155">Udvidelsesikonet '<ph name="ICON"/>' kunne ikke indlæses.</translation>
 <translation id="6344170822609224263">Få adgang til listen over netværksforbindelser</translation>
-<translation id="2518849872271000461">Udveksl data med computerne, der er navngivet: <ph name="HOSTNAMES"/></translation>
+<translation id="2518849872271000461">Udveksle data med computerne ved navn: <ph name="HOSTNAMES"/></translation>
 <translation id="1389014510128217152">– <ph name="WEBSITE_1"/></translation>
-<translation id="961805664415579088">Udveksl data med en computer på domænet <ph name="DOMAIN"/></translation>
-<translation id="4968399700653439437">Udveksl data med en computer på domænerne: <ph name="DOMAINS"/></translation>
-<translation id="8662911384982557515">Skift din startside til: <ph name="HOME_PAGE"/></translation>
+<translation id="961805664415579088">Udveksle data med en computer på domænet <ph name="DOMAIN"/></translation>
+<translation id="4968399700653439437">Udveksle data med en computer på domænerne: <ph name="DOMAINS"/></translation>
+<translation id="8662911384982557515">Skifte din startside til: <ph name="HOME_PAGE"/></translation>
 <translation id="8114679593444120202">Læse og redigere dine data på <ph name="NUMBER_OF_WEBSITES"/> websites</translation>
 <translation id="8602184400052594090">Manifestfil mangler eller er ulæselig.</translation>
-<translation id="7893008570150657497">få adgang til billeder, musik og andre medier fra din computer</translation>
+<translation id="7893008570150657497">Få adgang til billeder, musik og andre medier fra din computer</translation>
 <translation id="7217838517480956708">Administratoren af denne computer kræver, at <ph name="EXTENSION_NAME"/> skal installeres. Den kan ikke fjernes eller ændres.</translation>
-<translation id="7154130902455071009">Skift din startside til: <ph name="START_PAGE"/></translation>
+<translation id="7154130902455071009">Skifte din startside til: <ph name="START_PAGE"/></translation>
 <translation id="6094507746643187368">Læse og redigere dine data på <ph name="WEBSITE_1"/> og <ph name="WEBSITE_2"/></translation>
 <translation id="1803557475693955505">Baggrundssiden '<ph name="BACKGROUND_PAGE"/>' kunne ikke indlæses.</translation>
 <translation id="8207052894957937969">Læse og redigere dine data på <ph name="NUMBER_OF_WEBSITES"/> websites</translation>
index 5d9a821..8b63d1f 100644 (file)
@@ -15,7 +15,7 @@
 <translation id="2350172092385603347">A fost utilizată localizarea, dar nu s-a specificat default_locale în manifest.</translation>
 <translation id="8058376558882514200">Accesați dispozitivul USB <ph name="PRODUCT_NAME"/> de la <ph name="VENDOR_NAME"/></translation>
 <translation id="8774379383902544371">Accesați gadgeturi USB</translation>
-<translation id="149347756975725155">Nu am putut încărca pictograma extensiei „<ph name="ICON"/>”.</translation>
+<translation id="149347756975725155">Nu se poate încărca pictograma „<ph name="ICON"/>” a extensiei.</translation>
 <translation id="6344170822609224263">Accesează lista conexiunilor de rețea</translation>
 <translation id="2518849872271000461">Faceți schimb de date cu computerele cu numele: <ph name="HOSTNAMES"/></translation>
 <translation id="1389014510128217152">– <ph name="WEBSITE_1"/></translation>
index d35b587..b40b400 100644 (file)
@@ -25,7 +25,7 @@
 <translation id="8114679593444120202">อ่านและแก้ไขข้อมูลของคุณบนเว็บไซต์ <ph name="NUMBER_OF_WEBSITES"/> แห่ง</translation>
 <translation id="8602184400052594090">ไฟล์มานิเฟสต์หายไปหรืออ่านไม่ได้</translation>
 <translation id="7893008570150657497">เข้าถึงรูปภาพ เพลง และสื่ออื่นๆ จากคอมพิวเตอร์ของคุณ</translation>
-<translation id="7217838517480956708">à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¹\80à¸\84รืà¹\88อà¸\87à¸\99ีà¹\89à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89มีà¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87 <ph name="EXTENSION_NAME"/> à¹\82à¸\94ยà¹\84มà¹\88สามารà¸\96à¸\99ำออà¸\81หรือแก้ไขได้</translation>
+<translation id="7217838517480956708">à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\82อà¸\87à¹\80à¸\84รืà¹\88อà¸\87à¸\99ีà¹\89à¸\95à¹\89อà¸\87à¸\81ารà¹\83หà¹\89มีà¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87 <ph name="EXTENSION_NAME"/> à¹\82à¸\94ยà¹\84มà¹\88สามารà¸\96ลà¸\9aหรือแก้ไขได้</translation>
 <translation id="7154130902455071009">เปลี่ยนหน้าเริ่มต้นของคุณเป็น: <ph name="START_PAGE"/></translation>
 <translation id="6094507746643187368">อ่านและแก้ไขข้อมูลของคุณบน <ph name="WEBSITE_1"/> และ <ph name="WEBSITE_2"/></translation>
 <translation id="1803557475693955505">ไม่สามารถโหลดหน้าพื้นหลัง &quot;<ph name="BACKGROUND_PAGE"/>&quot;</translation>
index 18047b9..402feaa 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
-<translation id="7809034755304591547"><ph name="EXTENSION_NAME"/> (ID tiện ích mở rộng &quot;<ph name="EXTENSION_ID"/>&quot;) bị quản trị viên chặn.</translation>
+<translation id="7809034755304591547"><ph name="EXTENSION_NAME"/> (ID tiện ích &quot;<ph name="EXTENSION_ID"/>&quot;) bị quản trị viên chặn.</translation>
 <translation id="2857834222104759979">Tệp kê khai không hợp lệ.</translation>
 <translation id="8978038008714088448">Đọc và sửa đổi dữ liệu của bạn trên <ph name="WEBSITE_1"/></translation>
 <translation id="4205302772098850608">Đọc và sửa đổi dữ liệu của bạn trên <ph name="WEBSITE_1"/>, <ph name="WEBSITE_2"/> và <ph name="WEBSITE_3"/></translation>
 <translation id="4719685943208231314">Truy cập thiết bị USB từ <ph name="VENDOR_NAME"/></translation>
 <translation id="657064425229075395">Không thể tải tập lệnh nền '<ph name="BACKGROUND_SCRIPT"/>'.</translation>
 <translation id="8597109877291678953">Trao đổi dữ liệu với máy tính có tên <ph name="HOSTNAME"/></translation>
-<translation id="5456409301717116725">Tiện ích mở rộng này bao gồm tệp khóa '<ph name="KEY_PATH"/>'. Bạn có thể không muốn thực hiện việc đó.</translation>
+<translation id="5456409301717116725">Tiện ích này bao gồm tệp khóa '<ph name="KEY_PATH"/>'. Bạn có thể không muốn thực hiện việc đó.</translation>
 <translation id="2350172092385603347">Sử dụng bản địa hóa nhưng không chỉ định default_locale trong tệp kê khai.</translation>
 <translation id="8058376558882514200">Truy cập thiết bị USB <ph name="PRODUCT_NAME"/> từ <ph name="VENDOR_NAME"/></translation>
 <translation id="8774379383902544371">Truy cập thiết bị USB</translation>
-<translation id="149347756975725155">Không thể tải biểu tượng tiện ích mở rộng '<ph name="ICON"/>'.</translation>
+<translation id="149347756975725155">Không thể tải biểu tượng tiện ích '<ph name="ICON"/>'.</translation>
 <translation id="6344170822609224263">Truy cập danh sách kết nối mạng</translation>
 <translation id="2518849872271000461">Trao đổi dữ liệu với các máy tính có tên: <ph name="HOSTNAMES"/></translation>
 <translation id="1389014510128217152">- <ph name="WEBSITE_1"/></translation>
@@ -25,7 +25,7 @@
 <translation id="8114679593444120202">Đọc và sửa đổi dữ liệu của bạn trên <ph name="NUMBER_OF_WEBSITES"/> trang web</translation>
 <translation id="8602184400052594090">Tệp kê khai bị thiếu hoặc không thể đọc được.</translation>
 <translation id="7893008570150657497">Truy cập ảnh, nhạc và các phương tiện khác từ máy tính của bạn</translation>
-<translation id="7217838517480956708">Quản trị viên của máy này yêu cầu cài đặt <ph name="EXTENSION_NAME"/>. Bạn không thể xóa hoặc sửa đổi tiện ích mở rộng này.</translation>
+<translation id="7217838517480956708">Quản trị viên của máy này yêu cầu cài đặt <ph name="EXTENSION_NAME"/>. Bạn không thể xóa hoặc sửa đổi tiện ích này.</translation>
 <translation id="7154130902455071009">Thay đổi trang chủ của bạn thành: <ph name="START_PAGE"/></translation>
 <translation id="6094507746643187368">Đọc và sửa đổi dữ liệu của bạn trên <ph name="WEBSITE_1"/> và <ph name="WEBSITE_2"/></translation>
 <translation id="1803557475693955505">Không thể tải trang nền '<ph name="BACKGROUND_PAGE"/>'.</translation>
index bc5a745..d322ffa 100644 (file)
@@ -184,8 +184,8 @@ void ConnectionFactoryImpl::SignalConnectionReset(
   CloseSocket();
   DCHECK(!IsEndpointReachable());
 
-  if (waiting_for_network_online_)
-    return;
+  // TODO(zea): if the network is offline, don't attempt to connect.
+  // See crbug.com/396687
 
   // Network changes get special treatment as they can trigger a one-off canary
   // request that bypasses backoff (but does nothing if a connection is in
@@ -239,6 +239,7 @@ void ConnectionFactoryImpl::OnNetworkChanged(
     waiting_for_network_online_ = true;
 
     // Will do nothing due to |waiting_for_network_online_ == true|.
+    // TODO(zea): make the above statement actually true. See crbug.com/396687
     SignalConnectionReset(NETWORK_CHANGE);
     return;
   }
@@ -272,8 +273,8 @@ void ConnectionFactoryImpl::ConnectImpl() {
   DCHECK(!IsEndpointReachable());
   DCHECK(!socket_handle_.socket());
 
-  if (waiting_for_network_online_)
-    return;
+  // TODO(zea): if the network is offline, don't attempt to connect.
+  // See crbug.com/396687
 
   connecting_ = true;
   GURL current_endpoint = GetCurrentEndpoint();
index da9485f..fda42a1 100644 (file)
@@ -526,7 +526,8 @@ TEST_F(ConnectionFactoryImplTest, SignalResetRestoresBackoff) {
 
 // When the network is disconnected, close the socket and suppress further
 // connection attempts until the network returns.
-TEST_F(ConnectionFactoryImplTest, SuppressConnectWhenNoNetwork) {
+// Disabled while crbug.com/396687 is being investigated.
+TEST_F(ConnectionFactoryImplTest, DISABLED_SuppressConnectWhenNoNetwork) {
   factory()->SetConnectResult(net::OK);
   factory()->Connect();
   EXPECT_TRUE(factory()->NextRetryAttempt().is_null());
index 79cb6c0..b1e59a8 100644 (file)
@@ -658,8 +658,15 @@ uint32 InProcessCommandBuffer::InsertSyncPoint() {
 void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) {
   gles2::MailboxManager* mailbox_manager =
       decoder_->GetContextGroup()->mailbox_manager();
-  if (mailbox_manager->UsesSync() && MakeCurrent())
-    mailbox_manager->PushTextureUpdates();
+  if (mailbox_manager->UsesSync()) {
+    bool make_current_success = false;
+    {
+      base::AutoLock lock(command_buffer_lock_);
+      make_current_success = MakeCurrent();
+    }
+    if (make_current_success)
+      mailbox_manager->PushTextureUpdates();
+  }
   g_sync_point_manager.Get().RetireSyncPoint(sync_point);
 }
 
index 24382f0..3703f14 100644 (file)
@@ -20,8 +20,8 @@ namespace {
 
 class GLImageSync : public gfx::GLImage {
  public:
-  explicit GLImageSync(
-      const scoped_refptr<NativeImageBuffer>& buffer);
+  explicit GLImageSync(const scoped_refptr<NativeImageBuffer>& buffer,
+                       const gfx::Size& size);
 
   // Implement GLImage.
   virtual void Destroy() OVERRIDE;
@@ -40,12 +40,14 @@ class GLImageSync : public gfx::GLImage {
 
  private:
   scoped_refptr<NativeImageBuffer> buffer_;
+  gfx::Size size_;
 
   DISALLOW_COPY_AND_ASSIGN(GLImageSync);
 };
 
-GLImageSync::GLImageSync(const scoped_refptr<NativeImageBuffer>& buffer)
-    : buffer_(buffer) {
+GLImageSync::GLImageSync(const scoped_refptr<NativeImageBuffer>& buffer,
+                         const gfx::Size& size)
+    : buffer_(buffer), size_(size) {
   if (buffer)
     buffer->AddClient(this);
 }
@@ -58,8 +60,7 @@ GLImageSync::~GLImageSync() {
 void GLImageSync::Destroy() {}
 
 gfx::Size GLImageSync::GetSize() {
-  NOTREACHED();
-  return gfx::Size();
+  return size_;
 }
 
 bool GLImageSync::BindTexImage(unsigned target) {
@@ -339,7 +340,10 @@ TextureDefinition::TextureDefinition(
   DCHECK(texture->level_infos_[0][0].width);
   DCHECK(texture->level_infos_[0][0].height);
 
-  scoped_refptr<gfx::GLImage> gl_image(new GLImageSync(image_buffer_));
+  scoped_refptr<gfx::GLImage> gl_image(
+      new GLImageSync(image_buffer_,
+                      gfx::Size(texture->level_infos_[0][0].width,
+                                texture->level_infos_[0][0].height)));
   texture->SetLevelImage(NULL, target, 0, gl_image);
 
   // TODO: all levels
@@ -357,7 +361,6 @@ TextureDefinition::TextureDefinition(
   std::vector<LevelInfo> infos;
   infos.push_back(info);
   level_infos_.push_back(infos);
-
 }
 
 TextureDefinition::~TextureDefinition() {
@@ -414,8 +417,15 @@ void TextureDefinition::UpdateTexture(Texture* texture) const {
                             info.cleared);
     }
   }
-  if (image_buffer_)
-    texture->SetLevelImage(NULL, target_, 0, new GLImageSync(image_buffer_));
+  if (image_buffer_) {
+    texture->SetLevelImage(
+        NULL,
+        target_,
+        0,
+        new GLImageSync(
+            image_buffer_,
+            gfx::Size(level_infos_[0][0].width, level_infos_[0][0].height)));
+  }
 
   texture->target_ = target_;
   texture->SetImmutable(immutable_);
index b92ebda..bcd2dd4 100644 (file)
@@ -19,7 +19,7 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST(
 {
   "name": "gpu driver bug list",
   // Please update the version number whenever you change this file.
-  "version": "6.3",
+  "version": "6.7",
   "entries": [
     {
       "id": 1,
@@ -1063,6 +1063,37 @@ LONG_STRING_CONST(
       "features": [
         "disable_arb_sync"
       ]
+    },
+    {
+      "id": 82,
+      "description": "PBO mappings segfault on certain older Qualcomm drivers",
+      "cr_bugs": [394510],
+      "os": {
+        "type": "android",
+        "version": {
+          "op": "<",
+          "value": "4.3"
+        }
+      },
+      "gl_vendor": {
+        "op": "beginwith",
+        "value": "Qualcomm"
+      },
+      "features": [
+        "disable_async_readpixels"
+      ]
+    },
+    {
+      "id": 86,
+      "description": "Disable use of Direct3D 11 on Matrox video cards",
+      "cr_bugs": [395861],
+      "os": {
+        "type": "win"
+      },
+      "vendor_id": "0x102b",
+      "features": [
+        "disable_d3d11"
+      ]
     }
   ]
 }
index cc9c6fe..a8581bc 100644 (file)
@@ -18,7 +18,7 @@ const char kSoftwareRenderingListJson[] = LONG_STRING_CONST(
 {
   "name": "software rendering list",
   // Please update the version number whenever you change this file.
-  "version": "8.7",
+  "version": "8.8",
   "entries": [
     {
       "id": 1,
@@ -1168,7 +1168,7 @@ LONG_STRING_CONST(
             "type": "android",
             "version": {
               "op": ">=",
-              "value": "4.5"
+              "value": "4.4.99"
             }
           }
         }
index 2a08b29..645fcb3 100644 (file)
@@ -37,12 +37,11 @@ class AudioStreamHandler::AudioStreamContainer
     : public AudioOutputStream::AudioSourceCallback {
  public:
   AudioStreamContainer(const WavAudioHandler& wav_audio)
-      : stream_(NULL),
-        wav_audio_(wav_audio),
+      : started_(false),
+        stream_(NULL),
         cursor_(0),
-        started_(false),
-        delayed_stop_posted_(false) {
-  }
+        delayed_stop_posted_(false),
+        wav_audio_(wav_audio) {}
 
   virtual ~AudioStreamContainer() {
     DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
@@ -58,8 +57,8 @@ class AudioStreamHandler::AudioStreamContainer
                                    p.sample_rate(),
                                    p.bits_per_sample(),
                                    kDefaultFrameCount);
-      stream_ = AudioManager::Get()->MakeAudioOutputStreamProxy(
-          params, std::string());
+      stream_ = AudioManager::Get()->MakeAudioOutputStreamProxy(params,
+                                                                std::string());
       if (!stream_ || !stream_->Open()) {
         LOG(ERROR) << "Failed to open an output stream.";
         return;
@@ -71,8 +70,8 @@ class AudioStreamHandler::AudioStreamContainer
       base::AutoLock al(state_lock_);
 
       delayed_stop_posted_ = false;
-      stop_closure_.Reset(base::Bind(
-          &AudioStreamContainer::StopStream, base::Unretained(this)));
+      stop_closure_.Reset(base::Bind(&AudioStreamContainer::StopStream,
+                                     base::Unretained(this)));
 
       if (started_) {
         if (wav_audio_.AtEnd(cursor_))
@@ -81,9 +80,9 @@ class AudioStreamHandler::AudioStreamContainer
       }
 
       cursor_ = 0;
-      started_ = true;
     }
 
+    started_ = true;
     if (g_audio_source_for_testing)
       stream_->Start(g_audio_source_for_testing);
     else
@@ -99,6 +98,7 @@ class AudioStreamHandler::AudioStreamContainer
     if (stream_)
       stream_->Close();
     stream_ = NULL;
+    stop_closure_.Cancel();
   }
 
  private:
@@ -131,24 +131,25 @@ class AudioStreamHandler::AudioStreamContainer
   void StopStream() {
     DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
 
-    base::AutoLock al(state_lock_);
-
     if (stream_ && started_) {
+      // Do not hold the |state_lock_| while stopping the output stream.
       stream_->Stop();
       if (g_observer_for_testing)
         g_observer_for_testing->OnStop(cursor_);
     }
+
     started_ = false;
   }
 
+  // Must only be accessed on the AudioManager::GetTaskRunner() thread.
+  bool started_;
   AudioOutputStream* stream_;
 
-  const WavAudioHandler wav_audio_;
-
+  // All variables below must be accessed under |state_lock_| when |started_|.
   base::Lock state_lock_;
   size_t cursor_;
-  bool started_;
   bool delayed_stop_posted_;
+  const WavAudioHandler wav_audio_;
   base::CancelableClosure stop_closure_;
 
   DISALLOW_COPY_AND_ASSIGN(AudioStreamContainer);
index 8005ddc..cb03a56 100644 (file)
@@ -664,6 +664,11 @@ class AudioManagerAndroid {
             btAdapter = BluetoothAdapter.getDefaultAdapter();
         }
 
+        if (btAdapter == null) {
+            // Bluetooth not supported on this platform.
+            return false;
+        }
+
         int profileConnectionState;
         profileConnectionState = btAdapter.getProfileConnectionState(
                 android.bluetooth.BluetoothProfile.HEADSET);
index 2fb4180..7fafc8b 100644 (file)
 
 namespace media {
 
-// Largest gap or overlap allowed by this class. Anything
-// larger than this will trigger an error.
-// This is an arbitrary value, but the initial selection of 50ms
-// roughly represents the duration of 2 compressed AAC or MP3 frames.
-static const int kMaxTimeDeltaInMilliseconds = 50;
-
 // Minimum gap size needed before the splicer will take action to
 // fill a gap. This avoids periodically inserting and then dropping samples
 // when the buffer timestamps are slightly off because of timestamp rounding
@@ -143,7 +137,8 @@ bool AudioStreamSanitizer::AddInput(const scoped_refptr<AudioBuffer>& input) {
       output_timestamp_helper_.GetTimestamp();
   const base::TimeDelta delta = timestamp - expected_timestamp;
 
-  if (std::abs(delta.InMilliseconds()) > kMaxTimeDeltaInMilliseconds) {
+  if (std::abs(delta.InMilliseconds()) >
+      AudioSplicer::kMaxTimeDeltaInMilliseconds) {
     DVLOG(1) << "Timestamp delta too large: " << delta.InMicroseconds() << "us";
     return false;
   }
@@ -310,7 +305,12 @@ bool AudioSplicer::AddInput(const scoped_refptr<AudioBuffer>& input) {
   if (pre_splice_sanitizer_->GetFrameCount() <=
       output_ts_helper.GetFramesToTarget(splice_timestamp_)) {
     CHECK(pre_splice_sanitizer_->DrainInto(output_sanitizer_.get()));
-    CHECK(post_splice_sanitizer_->DrainInto(output_sanitizer_.get()));
+
+    // If the file contains incorrectly muxed timestamps, there may be huge gaps
+    // between the demuxed and decoded timestamps.
+    if (!post_splice_sanitizer_->DrainInto(output_sanitizer_.get()))
+      return false;
+
     reset_splice_timestamps();
     return true;
   }
index 389607a..0db5d08 100644 (file)
@@ -27,6 +27,12 @@ class MEDIA_EXPORT AudioSplicer {
   enum {
     // The number of ms to crossfade before trimming when buffers overlap.
     kCrossfadeDurationInMilliseconds = 5,
+
+    // Largest gap or overlap allowed between buffers.  Anything larger than
+    // this will trigger an error.  This is an arbitrary value, but the initial
+    // selection of 50ms roughly represents the duration of 2 compressed AAC or
+    // MP3 frames.
+    kMaxTimeDeltaInMilliseconds = 50,
   };
 
   // Resets the splicer state by clearing the output buffers queue and resetting
index 2e46b9f..e6de2c6 100644 (file)
@@ -682,4 +682,42 @@ TEST_F(AudioSplicerTest, IncorrectlyMarkedSpliceWithGap) {
   EXPECT_FALSE(splicer_.HasNextBuffer());
 }
 
+// Test behavior when a splice frame is incorrectly marked and there is a gap
+// between what's in the pre splice and post splice that is too large to recover
+// from.
+// +--------+
+// |11111111|
+// +--------+
+//                    +------+
+//                    |222222|
+//                    +------+
+// Results in an error and not a crash.
+TEST_F(AudioSplicerTest, IncorrectlyMarkedSpliceWithBadGap) {
+  const int kBufferSize =
+      input_timestamp_helper_.GetFramesToTarget(max_crossfade_duration()) * 2;
+  const int kGapSize = kBufferSize +
+                       input_timestamp_helper_.GetFramesToTarget(
+                           base::TimeDelta::FromMilliseconds(
+                               AudioSplicer::kMaxTimeDeltaInMilliseconds + 1));
+
+  scoped_refptr<AudioBuffer> first_buffer =
+      GetNextInputBuffer(1.0f, kBufferSize);
+  scoped_refptr<AudioBuffer> gap_buffer =
+      GetNextInputBuffer(0.0f, kGapSize);
+  splicer_.SetSpliceTimestamp(input_timestamp_helper_.GetTimestamp());
+  scoped_refptr<AudioBuffer> second_buffer =
+      GetNextInputBuffer(0.0f, kBufferSize);
+
+  // The splicer should pass through the first buffer since it's not part of the
+  // splice.
+  EXPECT_TRUE(AddInput(first_buffer));
+  VerifyNextBuffer(first_buffer);
+
+  // Do not add |gap_buffer|.
+
+  // |second_buffer| will complete the supposed splice.
+  splicer_.SetSpliceTimestamp(kNoTimestamp());
+  EXPECT_FALSE(AddInput(second_buffer));
+}
+
 }  // namespace media
index 64b20c9..6e587ae 100644 (file)
@@ -27,7 +27,7 @@ const uint32 kStartFrameId = UINT32_C(0xffffffff);
 // This is an important system-wide constant.  This limits how much history the
 // implementation must retain in order to process the acknowledgements of past
 // frames.
-const int kMaxUnackedFrames = 255;
+const int kMaxUnackedFrames = 60;
 
 const size_t kMaxIpPacketSize = 1500;
 const int kStartRttMs = 20;
index 8388f44..ab02df3 100644 (file)
@@ -838,7 +838,7 @@ void CdmAdapter::DeliverBlock(int32_t result,
                               const LinkedDecryptedBlock& decrypted_block,
                               const PP_DecryptTrackingInfo& tracking_info) {
   PP_DCHECK(result == PP_OK);
-  PP_DecryptedBlockInfo decrypted_block_info;
+  PP_DecryptedBlockInfo decrypted_block_info = {};
   decrypted_block_info.tracking_info = tracking_info;
   decrypted_block_info.tracking_info.timestamp = decrypted_block->Timestamp();
   decrypted_block_info.tracking_info.buffer_id = 0;
@@ -855,9 +855,10 @@ void CdmAdapter::DeliverBlock(int32_t result,
     } else {
       PpbBuffer* ppb_buffer =
           static_cast<PpbBuffer*>(decrypted_block->DecryptedBuffer());
-      buffer = ppb_buffer->buffer_dev();
       decrypted_block_info.tracking_info.buffer_id = ppb_buffer->buffer_id();
       decrypted_block_info.data_size = ppb_buffer->Size();
+
+      buffer = ppb_buffer->TakeBuffer();
     }
   }
 
@@ -893,7 +894,7 @@ void CdmAdapter::DeliverFrame(
     const LinkedVideoFrame& video_frame,
     const PP_DecryptTrackingInfo& tracking_info) {
   PP_DCHECK(result == PP_OK);
-  PP_DecryptedFrameInfo decrypted_frame_info;
+  PP_DecryptedFrameInfo decrypted_frame_info = {};
   decrypted_frame_info.tracking_info.request_id = tracking_info.request_id;
   decrypted_frame_info.tracking_info.buffer_id = 0;
   decrypted_frame_info.result = CdmStatusToPpDecryptResult(status);
@@ -908,8 +909,6 @@ void CdmAdapter::DeliverFrame(
       PpbBuffer* ppb_buffer =
           static_cast<PpbBuffer*>(video_frame->FrameBuffer());
 
-      buffer = ppb_buffer->buffer_dev();
-
       decrypted_frame_info.tracking_info.timestamp = video_frame->Timestamp();
       decrypted_frame_info.tracking_info.buffer_id = ppb_buffer->buffer_id();
       decrypted_frame_info.format =
@@ -928,8 +927,11 @@ void CdmAdapter::DeliverFrame(
           video_frame->Stride(cdm::VideoFrame::kUPlane);
       decrypted_frame_info.strides[PP_DECRYPTEDFRAMEPLANES_V] =
           video_frame->Stride(cdm::VideoFrame::kVPlane);
+
+      buffer = ppb_buffer->TakeBuffer();
     }
   }
+
   pp::ContentDecryptor_Private::DeliverFrame(buffer, decrypted_frame_info);
 }
 
@@ -939,7 +941,7 @@ void CdmAdapter::DeliverSamples(int32_t result,
                                 const PP_DecryptTrackingInfo& tracking_info) {
   PP_DCHECK(result == PP_OK);
 
-  PP_DecryptedSampleInfo decrypted_sample_info;
+  PP_DecryptedSampleInfo decrypted_sample_info = {};
   decrypted_sample_info.tracking_info = tracking_info;
   decrypted_sample_info.tracking_info.timestamp = 0;
   decrypted_sample_info.tracking_info.buffer_id = 0;
@@ -956,11 +958,13 @@ void CdmAdapter::DeliverSamples(int32_t result,
     } else {
       PpbBuffer* ppb_buffer =
           static_cast<PpbBuffer*>(audio_frames->FrameBuffer());
-      buffer = ppb_buffer->buffer_dev();
+
       decrypted_sample_info.tracking_info.buffer_id = ppb_buffer->buffer_id();
       decrypted_sample_info.data_size = ppb_buffer->Size();
       decrypted_sample_info.format =
           CdmAudioFormatToPpDecryptedSampleFormat(audio_frames->Format());
+
+      buffer = ppb_buffer->TakeBuffer();
     }
   }
 
index 36b9502..62f93a0 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "media/cdm/ppapi/cdm_helpers.h"
 
+#include <algorithm>
 #include <utility>
 
 #include "base/basictypes.h"
 
 namespace media {
 
+// static
+PpbBuffer* PpbBuffer::Create(const pp::Buffer_Dev& buffer,
+                             uint32_t buffer_id,
+                             PpbBufferAllocator* allocator) {
+  PP_DCHECK(buffer.data());
+  PP_DCHECK(buffer.size());
+  PP_DCHECK(buffer_id);
+  PP_DCHECK(allocator);
+  return new PpbBuffer(buffer, buffer_id, allocator);
+}
+
+void PpbBuffer::Destroy() {
+  delete this;
+}
+
+uint32_t PpbBuffer::Capacity() const {
+  return buffer_.size();
+}
+
+uint8_t* PpbBuffer::Data() {
+  return static_cast<uint8_t*>(buffer_.data());
+}
+
+void PpbBuffer::SetSize(uint32_t size) {
+  PP_DCHECK(size <= Capacity());
+  if (size > Capacity()) {
+    size_ = 0;
+    return;
+  }
+
+  size_ = size;
+}
+
+pp::Buffer_Dev PpbBuffer::TakeBuffer() {
+  PP_DCHECK(!buffer_.is_null());
+  pp::Buffer_Dev buffer;
+  std::swap(buffer, buffer_);
+  buffer_id_ = 0;
+  size_ = 0;
+  return buffer;
+}
+
+PpbBuffer::PpbBuffer(pp::Buffer_Dev buffer,
+                     uint32_t buffer_id,
+                     PpbBufferAllocator* allocator)
+    : buffer_(buffer), buffer_id_(buffer_id), size_(0), allocator_(allocator) {
+}
+
+PpbBuffer::~PpbBuffer() {
+  PP_DCHECK(!buffer_id_ == buffer_.is_null());
+  // If still owning the |buffer_|, release it in the |allocator_|.
+  if (buffer_id_)
+    allocator_->Release(buffer_id_);
+}
+
 cdm::Buffer* PpbBufferAllocator::Allocate(uint32_t capacity) {
   PP_DCHECK(pp::Module::Get()->core()->IsMainThread());
 
@@ -46,7 +102,7 @@ cdm::Buffer* PpbBufferAllocator::Allocate(uint32_t capacity) {
 
   allocated_buffers_.insert(std::make_pair(buffer_id, buffer));
 
-  return PpbBuffer::Create(buffer, buffer_id);
+  return PpbBuffer::Create(buffer, buffer_id, this);
 }
 
 void PpbBufferAllocator::Release(uint32_t buffer_id) {
index e033dd7..1ee579b 100644 (file)
@@ -20,6 +20,8 @@
 
 namespace media {
 
+class PpbBufferAllocator;
+
 // cdm::Buffer implementation that provides access to memory owned by a
 // pp::Buffer_Dev.
 // This class holds a reference to the Buffer_Dev throughout its lifetime.
@@ -27,48 +29,37 @@ namespace media {
 // pp::Buffer_Dev and PPB_Buffer_Dev.
 class PpbBuffer : public cdm::Buffer {
  public:
-  static PpbBuffer* Create(const pp::Buffer_Dev& buffer, uint32_t buffer_id) {
-    PP_DCHECK(buffer.data());
-    PP_DCHECK(buffer.size());
-    PP_DCHECK(buffer_id);
-    return new PpbBuffer(buffer, buffer_id);
-  }
+  static PpbBuffer* Create(const pp::Buffer_Dev& buffer, uint32_t buffer_id,
+                           PpbBufferAllocator* allocator);
 
   // cdm::Buffer implementation.
-  virtual void Destroy() OVERRIDE { delete this; }
-
-  virtual uint32_t Capacity() const OVERRIDE { return buffer_.size(); }
-
-  virtual uint8_t* Data() OVERRIDE {
-    return static_cast<uint8_t*>(buffer_.data());
-  }
-
-  virtual void SetSize(uint32_t size) OVERRIDE {
-    PP_DCHECK(size <= Capacity());
-    if (size > Capacity()) {
-      size_ = 0;
-      return;
-    }
-
-    size_ = size;
-  }
-
+  virtual void Destroy() OVERRIDE;
+  virtual uint32_t Capacity() const OVERRIDE;
+  virtual uint8_t* Data() OVERRIDE;
+  virtual void SetSize(uint32_t size) OVERRIDE;
   virtual uint32_t Size() const OVERRIDE { return size_; }
 
-  pp::Buffer_Dev buffer_dev() const { return buffer_; }
+  // Takes the |buffer_| from this class and returns it.
+  // Note: The caller must ensure |allocator->Release()| is called later so that
+  // the buffer can be reused by the allocator.
+  // Since pp::Buffer_Dev is ref-counted, the caller now holds one reference to
+  // the buffer and this class holds no reference. Note that other references
+  // may still exist. For example, PpbBufferAllocator always holds a reference
+  // to all allocated buffers.
+  pp::Buffer_Dev TakeBuffer();
 
   uint32_t buffer_id() const { return buffer_id_; }
 
  private:
-  PpbBuffer(pp::Buffer_Dev buffer, uint32_t buffer_id)
-      : buffer_(buffer),
-        buffer_id_(buffer_id),
-        size_(0) {}
-  virtual ~PpbBuffer() {}
+  PpbBuffer(pp::Buffer_Dev buffer,
+            uint32_t buffer_id,
+            PpbBufferAllocator* allocator);
+  virtual ~PpbBuffer();
 
   pp::Buffer_Dev buffer_;
   uint32_t buffer_id_;
   uint32_t size_;
+  PpbBufferAllocator* allocator_;
 
   DISALLOW_COPY_AND_ASSIGN(PpbBuffer);
 };
index f5b4fdd..62b39c1 100644 (file)
@@ -67,6 +67,7 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(
       type_(UNKNOWN),
       end_of_stream_(false),
       last_packet_timestamp_(kNoTimestamp()),
+      last_packet_duration_(kNoTimestamp()),
       bitstream_converter_enabled_(false) {
   DCHECK(demuxer_);
 
@@ -230,13 +231,41 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) {
       stream_->time_base, packet->pts));
   buffer->set_duration(ConvertStreamTimestamp(
       stream_->time_base, packet->duration));
-  if (buffer->timestamp() != kNoTimestamp() &&
-      last_packet_timestamp_ != kNoTimestamp() &&
-      last_packet_timestamp_ < buffer->timestamp()) {
-    buffered_ranges_.Add(last_packet_timestamp_, buffer->timestamp());
-    demuxer_->NotifyBufferingChanged();
+
+  if (last_packet_timestamp_ != kNoTimestamp()) {
+    // FFmpeg doesn't support chained ogg correctly.  Instead of guaranteeing
+    // continuity across links in the chain it uses the timestamp information
+    // from each link directly.  Doing so can lead to timestamps which appear to
+    // go backwards in time.
+    //
+    // If the new link starts with a negative timestamp or a timestamp less than
+    // the original (positive) |start_time|, we will get a negative timestamp
+    // here.  It's also possible FFmpeg returns kNoTimestamp() here if it's not
+    // able to work out a timestamp using the previous link and the next.
+    //
+    // Fixing chained ogg is non-trivial, so for now just reuse the last good
+    // timestamp.  The decoder will rewrite the timestamps to be sample accurate
+    // later.  See http://crbug.com/396864.
+    if (buffer->timestamp() == kNoTimestamp() ||
+        buffer->timestamp() < last_packet_timestamp_) {
+      buffer->set_timestamp(last_packet_timestamp_ +
+                            (last_packet_duration_ != kNoTimestamp()
+                                 ? last_packet_duration_
+                                 : base::TimeDelta::FromMicroseconds(1)));
+    }
+
+    // The demuxer should always output positive timestamps.
+    DCHECK(buffer->timestamp() >= base::TimeDelta());
+    DCHECK(buffer->timestamp() != kNoTimestamp());
+
+    if (last_packet_timestamp_ < buffer->timestamp()) {
+      buffered_ranges_.Add(last_packet_timestamp_, buffer->timestamp());
+      demuxer_->NotifyBufferingChanged();
+    }
   }
+
   last_packet_timestamp_ = buffer->timestamp();
+  last_packet_duration_ = buffer->duration();
 
   buffer_queue_.Push(buffer);
   SatisfyPendingRead();
@@ -254,6 +283,7 @@ void FFmpegDemuxerStream::FlushBuffers() {
   buffer_queue_.Clear();
   end_of_stream_ = false;
   last_packet_timestamp_ = kNoTimestamp();
+  last_packet_duration_ = kNoTimestamp();
 }
 
 void FFmpegDemuxerStream::Stop() {
index 02682bb..d5cff8c 100644 (file)
@@ -124,6 +124,7 @@ class FFmpegDemuxerStream : public DemuxerStream {
   base::TimeDelta duration_;
   bool end_of_stream_;
   base::TimeDelta last_packet_timestamp_;
+  base::TimeDelta last_packet_duration_;
   Ranges<base::TimeDelta> buffered_ranges_;
 
   DecoderBufferQueue buffer_queue_;
index b7d93c0..51fee63 100644 (file)
@@ -173,7 +173,8 @@ struct OpusExtraData {
         channel_mapping(0),
         num_streams(0),
         num_coupled(0),
-        gain_db(0) {
+        gain_db(0),
+        stream_map() {
     memcpy(stream_map,
            kDefaultOpusChannelLayout,
            kMaxChannelsWithDefaultLayout);
index 20416f1..b3d3dfd 100644 (file)
@@ -71,13 +71,6 @@ static int GetThreadCount(const VideoDecoderConfig& config) {
   return decode_threads;
 }
 
-// Maximum number of frame buffers that can be used (by both chromium and libvpx
-// combined) for VP9 Decoding.
-// TODO(vigneshv): Investigate if this can be relaxed to a higher number.
-static const uint32 kVP9MaxFrameBuffers = VP9_MAXIMUM_REF_BUFFERS +
-                                          VPX_MAXIMUM_WORK_BUFFERS +
-                                          limits::kMaxVideoFrames;
-
 class VpxVideoDecoder::MemoryPool
     : public base::RefCountedThreadSafe<VpxVideoDecoder::MemoryPool> {
  public:
@@ -145,10 +138,6 @@ VpxVideoDecoder::MemoryPool::VP9FrameBuffer*
   }
 
   if (i == frame_buffers_.size()) {
-    // Maximum number of frame buffers reached.
-    if (i == kVP9MaxFrameBuffers)
-      return NULL;
-
     // Create a new frame buffer.
     frame_buffers_.push_back(new VP9FrameBuffer());
   }
index 8bf4ca5..b3060eb 100644 (file)
@@ -379,14 +379,13 @@ bool AVCDecoderConfigurationRecord::ParseInternal(BufferReader* reader,
          reader->Read1(&avc_level));
 
   uint8 length_size_minus_one;
-  RCHECK(reader->Read1(&length_size_minus_one) &&
-         (length_size_minus_one & 0xfc) == 0xfc);
+  RCHECK(reader->Read1(&length_size_minus_one));
   length_size = (length_size_minus_one & 0x3) + 1;
 
   RCHECK(length_size != 3); // Only values of 1, 2, and 4 are valid.
 
   uint8 num_sps;
-  RCHECK(reader->Read1(&num_sps) && (num_sps & 0xe0) == 0xe0);
+  RCHECK(reader->Read1(&num_sps));
   num_sps &= 0x1f;
 
   sps_list.resize(num_sps);
index 7dcc7a0..fa78f42 100644 (file)
@@ -9,7 +9,7 @@
 namespace media {
 
 VideoCaptureFormat::VideoCaptureFormat()
-    : frame_rate(0), pixel_format(PIXEL_FORMAT_UNKNOWN) {}
+    : frame_rate(0.0f), pixel_format(PIXEL_FORMAT_UNKNOWN) {}
 
 VideoCaptureFormat::VideoCaptureFormat(const gfx::Size& frame_size,
                                        float frame_rate,
@@ -23,7 +23,7 @@ bool VideoCaptureFormat::IsValid() const {
          (frame_size.height() < media::limits::kMaxDimension) &&
          (frame_size.GetArea() >= 0) &&
          (frame_size.GetArea() < media::limits::kMaxCanvas) &&
-         (frame_rate > 0) &&
+         (frame_rate >= 0.0f) &&
          (frame_rate < media::limits::kMaxFramesPerSecond) &&
          (pixel_format >= PIXEL_FORMAT_UNKNOWN) &&
          (pixel_format < PIXEL_FORMAT_MAX);
index e376e98..ca53cf4 100644 (file)
@@ -530,23 +530,33 @@ class Builder(object):
       if rebuilt:
         raise Error('Could not find output file %s.' % out)
       return True
-    stamp_tm = GetMTime(self.toolstamp)
-    out_tm = GetMTime(out)
-    outd_tm = GetMTime(outd)
-    src_tm = GetMTime(src)
-    if IsStale(out_tm, stamp_tm, rebuilt):
-      if rebuilt:
-        raise Error('Output %s is older than toolchain stamp %s' % (
-            out, self.toolstamp))
-      return True
-    if IsStale(out_tm, src_tm, rebuilt):
+
+    inputs = [__file__, self.toolstamp, src]
+    outputs = [out, outd]
+
+    # Find their timestamps if any.
+    input_times = [(GetMTime(f), f) for f in inputs]
+    output_times = [(GetMTime(f), f) for f in outputs]
+
+    # All inputs must exist.
+    missing_inputs = [p[1] for p in input_times if p[0] is None]
+    if missing_inputs:
+      raise Error('Missing inputs: %s' % str(missing_inputs))
+
+    # Rebuild if any outputs are missing.
+    missing_outputs = [p[1] for p in output_times if p[0] is None]
+    if missing_outputs:
       if rebuilt:
-        raise Error('Output %s is older than source %s.' % (out, src))
+        raise Error('Outputs missing after rebuild: %s' % str(missing_outputs))
       return True
 
-    if IsStale(outd_tm, src_tm, rebuilt):
+    newest_input = max(input_times)
+    oldest_output = min(output_times)
+
+    if IsStale(oldest_output[0], newest_input[0], rebuilt):
       if rebuilt:
-        raise Error('Dependency file is older than source %s.' % src)
+        raise Error('Output %s is older than toolchain stamp %s' % (
+            oldest_output[1], newest_input[1]))
       return True
 
     # Decode emitted makefile.
@@ -569,16 +579,10 @@ class Builder(object):
     # Check if any input has changed.
     for filename in deps:
       file_tm = GetMTime(filename)
-      if IsStale(out_tm, file_tm, rebuilt):
+      if IsStale(oldest_output[0], file_tm, rebuilt):
         if rebuilt:
           raise Error('Dependency %s is older than output %s.' % (
-              filename, out))
-        return True
-
-      if IsStale(outd_tm, file_tm, rebuilt):
-        if rebuilt:
-          raise Error('Dependency %s is older than dep file %s.' % (
-              filename, outd))
+              filename, oldest_output[1]))
         return True
     return False
 
@@ -928,6 +932,17 @@ def Main(argv):
                     help='Path of the goma directory.')
   options, files = parser.parse_args(argv[1:])
 
+  if options.name is None:
+    parser.error('--name is required!')
+  if options.build_config is None:
+    parser.error('--config-name is required!')
+  if options.root is None:
+    parser.error('--root is required!')
+  if options.arch is None:
+    parser.error('--arch is required!')
+  if options.build is None:
+    parser.error('--build is required!')
+
   if not argv:
     parser.print_help()
     return 1
index 3dafb9d..67ce9c9 100755 (executable)
                    '--root', '<(DEPTH)',
                    '--name', '>(out_newlib64)',
                    '--objdir', '>(objdir_newlib64)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m64 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_newlib64)',
                    '--objdir', '>(objdir_newlib64)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m64 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_newlib32)',
                    '--objdir', '>(objdir_newlib32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m32 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_newlib32)',
                    '--objdir', '>(objdir_newlib32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m32 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_newlib32)',
                    '--objdir', '>(objdir_newlib32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m32 ^(gcc_irt_compile_flags) ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_newlib32)',
                    '--objdir', '>(objdir_newlib32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m32 ^(gcc_irt_compile_flags) ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_arm)',
                   '--objdir', '>(objdir_newlib_arm)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=-Wno-unused-local-typedefs -Wno-psabi ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_arm)',
                   '--objdir', '>(objdir_newlib_arm)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=-Wno-unused-local-typedefs -Wno-psabi ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_bionic_arm)',
                   '--objdir', '>(objdir_bionic_arm)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_bionic) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=-Wno-unused-local-typedefs -Wno-psabi ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_arm)',
                   '--objdir', '>(objdir_newlib_arm)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=-Wno-unused-local-typedefs -Wno-psabi ^(gcc_irt_compile_flags) ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_arm)',
                   '--objdir', '>(objdir_newlib_arm)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=-Wno-unused-local-typedefs -Wno-psabi ^(gcc_irt_compile_flags) ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_mips)',
                   '--objdir', '>(objdir_newlib_mips)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_mips)',
                   '--objdir', '>(objdir_newlib_mips)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_mips)',
                   '--objdir', '>(objdir_newlib_mips)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=-stdlib=libstdc++ ^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                   '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_newlib_mips)',
                   '--objdir', '>(objdir_newlib_mips)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=-stdlib=libstdc++ ^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                   '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_glibc64)',
                    '--objdir', '>(objdir_glibc64)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_glibc) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m64 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_glibc32)',
                    '--objdir', '>(objdir_glibc32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_glibc) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m32 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_glibc64)',
                    '--objdir', '>(objdir_glibc64)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_glibc) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m64 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_glibc32)',
                    '--objdir', '>(objdir_glibc32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_glibc) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m32 ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_glibc64)',
                    '--objdir', '>(objdir_glibc64)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_glibc) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m64 -fPIC ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_glibc32)',
                    '--objdir', '>(objdir_glibc32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_glibc) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=-m32 -fPIC ^(gcc_compile_flags) >(_gcc_compile_flags) ^(compile_flags) >(_compile_flags)',
                    '--gomadir', '<(gomadir)',
                '--root', '<(DEPTH)',
                '--name', '>(out_pnacl_newlib)',
                '--objdir', '>(objdir_pnacl_newlib)',
+               '--config-name', '<(CONFIGURATION_NAME)',
                '--include-dirs=>(tc_include_dir_pnacl_newlib) ^(include_dirs) >(_include_dirs)',
                '--compile_flags=^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                '--gomadir', '<(gomadir)',
                  '--build', 'newlib_translate',
                  '--root', '<(DEPTH)',
                  '--name', '>(out_pnacl_newlib_x86_32_nexe)',
+                 '--config-name', '<(CONFIGURATION_NAME)',
                  '--link_flags=^(translate_flags) >(translate_flags) -Wl,-L>(tc_lib_dir_pnacl_translate)/lib-x86-32',
                  '>(out_pnacl_newlib)',
                ],
                  '--build', 'newlib_translate',
                  '--root', '<(DEPTH)',
                  '--name', '>(out_pnacl_newlib_x86_32_nonsfi_nexe)',
+                 '--config-name', '<(CONFIGURATION_NAME)',
                  '--link_flags=^(translate_flags) >(translate_flags) -Wl,-L>(tc_lib_dir_pnacl_translate)/lib-x86-32-nonsfi',
                  '>(out_pnacl_newlib)',
                ],
                  '--build', 'newlib_translate',
                  '--root', '<(DEPTH)',
                  '--name', '>(out_pnacl_newlib_x86_64_nexe)',
+                 '--config-name', '<(CONFIGURATION_NAME)',
                  '--link_flags=^(translate_flags) >(translate_flags) -Wl,-L>(tc_lib_dir_pnacl_translate)/lib-x86-64',
                  '>(out_pnacl_newlib)',
                ],
                  '--build', 'newlib_translate',
                  '--root', '<(DEPTH)',
                  '--name', '>(out_pnacl_newlib_arm_nexe)',
+                 '--config-name', '<(CONFIGURATION_NAME)',
                  '--link_flags=^(translate_flags) >(translate_flags) -Wl,-L>(tc_lib_dir_pnacl_translate)/lib-arm',
                  '>(out_pnacl_newlib)',
                ],
                  '--build', 'newlib_translate',
                  '--root', '<(DEPTH)',
                  '--name', '>(out_pnacl_newlib_mips_nexe)',
+                 '--config-name', '<(CONFIGURATION_NAME)',
                  '--link_flags=^(translate_flags) >(translate_flags) -Wl,-L>(tc_lib_dir_pnacl_translate)/lib-mips32',
                  '>(out_pnacl_newlib)',
                ],
                '--root', '<(DEPTH)',
                '--name', '>(out_pnacl_newlib)',
                '--objdir', '>(objdir_pnacl_newlib)',
+               '--config-name', '<(CONFIGURATION_NAME)',
                '--include-dirs=>(tc_include_dir_pnacl_newlib) ^(include_dirs) >(_include_dirs)',
                '--compile_flags=^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_pnacl_newlib_arm)',
                   '--objdir', '>(objdir_pnacl_newlib_arm)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_pnacl_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=--target=armv7-unknown-nacl-gnueabi -mfloat-abi=hard --pnacl-allow-translate -arch arm ^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                   '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_pnacl_newlib_x86_64)',
                    '--objdir', '>(objdir_pnacl_newlib_x86_64)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_pnacl_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=--target=x86_64-unknown-nacl --pnacl-allow-translate -arch x86-64 ^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_pnacl_newlib_x86_32)',
                    '--objdir', '>(objdir_pnacl_newlib_x86_32)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_pnacl_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=--target=i686-unknown-nacl --pnacl-allow-translate -arch x86-32 ^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                    '--gomadir', '<(gomadir)',
                    '--root', '<(DEPTH)',
                    '--name', '>(out_pnacl_newlib_x86_32_nonsfi)',
                    '--objdir', '>(objdir_pnacl_newlib_x86_32_nonsfi)',
+                   '--config-name', '<(CONFIGURATION_NAME)',
                    '--include-dirs=>(tc_include_dir_pnacl_newlib) ^(include_dirs) >(_include_dirs)',
                    '--compile_flags=--target=i686-unknown-nacl --pnacl-allow-native --pnacl-allow-translate -arch x86-32-nonsfi ^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                    '--gomadir', '<(gomadir)',
                   '--root', '<(DEPTH)',
                   '--name', '>(out_pnacl_newlib_mips)',
                   '--objdir', '>(objdir_pnacl_newlib_mips)',
+                  '--config-name', '<(CONFIGURATION_NAME)',
                   '--include-dirs=>(tc_include_dir_pnacl_newlib) ^(include_dirs) >(_include_dirs)',
                   '--compile_flags=--pnacl-allow-translate -arch mips ^(compile_flags) >(_compile_flags) ^(pnacl_compile_flags) >(_pnacl_compile_flags)',
                   '--gomadir', '<(gomadir)',
index 33ff772..5b25478 100644 (file)
@@ -584,7 +584,6 @@ uintptr_t NaClHostDescMap(struct NaClHostDesc *d,
   DWORD     dwMaximumSizeLow;
   uintptr_t map_result;
   size_t    chunk_offset;
-  size_t    unmap_offset;
   size_t    chunk_size;
 
   NaClLog(4,
@@ -835,19 +834,12 @@ uintptr_t NaClHostDescMap(struct NaClHostDesc *d,
             map_result, chunk_addr, (addr + chunk_offset));
     if ((addr + chunk_offset) != map_result) {
       DWORD err = GetLastError();
-      NaClLog(LOG_INFO,
+      NaClLog(LOG_FATAL,
               "MapViewOfFileEx failed at 0x%08"NACL_PRIxPTR
               ", got 0x%08"NACL_PRIxPTR", err %x\n",
               addr + chunk_offset,
               map_result,
               err);
-      for (unmap_offset = 0;
-           unmap_offset < chunk_offset;
-           unmap_offset += NACL_MAP_PAGESIZE) {
-        (void) UnmapViewOfFile((void *) (addr + unmap_offset));
-      }
-      retval = (uintptr_t) -NaClXlateSystemError(err);
-      goto cleanup;
     }
     if (!VirtualProtect((void *) map_result,
                         NaClRoundPage(chunk_size),
index 7e9caf5..20cc4c1 100644 (file)
@@ -90,6 +90,8 @@ class MinidumpAllocator {
     if (buf_ != NULL) {
       int result = munmap(buf_, buf_size_);
       assert(result == 0);
+      // Suppress unused variable warning in case where assert is compiled out.
+      (void) result;
     }
   }
 
index 634c379..7b57396 100644 (file)
@@ -9,6 +9,8 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.Proxy;
+import android.os.Build;
+import android.util.Log;
 
 import org.chromium.base.CalledByNative;
 import org.chromium.base.JNINamespace;
@@ -92,18 +94,23 @@ public class ProxyChangeListener {
         // tne Android SDK, so we have to use reflection to get at it and invoke
         // methods on it. If we fail, return an empty proxy config (meaning
         // 'direct').
-        // TODO(ellyjones): once android.net.ProxyProperties is exported,
-        // rewrite this.
+        // TODO(sgurun): once android.net.ProxyInfo is public, rewrite this.
         private ProxyConfig extractNewProxy(Intent intent) {
             try {
-                final String CLASS_NAME = "android.net.ProxyProperties";
                 final String GET_HOST_NAME = "getHost";
                 final String GET_PORT_NAME = "getPort";
                 Object props = intent.getExtras().get("proxy");
                 if (props == null) {
                     return null;
                 }
-                Class<?> cls = Class.forName(CLASS_NAME);
+                String className;
+                if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
+                    className = "android.net.ProxyProperties";
+                } else {
+                    className = "android.net.ProxyInfo";
+                }
+
+                Class<?> cls = Class.forName(className);
                 Method getHostMethod = cls.getDeclaredMethod(GET_HOST_NAME);
                 Method getPortMethod = cls.getDeclaredMethod(GET_PORT_NAME);
 
@@ -112,14 +119,19 @@ public class ProxyChangeListener {
 
                 return new ProxyConfig(host, port);
             } catch (ClassNotFoundException ex) {
+                Log.e(TAG, "Using no proxy configuration due to exception:" + ex);
                 return null;
             } catch (NoSuchMethodException ex) {
+                Log.e(TAG, "Using no proxy configuration due to exception:" + ex);
                 return null;
             } catch (IllegalAccessException ex) {
+                Log.e(TAG, "Using no proxy configuration due to exception:" + ex);
                 return null;
             } catch (InvocationTargetException ex) {
+                Log.e(TAG, "Using no proxy configuration due to exception:" + ex);
                 return null;
             } catch (NullPointerException ex) {
+                Log.e(TAG, "Using no proxy configuration due to exception:" + ex);
                 return null;
             }
         }
index 2f02da1..9b02c4c 100644 (file)
@@ -460,7 +460,12 @@ static const MediaFormatStrict format_codec_mappings[] = {
   { "video/ogg", "opus,theora,vorbis" },
   { "audio/ogg", "opus,vorbis" },
   { "application/ogg", "opus,theora,vorbis" },
-  { "audio/mpeg", "" },
+  { "audio/mpeg", ",mp3" }, // Note: The comma before the 'mp3'results in an
+                            // empty string codec ID and indicates
+                            // a missing codecs= parameter is also valid.
+                            // The presense of 'mp3' is not RFC compliant,
+                            // but is common in the wild so it is a defacto
+                            // standard.
   { "audio/mp3", "" },
   { "audio/x-mp3", "" }
 };
@@ -475,11 +480,19 @@ bool MimeUtil::AreSupportedCodecs(const MimeMappings& supported_codecs,
   if (supported_codecs.empty())
     return codecs.empty();
 
+  // If no codecs are specified in the mimetype, check to see if a missing
+  // codecs parameter is allowed.
+  if (codecs.empty())
+    return supported_codecs.find(std::string()) != supported_codecs.end();
+
   for (size_t i = 0; i < codecs.size(); ++i) {
-    if (supported_codecs.find(codecs[i]) == supported_codecs.end())
+    if (codecs[i].empty() ||
+        supported_codecs.find(codecs[i]) == supported_codecs.end()) {
       return false;
+    }
   }
-  return !codecs.empty();
+
+  return true;
 }
 
 void MimeUtil::InitializeMimeTypeMaps() {
index 4a86643..19881bf 100644 (file)
@@ -7992,6 +7992,171 @@ click
 // cern : 2014-06-05 European Organization for Nuclear Research ("CERN") 
 cern
 
+// healthcare : 2014-06-13 Silver Glen, LLC
+healthcare
+
+// xn--30rr7y : 2014-06-13 Excellent First Limited
+xn--30rr7y
+
+// band : 2014-06-13 Auburn Hollow, LLC
+band
+
+// xn--9et52u : 2014-06-13 RISE VICTORY LIMITED
+xn--9et52u
+
+// world : 2014-06-13 Bitter Fields, LLC
+world
+
+// latrobe : 2014-06-16 La Trobe University
+latrobe
+
+// bible : 2014-06-19 American Bible Society
+bible
+
+// java : 2014-06-19 Oracle Corporation
+java
+
+// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch
+sky
+
+// oracle : 2014-06-19 Oracle Corporation
+oracle
+
+// pharmacy : 2014-06-19 National Association of Boards of Pharmacy
+pharmacy
+
+// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+dvag
+
+// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+xn--vermgensberater-ctb
+
+// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+xn--vermgensberatung-pwb
+
+// montblanc : 2014-06-23 Richemont DNS Inc.
+montblanc
+
+// iwc : 2014-06-23 Richemont DNS Inc.
+iwc
+
+// cartier : 2014-06-23 Richemont DNS Inc.
+cartier
+
+// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+pohl
+
+// diet : 2014-06-26 Uniregistry, Corp.
+diet
+
+// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+cba
+
+// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+netbank
+
+// pictet : 2014-06-26 Pictet Europe S.A.
+pictet
+
+// help : 2014-06-26 Uniregistry, Corp.
+help
+
+// pizza : 2014-06-26 Foggy Moon, LLC
+pizza
+
+// garden : 2014-06-26 Top Level Domain Holdings Limited
+garden
+
+// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+commbank
+
+// gifts : 2014-07-03 Goose Sky, LLC
+gifts
+
+// fashion : 2014-07-03 Top Level Domain Holdings Limited
+fashion
+
+// tui : 2014-07-03 TUI AG
+tui
+
+// iinet : 2014-07-03 Connect West Pty. Ltd.
+iinet
+
+// restaurant : 2014-07-03 Snow Avenue, LLC
+restaurant
+
+// alsace : 2014-07-02 REGION D ALSACE
+alsace
+
+// poker : 2014-07-03 Afilias Domains No. 5 Limited
+poker
+
+// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
+allfinanz
+
+// sarl : 2014-07-03 Delta Orchard, LLC
+sarl
+
+// taipei : 2014-07-10 Taipei City Government
+taipei
+
+// immo : 2014-07-10 Auburn Bloom, LLC
+immo
+
+// hermes : 2014-07-10 HERMES INTERNATIONAL
+hermes
+
+// rip : 2014-07-10 United TLD Holdco Ltd.
+rip
+
+// gbiz : 2014-07-17 Charleston Road Registry Inc.
+gbiz
+
+// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC
+bloomberg
+
+// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG
+sew
+
+// prof : 2014-07-24 Charleston Road Registry Inc.
+prof
+
+// gle : 2014-07-24 Charleston Road Registry Inc.
+gle
+
+// amsterdam : 2014-07-24 Gemeente Amsterdam
+amsterdam
+
+// aquarelle : 2014-07-24 Aquarelle.com
+aquarelle
+
+// nexus : 2014-07-24 Charleston Road Registry Inc.
+nexus
+
+// flsmidth : 2014-07-24 FLSmidth A/S
+flsmidth
+
+// bnl : 2014-07-24 Banca Nazionale del Lavoro
+bnl
+
+// bcn : 2014-07-24 Municipi de Barcelona
+bcn
+
+// chrome : 2014-07-24 Charleston Road Registry Inc.
+chrome
+
+// google : 2014-07-24 Charleston Road Registry Inc.
+google
+
+// barcelona : 2014-07-24 Municipi de Barcelona
+barcelona
+
+// cal : 2014-07-24 Charleston Road Registry Inc.
+cal
+
+// abbott : 2014-07-24 Abbott Laboratories, Inc.
+abbott
+
 // ===END ICANN DOMAINS===
 // ===BEGIN PRIVATE DOMAINS===
 
index 6bee195..f131a98 100644 (file)
@@ -31,6 +31,7 @@ aa.no, 0
 aarborte.no, 0
 ab.ca, 0
 abashiri.hokkaido.jp, 0
+abbott, 0
 abeno.osaka.jp, 0
 abiko.chiba.jp, 0
 abira.hokkaido.jp, 0
@@ -169,6 +170,8 @@ alaska.museum, 0
 alessandria.it, 0
 alesund.no, 0
 algard.no, 0
+allfinanz, 0
+alsace, 0
 alstahaug.no, 0
 alta.no, 0
 altai.ru, 0
@@ -192,6 +195,7 @@ americanart.museum, 0
 ami.ibaraki.jp, 0
 amli.no, 0
 amot.no, 0
+amsterdam, 0
 amsterdam.museum, 0
 amur.ru, 0
 amursk.ru, 0
@@ -236,6 +240,7 @@ ap.it, 0
 appspot.com, 4
 aq, 0
 aq.it, 0
+aquarelle, 0
 aquarium.museum, 0
 aquila.it, 0
 ar, 0
@@ -410,10 +415,12 @@ balsan.it, 0
 balsfjord.no, 0
 baltimore.museum, 0
 bamble.no, 0
+band, 0
 bandai.fukushima.jp, 0
 bando.ibaraki.jp, 0
 bar, 0
 bar.pro, 0
+barcelona, 0
 barcelona.museum, 0
 bardu.no, 0
 bargains, 0
@@ -437,6 +444,7 @@ bauhaus, 0
 bayern, 0
 bb, 0
 bc.ca, 0
+bcn, 0
 bd, 2
 bd.se, 0
 be, 0
@@ -475,6 +483,7 @@ bi.it, 0
 bialowieza.pl, 0
 bialystok.pl, 0
 bibai.hokkaido.jp, 0
+bible, 0
 bible.museum, 0
 bid, 0
 biei.hokkaido.jp, 0
@@ -564,11 +573,13 @@ blogspot.sg, 4
 blogspot.sk, 4
 blogspot.td, 4
 blogspot.tw, 4
+bloomberg, 0
 blue, 0
 bm, 0
 bmd.br, 0
 bn, 2
 bn.it, 0
+bnl, 0
 bnpparibas, 0
 bo, 0
 bo.it, 0
@@ -662,6 +673,7 @@ cab, 0
 cadaques.museum, 0
 cagliari.it, 0
 cahcesuolo.no, 0
+cal, 0
 cal.it, 0
 calabria.it, 0
 california.museum, 0
@@ -690,6 +702,7 @@ cargo.aero, 0
 carrara-massa.it, 0
 carraramassa.it, 0
 carrier.museum, 0
+cartier, 0
 cartoonart.museum, 0
 casa, 0
 casadelamoneda.museum, 0
@@ -704,6 +717,7 @@ catanzaro.it, 0
 catering, 0
 catering.aero, 0
 cb.it, 0
+cba, 0
 cbg.ru, 0
 cc, 0
 cc.ak.us, 0
@@ -831,6 +845,7 @@ choshi.chiba.jp, 0
 choyo.kumamoto.jp, 0
 christiansburg.museum, 0
 christmas, 0
+chrome, 0
 chtr.k12.ma.us, 0
 chukotka.ru, 0
 chungbuk.kr, 0
@@ -1086,6 +1101,7 @@ com.vi, 0
 com.vn, 0
 com.vu, 0
 com.ws, 0
+commbank, 0
 communication.museum, 0
 communications.museum, 0
 community, 0
@@ -1221,6 +1237,7 @@ detroit.museum, 0
 dgca.aero, 0
 diamonds, 0
 dielddanuorri.no, 0
+diet, 0
 digital, 0
 dinosaur.museum, 0
 direct, 0
@@ -1271,6 +1288,7 @@ drobak.no, 0
 dudinka.ru, 0
 durban, 0
 durham.museum, 0
+dvag, 0
 dvrdns.org, 4
 dyn-o-saur.com, 4
 dynalias.com, 4
@@ -1552,6 +1570,7 @@ farmequipment.museum, 0
 farmers.museum, 0
 farmstead.museum, 0
 farsund.no, 0
+fashion, 0
 fauske.no, 0
 fc.it, 0
 fe.it, 0
@@ -1618,6 +1637,7 @@ florence.it, 0
 florida.museum, 0
 florist, 0
 floro.no, 0
+flsmidth, 0
 fly, 0
 fm, 0
 fm.br, 0
@@ -1816,6 +1836,7 @@ gamo.shiga.jp, 0
 gamvik.no, 0
 gangaviika.no, 0
 gangwon.kr, 0
+garden, 0
 garden.museum, 0
 gateway.museum, 0
 gaular.no, 0
@@ -1823,6 +1844,7 @@ gausdal.no, 0
 gb, 0
 gb.com, 4
 gb.net, 4
+gbiz, 0
 gc.ca, 0
 gd, 0
 gd.cn, 0
@@ -1855,6 +1877,7 @@ gi, 0
 giehtavuoatna.no, 0
 giessen.museum, 0
 gift, 0
+gifts, 0
 gifu.gifu.jp, 0
 gifu.jp, 0
 gildeskal.no, 0
@@ -1874,6 +1897,7 @@ gl, 0
 glas.museum, 0
 glass, 0
 glass.museum, 0
+gle, 0
 gliding.aero, 0
 gliwice.pl, 0
 global, 0
@@ -1922,6 +1946,7 @@ gokase.miyazaki.jp, 0
 gol.no, 0
 gon.pk, 0
 gonohe.aomori.jp, 0
+google, 0
 googleapis.com, 4
 googlecode.com, 4
 gop, 0
@@ -2215,10 +2240,12 @@ he.cn, 0
 health.museum, 0
 health.nz, 0
 health.vn, 0
+healthcare, 0
 heguri.nara.jp, 0
 heimatunduhren.museum, 0
 hekinan.aichi.jp, 0
 hellas.museum, 0
+help, 0
 helsinki.museum, 0
 hembygdsforbund.museum, 0
 hemne.no, 0
@@ -2228,6 +2255,7 @@ herad.no, 0
 here, 0
 here-for-more.info, 4
 heritage.museum, 0
+hermes, 0
 herokuapp.com, 4
 herokussl.com, 4
 heroy.more-og-romsdal.no, 0
@@ -2430,6 +2458,7 @@ iheya.okinawa.jp, 0
 iida.nagano.jp, 0
 iide.yamagata.jp, 0
 iijima.nagano.jp, 0
+iinet, 0
 iitate.fukushima.jp, 0
 iiyama.nagano.jp, 0
 iizuka.fukuoka.jp, 0
@@ -2458,6 +2487,7 @@ imakane.hokkaido.jp, 0
 imari.saga.jp, 0
 imb.br, 0
 imizu.toyama.jp, 0
+immo, 0
 immobilien, 0
 imperia.it, 0
 in, 0
@@ -2697,6 +2727,7 @@ iwata.shizuoka.jp, 0
 iwate.iwate.jp, 0
 iwate.jp, 0
 iwatsuki.saitama.jp, 0
+iwc, 0
 iwi.nz, 0
 iyo.ehime.jp, 0
 iz.hr, 0
@@ -2716,6 +2747,7 @@ jamal.ru, 0
 jamison.museum, 0
 jan-mayen.no, 0
 jar.ru, 0
+java, 0
 jaworzno.pl, 0
 je, 0
 jefferson.museum, 0
@@ -3249,6 +3281,7 @@ larsson.museum, 0
 larvik.no, 0
 laspezia.it, 0
 latina.it, 0
+latrobe, 0
 lavagis.no, 0
 lavangen.no, 0
 law.pro, 0
@@ -3772,6 +3805,7 @@ mombetsu.hokkaido.jp, 0
 monash, 0
 money.museum, 0
 monmouth.museum, 0
+montblanc, 0
 monticello.museum, 0
 montreal.museum, 0
 monza-brianza.it, 0
@@ -4132,6 +4166,7 @@ net.vi, 0
 net.vn, 0
 net.vu, 0
 net.ws, 0
+netbank, 0
 network, 0
 neues.museum, 0
 neustar, 0
@@ -4143,6 +4178,7 @@ newport.museum, 0
 news.hu, 0
 newspaper.museum, 0
 newyork.museum, 0
+nexus, 0
 neyagawa.osaka.jp, 0
 nf, 0
 nf.ca, 0
@@ -4446,6 +4482,7 @@ or.tz, 0
 or.ug, 0
 or.us, 0
 ora.gunma.jp, 0
+oracle, 0
 oregon.museum, 0
 oregontrail.museum, 0
 orenburg.ru, 0
@@ -4709,6 +4746,7 @@ pg.it, 0
 ph, 0
 pharmacien.fr, 0
 pharmaciens.km, 0
+pharmacy, 0
 pharmacy.museum, 0
 philadelphia.museum, 0
 philadelphiaarea.museum, 0
@@ -4722,6 +4760,7 @@ physio, 0
 pi.it, 0
 piacenza.it, 0
 pics, 0
+pictet, 0
 pictures, 0
 piedmont.it, 0
 piemonte.it, 0
@@ -4734,6 +4773,7 @@ pisa.it, 0
 pistoia.it, 0
 pisz.pl, 0
 pittsburgh.museum, 0
+pizza, 0
 pk, 0
 pl, 0
 pl.ua, 0
@@ -4757,6 +4797,8 @@ podhale.pl, 0
 podlasie.pl, 0
 podzone.net, 4
 podzone.org, 4
+pohl, 0
+poker, 0
 pol.dz, 0
 pol.ht, 0
 police.uk, 0
@@ -4823,6 +4865,7 @@ prochowice.pl, 0
 prod, 0
 production.aero, 0
 productions, 0
+prof, 0
 prof.pr, 0
 project.museum, 0
 properties, 0
@@ -4928,6 +4971,7 @@ research.aero, 0
 research.museum, 0
 resistance.museum, 0
 rest, 0
+restaurant, 0
 reviews, 0
 rg.it, 0
 rhcloud.com, 4
@@ -4946,6 +4990,7 @@ ringerike.no, 0
 ringsaker.no, 0
 rio, 0
 riodejaneiro.museum, 0
+rip, 0
 rishiri.hokkaido.jp, 0
 rishirifuji.hokkaido.jp, 0
 risor.no, 0
@@ -5107,6 +5152,7 @@ sar.it, 0
 saratov.ru, 0
 sardegna.it, 0
 sardinia.it, 0
+sarl, 0
 saroma.hokkaido.jp, 0
 sarpsborg.no, 0
 sarufutsu.hokkaido.jp, 0
@@ -5226,6 +5272,7 @@ settlement.museum, 0
 settlers.museum, 0
 settsu.osaka.jp, 0
 sevastopol.ua, 0
+sew, 0
 sex.hu, 0
 sex.pl, 0
 sexy, 0
@@ -5373,6 +5420,7 @@ sklep.pl, 0
 skoczow.pl, 0
 skodje.no, 0
 skole.museum, 0
+sky, 0
 skydiving.aero, 0
 sl, 0
 slask.pl, 0
@@ -5577,6 +5625,7 @@ taiji.wakayama.jp, 0
 taiki.hokkaido.jp, 0
 taiki.mie.jp, 0
 tainai.niigata.jp, 0
+taipei, 0
 taira.toyama.jp, 0
 taishi.hyogo.jp, 0
 taishi.osaka.jp, 0
@@ -5915,6 +5964,7 @@ tsuwano.shimane.jp, 0
 tsuyama.okayama.jp, 0
 tt, 0
 tt.im, 0
+tui, 0
 tula.ru, 0
 tur.ar, 0
 tur.br, 0
@@ -6257,6 +6307,7 @@ workinggroup.aero, 0
 works, 0
 works.aero, 0
 workshop.museum, 0
+world, 0
 worse-than.tv, 4
 writesthisblog.com, 4
 wroc.pl, 0
@@ -6273,6 +6324,7 @@ x.bg, 0
 x.se, 0
 xj.cn, 0
 xn--1qqw23a, 0
+xn--30rr7y, 0
 xn--3bst00m, 0
 xn--3ds443g, 0
 xn--3e0b707e, 0
@@ -6294,6 +6346,7 @@ xn--80au.xn--90a3ac, 0
 xn--90a3ac, 0
 xn--90azh.xn--90a3ac, 0
 xn--9dbhblg6di.museum, 0
+xn--9et52u, 0
 xn--andy-ira.no, 0
 xn--aroport-bya.ci, 0
 xn--asky-ira.no, 0
@@ -6539,6 +6592,8 @@ xn--unup4y, 0
 xn--vads-jra.no, 0
 xn--vard-jra.no, 0
 xn--vegrshei-c0a.no, 0
+xn--vermgensberater-ctb, 0
+xn--vermgensberatung-pwb, 0
 xn--vestvgy-ixa6o.no, 0
 xn--vg-yiab.no, 0
 xn--vgan-qoa.no, 0
index 5fc6070..75c8ee4 100644 (file)
@@ -87,7 +87,7 @@ HttpNetworkSession::Params::Params()
       enable_quic_port_selection(true),
       enable_quic_pacing(false),
       enable_quic_time_based_loss_detection(false),
-      enable_quic_persist_server_info(false),
+      enable_quic_persist_server_info(true),
       quic_clock(NULL),
       quic_random(NULL),
       quic_max_packet_length(kDefaultMaxPacketSize),
@@ -117,6 +117,7 @@ HttpNetworkSession::HttpNetworkSession(const Params& params)
                                net::ClientSocketFactory::GetDefaultFactory(),
                            params.http_server_properties,
                            params.cert_verifier,
+                           params.transport_security_state,
                            params.quic_crypto_client_stream_factory,
                            params.quic_random ? params.quic_random :
                                QuicRandom::GetInstance(),
index 79a9536..1d8237c 100644 (file)
@@ -1124,13 +1124,14 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
   // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it
   // will know when SpdySessions become available.
 
-  if (stream_factory_->for_websockets_) {
-    // TODO(ricea): Restore this code when WebSockets over SPDY is implemented.
-    NOTREACHED();
-  } else {
-    bool use_relative_url = direct || request_info_.url.SchemeIs("https");
-    stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url));
-  }
+  // TODO(ricea): Restore the code for WebSockets over SPDY once it's
+  // implemented.
+  if (stream_factory_->for_websockets_)
+    return ERR_NOT_IMPLEMENTED;
+
+  bool use_relative_url = direct || request_info_.url.SchemeIs("https");
+  stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url));
+
   return OK;
 }
 
index 4b118da..a1365c5 100644 (file)
@@ -9,6 +9,7 @@
 #include "base/callback_helpers.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
+#include "base/metrics/histogram.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "crypto/signature_verifier.h"
@@ -21,6 +22,7 @@
 #include "net/cert/single_request_cert_verifier.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
+#include "net/http/transport_security_state.h"
 #include "net/quic/crypto/crypto_protocol.h"
 #include "net/ssl/ssl_config_service.h"
 
@@ -38,6 +40,7 @@ class ProofVerifierChromium::Job {
  public:
   Job(ProofVerifierChromium* proof_verifier,
       CertVerifier* cert_verifier,
+      TransportSecurityState* transport_security_state,
       const BoundNetLog& net_log);
 
   // Starts the proof verification.  If |QUIC_PENDING| is returned, then
@@ -72,6 +75,8 @@ class ProofVerifierChromium::Job {
   // The underlying verifier used for verifying certificates.
   scoped_ptr<SingleRequestCertVerifier> verifier_;
 
+  TransportSecurityState* transport_security_state_;
+
   // |hostname| specifies the hostname for which |certs| is a valid chain.
   std::string hostname_;
 
@@ -89,11 +94,14 @@ class ProofVerifierChromium::Job {
   DISALLOW_COPY_AND_ASSIGN(Job);
 };
 
-ProofVerifierChromium::Job::Job(ProofVerifierChromium* proof_verifier,
-                                CertVerifier* cert_verifier,
-                                const BoundNetLog& net_log)
+ProofVerifierChromium::Job::Job(
+    ProofVerifierChromium* proof_verifier,
+    CertVerifier* cert_verifier,
+    TransportSecurityState* transport_security_state,
+    const BoundNetLog& net_log)
     : proof_verifier_(proof_verifier),
       verifier_(new SingleRequestCertVerifier(cert_verifier)),
+      transport_security_state_(transport_security_state),
       next_state_(STATE_NONE),
       net_log_(net_log) {
 }
@@ -222,6 +230,59 @@ int ProofVerifierChromium::Job::DoVerifyCert(int result) {
 int ProofVerifierChromium::Job::DoVerifyCertComplete(int result) {
   verifier_.reset();
 
+#if defined(OFFICIAL_BUILD) && !defined(OS_ANDROID) && !defined(OS_IOS)
+  // TODO(wtc): The following code was copied from ssl_client_socket_nss.cc.
+  // Convert it to a new function that can be called by both files. These
+  // variables simulate the arguments to the new function.
+  const CertVerifyResult& cert_verify_result =
+      verify_details_->cert_verify_result;
+  bool sni_available = true;
+  const std::string& host = hostname_;
+  TransportSecurityState* transport_security_state = transport_security_state_;
+  std::string* pinning_failure_log = &verify_details_->pinning_failure_log;
+
+  // Take care of any mandates for public key pinning.
+  //
+  // Pinning is only enabled for official builds to make sure that others don't
+  // end up with pins that cannot be easily updated.
+  //
+  // TODO(agl): We might have an issue here where a request for foo.example.com
+  // merges into a SPDY connection to www.example.com, and gets a different
+  // certificate.
+
+  // Perform pin validation if, and only if, all these conditions obtain:
+  //
+  // * a TransportSecurityState object is available;
+  // * the server's certificate chain is valid (or suffers from only a minor
+  //   error);
+  // * the server's certificate chain chains up to a known root (i.e. not a
+  //   user-installed trust anchor); and
+  // * the build is recent (very old builds should fail open so that users
+  //   have some chance to recover).
+  //
+  const CertStatus cert_status = cert_verify_result.cert_status;
+  if (transport_security_state &&
+      (result == OK ||
+       (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) &&
+      cert_verify_result.is_issued_by_known_root &&
+      TransportSecurityState::IsBuildTimely()) {
+    if (transport_security_state->HasPublicKeyPins(host, sni_available)) {
+      if (!transport_security_state->CheckPublicKeyPins(
+              host,
+              sni_available,
+              cert_verify_result.public_key_hashes,
+              pinning_failure_log)) {
+        LOG(ERROR) << *pinning_failure_log;
+        result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
+        UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", false);
+        TransportSecurityState::ReportUMAOnPinFailure(host);
+      } else {
+        UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", true);
+      }
+    }
+  }
+#endif
+
   if (result <= ERR_FAILED) {
     error_details_ = StringPrintf("Failed to verify certificate chain: %s",
                                   ErrorToString(result));
@@ -310,8 +371,12 @@ bool ProofVerifierChromium::Job::VerifySignature(const string& signed_data,
   return true;
 }
 
-ProofVerifierChromium::ProofVerifierChromium(CertVerifier* cert_verifier)
-    : cert_verifier_(cert_verifier) {}
+ProofVerifierChromium::ProofVerifierChromium(
+    CertVerifier* cert_verifier,
+    TransportSecurityState* transport_security_state)
+    : cert_verifier_(cert_verifier),
+      transport_security_state_(transport_security_state) {
+}
 
 ProofVerifierChromium::~ProofVerifierChromium() {
   STLDeleteElements(&active_jobs_);
@@ -332,7 +397,10 @@ QuicAsyncStatus ProofVerifierChromium::VerifyProof(
   }
   const ProofVerifyContextChromium* chromium_context =
       reinterpret_cast<const ProofVerifyContextChromium*>(verify_context);
-  scoped_ptr<Job> job(new Job(this, cert_verifier_, chromium_context->net_log));
+  scoped_ptr<Job> job(new Job(this,
+                              cert_verifier_,
+                              transport_security_state_,
+                              chromium_context->net_log));
   QuicAsyncStatus status = job->VerifyProof(hostname, server_config, certs,
                                             signature, error_details,
                                             verify_details, callback);
index 6f8a231..46632fb 100644 (file)
@@ -22,12 +22,18 @@ namespace net {
 
 class CertVerifier;
 class SingleRequestCertVerifier;
+class TransportSecurityState;
 
 // ProofVerifyDetailsChromium is the implementation-specific information that a
 // ProofVerifierChromium returns about a certificate verification.
 struct ProofVerifyDetailsChromium : public ProofVerifyDetails {
  public:
   CertVerifyResult cert_verify_result;
+
+  // pinning_failure_log contains a message produced by
+  // TransportSecurityState::DomainState::CheckPublicKeyPins in the event of a
+  // pinning failure. It is a (somewhat) human-readable string.
+  std::string pinning_failure_log;
 };
 
 // ProofVerifyContextChromium is the implementation-specific information that a
@@ -44,7 +50,8 @@ struct ProofVerifyContextChromium : public ProofVerifyContext {
 // capable of handling multiple simultaneous requests.
 class NET_EXPORT_PRIVATE ProofVerifierChromium : public ProofVerifier {
  public:
-  explicit ProofVerifierChromium(CertVerifier* cert_verifier);
+  ProofVerifierChromium(CertVerifier* cert_verifier,
+                        TransportSecurityState* transport_security_state);
   virtual ~ProofVerifierChromium();
 
   // ProofVerifier interface
@@ -70,6 +77,8 @@ class NET_EXPORT_PRIVATE ProofVerifierChromium : public ProofVerifier {
   // Underlying verifier used to verify certificates.
   CertVerifier* const cert_verifier_;
 
+  TransportSecurityState* transport_security_state_;
+
   DISALLOW_COPY_AND_ASSIGN(ProofVerifierChromium);
 };
 
index 24b6db2..40b22cd 100644 (file)
@@ -427,6 +427,7 @@ bool QuicClientSession::GetSSLInfo(SSLInfo* ssl_info) const {
   ssl_info->channel_id_sent = false;
   ssl_info->security_bits = security_bits;
   ssl_info->handshake_type = SSLInfo::HANDSHAKE_FULL;
+  ssl_info->pinning_failure_log = pinning_failure_log_;
   return true;
 }
 
@@ -483,13 +484,20 @@ bool QuicClientSession::CanPool(const std::string& hostname) const {
   // logic will need to be revised.
   DCHECK(connection()->connected());
   SSLInfo ssl_info;
-  bool unused = false;
   if (!GetSSLInfo(&ssl_info) || !ssl_info.cert) {
     // We can always pool with insecure QUIC sessions.
     return true;
   }
+
+  // Disable pooling for secure sessions.
+  // TODO(rch): re-enable this.
+  return false;
+
+#if 0
+  bool unused = false;
   // Only pool secure QUIC sessions if the cert matches the new hostname.
   return ssl_info.cert->VerifyNameMatch(hostname, &unused);
+#endif
 }
 
 QuicDataStream* QuicClientSession::CreateIncomingDataStream(
@@ -647,12 +655,12 @@ void QuicClientSession::OnProofValid(
 
 void QuicClientSession::OnProofVerifyDetailsAvailable(
     const ProofVerifyDetails& verify_details) {
-  const CertVerifyResult* cert_verify_result_other =
-      &(reinterpret_cast<const ProofVerifyDetailsChromium*>(
-          &verify_details))->cert_verify_result;
+  const ProofVerifyDetailsChromium* verify_details_chromium =
+      reinterpret_cast<const ProofVerifyDetailsChromium*>(&verify_details);
   CertVerifyResult* result_copy = new CertVerifyResult;
-  result_copy->CopyFrom(*cert_verify_result_other);
+  result_copy->CopyFrom(verify_details_chromium->cert_verify_result);
   cert_verify_result_.reset(result_copy);
+  pinning_failure_log_ = verify_details_chromium->pinning_failure_log;
 }
 
 void QuicClientSession::StartReading() {
index 7fbe3db..29281b0 100644 (file)
@@ -227,6 +227,7 @@ class NET_EXPORT_PRIVATE QuicClientSession : public QuicClientSessionBase {
   scoped_refptr<IOBufferWithSize> read_buffer_;
   scoped_ptr<QuicServerInfo> server_info_;
   scoped_ptr<CertVerifyResult> cert_verify_result_;
+  std::string pinning_failure_log_;
   ObserverSet observers_;
   StreamRequestQueue stream_requests_;
   bool read_pending_;
index 2fc1b9e..5462d2a 100644 (file)
@@ -450,6 +450,7 @@ QuicStreamFactory::QuicStreamFactory(
     ClientSocketFactory* client_socket_factory,
     base::WeakPtr<HttpServerProperties> http_server_properties,
     CertVerifier* cert_verifier,
+    TransportSecurityState* transport_security_state,
     QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
     QuicRandom* random_generator,
     QuicClock* clock,
@@ -479,7 +480,8 @@ QuicStreamFactory::QuicStreamFactory(
   crypto_config_.set_user_agent_id(user_agent_id);
   crypto_config_.AddCanonicalSuffix(".c.youtube.com");
   crypto_config_.AddCanonicalSuffix(".googlevideo.com");
-  crypto_config_.SetProofVerifier(new ProofVerifierChromium(cert_verifier));
+  crypto_config_.SetProofVerifier(
+      new ProofVerifierChromium(cert_verifier, transport_security_state));
   base::CPU cpu;
   if (cpu.has_aesni() && cpu.has_avx())
     crypto_config_.PreferAesGcm();
index eb82659..b0280e2 100644 (file)
@@ -38,6 +38,7 @@ class QuicRandom;
 class QuicServerInfoFactory;
 class QuicServerId;
 class QuicStreamFactory;
+class TransportSecurityState;
 
 namespace test {
 class QuicStreamFactoryPeer;
@@ -91,6 +92,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
       ClientSocketFactory* client_socket_factory,
       base::WeakPtr<HttpServerProperties> http_server_properties,
       CertVerifier* cert_verifier,
+      TransportSecurityState* transport_security_state,
       QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
       QuicRandom* random_generator,
       QuicClock* clock,
index f50c387..ff8e4ce 100644 (file)
@@ -12,6 +12,7 @@
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
 #include "net/http/http_util.h"
+#include "net/http/transport_security_state.h"
 #include "net/quic/crypto/crypto_handshake.h"
 #include "net/quic/crypto/proof_verifier_chromium.h"
 #include "net/quic/crypto/quic_decrypter.h"
@@ -91,6 +92,7 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
         cert_verifier_(CertVerifier::CreateDefault()),
         factory_(&host_resolver_, &socket_factory_,
                  base::WeakPtr<HttpServerProperties>(), cert_verifier_.get(),
+                 &transport_security_state_,
                  &crypto_client_stream_factory_, &random_generator_, clock_,
                  kDefaultMaxPacketSize, std::string(),
                  SupportedVersions(GetParam()), true, true, true),
@@ -181,6 +183,7 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
   QuicTestPacketMaker maker_;
   MockClock* clock_;  // Owned by factory_.
   scoped_ptr<CertVerifier> cert_verifier_;
+  TransportSecurityState transport_security_state_;
   QuicStreamFactory factory_;
   HostPortPair host_port_pair_;
   bool is_https_;
@@ -350,7 +353,8 @@ TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
   EXPECT_TRUE(socket_data2.at_write_eof());
 }
 
-TEST_P(QuicStreamFactoryTest, Pooling) {
+// TODO(rch): re-enable this.
+TEST_P(QuicStreamFactoryTest, DISABLED_Pooling) {
   MockRead reads[] = {
     MockRead(ASYNC, OK, 0)  // EOF
   };
@@ -466,7 +470,8 @@ TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
   EXPECT_TRUE(socket_data2.at_write_eof());
 }
 
-TEST_P(QuicStreamFactoryTest, HttpsPooling) {
+// TODO(rch): re-enable this.
+TEST_P(QuicStreamFactoryTest, DISABLED_HttpsPooling) {
   MockRead reads[] = {
     MockRead(ASYNC, OK, 0)  // EOF
   };
index 9deee83..a3c85fb 100644 (file)
@@ -10,6 +10,7 @@
 #include "net/cert/cert_verifier.h"
 #include "net/cert/test_root_certs.h"
 #include "net/cert/x509_certificate.h"
+#include "net/http/transport_security_state.h"
 #include "net/quic/crypto/proof_source_chromium.h"
 #include "net/quic/crypto/proof_verifier_chromium.h"
 #include "net/test/cert_test_util.h"
@@ -21,9 +22,11 @@ namespace test {
 class TestProofVerifierChromium : public ProofVerifierChromium {
  public:
   TestProofVerifierChromium(CertVerifier* cert_verifier,
+                            TransportSecurityState* transport_security_state,
                             const std::string& cert_file)
-      : ProofVerifierChromium(cert_verifier),
-        cert_verifier_(cert_verifier) {
+      : ProofVerifierChromium(cert_verifier, transport_security_state),
+        cert_verifier_(cert_verifier),
+        transport_security_state_(transport_security_state) {
     // Load and install the root for the validated chain.
     scoped_refptr<X509Certificate> root_cert =
         ImportCertFromFile(GetTestCertsDirectory(), cert_file);
@@ -34,6 +37,7 @@ class TestProofVerifierChromium : public ProofVerifierChromium {
  private:
   ScopedTestRoot scoped_root_;
   scoped_ptr<CertVerifier> cert_verifier_;
+  scoped_ptr<TransportSecurityState> transport_security_state_;
 };
 
 // static
@@ -43,8 +47,10 @@ ProofSource* CryptoTestUtils::ProofSourceForTesting() {
 
 // static
 ProofVerifier* CryptoTestUtils::ProofVerifierForTesting() {
-  TestProofVerifierChromium* proof_verifier = new TestProofVerifierChromium(
-      CertVerifier::CreateDefault(), "quic_root.crt");
+  TestProofVerifierChromium* proof_verifier =
+      new TestProofVerifierChromium(CertVerifier::CreateDefault(),
+                                    new TransportSecurityState,
+                                    "quic_root.crt");
   return proof_verifier;
 }
 
index e71d0b2..6ae07ed 100644 (file)
@@ -798,7 +798,8 @@ TEST_P(SSLClientSocketPoolTest, NeedProxyAuth) {
   EXPECT_FALSE(tunnel_handle->socket()->IsConnected());
 }
 
-TEST_P(SSLClientSocketPoolTest, IPPooling) {
+// TODO(rch): re-enable this.
+TEST_P(SSLClientSocketPoolTest, DISABLED_IPPooling) {
   const int kTestPort = 80;
   struct TestHosts {
     std::string name;
index 7561145..0310564 100644 (file)
@@ -711,6 +711,10 @@ bool SpdySession::VerifyDomainAuthentication(const std::string& domain) {
   if (!GetSSLInfo(&ssl_info, &was_npn_negotiated, &protocol_negotiated))
     return true;   // This is not a secure session, so all domains are okay.
 
+  // Disable pooling for secure sessions.
+  // TODO(rch): re-enable this.
+  return false;
+#if 0
   bool unused = false;
   return
       !ssl_info.client_cert_sent &&
@@ -718,6 +722,7 @@ bool SpdySession::VerifyDomainAuthentication(const std::string& domain) {
        (ServerBoundCertService::GetDomainForHost(domain) ==
         ServerBoundCertService::GetDomainForHost(host_port_pair().host()))) &&
       ssl_info.cert->VerifyNameMatch(domain, &unused);
+#endif
 }
 
 int SpdySession::GetPushStream(
index 12fad91..7145fc8 100644 (file)
@@ -2310,7 +2310,7 @@ TEST_P(SpdySessionTest, CloseActivatedStreamThatClosesSession) {
   EXPECT_TRUE(session == NULL);
 }
 
-TEST_P(SpdySessionTest, VerifyDomainAuthentication) {
+TEST_P(SpdySessionTest, DISABLED_VerifyDomainAuthentication) {
   session_deps_.host_resolver->set_synchronous_mode(true);
 
   MockConnect connect_data(SYNCHRONOUS, OK);
@@ -2352,7 +2352,8 @@ TEST_P(SpdySessionTest, VerifyDomainAuthentication) {
   EXPECT_FALSE(session->VerifyDomainAuthentication("mail.google.com"));
 }
 
-TEST_P(SpdySessionTest, ConnectionPooledWithTlsChannelId) {
+// TODO(rch): re-enable this.
+TEST_P(SpdySessionTest, DISABLED_ConnectionPooledWithTlsChannelId) {
   session_deps_.host_resolver->set_synchronous_mode(true);
 
   MockConnect connect_data(SYNCHRONOUS, OK);
index 09b89de..0b60960 100644 (file)
@@ -1,3 +1,4 @@
+Alexis Menard <alexis.menard@intel.com>
 Daniel Narvaez <dwnarvaez@gmail.com>
 Dongseong Hwang <dongseong.hwang@intel.com>
 Eduardo Lima (Etrunko) <eduardo.lima@intel.com>
index 7e7b580..09d8faa 100644 (file)
@@ -657,6 +657,10 @@ bool DesktopWindowTreeHostWayland::IsAnimatingClosed() const {
   return false;
 }
 
+bool DesktopWindowTreeHostWayland::IsTranslucentWindowOpacitySupported() const {
+  return false;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHostWayland, aura::WindowTreeHost implementation:
 
index b938024..7f3c683 100644 (file)
@@ -132,6 +132,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostWayland
   virtual void OnNativeWidgetFocus() OVERRIDE;
   virtual void OnNativeWidgetBlur() OVERRIDE;
   virtual bool IsAnimatingClosed() const OVERRIDE;
+  virtual bool IsTranslucentWindowOpacitySupported() const OVERRIDE;
 
   // Overridden from aura::WindowTreeHost:
   virtual ui::EventSource* GetEventSource() OVERRIDE;
index 88270dc..0976de9 100644 (file)
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/logging.h"
+#include "base/numerics/safe_math.h"
 
 namespace chrome_pdf {
 
@@ -152,11 +153,11 @@ void CopyImage(const pp::ImageData& src, const pp::Rect& src_rc,
   if (stretch) {
     double x_ratio = static_cast<double>(src_rc.width()) / dest_rc.width();
     double y_ratio = static_cast<double>(src_rc.height()) / dest_rc.height();
-    int height = dest_rc.height();
-    int width = dest_rc.width();
-    for (int y = 0; y < height; y++) {
+    int32_t height = dest_rc.height();
+    int32_t width = dest_rc.width();
+    for (int32_t y = 0; y < height; ++y) {
       uint32_t* dest_pixel = dest_origin_pixel;
-      for (int x = 0; x < width; x++) {
+      for (int32_t x = 0; x < width; ++x) {
         uint32 src_x = static_cast<uint32>(x * x_ratio);
         uint32 src_y = static_cast<uint32>(y * y_ratio);
         const uint32_t* src_pixel = src.GetAddr32(
@@ -168,10 +169,11 @@ void CopyImage(const pp::ImageData& src, const pp::Rect& src_rc,
           reinterpret_cast<char*>(dest_origin_pixel) + dest->stride());
     }
   } else {
-    int height = src_rc.height();
-    int width_bytes = src_rc.width() * 4;
-    for (int y = 0; y < height; y++) {
-      memcpy(dest_origin_pixel, src_origin_pixel, width_bytes);
+    int32_t height = src_rc.height();
+    base::CheckedNumeric<int32_t> width_bytes = src_rc.width();
+    width_bytes *= 4;
+    for (int32_t y = 0; y < height; ++y) {
+      memcpy(dest_origin_pixel, src_origin_pixel, width_bytes.ValueOrDie());
       src_origin_pixel = reinterpret_cast<const uint32_t*>(
           reinterpret_cast<const char*>(src_origin_pixel) + src.stride());
       dest_origin_pixel = reinterpret_cast<uint32_t*>(
index a17db57..8cd41df 100644 (file)
@@ -349,6 +349,10 @@ bool Instance::Init(uint32_t argc, const char* argn[], const char* argv[]) {
     // For PDFs embedded in a frame, we don't get the data automatically like we
     // do for full-frame loads.  Start loading the data manually.
     LoadUrl(url);
+  } else {
+    DCHECK(!did_call_start_loading_);
+    pp::PDF::DidStartLoading(this);
+    did_call_start_loading_ = true;
   }
 
   ZoomLimitsChanged(kMinZoom, kMaxZoom);
@@ -954,11 +958,6 @@ void Instance::PaintIfWidgetIntersects(
   DCHECK(!image_data_.is_null());
   widget->Paint(location_dip, &image_data_);
 
-  // Re-scale the rectangle from DIPs to device pixels, so we ensure that we
-  // don't miss any pixels due to rounding outwards in ScaleRect.
-  location = location_dip;
-  ScaleRect(device_scale_, &location);
-
   ready->push_back(PaintManager::ReadyRect(location, image_data_, true));
 }
 
index c012dec..860af1c 100644 (file)
@@ -204,6 +204,12 @@ const PDFFontSubstitution PDFFontSubstitutions[] = {
 
 void* MapFont(struct _FPDF_SYSFONTINFO*, int weight, int italic,
               int charset, int pitch_family, const char* face, int* exact) {
+  // Do not attempt to map fonts if pepper is not initialized (for privet local
+  // printing).
+  // TODO(noamsml): Real font substitution (http://crbug.com/391978)
+  if (!pp::Module::Get())
+    return NULL;
+
   pp::BrowserFontDescription description;
 
   // Pretend the system does not have the Symbol font to force a fallback to
index ab38e9f..b450633 100644 (file)
@@ -177,8 +177,8 @@ interface PPB_VideoDecoder {
    * the decoder signals completion by running |callback|. Just before
    * completion, any pending GetPicture() call will complete by running its
    * callback with result PP_ERROR_ABORTED to signal that no more pictures are
-   * available. The plugin should recycle any pictures it is using before
-   * resuming decoding.
+   * available. Any pictures held by the plugin remain valid during and after
+   * the flush and should be recycled back to the decoder.
    *
    * @param[in] video_decoder A <code>PP_Resource</code> identifying the video
    * decoder.
@@ -197,9 +197,10 @@ interface PPB_VideoDecoder {
    * skip to another position in the video stream. After Reset() returns, any
    * pending calls to Decode() and GetPicture()) abort, causing their callbacks
    * to run with PP_ERROR_ABORTED. The plugin should not make further calls to
-   * the decoder until the decoder signals completion by running |callback|.
-   * The pictures in use by the plugin remain valid until decoding is resumed,
-   * but need not be recycled.
+   * the decoder other than RecyclePicture() until the decoder signals
+   * completion by running |callback|. Any pictures held by the plugin remain
+   * valid during and after the reset and should be recycled back to the
+   * decoder.
    *
    * @param[in] video_decoder A <code>PP_Resource</code> identifying the video
    * decoder.
index 721e238..edab7bc 100644 (file)
@@ -3,7 +3,7 @@
  * found in the LICENSE file.
  */
 
-/* From ppb_video_decoder.idl modified Wed May 21 09:50:52 2014. */
+/* From ppb_video_decoder.idl modified Fri Jul 11 18:06:37 2014. */
 
 #ifndef PPAPI_C_PPB_VIDEO_DECODER_H_
 #define PPAPI_C_PPB_VIDEO_DECODER_H_
@@ -180,8 +180,8 @@ struct PPB_VideoDecoder_0_1 { /* dev */
    * the decoder signals completion by running |callback|. Just before
    * completion, any pending GetPicture() call will complete by running its
    * callback with result PP_ERROR_ABORTED to signal that no more pictures are
-   * available. The plugin should recycle any pictures it is using before
-   * resuming decoding.
+   * available. Any pictures held by the plugin remain valid during and after
+   * the flush and should be recycled back to the decoder.
    *
    * @param[in] video_decoder A <code>PP_Resource</code> identifying the video
    * decoder.
@@ -198,9 +198,10 @@ struct PPB_VideoDecoder_0_1 { /* dev */
    * skip to another position in the video stream. After Reset() returns, any
    * pending calls to Decode() and GetPicture()) abort, causing their callbacks
    * to run with PP_ERROR_ABORTED. The plugin should not make further calls to
-   * the decoder until the decoder signals completion by running |callback|.
-   * The pictures in use by the plugin remain valid until decoding is resumed,
-   * but need not be recycled.
+   * the decoder other than RecyclePicture() until the decoder signals
+   * completion by running |callback|. Any pictures held by the plugin remain
+   * valid during and after the reset and should be recycled back to the
+   * decoder.
    *
    * @param[in] video_decoder A <code>PP_Resource</code> identifying the video
    * decoder.
index d1eded3..c3a2a7c 100644 (file)
@@ -149,8 +149,8 @@ class VideoDecoder : public Resource {
   /// the decoder signals completion by running |callback|. Just before
   /// completion, any pending GetPicture() call will complete by running its
   /// callback with result PP_ERROR_ABORTED to signal that no more pictures are
-  /// available. The plugin should recycle any pictures it is using before
-  /// resuming decoding.
+  /// available. Any pictures held by the plugin remain valid during and after
+  /// the flush and should be recycled back to the decoder.
   ///
   /// @param[in] callback A <code>CompletionCallback</code> to be called on
   /// completion.
@@ -163,9 +163,10 @@ class VideoDecoder : public Resource {
   /// skip to another position in the video stream. After Reset() returns, any
   /// pending calls to Decode() and GetPicture()) abort, causing their callbacks
   /// to run with PP_ERROR_ABORTED. The plugin should not make further calls to
-  /// the decoder until the decoder signals completion by running |callback|.
-  /// The pictures in use by the plugin remain valid until decoding is resumed,
-  /// but need not be recycled.
+  /// the decoder other than RecyclePicture() until the decoder signals
+  /// completion by running |callback|. Any pictures held by the plugin remain
+  /// valid during and after the reset and should be recycled back to the
+  /// decoder.
   ///
   /// @param[in] callback A <code>CompletionCallback</code> to be called on
   /// completion.
index 0e0c519..a5dccac 100644 (file)
@@ -425,10 +425,6 @@ bool MyInstance::HandleInputEvent(const pp::InputEvent& event) {
           if (!video_decoders_[i]->resetting())
             video_decoders_[i]->Reset();
         }
-
-        // Clear pending pictures.
-        while (!pending_pictures_.empty())
-          pending_pictures_.pop();
       }
       return true;
     }
index acb5f75..54ccfe7 100644 (file)
@@ -260,8 +260,6 @@ int32_t VideoDecoderResource::GetPicture(
 void VideoDecoderResource::RecyclePicture(const PP_VideoPicture* picture) {
   if (decoder_last_error_)
     return;
-  if (reset_callback_)
-    return;
 
   Post(RENDERER, PpapiHostMsg_VideoDecoder_RecyclePicture(picture->texture_id));
 }
@@ -471,9 +469,12 @@ void VideoDecoderResource::OnPluginMsgResetComplete(
     const ResourceMessageReplyParams& params) {
   // All shm buffers should have been made available by now.
   DCHECK_EQ(shm_buffers_.size(), available_shm_buffers_.size());
-  // Received pictures are no longer valid.
-  while (!received_pictures_.empty())
+  // Recycle any pictures which haven't been passed to the plugin.
+  while (!received_pictures_.empty()) {
+    Post(RENDERER, PpapiHostMsg_VideoDecoder_RecyclePicture(
+        received_pictures_.front().texture_id));
     received_pictures_.pop();
+  }
 
   scoped_refptr<TrackedCallback> callback;
   callback.swap(reset_callback_);
index 5f2af0a..62ef738 100644 (file)
@@ -28,7 +28,7 @@
                 <category android:name="android.intent.category.DEFAULT"/>
                 <category android:name="android.intent.category.BROWSABLE"/>
                 <data android:scheme="{{ APK_PACKAGE_NAME }}"/>
-                <data android:host="oauthredirect"/>
+                <data android:path="/oauthredirect/"/>
             </intent-filter>
         </activity>
         <activity android:name="org.chromium.chromoting.Desktop"
index 8868d5a..d301c09 100644 (file)
@@ -183,6 +183,13 @@ public class Desktop extends Activity implements View.OnSystemUiVisibilityChange
      */
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
+        int keyCode = event.getKeyCode();
+
+        // Dispatch the back button to the system to handle navigation
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            return super.dispatchKeyEvent(event);
+        }
+
         // Send TextEvent in two cases:
         //   1. This is an ACTION_MULTIPLE event.
         //   2. The event was generated by on-screen keyboard and Ctrl, Alt and
@@ -192,10 +199,9 @@ public class Desktop extends Activity implements View.OnSystemUiVisibilityChange
         // acts as if it is connected to the remote host.
         if (event.getAction() == KeyEvent.ACTION_MULTIPLE) {
             JniInterface.sendTextEvent(event.getCharacters());
-            return super.dispatchKeyEvent(event);
+            return true;
         }
 
-        int keyCode = event.getKeyCode();
         boolean pressed = event.getAction() == KeyEvent.ACTION_DOWN;
 
         // For Enter getUnicodeChar() returns 10 (line feed), but we still
index ab593b8..ac195cf 100644 (file)
@@ -16,13 +16,12 @@ import android.util.Log;
 
 import java.security.SecureRandom;
 import java.util.ArrayList;
-import java.util.HashMap;
 
 /**
  * This class is responsible for fetching a third party token from the user using the OAuth2
- * implicit flow.  It pops up a third party login page located at |tokenurl|.  It relies on the
- * |ThirdPartyTokenFetcher$OAuthRedirectActivity| to intercept the access token from the redirect at
- * |REDIRECT_URI_SCHEME|://|REDIRECT_URI_HOST| upon successful login.
+ * implicit flow.  It directs the user to a third party login page located at |tokenUrl|.  It relies
+ * on the |ThirdPartyTokenFetcher$OAuthRedirectActivity| to intercept the access token from the
+ * redirect at intent://|REDIRECT_URI_PATH|#Intent;...end; upon successful login.
  */
 public class ThirdPartyTokenFetcher {
     /** Callback for receiving the token. */
@@ -30,8 +29,8 @@ public class ThirdPartyTokenFetcher {
         void onTokenFetched(String code, String accessToken);
     }
 
-    /** Redirect URI. See http://tools.ietf.org/html/rfc6749#section-3.1.2. */
-    private static final String REDIRECT_URI_HOST = "oauthredirect";
+    /** The path of the Redirect URI. */
+    private static final String REDIRECT_URI_PATH = "/oauthredirect/";
 
     /**
      * Request both the authorization code and access token from the server.  See
@@ -71,7 +70,14 @@ public class ThirdPartyTokenFetcher {
         this.mTokenUrlPatterns = tokenUrlPatterns;
 
         this.mRedirectUriScheme = context.getApplicationContext().getPackageName();
-        this.mRedirectUri = mRedirectUriScheme + "://" + REDIRECT_URI_HOST;
+
+        // We don't follow the OAuth spec (http://tools.ietf.org/html/rfc6749#section-3.1.2) of the
+        // redirect URI as it is possible for the other applications to intercept the redirect URI.
+        // Instead, we use the intent scheme URI, which can restrict a specific package to handle
+        // the intent.  See https://developer.chrome.com/multidevice/android/intents.
+        this.mRedirectUri = "intent://" + REDIRECT_URI_PATH + "#Intent;" +
+            "package=" + mRedirectUriScheme + ";" +
+            "scheme=" + mRedirectUriScheme + ";end;";
     }
 
     /**
@@ -130,7 +136,7 @@ public class ThirdPartyTokenFetcher {
         if (data != null) {
             return Intent.ACTION_VIEW.equals(action) &&
                    this.mRedirectUriScheme.equals(data.getScheme()) &&
-                   REDIRECT_URI_HOST.equals(data.getHost());
+                   REDIRECT_URI_PATH.equals(data.getPath());
         }
         return false;
     }
@@ -143,12 +149,9 @@ public class ThirdPartyTokenFetcher {
             return false;
         }
 
-        Uri data = intent.getData();
-        HashMap<String, String> params = getFragmentParameters(data);
-
-        String accessToken = params.get("access_token");
-        String code = params.get("code");
-        String state = params.get("state");
+        String accessToken = intent.getStringExtra("access_token");
+        String code = intent.getStringExtra("code");
+        String state = intent.getStringExtra("state");
 
         if (!mState.equals(state)) {
             failFetchToken("Ignoring redirect with invalid state.");
@@ -183,29 +186,9 @@ public class ThirdPartyTokenFetcher {
         return Base64.encodeToString(bytes, Base64.URL_SAFE | Base64.NO_WRAP | Base64.NO_PADDING);
     }
 
-    /** Parses the fragment string into a key value pair. */
-    private static HashMap<String, String> getFragmentParameters(Uri uri) {
-        assert uri != null;
-        HashMap<String, String> result = new HashMap<String, String>();
-
-        String fragment = uri.getFragment();
-
-        if (fragment != null) {
-            String[] parts = fragment.split("&");
-
-            for (String part : parts) {
-                String keyValuePair[] = part.split("=", 2);
-                if (keyValuePair.length == 2) {
-                    result.put(keyValuePair[0], keyValuePair[1]);
-                }
-            }
-        }
-        return result;
-    };
-
     /**
      * In the OAuth2 implicit flow, the browser will be redirected to
-     * |REDIRECT_URI_SCHEME|://|REDIRECT_URI_HOST| upon a successful login. OAuthRedirectActivity
+     * intent://|REDIRECT_URI_PATH|#Intent;...end; upon a successful login. OAuthRedirectActivity
      * uses an intent filter in the manifest to intercept the URL and launch the chromoting app.
      *
      * Unfortunately, most browsers on Android, e.g. chrome, reload the URL when a browser
index 32aaa4b..bc9a5ef 100644 (file)
@@ -77,6 +77,8 @@ ChromotingJniInstance::ChromotingJniInstance(ChromotingJniRuntime* jni_runtime,
       protocol::AuthenticationMethod::FromString("spake2_hmac"));
   client_config_.authentication_methods.push_back(
       protocol::AuthenticationMethod::FromString("spake2_plain"));
+  client_config_.authentication_methods.push_back(
+      protocol::AuthenticationMethod::FromString("third_party"));
 
   // Post a task to start connection
   jni_runtime_->display_task_runner()->PostTask(
index 47d60fa..3571924 100644 (file)
               },
               'mac_bundle_resources': [
                 '<(PRODUCT_DIR)/icudtl.dat',
+                'host/disconnect_window.xib',
                 'host/it2me/remote_assistance_host-Info.plist',
                 '<!@pymod_do_main(remoting_copy_locales -o -p <(OS) -x <(PRODUCT_DIR) <(remoting_locales))',
 
index ccf3747..ebe566c 100644 (file)
@@ -107,7 +107,7 @@ Informationen zum Datenschutz finden Sie in der Google-Datenschutzerklärung (ht
 <translation id="7401733114166276557">Chrome Remote Desktop</translation>
 <translation id="3362124771485993931">PIN erneut eingeben</translation>
 <translation id="154040539590487450">Fehler beim Starten des Remote-Zugriffsdienstes</translation>
-<translation id="7948001860594368197">Bildschirmoptionen</translation>
+<translation id="7948001860594368197">Optionen</translation>
 <translation id="8172070902751707422">Fehler bei der Authentifizierung. Melden Sie sich erneut in Chrome Remote Desktop an.</translation>
 <translation id="6146986332407778716">Strg-Alt-Entf</translation>
 <translation id="5254120496627797685">Wenn Sie diese Seite verlassen, wird Ihre Chrome Remote Desktop-Sitzung beendet.</translation>
@@ -142,7 +142,7 @@ Informationen zum Datenschutz finden Sie in der Google-Datenschutzerklärung (ht
 <translation id="2366718077645204424">Die Verbindung zum Host kann nicht hergestellt werden. Das von Ihnen verwendete Netzwerk ist möglicherweise nicht korrekt konfiguriert.</translation>
 <translation id="3776024066357219166">Ihre Chrome Remote Desktop-Sitzung wurde beendet.</translation>
 <translation id="5625493749705183369">Greifen Sie sicher über das Internet auf andere Computer zu oder gewähren Sie anderen Nutzern Zugriff auf Ihren Computer.</translation>
-<translation id="2512228156274966424">HINWEIS: Sie können in Chrome Remote Desktop die Option zum Öffnen als Fenster einstellen, damit alle Tastaturkürzel verfügbar sind.</translation>
+<translation id="2512228156274966424">HINWEIS: Sie können in Chrome Remote Desktop die Option zum Öffnen als Fenster einstellen, damit alle Tastenkombinationen verfügbar sind.</translation>
 <translation id="2699970397166997657">Chromoting</translation>
 <translation id="4812684235631257312">Host</translation>
 <translation id="6178645564515549384">Nativer Nachrichtenhost für Remoteunterstützung</translation>
@@ -178,7 +178,7 @@ Informationen zum Datenschutz finden Sie in der Google-Datenschutzerklärung (ht
 <translation id="310979712355504754">Alle löschen</translation>
 <translation id="7649070708921625228">Hilfe</translation>
 <translation id="3581045510967524389">Es konnte keine Verbindung zum Netzwerk hergestellt werden. Überprüfen Sie, ob Ihr Gerät online ist.</translation>
-<translation id="4517233780764084060">Hinweis: Sie können in Chromoting die Option zum Öffnen als Fenster einstellen, damit alle Tastaturkürzel verfügbar sind.</translation>
+<translation id="4517233780764084060">Hinweis: Sie können in Chromoting die Option zum Öffnen als Fenster einstellen, damit alle Tastenkombinationen verfügbar sind.</translation>
 <translation id="4176825807642096119">Zugriffscode</translation>
 <translation id="7144878232160441200">Wiederholen</translation>
 <translation id="4573676252416618192">Chrome Remote
index 4ea8f6d..c9b0558 100644 (file)
 <translation id="7319983568955948908">साझाकरण रोकें</translation>
 <translation id="6681800064886881394">कॉपीराइट 2013 Google Inc. सर्वाधिकार सुरक्षित.</translation>
 <translation id="6668065415969892472">आपका पिन अपडेट कर दिया गया है.</translation>
-<translation id="4513946894732546136">à¥\9eà¥\80डबà¥\88à¤\95</translation>
+<translation id="4513946894732546136">सà¥\81à¤\9dाव</translation>
 <translation id="4277736576214464567">पहुंच कोड अमान्य है. कृपया पुनः प्रयास करें.</translation>
 <translation id="979100198331752041"><ph name="HOSTNAME"/> पर Chrome दूरस्थ डेस्कटॉप पुराना हो गया है और इसे अपडेट किया जाना आवश्यक है.</translation>
 <translation id="7729639150174291243">आप Chrome दूरस्थ डेस्कटॉप में प्रवेश नहीं हैं. कृपया प्रवेश करें और पुनः प्रयास करें.</translation>
index 4a7fa94..0331a5b 100644 (file)
@@ -39,7 +39,7 @@ Chromoting</translation>
 <translation id="8864965950780407789">Untuk menggunakan Chromoting, Anda harus memberikan izin akses yang diperpanjang ke komputer. Anda hanya perlu melakukan ini satu kali.</translation>
 <translation id="3197730452537982411">Desktop Jarak Jauh</translation>
 <translation id="8355326866731426344">Kode akses ini akan kedaluwarsa dalam waktu <ph name="TIMEOUT"/></translation>
-<translation id="985602178874221306">Penulis Chromium</translation>
+<translation id="985602178874221306">Pengarang Chromium</translation>
 <translation id="2498359688066513246">Bantuan &amp; masukan</translation>
 <translation id="6198252989419008588">Ubah PIN</translation>
 <translation id="170207782578677537">Gagal mendaftarkan komputer ini.</translation>
@@ -171,7 +171,7 @@ Untuk informasi tentang privasi, lihat Kebijakan Privasi Google (http://goo.gl/S
 <translation id="8445362773033888690">Lihat di Google Play Store</translation>
 <translation id="8246880134154544773">Autentikasi gagal. Masuk ke Chromoting lagi.</translation>
 <translation id="1654128982815600832">Mengaktifkan sambungan jarak jauh untuk komputer ini...</translation>
-<translation id="8187079423890319756">Hak Cipta 2013 Penulis Chromium. Semua Hak Dilindungi Undang-Undang.</translation>
+<translation id="8187079423890319756">Hak Cipta 2013 Pengarang Chromium. Semua Hak Dilindungi Undang-Undang.</translation>
 <translation id="7038683108611689168">Bantu kami meningkatkan Chromoting dengan mengizinkan kami mengumpulkan statistik penggunaan dan laporan kerusakan.</translation>
 <translation id="6040143037577758943">Tutup</translation>
 <translation id="4405930547258349619">Pustaka Inti</translation>
index 2090972..1258864 100644 (file)
@@ -11,7 +11,7 @@ Chromoting</translation>
 <translation id="4068946408131579958">Toate conexiunile</translation>
 <translation id="2208514473086078157">Setările politicii nu acceptă permiterea accesului la acest computer în calitate de gazdă pentru Desktop la distanță Chrome. Contactați administratorul de sistem pentru asistență.</translation>
 <translation id="2801119484858626560">A fost detectată o versiune incompatibilă a aplicației Desktop la distanță Chrome. Asigurați-vă că aveți cea mai recentă versiune Chrome și Desktop la distanță Chrome pe ambele computere și încercați din nou.</translation>
-<translation id="6998989275928107238">Către</translation>
+<translation id="6998989275928107238">La</translation>
 <translation id="406849768426631008">Doriți să ajutați pe cineva, iar în același timp să și discutați pe chatul video? Încercați <ph name="LINK_BEGIN"/>Control desktop la distanță din Google Hangouts<ph name="LINK_END"/>.</translation>
 <translation id="906458777597946297">Maximizați fereastra</translation>
 <translation id="5397086374758643919">Program de dezinstalare a gazdei pentru Desktop la distanță Chrome</translation>
@@ -27,7 +27,7 @@ Chromoting</translation>
 <translation id="332624996707057614">Modificați numele computerului</translation>
 <translation id="1996161829609978754">Chrome descarcă programul de instalare a gazdei pentru Chromoting. După ce se descarcă, rulați programul de instalare înainte de a continua.</translation>
 <translation id="2046651113449445291">Următorii clienți au fost împerecheați cu acest computer și se pot conecta fără să indice un PIN. Puteți revoca oricând această permisiune, pentru fiecare client în parte sau pentru toți clienții.</translation>
-<translation id="7658239707568436148">Anulaţi</translation>
+<translation id="7658239707568436148">Anulați</translation>
 <translation id="7782471917492991422">Verificați setările de gestionare a energiei pentru computerul dvs. și asigurați-vă că nu este configurat să treacă în modul inactiv când este în repaus.</translation>
 <translation id="7665369617277396874">Adăugați un cont</translation>
 <translation id="4939475390270873744">• S-a remediat o blocare la pornire.</translation>
@@ -41,7 +41,7 @@ Chromoting</translation>
 <translation id="8355326866731426344">Acest cod de acces va expira în <ph name="TIMEOUT"/></translation>
 <translation id="985602178874221306">The Chromium Authors</translation>
 <translation id="2498359688066513246">Ajutor și feedback</translation>
-<translation id="6198252989419008588">Schimbați codul PIN</translation>
+<translation id="6198252989419008588">Modificați codul PIN</translation>
 <translation id="170207782578677537">Înregistrarea acestui computer nu a reușit.</translation>
 <translation id="4804818685124855865">Deconectați-vă</translation>
 <translation id="5708869785009007625">În prezent, accesul la desktopul dvs. este permis pentru <ph name="USER"/>.</translation>
@@ -153,7 +153,7 @@ Pentru informații privind confidențialitatea, accesați Politica de confidenț
 <translation id="2359808026110333948">Continuați</translation>
 <translation id="2078880767960296260">Proces gazdă</translation>
 <translation id="1643640058022401035">Părăsind această pagină, veți încheia sesiunea Chromoting.</translation>
-<translation id="8261506727792406068">Ștergeţi</translation>
+<translation id="8261506727792406068">Ștergeți</translation>
 <translation id="2235518894410572517">Permiteți accesul la acest computer altui utilizator, pentru ca acesta să îl poată vedea și controla.</translation>
 <translation id="6939719207673461467">Afișați/Ascundeți tastatura.</translation>
 <translation id="1023096696228309145">Cereți-i utilizatorului al cărui computer doriți să îl accesați să dea clic pe „Permiteți accesul acum” și să vă transmită codul de acces.</translation>
@@ -162,7 +162,7 @@ Pentru informații privind confidențialitatea, accesați Politica de confidenț
 <translation id="4006787130661126000">Trebuie să activați conexiunile la distanță dacă doriți să utilizați Desktop la distanță Chrome pentru a accesa acest computer.</translation>
 <translation id="177096447311351977">IP canal pentru client: <ph name="CLIENT_GAIA_IDENTIFIER"/> ip=„<ph name="CLIENT_IP_ADDRESS_AND_PORT"/>” host_ip=„<ph name="HOST_IP_ADDRESS_AND_PORT"/>” channel=„<ph name="CHANNEL_TYPE"/>” connection=„<ph name="CONNECTION_TYPE"/>”.</translation>
 <translation id="6930242544192836755">Durată</translation>
-<translation id="6527303717912515753">Distribuiți</translation>
+<translation id="6527303717912515753">Trimiteți</translation>
 <translation id="2926340305933667314">Dezactivarea accesului la distanță la acest computer nu a reușit. Încercați din nou mai târziu.</translation>
 <translation id="6865175692670882333">Afișați/Editați</translation>
 <translation id="5859141382851488196">Fereastră nouă...</translation>
index 30031b7..8f5285a 100644 (file)
@@ -84,7 +84,7 @@ Host</translation>
 <translation id="4736223761657662401">ประวัติการเชื่อมต่อ</translation>
 <translation id="5285241842433869526">เรียนรู้วิธีตั้งค่าคอมพิวเตอร์สำหรับการเข้าถึงระยะไกล</translation>
 <translation id="4430915108080446161">กำลังสร้างรหัสการเข้าถึง...</translation>
-<translation id="2013996867038862849">à¹\84à¸\84ลà¹\80อà¹\87à¸\99à¸\95à¹\8cà¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\9aà¸\84ูà¹\88à¸\97ัà¹\89à¸\87หมà¸\94à¸\96ูà¸\81à¸\99ำออà¸\81แล้ว</translation>
+<translation id="2013996867038862849">à¹\84à¸\84ลà¹\80อà¹\87à¸\99à¸\95à¹\8cà¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\88ัà¸\9aà¸\84ูà¹\88à¸\97ัà¹\89à¸\87หมà¸\94à¸\96ูà¸\81ลà¸\9aแล้ว</translation>
 <translation id="8228265668171617545">พบ Chromoting ในเวอร์ชันที่ไม่สามารถทำงานร่วมกัน โปรดตรวจสอบให้แน่ใจว่าคุณมี Chrome และ Chromoting เวอร์ชันล่าสุดในคอมพิวเตอร์ทั้งสองเครื่องและลองอีกครั้ง</translation>
 <translation id="6985691951107243942">คุณแน่ใจหรือไม่ว่าต้องการปิดใช้งานการเชื่อมต่อระยะไกลกับ <ph name="HOSTNAME"/> หากคุณเปลี่ยนใจภายหลัง คุณจะต้องไปที่คอมพิวเตอร์เครื่องนั้นเพื่อเปิดใช้งานการเชื่อมต่ออีกครั้ง</translation>
 <translation id="6944854424004126054">กู้คืนหน้าต่าง</translation>
@@ -175,7 +175,7 @@ Host</translation>
 <translation id="7038683108611689168">ช่วยเราปรับปรุง Chromoting ให้ดีขึ้นด้วยการอนุญาตให้เรารวบรวมสถิติการใช้งานและรายงานข้อขัดข้อง</translation>
 <translation id="6040143037577758943">ปิด</translation>
 <translation id="4405930547258349619">Core Library</translation>
-<translation id="310979712355504754">à¸\99ำออà¸\81ทั้งหมด</translation>
+<translation id="310979712355504754">ลà¸\9aทั้งหมด</translation>
 <translation id="7649070708921625228">ช่วยเหลือ</translation>
 <translation id="3581045510967524389">ไม่สามารถเชื่อมต่อเครือข่าย โปรดตรวจสอบว่าอุปกรณ์ออนไลน์อยู่</translation>
 <translation id="4517233780764084060">หมายเหตุ: เพื่อให้มั่นใจว่าทุกแป้นพิมพ์ลัดพร้อมใช้งาน คุณสามารถกำหนดค่า Chromoting เป็น &quot;เปิดเป็นหน้าต่าง&quot;</translation>
index 121621d..75ff0cb 100644 (file)
@@ -129,6 +129,9 @@ remoting.ClientSession = function(accessCode, fetchPin, fetchThirdPartyToken,
   this.video_ = null;
 
   /** @type {Element} @private */
+  this.container_ = document.getElementById('video-container');
+
+  /** @type {Element} @private */
   this.mouseCursorOverlay_ =
       this.container_.querySelector('.mouse-cursor-overlay');
 
index 3aaaab1..6f6080d 100644 (file)
@@ -94,6 +94,7 @@ remoting.FullscreenAppsV2.prototype.removeListener = function(callback) {
 
 remoting.FullscreenAppsV2.prototype.syncWithMaximize = function(sync) {
   if (sync && chrome.app.window.current().isMaximized()) {
+    chrome.app.window.current().restore();
     this.activate(true);
   }
   this.hookingWindowEvents_ = sync;
@@ -107,11 +108,19 @@ remoting.FullscreenAppsV2.prototype.onFullscreened_ = function() {
 
 remoting.FullscreenAppsV2.prototype.onMaximized_ = function() {
   if (this.hookingWindowEvents_) {
+    chrome.app.window.current().restore();
     this.activate(true);
   }
 };
 
 remoting.FullscreenAppsV2.prototype.onRestored_ = function() {
+  // TODO(jamiewalch): ChromeOS generates a spurious onRestore event if
+  // fullscreen() is called from an onMaximized handler (crbug.com/394819),
+  // so ignore the callback if the window is still full-screen.
+  if (this.isActive()) {
+    return;
+  }
+
   document.body.classList.remove('fullscreen');
   if (this.hookingWindowEvents_) {
     this.activate(false);
index f5990fc..b9cc24c 100644 (file)
@@ -25,6 +25,8 @@ remoting.MediaSourceRenderer = function(videoTag) {
    * processed. A null element indicates that the SourceBuffer can be reset
    * because the following buffer contains a keyframe. */
   this.buffers_ = [];
+
+  this.lastKeyFramePos_ = 0;
 }
 
 /**
@@ -74,14 +76,20 @@ remoting.MediaSourceRenderer.prototype.processPendingData_ = function() {
     while (this.buffers_.length > 0 && !this.sourceBuffer_.updating) {
       var buffer = /** @type {ArrayBuffer} */ this.buffers_.shift();
       if (buffer == null) {
-        // Remove all data from the SourceBuffer. By default Chrome buffers up
-        // 150MB of data in SourceBuffer. We never need to seek the stream, so
-        // it doesn't make sense to keep any of that data.
+        // Remove data from the SourceBuffer from the beginning to the previous
+        // key frame. By default Chrome buffers up to 150MB of data. We never
+        // need to seek the stream, so it doesn't make sense to keep any of that
+        // data.
         if (this.sourceBuffer_.buffered.length > 0) {
-          this.sourceBuffer_.remove(
-              this.sourceBuffer_.buffered.start(0),
-              this.sourceBuffer_.buffered.end(
-                  this.sourceBuffer_.buffered.length - 1));
+          // TODO(sergeyu): Check currentTime to make sure that the current
+          // playback position is not being removed. crbug.com/398290 .
+          if (this.lastKeyFramePos_ > this.sourceBuffer_.buffered.start(0)) {
+            this.sourceBuffer_.remove(this.sourceBuffer_.buffered.start(0),
+                                      this.lastKeyFramePos_);
+          }
+
+          this.lastKeyFramePos_ = this.sourceBuffer_.buffered.end(
+              this.sourceBuffer_.buffered.length - 1);
         }
       } else {
         // TODO(sergeyu): Figure out the way to determine when a frame is
index 6bdf3fb..45dc18e 100644 (file)
@@ -112,7 +112,6 @@ remoting.WindowFrame.prototype.disconnectSession_ = function() {
   // that causes it to get stuck in full-screen mode without this.
   if (chrome.app.window.current().isFullscreen()) {
     chrome.app.window.current().restore();
-    chrome.app.window.current().restore();
   }
   remoting.disconnect();
 };
@@ -130,7 +129,6 @@ remoting.WindowFrame.prototype.maximizeOrRestoreWindow_ = function() {
     // If the app is not full-screen, or went full-screen without first
     // being maximized, then the second restore has no effect.
     chrome.app.window.current().restore();
-    chrome.app.window.current().restore();
   } else if (this.isConnected_) {
     chrome.app.window.current().fullscreen();
   } else {
index be0ffc1..07c6a09 100644 (file)
@@ -78,7 +78,7 @@ void HandleCloserAgent::InitializeHandlesToClose() {
 bool HandleCloserAgent::CloseHandles() {
   DWORD handle_count = UINT_MAX;
   const int kInvalidHandleThreshold = 100;
-  const size_t kHandleOffset = sizeof(HANDLE);
+  const size_t kHandleOffset = 4;  // Handles are always a multiple of 4.
 
   if (!::GetProcessHandleCount(::GetCurrentProcess(), &handle_count))
     return false;
index 9adcf6c..7fa2598 100644 (file)
@@ -73,7 +73,7 @@ SBOX_TESTS_COMMAND int CheckForFileHandles(int argc, wchar_t **argv) {
       // Brute force the handle table to find what we're looking for.
       DWORD handle_count = UINT_MAX;
       const int kInvalidHandleThreshold = 100;
-      const size_t kHandleOffset = sizeof(HANDLE);
+      const size_t kHandleOffset = 4;  // Handles are always a multiple of 4.
       HANDLE handle = NULL;
       int invalid_count = 0;
       base::string16 handle_name;
index 295f79a..3295568 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "sync/internal_api/sync_backup_manager.h"
 
+#include "sync/internal_api/public/read_node.h"
 #include "sync/internal_api/public/write_transaction.h"
 #include "sync/syncable/directory.h"
 #include "sync/syncable/mutable_entry.h"
@@ -37,26 +38,24 @@ void SyncBackupManager::Init(
       ReportUnrecoverableErrorFunction
           report_unrecoverable_error_function,
       CancelationSignal* cancelation_signal) {
-  SyncRollbackManagerBase::Init(database_location, event_handler,
-                                sync_server_and_path, sync_server_port,
-                                use_ssl, post_factory.Pass(),
-                                workers, extensions_activity, change_delegate,
-                                credentials, invalidator_client_id,
-                                restored_key_for_bootstrapping,
-                                restored_keystore_key_for_bootstrapping,
-                                internal_components_factory, encryptor,
-                                unrecoverable_error_handler.Pass(),
-                                report_unrecoverable_error_function,
-                                cancelation_signal);
-
-  GetUserShare()->directory->CollectMetaHandleCounts(
-      &status_.num_entries_by_type,
-      &status_.num_to_delete_entries_by_type);
+  if (SyncRollbackManagerBase::InitInternal(
+          database_location,
+          internal_components_factory,
+          unrecoverable_error_handler.Pass(),
+          report_unrecoverable_error_function)) {
+    GetUserShare()->directory->CollectMetaHandleCounts(
+        &status_.num_entries_by_type, &status_.num_to_delete_entries_by_type);
+
+    HideSyncPreference(PRIORITY_PREFERENCES);
+    HideSyncPreference(PREFERENCES);
+  }
 }
 
 void SyncBackupManager::SaveChanges() {
-  NormalizeEntries();
-  GetUserShare()->directory->SaveChanges();
+  if (initialized()) {
+    NormalizeEntries();
+    GetUserShare()->directory->SaveChanges();
+  }
 }
 
 SyncStatus SyncBackupManager::GetDetailedStatus() const {
@@ -104,7 +103,7 @@ void SyncBackupManager::NormalizeEntries() {
     if (!entry.GetId().ServerKnows())
       entry.PutId(syncable::Id::CreateFromServerId(entry.GetId().value()));
     if (!entry.GetParentId().ServerKnows()) {
-      entry.PutParentId(syncable::Id::CreateFromServerId(
+      entry.PutParentIdPropertyOnly(syncable::Id::CreateFromServerId(
           entry.GetParentId().value()));
     }
     entry.PutBaseVersion(1);
@@ -113,6 +112,34 @@ void SyncBackupManager::NormalizeEntries() {
   unsynced_.clear();
 }
 
+void SyncBackupManager::HideSyncPreference(ModelType type) {
+  WriteTransaction trans(FROM_HERE, GetUserShare());
+  ReadNode pref_root(&trans);
+  if (BaseNode::INIT_OK != pref_root.InitTypeRoot(type))
+    return;
+
+  std::vector<int64> pref_ids;
+  pref_root.GetChildIds(&pref_ids);
+  for (uint32 i = 0; i < pref_ids.size(); ++i) {
+    syncable::MutableEntry entry(trans.GetWrappedWriteTrans(),
+                                 syncable::GET_BY_HANDLE, pref_ids[i]);
+    if (entry.good()) {
+      // HACKY: Set IS_DEL to true to remove entry from parent-children
+      // index so that it's not returned when syncable service asks
+      // for sync data. Syncable service then creates entry for local
+      // model. Then the existing entry is undeleted and set to local value
+      // because it has the same unique client tag.
+      entry.PutIsDel(true);
+      entry.PutIsUnsynced(false);
+
+      // Don't persist on disk so that if backup is aborted before receiving
+      // local preference values, values in sync DB are saved.
+      GetUserShare()->directory->UnmarkDirtyEntry(
+          trans.GetWrappedWriteTrans(), &entry);
+    }
+  }
+}
+
 void SyncBackupManager::RegisterDirectoryTypeDebugInfoObserver(
     syncer::TypeDebugInfoObserver* observer) {}
 
index e6b9ca4..aba58e2 100644 (file)
@@ -61,6 +61,12 @@ class SYNC_EXPORT_PRIVATE SyncBackupManager : public SyncRollbackManagerBase {
   // entries.
   void NormalizeEntries();
 
+  // Manipulate preference nodes so that they'll be overwritten by local
+  // preference values during model association, i.e. local wins instead of
+  // server wins. This is for preventing backup from changing preferences in
+  // case backup DB has hijacked preferences.
+  void HideSyncPreference(ModelType pref_type);
+
   // Handles of unsynced entries caused by local model changes.
   std::set<int64> unsynced_;
 
index 5472c02..c075354 100644 (file)
@@ -5,15 +5,22 @@
 #include "sync/internal_api/sync_backup_manager.h"
 
 #include "base/files/scoped_temp_dir.h"
+#include "base/run_loop.h"
 #include "sync/internal_api/public/read_node.h"
 #include "sync/internal_api/public/read_transaction.h"
+#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
 #include "sync/internal_api/public/test/test_internal_components_factory.h"
 #include "sync/internal_api/public/write_node.h"
 #include "sync/internal_api/public/write_transaction.h"
 #include "sync/syncable/entry.h"
 #include "sync/test/test_directory_backing_store.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::WithArgs;
+
 namespace syncer {
 
 namespace {
@@ -22,16 +29,36 @@ void OnConfigDone(bool success) {
   EXPECT_TRUE(success);
 }
 
-class SyncBackupManagerTest : public testing::Test {
+class SyncBackupManagerTest : public syncer::SyncManager::Observer,
+                              public testing::Test {
+ public:
+  MOCK_METHOD1(OnSyncCycleCompleted,
+               void(const sessions::SyncSessionSnapshot&));
+  MOCK_METHOD1(OnConnectionStatusChange, void(ConnectionStatus));
+  MOCK_METHOD1(OnActionableError, void(const SyncProtocolError&));
+  MOCK_METHOD1(OnMigrationRequested, void(ModelTypeSet));;
+  MOCK_METHOD1(OnProtocolEvent, void(const ProtocolEvent&));
+  MOCK_METHOD4(OnInitializationComplete,
+               void(const WeakHandle<JsBackend>&,
+                    const WeakHandle<DataTypeDebugInfoListener>&,
+                    bool, ModelTypeSet));
+
  protected:
   virtual void SetUp() OVERRIDE {
     CHECK(temp_dir_.CreateUniqueTempDir());
   }
 
-  void InitManager(SyncManager* manager) {
+  void InitManager(SyncManager* manager, StorageOption storage_option) {
+    manager_ = manager;
+    EXPECT_CALL(*this, OnInitializationComplete(_, _, _, _))
+        .WillOnce(WithArgs<2>(Invoke(this,
+                                     &SyncBackupManagerTest::HandleInit)));
+
     TestInternalComponentsFactory factory(InternalComponentsFactory::Switches(),
-                                          STORAGE_ON_DISK);
+                                          storage_option);
+    manager->AddObserver(this);
 
+    base::RunLoop run_loop;
     manager->Init(temp_dir_.path(),
                   MakeWeakHandle(base::WeakPtr<JsEventHandler>()),
                   "", 0, true, scoped_ptr<HttpPostProviderFactory>().Pass(),
@@ -39,13 +66,8 @@ class SyncBackupManagerTest : public testing::Test {
                   NULL, NULL, SyncCredentials(), "", "", "", &factory,
                   NULL, scoped_ptr<UnrecoverableErrorHandler>().Pass(),
                   NULL, NULL);
-    manager->ConfigureSyncer(
-          CONFIGURE_REASON_NEW_CLIENT,
-          ModelTypeSet(PREFERENCES),
-          ModelTypeSet(), ModelTypeSet(), ModelTypeSet(),
-          ModelSafeRoutingInfo(),
-          base::Bind(&OnConfigDone, true),
-          base::Bind(&OnConfigDone, false));
+    loop_.PostTask(FROM_HERE, run_loop.QuitClosure());
+    run_loop.Run();
   }
 
   void CreateEntry(UserShare* user_share, ModelType type,
@@ -59,22 +81,43 @@ class SyncBackupManagerTest : public testing::Test {
               node.InitUniqueByCreation(type, type_root, client_tag));
   }
 
+ private:
+  void ConfigureSyncer() {
+    manager_->ConfigureSyncer(CONFIGURE_REASON_NEW_CLIENT,
+                              ModelTypeSet(SEARCH_ENGINES),
+                              ModelTypeSet(), ModelTypeSet(), ModelTypeSet(),
+                              ModelSafeRoutingInfo(),
+                              base::Bind(&OnConfigDone, true),
+                              base::Bind(&OnConfigDone, false));
+  }
+
+  void HandleInit(bool success) {
+    if (success) {
+      loop_.PostTask(FROM_HERE,
+                     base::Bind(&SyncBackupManagerTest::ConfigureSyncer,
+                                base::Unretained(this)));
+    } else {
+      manager_->ShutdownOnSyncThread();
+    }
+  }
+
   base::ScopedTempDir temp_dir_;
   base::MessageLoop loop_;    // Needed for WeakHandle
+  SyncManager* manager_;
 };
 
 TEST_F(SyncBackupManagerTest, NormalizeAndPersist) {
   scoped_ptr<SyncBackupManager> manager(new SyncBackupManager);
-  InitManager(manager.get());
+  InitManager(manager.get(), STORAGE_ON_DISK);
 
-  CreateEntry(manager->GetUserShare(), PREFERENCES, "test");
+  CreateEntry(manager->GetUserShare(), SEARCH_ENGINES, "test");
 
   {
     // New entry is local and unsynced at first.
     ReadTransaction trans(FROM_HERE, manager->GetUserShare());
     ReadNode pref(&trans);
     EXPECT_EQ(BaseNode::INIT_OK,
-              pref.InitByClientTagLookup(PREFERENCES, "test"));
+              pref.InitByClientTagLookup(SEARCH_ENGINES, "test"));
     EXPECT_FALSE(pref.GetEntry()->GetId().ServerKnows());
     EXPECT_TRUE(pref.GetEntry()->GetIsUnsynced());
   }
@@ -86,7 +129,7 @@ TEST_F(SyncBackupManagerTest, NormalizeAndPersist) {
     ReadTransaction trans(FROM_HERE, manager->GetUserShare());
     ReadNode pref(&trans);
     EXPECT_EQ(BaseNode::INIT_OK,
-              pref.InitByClientTagLookup(PREFERENCES, "test"));
+              pref.InitByClientTagLookup(SEARCH_ENGINES, "test"));
     EXPECT_TRUE(pref.GetEntry()->GetId().ServerKnows());
     EXPECT_FALSE(pref.GetEntry()->GetIsUnsynced());
   }
@@ -94,17 +137,23 @@ TEST_F(SyncBackupManagerTest, NormalizeAndPersist) {
 
   // Reopen db to verify entry is persisted.
   manager.reset(new SyncBackupManager);
-  InitManager(manager.get());
+  InitManager(manager.get(), STORAGE_ON_DISK);
   {
     ReadTransaction trans(FROM_HERE, manager->GetUserShare());
     ReadNode pref(&trans);
     EXPECT_EQ(BaseNode::INIT_OK,
-              pref.InitByClientTagLookup(PREFERENCES, "test"));
+              pref.InitByClientTagLookup(SEARCH_ENGINES, "test"));
     EXPECT_TRUE(pref.GetEntry()->GetId().ServerKnows());
     EXPECT_FALSE(pref.GetEntry()->GetIsUnsynced());
   }
 }
 
+TEST_F(SyncBackupManagerTest, FailToInitialize) {
+  // Test graceful shutdown on initialization failure.
+  scoped_ptr<SyncBackupManager> manager(new SyncBackupManager);
+  InitManager(manager.get(), STORAGE_INVALID);
+}
+
 }  // anonymous namespace
 
 }  // namespace syncer
index 84367b0..c5a6f75 100644 (file)
@@ -41,28 +41,22 @@ void SyncRollbackManager::Init(
       ReportUnrecoverableErrorFunction
           report_unrecoverable_error_function,
       CancelationSignal* cancelation_signal) {
-  SyncRollbackManagerBase::Init(database_location, event_handler,
-                                sync_server_and_path, sync_server_port,
-                                use_ssl, post_factory.Pass(),
-                                workers, extensions_activity, change_delegate,
-                                credentials, invalidator_client_id,
-                                restored_key_for_bootstrapping,
-                                restored_keystore_key_for_bootstrapping,
-                                internal_components_factory, encryptor,
-                                unrecoverable_error_handler.Pass(),
-                                report_unrecoverable_error_function,
-                                cancelation_signal);
-
-  change_delegate_ = change_delegate;
-
-  for (size_t i = 0; i < workers.size(); ++i) {
-    ModelSafeGroup group = workers[i]->GetModelSafeGroup();
-    CHECK(workers_.find(group) == workers_.end());
-    workers_[group] = workers[i];
-  }
+  if (SyncRollbackManagerBase::InitInternal(
+          database_location,
+          internal_components_factory,
+          unrecoverable_error_handler.Pass(),
+          report_unrecoverable_error_function)) {
+    change_delegate_ = change_delegate;
+
+    for (size_t i = 0; i < workers.size(); ++i) {
+      ModelSafeGroup group = workers[i]->GetModelSafeGroup();
+      CHECK(workers_.find(group) == workers_.end());
+      workers_[group] = workers[i];
+    }
 
-  rollback_ready_types_ = GetUserShare()->directory->InitialSyncEndedTypes();
-  rollback_ready_types_.RetainAll(BackupTypes());
+    rollback_ready_types_ = GetUserShare()->directory->InitialSyncEndedTypes();
+    rollback_ready_types_.RetainAll(BackupTypes());
+  }
 }
 
 void SyncRollbackManager::StartSyncingNormally(
index ade0422..338f5af 100644 (file)
@@ -15,8 +15,8 @@
 namespace {
 
 // Permanent bookmark folders as defined in bookmark_model_associator.cc.
+// No mobile bookmarks because they only exists with sync enabled.
 const char kBookmarkBarTag[] = "bookmark_bar";
-const char kMobileBookmarksTag[] = "synced_bookmarks";
 const char kOtherBookmarksTag[] = "other_bookmarks";
 
 class DummyEntryptionHandler : public syncer::SyncEncryptionHandler {
@@ -43,41 +43,29 @@ namespace syncer {
 SyncRollbackManagerBase::SyncRollbackManagerBase()
     : report_unrecoverable_error_function_(NULL),
       weak_ptr_factory_(this),
-      dummy_handler_(new DummyEntryptionHandler) {
+      dummy_handler_(new DummyEntryptionHandler),
+      initialized_(false) {
 }
 
 SyncRollbackManagerBase::~SyncRollbackManagerBase() {
 }
 
-void SyncRollbackManagerBase::Init(
-      const base::FilePath& database_location,
-      const WeakHandle<JsEventHandler>& event_handler,
-      const std::string& sync_server_and_path,
-      int sync_server_port,
-      bool use_ssl,
-      scoped_ptr<HttpPostProviderFactory> post_factory,
-      const std::vector<scoped_refptr<ModelSafeWorker> >& workers,
-      ExtensionsActivity* extensions_activity,
-      SyncManager::ChangeDelegate* change_delegate,
-      const SyncCredentials& credentials,
-      const std::string& invalidator_client_id,
-      const std::string& restored_key_for_bootstrapping,
-      const std::string& restored_keystore_key_for_bootstrapping,
-      InternalComponentsFactory* internal_components_factory,
-      Encryptor* encryptor,
-      scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
-      ReportUnrecoverableErrorFunction
-          report_unrecoverable_error_function,
-      CancelationSignal* cancelation_signal) {
+bool SyncRollbackManagerBase::InitInternal(
+    const base::FilePath& database_location,
+    InternalComponentsFactory* internal_components_factory,
+    scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
+    ReportUnrecoverableErrorFunction report_unrecoverable_error_function) {
   unrecoverable_error_handler_ = unrecoverable_error_handler.Pass();
   report_unrecoverable_error_function_ = report_unrecoverable_error_function;
 
   if (!InitBackupDB(database_location, internal_components_factory)) {
     NotifyInitializationFailure();
-    return;
+    return false;
   }
 
+  initialized_ = true;
   NotifyInitializationSuccess();
+  return true;
 }
 
 ModelTypeSet SyncRollbackManagerBase::InitialSyncEndedTypes() {
@@ -118,7 +106,6 @@ void SyncRollbackManagerBase::ConfigureSyncer(
     if (InitTypeRootNode(type.Get())) {
       if (type.Get() == BOOKMARKS) {
         InitBookmarkFolder(kBookmarkBarTag);
-        InitBookmarkFolder(kMobileBookmarksTag);
         InitBookmarkFolder(kOtherBookmarksTag);
       }
     }
@@ -151,10 +138,11 @@ void SyncRollbackManagerBase::SaveChanges() {
 }
 
 void SyncRollbackManagerBase::ShutdownOnSyncThread() {
-  if (share_.directory) {
+  if (initialized_) {
     SaveChanges();
     share_.directory->Close();
     share_.directory.reset();
+    initialized_ = false;
   }
 }
 
@@ -227,7 +215,7 @@ void SyncRollbackManagerBase::NotifyInitializationFailure() {
       OnInitializationComplete(
           MakeWeakHandle(base::WeakPtr<JsBackend>()),
           MakeWeakHandle(base::WeakPtr<DataTypeDebugInfoListener>()),
-          false, InitialSyncEndedTypes()));
+          false, ModelTypeSet()));
 }
 
 std::string SyncRollbackManagerBase::GetOwnerName() const {
index 6b4153e..fce980b 100644 (file)
@@ -35,26 +35,6 @@ class SYNC_EXPORT_PRIVATE SyncRollbackManagerBase :
   virtual ~SyncRollbackManagerBase();
 
   // SyncManager implementation.
-  virtual void Init(
-      const base::FilePath& database_location,
-      const WeakHandle<JsEventHandler>& event_handler,
-      const std::string& sync_server_and_path,
-      int sync_server_port,
-      bool use_ssl,
-      scoped_ptr<HttpPostProviderFactory> post_factory,
-      const std::vector<scoped_refptr<ModelSafeWorker> >& workers,
-      ExtensionsActivity* extensions_activity,
-      SyncManager::ChangeDelegate* change_delegate,
-      const SyncCredentials& credentials,
-      const std::string& invalidator_client_id,
-      const std::string& restored_key_for_bootstrapping,
-      const std::string& restored_keystore_key_for_bootstrapping,
-      InternalComponentsFactory* internal_components_factory,
-      Encryptor* encryptor,
-      scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
-      ReportUnrecoverableErrorFunction
-          report_unrecoverable_error_function,
-      CancelationSignal* cancelation_signal) OVERRIDE;
   virtual ModelTypeSet InitialSyncEndedTypes() OVERRIDE;
   virtual ModelTypeSet GetTypesWithEmptyProgressMarkerToken(
       ModelTypeSet types) OVERRIDE;
@@ -115,6 +95,13 @@ class SYNC_EXPORT_PRIVATE SyncRollbackManagerBase :
  protected:
   ObserverList<SyncManager::Observer>* GetObservers();
 
+  // Initialize sync backup DB.
+  bool InitInternal(
+      const base::FilePath& database_location,
+      InternalComponentsFactory* internal_components_factory,
+      scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
+      ReportUnrecoverableErrorFunction report_unrecoverable_error_function);
+
   virtual void RegisterDirectoryTypeDebugInfoObserver(
       syncer::TypeDebugInfoObserver* observer) OVERRIDE;
   virtual void UnregisterDirectoryTypeDebugInfoObserver(
@@ -123,6 +110,10 @@ class SYNC_EXPORT_PRIVATE SyncRollbackManagerBase :
       syncer::TypeDebugInfoObserver* observer) OVERRIDE;
   virtual void RequestEmitDebugInfo() OVERRIDE;
 
+  bool initialized() const {
+    return initialized_;
+  }
+
  private:
   void NotifyInitializationSuccess();
   void NotifyInitializationFailure();
@@ -144,6 +135,8 @@ class SYNC_EXPORT_PRIVATE SyncRollbackManagerBase :
 
   scoped_ptr<SyncEncryptionHandler> dummy_handler_;
 
+  bool initialized_;
+
   DISALLOW_COPY_AND_ASSIGN(SyncRollbackManagerBase);
 };
 
index 79075d2..1d4c2de 100644 (file)
@@ -18,6 +18,34 @@ void OnConfigDone(bool success) {
   EXPECT_TRUE(success);
 }
 
+class SyncTestRollbackManager : public SyncRollbackManagerBase {
+ public:
+  virtual void Init(
+      const base::FilePath& database_location,
+      const WeakHandle<JsEventHandler>& event_handler,
+      const std::string& sync_server_and_path,
+      int sync_server_port,
+      bool use_ssl,
+      scoped_ptr<HttpPostProviderFactory> post_factory,
+      const std::vector<scoped_refptr<ModelSafeWorker> >& workers,
+      ExtensionsActivity* extensions_activity,
+      ChangeDelegate* change_delegate,
+      const SyncCredentials& credentials,
+      const std::string& invalidator_client_id,
+      const std::string& restored_key_for_bootstrapping,
+      const std::string& restored_keystore_key_for_bootstrapping,
+      InternalComponentsFactory* internal_components_factory,
+      Encryptor* encryptor,
+      scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
+      ReportUnrecoverableErrorFunction report_unrecoverable_error_function,
+      CancelationSignal* cancelation_signal) OVERRIDE {
+    SyncRollbackManagerBase::InitInternal(database_location,
+                                          internal_components_factory,
+                                          unrecoverable_error_handler.Pass(),
+                                          report_unrecoverable_error_function);
+  }
+};
+
 class SyncRollbackManagerBaseTest : public testing::Test {
  protected:
   virtual void SetUp() OVERRIDE {
@@ -32,7 +60,7 @@ class SyncRollbackManagerBaseTest : public testing::Test {
                   NULL, NULL);
   }
 
-  SyncRollbackManagerBase manager_;
+  SyncTestRollbackManager manager_;
   base::MessageLoop loop_;    // Needed for WeakHandle
 };
 
@@ -58,7 +86,7 @@ TEST_F(SyncRollbackManagerBaseTest, InitTypeOnConfiguration) {
   EXPECT_EQ(BaseNode::INIT_OK,
             bookmark_bar.InitByTagLookupForBookmarks("bookmark_bar"));
   ReadNode bookmark_mobile(&trans);
-  EXPECT_EQ(BaseNode::INIT_OK,
+  EXPECT_EQ(BaseNode::INIT_FAILED_ENTRY_NOT_GOOD,
             bookmark_mobile.InitByTagLookupForBookmarks("synced_bookmarks"));
   ReadNode bookmark_other(&trans);
   EXPECT_EQ(BaseNode::INIT_OK,
index d66ee06..11f875f 100644 (file)
@@ -5,6 +5,7 @@
 #include "sync/internal_api/sync_rollback_manager.h"
 
 #include "base/files/scoped_temp_dir.h"
+#include "base/run_loop.h"
 #include "sync/internal_api/public/read_node.h"
 #include "sync/internal_api/public/read_transaction.h"
 #include "sync/internal_api/public/sessions/sync_session_snapshot.h"
@@ -76,9 +77,9 @@ class SyncRollbackManagerTest : public testing::Test,
                void(const sessions::SyncSessionSnapshot&));
   MOCK_METHOD1(OnConnectionStatusChange, void(ConnectionStatus));
   MOCK_METHOD4(OnInitializationComplete,
-      void(const WeakHandle<JsBackend>&,
-           const WeakHandle<DataTypeDebugInfoListener>&,
-           bool, ModelTypeSet));
+               void(const WeakHandle<JsBackend>&,
+                    const WeakHandle<DataTypeDebugInfoListener>&,
+                    bool, ModelTypeSet));
   MOCK_METHOD1(OnActionableError, void(const SyncProtocolError&));
   MOCK_METHOD1(OnMigrationRequested, void(ModelTypeSet));;
   MOCK_METHOD1(OnProtocolEvent, void(const ProtocolEvent&));
@@ -100,11 +101,19 @@ class SyncRollbackManagerTest : public testing::Test,
   }
 
   void InitManager(SyncManager* manager, ModelTypeSet types,
-                   TestChangeDelegate* delegate) {
+                   TestChangeDelegate* delegate, StorageOption storage_option) {
+    manager_ = manager;
+    types_ = types;
+
+    EXPECT_CALL(*this, OnInitializationComplete(_, _, _, _))
+        .WillOnce(WithArgs<2>(Invoke(this,
+                                     &SyncRollbackManagerTest::HandleInit)));
+
     manager->AddObserver(this);
     TestInternalComponentsFactory factory(InternalComponentsFactory::Switches(),
-                                          STORAGE_ON_DISK);
+                                          storage_option);
 
+    base::RunLoop run_loop;
     manager->Init(temp_dir_.path(),
                   MakeWeakHandle(base::WeakPtr<JsEventHandler>()),
                   "", 0, true, scoped_ptr<HttpPostProviderFactory>().Pass(),
@@ -113,21 +122,16 @@ class SyncRollbackManagerTest : public testing::Test,
                   NULL, delegate, SyncCredentials(), "", "", "", &factory,
                   NULL, scoped_ptr<UnrecoverableErrorHandler>().Pass(),
                   NULL, NULL);
-    manager->ConfigureSyncer(
-        CONFIGURE_REASON_NEW_CLIENT,
-        types,
-        ModelTypeSet(), ModelTypeSet(), ModelTypeSet(), ModelSafeRoutingInfo(),
-        base::Bind(&SyncRollbackManagerTest::OnConfigDone,
-                   base::Unretained(this), true),
-        base::Bind(&SyncRollbackManagerTest::OnConfigDone,
-                   base::Unretained(this), false));
+    loop_.PostTask(FROM_HERE, run_loop.QuitClosure());
+    run_loop.Run();
   }
 
   // Create and persist an entry by unique tag in DB.
   void PrepopulateDb(ModelType type, const std::string& client_tag) {
     SyncBackupManager backup_manager;
     TestChangeDelegate delegate;
-    InitManager(&backup_manager, ModelTypeSet(type), &delegate);
+    InitManager(&backup_manager, ModelTypeSet(type), &delegate,
+                STORAGE_ON_DISK);
     CreateEntry(backup_manager.GetUserShare(), type, client_tag);
     backup_manager.ShutdownOnSyncThread();
   }
@@ -140,9 +144,34 @@ class SyncRollbackManagerTest : public testing::Test,
     return BaseNode::INIT_OK == node.InitByClientTagLookup(type, client_tag);
   }
 
+ private:
+  void ConfigureSyncer() {
+    manager_->ConfigureSyncer(
+          CONFIGURE_REASON_NEW_CLIENT,
+          types_,
+          ModelTypeSet(), ModelTypeSet(), ModelTypeSet(),
+          ModelSafeRoutingInfo(),
+          base::Bind(&SyncRollbackManagerTest::OnConfigDone,
+                     base::Unretained(this), true),
+          base::Bind(&SyncRollbackManagerTest::OnConfigDone,
+                     base::Unretained(this), false));
+  }
+
+  void HandleInit(bool success) {
+    if (success) {
+      loop_.PostTask(FROM_HERE,
+                     base::Bind(&SyncRollbackManagerTest::ConfigureSyncer,
+                                base::Unretained(this)));
+    } else {
+      manager_->ShutdownOnSyncThread();
+    }
+  }
+
   base::ScopedTempDir temp_dir_;
   scoped_refptr<ModelSafeWorker> worker_;
   base::MessageLoop loop_;    // Needed for WeakHandle
+  SyncManager* manager_;
+  ModelTypeSet types_;
 };
 
 bool IsRollbackDoneAction(SyncProtocolError e) {
@@ -154,7 +183,8 @@ TEST_F(SyncRollbackManagerTest, RollbackBasic) {
 
   TestChangeDelegate delegate;
   SyncRollbackManager rollback_manager;
-  InitManager(&rollback_manager, ModelTypeSet(PREFERENCES), &delegate);
+  InitManager(&rollback_manager, ModelTypeSet(PREFERENCES), &delegate,
+              STORAGE_ON_DISK);
 
   // Simulate a new entry added during type initialization.
   int64 new_pref_id =
@@ -177,7 +207,8 @@ TEST_F(SyncRollbackManagerTest, NoRollbackOfTypesNotBackedUp) {
 
   TestChangeDelegate delegate;
   SyncRollbackManager rollback_manager;
-  InitManager(&rollback_manager, ModelTypeSet(PREFERENCES, APPS), &delegate);
+  InitManager(&rollback_manager, ModelTypeSet(PREFERENCES, APPS), &delegate,
+              STORAGE_ON_DISK);
 
   // Simulate new entry added during type initialization.
   int64 new_pref_id =
@@ -204,7 +235,8 @@ TEST_F(SyncRollbackManagerTest, BackupDbNotChangedOnAbort) {
   TestChangeDelegate delegate;
   scoped_ptr<SyncRollbackManager> rollback_manager(
       new SyncRollbackManager);
-  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate);
+  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate,
+              STORAGE_ON_DISK);
 
   // Simulate a new entry added during type initialization.
   CreateEntry(rollback_manager->GetUserShare(), PREFERENCES, "pref2");
@@ -214,11 +246,20 @@ TEST_F(SyncRollbackManagerTest, BackupDbNotChangedOnAbort) {
 
   // Verify new entry was not persisted.
   rollback_manager.reset(new SyncRollbackManager);
-  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate);
+  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate,
+              STORAGE_ON_DISK);
   EXPECT_FALSE(VerifyEntry(rollback_manager->GetUserShare(), PREFERENCES,
                            "pref2"));
 }
 
+TEST_F(SyncRollbackManagerTest, OnInitializationFailure) {
+  // Test graceful shutdown on initialization failure.
+  scoped_ptr<SyncRollbackManager> rollback_manager(
+      new SyncRollbackManager);
+  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), NULL,
+              STORAGE_ON_DISK);
+}
+
 }  // anonymous namespace
 
 }  // namespace syncer
index ad107b1..be489b2 100644 (file)
@@ -1446,5 +1446,10 @@ void Directory::AppendChildHandles(const ScopedKernelLock& lock,
   }
 }
 
+void Directory::UnmarkDirtyEntry(WriteTransaction* trans, Entry* entry) {
+  CHECK(trans);
+  entry->kernel_->clear_dirty(&kernel_->dirty_metahandles);
+}
+
 }  // namespace syncable
 }  // namespace syncer
index f7dd44e..2830eec 100644 (file)
@@ -19,6 +19,7 @@
 #include "sync/internal_api/public/util/report_unrecoverable_error_function.h"
 #include "sync/internal_api/public/util/weak_handle.h"
 #include "sync/syncable/dir_open_result.h"
+#include "sync/syncable/entry.h"
 #include "sync/syncable/entry_kernel.h"
 #include "sync/syncable/metahandle_set.h"
 #include "sync/syncable/parent_child_index.h"
@@ -404,6 +405,11 @@ class SYNC_EXPORT Directory {
       const sync_pb::AttachmentIdProto& attachment_id_proto,
       Metahandles* result);
 
+  // Change entry to not dirty. Used in special case when we don't want to
+  // persist modified entry on disk. e.g. SyncBackupManager uses this to
+  // preserve sync preferences in DB on disk.
+  void UnmarkDirtyEntry(WriteTransaction* trans, Entry* entry);
+
  protected:  // for friends, mainly used by Entry constructors
   virtual EntryKernel* GetEntryByHandle(int64 handle);
   virtual EntryKernel* GetEntryByHandle(int64 metahandle,
index 281f779..6125915 100644 (file)
@@ -1,7 +1,5 @@
-crbug.com/384945 fast/repaint/float-overflow.html [ NeedsRebaseline ]
-crbug.com/384945 fast/repaint/float-overflow-right.html [ NeedsRebaseline ]
-crbug.com/384945 compositing/squashing/remove-squashed-layer-plus-move.html [ NeedsRebaseline ]
-crbug.com/384945 virtual/softwarecompositing/squashing/remove-squashed-layer-plus-move.html [ NeedsRebaseline ]
+crbug.com/391662 compositing/squashing/squashing-print.html [ NeedsRebaseline ]
+crbug.com/391662 virtual/softwarecompositing/squashing/squashing-print.html [ NeedsRebaseline ]
 
 # This directly has manual tests that don't have to run with run-webkit-tests
 crbug.com/359838 http/tests/ManualTests/ [ Skip ]
@@ -111,6 +109,7 @@ crbug.com/234069 [ Mac Release ] fast/events/touch/gesture/long-press-drag-drop-
 
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001.html [ Failure ]
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/non-element-nodes-001.html [ Failure ]
+crbug.com/330083 w3c/web-platform-tests/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-004.html [ Failure ]
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/events/event-dispatch/test-001.html [ Failure ]
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/events/event-dispatch/test-003.html [ Failure ]
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/events/event-retargeting/test-004.html [ Failure ]
@@ -131,6 +130,7 @@ crbug.com/330083 w3c/web-platform-tests/shadow-dom/styles/test-003.html [ Failur
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/styles/test-010.html [ Failure ]
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/user-interaction/focus-navigation/test-003.html [ Failure ]
 crbug.com/330083 w3c/web-platform-tests/shadow-dom/user-interaction/focus-navigation/test-004.html [ Failure ]
+crbug.com/330083 w3c/web-platform-tests/shadow-dom/user-interaction/ranges-and-selections/test-002.html [ Failure ]
 
 # Requires subpixel precision for offset/client/scroll properties
 crbug.com/360889 fast/sub-pixel/cssom-subpixel-precision.html [ ImageOnlyFailure ]
@@ -450,6 +450,11 @@ crbug.com/378610 [ Win7 ] svg/custom/focus-ring-text.svg [ ImageOnlyFailure ]
 crbug.com/378610 [ Win7 ] virtual/antialiasedtext/fast/text/international/inline-block-with-mixed-direction-words.html [ ImageOnlyFailure ]
 crbug.com/378610 [ Win7 ] virtual/antialiasedtext/fast/text/international/text-overflow-ellipsis-bidi.html [ ImageOnlyFailure ]
 
+crbug.com/396225 fast/repaint/outline-continuations.html [ NeedsRebaseline ]
+crbug.com/396225 fast/repaint/focus-continuations.html [ NeedsRebaseline ]
+crbug.com/396225 fast/repaint/outline-change-continuations.html [ NeedsRebaseline ]
+crbug.com/396225 fast/repaint/focus-enable-continuations.html [ NeedsRebaseline ]
+
 # Text tests that needs investigation or test changes (mostly due to precision).
 crbug.com/378610 [ Win7 ] fast/events/touch/gesture/touch-gesture-scroll-input-field.html [ Failure ]
 crbug.com/378610 [ Win7 ] fast/forms/cursor-at-editable-content-boundary.html [ Failure ]
@@ -760,6 +765,9 @@ crbug.com/313846 http/tests/images/webp-partial-load.html [ ImageOnlyFailure Tim
 
 crbug.com/316150 inspector/timeline/timeline-network-received-data.html [ Failure Pass ]
 
+crbug.com/331251 fast/block/float/float-not-removed-from-next-sibling2.html [ NeedsRebaseline ]
+crbug.com/331251 fast/block/float/nestedAnonymousBlocks.html [ NeedsRebaseline ]
+
 crbug.com/316730 canvas/synchronous-create-pattern.html [ ImageOnlyFailure Pass ]
 
 crbug.com/320099 webaudio/oscillator-sawtooth.html [ NeedsManualRebaseline ]
@@ -1124,71 +1132,3 @@ crbug.com/374936 [ Mac ] svg/dynamic-updates/SVGImageElement-dom-height-attr.htm
 crbug.com/374936 [ Mac ] svg/dynamic-updates/SVGImageElement-dom-width-attr.html [ ImageOnlyFailure Pass ]
 crbug.com/374936 [ Mac ] svg/dynamic-updates/SVGImageElement-svgdom-height-prop.html [ ImageOnlyFailure Pass ]
 crbug.com/374936 [ Mac ] svg/dynamic-updates/SVGImageElement-svgdom-width-prop.html [ ImageOnlyFailure Pass ]
-
-crbug.com/176419 svg/dynamic-updates/SVGFilterElement-dom-primitiveUnits-attr.html [ NeedsRebaseline ]
-crbug.com/176419 svg/dynamic-updates/SVGFilterElement-svgdom-primitiveUnits-prop.html [ NeedsRebaseline ]
-
-crbug.com/313438 svg/custom/relative-sized-use-on-symbol.xhtml [ NeedsManualRebaseline ]
-crbug.com/313438 svg/custom/relative-sized-use-without-attributes-on-symbol.xhtml [ NeedsManualRebaseline ]
-
-crbug.com/366442 svg/custom/masking-clipping-hidpi.svg [ Pass Failure ]
-
-crbug.com/375565 [ Mac ] fast/repaint/caret-with-transformation.html [ Pass Failure ]
-
-crbug.com/375567 web-animations-api/w3c/simple-keyframes.html [ Pass Failure ]
-
-crbug.com/376597 web-animations-api/player.html [ Pass Failure ]
-
-crbug.com/377013 [ Mac Debug ] fast/repaint/4776765.html [ Pass Failure ]
-
-crbug.com/239722 http/tests/websocket/connection-throttling.html [ Failure ]
-
-crbug.com/376194 inspector/console/console-format-es6.html [ Skip ]
-crbug.com/376194 inspector/console/console-format-es6-symbols-error.html [ Skip ]
-crbug.com/376194 inspector/console/console-dir-es6.html [ Skip ]
-
-crbug.com/380151 fast/events/only-valid-drop-targets-receive-file-drop.html [ Failure Pass ]
-
-crbug.com/380649 [ Mac ] fast/dom/HTMLScriptElement/dont-load-unknown-type.html [ Failure ]
-
-# We only want to run one of the web-animations-api tests in stable mode.
-crbug.com/368946 virtual/stable/web-animations-api [ Skip ]
-crbug.com/368946 virtual/stable/web-animations-api/eased-keyframes.html [ Pass ]
-
-# Temporarily skipped until Chromium side change lands.
-crbug.com/308768 http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-in-body.html [ Skip ]
-crbug.com/308768 http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-parent-same-origin-deny.html [ Skip ]
-crbug.com/308768 http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag.html [ Skip ]
-crbug.com/308768 http/tests/xmlhttprequest/xmlhttprequest-data-url.html [ Skip ]
-crbug.com/308768 inspector/network/network-status-non-http.html [ Skip ]
-
-crbug.com/382922 svg/zoom/page/zoom-replaced-intrinsic-ratio-001.htm [ NeedsRebaseline ]
-
-crbug.com/381102 inspector/sources/debugger/debugger-step-into-custom-element-callbacks.html [ Skip ]
-
-# Started being flaky in r175790.
-crbug.com/361045 inspector/layers/tracing-layer-tree.html [ Pass Failure ]
-
-crbug.com/384564 crypto/rsassa-pkcs1-v1_5-generate-key.html [ Pass Timeout ]
-crbug.com/384950 fast/forms/submit-change-fragment.html [ Pass Timeout ]
-crbug.com/384566 svg/custom/textPath-change-reference2.svg [ ImageOnlyFailure Pass ]
-
-crbug.com/386302 battery-status/multiple-windows.html [ Pass Failure ]
-crbug.com/384396 battery-status/page-visibility.html [ Pass Failure Timeout ]
-
-# Will be reverted in a day or two.
-crbug.com/374378 [ Linux Debug ] fast/canvas/webgl/context-release-upon-reload.html [ Failure ]
-crbug.com/374378 [ Linux Debug ] fast/canvas/webgl/context-lost-restored.html [ Failure ]
-crbug.com/374378 [ Linux Debug ] fast/canvas/webgl/context-lost.html [ Failure ]
-crbug.com/374378 [ Linux Debug ] fast/canvas/webgl/WebGLContextEvent.html [ Failure ]
-crbug.com/374378 [ Linux Debug ] virtual/gpu/fast/canvas/webgl/context-release-upon-reload.html [ Failure ]
-crbug.com/374378 [ Linux Debug ] virtual/gpu/fast/canvas/webgl/context-lost-restored.html [ Failure ]
-crbug.com/374378 [ Linux Debug ] virtual/gpu/fast/canvas/webgl/context-lost.html [ Failure ]
-crbug.com/374378 [ Linux Debug ] virtual/gpu/fast/canvas/webgl/WebGLContextEvent.html [ Failure ]
-
-Bug(eae) fast/text/justify-ideograph-complex.html [ NeedsRebaseline ]
-Bug(eae) fast/text/justify-ideograph-simple.html [ NeedsRebaseline ]
-Bug(eae) media/track/track-cue-rendering-vertical.html [ NeedsRebaseline ]
-Bug(eae) virtual/antialiasedtext/fast/text/justify-ideograph-complex.html [ NeedsRebaseline ]
-Bug(eae) virtual/antialiasedtext/fast/text/justify-ideograph-simple.html [ NeedsRebaseline ]
-
diff --git a/src/third_party/WebKit/LayoutTests/animations/display-inline-style-adjust-expected.html b/src/third_party/WebKit/LayoutTests/animations/display-inline-style-adjust-expected.html
new file mode 100644 (file)
index 0000000..c237fde
--- /dev/null
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<style>
+div {
+  position: absolute;
+  top: 4em;
+  width: 400px;
+}
+</style>
+
+<div>
+  <span>This sentence should span a single line.</span>
+</div>
diff --git a/src/third_party/WebKit/LayoutTests/animations/display-inline-style-adjust.html b/src/third_party/WebKit/LayoutTests/animations/display-inline-style-adjust.html
new file mode 100644 (file)
index 0000000..baee87d
--- /dev/null
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<style>
+@keyframes test {
+  from { background-position: 0 0;}
+  to { background-position: 1px 1px;}
+}
+div {
+  position: absolute;
+  top: 4em;
+  width: 400px;
+}
+.animated {
+  position: absolute;
+  animation: test 1000s;
+}
+</style>
+
+<div>
+  <span>This sentence shoul</span>
+  <span class="animated">d span a single line.</span>
+</div>
index 7c51482..be2ca5c 100644 (file)
@@ -6,13 +6,13 @@ PASS: font-size from [4px] to [14px] was [7px] at 0.3
 PASS: font-size from [4px] to [14px] was [10px] at 0.6
 PASS: font-size from [4px] to [14px] was [14px] at 1
 PASS: font-size from [4px] to [14px] was [19px] at 1.5
-PASS: font-size from [x-small] to [20px] was [0px] at -2
-PASS: font-size from [x-small] to [20px] was [7px] at -0.3
-PASS: font-size from [x-small] to [20px] was [10px] at 0
-PASS: font-size from [x-small] to [20px] was [13px] at 0.3
-PASS: font-size from [x-small] to [20px] was [16px] at 0.6
-PASS: font-size from [x-small] to [20px] was [20px] at 1
-PASS: font-size from [x-small] to [20px] was [25px] at 1.5
+PASS: font-size from [inherit] to [20px] was [0px] at -2
+PASS: font-size from [inherit] to [20px] was [7px] at -0.3
+PASS: font-size from [inherit] to [20px] was [10px] at 0
+PASS: font-size from [inherit] to [20px] was [13px] at 0.3
+PASS: font-size from [inherit] to [20px] was [16px] at 0.6
+PASS: font-size from [inherit] to [20px] was [20px] at 1
+PASS: font-size from [inherit] to [20px] was [25px] at 1.5
 
 Web Animations API:
 PASS: fontSize from [4px] to [14px] was [0px] at -2
@@ -22,11 +22,11 @@ PASS: fontSize from [4px] to [14px] was [7px] at 0.3
 PASS: fontSize from [4px] to [14px] was [10px] at 0.6
 PASS: fontSize from [4px] to [14px] was [14px] at 1
 PASS: fontSize from [4px] to [14px] was [19px] at 1.5
-PASS: fontSize from [x-small] to [20px] was [0px] at -2
-PASS: fontSize from [x-small] to [20px] was [7px] at -0.3
-PASS: fontSize from [x-small] to [20px] was [10px] at 0
-PASS: fontSize from [x-small] to [20px] was [13px] at 0.3
-PASS: fontSize from [x-small] to [20px] was [16px] at 0.6
-PASS: fontSize from [x-small] to [20px] was [20px] at 1
-PASS: fontSize from [x-small] to [20px] was [25px] at 1.5
+PASS: fontSize from [inherit] to [20px] was [0px] at -2
+PASS: fontSize from [inherit] to [20px] was [7px] at -0.3
+PASS: fontSize from [inherit] to [20px] was [10px] at 0
+PASS: fontSize from [inherit] to [20px] was [13px] at 0.3
+PASS: fontSize from [inherit] to [20px] was [16px] at 0.6
+PASS: fontSize from [inherit] to [20px] was [20px] at 1
+PASS: fontSize from [inherit] to [20px] was [25px] at 1.5
 
index 833cce5..3135caf 100644 (file)
@@ -1,6 +1,9 @@
 <!DOCTYPE html>
 <meta charset="UTF-8">
 <style>
+.container {
+  font-size: 10px;
+}
 .target {
   display: inline-block;
   font: 100px sans-serif;
 }
 </style>
 <body>
-<template id="target-template">TT</template>
+<template id="target-template">
+  <span class="container">
+    <div class="target">TT</div>
+  </span>
+</template>
 <script src="resources/interpolation-test.js"></script>
 <script>
 assertInterpolation({
@@ -29,7 +36,7 @@ assertInterpolation({
 ]);
 assertInterpolation({
   property: 'font-size',
-  from: 'x-small',
+  from: 'inherit',
   to: '20px'
 }, [
   {at: -2, is: '0px'},  // CSS font-size can't be negative.
diff --git a/src/third_party/WebKit/LayoutTests/compositing/squashing/invalidate-when-leaving-squashed-layer-expected.txt b/src/third_party/WebKit/LayoutTests/compositing/squashing/invalidate-when-leaving-squashed-layer-expected.txt
new file mode 100644 (file)
index 0000000..02b39b6
--- /dev/null
@@ -0,0 +1,45 @@
+{
+  "bounds": [800, 600],
+  "children": [
+    {
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "drawsContent": true,
+      "children": [
+        {
+          "children": [
+            {
+              "position": [8, 8],
+              "bounds": [200, 200],
+              "contentsOpaque": true,
+              "drawsContent": true,
+              "backgroundColor": "#D3D3D3"
+            },
+            {
+              "position": [50, 50],
+              "bounds": [200, 200],
+              "drawsContent": true,
+              "repaintRects": [
+                [0, 0, 200, 200],
+                [0, 0, 200, 200],
+                [0, 0, 200, 200]
+              ]
+            }
+          ]
+        },
+        {
+          "position": [50, 50],
+          "bounds": [200, 200],
+          "contentsOpaque": true,
+          "drawsContent": true,
+          "backgroundColor": "#ADD8E6",
+          "repaintRects": [
+            [0, 0, 200, 200],
+            [0, 0, 200, 200]
+          ]
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/src/third_party/WebKit/LayoutTests/compositing/squashing/invalidate-when-leaving-squashed-layer.html b/src/third_party/WebKit/LayoutTests/compositing/squashing/invalidate-when-leaving-squashed-layer.html
new file mode 100644 (file)
index 0000000..7ed4f50
--- /dev/null
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<div style="position:absolute; height: 200px; width: 200px; transform: translateZ(0); background: lightgray"></div>
+<div style="position:absolute; height: 200px; width: 200px; top: 50px; left: 50px; background:lightblue"></div>
+<div id="target" style="position:absolute; height: 200px; width: 200px; top: 50px; left: 50px; background:lightblue"></div>
+<script src="../../fast/repaint/resources/text-based-repaint.js"></script>
+<script>
+// Tests that causing a squashed layer to leave its squashing layer causes an invalidation in the squashing layer for the previous
+// location of the squashed layer.
+if (window.internals)
+        internals.settings.setLayerSquashingEnabled(true);
+
+function repaintTest() {
+    var target = document.getElementById("target");
+    target.style.transform = 'translateZ(0)';
+};
+runRepaintTest();
+</script>
diff --git a/src/third_party/WebKit/LayoutTests/compositing/squashing/squashing-print.html b/src/third_party/WebKit/LayoutTests/compositing/squashing/squashing-print.html
new file mode 100644 (file)
index 0000000..b19d568
--- /dev/null
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<script>
+if (window.testRunner)
+    testRunner.setPrinting();
+</script>
+
+<div style="width: 100px; height: 100px; border: 1px solid black; transform: translateZ(0)"></div>
+<div style="position: absolute; top: 50px; left: 50px; width: 100px; height: 100px; border: 1px solid black"></div>
\ No newline at end of file
diff --git a/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-001-expected.html b/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-001-expected.html
new file mode 100644 (file)
index 0000000..1e7d4ae
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+
+ <head>
+
+  <title>CSS Reftest Reference</title>
+
+  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+  <style type="text/css">
+  div
+  {
+  border: black solid 5px;
+  height: 1in;
+  width: 2in;
+  }
+
+  img {vertical-align: top;}
+  </style>  
+
+ </head>
+
+ <body>
+
+  <p>Test passes if the blue square is on the left inner edge of the hollow black rectangle.</p>
+
+   <div><img src="support/swatch-blue.png" width="96" height="96" alt="Image download support must be enabled"></div>
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-001.html b/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-001.html
new file mode 100644 (file)
index 0000000..25196c0
--- /dev/null
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+    <head>
+        <title>CSS Test: Floats, shifting left until it touches container edge</title>
+        <link rel="author" title="Microsoft" href="http://www.microsoft.com/">
+        <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <!-- 2012-07-02 -->
+        <link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#floats">
+        <link rel="match" href="reference/floats-001-ref.htm">
+
+        <meta name="flags" content="">
+        <meta name="assert" content="A left floated box shifts left until its outer edge touches the containing block edge.">
+        <style type="text/css">
+            #div1
+            {
+                border: solid 5px black;
+                height: 1in;
+                width: 2in;
+            }
+            div div
+            {
+                display: inline-block;
+                height: 1in;
+                width: 1in;
+            }
+            #div3
+            {
+                background-color: blue;
+                float: left;
+            }
+        </style>
+    </head>
+    <body>
+        <p>Test passes if the blue square is on the left inner edge of the hollow black rectangle.</p>
+        <div id="div1">
+           <div id="div2"></div>
+           <div id="div3"></div>
+        </div>
+    </body>
+</html>
\ No newline at end of file
diff --git a/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-102-expected.html b/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-102-expected.html
new file mode 100644 (file)
index 0000000..b2f1445
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+  <style type="text/css">
+   div { border: 1px solid teal; padding: 4px; margin: 4px; }
+   .left { float: left; }
+   .right { float: right; }
+   .size { width: 150px; height: 150px; }
+  </style>
+ </head>
+ <body>
+
+  <p>The content before should be to the right of the inner square,
+     and both it and the inner square should be surrounded by an outer box.</p>
+
+  <div class="left"><div class="size left"></div>content before</div>
+
+ </body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-102.html b/src/third_party/WebKit/LayoutTests/css2.1/20110323/floats-102.html
new file mode 100644 (file)
index 0000000..66475c3
--- /dev/null
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+  <title>CSS Test: CSS Floats: Nested floats (some inline content before nested float)</title>
+  <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch">
+  <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/box/float/002-demo.html" type="text/html">
+  <link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#floats">
+  <style type="text/css">
+   div { border: 1px solid teal; padding: 4px; margin: 4px; }
+   .left { float: left; }
+   .right { float: right; }
+   .size { width: 150px; height: 150px; }
+  </style>
+ </head>
+ <body>
+
+  <p>The content before should be to the right of the inner square,
+     and both it and the inner square should be surrounded by an outer box.</p>
+
+  <div class="left">content before <div class="size left"></div></div>
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/src/third_party/WebKit/LayoutTests/css3/calc/number-parsing.html b/src/third_party/WebKit/LayoutTests/css3/calc/number-parsing.html
new file mode 100644 (file)
index 0000000..e89c8ac
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script>
+function assertParsedValue(property, input, expected) {
+  var style = document.createElement('div').style;
+  style.setProperty(property, input);
+  assert_equals(style.getPropertyValue(property), expected, property + ': ' + input);
+}
+
+test(function() {
+  assertParsedValue('-webkit-box-ordinal-group', 'calc(6 + 4)', '10');
+  assertParsedValue('-webkit-box-ordinal-group', 'calc(0)', null);
+  assertParsedValue('-webkit-column-span', 'calc(2 - 1)', null);
+  assertParsedValue('-webkit-column-span', 'calc(1 + 2)', null);
+  assertParsedValue('-webkit-column-width', 'calc(1em - 1px)', 'calc(1em - 1px)');
+  assertParsedValue('transition-timing-function', 'cubic-bezier(calc(1 + 2), 0, 1, 1)', null);
+  assertParsedValue('transition-timing-function', 'cubic-bezier(calc(1 / 2), calc(1 - 1), calc(2 - 1), calc(2 * 3))', 'cubic-bezier(0.5, 0, 1, 6)');
+  assertParsedValue('transition-timing-function', 'steps(calc(1 + 2), start)', 'steps(3, start)');
+  assertParsedValue('grid-row-start', 'calc(1 + 2) test', '3 test');
+  assertParsedValue('grid-row-start', 'calc(1 / 2) test', null);
+  assertParsedValue('font-weight', 'calc(100 + 200)', null);
+  assertParsedValue('flex', 'calc(1 + 2) calc(3 + 4)', '3 7 0px');
+  assertParsedValue('-webkit-aspect-ratio', 'calc(1 + 2)/calc(3 + 4)', '3/7');
+  assertParsedValue('-webkit-filter', 'saturate(calc(4 / 2))', 'saturate(2)');
+  assertParsedValue('-webkit-filter', 'invert(calc(4 / 2))', null);
+  assertParsedValue('-webkit-filter', 'invert(calc(2 / 4))', 'invert(0.5)');
+  assertParsedValue('-webkit-filter', 'brightness(calc(4 / 2))', 'brightness(2)');
+}, 'Ensure using calc() for CSS numbers does not crash or produce incorrect values.');
+</script>
index e2dfef7..31ac783 100644 (file)
@@ -38,7 +38,7 @@ function surroundingText(html, offset, maxLength) {
 
     var coords = findOffsetCoordinates(node, offset);
     var text = window.internals.textSurroundingNode(node, coords.x, coords.y, maxLength);
-    return text.replace(/\s+/g, ' ').replace(/^\s*|\s*$/g, '');
+    return text.replace(/\s+|\ufffc/g, ' ').replace(/^\s*|\s*$/g, '');
 }
 
 function run() {
diff --git a/src/third_party/WebKit/LayoutTests/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line.html b/src/third_party/WebKit/LayoutTests/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line.html
deleted file mode 100644 (file)
index 2584780..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<style>
-    body {
-        margin: 0;
-        padding: 0;
-    }
-    #container {
-        position: relative;
-        background: #ccc;
-        font: 20px Ahem;
-    }
-    #floater {
-        float: none;
-    }
-</style>
-<body>
-    <p> When a block element becomes a float we should not strip anonymous blocks wrapping its inline siblings if there are other blocks on the 
-        line. In this test case, the block is wrapped in an anonymous block as part of a continuation.</p>
-    <div id="container">
-        <span>
-            <p>Text</p>
-        </span>
-        <dd id="floater"></dd>
-    </div>
-    <script>
-        document.body.offsetTop;
-        document.getElementById('floater').style.float = 'right';
-    </script>
-</body>
-
-
diff --git a/src/third_party/WebKit/LayoutTests/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line.html b/src/third_party/WebKit/LayoutTests/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line.html
deleted file mode 100644 (file)
index 0605459..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<style>
-    body {
-        margin: 0;
-        padding: 0;
-    }
-    #container {
-        position: relative;
-        background: #ccc;
-        font: 20px Ahem;
-    }
-    #floater {
-        float: none;
-    }
-</style>
-<body>
-    <p> When a block element becomes a float we should not strip anonymous blocks wrapping its inline siblings if there are other blocks on the line.</p>
-    <div id="container">
-        <strong></strong>
-        <p></p>
-        <dd id="floater"></dd>
-        <br>
-    </div>
-    <script>
-        document.body.offsetTop;
-        document.getElementById('floater').style.float = 'right';
-    </script>
-</body>
-
-
diff --git a/src/third_party/WebKit/LayoutTests/fast/block/strip-anonymous-blocks-when-block-child-becomes-float-expected.txt b/src/third_party/WebKit/LayoutTests/fast/block/strip-anonymous-blocks-when-block-child-becomes-float-expected.txt
deleted file mode 100644 (file)
index 78714c0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-When a block element becomes a float we should strip any anonymous blocks wrapping its inline siblings.
-
-Some
-content
-here. Should appear inside grey box.
-PASS
diff --git a/src/third_party/WebKit/LayoutTests/fast/block/strip-anonymous-blocks-when-block-child-becomes-float.html b/src/third_party/WebKit/LayoutTests/fast/block/strip-anonymous-blocks-when-block-child-becomes-float.html
deleted file mode 100644 (file)
index 27efbfa..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<style>
-    body {
-        margin: 0;
-        padding: 0;
-    }
-    #container {
-        position: relative;
-        background: #ccc;
-        font: 20px Ahem;
-    }
-    #floater {
-        float: none;
-    }
-</style>
-<script src="../../resources/check-layout.js"></script>
-<body>
-    <p> When a block element becomes a float we should strip any anonymous blocks wrapping its inline siblings.</p>
-    <div id="container">
-        <span id="content">
-            Some<br />
-            content<br />
-            here.
-        </span>
-        <div id="floater" data-offset-y=40>
-            Should appear inside grey box.
-        </div>
-    </div>
-    <script>
-        document.body.offsetTop;
-        document.getElementById('floater').style.float = 'right';
-        onload = function() { checkLayout('#container'); }
-    </script>
-</body>
-
-
diff --git a/src/third_party/WebKit/LayoutTests/fast/css/crash-layout-detached-document-expected.txt b/src/third_party/WebKit/LayoutTests/fast/css/crash-layout-detached-document-expected.txt
new file mode 100644 (file)
index 0000000..bfc6721
--- /dev/null
@@ -0,0 +1,3 @@
+Bug 377724: Don't crash when calling into layout on a detached document.
+
+
diff --git a/src/third_party/WebKit/LayoutTests/fast/css/crash-layout-detached-document.html b/src/third_party/WebKit/LayoutTests/fast/css/crash-layout-detached-document.html
new file mode 100644 (file)
index 0000000..f7eef38
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+
+<link id="sheet" href="doesnotexist.css" rel="stylesheet">
+
+<p>Bug 377724: Don't crash when calling into layout on a detached document.</p>
+
+<div id="first"></div>
+<iframe id="iframe"></iframe>
+
+<script>
+onload = function() {
+    if (window.testRunner)
+        testRunner.dumpAsText();
+    var iframeDocument = iframe.contentDocument;
+    // Need to use link elements in this test to create placeholder styles so
+    // we'll go into the Force case inside updateLayoutIgnorePendingStylesheets.
+    var link = document.createElement("link");
+    link.href = "doesnotexist.css";
+    link.rel = "stylesheet";
+    document.getElementById("first").appendChild(document.getElementById("sheet"));
+    iframeDocument.replaceChild(link, iframeDocument.documentElement);
+    document.body.offsetTop;
+    iframe.remove();
+    iframeDocument.firstChild.offsetTop;
+}
+</script>
diff --git a/src/third_party/WebKit/LayoutTests/fast/dom/Document/title-01-expected.txt b/src/third_party/WebKit/LayoutTests/fast/dom/Document/title-01-expected.txt
new file mode 100644 (file)
index 0000000..2447217
--- /dev/null
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+PASS document.title with head blown away 
+PASS document.title with head blown away 1 
+PASS Untitled 2 
+PASS PASS 3 
+Harness: the test ran to completion.
+
diff --git a/src/third_party/WebKit/LayoutTests/fast/dom/Document/title-01.html b/src/third_party/WebKit/LayoutTests/fast/dom/Document/title-01.html
new file mode 100644 (file)
index 0000000..ea37a3f
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>document.title with head blown away</title>
+<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
+<link rel="help" href="http://www.whatwg.org/html5/#document.title">
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<link rel="stylesheet" href="../../../resources/testharness.css">
+</head>
+<body>
+<script>
+test(function() {
+    assert_equals(document.title, "document.title with head blown away");
+})
+test(function() {
+    var head = document.getElementsByTagName("head")[0];
+    assert_true(!!head, "Head gone?!")
+    head.parentNode.removeChild(head);
+    assert_false(!!document.getElementsByTagName("head")[0], "Head still there?!")
+    document.title = "FAIL";
+    assert_equals(document.title, "");
+})
+test(function() {
+    var title2 = document.createElement("title");
+    title2.appendChild(document.createTextNode("PASS"));
+    document.body.appendChild(title2);
+    assert_equals(document.title, "PASS");
+})
+test(function() {
+    var title3 = document.createElement("title");
+    title3.appendChild(document.createTextNode("PASS2"));
+    document.documentElement.insertBefore(title3, document.body);
+    assert_equals(document.title, "PASS2");
+})
+</script>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/dom/Element/normalize-crash2-expected.txt b/src/third_party/WebKit/LayoutTests/fast/dom/Element/normalize-crash2-expected.txt
new file mode 100644 (file)
index 0000000..4e8436f
--- /dev/null
@@ -0,0 +1,9 @@
+This test passes if it does not crash.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/fast/dom/Element/normalize-crash2.html b/src/third_party/WebKit/LayoutTests/fast/dom/Element/normalize-crash2.html
new file mode 100644 (file)
index 0000000..32d9ce2
--- /dev/null
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<script src="../../../resources/js-test.js"></script>
+<div name="testDiv" id="testDiv"></div>
+<script>
+description("This test passes if it does not crash.");
+
+var testDiv = document.getElementById("testDiv");
+testDiv.attributes[0].appendChild(new Text("test"));
+testDiv.cloneNode(false);
+gc();
+testDiv.normalize();
+</script>
index d41ce2e..1862c93 100644 (file)
@@ -44,6 +44,10 @@ PASS barShadowRoot.querySelectorAll(":host-context(div#foo-host)::shadow span").
 PASS barShadowRoot.querySelectorAll(":host-context(div#foo-host)::shadow span")[0].id is "nested"
 PASS barShadowRoot.querySelectorAll(":host-context(div#foo-host) /deep/ span").length is 1
 PASS barShadowRoot.querySelectorAll(":host-context(div#foo-host) /deep/ span")[0].id is "nested"
+PASS fooHost.querySelectorAll("::shadow span").length is 3
+PASS fooHost.querySelectorAll("::shadow span")[0].id is "not-top"
+PASS fooHost.querySelectorAll("::shadow span")[1].id is "top"
+PASS fooHost.querySelectorAll("::shadow span")[2].id is "inner-host"
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 376be13..835a10f 100644 (file)
@@ -1,11 +1,7 @@
 <!DOCTYPE html>
-<html>
-<head>
 <script src="resources/shadow-dom.js"></script>
 <script src="../../../resources/js-test.js"></script>
-</head>
-<body>
-</body>
+<body></body>
 <script>
 document.body.appendChild(
     createDOM('div', {'id': 'foo-host'},
@@ -19,9 +15,6 @@ document.body.appendChild(
                 createDOM('span', {'id': 'inner-host'}))),
         createDOM('span', {'id': 'outer-host'})));
 
-document.body.appendChild(
-    createDOM('pre', {'id': 'console'}));
-
 description('crbug.com/337616: test for querySelectorAll with ::shadow and /deep/');
 
 shouldBe('document.querySelectorAll("#foo-host::shadow span").length', '3');
@@ -82,6 +75,11 @@ shouldBe('barShadowRoot.querySelectorAll(":host-context(div#foo-host)::shadow sp
 shouldBe('barShadowRoot.querySelectorAll(":host-context(div#foo-host)::shadow span")[0].id', '"nested"');
 shouldBe('barShadowRoot.querySelectorAll(":host-context(div#foo-host) /deep/ span").length', '1');
 shouldBe('barShadowRoot.querySelectorAll(":host-context(div#foo-host) /deep/ span")[0].id', '"nested"');
-</script>
-</html>
 
+// crbug.com/390301
+var fooHost = document.getElementById("foo-host");
+shouldBe('fooHost.querySelectorAll("::shadow span").length', '3');
+shouldBe('fooHost.querySelectorAll("::shadow span")[0].id', '"not-top"');
+shouldBe('fooHost.querySelectorAll("::shadow span")[1].id', '"top"');
+shouldBe('fooHost.querySelectorAll("::shadow span")[2].id', '"inner-host"');
+</script>
diff --git a/src/third_party/WebKit/LayoutTests/fast/events/onunload-postmessage-expected.txt b/src/third_party/WebKit/LayoutTests/fast/events/onunload-postmessage-expected.txt
new file mode 100644 (file)
index 0000000..018c7ff
--- /dev/null
@@ -0,0 +1,3 @@
+main frame - has 1 onunload handler(s)
+
+TEST PASS: If this test doesn't leak when run with --enable-leak-detection
diff --git a/src/third_party/WebKit/LayoutTests/fast/events/onunload-postmessage.html b/src/third_party/WebKit/LayoutTests/fast/events/onunload-postmessage.html
new file mode 100644 (file)
index 0000000..ac9cb89
--- /dev/null
@@ -0,0 +1,12 @@
+<iframe id="x"></iframe>
+<script>
+if (window.testRunner)
+    testRunner.dumpAsText();
+
+window.onunload = function() {
+    var frame = document.getElementById('x');
+    frame.contentWindow.postMessage('foo', '*');
+}
+</script>
+<p>TEST PASS: If this test doesn't leak when run with
+--enable-leak-detection</p>
diff --git a/src/third_party/WebKit/LayoutTests/fast/events/touch/touch-target-move-documents-expected.txt b/src/third_party/WebKit/LayoutTests/fast/events/touch/touch-target-move-documents-expected.txt
new file mode 100644 (file)
index 0000000..6fcb694
--- /dev/null
@@ -0,0 +1,23 @@
+Tests a node moving documents while being touched.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Sending touchstart
+Received touchstart on DIV-target
+Received touchstart on #document-Main
+
+Moving target node to new document
+
+Sending touchmove
+
+Re-adding target node to main document
+
+Sending touchend
+Received touchend on DIV-target
+Received touchend on #document-Main
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/fast/events/touch/touch-target-move-documents.html b/src/third_party/WebKit/LayoutTests/fast/events/touch/touch-target-move-documents.html
new file mode 100644 (file)
index 0000000..c7eca01
--- /dev/null
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<style>
+#target {
+  width: 50px;
+  height: 50px;
+  background-color: blue;
+}
+</style>
+<title>Main</title>
+<div id=target></div>
+<script src="../../../resources/js-test.js"></script>
+<script>
+description('Tests a node moving documents while being touched.');
+
+function logEvent(e) {
+  e.preventDefault();
+  var name = e.currentTarget.nodeName;
+  if (e.currentTarget.title)
+    name += '-' + e.currentTarget.title;
+  else if(e.currentTarget.id)
+    name += '-' + e.currentTarget.id;
+  debug('Received ' + e.type + ' on ' + name);
+}
+
+var dummyDoc = document.implementation.createHTMLDocument('dummyDoc');
+
+var target = document.getElementById('target');
+target.addEventListener('touchstart', function(e) {
+});
+
+var targets = [target, document, dummyDoc];
+var events = ['touchstart', 'touchmove', 'touchend'];
+for (var i = 0; i < events.length; i++) {
+  for (var j = 0; j < targets.length; j++) {
+    targets[j].addEventListener(events[i], logEvent);
+  }
+}
+
+if (window.eventSender) {
+  debug('Sending touchstart');
+  var rect = target.getBoundingClientRect();
+  var targetX = rect.left + rect.width / 2;
+  var targetY = rect.top + rect.height / 2;
+  eventSender.addTouchPoint(targetX, targetY);
+  eventSender.touchStart();
+  debug('');
+
+  debug('Moving target node to new document');
+  dummyDoc.body.appendChild(target);
+  debug('');
+
+  debug('Sending touchmove');
+  eventSender.updateTouchPoint(0, targetX + 1, targetY + 1);
+  eventSender.touchMove();
+  debug('');
+
+  debug('Re-adding target node to main document');
+  document.body.insertBefore(target, document.body.firstChild);
+  debug('');
+
+  debug('Sending touchend');
+  eventSender.releaseTouchPoint(0);
+  eventSender.touchEnd();
+  debug('');
+}
+</script>
+
index 957a12a..1f4d628 100644 (file)
@@ -13,6 +13,7 @@
     <input name=n2 type=image>
     <img name=n2></img>
     <img id=n2></img>
+    <img id=n3></img>
 </form>
 <!-- The img element isn't 'reassociatable'; add @form to verify it is so. -->
 <img name=n2 form=f1></img>
diff --git a/src/third_party/WebKit/LayoutTests/fast/forms/submit-add-remove-element-expected.txt b/src/third_party/WebKit/LayoutTests/fast/forms/submit-add-remove-element-expected.txt
new file mode 100644 (file)
index 0000000..33e7900
--- /dev/null
@@ -0,0 +1,11 @@
+Test that form.submit() when submitted from JS, form element added and removed, should submit the form without added element
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS event.target.contentWindow.location.search is "?textData=b&submitform=Step"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+  
+
diff --git a/src/third_party/WebKit/LayoutTests/fast/forms/submit-add-remove-element.html b/src/third_party/WebKit/LayoutTests/fast/forms/submit-add-remove-element.html
new file mode 100644 (file)
index 0000000..c54f4a3
--- /dev/null
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test.js"></script>
+</head>
+<body>
+<form method="GET" id="form" onsubmit="formSubmit();afterSubmit(form);" target="target">
+    <input type="text" id="textData" name="textData" value="a">
+    <input type="submit" id="submitButton" name="submitform" value="Step">
+</form>
+<iframe id="target" name="target"></iframe>
+<script>
+description('Test that form.submit() when submitted from JS, form element added and removed, should submit the form without added element');
+
+var hidden;
+function formSubmit(event)
+{
+    var textData = document.getElementById('textData');
+    var form = document.getElementById('form');
+    var submit = document.getElementById('submitButton');
+    textData.value = 'b';
+    hidden = document.createElement('hidden');
+    hidden.value = submit.value;
+    hidden.name = submit.name;
+    form.appendChild(hidden);
+    form.submit();
+    return true;
+}
+
+function afterSubmit(form)
+{
+    form.removeChild(hidden);
+}
+
+document.getElementById('target').onload = function(event) {
+    shouldBeEqualToString('event.target.contentWindow.location.search', '?textData=b&submitform=Step');
+    finishJSTest();
+}
+
+window.onload = function() {
+    document.getElementById('submitButton').click();
+}
+
+if (window.testRunner)
+    window.jsTestIsAsync = true;
+</script>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/html/imports/import-insert-domcontentloaded-expected.txt b/src/third_party/WebKit/LayoutTests/fast/html/imports/import-insert-domcontentloaded-expected.txt
new file mode 100644 (file)
index 0000000..a6146aa
--- /dev/null
@@ -0,0 +1 @@
+PASS unless crash
diff --git a/src/third_party/WebKit/LayoutTests/fast/html/imports/import-insert-domcontentloaded.html b/src/third_party/WebKit/LayoutTests/fast/html/imports/import-insert-domcontentloaded.html
new file mode 100644 (file)
index 0000000..37369a7
--- /dev/null
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+    window.testRunner.waitUntilDone();
+    window.testRunner.dumpAsText();
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+    var link = document.createElement('link');
+    link.setAttribute('rel', 'import');
+    link.setAttribute('href', 'resources/hello.html');
+    document.head.appendChild(link);
+    window.onload = function() {
+        window.testRunner.notifyDone();
+    };
+});
+
+</script>
+</head>
+<body>PASS unless crash</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-both-whitespace-expected.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-both-whitespace-expected.html
new file mode 100644 (file)
index 0000000..60885b4
--- /dev/null
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test With Both Leading and Trailing Whitespace</title>
+<style>
+    div { height:150px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .middle { display:inline-block; width:400px; background-color:green; }
+</style>
+</head>
+<body>
+<p>There should be a single green rectangle below.</p>
+<!-- Mixture of Leading and Trailing Whitespace -->
+<div class="container"><div class="middle"></div></div>
+
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-both-whitespace.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-both-whitespace.html
new file mode 100644 (file)
index 0000000..202274f
--- /dev/null
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test With Both Leading and Trailing Whitespace</title>
+<style>
+    div { height:30px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .floater { float:right; width:100px; background-color:green; }
+    .middle { display:inline-block; width:300px; background-color:green; }
+</style>
+</head>
+<body>
+<p>There should be a single green rectangle below.</p>
+<!-- Single Leading and Trailing Space -->
+<div class="container"><div class="middle"></div> <div class="floater"></div> </div>
+
+<!-- Single Leading and Multiple Trailing Spaces -->
+<div class="container"><div class="middle"></div> <div class="floater"></div>   </div>
+
+<!-- Multiple Leading and Single Trailing Spaces -->
+<div class="container"><div class="middle"></div>    <div class="floater"></div> </div>
+
+<!-- Multiple Leading and Trailing Spaces -->
+<div class="container"><div class="middle"></div>    <div class="floater"></div>    </div>
+
+<!-- Mixture of Leading and Trailing Whitespace -->
+<div class="container">
+    <div class="middle"></div>
+    <div class="floater"></div>
+</div>
+
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-leading-whitespace-expected.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-leading-whitespace-expected.html
new file mode 100644 (file)
index 0000000..93c23c7
--- /dev/null
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test With Leading Whitespace</title>
+<style>
+    div { height:90px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .middle { display:inline-block; width:400px; background-color:green; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<div class="container"><div class="middle"></div></div>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-leading-whitespace.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-leading-whitespace.html
new file mode 100644 (file)
index 0000000..3b33e23
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test With Leading Whitespace</title>
+<style>
+    div { height:30px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .floater { float:right; width:100px; background-color:green; }
+    .middle { display:inline-block; width:300px; background-color:green; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<!-- Single Leading Space -->
+<div class="container"><div class="middle"></div> <div class="floater"></div></div>
+
+<!-- Single Leading Newline -->
+<div class="container"><div class="middle"></div>
+<div class="floater"></div></div>
+
+<!-- Mixture of Leading Whitespace -->
+<div class="container"><div class="middle"></div>
+   <div class="floater"></div></div>
+
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-no-whitespace-expected.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-no-whitespace-expected.html
new file mode 100644 (file)
index 0000000..f0c514e
--- /dev/null
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test Without Whitespace</title>
+<style>
+    div { height:60px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .middle { display:inline-block; width:400px; background-color:green; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<div class="container"><div class="middle"></div></div>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-no-whitespace.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-no-whitespace.html
new file mode 100644 (file)
index 0000000..2defbca
--- /dev/null
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test Without Whitespace</title>
+<style>
+    div { height:30px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .floater { float:right; width:100px; background-color:green; }
+    .middle { display:inline-block; width:300px; background-color:green; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<div class="container"><div class="middle"></div><div class="floater"></div></div>
+<div class="container"><div class="middle"></div><div class="floater"></div></div>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-trailing-whitespace-expected.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-trailing-whitespace-expected.html
new file mode 100644 (file)
index 0000000..93c23c7
--- /dev/null
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test With Leading Whitespace</title>
+<style>
+    div { height:90px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .middle { display:inline-block; width:400px; background-color:green; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<div class="container"><div class="middle"></div></div>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/float-trailing-whitespace.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/float-trailing-whitespace.html
new file mode 100644 (file)
index 0000000..35775b3
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test With Trailing Whitespace</title>
+<style>
+    div { height:30px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .floater { float:right; width:100px; background-color:green; }
+    .middle { display:inline-block; width:300px; background-color:green; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<!-- Single Trailing Space -->
+<div class="container"><div class="middle"></div><div class="floater"></div> </div>
+
+<!-- Single Trailing Newline -->
+<div class="container"><div class="middle"></div><div class="floater"></div>
+</div>
+
+<!-- Mixture of Trailing Whitespace -->
+<div class="container"><div class="middle"></div><div class="floater"></div>
+ </div>
+
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/multiple-floats-with-whitespace-expected.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/multiple-floats-with-whitespace-expected.html
new file mode 100644 (file)
index 0000000..142bbe2
--- /dev/null
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+    div { height:90px; margin:0; padding:0; border:none; }
+    .container { width:400px; }
+    .middle { display:inline-block; width:400px; background-color:green; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<div class="container"><div class="middle"></div></div>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/inline-block/multiple-floats-with-whitespace.html b/src/third_party/WebKit/LayoutTests/fast/inline-block/multiple-floats-with-whitespace.html
new file mode 100644 (file)
index 0000000..970505f
--- /dev/null
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test Multiple Floats for a Single Line</title>
+<style>
+    div { width: 100px; height:30px; margin:0; padding:0; border:none; background-color: green;}
+    .container { width:400px; }
+    .left { float:left; }
+    .a { float:right; }
+    .b { float:right; }
+    .middle { display:inline-block; }
+</style>
+</head>
+<body>
+<p> There should be a single green rectangle below. </p>
+<!-- No whitespace -->
+<div class="container"><div class="left"></div><div class="middle"></div><div class="floater a"></div><div class="floater b"></div></div>
+
+<!-- Some whitespace -->
+<div class="container">
+    <div class="left"></div>
+    <div class="middle"></div>
+    <div class="floater a"></div>
+    <div class="floater b"></div>
+</div>
+
+<!-- Order should not matter -->
+<div class="container">
+    <div class="floater a"></div>
+    <div class="left"></div>
+    <div class="middle"></div>
+    <div class="floater b"></div>
+</div>
+
+</body>
+</html>
index 58ae6fe..c10462b 100644 (file)
@@ -17,7 +17,7 @@
 
     div.float {
         float: left;
-        width: 50px;
+        width: 51px;
         margin-top: 5px;
         color: silver;
     }
index aa5c1fa..0d52450 100644 (file)
@@ -16,7 +16,7 @@
 
     div.float {
         float: left;
-        height: 50px;
+        height: 51px;
         -webkit-margin-before: 5px;
         color: silver;
     }
index bf17e79..a6c0c4c 100644 (file)
@@ -17,7 +17,7 @@
 
     div.float {
         float: left;
-        height: 50px;
+        height: 51px;
         -webkit-margin-before: 5px;
         color: silver;
     }
diff --git a/src/third_party/WebKit/LayoutTests/fast/repaint/focus-continuations.html b/src/third_party/WebKit/LayoutTests/fast/repaint/focus-continuations.html
new file mode 100644 (file)
index 0000000..68bd889
--- /dev/null
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<script src="resources/text-based-repaint.js"></script>
+<script>
+document.querySelector('#outer').focus();
+function repaintTest()
+{
+  document.querySelector('#outer').blur();
+}
+onload = runRepaintTest();
+</script>
+<style>
+body { height: 200px; }
+#container { position: absolute; }
+p, #inner { height: 20px; }
+</style>
+<p>
+  This test is verifying that when the focus is removed from an element we
+  correctly invalidate continuations and remove the focus ring.
+</p>
+<p>
+  If this test passes, you should see no focus ring.
+</p>
+<div id="container">
+  <span id="outer" tabindex="1">
+      <div id="inner">CONTENTS</div>
+  </span>
+</div>
diff --git a/src/third_party/WebKit/LayoutTests/fast/repaint/focus-enable-continuations.html b/src/third_party/WebKit/LayoutTests/fast/repaint/focus-enable-continuations.html
new file mode 100644 (file)
index 0000000..db51727
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="resources/text-based-repaint.js"></script>
+<script>
+function repaintTest()
+{
+  document.querySelector('#outer').focus();
+}
+onload = runRepaintTest();
+</script>
+<style>
+body { height: 200px; }
+#container { position: absolute; }
+p, #inner { height: 20px; }
+</style>
+<p>
+  This test is verifying that when the focus is added to an element we
+  correctly invalidate continuations and display the focus ring.
+</p>
+<p>
+  If this test passes, you should see a focus ring.
+</p>
+<div id="container">
+  <span id="outer" tabindex="1">
+      <div id="inner">CONTENTS</div>
+  </span>
+</div>
diff --git a/src/third_party/WebKit/LayoutTests/fast/repaint/outline-change-continuations.html b/src/third_party/WebKit/LayoutTests/fast/repaint/outline-change-continuations.html
new file mode 100644 (file)
index 0000000..f1581d4
--- /dev/null
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<script src="resources/text-based-repaint.js"></script>
+<script>
+function repaintTest()
+{
+  document.querySelector('#outer').style['outline-color'] ='green';
+}
+onload = runRepaintTest();
+</script>
+<style>
+body { height: 200px; }
+#container { position: absolute; }
+p, #inner { height: 20px; }
+#outer { outline: 2px solid red; }
+</style>
+<p>
+  This test is verifying that when the outline is modified on an element
+  that we correctly invalidate any continuations.
+</p>
+<p>
+  If this test passes, you should see a green border around the text contents.
+</p>
+<div id="container">
+  <span id="outer">
+      <div id="inner">CONTENTS</div>
+  </span>
+</div>
diff --git a/src/third_party/WebKit/LayoutTests/fast/repaint/outline-continuations.html b/src/third_party/WebKit/LayoutTests/fast/repaint/outline-continuations.html
new file mode 100644 (file)
index 0000000..7b8dbe7
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="resources/text-based-repaint.js"></script>
+<script>
+function repaintTest()
+{
+  document.querySelector('#outer').style.outline = 'green solid 2px';
+}
+onload = runRepaintTest();
+</script>
+<style>
+body { height: 200px; }
+p, #inner { height: 20px; }
+#container { position: absolute; }
+</style>
+<p>
+  This test is verifying that when the outline is added to an element
+  that we correctly invalidate any continuations.
+</p>
+<p>
+  If this test passes, you should see a green border around the text contents.
+</p>
+<div id="container">
+    <span id="outer">
+        <div id="inner">CONTENTS</div>
+    </span>
+</div>
diff --git a/src/third_party/WebKit/LayoutTests/fast/scrolling/scroll-max-value-expected.txt b/src/third_party/WebKit/LayoutTests/fast/scrolling/scroll-max-value-expected.txt
new file mode 100644 (file)
index 0000000..adac680
--- /dev/null
@@ -0,0 +1,7 @@
+PASS Setting el.scrollLeft = 100000000 scrolls all the way to the right.
+PASS Setting el.scrollTop = 100000000 scrolls all the way to the bottom.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+top leftbottom right
+Tests that large scrollLeft/Top values aren't being ignored.
diff --git a/src/third_party/WebKit/LayoutTests/fast/scrolling/scroll-max-value.html b/src/third_party/WebKit/LayoutTests/fast/scrolling/scroll-max-value.html
new file mode 100644 (file)
index 0000000..d234da9
--- /dev/null
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <style>
+            #test {
+                width: 300px;
+                height: 300px;
+                overflow: auto;
+                border: 1px solid silver;
+            }
+            #test > article {
+                width: 1000px;
+                height: 1000px;
+                position: relative;
+            }
+            #top-left {
+                position: absolute;
+                top: 0;
+                left: 0;
+            }
+            #bottom-right {
+                position: absolute;
+                bottom: 0;
+                right: 0;
+            }
+        </style>
+        <script src="../../resources/js-test.js"></script>
+    </head>
+    <body>
+        <section id="test">
+            <article>
+                <span id="top-left">top left</span>
+                <span id="bottom-right">bottom right</span>
+            </article>
+        </section>
+        <p>
+            Tests that large scrollLeft/Top values aren't being ignored.
+        </p>
+        <script>
+            var el = document.getElementById('test');
+            el.scrollLeft = 100000000;
+            el.scrollTop = 100000000;
+
+            var expectedScrollLeft = el.firstElementChild.offsetWidth -
+                el.clientWidth;
+            if (el.scrollLeft == expectedScrollLeft) {
+                testPassed('Setting el.scrollLeft = 100000000 scrolls all ' +
+                    'the way to the right.');
+            } else {
+                testFailed('Setting el.scrollLeft = 100000000 scrolls to ' +
+                    el.scrollLeft + ', expected ' + expectedScrollLeft + '.');
+            }
+
+            var expectedScrollTop = el.firstElementChild.offsetHeight -
+                el.clientHeight;
+            if (el.scrollTop == expectedScrollTop) {
+                testPassed('Setting el.scrollTop = 100000000 scrolls all ' +
+                    'the way to the bottom.');
+            } else {
+                testFailed('Setting el.scrollTop = 100000000 scrolls to ' +
+                    el.scrollTop + ', expected ' + expectedScrollTop + '.');
+            }
+        </script>
+    </body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/text/bidi-ignorable-unicode.html b/src/third_party/WebKit/LayoutTests/fast/text/bidi-ignorable-unicode.html
deleted file mode 100644 (file)
index 250f1e7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-</head>
-<body>
-       <h3>Test for chromium bug : <a href="https://crbug.com/256333">256333</a>. Test case for Ignorable characters</h3>
-       <p>abc should be displayed</p>
-<p>a&#x2066;b&#x2069;c</p>
-</body>
-</html>
diff --git a/src/third_party/WebKit/LayoutTests/fast/xsl/modify-xsl-while-loading-crash-expected.txt b/src/third_party/WebKit/LayoutTests/fast/xsl/modify-xsl-while-loading-crash-expected.txt
new file mode 100644 (file)
index 0000000..7ef22e9
--- /dev/null
@@ -0,0 +1 @@
+PASS
diff --git a/src/third_party/WebKit/LayoutTests/fast/xsl/modify-xsl-while-loading-crash.html b/src/third_party/WebKit/LayoutTests/fast/xsl/modify-xsl-while-loading-crash.html
new file mode 100644 (file)
index 0000000..cef4a43
--- /dev/null
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<script>
+if (window.testRunner)
+    testRunner.dumpAsText();
+
+onload = function() {
+    var iframe = document.createElement('iframe');
+    document.getElementById("div").appendChild(iframe);
+    var iframeDoc = iframe.contentWindow.document;
+    var style = iframeDoc.createProcessingInstruction('xml-stylesheet', 'href="null.css" type="text/css"');
+    iframeDoc.insertBefore(style, iframeDoc.firstChild);
+    style.deleteData(0, 0);
+    style.deleteData(10, 1);
+}
+</script>
+<div id="div">PASS</div>
diff --git a/src/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash-expected.txt b/src/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash-expected.txt
new file mode 100644 (file)
index 0000000..a2f48eb
--- /dev/null
@@ -0,0 +1,2 @@
+Pass if there is no crash.
+Click anywhere to test manually.
diff --git a/src/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash.html b/src/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash.html
new file mode 100644 (file)
index 0000000..7c6df54
--- /dev/null
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+Pass if there is no crash.
+<div></div>
+<span></span>
+Click anywhere to test manually.
+<script>
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.waitUntilDone();
+}
+
+function requestFullscreen()
+{
+    document.querySelector("span").webkitRequestFullScreen();
+}
+
+document.addEventListener("webkitfullscreenchange", function()
+{
+    document.body.contentEditable = "true";
+    var range = document.createRange();
+    range.selectNode(document.body);
+    document.getSelection().addRange(range);
+    document.execCommand("hiliteColor", false, "#000");
+    if (window.testRunner) {
+        testRunner.notifyDone();
+    }
+});
+
+document.addEventListener("click", requestFullscreen);
+
+if (window.eventSender) {
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+}
+</script>
index 837dad8..3f2a47f 100644 (file)
@@ -20,8 +20,14 @@ InspectorTest.prepareConsoleMessageText = function(messageElement)
 
 InspectorTest.disableConsoleViewport = function()
 {
+    InspectorTest.fixConsoleViewportDimensions(600, 2000);
+}
+
+InspectorTest.fixConsoleViewportDimensions = function(width, height)
+{
     var viewport = WebInspector.ConsolePanel._view()._viewport;
-    viewport.element.style.height = "2000px";
+    viewport.element.style.width = width + "px";
+    viewport.element.style.height = height + "px";
     viewport.element.style.position = "absolute";
     viewport.invalidate();
 }
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/loading/form-action-using-replaceChild-expected.txt b/src/third_party/WebKit/LayoutTests/http/tests/loading/form-action-using-replaceChild-expected.txt
new file mode 100644 (file)
index 0000000..b528c62
--- /dev/null
@@ -0,0 +1,20 @@
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+frame "f" - didStartProvisionalLoadForFrame
+main frame - didFinishDocumentLoadForFrame
+frame "f" - didCommitLoadForFrame
+frame "f" - didReceiveTitle: Frame to test replaceChild "action"
+frame "f" - didFinishDocumentLoadForFrame
+frame "f" - didHandleOnloadEventsForFrame
+main frame - didHandleOnloadEventsForFrame
+frame "f" - didFinishLoadForFrame
+main frame - didFinishLoadForFrame
+frame "f" - didStartProvisionalLoadForFrame
+frame "f" - didCommitLoadForFrame
+frame "f" - didFinishDocumentLoadForFrame
+frame "f" - didHandleOnloadEventsForFrame
+frame "f" - didFinishLoadForFrame
+PASS successfullyParsed is true
+
+TEST COMPLETE
+Success! The form was rendered correctly. This test is for bug 388664
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/loading/form-action-using-replaceChild.html b/src/third_party/WebKit/LayoutTests/http/tests/loading/form-action-using-replaceChild.html
new file mode 100644 (file)
index 0000000..e35e426
--- /dev/null
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src="/js-test-resources/js-test.js"></script>
+<script>
+if (window.testRunner) {
+  jsTestIsAsync = true;
+}
+
+window.addEventListener('message', function(event) {
+  document.write(event.data +
+    " The form was rendered correctly." +
+    " This test is for bug <a href=\"https://code.google.com/p/chromium/issues/detail?id=388664\">388664</a>\n");
+    if (window.testRunner)
+      finishJSTest();
+}, false);
+</script>
+
+<iframe name="f" src="http://127.0.0.1:8000/loading/resources/frame-with-form-action-using-replace-child.html"></iframe>
+
+<script>
+window.onload = function() {
+  window.frames["f"].document.forms[0].submit();
+}
+</script>
+
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/loading/resources/form-post-success.html b/src/third_party/WebKit/LayoutTests/http/tests/loading/resources/form-post-success.html
new file mode 100644 (file)
index 0000000..5fe47a2
--- /dev/null
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+  <body>
+    <script>
+      top.postMessage("Success!", "*");
+    </script>
+  </body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/loading/resources/frame-with-form-action-using-replace-child.html b/src/third_party/WebKit/LayoutTests/http/tests/loading/resources/frame-with-form-action-using-replace-child.html
new file mode 100644 (file)
index 0000000..075db5a
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<title> Frame to test replaceChild "action" </title>
+<script type='text/javascript'>
+window.addEventListener("message", function(e) {
+  if (e.data != "Success!")
+    top.postMessage("Fail!", "*");
+  else
+    top.postMessage(e.data, "*");
+},false);
+
+(function() {
+  var html =
+    "<!DOCTYPE html>\n" +
+    "<html>\n" +
+    "<body>\n" +
+    "<form action=\"/loading/resources/form-post-success.html\" method=\"post\">\n" +
+    "<input type=\"submit\" value=\"Send\" />\n" +
+    "</form>\n" +
+    "</body>\n" +
+    "</html>";
+  document.addEventListener("DOMContentLoaded", function() {
+    var parsed_document = (new DOMParser).parseFromString(html, 'text/html');
+    document.documentElement.replaceChild(parsed_document.body, document.body);
+  });
+}).call(this);
+</script>
+</head>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM-expected.txt b/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM-expected.txt
new file mode 100644 (file)
index 0000000..0cff492
--- /dev/null
@@ -0,0 +1 @@
+This test opens a window that has an invisible DOM created using "createHTMLDocument" with a form pointing to an insecure location from a secure origin (crbug/398066).
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM.html b/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM.html
new file mode 100644 (file)
index 0000000..5ffe8f3
--- /dev/null
@@ -0,0 +1,23 @@
+<html>
+<body>
+<script>
+if (window.testRunner) {
+  testRunner.waitUntilDone();
+  testRunner.dumpAsText();
+  testRunner.setCanOpenWindows();
+  testRunner.setCloseRemainingWindowsWhenComplete(true);
+}
+
+window.addEventListener("message", function(e) {
+  if (window.testRunner)
+    testRunner.notifyDone();
+}, false);
+</script>
+
+<p>This test opens a window that has an invisible DOM created using "createHTMLDocument" with a form pointing to an insecure location from a secure origin (crbug/398066).</p>
+
+<script>
+window.open("https://127.0.0.1:8443/security/mixedContent/resources/frame-with-invisible-DOM-with-insecure-form.html");
+</script>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed-expected.txt b/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed-expected.txt
new file mode 100644 (file)
index 0000000..b5d6d10
--- /dev/null
@@ -0,0 +1 @@
+This test opens a window that shows a form with "action" pointing to an insecure location. We should not trigger a mixed content callback because the main frame in the window is HTTPS but is posting to a `javascript:` location.
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed.html b/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed.html
new file mode 100644 (file)
index 0000000..105979d
--- /dev/null
@@ -0,0 +1,26 @@
+<html>
+<body>
+<script>
+if (window.testRunner) {
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+    testRunner.setCanOpenWindows();
+    testRunner.setCloseRemainingWindowsWhenComplete(true);
+}
+if (window.internals)
+    internals.settings.setLaxMixedContentCheckingEnabled(false);
+
+window.addEventListener("message", function (e) {
+    if (window.testRunner)
+        testRunner.notifyDone();
+}, false);
+
+</script>
+<p>This test opens a window that shows a form with "action" pointing to an insecure
+location. We should not trigger a mixed content callback because the main frame
+in the window is HTTPS but is posting to a `javascript:` location.</p>
+<script>
+window.open("https://127.0.0.1:8443/security/mixedContent/resources/frame-with-javascript-formSubmission.html");
+</script>
+</body>
+</html>
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-invisible-DOM-with-insecure-form.html b/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-invisible-DOM-with-insecure-form.html
new file mode 100644 (file)
index 0000000..06f9fad
--- /dev/null
@@ -0,0 +1,15 @@
+<script>
+function load_content() {
+    var invisible_doc = document.implementation.createHTMLDocument("");
+    invisible_doc.body.innerHTML = '<html><body><form action="http://127.0.0.1:8080/security/resources/boring.html" method="post"></form></body></html>';
+}
+
+window.addEventListener("DOMContentLoaded", function listener() { load_content(); }, false);
+</script>
+
+<script>
+window.onload = function() {
+    if (window.opener)
+        window.opener.postMessage('done', '*');
+};
+</script>
diff --git a/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-javascript-formSubmission.html b/src/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-javascript-formSubmission.html
new file mode 100644 (file)
index 0000000..1e30d7c
--- /dev/null
@@ -0,0 +1,9 @@
+<form action="javascript:void(0)"
+      method="post">
+</form>
+<script>
+window.onload = function() {
+    if (window.opener)
+        window.opener.postMessage('done', '*');
+};
+</script>
index 823cb63..00c2433 100644 (file)
@@ -147,7 +147,7 @@ CONSOLE MESSAGE: line 9: Message #145
 CONSOLE MESSAGE: line 9: Message #146
 CONSOLE MESSAGE: line 9: Message #147
 CONSOLE MESSAGE: line 9: Message #148
-CONSOLE MESSAGE: line 9: Message #149
+CONSOLE MESSAGE: line 10: hello %cworld
 Tests that console viewport handles selection properly.
 
 
@@ -165,8 +165,8 @@ EOL
 
 Running: testSelectionMultiLineText
 Selected text:<<<EOL
-age #73 console-viewport-selection.html:9
-Message #74 console-viewport-selection.html:9
+age #74 console-viewport-selection.html:9
+Message #75 console-viewport-selection.html:9
 Message
 EOL
 
@@ -176,7 +176,7 @@ last visible message index: 77
 
 Running: testHalfScrollSelectionUp
 anchor = {item: 72, offset: 6}, head = {item: 77, offset: 6}
-first visible message index: 74
+first visible message index: 75
 
 Running: testHalfScrollSelectionDown
 anchor = {item: 72, offset: 6}, head = {item: 77, offset: 6}
@@ -192,15 +192,15 @@ last visible message index: 149
 
 Running: testShiftClickSelectionOver
 anchor = {item: 72, offset: 6}, head = {item: 10, offset: 0}
-last visible message index: 37
+first visible message index: 5
 
 Running: testShiftClickSelectionBelow
 anchor = {item: 72, offset: 6}, head = {item: 140, offset: 0}
-last visible message index: 149
+first visible message index: 135
 
 Running: testRemoveSelection
 anchor = null, head = null
-last visible message index: 149
+last visible message index: 147
 
 Running: testReversedVisibleSelection
 anchor = {item: 76, offset: 6}, head = {item: 71, offset: 6}
@@ -208,9 +208,12 @@ last visible message index: 76
 
 Running: testShiftClickReversedSelectionOver
 anchor = {item: 76, offset: 6}, head = {item: 10, offset: 0}
-last visible message index: 37
+first visible message index: 5
 
 Running: testShiftClickReversedSelectionBelow
 anchor = {item: 76, offset: 6}, head = {item: 140, offset: 0}
-last visible message index: 149
+first visible message index: 135
+
+Running: testZeroOffsetSelection
+Selected text: world
 
index 9ba221f..8cba6c8 100644 (file)
@@ -5,12 +5,14 @@
 <script>
 function populateConsoleWithMessages(count)
 {
-    for (var i = 0; i < count; ++i)
+    for (var i = 0; i < count - 1; ++i)
         console.log("Message #" + i);
+    console.log("hello %cworld", "color: blue");
 }
 
 function test()
 {
+    InspectorTest.fixConsoleViewportDimensions(600, 200);
     var consoleView = WebInspector.ConsolePanel._view();
     var viewport = consoleView._viewport;
     const minimumViewportMessagesCount = 10;
@@ -138,6 +140,20 @@ function test()
             dumpBottom();
             next();
         },
+
+        function testZeroOffsetSelection(next)
+        {
+            viewport.forceScrollItemToBeLast(messagesCount - 1);
+            var lastMessageElement = viewport.renderedElementAt(messagesCount - 1);
+            // there is a blue-colored "world" span in last message.
+            var blueSpan = lastMessageElement;
+            while (blueSpan.nodeName !== "SPAN" || blueSpan.textContent !== "world")
+                blueSpan = blueSpan.traverseNextNode();
+
+            window.getSelection().setBaseAndExtent(blueSpan, 0, blueSpan, blueSpan.textContent.length);
+            InspectorTest.addResult("Selected text: " + viewport._selectedText());
+            next();
+        },
     ];
 
     var awaitingMessagesCount = messagesCount;
@@ -148,7 +164,7 @@ function test()
     }
 
     InspectorTest.addConsoleSniffer(messageAdded, true);
-    InspectorTest.evaluateInConsole(String.sprintf("populateConsoleWithMessages(%d)", messagesCount));
+    InspectorTest.evaluateInPage(String.sprintf("populateConsoleWithMessages(%d)", messagesCount));
 
     function dumpSelectionModelElement(model)
     {
diff --git a/src/third_party/WebKit/LayoutTests/inspector/elements/styles/resources/styles-update-links-2.css b/src/third_party/WebKit/LayoutTests/inspector/elements/styles/resources/styles-update-links-2.css
new file mode 100644 (file)
index 0000000..144bb45
--- /dev/null
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/**
+ * The line nubmer url has to be greater then amount of lines in styles-update-links.css
+ * @see crbug.com/390300
+ */
+.left-intact {
+    line-height: 1;
+}
index 20a9d41..7ad8a60 100644 (file)
@@ -31,6 +31,10 @@ padding: 1em;
 box-sizing: border-box;
 
 [expanded] 
+.left-intact  { (styles-update-links-2.css:19 -> styles-update-links-2.css:19:1)
+line-height: 1;
+
+[expanded] 
 div  { (user agent stylesheet)
 display: block;
 
@@ -71,6 +75,10 @@ padding: 1em;
 box-sizing: border-box;
 
 [expanded] 
+.left-intact  { (styles-update-links-2.css:19 -> styles-update-links-2.css:19:1)
+line-height: 1;
+
+[expanded] 
 div  { (user agent stylesheet)
 display: block;
 
@@ -81,6 +89,7 @@ display: block;
 4 rule ranges are equal.
 3 rule ranges are equal.
 3 rule ranges are equal.
+3 rule ranges are equal.
 0 rule ranges are equal.
 
 
@@ -118,6 +127,10 @@ padding: 1em;
 box-sizing: border-box;
 
 [expanded] 
+.left-intact  { (styles-update-links-2.css:19 -> styles-update-links-2.css:19:1)
+line-height: 1;
+
+[expanded] 
 div  { (user agent stylesheet)
 display: block;
 
@@ -128,6 +141,7 @@ display: block;
 4 rule ranges are equal.
 3 rule ranges are equal.
 3 rule ranges are equal.
+3 rule ranges are equal.
 0 rule ranges are equal.
 
 
@@ -165,6 +179,10 @@ padding: 1em;
 box-sizing: border-box;
 
 [expanded] 
+.left-intact  { (styles-update-links-2.css:19 -> styles-update-links-2.css:19:1)
+line-height: 1;
+
+[expanded] 
 div  { (user agent stylesheet)
 display: block;
 
@@ -175,5 +193,6 @@ display: block;
 4 rule ranges are equal.
 3 rule ranges are equal.
 3 rule ranges are equal.
+3 rule ranges are equal.
 0 rule ranges are equal.
 
index 0d40846..0fc26ea 100644 (file)
@@ -166,6 +166,7 @@ function test()
     InspectorTest.selectNodeAndWaitForStyles("container", insertProperty);
 }
 </script>
+<link rel="stylesheet" href="resources/styles-update-links-2.css"></link>
 <link rel="stylesheet" href="resources/styles-update-links.css"></link>
 </head>
 
index 6a3c87d..8d68ed4 100644 (file)
@@ -1,9 +1,7 @@
 var captionsButtonElement;
 var captionsButtonCoordinates;
 
-// These reflect the values used to fade in/out the media controls. Should
-// mirror the values 'fadeInDuration'/'fadeOutDuration' in MediaControlElements.cpp.
-const controlsFadeInDurationMs = 100;
+// As specified in mediaControls.css, this is how long it takes to fade out controls
 const controlsFadeOutDurationMs = 300;
 
 // The timeout for the hide-after-no-mouse-movement behavior. Defined (and
index f849f7f..f8690ff 100644 (file)
@@ -2,6 +2,6 @@ Test that video controls re-appear when the media (<video>) element is focused.
 
 EXPECTED (getComputedStyle(controls).opacity == '0') OK
 EXPECTED (getComputedStyle(controls).opacity == '1') OK
-
+EXPECTED (getComputedStyle(controls).opacity == '1') OK
 END OF TEST
 
index 2503e28..42e3691 100644 (file)
@@ -18,16 +18,15 @@ video.addEventListener("playing", function()
         controls = mediaControlsButton(video, "panel");
 
         testExpected("getComputedStyle(controls).opacity", 0);
-
         video.focus();
 
-        setTimeout(function()
-        {
-            testExpected("getComputedStyle(controls).opacity", 1);
+        testExpected("getComputedStyle(controls).opacity", 1);
+
+        // We fade out when focus is lost, so the opacity is still 1
+        video.blur();
+        testExpected("getComputedStyle(controls).opacity", 1);
 
-            consoleWrite("");
-            endTest();
-        }, controlsFadeInDurationMs);
+        endTest();
     }, video);
 });
 </script>
diff --git a/src/third_party/WebKit/LayoutTests/platform/linux/compositing/squashing/squashing-print-expected.png b/src/third_party/WebKit/LayoutTests/platform/linux/compositing/squashing/squashing-print-expected.png
new file mode 100644 (file)
index 0000000..ac67b78
Binary files /dev/null and b/src/third_party/WebKit/LayoutTests/platform/linux/compositing/squashing/squashing-print-expected.png differ
diff --git a/src/third_party/WebKit/LayoutTests/platform/linux/compositing/squashing/squashing-print-expected.txt b/src/third_party/WebKit/LayoutTests/platform/linux/compositing/squashing/squashing-print-expected.txt
new file mode 100644 (file)
index 0000000..6c13f4b
--- /dev/null
@@ -0,0 +1,9 @@
+layer at (0,0) size 1000x152
+  RenderView at (0,0) size 1000x118
+layer at (0,0) size 800x118
+  RenderBlock {HTML} at (0,0) size 800x118
+    RenderBody {BODY} at (8,8) size 784x102
+layer at (8,8) size 102x102
+  RenderBlock {DIV} at (0,0) size 102x102 [border: (1px solid #000000)]
+layer at (50,50) size 102x102
+  RenderBlock (positioned) {DIV} at (50,50) size 102x102 [border: (1px solid #000000)]
index f2c8ece..b38742b 100644 (file)
@@ -361,40 +361,48 @@ WARNING: Moved in the wrong direction in step 5: from (733, 1075) to (767, 1015)
 WARNING: Moved in the wrong direction in step 11: from (733, 1075) to (767, 1015).
 Test 25, LTR:
   Moving right: "\n        abcdefABC"[9, 10, 11, 12, 13, 14, 15], "DEF\n    "[2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16], "DEF\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (90, 1109) to (82, 1109).
+WARNING: Moved in the wrong direction in step 2: from (97, 1109) to (90, 1109).
+WARNING: Moved in the wrong direction in step 3: from (90, 1109) to (82, 1109).
 WARNING: Moved in the wrong direction in step 8: from (52, 1109) to (44, 1109).
   Moving left:  "DEF\n    "[3], "\n        abcdefABC"[16, 17, 18], <DIV>[2], "DEF\n    "[1, 2], "\n        abcdefABC"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (44, 1109) to (52, 1109).
-WARNING: Moved in the wrong direction in step 12: from (82, 1109) to (90, 1109).
+WARNING: Moved in the wrong direction in step 11: from (82, 1109) to (90, 1109).
+WARNING: Moved in the wrong direction in step 12: from (90, 1109) to (97, 1109).
 Test 25, RTL:
   Moving left: "\n        abcdefABC"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "DEF\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (672, 1109) to (676, 1109).
-WARNING: Moved in the wrong direction in step 5: from (676, 1109) to (684, 1109).
+WARNING: Moved in the wrong direction in step 3: from (672, 1109) to (676, 1109).
+WARNING: Moved in the wrong direction in step 4: from (676, 1109) to (684, 1109).
+WARNING: Moved in the wrong direction in step 5: from (684, 1109) to (691, 1109).
 WARNING: Moved in the wrong direction in step 12: from (734, 1109) to (742, 1109).
 WARNING: Moved in the wrong direction in step 13: from (742, 1109) to (749, 1109).
   Moving right:  "DEF\n    "[3, 2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (749, 1109) to (742, 1109).
 WARNING: Moved in the wrong direction in step 2: from (742, 1109) to (734, 1109).
-WARNING: Moved in the wrong direction in step 9: from (684, 1109) to (676, 1109).
-WARNING: Moved in the wrong direction in step 10: from (676, 1109) to (672, 1109).
+WARNING: Moved in the wrong direction in step 9: from (691, 1109) to (684, 1109).
+WARNING: Moved in the wrong direction in step 10: from (684, 1109) to (676, 1109).
+WARNING: Moved in the wrong direction in step 11: from (676, 1109) to (672, 1109).
 Test 26, LTR:
   Moving right: "\n        ABCDEFabc"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "def\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (133, 1144) to (129, 1144).
-WARNING: Moved in the wrong direction in step 5: from (129, 1144) to (122, 1144).
+WARNING: Moved in the wrong direction in step 3: from (133, 1144) to (129, 1144).
+WARNING: Moved in the wrong direction in step 4: from (129, 1144) to (122, 1144).
+WARNING: Moved in the wrong direction in step 5: from (122, 1144) to (113, 1144).
 WARNING: Moved in the wrong direction in step 12: from (68, 1144) to (61, 1144).
 WARNING: Moved in the wrong direction in step 13: from (61, 1144) to (56, 1144).
   Moving left:  "def\n    "[3, 2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (56, 1144) to (61, 1144).
 WARNING: Moved in the wrong direction in step 2: from (61, 1144) to (68, 1144).
-WARNING: Moved in the wrong direction in step 9: from (122, 1144) to (129, 1144).
-WARNING: Moved in the wrong direction in step 10: from (129, 1144) to (133, 1144).
+WARNING: Moved in the wrong direction in step 9: from (113, 1144) to (122, 1144).
+WARNING: Moved in the wrong direction in step 10: from (122, 1144) to (129, 1144).
+WARNING: Moved in the wrong direction in step 11: from (129, 1144) to (133, 1144).
 Test 26, RTL:
   Moving left: "\n        ABCDEFabc"[9, 10, 11, 12, 13, 14, 15], "def\n    "[2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16], "def\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (718, 1144) to (725, 1144).
+WARNING: Moved in the wrong direction in step 2: from (709, 1144) to (718, 1144).
+WARNING: Moved in the wrong direction in step 3: from (718, 1144) to (725, 1144).
 WARNING: Moved in the wrong direction in step 8: from (753, 1144) to (760, 1144).
   Moving right:  "def\n    "[3], "\n        ABCDEFabc"[16, 17, 18], <DIV>[2], "def\n    "[1, 2], "\n        ABCDEFabc"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (760, 1144) to (753, 1144).
-WARNING: Moved in the wrong direction in step 12: from (725, 1144) to (718, 1144).
+WARNING: Moved in the wrong direction in step 11: from (725, 1144) to (718, 1144).
+WARNING: Moved in the wrong direction in step 12: from (718, 1144) to (709, 1144).
 Test 27, LTR:
   Moving right: "\n        abc"[9, 10, 11, 12], <DIV>[2], "DEFghi\n    "[2, 1], <DIV>[5, 4], "ABC"[3, 2, 1], "DEFghi\n    "[3, 4, 5, 6]
 WARNING: Moved in the wrong direction in step 4: from (304, 1181) to (52, 1181).
diff --git a/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line-expected.png b/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line-expected.png
deleted file mode 100644 (file)
index 480d4c4..0000000
Binary files a/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line-expected.png and /dev/null differ
diff --git a/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line-expected.txt b/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-continuation-on-line-expected.txt
deleted file mode 100644 (file)
index 6fada06..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 800x116
-  RenderBlock {HTML} at (0,0) size 800x116
-    RenderBody {BODY} at (0,16) size 800x80
-      RenderBlock {P} at (0,0) size 800x40
-        RenderText {#text} at (0,0) size 792x39
-          text run at (0,0) width 792: "When a block element becomes a float we should not strip anonymous blocks wrapping its inline siblings if there are other blocks on"
-          text run at (0,20) width 22: "the "
-          text run at (22,20) width 549: "line. In this test case, the block is wrapped in an anonymous block as part of a continuation."
-layer at (0,76) size 800x20
-  RenderBlock (relative positioned) {DIV} at (0,60) size 800x20 [bgcolor=#CCCCCC]
-    RenderBlock (anonymous) at (0,0) size 800x0
-      RenderInline {SPAN} at (0,0) size 0x0
-        RenderText {#text} at (0,0) size 0x0
-    RenderBlock (anonymous) at (0,0) size 800x20
-      RenderBlock {P} at (0,0) size 800x20
-        RenderText {#text} at (0,0) size 80x20
-          text run at (0,0) width 80: "Text"
-    RenderBlock (anonymous) at (0,40) size 800x0
-      RenderInline {SPAN} at (0,0) size 0x0
-      RenderText {#text} at (0,0) size 0x0
-    RenderBlock (floating) {DD} at (800,40) size 0x0
diff --git a/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line-expected.png b/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line-expected.png
deleted file mode 100644 (file)
index a0e3185..0000000
Binary files a/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line-expected.png and /dev/null differ
diff --git a/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line-expected.txt b/src/third_party/WebKit/LayoutTests/platform/linux/fast/block/do-not-strip-anonymous-blocks-when-block-child-becomes-float-and-other-block-on-line-expected.txt
deleted file mode 100644 (file)
index ad2ed50..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 800x96
-  RenderBlock {HTML} at (0,0) size 800x96
-    RenderBody {BODY} at (0,16) size 800x80
-      RenderBlock {P} at (0,0) size 800x40
-        RenderText {#text} at (0,0) size 792x39
-          text run at (0,0) width 792: "When a block element becomes a float we should not strip anonymous blocks wrapping its inline siblings if there are other blocks on"
-          text run at (0,20) width 46: "the line."
-layer at (0,76) size 800x20
-  RenderBlock (relative positioned) {DIV} at (0,60) size 800x20 [bgcolor=#CCCCCC]
-    RenderBlock (anonymous) at (0,0) size 800x0
-      RenderInline {STRONG} at (0,0) size 0x0
-      RenderText {#text} at (0,0) size 0x0
-    RenderBlock {P} at (0,0) size 800x0
-    RenderBlock (floating) {DD} at (800,0) size 0x0
-    RenderBlock (anonymous) at (0,0) size 800x20
-      RenderBR {BR} at (0,0) size 0x20
index 6d773cf..0f4b258 100644 (file)
@@ -357,40 +357,48 @@ WARNING: Moved in the wrong direction in step 5: from (720, 1051) to (767, 993).
 WARNING: Moved in the wrong direction in step 11: from (720, 1051) to (767, 993).
 Test 25, LTR:
   Moving right: "\n        abcdefABC"[9, 10, 11, 12, 13, 14, 15], "DEF\n    "[2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16], "DEF\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (105, 1083) to (93, 1083).
+WARNING: Moved in the wrong direction in step 2: from (113, 1083) to (105, 1083).
+WARNING: Moved in the wrong direction in step 3: from (105, 1083) to (93, 1083).
 WARNING: Moved in the wrong direction in step 8: from (56, 1083) to (46, 1083).
   Moving left:  "DEF\n    "[3], "\n        abcdefABC"[16, 17, 18], <DIV>[2], "DEF\n    "[1, 2], "\n        abcdefABC"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (46, 1083) to (56, 1083).
-WARNING: Moved in the wrong direction in step 12: from (93, 1083) to (105, 1083).
+WARNING: Moved in the wrong direction in step 11: from (93, 1083) to (105, 1083).
+WARNING: Moved in the wrong direction in step 12: from (105, 1083) to (113, 1083).
 Test 25, RTL:
   Moving left: "\n        abcdefABC"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "DEF\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (649, 1083) to (654, 1083).
-WARNING: Moved in the wrong direction in step 5: from (654, 1083) to (666, 1083).
+WARNING: Moved in the wrong direction in step 3: from (649, 1083) to (654, 1083).
+WARNING: Moved in the wrong direction in step 4: from (654, 1083) to (666, 1083).
+WARNING: Moved in the wrong direction in step 5: from (666, 1083) to (673, 1083).
 WARNING: Moved in the wrong direction in step 12: from (725, 1083) to (735, 1083).
 WARNING: Moved in the wrong direction in step 13: from (735, 1083) to (743, 1083).
   Moving right:  "DEF\n    "[3, 2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (743, 1083) to (735, 1083).
 WARNING: Moved in the wrong direction in step 2: from (735, 1083) to (725, 1083).
-WARNING: Moved in the wrong direction in step 9: from (666, 1083) to (654, 1083).
-WARNING: Moved in the wrong direction in step 10: from (654, 1083) to (649, 1083).
+WARNING: Moved in the wrong direction in step 9: from (673, 1083) to (666, 1083).
+WARNING: Moved in the wrong direction in step 10: from (666, 1083) to (654, 1083).
+WARNING: Moved in the wrong direction in step 11: from (654, 1083) to (649, 1083).
 Test 26, LTR:
   Moving right: "\n        ABCDEFabc"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "def\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (155, 1116) to (149, 1116).
-WARNING: Moved in the wrong direction in step 5: from (149, 1116) to (140, 1116).
+WARNING: Moved in the wrong direction in step 3: from (155, 1116) to (149, 1116).
+WARNING: Moved in the wrong direction in step 4: from (149, 1116) to (140, 1116).
+WARNING: Moved in the wrong direction in step 5: from (140, 1116) to (129, 1116).
 WARNING: Moved in the wrong direction in step 12: from (77, 1116) to (68, 1116).
 WARNING: Moved in the wrong direction in step 13: from (68, 1116) to (62, 1116).
   Moving left:  "def\n    "[3, 2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (62, 1116) to (68, 1116).
 WARNING: Moved in the wrong direction in step 2: from (68, 1116) to (77, 1116).
-WARNING: Moved in the wrong direction in step 9: from (140, 1116) to (149, 1116).
-WARNING: Moved in the wrong direction in step 10: from (149, 1116) to (155, 1116).
+WARNING: Moved in the wrong direction in step 9: from (129, 1116) to (140, 1116).
+WARNING: Moved in the wrong direction in step 10: from (140, 1116) to (149, 1116).
+WARNING: Moved in the wrong direction in step 11: from (149, 1116) to (155, 1116).
 Test 26, RTL:
   Moving left: "\n        ABCDEFabc"[9, 10, 11, 12, 13, 14, 15], "def\n    "[2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16], "def\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (702, 1116) to (711, 1116).
+WARNING: Moved in the wrong direction in step 2: from (691, 1116) to (702, 1116).
+WARNING: Moved in the wrong direction in step 3: from (702, 1116) to (711, 1116).
 WARNING: Moved in the wrong direction in step 8: from (748, 1116) to (757, 1116).
   Moving right:  "def\n    "[3], "\n        ABCDEFabc"[16, 17, 18], <DIV>[2], "def\n    "[1, 2], "\n        ABCDEFabc"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (757, 1116) to (748, 1116).
-WARNING: Moved in the wrong direction in step 12: from (711, 1116) to (702, 1116).
+WARNING: Moved in the wrong direction in step 11: from (711, 1116) to (702, 1116).
+WARNING: Moved in the wrong direction in step 12: from (702, 1116) to (691, 1116).
 Test 27, LTR:
   Moving right: "\n        abc"[9, 10, 11, 12], <DIV>[2], "DEFghi\n    "[2, 1], <DIV>[5, 4], "ABC"[3, 2, 1], "DEFghi\n    "[3, 4, 5, 6]
 WARNING: Moved in the wrong direction in step 4: from (298, 1149) to (56, 1149).
index f2c8ece..82c66e8 100644 (file)
@@ -361,100 +361,116 @@ WARNING: Moved in the wrong direction in step 5: from (733, 1075) to (767, 1015)
 WARNING: Moved in the wrong direction in step 11: from (733, 1075) to (767, 1015).
 Test 25, LTR:
   Moving right: "\n        abcdefABC"[9, 10, 11, 12, 13, 14, 15], "DEF\n    "[2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16], "DEF\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (90, 1109) to (82, 1109).
+WARNING: Moved in the wrong direction in step 2: from (97, 1109) to (90, 1109).
+WARNING: Moved in the wrong direction in step 3: from (90, 1109) to (82, 1109).
 WARNING: Moved in the wrong direction in step 8: from (52, 1109) to (44, 1109).
   Moving left:  "DEF\n    "[3], "\n        abcdefABC"[16, 17, 18], <DIV>[2], "DEF\n    "[1, 2], "\n        abcdefABC"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (44, 1109) to (52, 1109).
-WARNING: Moved in the wrong direction in step 12: from (82, 1109) to (90, 1109).
+WARNING: Moved in the wrong direction in step 11: from (82, 1109) to (90, 1109).
+WARNING: Moved in the wrong direction in step 12: from (90, 1109) to (97, 1109).
 Test 25, RTL:
   Moving left: "\n        abcdefABC"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "DEF\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (672, 1109) to (676, 1109).
-WARNING: Moved in the wrong direction in step 5: from (676, 1109) to (684, 1109).
+WARNING: Moved in the wrong direction in step 3: from (672, 1109) to (676, 1109).
+WARNING: Moved in the wrong direction in step 4: from (676, 1109) to (684, 1109).
+WARNING: Moved in the wrong direction in step 5: from (684, 1109) to (691, 1109).
 WARNING: Moved in the wrong direction in step 12: from (734, 1109) to (742, 1109).
 WARNING: Moved in the wrong direction in step 13: from (742, 1109) to (749, 1109).
   Moving right:  "DEF\n    "[3, 2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (749, 1109) to (742, 1109).
 WARNING: Moved in the wrong direction in step 2: from (742, 1109) to (734, 1109).
-WARNING: Moved in the wrong direction in step 9: from (684, 1109) to (676, 1109).
-WARNING: Moved in the wrong direction in step 10: from (676, 1109) to (672, 1109).
+WARNING: Moved in the wrong direction in step 9: from (691, 1109) to (684, 1109).
+WARNING: Moved in the wrong direction in step 10: from (684, 1109) to (676, 1109).
+WARNING: Moved in the wrong direction in step 11: from (676, 1109) to (672, 1109).
 Test 26, LTR:
   Moving right: "\n        ABCDEFabc"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "def\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (133, 1144) to (129, 1144).
-WARNING: Moved in the wrong direction in step 5: from (129, 1144) to (122, 1144).
+WARNING: Moved in the wrong direction in step 3: from (133, 1144) to (129, 1144).
+WARNING: Moved in the wrong direction in step 4: from (129, 1144) to (122, 1144).
+WARNING: Moved in the wrong direction in step 5: from (122, 1144) to (113, 1144).
 WARNING: Moved in the wrong direction in step 12: from (68, 1144) to (61, 1144).
 WARNING: Moved in the wrong direction in step 13: from (61, 1144) to (56, 1144).
   Moving left:  "def\n    "[3, 2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (56, 1144) to (61, 1144).
 WARNING: Moved in the wrong direction in step 2: from (61, 1144) to (68, 1144).
-WARNING: Moved in the wrong direction in step 9: from (122, 1144) to (129, 1144).
-WARNING: Moved in the wrong direction in step 10: from (129, 1144) to (133, 1144).
+WARNING: Moved in the wrong direction in step 9: from (113, 1144) to (122, 1144).
+WARNING: Moved in the wrong direction in step 10: from (122, 1144) to (129, 1144).
+WARNING: Moved in the wrong direction in step 11: from (129, 1144) to (133, 1144).
 Test 26, RTL:
   Moving left: "\n        ABCDEFabc"[9, 10, 11, 12, 13, 14, 15], "def\n    "[2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16], "def\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (718, 1144) to (725, 1144).
+WARNING: Moved in the wrong direction in step 2: from (709, 1144) to (718, 1144).
+WARNING: Moved in the wrong direction in step 3: from (718, 1144) to (725, 1144).
 WARNING: Moved in the wrong direction in step 8: from (753, 1144) to (760, 1144).
   Moving right:  "def\n    "[3], "\n        ABCDEFabc"[16, 17, 18], <DIV>[2], "def\n    "[1, 2], "\n        ABCDEFabc"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (760, 1144) to (753, 1144).
-WARNING: Moved in the wrong direction in step 12: from (725, 1144) to (718, 1144).
+WARNING: Moved in the wrong direction in step 11: from (725, 1144) to (718, 1144).
+WARNING: Moved in the wrong direction in step 12: from (718, 1144) to (709, 1144).
 Test 27, LTR:
   Moving right: "\n        abc"[9, 10, 11, 12], <DIV>[2], "DEFghi\n    "[2, 1], <DIV>[5, 4], "ABC"[3, 2, 1], "DEFghi\n    "[3, 4, 5, 6]
-WARNING: Moved in the wrong direction in step 4: from (304, 1181) to (52, 1181).
-WARNING: Moved in the wrong direction in step 6: from (52, 1181) to (44, 1181).
-WARNING: Moved in the wrong direction in step 9: from (279, 1181) to (59, 1181).
-WARNING: Moved in the wrong direction in step 10: from (59, 1181) to (52, 1181).
-WARNING: Moved in the wrong direction in step 11: from (52, 1181) to (44, 1181).
-WARNING: Moved in the wrong direction in step 14: from (279, 1181) to (272, 1181).
-WARNING: Moved in the wrong direction in step 15: from (272, 1181) to (267, 1181).
+WARNING: Moved in the wrong direction in step 2: from (224, 1179) to (216, 1179).
+WARNING: Moved in the wrong direction in step 4: from (283, 1179) to (52, 1179).
+WARNING: Moved in the wrong direction in step 6: from (52, 1179) to (44, 1179).
+WARNING: Moved in the wrong direction in step 8: from (275, 1179) to (211, 1179).
+WARNING: Moved in the wrong direction in step 9: from (211, 1179) to (59, 1179).
+WARNING: Moved in the wrong direction in step 10: from (59, 1179) to (52, 1179).
+WARNING: Moved in the wrong direction in step 11: from (52, 1179) to (44, 1179).
+WARNING: Moved in the wrong direction in step 15: from (275, 1179) to (268, 1179).
   Moving left:  "DEFghi\n    "[6, 5, 4, 3], "ABC"[1, 2, 3], <DIV>[4, 5], "DEFghi\n    "[1, 2], <DIV>[2], "\n        abc"[12, 11, 10, 9]
-WARNING: Moved in the wrong direction in step 1: from (267, 1181) to (272, 1181).
-WARNING: Moved in the wrong direction in step 2: from (272, 1181) to (279, 1181).
-WARNING: Moved in the wrong direction in step 5: from (44, 1181) to (52, 1181).
-WARNING: Moved in the wrong direction in step 6: from (52, 1181) to (59, 1181).
-WARNING: Moved in the wrong direction in step 7: from (59, 1181) to (279, 1181).
-WARNING: Moved in the wrong direction in step 10: from (44, 1181) to (52, 1181).
-WARNING: Moved in the wrong direction in step 12: from (52, 1181) to (304, 1181).
+WARNING: Moved in the wrong direction in step 1: from (268, 1179) to (275, 1179).
+WARNING: Moved in the wrong direction in step 5: from (44, 1179) to (52, 1179).
+WARNING: Moved in the wrong direction in step 6: from (52, 1179) to (59, 1179).
+WARNING: Moved in the wrong direction in step 7: from (59, 1179) to (211, 1179).
+WARNING: Moved in the wrong direction in step 8: from (211, 1179) to (275, 1179).
+WARNING: Moved in the wrong direction in step 10: from (44, 1179) to (52, 1179).
+WARNING: Moved in the wrong direction in step 12: from (52, 1179) to (283, 1179).
+WARNING: Moved in the wrong direction in step 14: from (216, 1179) to (224, 1179).
 Test 27, RTL:
   Moving left: "\n        abc"[9, 11, 10, 12], <DIV>[2], "ABC"[1, 2, 3], <DIV>[4, 5], "DEFghi\n    "[1, 2, 3, 5, 4, 6]
-WARNING: Moved in the wrong direction in step 4: from (501, 1181) to (761, 1181).
-WARNING: Moved in the wrong direction in step 6: from (753, 1181) to (761, 1181).
-WARNING: Moved in the wrong direction in step 10: from (574, 1181) to (753, 1181).
-WARNING: Moved in the wrong direction in step 11: from (753, 1181) to (761, 1181).
-WARNING: Moved in the wrong direction in step 14: from (574, 1181) to (581, 1181).
+WARNING: Moved in the wrong direction in step 2: from (526, 1179) to (534, 1179).
+WARNING: Moved in the wrong direction in step 4: from (522, 1179) to (761, 1179).
+WARNING: Moved in the wrong direction in step 6: from (753, 1179) to (761, 1179).
+WARNING: Moved in the wrong direction in step 10: from (585, 1179) to (753, 1179).
+WARNING: Moved in the wrong direction in step 11: from (753, 1179) to (761, 1179).
+WARNING: Moved in the wrong direction in step 14: from (585, 1179) to (593, 1179).
   Moving right:  "DEFghi\n    "[6, 4, 5, 3, 2, 1], <DIV>[5, 4], "ABC"[3, 2, 1], <DIV>[2], "\n        abc"[12, 10, 11, 9]
-WARNING: Moved in the wrong direction in step 2: from (581, 1181) to (574, 1181).
-WARNING: Moved in the wrong direction in step 5: from (761, 1181) to (753, 1181).
-WARNING: Moved in the wrong direction in step 6: from (753, 1181) to (574, 1181).
-WARNING: Moved in the wrong direction in step 10: from (761, 1181) to (753, 1181).
-WARNING: Moved in the wrong direction in step 12: from (761, 1181) to (501, 1181).
+WARNING: Moved in the wrong direction in step 2: from (593, 1179) to (585, 1179).
+WARNING: Moved in the wrong direction in step 5: from (761, 1179) to (753, 1179).
+WARNING: Moved in the wrong direction in step 6: from (753, 1179) to (585, 1179).
+WARNING: Moved in the wrong direction in step 10: from (761, 1179) to (753, 1179).
+WARNING: Moved in the wrong direction in step 12: from (761, 1179) to (522, 1179).
+WARNING: Moved in the wrong direction in step 14: from (534, 1179) to (526, 1179).
 Test 28, LTR:
   Moving right: "\n        ABC"[9, 11, 10, 12], <DIV>[2], "abc"[1, 2, 3], <DIV>[4, 5], "defDEF\n    "[1, 2, 3, 5, 4, 6]
-WARNING: Moved in the wrong direction in step 4: from (306, 1221) to (42, 1221).
-WARNING: Moved in the wrong direction in step 6: from (49, 1221) to (42, 1221).
-WARNING: Moved in the wrong direction in step 10: from (229, 1221) to (49, 1221).
-WARNING: Moved in the wrong direction in step 11: from (49, 1221) to (42, 1221).
-WARNING: Moved in the wrong direction in step 14: from (229, 1221) to (221, 1221).
+WARNING: Moved in the wrong direction in step 2: from (279, 1215) to (272, 1215).
+WARNING: Moved in the wrong direction in step 4: from (283, 1215) to (42, 1215).
+WARNING: Moved in the wrong direction in step 6: from (49, 1215) to (42, 1215).
+WARNING: Moved in the wrong direction in step 10: from (217, 1215) to (49, 1215).
+WARNING: Moved in the wrong direction in step 11: from (49, 1215) to (42, 1215).
+WARNING: Moved in the wrong direction in step 14: from (217, 1215) to (209, 1215).
   Moving left:  "defDEF\n    "[6, 4, 5, 3, 2, 1], <DIV>[5, 4], "abc"[3, 2, 1], <DIV>[2], "\n        ABC"[12, 10, 11, 9]
-WARNING: Moved in the wrong direction in step 2: from (221, 1221) to (229, 1221).
-WARNING: Moved in the wrong direction in step 5: from (42, 1221) to (49, 1221).
-WARNING: Moved in the wrong direction in step 6: from (49, 1221) to (229, 1221).
-WARNING: Moved in the wrong direction in step 10: from (42, 1221) to (49, 1221).
-WARNING: Moved in the wrong direction in step 12: from (42, 1221) to (306, 1221).
+WARNING: Moved in the wrong direction in step 2: from (209, 1215) to (217, 1215).
+WARNING: Moved in the wrong direction in step 5: from (42, 1215) to (49, 1215).
+WARNING: Moved in the wrong direction in step 6: from (49, 1215) to (217, 1215).
+WARNING: Moved in the wrong direction in step 10: from (42, 1215) to (49, 1215).
+WARNING: Moved in the wrong direction in step 12: from (42, 1215) to (283, 1215).
+WARNING: Moved in the wrong direction in step 14: from (272, 1215) to (279, 1215).
 Test 28, RTL:
   Moving left: "\n        ABC"[9, 10, 11, 12], <DIV>[2], "defDEF\n    "[2, 1], <DIV>[5, 4], "abc"[3, 2, 1], "defDEF\n    "[3, 4, 5, 6]
-WARNING: Moved in the wrong direction in step 4: from (499, 1221) to (753, 1221).
-WARNING: Moved in the wrong direction in step 6: from (753, 1221) to (760, 1221).
-WARNING: Moved in the wrong direction in step 9: from (525, 1221) to (748, 1221).
-WARNING: Moved in the wrong direction in step 10: from (748, 1221) to (753, 1221).
-WARNING: Moved in the wrong direction in step 11: from (753, 1221) to (760, 1221).
-WARNING: Moved in the wrong direction in step 14: from (525, 1221) to (533, 1221).
-WARNING: Moved in the wrong direction in step 15: from (533, 1221) to (540, 1221).
+WARNING: Moved in the wrong direction in step 2: from (584, 1215) to (591, 1215).
+WARNING: Moved in the wrong direction in step 4: from (522, 1215) to (753, 1215).
+WARNING: Moved in the wrong direction in step 6: from (753, 1215) to (760, 1215).
+WARNING: Moved in the wrong direction in step 8: from (529, 1215) to (595, 1215).
+WARNING: Moved in the wrong direction in step 9: from (595, 1215) to (748, 1215).
+WARNING: Moved in the wrong direction in step 10: from (748, 1215) to (753, 1215).
+WARNING: Moved in the wrong direction in step 11: from (753, 1215) to (760, 1215).
+WARNING: Moved in the wrong direction in step 15: from (529, 1215) to (537, 1215).
   Moving right:  "defDEF\n    "[6, 5, 4, 3], "abc"[1, 2, 3], <DIV>[4, 5], "defDEF\n    "[1, 2], <DIV>[2], "\n        ABC"[12, 11, 10, 9]
-WARNING: Moved in the wrong direction in step 1: from (540, 1221) to (533, 1221).
-WARNING: Moved in the wrong direction in step 2: from (533, 1221) to (525, 1221).
-WARNING: Moved in the wrong direction in step 5: from (760, 1221) to (753, 1221).
-WARNING: Moved in the wrong direction in step 6: from (753, 1221) to (748, 1221).
-WARNING: Moved in the wrong direction in step 7: from (748, 1221) to (525, 1221).
-WARNING: Moved in the wrong direction in step 10: from (760, 1221) to (753, 1221).
-WARNING: Moved in the wrong direction in step 12: from (753, 1221) to (499, 1221).
+WARNING: Moved in the wrong direction in step 1: from (537, 1215) to (529, 1215).
+WARNING: Moved in the wrong direction in step 5: from (760, 1215) to (753, 1215).
+WARNING: Moved in the wrong direction in step 6: from (753, 1215) to (748, 1215).
+WARNING: Moved in the wrong direction in step 7: from (748, 1215) to (595, 1215).
+WARNING: Moved in the wrong direction in step 8: from (595, 1215) to (529, 1215).
+WARNING: Moved in the wrong direction in step 10: from (760, 1215) to (753, 1215).
+WARNING: Moved in the wrong direction in step 12: from (753, 1215) to (522, 1215).
+WARNING: Moved in the wrong direction in step 14: from (591, 1215) to (584, 1215).
 Test 29, LTR:
   Moving right: "\n        abcABC"[9, 10, 11, 12], "DEF"[2, 1], "\n        abcABC"[15, 14, 13], "DEF"[3]
 WARNING: Moved in the wrong direction in step 5: from (52, 1259) to (44, 1259).
index 6dbb3cb..5912779 100644 (file)
@@ -371,40 +371,48 @@ WARNING: Moved in the wrong direction in step 5: from (732, 1009) to (767, 951).
 WARNING: Moved in the wrong direction in step 11: from (732, 1009) to (767, 951).
 Test 25, LTR:
   Moving right: "\n        abcdefABC"[9, 10, 11, 12, 13, 14, 15], "DEF\n    "[2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16], "DEF\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (91, 1041) to (83, 1041).
+WARNING: Moved in the wrong direction in step 2: from (98, 1041) to (91, 1041).
+WARNING: Moved in the wrong direction in step 3: from (91, 1041) to (83, 1041).
 WARNING: Moved in the wrong direction in step 8: from (52, 1041) to (44, 1041).
   Moving left:  "DEF\n    "[3], "\n        abcdefABC"[16, 17, 18], <DIV>[2], "DEF\n    "[1, 2], "\n        abcdefABC"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (44, 1041) to (52, 1041).
-WARNING: Moved in the wrong direction in step 12: from (83, 1041) to (91, 1041).
+WARNING: Moved in the wrong direction in step 11: from (83, 1041) to (91, 1041).
+WARNING: Moved in the wrong direction in step 12: from (91, 1041) to (98, 1041).
 Test 25, RTL:
   Moving left: "\n        abcdefABC"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "DEF\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (670, 1041) to (674, 1041).
-WARNING: Moved in the wrong direction in step 5: from (674, 1041) to (682, 1041).
+WARNING: Moved in the wrong direction in step 3: from (670, 1041) to (674, 1041).
+WARNING: Moved in the wrong direction in step 4: from (674, 1041) to (682, 1041).
+WARNING: Moved in the wrong direction in step 5: from (682, 1041) to (689, 1041).
 WARNING: Moved in the wrong direction in step 12: from (732, 1041) to (740, 1041).
 WARNING: Moved in the wrong direction in step 13: from (740, 1041) to (747, 1041).
   Moving right:  "DEF\n    "[3, 2, 1], <DIV>[2], "\n        abcdefABC"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (747, 1041) to (740, 1041).
 WARNING: Moved in the wrong direction in step 2: from (740, 1041) to (732, 1041).
-WARNING: Moved in the wrong direction in step 9: from (682, 1041) to (674, 1041).
-WARNING: Moved in the wrong direction in step 10: from (674, 1041) to (670, 1041).
+WARNING: Moved in the wrong direction in step 9: from (689, 1041) to (682, 1041).
+WARNING: Moved in the wrong direction in step 10: from (682, 1041) to (674, 1041).
+WARNING: Moved in the wrong direction in step 11: from (674, 1041) to (670, 1041).
 Test 26, LTR:
   Moving right: "\n        ABCDEFabc"[9, 14, 13, 12, 11, 10, 15, 16, 17, 18], <DIV>[2], "def\n    "[1, 2, 3]
-WARNING: Moved in the wrong direction in step 4: from (134, 1075) to (129, 1075).
-WARNING: Moved in the wrong direction in step 5: from (129, 1075) to (122, 1075).
+WARNING: Moved in the wrong direction in step 3: from (134, 1075) to (129, 1075).
+WARNING: Moved in the wrong direction in step 4: from (129, 1075) to (122, 1075).
+WARNING: Moved in the wrong direction in step 5: from (122, 1075) to (113, 1075).
 WARNING: Moved in the wrong direction in step 12: from (68, 1075) to (61, 1075).
 WARNING: Moved in the wrong direction in step 13: from (61, 1075) to (56, 1075).
   Moving left:  "def\n    "[3, 2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16, 15, 10, 11, 12, 13, 14, 9]
 WARNING: Moved in the wrong direction in step 1: from (56, 1075) to (61, 1075).
 WARNING: Moved in the wrong direction in step 2: from (61, 1075) to (68, 1075).
-WARNING: Moved in the wrong direction in step 9: from (122, 1075) to (129, 1075).
-WARNING: Moved in the wrong direction in step 10: from (129, 1075) to (134, 1075).
+WARNING: Moved in the wrong direction in step 9: from (113, 1075) to (122, 1075).
+WARNING: Moved in the wrong direction in step 10: from (122, 1075) to (129, 1075).
+WARNING: Moved in the wrong direction in step 11: from (129, 1075) to (134, 1075).
 Test 26, RTL:
   Moving left: "\n        ABCDEFabc"[9, 10, 11, 12, 13, 14, 15], "def\n    "[2, 1], <DIV>[2], "\n        ABCDEFabc"[18, 17, 16], "def\n    "[3]
-WARNING: Moved in the wrong direction in step 2: from (716, 1075) to (723, 1075).
+WARNING: Moved in the wrong direction in step 2: from (707, 1075) to (716, 1075).
+WARNING: Moved in the wrong direction in step 3: from (716, 1075) to (723, 1075).
 WARNING: Moved in the wrong direction in step 8: from (752, 1075) to (759, 1075).
   Moving right:  "def\n    "[3], "\n        ABCDEFabc"[16, 17, 18], <DIV>[2], "def\n    "[1, 2], "\n        ABCDEFabc"[15, 14, 13, 12, 11, 10, 9]
 WARNING: Moved in the wrong direction in step 6: from (759, 1075) to (752, 1075).
-WARNING: Moved in the wrong direction in step 12: from (723, 1075) to (716, 1075).
+WARNING: Moved in the wrong direction in step 11: from (723, 1075) to (716, 1075).
+WARNING: Moved in the wrong direction in step 12: from (716, 1075) to (707, 1075).
 Test 27, LTR:
   Moving right: "\n        abc"[9, 10, 11, 12], <DIV>[2], "DEFghi\n    "[2, 1], <DIV>[5, 4], "ABC"[3, 2, 1], "DEFghi\n    "[3, 4, 5, 6]
 WARNING: Moved in the wrong direction in step 4: from (298, 1110) to (52, 1110).
index c8c9f47..618d458 100644 (file)
@@ -1,3 +1,4 @@
 Expected , got : PASS
 Expected First title, got First title: PASS
 Expected First title, got First title: PASS
+Expected Second title, got Second title: PASS
index 97b38cf..6212623 100644 (file)
@@ -43,6 +43,8 @@ function test()
     expect('First title', document.title);
     document.documentElement.appendChild(createTitleElement('Second title'));
     expect('First title', document.title);
+    document.documentElement.removeChild(document.getElementsByTagName('title')[0]);
+    expect('Second title', document.title);
 }
 </script>
 <g id="console">
diff --git a/src/third_party/WebKit/LayoutTests/svg/filters/big-viewbox-expected.svg b/src/third_party/WebKit/LayoutTests/svg/filters/big-viewbox-expected.svg
new file mode 100644 (file)
index 0000000..6288087
--- /dev/null
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200px" height="200px" viewBox="0 0 100000 100000">
+  <rect fill="green" width="50000" height="50000"/>
+</svg>
diff --git a/src/third_party/WebKit/LayoutTests/svg/filters/big-viewbox.svg b/src/third_party/WebKit/LayoutTests/svg/filters/big-viewbox.svg
new file mode 100644 (file)
index 0000000..3c59d33
--- /dev/null
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200px" height="200px" viewBox="0 0 100000 100000">
+  <defs>
+    <filter x="0%" y="0%" width="100%" height="100%" id="f1">
+      <feOffset/>
+    </filter>
+  </defs>
+  <rect fill="green" width="50000" height="50000" filter="url(#f1)"/>
+</svg>
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/FIXME-handshake-fail-by-null-subprotocol-selection-whitelist-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/FIXME-handshake-fail-by-null-subprotocol-selection-whitelist-expected.txt
new file mode 100644 (file)
index 0000000..e1a9c31
--- /dev/null
@@ -0,0 +1,9 @@
+Test for verifying that the whitelist prevents handshake fail when the client requests a subprotocol but the server doesn't include a Sec-WebSocket-Protocol header in the response.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Connection established.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/README.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/README.txt
new file mode 100644 (file)
index 0000000..74e7631
--- /dev/null
@@ -0,0 +1 @@
+# This suite runs the tests with the WebSocket old implementation.
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/alert-in-event-handler-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/alert-in-event-handler-expected.txt
new file mode 100644 (file)
index 0000000..5157ec0
--- /dev/null
@@ -0,0 +1,19 @@
+ALERT: waiting for open
+ALERT: message handled.first message
+ALERT: message handled.second message
+Make sure event handler called serially.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+alert will suspend/resume WebSocket.
+onopen should fire later.
+Connected
+Enter onmessage: first message
+Leave onmessage: first message
+Enter onmessage: second message
+Leave onmessage: second message
+Closed
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-handshake-crash-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-handshake-crash-expected.txt
new file mode 100644 (file)
index 0000000..acd42ed
--- /dev/null
@@ -0,0 +1,10 @@
+CONSOLE ERROR: line 14: WebSocket connection to 'ws://127.0.0.1:8880/bad-handshake-crash' failed: Invalid UTF-8 sequence in header name
+Make sure WebSocket doesn't crash with bad handshake message.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+WebSocket is closed
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-control-chars-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-control-chars-expected.txt
new file mode 100644 (file)
index 0000000..e21f673
--- /dev/null
@@ -0,0 +1,15 @@
+Test WebSocket bad sub-protocol names by control characters.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "\0") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0000' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "     ") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0009' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "
+") threw exception SyntaxError: Unexpected token ILLEGAL.
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "
+") threw exception SyntaxError: Unexpected token ILLEGAL.
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "\e") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u001B' is invalid..
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-empty-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-empty-expected.txt
new file mode 100644 (file)
index 0000000..fe11a38
--- /dev/null
@@ -0,0 +1,9 @@
+Test WebSocket bad sub-protocol names (empty).
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '' is invalid..
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-non-ascii-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bad-sub-protocol-non-ascii-expected.txt
new file mode 100644 (file)
index 0000000..879c21a
--- /dev/null
@@ -0,0 +1,15 @@
+Test WebSocket bad sub-protocol names by non-ASCII chars.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "\7f") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u007F' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "\80") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0080' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "あ") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u3042' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "￿") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\uFFFF' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\uFEFF' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "￾") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\uFFFE' is invalid..
+PASS new WebSocket("ws://127.0.0.1:8880/simple", "𠀋") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\uD840\uDC0B' is invalid..
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/binary-type-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/binary-type-expected.txt
new file mode 100644 (file)
index 0000000..e0f7ad2
--- /dev/null
@@ -0,0 +1,18 @@
+CONSOLE ERROR: 'Blob' is not a valid value for binaryType; binaryType remains unchanged.
+CONSOLE ERROR: 'ArrayBuffer' is not a valid value for binaryType; binaryType remains unchanged.
+CONSOLE ERROR: '' is not a valid value for binaryType; binaryType remains unchanged.
+Test WebSocket.binaryType attribute.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.binaryType is "blob"
+PASS ws.binaryType is "arraybuffer"
+PASS ws.binaryType is "blob"
+Set invalid values to binaryType. They should be ignored. No exception should be thrown.
+PASS ws.binaryType is "blob"
+PASS ws.binaryType is "blob"
+PASS ws.binaryType is "blob"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/broken-utf8-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/broken-utf8-expected.txt
new file mode 100644 (file)
index 0000000..08dbccd
--- /dev/null
@@ -0,0 +1,12 @@
+CONSOLE ERROR: line 14: WebSocket connection to 'ws://127.0.0.1:8880/broken-utf8' failed: Could not decode a text frame as UTF-8.
+Test whether WebSocket aborts the connection when it receives a text frame containing broken UTF-8 data.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bufferedAmount-after-close-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bufferedAmount-after-close-expected.txt
new file mode 100644 (file)
index 0000000..6e31362
--- /dev/null
@@ -0,0 +1,72 @@
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+WebSocket bufferedAmount after closed
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+Closed.
+PASS ws.readyState is 3
+PASS ws.bufferedAmount is 0
+Testing send(string)...
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 27
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 6
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 7
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 131
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 134
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65543
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65550
+Testing send(ArrayBuffer)...
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 6
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 7
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 131
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 134
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65543
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65550
+Testing send(Blob)...
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 6
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 7
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 131
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 134
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65543
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65550
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bufferedAmount-after-close-in-busy-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/bufferedAmount-after-close-in-busy-expected.txt
new file mode 100644 (file)
index 0000000..3721709
--- /dev/null
@@ -0,0 +1,73 @@
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+CONSOLE ERROR: WebSocket is already in CLOSING or CLOSED state.
+WebSocket bufferedAmount after closed in busy
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+PASS bufferedAmountBeforeClose + closeFrameSize >= bufferedAmountAfterClose is true
+Closed.
+PASS ws.readyState is 3
+PASS ws.bufferedAmount <= bufferedAmountAfterClose is true
+Testing send(string)...
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 27
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 6
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 7
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 131
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 134
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65543
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65550
+Testing send(ArrayBuffer)...
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 6
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 7
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 131
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 134
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65543
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65550
+Testing send(Blob)...
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 6
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 7
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 131
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 134
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65543
+PASS ws.send(messageToSend) is undefined.
+PASS bufferedAmountDifference is 65550
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/client-close-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/client-close-expected.txt
new file mode 100644 (file)
index 0000000..fb0357f
--- /dev/null
@@ -0,0 +1,13 @@
+WebSocket: Test client-initiated close. After WebSocket.close() any message from server must be discarded by WebSocket stack according to the new WebSocket API. See http://webkit.org/b/85934.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected
+Closed
+PASS receivedMessage is undefined.
+PASS closeEvent.reason is "close_frame[:2]='\\x88\\x80'"
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-before-handshake-response-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-before-handshake-response-expected.txt
new file mode 100644 (file)
index 0000000..5135925
--- /dev/null
@@ -0,0 +1,11 @@
+CONSOLE ERROR: line 14: WebSocket connection to 'ws://127.0.0.1:8880/handshake-fail-by-just-close' failed: Connection closed before receiving a handshake response
+Test if WebSocket fires error and close event when handshake is not received at all.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS close event
+PASS wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-before-open-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-before-open-expected.txt
new file mode 100644 (file)
index 0000000..f35cd8c
--- /dev/null
@@ -0,0 +1,12 @@
+CONSOLE WARNING: WebSocket connection to 'ws://127.0.0.1:8880/echo' failed: WebSocket is closed before the connection is established.
+CONSOLE WARNING: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: WebSocket is closed before the connection is established.
+Test if WebSocket fires close event when WebSocket is opened and close() is called on it before open event is dispatched.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+closed on test 1
+closed on test 2
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-code-and-reason-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-code-and-reason-expected.txt
new file mode 100644 (file)
index 0000000..7565181
--- /dev/null
@@ -0,0 +1,87 @@
+CONSOLE WARNING: WebSocket connection to 'ws://127.0.0.1:8880/echo' failed: WebSocket is closed before the connection is established.
+CONSOLE ERROR: line 78: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing an invalid size body.
+CONSOLE ERROR: line 78: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing a reserved status code.
+CONSOLE ERROR: line 78: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing a reserved status code.
+CONSOLE ERROR: line 78: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing a reserved status code.
+Test CloseEvent code and reason property.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+ws.onclose() was called.
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is codeAbnormalClosure
+PASS closeEvent.reason is emptyString
+WebSocketTest.onopen() was called with testId = 0.
+WebSocketTest.onclose() was called with testId = 0.
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is 1005
+PASS closeEvent.reason is ''
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is 1005
+PASS closeEvent.reason is ''
+WebSocketTest.onopen() was called with testId = 1.
+WebSocketTest.onclose() was called with testId = 1.
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+WebSocketTest.onopen() was called with testId = 2.
+WebSocketTest.onclose() was called with testId = 2.
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is 1000
+PASS closeEvent.reason is 'ok'
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is 1000
+PASS closeEvent.reason is 'ok'
+WebSocketTest.onopen() was called with testId = 3.
+WebSocketTest.onclose() was called with testId = 3.
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+WebSocketTest.onopen() was called with testId = 4.
+WebSocketTest.onclose() was called with testId = 4.
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+WebSocketTest.onopen() was called with testId = 5.
+WebSocketTest.onclose() was called with testId = 5.
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is false
+PASS closeEvent.code is 1006
+PASS closeEvent.reason is ''
+WebSocketTest.onopen() was called with testId = 6.
+WebSocketTest.onclose() was called with testId = 6.
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is 65535
+PASS closeEvent.reason is 'good bye'
+PASS typeof closeEvent.wasClean is 'boolean'
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is 65535
+PASS closeEvent.reason is 'good bye'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-event-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-event-expected.txt
new file mode 100644 (file)
index 0000000..a605cc9
--- /dev/null
@@ -0,0 +1,16 @@
+Make sure WebSocket fires CloseEvent when closed.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+WebSocket is open
+Received: 'Hello from Simple WSH.'
+Closed
+PASS closeEventType is "close"
+PASS 'wasClean' in closeEvent is true
+PASS closeEvent.wasClean is true
+PASS Object.getPrototypeOf(closeEvent) === CloseEvent.prototype is true
+PASS Object.getPrototypeOf(closeEvent) !== Event.prototype is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-expected.txt
new file mode 100644 (file)
index 0000000..3c460f3
--- /dev/null
@@ -0,0 +1,123 @@
+CONSOLE WARNING: WebSocket connection to 'ws://127.0.0.1:8880/close' failed: WebSocket is closed before the connection is established.
+CONSOLE WARNING: WebSocket connection to 'ws://127.0.0.1:8880/close' failed: WebSocket is closed before the connection is established.
+Verify WebSocket::close behaviors.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Invalid code test: 0
+Code 999 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 999 is neither."
+Invalid code test: 1
+Code 1001 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 1001 is neither."
+Invalid code test: 2
+Code 2999 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 2999 is neither."
+Invalid code test: 3
+Code 5000 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 5000 is neither."
+Invalid code test: 4
+Code 66536 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 65535 is neither."
+Invalid code test: 5
+Code 4294968296 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 65535 is neither."
+Invalid code test: 6
+Code 2999.9 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 2999 is neither."
+Invalid code test: 7
+Code NaN must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 0 is neither."
+Invalid code test: 8
+Code 0 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 0 is neither."
+Invalid code test: 9
+Code 100 must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 100 is neither."
+Invalid code test: 10
+Code Infinity must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 65535 is neither."
+Invalid code test: 11
+Code -Infinity must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 0 is neither."
+Invalid code test: 12
+Code NaN must cause InvalidAccessError.
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is invalidAccessErr
+PASS exceptionMessage is "Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 0 is neither."
+PASS onerror was called.
+runCodeTest: onclose().
+PASS closeEvent.code is abnormalClosure
+Skip invalid string test.
+Reason test: 0
+  with invalid reason: 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
+Reason 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 must cause SyntaxError.
+PASS result is false
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is syntaxErr
+Reason test: 1
+  with invalid reason: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012©
+Reason 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012© must cause SyntaxError.
+PASS result is false
+PASS exceptionProto === DOMException.prototype is true
+PASS exceptionName is syntaxErr
+Reason test: 2
+PASS onerror was called.
+runReasonTest: onclose().
+PASS closeEvent.code is abnormalClosure
+Code and reason test: 0
+Code and reason must be
+  code  : 1000
+  reason: OK, Bye!
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is code
+PASS closeEvent.reason is reason
+Code and reason test: 1
+Code and reason must be
+  code  : 3000
+  reason: 3000
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is code
+PASS closeEvent.reason is reason
+Code and reason test: 2
+Code and reason must be
+  code  : 4000
+  reason: code is 4000
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is code
+PASS closeEvent.reason is reason
+Code and reason test: 3
+Code and reason must be
+  code  : 4999
+  reason: © Google
+PASS closeEvent.wasClean is true
+PASS closeEvent.code is code
+PASS closeEvent.reason is reason
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-navigate-new-location-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-navigate-new-location-expected.txt
new file mode 100644 (file)
index 0000000..81c0384
--- /dev/null
@@ -0,0 +1,13 @@
+Test if WebSocket is closed when navigating to new location.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws on master document is ready.
+PASS insert a iframe, where open ws called 'socket1'
+PASS 'socket1' is sent to the server. navigate to new location. expect receiving 'socket1' on ws...
+PASS closedSocket is "socket1"
+PASS closeCode is "1001"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-and-force-gc-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-and-force-gc-expected.txt
new file mode 100644 (file)
index 0000000..3a5d5b0
--- /dev/null
@@ -0,0 +1,13 @@
+Test if WebSocket is closed on unload and not crashed if garbage collected
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws on master document is ready.
+PASS insert a iframe, where open ws called 'socket1'
+PASS 'socket1' is sent to the server. unload the iframe and force garbage collection. expect receiving 'socket1' on ws and no crash...
+PASS closedSocket is "socket1"
+PASS closeCode is "1001"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-expected.txt
new file mode 100644 (file)
index 0000000..dd6dc2a
--- /dev/null
@@ -0,0 +1,13 @@
+Test if WebSocket is closed on unload
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws on master document is ready.
+PASS insert a iframe, where open ws called 'socket1'
+PASS 'socket1' is sent to the server. unload the iframe. expect receiving 'socket1' on ws...
+PASS closedSocket is "socket1"
+PASS closeCode is "1001"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-reference-in-parent-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-on-unload-reference-in-parent-expected.txt
new file mode 100644 (file)
index 0000000..4096e1a
--- /dev/null
@@ -0,0 +1,15 @@
+Test that WebSocket opened in iframe is closed when the iframe is unloaded even if the WebSocket is referred by the parent frame.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws on master document is ready.
+PASS insert a iframe, where open ws called 'socket1'
+PASS document.childWebSocket is non-null.
+PASS 'socket1' is sent to the server. unload the iframe. expect receiving 'socket1' on ws...
+PASS closedSocket is "socket1"
+PASS closeCode is "1001"
+PASS document.childWebSocket.readyState is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-reason-too-long-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-reason-too-long-expected.txt
new file mode 100644 (file)
index 0000000..f21f782
--- /dev/null
@@ -0,0 +1,10 @@
+Checks whether SyntaxError is thrown when attempting to send too long reason.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+PASS SyntaxError was thrown: SyntaxError: Failed to execute 'close' on 'WebSocket': The message must not be greater than 123 bytes.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-unref-websocket-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/close-unref-websocket-expected.txt
new file mode 100644 (file)
index 0000000..b5601e0
--- /dev/null
@@ -0,0 +1,9 @@
+Test if WebSocket is closed while handshaking and unreferenced, it should fire close event at most once.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS 1 is >= countCloseEvent
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/compressed-control-frame-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/compressed-control-frame-expected.txt
new file mode 100644 (file)
index 0000000..b560e99
--- /dev/null
@@ -0,0 +1,12 @@
+CONSOLE ERROR: line 14: WebSocket connection to 'ws://127.0.0.1:8880/compressed-control-frame' failed: Received unexpected compressed frame
+Test whether a compressed control frame is rejected
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-closeonclose-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-closeonclose-expected.txt
new file mode 100644 (file)
index 0000000..357811d
--- /dev/null
@@ -0,0 +1,11 @@
+Test that WebSocket fires error event if no WebSocket Server can be connected, and close is called from onclose event.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Test start (Port 8890)
+PASS onerror was called
+PASS onclose was called
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-closeonerror-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-closeonerror-expected.txt
new file mode 100644 (file)
index 0000000..923c5b3
--- /dev/null
@@ -0,0 +1,11 @@
+Test that WebSocket fires error event if no WebSocket Server can be connected, and connection is closed from onerror event
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Test start (Port 8889)
+PASS onerror was called
+PASS onclose was called
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-noclose-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/connect-error-by-no-websocket-server-noclose-expected.txt
new file mode 100644 (file)
index 0000000..74de741
--- /dev/null
@@ -0,0 +1,11 @@
+Test that WebSocket fires error event if no WebSocket Server can be connected.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Test start (Port 8888)
+PASS onerror was called
+PASS onclose was called
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cookie-http-to-ws-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cookie-http-to-ws-expected.txt
new file mode 100644 (file)
index 0000000..34cedb3
--- /dev/null
@@ -0,0 +1,12 @@
+Test How WebSocket handles cookies with cookie-av's.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS cookie is "WK-websocket-test-domain=1; WK-websocket-test-path=1"
+A WebSocket connection to ws://127.0.0.1:8880/echo-cookie is opened.
+A WebSocket connection to ws://127.0.0.1:8880/echo-cookie is closed.
+PASS cookie is "WK-websocket-test-domain=1"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cookie-ws-to-ws-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cookie-ws-to-ws-expected.txt
new file mode 100644 (file)
index 0000000..7d828ea
--- /dev/null
@@ -0,0 +1,13 @@
+Test send cookies to a WebSocket handshake which is set by another WebSocket handshake.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+A WebSocket connection to ws://127.0.0.1:8880/set-cookie is opened.
+A WebSocket connection to ws://127.0.0.1:8880/set-cookie is closed.
+A WebSocket connection to ws://127.0.0.1:8880/echo-cookie is opened.
+A WebSocket connection to ws://127.0.0.1:8880/echo-cookie is closed.
+PASS cookie is "WK-WebSocket-test-domain-pass=1; WK-WebSocket-test-path-pass=1; WK-WebSocket-test=1"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cross-origin-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/cross-origin-expected.txt
new file mode 100644 (file)
index 0000000..3f3f099
--- /dev/null
@@ -0,0 +1,12 @@
+WebSocket Cross Origin test
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+document.domain=127.0.0.1
+ws.url=ws://localhost:8880/origin-test
+Connected
+PASS origin is "http://127.0.0.1:8000"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-comp-bit-onoff-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-comp-bit-onoff-expected.txt
new file mode 100644 (file)
index 0000000..ab268b7
--- /dev/null
@@ -0,0 +1,21 @@
+CONSOLE WARNING: line 26: WebSocket extension "x-webkit-deflate-frame" is deprecated
+Test compression enabled/disabled frame receiving.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Sending message: "Hello"
+PASS event.data is 'Hello'
+Sending message: "DisableCompression"
+PASS event.data is 'DisableCompression'
+Sending message: "World"
+PASS event.data is 'World'
+Sending message: "EnableCompression"
+PASS event.data is 'EnableCompression'
+Sending message: "Goodbye"
+PASS event.data is 'Goodbye'
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-invalid-parameter-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-invalid-parameter-expected.txt
new file mode 100644 (file)
index 0000000..281a3ec
--- /dev/null
@@ -0,0 +1,28 @@
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/deflate-frame-invalid-parameter?x-foo' failed: Error during WebSocket handshake: Error in x-webkit-deflate-frame: Received unexpected deflate-frame parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/deflate-frame-invalid-parameter?max_window_bits=7' failed: Error during WebSocket handshake: Error in x-webkit-deflate-frame: Received invalid max_window_bits parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/deflate-frame-invalid-parameter?max_window_bits=16' failed: Error during WebSocket handshake: Error in x-webkit-deflate-frame: Received invalid max_window_bits parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/deflate-frame-invalid-parameter?no_context_takeover=foo' failed: Error during WebSocket handshake: Error in x-webkit-deflate-frame: Received invalid no_context_takeover parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/deflate-frame-invalid-parameter?max_window_bits=8;%20no_context_takeover;%20x-foo' failed: Error during WebSocket handshake: Error in x-webkit-deflate-frame: Received unexpected deflate-frame parameter
+Test whether WebSocket rejects invalid deflate-frame parameters.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Testing parameter: "x-foo"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "max_window_bits=7"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "max_window_bits=16"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "no_context_takeover=foo"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "max_window_bits=8; no_context_takeover; x-foo"
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-parameter-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-parameter-expected.txt
new file mode 100644 (file)
index 0000000..f58c7d0
--- /dev/null
@@ -0,0 +1,33 @@
+CONSOLE WARNING: line 47: WebSocket extension "x-webkit-deflate-frame" is deprecated
+CONSOLE WARNING: line 47: WebSocket extension "x-webkit-deflate-frame" is deprecated
+CONSOLE WARNING: line 47: WebSocket extension "x-webkit-deflate-frame" is deprecated
+Test WebSocket deflate-frame extension.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Testing query: "max_window_bits=8"
+PASS ws.extensions.search('x-webkit-deflate-frame') != -1 is true
+PASS ws.extensions.search('max_window_bits=8') != -1 is true
+PASS event.data is firstMessage
+PASS event.data is secondMessage
+onclose() was called.
+PASS closeEvent.wasClean is true
+Testing query: "no_context_takeover"
+PASS ws.extensions.search('x-webkit-deflate-frame') != -1 is true
+PASS ws.extensions.search('no_context_takeover') != -1 is true
+PASS event.data is firstMessage
+PASS event.data is secondMessage
+onclose() was called.
+PASS closeEvent.wasClean is true
+Testing query: "max_window_bits=8&no_context_takeover"
+PASS ws.extensions.search('x-webkit-deflate-frame') != -1 is true
+PASS ws.extensions.search('max_window_bits=8') != -1 is true
+PASS ws.extensions.search('no_context_takeover') != -1 is true
+PASS event.data is firstMessage
+PASS event.data is secondMessage
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-set-bfinal-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/deflate-frame-set-bfinal-expected.txt
new file mode 100644 (file)
index 0000000..b8fed61
--- /dev/null
@@ -0,0 +1,17 @@
+CONSOLE WARNING: line 24: WebSocket extension "x-webkit-deflate-frame" is deprecated
+Test receiving compressed frames with BFINAL = 1.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Sending message: "Hello"
+PASS event.data is 'Hello'
+Sending message: "World"
+PASS event.data is 'World'
+Sending message: "Goodbye"
+PASS event.data is 'Goodbye'
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/echo-with-no-extension-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/echo-with-no-extension-expected.txt
new file mode 100644 (file)
index 0000000..704e9f8
--- /dev/null
@@ -0,0 +1,14 @@
+Test WebSocket.extensions attribute with no extension support in server side.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Check the value before opening the connection:
+PASS ws.extensions is ""
+Check if the value is read only:
+PASS ws.extensions = 'foo'; ws.extensions is ""
+Check the value after the connection is established:
+PASS ws.extensions is ""
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/extensions-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/extensions-expected.txt
new file mode 100644 (file)
index 0000000..a5edd3e
--- /dev/null
@@ -0,0 +1,16 @@
+Test WebSocket.extensions attribute.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Check the value before opening the connection:
+PASS ws.extensions is ""
+Check if the value is read only:
+PASS ws.extensions = 'foo'; ws.extensions is ""
+Check the value after the connection is established:
+PASS ws.extensions is "permessage-deflate"
+Check the value of the Sec-WebSocket-Extensions header sent to the server:
+event.data is "permessage-deflate; client_max_window_bits, x-webkit-deflate-frame"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-binary-frames-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-binary-frames-expected.txt
new file mode 100644 (file)
index 0000000..640bbf6
--- /dev/null
@@ -0,0 +1,26 @@
+WebSocket: Receive fragmented binary messages.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.binaryType is "blob"
+PASS receivedMessages.length is 4
+Checking message #0.
+PASS responseType is "[object Blob]"
+PASS actualArray.length is 13
+PASS Passed: Message #0.
+Checking message #1.
+PASS responseType is "[object Blob]"
+PASS actualArray.length is 13
+PASS Passed: Message #1.
+Checking message #2.
+PASS responseType is "[object Blob]"
+PASS actualArray.length is 0
+PASS Passed: Message #2.
+Checking message #3.
+PASS responseType is "[object Blob]"
+PASS actualArray.length is 256
+PASS Passed: Message #3.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-control-frame-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-control-frame-expected.txt
new file mode 100644 (file)
index 0000000..4e3711a
--- /dev/null
@@ -0,0 +1,11 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/fragmented-control-frame' failed: Received fragmented control frame: opcode = 9
+Test whether WebSocket rejects a fragmented control frame and aborts the connection.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-frames-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/fragmented-frames-expected.txt
new file mode 100644 (file)
index 0000000..3c67d9a
--- /dev/null
@@ -0,0 +1,17 @@
+Receive fragmented WebSocket frames.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onmessage() was called. (message = "First message")
+onmessage() was called. (message = "Second message")
+onmessage() was called. (message = "Third message")
+PASS closeEvent.wasClean is true
+PASS actualMessages.length === expectedMessages.length is true
+PASS actualMessages[0] is "First message"
+PASS actualMessages[1] is "Second message"
+PASS actualMessages[2] is "Third message"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/frame-lengths-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/frame-lengths-expected.txt
new file mode 100644 (file)
index 0000000..23ee459
--- /dev/null
@@ -0,0 +1,7 @@
+Test sending and receiving small messages of different lengths.
+
+Should say PASS:
+
+Running the test...
+PASS
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-challenge-randomness-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-challenge-randomness-expected.txt
new file mode 100644 (file)
index 0000000..c1bdcd7
--- /dev/null
@@ -0,0 +1,9 @@
+Handshake request should contain random challenge values.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS challenge1 === challenge2 is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-error-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-error-expected.txt
new file mode 100644 (file)
index 0000000..5bbd04d
--- /dev/null
@@ -0,0 +1,11 @@
+CONSOLE ERROR: line 20: WebSocket connection to 'ws://127.0.0.1:8880/handshake-error' failed: Error during WebSocket handshake: No response code found in status line: ThisWillCauseHandshakeError
+Handshake error test
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Closed.
+PASS ws.readyState is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-extensions-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-extensions-header-expected.txt
new file mode 100644 (file)
index 0000000..7600475
--- /dev/null
@@ -0,0 +1,10 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-extensions-header' failed: Error during WebSocket handshake: Found an unsupported extension 'x-foo' in 'Sec-WebSocket-Extensions' header
+Test whether WebSocket handshake fails if the server sends Sec-WebSocket-Extensions header.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-maxlength-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-maxlength-expected.txt
new file mode 100644 (file)
index 0000000..92b74e0
--- /dev/null
@@ -0,0 +1,12 @@
+CONSOLE ERROR: line 27: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-maxlength' failed: Error during WebSocket handshake: Status line is too long
+Connection should fail immediately, rather than succeeding or staying in limbo until timeout, if handshake is longer than 1024 bytes.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS timedOut is false
+PASS connected is false
+PASS origin is undefined.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-mismatch-protocol-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-mismatch-protocol-header-expected.txt
new file mode 100644 (file)
index 0000000..fe2c225
--- /dev/null
@@ -0,0 +1,14 @@
+CONSOLE ERROR: line 22: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-mismatch-protocol-header' failed: Error during WebSocket handshake: Response must not include 'Sec-WebSocket-Protocol' header if not present in request: MismatchProtocol
+CONSOLE ERROR: line 24: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-mismatch-protocol-header' failed: Error during WebSocket handshake: 'Sec-WebSocket-Protocol' header value 'MismatchProtocol' in response does not match any of sent values
+CONSOLE ERROR: line 24: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-mismatch-protocol-header' failed: Error during WebSocket handshake: 'Sec-WebSocket-Protocol' header value 'MismatchProtocol' in response does not match any of sent values
+Test whether WebSocket handshake fails if the server sends mismatched Sec-WebSocket-Protocol header.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS closeEvent.wasClean is false
+PASS closeEvent.wasClean is false
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-more-accept-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-more-accept-header-expected.txt
new file mode 100644 (file)
index 0000000..673c8c7
--- /dev/null
@@ -0,0 +1,9 @@
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-more-accept-header' failed: Error during WebSocket handshake: 'Sec-WebSocket-Accept' header must not appear more than once in a response
+Test that WebSocket handshake fails if there are more one Sec-WebSocket-Accept header field in the response.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-more-protocol-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-more-protocol-header-expected.txt
new file mode 100644 (file)
index 0000000..a8d4bca
--- /dev/null
@@ -0,0 +1,9 @@
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-more-protocol-header' failed: Error during WebSocket handshake: 'Sec-WebSocket-Protocol' header must not appear more than once in a response
+Test that WebSocket handshake fails if there are more than one Sec-WebSocket-Protocol header field in the response.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-accept-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-accept-header-expected.txt
new file mode 100644 (file)
index 0000000..0e8a29e
--- /dev/null
@@ -0,0 +1,10 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-no-accept-header' failed: Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing
+Test whether WebSocket handshake fails if the server does not send Sec-WebSocket-Accept header.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-connection-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-connection-header-expected.txt
new file mode 100644 (file)
index 0000000..c4aa059
--- /dev/null
@@ -0,0 +1,9 @@
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-no-connection-header' failed: Error during WebSocket handshake: 'Connection' header is missing
+Test that WebSocket handshake fails if Connection header field isn't reflected by the server.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-cr-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-cr-expected.txt
new file mode 100644 (file)
index 0000000..d45ad78
--- /dev/null
@@ -0,0 +1,11 @@
+CONSOLE ERROR: line 25: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-no-cr' failed: Error during WebSocket handshake: Status line does not end with CRLF
+Handshake should fail when the first line does not end with CRLF.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS connected is false
+PASS origin is undefined.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-upgrade-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-no-upgrade-header-expected.txt
new file mode 100644 (file)
index 0000000..a01f5d6
--- /dev/null
@@ -0,0 +1,9 @@
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-no-upgrade-header' failed: Error during WebSocket handshake: 'Upgrade' header is missing
+Test that WebSocket handshake fails if Upgrade header field isn't reflected by the server.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-null-subprotocol-selection-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-null-subprotocol-selection-expected.txt
new file mode 100644 (file)
index 0000000..0feefde
--- /dev/null
@@ -0,0 +1,10 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-null-subprotocol-selection' failed: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
+Test for verifying that the WebSocket handshake fails when the client requests a subprotocol but the server doesn't include a Sec-WebSocket-Protocol header in the response.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-prepended-null-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-prepended-null-expected.txt
new file mode 100644 (file)
index 0000000..1ed1b0f
--- /dev/null
@@ -0,0 +1,12 @@
+CONSOLE ERROR: line 27: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-prepended-null' failed: Error during WebSocket handshake: Status line contains embedded null
+Connection should fail immediately, rather than succeeding or staying in limbo until timeout, if a null byte is received before the handshake.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS timedOut is false
+PASS connected is false
+PASS origin is undefined.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-wrong-accept-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/handshake-fail-by-wrong-accept-header-expected.txt
new file mode 100644 (file)
index 0000000..12b66b9
--- /dev/null
@@ -0,0 +1,10 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/handshake-fail-by-wrong-accept-header' failed: Error during WebSocket handshake: Incorrect 'Sec-WebSocket-Accept' header value
+Test whether WebSocket handshake fails if the server sends incorrect Sec-WebSocket-Accept header.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/httponly-cookie-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/httponly-cookie-expected.txt
new file mode 100644 (file)
index 0000000..7b92ec3
--- /dev/null
@@ -0,0 +1,11 @@
+Test WebSocket sends HttpOnly cookies.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+WebSocket open
+WebSocket closed
+PASS cookie is "WK-websocket-test-httponly=1; WK-websocket-test=1"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/interleaved-fragments-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/interleaved-fragments-expected.txt
new file mode 100644 (file)
index 0000000..7f1b9bb
--- /dev/null
@@ -0,0 +1,11 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/interleaved-fragments' failed: Received start of new message but previous message is unfinished.
+Test whether WebSocket rejects interleaved fragmented frames.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-continuation-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-continuation-expected.txt
new file mode 100644 (file)
index 0000000..7d9717b
--- /dev/null
@@ -0,0 +1,12 @@
+CONSOLE ERROR: line 14: WebSocket connection to 'ws://127.0.0.1:8880/invalid-continuation' failed: Received unexpected continuation frame.
+Test whether WebSocket aborts the connection when it receives an unexpected continuation frame without any leading text or binary frame.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-encode-length-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-encode-length-expected.txt
new file mode 100644 (file)
index 0000000..b6deae5
--- /dev/null
@@ -0,0 +1,28 @@
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://127.0.0.1:8880/invalid-encode-length?case=126_125' failed: The minimal number of bytes MUST be used to encode the length
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://127.0.0.1:8880/invalid-encode-length?case=126_0' failed: The minimal number of bytes MUST be used to encode the length
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://127.0.0.1:8880/invalid-encode-length?case=127_65535' failed: The minimal number of bytes MUST be used to encode the length
+CONSOLE ERROR: line 21: WebSocket connection to 'ws://127.0.0.1:8880/invalid-encode-length?case=127_0' failed: The minimal number of bytes MUST be used to encode the length
+Test whether WebSocket aborts the connection when it receives an unexpected encoding length frame.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Case 126_125: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Case 126_0: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Case 127_65535: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Case 127_0: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-masked-frames-from-server-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-masked-frames-from-server-expected.txt
new file mode 100644 (file)
index 0000000..8cbd84b
--- /dev/null
@@ -0,0 +1,11 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/invalid-masked-frames-from-server' failed: A server must not mask any frames that it sends to the client.
+Test whether WebSocket aborts the connection when it receives an masked frames from server.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-subprotocol-characters-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-subprotocol-characters-expected.txt
new file mode 100644 (file)
index 0000000..9a7ee3f
--- /dev/null
@@ -0,0 +1,136 @@
+WebSocket should fail if subprotocol contains a forbidden character.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS new WebSocket(url, "\u0000") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0000' is invalid..
+PASS new WebSocket(url, "\u0001") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0001' is invalid..
+PASS new WebSocket(url, "\u0002") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0002' is invalid..
+PASS new WebSocket(url, "\u0003") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0003' is invalid..
+PASS new WebSocket(url, "\u0004") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0004' is invalid..
+PASS new WebSocket(url, "\u0005") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0005' is invalid..
+PASS new WebSocket(url, "\u0006") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0006' is invalid..
+PASS new WebSocket(url, "\u0007") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0007' is invalid..
+PASS new WebSocket(url, "\u0008") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0008' is invalid..
+PASS new WebSocket(url, "\u0009") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0009' is invalid..
+PASS new WebSocket(url, "\u000a") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u000A' is invalid..
+PASS new WebSocket(url, "\u000b") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u000B' is invalid..
+PASS new WebSocket(url, "\u000c") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u000C' is invalid..
+PASS new WebSocket(url, "\u000d") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u000D' is invalid..
+PASS new WebSocket(url, "\u000e") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u000E' is invalid..
+PASS new WebSocket(url, "\u000f") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u000F' is invalid..
+PASS new WebSocket(url, "\u0010") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0010' is invalid..
+PASS new WebSocket(url, "\u0011") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0011' is invalid..
+PASS new WebSocket(url, "\u0012") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0012' is invalid..
+PASS new WebSocket(url, "\u0013") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0013' is invalid..
+PASS new WebSocket(url, "\u0014") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0014' is invalid..
+PASS new WebSocket(url, "\u0015") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0015' is invalid..
+PASS new WebSocket(url, "\u0016") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0016' is invalid..
+PASS new WebSocket(url, "\u0017") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0017' is invalid..
+PASS new WebSocket(url, "\u0018") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0018' is invalid..
+PASS new WebSocket(url, "\u0019") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u0019' is invalid..
+PASS new WebSocket(url, "\u001a") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u001A' is invalid..
+PASS new WebSocket(url, "\u001b") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u001B' is invalid..
+PASS new WebSocket(url, "\u001c") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u001C' is invalid..
+PASS new WebSocket(url, "\u001d") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u001D' is invalid..
+PASS new WebSocket(url, "\u001e") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u001E' is invalid..
+PASS new WebSocket(url, "\u001f") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u001F' is invalid..
+PASS new WebSocket(url, "\u0020") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol ' ' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u0021"
+PASS new WebSocket(url, "\u0022") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '"' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u0023"
+PASS WebSocket correctly accepted subprotocol "\u0024"
+PASS WebSocket correctly accepted subprotocol "\u0025"
+PASS WebSocket correctly accepted subprotocol "\u0026"
+PASS WebSocket correctly accepted subprotocol "\u0027"
+PASS new WebSocket(url, "\u0028") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '(' is invalid..
+PASS new WebSocket(url, "\u0029") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol ')' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u002a"
+PASS WebSocket correctly accepted subprotocol "\u002b"
+PASS new WebSocket(url, "\u002c") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol ',' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u002d"
+PASS WebSocket correctly accepted subprotocol "\u002e"
+PASS new WebSocket(url, "\u002f") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '/' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u0030"
+PASS WebSocket correctly accepted subprotocol "\u0031"
+PASS WebSocket correctly accepted subprotocol "\u0032"
+PASS WebSocket correctly accepted subprotocol "\u0033"
+PASS WebSocket correctly accepted subprotocol "\u0034"
+PASS WebSocket correctly accepted subprotocol "\u0035"
+PASS WebSocket correctly accepted subprotocol "\u0036"
+PASS WebSocket correctly accepted subprotocol "\u0037"
+PASS WebSocket correctly accepted subprotocol "\u0038"
+PASS WebSocket correctly accepted subprotocol "\u0039"
+PASS new WebSocket(url, "\u003a") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol ':' is invalid..
+PASS new WebSocket(url, "\u003b") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol ';' is invalid..
+PASS new WebSocket(url, "\u003c") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '<' is invalid..
+PASS new WebSocket(url, "\u003d") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '=' is invalid..
+PASS new WebSocket(url, "\u003e") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '>' is invalid..
+PASS new WebSocket(url, "\u003f") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '?' is invalid..
+PASS new WebSocket(url, "\u0040") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '@' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u0041"
+PASS WebSocket correctly accepted subprotocol "\u0042"
+PASS WebSocket correctly accepted subprotocol "\u0043"
+PASS WebSocket correctly accepted subprotocol "\u0044"
+PASS WebSocket correctly accepted subprotocol "\u0045"
+PASS WebSocket correctly accepted subprotocol "\u0046"
+PASS WebSocket correctly accepted subprotocol "\u0047"
+PASS WebSocket correctly accepted subprotocol "\u0048"
+PASS WebSocket correctly accepted subprotocol "\u0049"
+PASS WebSocket correctly accepted subprotocol "\u004a"
+PASS WebSocket correctly accepted subprotocol "\u004b"
+PASS WebSocket correctly accepted subprotocol "\u004c"
+PASS WebSocket correctly accepted subprotocol "\u004d"
+PASS WebSocket correctly accepted subprotocol "\u004e"
+PASS WebSocket correctly accepted subprotocol "\u004f"
+PASS WebSocket correctly accepted subprotocol "\u0050"
+PASS WebSocket correctly accepted subprotocol "\u0051"
+PASS WebSocket correctly accepted subprotocol "\u0052"
+PASS WebSocket correctly accepted subprotocol "\u0053"
+PASS WebSocket correctly accepted subprotocol "\u0054"
+PASS WebSocket correctly accepted subprotocol "\u0055"
+PASS WebSocket correctly accepted subprotocol "\u0056"
+PASS WebSocket correctly accepted subprotocol "\u0057"
+PASS WebSocket correctly accepted subprotocol "\u0058"
+PASS WebSocket correctly accepted subprotocol "\u0059"
+PASS WebSocket correctly accepted subprotocol "\u005a"
+PASS new WebSocket(url, "\u005b") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '[' is invalid..
+PASS new WebSocket(url, "\u005c") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\\' is invalid..
+PASS new WebSocket(url, "\u005d") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol ']' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u005e"
+PASS WebSocket correctly accepted subprotocol "\u005f"
+PASS WebSocket correctly accepted subprotocol "\u0060"
+PASS WebSocket correctly accepted subprotocol "\u0061"
+PASS WebSocket correctly accepted subprotocol "\u0062"
+PASS WebSocket correctly accepted subprotocol "\u0063"
+PASS WebSocket correctly accepted subprotocol "\u0064"
+PASS WebSocket correctly accepted subprotocol "\u0065"
+PASS WebSocket correctly accepted subprotocol "\u0066"
+PASS WebSocket correctly accepted subprotocol "\u0067"
+PASS WebSocket correctly accepted subprotocol "\u0068"
+PASS WebSocket correctly accepted subprotocol "\u0069"
+PASS WebSocket correctly accepted subprotocol "\u006a"
+PASS WebSocket correctly accepted subprotocol "\u006b"
+PASS WebSocket correctly accepted subprotocol "\u006c"
+PASS WebSocket correctly accepted subprotocol "\u006d"
+PASS WebSocket correctly accepted subprotocol "\u006e"
+PASS WebSocket correctly accepted subprotocol "\u006f"
+PASS WebSocket correctly accepted subprotocol "\u0070"
+PASS WebSocket correctly accepted subprotocol "\u0071"
+PASS WebSocket correctly accepted subprotocol "\u0072"
+PASS WebSocket correctly accepted subprotocol "\u0073"
+PASS WebSocket correctly accepted subprotocol "\u0074"
+PASS WebSocket correctly accepted subprotocol "\u0075"
+PASS WebSocket correctly accepted subprotocol "\u0076"
+PASS WebSocket correctly accepted subprotocol "\u0077"
+PASS WebSocket correctly accepted subprotocol "\u0078"
+PASS WebSocket correctly accepted subprotocol "\u0079"
+PASS WebSocket correctly accepted subprotocol "\u007a"
+PASS new WebSocket(url, "\u007b") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '{' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u007c"
+PASS new WebSocket(url, "\u007d") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '}' is invalid..
+PASS WebSocket correctly accepted subprotocol "\u007e"
+PASS new WebSocket(url, "\u007f") threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u007F' is invalid..
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-subprotocols-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/invalid-subprotocols-expected.txt
new file mode 100644 (file)
index 0000000..033b584
--- /dev/null
@@ -0,0 +1,14 @@
+WebSocket should fail if invalid subprotocols are specified
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS new WebSocket(url, 'a b') threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol 'a b' is invalid..
+PASS new WebSocket(url, 'a,b') threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol 'a,b' is invalid..
+PASS new WebSocket(url, 'a\0b') threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol 'a\u0000b' is invalid..
+PASS new WebSocket(url, '\u3042') threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol '\u3042' is invalid..
+PASS new WebSocket(url, ['a', 'b', 'c d']) threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol 'c d' is invalid..
+PASS new WebSocket(url, ['a', 'b', 'c', 'a']) threw exception SyntaxError: Failed to construct 'WebSocket': The subprotocol 'a' is duplicated..
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/long-control-frame-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/long-control-frame-expected.txt
new file mode 100644 (file)
index 0000000..8d4f466
--- /dev/null
@@ -0,0 +1,11 @@
+CONSOLE ERROR: line 15: WebSocket connection to 'ws://localhost:8880/long-control-frame' failed: Received control frame having too long payload: 126 bytes
+Test whether WebSocket rejects control frames longer than 125 bytes.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/long-invalid-header-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/long-invalid-header-expected.txt
new file mode 100644 (file)
index 0000000..693af07
--- /dev/null
@@ -0,0 +1,10 @@
+CONSOLE ERROR: line 19: WebSocket connection to 'ws://127.0.0.1:8880/long-invalid-header' failed: Unexpected CR in name at pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp…
+Make sure WebSocket gives errors on long invalid upgrade header.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+WebSocket is closed
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/multiple-connections-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/multiple-connections-expected.txt
new file mode 100644 (file)
index 0000000..cee1efb
--- /dev/null
@@ -0,0 +1,3 @@
+Test that WebSocket is not subject to HTTP connection limit. Should say PASS:
+
+PASS
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/multiple-subprotocols-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/multiple-subprotocols-expected.txt
new file mode 100644 (file)
index 0000000..1bb4498
--- /dev/null
@@ -0,0 +1,18 @@
+Test WebSocket subprotocol negotiation.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.protocol is ""
+Connected
+PASS ws.protocol is "superchat"
+Received: superchat
+PASS receivedMessage is "superchat"
+Closed
+PASS ws.protocol is "superchat"
+PASS closeEvent.wasClean is true
+Exited onclose handler
+PASS ws.protocol is "superchat"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/no-crash-on-cookie-flood-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/no-crash-on-cookie-flood-expected.txt
new file mode 100644 (file)
index 0000000..787c8ed
--- /dev/null
@@ -0,0 +1,11 @@
+Test that the browser doesn't crash for lots of Set-Cookies in a WebSocket handshake.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+A WebSocket connection is opened.
+A WebSocket connection is closed.
+PASS wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/no-subprotocol-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/no-subprotocol-expected.txt
new file mode 100644 (file)
index 0000000..4f045b0
--- /dev/null
@@ -0,0 +1,16 @@
+WebSocket's protocol attribute should be an empty string if the server did not provide Sec-WebSocket-Protocol header.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.protocol is ""
+Connected
+PASS ws.protocol is ""
+Closed
+PASS ws.protocol is ""
+PASS closeEvent.wasClean is true
+Exited onclose handler
+PASS ws.protocol is ""
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/nocache-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/nocache-expected.txt
new file mode 100644 (file)
index 0000000..4fea966
--- /dev/null
@@ -0,0 +1,12 @@
+Test whether WebSocket request contains no-cache headers
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+PASS message is "PASS"
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/null-character-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/null-character-expected.txt
new file mode 100644 (file)
index 0000000..6fca377
--- /dev/null
@@ -0,0 +1,12 @@
+Make sure WebSocket transfer null character
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+WebSocket open
+msg should not be split by frame char \xff\0
+PASS msg is expectedMessage
+WebSocket closed
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-comp-bit-onoff-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-comp-bit-onoff-expected.txt
new file mode 100644 (file)
index 0000000..d010193
--- /dev/null
@@ -0,0 +1,24 @@
+Test compression enabled/disabled frame receiving.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Sending message: "Hello"
+PASS event.data is 'Hello'
+Sending message: "DisableCompression"
+PASS event.data is 'DisableCompression'
+Sending message: "World"
+PASS event.data is 'World'
+Sending message: "EnableCompression"
+PASS event.data is 'EnableCompression'
+Sending message: ""
+PASS event.data is ''
+Sending message: ""
+PASS event.data is ''
+Sending message: "Goodbye"
+PASS event.data is 'Goodbye'
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-invalid-parameter-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-invalid-parameter-expected.txt
new file mode 100644 (file)
index 0000000..6f7ebc5
--- /dev/null
@@ -0,0 +1,28 @@
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/permessage-deflate-invalid-parameter?x-foo' failed: Error during WebSocket handshake: Error in permessage-deflate: Received an unexpected permessage-deflate extension parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/permessage-deflate-invalid-parameter?client_max_window_bits=7' failed: Error during WebSocket handshake: Error in permessage-deflate: Received invalid client_max_window_bits parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/permessage-deflate-invalid-parameter?client_max_window_bits=16' failed: Error during WebSocket handshake: Error in permessage-deflate: Received invalid client_max_window_bits parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/permessage-deflate-invalid-parameter?client_no_context_takeover=foo' failed: Error during WebSocket handshake: Error in permessage-deflate: Received invalid client_no_context_takeover parameter
+CONSOLE ERROR: line 28: WebSocket connection to 'ws://localhost:8880/permessage-deflate-invalid-parameter?client_max_window_bits=8;%20client_no_context_takeover;%20x-foo' failed: Error during WebSocket handshake: Error in permessage-deflate: Received an unexpected permessage-deflate extension parameter
+Test whether WebSocket rejects invalid permessage-deflate parameters.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Testing parameter: "x-foo"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "client_max_window_bits=7"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "client_max_window_bits=16"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "client_no_context_takeover=foo"
+onclose() was called.
+PASS closeEvent.wasClean is false
+Testing parameter: "client_max_window_bits=8; client_no_context_takeover; x-foo"
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-parameter-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-parameter-expected.txt
new file mode 100644 (file)
index 0000000..0046b85
--- /dev/null
@@ -0,0 +1,30 @@
+Test WebSocket permessage-deflate extension.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Testing query: "client_max_window_bits=8"
+PASS ws.extensions.search('permessage-deflate') != -1 is true
+PASS ws.extensions.search('client_max_window_bits=8') != -1 is true
+PASS event.data is firstMessage
+PASS event.data is secondMessage
+onclose() was called.
+PASS closeEvent.wasClean is true
+Testing query: "client_no_context_takeover"
+PASS ws.extensions.search('permessage-deflate') != -1 is true
+PASS ws.extensions.search('client_no_context_takeover') != -1 is true
+PASS event.data is firstMessage
+PASS event.data is secondMessage
+onclose() was called.
+PASS closeEvent.wasClean is true
+Testing query: "client_max_window_bits=8&client_no_context_takeover"
+PASS ws.extensions.search('permessage-deflate') != -1 is true
+PASS ws.extensions.search('client_max_window_bits=8') != -1 is true
+PASS ws.extensions.search('client_no_context_takeover') != -1 is true
+PASS event.data is firstMessage
+PASS event.data is secondMessage
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-set-bfinal-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-set-bfinal-expected.txt
new file mode 100644 (file)
index 0000000..84f3083
--- /dev/null
@@ -0,0 +1,16 @@
+Test receiving compressed frames with BFINAL = 1.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Sending message: "Hello"
+PASS event.data is 'Hello'
+Sending message: "World"
+PASS event.data is 'World'
+Sending message: "Goodbye"
+PASS event.data is 'Goodbye'
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-unsolicited-negotiation-response-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-unsolicited-negotiation-response-expected.txt
new file mode 100644 (file)
index 0000000..112cbc2
--- /dev/null
@@ -0,0 +1,11 @@
+Test whether WebSocket ignores unsolicited negotiation response.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS onopen
+PASS ws.extensions is "permessage-deflate; server_max_window_bits=15; server_no_context_takeover"
+PASS event.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-window-bits-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/permessage-deflate-window-bits-expected.txt
new file mode 100644 (file)
index 0000000..b748029
--- /dev/null
@@ -0,0 +1,33 @@
+Test WebSocket permessage-deflate extension: window bits.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Testing query: "client_max_window_bits=8"
+PASS ws.extensions.search('permessage-deflate') != -1 is true
+PASS ws.extensions.search('client_max_window_bits=8') != -1 is true
+PASS event.data is message
+onclose() was called.
+PASS closeEvent.wasClean is true
+Testing query: "client_max_window_bits=15"
+PASS ws.extensions.search('permessage-deflate') != -1 is true
+PASS ws.extensions.search('client_max_window_bits=15') != -1 is true
+PASS event.data is message
+onclose() was called.
+PASS closeEvent.wasClean is true
+Testing query: "client_no_context_takeover"
+PASS ws.extensions.search('permessage-deflate') != -1 is true
+PASS ws.extensions.search('client_no_context_takeover') != -1 is true
+PASS event.data is message
+onclose() was called.
+PASS closeEvent.wasClean is true
+Testing query: "client_max_window_bits=8&client_no_context_takeover"
+PASS ws.extensions.search('permessage-deflate') != -1 is true
+PASS ws.extensions.search('client_max_window_bits=8') != -1 is true
+PASS ws.extensions.search('client_no_context_takeover') != -1 is true
+PASS event.data is message
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/pong-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/pong-expected.txt
new file mode 100644 (file)
index 0000000..774fd1e
--- /dev/null
@@ -0,0 +1,12 @@
+Test whether WebSocket correctly responds to a ping message sent from the server.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onmessage() was called. (message = "PASS")
+PASS message is "PASS"
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/receive-arraybuffer-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/receive-arraybuffer-expected.txt
new file mode 100644 (file)
index 0000000..006c072
--- /dev/null
@@ -0,0 +1,22 @@
+WebSocket: Receive ArrayBuffers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.binaryType is "arraybuffer"
+PASS receivedMessages.length is 3
+Checking message #0.
+PASS responseType is "[object ArrayBuffer]"
+PASS actualArray.length is 13
+PASS Passed: Message #0.
+Checking message #1.
+PASS responseType is "[object ArrayBuffer]"
+PASS actualArray.length is 0
+PASS Passed: Message #1.
+Checking message #2.
+PASS responseType is "[object ArrayBuffer]"
+PASS actualArray.length is 256
+PASS Passed: Message #2.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/receive-blob-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/receive-blob-expected.txt
new file mode 100644 (file)
index 0000000..be37e88
--- /dev/null
@@ -0,0 +1,22 @@
+WebSocket: Receive Blobs.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.binaryType is "blob"
+PASS receivedMessages.length is 3
+Checking message #0.
+PASS responseType is "[object Blob]"
+PASS actualArray.length is 13
+PASS Passed: Message #0.
+Checking message #1.
+PASS responseType is "[object Blob]"
+PASS actualArray.length is 0
+PASS Passed: Message #1.
+Checking message #2.
+PASS responseType is "[object Blob]"
+PASS actualArray.length is 256
+PASS Passed: Message #2.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reload-crash-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reload-crash-expected.txt
new file mode 100644 (file)
index 0000000..0ec8889
--- /dev/null
@@ -0,0 +1,11 @@
+Test if it doesn't crash when reloading while WebSocket is busy
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS insert a iframe
+PASS iframe is ready.
+PASS reloaded iframe while WebSocket is busy
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reserved-bits-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reserved-bits-expected.txt
new file mode 100644 (file)
index 0000000..321a3bb
--- /dev/null
@@ -0,0 +1,35 @@
+CONSOLE ERROR: line 25: WebSocket connection to 'ws://localhost:8880/reserved-bits?compressed=false&bitNumber=1' failed: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0
+CONSOLE ERROR: line 25: WebSocket connection to 'ws://localhost:8880/reserved-bits?compressed=false&bitNumber=2' failed: One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 0
+CONSOLE ERROR: line 25: WebSocket connection to 'ws://localhost:8880/reserved-bits?compressed=false&bitNumber=3' failed: One or more reserved bits are on: reserved1 = 0, reserved2 = 0, reserved3 = 1
+CONSOLE WARNING: line 25: WebSocket extension "x-webkit-deflate-frame" is deprecated
+CONSOLE ERROR: line 25: WebSocket connection to 'ws://localhost:8880/reserved-bits?compressed=true&bitNumber=2' failed: One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 0
+CONSOLE WARNING: line 25: WebSocket extension "x-webkit-deflate-frame" is deprecated
+CONSOLE ERROR: line 25: WebSocket connection to 'ws://localhost:8880/reserved-bits?compressed=true&bitNumber=3' failed: One or more reserved bits are on: reserved1 = 0, reserved2 = 0, reserved3 = 1
+Test whether WebSocket rejects frames whose reserved bit is on.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Case compressed=false&bitNumber=1: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Case compressed=false&bitNumber=2: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Case compressed=false&bitNumber=3: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Case compressed=true&bitNumber=2: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Case compressed=true&bitNumber=3: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reserved-opcodes-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/reserved-opcodes-expected.txt
new file mode 100644 (file)
index 0000000..5b6f52d
--- /dev/null
@@ -0,0 +1,58 @@
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=3' failed: Unrecognized frame opcode: 3
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=4' failed: Unrecognized frame opcode: 4
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=5' failed: Unrecognized frame opcode: 5
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=6' failed: Unrecognized frame opcode: 6
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=7' failed: Unrecognized frame opcode: 7
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=11' failed: Unrecognized frame opcode: 11
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=12' failed: Unrecognized frame opcode: 12
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=13' failed: Unrecognized frame opcode: 13
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=14' failed: Unrecognized frame opcode: 14
+CONSOLE ERROR: line 30: WebSocket connection to 'ws://localhost:8880/reserved-opcodes?opcode=15' failed: Unrecognized frame opcode: 15
+Tests whether WebSocket ignores frames with reserved opcode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Opcode 3: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 4: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 5: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 6: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 7: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 11: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 12: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 13: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 14: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+Opcode 15: Test started.
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-after-close-on-unload-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-after-close-on-unload-expected.txt
new file mode 100644 (file)
index 0000000..80f8eef
--- /dev/null
@@ -0,0 +1,16 @@
+Test if WebSocket opened in iframe, referred in parent document is, and try to send() returns false.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws on master document is ready.
+PASS insert a iframe, where open ws called 'socket1'
+PASS document.childWebSocket is non-null.
+PASS 'socket1' is sent to the server. unload the iframe. expect receiving 'socket1' on ws...
+PASS document.childWebSocket.send('send to closed socket') is undefined.
+PASS closedSocket is "socket1"
+PASS closeCode is "1001"
+PASS document.childWebSocket.readyState is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-arraybuffer-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-arraybuffer-expected.txt
new file mode 100644 (file)
index 0000000..850c52e
--- /dev/null
@@ -0,0 +1,12 @@
+WebSocket: Send ArrayBuffers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-arraybufferview-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-arraybufferview-expected.txt
new file mode 100644 (file)
index 0000000..e939eae
--- /dev/null
@@ -0,0 +1,12 @@
+WebSocket: Send ArrayBufferViews.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-blob-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-blob-expected.txt
new file mode 100644 (file)
index 0000000..fdf48d0
--- /dev/null
@@ -0,0 +1,12 @@
+WebSocket: Send Blobs.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-blob-onmessage-origin-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-blob-onmessage-origin-expected.txt
new file mode 100644 (file)
index 0000000..b760893
--- /dev/null
@@ -0,0 +1,16 @@
+WebSocket message event origin attribute test (Blob message)
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS PASS: Message #0.
+PASS origin is "ws://127.0.0.1:8880"
+PASS PASS: Message #1.
+PASS origin is "ws://127.0.0.1:8880"
+PASS PASS: Message #2.
+PASS origin is "ws://127.0.0.1:8880"
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-empty-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-empty-expected.txt
new file mode 100644 (file)
index 0000000..50738ac
--- /dev/null
@@ -0,0 +1,12 @@
+WebSocket: Calling send() without arguments should raise SyntaxError.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.send() threw exception TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present..
+PASS closeEvent.wasClean is true
+PASS receivedMessages.length is 1
+PASS receivedMessages[0] is "Goodbye"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-expected.txt
new file mode 100644 (file)
index 0000000..c7e2514
--- /dev/null
@@ -0,0 +1,12 @@
+WebSocket send test
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+PASS data is FIRST_MESSAGE_TO_SEND
+PASS data is SECOND_MESSAGE_TO_SEND
+Closed.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-file-blob-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-file-blob-expected.txt
new file mode 100644 (file)
index 0000000..51649ce
--- /dev/null
@@ -0,0 +1,16 @@
+WebSocket: Send a File.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Got FileSystem object.
+File created.
+PASS fileEntry.isFile is true
+Wrote to file.
+Got File object.
+PASS PASS: Message #0.
+PASS closeEvent.wasClean is true
+Deleting the file.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-file-blob-fail-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-file-blob-fail-expected.txt
new file mode 100644 (file)
index 0000000..3eb8356
--- /dev/null
@@ -0,0 +1,16 @@
+CONSOLE ERROR: line 87: WebSocket connection to 'ws://127.0.0.1:8880/echo' failed: Failed to load Blob: error code = 1
+WebSocket should fail the connection if it has failed to read a Blob.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Got FileSystem object.
+File created.
+PASS fileEntry.isFile is true
+Wrote to file.
+Got File object.
+File deleted.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-onmessage-origin-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-onmessage-origin-expected.txt
new file mode 100644 (file)
index 0000000..2201655
--- /dev/null
@@ -0,0 +1,15 @@
+WebSocket message event origin attribute test (String message)
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Connected.
+PASS data is firstMessageToSend
+PASS origin is "ws://localhost:8880"
+PASS data is secondMessageToSend
+PASS origin is "ws://localhost:8880"
+Closed.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-throw-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/send-throw-expected.txt
new file mode 100644 (file)
index 0000000..22f7460
--- /dev/null
@@ -0,0 +1,11 @@
+WebSocket send test
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+Caught exception: Pickles
+Closed.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/server-close-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/server-close-expected.txt
new file mode 100644 (file)
index 0000000..feeda9e
--- /dev/null
@@ -0,0 +1,11 @@
+WebSocket: Test server-initiated close.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected
+Closed
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/set-protocol-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/set-protocol-expected.txt
new file mode 100644 (file)
index 0000000..d9448f6
--- /dev/null
@@ -0,0 +1,20 @@
+WebSocket.protocol should not be modified.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS ws.protocol is ""
+PASS ws.protocol is ""
+Connected
+PASS ws.protocol is "chat"
+PASS ws.protocol is "chat"
+Closed
+PASS ws.protocol is "chat"
+PASS ws.protocol is "chat"
+PASS closeEvent.wasClean is true
+Exited onclose handler
+PASS ws.protocol is "chat"
+PASS ws.protocol is "chat"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/simple-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/simple-expected.txt
new file mode 100644 (file)
index 0000000..b53847c
--- /dev/null
@@ -0,0 +1,12 @@
+Simple WebSocket test
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Created a socket to 'ws://127.0.0.1:8880/simple'; readyState 0.
+Connected; readyState 1
+Received: 'Hello from Simple WSH.'; readyState 1
+Closed; readyState 3.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/simple-stress-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/simple-stress-expected.txt
new file mode 100644 (file)
index 0000000..f57c3ec
--- /dev/null
@@ -0,0 +1,7 @@
+Test sending many messages, and sending a large message.
+
+Should say PASS:
+
+Running the test...
+PASS
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/sub-protocol-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/sub-protocol-expected.txt
new file mode 100644 (file)
index 0000000..bcc1ec1
--- /dev/null
@@ -0,0 +1,10 @@
+Test WebSocket handshake success with sub protocol.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected
+PASS protocol is "sub-protocol"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/too-long-payload-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/too-long-payload-expected.txt
new file mode 100644 (file)
index 0000000..61e4a3e
--- /dev/null
@@ -0,0 +1,12 @@
+CONSOLE ERROR: line 14: WebSocket connection to 'ws://127.0.0.1:8880/too-long-payload' failed: WebSocket frame length too large: 9223372036854775808 bytes
+Tests whether WebSocket correctly aborts the connection when it receives a frame with too long payload.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onclose() was called.
+PASS closeEvent.wasClean is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unicode-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unicode-expected.txt
new file mode 100644 (file)
index 0000000..f6613f2
--- /dev/null
@@ -0,0 +1,12 @@
+WebSocket unicode message test
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+Send UNICODE_HELLO.
+PASS data is UNICODE_GOODBYE
+Closed.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unmasked-frames-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unmasked-frames-expected.txt
new file mode 100644 (file)
index 0000000..b1a568a
--- /dev/null
@@ -0,0 +1,18 @@
+Receive unmasked WebSocket frames.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onmessage() was called. (message = "First message")
+onmessage() was called. (message = "Fragmented message")
+onmessage() was called. (message = "")
+onmessage() was called. (message = "END")
+PASS actualMessages.length === expectedMessages.length is true
+PASS actualMessages[0] is "First message"
+PASS actualMessages[1] is "Fragmented message"
+PASS actualMessages[2] is ""
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unpaired-surrogates-in-close-reason-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unpaired-surrogates-in-close-reason-expected.txt
new file mode 100644 (file)
index 0000000..6a9c538
--- /dev/null
@@ -0,0 +1,10 @@
+Checks whether unpaired surrogates in a close reason are silently converted to U+FFFD and SYNTAX_ERR is not thrown.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unpaired-surrogates-in-message-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/unpaired-surrogates-in-message-expected.txt
new file mode 100644 (file)
index 0000000..70317a4
--- /dev/null
@@ -0,0 +1,10 @@
+Checks whether unpaired surrogates are replaced with U+FFFD.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Connected.
+PASS message is '�'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-no-trailing-slash-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-no-trailing-slash-expected.txt
new file mode 100644 (file)
index 0000000..827412e
--- /dev/null
@@ -0,0 +1,13 @@
+URL that doesn't have trailing slash should not emit empty Request-URI.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+WebSocket is open
+received:127.0.0.1:8880
+WebSocket is closed
+PASS handshake_success is true
+PASS host is "127.0.0.1:8880"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-parsing-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-parsing-expected.txt
new file mode 100644 (file)
index 0000000..4ce558d
--- /dev/null
@@ -0,0 +1,20 @@
+Test WebSocket URL parsing.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS new WebSocket() threw exception TypeError: Failed to construct 'WebSocket': 1 argument required, but only 0 present..
+PASS new WebSocket(null) threw exception SyntaxError: Failed to construct 'WebSocket': The URL 'null' is invalid..
+PASS new WebSocket("ws://javascript:a") threw exception SyntaxError: Failed to construct 'WebSocket': The URL 'ws://javascript:a' is invalid..
+PASS new WebSocket("/applet") threw exception SyntaxError: Failed to construct 'WebSocket': The URL '/applet' is invalid..
+PASS new WebSocket("javascript:a") threw exception SyntaxError: Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. 'javascript' is not allowed..
+PASS new WebSocket("ws://127.0.0.1:25/") threw exception SecurityError: Failed to construct 'WebSocket': The port 25 is not allowed..
+PASS (new WebSocket("ws://127.0.0.1:8880/a/../simple")).URL is "ws://127.0.0.1:8880/simple"
+PASS (new WebSocket("ws://127.0.0.1:8880/simple?")).URL is "ws://127.0.0.1:8880/simple?"
+PASS (new WebSocket("ws://127.0.0.1:8880/simple?k=v")).URL is "ws://127.0.0.1:8880/simple?k=v"
+PASS new WebSocket("ws://127.0.0.1/path#") threw exception SyntaxError: Failed to construct 'WebSocket': The URL contains a fragment identifier (''). Fragment identifiers are not allowed in WebSocket URLs..
+PASS new WebSocket("ws://127.0.0.1/path#fragment") threw exception SyntaxError: Failed to construct 'WebSocket': The URL contains a fragment identifier ('fragment'). Fragment identifiers are not allowed in WebSocket URLs..
+PASS new WebSocket("ws:://127.0.0.1/") threw exception SyntaxError: Failed to construct 'WebSocket': The URL 'ws:://127.0.0.1/' is invalid..
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-credential-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-credential-expected.txt
new file mode 100644 (file)
index 0000000..a17ad14
--- /dev/null
@@ -0,0 +1,14 @@
+Make sure handshake with URL with credentail info success.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+url=ws://user:pass@127.0.0.1:8880/echo-host
+WebSocket is open
+received:127.0.0.1:8880
+WebSocket is closed
+PASS handshake_success is true
+PASS host is "127.0.0.1:8880"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-empty-query-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-empty-query-expected.txt
new file mode 100644 (file)
index 0000000..6ede908
--- /dev/null
@@ -0,0 +1,14 @@
+Make sure handshake with URL with empty query components success.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+url=ws://127.0.0.1:8880/echo-path?
+WebSocket is open
+received:/echo-path?
+WebSocket is closed
+PASS handshake_success is true
+PASS path is expected_path
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-query-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/url-with-query-expected.txt
new file mode 100644 (file)
index 0000000..55b10c1
--- /dev/null
@@ -0,0 +1,14 @@
+Make sure handshake with URL with query components success.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+url=ws://127.0.0.1:8880/echo-path?q=v
+WebSocket is open
+received:/echo-path?q=v
+WebSocket is closed
+PASS handshake_success is true
+PASS path is expected_path
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/useragent-in-openinghandshake-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/useragent-in-openinghandshake-expected.txt
new file mode 100644 (file)
index 0000000..2e65401
--- /dev/null
@@ -0,0 +1,9 @@
+WebSocket test to check if opening handshake contains User-Agent header
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS event.data is navigator.userAgent
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/websocket-event-target-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/websocket-event-target-expected.txt
new file mode 100644 (file)
index 0000000..80fa543
--- /dev/null
@@ -0,0 +1,18 @@
+CONSOLE WARNING: WebSocket connection to 'ws://127.0.0.1:8880/simple' failed: WebSocket is closed before the connection is established.
+Make sure WebSocket object acts as EventTarget.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS open_event_handled is false
+PASS message_event_handled is false
+PASS close_event_handled is false
+PASS open_event_handled is true
+PASS open_event_handled is false
+PASS message_event_handled is true
+PASS message_event_handled is false
+PASS close_event_handled is true
+PASS close_event_handled is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/websocket-pending-activity-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/websocket-pending-activity-expected.txt
new file mode 100644 (file)
index 0000000..4de4778
--- /dev/null
@@ -0,0 +1,5 @@
+ALERT: PASS
+PASS successfullyParsed is true
+
+TEST COMPLETE
+Should alert "PASS".
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-code-and-reason-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-code-and-reason-expected.txt
new file mode 100644 (file)
index 0000000..f56df05
--- /dev/null
@@ -0,0 +1,74 @@
+CONSOLE WARNING: line 31: WebSocket connection to 'ws://127.0.0.1:8880/echo' failed: WebSocket is closed before the connection is established.
+CONSOLE ERROR: line 73: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing an invalid size body.
+CONSOLE ERROR: line 73: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing a reserved status code.
+CONSOLE ERROR: line 73: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing a reserved status code.
+CONSOLE ERROR: line 73: WebSocket connection to 'ws://127.0.0.1:8880/close-code-and-reason' failed: Received a broken close frame containing a reserved status code.
+Test CloseEvent code and reason property in Worker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+ws.onclose() was called.
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is codeAbnormalClosure
+PASS PASS: worker: event.reason is emptyString
+WebSocketTest.onopen() was called with testId = 0.
+WebSocketTest.onclose() was called with testId = 0.
+PASS PASS: worker: event.wasClean is true
+PASS PASS: worker: event.code is 1005
+PASS PASS: worker: event.reason is 
+PASS PASS: worker: event.wasClean is true
+PASS PASS: worker: event.code is 1005
+PASS PASS: worker: event.reason is 
+WebSocketTest.onopen() was called with testId = 1.
+WebSocketTest.onclose() was called with testId = 1.
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+WebSocketTest.onopen() was called with testId = 2.
+WebSocketTest.onclose() was called with testId = 2.
+PASS PASS: worker: event.wasClean is true
+PASS PASS: worker: event.code is 1000
+PASS PASS: worker: event.reason is ok
+PASS PASS: worker: event.wasClean is true
+PASS PASS: worker: event.code is 1000
+PASS PASS: worker: event.reason is ok
+WebSocketTest.onopen() was called with testId = 3.
+WebSocketTest.onclose() was called with testId = 3.
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+WebSocketTest.onopen() was called with testId = 4.
+WebSocketTest.onclose() was called with testId = 4.
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+WebSocketTest.onopen() was called with testId = 5.
+WebSocketTest.onclose() was called with testId = 5.
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+PASS PASS: worker: event.wasClean is false
+PASS PASS: worker: event.code is 1006
+PASS PASS: worker: event.reason is 
+WebSocketTest.onopen() was called with testId = 6.
+WebSocketTest.onclose() was called with testId = 6.
+PASS PASS: worker: event.wasClean is true
+PASS PASS: worker: event.code is 65535
+PASS PASS: worker: event.reason is good bye
+PASS PASS: worker: event.wasClean is true
+PASS PASS: worker: event.code is 65535
+PASS PASS: worker: event.reason is good bye
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-expected.txt
new file mode 100644 (file)
index 0000000..76c85d1
--- /dev/null
@@ -0,0 +1,96 @@
+CONSOLE WARNING: line 124: WebSocket connection to 'ws://127.0.0.1:8880/close' failed: WebSocket is closed before the connection is established.
+CONSOLE WARNING: line 165: WebSocket connection to 'ws://127.0.0.1:8880/close' failed: WebSocket is closed before the connection is established.
+Verify WebSocket::close behaviors in Worker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Invalid code test: 0
+Code 999 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 1
+Code 1001 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 2
+Code 2999 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 3
+Code 5000 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 4
+Code 66536 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 5
+Code 4294968296 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 6
+Code 2999.9 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 7
+Code NaN must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 8
+Code 0 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 9
+Code 100 must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 10
+Code Infinity must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 11
+Code -Infinity must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+Invalid code test: 12
+Code NaN must cause InvalidAccessError.
+PASS PASS: worker: exceptionName is invalidAccessErr
+PASS PASS: onerror() was called.
+runCodeTest: onclose().
+PASS PASS: worker: closeEvent.code is abnormalClosure
+Skip invalid string test.
+Reason test: 0
+  with invalid reason: 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
+Reason 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 must cause SyntaxError.
+PASS PASS: worker: result is false
+PASS PASS: worker: exceptionName is syntaxErr
+Reason test: 1
+  with invalid reason: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012©
+Reason 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012© must cause SyntaxError.
+PASS PASS: worker: result is false
+PASS PASS: worker: exceptionName is syntaxErr
+Reason test: 2
+PASS PASS: onerror() was called.
+runReasonTest: onclose().
+PASS PASS: worker: closeEvent.code is abnormalClosure
+Code and reason test: 0
+Code and reason must be
+  code  : 1000
+  reason: OK, Bye!
+PASS PASS: worker: closeEvent.wasClean is true
+PASS PASS: worker: closeEvent.code is code
+PASS PASS: worker: closeEvent.reason is reason
+Code and reason test: 1
+Code and reason must be
+  code  : 3000
+  reason: 3000
+PASS PASS: worker: closeEvent.wasClean is true
+PASS PASS: worker: closeEvent.code is code
+PASS PASS: worker: closeEvent.reason is reason
+Code and reason test: 2
+Code and reason must be
+  code  : 4000
+  reason: code is 4000
+PASS PASS: worker: closeEvent.wasClean is true
+PASS PASS: worker: closeEvent.code is code
+PASS PASS: worker: closeEvent.reason is reason
+Code and reason test: 3
+Code and reason must be
+  code  : 4999
+  reason: © Google
+PASS PASS: worker: closeEvent.wasClean is true
+PASS PASS: worker: closeEvent.code is code
+PASS PASS: worker: closeEvent.reason is reason
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-onmessage-crash-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-onmessage-crash-expected.txt
new file mode 100644 (file)
index 0000000..dda2387
--- /dev/null
@@ -0,0 +1,11 @@
+Nested creation of two WebSockets should not cause a crash.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS: worker: Parsed successfully.
+PASS: worker: Connected.
+PASS: worker: Received message: "Hello from Simple WSH."
+PASS: worker: Closed.
+DONE
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-shared-worker-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-shared-worker-expected.txt
new file mode 100644 (file)
index 0000000..e470fb1
--- /dev/null
@@ -0,0 +1,12 @@
+Test for WebSocket close in SharedWorker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS: worker: init
+PASS: worker: WebSocket exists
+PASS: worker: successfullyParsed:[object WebSocket]
+PASS: worker: Connected.
+PASS: worker: Closed.
+DONE
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-worker-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/close-in-worker-expected.txt
new file mode 100644 (file)
index 0000000..d6da849
--- /dev/null
@@ -0,0 +1,12 @@
+Test for WebSocket close in Worker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS: worker: init
+PASS: worker: WebSocket exists
+PASS: worker: successfullyParsed:[object WebSocket]
+PASS: worker: Connected.
+PASS: worker: Closed.
+DONE
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-closeonclose-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-closeonclose-expected.txt
new file mode 100644 (file)
index 0000000..8ab1d39
--- /dev/null
@@ -0,0 +1,12 @@
+Verify firing error event behaviors in Worker when close() is called from onclose.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: resources/connect-error-by-no-websocket-server-closeonclose.js
+[Worker] Test start (Port 8893)
+PASS [Worker] onerror was called
+PASS [Worker] onclose was called
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-closeonerror-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-closeonerror-expected.txt
new file mode 100644 (file)
index 0000000..be8892a
--- /dev/null
@@ -0,0 +1,12 @@
+Verify firing error event behaviors in Worker when close() is called from onerror.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: resources/connect-error-by-no-websocket-server-closeonerror.js
+[Worker] Test start (Port 8892)
+PASS [Worker] onerror was called
+PASS [Worker] onclose was called
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-noclose-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/connect-error-by-no-websocket-server-noclose-expected.txt
new file mode 100644 (file)
index 0000000..c517f37
--- /dev/null
@@ -0,0 +1,12 @@
+Verify firing error event behaviors in Worker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: resources/connect-error-by-no-websocket-server-noclose.js
+[Worker] Test start (Port 8891)
+PASS [Worker] onerror was called
+PASS [Worker] onclose was called
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/multiple-subprotocols-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/multiple-subprotocols-expected.txt
new file mode 100644 (file)
index 0000000..07df41d
--- /dev/null
@@ -0,0 +1,19 @@
+Test WebSocket subprotocol negotiation in workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: ws.protocol is equal to ""
+INFO: Connected
+PASS PASS: ws.protocol is equal to "superchat"
+INFO: Received: superchat
+PASS PASS: receivedMessage is equal to "superchat"
+INFO: Closed
+PASS PASS: ws.protocol is equal to "superchat"
+PASS PASS: closeEvent.wasClean is true
+INFO: Exited onclose handler
+PASS PASS: ws.protocol is equal to "superchat"
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/no-onmessage-in-sync-op-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/no-onmessage-in-sync-op-expected.txt
new file mode 100644 (file)
index 0000000..dd7c3fc
--- /dev/null
@@ -0,0 +1,21 @@
+WebSocket's message event should not be invoked while we are waiting for the result of a synchronous operation (such as WebSocket.send()) on workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+INFO: Waiting for two seconds to make sure we receive messages from the server.
+PASS PASS: closeEvent.wasClean is true
+PASS PASS: event.length is 9
+PASS PASS: events[0] is "Got bufferedAmount: 0"
+PASS PASS: events[1] is "Got bufferedAmount: 0"
+PASS PASS: events[2] is "Got bufferedAmount: 0"
+PASS PASS: events[3] is "Sent message: 1"
+PASS PASS: events[4] is "Sent message: 2"
+PASS PASS: events[5] is "Sent message: 3"
+PASS PASS: events[6] is "Received message: 1"
+PASS PASS: events[7] is "Received message: 2"
+PASS PASS: events[8] is "Received message: 3"
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/no-subprotocol-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/no-subprotocol-expected.txt
new file mode 100644 (file)
index 0000000..53110a6
--- /dev/null
@@ -0,0 +1,17 @@
+WebSocket's protocol attribute should be an empty string if the server did not provide Sec-WebSocket-Protocol header.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: ws.protocol is equal to ""
+INFO: Connected
+PASS PASS: ws.protocol is equal to ""
+INFO: Closed
+PASS PASS: ws.protocol is equal to ""
+PASS PASS: closeEvent.wasClean is true
+INFO: Exited onclose handler
+PASS PASS: ws.protocol is equal to ""
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/receive-arraybuffer-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/receive-arraybuffer-expected.txt
new file mode 100644 (file)
index 0000000..fd45652
--- /dev/null
@@ -0,0 +1,23 @@
+WebSocket: Receive ArrayBuffers in Web Workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: ws.binaryType is "arraybuffer"
+PASS PASS: receivedMessages.length is 3
+INFO: Checking message #0.
+PASS PASS: responseType is "[object ArrayBuffer]"
+PASS PASS: actualArray.length is 13
+PASS PASS: Passed: Message #0.
+INFO: Checking message #1.
+PASS PASS: responseType is "[object ArrayBuffer]"
+PASS PASS: actualArray.length is 0
+PASS PASS: Passed: Message #1.
+INFO: Checking message #2.
+PASS PASS: responseType is "[object ArrayBuffer]"
+PASS PASS: actualArray.length is 256
+PASS PASS: Passed: Message #2.
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/receive-blob-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/receive-blob-expected.txt
new file mode 100644 (file)
index 0000000..93db31c
--- /dev/null
@@ -0,0 +1,23 @@
+WebSocket: Receive Blobs in Web Workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: ws.binaryType is "blob"
+PASS PASS: receivedMessages.length is 3
+INFO: Checking message #0.
+PASS PASS: responseType is "[object Blob]"
+PASS PASS: actualArray.length is 13
+PASS PASS: Passed: Message #0.
+INFO: Checking message #1.
+PASS PASS: responseType is "[object Blob]"
+PASS PASS: actualArray.length is 0
+PASS PASS: Passed: Message #1.
+INFO: Checking message #2.
+PASS PASS: responseType is "[object Blob]"
+PASS PASS: actualArray.length is 256
+PASS PASS: Passed: Message #2.
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-arraybuffer-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-arraybuffer-expected.txt
new file mode 100644 (file)
index 0000000..5cb499c
--- /dev/null
@@ -0,0 +1,13 @@
+WebSocket: Send ArrayBuffers in Web Workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS PASS: closeEvent.wasClean is true.
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-arraybufferview-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-arraybufferview-expected.txt
new file mode 100644 (file)
index 0000000..4e26455
--- /dev/null
@@ -0,0 +1,13 @@
+WebSocket: Send ArrayBufferViews in Web Workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS PASS: closeEvent.wasClean is true.
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-blob-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/send-blob-expected.txt
new file mode 100644 (file)
index 0000000..633bb7e
--- /dev/null
@@ -0,0 +1,13 @@
+WebSocket: Send Blobs in Web Workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS PASS: closeEvent.wasClean is true.
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/shared-worker-simple-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/shared-worker-simple-expected.txt
new file mode 100644 (file)
index 0000000..bb6d89a
--- /dev/null
@@ -0,0 +1,14 @@
+Test for WebSocket in SharedWorker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS: worker: init
+PASS: worker: WebSocket exists
+PASS: worker: successfullyParsed:[object WebSocket]
+PASS: worker: Connected.
+PASS: worker: Received: 'Hello from Simple WSH.'
+PASS: worker: Closed.
+PASS: worker: closeEvent.wasClean is true.
+DONE
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-handshake-challenge-randomness-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-handshake-challenge-randomness-expected.txt
new file mode 100644 (file)
index 0000000..18c9880
--- /dev/null
@@ -0,0 +1,9 @@
+Handshake request should contain random challenge values (in a worker process).
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS: worker: Parsed successfully.
+PASS: worker: challenge1 !== challenge2
+DONE
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-reload-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-reload-expected.txt
new file mode 100644 (file)
index 0000000..80746f7
--- /dev/null
@@ -0,0 +1,10 @@
+Reload after WebSocket creation should not cause a crash.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Inserted <iframe>.
+PASS Test finished.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-simple-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/workers/worker-simple-expected.txt
new file mode 100644 (file)
index 0000000..ee2de8f
--- /dev/null
@@ -0,0 +1,14 @@
+Test for WebSocket in Worker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS: worker: init
+PASS: worker: WebSocket exists
+PASS: worker: successfullyParsed:[object WebSocket]
+PASS: worker: Connected.
+PASS: worker: Received: 'Hello from Simple WSH.'
+PASS: worker: Closed.
+PASS: worker: closeEvent.wasClean is true.
+DONE
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/zero-length-text-expected.txt b/src/third_party/WebKit/LayoutTests/virtual/stable/http/tests/websocket/zero-length-text-expected.txt
new file mode 100644 (file)
index 0000000..8547ef8
--- /dev/null
@@ -0,0 +1,17 @@
+Test whether WebSocket handles zero length text frame correctly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+onopen() was called.
+onmessage() was called. (message = "")
+onmessage() was called. (message = "This first text should be received.")
+onmessage() was called. (message = "")
+onmessage() was called. (message = "This second text should be received, too.")
+onclose() was called.
+PASS closeEvent.wasClean is true
+PASS sequence is 4
+PASS receivedText is expectedText
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/src/third_party/WebKit/LayoutTests/web-animations-api/option-element-crash-expected.txt b/src/third_party/WebKit/LayoutTests/web-animations-api/option-element-crash-expected.txt
new file mode 100644 (file)
index 0000000..39b10b1
--- /dev/null
@@ -0,0 +1,2 @@
+This test passes if it does not crash.
diff --git a/src/third_party/WebKit/LayoutTests/web-animations-api/option-element-crash.html b/src/third_party/WebKit/LayoutTests/web-animations-api/option-element-crash.html
new file mode 100644 (file)
index 0000000..aa9f04b
--- /dev/null
@@ -0,0 +1,25 @@
+This test passes if it does not crash.
+
+<object>
+  <div>
+    <option id="testA"></option>
+  </div>
+</option>
+
+<video>
+  <option id="testB"></option>
+</video>
+
+<video>
+  <object>
+    <option id="testC"></option>
+  </object>
+</video>
+
+<script>
+if (window.testRunner)
+  testRunner.dumpAsText();
+testA.animate([{fontSize: 'large'}, {fontSize: '24px'}], 1000);
+testB.animate([{fontSize: '6rem'}, {fontSize: 'x-large'}], 1000);
+testC.animate([{outlineColor: 'invert'}, {outlineColor: 'inherit'}], 1000);
+</script>
\ No newline at end of file
         display: inline-block;
       }
 
+      .floatleft {
+        float: left;
+      }
+
       *[draggable=true] {
         width: 100px;
         height: 100px;
     <div class="container inline-block static">
       display: inline-block; position: static;
       <div draggable="true">Drag Me</div>
-      If the drag-icon follow the mouse pointer while dragging the above green div, the test passes.
+      If the drag-icon follows the mouse pointer while dragging the above green block, the test passes.
     </div>
+
+    <div class="container" style="overflow:hidden">
+        greybox overflow:hidden; greenbox float:left;<br>
+        <div class="floatleft" draggable="true">Drag Me</div>
+        If the drag-icon follows the mouse pointer while dragging the green block to the left, the test passes.
+    </div>
+
   </body>
 </html>
index 60decd3..1ebbc53 100644 (file)
@@ -107,7 +107,7 @@ private:
             Impl* impl, KeyType* key, v8::PersistentContainerValue value)
         {
             v8::PersistentContainerValue oldValue = Get(impl, key);
-            impl->add(key, value);
+            impl->set(key, value);
             return oldValue;
         }
         static v8::PersistentContainerValue Get(const Impl* impl, KeyType* key)
index e11af11..8da614f 100644 (file)
@@ -1282,7 +1282,7 @@ private:
         if (blob->hasBeenClosed())
             return handleError(DataCloneError, "A Blob object has been closed, and could therefore not be cloned.", next);
         int blobIndex = -1;
-        m_blobDataHandles.add(blob->uuid(), blob->blobDataHandle());
+        m_blobDataHandles.set(blob->uuid(), blob->blobDataHandle());
         if (appendBlobInfo(blob->uuid(), blob->type(), blob->size(), &blobIndex))
             m_writer.writeBlobIndex(blobIndex);
         else
@@ -1309,7 +1309,7 @@ private:
         if (file->hasBeenClosed())
             return handleError(DataCloneError, "A File object has been closed, and could therefore not be cloned.", next);
         int blobIndex = -1;
-        m_blobDataHandles.add(file->uuid(), file->blobDataHandle());
+        m_blobDataHandles.set(file->uuid(), file->blobDataHandle());
         if (appendFileInfo(file, &blobIndex)) {
             ASSERT(blobIndex >= 0);
             m_writer.writeFileIndex(blobIndex);
@@ -1331,7 +1331,7 @@ private:
             const File* file = fileList->item(i);
             if (file->hasBeenClosed())
                 return handleError(DataCloneError, "A File object has been closed, and could therefore not be cloned.", next);
-            m_blobDataHandles.add(file->uuid(), file->blobDataHandle());
+            m_blobDataHandles.set(file->uuid(), file->blobDataHandle());
             if (appendFileInfo(file, &blobIndex)) {
                 ASSERT(!i || blobIndex > 0);
                 ASSERT(blobIndex >= 0);
index ae46c3e..0fa2ac2 100644 (file)
@@ -65,7 +65,7 @@ public:
         Impl* impl, KeyType key, v8::PersistentContainerValue value)
     {
         v8::PersistentContainerValue oldValue = Get(impl, key);
-        impl->add(key, value);
+        impl->set(key, value);
         return oldValue;
     }
     static v8::PersistentContainerValue Get(const Impl* impl, KeyType key)
index b616e47..7435349 100644 (file)
@@ -113,6 +113,8 @@ void AXMenuListPopup::addChildren()
 void AXMenuListPopup::childrenChanged()
 {
     AXObjectCache* cache = axObjectCache();
+    if (!cache)
+        return;
     for (size_t i = m_children.size(); i > 0 ; --i) {
         AXObject* child = m_children[i - 1].get();
         // FIXME: How could children end up in here that have no actionElement(), the check
index f7824cb..6a0be63 100644 (file)
@@ -21,8 +21,8 @@ namespace WebCore {
 void DeferredLegacyStyleInterpolation::apply(StyleResolverState& state) const
 {
     RefPtrWillBeRawPtr<LegacyStyleInterpolation> innerInterpolation = LegacyStyleInterpolation::create(
-        StyleResolver::createAnimatableValueSnapshot(*state.element(), m_id, *m_startCSSValue, *state.style()),
-        StyleResolver::createAnimatableValueSnapshot(*state.element(), m_id, *m_endCSSValue, *state.style()),
+        StyleResolver::createAnimatableValueSnapshot(state, m_id, *m_startCSSValue),
+        StyleResolver::createAnimatableValueSnapshot(state, m_id, *m_endCSSValue),
         m_id);
     innerInterpolation->interpolate(m_cachedIteration, m_cachedFraction);
     innerInterpolation->apply(state);
index e7c4537..3c6755a 100644 (file)
@@ -106,20 +106,13 @@ bool SelectorChecker::scopeContainsLastMatchedElement(const SelectorCheckingCont
         return true;
 
     ASSERT(context.scope);
-    // If behaviorAtBoundary is not ScopeIsShadowRoot, we can use "contains".
-    if (!(context.behaviorAtBoundary & SelectorChecker::ScopeIsShadowRoot))
-        return context.scope->contains(context.element);
-
-    // If a given element is scope, i.e. shadow host, matches.
-    if (context.element == context.scope->shadowHost() && (!context.previousElement || context.previousElement->isInDescendantTreeOf(context.element)))
+    if (context.scope->treeScope() == context.element->treeScope())
         return true;
 
-    ShadowRoot* root = context.element->containingShadowRoot();
-    if (!root)
-        return false;
-
-    // If a host of the containing shadow root is scope, matches.
-    return root == context.scope;
+    // Because Blink treats a shadow host's TreeScope as a separate one from its descendent shadow roots,
+    // if the last matched element is a shadow host, the condition above isn't met, even though it
+    // should be.
+    return context.element == context.scope->shadowHost() && (!context.previousElement || context.previousElement->isInDescendantTreeOf(context.element));
 }
 
 static inline bool nextSelectorExceedsScope(const SelectorChecker::SelectorCheckingContext& context)
@@ -167,8 +160,7 @@ SelectorChecker::Match SelectorChecker::match(const SelectorCheckingContext& con
     }
 
     // Prepare next selector
-    const CSSSelector* historySelector = context.selector->tagHistory();
-    if (!historySelector) {
+    if (context.selector->isLastInTagHistory()) {
         if (scopeContainsLastMatchedElement(context)) {
             if (result)
                 result->specificity += specificity;
index d3b5536..d95e26e 100644 (file)
@@ -79,6 +79,8 @@ audio::-webkit-media-controls-panel, video::-webkit-media-controls-panel {
     height: 30px;
     background-color: rgba(20, 20, 20, 0.8);
     border-radius: 5px;
+    /* The duration is also specified in MediaControlElements.cpp and LayoutTests/media/media-controls.js */
+    transition: opacity 0.3s;
 }
 
 video:-webkit-full-page-media {
index 5431a1a..00096d7 100644 (file)
@@ -189,7 +189,7 @@ KURL CSSPropertyParser::completeURL(const String& url) const
 
 bool CSSPropertyParser::validCalculationUnit(CSSParserValue* value, Units unitflags, ReleaseParsedCalcValueCondition releaseCalc)
 {
-    bool mustBeNonNegative = unitflags & FNonNeg;
+    bool mustBeNonNegative = unitflags & (FNonNeg | FPositiveInteger);
 
     if (!parseCalculation(value, mustBeNonNegative ? ValueRangeNonNegative : ValueRangeAll))
         return false;
@@ -199,17 +199,31 @@ bool CSSPropertyParser::validCalculationUnit(CSSParserValue* value, Units unitfl
     case CalcLength:
         b = (unitflags & FLength);
         break;
-    case CalcPercent:
-        b = (unitflags & FPercent);
-        if (b && mustBeNonNegative && m_parsedCalculation->isNegative())
-            b = false;
-        break;
     case CalcNumber:
         b = (unitflags & FNumber);
-        if (!b && (unitflags & FInteger) && m_parsedCalculation->isInt())
+        if (!b && (unitflags & (FInteger | FPositiveInteger)) && m_parsedCalculation->isInt())
             b = true;
         if (b && mustBeNonNegative && m_parsedCalculation->isNegative())
             b = false;
+        // Always resolve calc() to a CSS_NUMBER in the CSSParserValue if there are no non-numbers specified in the unitflags.
+        if (b && !(unitflags & ~(FInteger | FNumber | FPositiveInteger | FNonNeg))) {
+            double number = m_parsedCalculation->doubleValue();
+            if ((unitflags & FPositiveInteger) && number <= 0) {
+                b = false;
+            } else {
+                delete value->function;
+                value->unit = CSSPrimitiveValue::CSS_NUMBER;
+                value->fValue = number;
+                value->isInt = m_parsedCalculation->isInt();
+            }
+            m_parsedCalculation.release();
+            return b;
+        }
+        break;
+    case CalcPercent:
+        b = (unitflags & FPercent);
+        if (b && mustBeNonNegative && m_parsedCalculation->isNegative())
+            b = false;
         break;
     case CalcPercentLength:
         b = (unitflags & FPercent) && (unitflags & FLength);
@@ -606,7 +620,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
 
             Vector<int> coords;
             value = m_valueList->next();
-            while (value && value->unit == CSSPrimitiveValue::CSS_NUMBER) {
+            while (value && validUnit(value, FNumber)) {
                 coords.append(int(value->fValue));
                 value = m_valueList->next();
             }
@@ -1282,10 +1296,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
             validPrimitive = validUnit(value, FLength | FNonNeg);
         break;
     case CSSPropertyWebkitColumnSpan: // none | all | 1 (will be dropped in the unprefixed property)
-        if (id == CSSValueAll || id == CSSValueNone)
-            validPrimitive = true;
-        else
-            validPrimitive = validUnit(value, FNumber | FNonNeg) && value->fValue == 1;
+        validPrimitive = id == CSSValueAll || id == CSSValueNone || (value->unit == CSSPrimitiveValue::CSS_NUMBER && value->fValue == 1);
         break;
     case CSSPropertyWebkitColumnWidth:         // auto | <length>
         parsedValue = parseColumnWidth();
@@ -1957,8 +1968,7 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseColumnWidth()
     CSSParserValue* value = m_valueList->current();
     // Always parse lengths in strict mode here, since it would be ambiguous otherwise when used in
     // the 'columns' shorthand property.
-    if (value->id == CSSValueAuto
-        || (validUnit(value, FLength | FNonNeg, HTMLStandardMode) && value->fValue)) {
+    if (value->id == CSSValueAuto || (validUnit(value, FLength | FNonNeg, HTMLStandardMode) && (m_parsedCalculation || value->fValue != 0))) {
         RefPtrWillBeRawPtr<CSSValue> parsedValue = parseValidPrimitive(value->id, value);
         m_valueList->next();
         return parsedValue;
@@ -4721,7 +4731,7 @@ bool CSSPropertyParser::parseFontWeight(bool important)
         addProperty(CSSPropertyFontWeight, cssValuePool().createIdentifierValue(value->id), important);
         return true;
     }
-    if (validUnit(value, FInteger | FNonNeg, HTMLQuirksMode)) {
+    if (value->unit == CSSPrimitiveValue::CSS_NUMBER) {
         int weight = static_cast<int>(value->fValue);
         if (!(weight % 100) && weight >= 100 && weight <= 900) {
             addProperty(CSSPropertyFontWeight, cssValuePool().createIdentifierValue(static_cast<CSSValueID>(CSSValue100 + weight / 100 - 1)), important);
@@ -5216,14 +5226,6 @@ bool CSSPropertyParser::fastParseColor(RGBA32& rgb, const StringType& name, bool
 
 template bool CSSPropertyParser::fastParseColor(RGBA32&, const String&, bool strict);
 
-inline double CSSPropertyParser::parsedDouble(CSSParserValue *v, ReleaseParsedCalcValueCondition releaseCalc)
-{
-    const double result = m_parsedCalculation ? m_parsedCalculation->doubleValue() : v->fValue;
-    if (releaseCalc == ReleaseParsedCalcValue)
-        m_parsedCalculation.release();
-    return result;
-}
-
 bool CSSPropertyParser::isCalculation(CSSParserValue* value)
 {
     return (value->unit == CSSParserValue::Function)
@@ -5236,13 +5238,16 @@ bool CSSPropertyParser::isCalculation(CSSParserValue* value)
 inline int CSSPropertyParser::colorIntFromValue(CSSParserValue* v)
 {
     bool isPercent;
+    double value;
 
-    if (m_parsedCalculation)
+    if (m_parsedCalculation) {
         isPercent = m_parsedCalculation->category() == CalcPercent;
-    else
+        value = m_parsedCalculation->doubleValue();
+        m_parsedCalculation.release();
+    } else {
         isPercent = v->unit == CSSPrimitiveValue::CSS_PERCENTAGE;
-
-    const double value = parsedDouble(v, ReleaseParsedCalcValue);
+        value = v->fValue;
+    }
 
     if (value <= 0.0)
         return 0;
@@ -5289,10 +5294,9 @@ bool CSSPropertyParser::parseColorParameters(CSSParserValue* value, int* colorAr
         v = args->next();
         if (!validUnit(v, FNumber, HTMLStandardMode))
             return false;
-        const double value = parsedDouble(v, ReleaseParsedCalcValue);
         // Convert the floating pointer number of alpha to an integer in the range [0, 256),
         // with an equal distribution across all 256 values.
-        colorArray[3] = static_cast<int>(std::max(0.0, std::min(1.0, value)) * nextafter(256.0, 0.0));
+        colorArray[3] = static_cast<int>(std::max(0.0, std::min(1.0, v->fValue)) * nextafter(256.0, 0.0));
     }
     return true;
 }
@@ -5310,7 +5314,7 @@ bool CSSPropertyParser::parseHSLParameters(CSSParserValue* value, double* colorA
     if (!validUnit(v, FNumber, HTMLStandardMode))
         return false;
     // normalize the Hue value and change it to be between 0 and 1.0
-    colorArray[0] = (((static_cast<int>(parsedDouble(v, ReleaseParsedCalcValue)) % 360) + 360) % 360) / 360.0;
+    colorArray[0] = (((static_cast<int>(v->fValue) % 360) + 360) % 360) / 360.0;
     for (int i = 1; i < 3; i++) {
         v = args->next();
         if (v->unit != CSSParserValue::Operator && v->iValue != ',')
@@ -5318,7 +5322,8 @@ bool CSSPropertyParser::parseHSLParameters(CSSParserValue* value, double* colorA
         v = args->next();
         if (!validUnit(v, FPercent, HTMLStandardMode))
             return false;
-        colorArray[i] = std::max(0.0, std::min(100.0, parsedDouble(v, ReleaseParsedCalcValue))) / 100.0; // needs to be value between 0 and 1.0
+        double percentValue = m_parsedCalculation ? m_parsedCalculation.release()->doubleValue() : v->fValue;
+        colorArray[i] = std::max(0.0, std::min(100.0, percentValue)) / 100.0; // needs to be value between 0 and 1.0
     }
     if (parseAlpha) {
         v = args->next();
@@ -5327,7 +5332,7 @@ bool CSSPropertyParser::parseHSLParameters(CSSParserValue* value, double* colorA
         v = args->next();
         if (!validUnit(v, FNumber, HTMLStandardMode))
             return false;
-        colorArray[3] = std::max(0.0, std::min(1.0, parsedDouble(v, ReleaseParsedCalcValue)));
+        colorArray[3] = std::max(0.0, std::min(1.0, v->fValue));
     }
     return true;
 }
@@ -7261,10 +7266,13 @@ PassRefPtrWillBeRawPtr<CSSFilterValue> CSSPropertyParser::parseBuiltinFilterArgu
 
         if (args->size()) {
             CSSParserValue* value = args->current();
-            if (!validUnit(value, FNumber | FPercent | FNonNeg, HTMLStandardMode))
+            // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5)
+            if (value->unit != CSSPrimitiveValue::CSS_PERCENTAGE && !validUnit(value, FNumber | FNonNeg, HTMLStandardMode))
                 return nullptr;
 
             double amount = value->fValue;
+            if (amount < 0)
+                return nullptr;
 
             // Saturate and Contrast allow values over 100%.
             if (filterType != CSSFilterValue::SaturateFilterOperation
@@ -7285,7 +7293,8 @@ PassRefPtrWillBeRawPtr<CSSFilterValue> CSSPropertyParser::parseBuiltinFilterArgu
 
         if (args->size()) {
             CSSParserValue* value = args->current();
-            if (!validUnit(value, FNumber | FPercent, HTMLStandardMode))
+            // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5)
+            if (value->unit != CSSPrimitiveValue::CSS_PERCENTAGE && !validUnit(value, FNumber, HTMLStandardMode))
                 return nullptr;
 
             filterValue->append(cssValuePool().createValue(value->fValue, static_cast<CSSPrimitiveValue::UnitType>(value->unit)));
index 1fc7656..482e240 100644 (file)
@@ -366,7 +366,6 @@ private:
 
     bool parseBorderImageQuad(Units, RefPtrWillBeRawPtr<CSSPrimitiveValue>&);
     int colorIntFromValue(CSSParserValue*);
-    double parsedDouble(CSSParserValue*, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue);
     bool isCalculation(CSSParserValue*);
 
 private:
index d906382..060f53f 100644 (file)
@@ -198,9 +198,6 @@ void StyleAdjuster::adjustRenderStyle(RenderStyle* style, RenderStyle* parentSty
 {
     ASSERT(parentStyle);
 
-    // Cache our original display.
-    style->setOriginalDisplay(style->display());
-
     if (style->display() != NONE) {
         if (e)
             adjustStyleForTagName(style, parentStyle, *e);
index 1315fb8..28b0cc9 100644 (file)
@@ -671,6 +671,9 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS
         addContentAttrValuesToFeatures(state.contentAttrValues(), m_features);
     }
 
+    // Cache our original display.
+    state.style()->setOriginalDisplay(state.style()->display());
+
     adjustRenderStyle(state, element);
 
     // FIXME: The CSSWG wants to specify that the effects of animations are applied before
@@ -751,16 +754,16 @@ PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap
         style = RenderStyle::clone(element.renderStyle());
     else
         style = RenderStyle::create();
-    return createAnimatableValueSnapshot(element, property, value, *style);
+    StyleResolverState state(element.document(), &element);
+    state.setStyle(style);
+    state.fontBuilder().initForStyleResolve(state.document(), state.style());
+    return createAnimatableValueSnapshot(state, property, value);
 }
 
-PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnapshot(Element& element, CSSPropertyID property, CSSValue& value, RenderStyle& style)
+PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnapshot(StyleResolverState& state, CSSPropertyID property, CSSValue& value)
 {
-    StyleResolverState state(element.document(), &element);
-    state.setStyle(&style);
-    state.fontBuilder().initForStyleResolve(state.document(), state.style());
     StyleBuilder::applyProperty(property, state, &value);
-    return CSSAnimatableValueFactory::create(property, style);
+    return CSSAnimatableValueFactory::create(property, *state.style());
 }
 
 PassRefPtrWillBeRawPtr<PseudoElement> StyleResolver::createPseudoElementIfNeeded(Element& parent, PseudoId pseudoId)
@@ -842,6 +845,9 @@ bool StyleResolver::pseudoStyleForElementInternal(Element& element, const Pseudo
         addContentAttrValuesToFeatures(state.contentAttrValues(), m_features);
     }
 
+    // Cache our original display.
+    state.style()->setOriginalDisplay(state.style()->display());
+
     // FIXME: Passing 0 as the Element* introduces a lot of complexity
     // in the adjustRenderStyle code.
     adjustRenderStyle(state, 0);
index da13b01..1ab53b3 100644 (file)
@@ -119,7 +119,7 @@ public:
 
     PassRefPtr<RenderStyle> styleForKeyframe(Element*, const RenderStyle&, RenderStyle* parentStyle, const StyleKeyframe*, const AtomicString& animationName);
     static PassRefPtrWillBeRawPtr<AnimatableValue> createAnimatableValueSnapshot(Element&, CSSPropertyID, CSSValue&);
-    static PassRefPtrWillBeRawPtr<AnimatableValue> createAnimatableValueSnapshot(Element&, CSSPropertyID, CSSValue&, RenderStyle&);
+    static PassRefPtrWillBeRawPtr<AnimatableValue> createAnimatableValueSnapshot(StyleResolverState&, CSSPropertyID, CSSValue&);
 
     PassRefPtr<RenderStyle> pseudoStyleForElement(Element*, const PseudoStyleRequest&, RenderStyle* parentStyle);
 
index 18da27a..815c331 100644 (file)
@@ -294,6 +294,8 @@ void ContainerNode::parserInsertBefore(PassRefPtrWillBeRawPtr<Node> newChild, No
     if (nextChild.previousSibling() == newChild || &nextChild == newChild) // nothing to do
         return;
 
+    RefPtrWillBeRawPtr<Node> protect(this);
+
     if (document() != newChild->document())
         document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION);
 
@@ -303,9 +305,7 @@ void ContainerNode::parserInsertBefore(PassRefPtrWillBeRawPtr<Node> newChild, No
 
     ChildListMutationScope(*this).childAdded(*newChild);
 
-    childrenChanged(true, newChild->previousSibling(), &nextChild, 1);
-
-    notifyNodeInserted(*newChild);
+    notifyNodeInserted(*newChild, ChildrenChangeSourceParser);
 }
 
 void ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, Node* oldChild, ExceptionState& exceptionState)
@@ -482,8 +482,8 @@ void ContainerNode::removeChild(Node* oldChild, ExceptionState& exceptionState)
         Node* prev = child->previousSibling();
         Node* next = child->nextSibling();
         removeBetween(prev, next, *child);
-        childrenChanged(false, prev, next, -1);
         notifyNodeRemoved(*child);
+        childrenChanged(false, prev, next, -1);
     }
     dispatchSubtreeModifiedEvent();
 }
@@ -564,23 +564,29 @@ void ContainerNode::removeChildren()
         document().nodeChildrenWillBeRemoved(*this);
     }
 
-
+    // FIXME: Remove this NodeVector. Right now WebPluginContainerImpl::m_element is a
+    // raw ptr which means the code below can drop the last ref to a plugin element and
+    // then the code in UpdateSuspendScope::performDeferredWidgetTreeOperations will
+    // try to destroy the plugin which will be a use-after-free. We should use a RefPtr
+    // in the WebPluginContainerImpl instead.
     NodeVector removedChildren;
     {
         HTMLFrameOwnerElement::UpdateSuspendScope suspendWidgetHierarchyUpdates;
+
         {
             NoEventDispatchAssertion assertNoEventDispatch;
+            ScriptForbiddenScope forbidScript;
+
             removedChildren.reserveInitialCapacity(countChildren());
-            while (m_firstChild) {
-                removedChildren.append(m_firstChild);
-                removeBetween(0, m_firstChild->nextSibling(), *m_firstChild);
+
+            while (RefPtrWillBeRawPtr<Node> child = m_firstChild) {
+                removeBetween(0, child->nextSibling(), *child);
+                removedChildren.append(child.get());
+                notifyNodeRemoved(*child);
             }
         }
 
         childrenChanged(false, 0, 0, -static_cast<int>(removedChildren.size()));
-
-        for (size_t i = 0; i < removedChildren.size(); ++i)
-            notifyNodeRemoved(*removedChildren[i]);
     }
 
     dispatchSubtreeModifiedEvent();
@@ -651,11 +657,11 @@ void ContainerNode::parserAppendChild(PassRefPtrWillBeRawPtr<Node> newChild)
     ASSERT(!newChild->isDocumentFragment());
     ASSERT(!isHTMLTemplateElement(this));
 
+    RefPtrWillBeRawPtr<Node> protect(this);
+
     if (document() != newChild->document())
         document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION);
 
-    Node* last = m_lastChild;
-
     {
         NoEventDispatchAssertion assertNoEventDispatch;
         ScriptForbiddenScope forbidScript;
@@ -666,11 +672,10 @@ void ContainerNode::parserAppendChild(PassRefPtrWillBeRawPtr<Node> newChild)
         ChildListMutationScope(*this).childAdded(*newChild);
     }
 
-    childrenChanged(true, last, 0, 1);
-    notifyNodeInserted(*newChild);
+    notifyNodeInserted(*newChild, ChildrenChangeSourceParser);
 }
 
-void ContainerNode::notifyNodeInserted(Node& root)
+void ContainerNode::notifyNodeInserted(Node& root, ChildrenChangeSource source)
 {
     ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
 
@@ -682,6 +687,14 @@ void ContainerNode::notifyNodeInserted(Node& root)
     NodeVector postInsertionNotificationTargets;
     notifyNodeInsertedInternal(root, postInsertionNotificationTargets);
 
+    // ShadowRoots are not real children, we don't need to tell host that it's
+    // children changed when one is added.
+    // FIXME: We should have a separate code path for ShadowRoot since it only
+    // needs to call insertedInto and the rest of this logic is not needed.
+    if (!root.isShadowRoot()) {
+        childrenChanged(source == ChildrenChangeSourceParser, root.previousSibling(), root.nextSibling(), 1);
+    }
+
     for (size_t i = 0; i < postInsertionNotificationTargets.size(); ++i) {
         Node* targetNode = postInsertionNotificationTargets[i].get();
         if (targetNode->inDocument())
@@ -1093,8 +1106,6 @@ void ContainerNode::updateTreeAfterInsertion(Node& child)
 
     ChildListMutationScope(*this).childAdded(child);
 
-    childrenChanged(false, child.previousSibling(), child.nextSibling(), 1);
-
     notifyNodeInserted(child);
 
     dispatchChildInsertionEvents(child);
index 4df98d4..d625acb 100644 (file)
@@ -165,7 +165,8 @@ public:
 
     virtual void trace(Visitor*) OVERRIDE;
 
-    void notifyNodeInserted(Node&);
+    enum ChildrenChangeSource { ChildrenChangeSourceAPI, ChildrenChangeSourceParser };
+    void notifyNodeInserted(Node&, ChildrenChangeSource = ChildrenChangeSourceAPI);
     void notifyNodeRemoved(Node&);
 
 protected:
index 1119a34..68bf2f9 100644 (file)
 #include "core/rendering/compositing/RenderLayerCompositor.h"
 #include "core/svg/SVGDocumentExtensions.h"
 #include "core/svg/SVGFontFaceElement.h"
+#include "core/svg/SVGTitleElement.h"
 #include "core/svg/SVGUseElement.h"
 #include "core/workers/SharedWorkerRepositoryClient.h"
 #include "core/xml/XSLTProcessor.h"
@@ -448,7 +449,6 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC
     , m_updateFocusAppearanceRestoresSelection(false)
     , m_containsPlugins(false)
     , m_ignoreDestructiveWriteCount(0)
-    , m_titleSetExplicitly(false)
     , m_markers(adoptPtrWillBeNoop(new DocumentMarkerController))
     , m_updateFocusAppearanceTimer(this, &Document::updateFocusAppearanceTimerFired)
     , m_cssTarget(nullptr)
@@ -576,10 +576,8 @@ Document::~Document()
     if (m_styleSheetList)
         m_styleSheetList->detachFromDocument();
 
-    if (m_importsController) {
-        m_importsController->wasDetachedFrom(*this);
-        m_importsController = nullptr;
-    }
+    if (m_importsController)
+        HTMLImportsController::removeFrom(*this);
 
     m_timeline->detachFromDocument();
 
@@ -633,10 +631,8 @@ void Document::dispose()
 
     m_registrationContext.clear();
 
-    if (m_importsController) {
-        m_importsController->wasDetachedFrom(*this);
-        m_importsController = nullptr;
-    }
+    if (m_importsController)
+        HTMLImportsController::removeFrom(*this);
 
     // removeDetachedChildren() doesn't always unregister IDs,
     // so tear down scope information upfront to avoid having stale references in the map.
@@ -1376,14 +1372,14 @@ void Document::updateTitle(const String& title)
 void Document::setTitle(const String& title)
 {
     // Title set by JavaScript -- overrides any title elements.
-    m_titleSetExplicitly = true;
     if (!isHTMLDocument() && !isXHTMLDocument())
         m_titleElement = nullptr;
     else if (!m_titleElement) {
-        if (HTMLElement* headElement = head()) {
-            m_titleElement = HTMLTitleElement::create(*this);
-            headElement->appendChild(m_titleElement.get());
-        }
+        HTMLElement* headElement = head();
+        if (!headElement)
+            return;
+        m_titleElement = HTMLTitleElement::create(*this);
+        headElement->appendChild(m_titleElement.get());
     }
 
     if (isHTMLTitleElement(m_titleElement))
@@ -1392,16 +1388,23 @@ void Document::setTitle(const String& title)
         updateTitle(title);
 }
 
-void Document::setTitleElement(const String& title, Element* titleElement)
+void Document::setTitleElement(Element* titleElement)
 {
-    if (titleElement != m_titleElement) {
-        if (m_titleElement || m_titleSetExplicitly)
-            // Only allow the first title element to change the title -- others have no effect.
-            return;
+    // Only allow the first title element to change the title -- others have no effect.
+    if (m_titleElement && m_titleElement != titleElement) {
+        if (isHTMLDocument() || isXHTMLDocument()) {
+            m_titleElement = Traversal<HTMLTitleElement>::firstWithin(*this);
+        } else if (isSVGDocument()) {
+            m_titleElement = Traversal<SVGTitleElement>::firstWithin(*this);
+        }
+    } else {
         m_titleElement = titleElement;
     }
 
-    updateTitle(title);
+    if (isHTMLTitleElement(m_titleElement))
+        updateTitle(toHTMLTitleElement(m_titleElement)->text());
+    else if (isSVGTitleElement(m_titleElement))
+        updateTitle(toSVGTitleElement(m_titleElement)->textContent());
 }
 
 void Document::removeTitle(Element* titleElement)
@@ -1410,13 +1413,14 @@ void Document::removeTitle(Element* titleElement)
         return;
 
     m_titleElement = nullptr;
-    m_titleSetExplicitly = false;
 
-    // FIXME: This is broken for SVG.
-    // Update title based on first title element in the head, if one exists.
-    if (HTMLElement* headElement = head()) {
-        if (HTMLTitleElement* title = Traversal<HTMLTitleElement>::firstChild(*headElement))
-            setTitleElement(title->text(), title);
+    // Update title based on first title element in the document, if one exists.
+    if (isHTMLDocument() || isXHTMLDocument()) {
+        if (HTMLTitleElement* title = Traversal<HTMLTitleElement>::firstWithin(*this))
+            setTitleElement(title);
+    } else if (isSVGDocument()) {
+        if (SVGTitleElement* title = Traversal<SVGTitleElement>::firstWithin(*this))
+            setTitleElement(title);
     }
 
     if (!m_titleElement)
@@ -1811,6 +1815,9 @@ void Document::updateRenderTree(StyleRecalcChange change)
 {
     ASSERT(isMainThread());
 
+    if (!view() || !isActive())
+        return;
+
     if (change != Force && !needsRenderTreeUpdate())
         return;
 
@@ -4750,14 +4757,14 @@ Vector<IconURL> Document::iconURLs(int iconTypesMask)
     return iconURLs;
 }
 
-Color Document::brandColor() const
+Color Document::themeColor() const
 {
-    if (!RuntimeEnabledFeatures::brandColorEnabled())
+    if (!RuntimeEnabledFeatures::themeColorEnabled())
         return Color();
 
     for (HTMLMetaElement* metaElement = head() ? Traversal<HTMLMetaElement>::firstChild(*head()) : 0; metaElement; metaElement = Traversal<HTMLMetaElement>::nextSibling(*metaElement)) {
         RGBA32 rgb;
-        if (equalIgnoringCase(metaElement->name(), "brand-color") && BisonCSSParser::parseColor(rgb, metaElement->content().string().stripWhiteSpace(), true))
+        if (equalIgnoringCase(metaElement->name(), "theme-color") && BisonCSSParser::parseColor(rgb, metaElement->content().string().stripWhiteSpace(), true))
             return Color(rgb);
     }
     return Color();
index 35699e9..8872bf4 100644 (file)
@@ -739,7 +739,7 @@ public:
     void setTitle(const String&);
 
     Element* titleElement() const { return m_titleElement.get(); }
-    void setTitleElement(const String& title, Element* titleElement);
+    void setTitleElement(Element*);
     void removeTitle(Element* titleElement);
 
     const AtomicString& dir();
@@ -849,7 +849,7 @@ public:
 
     Vector<IconURL> iconURLs(int iconTypesMask);
 
-    Color brandColor() const;
+    Color themeColor() const;
 
     // Returns the HTMLLinkElement currently in use for the Web Manifest.
     // Returns null if there is no such element.
@@ -1277,7 +1277,6 @@ private:
 
     String m_title;
     String m_rawTitle;
-    bool m_titleSetExplicitly;
     RefPtrWillBeMember<Element> m_titleElement;
 
     OwnPtr<AXObjectCache> m_axObjectCache;
index 2c719b4..428a617 100644 (file)
@@ -684,7 +684,7 @@ void Element::setScrollLeft(int newLeft)
 
     if (document().documentElement() != this) {
         if (RenderBox* rend = renderBox())
-            rend->setScrollLeft(roundf(newLeft * rend->style()->effectiveZoom()));
+            rend->setScrollLeft(LayoutUnit::fromFloatRound(newLeft * rend->style()->effectiveZoom()));
         return;
     }
 
@@ -730,7 +730,7 @@ void Element::setScrollTop(int newTop)
 
     if (document().documentElement() != this) {
         if (RenderBox* rend = renderBox())
-            rend->setScrollTop(roundf(newTop * rend->style()->effectiveZoom()));
+            rend->setScrollTop(LayoutUnit::fromFloatRound(newTop * rend->style()->effectiveZoom()));
         return;
     }
 
@@ -2504,12 +2504,15 @@ void Element::normalizeAttributes()
 {
     if (!hasAttributes())
         return;
-    // attributeCount() cannot be cached before the loop because the attributes
-    // list is altered while iterating.
-    for (unsigned i = 0; i < attributeCount(); ++i) {
-        if (RefPtrWillBeRawPtr<Attr> attr = attrIfExists(attributeAt(i).name()))
-            attr->normalize();
-    }
+    WillBeHeapVector<RefPtrWillBeMember<Attr> >* attrNodes = attrNodeList();
+    if (!attrNodes)
+        return;
+    // Copy the Attr Vector because Node::normalize() can fire synchronous JS
+    // events (e.g. DOMSubtreeModified) and a JS listener could add / remove
+    // attributes while we are iterating.
+    WillBeHeapVector<RefPtrWillBeMember<Attr> > attrNodesCopy(*attrNodes);
+    for (size_t i = 0; i < attrNodesCopy.size(); ++i)
+        attrNodesCopy[i]->normalize();
 }
 
 void Element::updatePseudoElement(PseudoId pseudoId, StyleRecalcChange change)
@@ -3203,14 +3206,6 @@ bool Element::setInlineStyleProperty(CSSPropertyID propertyID, CSSValueID identi
     return true;
 }
 
-bool Element::setInlineStyleProperty(CSSPropertyID propertyID, CSSPropertyID identifier, bool important)
-{
-    ASSERT(isStyledElement());
-    ensureMutableInlineStyle().setProperty(propertyID, cssValuePool().createIdentifierValue(identifier), important);
-    inlineStyleChanged();
-    return true;
-}
-
 bool Element::setInlineStyleProperty(CSSPropertyID propertyID, double value, CSSPrimitiveValue::UnitType unit, bool important)
 {
     ASSERT(isStyledElement());
index b3972e8..ed0c3fa 100644 (file)
@@ -271,7 +271,6 @@ public:
     const StylePropertySet* inlineStyle() const { return elementData() ? elementData()->m_inlineStyle.get() : 0; }
 
     bool setInlineStyleProperty(CSSPropertyID, CSSValueID identifier, bool important = false);
-    bool setInlineStyleProperty(CSSPropertyID, CSSPropertyID identifier, bool important = false);
     bool setInlineStyleProperty(CSSPropertyID, double value, CSSPrimitiveValue::UnitType, bool important = false);
     bool setInlineStyleProperty(CSSPropertyID, const String& value, bool important = false);
     bool removeInlineStyleProperty(CSSPropertyID);
index b5363bc..b22f3a2 100644 (file)
@@ -126,7 +126,7 @@ void FullscreenElementStack::documentWasDetached()
     m_fullScreenErrorEventTargetQueue.clear();
 
     if (m_fullScreenRenderer)
-        setFullScreenRenderer(0);
+        m_fullScreenRenderer->destroy();
 
 #if ENABLE(OILPAN)
     m_fullScreenElement = nullptr;
@@ -475,7 +475,7 @@ void FullscreenElementStack::setFullScreenRenderer(RenderFullScreen* renderer)
     }
 
     if (m_fullScreenRenderer)
-        m_fullScreenRenderer->destroy();
+        m_fullScreenRenderer->unwrapRenderer();
     ASSERT(!m_fullScreenRenderer);
 
     m_fullScreenRenderer = renderer;
index bff917d..6390e04 100644 (file)
@@ -57,7 +57,7 @@ ProcessingInstruction::~ProcessingInstruction()
 {
 #if !ENABLE(OILPAN)
     if (m_sheet)
-        m_sheet->clearOwnerNode();
+        clearSheet();
 
     // FIXME: ProcessingInstruction should not be in document here.
     // However, if we add ASSERT(!inDocument()), fast/xsl/xslt-entity.xml
@@ -90,8 +90,9 @@ PassRefPtrWillBeRawPtr<Node> ProcessingInstruction::cloneNode(bool /*deep*/)
 
 void ProcessingInstruction::didAttributeChanged()
 {
-    ASSERT(!m_sheet);
-    ASSERT(!isLoading());
+    if (m_sheet)
+        clearSheet();
+
     String href;
     String charset;
     if (!checkStyleSheet(href, charset))
@@ -211,6 +212,11 @@ void ProcessingInstruction::setCSSStyleSheet(const String& href, const KURL& bas
 
 void ProcessingInstruction::setXSLStyleSheet(const String& href, const KURL& baseURL, const String& sheet)
 {
+    if (!inDocument()) {
+        ASSERT(!m_sheet);
+        return;
+    }
+
     ASSERT(m_isXSL);
     m_sheet = XSLStyleSheet::create(this, href, baseURL);
     parseStyleSheet(sheet);
@@ -274,8 +280,7 @@ void ProcessingInstruction::removedFrom(ContainerNode* insertionPoint)
 
     if (m_sheet) {
         ASSERT(m_sheet->ownerNode() == this);
-        m_sheet->clearOwnerNode();
-        m_sheet = nullptr;
+        clearSheet();
     }
 
     // If we're in document teardown, then we don't need to do any notification of our sheet's removal.
@@ -283,6 +288,14 @@ void ProcessingInstruction::removedFrom(ContainerNode* insertionPoint)
         document().removedStyleSheet(removedSheet.get());
 }
 
+void ProcessingInstruction::clearSheet()
+{
+    ASSERT(m_sheet);
+    if (m_sheet->isLoading())
+        document().styleEngine()->removePendingSheet(this);
+    m_sheet.release()->clearOwnerNode();
+}
+
 void ProcessingInstruction::trace(Visitor* visitor)
 {
     visitor->trace(m_sheet);
index 60528e0..5f50a72 100644 (file)
@@ -71,6 +71,7 @@ private:
     virtual bool sheetLoaded() OVERRIDE;
 
     void parseStyleSheet(const String& sheet);
+    void clearSheet();
 
     String m_target;
     String m_localHref;
index 10e4029..af875e7 100644 (file)
@@ -954,7 +954,7 @@ String Range::text() const
     // FIXME: As with innerText, we'd like this to work even if there are no render objects.
     m_start.container()->document().updateLayout();
 
-    return plainText(this);
+    return plainText(this, TextIteratorEmitsObjectReplacementCharacter);
 }
 
 PassRefPtrWillBeRawPtr<DocumentFragment> Range::createContextualFragment(const String& markup, ExceptionState& exceptionState)
index 97c71df..9ed695d 100644 (file)
@@ -121,6 +121,8 @@ inline bool SelectorDataList::selectorMatches(const CSSSelector& selector, Eleme
     SelectorChecker::SelectorCheckingContext selectorCheckingContext(selector, &element, SelectorChecker::VisitedMatchDisabled);
     selectorCheckingContext.behaviorAtBoundary = SelectorChecker::StaysWithinTreeScope;
     selectorCheckingContext.scope = !rootNode.isDocumentNode() ? &rootNode : 0;
+    if (selectorCheckingContext.scope)
+        selectorCheckingContext.behaviorAtBoundary = static_cast<SelectorChecker::BehaviorAtBoundary>(SelectorChecker::StaysWithinTreeScope | SelectorChecker::ScopeContainsLastMatchedElement);
     return selectorChecker.match(selectorCheckingContext, DOMSiblingTraversalStrategy()) == SelectorChecker::SelectorMatches;
 }
 
index e8802b2..a737752 100644 (file)
@@ -222,7 +222,7 @@ void FrameSelection::setSelection(const VisibleSelection& newSelection, SetSelec
     bool shouldClearTypingStyle = options & ClearTypingStyle;
     EUserTriggered userTriggered = selectionOptionsToUserTriggered(options);
 
-    VisibleSelection s = newSelection;
+    VisibleSelection s = validateSelection(newSelection);
     if (shouldAlwaysUseDirectionalSelection(m_frame))
         s.setIsDirectional(true);
 
@@ -1838,6 +1838,28 @@ void FrameSelection::didChangeVisibleSelection()
     m_observingVisibleSelection = false;
 }
 
+VisibleSelection FrameSelection::validateSelection(const VisibleSelection& selection)
+{
+    if (!m_frame || selection.isNone())
+        return selection;
+
+    Position base = selection.base();
+    Position extent = selection.extent();
+    bool isBaseValid = base.document() == m_frame->document();
+    bool isExtentValid = extent.document() == m_frame->document();
+
+    if (isBaseValid && isExtentValid)
+        return selection;
+
+    VisibleSelection newSelection;
+    if (isBaseValid) {
+        newSelection.setWithoutValidation(base, base);
+    } else if (isExtentValid) {
+        newSelection.setWithoutValidation(extent, extent);
+    }
+    return newSelection;
+}
+
 void FrameSelection::startObservingVisibleSelectionChange()
 {
     ASSERT(!m_observingVisibleSelection);
index c3555ae..bd4838b 100644 (file)
@@ -261,6 +261,8 @@ private:
     void startObservingVisibleSelectionChange();
     void stopObservingVisibleSelectionChangeIfNecessary();
 
+    VisibleSelection validateSelection(const VisibleSelection&);
+
     LocalFrame* m_frame;
 
     LayoutUnit m_xPosForVerticalArrowNavigation;
index 47a27e6..3e6b85e 100644 (file)
@@ -317,7 +317,7 @@ void InputMethodController::setComposition(const String& text, const Vector<Comp
 
 void InputMethodController::setCompositionFromExistingText(const Vector<CompositionUnderline>& underlines, unsigned compositionStart, unsigned compositionEnd)
 {
-    Node* editable = m_frame.selection().rootEditableElement();
+    Element* editable = m_frame.selection().rootEditableElement();
     Position base = m_frame.selection().base().downstream();
     Node* baseNode = base.anchorNode();
     if (editable->firstChild() == baseNode && editable->lastChild() == baseNode && baseNode->isTextNode()) {
@@ -330,13 +330,14 @@ void InputMethodController::setCompositionFromExistingText(const Vector<Composit
             return;
 
         m_compositionNode = toText(baseNode);
-        m_compositionStart = compositionStart;
-        m_compositionEnd = compositionEnd;
+        RefPtrWillBeRawPtr<Range> range = PlainTextRange(compositionStart, compositionEnd).createRange(*editable);
+        m_compositionStart = range->startOffset();
+        m_compositionEnd = range->endOffset();
         m_customCompositionUnderlines = underlines;
         size_t numUnderlines = m_customCompositionUnderlines.size();
         for (size_t i = 0; i < numUnderlines; ++i) {
-            m_customCompositionUnderlines[i].startOffset += compositionStart;
-            m_customCompositionUnderlines[i].endOffset += compositionStart;
+            m_customCompositionUnderlines[i].startOffset += m_compositionStart;
+            m_customCompositionUnderlines[i].endOffset += m_compositionStart;
         }
         if (baseNode->renderer())
             baseNode->renderer()->paintInvalidationForWholeRenderer();
@@ -379,7 +380,7 @@ bool InputMethodController::setSelectionOffsets(const PlainTextRange& selectionO
     if (!rootEditableElement)
         return false;
 
-    RefPtrWillBeRawPtr<Range> range = selectionOffsets.createRangeForInputMethod(*rootEditableElement);
+    RefPtrWillBeRawPtr<Range> range = selectionOffsets.createRange(*rootEditableElement);
     if (!range)
         return false;
 
index 1ebc8f4..ff63a5e 100644 (file)
@@ -67,11 +67,6 @@ PassRefPtrWillBeRawPtr<Range> PlainTextRange::createRangeForSelection(const Cont
     return createRangeFor(scope, ForSelection);
 }
 
-PassRefPtrWillBeRawPtr<Range> PlainTextRange::createRangeForInputMethod(const ContainerNode& scope) const
-{
-    return createRangeFor(scope, ForInputMethod);
-}
-
 PassRefPtrWillBeRawPtr<Range> PlainTextRange::createRangeFor(const ContainerNode& scope, GetRangeFor getRangeFor) const
 {
     ASSERT(isNotNull());
@@ -83,11 +78,9 @@ PassRefPtrWillBeRawPtr<Range> PlainTextRange::createRangeFor(const ContainerNode
 
     RefPtrWillBeRawPtr<Range> textRunRange = nullptr;
 
-    TextIteratorBehavior behaviorFlags = TextIteratorDefaultBehavior;
+    TextIteratorBehaviorFlags behaviorFlags = TextIteratorEmitsObjectReplacementCharacter;
     if (getRangeFor == ForSelection)
-        behaviorFlags = TextIteratorEmitsCharactersBetweenAllVisiblePositions;
-    else if (getRangeFor == ForInputMethod)
-        behaviorFlags = TextIteratorEmitsObjectReplacementCharacter;
+        behaviorFlags |= TextIteratorEmitsCharactersBetweenAllVisiblePositions;
     TextIterator it(rangeOfContents(const_cast<ContainerNode*>(&scope)).get(), behaviorFlags);
 
     // FIXME: the atEnd() check shouldn't be necessary, workaround for <http://bugs.webkit.org/show_bug.cgi?id=6289>.
index ba583ce..d3e2617 100644 (file)
@@ -51,14 +51,13 @@ public:
 
     PassRefPtrWillBeRawPtr<Range> createRange(const ContainerNode& scope) const;
     PassRefPtrWillBeRawPtr<Range> createRangeForSelection(const ContainerNode& scope) const;
-    PassRefPtrWillBeRawPtr<Range> createRangeForInputMethod(const ContainerNode& scope) const;
 
     static PlainTextRange create(const Node& scope, const Range&);
 
 private:
     PlainTextRange& operator=(const PlainTextRange&)  WTF_DELETED_FUNCTION;
 
-    enum GetRangeFor { ForGeneric, ForSelection, ForInputMethod };
+    enum GetRangeFor { ForGeneric, ForSelection };
     PassRefPtrWillBeRawPtr<Range> createRangeFor(const ContainerNode& scope, GetRangeFor) const;
 
     const size_t m_start;
index 45a5f21..b1c9e13 100644 (file)
@@ -2043,7 +2043,10 @@ nextMatch:
 int TextIterator::rangeLength(const Range* r, bool forSelectionPreservation)
 {
     int length = 0;
-    for (TextIterator it(r, forSelectionPreservation ? TextIteratorEmitsCharactersBetweenAllVisiblePositions : TextIteratorDefaultBehavior); !it.atEnd(); it.advance())
+    TextIteratorBehaviorFlags behaviorFlags = TextIteratorEmitsObjectReplacementCharacter;
+    if (forSelectionPreservation)
+        behaviorFlags |= TextIteratorEmitsCharactersBetweenAllVisiblePositions;
+    for (TextIterator it(r, behaviorFlags); !it.atEnd(); it.advance())
         length += it.length();
 
     return length;
index 7e9afc3..08a91ed 100644 (file)
@@ -109,7 +109,12 @@ public:
     PassRefPtrWillBeRawPtr<Range> range() const;
     Node* node() const;
 
-    static int rangeLength(const Range*, bool spacesForReplacedElements = false);
+    // Computes the length of the given range using a text iterator. The default
+    // iteration behavior is to always emit object replacement characters for
+    // replaced elements. When |forSelectionPreservation| is set to true, it
+    // also emits spaces for other non-text nodes using the
+    // |TextIteratorEmitsCharactersBetweenAllVisiblePosition| mode.
+    static int rangeLength(const Range*, bool forSelectionPreservation = false);
     static PassRefPtrWillBeRawPtr<Range> subrange(Range* entireRange, int characterOffset, int characterCount);
 
 private:
index 082444e..63a7f40 100644 (file)
@@ -539,4 +539,17 @@ TEST_F(TextIteratorTest, EmitsReplacementCharForInput)
     EXPECT_EQ(expectedTextChunks, iterate(TextIteratorEmitsObjectReplacementCharacter));
 }
 
+TEST_F(TextIteratorTest, RangeLengthWithReplacedElements)
+{
+    static const char* bodyContent =
+        "<div id=\"div\" contenteditable=\"true\">1<img src=\"foo.png\">3</div>";
+    setBodyInnerHTML(bodyContent);
+    document().view()->updateLayoutAndStyleIfNeededRecursive();
+
+    Node* divNode = document().getElementById("div");
+    RefPtrWillBeRawPtr<Range> range = Range::create(document(), divNode, 0, divNode, 3);
+
+    EXPECT_EQ(3, TextIterator::rangeLength(range.get()));
+}
+
 }
index 98e3c7f..c7e788d 100644 (file)
@@ -2734,8 +2734,7 @@ void FrameView::paintContents(GraphicsContext* p, const IntRect& rect)
     RenderObject::SetLayoutNeededForbiddenScope forbidSetNeedsLayout(*rootLayer->renderer());
 #endif
 
-    RenderObject* enclosingLayerRenderer = renderer ? renderer->enclosingLayer()->renderer() : 0;
-    rootLayer->paint(p, rect, m_paintBehavior, enclosingLayerRenderer);
+    rootLayer->paint(p, rect, m_paintBehavior, renderer);
 
     if (rootLayer->containsDirtyOverlayScrollbars())
         rootLayer->paintOverlayScrollbars(p, rect, m_paintBehavior, renderer);
index d314335..135263c 100644 (file)
@@ -117,7 +117,7 @@ class PostMessageTimer FINAL : public SuspendableTimer {
 public:
     PostMessageTimer(LocalDOMWindow& window, PassRefPtr<SerializedScriptValue> message, const String& sourceOrigin, PassRefPtrWillBeRawPtr<LocalDOMWindow> source, PassOwnPtr<MessagePortChannelArray> channels, SecurityOrigin* targetOrigin, PassRefPtrWillBeRawPtr<ScriptCallStack> stackTrace, UserGestureToken* userGestureToken)
         : SuspendableTimer(window.document())
-        , m_window(window)
+        , m_window(&window)
         , m_message(message)
         , m_origin(sourceOrigin)
         , m_source(source)
@@ -140,11 +140,14 @@ public:
 private:
     virtual void fired() OVERRIDE
     {
-        m_window->postMessageTimerFired(adoptPtr(this));
+        m_window->postMessageTimerFired(this);
         // This object is deleted now.
     }
 
-    RefPtrWillBePersistent<LocalDOMWindow> m_window;
+    // FIXME: Oilpan: This raw pointer is safe because the PostMessageTimer is
+    // owned by the LocalDOMWindow. Ideally PostMessageTimer should be moved to
+    // the heap and use Member<LocalDOMWindow>.
+    LocalDOMWindow* m_window;
     RefPtr<SerializedScriptValue> m_message;
     String m_origin;
     RefPtrWillBePersistent<LocalDOMWindow> m_source;
@@ -864,30 +867,34 @@ void LocalDOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, cons
         stackTrace = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCapture, true);
 
     // Schedule the message.
-    PostMessageTimer* timer = new PostMessageTimer(*this, message, sourceOrigin, source, channels.release(), target.get(), stackTrace.release(), UserGestureIndicator::currentToken());
+    OwnPtr<PostMessageTimer> timer = adoptPtr(new PostMessageTimer(*this, message, sourceOrigin, source, channels.release(), target.get(), stackTrace.release(), UserGestureIndicator::currentToken()));
     timer->startOneShot(0, FROM_HERE);
     timer->suspendIfNeeded();
+    m_postMessageTimers.add(timer.release());
 }
 
-void LocalDOMWindow::postMessageTimerFired(PassOwnPtr<PostMessageTimer> t)
+void LocalDOMWindow::postMessageTimerFired(PostMessageTimer* timer)
 {
-    OwnPtr<PostMessageTimer> timer(t);
-
-    if (!isCurrentlyDisplayedInFrame())
+    if (!isCurrentlyDisplayedInFrame()) {
+        m_postMessageTimers.remove(timer);
         return;
+    }
 
     RefPtrWillBeRawPtr<MessageEvent> event = timer->event();
 
     // Give the embedder a chance to intercept this postMessage because this
     // LocalDOMWindow might be a proxy for another in browsers that support
     // postMessage calls across WebKit instances.
-    if (m_frame->loader().client()->willCheckAndDispatchMessageEvent(timer->targetOrigin(), event.get()))
+    if (m_frame->loader().client()->willCheckAndDispatchMessageEvent(timer->targetOrigin(), event.get())) {
+        m_postMessageTimers.remove(timer);
         return;
+    }
 
     UserGestureIndicator gestureIndicator(timer->userGestureToken());
 
     event->entangleMessagePorts(document());
     dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->stackTrace());
+    m_postMessageTimers.remove(timer);
 }
 
 void LocalDOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtrWillBeRawPtr<Event> event, PassRefPtrWillBeRawPtr<ScriptCallStack> stackTrace)
index 0d9b1b3..8239478 100644 (file)
@@ -230,7 +230,7 @@ enum PageshowEventPersistence {
         String sanitizedCrossDomainAccessErrorMessage(LocalDOMWindow* callingWindow);
 
         void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, LocalDOMWindow* source, ExceptionState&);
-        void postMessageTimerFired(PassOwnPtr<PostMessageTimer>);
+        void postMessageTimerFired(PostMessageTimer*);
         void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtrWillBeRawPtr<Event>, PassRefPtrWillBeRawPtr<ScriptCallStack>);
 
         void scrollBy(int x, int y) const;
@@ -395,6 +395,8 @@ enum PageshowEventPersistence {
 
         RefPtrWillBeMember<DOMWindowEventQueue> m_eventQueue;
         RefPtr<SerializedScriptValue> m_pendingStateObject;
+
+        HashSet<OwnPtr<PostMessageTimer> > m_postMessageTimers;
     };
 
     inline String LocalDOMWindow::status() const
index e880539..4d6c77e 100644 (file)
@@ -42,7 +42,6 @@
 #include "core/html/canvas/WebGLContextAttributes.h"
 #include "core/html/canvas/WebGLContextEvent.h"
 #include "core/html/canvas/WebGLRenderingContext.h"
-#include "core/page/ChromeClient.h"
 #include "core/rendering/RenderHTMLCanvas.h"
 #include "platform/MIMETypeRegistry.h"
 #include "platform/RuntimeEnabledFeatures.h"
@@ -435,9 +434,8 @@ bool HTMLCanvasElement::shouldAccelerate(const IntSize& size) const
     if (!settings || !settings->accelerated2dCanvasEnabled())
         return false;
 
-    // Do not use acceleration for small canvases, unless GPU rasterization is available.
-    // GPU raterization is a heuristic to avoid difficult content & whitelist targeted content.
-    if (!(document().frame() && document().frame()->chromeClient().usesGpuRasterization()) && size.width() * size.height() < settings->minimumAccelerated2dCanvasSize())
+    // Do not use acceleration for small canvas.
+    if (size.width() * size.height() < settings->minimumAccelerated2dCanvasSize())
         return false;
 
     if (!blink::Platform::current()->canAccelerate2dCanvas())
index 9878763..b9d57bf 100644 (file)
@@ -70,6 +70,8 @@ HTMLFormElement::HTMLFormElement(Document& document)
     , m_hasElementsAssociatedByParser(false)
     , m_didFinishParsingChildren(false)
     , m_wasUserSubmitted(false)
+    , m_isSubmittingOrInUserJSSubmitEvent(false)
+    , m_shouldSubmit(false)
     , m_isInResetFunction(false)
     , m_wasDemoted(false)
     , m_pendingAutocompleteEventsQueue(GenericEventQueue::create(this))
@@ -307,16 +309,24 @@ void HTMLFormElement::prepareForSubmission(Event* event)
 {
     RefPtrWillBeRawPtr<HTMLFormElement> protector(this);
     LocalFrame* frame = document().frame();
-    if (!frame)
+    if (!frame || m_isSubmittingOrInUserJSSubmitEvent)
         return;
 
     // Interactive validation must be done before dispatching the submit event.
     if (!validateInteractively(event))
         return;
 
+    m_isSubmittingOrInUserJSSubmitEvent = true;
+    m_shouldSubmit = false;
+
     frame->loader().client()->dispatchWillSendSubmitEvent(this);
 
     if (dispatchEvent(Event::createCancelableBubble(EventTypeNames::submit)))
+        m_shouldSubmit = true;
+
+    m_isSubmittingOrInUserJSSubmitEvent = false;
+
+    if (m_shouldSubmit)
         submit(event, true, true, NotSubmittedByJavaScript);
 }
 
@@ -347,6 +357,12 @@ void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool proce
     if (!view || !frame || !frame->page())
         return;
 
+    if (m_isSubmittingOrInUserJSSubmitEvent) {
+        m_shouldSubmit = true;
+        return;
+    }
+
+    m_isSubmittingOrInUserJSSubmitEvent = true;
     m_wasUserSubmitted = processingUserGesture;
 
     RefPtrWillBeRawPtr<HTMLFormControlElement> firstSuccessfulSubmitButton = nullptr;
@@ -378,6 +394,9 @@ void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool proce
 
     if (needButtonActivation && firstSuccessfulSubmitButton)
         firstSuccessfulSubmitButton->setActivatedSubmit(false);
+
+    m_shouldSubmit = false;
+    m_isSubmittingOrInUserJSSubmitEvent = false;
 }
 
 void HTMLFormElement::scheduleFormSubmission(PassRefPtrWillBeRawPtr<FormSubmission> submission)
@@ -487,11 +506,11 @@ void HTMLFormElement::finishRequestAutocomplete(AutocompleteResult result)
 void HTMLFormElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
 {
     if (name == actionAttr) {
-        m_attributes.parseAction(document(), value);
+        m_attributes.parseAction(value);
         // If the new action attribute is pointing to insecure "action" location from a secure page
         // it is marked as "passive" mixed content.
-        KURL actionURL = m_attributes.action().isEmpty() ? document().url() : m_attributes.action();
-        if (MixedContentChecker::isMixedContent(document().securityOrigin(), actionURL))
+        KURL actionURL = document().completeURL(m_attributes.action().isEmpty() ? document().url().string() : m_attributes.action());
+        if (document().frame() && MixedContentChecker::isMixedContent(document().securityOrigin(), actionURL))
             document().frame()->loader().mixedContentChecker()->canSubmitToInsecureForm(document().securityOrigin(), actionURL);
     } else if (name == targetAttr)
         m_attributes.setTarget(value);
index b4fb479..3453700 100644 (file)
@@ -177,6 +177,8 @@ private:
     bool m_didFinishParsingChildren;
 
     bool m_wasUserSubmitted;
+    bool m_isSubmittingOrInUserJSSubmitEvent;
+    bool m_shouldSubmit;
 
     bool m_isInResetFunction;
 
index c9e8c10..c74defe 100644 (file)
@@ -98,10 +98,8 @@ void HTMLLIElement::attach(const AttachContext& context)
 
         // If we are not in a list, tell the renderer so it can position us inside.
         // We don't want to change our style to say "inside" since that would affect nested nodes.
-        if (!listNode) {
+        if (!listNode)
             listItemRenderer->setNotInList(true);
-            listItemRenderer->updateMarkerLocation();
-        }
 
         parseValue(fastGetAttribute(valueAttr));
     }
index df0c159..7850520 100644 (file)
@@ -72,13 +72,12 @@ void HTMLMetaElement::parseContentAttribute(const String& content, KeyValuePairC
     bool error = false;
 
     // Tread lightly in this code -- it was specifically designed to mimic Win IE's parsing behavior.
-    int keyBegin, keyEnd;
-    int valueBegin, valueEnd;
+    unsigned keyBegin, keyEnd;
+    unsigned valueBegin, valueEnd;
 
-    int i = 0;
-    int length = content.length();
     String buffer = content.lower();
-    while (i < length) {
+    unsigned length = buffer.length();
+    for (unsigned i = 0; i < length; /* no increment here */) {
         // skip to first non-separator, but don't skip past the end of the string
         while (isSeparator(buffer[i])) {
             if (i >= length)
@@ -90,6 +89,8 @@ void HTMLMetaElement::parseContentAttribute(const String& content, KeyValuePairC
         // skip to first separator
         while (!isSeparator(buffer[i])) {
             error |= isInvalidSeparator(buffer[i]);
+            if (i >= length)
+                break;
             i++;
         }
         keyEnd = i;
@@ -113,6 +114,8 @@ void HTMLMetaElement::parseContentAttribute(const String& content, KeyValuePairC
         // skip to first separator
         while (!isSeparator(buffer[i])) {
             error |= isInvalidSeparator(buffer[i]);
+            if (i >= length)
+                break;
             i++;
         }
         valueEnd = i;
@@ -471,8 +474,8 @@ void HTMLMetaElement::process()
             processViewportContentAttribute("width=device-width", ViewportDescription::HandheldFriendlyMeta);
         else if (equalIgnoringCase(nameValue, "mobileoptimized"))
             processViewportContentAttribute("width=device-width, initial-scale=1", ViewportDescription::MobileOptimizedMeta);
-        else if (RuntimeEnabledFeatures::brandColorEnabled() && equalIgnoringCase(nameValue, "brand-color") && document().frame())
-            document().frame()->loader().client()->dispatchDidChangeBrandColor();
+        else if (RuntimeEnabledFeatures::themeColorEnabled() && equalIgnoringCase(nameValue, "theme-color") && document().frame())
+            document().frame()->loader().client()->dispatchDidChangeThemeColor();
     }
 
     // Get the document to process the tag, but only if we're actually part of DOM
index 79239f4..c2ae7a7 100644 (file)
@@ -343,6 +343,14 @@ Node::InsertionNotificationRequest HTMLOptionElement::insertedInto(ContainerNode
     return HTMLElement::insertedInto(insertionPoint);
 }
 
+void HTMLOptionElement::removedFrom(ContainerNode* insertionPoint)
+{
+    if (HTMLSelectElement* select = Traversal<HTMLSelectElement>::firstAncestorOrSelf(*insertionPoint)) {
+        select->setRecalcListItems();
+    }
+    HTMLElement::removedFrom(insertionPoint);
+}
+
 String HTMLOptionElement::collectOptionInnerText() const
 {
     StringBuilder text;
index 65e1a23..611aa19 100644 (file)
@@ -68,6 +68,8 @@ public:
 
     bool isDisplayNone() const;
 
+    virtual void removedFrom(ContainerNode* insertionPoint) OVERRIDE;
+
 private:
     explicit HTMLOptionElement(Document&);
 
index 33060e2..119e272 100644 (file)
@@ -50,7 +50,7 @@ Node::InsertionNotificationRequest HTMLTitleElement::insertedInto(ContainerNode*
 {
     HTMLElement::insertedInto(insertionPoint);
     if (inDocument() && !isInShadowTree())
-        document().setTitleElement(text(), this);
+        document().setTitleElement(this);
     return InsertionDone;
 }
 
@@ -65,7 +65,7 @@ void HTMLTitleElement::childrenChanged(bool changedByParser, Node* beforeChange,
 {
     HTMLElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
     if (inDocument() && !isInShadowTree() && !m_ignoreTitleUpdatesWhenChildrenChange)
-        document().setTitleElement(text(), this);
+        document().setTitleElement(this);
 }
 
 String HTMLTitleElement::text() const
index ed77909..423badc 100644 (file)
@@ -90,6 +90,11 @@ void RadioNodeList::setValue(const String& value)
     }
 }
 
+bool RadioNodeList::matchesByIdOrName(const Element& testElement) const
+{
+    return testElement.getIdAttribute() == m_name || testElement.getNameAttribute() == m_name;
+}
+
 bool RadioNodeList::checkElementMatchesRadioNodeListFilter(const Element& testElement) const
 {
     ASSERT(!m_onlyMatchImgElements);
@@ -100,7 +105,7 @@ bool RadioNodeList::checkElementMatchesRadioNodeListFilter(const Element& testEl
             return false;
     }
 
-    return testElement.getIdAttribute() == m_name || testElement.getNameAttribute() == m_name;
+    return matchesByIdOrName(testElement);
 }
 
 bool RadioNodeList::elementMatches(const Element& element) const
@@ -108,7 +113,11 @@ bool RadioNodeList::elementMatches(const Element& element) const
     if (m_onlyMatchImgElements) {
         if (!isHTMLImageElement(element))
             return false;
-        return toHTMLElement(element).formOwner() == ownerNode();
+
+        if (toHTMLElement(element).formOwner() != ownerNode())
+            return false;
+
+        return matchesByIdOrName(element);
     }
 
     if (!isHTMLObjectElement(element) && !element.isFormControlElement())
index 09eb8d0..5dbd7b6 100644 (file)
@@ -50,6 +50,8 @@ private:
 
     bool checkElementMatchesRadioNodeListFilter(const Element&) const;
 
+    bool matchesByIdOrName(const Element&) const;
+
     virtual bool elementMatches(const Element&) const OVERRIDE;
 
     AtomicString m_name;
@@ -59,4 +61,3 @@ private:
 } // namespace
 
 #endif
-
index bfe0bed..3b53834 100644 (file)
@@ -22,7 +22,7 @@ HTMLImportTreeRoot::HTMLImportTreeRoot(Document* document)
     , m_document(document)
     , m_recalcTimer(this, &HTMLImportTreeRoot::recalcTimerFired)
 {
-    recalcTreeState(this); // This recomputes initial state.
+    scheduleRecalcState(); // This recomputes initial state.
 }
 
 HTMLImportTreeRoot::~HTMLImportTreeRoot()
index 8afd0dd..c6e165a 100644 (file)
 
 namespace WebCore {
 
-void HTMLImportsController::provideTo(Document& master)
+const char* HTMLImportsController::supplementName()
 {
     DEFINE_STATIC_LOCAL(const char*, name, ("HTMLImportsController"));
+    return name;
+}
+
+void HTMLImportsController::provideTo(Document& master)
+{
     OwnPtrWillBeRawPtr<HTMLImportsController> controller = adoptPtrWillBeNoop(new HTMLImportsController(master));
     master.setImportsController(controller.get());
-    DocumentSupplement::provideTo(master, name, controller.release());
+    DocumentSupplement::provideTo(master, supplementName(), controller.release());
+}
+
+void HTMLImportsController::removeFrom(Document& master)
+{
+    static_cast<DocumentSupplementable&>(master).removeSupplement(supplementName());
+    master.setImportsController(nullptr);
 }
 
 HTMLImportsController::HTMLImportsController(Document& master)
@@ -59,24 +70,13 @@ HTMLImportsController::HTMLImportsController(Document& master)
 HTMLImportsController::~HTMLImportsController()
 {
 #if !ENABLE(OILPAN)
-    ASSERT(!m_root);
-#endif
-}
-
-#if !ENABLE(OILPAN)
-void HTMLImportsController::clear()
-{
-    Document* master = root()->document();
     m_root.clear();
 
     for (size_t i = 0; i < m_loaders.size(); ++i)
         m_loaders[i]->importDestroyed();
     m_loaders.clear();
-
-    if (master)
-        master->setImportsController(0);
-}
 #endif
+}
 
 static bool makesCycle(HTMLImport* parent, const KURL& url)
 {
@@ -144,15 +144,6 @@ bool HTMLImportsController::shouldBlockScriptExecution(const Document& document)
     return root()->state().shouldBlockScriptExecution();
 }
 
-#if !ENABLE(OILPAN)
-void HTMLImportsController::wasDetachedFrom(const Document& document)
-{
-    ASSERT(document.importsController() == this);
-    if (master() == &document)
-        clear();
-}
-#endif
-
 HTMLImportLoader* HTMLImportsController::createLoader()
 {
     m_loaders.append(HTMLImportLoader::create(this));
index 414fe46..4cbc5d7 100644 (file)
@@ -55,7 +55,9 @@ class HTMLImportsController FINAL : public NoBaseWillBeGarbageCollectedFinalized
     WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(HTMLImportsController);
     WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
 public:
+    static const char* supplementName();
     static void provideTo(Document&);
+    static void removeFrom(Document&);
 
     explicit HTMLImportsController(Document&);
     virtual ~HTMLImportsController();
@@ -63,9 +65,6 @@ public:
     HTMLImportTreeRoot* root() const { return m_root.get(); }
 
     bool shouldBlockScriptExecution(const Document&) const;
-#if !ENABLE(OILPAN)
-    void wasDetachedFrom(const Document&);
-#endif
     HTMLImportChild* load(HTMLImport* parent, HTMLImportChildClient*, FetchRequest);
 
     Document* master() const;
@@ -81,9 +80,6 @@ public:
 
 private:
     HTMLImportChild* createChild(const KURL&, HTMLImportLoader*, HTMLImport* parent, HTMLImportChildClient*);
-#if !ENABLE(OILPAN)
-    void clear();
-#endif
 
     OwnPtrWillBeMember<HTMLImportTreeRoot> m_root;
     typedef WillBeHeapVector<OwnPtrWillBeMember<HTMLImportLoader> > LoaderList;
index f295cf2..e5a4d25 100644 (file)
@@ -740,7 +740,9 @@ void HTMLDocumentParser::startBackgroundParser()
     RefPtr<WeakReference<BackgroundHTMLParser> > reference = WeakReference<BackgroundHTMLParser>::createUnbound();
     m_backgroundParser = WeakPtr<BackgroundHTMLParser>(reference);
 
-    document()->loader()->attachThreadedDataReceiver(adoptPtr(new ParserDataReceiver(m_backgroundParser)));
+    // TODO(oysteine): Disabled due to crbug.com/398076 until a full fix can be implemented.
+    if (RuntimeEnabledFeatures::threadedParserDataReceiverEnabled())
+        document()->loader()->attachThreadedDataReceiver(adoptPtr(new ParserDataReceiver(m_backgroundParser)));
 
     OwnPtr<BackgroundHTMLParser::Configuration> config = adoptPtr(new BackgroundHTMLParser::Configuration);
     config->options = m_options;
index 674675f..12c6f22 100644 (file)
@@ -55,9 +55,7 @@ using namespace HTMLNames;
 static const AtomicString& getMediaControlCurrentTimeDisplayElementShadowPseudoId();
 static const AtomicString& getMediaControlTimeRemainingDisplayElementShadowPseudoId();
 
-// If you change any of the following fade durations, then also update the
-// corresponding values in LayoutTests/media/media-controls.js.
-static const double fadeInDuration = 0.1;
+// This is the duration from mediaControls.css
 static const double fadeOutDuration = 0.3;
 
 MediaControlPanelElement::MediaControlPanelElement(MediaControls& mediaControls)
@@ -120,10 +118,7 @@ void MediaControlPanelElement::makeOpaque()
     if (m_opaque)
         return;
 
-    setInlineStyleProperty(CSSPropertyTransitionProperty, CSSPropertyOpacity);
-    setInlineStyleProperty(CSSPropertyTransitionDuration, fadeInDuration, CSSPrimitiveValue::CSS_S);
     setInlineStyleProperty(CSSPropertyOpacity, 1.0, CSSPrimitiveValue::CSS_NUMBER);
-
     m_opaque = true;
 
     if (m_isDisplayed)
@@ -135,8 +130,6 @@ void MediaControlPanelElement::makeTransparent()
     if (!m_opaque)
         return;
 
-    setInlineStyleProperty(CSSPropertyTransitionProperty, CSSPropertyOpacity);
-    setInlineStyleProperty(CSSPropertyTransitionDuration, fadeOutDuration, CSSPrimitiveValue::CSS_S);
     setInlineStyleProperty(CSSPropertyOpacity, 0.0, CSSPrimitiveValue::CSS_NUMBER);
 
     m_opaque = false;
index 3e9ab2f..7e200bc 100644 (file)
@@ -193,6 +193,11 @@ void RenderSliderContainer::layout()
         // so nothing else would otherwise invalidate the slider.
         paintInvalidationForWholeRenderer();
     }
+
+    // We need one-off invalidation code here because painting of the timeline element does not go through style.
+    // Instead it has a custom implementation in C++ code.
+    // Therefore the style system cannot understand when it needs to be repainted.
+    setShouldDoFullPaintInvalidationAfterLayout(true);
 }
 
 // --------------------------------
index 37e21d5..2da5eaa 100644 (file)
@@ -161,9 +161,6 @@ public:
     virtual void annotatedRegionsChanged() OVERRIDE { }
     virtual bool paintCustomOverhangArea(GraphicsContext*, const IntRect&, const IntRect&, const IntRect&) OVERRIDE { return false; }
     virtual String acceptLanguages() OVERRIDE;
-
-    virtual bool usesGpuRasterization() OVERRIDE { return false; }
-
 };
 
 class EmptyFrameLoaderClient FINAL : public FrameLoaderClient {
@@ -202,7 +199,7 @@ public:
     virtual void dispatchDidFinishDocumentLoad() OVERRIDE { }
     virtual void dispatchDidFinishLoad() OVERRIDE { }
     virtual void dispatchDidFirstVisuallyNonEmptyLayout() OVERRIDE { }
-    virtual void dispatchDidChangeBrandColor() OVERRIDE { };
+    virtual void dispatchDidChangeThemeColor() OVERRIDE { };
 
     virtual NavigationPolicy decidePolicyForNavigation(const ResourceRequest&, DocumentLoader*, NavigationPolicy) OVERRIDE;
 
index 8b6c22b..b6503ab 100644 (file)
@@ -83,9 +83,10 @@ static void appendMailtoPostFormDataToURL(KURL& url, const FormData& data, const
     url.setQuery(query.toString());
 }
 
-void FormSubmission::Attributes::parseAction(const Document& document, const String& action)
+void FormSubmission::Attributes::parseAction(const String& action)
 {
-    m_action = action.isEmpty() ? KURL() : document.completeURL(stripLeadingAndTrailingHTMLSpaces(action));
+    // m_action cannot be converted to KURL (bug https://crbug.com/388664)
+    m_action = stripLeadingAndTrailingHTMLSpaces(action);
 }
 
 AtomicString FormSubmission::Attributes::parseEncodingType(const String& type)
@@ -179,7 +180,7 @@ PassRefPtrWillBeRawPtr<FormSubmission> FormSubmission::create(HTMLFormElement* f
     if (submitButton) {
         AtomicString attributeValue;
         if (!(attributeValue = submitButton->fastGetAttribute(formactionAttr)).isNull())
-            copiedAttributes.parseAction(form->document(), attributeValue);
+            copiedAttributes.parseAction(attributeValue);
         if (!(attributeValue = submitButton->fastGetAttribute(formenctypeAttr)).isNull())
             copiedAttributes.updateEncodingType(attributeValue);
         if (!(attributeValue = submitButton->fastGetAttribute(formmethodAttr)).isNull())
@@ -195,7 +196,7 @@ PassRefPtrWillBeRawPtr<FormSubmission> FormSubmission::create(HTMLFormElement* f
     }
 
     Document& document = form->document();
-    KURL actionURL = copiedAttributes.action().isEmpty() ? document.url() : copiedAttributes.action();
+    KURL actionURL = document.completeURL(copiedAttributes.action().isEmpty() ? document.url().string() : copiedAttributes.action());
     bool isMailtoForm = actionURL.protocolIs("mailto");
     bool isMultiPartForm = false;
     AtomicString encodingType = copiedAttributes.encodingType();
index b57c732..956c2b0 100644 (file)
@@ -67,8 +67,8 @@ public:
         void updateMethodType(const String&);
         static String methodString(Method);
 
-        const KURL& action() const { return m_action; }
-        void parseAction(const Document&, const String&);
+        const String& action() const { return m_action; }
+        void parseAction(const String&);
 
         const AtomicString& target() const { return m_target; }
         void setTarget(const AtomicString& target) { m_target = target; }
@@ -87,7 +87,7 @@ public:
         Method m_method;
         bool m_isMultiPartForm;
 
-        KURL m_action;
+        String m_action;
         AtomicString m_target;
         AtomicString m_encodingType;
         String m_acceptCharset;
index 02af095..55098fc 100644 (file)
@@ -109,7 +109,7 @@ namespace WebCore {
         virtual void dispatchDidFinishDocumentLoad() = 0;
         virtual void dispatchDidFinishLoad() = 0;
         virtual void dispatchDidFirstVisuallyNonEmptyLayout() = 0;
-        virtual void dispatchDidChangeBrandColor() = 0;
+        virtual void dispatchDidChangeThemeColor() = 0;
 
         virtual NavigationPolicy decidePolicyForNavigation(const ResourceRequest&, DocumentLoader*, NavigationPolicy) = 0;
 
index 75e9737..5202917 100644 (file)
@@ -90,6 +90,17 @@ bool MixedContentChecker::canRunInsecureContentInternal(SecurityOrigin* security
     return allowed;
 }
 
+bool MixedContentChecker::canSubmitToInsecureForm(SecurityOrigin* securityOrigin, const KURL& url) const
+{
+    // For whatever reason, some folks handle forms via JavaScript, and submit to `javascript:void(0)`
+    // rather than calling `preventDefault()`. We special-case `javascript:` URLs here, as they don't
+    // introduce MixedContent for form submissions.
+    if (url.protocolIs("javascript"))
+        return true;
+
+    return canDisplayInsecureContentInternal(securityOrigin, url, MixedContentChecker::Submission);
+}
+
 void MixedContentChecker::logWarning(bool allowed, const KURL& target, const MixedContentType type) const
 {
     StringBuilder message;
index e749b67..8fd99e6 100644 (file)
@@ -49,10 +49,6 @@ public:
     {
         return canDisplayInsecureContentInternal(securityOrigin, url, MixedContentChecker::Display);
     }
-    bool canSubmitToInsecureForm(SecurityOrigin* securityOrigin, const KURL& url) const
-    {
-        return canDisplayInsecureContentInternal(securityOrigin, url, MixedContentChecker::Submission);
-    }
 
     bool canRunInsecureContent(SecurityOrigin* securityOrigin, const KURL& url) const
     {
@@ -62,6 +58,8 @@ public:
     {
         return canRunInsecureContentInternal(securityOrigin, url, MixedContentChecker::WebSocket);
     }
+
+    bool canSubmitToInsecureForm(SecurityOrigin*, const KURL&) const;
     static bool isMixedContent(SecurityOrigin*, const KURL&);
 
 private:
index b6605c9..96a246e 100644 (file)
@@ -238,8 +238,6 @@ public:
     virtual void willSetInputMethodState() { }
     virtual void didUpdateTextOfFocusedElementByNonUserInput() { }
 
-    virtual bool usesGpuRasterization() = 0;
-
 protected:
     virtual ~ChromeClient() { }
 };
index adfc0e5..cd8b65b 100644 (file)
@@ -50,14 +50,9 @@ ContextMenuController::~ContextMenuController()
 {
 }
 
-PassOwnPtrWillBeRawPtr<ContextMenuController> ContextMenuController::create(Page* page, ContextMenuClient* client)
+PassOwnPtr<ContextMenuController> ContextMenuController::create(Page* page, ContextMenuClient* client)
 {
-    return adoptPtrWillBeNoop(new ContextMenuController(page, client));
-}
-
-void ContextMenuController::trace(Visitor* visitor)
-{
-    visitor->trace(m_hitTestResult);
+    return adoptPtr(new ContextMenuController(page, client));
 }
 
 void ContextMenuController::clearContextMenu()
index 860ade9..025638e 100644 (file)
@@ -42,12 +42,12 @@ namespace WebCore {
     class Event;
     class Page;
 
-    class ContextMenuController : public NoBaseWillBeGarbageCollectedFinalized<ContextMenuController> {
-        WTF_MAKE_NONCOPYABLE(ContextMenuController); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
+    class ContextMenuController {
+        WTF_MAKE_NONCOPYABLE(ContextMenuController); WTF_MAKE_FAST_ALLOCATED;
     public:
-        static PassOwnPtrWillBeRawPtr<ContextMenuController> create(Page*, ContextMenuClient*);
         ~ContextMenuController();
-        void trace(Visitor*);
+
+        static PassOwnPtr<ContextMenuController> create(Page*, ContextMenuClient*);
 
         ContextMenu* contextMenu() const { return m_contextMenu.get(); }
         void clearContextMenu();
index 293359d..bad7363 100644 (file)
@@ -3538,14 +3538,19 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
             touchTarget = m_targetForTouchID.get(point.id());
         }
 
-        LocalFrame* targetFrame;
-        bool knownTarget;
+        LocalFrame* targetFrame = 0;
+        bool knownTarget = false;
         if (touchTarget) {
             Document& doc = touchTarget->toNode()->document();
-            ASSERT(&doc == m_touchSequenceDocument.get());
-            targetFrame = doc.frame();
-            knownTarget = true;
-        } else {
+            // If the target node has moved to a new document while it was being touched,
+            // we can't send events to the new document because that could leak nodes
+            // from one document to another. See http://crbug.com/394339.
+            if (&doc == m_touchSequenceDocument.get()) {
+                targetFrame = doc.frame();
+                knownTarget = true;
+            }
+        }
+        if (!knownTarget) {
             // If we don't have a target registered for the point it means we've
             // missed our opportunity to do a hit test for it (due to some
             // optimization that prevented blink from ever seeing the
@@ -3563,7 +3568,6 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
             // is on-heap.
             touchTarget = m_touchSequenceDocument.get();
             targetFrame = m_touchSequenceDocument->frame();
-            knownTarget = false;
         }
         ASSERT(targetFrame);
 
index f4d2e29..4ad317d 100644 (file)
@@ -29,7 +29,6 @@ namespace WebCore {
 class Scrollbar;
 
 class MouseEventWithHitTestResults {
-    STACK_ALLOCATED();
 public:
     MouseEventWithHitTestResults(const PlatformMouseEvent&, const HitTestResult&);
 
index 1a4b76b..b380701 100644 (file)
@@ -596,7 +596,6 @@ void Page::trace(Visitor* visitor)
 {
     visitor->trace(m_dragCaretController);
     visitor->trace(m_dragController);
-    visitor->trace(m_contextMenuController);
     visitor->trace(m_pointerLockController);
     visitor->trace(m_undoStack);
     visitor->trace(m_validationMessageClient);
index 0f1d214..6408c7f 100644 (file)
@@ -253,7 +253,7 @@ private:
     const OwnPtrWillBeMember<DragCaretController> m_dragCaretController;
     const OwnPtrWillBeMember<DragController> m_dragController;
     const OwnPtr<FocusController> m_focusController;
-    const OwnPtrWillBeMember<ContextMenuController> m_contextMenuController;
+    const OwnPtr<ContextMenuController> m_contextMenuController;
     const OwnPtr<InspectorController> m_inspectorController;
     const OwnPtrWillBeMember<PointerLockController> m_pointerLockController;
     OwnPtr<ScrollingCoordinator> m_scrollingCoordinator;
index d2770ec..60ef749 100644 (file)
@@ -114,17 +114,6 @@ HitTestResult& HitTestResult::operator=(const HitTestResult& other)
     return *this;
 }
 
-void HitTestResult::trace(Visitor* visitor)
-{
-    visitor->trace(m_innerNode);
-    visitor->trace(m_innerPossiblyPseudoNode);
-    visitor->trace(m_innerNonSharedNode);
-    visitor->trace(m_innerURLElement);
-#if ENABLE(OILPAN)
-    visitor->trace(m_rectBasedTestResult);
-#endif
-}
-
 RenderObject* HitTestResult::renderer() const
 {
     if (!m_innerNode)
@@ -286,6 +275,16 @@ IntRect HitTestResult::imageRect() const
 
 KURL HitTestResult::absoluteImageURL() const
 {
+    return absoluteImageURLInternal(false);
+}
+
+KURL HitTestResult::absoluteImageURLIncludingCanvasDataURL() const
+{
+    return absoluteImageURLInternal(true);
+}
+
+KURL HitTestResult::absoluteImageURLInternal(bool allowCanvas) const
+{
     if (!m_innerNonSharedNode)
         return KURL();
 
@@ -294,7 +293,7 @@ KURL HitTestResult::absoluteImageURL() const
         return KURL();
 
     AtomicString urlString;
-    if (isHTMLCanvasElement(*m_innerNonSharedNode)
+    if ((allowCanvas && isHTMLCanvasElement(*m_innerNonSharedNode))
         || isHTMLEmbedElement(*m_innerNonSharedNode)
         || isHTMLImageElement(*m_innerNonSharedNode)
         || isHTMLInputElement(*m_innerNonSharedNode)
index 7be5962..12984ca 100644 (file)
@@ -46,7 +46,6 @@ class RenderObject;
 class Scrollbar;
 
 class HitTestResult {
-    DISALLOW_ALLOCATION();
 public:
     typedef WillBeHeapListHashSet<RefPtrWillBeMember<Node> > NodeSet;
 
@@ -58,7 +57,6 @@ public:
     HitTestResult(const HitTestResult&);
     ~HitTestResult();
     HitTestResult& operator=(const HitTestResult&);
-    void trace(Visitor*);
 
     Node* innerNode() const { return m_innerNode.get(); }
     Node* innerPossiblyPseudoNode() const { return m_innerPossiblyPseudoNode.get(); }
@@ -105,6 +103,9 @@ public:
     Image* image() const;
     IntRect imageRect() const;
     KURL absoluteImageURL() const;
+    // This variant of absoluteImageURL will also convert <canvas> elements
+    // to huge image data URLs (very expensive).
+    KURL absoluteImageURLIncludingCanvasDataURL() const;
     KURL absoluteMediaURL() const;
     KURL absoluteLinkURL() const;
     String textContent() const;
@@ -127,23 +128,24 @@ public:
     Node* targetNode() const;
 
 private:
+    KURL absoluteImageURLInternal(bool allowCanvas) const;
     NodeSet& mutableRectBasedTestResult(); // See above.
     HTMLMediaElement* mediaElement() const;
 
     HitTestLocation m_hitTestLocation;
 
-    RefPtrWillBeMember<Node> m_innerNode;
-    RefPtrWillBeMember<Node> m_innerPossiblyPseudoNode;
-    RefPtrWillBeMember<Node> m_innerNonSharedNode;
+    RefPtrWillBePersistent<Node> m_innerNode;
+    RefPtrWillBePersistent<Node> m_innerPossiblyPseudoNode;
+    RefPtrWillBePersistent<Node> m_innerNonSharedNode;
     LayoutPoint m_pointInInnerNodeFrame; // The hit-tested point in innerNode frame coordinates.
     LayoutPoint m_localPoint; // A point in the local coordinate space of m_innerNonSharedNode's renderer. Allows us to efficiently
                               // determine where inside the renderer we hit on subsequent operations.
-    RefPtrWillBeMember<Element> m_innerURLElement;
+    RefPtrWillBePersistent<Element> m_innerURLElement;
     RefPtr<Scrollbar> m_scrollbar;
     bool m_isOverWidget; // Returns true if we are over a widget (and not in the border/padding area of a RenderWidget for example).
     bool m_isFirstLetter;
 
-    mutable OwnPtrWillBeMember<NodeSet> m_rectBasedTestResult;
+    mutable OwnPtrWillBePersistent<NodeSet> m_rectBasedTestResult;
 };
 
 } // namespace WebCore
index 20195b3..b3384b2 100644 (file)
@@ -1142,12 +1142,17 @@ void InlineFlowBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset,
         return;
 
     PaintPhase paintPhase = paintInfo.phase == PaintPhaseChildOutlines ? PaintPhaseOutline : paintInfo.phase;
-    PaintInfo childInfo(paintInfo);
-    childInfo.phase = paintPhase;
-    childInfo.updatePaintingRootForChildren(&renderer());
 
     // Paint our children.
     if (paintPhase != PaintPhaseSelfOutline) {
+        PaintInfo childInfo(paintInfo);
+        childInfo.phase = paintPhase;
+
+        if (childInfo.paintingRoot && childInfo.paintingRoot->isDescendantOf(&renderer()))
+            childInfo.paintingRoot = 0;
+        else
+            childInfo.updatePaintingRootForChildren(&renderer());
+
         for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) {
             if (curr->renderer().isText() || !curr->boxModelObject()->hasSelfPaintingLayer())
                 curr->paint(childInfo, paintOffset, lineTop, lineBottom);
index d926fee..e7cf72c 100644 (file)
@@ -331,9 +331,6 @@ void RenderBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldSty
 {
     RenderBox::styleDidChange(diff, oldStyle);
 
-    if (isFloatingOrOutOfFlowPositioned() && oldStyle && !oldStyle->isFloating() && !oldStyle->hasOutOfFlowPosition() && parent() && parent()->isRenderBlockFlow())
-        toRenderBlock(parent())->removeAnonymousWrappersIfRequired();
-
     RenderStyle* newStyle = style();
 
     if (!isAnonymousBlock()) {
@@ -1088,25 +1085,6 @@ static bool canMergeContiguousAnonymousBlocks(RenderObject* oldChild, RenderObje
            && prev->isAnonymousColumnSpanBlock() == next->isAnonymousColumnSpanBlock();
 }
 
-void RenderBlock::removeAnonymousWrappersIfRequired()
-{
-    ASSERT(isRenderBlockFlow());
-    Vector<RenderBox*, 16> blocksToRemove;
-    for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
-        // There are still block children in the container, so any anonymous wrappers are still needed.
-        if (!child->isAnonymousBlock() && !child->isFloatingOrOutOfFlowPositioned())
-            return;
-        // We can't remove anonymous wrappers if they contain continuations as this means there are block children present.
-        if (child->isRenderBlock() && toRenderBlock(child)->continuation())
-            return;
-        if (child->isAnonymousBlock())
-            blocksToRemove.append(child);
-    }
-
-    for (size_t i = 0; i < blocksToRemove.size(); i++)
-        collapseAnonymousBlockChild(this, toRenderBlock(blocksToRemove[i]));
-}
-
 void RenderBlock::collapseAnonymousBlockChild(RenderBlock* parent, RenderBlock* child)
 {
     // It's possible that this block's destruction may have been triggered by the
@@ -1219,7 +1197,7 @@ void RenderBlock::removeChild(RenderObject* oldChild)
         // we need to remove ourself and fix the continuation chain.
         if (!beingDestroyed() && isAnonymousBlockContinuation() && !oldChild->isListMarker()) {
             RenderObject* containingBlockIgnoringAnonymous = containingBlock();
-            while (containingBlockIgnoringAnonymous && containingBlockIgnoringAnonymous->isAnonymousBlock())
+            while (containingBlockIgnoringAnonymous && containingBlockIgnoringAnonymous->isAnonymous())
                 containingBlockIgnoringAnonymous = containingBlockIgnoringAnonymous->containingBlock();
             for (RenderObject* curr = this; curr; curr = curr->previousInPreOrder(containingBlockIgnoringAnonymous)) {
                 if (curr->virtualContinuation() != this)
@@ -1512,6 +1490,12 @@ void RenderBlock::addVisualOverflowFromTheme()
     addVisualOverflow(inflatedRect);
 }
 
+bool RenderBlock::createsBlockFormattingContext() const
+{
+    return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() || hasOverflowClip() || isFlexItemIncludingDeprecated()
+        || style()->specifiesColumns() || isRenderFlowThread() || isTableCell() || isTableCaption() || isFieldset() || isWritingModeRoot() || isDocumentElement() || style()->columnSpan();
+}
+
 void RenderBlock::updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, RenderBox* child)
 {
     // FIXME: Technically percentage height objects only need a relayout if their percentage isn't going to be turned into
@@ -2759,6 +2743,12 @@ void RenderBlock::markLinesDirtyInBlockRange(LayoutUnit logicalTop, LayoutUnit l
     }
 }
 
+bool RenderBlock::avoidsFloats() const
+{
+    // Floats can't intrude into our box if we have a non-auto column count or width.
+    return RenderBox::avoidsFloats() || !style()->hasAutoColumnCount() || !style()->hasAutoColumnWidth();
+}
+
 bool RenderBlock::isPointInOverflowControl(HitTestResult& result, const LayoutPoint& locationInContainer, const LayoutPoint& accumulatedOffset)
 {
     if (!scrollsOverflow())
index 3f4bc2c..c3ce2fb 100644 (file)
@@ -326,7 +326,6 @@ protected:
 
     void setDesiredColumnCountAndWidth(int, LayoutUnit);
 
-    bool avoidsOrIgnoresFloats() { return isFloatingOrOutOfFlowPositioned() || avoidsFloats(); }
 public:
     virtual void computeOverflow(LayoutUnit oldClientAfterEdge, bool = false);
 protected:
@@ -368,8 +367,6 @@ private:
 
     void addChildIgnoringAnonymousColumnBlocks(RenderObject* newChild, RenderObject* beforeChild = 0);
 
-    void removeAnonymousWrappersIfRequired();
-
     virtual bool isSelfCollapsingBlock() const OVERRIDE;
 
     void insertIntoTrackedRendererMaps(RenderBox* descendant, TrackedDescendantsMap*&, TrackedContainerMap*&);
@@ -390,6 +387,8 @@ private:
 
     bool hasCaret() const;
 
+    virtual bool avoidsFloats() const OVERRIDE;
+
     bool hitTestColumns(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
     bool hitTestContents(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
     // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow
@@ -469,6 +468,8 @@ protected:
     enum PageBoundaryRule { ExcludePageBoundary, IncludePageBoundary };
     LayoutUnit nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundaryRule = ExcludePageBoundary) const;
 
+    bool createsBlockFormattingContext() const;
+
 public:
     LayoutUnit pageLogicalTopForOffset(LayoutUnit offset) const;
     LayoutUnit pageLogicalHeightForOffset(LayoutUnit offset) const;
index 3a20f5a..0a731d4 100644 (file)
@@ -764,7 +764,7 @@ void RenderBlockFlow::rebuildFloatsFromIntruding()
     }
 
     // Inline blocks are covered by the isReplaced() check in the avoidFloats method.
-    if (avoidsOrIgnoresFloats() || isRenderView()) {
+    if (avoidsFloats() || isDocumentElement() || isRenderView() || isFloatingOrOutOfFlowPositioned() || isTableCell()) {
         if (m_floatingObjects) {
             m_floatingObjects->clear();
         }
@@ -794,7 +794,7 @@ void RenderBlockFlow::rebuildFloatsFromIntruding()
     RenderBlockFlow* parentBlockFlow = toRenderBlockFlow(parent());
     bool parentHasFloats = false;
     RenderObject* prev = previousSibling();
-    while (prev && (!prev->isBox() || !prev->isRenderBlock() || toRenderBlock(prev)->avoidsOrIgnoresFloats())) {
+    while (prev && (!prev->isBox() || !prev->isRenderBlock() || toRenderBlock(prev)->avoidsFloats() || toRenderBlock(prev)->createsBlockFormattingContext())) {
         if (prev->isFloating())
             parentHasFloats = true;
         prev = prev->previousSibling();
@@ -1726,7 +1726,7 @@ void RenderBlockFlow::markSiblingsWithFloatsForLayout(RenderBox* floatToRemove)
     FloatingObjectSetIterator end = floatingObjectSet.end();
 
     for (RenderObject* next = nextSibling(); next; next = next->nextSibling()) {
-        if (!next->isRenderBlockFlow() || avoidsOrIgnoresFloats())
+        if (!next->isRenderBlockFlow() || next->isFloatingOrOutOfFlowPositioned() || toRenderBlock(next)->avoidsFloats())
             continue;
 
         RenderBlockFlow* nextBlock = toRenderBlockFlow(next);
@@ -1818,7 +1818,7 @@ void RenderBlockFlow::createFloatingObjects()
 void RenderBlockFlow::styleWillChange(StyleDifference diff, const RenderStyle& newStyle)
 {
     RenderStyle* oldStyle = style();
-    s_canPropagateFloatIntoSibling = oldStyle ? !createsBlockFormattingContext() : false;
+    s_canPropagateFloatIntoSibling = oldStyle ? !isFloatingOrOutOfFlowPositioned() && !avoidsFloats() : false;
     if (oldStyle && parent() && diff.needsFullLayout() && oldStyle->position() != newStyle.position()
         && containsFloats() && !isFloating() && !isOutOfFlowPositioned() && newStyle.hasOutOfFlowPosition())
             markAllDescendantsWithFloatsForLayout();
@@ -1834,7 +1834,7 @@ void RenderBlockFlow::styleDidChange(StyleDifference diff, const RenderStyle* ol
     // blocks, then we need to find the top most parent containing that overhanging float and
     // then mark its descendants with floats for layout and clear all floats from its next
     // sibling blocks that exist in our floating objects list. See bug 56299 and 62875.
-    bool canPropagateFloatIntoSibling = !avoidsOrIgnoresFloats();
+    bool canPropagateFloatIntoSibling = !isFloatingOrOutOfFlowPositioned() && !avoidsFloats();
     if (diff.needsFullLayout() && s_canPropagateFloatIntoSibling && !canPropagateFloatIntoSibling && hasOverhangingFloats()) {
         RenderBlockFlow* parentBlockFlow = this;
         const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
index 84b19d2..1804c3b 100644 (file)
@@ -4080,16 +4080,7 @@ bool RenderBox::shrinkToAvoidFloats() const
 
 bool RenderBox::avoidsFloats() const
 {
-    // CSS2.1: "The border box of a table, a block-level replaced element, or an element in the normal flow that establishes a new block formatting
-    // context .. must not overlap the margin box of any floats in the same block formatting context."
-    // FIXME: The inclusion of horizontal rule and legend elements here isn't covered by any spec.
-    return isReplaced() || isHR() || isLegend() || isTable() || (!isFloatingOrOutOfFlowPositioned() && createsBlockFormattingContext());
-}
-
-bool RenderBox::createsBlockFormattingContext() const
-{
-    return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() || hasOverflowClip() || isFlexItemIncludingDeprecated()
-        || style()->specifiesColumns() || isRenderFlowThread() || isTableCell() || isTableCaption() || isFieldset() || isWritingModeRoot() || isDocumentElement() || style()->columnSpan();
+    return isReplaced() || hasOverflowClip() || isHR() || isLegend() || isWritingModeRoot() || isFlexItemIncludingDeprecated();
 }
 
 void RenderBox::markForPaginationRelayoutIfNeeded(SubtreeLayoutScope& layoutScope)
@@ -4144,11 +4135,18 @@ void RenderBox::addVisualEffectOverflow()
 
     if (style()->hasOutline()) {
         LayoutUnit outlineSize = style()->outlineSize();
-
-        overflowMinX = min(overflowMinX, borderBox.x() - outlineSize);
-        overflowMaxX = max(overflowMaxX, borderBox.maxX() + outlineSize);
-        overflowMinY = min(overflowMinY, borderBox.y() - outlineSize);
-        overflowMaxY = max(overflowMaxY, borderBox.maxY() + outlineSize);
+        LayoutRect outlineBox;
+        if (style()->outlineStyleIsAuto()) {
+            Vector<IntRect> focusRingRects;
+            addFocusRingRects(focusRingRects, LayoutPoint(), this);
+            outlineBox = unionRect(focusRingRects);
+        } else {
+            outlineBox = borderBox;
+        }
+        overflowMinX = min(overflowMinX, outlineBox.x() - outlineSize);
+        overflowMaxX = max(overflowMaxX, outlineBox.maxX() + outlineSize);
+        overflowMinY = min(overflowMinY, outlineBox.y() - outlineSize);
+        overflowMaxY = max(overflowMaxY, outlineBox.maxY() + outlineSize);
     }
 
     // Add in the final overflow with shadows, outsets and outline combined.
index dc2bc92..c9d967d 100644 (file)
@@ -664,8 +664,6 @@ protected:
 
     void updateIntrinsicContentLogicalHeight(LayoutUnit intrinsicContentLogicalHeight) const { m_intrinsicContentLogicalHeight = intrinsicContentLogicalHeight; }
 
-    bool createsBlockFormattingContext() const;
-
 private:
     void updateShapeOutsideInfoAfterStyleChange(const RenderStyle&, const RenderStyle* oldStyle);
     void updateGridPositionAfterStyleChange(const RenderStyle*);
index ce8a356..0ebc486 100644 (file)
@@ -42,6 +42,7 @@ private:
     virtual RenderObject* layoutSpecialExcludedChild(bool relayoutChildren, SubtreeLayoutScope&) OVERRIDE;
 
     virtual void computePreferredLogicalWidths() OVERRIDE;
+    virtual bool avoidsFloats() const OVERRIDE { return true; }
 
     virtual void paintBoxDecorations(PaintInfo&, const LayoutPoint&) OVERRIDE;
     virtual void paintMask(PaintInfo&, const LayoutPoint&) OVERRIDE;
index 9ce9810..e767450 100644 (file)
@@ -170,7 +170,7 @@ void RenderFullScreen::unwrapRenderer()
     if (placeholder())
         placeholder()->remove();
     remove();
-    FullscreenElementStack::from(document()).setFullScreenRenderer(0);
+    destroy();
 }
 
 void RenderFullScreen::setPlaceholder(RenderBlock* placeholder)
index 80664b5..79bca9c 100644 (file)
@@ -147,16 +147,29 @@ static RenderObject* inFlowPositionedInlineAncestor(RenderObject* p)
 static void updateStyleOfAnonymousBlockContinuations(RenderObject* block, const RenderStyle* newStyle, const RenderStyle* oldStyle)
 {
     for (;block && block->isAnonymousBlock(); block = block->nextSibling()) {
-        if (!toRenderBlock(block)->isAnonymousBlockContinuation() || block->style()->position() == newStyle->position())
+        if (!toRenderBlock(block)->isAnonymousBlockContinuation())
             continue;
-        // If we are no longer in-flow positioned but our descendant block(s) still have an in-flow positioned ancestor then
-        // their containing anonymous block should keep its in-flow positioning.
+
         RenderInline* cont = toRenderBlock(block)->inlineElementContinuation();
-        if (oldStyle->hasInFlowPosition() && inFlowPositionedInlineAncestor(cont))
-            continue;
         RefPtr<RenderStyle> blockStyle = RenderStyle::createAnonymousStyleWithDisplay(block->style(), BLOCK);
-        blockStyle->setPosition(newStyle->position());
-        block->setStyle(blockStyle);
+
+        if (!block->style()->isOutlineEquivalent(newStyle)) {
+            blockStyle->setOutlineWidth(newStyle->outlineWidth());
+            blockStyle->setOutlineStyle(newStyle->outlineStyle());
+            blockStyle->setOutlineOffset(newStyle->outlineOffset());
+            blockStyle->setOutlineColor(block->resolveColor(newStyle, CSSPropertyOutlineColor));
+            blockStyle->setOutlineStyleIsAuto(newStyle->outlineStyleIsAuto());
+            block->setStyle(blockStyle);
+        }
+
+        if (block->style()->position() != newStyle->position()) {
+            // If we are no longer in-flow positioned but our descendant block(s) still have an in-flow positioned ancestor then
+            // their containing anonymous block should keep its in-flow positioning.
+            if (oldStyle->hasInFlowPosition() && inFlowPositionedInlineAncestor(cont))
+                continue;
+            blockStyle->setPosition(newStyle->position());
+            block->setStyle(blockStyle);
+        }
     }
 }
 
@@ -181,12 +194,13 @@ void RenderInline::styleDidChange(StyleDifference diff, const RenderStyle* oldSt
 
     // If an inline's in-flow positioning has changed then any descendant blocks will need to change their in-flow positioning accordingly.
     // Do this by updating the position of the descendant blocks' containing anonymous blocks - there may be more than one.
-    if (continuation && oldStyle && newStyle->position() != oldStyle->position()
-        && (newStyle->hasInFlowPosition() || oldStyle->hasInFlowPosition())) {
+    if (continuation && oldStyle
+        && (!newStyle->isOutlineEquivalent(oldStyle)
+            || (newStyle->position() != oldStyle->position() && (newStyle->hasInFlowPosition() || oldStyle->hasInFlowPosition())))) {
         // If any descendant blocks exist then they will be in the next anonymous block and its siblings.
         RenderObject* block = containingBlock()->nextSibling();
-        ASSERT(block && block->isAnonymousBlock());
-        updateStyleOfAnonymousBlockContinuations(block, newStyle, oldStyle);
+        if (block && block->isAnonymousBlock())
+            updateStyleOfAnonymousBlockContinuations(block, newStyle, oldStyle);
     }
 
     if (!m_alwaysCreateLineBoxes) {
index 7a9aa24..6b7ba1c 100644 (file)
@@ -1728,7 +1728,8 @@ void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect,
     OverlapTestRequestMap overlapTestRequests;
 
     LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot, &overlapTestRequests);
-    paintLayer(context, paintingInfo, paintFlags);
+    if (shouldPaintLayerInSoftwareMode(context, paintingInfo, paintFlags))
+        paintLayer(context, paintingInfo, paintFlags);
 
     OverlapTestRequestMap::iterator end = overlapTestRequests.end();
     for (OverlapTestRequestMap::iterator it = overlapTestRequests.begin(); it != end; ++it)
@@ -1815,11 +1816,6 @@ static void performOverlapTests(OverlapTestRequestMap& overlapTestRequests, cons
     overlapTestRequests.removeAll(overlappedRequestClients);
 }
 
-static bool shouldDoSoftwarePaint(const RenderLayer* layer, bool paintingReflection)
-{
-    return paintingReflection && !layer->has3DTransform();
-}
-
 static inline bool shouldSuppressPaintingLayer(RenderLayer* layer)
 {
     // Avoid painting descendants of the root layer when stylesheets haven't loaded. This eliminates FOUC.
@@ -1846,17 +1842,9 @@ void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo&
     // https://code.google.com/p/chromium/issues/detail?id=343772
     DisableCompositingQueryAsserts disabler;
 
-    if (compositingState() != NotComposited && compositingState() != PaintsIntoGroupedBacking) {
-        // The updatingControlTints() painting pass goes through compositing layers,
-        // but we need to ensure that we don't cache clip rects computed with the wrong root in this case.
+    if (compositingState() != NotComposited) {
         if (context->updatingControlTints() || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)) {
             paintFlags |= PaintLayerTemporaryClipRects;
-        } else if (!compositedLayerMapping()->paintsIntoCompositedAncestor()
-            && !shouldDoSoftwarePaint(this, paintFlags & PaintLayerPaintingReflection)
-            && !paintForFixedRootBackground(this, paintFlags)) {
-            // If this RenderLayer should paint into its own backing, that will be done via CompositedLayerMapping::paintContents()
-            // and CompositedLayerMapping::doPaintTask().
-            return;
         }
     } else if (viewportConstrainedNotCompositedReason() == NotCompositedForBoundsOutOfView) {
         // Don't paint out-of-view viewport constrained layers (when doing prepainting) because they will never be visible
@@ -2186,6 +2174,18 @@ void RenderLayer::paintLayerByApplyingTransform(GraphicsContext* context, const
     paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags);
 }
 
+bool RenderLayer::shouldPaintLayerInSoftwareMode(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
+{
+    DisableCompositingQueryAsserts disabler;
+
+    return compositingState() == NotComposited
+        || compositingState() == HasOwnBackingButPaintsIntoAncestor
+        || context->updatingControlTints()
+        || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)
+        || ((paintFlags & PaintLayerPaintingReflection) && !has3DTransform())
+        || paintForFixedRootBackground(this, paintFlags);
+}
+
 void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
 {
     if (!hasSelfPaintingLayerDescendant())
@@ -2198,9 +2198,9 @@ void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* conte
     RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit);
     while (RenderLayerStackingNode* child = iterator.next()) {
         RenderLayer* childLayer = child->layer();
-
-        // Squashed RenderLayers should not paint into their ancestor.
-        if (childLayer->compositingState() == PaintsIntoGroupedBacking)
+        // If this RenderLayer should paint into its own backing or a grouped backing, that will be done via CompositedLayerMapping::paintContents()
+        // and CompositedLayerMapping::doPaintTask().
+        if (!childLayer->shouldPaintLayerInSoftwareMode(context, paintingInfo, paintFlags))
             continue;
 
         if (!childLayer->isPaginated())
index 804bab9..6e43a0b 100644 (file)
@@ -526,6 +526,11 @@ private:
 
     void paintLayerContentsAndReflection(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
     void paintLayerByApplyingTransform(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, const LayoutPoint& translationOffset = LayoutPoint());
+
+    // Returns whether this layer should be painted during sofware painting (i.e., not via calls from CompositedLayerMapping to draw into composited
+    // layers).
+    bool shouldPaintLayerInSoftwareMode(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags paintFlags);
+
     void paintChildren(unsigned childrenToVisit, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
     void paintPaginatedChildLayer(RenderLayer* childLayer, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
     void paintChildLayerIntoColumns(RenderLayer* childLayer, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, const Vector<RenderLayer*>& columnLayers, size_t columnIndex);
index 17c0cfc..54d3d2d 100644 (file)
@@ -269,64 +269,70 @@ static RenderObject* firstNonMarkerChild(RenderObject* parent)
     return result;
 }
 
-void RenderListItem::updateMarkerLocation()
+void RenderListItem::updateMarkerLocationAndInvalidateWidth()
 {
-    // Sanity check the location of our marker.
-    if (m_marker) {
-        RenderObject* markerParent = m_marker->parent();
-        RenderObject* lineBoxParent = getParentOfFirstLineBox(this, m_marker);
-        if (!lineBoxParent) {
-            // If the marker is currently contained inside an anonymous box,
-            // then we are the only item in that anonymous box (since no line box
-            // parent was found).  It's ok to just leave the marker where it is
-            // in this case.
-            if (markerParent && markerParent->isAnonymousBlock())
-                lineBoxParent = markerParent;
-            else
-                lineBoxParent = this;
-        }
+    ASSERT(m_marker);
+
+    // FIXME: We should not modify the structure of the render tree
+    // during layout. crbug.com/370461
+    DeprecatedDisableModifyRenderTreeStructureAsserts disabler;
+    // Removing and adding the marker can trigger repainting in
+    // containers other than ourselves, so we need to disable LayoutState.
+    ForceHorriblySlowRectMapping slowRectMapping(*this);
+    if (updateMarkerLocation()) {
+        // If the marker is inside we need to redo the preferred width calculations
+        // as the size of the item now includes the size of the list marker.
+        if (m_marker->isInside())
+            containingBlock()->updateLogicalWidth();
+    }
+}
 
-        if (markerParent != lineBoxParent || m_marker->preferredLogicalWidthsDirty()) {
-            // FIXME: We should not modify the structure of the render tree
-            // during layout. crbug.com/370461
-            DeprecatedDisableModifyRenderTreeStructureAsserts disabler;
-
-            // Removing and adding the marker can trigger repainting in
-            // containers other than ourselves, so we need to disable LayoutState.
-            ForceHorriblySlowRectMapping slowRectMapping(*this);
-            updateFirstLetter();
-            m_marker->remove();
-            if (markerParent)
-                markerParent->dirtyLinesFromChangedChild(m_marker);
-            if (!lineBoxParent)
-                lineBoxParent = this;
-            lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent));
-            m_marker->updateMarginsAndContent();
-            // If markerParent is an anonymous block that has lost all its children, destroy it.
-            if (markerParent && markerParent->isAnonymousBlock() && !toRenderBlock(markerParent)->firstChild() && !toRenderBlock(markerParent)->continuation())
-                markerParent->destroy();
-
-            // If the marker is inside we need to redo the preferred width calculations
-            // as the size of the item now includes the size of the list marker.
-            if (m_marker->isInside())
-                containingBlock()->updateLogicalWidth();
-        }
+bool RenderListItem::updateMarkerLocation()
+{
+    ASSERT(m_marker);
+    RenderObject* markerParent = m_marker->parent();
+    RenderObject* lineBoxParent = getParentOfFirstLineBox(this, m_marker);
+    if (!lineBoxParent) {
+        // If the marker is currently contained inside an anonymous box, then we
+        // are the only item in that anonymous box (since no line box parent was
+        // found). It's ok to just leave the marker where it is in this case.
+        if (markerParent && markerParent->isAnonymousBlock())
+            lineBoxParent = markerParent;
+        else
+            lineBoxParent = this;
+    }
+
+    if (markerParent != lineBoxParent) {
+        updateFirstLetter();
+        m_marker->remove();
+        // FIXME(crbug.com/391009): Investigate whether this call is needed.
+        if (markerParent)
+            markerParent->dirtyLinesFromChangedChild(m_marker);
+        lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent));
+        m_marker->updateMarginsAndContent();
+        // If markerParent is an anonymous block with no children, destroy it.
+        if (markerParent && markerParent->isAnonymousBlock() && !toRenderBlock(markerParent)->firstChild() && !toRenderBlock(markerParent)->continuation())
+            markerParent->destroy();
+        return true;
     }
+
+    return false;
 }
 
 void RenderListItem::layout()
 {
     ASSERT(needsLayout());
 
-    // The marker must be autosized before calling updateMarkerLocation.
-    // It cannot be done in the parent's beginLayout because it is not yet in the render tree.
     if (m_marker) {
-        FastTextAutosizer* textAutosizer = document().fastTextAutosizer();
-        if (textAutosizer)
+        // The marker must be autosized before calling
+        // updateMarkerLocationAndInvalidateWidth. It cannot be done in the
+        // parent's beginLayout because it is not yet in the render tree.
+        if (FastTextAutosizer* textAutosizer = document().fastTextAutosizer())
             textAutosizer->inflateListItem(this, m_marker);
+
+        updateMarkerLocationAndInvalidateWidth();
     }
 
-    updateMarkerLocation();
     RenderBlockFlow::layout();
 }
 
@@ -477,6 +483,13 @@ void RenderListItem::clearExplicitValue()
     explicitValueChanged();
 }
 
+void RenderListItem::setNotInList(bool notInList)
+{
+    m_notInList = notInList;
+    if (m_marker)
+        updateMarkerLocation();
+}
+
 static RenderListItem* previousOrNextItem(bool isListReversed, Node* list, RenderListItem* item)
 {
     return isListReversed ? previousListItem(list, item) : nextListItem(list, item);
index 3d6edc5..ca46d46 100644 (file)
@@ -42,13 +42,12 @@ public:
     void setExplicitValue(int value);
     void clearExplicitValue();
 
-    void setNotInList(bool notInList) { m_notInList = notInList; }
+    void setNotInList(bool);
     bool notInList() const { return m_notInList; }
 
     const String& markerText() const;
 
     void updateListMarkerNumbers();
-    void updateMarkerLocation();
 
     static void updateItemValuesForOrderedList(const HTMLOListElement*);
     static unsigned itemCountForOrderedList(const HTMLOListElement*);
@@ -69,6 +68,10 @@ private:
 
     virtual void layout() OVERRIDE;
 
+    // Returns true if we re-attached and updated the location of the marker.
+    bool updateMarkerLocation();
+    void updateMarkerLocationAndInvalidateWidth();
+
     void positionListMarker();
 
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
index 90af71b..ccabfcd 100644 (file)
@@ -2148,7 +2148,9 @@ void RenderObject::setStyle(PassRefPtr<RenderStyle> style)
             container->setNeedsOverflowRecalcAfterStyleChange();
     }
 
-    if (updatedDiff.needsRepaint()) {
+    if (updatedDiff.needsRepaintLayer()) {
+        toRenderLayerModelObject(this)->layer()->repainter().repaintIncludingNonCompositingDescendants();
+    } else if (updatedDiff.needsRepaint()) {
         // Invalidate paints with the new style, e.g., for example if we go from not having
         // an outline to having an outline.
         if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && needsLayout())
index c0a4726..811c286 100644 (file)
@@ -277,6 +277,8 @@ private:
 
     virtual bool isTable() const OVERRIDE { return true; }
 
+    virtual bool avoidsFloats() const OVERRIDE { return true; }
+
     virtual void paint(PaintInfo&, const LayoutPoint&) OVERRIDE;
     virtual void paintObject(PaintInfo&, const LayoutPoint&) OVERRIDE;
     virtual void paintBoxDecorations(PaintInfo&, const LayoutPoint&) OVERRIDE;
index 5d35300..925084c 100644 (file)
@@ -390,6 +390,9 @@ bool RenderLayerCompositor::allocateOrClearCompositedLayerMapping(RenderLayer* l
         ASSERT(!layer->hasCompositedLayerMapping());
         setCompositingModeEnabled(true);
 
+        // If we need to repaint, do so before allocating the compositedLayerMapping and clearing out the groupedMapping.
+        repaintOnCompositingChange(layer);
+
         // If this layer was previously squashed, we need to remove its reference to a groupedMapping right away, so
         // that computing repaint rects will know the layer's correct compositingState.
         // FIXME: do we need to also remove the layer from it's location in the squashing list of its groupedMapping?
@@ -398,8 +401,6 @@ bool RenderLayerCompositor::allocateOrClearCompositedLayerMapping(RenderLayer* l
         layer->setLostGroupedMapping(false);
         layer->setGroupedMapping(0);
 
-        // If we need to repaint, do so before allocating the compositedLayerMapping
-        repaintOnCompositingChange(layer);
         layer->ensureCompositedLayerMapping();
         compositedLayerMappingChanged = true;
 
index 2fc4fa2..fba56c6 100644 (file)
@@ -364,7 +364,7 @@ inline void BreakingContext::handleFloat()
     // 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 (m_floatsFitOnLine && m_width.fitsOnLine(m_block->logicalWidthForFloat(floatingObject).toFloat())) {
+    if (m_floatsFitOnLine && m_width.fitsOnLine(m_block->logicalWidthForFloat(floatingObject).toFloat(), ExcludeWhitespace)) {
         m_block->positionNewFloatOnLine(floatingObject, m_lastFloatFromPreviousLine, m_lineInfo, m_width);
         if (m_lineBreak.object() == m_current.object()) {
             ASSERT(!m_lineBreak.offset());
@@ -646,15 +646,19 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool
             wordMeasurement.endOffset = m_current.offset();
             wordMeasurement.startOffset = lastSpace;
 
-            float additionalTmpW;
+            float additionalTempWidth;
             if (wordTrailingSpaceWidth && c == ' ')
-                additionalTmpW = textWidth(renderText, lastSpace, m_current.offset() + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts) - wordTrailingSpaceWidth;
+                additionalTempWidth = textWidth(renderText, lastSpace, m_current.offset() + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts) - wordTrailingSpaceWidth;
             else
-                additionalTmpW = textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts);
+                additionalTempWidth = textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts);
+
+            wordMeasurement.width = additionalTempWidth + wordSpacingForWordMeasurement;
+            additionalTempWidth += lastSpaceWordSpacing;
+            m_width.addUncommittedWidth(additionalTempWidth);
+
+            if (m_collapseWhiteSpace && previousCharacterIsSpace && m_currentCharacterIsSpace && additionalTempWidth)
+                m_width.setTrailingWhitespaceWidth(additionalTempWidth);
 
-            wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasurement;
-            additionalTmpW += lastSpaceWordSpacing;
-            m_width.addUncommittedWidth(additionalTmpW);
             if (!m_appliedStartWidth) {
                 m_width.addUncommittedWidth(inlineLogicalWidth(m_current.object(), true, false).toFloat());
                 m_appliedStartWidth = true;
@@ -705,7 +709,7 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool
                     }
                 } else {
                     if (!betweenWords || (midWordBreak && !m_autoWrap))
-                        m_width.addUncommittedWidth(-additionalTmpW);
+                        m_width.addUncommittedWidth(-additionalTempWidth);
                     if (hyphenWidth) {
                         // Subtract the width of the soft hyphen out since we fit on a line.
                         m_width.addUncommittedWidth(-hyphenWidth);
@@ -801,12 +805,18 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool
     wordMeasurement.renderer = renderText;
 
     // IMPORTANT: current.m_pos is > length here!
-    float additionalTmpW = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts);
+    float additionalTempWidth = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts);
     wordMeasurement.startOffset = lastSpace;
     wordMeasurement.endOffset = m_current.offset();
-    wordMeasurement.width = m_ignoringSpaces ? 0 : additionalTmpW + wordSpacingForWordMeasurement;
-    additionalTmpW += lastSpaceWordSpacing;
-    m_width.addUncommittedWidth(additionalTmpW + inlineLogicalWidth(m_current.object(), !m_appliedStartWidth, m_includeEndWidth));
+    wordMeasurement.width = m_ignoringSpaces ? 0 : additionalTempWidth + wordSpacingForWordMeasurement;
+    additionalTempWidth += lastSpaceWordSpacing;
+
+    LayoutUnit inlineLogicalTempWidth = inlineLogicalWidth(m_current.object(), !m_appliedStartWidth, m_includeEndWidth);
+    m_width.addUncommittedWidth(additionalTempWidth + inlineLogicalTempWidth);
+
+    if (m_collapseWhiteSpace && m_currentCharacterIsSpace && additionalTempWidth)
+        m_width.setTrailingWhitespaceWidth(additionalTempWidth + inlineLogicalTempWidth);
+
     m_includeEndWidth = false;
 
     if (!m_width.fitsOnLine()) {
index 3819015..1b46843 100644 (file)
@@ -40,6 +40,7 @@ LineWidth::LineWidth(RenderBlockFlow& block, bool isFirstLine, IndentTextOrNot s
     , m_uncommittedWidth(0)
     , m_committedWidth(0)
     , m_overhangWidth(0)
+    , m_trailingWhitespaceWidth(0)
     , m_left(0)
     , m_right(0)
     , m_availableWidth(0)
index 512320c..c9346b7 100644 (file)
@@ -40,6 +40,7 @@ class RenderRubyRun;
 class RenderBlockFlow;
 
 enum IndentTextOrNot { DoNotIndentText, IndentText };
+enum WhitespaceTreatment { ExcludeWhitespace, IncludeWhitespace };
 
 class LineWidth {
 public:
@@ -47,12 +48,17 @@ public:
 
     bool fitsOnLine() const { return currentWidth() <= (m_availableWidth + LayoutUnit::epsilon()); }
     bool fitsOnLine(float extra) const { return currentWidth() + extra <= (m_availableWidth + LayoutUnit::epsilon()); }
+    bool fitsOnLine(float extra, WhitespaceTreatment whitespaceTreatment) const
+    {
+        return currentWidth() - (whitespaceTreatment == ExcludeWhitespace ? trailingWhitespaceWidth() : 0) + extra <= (m_availableWidth + LayoutUnit::epsilon());
+    }
 
     float currentWidth() const { return m_committedWidth + m_uncommittedWidth; }
     // FIXME: We should eventually replace these three functions by ones that work on a higher abstraction.
     float uncommittedWidth() const { return m_uncommittedWidth; }
     float committedWidth() const { return m_committedWidth; }
     float availableWidth() const { return m_availableWidth; }
+    float trailingWhitespaceWidth() const { return m_trailingWhitespaceWidth; }
 
     void updateAvailableWidth(LayoutUnit minimumHeight = 0);
     void shrinkAvailableWidthForNewFloatIfNeeded(FloatingObject*);
@@ -60,6 +66,7 @@ public:
     void commit();
     void applyOverhang(RenderRubyRun*, RenderObject* startRenderer, RenderObject* endRenderer);
     void fitBelowFloats(bool isFirstLine = false);
+    void setTrailingWhitespaceWidth(float width) { m_trailingWhitespaceWidth = width; }
 
     bool shouldIndentText() const { return m_shouldIndentText == IndentText; }
 
@@ -72,6 +79,7 @@ private:
     float m_uncommittedWidth;
     float m_committedWidth;
     float m_overhangWidth; // The amount by which |m_availableWidth| has been inflated to account for possible contraction due to ruby overhang.
+    float m_trailingWhitespaceWidth;
     float m_left;
     float m_right;
     float m_availableWidth;
index 543c815..ba527a5 100644 (file)
@@ -1084,6 +1084,13 @@ public:
     void setOutlineStyleIsAuto(OutlineIsAuto isAuto) { SET_VAR(m_background, m_outline.m_isAuto, isAuto); }
     void setOutlineStyle(EBorderStyle v) { SET_VAR(m_background, m_outline.m_style, v); }
     void setOutlineColor(const StyleColor& v) { SET_BORDERVALUE_COLOR(m_background, m_outline, v); }
+    bool isOutlineEquivalent(const RenderStyle* otherStyle) const
+    {
+        // No other style, so we don't have an outline then we consider them to be the same.
+        if (!otherStyle)
+            return !hasOutline();
+        return m_background->outline().visuallyEqual(otherStyle->m_background->outline());
+    }
 
     void setOverflowX(EOverflow v) { noninherited_flags._overflowX = v; }
     void setOverflowY(EOverflow v) { noninherited_flags._overflowY = v; }
index 80f0a30..744419f 100644 (file)
@@ -146,10 +146,16 @@ static void beginDeferredFilter(GraphicsContext* context, FilterData* filterData
         filterData->filter->enableCache();
     FloatRect boundaries = enclosingIntRect(filterData->boundaries);
     context->save();
-    float scaledArea = boundaries.width() * boundaries.height();
+
+    FloatSize deviceSize = context->getCTM().mapSize(boundaries.size());
+    float scaledArea = deviceSize.width() * deviceSize.height();
 
     // If area of scaled size is bigger than the upper limit, adjust the scale
-    // to fit.
+    // to fit. Note that this only really matters in the non-impl-side painting
+    // case, since the impl-side case never allocates a full-sized backing
+    // store, only tile-sized.
+    // FIXME: remove this once all platforms are using impl-side painting.
+    // crbug.com/169282.
     if (scaledArea > FilterEffect::maxFilterArea()) {
         float scale = sqrtf(FilterEffect::maxFilterArea() / scaledArea);
         context->scale(scale, scale);
index 9905018..757bdef 100644 (file)
@@ -40,7 +40,7 @@ Node::InsertionNotificationRequest SVGTitleElement::insertedInto(ContainerNode*
     if (!rootParent->inDocument())
         return InsertionDone;
     if (firstChild() && document().isSVGDocument())
-        document().setTitleElement(textContent(), this);
+        document().setTitleElement(this);
     return InsertionDone;
 }
 
@@ -55,7 +55,7 @@ void SVGTitleElement::childrenChanged(bool changedByParser, Node* beforeChange,
 {
     SVGElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
     if (inDocument() && document().isSVGDocument())
-        document().setTitleElement(textContent(), this);
+        document().setTitleElement(this);
 }
 
 }
index 42770fa..4ae9cf5 100644 (file)
@@ -172,6 +172,14 @@ WebInspector.ConsoleView.prototype = {
     },
 
     /**
+     * @return {number}
+     */
+    minimumRowHeight: function()
+    {
+        return 16;
+    },
+
+    /**
      * @param {!WebInspector.Target} target
      */
     targetAdded: function(target)
index b79e3eb..80697a5 100644 (file)
@@ -105,7 +105,7 @@ WebInspector.ConsoleViewMessage.prototype = {
     {
         if (this._cachedHeight)
             return this._cachedHeight;
-        const defaultConsoleRowHeight = 17;
+        const defaultConsoleRowHeight = 16;
         if (this._message.type === WebInspector.ConsoleMessage.MessageType.Table) {
             var table = this._message.parameters[0];
             if (table && table.preview)
index e5459e7..51f5dda 100644 (file)
@@ -1156,7 +1156,7 @@ WebInspector.StylePropertiesSection.prototype = {
         if (!this.rule || !this.rule.styleSheetId)
             return;
         if (this.rule !== editedRule)
-            this.rule.sourceStyleSheetEdited(this.rule.styleSheetId, oldRange, newRange);
+            this.rule.sourceStyleSheetEdited(editedRule.styleSheetId, oldRange, newRange);
         this._updateMediaList();
         this._updateRuleOrigin();
     },
index 75ebcb7..43ec7c5 100644 (file)
@@ -1771,7 +1771,7 @@ li.editing-sub-part .delete-button {
 
 .section .properties li.editing-sub-part {
     padding: 3px 6px 8px 18px;
-    margin: -3px -6px -8px -6px;
+    margin: -1px -6px -8px -6px;
     text-overflow: clip;
 }
 
index 0c46cfd..3c74972 100644 (file)
@@ -156,6 +156,8 @@ WebInspector.AdvancedApp.prototype = {
     {
         if (this._changingDockSide || (this._isDocked() === toolbox))
             return;
+        if (!window.innerWidth || !window.innerHeight)
+            return;
         var bounds = /** @type {{x: number, y: number, width: number, height: number}} */ (event.data);
         InspectorFrontendHost.setInspectedPageBounds(bounds);
     },
index e0558bb..b5deee9 100644 (file)
@@ -379,6 +379,14 @@ WebInspector.FilteredItemSelectionDialog.prototype = {
         return new WebInspector.StaticViewportElement(element);
     },
 
+    /**
+     * @return {number}
+     */
+    minimumRowHeight: function()
+    {
+        return this.fastHeight(0);
+    },
+
     __proto__: WebInspector.DialogDelegate.prototype
 }
 
index 160fde8..e55890f 100644 (file)
@@ -1079,7 +1079,7 @@ WebInspector.TimelinePanel.prototype = {
                 break;
             }
         }
-        pieChartContainer.appendChild(document.createTextNode(title));
+        pieChartContainer.createChild("div").textContent = title;
         pieChartContainer.appendChild(WebInspector.TimelineUIUtils.generatePieChart(aggregatedStats));
         this.showInDetails(WebInspector.UIString("Selected Range"), pieChartContainer);
     },
index 66a6bd5..d4270be 100644 (file)
     margin: 6px;
 }
 
+.timeline-range-summary > div {
+    flex-shrink: 0;
+}
+
 .timeline-aggregated-info-legend > div {
     overflow: hidden;
     white-space: nowrap;
index 130cfbc..87d9165 100644 (file)
@@ -77,6 +77,11 @@ WebInspector.ViewportControl.Provider.prototype = {
     itemCount: function() { return 0; },
 
     /**
+     * @return {number}
+     */
+    minimumRowHeight: function() { return 0; },
+
+    /**
      * @param {number} index
      * @return {?WebInspector.ViewportElement}
      */
@@ -364,10 +369,12 @@ WebInspector.ViewportControl.prototype = {
         this._rebuildCumulativeHeightsIfNeeded();
         if (shouldStickToBottom) {
             this._lastVisibleIndex = itemCount - 1;
-            this._firstVisibleIndex = Math.max(Array.prototype.lowerBound.call(this._cumulativeHeights, this._cumulativeHeights[this._cumulativeHeights.length - 1] - clientHeight), 0);
+            this._firstVisibleIndex = Math.max(itemCount - Math.ceil(clientHeight / this._provider.minimumRowHeight()), 0);
         } else {
-            this._firstVisibleIndex = Math.max(Array.prototype.lowerBound.call(this._cumulativeHeights, visibleFrom), 0);
-            this._lastVisibleIndex = Math.min(Array.prototype.upperBound.call(this._cumulativeHeights, visibleFrom + clientHeight - 1), itemCount - 1);
+            this._firstVisibleIndex = Math.max(Array.prototype.lowerBound.call(this._cumulativeHeights, visibleFrom + 1), 0);
+            // Proactively render more rows in case some of them will be collapsed without triggering refresh. @see crbug.com/390169
+            this._lastVisibleIndex = this._firstVisibleIndex + Math.ceil(clientHeight / this._provider.minimumRowHeight()) - 1;
+            this._lastVisibleIndex = Math.min(this._lastVisibleIndex, itemCount - 1);
         }
         var topGapHeight = this._cumulativeHeights[this._firstVisibleIndex - 1] || 0;
         var bottomGapHeight = this._cumulativeHeights[this._cumulativeHeights.length - 1] - this._cumulativeHeights[this._lastVisibleIndex];
@@ -443,8 +450,6 @@ WebInspector.ViewportControl.prototype = {
      */
     _textOffsetInNode: function(itemElement, container, offset)
     {
-        if (!offset)
-            return 0;
         var chars = 0;
         var node = itemElement;
         while ((node = node.traverseNextTextNode()) && node !== container)
index c06ac2c..a0de143 100644 (file)
@@ -21,6 +21,7 @@ modules/notifications/Notification
 modules/serviceworkers/ServiceWorker
 modules/serviceworkers/ServiceWorkerGlobalScope
 modules/speech/SpeechRecognition
+modules/speech/SpeechSynthesis
 modules/speech/SpeechSynthesisUtterance
 modules/webaudio/AudioContext Conditional=WEB_AUDIO
 modules/webaudio/AudioNode Conditional=WEB_AUDIO
index 64f7297..39c384d 100644 (file)
@@ -230,7 +230,7 @@ SpeechSynthesisUtterance* SpeechSynthesis::currentSpeechUtterance() const
 
 const AtomicString& SpeechSynthesis::interfaceName() const
 {
-    return EventTargetNames::SpeechSynthesisUtterance;
+    return EventTargetNames::SpeechSynthesis;
 }
 
 void SpeechSynthesis::trace(Visitor* visitor)
index 6e4ddf6..a77c998 100644 (file)
@@ -132,6 +132,7 @@ AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t
     , m_isCleared(false)
     , m_isInitialized(false)
     , m_destinationNode(nullptr)
+    , m_isDeletionScheduled(false)
     , m_automaticPullNodesNeedUpdating(false)
     , m_connectionCount(0)
     , m_audioThread(0)
index 984a544..3b51be0 100644 (file)
@@ -314,7 +314,10 @@ static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil
 void WorkerThreadableWebSocketChannel::Peer::didConnect(const String& subprotocol, const String& extensions)
 {
     ASSERT(isMainThread());
-    m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidConnect, m_workerClientWrapper.get(), subprotocol, extensions));
+    // It is important to seprate task creation from posting
+    // the task. See the above comment.
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&workerGlobalScopeDidConnect, m_workerClientWrapper.get(), subprotocol, extensions);
+    m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
 }
 
 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& message)
@@ -326,7 +329,10 @@ static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe
 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& message)
 {
     ASSERT(isMainThread());
-    m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveMessage, m_workerClientWrapper.get(), message));
+    // It is important to seprate task creation from posting
+    // the task. See the above comment.
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&workerGlobalScopeDidReceiveMessage, m_workerClientWrapper.get(), message);
+    m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
 }
 
 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr<Vector<char> > binaryData)
@@ -338,7 +344,10 @@ static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas
 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData)
 {
     ASSERT(isMainThread());
-    m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData));
+    // It is important to seprate task creation from posting
+    // the task. See the above comment.
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&workerGlobalScopeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData);
+    m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
 }
 
 static void workerGlobalScopeDidConsumeBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long consumed)
@@ -350,7 +359,10 @@ static void workerGlobalScopeDidConsumeBufferedAmount(ExecutionContext* context,
 void WorkerThreadableWebSocketChannel::Peer::didConsumeBufferedAmount(unsigned long consumed)
 {
     ASSERT(isMainThread());
-    m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidConsumeBufferedAmount, m_workerClientWrapper.get(), consumed));
+    // It is important to seprate task creation from posting
+    // the task. See the above comment.
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&workerGlobalScopeDidConsumeBufferedAmount, m_workerClientWrapper.get(), consumed);
+    m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
 }
 
 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper)
@@ -362,7 +374,10 @@ static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake()
 {
     ASSERT(isMainThread());
-    m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidStartClosingHandshake, m_workerClientWrapper.get()));
+    // It is important to seprate task creation from posting
+    // the task. See the above comment.
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&workerGlobalScopeDidStartClosingHandshake, m_workerClientWrapper.get());
+    m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
 }
 
 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
@@ -375,7 +390,10 @@ void WorkerThreadableWebSocketChannel::Peer::didClose(ClosingHandshakeCompletion
 {
     ASSERT(isMainThread());
     m_mainWebSocketChannel = nullptr;
-    m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidClose, m_workerClientWrapper.get(), closingHandshakeCompletion, code, reason));
+    // It is important to seprate task creation from posting
+    // the task. See the above comment.
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&workerGlobalScopeDidClose, m_workerClientWrapper.get(), closingHandshakeCompletion, code, reason);
+    m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
 }
 
 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper)
@@ -387,7 +405,10 @@ static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError()
 {
     ASSERT(isMainThread());
-    m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveMessageError, m_workerClientWrapper.get()));
+    // It is important to seprate task creation from posting
+    // the task. See the above comment.
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&workerGlobalScopeDidReceiveMessageError, m_workerClientWrapper.get());
+    m_loaderProxy.postTaskToWorkerGlobalScope(task.release());
 }
 
 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope)
@@ -414,7 +435,8 @@ void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR
     m_syncHelper = syncHelper.get();
 
     RefPtr<Bridge> protect(this);
-    if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), sourceURL, lineNumber, syncHelper.release()))) {
+    OwnPtr<ExecutionContextTask> task = createCallbackTask(&Peer::initialize, reference.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), sourceURL, lineNumber, syncHelper.release());
+    if (!waitForMethodCompletion(task.release())) {
         // The worker thread has been signalled to shutdown before method completion.
         terminatePeer();
     }
@@ -426,7 +448,10 @@ bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
         return false;
 
     RefPtr<Bridge> protect(this);
-    if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::connect, m_peer, url.copy(), protocol.isolatedCopy()))))
+    // It is important to seprate task creation from calling
+    // waitForMethodCompletion. See the above comment.
+    OwnPtr<ExecutionContextTask> task = CallClosureTask::create(bind(&Peer::connect, m_peer, url.copy(), protocol.isolatedCopy()));
+    if (!waitForMethodCompletion(task.release()))
         return false;
 
     return m_syncHelper->connectRequestResult();
@@ -438,7 +463,10 @@ WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
         return WebSocketChannel::SendFail;
 
     RefPtr<Bridge> protect(this);
-    if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::send, m_peer, message.isolatedCopy()))))
+    // It is important to seprate task creation from calling
+    // waitForMethodCompletion. See the above comment.
+    OwnPtr<ExecutionContextTask> task = CallClosureTask::create(bind(&Peer::send, m_peer, message.isolatedCopy()));
+    if (!waitForMethodCompletion(task.release()))
         return WebSocketChannel::SendFail;
 
     return m_syncHelper->sendRequestResult();
@@ -455,7 +483,10 @@ WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
         memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteOffset, byteLength);
 
     RefPtr<Bridge> protect(this);
-    if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendArrayBuffer, m_peer, data.release()))))
+    // It is important to seprate task creation from calling
+    // waitForMethodCompletion. See the above comment.
+    OwnPtr<ExecutionContextTask> task = CallClosureTask::create(bind(&Peer::sendArrayBuffer, m_peer, data.release()));
+    if (!waitForMethodCompletion(task.release()))
         return WebSocketChannel::SendFail;
 
     return m_syncHelper->sendRequestResult();
@@ -467,7 +498,10 @@ WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(Pass
         return WebSocketChannel::SendFail;
 
     RefPtr<Bridge> protect(this);
-    if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendBlob, m_peer, data))))
+    // It is important to seprate task creation from calling
+    // waitForMethodCompletion. See the above comment.
+    OwnPtr<ExecutionContextTask> task = CallClosureTask::create(bind(&Peer::sendBlob, m_peer, data));
+    if (!waitForMethodCompletion(task.release()))
         return WebSocketChannel::SendFail;
 
     return m_syncHelper->sendRequestResult();
@@ -478,7 +512,10 @@ void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
     if (hasTerminatedPeer())
         return;
 
-    m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::close, m_peer, code, reason.isolatedCopy())));
+    // It is important to seprate task creation from calling
+    // waitForMethodCompletion. See the above comment.
+    OwnPtr<ExecutionContextTask> task = CallClosureTask::create(bind(&Peer::close, m_peer, code, reason.isolatedCopy()));
+    m_loaderProxy.postTaskToLoader(task.release());
 }
 
 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, MessageLevel level, const String& sourceURL, unsigned lineNumber)
@@ -486,7 +523,10 @@ void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag
     if (hasTerminatedPeer())
         return;
 
-    m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::fail, m_peer, reason.isolatedCopy(), level, sourceURL.isolatedCopy(), lineNumber)));
+    // It is important to seprate task creation from calling
+    // waitForMethodCompletion. See the above comment.
+    OwnPtr<ExecutionContextTask> task = CallClosureTask::create(bind(&Peer::fail, m_peer, reason.isolatedCopy(), level, sourceURL.isolatedCopy(), lineNumber));
+    m_loaderProxy.postTaskToLoader(task.release());
 }
 
 void WorkerThreadableWebSocketChannel::Bridge::disconnect()
@@ -521,7 +561,8 @@ bool WorkerThreadableWebSocketChannel::Bridge::waitForMethodCompletion(PassOwnPt
 
 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer()
 {
-    m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer)));
+    OwnPtr<ExecutionContextTask> task = CallClosureTask::create(bind(&Peer::destroy, m_peer));
+    m_loaderProxy.postTaskToLoader(task.release());
     // Peer::destroy() deletes m_peer and then m_syncHelper will be released.
     // We must not touch m_syncHelper any more.
     m_syncHelper = 0;
index 6f48378..f0ee688 100644 (file)
@@ -30,7 +30,7 @@ PrefixedVideoFullscreen status=stable
 // The changes enabled behind this flag are very likely to break lots of content.
 // ** DO NOT use this flag unless you know what you are doing. **
 BleedingEdgeFastPaths
-BrandColor status=experimental
+ThemeColor status=stable
 
 ClientHintsDpr status=experimental
 Crypto status=stable
@@ -58,7 +58,7 @@ EncryptedMedia status=test
 EncryptedMediaAnyVersion status=stable
 ExperimentalCanvasFeatures status=test
 ExperimentalContentSecurityPolicyFeatures status=experimental
-ExperimentalWebSocket status=stable
+ExperimentalWebSocket status=test
 FastMobileScrolling
 FileAPIBlobClose status=experimental
 FileConstructor status=experimental
@@ -140,6 +140,7 @@ TargetedStyleRecalc status=stable
 Touch status=stable
 
 TouchIconLoading
+ThreadedParserDataReceiver status=experimental
 UserSelectAll status=experimental
 WebAnimationsSVG
 WebAnimationsElementAnimate status=stable
index c741e2b..39466a4 100644 (file)
       'testing/TreeTestHelpers.cpp',
       'testing/TreeTestHelpers.h',
       'transforms/TransformOperationsTest.cpp',
+      'transforms/TransformationMatrixTest.cpp',
       'text/BidiResolverTest.cpp',
       'text/DateTimeFormatTest.cpp',
       'text/SegmentedStringTest.cpp',
index a9898c9..40ccd3e 100644 (file)
@@ -112,12 +112,6 @@ CodePath Character::characterRangeCodePath(const UChar* characters, unsigned len
         0x1A00, 0x1CFF,
         // U+1DC0 through U+1DFF Comining diacritical mark supplement
         0x1DC0, 0x1DFF,
-        // RIGHT-TO-LEFT MARK
-        0x200B, 0x200F,
-        // RIGHT-TO-LEFT OVERRIDE
-        0x202A, 0x202E,
-        // Nominal Digit Shape
-        0x2060, 0x206F,
         // U+20D0 through U+20FF Combining marks for symbols
         0x20D0, 0x20FF,
         // U+2CEF through U+2CF1 Combining marks for Coptic
index fee749f..e7dfc6e 100644 (file)
@@ -126,10 +126,12 @@ const FontData* FontFallbackList::primaryFontData(const FontDescription& fontDes
         if (!fontData) {
             // All fonts are custom fonts and are loading. Return the first FontData.
             fontData = fontDataAt(fontDescription, 0);
-            if (!fontData)
-                fontData = FontCache::fontCache()->getLastResortFallbackFont(fontDescription).get();
-            ASSERT(fontData);
-            return fontData;
+            if (fontData)
+                return fontData->fontDataForCharacter(' ');
+
+            SimpleFontData* lastResortFallback = FontCache::fontCache()->getLastResortFallbackFont(fontDescription).get();
+            ASSERT(lastResortFallback);
+            return lastResortFallback;
         }
 
         if (fontData->isSegmented() && !toSegmentedFontData(fontData)->containsCharacter(' '))
index 0ffd783..c05fa20 100644 (file)
@@ -82,7 +82,9 @@ void FontPlatformData::setupPaint(SkPaint* paint, GraphicsContext*) const
         paint->setLCDRenderText(m_style.useSubpixelRendering);
 
     // TestRunner specifically toggles the subpixel positioning flag.
-    if (RuntimeEnabledFeatures::subpixelFontScalingEnabled() && !isRunningLayoutTest())
+    if (RuntimeEnabledFeatures::subpixelFontScalingEnabled()
+        && paint->getHinting() != SkPaint::kFull_Hinting
+        && !isRunningLayoutTest())
         paint->setSubpixelText(true);
     else
         paint->setSubpixelText(m_style.useSubpixelPositioning);
index 5d2294d..1dfc9c7 100644 (file)
@@ -102,6 +102,17 @@ PassRefPtr<SimpleFontData> FontCache::getLastResortFallbackFont(const FontDescri
         DEFINE_STATIC_LOCAL(const AtomicString, arialStr, ("Arial", AtomicString::ConstructFromLiteral));
         fontPlatformData = getFontPlatformData(description, arialStr);
     }
+#if OS(WIN)
+    // Try some more Windows-specific fallbacks.
+    if (!fontPlatformData) {
+        DEFINE_STATIC_LOCAL(const AtomicString, msuigothicStr, ("MS UI Gothic", AtomicString::ConstructFromLiteral));
+        fontPlatformData = getFontPlatformData(description, msuigothicStr);
+    }
+    if (!fontPlatformData) {
+        DEFINE_STATIC_LOCAL(const AtomicString, mssansserifStr, ("Microsoft Sans Serif", AtomicString::ConstructFromLiteral));
+        fontPlatformData = getFontPlatformData(description, mssansserifStr);
+    }
+#endif
 
     ASSERT(fontPlatformData);
     return fontDataFromFontPlatformData(fontPlatformData, shouldRetain);
index a83e339..d8afcdc 100644 (file)
@@ -69,6 +69,22 @@ static inline bool isFontPresent(const UChar* fontName, SkFontMgr* fontManager)
 // which works well since the range of UScriptCode values is small.
 typedef const UChar* ScriptToFontMap[USCRIPT_CODE_LIMIT];
 
+void initializeScriptMonospaceFontMap(ScriptToFontMap& scriptFontMap, SkFontMgr* fontManager)
+{
+    struct FontMap {
+        UScriptCode script;
+        const UChar* family;
+    };
+
+    static const FontMap fontMap[] = {
+        { USCRIPT_HEBREW, L"courier new" },
+        { USCRIPT_ARABIC, L"courier new" },
+    };
+
+    for (size_t i = 0; i < WTF_ARRAY_LENGTH(fontMap); ++i)
+        scriptFontMap[fontMap[i].script] = fontMap[i].family;
+}
+
 void initializeScriptFontMap(ScriptToFontMap& scriptFontMap, SkFontMgr* fontManager)
 {
     struct FontMap {
@@ -259,14 +275,18 @@ const UChar* getFontFamilyForScript(UScriptCode script,
     SkFontMgr* fontManager)
 {
     static ScriptToFontMap scriptFontMap;
+    static ScriptToFontMap scriptMonospaceFontMap;
     static bool initialized = false;
     if (!initialized) {
         initializeScriptFontMap(scriptFontMap, fontManager);
+        initializeScriptMonospaceFontMap(scriptMonospaceFontMap, fontManager);
         initialized = true;
     }
     if (script == USCRIPT_INVALID_CODE)
         return 0;
     ASSERT(script < USCRIPT_CODE_LIMIT);
+    if (generic == FontDescription::MonospaceFamily && scriptMonospaceFontMap[script])
+        return scriptMonospaceFontMap[script];
     return scriptFontMap[script];
 }
 
index df3f5a8..55ce1f2 100644 (file)
@@ -841,10 +841,11 @@ void ThreadHeap<Header>::assertEmpty()
             // threads alive until their heaps become empty instead of
             // forcing the threads to die immediately?
             ASSERT(Heap::lastGCWasConservative() || basicHeader->isFree());
+            if (basicHeader->isFree())
+                addToFreeList(headerAddress, basicHeader->size());
             headerAddress += basicHeader->size();
         }
         ASSERT(headerAddress == end);
-        addToFreeList(page->payload(), end - page->payload());
     }
 
     ASSERT(Heap::lastGCWasConservative() || !m_firstLargeHeapObject);
index bf773e9..b4ad6bb 100644 (file)
@@ -373,9 +373,6 @@ void ThreadState::cleanup()
     // pointers into the heap owned by this thread.
     m_isCleaningUp = true;
 
-    for (size_t i = 0; i < m_cleanupTasks.size(); i++)
-        m_cleanupTasks[i]->preCleanup();
-
     // After this GC we expect heap to be empty because
     // preCleanup tasks should have cleared all persistent
     // handles that were externally owned.
@@ -384,16 +381,25 @@ void ThreadState::cleanup()
     // Verify that all heaps are empty now.
     for (int i = 0; i < NumberOfHeaps; i++)
         m_heaps[i]->assertEmpty();
+}
 
+void ThreadState::preCleanup()
+{
     for (size_t i = 0; i < m_cleanupTasks.size(); i++)
-        m_cleanupTasks[i]->postCleanup();
+        m_cleanupTasks[i]->preCleanup();
+}
 
+void ThreadState::postCleanup()
+{
+    for (size_t i = 0; i < m_cleanupTasks.size(); i++)
+        m_cleanupTasks[i]->postCleanup();
     m_cleanupTasks.clear();
 }
 
 void ThreadState::detach()
 {
     ThreadState* state = current();
+    state->preCleanup();
     state->cleanup();
 
     // Enter a safe point before trying to acquire threadAttachMutex
@@ -406,6 +412,7 @@ void ThreadState::detach()
     {
         MutexLocker locker(threadAttachMutex());
         state->leaveSafePoint();
+        state->postCleanup();
         ASSERT(attachedThreads().contains(state));
         attachedThreads().remove(state);
         delete state;
index d900e02..41f57e4 100644 (file)
@@ -537,6 +537,8 @@ private:
     // If assertion does not hold we crash as we are potentially
     // in the dangling pointer situation.
     void cleanup();
+    void preCleanup();
+    void postCleanup();
 
     static WTF::ThreadSpecific<ThreadState*>* s_threadSpecific;
     static SafePointBarrier* s_safePointBarrier;
index 4403d3e..172d0bf 100644 (file)
@@ -1364,8 +1364,11 @@ void TransformationMatrix::blend(const TransformationMatrix& from, double progre
     // decompose
     DecomposedType fromDecomp;
     DecomposedType toDecomp;
-    from.decompose(fromDecomp);
-    decompose(toDecomp);
+    if (!from.decompose(fromDecomp) || !decompose(toDecomp)) {
+        if (progress < 0.5)
+            *this = from;
+        return;
+    }
 
     // interpolate
     blendFloat(fromDecomp.scaleX, toDecomp.scaleX, progress);
diff --git a/src/third_party/WebKit/Source/platform/transforms/TransformationMatrixTest.cpp b/src/third_party/WebKit/Source/platform/transforms/TransformationMatrixTest.cpp
new file mode 100644 (file)
index 0000000..64c533c
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "platform/transforms/TransformationMatrix.h"
+
+#include <gtest/gtest.h>
+
+using namespace WebCore;
+namespace {
+
+TEST(TransformationMatrixTest, NonInvertableBlendTest)
+{
+    TransformationMatrix from;
+    TransformationMatrix to(2.7133590938, 0.0, 0.0, 0.0, 0.0, 2.4645137761, 0.0, 0.0, 0.0, 0.0, 0.00, 0.01, 0.02, 0.03, 0.04, 0.05);
+    TransformationMatrix result;
+
+    result = to;
+    result.blend(from, 0.25);
+    EXPECT_TRUE(result == from);
+
+    result = to;
+    result.blend(from, 0.75);
+    EXPECT_TRUE(result == to);
+}
+
+} // namespace
index 771d561..6f570cc 100644 (file)
@@ -882,9 +882,4 @@ void ChromeClientImpl::openTextDataListChooser(HTMLInputElement& input)
         m_webView->autofillClient()->openTextDataListChooser(WebInputElement(&input));
 }
 
-bool ChromeClientImpl::usesGpuRasterization()
-{
-    return m_webView->layerTreeView()->usesGpuRasterization();
-}
-
 } // namespace blink
index c221f87..f0f48b3 100644 (file)
@@ -183,8 +183,6 @@ public:
     virtual void willSetInputMethodState() OVERRIDE;
     virtual void didUpdateTextOfFocusedElementByNonUserInput() OVERRIDE;
 
-    virtual bool usesGpuRasterization() OVERRIDE;
-
 private:
     virtual bool isChromeClientImpl() const OVERRIDE { return true; }
 
index bafedb8..97a53af 100644 (file)
@@ -450,10 +450,10 @@ void FrameLoaderClientImpl::dispatchDidFirstVisuallyNonEmptyLayout()
         m_webFrame->client()->didFirstVisuallyNonEmptyLayout(m_webFrame);
 }
 
-void FrameLoaderClientImpl::dispatchDidChangeBrandColor()
+void FrameLoaderClientImpl::dispatchDidChangeThemeColor()
 {
     if (m_webFrame->client())
-        m_webFrame->client()->didChangeBrandColor();
+        m_webFrame->client()->didChangeThemeColor();
 }
 
 NavigationPolicy FrameLoaderClientImpl::decidePolicyForNavigation(const ResourceRequest& request, DocumentLoader* loader, NavigationPolicy policy)
index 14bd912..87f4a84 100644 (file)
@@ -94,7 +94,7 @@ public:
     virtual void dispatchDidFinishDocumentLoad() OVERRIDE;
     virtual void dispatchDidFinishLoad() OVERRIDE;
     virtual void dispatchDidFirstVisuallyNonEmptyLayout() OVERRIDE;
-    virtual void dispatchDidChangeBrandColor() OVERRIDE;
+    virtual void dispatchDidChangeThemeColor() OVERRIDE;
     virtual WebCore::NavigationPolicy decidePolicyForNavigation(const WebCore::ResourceRequest&, WebCore::DocumentLoader*, WebCore::NavigationPolicy) OVERRIDE;
     virtual void dispatchWillRequestResource(WebCore::FetchRequest*) OVERRIDE;
     virtual void dispatchWillSendSubmitEvent(WebCore::HTMLFormElement*) OVERRIDE;
index 6ff598d..6ea9a80 100644 (file)
@@ -97,9 +97,9 @@ WebString WebDocument::referrer() const
     return constUnwrap<Document>()->referrer();
 }
 
-WebColor WebDocument::brandColor() const
+WebColor WebDocument::themeColor() const
 {
-    return constUnwrap<Document>()->brandColor().rgb();
+    return constUnwrap<Document>()->themeColor().rgb();
 }
 
 WebURL WebDocument::openSearchDescriptionURL() const
index 6ce2a80..4210e21 100644 (file)
@@ -41,80 +41,52 @@ using namespace WebCore;
 
 namespace blink {
 
-class WebHitTestResultPrivate {
-public:
-    WebHitTestResultPrivate(const HitTestResult&);
-    WebHitTestResultPrivate(const WebHitTestResultPrivate&);
-
-    RefPtrWillBePersistent<Node> innerNode;
-    RefPtrWillBePersistent<Element> innerURLElement;
-    LayoutPoint localPoint;
-    KURL absoluteImageURL;
-    KURL absoluteLinkURL;
-    bool isContentEditable;
-};
-
-inline WebHitTestResultPrivate::WebHitTestResultPrivate(const HitTestResult& result)
-    : innerNode(result.innerNode())
-    , innerURLElement(result.URLElement())
-    , localPoint(result.localPoint())
-    , absoluteImageURL(result.absoluteImageURL())
-    , absoluteLinkURL(result.absoluteLinkURL())
-    , isContentEditable(result.isContentEditable())
-{
-}
-
-inline WebHitTestResultPrivate::WebHitTestResultPrivate(const WebHitTestResultPrivate& result)
-    : innerNode(result.innerNode)
-    , innerURLElement(result.innerURLElement)
-    , localPoint(result.localPoint)
-    , absoluteImageURL(result.absoluteImageURL)
-    , absoluteLinkURL(result.absoluteLinkURL)
-    , isContentEditable(result.isContentEditable)
-{
-}
-
 WebNode WebHitTestResult::node() const
 {
-    return WebNode(m_private->innerNode);
+    return WebNode(m_private->innerNode());
 }
 
 WebPoint WebHitTestResult::localPoint() const
 {
-    return roundedIntPoint(m_private->localPoint);
+    return roundedIntPoint(m_private->localPoint());
 }
 
 WebElement WebHitTestResult::urlElement() const
 {
-    return WebElement(m_private->innerURLElement);
+    return WebElement(m_private->URLElement());
 }
 
 WebURL WebHitTestResult::absoluteImageURL() const
 {
-    return m_private->absoluteImageURL;
+    return m_private->absoluteImageURL();
 }
 
 WebURL WebHitTestResult::absoluteLinkURL() const
 {
-    return m_private->absoluteLinkURL;
+    return m_private->absoluteLinkURL();
 }
 
 bool WebHitTestResult::isContentEditable() const
 {
-    return m_private->isContentEditable;
+    return m_private->isContentEditable();
 }
 
 WebHitTestResult::WebHitTestResult(const HitTestResult& result)
 {
-    m_private.reset(new WebHitTestResultPrivate(result));
+    m_private.reset(new HitTestResult(result));
 }
 
 WebHitTestResult& WebHitTestResult::operator=(const HitTestResult& result)
 {
-    m_private.reset(new WebHitTestResultPrivate(result));
+    m_private.reset(new HitTestResult(result));
     return *this;
 }
 
+WebHitTestResult::operator HitTestResult() const
+{
+    return *m_private.get();
+}
+
 bool WebHitTestResult::isNull() const
 {
     return !m_private.get();
@@ -122,10 +94,7 @@ bool WebHitTestResult::isNull() const
 
 void WebHitTestResult::assign(const WebHitTestResult& info)
 {
-    if (info.isNull())
-        m_private.reset(0);
-    else
-        m_private.reset(new WebHitTestResultPrivate(*info.m_private.get()));
+    m_private.reset(new HitTestResult(info));
 }
 
 void WebHitTestResult::reset()
index fed969e..306f674 100644 (file)
@@ -196,8 +196,12 @@ void WebNode::simulateClick()
 
 WebElementCollection WebNode::getElementsByTagName(const WebString& tag) const
 {
-    if (m_private->isContainerNode())
-        return WebElementCollection(toContainerNode(m_private.get())->getElementsByTagName(tag));
+    if (m_private->isContainerNode()) {
+        // FIXME: Calling getElementsByTagNameNS here is inconsistent with the
+        // function name. This is a temporary fix for a serious bug, and should
+        // be reverted soon.
+        return WebElementCollection(toContainerNode(m_private.get())->getElementsByTagNameNS(HTMLNames::xhtmlNamespaceURI, tag));
+    }
     return WebElementCollection();
 }
 
diff --git a/src/third_party/WebKit/Source/web/WebNodeTest.cpp b/src/third_party/WebKit/Source/web/WebNodeTest.cpp
new file mode 100644 (file)
index 0000000..174b4d3
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "public/web/WebNode.h"
+
+#include "core/testing/DummyPageHolder.h"
+#include "public/web/WebElement.h"
+#include "public/web/WebElementCollection.h"
+#include <gtest/gtest.h>
+
+namespace blink {
+
+using WebCore::Document;
+using WebCore::DummyPageHolder;
+using WebCore::IntSize;
+
+class WebNodeTest : public testing::Test {
+protected:
+    Document& document() { return m_pageHolder->document(); }
+
+private:
+    virtual void SetUp() OVERRIDE;
+
+    OwnPtr<DummyPageHolder> m_pageHolder;
+};
+
+void WebNodeTest::SetUp()
+{
+    m_pageHolder = WebCore::DummyPageHolder::create(IntSize(800, 600));
+}
+
+TEST_F(WebNodeTest, GetElementsByTagName)
+{
+    document().documentElement()->setInnerHTML("<body><LABEL></LABEL><svg xmlns='http://www.w3.org/2000/svg'><label></label></svg></body>", ASSERT_NO_EXCEPTION);
+    WebNode node(document().documentElement());
+    // WebNode::getElementsByTagName returns only HTML elements.
+    WebElementCollection collection = node.getElementsByTagName("label");
+    EXPECT_EQ(1u, collection.length());
+    EXPECT_TRUE(collection.firstItem().hasHTMLTagName("label"));
+    // The argument should be lower-case.
+    collection = node.getElementsByTagName("LABEL");
+    EXPECT_EQ(0u, collection.length());
+}
+
+}
index 80ff79a..6eed6fc 100644 (file)
@@ -2124,7 +2124,9 @@ WebTextInputInfo WebViewImpl::textInputInfo()
     if (!focused->editor().canEdit())
         return info;
 
-    info.value = plainText(rangeOfContents(node).get());
+    // Emits an object replacement character for each replaced element so that
+    // it is exposed to IME and thus could be deleted by IME on android.
+    info.value = plainText(rangeOfContents(node).get(), TextIteratorEmitsObjectReplacementCharacter);
 
     if (info.value.isEmpty())
         return info;
@@ -3165,11 +3167,6 @@ void WebViewImpl::performPluginAction(const WebPluginAction& action,
 
 WebHitTestResult WebViewImpl::hitTestResultAt(const WebPoint& point)
 {
-    return coreHitTestResultAt(point);
-}
-
-HitTestResult WebViewImpl::coreHitTestResultAt(const WebPoint& point)
-{
     IntPoint scaledPoint = point;
     scaledPoint.scale(1 / pageScaleFactor(), 1 / pageScaleFactor());
     return hitTestResultForWindowPos(scaledPoint);
@@ -3182,7 +3179,7 @@ void WebViewImpl::copyImageAt(const WebPoint& point)
 
     HitTestResult result = hitTestResultForWindowPos(point);
 
-    if (result.absoluteImageURL().isEmpty()) {
+    if (result.absoluteImageURLIncludingCanvasDataURL().isEmpty()) {
         // There isn't actually an image at these coordinates.  Might be because
         // the window scrolled while the context menu was open or because the page
         // changed itself between when we thought there was an image here and when
@@ -3201,7 +3198,7 @@ void WebViewImpl::saveImageAt(const WebPoint& point)
     if (!m_page)
         return;
 
-    KURL url = hitTestResultForWindowPos(point).absoluteImageURL();
+    KURL url = hitTestResultForWindowPos(point).absoluteImageURLIncludingCanvasDataURL();
 
     if (url.isEmpty())
         return;
index 6a4c299..66ec102 100644 (file)
@@ -261,7 +261,6 @@ public:
 
     // WebViewImpl
 
-    WebCore::HitTestResult coreHitTestResultAt(const WebPoint&);
     void suppressInvalidations(bool enable);
     void invalidateRect(const WebCore::IntRect&);
 
index 8df070c..d14d4fd 100644 (file)
@@ -55,7 +55,6 @@
 #include "public/web/WebRange.h"
 #include "public/web/WebView.h"
 #include "web/WebLocalFrameImpl.h"
-#include "web/WebViewImpl.h"
 
 using namespace WebCore;
 
@@ -113,7 +112,7 @@ namespace blink {
 
 NSAttributedString* WebSubstringUtil::attributedWordAtPoint(WebView* view, WebPoint point, WebPoint& baselinePoint)
 {
-    HitTestResult result = static_cast<WebViewImpl*>(view)->coreHitTestResultAt(point);
+    HitTestResult result = view->hitTestResultAt(point);
     if (!result.targetNode())
       return nil;
     LocalFrame* frame = result.targetNode()->document().frame();
index 1851db5..9484b63 100644 (file)
@@ -2529,6 +2529,24 @@ TEST_F(ViewportTest, viewport137)
     EXPECT_TRUE(page->viewportDescription().userZoom);
 }
 
+TEST_F(ViewportTest, viewport138)
+{
+    registerMockedHttpURLLoad("viewport/viewport-138.html");
+
+    FrameTestHelpers::WebViewHelper webViewHelper;
+    webViewHelper.initializeAndLoad(m_baseURL + "viewport/viewport-138.html", true, 0, 0, setViewportSettings);
+
+    Page* page = webViewHelper.webViewImpl()->page();
+    PageScaleConstraints constraints = runViewportTest(page, 320, 352);
+
+    EXPECT_NEAR(123.0f, constraints.layoutSize.width(), 0.01);
+    EXPECT_NEAR(135.3f, constraints.layoutSize.height(), 0.01);
+    EXPECT_NEAR(2.60f, constraints.initialScale, 0.01f);
+    EXPECT_NEAR(2.60f, constraints.minimumScale, 0.01f);
+    EXPECT_NEAR(5.0f, constraints.maximumScale, 0.01f);
+    EXPECT_TRUE(page->viewportDescription().userZoom);
+}
+
 TEST_F(ViewportTest, viewportLegacyHandheldFriendly)
 {
     UseMockScrollbarSettings mockScrollbarSettings;
index 8896fc7..d248761 100644 (file)
@@ -5508,45 +5508,60 @@ TEST_F(WebFrameTest, ReloadBypassingCache)
     EXPECT_EQ(WebURLRequest::ReloadBypassingCache, frame->dataSource()->request().cachePolicy());
 }
 
-TEST_F(WebFrameTest, NodeImageTestCSSTransform)
+static void nodeImageTestValidation(const WebCore::IntSize& referenceBitmapSize, WebCore::DragImage* dragImage)
 {
-    FrameTestHelpers::WebViewHelper webViewHelper;
-    OwnPtr<WebCore::DragImage> dragImage = nodeImageTestSetup(&webViewHelper, std::string("case-css-transform"));
-    EXPECT_TRUE(dragImage);
-
+    // Prepare the reference bitmap.
     SkBitmap bitmap;
-    ASSERT_TRUE(bitmap.allocN32Pixels(40, 40));
+    ASSERT_TRUE(bitmap.allocN32Pixels(referenceBitmapSize.width(), referenceBitmapSize.height()));
     SkCanvas canvas(bitmap);
     canvas.drawColor(SK_ColorGREEN);
 
-    EXPECT_EQ(40, dragImage->size().width());
-    EXPECT_EQ(40, dragImage->size().height());
+    EXPECT_EQ(referenceBitmapSize.width(), dragImage->size().width());
+    EXPECT_EQ(referenceBitmapSize.height(), dragImage->size().height());
     const SkBitmap& dragBitmap = dragImage->bitmap();
     SkAutoLockPixels lockPixel(dragBitmap);
     EXPECT_EQ(0, memcmp(bitmap.getPixels(), dragBitmap.getPixels(), bitmap.getSize()));
 }
 
+TEST_F(WebFrameTest, NodeImageTestCSSTransform)
+{
+    FrameTestHelpers::WebViewHelper webViewHelper;
+    OwnPtr<WebCore::DragImage> dragImage = nodeImageTestSetup(&webViewHelper, std::string("case-css-transform"));
+    EXPECT_TRUE(dragImage);
+
+    nodeImageTestValidation(WebCore::IntSize(40, 40), dragImage.get());
+}
+
 TEST_F(WebFrameTest, NodeImageTestCSS3DTransform)
 {
     FrameTestHelpers::WebViewHelper webViewHelper;
     OwnPtr<WebCore::DragImage> dragImage = nodeImageTestSetup(&webViewHelper, std::string("case-css-3dtransform"));
     EXPECT_TRUE(dragImage);
 
-    SkBitmap bitmap;
-    ASSERT_TRUE(bitmap.allocN32Pixels(20, 40));
-    SkCanvas canvas(bitmap);
-    canvas.drawColor(SK_ColorGREEN);
+    nodeImageTestValidation(WebCore::IntSize(20, 40), dragImage.get());
+}
 
-    EXPECT_EQ(20, dragImage->size().width());
-    EXPECT_EQ(40, dragImage->size().height());
-    const SkBitmap& dragBitmap = dragImage->bitmap();
-    SkAutoLockPixels lockPixel(dragBitmap);
-    EXPECT_EQ(0, memcmp(bitmap.getPixels(), dragBitmap.getPixels(), bitmap.getSize()));
+TEST_F(WebFrameTest, NodeImageTestInlineBlock)
+{
+    FrameTestHelpers::WebViewHelper webViewHelper;
+    OwnPtr<WebCore::DragImage> dragImage = nodeImageTestSetup(&webViewHelper, std::string("case-inlineblock"));
+    EXPECT_TRUE(dragImage);
+
+    nodeImageTestValidation(WebCore::IntSize(40, 40), dragImage.get());
+}
+
+TEST_F(WebFrameTest, NodeImageTestFloatLeft)
+{
+    FrameTestHelpers::WebViewHelper webViewHelper;
+    OwnPtr<WebCore::DragImage> dragImage = nodeImageTestSetup(&webViewHelper, std::string("case-float-left-overflow-hidden"));
+    EXPECT_TRUE(dragImage);
+
+    nodeImageTestValidation(WebCore::IntSize(40, 40), dragImage.get());
 }
 
-class BrandColorTestWebFrameClient : public FrameTestHelpers::TestWebFrameClient {
+class ThemeColorTestWebFrameClient : public FrameTestHelpers::TestWebFrameClient {
 public:
-    BrandColorTestWebFrameClient()
+    ThemeColorTestWebFrameClient()
         : m_didNotify(false)
     {
     }
@@ -5562,7 +5577,7 @@ public:
     }
 
 private:
-    virtual void didChangeBrandColor()
+    virtual void didChangeThemeColor()
     {
         m_didNotify = true;
     }
@@ -5570,31 +5585,31 @@ private:
     bool m_didNotify;
 };
 
-TEST_F(WebFrameTest, BrandColor)
+TEST_F(WebFrameTest, ThemeColor)
 {
-    registerMockedHttpURLLoad("brand_color_test.html");
+    registerMockedHttpURLLoad("theme_color_test.html");
     FrameTestHelpers::WebViewHelper webViewHelper;
-    BrandColorTestWebFrameClient client;
-    webViewHelper.initializeAndLoad(m_baseURL + "brand_color_test.html", true, &client);
+    ThemeColorTestWebFrameClient client;
+    webViewHelper.initializeAndLoad(m_baseURL + "theme_color_test.html", true, &client);
     EXPECT_TRUE(client.didNotify());
     WebLocalFrameImpl* frame = webViewHelper.webViewImpl()->mainFrameImpl();
-    EXPECT_EQ(0xff0000ff, frame->document().brandColor());
+    EXPECT_EQ(0xff0000ff, frame->document().themeColor());
     // Change color by rgb.
     client.reset();
-    frame->executeScript(WebScriptSource("document.getElementById('bc1').setAttribute('content', 'rgb(0, 0, 0)');"));
+    frame->executeScript(WebScriptSource("document.getElementById('tc1').setAttribute('content', 'rgb(0, 0, 0)');"));
     EXPECT_TRUE(client.didNotify());
-    EXPECT_EQ(0xff000000, frame->document().brandColor());
+    EXPECT_EQ(0xff000000, frame->document().themeColor());
     // Change color by hsl.
     client.reset();
-    frame->executeScript(WebScriptSource("document.getElementById('bc1').setAttribute('content', 'hsl(240,100%, 50%)');"));
+    frame->executeScript(WebScriptSource("document.getElementById('tc1').setAttribute('content', 'hsl(240,100%, 50%)');"));
     EXPECT_TRUE(client.didNotify());
-    EXPECT_EQ(0xff0000ff, frame->document().brandColor());
-    // Change of second brand-color meta tag will not change frame's brand
+    EXPECT_EQ(0xff0000ff, frame->document().themeColor());
+    // Change of second theme-color meta tag will not change frame's theme
     // color.
     client.reset();
-    frame->executeScript(WebScriptSource("document.getElementById('bc2').setAttribute('content', '#00FF00');"));
+    frame->executeScript(WebScriptSource("document.getElementById('tc2').setAttribute('content', '#00FF00');"));
     EXPECT_TRUE(client.didNotify());
-    EXPECT_EQ(0xff0000ff, frame->document().brandColor());
+    EXPECT_EQ(0xff0000ff, frame->document().themeColor());
 }
 
 } // namespace
index 1d479d5..4d6dd81 100644 (file)
@@ -512,6 +512,17 @@ TEST_F(WebViewTest, InputMode)
     testInputMode(WebString("verbatim"), "input_mode_textarea_verbatim.html");
 }
 
+TEST_F(WebViewTest, TextInputInfoWithReplacedElements)
+{
+    std::string url = m_baseURL + "div_with_image.html";
+    URLTestHelpers::registerMockedURLLoad(toKURL(url), "div_with_image.html");
+    WebView* webView = m_webViewHelper.initializeAndLoad(url);
+    webView->setInitialFocus(false);
+    WebTextInputInfo info = webView->textInputInfo();
+
+    EXPECT_EQ("foo\xef\xbf\xbc", info.value.utf8());
+}
+
 TEST_F(WebViewTest, SetEditableSelectionOffsetsAndTextInputInfo)
 {
     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("input_field_populated.html"));
diff --git a/src/third_party/WebKit/Source/web/tests/data/brand_color_test.html b/src/third_party/WebKit/Source/web/tests/data/brand_color_test.html
deleted file mode 100644 (file)
index 630b882..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
- <html>
-  <head>
-  <meta id="bc1" name="brand-color" content="  blue   ">
-  <meta id="bc2" name="brand-color" content="  red   ">
-  </head>
-  <body>
-  </body>
-</html>
diff --git a/src/third_party/WebKit/Source/web/tests/data/div_with_image.html b/src/third_party/WebKit/Source/web/tests/data/div_with_image.html
new file mode 100644 (file)
index 0000000..0a2af6c
--- /dev/null
@@ -0,0 +1,3 @@
+<!DOCTYPE html>
+<div id="outer" contentEditable=true>foo<img src="foo.png"></div>
+
index e24e87a..846a2db 100644 (file)
         <div draggable="true" id="case-css-3dtransform" style="background-color: #00ff00;width: 40px;height: 40px;"></div>
     </div>
 </div>
+
+<div style="width: 40px">
+    <div style="display: inline-block">
+        <div draggable="true" id="case-inlineblock" style="background-color: #00ff00;width: 40px;height: 40px;"></div>
+    </div>
+</div>
+
+<div style="width: 40px">
+    <div style="overflow: hidden">
+        <div draggable="true" id="case-float-left-overflow-hidden" style="float: left;background-color: #00ff00;width: 40px;height: 40px;"></div>
+    </div>
+</div>
diff --git a/src/third_party/WebKit/Source/web/tests/data/theme_color_test.html b/src/third_party/WebKit/Source/web/tests/data/theme_color_test.html
new file mode 100644 (file)
index 0000000..8911469
--- /dev/null
@@ -0,0 +1,8 @@
+ <html>
+  <head>
+  <meta id="tc1" name="theme-color" content="  blue   ">
+  <meta id="tc2" name="theme-color" content="  red   ">
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/src/third_party/WebKit/Source/web/tests/data/viewport/viewport-138.html b/src/third_party/WebKit/Source/web/tests/data/viewport/viewport-138.html
new file mode 100644 (file)
index 0000000..5ae398e
--- /dev/null
@@ -0,0 +1,10 @@
+<head>
+    <title>width=123 proceded by trash with special unicode folding</title>
+    <!-- 2x LATIN CAPITAL LETTER I WITH DOT ABOVE followed by =ignore,width=123
+         During parsing the content will be converted to lower case with proper
+         unicode folding (F = full) meaning that the U+0130's each will be
+         converted into two chars - lowercase i followed by U+0307 (COMBINING
+         DOT ABOVE). This test case checks that we iterate over the lowered
+         string length and ends up with 123 as width, instead of 1. -->
+    <meta name="viewport" content="&#x0130;&#x0130;=ignore,width=123">
+</head>
index 8aadad3..b5baeb6 100644 (file)
       'win/WebFontRendering.cpp',
     ],
     'web_unittest_files': [
+      'WebNodeTest.cpp',
+      # FIXME: Move the tests to Source/web/.
       'tests/AssociatedURLLoaderTest.cpp',
       'tests/ChromeClientImplTest.cpp',
       'tests/CustomEventTest.cpp',
index 4e717d1..3e1fa69 100644 (file)
@@ -1618,6 +1618,10 @@ class Port(object):
                              ['--stable-release-mode',
                               '--force-compositing-mode']),
             VirtualTestSuite('stable',
+                             'http/tests/websocket',
+                             ['--stable-release-mode',
+                              '--force-compositing-mode']),
+            VirtualTestSuite('stable',
                              'web-animations-api',
                              ['--stable-release-mode',
                               '--force-compositing-mode']),
index 43549b4..1342016 100644 (file)
@@ -141,9 +141,6 @@ public:
 
     // Toggles scroll bottleneck rects on the HUD layer
     virtual void setShowScrollBottleneckRects(bool) { }
-
-    // FIXME: make pure virtual once the cc-side patch is in
-    virtual bool usesGpuRasterization() { return false; };
 };
 
 } // namespace blink
index 8daf03b..4e8b2f6 100644 (file)
@@ -82,8 +82,9 @@ public:
     BLINK_EXPORT WebString encoding() const;
     BLINK_EXPORT WebString contentLanguage() const;
     BLINK_EXPORT WebString referrer() const;
-    BLINK_EXPORT WebColor brandColor() const;
-
+    BLINK_EXPORT WebColor themeColor() const;
+    // TODO: Remove when chromium is changed to themeColor().
+    BLINK_EXPORT WebColor brandColor() const { return 0; }
     // The url of the OpenSearch Desription Document (if any).
     BLINK_EXPORT WebURL openSearchDescriptionURL() const;
 
index c75af85..271c652 100644 (file)
@@ -266,9 +266,11 @@ public:
     // The frame's manifest has changed.
     virtual void didChangeManifest(WebLocalFrame*) { }
 
-    // The frame's brand color has changed.
+    // TODO: Remove when chromium is changed to use didChangeThemeColor().
     virtual void didChangeBrandColor() { }
 
+    // The frame's theme color has changed.
+    virtual void didChangeThemeColor() { }
 
     // Misc ----------------------------------------------------------------
 
index 878d71b..a48f3cd 100644 (file)
@@ -35,7 +35,6 @@ class HitTestResult;
 namespace blink {
 
 class WebElement;
-class WebHitTestResultPrivate;
 class WebNode;
 class WebURL;
 struct WebPoint;
@@ -75,10 +74,11 @@ public:
 #if BLINK_IMPLEMENTATION
     WebHitTestResult(const WebCore::HitTestResult&);
     WebHitTestResult& operator=(const WebCore::HitTestResult&);
+    operator WebCore::HitTestResult() const;
 #endif
 
 protected:
-    WebPrivateOwnPtr<WebHitTestResultPrivate> m_private;
+    WebPrivateOwnPtr<WebCore::HitTestResult> m_private;
 };
 
 } // namespace blink
index d1fbaf7..df7f2c4 100755 (executable)
@@ -54,17 +54,17 @@ def ToolPath(tool, toolchain_info=None):
     toolchain_prefix = "arm-linux-androideabi"
     ndk = "ndk"
   elif ARCH == "arm64":
-    toolchain_source = "aarch64-linux-android-4.8"
+    toolchain_source = "aarch64-linux-android-4.9"
     toolchain_prefix = "aarch64-linux-android"
-    ndk = "ndk_experimental"
+    ndk = "ndk"
   elif ARCH == "x86":
     toolchain_source = "x86-4.6"
     toolchain_prefix = "i686-android-linux"
     ndk = "ndk"
   elif ARCH == "x86_64":
-    toolchain_source = "x86_64-4.8"
+    toolchain_source = "x86_64-4.9"
     toolchain_prefix = "x86_64-linux-android"
-    ndk = "ndk_experimental"
+    ndk = "ndk"
   elif ARCH == "mips":
     toolchain_source = "mipsel-linux-android-4.6"
     toolchain_prefix = "mipsel-linux-android"
@@ -95,7 +95,7 @@ def FindToolchain():
 
   ## Known toolchains, newer ones in the front.
   if ARCH == "arm64":
-    gcc_version = "4.8"
+    gcc_version = "4.9"
     known_toolchains = [
       ("aarch64-linux-android-" + gcc_version, "aarch64", "aarch64-linux-android")
     ]
@@ -110,7 +110,7 @@ def FindToolchain():
     ]
   elif ARCH =="x86_64":
     known_toolchains = [
-      ("x86_64-linux-android-4.8", "x86_64", "x86_64-linux-android")
+      ("x86_64-linux-android-4.9", "x86_64", "x86_64-linux-android")
     ]
   elif ARCH == "mips":
     gcc_version = "4.6"
index b8c7fa9..fdd7989 100644 (file)
@@ -1,6 +1,6 @@
 #include "precompiled.h"
 //
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -15,6 +15,7 @@
 #include "libGLESv2/main.h"
 #include "libGLESv2/formatutils.h"
 #include "libGLESv2/renderer/IndexBuffer.h"
+#include "libGLESv2/renderer/Renderer.h"
 
 namespace rx
 {
@@ -54,10 +55,11 @@ IndexDataManager::~IndexDataManager()
     delete mCountingBuffer;
 }
 
-static void convertIndices(GLenum type, const void *input, GLsizei count, void *output)
+static void convertIndices(GLenum sourceType, GLenum destinationType, const void *input, GLsizei count, void *output)
 {
-    if (type == GL_UNSIGNED_BYTE)
+    if (sourceType == GL_UNSIGNED_BYTE)
     {
+        ASSERT(destinationType == GL_UNSIGNED_SHORT);
         const GLubyte *in = static_cast<const GLubyte*>(input);
         GLushort *out = static_cast<GLushort*>(output);
 
@@ -66,13 +68,28 @@ static void convertIndices(GLenum type, const void *input, GLsizei count, void *
             out[i] = in[i];
         }
     }
-    else if (type == GL_UNSIGNED_INT)
+    else if (sourceType == GL_UNSIGNED_INT)
     {
+        ASSERT(destinationType == GL_UNSIGNED_INT);
         memcpy(output, input, count * sizeof(GLuint));
     }
-    else if (type == GL_UNSIGNED_SHORT)
+    else if (sourceType == GL_UNSIGNED_SHORT)
     {
-        memcpy(output, input, count * sizeof(GLushort));
+        if (destinationType == GL_UNSIGNED_SHORT)
+        {
+            memcpy(output, input, count * sizeof(GLushort));
+        }
+        else if (destinationType == GL_UNSIGNED_INT)
+        {
+            const GLushort *in = static_cast<const GLushort*>(input);
+            GLuint *out = static_cast<GLuint*>(output);
+
+            for (GLsizei i = 0; i < count; i++)
+            {
+                out[i] = in[i];
+            }
+        }
+        else UNREACHABLE();
     }
     else UNREACHABLE();
 }
@@ -155,21 +172,18 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
         indices = static_cast<const GLubyte*>(storage->getData()) + offset;
     }
 
-    StreamingIndexBufferInterface *streamingBuffer = (type == GL_UNSIGNED_INT) ? mStreamingBufferInt : mStreamingBufferShort;
-
     StaticIndexBufferInterface *staticBuffer = buffer ? buffer->getStaticIndexBuffer() : NULL;
-    IndexBufferInterface *indexBuffer = streamingBuffer;
+    IndexBufferInterface *indexBuffer = NULL;
     bool directStorage = alignedOffset && storage && storage->supportsDirectBinding() &&
                          destinationIndexType == type;
     unsigned int streamOffset = 0;
 
     if (directStorage)
     {
-        indexBuffer = streamingBuffer;
         streamOffset = offset;
 
         if (!buffer->getIndexRangeCache()->findRange(type, offset, count, &translated->minIndex,
-                                                     &translated->maxIndex, NULL))
+            &translated->maxIndex, NULL))
         {
             computeRange(type, indices, count, &translated->minIndex, &translated->maxIndex);
             buffer->getIndexRangeCache()->addRange(type, offset, count, translated->minIndex,
@@ -191,6 +205,22 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
     }
     else
     {
+        computeRange(type, indices, count, &translated->minIndex, &translated->maxIndex);
+    }
+
+    // Avoid D3D11's primitive restart index value
+    // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb205124(v=vs.85).aspx
+    if (translated->maxIndex == 0xFFFF && type == GL_UNSIGNED_SHORT && mRenderer->getMajorShaderModel() > 3)
+    {
+        destinationIndexType = GL_UNSIGNED_INT;
+        directStorage = false;
+        indexBuffer = NULL;
+    }
+
+    if (!directStorage && !indexBuffer)
+    {
+        indexBuffer = (destinationIndexType == GL_UNSIGNED_INT) ? mStreamingBufferInt : mStreamingBufferShort;
+
         unsigned int convertCount = count;
 
         if (staticBuffer)
@@ -234,7 +264,7 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
             return GL_OUT_OF_MEMORY;
         }
 
-        convertIndices(type, staticBuffer ? storage->getData() : indices, convertCount, output);
+        convertIndices(type, destinationIndexType, staticBuffer ? storage->getData() : indices, convertCount, output);
 
         if (!indexBuffer->unmapBuffer())
         {
@@ -242,8 +272,6 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
             return GL_OUT_OF_MEMORY;
         }
 
-        computeRange(type, indices, count, &translated->minIndex, &translated->maxIndex);
-
         if (staticBuffer)
         {
             streamOffset = (offset / gl::GetTypeBytes(type)) * gl::GetTypeBytes(destinationIndexType);
@@ -253,10 +281,11 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer
     }
 
     translated->storage = directStorage ? storage : NULL;
-    translated->indexBuffer = indexBuffer->getIndexBuffer();
+    translated->indexBuffer = indexBuffer ? indexBuffer->getIndexBuffer() : NULL;
     translated->serial = directStorage ? storage->getSerial() : indexBuffer->getSerial();
     translated->startIndex = streamOffset / gl::GetTypeBytes(destinationIndexType);
     translated->startOffset = streamOffset;
+    translated->indexType = destinationIndexType;
 
     if (buffer)
     {
index 0e77c81..70c7bf3 100644 (file)
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -39,6 +39,7 @@ struct TranslatedIndexData
 
     IndexBuffer *indexBuffer;
     BufferStorage *storage;
+    GLenum indexType;
     unsigned int serial;
 };
 
index c0ad111..f02e334 100644 (file)
@@ -1137,10 +1137,8 @@ GLenum Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementAr
 
     if (err == GL_NO_ERROR)
     {
-        IndexBuffer11* indexBuffer = IndexBuffer11::makeIndexBuffer11(indexInfo->indexBuffer);
-
         ID3D11Buffer *buffer = NULL;
-        DXGI_FORMAT bufferFormat = indexBuffer->getIndexFormat();
+        DXGI_FORMAT bufferFormat = (indexInfo->indexType == GL_UNSIGNED_INT) ? DXGI_FORMAT_R32_UINT : DXGI_FORMAT_R16_UINT;
 
         if (indexInfo->storage)
         {
@@ -1149,6 +1147,7 @@ GLenum Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementAr
         }
         else
         {
+            IndexBuffer11* indexBuffer = IndexBuffer11::makeIndexBuffer11(indexInfo->indexBuffer);
             buffer = indexBuffer->getBuffer();
         }
 
@@ -1372,7 +1371,7 @@ void Renderer11::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices,
 
     if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat || mAppliedIBOffset != indexBufferOffset)
     {
-        mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset);
+        mDeviceContext->IASetIndexBuffer(d3dIndexBuffer, indexFormat, indexBufferOffset);
         mAppliedIB = d3dIndexBuffer;
         mAppliedIBFormat = indexFormat;
         mAppliedIBOffset = indexBufferOffset;
@@ -1483,7 +1482,7 @@ void Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indic
 
     if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat || mAppliedIBOffset != indexBufferOffset)
     {
-        mDeviceContext->IASetIndexBuffer(indexBuffer->getBuffer(), indexBuffer->getIndexFormat(), indexBufferOffset);
+        mDeviceContext->IASetIndexBuffer(d3dIndexBuffer, indexFormat, indexBufferOffset);
         mAppliedIB = d3dIndexBuffer;
         mAppliedIBFormat = indexFormat;
         mAppliedIBOffset = indexBufferOffset;
index 9090607..739779d 100644 (file)
               }],
             ],
           },
+          'all_dependent_settings': {
+            'msvs_settings': {
+              'VCLinkerTool': {
+                'AdditionalDependencies': [
+                  'advapi32.lib',
+                ],
+              },
+            },
+          },
           'conditions': [
             [ 'use_system_icu==1 and want_separate_host_toolset==1', {
               'toolsets': ['host'],
             ['OS=="android"', {
               'direct_dependent_settings': {
                 'include_dirs': [
-                  '<(android_src)/external/icu4c/common',
-                  '<(android_src)/external/icu4c/i18n',
+                  '<(android_src)/external/icu/icu4c/source/common',
+                  '<(android_src)/external/icu/icu4c/source/i18n',
                 ],
               },
               'link_settings': {
index 1c6cad2..87ff224 100644 (file)
@@ -3,27 +3,16 @@
 # found in the LICENSE file.
 
 {
-  'target_defaults': {
-    'variables': {
-      # Performance gains are substantial on ARM (v7,v8) with -O3 over the
-      # default -Os configured in common.gypi.
-      'release_optimize': '3',
-      'debug_optimize': '3',
-    },
-  },
   'variables': {
     'conditions': [
-      ['target_arch=="arm" or target_arch=="armv7" or target_arch=="arm64"', {
+      ['((OS=="android" or chromeos==1) and target_arch=="arm") or (OS=="ios" and target_arch=="armv7")', {
         'use_opus_fixed_point%': 1,
-      }, {
-        'use_opus_fixed_point%': 0,
-      }],
-      ['target_arch=="arm" or target_arch=="armv7"', {
         'use_opus_arm_optimization%': 1,
       }, {
+        'use_opus_fixed_point%': 0,
         'use_opus_arm_optimization%': 0,
       }],
-      ['target_arch=="arm"', {
+      ['(OS=="android" or chromeos==1) and target_arch=="arm"', {
         'use_opus_rtcd%': 1,
       }, {
         'use_opus_rtcd%': 0,
@@ -66,7 +55,7 @@
             4334,  # Disable 32-bit shift warning in src/opus_encoder.c .
           ],
         }],
-        ['os_posix==1 and OS!="android"', {
+        [ 'os_posix==1 and OS!="android"', {
           # Suppress a warning given by opus_decoder.c that tells us
           # optimizations are turned off.
           'cflags': [
             ],
           },
         }],
+        ['os_posix==1 and (target_arch=="arm" or target_arch=="armv7" or target_arch=="arm64")', {
+          'cflags!': ['-Os'],
+          'cflags': ['-O3'],
+        }],
         ['use_opus_fixed_point==0', {
           'include_dirs': [
             'src/silk/float',
index a5ba796..1ca66f3 100644 (file)
@@ -464,7 +464,7 @@ DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int
 #endif
        }
        else
-       pContext->m_pDevice = FX_NEW CFX_WindowsDevice(dc);
+           pContext->m_pDevice = FX_NEW CFX_WindowsDevice(dc);
        if (flags & FPDF_NO_CATCH)
                Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
        else {
@@ -485,7 +485,7 @@ DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int
                                pDst->Create(pBitmap->GetWidth(), pBitmap->GetHeight(),FXDIB_Rgb32);
                                FXSYS_memcpy(pDst->GetBuffer(), pBitmap->GetBuffer(), pBitmap->GetPitch()*pBitmap->GetHeight());
 //                             WinDC.SetDIBits(pDst,0,0);
-                               WinDC.StretchDIBits(pDst,0,0,size_x*2,size_y*2);
+                               WinDC.StretchDIBits(pDst,0,0,size_x,size_y);
                                delete pDst;
                        }
                        else
index 5f1715f..e65d1fc 100644 (file)
@@ -37,7 +37,7 @@ protected:
     }
 
     virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
-        if (fCache.getBytesUsed() == 0) {
+        if (fCache.getTotalBytesUsed() == 0) {
             this->populateCache();
         }
 
index 2a7dddd..9e418d6 100644 (file)
     '../tests/RuntimeConfigTest.cpp',
     '../tests/SHA1Test.cpp',
     '../tests/ScalarTest.cpp',
+    '../tests/ScaledImageCache.cpp',
     '../tests/SerializationTest.cpp',
     '../tests/ShaderImageFilterTest.cpp',
     '../tests/ShaderOpacityTest.cpp',
index 2667a38..e7865ca 100644 (file)
@@ -79,9 +79,47 @@ public:
      */
     static void PurgeFontCache();
 
-    static size_t GetImageCacheBytesUsed();
-    static size_t GetImageCacheByteLimit();
-    static size_t SetImageCacheByteLimit(size_t newLimit);
+    /**
+     *  Scaling bitmaps with the SkPaint::kHigh_FilterLevel setting is
+     *  expensive, so the result is saved in the global Scaled Image
+     *  Cache.
+     *
+     *  This function returns the memory usage of the Scaled Image Cache.
+     */
+    static size_t GetImageCacheTotalBytesUsed();
+    /**
+     *  These functions get/set the memory usage limit for the Scaled
+     *  Image Cache.  Bitmaps are purged from the cache when the
+     *  memory useage exceeds this limit.
+     */
+    static size_t GetImageCacheTotalByteLimit();
+    static size_t SetImageCacheTotalByteLimit(size_t newLimit);
+
+    // DEPRECATED
+    static size_t GetImageCacheBytesUsed() {
+        return GetImageCacheTotalBytesUsed();
+    }
+    // DEPRECATED
+    static size_t GetImageCacheByteLimit() {
+        return GetImageCacheTotalByteLimit();
+    }
+    // DEPRECATED
+    static size_t SetImageCacheByteLimit(size_t newLimit) {
+        return SetImageCacheTotalByteLimit(newLimit);
+    }
+
+    /**
+     *  Scaling bitmaps with the SkPaint::kHigh_FilterLevel setting is
+     *  expensive, so the result is saved in the global Scaled Image
+     *  Cache.  When the resulting bitmap is too large, this can
+     *  overload the cache.  If the ImageCacheSingleAllocationByteLimit
+     *  is set to a non-zero number, and the resulting bitmap would be
+     *  larger than that value, the bitmap scaling algorithm falls
+     *  back onto a cheaper algorithm and does not cache the result.
+     *  Zero is the default value.
+     */
+    static size_t GetImageCacheSingleAllocationByteLimit();
+    static size_t SetImageCacheSingleAllocationByteLimit(size_t newLimit);
 
     /**
      *  Applications with command line options may pass optional state, such
index f8266c9..6ea7b10 100644 (file)
@@ -13,9 +13,9 @@
 class SkCanvasState;
 
 /**
- * A set of functions that are useful for copying an SkCanvas across a library
- * boundary where the Skia libraries on either side of the boundary may not be
- * version identical.  The expected usage is outline below...
+ * A set of functions that are useful for copying the state of an SkCanvas
+ * across a library boundary where the Skia library on the other side of the
+ * boundary may be newer. The expected usage is outline below...
  *
  *                          Lib Boundary
  * CaptureCanvasState(...)      |||
@@ -30,8 +30,8 @@ class SkCanvasState;
 namespace SkCanvasStateUtils {
     /**
      * Captures the current state of the canvas into an opaque ptr that is safe
-     * to pass between different instances of Skia (which may or may not be the
-     * same version). The function will return NULL in the event that one of the
+     * to pass to a different instance of Skia (which may be the same version,
+     * or may be newer). The function will return NULL in the event that one of the
      * following conditions are true.
      *  1) the canvas device type is not supported (currently only raster is supported)
      *  2) the canvas clip type is not supported (currently only non-AA clips are supported)
@@ -56,7 +56,7 @@ namespace SkCanvasStateUtils {
      *  1) the captured state is in an unrecognized format
      *  2) the captured canvas device type is not supported
      *
-     * @param canvas The canvas you wish to capture the current state of.
+     * @param state Opaque object created by CaptureCanvasState.
      * @return NULL or an SkCanvas* whose devices and matrix/clip state are
      *         identical to the captured canvas. The caller is responsible for
      *         calling unref on the SkCanvas.
@@ -66,7 +66,8 @@ namespace SkCanvasStateUtils {
     /**
      * Free the memory associated with the captured canvas state.  The state
      * should not be released until all SkCanvas objects created using that
-     * state have been dereferenced.
+     * state have been dereferenced. Must be called from the same library
+     * instance that created the state via CaptureCanvasState.
      *
      * @param state The captured state you wish to dispose of.
      */
index f6f9f3f..137bcda 100644 (file)
@@ -127,6 +127,21 @@ private:
 };
 #define AutoScaledCacheUnlocker(...) SK_REQUIRE_LOCAL_VAR(AutoScaledCacheUnlocker)
 
+// Check to see that the size of the bitmap that would be produced by
+// scaling by the given inverted matrix is less than the maximum allowed.
+static inline bool cache_size_okay(const SkBitmap& bm, const SkMatrix& invMat) {
+    size_t maximumAllocation
+        = SkScaledImageCache::GetSingleAllocationByteLimit();
+    if (0 == maximumAllocation) {
+        return true;
+    }
+    // float matrixScaleFactor = 1.0 / (invMat.scaleX * invMat.scaleY);
+    // return ((origBitmapSize * matrixScaleFactor) < maximumAllocationSize);
+    // Skip the division step:
+    return bm.info().getSafeSize(bm.info().minRowBytes())
+        < (maximumAllocation * invMat.getScaleX() * invMat.getScaleY());
+}
+
 // TODO -- we may want to pass the clip into this function so we only scale
 // the portion of the image that we're going to need.  This will complicate
 // the interface to the cache, but might be well worth it.
@@ -140,14 +155,14 @@ bool SkBitmapProcState::possiblyScaleImage() {
     if (fFilterLevel <= SkPaint::kLow_FilterLevel) {
         return false;
     }
-
     // Check to see if the transformation matrix is simple, and if we're
     // doing high quality scaling.  If so, do the bitmap scale here and
     // remove the scaling component from the matrix.
 
     if (SkPaint::kHigh_FilterLevel == fFilterLevel &&
         fInvMatrix.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask) &&
-        kN32_SkColorType == fOrigBitmap.colorType()) {
+        kN32_SkColorType == fOrigBitmap.colorType() &&
+        cache_size_okay(fOrigBitmap, fInvMatrix)) {
 
         SkScalar invScaleX = fInvMatrix.getScaleX();
         SkScalar invScaleY = fInvMatrix.getScaleY();
index 0e97fac..0f5cf90 100644 (file)
@@ -434,7 +434,7 @@ void BGRAConvolve2D(const unsigned char* sourceData,
         }
 
         // Compute where in the output image this row of final data will go.
-        unsigned char* curOutputRow = &output[outY * outputByteRowStride];
+        unsigned char* curOutputRow = &output[(uint64_t)outY * outputByteRowStride];
 
         // Get the list of rows that the circular buffer has, in order.
         int firstRowInCircularBuffer;
index f266f97..43ff7ef 100644 (file)
@@ -165,12 +165,13 @@ void SkScaledImageCache::init() {
 #else
     fHash = NULL;
 #endif
-    fBytesUsed = 0;
+    fTotalBytesUsed = 0;
     fCount = 0;
+    fSingleAllocationByteLimit = 0;
     fAllocator = NULL;
 
     // One of these should be explicit set by the caller after we return.
-    fByteLimit = 0;
+    fTotalByteLimit = 0;
     fDiscardableFactory = NULL;
 }
 
@@ -266,7 +267,8 @@ private:
 bool SkScaledImageCacheDiscardableAllocator::allocPixelRef(SkBitmap* bitmap,
                                                        SkColorTable* ctable) {
     size_t size = bitmap->getSize();
-    if (0 == size) {
+    uint64_t size64 = bitmap->computeSize64();
+    if (0 == size || size64 > (uint64_t)size) {
         return false;
     }
 
@@ -296,7 +298,7 @@ SkScaledImageCache::SkScaledImageCache(DiscardableFactory factory) {
 
 SkScaledImageCache::SkScaledImageCache(size_t byteLimit) {
     this->init();
-    fByteLimit = byteLimit;
+    fTotalByteLimit = byteLimit;
 }
 
 SkScaledImageCache::~SkScaledImageCache() {
@@ -501,10 +503,10 @@ void SkScaledImageCache::purgeAsNeeded() {
         byteLimit = SK_MaxU32;  // no limit based on bytes
     } else {
         countLimit = SK_MaxS32; // no limit based on count
-        byteLimit = fByteLimit;
+        byteLimit = fTotalByteLimit;
     }
 
-    size_t bytesUsed = fBytesUsed;
+    size_t bytesUsed = fTotalBytesUsed;
     int    countUsed = fCount;
 
     Rec* rec = fTail;
@@ -530,13 +532,13 @@ void SkScaledImageCache::purgeAsNeeded() {
         rec = prev;
     }
 
-    fBytesUsed = bytesUsed;
+    fTotalBytesUsed = bytesUsed;
     fCount = countUsed;
 }
 
-size_t SkScaledImageCache::setByteLimit(size_t newLimit) {
-    size_t prevLimit = fByteLimit;
-    fByteLimit = newLimit;
+size_t SkScaledImageCache::setTotalByteLimit(size_t newLimit) {
+    size_t prevLimit = fTotalByteLimit;
+    fTotalByteLimit = newLimit;
     if (newLimit < prevLimit) {
         this->purgeAsNeeded();
     }
@@ -596,7 +598,7 @@ void SkScaledImageCache::addToHead(Rec* rec) {
     if (!fTail) {
         fTail = rec;
     }
-    fBytesUsed += rec->bytesUsed();
+    fTotalBytesUsed += rec->bytesUsed();
     fCount += 1;
 
     this->validate();
@@ -608,14 +610,14 @@ void SkScaledImageCache::addToHead(Rec* rec) {
 void SkScaledImageCache::validate() const {
     if (NULL == fHead) {
         SkASSERT(NULL == fTail);
-        SkASSERT(0 == fBytesUsed);
+        SkASSERT(0 == fTotalBytesUsed);
         return;
     }
 
     if (fHead == fTail) {
         SkASSERT(NULL == fHead->fPrev);
         SkASSERT(NULL == fHead->fNext);
-        SkASSERT(fHead->bytesUsed() == fBytesUsed);
+        SkASSERT(fHead->bytesUsed() == fTotalBytesUsed);
         return;
     }
 
@@ -630,7 +632,7 @@ void SkScaledImageCache::validate() const {
     while (rec) {
         count += 1;
         used += rec->bytesUsed();
-        SkASSERT(used <= fBytesUsed);
+        SkASSERT(used <= fTotalBytesUsed);
         rec = rec->fNext;
     }
     SkASSERT(fCount == count);
@@ -660,10 +662,20 @@ void SkScaledImageCache::dump() const {
     }
 
     SkDebugf("SkScaledImageCache: count=%d bytes=%d locked=%d %s\n",
-             fCount, fBytesUsed, locked,
+             fCount, fTotalBytesUsed, locked,
              fDiscardableFactory ? "discardable" : "malloc");
 }
 
+size_t SkScaledImageCache::setSingleAllocationByteLimit(size_t newLimit) {
+    size_t oldLimit = fSingleAllocationByteLimit;
+    fSingleAllocationByteLimit = newLimit;
+    return oldLimit;
+}
+
+size_t SkScaledImageCache::getSingleAllocationByteLimit() const {
+    return fSingleAllocationByteLimit;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "SkThread.h"
@@ -750,19 +762,19 @@ void SkScaledImageCache::Unlock(SkScaledImageCache::ID* id) {
 //    get_cache()->dump();
 }
 
-size_t SkScaledImageCache::GetBytesUsed() {
+size_t SkScaledImageCache::GetTotalBytesUsed() {
     SkAutoMutexAcquire am(gMutex);
-    return get_cache()->getBytesUsed();
+    return get_cache()->getTotalBytesUsed();
 }
 
-size_t SkScaledImageCache::GetByteLimit() {
+size_t SkScaledImageCache::GetTotalByteLimit() {
     SkAutoMutexAcquire am(gMutex);
-    return get_cache()->getByteLimit();
+    return get_cache()->getTotalByteLimit();
 }
 
-size_t SkScaledImageCache::SetByteLimit(size_t newLimit) {
+size_t SkScaledImageCache::SetTotalByteLimit(size_t newLimit) {
     SkAutoMutexAcquire am(gMutex);
-    return get_cache()->setByteLimit(newLimit);
+    return get_cache()->setTotalByteLimit(newLimit);
 }
 
 SkBitmap::Allocator* SkScaledImageCache::GetAllocator() {
@@ -775,18 +787,37 @@ void SkScaledImageCache::Dump() {
     get_cache()->dump();
 }
 
+size_t SkScaledImageCache::SetSingleAllocationByteLimit(size_t size) {
+    SkAutoMutexAcquire am(gMutex);
+    return get_cache()->setSingleAllocationByteLimit(size);
+}
+
+size_t SkScaledImageCache::GetSingleAllocationByteLimit() {
+    SkAutoMutexAcquire am(gMutex);
+    return get_cache()->getSingleAllocationByteLimit();
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "SkGraphics.h"
 
-size_t SkGraphics::GetImageCacheBytesUsed() {
-    return SkScaledImageCache::GetBytesUsed();
+size_t SkGraphics::GetImageCacheTotalBytesUsed() {
+    return SkScaledImageCache::GetTotalBytesUsed();
+}
+
+size_t SkGraphics::GetImageCacheTotalByteLimit() {
+    return SkScaledImageCache::GetTotalByteLimit();
 }
 
-size_t SkGraphics::GetImageCacheByteLimit() {
-    return SkScaledImageCache::GetByteLimit();
+size_t SkGraphics::SetImageCacheTotalByteLimit(size_t newLimit) {
+    return SkScaledImageCache::SetTotalByteLimit(newLimit);
 }
 
-size_t SkGraphics::SetImageCacheByteLimit(size_t newLimit) {
-    return SkScaledImageCache::SetByteLimit(newLimit);
+size_t SkGraphics::GetImageCacheSingleAllocationByteLimit() {
+    return SkScaledImageCache::GetSingleAllocationByteLimit();
 }
+
+size_t SkGraphics::SetImageCacheSingleAllocationByteLimit(size_t newLimit) {
+    return SkScaledImageCache::SetSingleAllocationByteLimit(newLimit);
+}
+
index fe07230..817147e 100644 (file)
@@ -60,9 +60,12 @@ public:
 
     static void Unlock(ID*);
 
-    static size_t GetBytesUsed();
-    static size_t GetByteLimit();
-    static size_t SetByteLimit(size_t newLimit);
+    static size_t GetTotalBytesUsed();
+    static size_t GetTotalByteLimit();
+    static size_t SetTotalByteLimit(size_t newLimit);
+
+    static size_t SetSingleAllocationByteLimit(size_t);
+    static size_t GetSingleAllocationByteLimit();
 
     static SkBitmap::Allocator* GetAllocator();
 
@@ -76,9 +79,9 @@ public:
     /**
      *  Construct the cache to call DiscardableFactory when it
      *  allocates memory for the pixels. In this mode, the cache has
-     *  not explicit budget, and so methods like getBytesUsed() and
-     *  getByteLimit() will return 0, and setByteLimit will ignore its argument
-     *  and return 0.
+     *  not explicit budget, and so methods like getTotalBytesUsed()
+     *  and getTotalByteLimit() will return 0, and setTotalByteLimit
+     *  will ignore its argument and return 0.
      */
     SkScaledImageCache(DiscardableFactory);
 
@@ -86,7 +89,7 @@ public:
      *  Construct the cache, allocating memory with malloc, and respect the
      *  byteLimit, purging automatically when a new image is added to the cache
      *  that pushes the total bytesUsed over the limit. Note: The limit can be
-     *  changed at runtime with setByteLimit.
+     *  changed at runtime with setTotalByteLimit.
      */
     SkScaledImageCache(size_t byteLimit);
 
@@ -144,15 +147,22 @@ public:
      */
     void unlock(ID*);
 
-    size_t getBytesUsed() const { return fBytesUsed; }
-    size_t getByteLimit() const { return fByteLimit; }
+    size_t getTotalBytesUsed() const { return fTotalBytesUsed; }
+    size_t getTotalByteLimit() const { return fTotalByteLimit; }
 
     /**
+     *  This is respected by SkBitmapProcState::possiblyScaleImage.
+     *  0 is no maximum at all; this is the default.
+     *  setSingleAllocationByteLimit() returns the previous value.
+     */
+    size_t setSingleAllocationByteLimit(size_t maximumAllocationSize);
+    size_t getSingleAllocationByteLimit() const;
+    /**
      *  Set the maximum number of bytes available to this cache. If the current
      *  cache exceeds this new value, it will be purged to try to fit within
      *  this new limit.
      */
-    size_t setByteLimit(size_t newLimit);
+    size_t setTotalByteLimit(size_t newLimit);
 
     SkBitmap::Allocator* allocator() const { return fAllocator; };
 
@@ -175,8 +185,9 @@ private:
     // the allocator is NULL or one that matches discardables
     SkBitmap::Allocator* fAllocator;
 
-    size_t  fBytesUsed;
-    size_t  fByteLimit;
+    size_t  fTotalBytesUsed;
+    size_t  fTotalByteLimit;
+    size_t  fSingleAllocationByteLimit;
     int     fCount;
 
     Rec* findAndLock(uint32_t generationID, SkScalar sx, SkScalar sy,
index b60fa84..bd1df79 100644 (file)
@@ -450,6 +450,8 @@ public:
     private:
         GrGLUniformManager::UniformHandle fMatrixHandle;
         GrGLUniformManager::UniformHandle fVectorHandle;
+
+        typedef GrGLEffect INHERITED;
     };
 
 private:
@@ -462,7 +464,7 @@ private:
 
     SkColorMatrix fMatrix;
 
-    typedef GrGLEffect INHERITED;
+    typedef GrEffect INHERITED;
 };
 
 GR_DEFINE_EFFECT_TEST(ColorMatrixEffect);
index 42f9841..28d41c1 100644 (file)
@@ -18,6 +18,7 @@
 #include "SkOTTable_EBLC.h"
 #include "SkOTTable_EBSC.h"
 #include "SkOTTable_gasp.h"
+#include "SkOTTable_maxp.h"
 #include "SkPath.h"
 #include "SkScalerContext.h"
 #include "SkScalerContext_win_dw.h"
 #include "SkTypeface_win_dw.h"
 
 #include <dwrite.h>
+#include <dwrite_1.h>
 
 static bool isLCD(const SkScalerContext::Rec& rec) {
     return SkMask::kLCD16_Format == rec.fMaskFormat ||
            SkMask::kLCD32_Format == rec.fMaskFormat;
 }
 
+static bool is_hinted_without_gasp(DWriteFontTypeface* typeface) {
+    AutoTDWriteTable<SkOTTableMaximumProfile> maxp(typeface->fDWriteFontFace.get());
+    if (!maxp.fExists) {
+        return false;
+    }
+    if (maxp.fSize < sizeof(SkOTTableMaximumProfile::Version::TT)) {
+        return false;
+    }
+    if (maxp->version.version != SkOTTableMaximumProfile::Version::TT::VERSION) {
+        return false;
+    }
+
+    if (0 == maxp->version.tt.maxSizeOfInstructions) {
+        // No hints.
+        return false;
+    }
+
+    AutoTDWriteTable<SkOTTableGridAndScanProcedure> gasp(typeface->fDWriteFontFace.get());
+    return !gasp.fExists;
+}
+
 /** A PPEMRange is inclusive, [min, max]. */
 struct PPEMRange {
     int min;
@@ -254,6 +277,17 @@ SkScalerContext_DW::SkScalerContext_DW(DWriteFontTypeface* typeface,
         fTextSizeMeasure = gdiTextSize;
         fMeasuringMode = DWRITE_MEASURING_MODE_GDI_CLASSIC;
 
+    // Fonts that have hints but no gasp table get non-symmetric rendering.
+    // Usually such fonts have low quality hints which were never tested
+    // with anything but GDI ClearType classic. Such fonts often rely on
+    // drop out control in the y direction in order to be legible.
+    } else if (is_hinted_without_gasp(typeface)) {
+        fTextSizeRender = gdiTextSize;
+        fRenderingMode = DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL;
+        fTextureType = DWRITE_TEXTURE_CLEARTYPE_3x1;
+        fTextSizeMeasure = realTextSize;
+        fMeasuringMode = DWRITE_MEASURING_MODE_NATURAL;
+
     // The normal case is to use natural symmetric rendering and linear metrics.
     } else {
         fTextSizeRender = realTextSize;
@@ -358,6 +392,9 @@ void SkScalerContext_DW::generateAdvance(SkGlyph* glyph) {
     if (DWRITE_MEASURING_MODE_GDI_CLASSIC == fMeasuringMode ||
         DWRITE_MEASURING_MODE_GDI_NATURAL == fMeasuringMode)
     {
+        // DirectWrite produced 'compatible' metrics, but while close,
+        // the end result is not always an integer as it would be with GDI.
+        vecs[0].fX = SkScalarRoundToScalar(advanceX);
         fG_inv.mapVectors(vecs, SK_ARRAY_COUNT(vecs));
     } else {
         fSkXform.mapVectors(vecs, SK_ARRAY_COUNT(vecs));
@@ -457,10 +494,8 @@ void SkScalerContext_DW::generateFontMetrics(SkPaint::FontMetrics* mx,
     }
 
     if (my) {
-        my->fTop = -fTextSizeRender * SkIntToScalar(dwfm.ascent) / upem;
-        my->fAscent = my->fTop;
+        my->fAscent = -fTextSizeRender * SkIntToScalar(dwfm.ascent) / upem;
         my->fDescent = fTextSizeRender * SkIntToScalar(dwfm.descent) / upem;
-        my->fBottom = my->fDescent;
         my->fLeading = fTextSizeRender * SkIntToScalar(dwfm.lineGap) / upem;
         my->fXHeight = fTextSizeRender * SkIntToScalar(dwfm.xHeight) / upem;
         my->fUnderlineThickness = fTextSizeRender * SkIntToScalar(dwfm.underlineThickness) / upem;
@@ -468,6 +503,33 @@ void SkScalerContext_DW::generateFontMetrics(SkPaint::FontMetrics* mx,
 
         my->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag;
         my->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag;
+
+        if (NULL != fTypeface->fDWriteFontFace1.get()) {
+            DWRITE_FONT_METRICS1 dwfm1;
+            fTypeface->fDWriteFontFace1->GetMetrics(&dwfm1);
+            my->fTop = -fTextSizeRender * SkIntToScalar(dwfm1.glyphBoxTop) / upem;
+            my->fBottom = -fTextSizeRender * SkIntToScalar(dwfm1.glyphBoxBottom) / upem;
+            my->fXMin = fTextSizeRender * SkIntToScalar(dwfm1.glyphBoxLeft) / upem;
+            my->fXMax = fTextSizeRender * SkIntToScalar(dwfm1.glyphBoxRight) / upem;
+
+            my->fMaxCharWidth = my->fXMax - my->fXMin;
+        } else {
+            AutoTDWriteTable<SkOTTableHead> head(fTypeface->fDWriteFontFace.get());
+            if (head.fExists &&
+                head.fSize >= sizeof(SkOTTableHead) &&
+                head->version == SkOTTableHead::version1)
+            {
+                my->fTop = -fTextSizeRender * (int16_t)SkEndian_SwapBE16(head->yMax) / upem;
+                my->fBottom = -fTextSizeRender * (int16_t)SkEndian_SwapBE16(head->yMin) / upem;
+                my->fXMin = fTextSizeRender * (int16_t)SkEndian_SwapBE16(head->xMin) / upem;
+                my->fXMax = fTextSizeRender * (int16_t)SkEndian_SwapBE16(head->xMax) / upem;
+
+                my->fMaxCharWidth = my->fXMax - my->fXMin;
+            } else {
+                my->fTop = my->fAscent;
+                my->fBottom = my->fDescent;
+            }
+        }
     }
 }
 
index b064ce5..465db34 100644 (file)
@@ -17,6 +17,7 @@
 #include "SkTypes.h"
 
 #include <dwrite.h>
+#include <dwrite_1.h>
 
 class SkFontDescriptor;
 struct SkScalerContextRec;
@@ -50,7 +51,13 @@ private:
         , fDWriteFontFamily(SkRefComPtr(fontFamily))
         , fDWriteFont(SkRefComPtr(font))
         , fDWriteFontFace(SkRefComPtr(fontFace))
-    { }
+    {
+        if (!SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace1))) {
+            // IUnknown::QueryInterface states that if it fails, punk will be set to NULL.
+            // http://blogs.msdn.com/b/oldnewthing/archive/2004/03/26/96777.aspx
+            SK_ALWAYSBREAK(NULL == fDWriteFontFace1.get());
+        }
+    }
 
 public:
     SkTScopedComPtr<IDWriteFactory> fFactory;
@@ -59,6 +66,7 @@ public:
     SkTScopedComPtr<IDWriteFontFamily> fDWriteFontFamily;
     SkTScopedComPtr<IDWriteFont> fDWriteFont;
     SkTScopedComPtr<IDWriteFontFace> fDWriteFontFace;
+    SkTScopedComPtr<IDWriteFontFace1> fDWriteFontFace1;
 
     static DWriteFontTypeface* Create(IDWriteFactory* factory,
                                       IDWriteFontFace* fontFace,
index eaee61b..e286c91 100644 (file)
 #include "SkErrorInternals.h"
 #include "SkWriter32.h"
 
-#define CANVAS_STATE_VERSION 1
 /*
  * WARNING: The structs below are part of a stable ABI and as such we explicitly
  * use unambigious primitives (e.g. int32_t instead of an enum).
  *
- * ANY CHANGES TO THE STRUCTS BELOW THAT IMPACT THE ABI SHOULD RESULT IN AN
- * UPDATE OF THE CANVAS_STATE_VERSION. SUCH CHANGES SHOULD ONLY BE MADE IF
- * ABSOLUTELY NECESSARY!
+ * ANY CHANGES TO THE STRUCTS BELOW THAT IMPACT THE ABI SHOULD RESULT IN A NEW
+ * NEW SUBCLASS OF SkCanvasState. SUCH CHANGES SHOULD ONLY BE MADE IF ABSOLUTELY
+ * NECESSARY!
  */
 enum RasterConfigs {
   kUnknown_RasterConfig   = 0,
@@ -48,7 +47,8 @@ struct SkMCState {
     ClipRect* clipRects;
 };
 
-// NOTE: If you add more members, bump CanvasState::version.
+// NOTE: If you add more members, create a new subclass of SkCanvasState with a
+// new CanvasState::version.
 struct SkCanvasLayerState {
     CanvasBackend type;
     int32_t x, y;
@@ -60,7 +60,7 @@ struct SkCanvasLayerState {
     union {
         struct {
             RasterConfig config; // pixel format: a value from RasterConfigs.
-            size_t rowBytes;     // Number of bytes from start of one line to next.
+            uint64_t rowBytes;   // Number of bytes from start of one line to next.
             void* pixels;        // The pixels, all (height * rowBytes) of them.
         } raster;
         struct {
@@ -71,20 +71,41 @@ struct SkCanvasLayerState {
 
 class SkCanvasState {
 public:
-    SkCanvasState(SkCanvas* canvas) {
+    SkCanvasState(int32_t version, SkCanvas* canvas) {
         SkASSERT(canvas);
-        version = CANVAS_STATE_VERSION;
-        width = canvas->getDeviceSize().width();
-        height = canvas->getDeviceSize().height();
+        this->version = version;
+        width = canvas->getBaseLayerSize().width();
+        height = canvas->getBaseLayerSize().height();
+
+    }
+
+    /**
+     * The version this struct was built with.  This field must always appear
+     * first in the struct so that when the versions don't match (and the
+     * remaining contents and size are potentially different) we can still
+     * compare the version numbers.
+     */
+    int32_t version;
+    int32_t width;
+    int32_t height;
+    int32_t alignmentPadding;
+};
+
+class SkCanvasState_v1 : public SkCanvasState {
+public:
+    static const int32_t kVersion = 1;
+
+    SkCanvasState_v1(SkCanvas* canvas)
+    : INHERITED(kVersion, canvas)
+    {
         layerCount = 0;
         layers = NULL;
-        originalCanvas = SkRef(canvas);
-
         mcState.clipRectCount = 0;
         mcState.clipRects = NULL;
+        originalCanvas = SkRef(canvas);
     }
 
-    ~SkCanvasState() {
+    ~SkCanvasState_v1() {
         // loop through the layers and free the data allocated to the clipRects
         for (int i = 0; i < layerCount; ++i) {
             sk_free(layers[i].mcState.clipRects);
@@ -98,24 +119,13 @@ public:
         originalCanvas->unref();
     }
 
-    /**
-     * The version this struct was built with.  This field must always appear
-     * first in the struct so that when the versions don't match (and the
-     * remaining contents and size are potentially different) we can still
-     * compare the version numbers.
-     */
-    int32_t version;
-
-    int32_t width;
-    int32_t height;
-
     SkMCState mcState;
 
     int32_t layerCount;
     SkCanvasLayerState* layers;
-
 private:
     SkCanvas* originalCanvas;
+    typedef SkCanvasState INHERITED;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -191,7 +201,7 @@ SkCanvasState* SkCanvasStateUtils::CaptureCanvasState(SkCanvas* canvas) {
         return NULL;
     }
 
-    SkAutoTDelete<SkCanvasState> canvasState(SkNEW_ARGS(SkCanvasState, (canvas)));
+    SkAutoTDelete<SkCanvasState_v1> canvasState(SkNEW_ARGS(SkCanvasState_v1, (canvas)));
 
     // decompose the total matrix and clip
     setup_MC_state(&canvasState->mcState, canvas->getTotalMatrix(),
@@ -247,7 +257,7 @@ SkCanvasState* SkCanvasStateUtils::CaptureCanvasState(SkCanvas* canvas) {
 
     // for now, just ignore any client supplied DrawFilter.
     if (canvas->getDrawFilter()) {
-//        SkDEBUGF(("CaptureCanvasState will ignore the canvases draw filter.\n"));
+//        SkDEBUGF(("CaptureCanvasState will ignore the canvas's draw filter.\n"));
     }
 
     return canvasState.detach();
@@ -291,7 +301,7 @@ static SkCanvas* create_canvas_from_canvas_layer(const SkCanvasLayerState& layer
 
     bitmap.installPixels(SkImageInfo::Make(layerState.width, layerState.height,
                                            colorType, kPremul_SkAlphaType),
-                         layerState.raster.pixels, layerState.raster.rowBytes);
+                         layerState.raster.pixels, (size_t) layerState.raster.rowBytes);
 
     SkASSERT(!bitmap.empty());
     SkASSERT(!bitmap.isNull());
@@ -306,30 +316,28 @@ static SkCanvas* create_canvas_from_canvas_layer(const SkCanvasLayerState& layer
 
 SkCanvas* SkCanvasStateUtils::CreateFromCanvasState(const SkCanvasState* state) {
     SkASSERT(state);
+    // Currently there is only one possible version.
+    SkASSERT(SkCanvasState_v1::kVersion == state->version);
 
-    // check that the versions match
-    if (CANVAS_STATE_VERSION != state->version) {
-        SkDebugf("CreateFromCanvasState version does not match the one use to create the input");
-        return NULL;
-    }
+    const SkCanvasState_v1* state_v1 = static_cast<const SkCanvasState_v1*>(state);
 
-    if (state->layerCount < 1) {
+    if (state_v1->layerCount < 1) {
         return NULL;
     }
 
     SkAutoTUnref<SkCanvasStack> canvas(SkNEW_ARGS(SkCanvasStack, (state->width, state->height)));
 
     // setup the matrix and clip on the n-way canvas
-    setup_canvas_from_MC_state(state->mcState, canvas);
+    setup_canvas_from_MC_state(state_v1->mcState, canvas);
 
     // Iterate over the layers and add them to the n-way canvas
-    for (int i = state->layerCount - 1; i >= 0; --i) {
-        SkAutoTUnref<SkCanvas> canvasLayer(create_canvas_from_canvas_layer(state->layers[i]));
+    for (int i = state_v1->layerCount - 1; i >= 0; --i) {
+        SkAutoTUnref<SkCanvas> canvasLayer(create_canvas_from_canvas_layer(state_v1->layers[i]));
         if (!canvasLayer.get()) {
             return NULL;
         }
-        canvas->pushCanvas(canvasLayer.get(), SkIPoint::Make(state->layers[i].x,
-                                                             state->layers[i].y));
+        canvas->pushCanvas(canvasLayer.get(), SkIPoint::Make(state_v1->layers[i].x,
+                                                             state_v1->layers[i].y));
     }
 
     return canvas.detach();
@@ -338,5 +346,9 @@ SkCanvas* SkCanvasStateUtils::CreateFromCanvasState(const SkCanvasState* state)
 ////////////////////////////////////////////////////////////////////////////////
 
 void SkCanvasStateUtils::ReleaseCanvasState(SkCanvasState* state) {
-    SkDELETE(state);
+    SkASSERT(!state || SkCanvasState_v1::kVersion == state->version);
+    // Upcast to the correct version of SkCanvasState. This avoids having a virtual destructor on
+    // SkCanvasState. That would be strange since SkCanvasState has no other virtual functions, and
+    // instead uses the field "version" to determine how to behave.
+    SkDELETE(static_cast<SkCanvasState_v1*>(state));
 }
index 92d0b51..00f6c77 100644 (file)
@@ -74,7 +74,7 @@ static void test_cache(skiatest::Reporter* reporter, SkScaledImageCache& cache,
         }
     }
 
-    cache.setByteLimit(0);
+    cache.setTotalByteLimit(0);
 }
 
 #include "SkDiscardableMemoryPool.h"
diff --git a/src/third_party/skia/tests/ScaledImageCache.cpp b/src/third_party/skia/tests/ScaledImageCache.cpp
new file mode 100644 (file)
index 0000000..2040afe
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "Test.h"
+#include "SkGraphics.h"
+#include "SkCanvas.h"
+
+static const int kCanvasSize = 1;
+static const int kBitmapSize = 16;
+static const int kScale = 8;
+
+static size_t test_scaled_image_cache_useage() {
+    SkAutoTUnref<SkCanvas> canvas(
+            SkCanvas::NewRasterN32(kCanvasSize, kCanvasSize));
+    SkBitmap bitmap;
+    SkAssertResult(bitmap.allocN32Pixels(kBitmapSize, kBitmapSize));
+    SkScalar scaledSize = SkIntToScalar(kScale * kBitmapSize);
+    canvas->clipRect(SkRect::MakeLTRB(0, 0, scaledSize, scaledSize));
+    SkPaint paint;
+    paint.setFilterLevel(SkPaint::kHigh_FilterLevel);
+    size_t bytesUsed = SkGraphics::GetImageCacheBytesUsed();
+    canvas->drawBitmapRect(bitmap,
+                           SkRect::MakeLTRB(0, 0, scaledSize, scaledSize),
+                           &paint);
+    return SkGraphics::GetImageCacheBytesUsed() - bytesUsed;
+}
+
+// http://crbug.com/389439
+DEF_TEST(ScaledImageCache_SingleAllocationByteLimit, reporter) {
+    size_t originalByteLimit = SkGraphics::GetImageCacheByteLimit();
+    size_t originalAllocationLimit =
+        SkGraphics::GetImageCacheSingleAllocationByteLimit();
+
+    size_t size = kBitmapSize * kScale * kBitmapSize * kScale
+        * SkColorTypeBytesPerPixel(kN32_SkColorType);
+
+    SkGraphics::SetImageCacheByteLimit(0); // clear cache
+    SkGraphics::SetImageCacheByteLimit(2 * size);
+    SkGraphics::SetImageCacheSingleAllocationByteLimit(0);
+
+    REPORTER_ASSERT(reporter, size == test_scaled_image_cache_useage());
+
+    SkGraphics::SetImageCacheByteLimit(0); // clear cache
+    SkGraphics::SetImageCacheByteLimit(2 * size);
+    SkGraphics::SetImageCacheSingleAllocationByteLimit(size * 2);
+
+    REPORTER_ASSERT(reporter, size == test_scaled_image_cache_useage());
+
+    SkGraphics::SetImageCacheByteLimit(0); // clear cache
+    SkGraphics::SetImageCacheByteLimit(2 * size);
+    SkGraphics::SetImageCacheSingleAllocationByteLimit(size / 2);
+
+    REPORTER_ASSERT(reporter, 0 == test_scaled_image_cache_useage());
+
+    SkGraphics::SetImageCacheSingleAllocationByteLimit(originalAllocationLimit);
+    SkGraphics::SetImageCacheByteLimit(originalByteLimit);
+}
index 7dc4f27..e61e903 100644 (file)
@@ -71,6 +71,7 @@ class RemoteBitrateEstimator : public CallStatsObserver, public Module {
   // estimate and the over-use detector. If an over-use is detected the
   // remote bitrate estimate will be updated. Note that |payload_size| is the
   // packet size excluding headers.
+  // Note that |arrival_time_ms| can be of an arbitrary time base.
   virtual void IncomingPacket(int64_t arrival_time_ms,
                               int payload_size,
                               const RTPHeader& header) = 0;
index 56a6baa..9baaa9c 100644 (file)
@@ -36,8 +36,7 @@ OveruseDetector::OveruseDetector(const OverUseDetectorOptions& options)
       prev_offset_(0.0),
       time_over_using_(-1),
       over_use_counter_(0),
-      hypothesis_(kBwNormal),
-      time_of_last_received_packet_(-1) {
+      hypothesis_(kBwNormal) {
   memcpy(E_, options_.initial_e, sizeof(E_));
   memcpy(process_noise_, options_.initial_process_noise,
          sizeof(process_noise_));
@@ -50,8 +49,7 @@ OveruseDetector::~OveruseDetector() {
 void OveruseDetector::Update(uint16_t packet_size,
                              int64_t timestamp_ms,
                              uint32_t timestamp,
-                             const int64_t now_ms) {
-  time_of_last_received_packet_ = now_ms;
+                             const int64_t arrival_time_ms) {
   bool new_timestamp = (timestamp != current_frame_.timestamp);
   if (timestamp_ms >= 0) {
     if (prev_frame_.timestamp_ms == -1 && current_frame_.timestamp_ms == -1) {
@@ -82,7 +80,7 @@ void OveruseDetector::Update(uint16_t packet_size,
   }
   // Accumulate the frame size
   current_frame_.size += packet_size;
-  current_frame_.complete_time_ms = now_ms;
+  current_frame_.complete_time_ms = arrival_time_ms;
 }
 
 BandwidthUsage OveruseDetector::State() const {
@@ -107,10 +105,6 @@ void OveruseDetector::SetRateControlRegion(RateControlRegion region) {
   }
 }
 
-int64_t OveruseDetector::time_of_last_received_packet() const {
-  return time_of_last_received_packet_;
-}
-
 void OveruseDetector::SwitchTimeBase() {
   current_frame_.size = 0;
   current_frame_.complete_time_ms = -1;
index a7e59cc..9c565e4 100644 (file)
@@ -28,11 +28,10 @@ class OveruseDetector {
   void Update(uint16_t packet_size,
               int64_t timestamp_ms,
               uint32_t rtp_timestamp,
-              int64_t now_ms);
+              int64_t arrival_time_ms);
   BandwidthUsage State() const;
   double NoiseVar() const;
   void SetRateControlRegion(RateControlRegion region);
-  int64_t time_of_last_received_packet() const;
 
  private:
   struct FrameSample {
@@ -89,7 +88,6 @@ class OveruseDetector {
   double time_over_using_;
   uint16_t over_use_counter_;
   BandwidthUsage hypothesis_;
-  int64_t time_of_last_received_packet_;
 };
 }  // namespace webrtc
 
index 577912e..08422d2 100644 (file)
@@ -59,10 +59,27 @@ class RemoteBitrateEstimatorSingleStream : public RemoteBitrateEstimator {
       ReceiveBandwidthEstimatorStats* output) const OVERRIDE;
 
  private:
-  typedef std::map<unsigned int, OveruseDetector> SsrcOveruseDetectorMap;
+  // Map from SSRC to over-use detector and last incoming packet time in
+  // milliseconds, taken from clock_.
+  typedef std::map<unsigned int, std::pair<OveruseDetector, int64_t> >
+      SsrcOveruseDetectorMap;
+
+  static OveruseDetector* GetDetector(
+      const SsrcOveruseDetectorMap::iterator it) {
+    return &it->second.first;
+  }
+
+  static int64_t GetPacketTimeMs(const SsrcOveruseDetectorMap::iterator it) {
+    return it->second.second;
+  }
+
+  static void SetPacketTimeMs(SsrcOveruseDetectorMap::iterator it,
+                              int64_t time_ms) {
+    it->second.second = time_ms;
+  }
 
   // Triggers a new estimate calculation.
-  void UpdateEstimate(int64_t time_now);
+  void UpdateEstimate(int64_t now_ms);
 
   void GetSsrcs(std::vector<unsigned int>* ssrcs) const;
 
@@ -95,6 +112,7 @@ void RemoteBitrateEstimatorSingleStream::IncomingPacket(
   uint32_t ssrc = header.ssrc;
   uint32_t rtp_timestamp = header.timestamp +
       header.extension.transmissionTimeOffset;
+  int64_t now_ms = clock_->TimeInMilliseconds();
   CriticalSectionScoped cs(crit_sect_.get());
   SsrcOveruseDetectorMap::iterator it = overuse_detectors_.find(ssrc);
   if (it == overuse_detectors_.end()) {
@@ -105,22 +123,23 @@ void RemoteBitrateEstimatorSingleStream::IncomingPacket(
     // automatically cleaned up when we have one RemoteBitrateEstimator per REMB
     // group.
     std::pair<SsrcOveruseDetectorMap::iterator, bool> insert_result =
-        overuse_detectors_.insert(std::make_pair(ssrc, OveruseDetector(
-            OverUseDetectorOptions())));
+        overuse_detectors_.insert(std::make_pair(ssrc,
+            std::make_pair(OveruseDetector(OverUseDetectorOptions()), now_ms)));
     it = insert_result.first;
   }
-  OveruseDetector* overuse_detector = &it->second;
-  incoming_bitrate_.Update(payload_size, arrival_time_ms);
+  SetPacketTimeMs(it, now_ms);
+  OveruseDetector* overuse_detector = GetDetector(it);
+  incoming_bitrate_.Update(payload_size, now_ms);
   const BandwidthUsage prior_state = overuse_detector->State();
   overuse_detector->Update(payload_size, -1, rtp_timestamp, arrival_time_ms);
   if (overuse_detector->State() == kBwOverusing) {
-    unsigned int incoming_bitrate = incoming_bitrate_.Rate(arrival_time_ms);
+    unsigned int incoming_bitrate = incoming_bitrate_.Rate(now_ms);
     if (prior_state != kBwOverusing ||
-        remote_rate_.TimeToReduceFurther(arrival_time_ms, incoming_bitrate)) {
+        remote_rate_.TimeToReduceFurther(now_ms, incoming_bitrate)) {
       // The first overuse should immediately trigger a new estimate.
       // We also have to update the estimate immediately if we are overusing
       // and the target bitrate is too high compared to what we are receiving.
-      UpdateEstimate(arrival_time_ms);
+      UpdateEstimate(now_ms);
     }
   }
 }
@@ -129,8 +148,9 @@ int32_t RemoteBitrateEstimatorSingleStream::Process() {
   if (TimeUntilNextProcess() > 0) {
     return 0;
   }
-  UpdateEstimate(clock_->TimeInMilliseconds());
-  last_process_time_ = clock_->TimeInMilliseconds();
+  int64_t now_ms = clock_->TimeInMilliseconds();
+  UpdateEstimate(now_ms);
+  last_process_time_ = now_ms;
   return 0;
 }
 
@@ -141,25 +161,24 @@ int32_t RemoteBitrateEstimatorSingleStream::TimeUntilNextProcess() {
   return last_process_time_ + kProcessIntervalMs - clock_->TimeInMilliseconds();
 }
 
-void RemoteBitrateEstimatorSingleStream::UpdateEstimate(int64_t time_now) {
+void RemoteBitrateEstimatorSingleStream::UpdateEstimate(int64_t now_ms) {
   CriticalSectionScoped cs(crit_sect_.get());
   BandwidthUsage bw_state = kBwNormal;
   double sum_noise_var = 0.0;
   SsrcOveruseDetectorMap::iterator it = overuse_detectors_.begin();
   while (it != overuse_detectors_.end()) {
-    const int64_t time_of_last_received_packet =
-         it->second.time_of_last_received_packet();
-    if (time_of_last_received_packet >= 0 &&
-        time_now - time_of_last_received_packet > kStreamTimeOutMs) {
+    if (GetPacketTimeMs(it) >= 0 &&
+        now_ms - GetPacketTimeMs(it) > kStreamTimeOutMs) {
       // This over-use detector hasn't received packets for |kStreamTimeOutMs|
       // milliseconds and is considered stale.
       overuse_detectors_.erase(it++);
     } else {
-      sum_noise_var += it->second.NoiseVar();
+      OveruseDetector* overuse_detector = GetDetector(it);
+      sum_noise_var += overuse_detector->NoiseVar();
       // Make sure that we trigger an over-use if any of the over-use detectors
       // is detecting over-use.
-      if (it->second.State() > bw_state) {
-        bw_state = it->second.State();
+      if (overuse_detector->State() > bw_state) {
+        bw_state = overuse_detector->State();
       }
       ++it;
     }
@@ -172,17 +191,17 @@ void RemoteBitrateEstimatorSingleStream::UpdateEstimate(int64_t time_now) {
   double mean_noise_var = sum_noise_var /
       static_cast<double>(overuse_detectors_.size());
   const RateControlInput input(bw_state,
-                               incoming_bitrate_.Rate(time_now),
+                               incoming_bitrate_.Rate(now_ms),
                                mean_noise_var);
-  const RateControlRegion region = remote_rate_.Update(&input, time_now);
-  unsigned int target_bitrate = remote_rate_.UpdateBandwidthEstimate(time_now);
+  const RateControlRegion region = remote_rate_.Update(&input, now_ms);
+  unsigned int target_bitrate = remote_rate_.UpdateBandwidthEstimate(now_ms);
   if (remote_rate_.ValidEstimate()) {
     std::vector<unsigned int> ssrcs;
     GetSsrcs(&ssrcs);
     observer_->OnReceiveBitrateChanged(ssrcs, target_bitrate);
   }
   for (it = overuse_detectors_.begin(); it != overuse_detectors_.end(); ++it) {
-    it->second.SetRateControlRegion(region);
+    GetDetector(it)->SetRateControlRegion(region);
   }
 }
 
index dc30d93..1b38a1e 100644 (file)
@@ -226,7 +226,8 @@ void RemoteBitrateEstimatorTest::IncomingPacket(uint32_t ssrc,
   header.ssrc = ssrc;
   header.timestamp = rtp_timestamp;
   header.extension.absoluteSendTime = absolute_send_time;
-  bitrate_estimator_->IncomingPacket(arrival_time, payload_size, header);
+  bitrate_estimator_->IncomingPacket(arrival_time + kArrivalTimeClockOffsetMs,
+      payload_size, header);
 }
 
 // Generates a frame of packets belonging to a stream at a given bitrate and
@@ -245,6 +246,10 @@ bool RemoteBitrateEstimatorTest::GenerateAndProcessFrame(unsigned int ssrc,
   while (!packets.empty()) {
     testing::RtpStream::RtpPacket* packet = packets.front();
     bitrate_observer_->Reset();
+    // The simulated clock should match the time of packet->arrival_time
+    // since both are used in IncomingPacket().
+    clock_.AdvanceTimeMicroseconds(packet->arrival_time -
+                                   clock_.TimeInMicroseconds());
     IncomingPacket(packet->ssrc,
                    packet->size,
                    (packet->arrival_time + 500) / 1000,
@@ -256,8 +261,6 @@ bool RemoteBitrateEstimatorTest::GenerateAndProcessFrame(unsigned int ssrc,
       overuse = true;
       EXPECT_LE(bitrate_observer_->latest_bitrate(), bitrate_bps);
     }
-    clock_.AdvanceTimeMicroseconds(packet->arrival_time -
-                                   clock_.TimeInMicroseconds());
     delete packet;
     packets.pop_front();
   }
index 14cfc31..1d748c5 100644 (file)
@@ -198,6 +198,7 @@ class RemoteBitrateEstimatorTest : public ::testing::Test {
                               unsigned int expected_bitrate_drop_delta);
 
   static const unsigned int kDefaultSsrc;
+  static const int kArrivalTimeClockOffsetMs = 60000;
 
   SimulatedClock clock_;  // Time at the receiver.
   scoped_ptr<testing::TestBitrateObserver> bitrate_observer_;
index 70fe717..469a41e 100644 (file)
@@ -558,14 +558,10 @@ int ModuleRtpRtcpImpl::TimeToSendPadding(int bytes) {
     }
   } else {
     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
-    // Decide what media stream to pad on based on a round-robin scheme.
     for (size_t i = 0; i < child_modules_.size(); ++i) {
-      padding_index_ = (padding_index_ + 1) % child_modules_.size();
       // Send padding on one of the modules sending media.
-      if (child_modules_[padding_index_]->SendingMedia() &&
-          child_modules_[padding_index_]->rtp_sender_.GetTargetBitrate() > 0) {
-        return child_modules_[padding_index_]->rtp_sender_.TimeToSendPadding(
-            bytes);
+      if (child_modules_[i]->SendingMedia()) {
+        return child_modules_[i]->rtp_sender_.TimeToSendPadding(bytes);
       }
     }
   }
index eb76cfe..eba4e01 100644 (file)
@@ -387,7 +387,7 @@ class RtpSendingTest : public ::testing::Test {
   VideoCodec codec_;
 };
 
-TEST_F(RtpSendingTest, RoundRobinPadding) {
+TEST_F(RtpSendingTest, DISABLED_RoundRobinPadding) {
   // We have to send on an SSRC to be allowed to pad, since a marker bit must
   // be sent prior to padding packets.
   const uint8_t payload[200] = {0};
@@ -409,7 +409,7 @@ TEST_F(RtpSendingTest, RoundRobinPadding) {
   ExpectPadding(expected_padding);
 }
 
-TEST_F(RtpSendingTest, RoundRobinPaddingRtx) {
+TEST_F(RtpSendingTest, DISABLED_RoundRobinPaddingRtx) {
   // Enable RTX to allow padding to be sent prior to media.
   for (int i = 1; i < codec_.numberOfSimulcastStreams + 1; ++i) {
     senders_[i]->SetRtxSendPayloadType(96);
@@ -435,7 +435,7 @@ TEST_F(RtpSendingTest, RoundRobinPaddingRtx) {
   ExpectPadding(expected_padding);
 }
 
-TEST_F(RtpSendingTest, RoundRobinPaddingRtxRedundantPayloads) {
+TEST_F(RtpSendingTest, DISABLED_RoundRobinPaddingRtxRedundantPayloads) {
   for (int i = 1; i < codec_.numberOfSimulcastStreams + 1; ++i) {
     senders_[i]->SetRtxSendPayloadType(96);
     senders_[i]->SetRtxSsrc(kSenderRtxSsrc + i);
index 17b026c..291e619 100644 (file)
@@ -397,7 +397,7 @@ class RTPSender : public RTPSenderInterface, public Bitrate::Observer {
   // that by the time the function returns there is no guarantee
   // that the target bitrate is still valid.
   scoped_ptr<CriticalSectionWrapper> target_bitrate_critsect_;
-  uint16_t target_bitrate_ GUARDED_BY(target_bitrate_critsect_);
+  uint32_t target_bitrate_ GUARDED_BY(target_bitrate_critsect_);
 };
 
 }  // namespace webrtc
index cf1982c..cf3e4f5 100644 (file)
@@ -5145,6 +5145,11 @@ Therefore, the affected-histogram name has to have at least one dot in it.
   </summary>
 </histogram>
 
+<histogram name="Enterprise.EnrollmentRecovery" enum="EnterpriseEnrollmentType">
+  <owner>tnagel@chromium.org</owner>
+  <summary>Events related to Chrome OS enterprise enrollment recovery.</summary>
+</histogram>
+
 <histogram name="Enterprise.IOSPolicies">
   <owner>joaodasilva@chromium.org</owner>
   <summary>
@@ -20819,6 +20824,17 @@ Therefore, the affected-histogram name has to have at least one dot in it.
   </summary>
 </histogram>
 
+<histogram name="Plugin.AvailabilityStatus.WidevineCdm"
+    enum="PluginAvailabilityStatus">
+  <owner>xhwang@chromium.org</owner>
+  <summary>
+    The availability status of Widevine CDM. In normal cases, this is reported
+    per render process if EME API is used. This is not reported if EME API is
+    not used. This could be reported multiple times per render process until
+    PLUGIN_AVAILABLE is reported (which should be a rare case).
+  </summary>
+</histogram>
+
 <histogram name="Plugin.FlashNavigateUsage" enum="FlashNavigateUsageType">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <summary>Record usage of PPB_Flash.Navigate() Pepper API.</summary>
@@ -25721,6 +25737,11 @@ Therefore, the affected-histogram name has to have at least one dot in it.
   </summary>
 </histogram>
 
+<histogram name="Signin.SignoutProfile" enum="SigninSignoutProfile">
+  <owner>mlerman@chromium.org</owner>
+  <summary>Track how a profile gets signed out.</summary>
+</histogram>
+
 <histogram name="SimpleCache.App.CheckCRCResult" enum="CheckCRCResult">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <summary>
@@ -35253,6 +35274,10 @@ Therefore, the affected-histogram name has to have at least one dot in it.
   <int value="23" label="Domain mismatch">
     Enrollment failed because the device belongs to a different domain.
   </int>
+  <int value="24" label="Triggered">
+    Enrollment has been triggered, the credential screen has been shown.
+  </int>
+  <int value="25" label="Retried">The user retried to submit credentials.</int>
 </enum>
 
 <enum name="EnterprisePolicies" type="int">
@@ -42228,6 +42253,12 @@ Therefore, the affected-histogram name has to have at least one dot in it.
   <int value="16" label="I/O"/>
 </enum>
 
+<enum name="PluginAvailabilityStatus" type="int">
+  <int value="0" label="PLUGIN_NOT_REGISTERED"/>
+  <int value="1" label="PLUGIN_AVAILABLE"/>
+  <int value="2" label="PLUGIN_DISABLED"/>
+</enum>
+
 <enum name="PluginLoadResult" type="int">
   <int value="0" label="LOAD_SUCCESS"/>
   <int value="1" label="LOAD_FAILED"/>
@@ -43916,6 +43947,31 @@ Therefore, the affected-histogram name has to have at least one dot in it.
   <int value="10" label="Undo">The sync was aborted with an undo button.</int>
 </enum>
 
+<enum name="SigninSignoutProfile" type="int">
+  <int value="0" label="Preference changed">
+    The preference or policy controlling if signin is valid has changed.
+  </int>
+  <int value="1" label="Google service pattern changed">
+    The valid username pattern for signing in to the Google service changed.
+  </int>
+  <int value="2" label="Signin preference changed during signin">
+    The preference or policy controlling if signin is valid changed during the
+    signin process.
+  </int>
+  <int value="3" label="User clicked signout">User clicked to signout.</int>
+  <int value="4" label="Signin aborted">
+    The signin process was aborted, but signin had succeeded, so signout. This
+    may be due to a server response, policy definition or user action.
+  </int>
+  <int value="5" label="Server forced">
+    The sync server caused the profile to be signed out.
+  </int>
+  <int value="6" label="Credentials transfered">
+    The credentials are being transfered to a new profile, so the old one is
+    signed out.
+  </int>
+</enum>
+
 <enum name="SimpleCache.EntryCreatedAndStream2Omitted" type="int">
   <int value="0" label="Stream 2 file was present"/>
   <int value="1" label="Empty stream 2 file was omitted"/>
index 894376c..d9faa0f 100644 (file)
@@ -5,6 +5,7 @@
 package org.chromium.ui;
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.view.View;
 import android.view.View.MeasureSpec;
 import android.view.View.OnLayoutChangeListener;
@@ -30,6 +31,7 @@ public class DropdownPopupWindow extends ListPopupWindow {
     private float mAnchorY;
     private OnLayoutChangeListener mLayoutChangeListener;
     private PopupWindow.OnDismissListener mOnDismissListener;
+    ListAdapter mAdapter;
 
     /**
      * Creates an DropdownPopupWindow with specified parameters.
@@ -89,21 +91,32 @@ public class DropdownPopupWindow extends ListPopupWindow {
     }
 
     @Override
+    public void setAdapter(ListAdapter adapter) {
+        mAdapter = adapter;
+        super.setAdapter(adapter);
+    }
+
+    @Override
     public void show() {
         // An ugly hack to keep the popup from expanding on top of the keyboard.
         setInputMethodMode(INPUT_METHOD_NEEDED);
-        super.show();
-        getListView().setDividerHeight(0);
         int contentWidth = measureContentWidth();
         float contentWidthInDip = contentWidth /
                 mContext.getResources().getDisplayMetrics().density;
         if (contentWidthInDip > mAnchorWidth) {
             setContentWidth(contentWidth);
+            final Rect displayFrame = new Rect();
+            mAnchorView.getWindowVisibleDisplayFrame(displayFrame);
+            if (getWidth() > displayFrame.width()) {
+                setWidth(displayFrame.width());
+            }
         } else {
             setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
         }
         mViewAndroidDelegate.setAnchorViewPosition(mAnchorView, mAnchorX, mAnchorY, mAnchorWidth,
                 mAnchorHeight);
+        super.show();
+        getListView().setDividerHeight(0);
     }
 
     @Override
@@ -118,13 +131,12 @@ public class DropdownPopupWindow extends ListPopupWindow {
     private int measureContentWidth() {
         int maxWidth = 0;
         View itemView = null;
-        final ListAdapter adapter = getListView().getAdapter();
-        if (adapter == null)
+        if (mAdapter == null)
           return 0;
         final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
         final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-        for (int i = 0; i < adapter.getCount(); i++) {
-            itemView = adapter.getView(i, itemView, null);
+        for (int i = 0; i < mAdapter.getCount(); i++) {
+            itemView = mAdapter.getView(i, itemView, null);
             LinearLayout.LayoutParams params =
                     new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                             LinearLayout.LayoutParams.WRAP_CONTENT);
diff --git a/src/ui/android/java/src/org/chromium/ui/interpolators/BakedBezierInterpolator.java b/src/ui/android/java/src/org/chromium/ui/interpolators/BakedBezierInterpolator.java
new file mode 100644 (file)
index 0000000..f95d855
--- /dev/null
@@ -0,0 +1,163 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.ui.interpolators;
+
+import android.view.animation.Interpolator;
+
+/**
+ * A pre-baked bezier-curved interpolator for quantum-paper transitions.
+ * TODO(dtrainor): Move to the API Compatability version iff that supports the curves we need and
+ * once we move to that SDK.
+ */
+public class BakedBezierInterpolator implements Interpolator {
+    /**
+     * Lookup table values.
+     * Generated using a Bezier curve from (0,0) to (1,1) with control points:
+     * P0 (0.0, 0.0)
+     * P1 (0.4, 0.0)
+     * P2 (0.2, 1.0)
+     * P3 (1.0, 1.0)
+     *
+     * Values sampled with x at regular intervals between 0 and 1.
+     */
+    private static final float[] TRANSFORM_VALUES = new float[] {
+        0.0f, 0.0002f, 0.0009f, 0.0019f, 0.0036f, 0.0059f, 0.0086f, 0.0119f, 0.0157f, 0.0209f,
+        0.0257f, 0.0321f, 0.0392f, 0.0469f, 0.0566f, 0.0656f, 0.0768f, 0.0887f, 0.1033f, 0.1186f,
+        0.1349f, 0.1519f, 0.1696f, 0.1928f, 0.2121f, 0.237f, 0.2627f, 0.2892f, 0.3109f, 0.3386f,
+        0.3667f, 0.3952f, 0.4241f, 0.4474f, 0.4766f, 0.5f, 0.5234f, 0.5468f, 0.5701f, 0.5933f,
+        0.6134f, 0.6333f, 0.6531f, 0.6698f, 0.6891f, 0.7054f, 0.7214f, 0.7346f, 0.7502f, 0.763f,
+        0.7756f, 0.7879f, 0.8f, 0.8107f, 0.8212f, 0.8326f, 0.8415f, 0.8503f, 0.8588f, 0.8672f,
+        0.8754f, 0.8833f, 0.8911f, 0.8977f, 0.9041f, 0.9113f, 0.9165f, 0.9232f, 0.9281f, 0.9328f,
+        0.9382f, 0.9434f, 0.9476f, 0.9518f, 0.9557f, 0.9596f, 0.9632f, 0.9662f, 0.9695f, 0.9722f,
+        0.9753f, 0.9777f, 0.9805f, 0.9826f, 0.9847f, 0.9866f, 0.9884f, 0.9901f, 0.9917f, 0.9931f,
+        0.9944f, 0.9955f, 0.9964f, 0.9973f, 0.9981f, 0.9986f, 0.9992f, 0.9995f, 0.9998f, 1.0f, 1.0f
+    };
+
+    /**
+     * Lookup table values.
+     * Generated using a Bezier curve from (0,0) to (1,1) with control points:
+     * P0 (0.0, 0.0)
+     * P1 (0.4, 0.0)
+     * P2 (1.0, 1.0)
+     * P3 (1.0, 1.0)
+     *
+     * Values sampled with x at regular intervals between 0 and 1.
+     */
+    private static final float[] FADE_OUT_VALUES = new float[] {
+        0.0f, 0.0002f, 0.0008f, 0.0019f, 0.0032f, 0.0049f, 0.0069f, 0.0093f, 0.0119f, 0.0149f,
+        0.0182f, 0.0218f, 0.0257f, 0.0299f, 0.0344f, 0.0392f, 0.0443f, 0.0496f, 0.0552f, 0.0603f,
+        0.0656f, 0.0719f, 0.0785f, 0.0853f, 0.0923f, 0.0986f, 0.1051f, 0.1128f, 0.1206f, 0.1287f,
+        0.1359f, 0.1433f, 0.1519f, 0.1607f, 0.1696f, 0.1776f, 0.1857f, 0.1952f, 0.2048f, 0.2145f,
+        0.2232f, 0.2319f, 0.2421f, 0.2523f, 0.2627f, 0.2733f, 0.2826f, 0.2919f, 0.3027f, 0.3137f,
+        0.3247f, 0.3358f, 0.3469f, 0.3582f, 0.3695f, 0.3809f, 0.3924f, 0.4039f, 0.4154f, 0.427f,
+        0.4386f, 0.4503f, 0.4619f, 0.4751f, 0.4883f, 0.5f, 0.5117f, 0.5264f, 0.5381f, 0.5497f,
+        0.5643f, 0.5759f, 0.5904f, 0.6033f, 0.6162f, 0.6305f, 0.6446f, 0.6587f, 0.6698f, 0.6836f,
+        0.7f, 0.7134f, 0.7267f, 0.7425f, 0.7554f, 0.7706f, 0.7855f, 0.8f, 0.8143f, 0.8281f, 0.8438f,
+        0.8588f, 0.8733f, 0.8892f, 0.9041f, 0.9215f, 0.9344f, 0.9518f, 0.9667f, 0.9826f, 0.9993f
+    };
+
+    /**
+     * Lookup table values.
+     * Generated using a Bezier curve from (0,0) to (1,1) with control points:
+     * P0 (0.0, 0.0)
+     * P1 (0.0, 0.0)
+     * P2 (0.2, 1.0)
+     * P3 (1.0, 1.0)
+     *
+     * Values sampled with x at regular intervals between 0 and 1.
+     */
+    private static final float[] FADE_IN_VALUES = new float[] {
+        0.0029f, 0.043f, 0.0785f, 0.1147f, 0.1476f, 0.1742f, 0.2024f, 0.2319f, 0.2575f, 0.2786f,
+        0.3055f, 0.3274f, 0.3498f, 0.3695f, 0.3895f, 0.4096f, 0.4299f, 0.4474f, 0.4649f, 0.4824f,
+        0.5f, 0.5176f, 0.5322f, 0.5468f, 0.5643f, 0.5788f, 0.5918f, 0.6048f, 0.6191f, 0.6333f,
+        0.6446f, 0.6573f, 0.6698f, 0.6808f, 0.6918f, 0.704f, 0.7148f, 0.7254f, 0.7346f, 0.7451f,
+        0.7554f, 0.7655f, 0.7731f, 0.783f, 0.7916f, 0.8f, 0.8084f, 0.8166f, 0.8235f, 0.8315f,
+        0.8393f, 0.8459f, 0.8535f, 0.8599f, 0.8672f, 0.8733f, 0.8794f, 0.8853f, 0.8911f, 0.8967f,
+        0.9023f, 0.9077f, 0.9121f, 0.9173f, 0.9224f, 0.9265f, 0.9313f, 0.9352f, 0.9397f, 0.9434f,
+        0.9476f, 0.9511f, 0.9544f, 0.9577f, 0.9614f, 0.9644f, 0.9673f, 0.9701f, 0.9727f, 0.9753f,
+        0.9777f, 0.98f, 0.9818f, 0.9839f, 0.9859f, 0.9877f, 0.9891f, 0.9907f, 0.9922f, 0.9933f,
+        0.9946f, 0.9957f, 0.9966f, 0.9974f, 0.9981f, 0.9986f, 0.9992f, 0.9995f, 0.9998f, 1.0f, 1.0f
+    };
+
+    /**
+     * Lookup table values.
+     * Generated using a Bezier curve from (0,0) to (1,1) with control points:
+     * P0 (0.0, 0.0)
+     * P1 (0.0, 0.84)
+     * P2 (0.13, 0.99)
+     * P3 (1.0, 1.0)
+     */
+    private static final float[] TRANSFORM_FOLLOW_THROUGH_VALUES = new float[] {
+        0.0767f, 0.315f, 0.4173f, 0.484f, 0.5396f, 0.5801f, 0.6129f, 0.644f, 0.6687f, 0.6876f,
+        0.7102f, 0.7276f, 0.7443f, 0.7583f, 0.7718f, 0.7849f, 0.7975f, 0.8079f, 0.8179f, 0.8276f,
+        0.8355f, 0.8446f, 0.8519f, 0.859f, 0.8659f, 0.8726f, 0.8791f, 0.8841f, 0.8902f, 0.8949f,
+        0.9001f, 0.9051f, 0.9094f, 0.9136f, 0.9177f, 0.9217f, 0.925f, 0.9283f, 0.9319f, 0.9355f,
+        0.938f, 0.9413f, 0.9437f, 0.9469f, 0.9491f, 0.9517f, 0.9539f, 0.9563f, 0.9583f, 0.9603f,
+        0.9622f, 0.9643f, 0.9661f, 0.9679f, 0.9693f, 0.9709f, 0.9725f, 0.974f, 0.9753f, 0.9767f,
+        0.9779f, 0.9792f, 0.9803f, 0.9816f, 0.9826f, 0.9835f, 0.9845f, 0.9854f, 0.9863f, 0.9872f,
+        0.988f, 0.9888f, 0.9895f, 0.9903f, 0.991f, 0.9917f, 0.9922f, 0.9928f, 0.9934f, 0.9939f,
+        0.9944f, 0.9948f, 0.9953f, 0.9957f, 0.9962f, 0.9965f, 0.9969f, 0.9972f, 0.9975f, 0.9978f,
+        0.9981f, 0.9984f, 0.9986f, 0.9989f, 0.9991f, 0.9992f, 0.9994f, 0.9996f, 0.9997f, 0.9999f,
+        1.0f
+    };
+
+    /**
+     * 0.4 to 0.2 bezier curve.  Should be used for general movement.
+     */
+    public static final BakedBezierInterpolator TRANSFORM_CURVE =
+            new BakedBezierInterpolator(TRANSFORM_VALUES);
+
+    /**
+     * 0.4 to 1.0 bezier curve.  Should be used for fading out.
+     */
+    public static final BakedBezierInterpolator FADE_OUT_CURVE =
+            new BakedBezierInterpolator(FADE_OUT_VALUES);
+
+    /**
+     * 0.0 to 0.2 bezier curve.  Should be used for fading in.
+     */
+    public static final BakedBezierInterpolator FADE_IN_CURVE =
+            new BakedBezierInterpolator(FADE_IN_VALUES);
+
+    /**
+     * 0.0 to 0.13 by 0.84 to 0.99 bezier curve.  Should be used for very quick transforms.
+     */
+    public static final BakedBezierInterpolator TRANSFORM_FOLLOW_THROUGH_CURVE =
+            new BakedBezierInterpolator(TRANSFORM_FOLLOW_THROUGH_VALUES);
+
+    private final float[] mValues;
+    private final float mStepSize;
+
+    /**
+     * Use the INSTANCE variable instead of instantiating.
+     */
+    private BakedBezierInterpolator(float[] values) {
+        super();
+        mValues = values;
+        mStepSize = 1.f / (mValues.length - 1);
+    }
+
+    @Override
+    public float getInterpolation(float input) {
+        if (input >= 1.0f) {
+            return 1.0f;
+        }
+
+        if (input <= 0f) {
+            return 0f;
+        }
+
+        int position = Math.min(
+                (int)(input * (mValues.length - 1)),
+                mValues.length - 2);
+
+        float quantized = position * mStepSize;
+        float difference = input - quantized;
+        float weight = difference / mStepSize;
+
+        return mValues[position] + weight * (mValues[position + 1] - mValues[position]);
+    }
+
+}
\ No newline at end of file
index 9f0d1c3..5e3d852 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
 <translation id="6017514345406065928">Verde</translation>
-<translation id="7658239707568436148">Anulaţi</translation>
+<translation id="7658239707568436148">Anulați</translation>
 <translation id="9068849894565669697">Selectați culoarea</translation>
 <translation id="4115378294792113321">Magenta</translation>
 <translation id="793640675459356075">Fișier. select. nu s-a deschis</translation>
@@ -12,7 +12,7 @@
 <translation id="1555130319947370107">Albastru</translation>
 <translation id="6727102863431372879">Setați</translation>
 <translation id="6315516427814392808">Operația anterioară nu se poate finaliza, din cauza memoriei insuficiente</translation>
-<translation id="6042308850641462728">Mai mult</translation>
+<translation id="6042308850641462728">Mai multe</translation>
 <translation id="7535087603100972091">Valoare</translation>
 <translation id="161042844686301425">Cyan</translation>
 <translation id="8889402386540077796">Nuanță</translation>
index f64a372..e77442d 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "ui/app_list/views/top_icon_animation_view.h"
 
+#include "base/message_loop/message_loop_proxy.h"
 #include "ui/app_list/app_list_constants.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/image/image_skia_operations.h"
@@ -44,6 +45,9 @@ void TopIconAnimationView::RemoveObserver(TopIconAnimationObserver* observer) {
 }
 
 void TopIconAnimationView::TransformView() {
+  // This view will delete itself on animation completion.
+  set_owned_by_client();
+
   // Transform used for scaling down the icon and move it back inside to the
   // original folder icon.
   const float kIconTransformScale = 0.33333f;
@@ -80,7 +84,7 @@ void TopIconAnimationView::OnImplicitAnimationsCompleted() {
   FOR_EACH_OBSERVER(TopIconAnimationObserver,
                     observers_,
                     OnTopIconAnimationsComplete());
-  delete this;
+  base::MessageLoopProxy::current()->DeleteSoon(FROM_HERE, this);
 }
 
 bool TopIconAnimationView::RequiresNotificationWhenAnimatorDestroyed() const {
index 6b0097b..4dc2aa5 100644 (file)
@@ -30,7 +30,7 @@ class TopIconAnimationObserver {
 };
 
 // Transitional view used for top item icons animation when opening or closing
-// a folder.
+// a folder. Owns itself.
 class TopIconAnimationView : public views::View,
                              public ui::ImplicitAnimationObserver {
  public:
index a9df40c..596cb1f 100644 (file)
@@ -4338,6 +4338,52 @@ TEST_P(GestureRecognizerTest, LatencyPassedFromTouchEvent) {
   EXPECT_EQ(0U, delegate->latency_info().latency_components.size());
 }
 
+// A delegate that deletes a window on long press.
+class GestureEventDeleteWindowOnLongPress : public GestureEventConsumeDelegate {
+ public:
+  GestureEventDeleteWindowOnLongPress()
+      : window_(NULL) {}
+
+  void set_window(aura::Window** window) { window_ = window; }
+
+  virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE {
+    GestureEventConsumeDelegate::OnGestureEvent(gesture);
+    if (gesture->type() != ui::ET_GESTURE_LONG_PRESS)
+      return;
+    ui::GestureRecognizer::Get()->CleanupStateForConsumer(*window_);
+    delete *window_;
+    *window_ = NULL;
+  }
+
+ private:
+  aura::Window** window_;
+  DISALLOW_COPY_AND_ASSIGN(GestureEventDeleteWindowOnLongPress);
+};
+
+// Check that deleting the window in response to a long press gesture doesn't
+// crash.
+TEST_P(GestureRecognizerTest, GestureEventLongPressDeletingWindow) {
+  GestureEventDeleteWindowOnLongPress delegate;
+  const int kWindowWidth = 123;
+  const int kWindowHeight = 45;
+  const int kTouchId = 2;
+  gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
+  aura::Window* window(CreateTestWindowWithDelegate(
+      &delegate, -1234, bounds, root_window()));
+  delegate.set_window(&window);
+
+  ui::TouchEvent press1(ui::ET_TOUCH_PRESSED,
+                        gfx::Point(101, 201),
+                        kTouchId,
+                        ui::EventTimeForNow());
+  DispatchEventUsingWindowDispatcher(&press1);
+  EXPECT_TRUE(window != NULL);
+
+  // Wait until the timer runs out.
+  delegate.WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS);
+  EXPECT_EQ(NULL, window);
+}
+
 INSTANTIATE_TEST_CASE_P(GestureRecognizer,
                         GestureRecognizerTest,
                         ::testing::Bool());
index 0f47150..87d25b1 100644 (file)
@@ -683,6 +683,15 @@ ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent() {
   if (!synthesize_mouse_move_)
     return details;
   synthesize_mouse_move_ = false;
+
+  // If one of the mouse buttons is currently down, then do not synthesize a
+  // mouse-move event. In such cases, aura could synthesize a DRAGGED event
+  // instead of a MOVED event, but in multi-display/multi-host scenarios, the
+  // DRAGGED event can be synthesized in the incorrect host. So avoid
+  // synthesizing any events at all.
+  if (Env::GetInstance()->mouse_button_flags())
+    return details;
+
   gfx::Point root_mouse_location = GetLastMouseLocationInRoot();
   if (!window()->bounds().Contains(root_mouse_location))
     return details;
index 716bcc9..11eeaa0 100644 (file)
@@ -909,6 +909,34 @@ TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseEvents) {
   root_window()->RemovePreTargetHandler(&recorder);
 }
 
+// Tests that a mouse-move event is not synthesized when a mouse-button is down.
+TEST_F(WindowEventDispatcherTest, DoNotSynthesizeWhileButtonDown) {
+  EventFilterRecorder recorder;
+  test::TestWindowDelegate delegate;
+  scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
+      &delegate, 1234, gfx::Rect(5, 5, 100, 100), root_window()));
+  window->Show();
+
+  window->AddPreTargetHandler(&recorder);
+  // Dispatch a non-synthetic mouse event when mouse events are enabled.
+  ui::MouseEvent mouse1(ui::ET_MOUSE_PRESSED, gfx::Point(10, 10),
+                        gfx::Point(10, 10), ui::EF_LEFT_MOUSE_BUTTON,
+                        ui::EF_LEFT_MOUSE_BUTTON);
+  DispatchEventUsingWindowDispatcher(&mouse1);
+  ASSERT_EQ(1u, recorder.events().size());
+  EXPECT_EQ(ui::ET_MOUSE_PRESSED, recorder.events()[0]);
+  window->RemovePreTargetHandler(&recorder);
+  recorder.Reset();
+
+  // Move |window| away from underneath the cursor.
+  root_window()->AddPreTargetHandler(&recorder);
+  window->SetBounds(gfx::Rect(30, 30, 100, 100));
+  EXPECT_TRUE(recorder.events().empty());
+  RunAllPendingInMessageLoop();
+  EXPECT_TRUE(recorder.events().empty());
+  root_window()->RemovePreTargetHandler(&recorder);
+}
+
 // Tests synthetic mouse events generated when window bounds changes such that
 // the cursor previously outside the window becomes inside, or vice versa.
 // Do not synthesize events if the window ignores events or is invisible.
index 5311a82..dc60e3f 100644 (file)
@@ -23,7 +23,38 @@ void TouchscreenDelegateImpl::AssociateTouchscreens(
     std::vector<DisplayConfigurator::DisplayState>* displays) {
   std::set<int> no_match_touchscreen;
   std::vector<TouchscreenDevice> devices = touch_device_manager_->GetDevices();
+
+  int internal_touchscreen = -1;
+  for (size_t i = 0; i < devices.size(); ++i) {
+    if (devices[i].is_internal) {
+      internal_touchscreen = i;
+      break;
+    }
+  }
+
+  DisplayConfigurator::DisplayState* internal_state = NULL;
+  for (size_t i = 0; i < displays->size(); ++i) {
+    DisplayConfigurator::DisplayState* state = &(*displays)[i];
+    if (state->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL &&
+        state->display->native_mode() &&
+        state->touch_device_id == 0) {
+      internal_state = state;
+      break;
+    }
+  }
+
+  if (internal_state && internal_touchscreen >= 0) {
+    internal_state->touch_device_id = devices[internal_touchscreen].id;
+    VLOG(2) << "Found internal touchscreen for internal display "
+            << internal_state->display->display_id() << " touch_device_id "
+            << internal_state->touch_device_id << " size "
+            << devices[internal_touchscreen].size.ToString();
+  }
+
   for (size_t i = 0; i < devices.size(); ++i) {
+    if (internal_state &&
+        internal_state->touch_device_id == devices[i].id)
+      continue;
     bool found_mapping = false;
     for (size_t j = 0; j < displays->size(); ++j) {
       DisplayConfigurator::DisplayState* state = &(*displays)[j];
index b41fbdb..9e80712 100644 (file)
@@ -48,8 +48,9 @@ class TouchscreenDelegateImplTest : public testing::Test {
     delegate_.reset(new TouchscreenDelegateImpl(
         scoped_ptr<TouchscreenDeviceManager>(device_manager_)));
 
-    // Internal display. Must not be matched to a touch screen unless the size
-    // matches.
+    // Internal display will always match to internal touchscreen. If internal
+    // touchscreen can't be detected, it is then associated to a touch screen
+    // with matching size.
     TestDisplaySnapshot* snapshot = new TestDisplaySnapshot();
     DisplayMode* mode = new DisplayMode(gfx::Size(1920, 1080), false, 60.0);
     snapshot->set_type(DISPLAY_CONNECTION_TYPE_INTERNAL);
@@ -110,8 +111,8 @@ TEST_F(TouchscreenDelegateImplTest, NoTouchscreens) {
 }
 
 TEST_F(TouchscreenDelegateImplTest, OneToOneMapping) {
-  device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(800, 600)));
-  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768)));
+  device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(800, 600), false));
+  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768), false));
 
   std::vector<DisplayConfigurator::DisplayState> display_states =
       GetDisplayStates();
@@ -124,7 +125,7 @@ TEST_F(TouchscreenDelegateImplTest, OneToOneMapping) {
 }
 
 TEST_F(TouchscreenDelegateImplTest, MapToCorrectDisplaySize) {
-  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768)));
+  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1024, 768), false));
 
   std::vector<DisplayConfigurator::DisplayState> display_states =
       GetDisplayStates();
@@ -137,8 +138,8 @@ TEST_F(TouchscreenDelegateImplTest, MapToCorrectDisplaySize) {
 }
 
 TEST_F(TouchscreenDelegateImplTest, MapWhenSizeDiffersByOne) {
-  device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(801, 600)));
-  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1023, 768)));
+  device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(801, 600), false));
+  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(1023, 768), false));
 
   std::vector<DisplayConfigurator::DisplayState> display_states =
       GetDisplayStates();
@@ -151,8 +152,8 @@ TEST_F(TouchscreenDelegateImplTest, MapWhenSizeDiffersByOne) {
 }
 
 TEST_F(TouchscreenDelegateImplTest, MapWhenSizesDoNotMatch) {
-  device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(1022, 768)));
-  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(802, 600)));
+  device_manager_->AddDevice(TouchscreenDevice(1, gfx::Size(1022, 768), false));
+  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(802, 600), false));
 
   std::vector<DisplayConfigurator::DisplayState> display_states =
       GetDisplayStates();
@@ -164,4 +165,20 @@ TEST_F(TouchscreenDelegateImplTest, MapWhenSizesDoNotMatch) {
   EXPECT_EQ(2, display_states[3].touch_device_id);
 }
 
+TEST_F(TouchscreenDelegateImplTest, MapInternalTouchscreen) {
+  device_manager_->AddDevice(
+      TouchscreenDevice(1, gfx::Size(1920, 1080), false));
+  device_manager_->AddDevice(TouchscreenDevice(2, gfx::Size(9999, 888), true));
+
+  std::vector<DisplayConfigurator::DisplayState> display_states =
+      GetDisplayStates();
+  delegate_->AssociateTouchscreens(&display_states);
+
+  // Internal touchscreen is always mapped to internal display.
+  EXPECT_EQ(2, display_states[0].touch_device_id);
+  EXPECT_EQ(1, display_states[1].touch_device_id);
+  EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[2].touch_device_id);
+  EXPECT_EQ(TouchscreenDevice::kInvalidId, display_states[3].touch_device_id);
+}
+
 }  // namespace ui
index 6c8137b..f613532 100644 (file)
@@ -9,9 +9,88 @@
 
 #include <cmath>
 #include <set>
-
+#include <string>
+#include <vector>
+
+#include "base/command_line.h"
+#include "base/files/file_enumerator.h"
+#include "base/logging.h"
+#include "base/process/launch.h"
+#include "base/strings/string_util.h"
+#include "base/sys_info.h"
 #include "ui/gfx/x/x11_types.h"
 
+namespace {
+
+// We consider the touchscreen to be internal if it is an I2c device.
+// With the device id, we can query X to get the device's dev input
+// node eventXXX. Then we search all the dev input nodes registered
+// by I2C devices to see if we can find eventXXX.
+bool IsTouchscreenInternal(XDisplay* dpy, int device_id) {
+  using base::FileEnumerator;
+  using base::FilePath;
+
+  if (!base::SysInfo::IsRunningOnChromeOS())
+    return false;
+
+  // Input device has a property "Device Node" pointing to its dev input node,
+  // e.g.   Device Node (250): "/dev/input/event8"
+  Atom device_node = XInternAtom(dpy, "Device Node", False);
+  if (device_node == None)
+    return false;
+
+  Atom actual_type;
+  int actual_format;
+  unsigned long nitems, bytes_after;
+  unsigned char* data;
+  XDevice* dev = XOpenDevice(dpy, device_id);
+  if (!dev)
+    return false;
+
+  if (XGetDeviceProperty(dpy, dev, device_node, 0, 1000, False,
+                         AnyPropertyType, &actual_type, &actual_format,
+                         &nitems, &bytes_after, &data) != Success) {
+    XCloseDevice(dpy, dev);
+    return false;
+  }
+  base::FilePath dev_node_path(reinterpret_cast<char*>(data));
+  XFree(data);
+  XCloseDevice(dpy, dev);
+
+  std::string event_node = dev_node_path.BaseName().value();
+  if (event_node.empty() ||
+      !StartsWithASCII(event_node, "event", false)) {
+    return false;
+  }
+
+  // Extract id "XXX" from "eventXXX"
+  std::string event_node_id = event_node.substr(5);
+
+  // I2C input device registers its dev input node at
+  // /sys/bus/i2c/devices/*/input/inputXXX/eventXXX
+  FileEnumerator i2c_enum(FilePath(FILE_PATH_LITERAL("/sys/bus/i2c/devices/")),
+                          false,
+                          base::FileEnumerator::DIRECTORIES);
+  for (FilePath i2c_name = i2c_enum.Next();
+       !i2c_name.empty();
+       i2c_name = i2c_enum.Next()) {
+    FileEnumerator input_enum(i2c_name.Append(FILE_PATH_LITERAL("input")),
+                              false,
+                              base::FileEnumerator::DIRECTORIES,
+                              FILE_PATH_LITERAL("input*"));
+    for (base::FilePath input = input_enum.Next();
+         !input.empty();
+         input = input_enum.Next()) {
+      if (input.BaseName().value().substr(5) == event_node_id)
+        return true;
+    }
+  }
+
+  return false;
+}
+
+}  // namespace
+
 namespace ui {
 
 TouchscreenDeviceManagerX11::TouchscreenDeviceManagerX11()
@@ -70,8 +149,10 @@ std::vector<TouchscreenDevice> TouchscreenDeviceManagerX11::GetDevices() {
     // Touchscreens should have absolute X and Y axes, and be direct touch
     // devices.
     if (width > 0.0 && height > 0.0 && is_direct_touch) {
+      bool is_internal = IsTouchscreenInternal(display_, info[i].deviceid);
       devices.push_back(TouchscreenDevice(info[i].deviceid,
-                                          gfx::Size(width, height)));
+                                          gfx::Size(width, height),
+                                          is_internal));
     }
   }
 
index 09ee885..714b8f9 100644 (file)
@@ -9,8 +9,11 @@ namespace ui {
 // static
 const int TouchscreenDevice::kInvalidId = 0;
 
-TouchscreenDevice::TouchscreenDevice(int id, const gfx::Size& size)
+TouchscreenDevice::TouchscreenDevice(int id,
+                                     const gfx::Size& size,
+                                     bool is_internal)
     : id(id),
-      size(size) {}
+      size(size),
+      is_internal(is_internal) {}
 
 }  // namespace ui
index ecc6452..3a471fa 100644 (file)
@@ -14,13 +14,16 @@ namespace ui {
 struct DISPLAY_TYPES_EXPORT TouchscreenDevice {
   static const int kInvalidId;
 
-  TouchscreenDevice(int id, const gfx::Size& size);
+  TouchscreenDevice(int id, const gfx::Size& size, bool is_internal);
 
   // ID of the touch screen. This ID must uniquely identify the touch screen.
   int id;
 
   // Size of the touch screen area.
   gfx::Size size;
+
+  // True if this is an internal touchscreen.
+  bool is_internal;
 };
 
 }  // namespace ui
index ffd853b..ed7ff3a 100644 (file)
@@ -86,10 +86,22 @@ std::string EventTypeName(ui::EventType type) {
 
 bool IsX11SendEventTrue(const base::NativeEvent& event) {
 #if defined(USE_X11)
-  if (event && event->xany.send_event)
-    return true;
+  return event && event->xany.send_event;
+#else
+  return false;
 #endif
+}
+
+bool X11EventHasNonStandardState(const base::NativeEvent& event) {
+#if defined(USE_X11)
+  const unsigned int kAllStateMask =
+      Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask |
+      Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask |
+      LockMask | ControlMask | AnyModifier;
+  return event && (event->xkey.state & ~kAllStateMask) != 0;
+#else
   return false;
+#endif
 }
 
 }  // namespace
@@ -294,23 +306,46 @@ bool MouseEvent::IsRepeatedClickEvent(
 int MouseEvent::GetRepeatCount(const MouseEvent& event) {
   int click_count = 1;
   if (last_click_event_) {
-    if (event.type() == ui::ET_MOUSE_RELEASED)
-      return last_click_event_->GetClickCount();
-    if (IsX11SendEventTrue(event.native_event()))
+    if (event.type() == ui::ET_MOUSE_RELEASED) {
+      if (event.changed_button_flags() ==
+              last_click_event_->changed_button_flags()) {
+        last_click_complete_ = true;
+        return last_click_event_->GetClickCount();
+      } else {
+        // If last_click_event_ has changed since this button was pressed
+        // return a click count of 1.
+        return click_count;
+      }
+    }
+    if (event.time_stamp() != last_click_event_->time_stamp())
+      last_click_complete_ = true;
+    if (!last_click_complete_ ||
+        IsX11SendEventTrue(event.native_event())) {
       click_count = last_click_event_->GetClickCount();
-    else if (IsRepeatedClickEvent(*last_click_event_, event))
+    } else if (IsRepeatedClickEvent(*last_click_event_, event)) {
       click_count = last_click_event_->GetClickCount() + 1;
+    }
     delete last_click_event_;
   }
   last_click_event_ = new MouseEvent(event);
+  last_click_complete_ = false;
   if (click_count > 3)
     click_count = 3;
   last_click_event_->SetClickCount(click_count);
   return click_count;
 }
 
+void MouseEvent::ResetLastClickForTest() {
+  if (last_click_event_) {
+    delete last_click_event_;
+    last_click_event_ = NULL;
+    last_click_complete_ = false;
+  }
+}
+
 // static
 MouseEvent* MouseEvent::last_click_event_ = NULL;
+bool MouseEvent::last_click_complete_ = false;
 
 int MouseEvent::GetClickCount() const {
   if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
@@ -487,7 +522,11 @@ bool KeyEvent::IsRepeated(const KeyEvent& event) {
   // A safe guard in case if there were continous key pressed events that are
   // not auto repeat.
   const int kMaxAutoRepeatTimeMs = 2000;
-
+  // Ignore key events that have non standard state masks as it may be
+  // reposted by an IME. IBUS-GTK uses this field to detect the
+  // re-posted event for example. crbug.com/385873.
+  if (X11EventHasNonStandardState(event.native_event()))
+    return false;
   if (event.is_char())
     return false;
   if (event.type() == ui::ET_KEY_RELEASED) {
index 42cdd8d..9c0c580 100644 (file)
@@ -8,6 +8,7 @@
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
 #include "base/event_types.h"
+#include "base/gtest_prod_util.h"
 #include "base/logging.h"
 #include "base/time/time.h"
 #include "ui/events/event_constants.h"
@@ -390,14 +391,25 @@ class EVENTS_EXPORT MouseEvent : public LocatedEvent {
   int changed_button_flags() const { return changed_button_flags_; }
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(EventTest, DoubleClickRequiresRelease);
+  FRIEND_TEST_ALL_PREFIXES(EventTest, SingleClickRightLeft);
+
   // Returns the repeat count based on the previous mouse click, if it is
   // recent enough and within a small enough distance.
   static int GetRepeatCount(const MouseEvent& click_event);
 
+  // Resets the last_click_event_ for unit tests.
+  static void ResetLastClickForTest();
+
   // See description above getter for details.
   int changed_button_flags_;
 
   static MouseEvent* last_click_event_;
+
+  // We can create a MouseEvent for a native event more than once. We set this
+  // to true when the next event either has a different timestamp or we see a
+  // release signalling that the press (click) event was completed.
+  static bool last_click_complete_;
 };
 
 class ScrollEvent;
index 40bfa96..1866779 100644 (file)
@@ -98,6 +98,68 @@ TEST(EventTest, RepeatedClick) {
   EXPECT_FALSE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2));
 }
 
+// Tests that an event only increases the click count and gets marked as a
+// double click if a release event was seen for the previous click. This
+// prevents the same PRESSED event from being processed twice:
+// http://crbug.com/389162
+TEST(EventTest, DoubleClickRequiresRelease) {
+  const gfx::Point origin1(0, 0);
+  const gfx::Point origin2(100, 0);
+  scoped_ptr<MouseEvent> ev;
+  base::TimeDelta start = base::TimeDelta::FromMilliseconds(0);
+
+  ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin1, origin1, 0, 0));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
+  ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin1, origin1, 0, 0));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
+
+  ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin2, origin2, 0, 0));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
+  ev.reset(new MouseEvent(ET_MOUSE_RELEASED, origin2, origin2, 0, 0));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
+  ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin2, origin2, 0, 0));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(2, MouseEvent::GetRepeatCount(*ev));
+  ev.reset(new MouseEvent(ET_MOUSE_RELEASED, origin2, origin2, 0, 0));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(2, MouseEvent::GetRepeatCount(*ev));
+  MouseEvent::ResetLastClickForTest();
+}
+
+// Tests that clicking right and then left clicking does not generate a double
+// click.
+TEST(EventTest, SingleClickRightLeft) {
+  const gfx::Point origin(0, 0);
+  scoped_ptr<MouseEvent> ev;
+  base::TimeDelta start = base::TimeDelta::FromMilliseconds(0);
+
+  ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin, origin,
+                          ui::EF_RIGHT_MOUSE_BUTTON,
+                          ui::EF_RIGHT_MOUSE_BUTTON));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
+  ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin, origin,
+                          ui::EF_LEFT_MOUSE_BUTTON,
+                          ui::EF_LEFT_MOUSE_BUTTON));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
+  ev.reset(new MouseEvent(ET_MOUSE_RELEASED, origin, origin,
+                          ui::EF_LEFT_MOUSE_BUTTON,
+                          ui::EF_LEFT_MOUSE_BUTTON));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
+  ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin, origin,
+                          ui::EF_LEFT_MOUSE_BUTTON,
+                          ui::EF_LEFT_MOUSE_BUTTON));
+  ev->set_time_stamp(start);
+  EXPECT_EQ(2, MouseEvent::GetRepeatCount(*ev));
+  MouseEvent::ResetLastClickForTest();
+}
+
 TEST(EventTest, KeyEvent) {
   static const struct {
     KeyboardCode key_code;
@@ -344,6 +406,12 @@ TEST(EventTest, AutoRepeat) {
   native_event_a_released.InitKeyEvent(ET_KEY_RELEASED, VKEY_A, kNativeCodeA);
   ScopedXI2Event native_event_b_pressed;
   native_event_b_pressed.InitKeyEvent(ET_KEY_PRESSED, VKEY_B, kNativeCodeB);
+  ScopedXI2Event native_event_a_pressed_nonstandard_state;
+  native_event_a_pressed_nonstandard_state.InitKeyEvent(
+      ET_KEY_PRESSED, VKEY_A, kNativeCodeA);
+  // IBUS-GTK uses the mask (1 << 25) to detect reposted event.
+  static_cast<XEvent*>(native_event_a_pressed_nonstandard_state)->xkey.state |=
+      1 << 25;
 #elif defined(OS_WIN)
   const LPARAM lParam_a = GetLParamFromScanCode(kNativeCodeA);
   const LPARAM lParam_b = GetLParamFromScanCode(kNativeCodeB);
@@ -352,29 +420,38 @@ TEST(EventTest, AutoRepeat) {
   MSG native_event_b_pressed = { NULL, WM_KEYUP, VKEY_B, lParam_b };
 #endif
   KeyEvent key_a1(native_event_a_pressed, false);
-  DCHECK(!key_a1.IsRepeat());
+  EXPECT_FALSE(key_a1.IsRepeat());
   KeyEvent key_a1_released(native_event_a_released, false);
-  DCHECK(!key_a1_released.IsRepeat());
+  EXPECT_FALSE(key_a1_released.IsRepeat());
 
   KeyEvent key_a2(native_event_a_pressed, false);
-  DCHECK(!key_a2.IsRepeat());
+  EXPECT_FALSE(key_a2.IsRepeat());
   KeyEvent key_a2_repeated(native_event_a_pressed, false);
-  DCHECK(key_a2_repeated.IsRepeat());
+  EXPECT_TRUE(key_a2_repeated.IsRepeat());
   KeyEvent key_a2_released(native_event_a_released, false);
-  DCHECK(!key_a2_released.IsRepeat());
+  EXPECT_FALSE(key_a2_released.IsRepeat());
 
   KeyEvent key_a3(native_event_a_pressed, false);
-  DCHECK(!key_a3.IsRepeat());
+  EXPECT_FALSE(key_a3.IsRepeat());
   KeyEvent key_b(native_event_b_pressed, false);
-  DCHECK(!key_b.IsRepeat());
+  EXPECT_FALSE(key_b.IsRepeat());
   KeyEvent key_a3_again(native_event_a_pressed, false);
-  DCHECK(!key_a3_again.IsRepeat());
+  EXPECT_FALSE(key_a3_again.IsRepeat());
   KeyEvent key_a3_repeated(native_event_a_pressed, false);
-  DCHECK(key_a3_repeated.IsRepeat());
+  EXPECT_TRUE(key_a3_repeated.IsRepeat());
   KeyEvent key_a3_repeated2(native_event_a_pressed, false);
-  DCHECK(key_a3_repeated2.IsRepeat());
+  EXPECT_TRUE(key_a3_repeated2.IsRepeat());
   KeyEvent key_a3_released(native_event_a_released, false);
-  DCHECK(!key_a3_released.IsRepeat());
+  EXPECT_FALSE(key_a3_released.IsRepeat());
+
+#if defined(USE_X11)
+  KeyEvent key_a4_pressed(native_event_a_pressed, false);
+  EXPECT_FALSE(key_a4_pressed.IsRepeat());
+
+  KeyEvent key_a4_pressed_nonstandard_state(
+      native_event_a_pressed_nonstandard_state, false);
+  EXPECT_FALSE(key_a4_pressed_nonstandard_state.IsRepeat());
+#endif
 }
 #endif  // USE_X11 || OS_WIN
 
index 82db0ca..5dc6193 100644 (file)
@@ -69,8 +69,7 @@ bool GestureDetector::SimpleGestureListener::OnSingleTapUp(
   return false;
 }
 
-bool GestureDetector::SimpleGestureListener::OnLongPress(const MotionEvent& e) {
-  return false;
+void GestureDetector::SimpleGestureListener::OnLongPress(const MotionEvent& e) {
 }
 
 bool GestureDetector::SimpleGestureListener::OnScroll(const MotionEvent& e1,
@@ -179,7 +178,6 @@ GestureDetector::GestureDetector(
       min_swipe_direction_component_ratio_(0),
       still_down_(false),
       defer_confirm_single_tap_(false),
-      in_longpress_(false),
       always_in_tap_region_(false),
       always_in_bigger_tap_region_(false),
       two_finger_tap_allowed_for_gesture_(false),
@@ -312,7 +310,6 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) {
       always_in_tap_region_ = true;
       always_in_bigger_tap_region_ = true;
       still_down_ = true;
-      in_longpress_ = false;
       defer_confirm_single_tap_ = false;
       two_finger_tap_allowed_for_gesture_ = two_finger_tap_enabled_;
 
@@ -325,9 +322,6 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) {
       break;
 
     case MotionEvent::ACTION_MOVE:
-      if (in_longpress_)
-        break;
-
       {
         const float scroll_x = last_focus_x_ - focus_x;
         const float scroll_y = last_focus_y_ - focus_y;
@@ -391,9 +385,6 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) {
           // Finally, give the up event of the double-tap.
           DCHECK(double_tap_listener_);
           handled |= double_tap_listener_->OnDoubleTapEvent(ev);
-        } else if (in_longpress_) {
-          timeout_handler_->StopTimeout(TAP);
-          in_longpress_ = false;
         } else if (always_in_tap_region_) {
           handled = listener_->OnSingleTapUp(ev);
           if (defer_confirm_single_tap_ && double_tap_listener_ != NULL) {
@@ -489,7 +480,7 @@ void GestureDetector::OnShowPressTimeout() {
 void GestureDetector::OnLongPressTimeout() {
   timeout_handler_->StopTimeout(TAP);
   defer_confirm_single_tap_ = false;
-  in_longpress_ = listener_->OnLongPress(*current_down_event_);
+  listener_->OnLongPress(*current_down_event_);
 }
 
 void GestureDetector::OnTapTimeout() {
@@ -513,7 +504,6 @@ void GestureDetector::CancelTaps() {
   always_in_tap_region_ = false;
   always_in_bigger_tap_region_ = false;
   defer_confirm_single_tap_ = false;
-  in_longpress_ = false;
 }
 
 bool GestureDetector::IsConsideredDoubleTap(
index 786f3dc..db665f8 100644 (file)
@@ -74,7 +74,7 @@ class GestureDetector {
     virtual bool OnDown(const MotionEvent& e) = 0;
     virtual void OnShowPress(const MotionEvent& e) = 0;
     virtual bool OnSingleTapUp(const MotionEvent& e) = 0;
-    virtual bool OnLongPress(const MotionEvent& e) = 0;
+    virtual void OnLongPress(const MotionEvent& e) = 0;
     virtual bool OnScroll(const MotionEvent& e1,
                           const MotionEvent& e2,
                           float distance_x,
@@ -111,7 +111,7 @@ class GestureDetector {
     virtual bool OnDown(const MotionEvent& e) OVERRIDE;
     virtual void OnShowPress(const MotionEvent& e) OVERRIDE;
     virtual bool OnSingleTapUp(const MotionEvent& e) OVERRIDE;
-    virtual bool OnLongPress(const MotionEvent& e) OVERRIDE;
+    virtual void OnLongPress(const MotionEvent& e) OVERRIDE;
     virtual bool OnScroll(const MotionEvent& e1,
                           const MotionEvent& e2,
                           float distance_x,
@@ -182,7 +182,6 @@ class GestureDetector {
 
   bool still_down_;
   bool defer_confirm_single_tap_;
-  bool in_longpress_;
   bool always_in_tap_region_;
   bool always_in_bigger_tap_region_;
   bool two_finger_tap_allowed_for_gesture_;
index f083169..09adcec 100644 (file)
@@ -33,7 +33,7 @@ GestureEventDataPacket::GestureSource ToGestureSource(
 }  // namespace
 
 GestureEventDataPacket::GestureEventDataPacket()
-    : gesture_count_(0), gesture_source_(UNDEFINED) {
+    : gesture_source_(UNDEFINED) {
 }
 
 GestureEventDataPacket::GestureEventDataPacket(
@@ -42,7 +42,6 @@ GestureEventDataPacket::GestureEventDataPacket(
     const gfx::PointF& touch_location,
     const gfx::PointF& raw_touch_location)
     : timestamp_(timestamp),
-      gesture_count_(0),
       touch_location_(touch_location),
       raw_touch_location_(raw_touch_location),
       gesture_source_(source) {
@@ -52,11 +51,10 @@ GestureEventDataPacket::GestureEventDataPacket(
 GestureEventDataPacket::GestureEventDataPacket(
     const GestureEventDataPacket& other)
     : timestamp_(other.timestamp_),
-      gesture_count_(other.gesture_count_),
+      gestures_(other.gestures_),
       touch_location_(other.touch_location_),
       raw_touch_location_(other.raw_touch_location_),
       gesture_source_(other.gesture_source_) {
-  std::copy(other.gestures_, other.gestures_ + other.gesture_count_, gestures_);
 }
 
 GestureEventDataPacket::~GestureEventDataPacket() {
@@ -65,18 +63,16 @@ GestureEventDataPacket::~GestureEventDataPacket() {
 GestureEventDataPacket& GestureEventDataPacket::operator=(
     const GestureEventDataPacket& other) {
   timestamp_ = other.timestamp_;
-  gesture_count_ = other.gesture_count_;
   gesture_source_ = other.gesture_source_;
   touch_location_ = other.touch_location_;
   raw_touch_location_ = other.raw_touch_location_;
-  std::copy(other.gestures_, other.gestures_ + other.gesture_count_, gestures_);
+  gestures_ = other.gestures_;
   return *this;
 }
 
 void GestureEventDataPacket::Push(const GestureEventData& gesture) {
   DCHECK_NE(ET_UNKNOWN, gesture.type());
-  CHECK_LT(gesture_count_, static_cast<size_t>(kMaxGesturesPerTouch));
-  gestures_[gesture_count_++] = gesture;
+  gestures_.push_back(gesture);
 }
 
 GestureEventDataPacket GestureEventDataPacket::FromTouch(
index 36d16c5..0c40f57 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DATA_PACKET_H_
 #define UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DATA_PACKET_H_
 
+#include <vector>
+
 #include "ui/events/gesture_detection/gesture_detection_export.h"
 #include "ui/events/gesture_detection/gesture_event_data.h"
 
@@ -42,7 +44,7 @@ class GESTURE_DETECTION_EXPORT GestureEventDataPacket {
 
   const base::TimeTicks& timestamp() const { return timestamp_; }
   const GestureEventData& gesture(size_t i) const { return gestures_[i]; }
-  size_t gesture_count() const { return gesture_count_; }
+  size_t gesture_count() const { return gestures_.size(); }
   GestureSource gesture_source() const { return gesture_source_; }
   const gfx::PointF& touch_location() const { return touch_location_; }
   const gfx::PointF& raw_touch_location() const { return raw_touch_location_; }
@@ -53,10 +55,9 @@ class GESTURE_DETECTION_EXPORT GestureEventDataPacket {
                          const gfx::PointF& touch_location,
                          const gfx::PointF& raw_touch_location);
 
-  enum { kMaxGesturesPerTouch = 5 };
   base::TimeTicks timestamp_;
-  GestureEventData gestures_[kMaxGesturesPerTouch];
-  size_t gesture_count_;
+  // TODO(jdduke): This vector is in general very short. Optimize?
+  std::vector<GestureEventData> gestures_;
   gfx::PointF touch_location_;
   gfx::PointF raw_touch_location_;
   GestureSource gesture_source_;
index ca68e3c..0255ac7 100644 (file)
@@ -484,17 +484,12 @@ class GestureProvider::GestureListenerImpl
     return false;
   }
 
-  virtual bool OnLongPress(const MotionEvent& e) OVERRIDE {
+  virtual void OnLongPress(const MotionEvent& e) OVERRIDE {
     DCHECK(!IsDoubleTapInProgress());
     SetIgnoreSingleTap(true);
 
     GestureEventDetails long_press_details(ET_GESTURE_LONG_PRESS, 0, 0);
     provider_->Send(CreateGesture(long_press_details, e));
-
-    // Returning true puts the GestureDetector in "longpress" mode, disabling
-    // further scrolling.  This is undesirable, as it is quite common for a
-    // longpress gesture to fire on content that won't trigger a context menu.
-    return false;
   }
 
   void SetDoubleTapEnabled(bool enabled) {
index 5105d6d..0e775dd 100644 (file)
@@ -131,13 +131,11 @@ TouchDispositionGestureFilter::TouchDispositionGestureFilter(
       needs_tap_ending_event_(false),
       needs_show_press_event_(false),
       needs_fling_ending_event_(false),
-      needs_scroll_ending_event_(false),
-      packet_being_sent_(NULL) {
+      needs_scroll_ending_event_(false) {
   DCHECK(client_);
 }
 
 TouchDispositionGestureFilter::~TouchDispositionGestureFilter() {
-  DCHECK(!packet_being_sent_);
 }
 
 TouchDispositionGestureFilter::PacketResult
@@ -210,14 +208,12 @@ bool TouchDispositionGestureFilter::IsEmpty() const {
 
 void TouchDispositionGestureFilter::FilterAndSendPacket(
     const GestureEventDataPacket& packet) {
-  base::AutoReset<const GestureEventDataPacket*> packet_being_sent(
-      &packet_being_sent_, &packet);
   if (packet.gesture_source() == GestureEventDataPacket::TOUCH_SEQUENCE_START) {
-    CancelTapIfNecessary();
-    EndScrollIfNecessary();
-    CancelFlingIfNecessary();
+    CancelTapIfNecessary(packet);
+    EndScrollIfNecessary(packet);
+    CancelFlingIfNecessary(packet);
   } else if (packet.gesture_source() == GestureEventDataPacket::TOUCH_START) {
-    CancelTapIfNecessary();
+    CancelTapIfNecessary(packet);
   }
 
   for (size_t i = 0; i < packet.gesture_count(); ++i) {
@@ -225,31 +221,40 @@ void TouchDispositionGestureFilter::FilterAndSendPacket(
     DCHECK_GE(gesture.details.type(), ET_GESTURE_TYPE_START);
     DCHECK_LE(gesture.details.type(), ET_GESTURE_TYPE_END);
     if (state_.Filter(gesture.details.type())) {
-      CancelTapIfNecessary();
+      CancelTapIfNecessary(packet);
       continue;
     }
-    SendGesture(gesture);
+    if (packet.gesture_source() == GestureEventDataPacket::TOUCH_TIMEOUT) {
+      // Sending a timed gesture could delete |this|, so we need to return
+      // directly after the |SendGesture| call.
+      SendGesture(gesture, packet);
+      return;
+    }
+
+    SendGesture(gesture, packet);
   }
 
   if (packet.gesture_source() ==
       GestureEventDataPacket::TOUCH_SEQUENCE_CANCEL) {
-    EndScrollIfNecessary();
-    CancelTapIfNecessary();
+    EndScrollIfNecessary(packet);
+    CancelTapIfNecessary(packet);
   } else if (packet.gesture_source() ==
              GestureEventDataPacket::TOUCH_SEQUENCE_END) {
-    EndScrollIfNecessary();
+    EndScrollIfNecessary(packet);
   }
 }
 
-void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
+void TouchDispositionGestureFilter::SendGesture(
+    const GestureEventData& event,
+    const GestureEventDataPacket& packet_being_sent) {
   // TODO(jdduke): Factor out gesture stream reparation code into a standalone
   // utility class.
   switch (event.type()) {
     case ET_GESTURE_LONG_TAP:
       if (!needs_tap_ending_event_)
         return;
-      CancelTapIfNecessary();
-      CancelFlingIfNecessary();
+      CancelTapIfNecessary(packet_being_sent);
+      CancelFlingIfNecessary(packet_being_sent);
       break;
     case ET_GESTURE_TAP_DOWN:
       DCHECK(!needs_tap_ending_event_);
@@ -263,13 +268,14 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
       needs_show_press_event_ = false;
       break;
     case ET_GESTURE_DOUBLE_TAP:
-      CancelTapIfNecessary();
+      CancelTapIfNecessary(packet_being_sent);
       needs_show_press_event_ = false;
       break;
     case ET_GESTURE_TAP:
       DCHECK(needs_tap_ending_event_);
       if (needs_show_press_event_) {
-        SendGesture(GestureEventData(ET_GESTURE_SHOW_PRESS, event));
+        SendGesture(GestureEventData(ET_GESTURE_SHOW_PRESS, event),
+                    packet_being_sent);
         DCHECK(!needs_show_press_event_);
       }
       needs_tap_ending_event_ = false;
@@ -279,9 +285,9 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
       needs_tap_ending_event_ = false;
       break;
     case ET_GESTURE_SCROLL_BEGIN:
-      CancelTapIfNecessary();
-      CancelFlingIfNecessary();
-      EndScrollIfNecessary();
+      CancelTapIfNecessary(packet_being_sent);
+      CancelFlingIfNecessary(packet_being_sent);
+      EndScrollIfNecessary(packet_being_sent);
       ending_event_motion_event_id_ = event.motion_event_id;
       needs_scroll_ending_event_ = true;
       break;
@@ -289,7 +295,7 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
       needs_scroll_ending_event_ = false;
       break;
     case ET_SCROLL_FLING_START:
-      CancelFlingIfNecessary();
+      CancelFlingIfNecessary(packet_being_sent);
       ending_event_motion_event_id_ = event.motion_event_id;
       needs_fling_ending_event_ = true;
       needs_scroll_ending_event_ = false;
@@ -303,36 +309,39 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
   client_->ForwardGestureEvent(event);
 }
 
-void TouchDispositionGestureFilter::CancelTapIfNecessary() {
-  DCHECK(packet_being_sent_);
-  if (!needs_tap_ending_event_ || !packet_being_sent_)
+void TouchDispositionGestureFilter::CancelTapIfNecessary(
+    const GestureEventDataPacket& packet_being_sent) {
+  if (!needs_tap_ending_event_)
     return;
 
   SendGesture(CreateGesture(ET_GESTURE_TAP_CANCEL,
                             ending_event_motion_event_id_,
-                            *packet_being_sent_));
+                            packet_being_sent),
+              packet_being_sent);
   DCHECK(!needs_tap_ending_event_);
 }
 
-void TouchDispositionGestureFilter::CancelFlingIfNecessary() {
-  DCHECK(packet_being_sent_);
-  if (!needs_fling_ending_event_ || !packet_being_sent_)
+void TouchDispositionGestureFilter::CancelFlingIfNecessary(
+    const GestureEventDataPacket& packet_being_sent) {
+  if (!needs_fling_ending_event_)
     return;
 
   SendGesture(CreateGesture(ET_SCROLL_FLING_CANCEL,
                             ending_event_motion_event_id_,
-                            *packet_being_sent_));
+                            packet_being_sent),
+              packet_being_sent);
   DCHECK(!needs_fling_ending_event_);
 }
 
-void TouchDispositionGestureFilter::EndScrollIfNecessary() {
-  DCHECK(packet_being_sent_);
-  if (!needs_scroll_ending_event_ || !packet_being_sent_)
+void TouchDispositionGestureFilter::EndScrollIfNecessary(
+    const GestureEventDataPacket& packet_being_sent) {
+  if (!needs_scroll_ending_event_)
     return;
 
   SendGesture(CreateGesture(ET_GESTURE_SCROLL_END,
                             ending_event_motion_event_id_,
-                            *packet_being_sent_));
+                            packet_being_sent),
+              packet_being_sent);
   DCHECK(!needs_scroll_ending_event_);
 }
 
index e3ffd2b..6e57bdb 100644 (file)
@@ -77,10 +77,11 @@ class GESTURE_DETECTION_EXPORT TouchDispositionGestureFilter {
   };
 
   void FilterAndSendPacket(const GestureEventDataPacket& packet);
-  void SendGesture(const GestureEventData& gesture);
-  void CancelTapIfNecessary();
-  void CancelFlingIfNecessary();
-  void EndScrollIfNecessary();
+  void SendGesture(const GestureEventData& gesture,
+                   const GestureEventDataPacket& packet);
+  void CancelTapIfNecessary(const GestureEventDataPacket& packet);
+  void CancelFlingIfNecessary(const GestureEventDataPacket& packet);
+  void EndScrollIfNecessary(const GestureEventDataPacket& packet);
   void PopGestureSequence();
   GestureSequence& Head();
   GestureSequence& Tail();
@@ -98,8 +99,6 @@ class GESTURE_DETECTION_EXPORT TouchDispositionGestureFilter {
   bool needs_show_press_event_;
   bool needs_fling_ending_event_;
   bool needs_scroll_ending_event_;
-  // Only valid in the scope of |FilterAndSendPacket()|.
-  const GestureEventDataPacket* packet_being_sent_;
 
   DISALLOW_COPY_AND_ASSIGN(TouchDispositionGestureFilter);
 };
index 5c966eb..e929131 100644 (file)
@@ -99,7 +99,7 @@
 <translation id="7135556860107312402">Tillad underretninger fra følgende:</translation>
 <translation id="2479520428668657293">Flyt til højre, og rediger markering</translation>
 <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> timer</translation>
-<translation id="1398853756734560583">Maksimer</translation>
+<translation id="1398853756734560583">Maksimér</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="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="2482878487686419369">Underretninger</translation>
 <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
 <translation id="3183922693828471536">Scroll hertil</translation>
 <translation id="4552416320897244156">PgDwn</translation>
index e5b95aa..b055279 100644 (file)
@@ -48,7 +48,7 @@
 <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="3087734570205094154">Apakšā</translation>
 <translation id="8828991073132329143"><ph name="NUMBER_MANY"/> seconds left</translation>
 <translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minūtes atlikušas</translation>
 <translation id="1860796786778352021">Paziņojuma aizvēršana</translation>
index ac44783..08f3170 100644 (file)
 <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minutt</translation>
 <translation id="8448317557906454022">For <ph name="NUMBER_ZERO"/> sekunder siden</translation>
 <translation id="4927753642311223124">Her er det ikke noe nytt. Men intet nytt er jo godt nytt!</translation>
-<translation id="2482878487686419369">Varslinger</translation>
+<translation id="2482878487686419369">Varsler</translation>
 <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
 <translation id="3183922693828471536">Rull hit</translation>
 <translation id="4552416320897244156">PgDwn</translation>
index f381475..18183f1 100644 (file)
@@ -3,60 +3,60 @@
 <translationbundle lang="ro">
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME"/></translation>
 <translation id="8806053966018712535">Dosarul <ph name="FOLDER_NAME"/></translation>
-<translation id="1871244248791675517">Ins (Inserați)</translation>
+<translation id="1871244248791675517">Ins</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="528468243742722775">Sfârșit</translation>
+<translation id="5341849548509163798">Acum <ph name="NUMBER_MANY"/> ore</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">Perioada</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> de 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="5613020302032141669">Săgeată spre stânga</translation>
 <translation id="4971687151119236543">Melodia anterioară din conținutul media</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="542155483965056918">Acum <ph name="NUMBER_ZERO"/> minute</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="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="1761785978543082658"><ph name="QUANTITY"/> B</translation>
+<translation id="3660179305079774227">Săgeată în sus</translation>
 <translation id="3969863827134279083">Mutați în sus</translation>
 <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> secundă rămasă</translation>
-<translation id="1809410197924942083"><ph name="QUANTITY"/> MO/s</translation>
-<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ore</translation>
+<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> de ore</translation>
 <translation id="3990502903496589789">Marginea dreaptă</translation>
 <translation id="9038489124413477075">Dosar fără nume</translation>
 <translation id="1940483897317142625">Ștergeți până la sfârșitul rândului</translation>
-<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minute</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> de 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="3909791450649380159">&amp;Tăiaț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="3353284378027041011">Acum <ph name="NUMBER_FEW"/> zile</translation>
 <translation id="5076340679995252485">&amp;Inserați</translation>
-<translation id="7460907917090416791"><ph name="QUANTITY"/> TO</translation>
+<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
 <translation id="7139614227326422685">Mutați la cuvântul următor</translation>
 <translation id="364720409959344976">Selectați un dosar de încărcat</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
-<translation id="7770995925463083016">Cu <ph name="NUMBER_TWO"/> minute în urmă</translation>
-<translation id="3234408098842461169">Săgeata în jos</translation>
+<translation id="7770995925463083016">Acum <ph name="NUMBER_TWO"/> minute</translation>
+<translation id="3234408098842461169">Săgeată în jos</translation>
 <translation id="3087734570205094154">Jos</translation>
 <translation id="8828991073132329143"><ph name="NUMBER_MANY"/> secunde rămase</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="2629089419211541119">Acum <ph name="NUMBER_ONE"/> oră</translation>
 <translation id="4218160142017529598">Ștergeți înapoi</translation>
 <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minute</translation>
-<translation id="6982279413068714821">Cu <ph name="NUMBER_DEFAULT"/> (de) minute în urmă</translation>
+<translation id="6982279413068714821">Acum <ph name="NUMBER_DEFAULT"/> de minute</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="8210608804940886430">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="6556866813142980365">Refaceți</translation>
+<translation id="5329858601952122676">&amp;Ștergeți</translation>
+<translation id="6556866813142980365">Repetaț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="7275974018215686543">Acum <ph name="NUMBER_MANY"/> secunde</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="5517291721709019259"><ph name="NUMBER_FEW"/> secunde rămase</translation>
 <translation id="6903282483217634857">Mutați spre dreapta</translation>
-<translation id="6659594942844771486">Tab</translation>
-<translation id="3049748772180311791"><ph name="QUANTITY"/> MO</translation>
-<translation id="4988273303304146523">Cu <ph name="NUMBER_DEFAULT"/> zile în urmă</translation>
+<translation id="6659594942844771486">Filă</translation>
+<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Acum <ph name="NUMBER_DEFAULT"/> de zile</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="5110450810124758964">Acum <ph name="NUMBER_ONE"/> zi</translation>
 <translation id="2820806154655529776"><ph name="NUMBER_ONE"/> secundă</translation>
 <translation id="4320177379694898372">Fără conexiune la internet</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="3889424535448813030">Săgeată spre dreapta</translation>
+<translation id="4229495110203539533">Acum <ph name="NUMBER_ONE"/> secundă</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> de 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="6690744523875189208"><ph name="NUMBER_TWO"/> ore</translation>
 <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minute rămase</translation>
 <translation id="2557207087669398617">Mutați la începutul rândului</translation>
-<translation id="3757388668994797779"><ph name="QUANTITY"/> GO</translation>
+<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</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="9107059250669762581"><ph name="NUMBER_DEFAULT"/> de zile</translation>
 <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minute</translation>
 <translation id="6122334925474904337">Mutați la cuvântul următor și modificați selecția</translation>
 <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation>
-<translation id="8448317557906454022">Cu <ph name="NUMBER_ZERO"/> secunde în urmă</translation>
+<translation id="8448317557906454022">Acum <ph name="NUMBER_ZERO"/> secunde</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="4552416320897244156">PgDwn</translation>
 <translation id="3066573403916685335">Mutați în jos</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ore</translation>
 <translation id="8394908167088220973">Redați/întrerupeți conținutul media</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="4373894838514502496">Acum <ph name="NUMBER_FEW"/> minute</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="1164369517022005061"><ph name="NUMBER_DEFAULT"/> de 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="8447116497070723931">PgUp</translation>
 <translation id="4588090240171750605">Derulați spre dreapta</translation>
 <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> oră rămasă</translation>
 <translation id="1413622004203049571">Dezactivați notificările de la <ph name="NOTIFIER_NAME"/></translation>
 <translation id="7907591526440419938">Deschideți fișierul</translation>
 <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> zile rămase</translation>
 <translation id="2803313416453193357">Deschideți dosarul</translation>
-<translation id="1293699935367580298">Esc (Ieșiți)</translation>
-<translation id="2797524280730715045">Cu <ph name="NUMBER_DEFAULT"/> (de) ore în urmă</translation>
+<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Acum <ph name="NUMBER_DEFAULT"/> de ore</translation>
 <translation id="815598010540052116">Derulați în jos</translation>
 <translation id="6808150112686056157">Opriți conținutul media</translation>
 <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> minute rămase</translation>
 <translation id="8471049483003785219">Mutați la cuvântul anterior și modificați selecția</translation>
 <translation id="945522503751344254">Trimiteți feedback</translation>
 <translation id="9170848237812810038">&amp;Anulați</translation>
-<translation id="1285266685456062655">Cu <ph name="NUMBER_FEW"/> ore în urmă</translation>
+<translation id="1285266685456062655">Acum <ph name="NUMBER_FEW"/> ore</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="1270251962578273213"><ph name="NUMBER_TWO"/> secunde rămase</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="6358975074282722691">Acum <ph name="NUMBER_TWO"/> secunde</translation>
+<translation id="520299402983819650"><ph name="QUANTITY"/> PB</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="5368780922436099921"><ph name="NUMBER_ZERO"/> secunde rămase</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="5263972071113911534">Acum <ph name="NUMBER_MANY"/> zile</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="2679312662830811292">Acum <ph name="NUMBER_ONE"/> minut</translation>
+<translation id="8788572795284305350">Acum <ph name="NUMBER_ZERO"/> ore</translation>
+<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
 <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> zi</translation>
 <translation id="2704295676501803339">Mutați spre stânga</translation>
-<translation id="9098468523912235228">Cu <ph name="NUMBER_DEFAULT"/> (de) secunde în urmă</translation>
+<translation id="9098468523912235228">Acum <ph name="NUMBER_DEFAULT"/> de secunde</translation>
 <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secunde rămase</translation>
 <translation id="566737009157135450">Ștergeți înapoi un cuvânt</translation>
 <translation id="436869212180315161">Apăsați</translation>
-<translation id="4860787810836767172">Cu <ph name="NUMBER_FEW"/> secunde în urmă</translation>
-<translation id="2297836609126180313"><ph name="QUANTITY"/> TO/s</translation>
+<translation id="4860787810836767172">Acum <ph name="NUMBER_FEW"/> secunde</translation>
+<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/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="1101671447232096497">Acum <ph name="NUMBER_MANY"/> minute</translation>
+<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
 <translation id="7649070708921625228">Ajutor</translation>
 <translation id="2405367043325750948">Ștergeți înainte</translation>
 <translation id="6699343763173986273">Melodia următoare din conținutul media</translation>
 <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> de secunde rămase</translation>
 <translation id="8226233771743600312">Nu deranja o zi</translation>
 <translation id="4252565523989510616">Ștergeți înainte un cuvânt</translation>
-<translation id="7457942297256758195">Ștergeți-le pe toate</translation>
-<translation id="822618367988303761">Cu <ph name="NUMBER_TWO"/> zile în urmă</translation>
+<translation id="7457942297256758195">Ștergeți tot</translation>
+<translation id="822618367988303761">Acum <ph name="NUMBER_TWO"/> zile</translation>
 <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minute</translation>
-<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> zile rămase</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> de zile rămase</translation>
 <translation id="6786750046913594791">Închideți dosarul</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="8959208747503200525">Acum <ph name="NUMBER_TWO"/> ore</translation>
 <translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
-<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> secunde</translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> de 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="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
 <translation id="2743387203779672305">Copiați în clipboard</translation>
-<translation id="8371695176452482769">Vorbiți acum</translation>
+<translation id="8371695176452482769">Rostiți acum</translation>
 <translation id="1167268268675672572">Mutați la începutul rândului și modificați selecția</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="7850320739366109486">Nu deranja</translation>
-<translation id="6978839998405419496">Cu <ph name="NUMBER_ZERO"/> zile în urmă</translation>
+<translation id="6978839998405419496">Acum <ph name="NUMBER_ZERO"/> zile</translation>
 <translation id="5941711191222866238">Minimizați</translation>
 <translation id="6394627529324717982">Virgulă</translation>
 <translation id="3036649622769666520">Deschideți fișierele</translation>
index 26ca3ec..b557838 100644 (file)
@@ -30,7 +30,7 @@
 <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ชั่วโมง</translation>
 <translation id="3990502903496589789">ขอบขวา</translation>
 <translation id="9038489124413477075">โฟลเดอร์ที่ไม่มีชื่อ</translation>
-<translation id="1940483897317142625">à¸\99ำออà¸\81จนสุดบรรทัด</translation>
+<translation id="1940483897317142625">ลà¸\9aจนสุดบรรทัด</translation>
 <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> นาที</translation>
 <translation id="3520476450377425184">เหลือ <ph name="NUMBER_MANY"/> วัน</translation>
 <translation id="932327136139879170">หน้าแรก</translation>
 <translation id="1860796786778352021">ปิดการแจ้งเตือน</translation>
 <translation id="6364916375976753737">เลื่อนทางซ้าย</translation>
 <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ชั่วโมงที่ผ่านมา</translation>
-<translation id="4218160142017529598">à¸\99ำออà¸\81ย้อนหลัง</translation>
+<translation id="4218160142017529598">ลà¸\9aย้อนหลัง</translation>
 <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> นาที</translation>
 <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> นาทีที่ผ่านมา</translation>
 <translation id="6945221475159498467">เลือก</translation>
 <translation id="6620110761915583480">บันทึกไฟล์</translation>
 <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
-<translation id="8924469368910458384">à¸\99ำออà¸\81จนถึงจุดเริ่มต้นบรรทัด</translation>
+<translation id="8924469368910458384">ลà¸\9aจนถึงจุดเริ่มต้นบรรทัด</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;à¸\99ำออà¸\81</translation>
+<translation id="5329858601952122676">&amp;ลà¸\9a</translation>
 <translation id="6556866813142980365">ทำซ้ำ</translation>
 <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> วินาที</translation>
 <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
 <translation id="2704295676501803339">เลื่อนไปทางซ้าย</translation>
 <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> วินาทีที่ผ่านมา</translation>
 <translation id="494645311413743213">เหลือ <ph name="NUMBER_TWO"/> วินาที</translation>
-<translation id="566737009157135450">à¸\99ำออà¸\81คำย้อนหลัง</translation>
+<translation id="566737009157135450">ลà¸\9aคำย้อนหลัง</translation>
 <translation id="436869212180315161">กด</translation>
 <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> วินาทีที่ผ่านมา</translation>
 <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/วินาที</translation>
 <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> นาทีที่ผ่านมา</translation>
 <translation id="6142413573757616983"><ph name="QUANTITY"/> B/วินาที</translation>
 <translation id="7649070708921625228">ช่วยเหลือ</translation>
-<translation id="2405367043325750948">à¸\99ำออà¸\81ไปข้างหน้า</translation>
+<translation id="2405367043325750948">ลà¸\9aไปข้างหน้า</translation>
 <translation id="6699343763173986273">แทร็กถัดไปของสื่อ</translation>
 <translation id="5445120697129764393">เหลือ <ph name="NUMBER_DEFAULT"/> วินาที</translation>
 <translation id="8226233771743600312">ห้ามรบกวนเป็นเวลาหนึ่งวัน</translation>
-<translation id="4252565523989510616">à¸\99ำออà¸\81คำไปข้างหน้า</translation>
+<translation id="4252565523989510616">ลà¸\9aคำไปข้างหน้า</translation>
 <translation id="7457942297256758195">ล้างทั้งหมด</translation>
 <translation id="822618367988303761"><ph name="NUMBER_TWO"/> วันที่ผ่านมา</translation>
 <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> นาที</translation>
index fb5e177..670de4d 100644 (file)
@@ -30,9 +30,6 @@
 namespace views {
 namespace {
 
-// A version of the OBJID_CLIENT constant that works in 64-bit mode too.
-static const LPARAM kObjIdClient = static_cast<ULONG>(OBJID_CLIENT);
-
 class AccessibleWebViewRegistry {
  public:
   static AccessibleWebViewRegistry* GetInstance();
index fa358c1..c039914 100644 (file)
@@ -244,7 +244,8 @@ void LabelButton::Layout() {
   // The label takes any remaining width after sizing the image, unless both
   // views are centered. In that case, using the tighter preferred label width
   // avoids wasted space within the label that would look like awkward padding.
-  gfx::Size label_size(child_area.size());
+  // Labels can paint over the full button height, including the border height.
+  gfx::Size label_size(child_area.width(), height());
   if (!image_size.IsEmpty() && !label_size.IsEmpty()) {
     label_size.set_width(
         std::max(child_area.width() - image_size.width() - kSpacing, 0));
@@ -267,7 +268,7 @@ void LabelButton::Layout() {
     image_origin.Offset(child_area.width() - image_size.width(), 0);
   }
 
-  gfx::Point label_origin(child_area.origin());
+  gfx::Point label_origin(child_area.x(), 0);
   if (!image_size.IsEmpty() && adjusted_alignment != gfx::ALIGN_RIGHT)
     label_origin.set_x(image_origin.x() + image_size.width() + kSpacing);
 
index 0793e39..6778545 100644 (file)
@@ -64,6 +64,10 @@ bool MenuDelegate::IsCommandEnabled(int id) const {
   return true;
 }
 
+bool MenuDelegate::IsCommandVisible(int id) const {
+  return true;
+}
+
 bool MenuDelegate::GetContextualLabel(int id, base::string16* out) const {
   return false;
 }
index 7f4b74f..fafccd7 100644 (file)
@@ -121,6 +121,7 @@ class VIEWS_EXPORT MenuDelegate {
   // Controller
   virtual bool SupportsCommand(int id) const;
   virtual bool IsCommandEnabled(int id) const;
+  virtual bool IsCommandVisible(int id) const;
   virtual bool GetContextualLabel(int id, base::string16* out) const;
   virtual void ExecuteCommand(int id) {
   }
index 0583ff1..f24c610 100644 (file)
@@ -254,6 +254,8 @@ MenuItemView* MenuItemView::AddMenuItemAt(
     item->SetIcon(icon);
   if (type == SUBMENU)
     item->CreateSubmenu();
+  if (GetDelegate() && !GetDelegate()->IsCommandVisible(item_id))
+    item->SetVisible(false);
   submenu_->AddChildViewAt(item, index);
   return item;
 }
index 18c4269..55c5d7d 100644 (file)
@@ -205,6 +205,16 @@ bool MenuModelAdapter::IsCommandEnabled(int id) const {
   return false;
 }
 
+bool MenuModelAdapter::IsCommandVisible(int id) const {
+  ui::MenuModel* model = menu_model_;
+  int index = 0;
+  if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
+    return model->IsVisibleAt(index);
+
+  NOTREACHED();
+  return false;
+}
+
 bool MenuModelAdapter::IsItemChecked(int id) const {
   ui::MenuModel* model = menu_model_;
   int index = 0;
@@ -265,9 +275,6 @@ void MenuModelAdapter::BuildMenuImpl(MenuItemView* menu, ui::MenuModel* model) {
   for (int i = 0; i < item_count; ++i) {
     MenuItemView* item = AppendMenuItem(menu, model, i);
 
-    if (item)
-      item->SetVisible(model->IsVisibleAt(i));
-
     if (model->GetTypeAt(i) == ui::MenuModel::TYPE_SUBMENU) {
       DCHECK(item);
       DCHECK_EQ(MenuItemView::SUBMENU, item->GetType());
index 8bc7ca3..353d010 100644 (file)
@@ -71,6 +71,7 @@ class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate {
   virtual base::string16 GetLabel(int id) const OVERRIDE;
   virtual const gfx::FontList* GetLabelFontList(int id) const OVERRIDE;
   virtual bool IsCommandEnabled(int id) const OVERRIDE;
+  virtual bool IsCommandVisible(int id) const OVERRIDE;
   virtual bool IsItemChecked(int id) const OVERRIDE;
   virtual void SelectionChanged(MenuItemView* menu) OVERRIDE;
   virtual void WillShowMenu(MenuItemView* menu) OVERRIDE;
index cb3e542..f28f8f2 100644 (file)
@@ -1314,12 +1314,17 @@ void Textfield::InsertText(const base::string16& new_text) {
 }
 
 void Textfield::InsertChar(base::char16 ch, int flags) {
+  const int kControlModifierMask = ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
+                                   ui::EF_COMMAND_DOWN | ui::EF_ALTGR_DOWN |
+                                   ui::EF_MOD3_DOWN;
+
   // Filter out all control characters, including tab and new line characters,
   // and all characters with Alt modifier. But allow characters with the AltGr
   // modifier. On Windows AltGr is represented by Alt+Ctrl, and on Linux it's a
   // different flag that we don't care about.
-  const bool should_insert_char = ((ch >= 0x20 && ch < 0x7F) || ch > 0x9F) &&
-      (flags & ~(ui::EF_SHIFT_DOWN | ui::EF_CAPS_LOCK_DOWN)) != ui::EF_ALT_DOWN;
+  const bool should_insert_char =
+      ((ch >= 0x20 && ch < 0x7F) || ch > 0x9F) &&
+      (flags & kControlModifierMask) != ui::EF_ALT_DOWN;
   if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE || !should_insert_char)
     return;
 
index 5aa3013..f2bb6b1 100644 (file)
@@ -20,6 +20,7 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/display.h"
 #include "ui/gfx/point_conversions.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/screen.h"
 #include "ui/gfx/size_conversions.h"
 #include "ui/native_theme/native_theme.h"
@@ -258,7 +259,6 @@ DesktopNativeWidgetAura::DesktopNativeWidgetAura(
       native_widget_delegate_(delegate),
       last_drop_operation_(ui::DragDropTypes::DRAG_NONE),
       restore_focus_on_activate_(false),
-      restore_focus_on_window_focus_(false),
       cursor_(gfx::kNullCursor),
       widget_type_(Widget::InitParams::TYPE_WINDOW) {
   aura::client::SetFocusChangeObserver(content_window_, this);
@@ -711,9 +711,8 @@ void DesktopNativeWidgetAura::SetBounds(const gfx::Rect& bounds) {
     scale = gfx::Screen::GetScreenFor(root)->
         GetDisplayNearestWindow(root).device_scale_factor();
   }
-  gfx::Rect bounds_in_pixels(
-      gfx::ToCeiledPoint(gfx::ScalePoint(bounds.origin(), scale)),
-      gfx::ToFlooredSize(gfx::ScaleSize(bounds.size(), scale)));
+  gfx::Rect bounds_in_pixels =
+    gfx::ScaleToEnclosingRect(bounds, scale, scale);
   desktop_window_tree_host_->AsWindowTreeHost()->SetBounds(bounds_in_pixels);
 }
 
@@ -933,6 +932,11 @@ void DesktopNativeWidgetAura::OnRootViewLayout() const {
     desktop_window_tree_host_->OnRootViewLayout();
 }
 
+bool DesktopNativeWidgetAura::IsTranslucentWindowOpacitySupported() const {
+  return content_window_ &&
+      desktop_window_tree_host_->IsTranslucentWindowOpacitySupported();
+}
+
 void DesktopNativeWidgetAura::RepostNativeEvent(gfx::NativeEvent native_event) {
   OnEvent(native_event);
 }
@@ -1091,23 +1095,14 @@ void DesktopNativeWidgetAura::OnWindowFocused(aura::Window* gained_focus,
     native_widget_delegate_->OnNativeFocus(lost_focus);
 
     // If focus is moving from a descendant Window to |content_window_| then
-    // native activation hasn't changed. Still, the InputMethod and FocusManager
-    // must be informed of the Window focus change.
+    // native activation hasn't changed. Still, the InputMethod must be informed
+    // of the Window focus change.
     InputMethod* input_method = GetWidget()->GetInputMethod();
     if (input_method)
       input_method->OnFocus();
-
-    if (restore_focus_on_window_focus_) {
-      restore_focus_on_window_focus_ = false;
-      GetWidget()->GetFocusManager()->RestoreFocusedView();
-    }
   } else if (content_window_ == lost_focus) {
     desktop_window_tree_host_->OnNativeWidgetBlur();
     native_widget_delegate_->OnNativeBlur(gained_focus);
-
-    DCHECK(!restore_focus_on_window_focus_);
-    restore_focus_on_window_focus_ = true;
-    GetWidget()->GetFocusManager()->StoreFocusedView(false);
   }
 }
 
index f265814..16a56d9 100644 (file)
@@ -178,6 +178,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
   virtual void SetVisibilityChangedAnimationsEnabled(bool value) OVERRIDE;
   virtual ui::NativeTheme* GetNativeTheme() const OVERRIDE;
   virtual void OnRootViewLayout() const OVERRIDE;
+  virtual bool IsTranslucentWindowOpacitySupported() const OVERRIDE;
   virtual void RepostNativeEvent(gfx::NativeEvent native_event) OVERRIDE;
 
   // Overridden from aura::WindowDelegate:
@@ -292,7 +293,6 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
       window_modality_controller_;
 
   bool restore_focus_on_activate_;
-  bool restore_focus_on_window_focus_;
 
   gfx::NativeCursor cursor_;
   // We must manually reference count the number of users of |cursor_manager_|
index 26925b6..9ccb672 100644 (file)
@@ -153,6 +153,9 @@ class VIEWS_EXPORT DesktopWindowTreeHost {
   // Returns true if the Widget was closed but is still showing because of
   // animations.
   virtual bool IsAnimatingClosed() const = 0;
+
+  // Returns true if the Widget supports translucency.
+  virtual bool IsTranslucentWindowOpacitySupported() const = 0;
 };
 
 }  // namespace views
index fc2bda6..6347526 100644 (file)
@@ -365,7 +365,7 @@ void DesktopWindowTreeHostWin::SetVisibilityChangedAnimationsEnabled(
 }
 
 bool DesktopWindowTreeHostWin::ShouldUseNativeFrame() const {
-  return ui::win::IsAeroGlassEnabled();
+  return IsTranslucentWindowOpacitySupported();
 }
 
 bool DesktopWindowTreeHostWin::ShouldWindowContentsBeTransparent() const {
@@ -427,6 +427,10 @@ bool DesktopWindowTreeHostWin::IsAnimatingClosed() const {
   return pending_close_;
 }
 
+bool DesktopWindowTreeHostWin::IsTranslucentWindowOpacitySupported() const {
+  return ui::win::IsAeroGlassEnabled();
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHostWin, WindowTreeHost implementation:
 
index 5fb0639..225365f 100644 (file)
@@ -103,6 +103,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin
   virtual void OnNativeWidgetFocus() OVERRIDE;
   virtual void OnNativeWidgetBlur() OVERRIDE;
   virtual bool IsAnimatingClosed() const OVERRIDE;
+  virtual bool IsTranslucentWindowOpacitySupported() const OVERRIDE;
 
   // Overridden from aura::WindowTreeHost:
   virtual ui::EventSource* GetEventSource() OVERRIDE;
index bdf0d19..8bcf7fd 100644 (file)
@@ -296,6 +296,7 @@ DesktopWindowTreeHostX11::CreateDragDropClient(
 
 void DesktopWindowTreeHostX11::Close() {
   // TODO(erg): Might need to do additional hiding tasks here.
+  delayed_resize_task_.Cancel();
 
   if (!close_widget_factory_.HasWeakPtrs()) {
     // And we delay the close so that if we are called from an ATL callback,
@@ -831,6 +832,10 @@ bool DesktopWindowTreeHostX11::IsAnimatingClosed() const {
   return false;
 }
 
+bool DesktopWindowTreeHostX11::IsTranslucentWindowOpacitySupported() const {
+  return false;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHostX11, aura::WindowTreeHost implementation:
 
@@ -1631,12 +1636,18 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent(
       bool origin_changed = bounds_.origin() != bounds.origin();
       previous_bounds_ = bounds_;
       bounds_ = bounds;
-      if (size_changed)
-        OnHostResized(bounds.size());
+
       if (origin_changed)
         OnHostMoved(bounds_.origin());
-      if (size_changed)
-        ResetWindowRegion();
+
+      if (size_changed) {
+        delayed_resize_task_.Reset(base::Bind(
+            &DesktopWindowTreeHostX11::DelayedResize,
+            close_widget_factory_.GetWeakPtr(),
+            bounds.size()));
+        base::MessageLoop::current()->PostTask(
+            FROM_HERE, delayed_resize_task_.callback());
+      }
       break;
     }
     case GenericEvent: {
@@ -1797,6 +1808,12 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent(
   return ui::POST_DISPATCH_STOP_PROPAGATION;
 }
 
+void DesktopWindowTreeHostX11::DelayedResize(const gfx::Size& size) {
+  OnHostResized(size);
+  ResetWindowRegion();
+  delayed_resize_task_.Cancel();
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHost, public:
 
index cbcd9fc..a67a151 100644 (file)
@@ -9,6 +9,7 @@
 #include <X11/Xlib.h>
 
 #include "base/basictypes.h"
+#include "base/cancelable_callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "ui/aura/window_tree_host.h"
@@ -144,6 +145,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostX11
   virtual void OnNativeWidgetFocus() OVERRIDE;
   virtual void OnNativeWidgetBlur() OVERRIDE;
   virtual bool IsAnimatingClosed() const OVERRIDE;
+  virtual bool IsTranslucentWindowOpacitySupported() const OVERRIDE;
 
   // Overridden from aura::WindowTreeHost:
   virtual ui::EventSource* GetEventSource() OVERRIDE;
@@ -232,6 +234,8 @@ class VIEWS_EXPORT DesktopWindowTreeHostX11
   virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
   virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
 
+  void DelayedResize(const gfx::Size& size);
+
   base::WeakPtrFactory<DesktopWindowTreeHostX11> close_widget_factory_;
 
   // X11 things
@@ -331,6 +335,8 @@ class VIEWS_EXPORT DesktopWindowTreeHostX11
   // the frame when |xwindow_| gains focus or handles a mouse button event.
   bool urgency_hint_set_;
 
+  base::CancelableCallback<void()> delayed_resize_task_;
+
   DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostX11);
 };
 
index e26c52c..150a1a4 100644 (file)
@@ -691,6 +691,10 @@ ui::NativeTheme* NativeWidgetAura::GetNativeTheme() const {
 void NativeWidgetAura::OnRootViewLayout() const {
 }
 
+bool NativeWidgetAura::IsTranslucentWindowOpacitySupported() const {
+  return true;
+}
+
 void NativeWidgetAura::RepostNativeEvent(gfx::NativeEvent native_event) {
   OnEvent(native_event);
 }
@@ -904,7 +908,6 @@ void NativeWidgetAura::OnWindowFocused(aura::Window* gained_focus,
     if (GetWidget()->GetInputMethod())  // Null in tests.
       GetWidget()->GetInputMethod()->OnFocus();
     delegate_->OnNativeFocus(lost_focus);
-    GetWidget()->GetFocusManager()->RestoreFocusedView();
   } else if (window_ == lost_focus) {
     // GetInputMethod() recreates the input method if it's previously been
     // destroyed.  If we get called during destruction, the input method will be
@@ -921,7 +924,6 @@ void NativeWidgetAura::OnWindowFocused(aura::Window* gained_focus,
     }
 
     delegate_->OnNativeBlur(gained_focus);
-    GetWidget()->GetFocusManager()->StoreFocusedView(true);
   }
 }
 
index 3b1e58a..dd6fafe 100644 (file)
@@ -132,6 +132,7 @@ class VIEWS_EXPORT NativeWidgetAura
   virtual void SetVisibilityChangedAnimationsEnabled(bool value) OVERRIDE;
   virtual ui::NativeTheme* GetNativeTheme() const OVERRIDE;
   virtual void OnRootViewLayout() const OVERRIDE;
+  virtual bool IsTranslucentWindowOpacitySupported() const OVERRIDE;
   virtual void RepostNativeEvent(gfx::NativeEvent native_event) OVERRIDE;
 
   // Overridden from views::InputMethodDelegate:
index 0cd87b7..64cb9a3 100644 (file)
@@ -102,6 +102,7 @@ class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate {
   virtual void SetVisibilityChangedAnimationsEnabled(bool value) OVERRIDE;
   virtual ui::NativeTheme* GetNativeTheme() const OVERRIDE;
   virtual void OnRootViewLayout() const OVERRIDE;
+  virtual bool IsTranslucentWindowOpacitySupported() const OVERRIDE;
   virtual void RepostNativeEvent(gfx::NativeEvent native_event) OVERRIDE;
 
  private:
index 729207a..37545b9 100644 (file)
@@ -359,6 +359,10 @@ void NativeWidgetMac::OnRootViewLayout() const {
   NOTIMPLEMENTED();
 }
 
+bool NativeWidgetMac::IsTranslucentWindowOpacitySupported() const {
+  return false;
+}
+
 void NativeWidgetMac::RepostNativeEvent(gfx::NativeEvent native_event) {
   NOTIMPLEMENTED();
 }
index d87bb0f..8c9233a 100644 (file)
@@ -227,6 +227,7 @@ class VIEWS_EXPORT NativeWidgetPrivate : public NativeWidget {
   virtual void SetVisibilityChangedAnimationsEnabled(bool value) = 0;
   virtual ui::NativeTheme* GetNativeTheme() const = 0;
   virtual void OnRootViewLayout() const = 0;
+  virtual bool IsTranslucentWindowOpacitySupported() const = 0;
 
   // Repost an unhandled event to the native widget for default OS processing.
   virtual void RepostNativeEvent(gfx::NativeEvent native_event) = 0;
index d97862c..6de5217 100644 (file)
@@ -983,6 +983,10 @@ void Widget::OnRootViewLayout() {
   native_widget_->OnRootViewLayout();
 }
 
+bool Widget::IsTranslucentWindowOpacitySupported() const {
+  return native_widget_->IsTranslucentWindowOpacitySupported();
+}
+
 void Widget::OnOwnerClosing() {
 }
 
index 8544e88..299b9d5 100644 (file)
@@ -198,6 +198,9 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
     WidgetDelegate* delegate;
     bool child;
     // If TRANSLUCENT_WINDOW, the widget may be fully or partially transparent.
+    // Translucent windows may not always be supported. Use
+    // IsTranslucentWindowOpacitySupported to determine if translucent windows
+    // are supported.
     // If OPAQUE_WINDOW, we can perform optimizations based on the widget being
     // fully opaque.  Defaults to TRANSLUCENT_WINDOW if
     // ViewsDelegate::UseTransparentWindows().  Defaults to OPAQUE_WINDOW for
@@ -729,6 +732,9 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
   // window sizing information to the window server on some platforms.
   void OnRootViewLayout();
 
+  // Whether the widget supports translucency.
+  bool IsTranslucentWindowOpacitySupported() const;
+
   // Notification that our owner is closing.
   // NOTE: this is not invoked for aura as it's currently not needed there.
   // Under aura menus close by way of activation getting reset when the owner
index d6ab099..d606206 100644 (file)
@@ -623,6 +623,7 @@ class WidgetWithDestroyedNativeViewTest : public ViewsTestBase {
     widget->ReleaseCapture();
     widget->HasCapture();
     widget->GetWorkAreaBoundsInScreen();
+    widget->IsTranslucentWindowOpacitySupported();
   }
 
  private:
index e4f55bf..adbe4fa 100644 (file)
@@ -45,9 +45,6 @@
 namespace views {
 namespace {
 
-// A version of the OBJID_CLIENT constant that works in 64-bit mode too.
-static const LPARAM kObjIdClient = static_cast<ULONG>(OBJID_CLIENT);
-
 // MoveLoopMouseWatcher is used to determine if the user canceled or completed a
 // move. win32 doesn't appear to offer a way to determine the result of a move,
 // so we install hooks to determine if we got a mouse up and assume the move
@@ -1419,8 +1416,12 @@ LRESULT HWNDMessageHandler::OnGetObject(UINT message,
                                         LPARAM l_param) {
   LRESULT reference_result = static_cast<LRESULT>(0L);
 
+  // Only the lower 32 bits of l_param are valid when checking the object id
+  // because it sometimes gets sign-extended incorrectly (but not always).
+  DWORD obj_id = static_cast<DWORD>(static_cast<DWORD_PTR>(l_param));
+
   // Accessibility readers will send an OBJID_CLIENT message
-  if (kObjIdClient == l_param) {
+  if (OBJID_CLIENT == obj_id) {
     // Retrieve MSAA dispatch object for the root view.
     base::win::ScopedComPtr<IAccessible> root(
         delegate_->GetNativeViewAccessible());
index 368e972..abf66f9 100644 (file)
@@ -4448,6 +4448,21 @@ class V8_EXPORT Isolate {
    */
   bool WillAutorunMicrotasks() const;
 
+  /**
+   * Enables the host application to provide a mechanism for recording
+   * statistics counters.
+   */
+  void SetCounterFunction(CounterLookupCallback);
+
+  /**
+   * Enables the host application to provide a mechanism for recording
+   * histograms. The CreateHistogram function returns a
+   * histogram which will later be passed to the AddHistogramSample
+   * function.
+   */
+  void SetCreateHistogramFunction(CreateHistogramCallback);
+  void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
+
  private:
   template<class K, class V, class Traits> friend class PersistentValueMap;
 
@@ -4744,6 +4759,8 @@ class V8_EXPORT V8 {
   /**
    * Enables the host application to provide a mechanism for recording
    * statistics counters.
+   *
+   * Deprecated, use Isolate::SetCounterFunction instead.
    */
   static void SetCounterFunction(CounterLookupCallback);
 
@@ -4752,8 +4769,13 @@ class V8_EXPORT V8 {
    * histograms. The CreateHistogram function returns a
    * histogram which will later be passed to the AddHistogramSample
    * function.
+   *
+   * Deprecated, use Isolate::SetCreateHistogramFunction instead.
+   * Isolate::SetAddHistogramSampleFunction instead.
    */
   static void SetCreateHistogramFunction(CreateHistogramCallback);
+
+  /** Deprecated, use Isolate::SetAddHistogramSampleFunction instead. */
   static void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
 
   /** Callback function for reporting failed access checks.*/
index 3d55d81..3279392 100644 (file)
@@ -6707,6 +6707,30 @@ bool Isolate::WillAutorunMicrotasks() const {
 }
 
 
+void Isolate::SetCounterFunction(CounterLookupCallback callback) {
+  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
+  isolate->stats_table()->SetCounterFunction(callback);
+  isolate->InitializeLoggingAndCounters();
+  isolate->counters()->ResetCounters();
+}
+
+
+void Isolate::SetCreateHistogramFunction(CreateHistogramCallback callback) {
+  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
+  isolate->stats_table()->SetCreateHistogramFunction(callback);
+  isolate->InitializeLoggingAndCounters();
+  isolate->counters()->ResetHistograms();
+}
+
+
+void Isolate::SetAddHistogramSampleFunction(
+    AddHistogramSampleCallback callback) {
+  reinterpret_cast<i::Isolate*>(this)
+      ->stats_table()
+      ->SetAddHistogramSampleFunction(callback);
+}
+
+
 String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj)
     : str_(NULL), length_(0) {
   i::Isolate* isolate = i::Isolate::Current();
index 033413b..56a34e7 100644 (file)
@@ -3081,9 +3081,14 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
 
   __ mov(r0, Operand(arg_count()));
   __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3));
-  __ ldr(r2, FieldMemOperand(r4, FixedArray::kHeaderSize));
-  // Verify that r2 contains an AllocationSite
-  __ AssertUndefinedOrAllocationSite(r2, r4);
+  __ ldr(r4, FieldMemOperand(r4, FixedArray::kHeaderSize));
+
+  // Verify that r4 contains an AllocationSite
+  __ ldr(r5, FieldMemOperand(r4, HeapObject::kMapOffset));
+  __ CompareRoot(r5, Heap::kAllocationSiteMapRootIndex);
+  __ b(ne, &miss);
+
+  __ mov(r2, r4);
   ArrayConstructorStub stub(masm->isolate(), arg_count());
   __ TailCallStub(&stub);
 
@@ -3150,7 +3155,11 @@ void CallICStub::Generate(MacroAssembler* masm) {
   __ b(eq, &miss);
 
   if (!FLAG_trace_ic) {
-    // We are going megamorphic, and we don't want to visit the runtime.
+    // We are going megamorphic. If the feedback is a JSFunction, it is fine
+    // to handle it here. More complex cases are dealt with in the runtime.
+    __ AssertNotSmi(r4);
+    __ CompareObjectType(r4, r5, r5, JS_FUNCTION_TYPE);
+    __ b(ne, &miss);
     __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3));
     __ LoadRoot(ip, Heap::kMegamorphicSymbolRootIndex);
     __ str(ip, FieldMemOperand(r4, FixedArray::kHeaderSize));
index 70ead44..fc8d91b 100644 (file)
@@ -3374,15 +3374,19 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
   __ Cmp(function, scratch);
   __ B(ne, &miss);
 
-  Register allocation_site = feedback_vector;
   __ Mov(x0, Operand(arg_count()));
 
   __ Add(scratch, feedback_vector,
          Operand::UntagSmiAndScale(index, kPointerSizeLog2));
-  __ Ldr(allocation_site, FieldMemOperand(scratch, FixedArray::kHeaderSize));
+  __ Ldr(scratch, FieldMemOperand(scratch, FixedArray::kHeaderSize));
+
+  // Verify that scratch contains an AllocationSite
+  Register map = x5;
+  __ Ldr(map, FieldMemOperand(scratch, HeapObject::kMapOffset));
+  __ JumpIfNotRoot(map, Heap::kAllocationSiteMapRootIndex, &miss);
 
-  // Verify that x2 contains an AllocationSite
-  __ AssertUndefinedOrAllocationSite(allocation_site, scratch);
+  Register allocation_site = feedback_vector;
+  __ Mov(allocation_site, scratch);
   ArrayConstructorStub stub(masm->isolate(), arg_count());
   __ TailCallStub(&stub);
 
@@ -3458,7 +3462,10 @@ void CallICStub::Generate(MacroAssembler* masm) {
   __ JumpIfRoot(x4, Heap::kUninitializedSymbolRootIndex, &miss);
 
   if (!FLAG_trace_ic) {
-    // We are going megamorphic, and we don't want to visit the runtime.
+    // We are going megamorphic. If the feedback is a JSFunction, it is fine
+    // to handle it here. More complex cases are dealt with in the runtime.
+    __ AssertNotSmi(x4);
+    __ JumpIfNotObjectType(x4, x5, x5, JS_FUNCTION_TYPE, &miss);
     __ Add(x4, feedback_vector,
            Operand::UntagSmiAndScale(index, kPointerSizeLog2));
     __ LoadRoot(x5, Heap::kMegamorphicSymbolRootIndex);
index 42b0574..cdff887 100644 (file)
@@ -109,6 +109,38 @@ Counters::Counters(Isolate* isolate) {
 }
 
 
+void Counters::ResetCounters() {
+#define SC(name, caption) name##_.Reset();
+  STATS_COUNTER_LIST_1(SC)
+  STATS_COUNTER_LIST_2(SC)
+#undef SC
+
+#define SC(name)              \
+  count_of_##name##_.Reset(); \
+  size_of_##name##_.Reset();
+  INSTANCE_TYPE_LIST(SC)
+#undef SC
+
+#define SC(name)                        \
+  count_of_CODE_TYPE_##name##_.Reset(); \
+  size_of_CODE_TYPE_##name##_.Reset();
+  CODE_KIND_LIST(SC)
+#undef SC
+
+#define SC(name)                          \
+  count_of_FIXED_ARRAY_##name##_.Reset(); \
+  size_of_FIXED_ARRAY_##name##_.Reset();
+  FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(SC)
+#undef SC
+
+#define SC(name)                       \
+  count_of_CODE_AGE_##name##_.Reset(); \
+  size_of_CODE_AGE_##name##_.Reset();
+  CODE_AGE_LIST_COMPLETE(SC)
+#undef SC
+}
+
+
 void Counters::ResetHistograms() {
 #define HT(name, caption) name##_.Reset();
     HISTOGRAM_TIMER_LIST(HT)
index f7ff36b..a7d00dc 100644 (file)
@@ -143,6 +143,9 @@ class StatsCounter {
     return loc;
   }
 
+  // Reset the cached internal pointer.
+  void Reset() { lookup_done_ = false; }
+
  protected:
   // Returns the cached address of this counter location.
   int* GetPtr() {
@@ -629,6 +632,7 @@ class Counters {
     stats_counter_count
   };
 
+  void ResetCounters();
   void ResetHistograms();
 
  private:
index 03356e1..661307f 100644 (file)
@@ -665,7 +665,7 @@ Counter* CounterCollection::GetNextCounter() {
 }
 
 
-void Shell::MapCounters(const char* name) {
+void Shell::MapCounters(v8::Isolate* isolate, const char* name) {
   counters_file_ = i::OS::MemoryMappedFile::create(
       name, sizeof(CounterCollection), &local_counters_);
   void* memory = (counters_file_ == NULL) ?
@@ -675,9 +675,9 @@ void Shell::MapCounters(const char* name) {
     Exit(1);
   }
   counters_ = static_cast<CounterCollection*>(memory);
-  V8::SetCounterFunction(LookupCounter);
-  V8::SetCreateHistogramFunction(CreateHistogram);
-  V8::SetAddHistogramSampleFunction(AddHistogramSample);
+  isolate->SetCounterFunction(LookupCounter);
+  isolate->SetCreateHistogramFunction(CreateHistogram);
+  isolate->SetAddHistogramSampleFunction(AddHistogramSample);
 }
 
 
@@ -887,7 +887,7 @@ void Shell::Initialize(Isolate* isolate) {
   Shell::counter_map_ = new CounterMap();
   // Set up counters
   if (i::StrLength(i::FLAG_map_counters) != 0)
-    MapCounters(i::FLAG_map_counters);
+    MapCounters(isolate, i::FLAG_map_counters);
   if (i::FLAG_dump_counters || i::FLAG_track_gc_object_stats) {
     V8::SetCounterFunction(LookupCounter);
     V8::SetCreateHistogramFunction(CreateHistogram);
index a6d0b85..35a7ffa 100644 (file)
@@ -265,7 +265,7 @@ class Shell : public i::AllStatic {
                                int max,
                                size_t buckets);
   static void AddHistogramSample(void* histogram, int sample);
-  static void MapCounters(const char* name);
+  static void MapCounters(v8::Isolate* isolate, const char* name);
 
   static Local<Object> DebugMessageDetails(Isolate* isolate,
                                            Handle<String> message);
index 159982a..52641cd 100644 (file)
@@ -4293,7 +4293,8 @@ void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) {
       isolate_->compilation_cache()->Clear();
       uncommit = true;
     }
-    CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental");
+    CollectAllGarbage(kReduceMemoryFootprintMask,
+                      "idle notification: finalize incremental");
     mark_sweeps_since_idle_round_started_++;
     gc_count_at_last_idle_gc_ = gc_count_;
     if (uncommit) {
index a6aee0c..95d6bf5 100644 (file)
@@ -1103,14 +1103,13 @@ class Heap {
 
   // The executable size has to be a multiple of Page::kPageSize.
   // Sizes are in MB.
-  static const int kMaxExecutableSizeLowMemoryDevice =
-      128 * kPointerMultiplier;
+  static const int kMaxExecutableSizeLowMemoryDevice = 96 * kPointerMultiplier;
   static const int kMaxExecutableSizeMediumMemoryDevice =
-      256 * kPointerMultiplier;
+      192 * kPointerMultiplier;
   static const int kMaxExecutableSizeHighMemoryDevice =
-      512 * kPointerMultiplier;
+      256 * kPointerMultiplier;
   static const int kMaxExecutableSizeHugeMemoryDevice =
-      700 * kPointerMultiplier;
+      256 * kPointerMultiplier;
 
   intptr_t OldGenerationAllocationLimit(intptr_t old_gen_size,
                                         int freed_global_handles);
index d844427..0ee4ef5 100644 (file)
@@ -6948,32 +6948,41 @@ class HStoreKeyed V8_FINAL
     }
 
     ASSERT_EQ(index, 2);
+    return RequiredValueRepresentation(elements_kind_, store_mode_);
+  }
 
-    if (IsDoubleOrFloatElementsKind(elements_kind())) {
+  static Representation RequiredValueRepresentation(
+      ElementsKind kind, StoreFieldOrKeyedMode mode) {
+    if (IsDoubleOrFloatElementsKind(kind)) {
       return Representation::Double();
     }
-    if (IsFloat32x4ElementsKind(elements_kind())) {
+
+    if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() &&
+        mode == STORE_TO_INITIALIZED_ENTRY) {
+      return Representation::Integer32();
+    }
+
+    if (IsFloat32x4ElementsKind(kind)) {
       return CpuFeatures::SupportsSIMD128InCrankshaft() ?
           Representation::Float32x4() : Representation::Tagged();
     }
-    if (IsFloat64x2ElementsKind(elements_kind())) {
+    if (IsFloat64x2ElementsKind(kind)) {
       return CpuFeatures::SupportsSIMD128InCrankshaft() ?
           Representation::Float64x2() : Representation::Tagged();
     }
-    if (IsInt32x4ElementsKind(elements_kind())) {
+    if (IsInt32x4ElementsKind(kind)) {
       return CpuFeatures::SupportsSIMD128InCrankshaft() ?
           Representation::Int32x4() : Representation::Tagged();
     }
-    if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) {
-      return Representation::Integer32();
-    }
-    if (IsFastSmiElementsKind(elements_kind())) {
+
+    if (IsFastSmiElementsKind(kind)) {
       return Representation::Smi();
     }
 
-    return is_external() || is_fixed_typed_array()
-        ? Representation::Integer32()
-        : Representation::Tagged();
+    return IsExternalArrayElementsKind(kind) ||
+                   IsFixedTypedArrayElementsKind(kind)
+               ? Representation::Integer32()
+               : Representation::Tagged();
   }
 
   bool is_external() const {
@@ -6993,32 +7002,10 @@ class HStoreKeyed V8_FINAL
     if (IsUninitialized()) {
       return Representation::None();
     }
-    if (IsDoubleOrFloatElementsKind(elements_kind())) {
-      return Representation::Double();
-    }
-    if (IsFloat32x4ElementsKind(elements_kind())) {
-      return CpuFeatures::SupportsSIMD128InCrankshaft() ?
-          Representation::Float32x4() : Representation::Tagged();
-    }
-    if (IsFloat64x2ElementsKind(elements_kind())) {
-      return CpuFeatures::SupportsSIMD128InCrankshaft() ?
-          Representation::Float64x2() : Representation::Tagged();
-    }
-    if (IsInt32x4ElementsKind(elements_kind())) {
-      return CpuFeatures::SupportsSIMD128InCrankshaft() ?
-          Representation::Int32x4() : Representation::Tagged();
-    }
-    if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) {
-      return Representation::Integer32();
-    }
-    if (IsFastSmiElementsKind(elements_kind())) {
-      return Representation::Smi();
-    }
-    if (is_typed_elements()) {
-      return Representation::Integer32();
-    }
+    Representation r = RequiredValueRepresentation(elements_kind_, store_mode_);
     // For fast object elements kinds, don't assume anything.
-    return Representation::None();
+    if (r.IsTagged()) return Representation::None();
+    return r;
   }
 
   HValue* elements() const { return OperandAt(0); }
@@ -7098,9 +7085,6 @@ class HStoreKeyed V8_FINAL
     SetOperandAt(1, key);
     SetOperandAt(2, val);
 
-    ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY ||
-           elements_kind == FAST_SMI_ELEMENTS);
-
     if (IsFastObjectElementsKind(elements_kind)) {
       SetFlag(kTrackSideEffectDominators);
       SetDependsOnFlag(kNewSpacePromotion);
index 80ded34..0a4da4b 100644 (file)
@@ -2405,6 +2405,9 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
 
   if (IsGrowStoreMode(store_mode)) {
     NoObservableSideEffectsScope no_effects(this);
+    Representation representation = HStoreKeyed::RequiredValueRepresentation(
+        elements_kind, STORE_TO_INITIALIZED_ENTRY);
+    val = AddUncasted<HForceRepresentation>(val, representation);
     elements = BuildCheckForCapacityGrow(checked_object, elements,
                                          elements_kind, length, key,
                                          is_js_array, access_type);
@@ -2601,9 +2604,7 @@ HInstruction* HGraphBuilder::AddElementAccess(
       val = Add<HClampToUint8>(val);
     }
     return Add<HStoreKeyed>(elements, checked_key, val, elements_kind,
-                            elements_kind == FAST_SMI_ELEMENTS
-                              ? STORE_TO_INITIALIZED_ENTRY
-                              : INITIALIZING_STORE);
+                            STORE_TO_INITIALIZED_ENTRY);
   }
 
   ASSERT(access_type == LOAD);
index e61d221..9e925b0 100644 (file)
@@ -2484,10 +2484,16 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
   __ j(not_equal, &miss);
 
   __ mov(eax, arg_count());
-  __ mov(ebx, FieldOperand(ebx, edx, times_half_pointer_size,
+  __ mov(ecx, FieldOperand(ebx, edx, times_half_pointer_size,
                            FixedArray::kHeaderSize));
+
   // Verify that ecx contains an AllocationSite
-  __ AssertUndefinedOrAllocationSite(ebx);
+  Factory* factory = masm->isolate()->factory();
+  __ cmp(FieldOperand(ecx, HeapObject::kMapOffset),
+         factory->allocation_site_map());
+  __ j(not_equal, &miss);
+
+  __ mov(ebx, ecx);
   ArrayConstructorStub stub(masm->isolate(), arg_count());
   __ TailCallStub(&stub);
 
@@ -2558,7 +2564,11 @@ void CallICStub::Generate(MacroAssembler* masm) {
   __ j(equal, &miss);
 
   if (!FLAG_trace_ic) {
-    // We are going megamorphic, and we don't want to visit the runtime.
+    // We are going megamorphic. If the feedback is a JSFunction, it is fine
+    // to handle it here. More complex cases are dealt with in the runtime.
+    __ AssertNotSmi(ecx);
+    __ CmpObjectType(ecx, JS_FUNCTION_TYPE, ecx);
+    __ j(not_equal, &miss);
     __ mov(FieldOperand(ebx, edx, times_half_pointer_size,
                         FixedArray::kHeaderSize),
            Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate)));
index adb53c7..2fe5bee 100644 (file)
@@ -1695,27 +1695,36 @@ void MacroAssembler::AllocateHeapNumber(Register result,
 
 
 #define SIMD128_HEAP_ALLOCATE_FUNCTIONS(V) \
-  V(Float32x4, float32x4)                  \
-  V(Float64x2, float64x2)                  \
-  V(Int32x4, int32x4)
+  V(Float32x4, float32x4, FLOAT32x4)       \
+  V(Float64x2, float64x2, FLOAT64x2)       \
+  V(Int32x4, int32x4, INT32x4)
 
-#define DECLARE_SIMD_HEAP_ALLOCATE_FUNCTION(TYPE, type)                    \
-void MacroAssembler::Allocate##TYPE(Register result,                       \
+#define DECLARE_SIMD_HEAP_ALLOCATE_FUNCTION(Type, type, TYPE)              \
+void MacroAssembler::Allocate##Type(Register result,                       \
                                     Register scratch1,                     \
                                     Register scratch2,                     \
                                     Label* gc_required) {                  \
   /* Allocate SIMD128 object */                                            \
-  Allocate(TYPE::kSize, result, scratch1, no_reg, gc_required, TAG_OBJECT);\
-                                                                           \
-  mov(FieldOperand(result, JSObject::kMapOffset),                          \
-      Immediate(reinterpret_cast<intptr_t>(                                \
-          isolate()->native_context()->type##_function()->initial_map())));\
+  Allocate(Type::kSize, result, scratch1, no_reg, gc_required, TAG_OBJECT);\
+  /* Load the initial map and assign to new allocated object. */           \
+  mov(scratch1, Operand(ebp, StandardFrameConstants::kContextOffset));     \
+  mov(scratch1,                                                            \
+      Operand(scratch1,                                                    \
+              Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));         \
+  mov(scratch1,                                                            \
+      FieldOperand(scratch1, GlobalObject::kNativeContextOffset));         \
+  mov(scratch1,                                                            \
+      Operand(scratch1,                                                    \
+              Context::SlotOffset(Context::TYPE##_FUNCTION_INDEX)));       \
+  LoadGlobalFunctionInitialMap(scratch1, scratch1);                        \
+  mov(FieldOperand(result, JSObject::kMapOffset), scratch1);               \
+  /* Initialize properties and elements. */                                \
   mov(FieldOperand(result, JSObject::kPropertiesOffset),                   \
       Immediate(isolate()->factory()->empty_fixed_array()));               \
   mov(FieldOperand(result, JSObject::kElementsOffset),                     \
       Immediate(isolate()->factory()->empty_fixed_array()));               \
   /* Allocate FixedTypedArray object */                                    \
-  Allocate(FixedTypedArrayBase::kDataOffset + k##TYPE##Size,               \
+  Allocate(FixedTypedArrayBase::kDataOffset + k##Type##Size,               \
            scratch1, scratch2, no_reg, gc_required, TAG_OBJECT);           \
                                                                            \
   mov(FieldOperand(scratch1, FixedTypedArrayBase::kMapOffset),             \
@@ -1725,7 +1734,7 @@ void MacroAssembler::Allocate##TYPE(Register result,                       \
   mov(FieldOperand(scratch1, FixedTypedArrayBase::kLengthOffset),          \
       scratch2);                                                           \
   /* Assign TifxedTypedArray object to SIMD128 object */                   \
-  mov(FieldOperand(result, TYPE::kValueOffset), scratch1);                 \
+  mov(FieldOperand(result, Type::kValueOffset), scratch1);                 \
 }
 
 SIMD128_HEAP_ALLOCATE_FUNCTIONS(DECLARE_SIMD_HEAP_ALLOCATE_FUNCTION)
index d3fa541..a4ac081 100644 (file)
@@ -645,20 +645,20 @@ class MacroAssembler: public Assembler {
   // Returns tagged pointer in result register, or jumps to gc_required if new
   // space is full.
   void AllocateFloat32x4(Register result,
-                          Register scratch1,
-                          Register scratch2,
-                          Label* gc_required);
-
-  void AllocateInt32x4(Register result,
-                       Register scratch1,
-                       Register scratch2,
-                       Label* gc_required);
+                         Register scratch1,
+                         Register scratch2,
+                         Label* gc_required);
 
   void AllocateFloat64x2(Register result,
                          Register scratch1,
                          Register scratch2,
                          Label* gc_required);
 
+  void AllocateInt32x4(Register result,
+                       Register scratch1,
+                       Register scratch2,
+                       Label* gc_required);
+
   // Allocate a sequential string. All the header fields of the string object
   // are initialized.
   void AllocateTwoByteString(Register result,
index cd92af1..c764720 100644 (file)
@@ -1855,8 +1855,13 @@ bool CallIC::DoCustomHandler(Handle<Object> receiver,
       isolate()->context()->native_context()->array_function(), isolate());
   if (array_function.is_identical_to(Handle<JSFunction>::cast(function))) {
     // Alter the slot.
-    Handle<AllocationSite> new_site = isolate()->factory()->NewAllocationSite();
-    vector->set(slot->value(), *new_site);
+    Object* feedback = vector->get(slot->value());
+    if (!feedback->IsAllocationSite()) {
+      Handle<AllocationSite> new_site =
+          isolate()->factory()->NewAllocationSite();
+      vector->set(slot->value(), *new_site);
+    }
+
     CallIC_ArrayStub stub(isolate(), state);
     set_target(*stub.GetCode());
     Handle<String> name;
@@ -1896,6 +1901,9 @@ void CallIC::HandleMiss(Handle<Object> receiver,
   State state(target()->extra_ic_state());
   Object* feedback = vector->get(slot->value());
 
+  // Hand-coded MISS handling is easier if CallIC slots don't contain smis.
+  ASSERT(!feedback->IsSmi());
+
   if (feedback->IsJSFunction() || !function->IsJSFunction()) {
     // We are going generic.
     vector->set(slot->value(),
@@ -1904,9 +1912,14 @@ void CallIC::HandleMiss(Handle<Object> receiver,
 
     TRACE_GENERIC_IC(isolate(), "CallIC", "megamorphic");
   } else {
-    // If we came here feedback must be the uninitialized sentinel,
-    // and we are going monomorphic.
-    ASSERT(feedback == *TypeFeedbackInfo::UninitializedSentinel(isolate()));
+    // The feedback is either uninitialized or an allocation site.
+    // It might be an allocation site because if we re-compile the full code
+    // to add deoptimization support, we call with the default call-ic, and
+    // merely need to patch the target to match the feedback.
+    // TODO(mvstanton): the better approach is to dispense with patching
+    // altogether, which is in progress.
+    ASSERT(feedback == *TypeFeedbackInfo::UninitializedSentinel(isolate()) ||
+           feedback->IsAllocationSite());
 
     // Do we want to install a custom handler?
     if (FLAG_use_ic &&
index 0287a9a..b8f565b 100644 (file)
@@ -3240,9 +3240,14 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
   __ li(a0, Operand(arg_count()));
   __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize);
   __ Addu(at, a2, Operand(at));
-  __ lw(a2, FieldMemOperand(at, FixedArray::kHeaderSize));
-  // Verify that a2 contains an AllocationSite
-  __ AssertUndefinedOrAllocationSite(a2, at);
+  __ lw(t0, FieldMemOperand(at, FixedArray::kHeaderSize));
+
+  // Verify that t0 contains an AllocationSite
+  __ lw(t1, FieldMemOperand(t0, HeapObject::kMapOffset));
+  __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex);
+  __ Branch(&miss, ne, t1, Operand(at));
+
+  __ mov(a2, t0);
   ArrayConstructorStub stub(masm->isolate(), arg_count());
   __ TailCallStub(&stub);
 
@@ -3309,7 +3314,11 @@ void CallICStub::Generate(MacroAssembler* masm) {
   __ Branch(&miss, eq, t0, Operand(at));
 
   if (!FLAG_trace_ic) {
-    // We are going megamorphic, and we don't want to visit the runtime.
+    // We are going megamorphic. If the feedback is a JSFunction, it is fine
+    // to handle it here. More complex cases are dealt with in the runtime.
+    __ AssertNotSmi(t0);
+    __ GetObjectType(t0, t1, t1);
+    __ Branch(&miss, ne, t1, Operand(JS_FUNCTION_TYPE));
     __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
     __ Addu(t0, a2, Operand(t0));
     __ LoadRoot(at, Heap::kMegamorphicSymbolRootIndex);
index ba38860..58f547d 100644 (file)
@@ -10090,8 +10090,8 @@ class ArrayConcatVisitor {
     // but the array blowing the limit didn't contain elements beyond the
     // provided-for index range, go to dictionary mode now.
     if (fast_elements_ &&
-        index_offset_ >= static_cast<uint32_t>(
-            FixedArrayBase::cast(*storage_)->length())) {
+        index_offset_ >
+            static_cast<uint32_t>(FixedArrayBase::cast(*storage_)->length())) {
       SetDictionaryMode();
     }
   }
index 1ffc314..69a0145 100644 (file)
@@ -2577,6 +2577,22 @@ void PagedSpace::EvictEvacuationCandidatesFromFreeLists() {
 }
 
 
+HeapObject* PagedSpace::WaitForSweeperThreadsAndRetryAllocation(
+    int size_in_bytes) {
+  MarkCompactCollector* collector = heap()->mark_compact_collector();
+
+  // If sweeper threads are still running, wait for them.
+  if (collector->IsConcurrentSweepingInProgress()) {
+    collector->WaitUntilSweepingCompleted();
+
+    // After waiting for the sweeper threads, there may be new free-list
+    // entries.
+    return free_list_.Allocate(size_in_bytes);
+  }
+  return NULL;
+}
+
+
 HeapObject* PagedSpace::SlowAllocateRaw(int size_in_bytes) {
   // Allocation in this space has failed.
 
@@ -2593,9 +2609,12 @@ HeapObject* PagedSpace::SlowAllocateRaw(int size_in_bytes) {
   // Free list allocation failed and there is no next page.  Fail if we have
   // hit the old generation size limit that should cause a garbage
   // collection.
-  if (!heap()->always_allocate() &&
-      heap()->OldGenerationAllocationLimitReached()) {
-    return NULL;
+  if (!heap()->always_allocate()
+      && heap()->OldGenerationAllocationLimitReached()) {
+    // If sweeper threads are active, wait for them at that point and steal
+    // elements form their free-lists.
+    HeapObject* object = WaitForSweeperThreadsAndRetryAllocation(size_in_bytes);
+    if (object != NULL) return object;
   }
 
   // Try to expand the space and allocate in the new next page.
@@ -2604,18 +2623,10 @@ HeapObject* PagedSpace::SlowAllocateRaw(int size_in_bytes) {
     return free_list_.Allocate(size_in_bytes);
   }
 
-  // If sweeper threads are active, wait for them at that point.
-  if (collector->IsConcurrentSweepingInProgress()) {
-    collector->WaitUntilSweepingCompleted();
-
-    // After waiting for the sweeper threads, there may be new free-list
-    // entries.
-    HeapObject* object = free_list_.Allocate(size_in_bytes);
-    if (object != NULL) return object;
-  }
-
-  // Finally, fail.
-  return NULL;
+  // If sweeper threads are active, wait for them at that point and steal
+  // elements form their free-lists. Allocation may still fail their which
+  // would indicate that there is not enough memory for the given allocation.
+  return WaitForSweeperThreadsAndRetryAllocation(size_in_bytes);
 }
 
 
index 96a1a90..a8c981d 100644 (file)
@@ -2003,8 +2003,11 @@ class PagedSpace : public Space {
   // address denoted by top in allocation_info_.
   inline HeapObject* AllocateLinearly(int size_in_bytes);
 
+  MUST_USE_RESULT HeapObject*
+      WaitForSweeperThreadsAndRetryAllocation(int size_in_bytes);
+
   // Slow path of AllocateRaw.  This function is space-dependent.
-  MUST_USE_RESULT virtual HeapObject* SlowAllocateRaw(int size_in_bytes);
+  MUST_USE_RESULT HeapObject* SlowAllocateRaw(int size_in_bytes);
 
   friend class PageIterator;
   friend class MarkCompactCollector;
index 1f21917..1d8adfe 100644 (file)
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     27
 #define BUILD_NUMBER      34
-#define PATCH_LEVEL       6
+#define PATCH_LEVEL       12
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
 #define IS_CANDIDATE_VERSION 0
index 0d54f89..e31bf98 100644 (file)
@@ -2378,12 +2378,16 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
   __ cmpq(rdi, rcx);
   __ j(not_equal, &miss);
 
-  __ movq(rax, Immediate(arg_count()));
-  __ movp(rbx, FieldOperand(rbx, rdx, times_pointer_size,
+  __ movp(rax, Immediate(arg_count()));
+  __ movp(rcx, FieldOperand(rbx, rdx, times_pointer_size,
                             FixedArray::kHeaderSize));
-
   // Verify that ecx contains an AllocationSite
-  __ AssertUndefinedOrAllocationSite(rbx);
+  Factory* factory = masm->isolate()->factory();
+  __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset),
+         factory->allocation_site_map());
+  __ j(not_equal, &miss);
+
+  __ movp(rbx, rcx);
   ArrayConstructorStub stub(masm->isolate(), arg_count());
   __ TailCallStub(&stub);
 
@@ -2457,7 +2461,11 @@ void CallICStub::Generate(MacroAssembler* masm) {
   __ j(equal, &miss);
 
   if (!FLAG_trace_ic) {
-    // We are going megamorphic, and we don't want to visit the runtime.
+    // We are going megamorphic. If the feedback is a JSFunction, it is fine
+    // to handle it here. More complex cases are dealt with in the runtime.
+    __ AssertNotSmi(rcx);
+    __ CmpObjectType(rcx, JS_FUNCTION_TYPE, rcx);
+    __ j(not_equal, &miss);
     __ Move(FieldOperand(rbx, rdx, times_pointer_size,
                          FixedArray::kHeaderSize),
             TypeFeedbackInfo::MegamorphicSentinel(isolate));
index 6cc0bbd..0a94059 100644 (file)
@@ -4679,23 +4679,32 @@ void MacroAssembler::AllocateHeapNumber(Register result,
 
 
 #define SIMD128_HEAP_ALLOCATE_FUNCTIONS(V) \
-  V(Float32x4, float32x4)                  \
-  V(Float64x2, float64x2)                  \
-  V(Int32x4, int32x4)
+  V(Float32x4, float32x4, FLOAT32x4)       \
+  V(Float64x2, float64x2, FLOAT64x2)       \
+  V(Int32x4, int32x4, INT32x4)
 
-#define DECLARE_SIMD_HEAP_ALLOCATE_FUNCTION(TYPE, type)                    \
-void MacroAssembler::Allocate##TYPE(Register result,                       \
+#define DECLARE_SIMD_HEAP_ALLOCATE_FUNCTION(Type, type, TYPE)              \
+void MacroAssembler::Allocate##Type(Register result,                       \
                                     Register scratch1,                     \
                                     Register scratch2,                     \
                                     Register scratch3,                     \
                                     Label* gc_required) {                  \
   /* Allocate SIMD128 object. */                                           \
-  Allocate(TYPE::kSize, result, scratch1, no_reg, gc_required, TAG_OBJECT);\
-  Handle<Map> simd128_map(                                                 \
-      isolate()->native_context()->type##_function()->initial_map());      \
-  MoveHeapObject(kScratchRegister, simd128_map);                           \
+  Allocate(Type::kSize, result, scratch1, no_reg, gc_required, TAG_OBJECT);\
+  /* Load the initial map and assign to new allocated object. */           \
+  movp(scratch1, Operand(rbp, StandardFrameConstants::kContextOffset));    \
+  movp(scratch1,                                                           \
+       Operand(scratch1,                                                   \
+               Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));        \
+  movp(scratch1,                                                           \
+       FieldOperand(scratch1, GlobalObject::kNativeContextOffset));        \
+  movp(scratch1,                                                           \
+       Operand(scratch1,                                                   \
+               Context::SlotOffset(Context::TYPE##_FUNCTION_INDEX)));      \
+  LoadGlobalFunctionInitialMap(scratch1, scratch1);                        \
   movp(FieldOperand(result, JSObject::kMapOffset),                         \
-       kScratchRegister);                                                  \
+       scratch1);                                                          \
+  /* Initialize the properties and elements. */                            \
   MoveHeapObject(kScratchRegister,                                         \
                  isolate()->factory()->empty_fixed_array());               \
   movp(FieldOperand(result, JSObject::kPropertiesOffset),                  \
@@ -4703,7 +4712,7 @@ void MacroAssembler::Allocate##TYPE(Register result,                       \
   movp(FieldOperand(result, JSObject::kElementsOffset),                    \
        kScratchRegister);                                                  \
   /* Allocate FixedTypedArray object. */                                   \
-  Allocate(FixedTypedArrayBase::kDataOffset + k##TYPE##Size,               \
+  Allocate(FixedTypedArrayBase::kDataOffset + k##Type##Size,               \
            scratch1, scratch2, no_reg, gc_required, TAG_OBJECT);           \
   MoveHeapObject(kScratchRegister,                                         \
                  isolate()->factory()->fixed_##type##_array_map());        \
@@ -4714,7 +4723,7 @@ void MacroAssembler::Allocate##TYPE(Register result,                       \
   movp(FieldOperand(scratch1, FixedTypedArrayBase::kLengthOffset),         \
        scratch2);                                                          \
   /* Assign FixedTypedArray object to SIMD128 object. */                   \
-  movp(FieldOperand(result, TYPE::kValueOffset), scratch1);                \
+  movp(FieldOperand(result, Type::kValueOffset), scratch1);                \
 }
 
 SIMD128_HEAP_ALLOCATE_FUNCTIONS(DECLARE_SIMD_HEAP_ALLOCATE_FUNCTION)
index 7eaecf6..69da267 100644 (file)
@@ -1203,16 +1203,10 @@ class MacroAssembler: public Assembler {
   // Returns tagged pointer in result register, or jumps to gc_required if new
   // space is full.
   void AllocateFloat32x4(Register result,
-                          Register scratch1,
-                          Register scratch2,
-                          Register scratch3,
-                          Label* gc_required);
-
-  void AllocateInt32x4(Register result,
-                       Register scratch1,
-                       Register scratch2,
-                       Register scratch3,
-                       Label* gc_required);
+                         Register scratch1,
+                         Register scratch2,
+                         Register scratch3,
+                         Label* gc_required);
 
   void AllocateFloat64x2(Register result,
                          Register scratch1,
@@ -1220,6 +1214,12 @@ class MacroAssembler: public Assembler {
                          Register scratch3,
                          Label* gc_required);
 
+  void AllocateInt32x4(Register result,
+                       Register scratch1,
+                       Register scratch2,
+                       Register scratch3,
+                       Label* gc_required);
+
   // Allocate a sequential string. All the header fields of the string object
   // are initialized.
   void AllocateTwoByteString(Register result,
index a194780..7edc821 100644 (file)
@@ -2166,10 +2166,16 @@ void CallIC_ArrayStub::Generate(MacroAssembler* masm) {
   __ j(not_equal, &miss);
 
   __ mov(eax, arg_count());
-  __ mov(ebx, FieldOperand(ebx, edx, times_half_pointer_size,
+  __ mov(ecx, FieldOperand(ebx, edx, times_half_pointer_size,
                            FixedArray::kHeaderSize));
+
   // Verify that ecx contains an AllocationSite
-  __ AssertUndefinedOrAllocationSite(ebx);
+  Factory* factory = masm->isolate()->factory();
+  __ cmp(FieldOperand(ecx, HeapObject::kMapOffset),
+         factory->allocation_site_map());
+  __ j(not_equal, &miss);
+
+  __ mov(ebx, ecx);
   ArrayConstructorStub stub(masm->isolate(), arg_count());
   __ TailCallStub(&stub);
 
@@ -2240,7 +2246,11 @@ void CallICStub::Generate(MacroAssembler* masm) {
   __ j(equal, &miss);
 
   if (!FLAG_trace_ic) {
-    // We are going megamorphic, and we don't want to visit the runtime.
+    // We are going megamorphic. If the feedback is a JSFunction, it is fine
+    // to handle it here. More complex cases are dealt with in the runtime.
+    __ AssertNotSmi(ecx);
+    __ CmpObjectType(ecx, JS_FUNCTION_TYPE, ecx);
+    __ j(not_equal, &miss);
     __ mov(FieldOperand(ebx, edx, times_half_pointer_size,
                         FixedArray::kHeaderSize),
            Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate)));
index 3dd25ab..5225123 100644 (file)
@@ -68,6 +68,8 @@
   # This tests only the type system, so there is no point in running several
   # variants.
   'test-hydrogen-types/*': [PASS, NO_VARIANTS],
+  # TODO(ningxin): Temporarily disabled in M37, look at this in M38.
+  'test-types/Distributivity1': [SKIP],
   'test-types/*': [PASS, NO_VARIANTS],
 
   # The cpu profiler tests are notoriously flaky.
index d1f25de..7fc80b3 100644 (file)
@@ -19545,15 +19545,15 @@ class InitDefaultIsolateThread : public v8::internal::Thread {
         break;
 
       case SetCounterFunction:
-        v8::V8::SetCounterFunction(NULL);
+        CcTest::isolate()->SetCounterFunction(NULL);
         break;
 
       case SetCreateHistogramFunction:
-        v8::V8::SetCreateHistogramFunction(NULL);
+        CcTest::isolate()->SetCreateHistogramFunction(NULL);
         break;
 
       case SetAddHistogramSampleFunction:
-        v8::V8::SetAddHistogramSampleFunction(NULL);
+        CcTest::isolate()->SetAddHistogramSampleFunction(NULL);
         break;
     }
     isolate->Exit();
@@ -20904,6 +20904,7 @@ TEST(RunMicrotasksWithoutEnteringContext) {
 }
 
 
+#ifdef DEBUG
 static int probes_counter = 0;
 static int misses_counter = 0;
 static int updates_counter = 0;
@@ -20933,11 +20934,10 @@ static const char* kMegamorphicTestProgram =
     "  fooify(a);"
     "  fooify(b);"
     "}";
+#endif
 
 
 static void StubCacheHelper(bool primary) {
-  V8::SetCounterFunction(LookupCounter);
-  USE(kMegamorphicTestProgram);
 #ifdef DEBUG
   i::FLAG_native_code_counters = true;
   if (primary) {
@@ -20947,6 +20947,7 @@ static void StubCacheHelper(bool primary) {
   }
   i::FLAG_crankshaft = false;
   LocalContext env;
+  env->GetIsolate()->SetCounterFunction(LookupCounter);
   v8::HandleScope scope(env->GetIsolate());
   int initial_probes = probes_counter;
   int initial_misses = misses_counter;
@@ -20976,6 +20977,7 @@ TEST(PrimaryStubCache) {
 }
 
 
+#ifdef DEBUG
 static int cow_arrays_created_runtime = 0;
 
 
@@ -20985,13 +20987,14 @@ static int* LookupCounterCOWArrays(const char* name) {
   }
   return NULL;
 }
+#endif
 
 
 TEST(CheckCOWArraysCreatedRuntimeCounter) {
-  V8::SetCounterFunction(LookupCounterCOWArrays);
 #ifdef DEBUG
   i::FLAG_native_code_counters = true;
   LocalContext env;
+  env->GetIsolate()->SetCounterFunction(LookupCounterCOWArrays);
   v8::HandleScope scope(env->GetIsolate());
   int initial_cow_arrays = cow_arrays_created_runtime;
   CompileRun("var o = [1, 2, 3];");
diff --git a/src/v8/test/mjsunit/regress/regress-392114.js b/src/v8/test/mjsunit/regress/regress-392114.js
new file mode 100644 (file)
index 0000000..e5cf1cd
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright 2014 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.
+
+// Flags: --expose-debug-as debug --allow-natives-syntax
+
+Debug = debug.Debug;
+
+function dummy(x) {
+  return x + 100;
+}
+
+function create_closure() {
+  var f = function(arg) {
+    if (arg) { %DeoptimizeFunction(f); }
+    var a = Array(10);
+    for (var i = 0; i < a.length; i++) {
+      a[i] = i;
+    }
+  }
+  return f;
+}
+
+var c = create_closure();
+c();
+
+// c CallIC state now has custom Array handler installed.
+
+// Turn on the debugger.
+Debug.setListener(function () {});
+
+var d = create_closure();
+%OptimizeFunctionOnNextCall(d);
+// Thanks to the debugger, we recreate the full code too. We deopt and run
+// it, stomping on the unexpected AllocationSite in the type vector slot.
+d(true);
+
+// CallIC in c misinterprets type vector slot contents as an AllocationSite,
+// corrupting the heap.
+c();
+
+// CallIC MISS - crash due to corruption.
+dummy();
diff --git a/src/v8/test/mjsunit/regress/regress-grow-deopt.js b/src/v8/test/mjsunit/regress/regress-grow-deopt.js
new file mode 100644 (file)
index 0000000..df3a83f
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2014 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+function f(a, v) {
+  a[a.length] = v;
+}
+
+var a = [1.4];
+f(a, 1);
+f(a, 2);
+%OptimizeFunctionOnNextCall(f);
+f(a, {});
+assertEquals(4, a.length);
index e24af05..6de7545 100644 (file)
@@ -18,7 +18,7 @@
 <translation id="8785498733064193001">inicia la reproducció</translation>
 <translation id="7057186640035488495">moment de la pel·lícula</translation>
 <translation id="8199524924445686405">aaaa</translation>
-<translation id="795667975304826397">Cap fitxer seleccionat.</translation>
+<translation id="795667975304826397">No s'ha triat cap fitxer</translation>
 <translation id="7789962463072032349">pausa</translation>
 <translation id="6853785296079745596">amaga els subtítols ocults</translation>
 <translation id="4360991593054037559">Introduïu un valor vàlid. Els valors vàlids més propers són <ph name="VALID_VALUE_LOW"/> i <ph name="VALID_VALUE_HIGHER"/>.</translation>
@@ -54,7 +54,7 @@
 <translation id="2674318244760992338">peu</translation>
 <translation id="8987927404178983737">Mes</translation>
 <translation id="8115662671911883373">comença a mostrar subtítols ocults</translation>
-<translation id="7364796246159120393">Selecciona el fitxer</translation>
+<translation id="7364796246159120393">Tria un fitxer</translation>
 <translation id="2761667185364618470">Marqueu aquesta casella si voleu continuar.</translation>
 <translation id="8534579021159131403">Minuts</translation>
 <translation id="819205353528511139">reprodueix la pel·lícula en mode de pantalla completa</translation>
index f207add..6a29760 100644 (file)
@@ -96,7 +96,7 @@
 <translation id="7673697353781729403">Timer</translation>
 <translation id="4664250907885839816">Den del, der kommer efter &quot;<ph name="ATSIGN"/>&quot;, må ikke indeholde symbolet &quot;<ph name="INVALIDCHARACTER"/>&quot;.</translation>
 <translation id="3450233048674729344">Værdien skal være mindre end eller lig med <ph name="MAXIMUM"/>.</translation>
-<translation id="668171684555832681">Andre ...</translation>
+<translation id="668171684555832681">Andre...</translation>
 <translation id="6270583010843788609">miniature for tidslinje</translation>
 <translation id="5641012560118721995">pause</translation>
 <translation id="1591562245178063882">Denne måned</translation>
index 035bbea..99db973 100644 (file)
 <translation id="1171774979989969504">Introduceți o adresă de e-mail.</translation>
 <translation id="709897737746224366">Potriviți cu formatul solicitat.</translation>
 <translation id="5048533449481078685">marcator listă</translation>
-<translation id="4202807286478387388">Salt</translation>
+<translation id="4202807286478387388">accesați</translation>
 <translation id="5307600278924710095">Introduceți o valoare urmată de semnul „<ph name="ATSIGN"/>”. Adresa „<ph name="INVALIDADDRESS"/>” nu este completă.</translation>
 <translation id="2746543609216772311">Valoarea pentru dată/oră trebuie să fie <ph name="MINIMUM_DATE_OR_TIME"/> sau una ulterioară.</translation>
 <translation id="2572483411312390101">redați</translation>
 <translation id="8785498733064193001">începeți redarea</translation>
 <translation id="7057186640035488495">durată film</translation>
 <translation id="8199524924445686405">aaaa</translation>
-<translation id="795667975304826397">Nu s-au ales fișiere</translation>
-<translation id="7789962463072032349">pauză</translation>
+<translation id="795667975304826397">Nu ați ales niciun fișier</translation>
+<translation id="7789962463072032349">întrerupeți</translation>
 <translation id="6853785296079745596">ascundeți subtitrările</translation>
 <translation id="4360991593054037559">Introduceți o valoare validă. Cele mai apropiate valori valide sunt <ph name="VALID_VALUE_LOW"/> și <ph name="VALID_VALUE_HIGHER"/>.</translation>
 <translation id="1758486001363313524">Altele...</translation>
 <translation id="1930711995431081526">stare</translation>
 <translation id="658823671542763450">deschideți în ecran complet</translation>
 <translation id="7720026100085573005">timp rămas</translation>
-<translation id="370665806235115550">Se încarcă...</translation>
+<translation id="370665806235115550">Se încarcă</translation>
 <translation id="2723001399770238859">audio</translation>
-<translation id="6845533974506654842">Apăsați</translation>
-<translation id="8244226242650769279">hartă cu imagini</translation>
+<translation id="6845533974506654842">apăsați</translation>
+<translation id="8244226242650769279">hartă imagine</translation>
 <translation id="310520048233152454">Introduceți o adresă URL.</translation>
 <translation id="4812940957355064477">Introduceți un număr.</translation>
 <translation id="2548326553472216322">Nicio căutare recentă</translation>
@@ -40,7 +40,7 @@
 <translation id="5164977714490026579">Valoarea trebuie să fie mai mare sau egală cu <ph name="MINIMUM"/>.</translation>
 <translation id="2247351761944213033">Săptămâna <ph name="WEEKNUMBER"/>, <ph name="YEAR"/></translation>
 <translation id="7740016676195725605">nu mai afișați subtitrările</translation>
-<translation id="5944544982112848342">2048 (Grad înalt)</translation>
+<translation id="5944544982112848342">2048 (nivel ridicat)</translation>
 <translation id="3075154866155599887">Introduceți o valoare validă. Câmpul este incomplet sau conține o dată nevalidă.</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="1014825444426747588">necompletat</translation>
 <translation id="8534579021159131403">Minute</translation>
 <translation id="819205353528511139">redați filmul în modul ecran complet</translation>
 <translation id="4103419683916926126">Milisecunde</translation>
-<translation id="838869780401515933">Bifați</translation>
-<translation id="2846343701378493991">1024 (Grad mediu)</translation>
+<translation id="838869780401515933">bifați</translation>
+<translation id="2846343701378493991">1024 (nivel mediu)</translation>
 <translation id="1637811476055996098">Alegeți fișierele</translation>
 <translation id="49969490063480558">Introduceți o valoare după semnul „<ph name="ATSIGN"/>”. Adresa „<ph name="INVALIDADDRESS"/>” nu este completă.</translation>
-<translation id="5476505524087279545">Debifați</translation>
+<translation id="5476505524087279545">debifați</translation>
 <translation id="2148716181193084225">Astăzi</translation>
 <translation id="2507943997699731163">Completați acest câmp.</translation>
 <translation id="3785482301506746191">glisor redare film</translation>
 <translation id="1921819250265091946">zz</translation>
 <translation id="2613802280814924224">Introduceți o valoare validă. Cea mai apropiată valoare validă este <ph name="VALID_VALUE"/>.</translation>
 <translation id="835897206747267392">Valoare nevalidă.</translation>
-<translation id="1842960171412779397">Selectați</translation>
+<translation id="1842960171412779397">selectați</translation>
 <translation id="7673697353781729403">Ore</translation>
 <translation id="4664250907885839816">Valoarea care urmează după semnul „<ph name="ATSIGN"/>” nu trebuie să conțină simbolul „<ph name="INVALIDCHARACTER"/>”.</translation>
 <translation id="3450233048674729344">Valoarea trebuie să fie mai mică sau egală cu <ph name="MAXIMUM"/>.</translation>
-<translation id="668171684555832681">Altul...</translation>
+<translation id="668171684555832681">Altele...</translation>
 <translation id="6270583010843788609">miniatură cronologie film</translation>
 <translation id="5641012560118721995">întrerupeți redarea</translation>
 <translation id="1591562245178063882">Luna aceasta</translation>
-<translation id="6119846243427417423">Activați</translation>
-<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> fișiere</translation>
+<translation id="6119846243427417423">activați</translation>
+<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> (de) fișiere</translation>
 <translation id="6643016212128521049">Ștergeți</translation>
 <translation id="7888071071722539607">Includeți semnul „<ph name="ATSIGN"/>” în adresa de e-mail. Din adresa „<ph name="INVALIDADDRESS"/>” lipsește semnul „<ph name="ATSIGN"/>”.</translation>
 <translation id="1088086359088493902">Secunde</translation>
-<translation id="3934680773876859118">Încărcarea documentului PDF nu a reușit</translation>
+<translation id="3934680773876859118">Documentul PDF nu a fost încărcat</translation>
 <translation id="3632707345189162177">numărul secundelor rămase din film</translation>
 <translation id="6359256949422175976">miniatură glisor redare film</translation>
-<translation id="8597182159515967513">titlu</translation>
+<translation id="8597182159515967513">antet</translation>
 <translation id="6843725295806269523">dezactivați sunetul</translation>
 <translation id="2653659639078652383">Trimiteți</translation>
 <translation id="3732799496749320381">ll</translation>
index 1a64875..96f7e3a 100644 (file)
@@ -31,7 +31,7 @@
 <translation id="2723001399770238859">zvuk</translation>
 <translation id="6845533974506654842">stlačiť</translation>
 <translation id="8244226242650769279">mapa obrázka</translation>
-<translation id="310520048233152454">Zadajte adresu URL.</translation>
+<translation id="310520048233152454">Zadajte webovú adresu.</translation>
 <translation id="4812940957355064477">Zadajte číslo.</translation>
 <translation id="2548326553472216322">Žiadne posledné vyhľadávania</translation>
 <translation id="1938124657309484470">Hodnota musí byť <ph name="MAXIMUM_DATE_OR_TIME"/> alebo skôr.</translation>
index f61790b..4e3c640 100644 (file)
@@ -4,11 +4,11 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="5843503607508392247">Nyingine...</translation>
 <translation id="248395913932153421">Siku</translation>
-<translation id="1729654308190250600">Tafadhali ingiza anwani ya barua pepe ambayo sio tupu.</translation>
+<translation id="1729654308190250600">Tafadhali jaza sehemu ya anwani ya barua pepe.</translation>
 <translation id="6015796118275082299">Mwaka</translation>
 <translation id="1235745349614807883">Futa Utafutaji wa Hivi Karibuni</translation>
 <translation id="7223624360433298498">muda uliokwisha</translation>
-<translation id="1171774979989969504">Tafadhali ingiza anwani ya barua pepe.</translation>
+<translation id="1171774979989969504">Tafadhali weka anwani ya barua pepe.</translation>
 <translation id="709897737746224366">Tafadhali linganisha umbizo lililoombwa.</translation>
 <translation id="5048533449481078685">kialamishi orodha</translation>
 <translation id="4202807286478387388">ruka</translation>
@@ -87,7 +87,7 @@
 <translation id="6101327004457443354">rejesha sauti ya wimbo</translation>
 <translation id="1822429046913737220">AM / PM</translation>
 <translation id="1639239467298939599">Inapakia</translation>
-<translation id="2908441821576996758">Tafadhali ingiza orodha iliyotenganishwa kwa koma ya anwani za barua pepe.</translation>
+<translation id="2908441821576996758">Tafadhali weka orodha ya anwani za barua pepe zilizotenganishwa kwa vikomo.</translation>
 <translation id="5939518447894949180">Weka upya</translation>
 <translation id="1921819250265091946">dd</translation>
 <translation id="2613802280814924224">Tafadhali ingiza thamani halali.Thamani halali ya karibu ni <ph name="VALID_VALUE"/>.</translation>
index 56afef7..02ee0de 100644 (file)
@@ -6,7 +6,7 @@
 <translation id="248395913932153421">วัน</translation>
 <translation id="1729654308190250600">โปรดป้อนที่อยู่อีเมลที่ไม่ว่างเปล่า</translation>
 <translation id="6015796118275082299">ปี</translation>
-<translation id="1235745349614807883">à¸\99ำออà¸\81การค้นหาล่าสุด</translation>
+<translation id="1235745349614807883">ลà¸\9aการค้นหาล่าสุด</translation>
 <translation id="7223624360433298498">เวลาที่ผ่านไป</translation>
 <translation id="1171774979989969504">โปรดป้อนที่อยู่อีเมล</translation>
 <translation id="709897737746224366">โปรดจับคู่รูปแบบที่ร้องขอ</translation>
index 88e0e14..8cf54d0 100644 (file)
@@ -18,7 +18,7 @@
 <translation id="8785498733064193001">开始播放</translation>
 <translation id="7057186640035488495">电影时间</translation>
 <translation id="8199524924445686405"> 年 </translation>
-<translation id="795667975304826397">未选择文件</translation>
+<translation id="795667975304826397">未选择任何文件</translation>
 <translation id="7789962463072032349">暂停</translation>
 <translation id="6853785296079745596">隐藏可选字幕</translation>
 <translation id="4360991593054037559">请输入有效值。两个最接近的有效值分别为<ph name="VALID_VALUE_LOW"/>和<ph name="VALID_VALUE_HIGHER"/>。</translation>
index 3f8e584..24395f3 100644 (file)
@@ -18,7 +18,7 @@
 <translation id="8785498733064193001">開始播放</translation>
 <translation id="7057186640035488495">電影時間</translation>
 <translation id="8199524924445686405"> 年 </translation>
-<translation id="795667975304826397">未選擇檔案</translation>
+<translation id="795667975304826397">未選擇任何檔案</translation>
 <translation id="7789962463072032349">暫停</translation>
 <translation id="6853785296079745596">不顯示字幕</translation>
 <translation id="4360991593054037559">請輸入有效值。最接近的兩個有效值分別是 <ph name="VALID_VALUE_LOW"/> 和 <ph name="VALID_VALUE_HIGHER"/>。</translation>
index ecda947..1e50bdb 100644 (file)
 # Edit these when rolling DEPS.xwalk.
 # -----------------------------------
 
-chromium_crosswalk_rev = 'b93afe0192aa9888d1246e8933d31272afecb7f0'
-blink_crosswalk_rev = 'b656b39cc2eb71a9f4b70f8439c2d0a1ca54d619'
-v8_crosswalk_rev = '402ca0b81254dd9d7b376485d4582c6b6eac2185'
-ozone_wayland_rev = '0a8caf9bc740d767464b2d1d16fec08ff2f91d1f'
+chromium_crosswalk_rev = 'f506465773c4515957798e38250a3a7becb2bea6'
+blink_crosswalk_rev = 'ebedaf16c0976221debb8547c9a5fc0017998090'
+v8_crosswalk_rev = '8ddfc6f1a103ddbe20e38afeb12c3e0666c8a361'
+ozone_wayland_rev = '3372a0e23d925d5402eb16abbbe58dd82b583a5a'
 
 crosswalk_git = 'https://github.com/crosswalk-project'
 ozone_wayland_git = 'https://github.com/01org'
@@ -30,53 +30,46 @@ ozone_wayland_git = 'https://github.com/01org'
 # You do not need to worry about these most of the time.
 # ------------------------------------------------------
 
-chromium_solution = {
-  'name': 'src',
-  'url': crosswalk_git + '/chromium-crosswalk.git@' + chromium_crosswalk_rev,
-  'deps_file': '.DEPS.git',
-  'custom_deps': {
-    'src':
-      crosswalk_git + '/chromium-crosswalk.git@' + chromium_crosswalk_rev,
-    'src/third_party/WebKit':
-      crosswalk_git + '/blink-crosswalk.git@' + blink_crosswalk_rev,
-    'src/v8':
-      crosswalk_git + '/v8-crosswalk.git@' + v8_crosswalk_rev,
-  }
-}
-
-# These directories are not relevant to Crosswalk and can be safely ignored
-# in a checkout. It avoids creating additional directories outside src/ that
-# are not used and also saves some bandwidth.
-ignored_directories = [
-  'build',
-  'build/scripts/command_wrapper/bin',
-  'build/scripts/gsd_generate_index',
-  'build/scripts/private/data/reliability',
-  'build/scripts/tools/deps2git',
-  'build/third_party/cbuildbot_chromite',
-  'build/third_party/gsutil',
-  'build/third_party/lighttpd',
-  'build/third_party/swarm_client',
-  'build/third_party/xvfb',
-  'build/xvfb',
-  'commit-queue',
-  'depot_tools',
-]
-for ignored_directory in ignored_directories:
-  chromium_solution['custom_deps'][ignored_directory] = None
+solutions = [
+  { 'name': 'src',
+    'url': crosswalk_git + '/chromium-crosswalk.git@' + chromium_crosswalk_rev,
+    'deps_file': '.DEPS.git',
+    'custom_deps': {
+      'src':
+        crosswalk_git + '/chromium-crosswalk.git@' + chromium_crosswalk_rev,
+      'src/third_party/WebKit':
+        crosswalk_git + '/blink-crosswalk.git@' + blink_crosswalk_rev,
+      'src/v8':
+        crosswalk_git + '/v8-crosswalk.git@' + v8_crosswalk_rev,
 
-# ozone-wayland is set as a separate solution because we gclient _not_ to read
-# its .DEPS.git: it changes the recursion limit and tries to check Chromium
-# upstream out itself, leading to URL conflicts and errors about duplicate
-# entries.
-ozone_wayland_solution = {
-  'name': 'src/ozone',
-  'url': ozone_wayland_git + '/ozone-wayland.git@' + ozone_wayland_rev,
-  'deps_file': '',
-}
+      # These directories are not relevant to Crosswalk and can be safely ignored
+      # in a checkout. It avoids creating additional directories outside src/ that
+      # are not used and also saves some bandwidth.
+      'build': None,
+      'build/scripts/command_wrapper/bin': None,
+      'build/scripts/gsd_generate_index': None,
+      'build/scripts/private/data/reliability': None,
+      'build/scripts/tools/deps2git': None,
+      'build/third_party/cbuildbot_chromite': None,
+      'build/third_party/gsutil': None,
+      'build/third_party/lighttpd': None,
+      'build/third_party/swarm_client': None,
+      'build/third_party/xvfb': None,
+      'build/xvfb': None,
+      'commit-queue': None,
+      'depot_tools': None,
+    },
+  },
 
-solutions = [chromium_solution,
-             ozone_wayland_solution]
+  # ozone-wayland is set as a separate solution because we gclient _not_ to read
+  # its .DEPS.git: it changes the recursion limit and tries to check Chromium
+  # upstream out itself, leading to URL conflicts and errors about duplicate
+  # entries.
+  { 'name': 'src/ozone',
+    'url': ozone_wayland_git + '/ozone-wayland.git@' + ozone_wayland_rev,
+    'deps_file': '',
+  }
+]
 
 # -------------------------------------------------
 # This area is edited by generate_gclient-xwalk.py.
index 44cd943..5fc5c3c 100644 (file)
@@ -1,4 +1,4 @@
 MAJOR=9
 MINOR=37
-BUILD=193
+BUILD=195
 PATCH=0
index f8472db..f3d476e 100644 (file)
@@ -12,7 +12,8 @@ class AppInfo:
     self.fullscreen_flag = ''
     self.icon = ''
     # android_name is only composed of alphabetic characters,
-    # it will be used for Android project name,
+    # generated from the last segment of input package name.
+    # It will be used for Android project name,
     # APK file name and Activity name.
     self.android_name = 'AppTemplate'
     self.orientation = 'unspecified'
index 2259cea..f11bbfd 100755 (executable)
@@ -24,19 +24,15 @@ from handle_permissions import HandlePermissions
 from xml.dom import minidom
 
 
-def VerifyAppName(value, mode='default'):
-  descrpt = 'The app'
-  sample = 'helloworld, hello world, hello_world, hello_world1'
-  regex = r'[a-zA-Z][\w ]*$'
+def VerifyPackageName(value):
+  regex = r'^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$'
+  descrpt = 'Each part of package'
+  sample = 'org.xwalk.example, org.xwalk.example_'
 
   if len(value) >= 128:
     print('To be safe, the length of package name or app name '
           'should be less than 128.')
     sys.exit(6)
-  if mode == 'packagename':
-    regex = r'^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$'
-    descrpt = 'Each part of package'
-    sample = 'org.xwalk.example, org.xwalk.example_'
 
   if not re.match(regex, value):
     print('Error: %s name should be started with letters and should not '
@@ -181,6 +177,15 @@ def CustomizeXML(app_info, description, icon_dict, manifest, permissions):
   orientation = app_info.orientation
   package = app_info.package
   app_name = app_info.app_name
+  # Chinese character with unicode get from 'manifest.json' will cause
+  # 'UnicodeEncodeError' when finally wrote to 'AndroidManifest.xml'.
+  if isinstance(app_name, unicode):
+    app_name = app_name.encode("utf-8")
+  # If string start with '@' or '?', it will be treated as Android resource,
+  # which will cause 'No resource found' error,
+  # append a space before '@' or '?' to fix that.
+  if app_name.startswith('@') or app_name.startswith('?'):
+    app_name = ' ' + app_name
   manifest_path = os.path.join(name, 'AndroidManifest.xml')
   if not os.path.isfile(manifest_path):
     print ('Please make sure AndroidManifest.xml'
index aed683a..371f8e8 100755 (executable)
@@ -13,8 +13,8 @@ import subprocess
 import sys
 
 from app_info import AppInfo
-from customize import VerifyAppName, CustomizeAll, \
-                      ParseParameterForCompressor, ReplaceSpaceWithUnderscore
+from customize import VerifyPackageName, CustomizeAll, \
+                      ParseParameterForCompressor
 from handle_permissions import permission_mapping_table
 from manifest_json_parser import HandlePermissionList
 from manifest_json_parser import ManifestJsonParser
@@ -197,7 +197,9 @@ def MakeVersionCode(options):
 def Customize(options, app_info, manifest):
   app_info.package = options.package
   app_info.app_name = options.name
-  app_info.android_name = ReplaceSpaceWithUnderscore(options.name)
+  # 'org.xwalk.my_first_app' => 'MyFirstApp'
+  android_name = options.package.split('.')[-1].split('_')
+  app_info.android_name = ''.join([i.capitalize() for i in android_name if i])
   if options.app_version:
     app_info.app_version = options.app_version
   app_info.app_versionCode = MakeVersionCode(options)
@@ -604,12 +606,11 @@ def main(argv):
 
   if not options.name:
     parser.error('An APK name is required. Please use the "--name" option.')
-  VerifyAppName(options.name)
 
   if not options.package:
     parser.error('A package name is required. Please use the "--package" '
                  'option.')
-  VerifyAppName(options.package, 'packagename')
+  VerifyPackageName(options.package)
 
   if (options.app_root and options.app_local_path and
       not os.path.isfile(os.path.join(options.app_root,
index 934ce04..b42c045 100755 (executable)
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# coding: UTF-8
 
 # Copyright (c) 2013, 2014 Intel Corporation. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -12,8 +13,6 @@ import sys
 import unittest
 import warnings
 
-from customize import ReplaceSpaceWithUnderscore
-
 
 def Clean(name, app_version):
   if os.path.exists(name):
@@ -213,16 +212,7 @@ class TestMakeApk(unittest.TestCase):
            '--package=org.xwalk.example', self._mode]
     out = RunCommand(cmd)
     self.assertNotIn('An APK name is required', out)
-    Clean('Test_Example', '1.0.0')
-
-    invalid_chars = '\/:.*?"<>|-'
-    for c in invalid_chars:
-      invalid_name = '--name=Example' + c
-      cmd = ['python', 'make_apk.py', invalid_name,
-             '--app-version=1.0.0', '--package=org.xwalk.example',
-             '--app-url=http://www.intel.com', self._mode]
-      out = RunCommand(cmd)
-      self.assertTrue(out.find('invalid characters') != -1)
+    Clean('Example', '1.0.0')
 
   def testToolVersion(self):
     cmd = ['python', 'make_apk.py', '--version']
@@ -1031,77 +1021,29 @@ class TestMakeApk(unittest.TestCase):
 
     Clean(name, '1.0.0')
 
-  def testInvalidCharacter(self):
-    version = '1.0.0'
-    start_with_letters = ' should be started with letters'
-    app_name_error = 'app name' + start_with_letters
-    package_name_error = 'package name' + start_with_letters
-    parse_error = 'parser error in manifest.json file'
-    directory = os.path.join('test_data', 'manifest', 'invalidchars')
-
-    manifest_path = os.path.join(directory, 'manifest_with_space_name.json')
-    result = GetResultWithOption(self._mode, manifest_path)
-    self.assertTrue(result.find(app_name_error) != -1)
-
-    manifest_path = os.path.join(directory, 'manifest_with_chinese_name.json')
-    result = GetResultWithOption(self._mode, manifest_path)
-    self.assertTrue(result.find(app_name_error) != -1)
-
-    manifest_path = os.path.join(directory, 'manifest_parse_error.json')
-    result = GetResultWithOption(self._mode, manifest_path)
-    self.assertTrue(result.find(parse_error) != -1)
-
-    manifest_path = os.path.join(directory, 'manifest_with_invalid_name.json')
-    result = GetResultWithOption(self._mode, manifest_path)
-    self.assertTrue(result.find(app_name_error) != -1)
-
-    manifest_path = os.path.join(directory, 'manifest_contain_space_name.json')
-    result = GetResultWithOption(self._mode, manifest_path)
-    self.assertTrue(result.find(app_name_error) == -1)
-
-    package = 'org.xwalk.example'
-    name = '_hello'
-    result = GetResultWithOption(self._mode, name=name, package=package)
-    self.assertTrue(result.find(app_name_error) != -1)
-
-    name = '123hello'
-    result = GetResultWithOption(self._mode, name=name, package=package)
-    self.assertTrue(result.find(app_name_error) != -1)
-
-    name = 'hello_'
-    result = GetResultWithOption(self._mode, name=name, package=package)
-    self.assertTrue(result.find(app_name_error) == -1)
-    Clean(name, version)
-
-
-  def VerifyResultForAppNameWithSpace(self, manifest=None, name=None,
-                                      package=None):
-    version = '1.0.0'
-    GetResultWithOption(manifest=manifest, name=name, package=package)
-    if name is None:
-      name = 'app name '
-    replaced_name = ReplaceSpaceWithUnderscore(name)
-    manifest = replaced_name + '/AndroidManifest.xml'
-    with open(manifest, 'r') as content_file:
-      content = content_file.read()
-    self.assertTrue(os.path.exists(manifest))
-    self.assertTrue(name in content)
-    Clean(replaced_name, version)
-
 
-  def testAppNameWithSpace(self):
-    name = 'app name'
-    package = 'org.xwalk.app_name'
+  def VerifyResultForAppName(self, app_name):
+    android_manifest = 'Example/AndroidManifest.xml'
+    self.assertTrue(os.path.exists(android_manifest))
+    with open(android_manifest, 'r') as content_file:
+      content = content_file.read()
+    label_name = 'android:label="%s"' % app_name
+    self.assertIn(label_name, content)
+    Clean('Example', '1.0.0')
 
-    self.VerifyResultForAppNameWithSpace(name=name, package=package)
 
-    name = 'app name '
-    self.VerifyResultForAppNameWithSpace(name=name, package=package)
+  def testAppNameWithNonASCII (self):
+    cmd = ['python', 'make_apk.py', '--name=你好', '--app-version=1.0.0',
+           '--package=org.xwalk.example', '--app-url=http://www.intel.com']
+    RunCommand(cmd)
+    self.VerifyResultForAppName('你好')
 
-    directory = os.path.join('test_data', 'manifest', 'invalidchars')
-    manifest_path = os.path.join(directory, 'manifest_contain_space_name.json')
-    self.VerifyResultForAppNameWithSpace(manifest=manifest_path,
-                                         package=package)
+    manifest_path = os.path.join('test_data', 'manifest', 'invalidchars',
+                                 'manifest_with_chinese_name.json')
+    cmd = ['python', 'make_apk.py', '--package=org.xwalk.example',
+           '--manifest=%s' % manifest_path]
+    RunCommand(cmd)
+    self.VerifyResultForAppName('你好')
 
 
 def SuiteWithModeOption():
@@ -1121,7 +1063,6 @@ def SuiteWithModeOption():
   test_suite.addTest(TestMakeApk('testFullscreen'))
   test_suite.addTest(TestMakeApk('testIconByOption'))
   test_suite.addTest(TestMakeApk('testIconByManifest'))
-  test_suite.addTest(TestMakeApk('testInvalidCharacter'))
   test_suite.addTest(TestMakeApk('testKeystore'))
   test_suite.addTest(TestMakeApk('testManifest'))
   test_suite.addTest(TestMakeApk('testManifestWithDeprecatedField'))
@@ -1142,7 +1083,7 @@ def SuiteWithModeOption():
 def SuiteWithEmptyModeOption():
   # Gather all the tests for empty mode option.
   test_suite = unittest.TestSuite()
-  test_suite.addTest(TestMakeApk('testAppNameWithSpace'))
+  test_suite.addTest(TestMakeApk('testAppNameWithNonASCII'))
   test_suite.addTest(TestMakeApk('testCompressor'))
   test_suite.addTest(TestMakeApk('testCustomizeFile'))
   test_suite.addTest(TestMakeApk('testEmptyMode'))
index 129587e..09f0476 100644 (file)
@@ -72,7 +72,8 @@ ApplicationTizen::ApplicationTizen(
     scoped_refptr<ApplicationData> data,
     RuntimeContext* runtime_context,
     Application::Observer* observer)
-    : Application(data, runtime_context, observer) {
+    : Application(data, runtime_context, observer),
+      is_suspended_(false) {
 #if defined(USE_OZONE)
   ui::PlatformEventSource::GetInstance()->AddPlatformEventObserver(this);
 #endif
@@ -111,6 +112,38 @@ base::FilePath ApplicationTizen::GetSplashScreenPath() {
   return base::FilePath();
 }
 
+void ApplicationTizen::Suspend() {
+  if (is_suspended_)
+    return;
+
+  DCHECK(render_process_host_);
+  render_process_host_->Send(new ViewMsg_SuspendJSEngine(true));
+
+  DCHECK(!runtimes_.empty());
+  std::set<Runtime*>::iterator it = runtimes_.begin();
+  for (; it != runtimes_.end(); ++it) {
+    if ((*it)->web_contents())
+      (*it)->web_contents()->WasHidden();
+  }
+  is_suspended_ = true;
+}
+
+void ApplicationTizen::Resume() {
+  if (!is_suspended_)
+    return;
+
+  DCHECK(render_process_host_);
+  render_process_host_->Send(new ViewMsg_SuspendJSEngine(false));
+
+  DCHECK(!runtimes_.empty());
+  std::set<Runtime*>::iterator it = runtimes_.begin();
+  for (; it != runtimes_.end(); ++it) {
+    if ((*it)->web_contents())
+      (*it)->web_contents()->WasShown();
+  }
+  is_suspended_ = false;
+}
+
 #if defined(USE_OZONE)
 void ApplicationTizen::WillProcessEvent(const ui::PlatformEvent& event) {}
 
index a8dedad..5cace02 100644 (file)
@@ -23,6 +23,8 @@ class ApplicationTizen :  // NOLINT
  public:
   virtual ~ApplicationTizen();
   void Hide();
+  void Suspend();
+  void Resume();
 
  private:
   // We enforce ApplicationService ownership.
@@ -38,6 +40,8 @@ class ApplicationTizen :  // NOLINT
   virtual void WillProcessEvent(const ui::PlatformEvent& event) OVERRIDE;
   virtual void DidProcessEvent(const ui::PlatformEvent& event) OVERRIDE;
 #endif
+
+  bool is_suspended_;
 };
 
 inline ApplicationTizen* ToApplicationTizen(Application* app) {
index b5f2b10..3b014b7 100644 (file)
@@ -76,6 +76,20 @@ RunningApplicationObject::RunningApplicationObject(
                  base::Unretained(this)),
       base::Bind(&RunningApplicationObject::OnExported,
                  base::Unretained(this)));
+
+  dbus_object()->ExportMethod(
+      kRunningApplicationDBusInterface, "Suspend",
+      base::Bind(&RunningApplicationObject::OnSuspend,
+                 base::Unretained(this)),
+      base::Bind(&RunningApplicationObject::OnExported,
+                 base::Unretained(this)));
+
+  dbus_object()->ExportMethod(
+      kRunningApplicationDBusInterface, "Resume",
+      base::Bind(&RunningApplicationObject::OnResume,
+                 base::Unretained(this)),
+      base::Bind(&RunningApplicationObject::OnExported,
+                 base::Unretained(this)));
 #endif
 }
 
@@ -148,6 +162,44 @@ void RunningApplicationObject::OnHide(
       dbus::Response::FromMethodCall(method_call);
   response_sender.Run(response.Pass());
 }
+
+void RunningApplicationObject::OnSuspend(
+    dbus::MethodCall* method_call,
+    dbus::ExportedObject::ResponseSender response_sender) {
+  if (method_call->GetSender() != launcher_name_) {
+    scoped_ptr<dbus::ErrorResponse> error_response =
+        dbus::ErrorResponse::FromMethodCall(method_call,
+                                            kRunningApplicationDBusError,
+                                            "Not permitted");
+    response_sender.Run(error_response.PassAs<dbus::Response>());
+    return;
+  }
+
+  ToApplicationTizen(application_)->Suspend();
+
+  scoped_ptr<dbus::Response> response =
+      dbus::Response::FromMethodCall(method_call);
+  response_sender.Run(response.Pass());
+}
+
+void RunningApplicationObject::OnResume(
+    dbus::MethodCall* method_call,
+    dbus::ExportedObject::ResponseSender response_sender) {
+  if (method_call->GetSender() != launcher_name_) {
+    scoped_ptr<dbus::ErrorResponse> error_response =
+        dbus::ErrorResponse::FromMethodCall(method_call,
+                                            kRunningApplicationDBusError,
+                                            "Not permitted");
+    response_sender.Run(error_response.PassAs<dbus::Response>());
+    return;
+  }
+
+  ToApplicationTizen(application_)->Resume();
+
+  scoped_ptr<dbus::Response> response =
+      dbus::Response::FromMethodCall(method_call);
+  response_sender.Run(response.Pass());
+}
 #endif
 
 void RunningApplicationObject::ListenForOwnerChange() {
index 4749aae..70db94f 100644 (file)
@@ -53,6 +53,12 @@ class RunningApplicationObject : public dbus::ManagedObject {
 #if defined(OS_TIZEN)
   void OnHide(dbus::MethodCall* method_call,
               dbus::ExportedObject::ResponseSender response_sender);
+
+  void OnSuspend(dbus::MethodCall* method_call,
+                 dbus::ExportedObject::ResponseSender response_sender);
+
+  void OnResume(dbus::MethodCall* method_call,
+                dbus::ExportedObject::ResponseSender response_sender);
 #endif
 
   void ListenForOwnerChange();
@@ -76,4 +82,3 @@ class RunningApplicationObject : public dbus::ManagedObject {
 }  // namespace xwalk
 
 #endif  // XWALK_APPLICATION_BROWSER_LINUX_RUNNING_APPLICATION_OBJECT_H_
-
index c8dd611..09fd3b4 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "xwalk/application/browser/linux/running_application_object.h"
 #include "xwalk/application/common/application_data.h"
+#include "xwalk/runtime/browser/xwalk_runner.h"
 
 namespace {
 
@@ -59,6 +60,13 @@ RunningApplicationsManager::RunningApplicationsManager(
   application_service_->AddObserver(this);
 
   adaptor_.manager_object()->ExportMethod(
+      kRunningManagerDBusInterface, "EnableRemoteDebugging",
+      base::Bind(&RunningApplicationsManager::OnRemoteDebuggingEnabled,
+                 weak_factory_.GetWeakPtr()),
+      base::Bind(&RunningApplicationsManager::OnExported,
+                 weak_factory_.GetWeakPtr()));
+
+  adaptor_.manager_object()->ExportMethod(
       kRunningManagerDBusInterface, "Launch",
       base::Bind(&RunningApplicationsManager::OnLaunch,
                  weak_factory_.GetWeakPtr()),
@@ -95,6 +103,33 @@ scoped_ptr<dbus::Response> CreateError(dbus::MethodCall* method_call,
 
 }  // namespace
 
+void RunningApplicationsManager::OnRemoteDebuggingEnabled(
+    dbus::MethodCall* method_call,
+    dbus::ExportedObject::ResponseSender response_sender) {
+  dbus::MessageReader reader(method_call);
+  unsigned int debugging_port;
+
+  if (!reader.PopUint32(&debugging_port)) {
+    scoped_ptr<dbus::Response> response =
+        CreateError(method_call,
+                    "Error parsing message. Missing arguments.");
+    response_sender.Run(response.Pass());
+    return;
+  }
+
+  if (debugging_port != 0) {
+    XWalkRunner::GetInstance()->EnableRemoteDebugging(debugging_port);
+  } else {
+    XWalkRunner::GetInstance()->DisableRemoteDebugging();
+  }
+
+  scoped_ptr<dbus::Response> response =
+      dbus::Response::FromMethodCall(method_call);
+  dbus::MessageWriter writer(response.get());
+  writer.AppendUint32(debugging_port);
+  response_sender.Run(response.Pass());
+}
+
 void RunningApplicationsManager::OnLaunch(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
index c83d5f5..bc4dea6 100644 (file)
@@ -46,6 +46,9 @@ class RunningApplicationsManager : public ApplicationService::Observer {
                   const std::string& method_name,
                   bool success);
 
+  void OnRemoteDebuggingEnabled(dbus::MethodCall* method_call,
+                                dbus::ExportedObject::ResponseSender sender);
+
   void virtual WillDestroyApplication(Application* app) OVERRIDE;
 
   dbus::ObjectPath AddObject(const std::string& app_id,
index 740749b..e4a9482 100644 (file)
@@ -16,5 +16,16 @@ SignatureData::SignatureData(const std::string& signature_file_name,
 SignatureData::~SignatureData() {
 }
 
+base::FilePath SignatureData::GetExtractedWidgetPath() const {
+  std::string widget_path = signature_file_name();
+  size_t pos = widget_path.rfind('/');
+  if (pos == std::string::npos) {
+    widget_path.clear();
+  } else {
+    widget_path.erase(pos + 1, std::string::npos);
+  }
+  return base::FilePath(widget_path);
+}
+
 }  // namespace application
 }  // namespace xwalk
index 4e623d3..8f69b2e 100644 (file)
@@ -26,7 +26,7 @@ class SignatureData {
     return signature_file_name_;
   }
 
-  std::set<std::string>& reference_set() {
+  const std::set<std::string>& reference_set() const {
     return reference_set_;
   }
 
@@ -82,7 +82,7 @@ class SignatureData {
     signature_method_ = signature_method;
   }
 
-  std::list<std::string>& certificate_list() {
+  const std::list<std::string>& certificate_list() const {
     return certificate_list_;
   }
 
@@ -102,6 +102,8 @@ class SignatureData {
     return signature_number_ == -1;
   }
 
+  base::FilePath GetExtractedWidgetPath() const;
+
  private:
   std::string signature_file_name_;
   // This number is taken from distributor signature file name.
diff --git a/src/xwalk/application/common/installer/tizen/configuration/signature_schema.xsd b/src/xwalk/application/common/installer/tizen/configuration/signature_schema.xsd
new file mode 100644 (file)
index 0000000..8028f3e
--- /dev/null
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE schema
+  PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
+ [
+   <!ATTLIST schema
+     xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#">
+   <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'>
+   <!ENTITY % p ''>
+   <!ENTITY % s ''>
+  ]>
+
+<!-- Schema for XML Signatures
+    http://www.w3.org/2000/09/xmldsig#
+    $Revision: 1.1 $ on $Date: 2002/02/08 20:32:26 $ by $Author: reagle $
+
+    Copyright 2001 The Internet Society and W3C (Massachusetts Institute
+    of Technology, Institut National de Recherche en Informatique et en
+    Automatique, Keio University). All Rights Reserved.
+    http://www.w3.org/Consortium/Legal/
+
+    This document is governed by the W3C Software License [1] as described
+    in the FAQ [2].
+
+    [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
+    [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
+-->
+
+
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+        xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+        targetNamespace="http://www.w3.org/2000/09/xmldsig#"
+        version="0.1" elementFormDefault="qualified">
+
+<!-- Basic Types Defined for Signatures -->
+
+<simpleType name="CryptoBinary">
+  <restriction base="base64Binary">
+  </restriction>
+</simpleType>
+
+<!-- Start Signature -->
+
+<element name="Signature" type="ds:SignatureType"/>
+<complexType name="SignatureType">
+  <sequence>
+    <element ref="ds:SignedInfo"/>
+    <element ref="ds:SignatureValue"/>
+    <element ref="ds:KeyInfo" minOccurs="0"/>
+    <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/>
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+  <element name="SignatureValue" type="ds:SignatureValueType"/>
+  <complexType name="SignatureValueType">
+    <simpleContent>
+      <extension base="base64Binary">
+        <attribute name="Id" type="ID" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+
+<!-- Start SignedInfo -->
+
+<element name="SignedInfo" type="ds:SignedInfoType"/>
+<complexType name="SignedInfoType">
+  <sequence>
+    <element ref="ds:CanonicalizationMethod"/>
+    <element ref="ds:SignatureMethod"/>
+    <element ref="ds:Reference" maxOccurs="unbounded"/>
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+  <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/>
+  <complexType name="CanonicalizationMethodType" mixed="true">
+    <sequence>
+      <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
+      <!-- (0,unbounded) elements from (1,1) namespace -->
+    </sequence>
+    <attribute name="Algorithm" type="anyURI" use="required"/>
+  </complexType>
+
+  <element name="SignatureMethod" type="ds:SignatureMethodType"/>
+  <complexType name="SignatureMethodType" mixed="true">
+    <sequence>
+      <element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/>
+      <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+      <!-- (0,unbounded) elements from (1,1) external namespace -->
+    </sequence>
+    <attribute name="Algorithm" type="anyURI" use="required"/>
+  </complexType>
+
+<!-- Start Reference -->
+
+<element name="Reference" type="ds:ReferenceType"/>
+<complexType name="ReferenceType">
+  <sequence>
+    <element ref="ds:Transforms" minOccurs="0"/>
+    <element ref="ds:DigestMethod"/>
+    <element ref="ds:DigestValue"/>
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/>
+  <attribute name="URI" type="anyURI" use="optional"/>
+  <attribute name="Type" type="anyURI" use="optional"/>
+</complexType>
+
+  <element name="Transforms" type="ds:TransformsType"/>
+  <complexType name="TransformsType">
+    <sequence>
+      <element ref="ds:Transform" maxOccurs="unbounded"/>
+    </sequence>
+  </complexType>
+
+  <element name="Transform" type="ds:TransformType"/>
+  <complexType name="TransformType" mixed="true">
+    <choice minOccurs="0" maxOccurs="unbounded">
+      <any namespace="##other" processContents="lax"/>
+      <!-- (1,1) elements from (0,unbounded) namespaces -->
+      <element name="XPath" type="string"/>
+    </choice>
+    <attribute name="Algorithm" type="anyURI" use="required"/>
+  </complexType>
+
+<!-- End Reference -->
+
+<element name="DigestMethod" type="ds:DigestMethodType"/>
+<complexType name="DigestMethodType" mixed="true">
+  <sequence>
+    <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </sequence>
+  <attribute name="Algorithm" type="anyURI" use="required"/>
+</complexType>
+
+<element name="DigestValue" type="ds:DigestValueType"/>
+<simpleType name="DigestValueType">
+  <restriction base="base64Binary"/>
+</simpleType>
+
+<!-- End SignedInfo -->
+
+<!-- Start KeyInfo -->
+
+<element name="KeyInfo" type="ds:KeyInfoType"/>
+<complexType name="KeyInfoType" mixed="true">
+  <choice maxOccurs="unbounded">
+    <element ref="ds:KeyName"/>
+    <element ref="ds:KeyValue"/>
+    <element ref="ds:RetrievalMethod"/>
+    <element ref="ds:X509Data"/>
+    <element ref="ds:PGPData"/>
+    <element ref="ds:SPKIData"/>
+    <element ref="ds:MgmtData"/>
+    <any processContents="lax" namespace="##other"/>
+    <!-- (1,1) elements from (0,unbounded) namespaces -->
+  </choice>
+  <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+  <element name="KeyName" type="string"/>
+  <element name="MgmtData" type="string"/>
+
+  <element name="KeyValue" type="ds:KeyValueType"/>
+  <complexType name="KeyValueType" mixed="true">
+   <choice>
+     <element ref="ds:DSAKeyValue"/>
+     <element ref="ds:RSAKeyValue"/>
+     <element ref="ds:ECKeyValue"/>
+     <any namespace="##other" processContents="lax"/>
+   </choice>
+  </complexType>
+
+<!-- ECDSA KEY DEFINITIONS -->
+
+  <element name="ECKeyValue" type="ds:ECKeyValueType"/>
+  <complexType name="ECKeyValueType">
+    <sequence>
+      <choice>
+        <element name="ECParameters" type="ds:ECParametersType"/>
+        <element name="NamedCurve" type="ds:NamedCurveType"/>
+      </choice>
+      <element name="PublicKey" type="ds:ECPointType"/>
+    </sequence>
+    <attribute name="Id" type="ID" use="optional"/>
+  </complexType>
+
+  <complexType name="NamedCurveType">
+    <attribute name="URI" type="anyURI" use="required"/>
+  </complexType>
+
+  <simpleType name="ECPointType">
+    <restriction base="ds:CryptoBinary"/>
+  </simpleType>
+
+  <element name="RetrievalMethod" type="ds:RetrievalMethodType"/>
+  <complexType name="RetrievalMethodType">
+    <sequence>
+      <element ref="ds:Transforms" minOccurs="0"/>
+    </sequence>
+    <attribute name="URI" type="anyURI"/>
+    <attribute name="Type" type="anyURI" use="optional"/>
+  </complexType>
+
+    <complexType name="ECParametersType">
+      <sequence>
+        <element name="FieldID" type="ds:FieldIDType"/>
+        <element name="Curve" type="ds:CurveType"/>
+        <element name="Base" type="ds:ECPointType"/>
+        <element name="Order" type="ds:CryptoBinary"/>
+        <element name="CoFactor" type="integer" minOccurs="0"/>
+        <element name="ValidationData" type="ds:ECValidationDataType" minOccurs="0"/>
+      </sequence>
+    </complexType>
+
+    <complexType name="FieldIDType">
+      <choice>
+        <element ref="ds:Prime"/>
+        <element ref="ds:TnB"/>
+        <element ref="ds:PnB"/>
+        <element ref="ds:GnB"/>
+        <any namespace="##other" processContents="lax"/>
+      </choice>
+    </complexType>
+
+    <element name="Prime" type="ds:PrimeFieldParamsType"/>
+    <complexType name="PrimeFieldParamsType">
+      <sequence>
+        <element name="P" type="ds:CryptoBinary"/>
+      </sequence>
+    </complexType>
+
+    <element name="GnB" type="ds:CharTwoFieldParamsType"/>
+    <complexType name="CharTwoFieldParamsType">
+      <sequence>
+        <element name="M" type="positiveInteger"/>
+      </sequence>
+    </complexType>
+
+    <element name="TnB" type="ds:TnBFieldParamsType"/>
+    <complexType name="TnBFieldParamsType">
+      <complexContent>
+        <extension base="ds:CharTwoFieldParamsType">
+          <sequence>
+            <element name="K" type="positiveInteger"/>
+          </sequence>
+        </extension>
+      </complexContent>
+    </complexType>
+
+    <element name="PnB" type="ds:PnBFieldParamsType"/>
+    <complexType name="PnBFieldParamsType">
+      <complexContent>
+        <extension base="ds:CharTwoFieldParamsType">
+          <sequence>
+            <element name="K1" type="positiveInteger"/>
+            <element name="K2" type="positiveInteger"/>
+            <element name="K3" type="positiveInteger"/>
+          </sequence>
+        </extension>
+      </complexContent>
+    </complexType>
+
+    <complexType name="CurveType">
+      <sequence>
+        <element name="A" type="ds:CryptoBinary"/>
+        <element name="B" type="ds:CryptoBinary"/>
+      </sequence>
+    </complexType>
+
+  <complexType name="ECValidationDataType">
+    <sequence>
+      <element name="seed" type="ds:CryptoBinary"/>
+    </sequence>
+    <attribute name="hashAlgorithm" type="anyURI" use="required"/>
+  </complexType>
+
+
+<!-- Start X509Data -->
+
+<element name="X509Data" type="ds:X509DataType"/>
+<complexType name="X509DataType">
+  <sequence maxOccurs="unbounded">
+    <choice>
+      <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
+      <element name="X509SKI" type="base64Binary"/>
+      <element name="X509SubjectName" type="string"/>
+      <element name="X509Certificate" type="base64Binary"/>
+      <element name="X509CRL" type="base64Binary"/>
+      <any namespace="##other" processContents="lax"/>
+    </choice>
+  </sequence>
+</complexType>
+
+<complexType name="X509IssuerSerialType">
+  <sequence>
+    <element name="X509IssuerName" type="string"/>
+    <element name="X509SerialNumber" type="integer"/>
+  </sequence>
+</complexType>
+
+<!-- End X509Data -->
+
+<!-- Begin PGPData -->
+
+<element name="PGPData" type="ds:PGPDataType"/>
+<complexType name="PGPDataType">
+  <choice>
+    <sequence>
+      <element name="PGPKeyID" type="base64Binary"/>
+      <element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/>
+      <any namespace="##other" processContents="lax" minOccurs="0"
+       maxOccurs="unbounded"/>
+    </sequence>
+    <sequence>
+      <element name="PGPKeyPacket" type="base64Binary"/>
+      <any namespace="##other" processContents="lax" minOccurs="0"
+       maxOccurs="unbounded"/>
+    </sequence>
+  </choice>
+</complexType>
+
+<!-- End PGPData -->
+
+<!-- Begin SPKIData -->
+
+<element name="SPKIData" type="ds:SPKIDataType"/>
+<complexType name="SPKIDataType">
+  <sequence maxOccurs="unbounded">
+    <element name="SPKISexp" type="base64Binary"/>
+    <any namespace="##other" processContents="lax" minOccurs="0"/>
+  </sequence>
+</complexType>
+
+<!-- End SPKIData -->
+
+<!-- End KeyInfo -->
+
+<!-- Start Object (Manifest, SignatureProperty) -->
+
+<element name="Object" type="ds:ObjectType"/>
+<complexType name="ObjectType" mixed="true">
+  <sequence minOccurs="0" maxOccurs="unbounded">
+    <any namespace="##any" processContents="lax"/>
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/>
+  <attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet -->
+  <attribute name="Encoding" type="anyURI" use="optional"/>
+</complexType>
+
+<element name="Manifest" type="ds:ManifestType"/>
+<complexType name="ManifestType">
+  <sequence>
+    <element ref="ds:Reference" maxOccurs="unbounded"/>
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+<element name="SignatureProperties" type="ds:SignaturePropertiesType"/>
+<complexType name="SignaturePropertiesType">
+  <sequence>
+    <element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
+  </sequence>
+  <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+   <element name="SignatureProperty" type="ds:SignaturePropertyType"/>
+   <complexType name="SignaturePropertyType" mixed="true">
+     <choice maxOccurs="unbounded">
+       <any namespace="##other" processContents="lax"/>
+       <!-- (1,1) elements from (1,unbounded) namespaces -->
+     </choice>
+     <attribute name="Target" type="anyURI" use="required"/>
+     <attribute name="Id" type="ID" use="optional"/>
+   </complexType>
+
+<!-- End Object (Manifest, SignatureProperty) -->
+
+<!-- Start Algorithm Parameters -->
+
+<simpleType name="HMACOutputLengthType">
+  <restriction base="integer"/>
+</simpleType>
+
+<!-- Start KeyValue Element-types -->
+
+<element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
+<complexType name="DSAKeyValueType">
+  <sequence>
+    <sequence minOccurs="0">
+      <element name="P" type="ds:CryptoBinary"/>
+      <element name="Q" type="ds:CryptoBinary"/>
+    </sequence>
+    <element name="G" type="ds:CryptoBinary" minOccurs="0"/>
+    <element name="Y" type="ds:CryptoBinary"/>
+    <element name="J" type="ds:CryptoBinary" minOccurs="0"/>
+    <sequence minOccurs="0">
+      <element name="Seed" type="ds:CryptoBinary"/>
+      <element name="PgenCounter" type="ds:CryptoBinary"/>
+    </sequence>
+  </sequence>
+</complexType>
+
+<element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
+<complexType name="RSAKeyValueType">
+  <sequence>
+    <element name="Modulus" type="ds:CryptoBinary"/>
+    <element name="Exponent" type="ds:CryptoBinary"/>
+  </sequence>
+</complexType>
+
+<!-- End KeyValue Element-types -->
+
+<!-- End Signature -->
+
+</schema>
diff --git a/src/xwalk/application/common/installer/tizen/signature_validator.cc b/src/xwalk/application/common/installer/tizen/signature_validator.cc
new file mode 100644 (file)
index 0000000..66b9f72
--- /dev/null
@@ -0,0 +1,258 @@
+// Copyright (c) 2013 Intel Corporation. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "xwalk/application/common/installer/tizen/signature_validator.h"
+
+#include <string>
+#include "base/files/file_enumerator.h"
+#include "base/logging.h"
+#include "libxml/tree.h"
+#include "libxml/parser.h"
+#include "libxml/xmlschemas.h"
+#include "third_party/re2/re2/re2.h"
+#include "xwalk/application/common/installer/signature_parser.h"
+
+namespace {
+
+const int kXMLLogSize = 1024;
+const char kAuthorSignatureName[] = "author-signature.xml";
+const char kDistributorSignatureRex[] = "^signature([1-9][0-9]*)\\.xml";
+const char kTokenRoleAuthorURI[] =
+  "http://www.w3.org/ns/widgets-digsig#role-author";
+const char kTokenRoleDistributor[] =
+  "http://www.w3.org/ns/widgets-digsig#role-distributor";
+const char kTokenProfileURI[] =
+  "http://www.w3.org/ns/widgets-digsig#profile";
+const char kSignatureSchemaPath[] = "/usr/share/xwalk/schema.xsd";
+
+//  A wrapper of LOG(ERROR) function, which  is used as parameter of function
+//  xmlSchemaSetValidErrors
+void LogErrorLibxml2(void *, const char *msg, ...) {
+  char buffer[kXMLLogSize];
+  va_list args;
+  va_start(args, msg);
+  vsnprintf(buffer, sizeof(buffer), msg, args);
+  va_end(args);
+  LOG(ERROR) << "ERROR: " << buffer;
+}
+
+//  A wrapper of LOG(WARNING) function, which  is used as parameter of function
+//  xmlSchemaSetValidErrors
+void LogWarningLibxml2(void *, const char *msg, ...) {
+  char buffer[kXMLLogSize];
+  va_list args;
+  va_start(args, msg);
+  vsnprintf(buffer, sizeof(buffer), msg, args);
+  va_end(args);
+  LOG(WARNING) << "Warning: " << buffer;
+}
+
+class SignatureFile {
+ public:
+  SignatureFile(const std::string& file_name, int file_number)
+    : file_name_(file_name), file_number_(file_number) {
+  }
+
+  std::string file_name() const {
+    return file_name_;
+  }
+
+  int file_number() const {
+    return file_number_;
+  }
+
+  bool operator<(const SignatureFile &second) const {
+    return file_number_ < second.file_number();
+  }
+
+ private:
+  std::string file_name_;
+  int file_number_;
+};
+typedef std::set<SignatureFile> SignatureFileSet;
+
+const SignatureFileSet& GetSignatureFiles(const base::FilePath& widget_path) {
+  SignatureFileSet signature_set;
+  std::string file_name;
+  int number;
+  base::FileEnumerator iter(widget_path, false, base::FileEnumerator::FILES,
+      FILE_PATH_LITERAL("*.xml"));
+
+  for (base::FilePath name = iter.Next(); !name.empty(); name = iter.Next()) {
+    file_name = name.BaseName().MaybeAsASCII();
+    if (file_name.compare(kAuthorSignatureName) == 0) {
+      // Find author signature file.
+      signature_set.insert(SignatureFile(file_name, -1));
+    }
+    if (re2::RE2::FullMatch(file_name, kDistributorSignatureRex, &number)) {
+      // Find distributor signature file.
+      signature_set.insert(SignatureFile(file_name, number));
+    }
+  }
+  return signature_set;
+}
+
+bool XMLSchemaValidate(
+    const SignatureFile& signature_file, const base::FilePath& widget_path) {
+  xmlDocPtr schema_doc = xmlReadFile(
+      kSignatureSchemaPath, NULL, XML_PARSE_NONET|XML_PARSE_NOENT);
+  if (NULL == schema_doc) {
+    LOG(ERROR) << "Reading schema file failed.";
+    return false;
+  }
+
+  xmlSchemaParserCtxtPtr ctx = xmlSchemaNewParserCtxt(kSignatureSchemaPath);
+  if (ctx == NULL) {
+    LOG(ERROR) << "Initing xml schema parser context failed.";
+    return false;
+  }
+
+  xmlSchemaPtr xschema = xmlSchemaParse(ctx);
+  if (xschema == NULL) {
+    LOG(ERROR) << "Parsing xml schema failed.";
+    return false;
+  }
+
+  xmlSchemaValidCtxtPtr vctx = xmlSchemaNewValidCtxt(xschema);
+  if (vctx == NULL) {
+    LOG(ERROR) << "Initing xml schema context failed.";
+    return false;
+  }
+  xmlSchemaSetValidErrors(vctx, (xmlSchemaValidityErrorFunc)&LogErrorLibxml2,
+      (xmlSchemaValidityWarningFunc)&LogWarningLibxml2, NULL);
+
+  int ret = xmlSchemaValidateFile(vctx, widget_path.Append(
+        signature_file.file_name()).MaybeAsASCII().c_str(), 0);
+
+  if (ret != 0) {
+    LOG(ERROR) << "Validating " << signature_file.file_name()
+               << " schema failed.";
+    return false;
+  }
+  return true;
+}
+
+bool CheckObjectID(
+    const xwalk::application::SignatureData& signature_data) {
+  std::string object_id = signature_data.object_id();
+  std::set<std::string> reference_set = signature_data.reference_set();
+
+  std::set<std::string>::const_iterator result =
+    reference_set.find(std::string("#") + object_id);
+  if (result == reference_set.end()) {
+    LOG(ERROR) << "No reference to object.";
+    return false;
+  }
+  return true;
+}
+
+bool CheckRoleURI(
+    const xwalk::application::SignatureData& signature_data) {
+  std::string role_uri = signature_data.role_uri();
+
+  if (role_uri.empty()) {
+    LOG(ERROR) << "URI attribute in Role tag couldn't be empty.";
+    return false;
+  }
+
+  if (role_uri != kTokenRoleAuthorURI && signature_data.isAuthorSignature()) {
+    LOG(ERROR) << "URI attribute in Role tag does not "
+               << "match with signature filename.";
+    return false;
+  }
+
+  if (role_uri != kTokenRoleDistributor &&
+      !signature_data.isAuthorSignature()) {
+    LOG(ERROR) << "URI attribute in Role tag does not "
+               << "match with signature filename.";
+    return false;
+  }
+
+  return true;
+}
+
+bool CheckProfileURI(const xwalk::application::SignatureData& signature_data) {
+  if (kTokenProfileURI != signature_data.profile_uri()) {
+    LOG(ERROR) << "Profile tag contains unsupported value in URI attribute.";
+    return false;
+  }
+  return true;
+}
+
+bool CheckReference(
+    const xwalk::application::SignatureData& signature_data) {
+  base::FilePath widget_path = signature_data.GetExtractedWidgetPath();
+  int prefix_length = widget_path.value().length() + 1;
+  std::string file_name;
+  std::set<std::string> reference_set = signature_data.reference_set();
+  base::FileEnumerator iter(widget_path, true, base::FileEnumerator::FILES);
+
+  for (base::FilePath name = iter.Next(); !name.empty(); name = iter.Next()) {
+    file_name = name.value().substr(prefix_length);
+    if (file_name.compare(kAuthorSignatureName) == 0 ||
+        re2::RE2::FullMatch(file_name, kDistributorSignatureRex)) {
+      // Skip signtature file.
+      continue;
+    }
+    std::set<std::string>::iterator ref_iter = reference_set.find(file_name);
+    if (ref_iter == reference_set.end()) {
+      LOG(ERROR) << file_name << "is not in signature ds:Reference.";
+      return false;
+    }
+  }
+  return true;
+}
+
+}  // anonymous namespace
+
+namespace xwalk {
+namespace application {
+// static
+SignatureValidator::Status SignatureValidator::Check(
+    const base::FilePath& widget_path) {
+  LOG(INFO) << "Verifying widget signature file.";
+  // Process every signature files (author and distributor) according to
+  // http://www.w3.org/TR/widgets-digsig/#signature-verification.
+  SignatureFileSet signature_set = GetSignatureFiles(widget_path);
+  if (signature_set.empty()) {
+    LOG(INFO) << "No signed signature in the package.";
+    return UNTRUSTED;
+  }
+
+  SignatureFileSet::reverse_iterator iter = signature_set.rbegin();
+  bool ret = false;
+  for (; iter != signature_set.rend(); ++iter) {
+    LOG(INFO) << "Checking signature with id=" << iter->file_number();
+    // Verify whether signature xml is a valid [XMLDSIG] document.
+    if (!XMLSchemaValidate(*iter, widget_path)) {
+      LOG(ERROR) << "Validating " << iter->file_name() << "schema failed.";
+      return INVALID;
+    }
+
+    scoped_ptr<SignatureData> data = SignatureParser::CreateSignatureData(
+        widget_path.Append(iter->file_name()), iter->file_number());
+    // Check whether each file in the widget can be found from ds:Reference.
+    if (!CheckReference(*data.get()))
+      return INVALID;
+
+    // Validate the profile property.
+    if (!CheckProfileURI(*data.get()))
+      return INVALID;
+
+    // Validate the identifier property.
+    if (!CheckObjectID(*data.get()))
+      return INVALID;
+
+    // Validate role property.
+    if (!CheckRoleURI(*data.get()))
+      return INVALID;
+
+    // Perform reference validation and signature validation on signature
+    // TODO(XU): depends on root CA certificate installed on Tizen platform.
+  }
+  return VALID;
+}
+
+}  // namespace application
+}  // namespace xwalk
diff --git a/src/xwalk/application/common/installer/tizen/signature_validator.h b/src/xwalk/application/common/installer/tizen/signature_validator.h
new file mode 100644 (file)
index 0000000..ffb4584
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright (c) 2013 Intel Corporation. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef XWALK_APPLICATION_COMMON_INSTALLER_TIZEN_SIGNATURE_VALIDATOR_H_
+#define XWALK_APPLICATION_COMMON_INSTALLER_TIZEN_SIGNATURE_VALIDATOR_H_
+
+#include <set>
+#include <string>
+
+#include "base/files/file_path.h"
+#include "base/memory/scoped_ptr.h"
+#include "xwalk/application/common/installer/signature_data.h"
+#include "xwalk/application/common/signature_types.h"
+
+namespace xwalk {
+namespace application {
+
+class SignatureValidator {
+ public:
+  enum Status {
+    UNTRUSTED,
+    VALID,
+    INVALID
+  };
+
+  static Status Check(const base::FilePath& widget_path);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SignatureValidator);
+};
+
+}  // namespace application
+}  // namespace xwalk
+
+#endif  // XWALK_APPLICATION_COMMON_INSTALLER_TIZEN_SIGNATURE_VALIDATOR_H_
index a7b8ae2..084b167 100644 (file)
@@ -8,6 +8,7 @@
 #include "base/files/scoped_file.h"
 #include "third_party/libxml/chromium/libxml_utils.h"
 #include "xwalk/application/common/id_util.h"
+#include "xwalk/application/common/installer/tizen/signature_validator.h"
 
 namespace xwalk {
 namespace application {
@@ -54,20 +55,20 @@ WGTPackage::WGTPackage(const base::FilePath& path)
     }
   }
 
-  if (!value.empty())
+  if (!value.empty()) {
 #if defined(OS_TIZEN)
     id_ = value;
+    is_valid_ =
+      SignatureValidator::Check(extracted_path) != SignatureValidator::INVALID;
 #else
     id_ = GenerateId(value);
+    is_valid_ = true;
 #endif
-
-  is_valid_ = true;
-
+  }
   scoped_ptr<base::ScopedFILE> file(
         new base::ScopedFILE(base::OpenFile(path, "rb")));
 
   file_ = file.Pass();
 }
-
 }  // namespace application
 }  // namespace xwalk
index 77121b9..dcecd6e 100644 (file)
@@ -12,6 +12,7 @@
         '../../../sql/sql.gyp:sql',
         '../../../url/url.gyp:url_lib',
         '../../../third_party/libxml/libxml.gyp:libxml',
+        '../../../third_party/re2/re2.gyp:re2',
         '../../../third_party/zlib/google/zip.gyp:zip',
       ],
       'sources': [
@@ -87,6 +88,8 @@
             'installer/package_installer_tizen.h',
             'installer/tizen/packageinfo_constants.cc',
             'installer/tizen/packageinfo_constants.h',
+            'installer/tizen/signature_validator.cc',
+            'installer/tizen/signature_validator.h',
           ],
         }, {
         'sources': [
index 2d31fec..66c77cf 100644 (file)
@@ -224,7 +224,7 @@ static void launch_application(const char* appid_or_url,
   char name[128];
   snprintf(name, sizeof(name), "xwalk-%s", appid_or_url);
 
-  if (xwalk_appcore_init(g_argc, g_argv, name)) {
+  if (xwalk_appcore_init(g_argc, g_argv, name, app_proxy)) {
     fprintf(stderr, "Failed to initialize appcore");
     exit(1);
   }
index f7a83c0..27f8eff 100644 (file)
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include <glib.h>
+#include <gio/gio.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -60,15 +61,42 @@ static const char* event2str(enum app_event event) {
 
 static void application_event_cb(enum app_event event, void* data, bundle* b) {
   fprintf(stderr, "event '%s'\n", event2str(event));
+  GDBusProxy* app_proxy = reinterpret_cast<GDBusProxy*>(data);
 
-  if (event == AE_TERMINATE) {
-    exit(0);
+  if (!app_proxy) {
+    fprintf(stderr, "Invalid DBus proxy.");
+    return;
+  }
+
+  switch (event) {
+    case AE_UNKNOWN:
+    case AE_CREATE:
+      break;
+    case AE_TERMINATE:
+      exit(0);
+      break;
+    case AE_PAUSE:
+      g_dbus_proxy_call(
+          app_proxy, "Suspend", NULL,
+          G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
+      break;
+    case AE_RESUME:
+      g_dbus_proxy_call(
+          app_proxy, "Resume", NULL,
+          G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
+      break;
+    case AE_RESET:
+    case AE_LOWMEM_POST:
+    case AE_MEM_FLUSH:
+    case AE_MAX:
+      break;
   }
 }
 
-int xwalk_appcore_init(int argc, char** argv, const char* name) {
+int xwalk_appcore_init(
+    int argc, char** argv, const char* name, GDBusProxy* app_proxy) {
   appcore_ops.cb_app = application_event_cb;
-  appcore_ops.data = NULL;
+  appcore_ops.data = app_proxy;
 
   return appcore_init(name, &appcore_ops, argc, argv);
 }
index 9956aaa..75237bd 100644 (file)
@@ -5,7 +5,8 @@
 #ifndef XWALK_APPLICATION_TOOLS_LINUX_XWALK_LAUNCHER_TIZEN_H_
 #define XWALK_APPLICATION_TOOLS_LINUX_XWALK_LAUNCHER_TIZEN_H_
 
-int xwalk_appcore_init(int argc, char** argv, const char* name);
+int xwalk_appcore_init(int argc, char** argv,
+                       const char* name, GDBusProxy* app_proxy);
 
 int xwalk_change_cmdline(int argc, char** argv, const char* app_id);
 
index 19c8fb5..be469ac 100644 (file)
@@ -34,11 +34,15 @@ using xwalk::application::PackageInstaller;
 static char* install_path;
 static char* uninstall_appid;
 
+static gint debugging_port = -1;
+
 static GOptionEntry entries[] = {
   { "install", 'i', 0, G_OPTION_ARG_STRING, &install_path,
     "Path of the application to be installed/updated", "PATH" },
   { "uninstall", 'u', 0, G_OPTION_ARG_STRING, &uninstall_appid,
     "Uninstall the application with this appid", "APPID" },
+  { "debugging_port", 'd', 0, G_OPTION_ARG_INT, &debugging_port,
+    "Enable remote debugging, port number 0 means to disable", NULL },
   { NULL }
 };
 
@@ -71,6 +75,35 @@ static void TerminateIfRunning(const std::string& app_id) {
 
   app_proxy->CallMethodAndBlock(&method_call, 1000);
 }
+
+static bool enable_remote_debugging(gint debugging_port) {
+  dbus::Bus::Options options;
+#if defined(OS_TIZEN_MOBILE)
+  options.bus_type = dbus::Bus::CUSTOM_ADDRESS;
+  options.address.assign("unix:path=/run/user/app/dbus/user_bus_socket");
+#endif
+  scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
+  dbus::ObjectProxy* app_proxy =
+      bus->GetObjectProxy(
+          xwalk_service_name,
+          kRunningManagerDBusPath);
+  if (!app_proxy)
+    return false;
+
+  dbus::MethodCall method_call(
+      xwalk_running_manager_iface, "EnableRemoteDebugging");
+  dbus::MessageWriter writer(&method_call);
+  writer.AppendUint32(debugging_port);
+
+  app_proxy->CallMethodAndBlock(&method_call, 1000);
+
+  if (debugging_port > 0) {
+    g_print("Remote debugging enabled at port '%d'\n", debugging_port);
+  } else {
+    g_print("Remote debugging has been disabled\n");
+  }
+  return true;
+}
 #endif
 
 bool list_applications(ApplicationStorage* storage) {
@@ -139,6 +172,13 @@ int main(int argc, char* argv[]) {
     TerminateIfRunning(uninstall_appid);
 #endif
     success = installer->Uninstall(uninstall_appid);
+  } else if (debugging_port >= 0) {
+#if defined(SHARED_PROCESS_MODE)
+    // Deal with the case "xwalkctl -d PORT_NUMBER"
+    success = enable_remote_debugging(debugging_port);
+#else
+    g_print("Couldn't enable remote debugging for no shared process mode!");
+#endif
   } else {
     success = list_applications(storage.get());
   }
index d3cc062..64f1071 100644 (file)
 #include "xwalk/extensions/renderer/xwalk_module_system.h"
 #include "xwalk/extensions/renderer/xwalk_v8tools_module.h"
 
+#if defined(OS_TIZEN)
+#include "xwalk/application/common/constants.h"
+#endif
+
 namespace xwalk {
 namespace extensions {
 
@@ -70,6 +74,24 @@ void CreateExtensionModules(XWalkExtensionClient* client,
   }
 }
 
+#if defined(OS_TIZEN)
+void CreateExtensionModulesWithoutDeviceAPI(XWalkExtensionClient* client,
+                                            XWalkModuleSystem* module_system) {
+  const XWalkExtensionClient::ExtensionAPIMap& extensions =
+      client->extension_apis();
+  XWalkExtensionClient::ExtensionAPIMap::const_iterator it = extensions.begin();
+  for (; it != extensions.end(); ++it) {
+    XWalkExtensionClient::ExtensionCodePoints* codepoint = it->second;
+    if (codepoint->api.empty() || it->first.find("tizen") == 0)
+      continue;
+    scoped_ptr<XWalkExtensionModule> module(
+        new XWalkExtensionModule(client, module_system,
+                                 it->first, codepoint->api));
+    module_system->RegisterExtensionModule(module.Pass(),
+                                           codepoint->entry_points);
+  }
+}
+#endif
 }  // namespace
 
 void XWalkExtensionRendererController::DidCreateScriptContext(
@@ -90,8 +112,19 @@ void XWalkExtensionRendererController::DidCreateScriptContext(
                          module_system);
 
   if (external_extensions_client_) {
+#if defined(OS_TIZEN)
+    // On Tizen platform, only local pages can access to device APIs.
+    GURL url = static_cast<GURL>(frame->document().url());
+    if (!url.SchemeIs(xwalk::application::kApplicationScheme) &&
+        !url.SchemeIsFile())
+      CreateExtensionModulesWithoutDeviceAPI(external_extensions_client_.get(),
+                                             module_system);
+    else
+      CreateExtensionModules(external_extensions_client_.get(), module_system);
+#else
     CreateExtensionModules(external_extensions_client_.get(),
                            module_system);
+#endif
   }
 
   module_system->Initialize();
index 1df546f..d84106c 100644 (file)
@@ -16,7 +16,7 @@
 %endif
 
 Name:           crosswalk
-Version:        9.37.193.0
+Version:        9.37.195.0
 Release:        0
 Summary:        Crosswalk is an app runtime based on Chromium
 License:        (BSD-3-Clause and LGPL-2.1+)
@@ -241,6 +241,8 @@ install -m 06755 -p -D src/out/Release/xwalk-pkg-helper %{buildroot}%{_bindir}/x
 install -p -D src/out/Release/icudtl.dat %{buildroot}%{_libdir}/xwalk/icudtl.dat
 install -p -D src/out/Release/libffmpegsumo.so %{buildroot}%{_libdir}/xwalk/libffmpegsumo.so
 install -p -D src/out/Release/xwalk.pak %{buildroot}%{_libdir}/xwalk/xwalk.pak
+mkdir -p %{buildroot}%{_datadir}/xwalk
+install -p -D src/xwalk/application/common/installer/tizen/configuration/*.xsd %{buildroot}%{_datadir}/xwalk/
 
 # PNaCl
 %if ! %{_disable_nacl}
@@ -285,3 +287,4 @@ mkdir -p %{_manifestdir_ro}
 %{_desktop_icondir}/%{name}.png
 %{_dbusservicedir}/org.crosswalkproject.Runtime1.service
 %{_systemduserservicedir}/xwalk.service
+%{_datadir}/xwalk/*
@@ -14,7 +14,7 @@ import java.lang.annotation.Target;
  * Marks a method as being able to be exposed to JavaScript.  This is used for
  * safety purposes so that only explicitly marked methods get exposed instead
  * of every method in a class.
- * See the explanation for {@link XWalkViewInternal#addJavascriptInterface(Object, String)}
+ * See the explanation for {@link XWalkView#addJavascriptInterface(Object, String)}
  * about the usage.
  */
 @SuppressWarnings("javadoc")
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkExtension.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkExtension.java
deleted file mode 100644 (file)
index 6184ebf..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import org.xwalk.core.internal.XWalkExtensionInternal;
-
-/**
- * This class represents an extension and could be implemented by callers.
- */
-public abstract class XWalkExtension extends XWalkExtensionInternal {
-    /**
-     * Constructor with name and javascript API.
-     * @param name  the exposed namespace.
-     * @param jsApi the string of javascript API.
-     * @since 2.1
-     */
-    public XWalkExtension(String name, String jsApi) {
-        super(name, jsApi);
-    }
-
-    /**
-     * Constructor with name, javascript API and entry points.
-     * @param name the exposed namespace.
-     * @param jsApi the string of javascript API.
-     * @param entryPoints Entry points are used when the extension needs to
-     *                    have objects outside the namespace that is
-     *                    implicitly created using its name.
-     * @since 2.1
-     */
-    public XWalkExtension(String name, String jsApi, String[] entryPoints) {
-        super(name, jsApi, entryPoints);
-    }
-
-    /**
-     * Destroy an extension.
-     */
-    protected void destroyExtension() {
-        super.destroyExtension();
-    }
-
-    /**
-     * Send message to an instance.
-     * @param instanceID the id of instance.
-     * @param message the message.
-     * @since 2.1
-     */
-    public final void postMessage(int instanceID, String message) {
-        super.postMessage(instanceID, message);
-    }
-
-    /**
-     * Broadcast message to all extension instances.
-     * @param message the message.
-     * @since 2.1
-     */
-    public final void broadcastMessage(String message) {
-        super.broadcastMessage(message);
-    }
-
-    /**
-     * Notify the extension that the async message is received.
-     * @param instanceID the id of instance.
-     * @param message the received message.
-     * @since 2.1
-     */
-    public abstract void onMessage(int instanceID, String message);
-
-    /**
-     * Notify the extension that the sync message is received.
-     * @param instanceID the id of instance.
-     * @param message the received message.
-     * @since 2.1
-     */
-    public abstract String onSyncMessage(int instanceID, String message);
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkJavascriptResult.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkJavascriptResult.java
deleted file mode 100644 (file)
index 5abc784..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-/**
- * This interface is used when XWalkUIClient offers a JavaScript
- * modal dialog (alert, beforeunload or confirm) to enable the client to
- * handle the dialog in their own way. XWalkUIClient will offer an object
- * that implements this interface to the client and when the client has handled
- * the dialog, it must either callback with confirm() or cancel() to allow
- * processing to continue.
- */
-public interface XWalkJavascriptResult {
-    /**
-     * Handle a confirm with a result from caller.
-     * @param result the result string from caller.
-     * @since 1.0
-     */
-    public void confirmWithResult(String result);
-
-    /**
-     * Handle a confirm without a result.
-     * @since 1.0
-     */
-    public void confirm();
-
-    /**
-     * Handle the result if the caller cancelled the dialog.
-     * @since 1.0
-     */
-    public void cancel();
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkJavascriptResultHandler.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkJavascriptResultHandler.java
deleted file mode 100644 (file)
index 401746a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import org.xwalk.core.internal.XWalkJavascriptResultInternal;
-
-final class XWalkJavascriptResultHandler implements XWalkJavascriptResult{
-
-    private XWalkJavascriptResultInternal internal;
-
-    XWalkJavascriptResultHandler(XWalkJavascriptResultInternal internal) {
-        this.internal = internal;
-    }
-
-    XWalkJavascriptResultInternal getInternal() {
-        return this.internal;
-    }
-
-    public void confirm() {
-        internal.confirm();
-    }
-
-    public void confirmWithResult(final String promptResult) {
-        internal.confirmWithResult(promptResult);
-    }
-
-    public void cancel() {
-        internal.cancel();
-    }
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationHistory.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationHistory.java
deleted file mode 100644 (file)
index f62fcae..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import org.xwalk.core.internal.XWalkNavigationHistoryInternal;
-import org.xwalk.core.internal.XWalkNavigationHistoryInternal.DirectionInternal;
-import org.xwalk.core.internal.XWalkNavigationItemInternal;
-
-/**
- * This class represents a navigation history for a XWalkView instance.
- * It's not thread-safe and should be only called on UI thread.
- */
-public final class XWalkNavigationHistory extends XWalkNavigationHistoryInternal {
-
-    XWalkNavigationHistory(XWalkNavigationHistoryInternal internal) {
-        super(internal);
-    }
-
-    /**
-     * Total size of navigation history for the XWalkView.
-     * @return the size of total navigation items.
-     * @since 1.0
-     */
-    public int size() {
-        return super.size();
-    }
-
-    /**
-     * Test whether there is an item at a specific index.
-     * @param index the given index.
-     * @return true if there is an item at the specific index.
-     * @since 1.0
-     */
-    public boolean hasItemAt(int index) {
-        return super.hasItemAt(index);
-    }
-
-    /**
-     * Get a specific item given by index.
-     * @param index the given index.
-     * @return the navigation item for the given index.
-     * @since 1.0
-     */
-    public XWalkNavigationItem getItemAt(int index) {
-        XWalkNavigationItemInternal item = super.getItemAt(index);
-        if (item == null || item instanceof XWalkNavigationItem) {
-            return (XWalkNavigationItem) item;
-        }
-
-        return new XWalkNavigationItem(item);
-    }
-
-    /**
-     * Get the current item which XWalkView displays.
-     * @return the current navigation item.
-     * @since 1.0
-     */
-    public XWalkNavigationItem getCurrentItem() {
-        XWalkNavigationItemInternal item = super.getCurrentItem();
-        if (item == null || item instanceof XWalkNavigationItem) {
-            return (XWalkNavigationItem) item;
-        }
-
-        return new XWalkNavigationItem(item);
-    }
-
-    /**
-     * Test whether XWalkView can go back.
-     * @return true if it can go back.
-     * @since 1.0
-     */
-    public boolean canGoBack() {
-        return super.canGoBack();
-    }
-
-    /**
-     * Test whether XWalkView can go forward.
-     * @return true if it can go forward.
-     * @since 1.0
-     */
-    public boolean canGoForward() {
-        return super.canGoForward();
-    }
-
-    /**
-     * The direction for web page navigation.
-     * @since 1.0
-     */
-    public enum Direction {
-        /** The backward direction for web page navigation. */
-        BACKWARD,
-        /** The forward direction for web page navigation. */
-        FORWARD
-    }
-
-    /**
-     * Navigates to the specified step from the current navigation item.
-     * Do nothing if the offset is out of bound.
-     * @param direction the direction of navigation.
-     * @param steps go back or foward with a given steps.
-     * @since 1.0
-     */
-    public void navigate(Direction direction, int steps) {
-        super.navigate(DirectionInternal.valueOf(direction.toString()), steps);
-    }
-
-    /**
-     * Get the index for current navigation item.
-     * @return current index in the navigation history.
-     * @since 1.0
-     */
-    public int getCurrentIndex() {
-        return super.getCurrentIndex();
-    }
-
-    /**
-     * Clear all history owned by this XWalkView.
-     * @since 1.0
-     */
-    public void clear() {
-        super.clear();
-    }
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationItem.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationItem.java
deleted file mode 100644 (file)
index 4e078f0..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import org.xwalk.core.internal.XWalkNavigationItemInternal;
-
-/**
- * This class represents a navigation item and is managed in XWalkNavigationHistory.
- */
-public final class XWalkNavigationItem extends XWalkNavigationItemInternal {
-
-    XWalkNavigationItem(XWalkNavigationItemInternal internal) {
-        super(internal);
-    }
-
-    /**
-     * Get the url of current navigation item.
-     * @return the string of the url.
-     * @since 1.0
-     */
-    public String getUrl() {
-        return super.getUrl();
-    }
-
-    /**
-     * Get the original url of current navigation item.
-     * @return the string of the original url.
-     * @since 1.0
-     */
-    public String getOriginalUrl() {
-        return super.getOriginalUrl();
-    }
-
-    /**
-     * Get the title of current navigation item.
-     * @return the string of the title.
-     * @since 1.0
-     */
-    public String getTitle() {
-        return super.getTitle();
-    }
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkPreferences.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkPreferences.java
deleted file mode 100644 (file)
index 3c0a7c5..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import org.xwalk.core.internal.XWalkPreferencesInternal;
-
-/**
- * This class represents the preferences and could be set by callers.
- * It is not thread-safe and must be called on the UI thread.
- * Afterwards, the preference could be read from all threads and can impact
- * all XWalkView instances.
- */
-public final class XWalkPreferences extends XWalkPreferencesInternal {
-    /**
-     * The key string to enable/disable remote debugging.
-     * @since 1.0
-     */
-    public static final String REMOTE_DEBUGGING = "remote-debugging";
-
-    /**
-     * The key string to enable/disable animatable XWalkView. Default value is
-     * false.
-     *
-     * If this key is set to True, the XWalkView created by Crosswalk can be
-     * transformed and animated. Internally, Crosswalk is alternatively using
-     * TextureView as the backend of XWalkView.
-     *
-     * <a href="http://developer.android.com/reference/android/view/TextureView.html">
-     * TextureView</a> is a kind of
-     * <a href="http://developer.android.com/reference/android/view/View.html">
-     * android.view.View</a> that is different from
-     * <a href="http://developer.android.com/reference/android/view/SurfaceView.html">
-     * SurfaceView</a>. Unlike SurfaceView, it can be resized, transformed and
-     * animated. Once this key is set to True, all XWalkView will use TextureView
-     * as the rendering target instead of SurfaceView. The downside of TextureView
-     * is, it would consume more graphics memory than SurfaceView and may have
-     * 1~3 extra frames of latency to display updates.
-     *
-     * Note this key MUST be set before creating the first XWalkView, otherwise
-     * a RuntimeException will be thrown.
-     * @since 2.0
-     */
-    public static final String ANIMATABLE_XWALK_VIEW = "animatable-xwalk-view";
-
-    /**
-     * Set a preference value into Crosswalk. An exception will be thrown if
-     * the key for the preference is not valid.
-     * @param key the string name of the key.
-     * @param enabled true if setting it as enabled.
-     * @since 1.0
-     */
-    public static synchronized void setValue(String key, boolean enabled) throws RuntimeException {
-        XWalkPreferencesInternal.setValue(key, enabled);
-    }
-
-    /**
-     * Get a preference value from Crosswalk. An exception will be thrown if
-     * the key for the preference is not valid.
-     * @param key the string name of the key.
-     * @return true if it's enabled.
-     * @since 1.0
-     */
-    public static synchronized boolean getValue(String key) throws RuntimeException {
-        return XWalkPreferencesInternal.getValue(key);
-    }
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkResourceClient.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkResourceClient.java
deleted file mode 100644 (file)
index dc30a12..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import android.webkit.WebResourceResponse;
-
-import org.xwalk.core.internal.XWalkResourceClientInternal;
-import org.xwalk.core.internal.XWalkViewInternal;
-
-/**
- * This class notifies the embedder resource events/callbacks.
- */
-public class XWalkResourceClient extends XWalkResourceClientInternal {
-    /**
-     * Success
-     * @since 1.0
-     */
-    public static final int ERROR_OK = 0;
-    /**
-     * Generic error
-     * @since 1.0
-     */
-    public static final int ERROR_UNKNOWN = -1;
-    /**
-     * Server or proxy hostname lookup failed
-     * @since 1.0
-     */
-    public static final int ERROR_HOST_LOOKUP = -2;
-    /**
-     * Unsupported authentication scheme (not basic or digest)
-     * @since 1.0
-     */
-    public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3;
-    /**
-     * User authentication failed on server
-     * @since 1.0
-     */
-    public static final int ERROR_AUTHENTICATION = -4;
-    /**
-     * User authentication failed on proxy
-     * @since 1.0
-     */
-    public static final int ERROR_PROXY_AUTHENTICATION = -5;
-    /**
-     * Failed to connect to the server
-     * @since 1.0
-     */
-    public static final int ERROR_CONNECT = -6;
-    /**
-     * Failed to read or write to the server
-     * @since 1.0
-     */
-    public static final int ERROR_IO = -7;
-    /**
-     * Connection timed out
-     * @since 1.0
-     */
-    public static final int ERROR_TIMEOUT = -8;
-    /**
-     * Too many redirects
-     * @since 1.0
-     */
-    public static final int ERROR_REDIRECT_LOOP = -9;
-    /**
-     * Unsupported URI scheme
-     * @since 1.0
-     */
-    public static final int ERROR_UNSUPPORTED_SCHEME = -10;
-    /**
-     * Failed to perform SSL handshake
-     * @since 1.0
-     */
-    public static final int ERROR_FAILED_SSL_HANDSHAKE = -11;
-    /**
-     * Malformed URL
-     * @since 1.0
-     */
-    public static final int ERROR_BAD_URL = -12;
-    /**
-     * Generic file error
-     * @since 1.0
-     */
-    public static final int ERROR_FILE = -13;
-    /**
-     * File not found
-     * @since 1.0
-     */
-    public static final int ERROR_FILE_NOT_FOUND = -14;
-    /**
-     * Too many requests during this load
-     * @since 1.0
-     */
-    public static final int ERROR_TOO_MANY_REQUESTS = -15;
-
-    /**
-     * Constructor.
-     * @param view the owner XWalkView instance.
-     * @since 1.0
-     */
-    public XWalkResourceClient(XWalkView view) {
-        super(view);
-    }
-
-    /**
-     * Notify the client that the XWalkView will load the resource specified
-     * by the given url.
-     * @param view the owner XWalkView instance.
-     * @param url the url for the resource to be loaded.
-     * @since 1.0
-     */
-    public void onLoadStarted(XWalkView view, String url) {
-        super.onLoadStarted(view, url);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onLoadStarted(XWalkViewInternal view, String url) {
-        if (view instanceof XWalkView) {
-            onLoadStarted((XWalkView) view, url);
-        } else {
-            super.onLoadStarted(view, url);
-        }
-    }
-
-    /**
-     * Notify the client that the XWalkView completes to load the resource
-     * specified by the given url.
-     * @param view the owner XWalkView instance.
-     * @param url the url for the resource done for loading.
-     * @since 1.0
-     */
-    public void onLoadFinished(XWalkView view, String url) {
-        super.onLoadFinished(view, url);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onLoadFinished(XWalkViewInternal view, String url) {
-        if (view instanceof XWalkView) {
-            onLoadFinished((XWalkView) view, url);
-        } else {
-            super.onLoadFinished(view, url);
-        }
-    }
-
-    /**
-     * Notify the client the progress info of loading a specific url.
-     * @param view the owner XWalkView instance.
-     * @param progressInPercent the loading process in percent.
-     * @since 1.0
-     */
-    public void onProgressChanged(XWalkView view, int progressInPercent) {
-        super.onProgressChanged(view, progressInPercent);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onProgressChanged(XWalkViewInternal view, int progressInPercent) {
-        if (view instanceof XWalkView) {
-            onProgressChanged((XWalkView) view, progressInPercent);
-        } else {
-            super.onProgressChanged(view, progressInPercent);
-        }
-    }
-
-    /**
-     * Notify the client of a resource request and allow the client to return
-     * the data.  If the return value is null, the XWalkView
-     * will continue to load the resource as usual.  Otherwise, the return
-     * response and data will be used.  NOTE: This method is called by the
-     * network thread so clients should exercise caution when accessing private
-     * data.
-     * @param view The {@link org.xwalk.core.XWalkView} that is requesting the
-     *             resource.
-     * @param url The raw url of the resource.
-     * @return A {@link android.webkit.WebResourceResponse} containing the
-     *         response information or null if the XWalkView should load the
-     *         resource itself.
-     * @since 1.0
-     */
-    public WebResourceResponse shouldInterceptLoadRequest(XWalkView view, String url) {
-        return super.shouldInterceptLoadRequest(view, url);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public WebResourceResponse shouldInterceptLoadRequest(XWalkViewInternal view, String url) {
-        if (view instanceof XWalkView) {
-            return shouldInterceptLoadRequest((XWalkView) view, url);
-        }
-
-        return super.shouldInterceptLoadRequest(view, url);
-    }
-
-    /**
-     * Report an error to the client.
-     * @param view the owner XWalkView instance.
-     * @param errorCode the error id.
-     * @param description A String describing the error.
-     * @param failingUrl The url that failed to load.
-     * @since 1.0
-     */
-    public void onReceivedLoadError(XWalkView view, int errorCode, String description,
-            String failingUrl) {
-        super.onReceivedLoadError(view, errorCode, description, failingUrl);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onReceivedLoadError(XWalkViewInternal view, int errorCode, String description,
-            String failingUrl) {
-        if (view instanceof XWalkView) {
-            onReceivedLoadError((XWalkView) view, errorCode, description, failingUrl);
-        } else {
-            super.onReceivedLoadError(view, errorCode, description, failingUrl);
-        }
-    }
-
-    /**
-     * Give the host application a chance to take over the control when a new
-     * url is about to be loaded in the current XWalkView. If XWalkClient is not
-     * provided, by default XWalkView will ask Activity Manager to choose the
-     * proper handler for the url. If XWalkClient is provided, return true
-     * means the host application handles the url, while return false means the
-     * current XWalkView handles the url.
-     *
-     * @param view The XWalkView that is initiating the callback.
-     * @param url The url to be loaded.
-     * @return True if the host application wants to leave the current XWalkView
-     *         and handle the url itself, otherwise return false.
-     *
-     * @since 2.1
-     */
-    public boolean shouldOverrideUrlLoading(XWalkView view, String url) {
-        return super.shouldOverrideUrlLoading(view, url);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public boolean shouldOverrideUrlLoading(XWalkViewInternal view, String url) {
-        if (view instanceof XWalkView) {
-            return shouldOverrideUrlLoading((XWalkView) view, url);
-        }
-
-        return super.shouldOverrideUrlLoading(view, url);
-    }
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkUIClient.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkUIClient.java
deleted file mode 100644 (file)
index fd9f255..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import android.net.Uri;
-import android.os.Message;
-import android.view.KeyEvent;
-import android.webkit.ValueCallback;
-
-import org.xwalk.core.internal.XWalkJavascriptResultInternal;
-import org.xwalk.core.internal.XWalkUIClientInternal;
-import org.xwalk.core.internal.XWalkViewInternal;
-
-/**
- * This class notifies the embedder UI events/callbacks.
- */
-public class XWalkUIClient extends XWalkUIClientInternal {
-
-    /**
-     * Constructor.
-     * @param view the owner XWalkView instance.
-     * @since 1.0
-     */
-    public XWalkUIClient(XWalkView view) {
-        super(view);
-    }
-
-    /**
-     * The type of JavaScript modal dialog.
-     * @since 1.0
-     */
-    public enum JavascriptMessageType {
-        /** JavaScript alert dialog. */
-        JAVASCRIPT_ALERT,
-        /** JavaScript confirm dialog. */
-        JAVASCRIPT_CONFIRM,
-        /** JavaScript prompt dialog. */
-        JAVASCRIPT_PROMPT,
-        /** JavaScript dialog for a window-before-unload notification. */
-        JAVASCRIPT_BEFOREUNLOAD
-    }
-
-    /**
-     * Tell the client to display a prompt dialog to the user.
-     * @param view the owner XWalkView instance.
-     * @param type the type of JavaScript modal dialog.
-     * @param url the url of the web page which wants to show this dialog.
-     * @param message the message to be shown.
-     * @param defaultValue the default value string. Only valid for Prompt dialog.
-     * @param result the callback to handle the result from caller.
-     * @since 1.0
-     */
-    public boolean onJavascriptModalDialog(XWalkView view, JavascriptMessageType type,
-            String url, String message, String defaultValue, XWalkJavascriptResult result) {
-        XWalkJavascriptResultInternal resultInternal =
-                ((XWalkJavascriptResultHandler) result).getInternal();
-        JavascriptMessageTypeInternal typeInternal =
-                JavascriptMessageTypeInternal.valueOf(type.toString());
-        return super.onJavascriptModalDialog(
-                view, typeInternal, url, message, defaultValue, resultInternal);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public boolean onJavascriptModalDialog(XWalkViewInternal view,
-            JavascriptMessageTypeInternal typeInternal,
-            String url, String message, String defaultValue, XWalkJavascriptResultInternal result) {
-        JavascriptMessageType type = JavascriptMessageType.valueOf(typeInternal.toString());
-        if (view instanceof XWalkView) {
-            return onJavascriptModalDialog(
-                    (XWalkView) view,
-                    type, url, message, defaultValue,
-                    new XWalkJavascriptResultHandler(result));
-        }
-
-        return super.onJavascriptModalDialog(
-                view, typeInternal, url, message, defaultValue, result);
-    }
-
-    /**
-     * Request display and focus for this XWalkView.
-     * @param view the owner XWalkView instance.
-     * @since 1.0
-     */
-    public void onRequestFocus(XWalkView view) {
-        super.onRequestFocus(view);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onRequestFocus(XWalkViewInternal view) {
-        if (view instanceof XWalkView) {
-            onRequestFocus((XWalkView) view);
-        } else {
-            super.onRequestFocus(view);
-        }
-    }
-
-    /**
-     * Notify the client to close the given XWalkView.
-     * @param view the owner XWalkView instance.
-     * @since 1.0
-     */
-    public void onJavascriptCloseWindow(XWalkView view) {
-        super.onJavascriptCloseWindow(view);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onJavascriptCloseWindow(XWalkViewInternal view) {
-        if (view instanceof XWalkView) {
-            onJavascriptCloseWindow((XWalkView) view);
-        } else {
-            super.onJavascriptCloseWindow(view);
-        }
-    }
-
-    /**
-     * Tell the client to toggle fullscreen mode.
-     * @param view the owner XWalkView instance.
-     * @param enterFullscreen true if it has entered fullscreen mode.
-     * @since 1.0
-     */
-    public void onFullscreenToggled(XWalkView view, boolean enterFullscreen) {
-        super.onFullscreenToggled(view, enterFullscreen);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onFullscreenToggled(XWalkViewInternal view, boolean enterFullscreen) {
-        if (view instanceof XWalkView) {
-            onFullscreenToggled((XWalkView) view, enterFullscreen);
-        } else {
-            super.onFullscreenToggled(view, enterFullscreen);
-        }
-    }
-
-    /**
-     * Tell the client to open a file chooser.
-     * @param view the owner XWalkView instance.
-     * @param uploadFile the callback class to handle the result from caller. It MUST
-     *        be invoked in all cases. Leave it not invoked will block all following
-     *        requests to open file chooser.
-     * @param acceptType value of the 'accept' attribute of the input tag associated
-     *        with this file picker.
-     * @param capture value of the 'capture' attribute of the input tag associated
-     *        with this file picker
-     * @since 1.0
-     */
-    public void openFileChooser(XWalkView view, ValueCallback<Uri> uploadFile,
-            String acceptType, String capture) {
-        super.openFileChooser(view, uploadFile, acceptType, capture);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void openFileChooser(XWalkViewInternal view, ValueCallback<Uri> uploadFile,
-            String acceptType, String capture) {
-        if (view instanceof XWalkView) {
-            openFileChooser((XWalkView) view, uploadFile, acceptType, capture);
-        } else {
-            super.openFileChooser(view, uploadFile, acceptType, capture);
-        }
-    }
-
-    /**
-     * Notify the client that the scale applied to the XWalkView has changed.
-     * @param view the owner XWalkView instance.
-     * @param oldScale the old scale before scaling.
-     * @param newScale the current scale factor after scaling.
-     * @since 1.0
-     */
-    public void onScaleChanged(XWalkView view, float oldScale, float newScale) {
-        super.onScaleChanged(view, oldScale, newScale);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onScaleChanged(XWalkViewInternal view, float oldScale, float newScale) {
-        if (view instanceof XWalkView) {
-            onScaleChanged((XWalkView) view, oldScale, newScale);
-        } else {
-            super.onScaleChanged(view, oldScale, newScale);
-        }
-    }
-
-    /**
-     * Give the host application a chance to handle the key event synchronously.
-     * e.g. menu shortcut key events need to be filtered this way. If return
-     * true, XWalkView will not handle the key event. If return false, XWalkView
-     * will always handle the key event, so none of the super in the view chain
-     * will see the key event. The default behavior returns false.
-     *
-     * @param view The XWalkView that is initiating the callback.
-     * @param event The key event.
-     * @return True if the host application wants to handle the key event
-     *         itself, otherwise return false
-     *
-     * @since 2.1
-     */
-    public boolean shouldOverrideKeyEvent(XWalkView view, KeyEvent event) {
-        return super.shouldOverrideKeyEvent(view, event);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public boolean shouldOverrideKeyEvent(XWalkViewInternal view, KeyEvent event) {
-        if (view instanceof XWalkView) {
-            return shouldOverrideKeyEvent((XWalkView) view, event);
-        }
-
-        return super.shouldOverrideKeyEvent(view, event);
-    }
-
-    /**
-     * Notify the host application that a key was not handled by the XWalkView.
-     * Except system keys, XWalkView always consumes the keys in the normal flow
-     * or if shouldOverrideKeyEvent returns true. This is called asynchronously
-     * from where the key is dispatched. It gives the host application a chance
-     * to handle the unhandled key events.
-     *
-     * @param view The XWalkView that is initiating the callback.
-     * @param event The key event.
-     *
-     * @since 2.1
-     */
-    public void onUnhandledKeyEvent(XWalkView view, KeyEvent event) {
-        super.onUnhandledKeyEvent(view, event);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onUnhandledKeyEvent(XWalkViewInternal view, KeyEvent event) {
-        if (view instanceof XWalkView) {
-            onUnhandledKeyEvent((XWalkView) view, event);
-        } else {
-            super.onUnhandledKeyEvent(view, event);
-        }
-    }
-
-    /**
-     * Notify the host application of a change in the document title.
-     * @param view The XWalkView that initiated the callback.
-     * @param title A String containing the new title of the document.
-     * @since 2.1
-     */
-    public void onReceivedTitle(XWalkView view, String title) {
-        super.onReceivedTitle(view, title);
-    }
-
-    @Override
-    public void onReceivedTitle(XWalkViewInternal view, String title) {
-        if (view instanceof XWalkView) {
-            onReceivedTitle((XWalkView) view, title);
-        } else {
-            super.onReceivedTitle(view, title);
-        }
-    }
-
-    /**
-     * The status when a page stopped loading
-     * @since 2.1
-     */
-    public enum LoadStatus {
-        /** Loading finished. */
-        FINISHED,
-        /** Loading failed. */
-        FAILED,
-        /** Loading cancelled by user. */
-        CANCELLED
-    }
-
-    /**
-     * Notify the host application that a page has started loading. This method
-     * is called once for each main frame load so a page with iframes or
-     * framesets will call onPageLoadStarted one time for the main frame. This also
-     * means that onPageLoadStarted will not be called when the contents of an
-     * embedded frame changes, i.e. clicking a link whose target is an iframe.
-     *
-     * @param view The XWalkView that is initiating the callback.
-     * @param url The url to be loaded.
-     *
-     * @since 2.1
-     */
-    public void onPageLoadStarted(XWalkView view, String url) {
-        super.onPageLoadStarted(view, url);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onPageLoadStarted(XWalkViewInternal view, String url) {
-        if (view instanceof XWalkView) {
-            onPageLoadStarted((XWalkView) view, url);
-        } else {
-            super.onPageLoadStarted(view, url);
-        }
-    }
-
-    /**
-     * Notify the host application that a page has stopped loading. This method
-     * is called only for main frame. When onPageLoadStopped() is called, the
-     * rendering picture may not be updated yet. To get the notification for the
-     * new Picture, use {@link XWalkView.PictureListener#onNewPicture}.
-     *
-     * @param view The XWalkView that is initiating the callback.
-     * @param url The url of the page.
-     * @param status the status when the page stopped loading.
-     *
-     * @since 2.1
-     */
-    public void onPageLoadStopped(XWalkView view, String url, LoadStatus status) {
-        LoadStatusInternal statusInternal = LoadStatusInternal.valueOf(status.toString());
-        super.onPageLoadStopped(view, url, statusInternal);
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onPageLoadStopped(
-            XWalkViewInternal view, String url, LoadStatusInternal statusInternal) {
-        LoadStatus status = LoadStatus.valueOf(statusInternal.toString());
-        if (view instanceof XWalkView) {
-            onPageLoadStopped((XWalkView) view, url, status);
-        } else {
-            super.onPageLoadStopped(view, url, statusInternal);
-        }
-    }
-}
diff --git a/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkView.java b/src/xwalk/runtime/android/core/src/org/xwalk/core/XWalkView.java
deleted file mode 100644 (file)
index 74d1fc8..0000000
+++ /dev/null
@@ -1,466 +0,0 @@
-// Copyright (c) 2014 Intel Corporation. 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.xwalk.core;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.webkit.ValueCallback;
-
-import org.xwalk.core.internal.XWalkNavigationHistoryInternal;
-import org.xwalk.core.internal.XWalkPreferencesInternal;
-import org.xwalk.core.internal.XWalkResourceClientInternal;
-import org.xwalk.core.internal.XWalkUIClientInternal;
-import org.xwalk.core.internal.XWalkViewInternal;
-
-/**
- * <p>XWalkView represents an Android view for web apps/pages. Thus most of attributes
- * for Android view are valid for this class. Since it internally uses
- * <a href="http://developer.android.com/reference/android/view/SurfaceView.html">
- * android.view.SurfaceView</a> for rendering web pages by default, it can't be resized,
- * rotated, transformed and animated due to the limitations of SurfaceView.
- * Alternatively, if the preference key {@link XWalkPreferences#ANIMATABLE_XWALK_VIEW}
- * is set to True, XWalkView can be transformed and animated because
- * <a href="http://developer.android.com/reference/android/view/TextureView.html">
- * TextureView</a> is intentionally used to render web pages for animation support.
- * Besides, XWalkView won't be rendered if it's invisible.</p>
- *
- * <p>XWalkView needs hardware acceleration to render web pages. As a result, the
- * AndroidManifest.xml of the caller's app must be appended with the attribute
- * "android:hardwareAccelerated" and its value must be set as "true".</p>
- * <pre>
- * &lt;application android:name="android.app.Application" android:label="XWalkUsers"
- *     android:hardwareAccelerated="true"&gt;
- * </pre>
- *
- * <p>Crosswalk provides 2 major callback classes, namely {@link XWalkResourceClient} and
- * {@link XWalkUIClient} for listening to the events related to resource loading and UI.
- * By default, Crosswalk has a default implementation. Callers can override them if needed.</p>
- *
- * <p>Unlike other Android views, this class has to listen to system events like intents and activity result.
- * The web engine inside this view need to get and handle them.
- * With contianer activity's lifecycle change, XWalkView will pause all timers and other
- * components like videos when activity paused, resume back them when activity resumed.
- * When activity is about to destroy, XWalkView will destroy itself as well.
- * Embedders can also call onHide() and pauseTimers() to explicitly pause XWalkView.
- * Similarily with onShow(), resumeTimers() and onDestroy().
- *
- * For example:</p>
- *
- * <pre>
- *   import android.app.Activity;
- *   import android.os.Bundle;
- *
- *   import org.xwalk.core.XWalkResourceClient;
- *   import org.xwalk.core.XWalkUIClient;
- *   import org.xwalk.core.XWalkView;
- *
- *   public class MyActivity extends Activity {
- *       XWalkView mXwalkView;
- *
- *       class MyResourceClient extends XWalkResourceClient {
- *           MyResourceClient(XWalkView view) {
- *               super(view);
- *           }
- *
- *           &#64;Override
- *           WebResourceResponse shouldInterceptLoadRequest(XWalkView view, String url) {
- *               // Handle it here.
- *               ...
- *           }
- *       }
- *
- *       class MyUIClient extends XWalkUIClient {
- *           MyUIClient(XWalkView view) {
- *               super(view);
- *           }
- *
- *           &#64;Override
- *           void onFullscreenToggled(XWalkView view, String url) {
- *               // Handle it here.
- *               ...
- *           }
- *       }
- *
- *       &#64;Override
- *       protected void onCreate(Bundle savedInstanceState) {
- *           mXwalkView = new XWalkView(this, null);
- *           setContentView(mXwalkView);
- *           mXwalkView.setResourceClient(new MyResourceClient(mXwalkView));
- *           mXwalkView.setUIClient(new MyUIClient(mXwalkView));
- *           mXwalkView.load("http://www.crosswalk-project.org", null);
- *       }
- *
- *       &#64;Override
- *       protected void onPause() {
- *           super.onPause();
- *           if (mXwalkView != null) {
- *               mXwalkView.pauseTimers();
- *               mXwalkView.onHide();
- *           }
- *       }
- *
- *       &#64;Override
- *       protected void onResume() {
- *           super.onResume();
- *           if (mXwalkView != null) {
- *               mXwalkView.resumeTimers();
- *               mXwalkView.onShow();
- *           }
- *       }
- *
- *       &#64;Override
- *       protected void onDestroy() {
- *           super.onDestroy();
- *           if (mXwalkView != null) {
- *               mXwalkView.onDestroy();
- *           }
- *       }
- *
- *       &#64;Override
- *       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- *           if (mXwalkView != null) {
- *               mXwalkView.onActivityResult(requestCode, resultCode, data);
- *           }
- *       }
- *
- *       &#64;Override
- *       protected void onNewIntent(Intent intent) {
- *           if (mXwalkView != null) {
- *               mXwalkView.onNewIntent(intent);
- *           }
- *       }
- *   }
- * </pre>
- */
-public class XWalkView extends XWalkViewInternal {
-
-    /**
-     * Normal reload mode as default.
-     * @since 1.0
-     */
-    public static final int RELOAD_NORMAL = 0;
-    /**
-     * Reload mode with bypassing the cache.
-     * @since 1.0
-     */
-    public static final int RELOAD_IGNORE_CACHE = 1;
-
-    /**
-     * Constructor for inflating via XML.
-     * @param context  a Context object used to access application assets.
-     * @param attrs    an AttributeSet passed to our parent.
-     * @since 1.0
-     */
-    public XWalkView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    /**
-     * Constructor for Crosswalk runtime. In shared mode, context isi
-     * different from activity. In embedded mode, they're same.
-     * @param context  a Context object used to access application assets
-     * @param activity the activity for this XWalkView.
-     * @since 1.0
-     */
-    public XWalkView(Context context, Activity activity) {
-        super(context, activity);
-    }
-
-    /**
-     * Load a web page/app from a given base URL or a content.
-     * If url is null or empty and content is null or empty, then this function
-     * will do nothing.
-     * If content is not null, load the web page/app from the content.
-     * If content is not null and the url is not set, return "about:blank" ifi
-     * calling {@link XWalkView#getUrl()}.
-     * If content is null, try to load the content from the url.
-     *
-     * It supports URL schemes like 'http:', 'https:' and 'file:'.
-     * It can also load files from Android assets, e.g. 'file:///android_asset/'.
-     * @param url the url for web page/app.
-     * @param content the content for the web page/app. Could be empty.
-     * @since 1.0
-     */
-    public void load(String url, String content) {
-        super.load(url, content);
-    }
-
-    /**
-     * Load a web app from a given manifest.json file. If content is not null,
-     * load the manifest.json from the content. If content is null, try to load
-     * the manifest.json from the url. Note that url should not be null if the
-     * launched path defined in manifest.json is relative.
-     *
-     * It supports URL schemes like 'http:', 'https:' and 'file:'.
-     * It can also load files from Android assets, e.g. 'file:///android_asset/'.
-     * @param url the url for manifest.json.
-     * @param content the content for manifest.json.
-     * @since 1.0
-     */
-    public void loadAppFromManifest(String url, String content) {
-        super.loadAppFromManifest(url, content);
-    }
-
-    /**
-     * Reload a web app with a given mode.
-     * @param mode the reload mode.
-     * @since 1.0
-     */
-    public void reload(int mode) {
-        super.reload(mode);
-    }
-
-    /**
-     * Stop current loading progress.
-     * @since 1.0
-     */
-    public void stopLoading() {
-        super.stopLoading();
-    }
-
-    /**
-     * Get the url of current web page/app. This may be different from what's passed
-     * by caller.
-     * @return the url for current web page/app.
-     * @since 1.0
-     */
-    public String getUrl() {
-        return super.getUrl();
-    }
-
-    /**
-     * Get the title of current web page/app. This may be different from what's passed
-     * by caller.
-     * @return the title for current web page/app.
-     * @since 1.0
-     */
-    public String getTitle() {
-        return super.getTitle();
-    }
-
-    /**
-     * Get the original url specified by caller.
-     * @return the original url.
-     * @since 1.0
-     */
-    public String getOriginalUrl() {
-        return super.getOriginalUrl();
-    }
-
-    /**
-     * Get the navigation history for current XWalkView. It's synchronized with
-     * this XWalkView if any backward/forward and navigation operations.
-     * @return the navigation history.
-     * @since 1.0
-     */
-    public XWalkNavigationHistory getNavigationHistory() {
-        XWalkNavigationHistoryInternal history = super.getNavigationHistory();
-        if (history == null || history instanceof XWalkNavigationHistory) {
-            return (XWalkNavigationHistory) history;
-        }
-
-        return new XWalkNavigationHistory(history);
-    }
-
-    /**
-     * Injects the supplied Java object into this XWalkView.
-     * Each method defined in the class of the object should be
-     * marked with {@link JavascriptInterface} if it's called by JavaScript.
-     * @param object the supplied Java object, called by JavaScript.
-     * @param name the name injected in JavaScript.
-     * @since 1.0
-     */
-    public void addJavascriptInterface(Object object, String name) {
-        super.addJavascriptInterface(object, name);
-    }
-
-    /**
-     * Evaluate a fragment of JavaScript code and get the result via callback.
-     * @param script the JavaScript string.
-     * @param callback the callback to handle the evaluated result.
-     * @since 1.0
-     */
-    public void evaluateJavascript(String script, ValueCallback<String> callback) {
-        super.evaluateJavascript(script, callback);
-    }
-
-    /**
-     * Clear the resource cache. Note that the cache is per-application, so this
-     * will clear the cache for all XWalkViews used.
-     * @param includeDiskFiles indicate whether to clear disk files for cache.
-     * @since 1.0
-     */
-    public void clearCache(boolean includeDiskFiles) {
-        super.clearCache(includeDiskFiles);
-    }
-
-    /**
-     * Indicate that a HTML element is occupying the whole screen.
-     * @return true if any HTML element is occupying the whole screen.
-     * @since 1.0
-     */
-    public boolean hasEnteredFullscreen() {
-        return super.hasEnteredFullscreen();
-    }
-
-    /**
-     * Leave fullscreen mode if it's. Do nothing if it's not
-     * in fullscreen.
-     * @since 1.0
-     */
-    public void leaveFullscreen() {
-        super.leaveFullscreen();
-    }
-
-    /**
-     * Pause all layout, parsing and JavaScript timers for all XWalkView instances.
-     * It will be called when the container Activity get paused. It can also be explicitly
-     * called to pause timers.
-     *
-     * Note that it will globally impact all XWalkView instances, not limited to
-     * just this XWalkView.
-     *
-     * @since 1.0
-     */
-    public void pauseTimers() {
-        super.pauseTimers();
-    }
-
-    /**
-     * Resume all layout, parsing and JavaScript timers for all XWalkView instances.
-     * It will be called when the container Activity get resumed. It can also be explicitly
-     * called to resume timers.
-     *
-     * Note that it will globally impact all XWalkView instances, not limited to
-     * just this XWalkView.
-     *
-     * @since 1.0
-     */
-    public void resumeTimers() {
-        super.resumeTimers();
-    }
-
-    /**
-     * Pause many other things except JavaScript timers inside rendering engine,
-     * like video player, modal dialogs, etc. See {@link #pauseTimers} about pausing
-     * JavaScript timers.
-     * It will be called when the container Activity get paused. It can also be explicitly
-     * called to pause above things.
-     * @since 1.0
-     */
-    public void onHide() {
-        super.onHide();
-    }
-
-    /**
-     * Resume video player, modal dialogs. Embedders are in charge of calling
-     * this during resuming this activity if they call onHide.
-     * It will be called when the container Activity get resumed. It can also be explicitly
-     * called to resume above things.
-     * @since 1.0
-     */
-    public void onShow() {
-        super.onShow();
-    }
-
-    /**
-     * Release internal resources occupied by this XWalkView.
-     * It will be called when the container Activity get destroyed. It can also be explicitly
-     * called to release resources.
-     * @since 1.0
-     */
-    public void onDestroy() {
-        super.onDestroy();
-    }
-
-    /**
-     * Pass through activity result to XWalkView. Many internal facilities need this
-     * to handle activity result like JavaScript dialog, Crosswalk extensions, etc.
-     * See <a href="http://developer.android.com/reference/android/app/Activity.html">
-     * android.app.Activity.onActivityResult()</a>.
-     * @param requestCode passed from android.app.Activity.onActivityResult().
-     * @param resultCode passed from android.app.Activity.onActivityResult().
-     * @param data passed from android.app.Activity.onActivityResult().
-     * @since 1.0
-     */
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-    }
-
-    /**
-     * Pass through intents to XWalkView. Many internal facilities need this
-     * to receive the intents like web notification. See
-     * <a href="http://developer.android.com/reference/android/app/Activity.html">
-     * android.app.Activity.onNewIntent()</a>.
-     * @param intent passed from android.app.Activity.onNewIntent().
-     * @since 1.0
-     */
-    public boolean onNewIntent(Intent intent) {
-        return super.onNewIntent(intent);
-    }
-
-    /**
-     * Save current internal state of this XWalkView. This can help restore this state
-     * afterwards restoring.
-     * @param outState the saved state for restoring.
-     * @since 1.0
-     */
-    public boolean saveState(Bundle outState) {
-        return super.saveState(outState);
-    }
-
-    /**
-     * Restore the state from the saved bundle data.
-     * @param inState the state saved from saveState().
-     * @return true if it can restore the state.
-     * @since 1.0
-     */
-    public boolean restoreState(Bundle inState) {
-        return super.restoreState(inState);
-    }
-
-    /**
-     * Get the API version of Crosswalk embedding API.
-     * @return the string of API level.
-     * @since 1.0
-     */
-    // TODO(yongsheng): make it static?
-    public String getAPIVersion() {
-        return super.getAPIVersion();
-    }
-
-    /**
-     * Get the Crosswalk version.
-     * @return the string of Crosswalk.
-     * @since 1.0
-     */
-    // TODO(yongsheng): make it static?
-    public String getXWalkVersion() {
-        return super.getXWalkVersion();
-    }
-
-    /**
-     * Embedders use this to customize their handlers to events/callbacks related
-     * to UI.
-     * @param client the XWalkUIClient defined by callers.
-     * @since 1.0
-     */
-    public void setUIClient(XWalkUIClient client) {
-        super.setUIClient(client);
-    }
-
-    /**
-     * Embedders use this to customize their handlers to events/callbacks related
-     * to resource loading.
-     * @param client the XWalkResourceClient defined by callers.
-     * @since 1.0
-     */
-    public void setResourceClient(XWalkResourceClient client) {
-        super.setResourceClient(client);
-    }
-}
diff --git a/src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/ReflectionHelper.java b/src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/ReflectionHelper.java
new file mode 100644 (file)
index 0000000..414a4ab
--- /dev/null
@@ -0,0 +1,225 @@
+// Copyright (c) 2014 Intel Corporation. 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.xwalk.core.internal;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * This class is used to encapsulate the reflection invoking for bridge and wrapper.
+ *
+ * org.xwalk.core.internal.ReflectionHelper is for bridge to use. A copy will be
+ * made to org.xwalk.core.ReflectionHelper at build time for wrapper to use.
+ */
+public class ReflectionHelper {
+    /**
+     * This class contains the identical information of a constructor.
+     *
+     * Constructor of bridge and wrapper class will be initialized in the
+     * static block.
+     * It might happen before the RefletionHelper itself being initialized.
+     * For those cases, record the information of the Constructor and load
+     * them after ReflectionHelper initialized.
+     */
+    static class ConstructorHelper {
+        private String fullClassName;
+        private Object[] paramTypes;
+
+        Constructor<?> loadConstructor() {
+            Class<?> clazz = loadClass(fullClassName);
+            Class<?>[] params = new Class<?>[paramTypes.length];
+            for (int i = 0; i < paramTypes.length; i++) {
+                Object type = paramTypes[i];
+                // paramTypes can be string or Class<?>, if it's string,
+                // it means it's not in bridge/wrapper's classLoader,
+                // we need to load it from wrapper/bridge's loader.
+                if (type instanceof Class<?>) {
+                    params[i] = (Class<?>) type;
+                } else if (type instanceof String) {
+                    params[i] = loadClass((String) type);
+                }
+            }
+            try {
+                return clazz.getConstructor(params);
+            } catch (NoSuchMethodException e) {
+                ReflectionHelper.handleException(e);
+                return null;
+            }
+        }
+
+        ConstructorHelper(String className, Object... paramTypes) {
+            this.fullClassName = className;
+            this.paramTypes = paramTypes;
+        }
+    }
+
+    private static Map<Class<?>, Method> sBridgeWrapperMap = new HashMap<Class<?>, Method>();
+    private static Map<String, Constructor<?>> sConstructorMap = new HashMap<String, Constructor<?>>();
+    private static Map<String, ConstructorHelper> sConstructorHelperMap =
+            new HashMap<String, ConstructorHelper>();
+    private static ClassLoader sBridgeOrWrapperLoader = null;
+    private static boolean sIsWrapper;
+    private final static String INTERNAL_PACKAGE = "org.xwalk.core.internal";
+
+    public static void init(boolean crossPackage) {
+        assert isWrapper();
+        if (!crossPackage) {
+            initClassLoader(ReflectionHelper.class.getClassLoader());
+        } else {
+            // TODO(wang16): Support shared mode and initClassLoader cross package.
+        }
+    }
+
+    public static void initClassLoader(ClassLoader loader) {
+        sBridgeOrWrapperLoader = loader;
+        sBridgeWrapperMap.clear();
+        sConstructorMap.clear();
+        try {
+            for (String name : sConstructorHelperMap.keySet()) {
+                ConstructorHelper helper = sConstructorHelperMap.get(name);
+                if (helper != null) sConstructorMap.put(name, helper.loadConstructor());
+            }
+            if (sIsWrapper) {
+                // Load the helper in bridge side and invoke the initClassLoader method of it
+                // with wrapper's classloader via reflection.
+                Class<?> helperInBridge =
+                        sBridgeOrWrapperLoader.loadClass(INTERNAL_PACKAGE + "." + "ReflectionHelper");
+                Method initInBridge = helperInBridge.getMethod("initClassLoader", ClassLoader.class);
+                initInBridge.invoke(null, ReflectionHelper.class.getClassLoader());
+            } else {
+                // JavascriptInterface is an annotation class bridge will use but declared in
+                // wrapper.
+                Class<?> javascriptInterface =
+                        sBridgeOrWrapperLoader.loadClass("org.xwalk.core.JavascriptInterface");
+                Class<?> xwalkContentInInternal =
+                        ReflectionHelper.class.getClassLoader().loadClass(
+                                INTERNAL_PACKAGE + "." + "XWalkContent");
+                Method setJavascriptInterface = xwalkContentInInternal.getDeclaredMethod(
+                        "setJavascriptInterfaceClass", javascriptInterface.getClass());
+                setJavascriptInterface.invoke(null, javascriptInterface);
+            }
+        } catch (Exception e) {
+            handleException(e);
+        }
+    }
+
+    public static void registerConstructor(String name, String clazz, Object... params) {
+        sConstructorHelperMap.put(name, new ConstructorHelper(clazz, params));
+    }
+
+    public static Class<?> loadClass(String clazz) {
+        // Any embedder using Embedding API should only use the exposed APIs which are
+        // in wrapper, so the initialization process is always starting from wrapper.
+        if (sBridgeOrWrapperLoader == null) init(false);
+        try {
+            return sBridgeOrWrapperLoader.loadClass(clazz);
+        } catch (ClassNotFoundException e) {
+            handleException(e);
+            return null;
+        }
+    }
+
+    public static Method loadMethod(Class<?> clazz, String name, Object... paramTypes) {
+        Class<?>[] params = new Class<?>[paramTypes.length];
+        for (int i = 0; i < paramTypes.length; i++) {
+            Object type = paramTypes[i];
+            if (type instanceof Class<?>) {
+                params[i] = (Class<?>) type;
+            } else if (type instanceof String) {
+                params[i] = loadClass((String) type);
+            }
+        }
+        try {
+            return clazz.getMethod(name, params);
+        } catch (NoSuchMethodException e) {
+            handleException(e);
+            return null;
+        }
+    }
+
+    public static void handleException(Exception e) {
+        e.printStackTrace();
+        throw new RuntimeException(e);
+    }
+
+    public static void handleException(String e) {
+        handleException(new RuntimeException(e));
+    }
+
+    public static Object createInstance(String name, Object... parameters) {
+        Object ret = null;
+        Constructor<?> creator = sConstructorMap.get(name);
+        if (creator == null) {
+            ConstructorHelper helper = sConstructorHelperMap.get(name);
+            if (helper != null) {
+                creator = helper.loadConstructor();
+                sConstructorMap.put(name, creator);
+            }
+        }
+        if (creator != null) {
+            try {
+                ret = creator.newInstance(parameters);
+            } catch (IllegalArgumentException e) {
+                handleException(e);
+            } catch (InstantiationException e) {
+                handleException(e);
+            } catch (IllegalAccessException e) {
+                handleException(e);
+            } catch (InvocationTargetException e) {
+                handleException(e);
+            }
+        }
+        return ret;
+    }
+
+    public static Object invokeMethod(Method m, Object instance, Object... parameters) {
+        Object ret = null;
+        if (m != null) {
+            try {
+                ret = m.invoke(instance, parameters);
+            } catch (IllegalArgumentException e) {
+                handleException(e);
+            } catch (IllegalAccessException e) {
+                handleException(e);
+            } catch (InvocationTargetException e) {
+                handleException(e);
+            } catch (NullPointerException e) {
+                handleException(e);
+            }
+        }
+        return ret;
+    }
+
+    // Convert between wrapper and bridge instance.
+    public static Object getBridgeOrWrapper(Object instance) {
+        if (instance == null) return null;
+        Class<?> clazz = instance.getClass();
+        Method method = sBridgeWrapperMap.get(clazz);
+        if (method == null) {
+            String methodName = "getBridge";
+            if (sIsWrapper) {
+                methodName = "getWrapper";
+            }
+            try {
+                method = clazz.getMethod(methodName);
+            } catch (NoSuchMethodException e) {
+                handleException(e);
+            }
+            if (method != null) sBridgeWrapperMap.put(clazz, method);
+        }
+        return invokeMethod(method, instance);
+    }
+
+    private static boolean isWrapper() {
+        return !ReflectionHelper.class.getPackage().getName().equals(INTERNAL_PACKAGE);
+    }
+
+    static {
+        sIsWrapper = isWrapper();
+    }
+}
diff --git a/src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkAPI.java b/src/xwalk/runtime/android/core_internal/src/org/xwalk/core/internal/XWalkAPI.java
new file mode 100644 (file)
index 0000000..df3b75a
--- /dev/null
@@ -0,0 +1,13 @@
+package org.xwalk.core.internal;
+
+public @interface XWalkAPI {
+    Class<?> impl() default Object.class;
+    Class<?> instance() default Object.class;
+    boolean createInternally() default false;
+    boolean createExternally() default false;
+    boolean noInstance() default false;
+    boolean isConst() default false;
+    Class<?> extendClass() default Object.class;
+    String[] preWrapperLines() default {};
+    String[] postWrapperLines() default {};
+}
index 3710195..41ce248 100644 (file)
@@ -21,6 +21,7 @@ import android.widget.FrameLayout;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Annotation;
 
 import org.chromium.base.CalledByNative;
 import org.chromium.base.JNINamespace;
@@ -36,8 +37,7 @@ import org.chromium.content.browser.NavigationHistory;
 import org.chromium.content.common.CleanupReference;
 import org.chromium.media.MediaPlayerBridge;
 import org.chromium.ui.base.ActivityWindowAndroid;
-
-import org.xwalk.core.JavascriptInterface;
+import org.chromium.ui.gfx.DeviceDisplayInfo;
 
 @JNINamespace("xwalk")
 /**
@@ -46,6 +46,8 @@ import org.xwalk.core.JavascriptInterface;
  */
 class XWalkContent extends FrameLayout implements XWalkPreferencesInternal.KeyValueChangeListener {
     private static String TAG = "XWalkContent";
+    private static Class<? extends Annotation> javascriptInterfaceClass = null;
+
     private ContentViewCore mContentViewCore;
     private ContentView mContentView;
     private ContentViewRenderView mContentViewRenderView;
@@ -62,6 +64,11 @@ class XWalkContent extends FrameLayout implements XWalkPreferencesInternal.KeyVa
     long mXWalkContent;
     long mWebContents;
 
+    static void setJavascriptInterfaceClass(Class<? extends Annotation> clazz) {
+      assert(javascriptInterfaceClass == null);
+      javascriptInterfaceClass = clazz;
+    }
+
     private static final class DestroyRunnable implements Runnable {
         private final long mXWalkContent;
         private DestroyRunnable(long nativeXWalkContent) {
@@ -95,12 +102,13 @@ class XWalkContent extends FrameLayout implements XWalkPreferencesInternal.KeyVa
         boolean animated = XWalkPreferencesInternal.getValue(XWalkPreferencesInternal.ANIMATABLE_XWALK_VIEW);
         CompositingSurfaceType surfaceType =
                 animated ? CompositingSurfaceType.TEXTURE_VIEW : CompositingSurfaceType.SURFACE_VIEW;
-        mContentViewRenderView = new ContentViewRenderView(context, mWindow, surfaceType) {
+        mContentViewRenderView = new ContentViewRenderView(context, surfaceType) {
             protected void onReadyToRender() {
                 // Anything depending on the underlying Surface readiness should
                 // be placed here.
             }
         };
+        mContentViewRenderView.onNativeLibraryLoaded(mWindow);
         mLaunchScreenManager = new XWalkLaunchScreenManager(context, mXWalkView);
         mContentViewRenderView.registerFirstRenderedFrameListener(mLaunchScreenManager);
         addView(mContentViewRenderView,
@@ -130,6 +138,9 @@ class XWalkContent extends FrameLayout implements XWalkPreferencesInternal.KeyVa
         // For addJavascriptInterface
         mContentsClientBridge.installWebContentsObserver(mContentViewCore);
 
+        // Set DIP scale.
+        mContentsClientBridge.setDIPScale(DeviceDisplayInfo.create(context).getDIPScale());
+
         mContentViewCore.setDownloadDelegate(mContentsClientBridge);
 
         // Set the third argument isAccessFromFileURLsGrantedByDefault to false, so that
@@ -204,7 +215,7 @@ class XWalkContent extends FrameLayout implements XWalkPreferencesInternal.KeyVa
 
     public void addJavascriptInterface(Object object, String name) {
         mContentViewCore.addPossiblyUnsafeJavascriptInterface(object, name,
-                JavascriptInterface.class);
+                javascriptInterfaceClass);
     }
 
     public void evaluateJavascript(String script, ValueCallback<String> callback) {
index 3b185ad..a789f68 100644 (file)
@@ -109,10 +109,6 @@ abstract class XWalkContentsClient extends ContentViewClient {
         mDIPScale = dipScale;
     }
 
-    public double getDIPScale() {
-        return mDIPScale;
-    }
-
     final XWalkContentsClientCallbackHelper getCallbackHelper() {
         return mCallbackHelper;
     }
@@ -158,8 +154,8 @@ abstract class XWalkContentsClient extends ContentViewClient {
 
     public abstract void onGeolocationPermissionsHidePrompt();
 
-    public final void onScaleChanged(float oldScale, float newScale) {
-        onScaleChangedScaled((float)(oldScale * mDIPScale), (float)(newScale * mDIPScale));
+    public final void onScaleChanged(float oldScaleFactor, float newScaleFactor) {
+        onScaleChangedScaled((float)(oldScaleFactor * mDIPScale), (float)(newScaleFactor * mDIPScale));
     }
 
     public abstract void onScaleChangedScaled(float oldScale, float newScale);
index 06d5060..47d5656 100644 (file)
@@ -601,7 +601,7 @@ class XWalkContentsClientBridge extends XWalkContentsClient
         // FIXME(wang16): use replaceId to replace exist notification. It happens when
         //                a notification with same name and tag fires.
         mNotificationService.showNotification(
-                title, message, notificationId, delegate);
+                title, message, replaceId, notificationId, delegate);
     }
 
     @CalledByNative
@@ -667,10 +667,8 @@ class XWalkContentsClientBridge extends XWalkContentsClient
         if (mPageScaleFactor == pageScaleFactor) return;
 
         float oldPageScaleFactor = mPageScaleFactor;
-        double dipScale = getDIPScale();
         mPageScaleFactor = pageScaleFactor;
-        onScaleChanged((float)(oldPageScaleFactor * dipScale),
-                       (float)(mPageScaleFactor * dipScale));
+        onScaleChanged(oldPageScaleFactor, mPageScaleFactor);
     }
 
     //--------------------------------------------------------------------------------------------
index efbb15f..8551468 100644 (file)
@@ -9,6 +9,7 @@ import org.xwalk.core.internal.extensions.XWalkExtensionAndroid;
 /**
  * This class represents an extension and could be implemented by callers.
  */
+@XWalkAPI
 public abstract class XWalkExtensionInternal extends XWalkExtensionAndroid {
     /**
      * Constructor with name and javascript API.
@@ -16,6 +17,7 @@ public abstract class XWalkExtensionInternal extends XWalkExtensionAndroid {
      * @param jsApi the string of javascript API.
      * @since 2.1
      */
+    @XWalkAPI
     public XWalkExtensionInternal(String name, String jsApi) {
         super(name, jsApi);
     }
@@ -29,6 +31,7 @@ public abstract class XWalkExtensionInternal extends XWalkExtensionAndroid {
      *                    implicitly created using its name.
      * @since 2.1
      */
+    @XWalkAPI
     public XWalkExtensionInternal(String name, String jsApi, String[] entryPoints) {
         super(name, jsApi, entryPoints);
     }
@@ -46,6 +49,7 @@ public abstract class XWalkExtensionInternal extends XWalkExtensionAndroid {
      * @param message the message.
      * @since 2.1
      */
+    @XWalkAPI
     public void postMessage(int instanceID, String message) {
         super.postMessage(instanceID, message);
     }
@@ -55,6 +59,7 @@ public abstract class XWalkExtensionInternal extends XWalkExtensionAndroid {
      * @param message the message.
      * @since 2.1
      */
+    @XWalkAPI
     public void broadcastMessage(String message) {
         super.broadcastMessage(message);
     }
@@ -65,6 +70,7 @@ public abstract class XWalkExtensionInternal extends XWalkExtensionAndroid {
      * @param message the received message.
      * @since 2.1
      */
+    @XWalkAPI
     public abstract void onMessage(int instanceID, String message);
 
     /**
@@ -73,5 +79,6 @@ public abstract class XWalkExtensionInternal extends XWalkExtensionAndroid {
      * @param message the received message.
      * @since 2.1
      */
+    @XWalkAPI
     public abstract String onSyncMessage(int instanceID, String message);
 }
index cc6bb41..6ea91e9 100644 (file)
@@ -6,6 +6,7 @@ package org.xwalk.core.internal;
 
 import org.chromium.base.ThreadUtils;
 
+@XWalkAPI(impl = XWalkJavascriptResultInternal.class, createInternally = true)
 public class XWalkJavascriptResultHandlerInternal implements XWalkJavascriptResultInternal {
     private XWalkContentsClientBridge mBridge;
     private final int mId;
@@ -15,12 +16,21 @@ public class XWalkJavascriptResultHandlerInternal implements XWalkJavascriptResu
         mId = id;
     }
 
+    // Never use this constructor.
+    // It is only used in XWalkJavascriptResultHandlerBridge.
+    XWalkJavascriptResultHandlerInternal() {
+        mBridge = null;
+        mId = -1;
+    }
+
     @Override
+    @XWalkAPI
     public void confirm() {
         confirmWithResult(null);
     }
 
     @Override
+    @XWalkAPI
     public void confirmWithResult(final String promptResult) {
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
@@ -34,6 +44,7 @@ public class XWalkJavascriptResultHandlerInternal implements XWalkJavascriptResu
     }
 
     @Override
+    @XWalkAPI
     public void cancel() {
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
index e699c5a..ebfaea0 100644 (file)
@@ -12,23 +12,27 @@ package org.xwalk.core.internal;
  * the dialog, it must either callback with confirm() or cancel() to allow
  * processing to continue.
  */
+@XWalkAPI(instance = XWalkJavascriptResultHandlerInternal.class)
 public interface XWalkJavascriptResultInternal {
     /**
      * Handle a confirm with a result from caller.
      * @param result the result string from caller.
      * @since 1.0
      */
+    @XWalkAPI
     public void confirmWithResult(String result);
 
     /**
      * Handle a confirm without a result.
      * @since 1.0
      */
+    @XWalkAPI
     public void confirm();
 
     /**
      * Handle the result if the caller cancelled the dialog.
      * @since 1.0
      */
+    @XWalkAPI
     public void cancel();
 }
index 01e829d..5dc5447 100644 (file)
@@ -12,16 +12,24 @@ import org.chromium.content.browser.NavigationHistory;
  * This class represents a navigation history for a XWalkViewInternal instance.
  * It's not thread-safe and should be only called on UI thread.
  */
+@XWalkAPI(createInternally = true)
 public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
     private NavigationHistory mHistory;
     private XWalkViewInternal mXWalkView;
 
+    // Never use this constructor.
+    // It is only used in XWalkNavigationHistoryBridge.
+    XWalkNavigationHistoryInternal() {
+        mXWalkView = null;
+        mHistory = null;
+    }
+
     XWalkNavigationHistoryInternal(XWalkViewInternal view, NavigationHistory history) {
         mXWalkView = view;
         mHistory = history;
     }
 
-    public XWalkNavigationHistoryInternal(XWalkNavigationHistoryInternal history) {
+    XWalkNavigationHistoryInternal(XWalkNavigationHistoryInternal history) {
         mXWalkView = history.mXWalkView;
         mHistory = history.mHistory;
     }
@@ -31,6 +39,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @return the size of total navigation items.
      * @since 1.0
      */
+    @XWalkAPI
     public int size() {
         return mHistory.getEntryCount();
     }
@@ -41,6 +50,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @return true if there is an item at the specific index.
      * @since 1.0
      */
+    @XWalkAPI
     public boolean hasItemAt(int index) {
         return index >=0 && index <= size() - 1;
     }
@@ -51,6 +61,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @return the navigation item for the given index.
      * @since 1.0
      */
+    @XWalkAPI
     public XWalkNavigationItemInternal getItemAt(int index) {
         if (index < 0 || index >= size()) return null;
         return new XWalkNavigationItemInternal(mHistory.getEntryAtIndex(index));
@@ -61,6 +72,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @return the current navigation item.
      * @since 1.0
      */
+    @XWalkAPI
     public XWalkNavigationItemInternal getCurrentItem() {
         return getItemAt(getCurrentIndex());
     }
@@ -70,6 +82,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @return true if it can go back.
      * @since 1.0
      */
+    @XWalkAPI
     public boolean canGoBack() {
         return mXWalkView.canGoBack();
     }
@@ -79,6 +92,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @return true if it can go forward.
      * @since 1.0
      */
+    @XWalkAPI
     public boolean canGoForward() {
         return mXWalkView.canGoForward();
     }
@@ -87,6 +101,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * The direction for web page navigation.
      * @since 1.0
      */
+    @XWalkAPI
     public enum DirectionInternal {
         /** The backward direction for web page navigation. */
         BACKWARD,
@@ -101,6 +116,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @param steps go back or foward with a given steps.
      * @since 1.0
      */
+    @XWalkAPI
     public void navigate(DirectionInternal direction, int steps) {
         switch(direction) {
             case FORWARD:
@@ -119,6 +135,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * @return current index in the navigation history.
      * @since 1.0
      */
+    @XWalkAPI
     public int getCurrentIndex() {
         return mHistory.getCurrentEntryIndex();
     }
@@ -127,6 +144,7 @@ public class XWalkNavigationHistoryInternal implements Cloneable, Serializable {
      * Clear all history owned by this XWalkViewInternal.
      * @since 1.0
      */
+    @XWalkAPI
     public void clear() {
         mXWalkView.clearHistory();
     }
index c0e9b48..e49b1d7 100644 (file)
@@ -9,14 +9,21 @@ import org.chromium.content.browser.NavigationEntry;
 /**
  * This class represents a navigation item and is managed in XWalkNavigationHistoryInternal.
  */
+@XWalkAPI(createInternally = true)
 public class XWalkNavigationItemInternal implements Cloneable {
     private NavigationEntry mEntry;
 
+    // Never use this constructor.
+    // It is only used in XWalkNavigationItemBridge.
+    XWalkNavigationItemInternal() {
+        mEntry = null;
+    }
+
     XWalkNavigationItemInternal(NavigationEntry entry) {
         mEntry = entry;
     }
 
-    public XWalkNavigationItemInternal(XWalkNavigationItemInternal item) {
+    XWalkNavigationItemInternal(XWalkNavigationItemInternal item) {
         mEntry = item.mEntry;
     }
 
@@ -25,6 +32,7 @@ public class XWalkNavigationItemInternal implements Cloneable {
      * @return the string of the url.
      * @since 1.0
      */
+    @XWalkAPI
     public String getUrl() {
         return mEntry.getUrl();
     }
@@ -34,6 +42,7 @@ public class XWalkNavigationItemInternal implements Cloneable {
      * @return the string of the original url.
      * @since 1.0
      */
+    @XWalkAPI
     public String getOriginalUrl() {
         return mEntry.getOriginalUrl();
     }
@@ -43,6 +52,7 @@ public class XWalkNavigationItemInternal implements Cloneable {
      * @return the string of the title.
      * @since 1.0
      */
+    @XWalkAPI
     public String getTitle() {
         return mEntry.getTitle();
     }
index 466cebd..61efb00 100644 (file)
@@ -10,7 +10,7 @@ import android.graphics.Bitmap;
 interface XWalkNotificationService {
     public void setBridge(XWalkContentsClientBridge bridge);
     public void showNotification(
-            String title, String message, int notificationId, long delegate);
+            String title, String message, String replaceId, int notificationId, long delegate);
     public void updateNotificationIcon(int notificationId, Bitmap icon);
     public void cancelNotification(int notificationId, long delegate);
     public void shutdown();
index da99005..657c10b 100644 (file)
@@ -35,13 +35,24 @@ public class XWalkNotificationServiceImpl implements XWalkNotificationService {
     private static final String XWALK_INTENT_EXTRA_KEY_DELEGATE = "xwalk.DELEGATE";
     private static final String XWALK_INTENT_CATEGORY_NOTIFICATION_PREFIX = "notification_";
 
+    private class WebNotification {
+        WebNotification() {
+            mMessageNum = 1;
+        }
+
+        public Integer mNotificationId;
+        public String  mReplaceId;
+        public Notification.Builder mBuilder;
+        public Integer mMessageNum;
+    }
+
     private Context mContext;
     private XWalkContentsClientBridge mBridge;
     private XWalkViewInternal mView;
     private NotificationManager mNotificationManager;
     private BroadcastReceiver mNotificationCloseReceiver;
-    private IntentFilter mNotificationCloseIntentFilter;
-    private HashMap<Integer, Notification.Builder> mExistNotificationIds;
+    private HashMap<Integer, WebNotification> mExistNotificationIds;
+    private HashMap<String, WebNotification>  mExistReplaceIds;
 
     public XWalkNotificationServiceImpl(Context context, XWalkViewInternal view) {
         mContext = context;
@@ -50,60 +61,32 @@ public class XWalkNotificationServiceImpl implements XWalkNotificationService {
                 (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
         // Cancel all exist notifications at startup time. To avoid receiving legacy pendingIntents.
         mNotificationManager.cancelAll();
-        mExistNotificationIds = new HashMap<Integer, Notification.Builder>();
-    }
-
-    @Override
-    public void setBridge(XWalkContentsClientBridge bridge) {
-        mBridge = bridge;
-    }
-
-    private static String getCategoryFromNotificationId(int id) {
-        return XWALK_INTENT_CATEGORY_NOTIFICATION_PREFIX + id;
-    }
 
-    private void notificationChanged() {
-        unregisterReceiver();
-        if (mExistNotificationIds.isEmpty()) {
-            Log.i(TAG, "notifications are all cleared," +
-                    "unregister broadcast receiver for close pending intent");
-        } else {
-            registerReceiver();
-        }
-    }
-
-    private void registerReceiver() {
         mNotificationCloseReceiver = new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
                 mView.onNewIntent(intent);
             }
         };
-        mNotificationCloseIntentFilter = new IntentFilter(
-                mView.getActivity().getPackageName() + XWALK_ACTION_CLOSE_NOTIFICATION_SUFFIX);
-        for(Integer id : mExistNotificationIds.keySet()) {
-            mNotificationCloseIntentFilter.addCategory(getCategoryFromNotificationId(id));
-        }
-        try {
-            mView.getActivity().registerReceiver(mNotificationCloseReceiver, mNotificationCloseIntentFilter);
-        } catch (AndroidRuntimeException e) {
-            //FIXME(wang16): The exception will happen when there are multiple xwalkviews in one activity.
-            //               Remove it after notification service supports multi-views.
-            mNotificationCloseReceiver = null;
-            Log.w(TAG, e.getLocalizedMessage());
-        }
+
+        mExistNotificationIds = new HashMap<Integer, WebNotification>();
+        mExistReplaceIds      = new HashMap<String, WebNotification>();
     }
 
-    private void unregisterReceiver() {
-        if (mNotificationCloseReceiver != null) {
-            mView.getActivity().unregisterReceiver(mNotificationCloseReceiver);
-            mNotificationCloseReceiver = null;
-        }
+    private static String getCategoryFromNotificationId(int id) {
+        return XWALK_INTENT_CATEGORY_NOTIFICATION_PREFIX + id;
+    }
+
+    @Override
+    public void setBridge(XWalkContentsClientBridge bridge) {
+        mBridge = bridge;
     }
 
     @Override
     public void shutdown() {
-        unregisterReceiver();
+        if (!mExistNotificationIds.isEmpty()) {
+            unregisterReceiver();
+        }
         mBridge = null;
     }
 
@@ -128,75 +111,94 @@ public class XWalkNotificationServiceImpl implements XWalkNotificationService {
     @Override
     @SuppressWarnings("deprecation")
     public void updateNotificationIcon(int notificationId, Bitmap icon) {
-        Notification.Builder builder = mExistNotificationIds.get(notificationId);
-        if (builder != null) {
-            int originalWidth = icon.getWidth();
-            int originalHeight = icon.getHeight();
-            if (originalWidth == 0 || originalHeight == 0)
-                return;
-            int targetWidth = mContext.getResources().getDimensionPixelSize(
-                    android.R.dimen.notification_large_icon_width);
-            int targetHeight = mContext.getResources().getDimensionPixelSize(
-                    android.R.dimen.notification_large_icon_height);
-            if (originalWidth > targetWidth && originalHeight > targetHeight) {
-                if (originalWidth * targetHeight > originalHeight * targetWidth) {
-                    targetHeight = originalHeight * targetWidth / originalWidth;
-                } else {
-                    targetWidth = originalWidth * targetHeight / originalHeight;
-                }
-            }
-            builder.setLargeIcon(
-                    Bitmap.createScaledBitmap(icon, targetWidth, targetHeight, true));
-            Notification notification;
-            if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {
-                notification = builder.build();
+        WebNotification webNotification = mExistNotificationIds.get(notificationId);
+        if (webNotification == null) {
+            return;
+        }
+
+        int originalWidth  = icon.getWidth();
+        int originalHeight = icon.getHeight();
+        if (originalWidth == 0 || originalHeight == 0) {
+            return;
+        }
+
+        int targetWidth = mContext.getResources().getDimensionPixelSize(
+                android.R.dimen.notification_large_icon_width);
+        int targetHeight = mContext.getResources().getDimensionPixelSize(
+                android.R.dimen.notification_large_icon_height);
+
+        if (originalWidth > targetWidth && originalHeight > targetHeight) {
+            if (originalWidth * targetHeight > originalHeight * targetWidth) {
+                targetHeight = originalHeight * targetWidth / originalWidth;
             } else {
-                notification = builder.getNotification();
+                targetWidth = originalWidth * targetHeight / originalHeight;
             }
-            doShowNotification(notificationId, notification);
-            mExistNotificationIds.put(notificationId, builder);
         }
+
+        Notification.Builder builder = webNotification.mBuilder;
+        builder.setLargeIcon(Bitmap.createScaledBitmap(icon, targetWidth, targetHeight, true));
+
+        doShowNotification(notificationId, 
+                VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN ? builder.build() : builder.getNotification());
     }
 
     @Override
     @SuppressWarnings("deprecation")
-    public void showNotification(String title, String message,
+    public void showNotification(String title, String message, String replaceId,
             int notificationId, long delegate) {
-        Context activity = mView.getActivity();
-        String category = getCategoryFromNotificationId(notificationId);
-        Intent clickIntent = new Intent(activity, activity.getClass());
-        clickIntent.setAction(activity.getPackageName() + XWALK_ACTION_CLICK_NOTIFICATION_SUFFIX);
-        clickIntent.putExtra(XWALK_INTENT_EXTRA_KEY_NOTIFICATION_ID, notificationId);
-        clickIntent.putExtra(XWALK_INTENT_EXTRA_KEY_DELEGATE, delegate);
-        clickIntent.setFlags(
-                Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        clickIntent.addCategory(category);
-        PendingIntent pendingClickIntent = PendingIntent.getActivity(activity,
-                0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
-        Intent closeIntent =
-                new Intent(activity.getPackageName() + XWALK_ACTION_CLOSE_NOTIFICATION_SUFFIX);
-        closeIntent.putExtra(XWALK_INTENT_EXTRA_KEY_NOTIFICATION_ID, notificationId);
-        closeIntent.putExtra(XWALK_INTENT_EXTRA_KEY_DELEGATE, delegate);
-        closeIntent.addCategory(category);
-        PendingIntent pendingCloseIntent = PendingIntent.getBroadcast(activity,
-                0, closeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
-        Notification.Builder builder = new Notification.Builder(mContext.getApplicationContext())
-                .setContentIntent(pendingClickIntent)
-                .setDeleteIntent(pendingCloseIntent);
-        int iconRes = mContext.getApplicationInfo().icon;
-        if (iconRes == 0) iconRes = android.R.drawable.sym_def_app_icon;
-        builder = builder.setContentText(message)
-                         .setContentTitle(title)
-                         .setSmallIcon(iconRes)
-                         .setAutoCancel(true);
-        Notification notification;
-        if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {
-            notification = builder.build();
+        Notification.Builder builder;
+
+        if (!replaceId.isEmpty() && mExistReplaceIds.containsKey(replaceId)) {
+            WebNotification webNotification = mExistReplaceIds.get(replaceId);
+            notificationId = webNotification.mNotificationId;
+            builder = webNotification.mBuilder;
+            builder.setNumber(++webNotification.mMessageNum);
         } else {
-            notification = builder.getNotification();
+            builder = new Notification.Builder(mContext.getApplicationContext())
+                    .setAutoCancel(true);
+
+            WebNotification webNotification = new WebNotification();
+            webNotification.mNotificationId = notificationId;
+            webNotification.mReplaceId = replaceId;
+            webNotification.mBuilder = builder;
+
+            mExistNotificationIds.put(notificationId, webNotification);
+            if (!replaceId.isEmpty()) {
+                mExistReplaceIds.put(replaceId, webNotification);
+            }
+        }
+
+        builder.setContentTitle(title);
+        builder.setContentText(message);
+
+        int iconRes = mContext.getApplicationInfo().icon;
+        if (iconRes == 0) {
+            iconRes = android.R.drawable.sym_def_app_icon;
         }
-        doShowNotification(notificationId, notification);
-        mExistNotificationIds.put(notificationId, builder);
+        builder.setSmallIcon(iconRes);
+
+        Context activity = mView.getActivity();
+        String category = getCategoryFromNotificationId(notificationId);
+
+        Intent clickIntent = new Intent(activity, activity.getClass())
+                .setAction(activity.getPackageName() + XWALK_ACTION_CLICK_NOTIFICATION_SUFFIX)
+                .putExtra(XWALK_INTENT_EXTRA_KEY_NOTIFICATION_ID, notificationId)
+                .putExtra(XWALK_INTENT_EXTRA_KEY_DELEGATE, delegate)
+                .setFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | Intent.FLAG_ACTIVITY_SINGLE_TOP)
+                .addCategory(category);
+
+        Intent closeIntent = new Intent(activity.getPackageName() + XWALK_ACTION_CLOSE_NOTIFICATION_SUFFIX)
+                .putExtra(XWALK_INTENT_EXTRA_KEY_NOTIFICATION_ID, notificationId)
+                .putExtra(XWALK_INTENT_EXTRA_KEY_DELEGATE, delegate)
+                .addCategory(category);
+
+        builder.setContentIntent(PendingIntent.getActivity(
+                activity, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+        builder.setDeleteIntent(PendingIntent.getBroadcast(
+                activity, 0, closeIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+
+        doShowNotification(notificationId, 
+                VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN ? builder.build() : builder.getNotification());
         notificationChanged();
         onNotificationShown(notificationId, delegate);
     }
@@ -207,34 +209,80 @@ public class XWalkNotificationServiceImpl implements XWalkNotificationService {
         onNotificationClose(notificationId, false, delegate);
     }
 
-    public void doShowNotification(int id, Notification notification) {
-        mNotificationManager.notify(id, notification);
+    public void doShowNotification(int notificationId, Notification notification) {
+        mNotificationManager.notify(notificationId, notification);
     }
 
     public void onNotificationShown(int notificationId, long delegate) {
-        if (mExistNotificationIds.containsKey(notificationId) && mBridge != null) {
+        WebNotification webNotification = mExistNotificationIds.get(notificationId);
+        if (webNotification == null) {
+            return;
+        }
+
+        if (mBridge != null) {
             mBridge.notificationDisplayed(delegate);
         }
     }
 
     public void onNotificationClick(int notificationId, long delegate) {
-        if (mExistNotificationIds.containsKey(notificationId)) {
-            mExistNotificationIds.remove(notificationId);
-            notificationChanged();
-            if (mBridge != null) {
-                mBridge.notificationClicked(notificationId, delegate);
-            }
+        WebNotification webNotification = mExistNotificationIds.get(notificationId);
+        if (webNotification == null) {
+            return;
+        }
+
+        mExistNotificationIds.remove(notificationId);
+        mExistReplaceIds.remove(webNotification.mReplaceId);
+
+        notificationChanged();
+        if (mBridge != null) {
+            mBridge.notificationClicked(notificationId, delegate);
         }
     }
 
     public void onNotificationClose(
             int notificationId, boolean byUser, long delegate) {
-        if (mExistNotificationIds.containsKey(notificationId)) {
-            mExistNotificationIds.remove(notificationId);
-            notificationChanged();
-            if (mBridge != null) {
-                mBridge.notificationClosed(notificationId, byUser, delegate);
-            }
+        WebNotification webNotification = mExistNotificationIds.get(notificationId);
+        if (webNotification == null) {
+            return;
         }
+
+        mExistNotificationIds.remove(notificationId);
+        mExistReplaceIds.remove(webNotification.mReplaceId);
+
+        notificationChanged();
+        if (mBridge != null) {
+            mBridge.notificationClosed(notificationId, byUser, delegate);
+        }
+    }
+
+    private void notificationChanged() {
+        if (mExistNotificationIds.isEmpty()) {
+            Log.i(TAG, "notifications are all cleared," +
+                    "unregister broadcast receiver for close pending intent");
+            unregisterReceiver();
+        } else {
+            registerReceiver();
+        }
+    }
+
+    private void registerReceiver() {
+        IntentFilter filter = new IntentFilter(
+                mView.getActivity().getPackageName() + XWALK_ACTION_CLOSE_NOTIFICATION_SUFFIX);
+
+        for(Integer id : mExistNotificationIds.keySet()) {
+            filter.addCategory(getCategoryFromNotificationId(id));
+        }
+        
+        try {
+            mView.getActivity().registerReceiver(mNotificationCloseReceiver, filter);
+        } catch (AndroidRuntimeException e) {
+            //FIXME(wang16): The exception will happen when there are multiple xwalkviews in one activity.
+            //               Remove it after notification service supports multi-views.
+            Log.w(TAG, e.getLocalizedMessage());
+        }
+    }
+
+    private void unregisterReceiver() {
+        mView.getActivity().unregisterReceiver(mNotificationCloseReceiver);
     }
 }
index 929855a..a1c2ddd 100644 (file)
@@ -16,6 +16,7 @@ import java.util.Map;
  * Afterwards, the preference could be read from all threads and can impact
  * all XWalkViewInternal instances.
  */
+@XWalkAPI(noInstance = true)
 public class XWalkPreferencesInternal {
     private static HashMap<String, Boolean> sPrefMap = new HashMap<String, Boolean>();
     // Here we use WeakReference to make sure the KeyValueChangeListener instance
@@ -29,6 +30,7 @@ public class XWalkPreferencesInternal {
      * The key string to enable/disable remote debugging.
      * @since 1.0
      */
+    @XWalkAPI
     public static final String REMOTE_DEBUGGING = "remote-debugging";
 
     /**
@@ -55,6 +57,7 @@ public class XWalkPreferencesInternal {
      *
      * @since 2.0
      */
+    @XWalkAPI
     public static final String ANIMATABLE_XWALK_VIEW = "animatable-xwalk-view";
 
     /**
@@ -99,6 +102,7 @@ public class XWalkPreferencesInternal {
      * @param enabled true if setting it as enabled.
      * @since 1.0
      */
+    @XWalkAPI
     public static synchronized void setValue(String key, boolean enabled) throws RuntimeException {
         checkKey(key);
         // If the listener list is not empty, we consider the preference is
@@ -120,6 +124,7 @@ public class XWalkPreferencesInternal {
      * @return true if it's enabled.
      * @since 1.0
      */
+    @XWalkAPI
     public static synchronized boolean getValue(String key) throws RuntimeException {
         checkKey(key);
         return sPrefMap.get(key);
index 5d0a86a..e680232 100644 (file)
@@ -13,86 +13,103 @@ import android.webkit.WebResourceResponse;
 /**
  * This class notifies the embedder resource events/callbacks.
  */
+@XWalkAPI(createExternally = true)
 public class XWalkResourceClientInternal {
     /**
      * Success
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_OK = 0;
     /**
      * Generic error
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_UNKNOWN = -1;
     /**
      * Server or proxy hostname lookup failed
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_HOST_LOOKUP = -2;
     /**
      * Unsupported authentication scheme (not basic or digest)
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3;
     /**
      * User authentication failed on server
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_AUTHENTICATION = -4;
     /**
      * User authentication failed on proxy
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_PROXY_AUTHENTICATION = -5;
     /**
      * Failed to connect to the server
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_CONNECT = -6;
     /**
      * Failed to read or write to the server
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_IO = -7;
     /**
      * Connection timed out
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_TIMEOUT = -8;
     /**
      * Too many redirects
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_REDIRECT_LOOP = -9;
     /**
      * Unsupported URI scheme
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_UNSUPPORTED_SCHEME = -10;
     /**
      * Failed to perform SSL handshake
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_FAILED_SSL_HANDSHAKE = -11;
     /**
      * Malformed URL
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_BAD_URL = -12;
     /**
      * Generic file error
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_FILE = -13;
     /**
      * File not found
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_FILE_NOT_FOUND = -14;
     /**
      * Too many requests during this load
      * @since 1.0
      */
+    @XWalkAPI
     public static final int ERROR_TOO_MANY_REQUESTS = -15;
 
     /**
@@ -100,6 +117,7 @@ public class XWalkResourceClientInternal {
      * @param view the owner XWalkViewInternal instance.
      * @since 1.0
      */
+    @XWalkAPI
     public XWalkResourceClientInternal(XWalkViewInternal view) {
         // Keep the above parameter for future use.
     }
@@ -111,6 +129,7 @@ public class XWalkResourceClientInternal {
      * @param url the url for the resource to be loaded.
      * @since 1.0
      */
+    @XWalkAPI
     public void onLoadStarted(XWalkViewInternal view, String url) {
     }
 
@@ -121,6 +140,7 @@ public class XWalkResourceClientInternal {
      * @param url the url for the resource done for loading.
      * @since 1.0
      */
+    @XWalkAPI
     public void onLoadFinished(XWalkViewInternal view, String url) {
     }
 
@@ -130,6 +150,7 @@ public class XWalkResourceClientInternal {
      * @param progressInPercent the loading process in percent.
      * @since 1.0
      */
+    @XWalkAPI
     public void onProgressChanged(XWalkViewInternal view, int progressInPercent) {
     }
 
@@ -140,7 +161,7 @@ public class XWalkResourceClientInternal {
      * response and data will be used.  NOTE: This method is called by the
      * network thread so clients should exercise caution when accessing private
      * data.
-     * @param view The {@link org.xwalk.core.internal.XWalkViewInternal} that is requesting the
+     * @param view The owner XWalkViewInternal instance that is requesting the
      *             resource.
      * @param url The raw url of the resource.
      * @return A {@link android.webkit.WebResourceResponse} containing the
@@ -148,6 +169,7 @@ public class XWalkResourceClientInternal {
      *         resource itself.
      * @since 1.0
      */
+    @XWalkAPI
     public WebResourceResponse shouldInterceptLoadRequest(XWalkViewInternal view, String url) {
         return null;
     }
@@ -160,6 +182,7 @@ public class XWalkResourceClientInternal {
      * @param failingUrl The url that failed to load.
      * @since 1.0
      */
+    @XWalkAPI
     public void onReceivedLoadError(XWalkViewInternal view, int errorCode, String description,
             String failingUrl) {
         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(view.getContext());
@@ -191,6 +214,7 @@ public class XWalkResourceClientInternal {
      *
      * @since 2.1
      */
+    @XWalkAPI
     public boolean shouldOverrideUrlLoading(XWalkViewInternal view, String url) {
         return false;
     }
index be57e6f..f4ce916 100644 (file)
@@ -20,6 +20,7 @@ import android.widget.EditText;
 /**
  * This class notifies the embedder UI events/callbacks.
  */
+@XWalkAPI(createExternally = true)
 public class XWalkUIClientInternal {
 
     // Strings for displaying Dialog.
@@ -43,6 +44,7 @@ public class XWalkUIClientInternal {
      * @param view the owner XWalkViewInternal instance.
      * @since 1.0
      */
+    @XWalkAPI
     public XWalkUIClientInternal(XWalkViewInternal view) {
         mContext = view.getContext();
         mDecorView = view.getActivity().getWindow().getDecorView();
@@ -69,6 +71,7 @@ public class XWalkUIClientInternal {
      * @param view the owner XWalkViewInternal instance.
      * @since 1.0
      */
+    @XWalkAPI
     public void onRequestFocus(XWalkViewInternal view) {
     }
 
@@ -77,6 +80,7 @@ public class XWalkUIClientInternal {
      * @param view the owner XWalkViewInternal instance.
      * @since 1.0
      */
+    @XWalkAPI
     public void onJavascriptCloseWindow(XWalkViewInternal view) {
         if (view != null && view.getActivity() != null) {
             view.getActivity().finish();
@@ -87,6 +91,7 @@ public class XWalkUIClientInternal {
      * The type of JavaScript modal dialog.
      * @since 1.0
      */
+    @XWalkAPI
     public enum JavascriptMessageTypeInternal {
         /** JavaScript alert dialog. */
         JAVASCRIPT_ALERT,
@@ -108,6 +113,7 @@ public class XWalkUIClientInternal {
      * @param result the callback to handle the result from caller.
      * @since 1.0
      */
+    @XWalkAPI
     public boolean onJavascriptModalDialog(XWalkViewInternal view, JavascriptMessageTypeInternal type,
             String url, String message, String defaultValue, XWalkJavascriptResultInternal result) {
         switch(type) {
@@ -133,6 +139,7 @@ public class XWalkUIClientInternal {
      * @param enterFullscreen true if it has entered fullscreen mode.
      * @since 1.0
      */
+    @XWalkAPI
     public void onFullscreenToggled(XWalkViewInternal view, boolean enterFullscreen) {
         Activity activity = view.getActivity();
         if (enterFullscreen) {
@@ -190,6 +197,7 @@ public class XWalkUIClientInternal {
      *        with this file picker
      * @since 1.0
      */
+    @XWalkAPI
     public void openFileChooser(XWalkViewInternal view, ValueCallback<Uri> uploadFile,
             String acceptType, String capture) {
         uploadFile.onReceiveValue(null);
@@ -202,6 +210,7 @@ public class XWalkUIClientInternal {
      * @param newScale the current scale factor after scaling.
      * @since 1.0
      */
+    @XWalkAPI
     public void onScaleChanged(XWalkViewInternal view, float oldScale, float newScale) {
     }
 
@@ -219,6 +228,7 @@ public class XWalkUIClientInternal {
      *
      * @since 2.1
      */
+    @XWalkAPI
     public boolean shouldOverrideKeyEvent(XWalkViewInternal view, KeyEvent event) {
         return false;
     }
@@ -235,6 +245,7 @@ public class XWalkUIClientInternal {
      *
      * @since 2.1
      */
+    @XWalkAPI
     public void onUnhandledKeyEvent(XWalkViewInternal view, KeyEvent event) {
     }
 
@@ -244,6 +255,7 @@ public class XWalkUIClientInternal {
      * @param title A String containing the new title of the document.
      * @since 2.1
      */
+    @XWalkAPI
     public void onReceivedTitle(XWalkViewInternal view, String title) {
     }
 
@@ -252,6 +264,7 @@ public class XWalkUIClientInternal {
      * The status when a page stopped loading
      * @since 2.1
      */
+    @XWalkAPI
     public enum LoadStatusInternal {
         /** Loading finished. */
         FINISHED,
@@ -273,14 +286,14 @@ public class XWalkUIClientInternal {
      *
      * @since 2.1
      */
+    @XWalkAPI
     public void onPageLoadStarted(XWalkViewInternal view, String url) {
     }
 
     /**
      * Notify the host application that a page has stopped loading. This method
      * is called only for main frame. When onPageLoadStopped() is called, the
-     * rendering picture may not be updated yet. To get the notification for the
-     * new Picture, use {@link XWalkViewInternal.PictureListener#onNewPicture}.
+     * rendering picture may not be updated yet.
      *
      * @param view The XWalkViewInternal that is initiating the callback.
      * @param url The url of the page.
@@ -288,6 +301,7 @@ public class XWalkUIClientInternal {
      *
      * @since 2.1
      */
+    @XWalkAPI
     public void onPageLoadStopped(XWalkViewInternal view, String url, LoadStatusInternal status) {
     }
 
index ddc6e7c..2a44fb5 100644 (file)
@@ -128,6 +128,7 @@ import org.xwalk.core.internal.extension.XWalkPathHelper;
  *   }
  * </pre>
  */
+@XWalkAPI(extendClass = FrameLayout.class, createExternally = true)
 public class XWalkViewInternal extends android.widget.FrameLayout {
 
     private class XWalkActivityStateListener implements ActivityStateListener {
@@ -158,11 +159,13 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * Normal reload mode as default.
      * @since 1.0
      */
+    @XWalkAPI
     public static final int RELOAD_NORMAL = 0;
     /**
      * Reload mode with bypassing the cache.
      * @since 1.0
      */
+    @XWalkAPI
     public static final int RELOAD_IGNORE_CACHE = 1;
 
     /**
@@ -171,6 +174,12 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param attrs    an AttributeSet passed to our parent.
      * @since 1.0
      */
+    @XWalkAPI(preWrapperLines = {
+                  "        super(${param1}, ${param2});"},
+              postWrapperLines = {
+                  "        addView((FrameLayout)bridge, new FrameLayout.LayoutParams(",
+                  "                FrameLayout.LayoutParams.MATCH_PARENT,",
+                  "                FrameLayout.LayoutParams.MATCH_PARENT));"})
     public XWalkViewInternal(Context context, AttributeSet attrs) {
         super(context, attrs);
 
@@ -186,6 +195,12 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param activity the activity for this XWalkViewInternal.
      * @since 1.0
      */
+    @XWalkAPI(preWrapperLines = {
+                  "        super(${param1}, null);"},
+              postWrapperLines = {
+                  "        addView((FrameLayout)bridge, new FrameLayout.LayoutParams(",
+                  "                FrameLayout.LayoutParams.MATCH_PARENT,",
+                  "                FrameLayout.LayoutParams.MATCH_PARENT));"})
     public XWalkViewInternal(Context context, Activity activity) {
         super(context, null);
         checkThreadSafety();
@@ -367,6 +382,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param content the content for the web page/app. Could be empty.
      * @since 1.0
      */
+    @XWalkAPI
     public void load(String url, String content) {
         if (mContent == null) return;
         checkThreadSafety();
@@ -385,6 +401,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param content the content for manifest.json.
      * @since 1.0
      */
+    @XWalkAPI
     public void loadAppFromManifest(String url, String content) {
         if (mContent == null) return;
         checkThreadSafety();
@@ -396,6 +413,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param mode the reload mode.
      * @since 1.0
      */
+    @XWalkAPI
     public void reload(int mode) {
         if (mContent == null) return;
         checkThreadSafety();
@@ -406,6 +424,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * Stop current loading progress.
      * @since 1.0
      */
+    @XWalkAPI
     public void stopLoading() {
         if (mContent == null) return;
         checkThreadSafety();
@@ -418,6 +437,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @return the url for current web page/app.
      * @since 1.0
      */
+    @XWalkAPI
     public String getUrl() {
         if (mContent == null) return null;
         checkThreadSafety();
@@ -430,6 +450,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @return the title for current web page/app.
      * @since 1.0
      */
+    @XWalkAPI
     public String getTitle() {
         if (mContent == null) return null;
         checkThreadSafety();
@@ -441,6 +462,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @return the original url.
      * @since 1.0
      */
+    @XWalkAPI
     public String getOriginalUrl() {
         if (mContent == null) return null;
         checkThreadSafety();
@@ -453,6 +475,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @return the navigation history.
      * @since 1.0
      */
+    @XWalkAPI
     public XWalkNavigationHistoryInternal getNavigationHistory() {
         if (mContent == null) return null;
         checkThreadSafety();
@@ -467,6 +490,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param name the name injected in JavaScript.
      * @since 1.0
      */
+    @XWalkAPI
     public void addJavascriptInterface(Object object, String name) {
         if (mContent == null) return;
         checkThreadSafety();
@@ -479,6 +503,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param callback the callback to handle the evaluated result.
      * @since 1.0
      */
+    @XWalkAPI
     public void evaluateJavascript(String script, ValueCallback<String> callback) {
         if (mContent == null) return;
         checkThreadSafety();
@@ -491,6 +516,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param includeDiskFiles indicate whether to clear disk files for cache.
      * @since 1.0
      */
+    @XWalkAPI
     public void clearCache(boolean includeDiskFiles) {
         if (mContent == null) return;
         checkThreadSafety();
@@ -502,6 +528,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @return true if any HTML element is occupying the whole screen.
      * @since 1.0
      */
+    @XWalkAPI
     public boolean hasEnteredFullscreen() {
         if (mContent == null) return false;
         checkThreadSafety();
@@ -513,6 +540,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * in fullscreen.
      * @since 1.0
      */
+    @XWalkAPI
     public void leaveFullscreen() {
         if (mContent == null) return;
         checkThreadSafety();
@@ -529,6 +557,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      *
      * @since 1.0
      */
+    @XWalkAPI
     public void pauseTimers() {
         if (mContent == null) return;
         checkThreadSafety();
@@ -545,6 +574,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      *
      * @since 1.0
      */
+    @XWalkAPI
     public void resumeTimers() {
         if (mContent == null) return;
         checkThreadSafety();
@@ -559,6 +589,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * called to pause above things.
      * @since 1.0
      */
+    @XWalkAPI
     public void onHide() {
         if (mContent == null || mIsHidden) return;
         if (null != mExtensionManager) mExtensionManager.onPause();
@@ -574,6 +605,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * called to resume above things.
      * @since 1.0
      */
+    @XWalkAPI
     public void onShow() {
         if (mContent == null || !mIsHidden ) return;
         if (null != mExtensionManager) mExtensionManager.onResume();
@@ -587,6 +619,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * called to release resources.
      * @since 1.0
      */
+    @XWalkAPI
     public void onDestroy() {
         destroy();
     }
@@ -601,6 +634,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param data passed from android.app.Activity.onActivityResult().
      * @since 1.0
      */
+    @XWalkAPI
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (mContent == null) return;
         if (null != mExtensionManager)
@@ -616,6 +650,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param intent passed from android.app.Activity.onNewIntent().
      * @since 1.0
      */
+    @XWalkAPI
     public boolean onNewIntent(Intent intent) {
         if (mContent == null) return false;
         return mContent.onNewIntent(intent);
@@ -627,6 +662,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param outState the saved state for restoring.
      * @since 1.0
      */
+    @XWalkAPI
     public boolean saveState(Bundle outState) {
         if (mContent == null) return false;
         mContent.saveState(outState);
@@ -639,6 +675,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @return true if it can restore the state.
      * @since 1.0
      */
+    @XWalkAPI
     public boolean restoreState(Bundle inState) {
         if (mContent == null) return false;
         if (mContent.restoreState(inState) != null) return true;
@@ -651,6 +688,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @since 1.0
      */
     // TODO(yongsheng): make it static?
+    @XWalkAPI
     public String getAPIVersion() {
         return "2.1";
     }
@@ -661,6 +699,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @since 1.0
      */
     // TODO(yongsheng): make it static?
+    @XWalkAPI
     public String getXWalkVersion() {
         if (mContent == null) return null;
         return mContent.getXWalkVersion();
@@ -672,6 +711,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param client the XWalkUIClientInternal defined by callers.
      * @since 1.0
      */
+    @XWalkAPI
     public void setUIClient(XWalkUIClientInternal client) {
         if (mContent == null) return;
         checkThreadSafety();
@@ -684,6 +724,7 @@ public class XWalkViewInternal extends android.widget.FrameLayout {
      * @param client the XWalkResourceClientInternal defined by callers.
      * @since 1.0
      */
+    @XWalkAPI
     public void setResourceClient(XWalkResourceClientInternal client) {
         if (mContent == null) return;
         checkThreadSafety();
index 3c36b71..a02c239 100644 (file)
@@ -89,7 +89,7 @@ class DeviceCapabilitiesDisplay {
 
         JSONObject out = new JSONObject();
         try {
-            out.put("id", disp.getDisplayId());
+            out.put("id", Integer.toString(disp.getDisplayId()));
             out.put("name", disp.getName());
             out.put("primary", disp.getDisplayId() == disp.DEFAULT_DISPLAY);
             out.put("external", disp.getDisplayId() != disp.DEFAULT_DISPLAY);
index d830bec..7ab1a81 100644 (file)
@@ -105,7 +105,7 @@ class DeviceCapabilitiesStorage {
             JSONObject out = new JSONObject();
 
             try {
-                out.put("id", mId + 1); // Display from 1
+                out.put("id", Integer.toString(mId + 1)); // Display from 1
                 out.put("name", mName);
                 out.put("type", mType);
                 out.put("capacity", mCapacity);
index dd94e49..b5d5f66 100644 (file)
@@ -98,7 +98,16 @@ extension.setMessageListener(function(json) {
       msg.reply == 'disconnectDisplay') {
     for (var id in g_listeners) {
       if (g_listeners[id]['eventName'] === msg.eventName) {
-        g_listeners[id]['callback'](_createConstClone(msg.data));
+        var event = null;
+        if (msg.eventName == 'displayconnect' ||
+            msg.eventName == 'displaydisconnect') {
+          event = new SystemDisplayEvent(msg.data);
+        }
+        if (msg.eventName == 'storageattach' ||
+            msg.eventName == 'storagedetach') {
+          event = new SystemStorageEvent(msg.data);
+        }
+        g_listeners[id]['callback'](event);
       }
     }
     return;
@@ -205,8 +214,18 @@ Object.defineProperty(exports, 'ondisplaydisconnect', {
 
 exports.addEventListener = function(eventName, callback) {
   return _addEventListener(false, eventName, callback);
-}
+};
 
 var _sendSyncMessage = function(msg) {
   return extension.internal.sendSyncMessage(JSON.stringify(msg));
 };
+
+window.SystemDisplayEvent = function(data) {
+  _addConstProperty(this, 'display', _createConstClone(data));
+  this.prototype = new Event('SystemDisplayEvent');
+};
+
+window.SystemStorageEvent = function(data) {
+  _addConstProperty(this, 'storage', _createConstClone(data));
+  this.prototype = new Event('SystemStorageEvent');
+};
index 5dc3cf2..5a5646a 100644 (file)
@@ -74,11 +74,10 @@ int XWalkMainDelegate::RunProcess(const std::string& process_type,
 }
 
 #if defined(OS_POSIX) && !defined(OS_ANDROID)
-content::ZygoteForkDelegate* XWalkMainDelegate::ZygoteStarting() {
-#if defined(DISABLE_NACL)
-  return NULL;
-#else
-  return new nacl::NaClForkDelegate(true);
+void XWalkMainDelegate::ZygoteStarting(
+    ScopedVector<content::ZygoteForkDelegate>* delegates) {
+#if !defined(DISABLE_NACL)
+  nacl::AddNaClZygoteForkDelegates(delegates);
 #endif
 }
 
index cec8a1b..fea8351 100644 (file)
@@ -27,7 +27,8 @@ class XWalkMainDelegate : public content::ContentMainDelegate {
   virtual int RunProcess(const std::string& process_type,
       const content::MainFunctionParams& main_function_params) OVERRIDE;
 #if defined(OS_POSIX) && !defined(OS_ANDROID)
-  virtual content::ZygoteForkDelegate* ZygoteStarting();
+  virtual void ZygoteStarting(
+      ScopedVector<content::ZygoteForkDelegate>* delegates) OVERRIDE;
 #endif
   virtual content::ContentBrowserClient* CreateContentBrowserClient() OVERRIDE;
   virtual content::ContentRendererClient*
index 24bf2b6..3f3416c 100644 (file)
@@ -63,8 +63,7 @@ void RuntimeResourceDispatcherHostDelegate::DownloadStarting(
 bool RuntimeResourceDispatcherHostDelegate::HandleExternalProtocol(
     const GURL& url,
     int child_id,
-    int route_id,
-    bool initiated_by_user_gesture) {
+    int route_id) {
   return true;
 }
 
index f5cb6d6..f4cc236 100644 (file)
@@ -37,8 +37,7 @@ class RuntimeResourceDispatcherHostDelegate
   virtual bool HandleExternalProtocol(
       const GURL& url,
       int child_id,
-      int route_id,
-      bool initiated_by_user_gesture) OVERRIDE;
+      int route_id) OVERRIDE;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(RuntimeResourceDispatcherHostDelegate);
index f000167..c060dff 100644 (file)
@@ -29,7 +29,6 @@
 #include "xwalk/application/browser/application_system.h"
 #include "xwalk/extensions/browser/xwalk_extension_service.h"
 #include "xwalk/extensions/common/xwalk_extension_switches.h"
-#include "xwalk/runtime/browser/devtools/remote_debugging_server.h"
 #include "xwalk/runtime/browser/nacl_host/nacl_browser_delegate_impl.h"
 #include "xwalk/runtime/browser/runtime.h"
 #include "xwalk/runtime/browser/runtime_context.h"
@@ -204,12 +203,8 @@ void XWalkBrowserMainParts::PreMainMessageLoopRun() {
     std::string port_str =
         command_line->GetSwitchValueASCII(switches::kRemoteDebuggingPort);
     int port;
-    const char* local_ip = "0.0.0.0";
-    if (base::StringToInt(port_str, &port) && port > 0 && port < 65535) {
-      remote_debugging_server_.reset(
-          new RemoteDebuggingServer(xwalk_runner_->runtime_context(),
-              local_ip, port, std::string()));
-    }
+    base::StringToInt(port_str, &port);
+    xwalk_runner_->EnableRemoteDebugging(port);
   }
 
   NativeAppWindow::Initialize();
index 515e784..c530b14 100644 (file)
@@ -22,7 +22,6 @@ class RenderProcessHost;
 
 namespace xwalk {
 
-class RemoteDebuggingServer;
 class XWalkRunner;
 
 namespace extensions {
@@ -71,9 +70,6 @@ class XWalkBrowserMainParts : public content::BrowserMainParts {
   // True if we need to run the default message loop defined in content.
   bool run_default_message_loop_;
 
-  // Remote debugger server.
-  scoped_ptr<RemoteDebuggingServer> remote_debugging_server_;
-
  private:
   DISALLOW_COPY_AND_ASSIGN(XWalkBrowserMainParts);
 };
index 524e512..e873a8c 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "xwalk/runtime/browser/xwalk_runner.h"
 
+#include <string>
 #include <vector>
 #include "base/command_line.h"
 #include "base/logging.h"
@@ -14,6 +15,7 @@
 #include "xwalk/extensions/browser/xwalk_extension_service.h"
 #include "xwalk/extensions/common/xwalk_extension_switches.h"
 #include "xwalk/runtime/browser/application_component.h"
+#include "xwalk/runtime/browser/devtools/remote_debugging_server.h"
 #include "xwalk/runtime/browser/runtime_context.h"
 #include "xwalk/runtime/browser/storage_component.h"
 #include "xwalk/runtime/browser/sysapps_component.h"
@@ -83,6 +85,7 @@ void XWalkRunner::PostMainMessageLoopRun() {
   DestroyComponents();
   extension_service_.reset();
   runtime_context_.reset();
+  DisableRemoteDebugging();
 }
 
 void XWalkRunner::CreateComponents() {
@@ -169,6 +172,19 @@ void XWalkRunner::OnRenderProcessHostGone(content::RenderProcessHost* host) {
   extension_service_->OnRenderProcessDied(host);
 }
 
+void XWalkRunner::EnableRemoteDebugging(int port) {
+  const char* local_ip = "0.0.0.0";
+  if (port > 0 && port < 65535) {
+    remote_debugging_server_.reset(
+        new RemoteDebuggingServer(runtime_context(),
+            local_ip, port, std::string()));
+  }
+}
+
+void XWalkRunner::DisableRemoteDebugging() {
+  remote_debugging_server_.reset();
+}
+
 // static
 scoped_ptr<XWalkRunner> XWalkRunner::Create() {
   XWalkRunner* runner = NULL;
index 09d8b6b..5ff56c5 100644 (file)
@@ -24,6 +24,7 @@ namespace xwalk {
 
 class RuntimeContext;
 class ApplicationComponent;
+class RemoteDebuggingServer;
 class SysAppsComponent;
 class XWalkComponent;
 class XWalkContentBrowserClient;
@@ -77,6 +78,9 @@ class XWalkRunner {
   virtual void PreMainMessageLoopRun();
   virtual void PostMainMessageLoopRun();
 
+  void EnableRemoteDebugging(int port);
+  void DisableRemoteDebugging();
+
  protected:
   XWalkRunner();
 
@@ -132,6 +136,9 @@ class XWalkRunner {
 
   ApplicationComponent* app_component_;
 
+  // Remote debugger server.
+  scoped_ptr<RemoteDebuggingServer> remote_debugging_server_;
+
   // These variables are used to export some values from the browser process
   // side to the extension side, such as application IDs and whatnot.
   void InitializeRuntimeVariablesForExtensions(
index 4be6894..ca440b1 100644 (file)
@@ -39,6 +39,9 @@ IPC_MESSAGE_CONTROL2(ViewMsg_EnableSecurityMode,    // NOLINT
                      xwalk::application::SecurityPolicy::SecurityMode
                      /* security mode */)
 
+IPC_MESSAGE_CONTROL1(ViewMsg_SuspendJSEngine,  // NOLINT
+                     bool /* is suspend */)
+
 IPC_MESSAGE_ROUTED1(ViewMsg_HWKeyPressed, int /*keycode*/)  // NOLINT
 
 // These are messages sent from the renderer to the browser process.
index 754230d..c51ac4a 100644 (file)
@@ -45,7 +45,7 @@ std::string GetProduct() {
 
 std::string GetUserAgent() {
   std::string product = GetProduct();
-#if (defined(OS_TIZEN) || defined(OS_ANDROID))
+#if (defined(OS_TIZEN_MOBILE) || defined(OS_ANDROID))
   product += " Mobile Crosswalk/" XWALK_VERSION;
 #else
   product += " Crosswalk/" XWALK_VERSION;
index d2b4d79..9d20aa0 100644 (file)
 #include "xwalk/runtime/renderer/tizen/xwalk_render_view_ext_tizen.h"
 #endif
 
+#if !defined(DISABLE_NACL)
+#include "components/nacl/renderer/nacl_helper.h"
+#endif
+
 namespace xwalk {
 
 namespace {
@@ -139,6 +143,10 @@ void XWalkContentRendererClient::RenderFrameCreated(
 #if defined(ENABLE_PLUGINS)
   new PepperHelper(render_frame);
 #endif
+
+#if !defined(DISABLE_NACL)
+  new nacl::NaClHelper(render_frame);
+#endif
 }
 
 void XWalkContentRendererClient::RenderViewCreated(
@@ -155,10 +163,6 @@ void XWalkContentRendererClient::DidCreateScriptContext(
     int extension_group, int world_id) {
   if (extension_controller_)
     extension_controller_->DidCreateScriptContext(frame, context);
-#if !defined(OS_ANDROID)
-  xwalk_render_process_observer_->DidCreateScriptContext(
-      frame, context, extension_group, world_id);
-#endif
 }
 
 void XWalkContentRendererClient::DidCreateModuleSystem(
index de6b5a6..3579956 100644 (file)
@@ -6,7 +6,8 @@
 
 #include <vector>
 
-#include "content/public/renderer/render_thread.h"
+#include "content/renderer/render_thread_impl.h"
+#include "content/renderer/renderer_webkitplatformsupport_impl.h"
 #include "ipc/ipc_message_macros.h"
 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
 #include "third_party/WebKit/public/platform/WebString.h"
@@ -44,6 +45,7 @@ void AddAccessWhiteListEntry(
 
 XWalkRenderProcessObserver::XWalkRenderProcessObserver()
     : is_webkit_initialized_(false),
+      is_suspended_(false),
       security_mode_(application::SecurityPolicy::NoSecurity) {
 }
 
@@ -56,6 +58,7 @@ bool XWalkRenderProcessObserver::OnControlMessageReceived(
   IPC_BEGIN_MESSAGE_MAP(XWalkRenderProcessObserver, message)
     IPC_MESSAGE_HANDLER(ViewMsg_SetAccessWhiteList, OnSetAccessWhiteList)
     IPC_MESSAGE_HANDLER(ViewMsg_EnableSecurityMode, OnEnableSecurityMode)
+    IPC_MESSAGE_HANDLER(ViewMsg_SuspendJSEngine, OnSuspendJSEngine)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -63,15 +66,6 @@ bool XWalkRenderProcessObserver::OnControlMessageReceived(
 
 void XWalkRenderProcessObserver::WebKitInitialized() {
   is_webkit_initialized_ = true;
-}
-
-void XWalkRenderProcessObserver::OnRenderProcessShutdown() {
-  is_webkit_initialized_ = false;
-}
-
-void XWalkRenderProcessObserver::DidCreateScriptContext(
-    blink::WebFrame* frame, v8::Handle<v8::Context> context,
-    int extension_group, int world_id) {
   for (std::vector<AccessWhitelistItem>::iterator it = access_whitelist.begin();
        it != access_whitelist.end(); ++it)
     AddAccessWhiteListEntry(it->source_, it->dest_, it->allow_subdomains_);
@@ -79,6 +73,10 @@ void XWalkRenderProcessObserver::DidCreateScriptContext(
   access_whitelist.clear();
 }
 
+void XWalkRenderProcessObserver::OnRenderProcessShutdown() {
+  is_webkit_initialized_ = false;
+}
+
 void XWalkRenderProcessObserver::OnSetAccessWhiteList(const GURL& source,
                                                       const GURL& dest,
                                                       bool allow_subdomains) {
@@ -95,4 +93,16 @@ void XWalkRenderProcessObserver::OnEnableSecurityMode(
   security_mode_ = mode;
 }
 
+void XWalkRenderProcessObserver::OnSuspendJSEngine(bool is_suspend) {
+  if (is_suspend == is_suspended_)
+    return;
+  content::RenderThreadImpl* thread = content::RenderThreadImpl::current();
+  thread->EnsureWebKitInitialized();
+  if (is_suspend)
+    thread->webkit_platform_support()->SuspendSharedTimer();
+  else
+    thread->webkit_platform_support()->ResumeSharedTimer();
+  is_suspended_ = is_suspend;
+}
+
 }  // namespace xwalk
index eb0efc2..661c3dd 100644 (file)
@@ -28,10 +28,6 @@ class XWalkRenderProcessObserver : public content::RenderProcessObserver {
   XWalkRenderProcessObserver();
   virtual ~XWalkRenderProcessObserver();
 
-  void DidCreateScriptContext(
-      blink::WebFrame* frame,  v8::Handle<v8::Context> context,
-      int extension_group, int world_id);
-
   // content::RenderProcessObserver implementation.
   virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
   virtual void WebKitInitialized() OVERRIDE;
@@ -51,8 +47,10 @@ class XWalkRenderProcessObserver : public content::RenderProcessObserver {
       const GURL& source, const GURL& dest, bool allow_subdomains);
   void OnEnableSecurityMode(
       const GURL& url, application::SecurityPolicy::SecurityMode mode);
+  void OnSuspendJSEngine(bool is_pause);
 
   bool is_webkit_initialized_;
+  bool is_suspended_;
   application::SecurityPolicy::SecurityMode security_mode_;
   GURL app_url_;
 };
diff --git a/src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/OnReceivedTitleTest.java b/src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/OnReceivedTitleTest.java
new file mode 100644 (file)
index 0000000..f6c111c
--- /dev/null
@@ -0,0 +1,72 @@
+// Copyright (c) 2014 Intel Corporation. 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.xwalk.core.xwview.test;
+
+import android.test.suitebuilder.annotation.MediumTest;
+import android.util.Pair;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.chromium.base.test.util.Feature;
+import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
+import org.chromium.net.test.util.TestWebServer;
+
+import org.xwalk.core.xwview.test.util.CommonResources;
+
+/**
+ * Tests for the XWalkUIClient.OnReceivedTitleTest() method.
+ */
+public class OnReceivedTitleTest extends XWalkViewTestBase {
+    private OnTitleUpdatedHelper mOnTitleUpdatedHelper;
+    private TestWebServer mWebServer;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        mOnTitleUpdatedHelper = mTestHelperBridge.getOnTitleUpdatedHelper();
+        mWebServer = new TestWebServer(false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mWebServer.shutdown();
+        super.tearDown();
+    }
+
+    private String addPageToTestServer(TestWebServer webServer, String httpPath, String html) {
+        List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>();
+        headers.add(Pair.create("Content-Type", "text/html"));
+        headers.add(Pair.create("Cache-Control", "no-store"));
+        return webServer.setResponse(httpPath, html, headers);
+    }
+
+    @MediumTest
+    @Feature({"onReceivedTitle"})
+    public void testOnReceivedTitleWithUrl() throws Throwable {
+        String path = "/test.html";
+        String pageContent = CommonResources.makeHtmlPageFrom("<title>Test</title>",
+                "<div> The title is: Test </div>");
+        String url = addPageToTestServer(mWebServer, path, pageContent);
+        int onReceivedTitleCallCount = mOnTitleUpdatedHelper.getCallCount();
+
+        loadUrlAsync(url);
+        mOnTitleUpdatedHelper.waitForCallback(onReceivedTitleCallCount);
+        assertNotNull(mOnTitleUpdatedHelper.getTitle());
+    }
+
+    @MediumTest
+    @Feature({"onReceivedTitle"})
+    public void testOnReceivedTitleWithData() throws Throwable {
+        final String name = "index.html";
+        final String fileContent = getFileContent(name);
+        int onReceivedTitleCallCount = mOnTitleUpdatedHelper.getCallCount();
+
+        loadDataSync(name, fileContent, "text/html", false);
+        mOnTitleUpdatedHelper.waitForCallback(onReceivedTitleCallCount);
+        assertNotNull(mOnTitleUpdatedHelper.getTitle());
+    }
+}
diff --git a/src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/OnScaleChangedTest.java b/src/xwalk/test/android/core/javatests/src/org/xwalk/core/xwview/test/OnScaleChangedTest.java
new file mode 100644 (file)
index 0000000..3f2230b
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright (c) 2014 Intel Corporation. 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.xwalk.core.xwview.test;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.chromium.base.test.util.Feature;
+
+/**
+ * Test suite for OnScaleChanged().
+ */
+public class OnScaleChangedTest extends XWalkViewTestBase {
+    private TestHelperBridge.OnScaleChangedHelper mOnScaleChangedHelper;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mOnScaleChangedHelper = mTestHelperBridge.getOnScaleChangedHelper();
+    }
+
+    @SmallTest
+    @Feature({"OnScaleChanged"})
+    public void testOnScaleChanged() throws Throwable {
+        final String name = "scale_changed.html";
+        String fileContent = getFileContent(name);
+        int count = mOnScaleChangedHelper.getCallCount();
+
+        loadDataAsync(null, fileContent, "text/html", false);
+        mOnScaleChangedHelper.waitForCallback(count);
+        assertTrue(Float.compare(mOnScaleChangedHelper.getScale(), 0.0f) > 0);
+    }
+}
index 0409d73..1c7a13a 100644 (file)
@@ -192,6 +192,20 @@ class TestHelperBridge {
         }
     }
 
+    public class OnScaleChangedHelper extends CallbackHelper {
+        private float mScale;
+
+        public float getScale() {
+            assert getCallCount() > 0;
+            return mScale;
+        }
+
+        public void notifyCalled(float scale) {
+            mScale = scale;
+            notifyCalled();
+        }
+    }
+
     private String mChangedTitle;
     private final OnPageStartedHelper mOnPageStartedHelper;
     private final OnPageFinishedHelper mOnPageFinishedHelper;
@@ -205,6 +219,7 @@ class TestHelperBridge {
     private final OnJavascriptCloseWindowHelper mOnJavascriptCloseWindowHelper;
     private final OnProgressChangedHelper mOnProgressChangedHelper;
     private final ShouldOverrideUrlLoadingHelper mShouldOverrideUrlLoadingHelper;
+    private final OnScaleChangedHelper mOnScaleChangedHelper;
 
     public TestHelperBridge() {
         mOnPageStartedHelper = new OnPageStartedHelper();
@@ -217,6 +232,7 @@ class TestHelperBridge {
         mOnJavascriptCloseWindowHelper = new OnJavascriptCloseWindowHelper();
         mOnProgressChangedHelper = new OnProgressChangedHelper();
         mShouldOverrideUrlLoadingHelper = new ShouldOverrideUrlLoadingHelper();
+        mOnScaleChangedHelper = new OnScaleChangedHelper();
     }
 
     public OnPageStartedHelper getOnPageStartedHelper() {
@@ -259,6 +275,10 @@ class TestHelperBridge {
         return mShouldOverrideUrlLoadingHelper;
     }
 
+    public OnScaleChangedHelper getOnScaleChangedHelper() {
+        return mOnScaleChangedHelper;
+    }
+
     public void onTitleChanged(String title) {
         mChangedTitle = title;
         mOnTitleUpdatedHelper.notifyCalled(title);
@@ -304,4 +324,8 @@ class TestHelperBridge {
         mShouldOverrideUrlLoadingHelper.notifyCalled(url);
         return returnValue;
     }
+
+    public void onScaleChanged(float scale) {
+        mOnScaleChangedHelper.notifyCalled(scale);
+    }
 }
index c7f996d..cfafe9a 100644 (file)
@@ -66,6 +66,11 @@ public class XWalkViewTestBase
         public void onJavascriptCloseWindow(XWalkView view) {
             mInnerContentsClient.onJavascriptCloseWindow();
         }
+
+        @Override
+        public void onScaleChanged(XWalkView view, float oldScale, float newScale) {
+            mInnerContentsClient.onScaleChanged(newScale);
+        }
     }
 
     class TestXWalkUIClient extends TestXWalkUIClientBase {
index 7a46cb8..600c569 100644 (file)
               onSuccess();
             }, Error);
 
-        system.onstorageattach = function(storage) {
+        system.onstorageattach = function(e) {
             var output = document.getElementById('event');
             output.value += 'Error! Should not appear.\n';
             output.scrollTop = output.scrollHeight;
           };
 
-        system.onstorageattach = function(storage) {
+        system.onstorageattach = function(e) {
             var output = document.getElementById('event');
-            var msg = enumerateAllProps(storage);
+            var msg = enumerateAllProps(e.storage);
             output.value += 'From storage attach listener(onstorageattch):\n' + msg + '--------\n';
             output.scrollTop = output.scrollHeight;
           };
 
-        system.addEventListener('storageattach', function(storage) {
+        system.addEventListener('storageattach', function(e) {
             var output = document.getElementById('event');
             output.value += 'attach Listener1 test success!\n';
             output.scrollTop = output.scrollHeight;
           });
 
-        system.addEventListener('storageattach', function(storage) {
+        system.addEventListener('storageattach', function(e) {
             var output = document.getElementById('event');
             output.value += 'attach Listener2 test success!\n';
             output.scrollTop = output.scrollHeight;
           });
 
-        system.addEventListener('storagedetach', function(storage) {
+        system.addEventListener('storagedetach', function(e) {
             var output = document.getElementById('event');
-            var msg = enumerateAllProps(storage);
+            var msg = enumerateAllProps(e.storage);
             output.value += 'From storage detach listener(addEventListener):\n' + msg + '--------\n';
             output.scrollTop = output.scrollHeight;
           });
 
-        system.onstoragedetach = function(storage) {
+        system.onstoragedetach = function(e) {
             var output = document.getElementById('event');
-            var msg = enumerateAllProps(storage);
+            var msg = enumerateAllProps(e.storage);
             output.value += 'From storage detach listener(onstoragedetach):\n' + msg + '--------\n';
             output.scrollTop = output.scrollHeight;
           };
 
-        system.addEventListener('displayconnect', function(display) {
+        system.addEventListener('displayconnect', function(e) {
             var output = document.getElementById('event');
-            var msg = enumerateAllProps(display);
+            var msg = enumerateAllProps(e.display);
             output.value += 'From display connect listener(addEventListener):\n' + msg + '--------\n';
             output.scrollTop = output.scrollHeight;
           });
 
-        system.ondisplayconnect = function(display) {
+        system.ondisplayconnect = function(e) {
             var output = document.getElementById('event');
-            var msg = enumerateAllProps(display);
+            var msg = enumerateAllProps(e.display);
             output.value += 'From display connect listener(ondisplayconnect):\n' + msg + '--------\n';
             output.scrollTop = output.scrollHeight;
           };
 
-        system.addEventListener('displaydisconnect', function(display) {
+        system.addEventListener('displaydisconnect', function(e) {
             var output = document.getElementById('event');
-            var msg = enumerateAllProps(display);
+            var msg = enumerateAllProps(e.display);
             output.value += 'From display disconnect listener(addEventListener):\n' + msg + '--------\n';
             output.scrollTop = output.scrollHeight;
           });
 
-        system.ondisplaydisconnect = function(display) {
+        system.ondisplaydisconnect = function(e) {
             var output = document.getElementById('event');
-            var msg = enumerateAllProps(display);
+            var msg = enumerateAllProps(e.display);
             output.value += 'From display disconnect listener(ondisplaydisconnect):\n' + msg + '--------\n';
             output.scrollTop = output.scrollHeight;
           };
diff --git a/src/xwalk/test/android/data/scale_changed.html b/src/xwalk/test/android/data/scale_changed.html
new file mode 100644 (file)
index 0000000..ba78bdd
--- /dev/null
@@ -0,0 +1,7 @@
+<html>
+<head>
+<meta name='viewport' content='initial-scale=1.5' />
+</head>
+<body>
+</body>
+</html>
diff --git a/src/xwalk/tools/reflection_generator/bridge_generator.py b/src/xwalk/tools/reflection_generator/bridge_generator.py
new file mode 100644 (file)
index 0000000..f324b8b
--- /dev/null
@@ -0,0 +1,166 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from string import Template
+
+from code_generator import CodeGenerator
+from java_method import Method
+
+class BridgeGenerator(CodeGenerator):
+  """ Generator class that generates bridge layer code."""
+  def __init__(self, java_data, class_loader):
+    super(BridgeGenerator, self).__init__(java_data, class_loader)
+
+  def RunTask(self):
+    self._generated_class_name = self._java_data.bridge_name
+    self._generated_code = self.GenerateBridgeClass()
+
+  def GenerateBridgeClass(self):
+    bridge_class_template = Template("""\
+${PACKAGE_SECTION}
+
+${IMPORT_SECTION}
+public class ${CLASS_NAME} extends ${PARENT_CLASS} {
+    private final static String WRAPPER_CLASS = "org.xwalk.core.Object";
+    private Object wrapper;
+
+    public Object getWrapper() {
+        return wrapper;
+    }
+${CREATE_INTERNALLY_CONSTRUCTOR}
+${ENUMS_SECTION}
+${METHODS_SECTION}
+
+${REFLECTION_INIT_SECTION}
+${STATIC_INITIALIZER}
+}
+""")
+    package_name = ''
+    if self._java_data.package_name != '':
+      package_name = 'package ' + self._java_data.package_name + ";"
+    imports_string = self.GenerateImportRules()
+    internal_class_name = self._java_data.class_name
+    bridge_class_name = self._generated_class_name
+    create_internally_constructor = self.GenerateCreateInternallyConstructor()
+    bridge_enums = self.GenerateBridgeEnums()
+    bridge_methods = self.GenerateBridgeMethods()
+    reflection_init = self.GenerateReflectionInitString()
+    static_initializer = self.GenerateStaticInitializerString()
+    value = {'PACKAGE_SECTION': package_name,
+             'IMPORT_SECTION': imports_string,
+             'CLASS_NAME': bridge_class_name,
+             'PARENT_CLASS': internal_class_name,
+             'ENUMS_SECTION': bridge_enums,
+             'METHODS_SECTION': bridge_methods,
+             'REFLECTION_INIT_SECTION': reflection_init,
+             'CREATE_INTERNALLY_CONSTRUCTOR': create_internally_constructor,
+             'STATIC_INITIALIZER': static_initializer}
+    class_content = bridge_class_template.substitute(value)
+    return class_content
+
+  def GenerateCreateInternallyConstructor(self):
+    if not self._java_data.HasCreateInternallyAnnotation():
+      return ''
+    constructor_template = Template("""\
+    private ${INTERNAL_CLASS_NAME} internal = null;
+    ${BRIDGE_CLASS_NAME}(${INTERNAL_CLASS_NAME} internal) {
+        this.internal = internal;
+        this.wrapper = ReflectionHelper.createInstance(\
+"${STATIC_CONSTRUCTOR_NAME}", this);
+        try {
+          reflectionInit();
+        } catch (Exception e) {
+          ReflectionHelper.handleException(e);
+        }
+    }
+""")
+    internal_class_name = self._java_data.class_name
+    bridge_class_name = self._generated_class_name
+    constructor_method = Method(self._java_data.class_name, self._class_loader,
+        True, False, False, bridge_class_name, '', '', '')
+    static_constructor_name = constructor_method.GetMethodDeclareName()
+    value = {'INTERNAL_CLASS_NAME': internal_class_name,
+             'BRIDGE_CLASS_NAME': bridge_class_name,
+             'STATIC_CONSTRUCTOR_NAME': static_constructor_name}
+    return constructor_template.substitute(value)
+
+  def GenerateBridgeEnums(self):
+    enums_string = ''
+    enum_template = Template("""\
+    private Class<?> ${ENUM_CLASS_NAME};
+    private Method ${ENUM_VALUE_OF_METHOD};
+    private Object Convert${ENUM_TYPE}(${ENUM_TYPE} type) {
+        return ReflectionHelper.invokeMethod(${ENUM_VALUE_OF_METHOD}, \
+null, type.toString());
+    }
+""")
+    for enum in self._java_data.enums.values():
+      value = {'ENUM_CLASS_NAME': enum.EnumClassName(),
+               'ENUM_VALUE_OF_METHOD': enum.EnumMethodValueOfName(),
+               'ENUM_TYPE': enum.enum_name}
+      enums_string += enum_template.substitute(value)
+    return enums_string
+
+  def GenerateBridgeMethods(self):
+    methods_string = ''
+    for method in self._java_data.methods:
+      methods_string += method.GenerateMethodsStringForBridge()
+    return methods_string
+
+  def GenerateReflectionInitString(self):
+    ref_methods_string = ''
+
+    ref_enum_template = Template("""\
+        ${ENUM} = clazz.getClassLoader().loadClass("${ENUM_CLASS}");
+        ${METHOD} = ${ENUM}.getMethod("valueOf", String.class);
+""")
+    for enum in self._java_data.enums.values():
+      value = { 'ENUM': enum.EnumClassName(),
+                'ENUM_CLASS': self._java_data.GetFullWrapperName(
+                    enum.enum_name),
+                'METHOD': enum.EnumMethodValueOfName()}
+      ref_methods_string += ref_enum_template.substitute(value)
+
+    ref_method_template = Template("""\
+        ${METHOD_DECLARE_NAME} = ReflectionHelper.loadMethod(\
+clazz, \"${METHOD}\"${PARAMS});
+""")
+    for method in self._java_data.methods:
+      if method.is_constructor or method.is_static:
+        continue
+      value = { 'METHOD_DECLARE_NAME': method.GetMethodDeclareName(),
+                'METHOD': method.method_name,
+                'PARAMS': method.GetBridgeParamsStringDeclareForWrapper()}
+      ref_methods_string += ref_method_template.substitute(value)
+
+    ref_init_template = Template("""\
+    private void reflectionInit() throws NoSuchMethodException,
+            ClassNotFoundException {
+        Class<?> clazz = wrapper.getClass();
+${REF_METHODS}
+    }
+""")
+    value = {'REF_METHODS': ref_methods_string}
+    ref_init_string = ref_init_template.substitute(value)
+    return ref_init_string
+
+  def GenerateStaticInitializerString(self):
+    if not self._java_data.HasCreateInternallyAnnotation():
+      return ''
+    static_initializer_template = Template("""\
+    static {
+        ReflectionHelper.registerConstructor("${STATIC_CONSTRUCTOR_NAME}", \
+"${FULL_CLASS_NAME}", Object.class);
+    }
+""")
+    bridge_class_name = self._java_data.bridge_name
+    constructor_method = Method(self._java_data.class_name, self._class_loader,
+        True, False, False, bridge_class_name, '', '', '')
+    static_constructor_name = constructor_method.GetMethodDeclareName()
+    full_class_name = self._java_data.GetFullWrapperName()
+    value = {'STATIC_CONSTRUCTOR_NAME': static_constructor_name,
+             'FULL_CLASS_NAME': full_class_name}
+    return static_initializer_template.substitute(value)
diff --git a/src/xwalk/tools/reflection_generator/code_generator.py b/src/xwalk/tools/reflection_generator/code_generator.py
new file mode 100644 (file)
index 0000000..d543e6e
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+class CodeGenerator(object):
+  """Basic class of code generator"""
+  def __init__(self, java_data, class_loader):
+    self._java_data = java_data
+    self._class_loader = class_loader
+    self._generated_code = ''
+    self._generated_class_name = ''
+
+  def LoadJavaClass(self, clazz):
+    return self._class_loader.LoadJavaClass(clazz)
+
+  def IsInternalClass(self, clazz):
+    return self._class_loader.IsInternalClass(clazz)
+
+  def RunTask(self):
+    pass
+
+  def GetGeneratedCode(self):
+    return self._generated_code
+
+  def GetGeneratedClassFileName(self):
+    return self._generated_class_name + '.java'
+
+  def GenerateImportRules(self):
+    imports = ''
+    for imported in self._java_data.imports:
+      import_string = 'import ' + imported + ";\n"
+      imports += import_string
+    # Add the reflection helper import.
+    imports += '\n'
+    imports += 'import java.lang.reflect.Constructor;\n'
+    imports += 'import java.lang.reflect.Method;\n'
+    return imports
diff --git a/src/xwalk/tools/reflection_generator/interface_generator.py b/src/xwalk/tools/reflection_generator/interface_generator.py
new file mode 100644 (file)
index 0000000..3fc1d9d
--- /dev/null
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from string import Template
+
+from code_generator import CodeGenerator
+
+class InterfaceGenerator(CodeGenerator):
+  """Generator class that generates interfade code in wrapper layer"""
+  def __init__(self, java_data, class_loader):
+    super(InterfaceGenerator, self).__init__(java_data, class_loader)
+
+  def RunTask(self):
+    self._generated_class_name = self._java_data.wrapper_name
+    self._generated_code = self.GenerateInterface()
+
+  def GenerateDoc(self, doc):
+    return self._class_loader.GenerateDoc(doc)
+
+  def GenerateInterface(self):
+    interface_template = Template("""
+${PACKAGE_SECTION}
+
+${IMPORT_SECTION}
+${DOC}
+public interface ${INTERFACE_NAME} {
+${METHOD_SECTION}
+}
+""")
+    package_section = 'package %s;' % \
+        (self._java_data.package_name.replace('.internal', ''))
+    import_section = self.GenerateImportRules()
+    method_section = self.GenerateMethods()
+    interface_name = self._generated_class_name
+    value = {'PACKAGE_SECTION': package_section,
+             'IMPORT_SECTION': import_section,
+             'DOC': self.GenerateDoc(self._java_data.class_doc),
+             'INTERFACE_NAME': interface_name,
+             'METHOD_SECTION': method_section}
+    interface_code = interface_template.substitute(value)
+    return interface_code
+
+  def GenerateMethods(self):
+    methods_string = ''
+    for method in self._java_data.methods:
+      methods_string += method.GenerateMethodsStringForInterface()
+    return methods_string
diff --git a/src/xwalk/tools/reflection_generator/java_class.py b/src/xwalk/tools/reflection_generator/java_class.py
new file mode 100644 (file)
index 0000000..a702ec6
--- /dev/null
@@ -0,0 +1,439 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import re
+
+from string import Template
+
+from java_class_component import Enum, Field
+from java_method import Method
+
+class JavaClassLoader(object):
+  """Manager class maintains all loaded java classes."""
+  def __init__(self, src_path, class_list):
+    self._src_path = src_path
+    self._java_data_map = {}
+    self._class_list = class_list
+
+  def IsInternalClass(self, clazz):
+    return clazz in self._class_list
+
+  def LoadJavaClass(self, clazz):
+    java_data = self._java_data_map.get(clazz, None)
+    if java_data:
+      return java_data
+
+    file_name = os.path.join(self._src_path, '%s.java' % clazz)
+    self._java_data_map[clazz] = self.LoadJavaFile(file_name)
+
+    return self._java_data_map[clazz]
+
+  def LoadJavaFile(self, file_name):
+    try:
+      file_handle = open(file_name, 'r')
+      file_content = file_handle.read()
+      file_handle.close()
+    except Exception:
+      print 'Error reading input Java file, please check.'
+      return
+
+    java_data = InternalJavaFileData(self)
+    java_data.SetClassContent(file_content)
+
+    return java_data
+
+  def MangleInternalNameToBridgeName(self, internal_name):
+    if not self.IsInternalClass(internal_name):
+      return internal_name
+    else:
+      return internal_name.replace('Internal', 'Bridge')
+
+  def MangleInternalNameToWrapperName(self, internal_name):
+    if not self.IsInternalClass(internal_name):
+      return internal_name
+    else:
+      return internal_name.replace('Internal', '')
+
+  def GenerateDoc(self, doc):
+    if not doc:
+      return ''
+    def ReplaceInternal(matchobj):
+      match = matchobj.group(0)
+      if self.IsInternalClass(match):
+        return self.LoadJavaClass(match).wrapper_name
+      else:
+        return match
+    return re.sub('XWalk[a-zA-Z_0-9]*Internal', ReplaceInternal, doc)
+
+class InternalJavaFileData(object):
+  """Data class stores the generator information of internal class."""
+  ANNOTATION_CREATE_INTERNALLY = 'createInternally'
+  ANNOTATION_CREATE_EXTERNALLY = 'createExternally'
+  ANNOTATION_EXTEND_CLASS = 'extendClass'
+  ANNOTATION_NO_INSTANCE = 'noInstance'
+  ANNOTATION_INSTANCE = 'instance'
+  ANNOTATION_IMPL = 'impl'
+
+  def __init__(self, class_loader):
+    self._class_loader = class_loader
+    self._class_name = ''
+    self._bridge_name = ''
+    self._wrapper_name = ''
+    self._class_type = ''  # class or interface
+    self._class_doc = ''
+    self._class_annotations = {}
+    self._methods = []
+    self._fields = []
+    self._imports = []
+    self._enums = {}
+    self._package_name = ''
+
+  def LoadJavaClass(self, clazz):
+    return self._class_loader.LoadJavaClass(clazz)
+
+  @property
+  def class_name(self):
+    return self._class_name
+
+  @property
+  def bridge_name(self):
+    return self._bridge_name
+
+  @property
+  def wrapper_name(self):
+    return self._wrapper_name
+
+  @property
+  def class_type(self):
+    return self._class_type
+
+  @property
+  def class_doc(self):
+    return self._class_doc
+
+  @property
+  def class_annotations(self):
+    return self._class_annotations
+
+  @property
+  def methods(self):
+    return self._methods
+
+  @property
+  def fields(self):
+    return self._fields
+
+  @property
+  def imports(self):
+    return self._imports
+
+  @property
+  def enums(self):
+    return self._enums
+
+  @property
+  def package_name(self):
+    return self._package_name
+
+  def SetClassContent(self, content):
+    self.ExtractPackageName(content)
+    self.ExtractImports(content)
+    self.ExtractClassProperties(content)
+    self.ExtractMethods(content)
+    self.ExtractFields(content)
+    self.ExtractEnums(content)
+
+  def ExtractPackageName(self, java_content):
+    package_re = re.compile('\s*package\s+(?P<package>[a-zA-Z0-9._]+)\s*;')
+    for match in re.finditer(package_re, java_content):
+      self._package_name = match.group('package')
+
+  def ExtractImports(self, java_content):
+    imports_re = re.compile('\s*import\s+(?P<imported>[a-zA-Z0-9._*]+)\s*;')
+    for match in re.finditer(imports_re, java_content):
+      imported = match.group('imported')
+      # Determine whether the import rule should be ignored for generated code.
+      # TODO: Currently we only use a blacklist to filter the import rule.
+      if imported.startswith('org.xwalk.core.internal') or \
+          imported.startswith('org.chromium'):
+        continue
+      self._imports.append(imported)
+
+  def ExtractClassProperties(self, java_content):
+    class_re = re.compile(
+        '(?P<class_doc>(\n\s*/\*\*.*\n(\s+\*(.)*\n)+\s+\*/\s*)?)\n'
+        '\s*@XWalkAPI\(?'
+        '(?P<annotation_content>[a-zA-Z0-9.,=\s]*)\)?'
+        '\s*public\s+([a-z]+\s+)*'
+        '(?P<type>(class|interface))\s+'
+        '(?P<class_name>[a-zA-Z0-9]*)')
+    for match in re.finditer(class_re, java_content):
+      annotation_content = match.group('annotation_content')
+      self._class_name = match.group('class_name')
+      self._bridge_name = \
+          self._class_loader.MangleInternalNameToBridgeName(self._class_name)
+      self._wrapper_name = \
+          self._class_loader.MangleInternalNameToWrapperName(self._class_name)
+      self._class_type = match.group('type')
+      self._class_doc = match.group('class_doc')
+      self.ParseClassAnnotations(annotation_content)
+
+  def ParseClassAnnotations(self, annotation):
+    """Class annotation contains the following optional attributes:
+        'extendClass' - The class have to extend
+        'createExternally' - boolean
+        'craeteInternally' - boolean
+        'noInstance' - boolean
+        'isConst' - boolean
+        'impl' - Class to impl
+        'instance - instance'"""
+    extend_class_re = re.compile('extendClass\s*=\s*'
+        '(?P<extend_class>[a-zA-Z0-9.]+)')
+    for match in re.finditer(extend_class_re, annotation):
+      extend_class = match.group('extend_class')
+      self._class_annotations['extendClass'] = extend_class
+
+    create_internally_re = re.compile('createInternally\s*=\s*'
+        '(?P<create_internally>(true|false))')
+    for match in re.finditer(create_internally_re, annotation):
+      create_internally = match.group('create_internally')
+      if create_internally == 'true':
+        self._class_annotations['createInternally'] = True
+      elif create_internally == 'false':
+        self._class_annotations['createInternally'] = False
+
+    create_externally_re = re.compile('createExternally\s*=\s*'
+        '(?P<create_externally>(true|false))')
+    for match in re.finditer(create_externally_re, annotation):
+      create_externally = match.group('create_externally')
+      if create_externally == 'true':
+        self._class_annotations['createExternally'] = True
+      elif create_externally == 'false':
+        self._class_annotations['createExternally'] = False
+
+    no_instance_re = re.compile('noInstance\s*=\s*'
+        '(?P<no_instance>(true|false))')
+    for match in re.finditer(no_instance_re, annotation):
+      no_instance = match.group('no_instance')
+      if no_instance == 'true':
+        self._class_annotations['noInstance'] = True
+      elif no_instance == 'false':
+        self._class_annotations['noInstance'] = False
+
+    is_const_re = re.compile('isConst\s*=\s*'
+        '(?P<is_const>(true|false))')
+    for match in re.finditer(is_const_re, annotation):
+      is_const = match.group('is_const')
+      if is_const == 'true':
+        self._class_annotations['isConst'] = True
+      elif is_const == 'false':
+        self._class_annotations['isConst'] = False
+
+    impl_re = re.compile('impl\s*=\s*'
+        '(?P<impl>[a-zA-Z0-9.]+)')
+    for match in re.finditer(impl_re, annotation):
+      impl = match.group('impl')
+      self._class_annotations['impl'] = impl
+
+    instance_re = re.compile('instance\s*=\s*'
+        '(?P<instance>[a-zA-Z0-9.]+)')
+    for match in re.finditer(instance_re, annotation):
+      instance = match.group('instance')
+      self._class_annotations['instance'] = instance
+
+  def ExtractMethods(self, java_content):
+    constructor_re = re.compile(
+        '(?P<method_doc>(\n\s*/\*\*.*\n(\s+\*(.)*\n)+\s+\*/\s*)?)\n'
+        '\s*@XWalkAPI\(?'
+        '(?P<method_annotation>[a-zA-Z0-9\$%,\s\(\)\{\};._"=]*)\)?'
+        '\s*public\s(?P<method_name>[a-zA-Z0-9]+)\('
+        '(?P<method_params>[a-zA-Z0-9\s,\[\]\>\<]*)\)')
+    for match in re.finditer(constructor_re, java_content):
+      method_annotation = match.group('method_annotation')
+      method_name = match.group('method_name')
+      method_params = match.group('method_params')
+      method_doc = match.group('method_doc')
+      method = Method(
+          self._class_name,
+          self._class_loader,
+          True, # is_constructor
+          False, # is_static
+          False, # is_abstract
+          method_name, None,
+          method_params, method_annotation, method_doc)
+      self._methods.append(method)
+
+    method_re = re.compile(
+        '(?P<method_doc>(\n\s*/\*\*.*\n(\s+\*(.)*\n)+\s+\*/\s*)?)\n'
+        '\s*@XWalkAPI\(?'
+        '(?P<method_annotation>[a-zA-Z0-9%,\s\(\)\{\};._"=]*)\)?'
+        '\s*public\s+(?P<method_return>[a-zA-Z0-9]+)\s+'
+        '(?P<method_name>[a-zA-Z0-9]+)\('
+        '(?P<method_params>[a-zA-Z0-9\s,\]\[\<\>]*)\)')
+    for match in re.finditer(method_re, java_content):
+      method_annotation = match.group('method_annotation')
+      method_name = match.group('method_name')
+      method_params = match.group('method_params')
+      method_return = match.group('method_return')
+      method_doc = match.group('method_doc')
+      method = Method(
+          self._class_name,
+          self._class_loader,
+          False, # is_constructor
+          False, # is_static
+          False, # is_abstract
+          method_name, method_return, method_params,
+          method_annotation, method_doc)
+      self._methods.append(method)
+
+    method_re = re.compile(
+        '(?P<method_doc>(\n\s*/\*\*.*\n(\s+\*(.)*\n)+\s+\*/\s*)?)\n'
+        '\s*@XWalkAPI\(?'
+        '(?P<method_annotation>[a-zA-Z0-9%,\s\(\)\{\};._"=]*)\)?'
+        '\s*public\s+static\s+(synchronized\s+)*'
+        '(?P<method_return>[a-zA-Z0-9]+)\s+'
+        '(?P<method_name>[a-zA-Z0-9]+)\('
+        '(?P<method_params>[a-zA-Z0-9\s,\[\]\<\>]*)\)')
+    for match in re.finditer(method_re, java_content):
+      method_annotation = match.group('method_annotation')
+      method_name = match.group('method_name')
+      method_params = match.group('method_params')
+      method_return = match.group('method_return')
+      method_doc = match.group('method_doc')
+      method = Method(
+          self._class_name,
+          self._class_loader,
+          False, # is_constructor
+          True, # is_static
+          False, # is_abstract
+          method_name, method_return, method_params,
+          method_annotation, method_doc)
+      self._methods.append(method)
+
+    method_re = re.compile(
+        '(?P<method_doc>(\n\s*/\*\*.*\n(\s+\*(.)*\n)+\s+\*/\s*)?)\n'
+        '\s*@XWalkAPI\(?'
+        '(?P<method_annotation>[a-zA-Z0-9%,\s\(\)\{\};._"=]*)\)?'
+        '\s*public\s+abstract\s+(synchronized\s+)*'
+        '(?P<method_return>[a-zA-Z0-9]+)\s+'
+        '(?P<method_name>[a-zA-Z0-9]+)\('
+        '(?P<method_params>[a-zA-Z0-9\s,\[\]\<\>]*)\)')
+    for match in re.finditer(method_re, java_content):
+      method_annotation = match.group('method_annotation')
+      method_name = match.group('method_name')
+      method_params = match.group('method_params')
+      method_return = match.group('method_return')
+      method_doc = match.group('method_doc')
+      method = Method(
+          self._class_name,
+          self._class_loader,
+          False, # is_constructor
+          False, # is_static
+          True, # is_abstract
+          method_name, method_return, method_params,
+          method_annotation, method_doc)
+      self._methods.append(method)
+
+  def ExtractFields(self, java_content):
+    field_re = re.compile(
+        '(?P<field_doc>(\n\s*/\*\*.*\n(\s+\*(.)*\n)+\s+\*/\s*)?)\n'
+        '\s*@XWalkAPI\s*public\s+static\s+final\s+'
+        '(?P<field_type>[a-zA-Z0-9_]+)\s+'
+        '(?P<field_name>[a-zA-Z0-9_]+)\s*=\s*'
+        '(?P<field_value>[a-zA-Z0-9-_"]+)\s*;')
+    for match in re.finditer(field_re, java_content):
+      field_type = match.group('field_type')
+      field_name = match.group('field_name')
+      field_value = match.group('field_value')
+      field_doc = match.group('field_doc')
+      field_object = Field(field_type, field_name, field_value, field_doc)
+      self._fields.append(field_object)
+
+  def ExtractEnums(self, java_content):
+    enum_re = re.compile(
+        '(?P<enum_doc>(\n\s*/\*\*.*\n(\s+\*(.)*\n)+\s+\*/\s*)?)\n'
+        '\s*@XWalkAPI\s*public\s+enum\s+'
+        '(?P<enum_name>[a-zA-Z0-9_]+)\s+{'
+        '(?P<enum_content>(.|\n)*?)\s*}')
+    for match in re.finditer(enum_re, java_content):
+      enum_name = match.group('enum_name')
+      enum_content = match.group('enum_content')
+      enum_doc = match.group('enum_doc')
+      enum_object = Enum(enum_name, enum_content, enum_doc)
+      self._enums[enum_name] = enum_object
+
+  def HasCreateInternallyAnnotation(self):
+    return self._class_annotations.get(
+        InternalJavaFileData.ANNOTATION_CREATE_INTERNALLY, False)
+
+  def UseAsInstanceInBridgeCall(self, var):
+    return '%s.getWrapper()' % self.UseAsReturnInBridgeSuperCall(var)
+
+  def UseAsInstanceInBridgeOverrideCall(self, var):
+    clazz = self._class_annotations.get('instance', self._class_name)
+    clazz = clazz.replace('.class', '')
+    return '(%s) %s' % (self.LoadJavaClass(clazz).bridge_name, var)
+
+  def UseAsReturnInBridgeSuperCall(self, var):
+    clazz = self._class_annotations.get('instance', self._class_name)
+    clazz = clazz.replace('.class', '')
+
+    if self.LoadJavaClass(clazz).class_annotations.get(
+        'createInternally', False):
+      typed_var_template = Template('(${VAR} instanceof ${BRIDGE_TYPE} ?'\
+          ' ((${BRIDGE_TYPE}) ${VAR} ) : new ${BRIDGE_TYPE}(${INTERNAL_VAR}))')
+      value = {'VAR': var,
+               'BRIDGE_TYPE': self.LoadJavaClass(clazz).bridge_name,
+               'INTERNAL_VAR': var if clazz == self._class_name else\
+                                   '(%s) %s' % (clazz, var)}
+      var = typed_var_template.substitute(value)
+
+    return var
+
+  def UseAsTypeInBridgeAndBridgeSuperCall(self):
+    clazz = self._class_annotations.get('instance', self._class_name)
+    clazz = clazz.replace('.class', '')
+
+    return self.LoadJavaClass(clazz).bridge_name
+
+  def UseAsInstanceInBridgeSuperCall(self, var):
+    # pylint: disable=R0201
+    return var
+
+  def UseAsInstanceInWrapperCall(self, var):
+    clazz = self._class_annotations.get('instance', self._class_name)
+    clazz = clazz.replace('.class', '')
+
+    if clazz != self._class_name:
+      var = '((%s) %s)' % (self.LoadJavaClass(clazz).wrapper_name, var)
+    return '%s.getBridge()' % var
+
+  def UseAsTypeInWrapperCall(self):
+    return self._wrapper_name
+
+  def GetFullBridgeName(self, subclass=None):
+    if not self._class_loader.IsInternalClass(self._class_name):
+      return self._class_name
+    else:
+      clazz = self._class_annotations.get(
+          InternalJavaFileData.ANNOTATION_INSTANCE, self._class_name)
+      clazz = clazz.replace('.class', '')
+      package_string = 'org.xwalk.core.internal.%s'
+      if not subclass:
+        return package_string % self.LoadJavaClass(clazz).bridge_name
+      else:
+        return package_string % (clazz + '$' + subclass)
+
+  def GetFullWrapperName(self, subclass=None):
+    if not self._class_loader.IsInternalClass(self._class_name):
+      return self._class_name
+    else:
+      if not subclass:
+        return "org.xwalk.core.%s" % self._wrapper_name
+      else:
+        return "org.xwalk.core.%s$%s" % (self._wrapper_name,
+                                         subclass.replace('Internal', ''))
diff --git a/src/xwalk/tools/reflection_generator/java_class_component.py b/src/xwalk/tools/reflection_generator/java_class_component.py
new file mode 100644 (file)
index 0000000..a39c8d2
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+class Field:
+  """Python class represents static field of a java class"""
+  def __init__(self, field_type, name, value, doc):
+    self._field_type = field_type
+    self._field_name = name
+    self._field_value = value
+    self._field_doc = doc
+
+  @property
+  def field_type(self):
+    return self._field_type
+
+  @property
+  def field_name(self):
+    return self._field_name
+
+  @property
+  def field_value(self):
+    return self._field_value
+
+  @property
+  def field_doc(self):
+    return self._field_doc
+
+
+class Enum:
+  """Python class represents enum type in a java class"""
+  def __init__(self, name, declaration, doc):
+    self._enum_name = name
+    self._enum_declaration = declaration
+    self._enum_doc = doc
+
+  @property
+  def enum_name(self):
+    return self._enum_name
+
+  @property
+  def enum_declaration(self):
+    return self._enum_declaration
+
+  @property
+  def enum_doc(self):
+    return self._enum_doc
+
+  def EnumClassName(self):
+    # return the variable name of the class<?> object for this enum
+    # type in parent class.
+    return 'enum%sClass' % self._enum_name.replace('Internal', '')
+
+  def EnumMethodValueOfName(self):
+    # return the variable name of the Method object for this enum
+    # type's valueOf method in parent class.
+    return '%sValueOfMethod' % self.EnumClassName()
+
diff --git a/src/xwalk/tools/reflection_generator/java_method.py b/src/xwalk/tools/reflection_generator/java_method.py
new file mode 100644 (file)
index 0000000..4824eff
--- /dev/null
@@ -0,0 +1,653 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. 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
+
+from collections import OrderedDict
+from string import Template
+
+def ConvertClassExpressionToClassType(class_name):
+  """ Turn "final HashMap<String>" to HashMap.class. """
+  return '%s.class' % class_name.split()[-1].split('<')[0]
+
+
+def ConvertPrimitiveTypeToObject(class_name):
+  primitive_map = {
+      'byte': 'Byte',
+      'short': 'Short',
+      'int': 'Integer',
+      'long': 'Long',
+      'float': 'Float',
+      'double': 'Double',
+      'char': 'Character',
+      'boolean': 'Boolean',
+  }
+  return primitive_map.get(class_name, class_name)
+
+
+class ParamStringType(object):
+  INTERNAL_DECLARE = 1
+  BRIDGE_DECLARE = 2
+  BRIDGE_DECLARE_FOR_WRAPPER = 3
+  BRIDGE_PASS_TO_SUPER = 4
+  BRIDGE_PASS_TO_WRAPPER = 5
+  INTERNAL_PASS_TO_BRIDGE = 6
+  BRIDGE_OVERRIDE_CONDITION = 7
+  WRAPPER_DECLARE = 8
+  WRAPPER_DECLARE_FOR_BRIDGE = 9
+  WRAPPER_PASS_TO_BRIDGE = 10
+
+
+class MethodStringType(object):
+  BRIDGE_CONSTRUCTOR = 1
+  BRIDGE_STATIC = 2
+  BRIDGE_SUPER = 3
+  BRIDGE_OVERRIDE = 4
+  BRIDGE_WRAPPER = 5
+  WRAPPER_CONSTRUCTOR = 6
+  WRAPPER_STATIC = 7
+  WRAPPER_BRIDGE = 8
+  WRAPPER_INTERFACE = 9
+
+
+class Method(object):
+  """Internal representaion of a method."""
+  ANNOTATION_PRE_WRAPLINE = 'preWrapperLines'
+  ANNOTATION_POST_WRAPLINE = 'postWrapLines'
+
+  def __init__(self, class_name, class_loader,
+      is_constructor, is_static, is_abstract,
+      method_name, method_return, params, annotation, doc=''):
+    self._class_name = class_name
+    self._class_loader = class_loader
+    self._is_constructor = is_constructor
+    self._is_static = is_static
+    self._is_abstract = is_abstract
+    self._method_name = method_name
+    self._method_return = method_return
+    self._params = OrderedDict() # Use OrderedDict to avoid parameter misorder.
+    self._method_annotations = {}
+    self._method_doc = doc
+    self._class_java_data = ''
+    self._method_declare_name = ''
+    self._internal_params_declare = ''
+    self._bridge_params_declare = ''
+    self._bridge_params_declare_for_wrapper = ''
+    self._bridge_params_pass_to_super = ''
+    self._bridge_params_pass_to_wrapper = ''
+    self._internal_params_pass_to_bridge = ''
+    self._bridge_override_condition = ''
+    self._wrapper_params_declare = ''
+    self._wrapper_params_declare_for_bridge = ''
+    self._wrapper_params_pass_to_bridge = ''
+    self._strings_prepared = False
+    self.ParseMethodParams(params)
+    self.ParseMethodAnnotation(annotation)
+
+  def IsInternalClass(self, clazz):
+    return self._class_loader.IsInternalClass(clazz)
+
+  def LoadJavaClass(self, clazz):
+    return self._class_loader.LoadJavaClass(clazz)
+
+  def GenerateDoc(self, doc):
+    return self._class_loader.GenerateDoc(doc)
+
+  @property
+  def is_constructor(self):
+    return self._is_constructor
+
+  @property
+  def is_static(self):
+    return self._is_static
+
+  @property
+  def is_abstract(self):
+    return self._is_abstract
+
+  @property
+  def method_name(self):
+    return self._method_name
+
+  @property
+  def method_return(self):
+    return self._method_return
+
+  @property
+  def params(self):
+    return self._params
+
+  @property
+  def method_annotations(self):
+    return self._method_annotations
+
+  @property
+  def method_doc(self):
+    return self._method_doc
+
+  def ParseMethodParams(self, params):
+    # TODO(shouqun): Currently, generic parameters are not supported.
+    # The support of generic types should be added if such cases happen.
+    if not params or params == '':
+      return
+    for param in params.split(','):
+      param = param.strip()
+      param_list = param.split()
+      param_type = ' '.join(param_list[:-1]) # To handle modifiers
+      param_name = param_list[-1]
+      self._params[param_name] = param_type
+
+  def ParseMethodAnnotation(self, annotation):
+    pre_wrapline_re = re.compile('preWrapperLines\s*=\s*\{\s*('
+        '?P<pre_wrapline>(".*")(,\s*".*")*)\s*\}')
+    for match in re.finditer(pre_wrapline_re, annotation):
+      pre_wrapline = self.FormatWrapperLine(match.group('pre_wrapline'))
+      self._method_annotations[self.ANNOTATION_PRE_WRAPLINE] = pre_wrapline
+
+    post_wrapline_re = re.compile('postWrapperLines\s*=\s*\{\s*('
+        '?P<post_wrapline>(".*")(,\s*".*")*)\s*\}')
+    for match in re.finditer(post_wrapline_re, annotation):
+      post_wrapline = self.FormatWrapperLine(match.group('post_wrapline'))
+      self._method_annotations[self.ANNOTATION_POST_WRAPLINE] = post_wrapline
+
+  def FormatWrapperLine(self, annotation_value):
+    """ annotaion_value is a java string array which each element is an
+        individual line. Probably like: '    "line1",\n    "line2"'
+        This method is turnning it to '    line1\n    line2'
+    """
+    lines = []
+    exec('lines = [%s]' % annotation_value.replace('\n', ''))
+    template = Template('\n'.join(lines))
+    values = {}
+    for arg in range(1, len(self.params.keys())+1):
+      values['param%d' % arg] = self.params.keys()[arg-1]
+    return template.substitute(values)
+
+  def GetBridgeParamsStringDeclareForWrapper(self):
+    self.PrepareStrings()
+    return self._bridge_params_declare_for_wrapper
+
+  def GetWrapperParamsStringDeclareForBridge(self):
+    self.PrepareStrings()
+    return self._wrapper_params_declare_for_bridge
+
+  def GetMethodDeclareName(self):
+    self.PrepareStrings()
+    return self._method_declare_name
+
+  def PrepareStrings(self):
+    if self._strings_prepared:
+      return
+    self._class_java_data = self.LoadJavaClass(self._class_name)
+    self._method_declare_name = self.GenerateMethodDeclareName()
+
+    self._internal_params_declare = ', '.join(
+        self.GetFormattedParamArray(ParamStringType.INTERNAL_DECLARE))
+    self._bridge_params_declare = ', '.join(
+        self.GetFormattedParamArray(ParamStringType.BRIDGE_DECLARE))
+    self._bridge_params_declare_for_wrapper = ', '.join(
+        self.GetFormattedParamArray(
+            ParamStringType.BRIDGE_DECLARE_FOR_WRAPPER, insert_empty=True))
+    self._bridge_params_pass_to_super = ', '.join(
+        self.GetFormattedParamArray(ParamStringType.BRIDGE_PASS_TO_SUPER))
+    self._bridge_params_pass_to_wrapper = ', '.join(
+        self.GetFormattedParamArray(
+            ParamStringType.BRIDGE_PASS_TO_WRAPPER, insert_empty=True))
+    self._internal_params_pass_to_bridge = ', '.join(
+        self.GetFormattedParamArray(ParamStringType.INTERNAL_PASS_TO_BRIDGE))
+    self._bridge_override_condition = ' && '.join(
+        self.GetFormattedParamArray(ParamStringType.BRIDGE_OVERRIDE_CONDITION))
+    self._wrapper_params_declare = ', '.join(
+        self.GetFormattedParamArray(ParamStringType.WRAPPER_DECLARE))
+    self._wrapper_params_declare_for_bridge = ', '.join(
+        self.GetFormattedParamArray(ParamStringType.WRAPPER_DECLARE_FOR_BRIDGE,
+                                    insert_empty=True))
+    self._wrapper_params_pass_to_bridge = ', '.join(
+        self.GetFormattedParamArray(
+            ParamStringType.WRAPPER_PASS_TO_BRIDGE, insert_empty=True))
+
+    self._strings_prepared = True
+
+  def GetFormattedParamArray(self, param_string_type,
+      append_empty=False, insert_empty=False):
+    """ Return the array of params with specified format.
+        append or insert an empty string on demand for cases
+        that need extra splitter when using the array.
+    """
+    formatted_params = []
+    for param_name in self._params:
+      param_type = self._params[param_name]
+      formatted_param = self.FormatSingleParam(
+          param_type, param_name, param_string_type)
+      if formatted_param:
+        formatted_params.append(formatted_param)
+    if append_empty:
+      formatted_params.append('')
+    if insert_empty:
+      formatted_params.insert(0, '')
+    return formatted_params
+
+  def FormatSingleParam(self, param_type, param_name, param_string_type):
+    is_internal_class = self.IsInternalClass(param_type)
+    if is_internal_class:
+      java_data = self.LoadJavaClass(param_type)
+    if param_string_type == ParamStringType.INTERNAL_DECLARE:
+      # the way internal declares its params, will be used in bridge's override
+      # call.
+      #   XWalkViewInternal view => XWalkViewInternal view
+      return '%s %s' % (param_type, param_name)
+    elif param_string_type == ParamStringType.BRIDGE_DECLARE:
+      # the way bridge declares its params, will be used in bridge's wrapper
+      # call and super call.
+      #   XWalkViewInternal view => XWalkViewBridge view
+      if is_internal_class:
+        return '%s %s' % (java_data.UseAsTypeInBridgeAndBridgeSuperCall(),
+                          param_name)
+      else:
+        return '%s %s' % (param_type, param_name)
+    elif param_string_type == ParamStringType.BRIDGE_DECLARE_FOR_WRAPPER:
+      # the way bridge declares its params for wrapper, will turn the param
+      # type to class<?> value for reflection to use.
+      #   XWalkViewInternal view => "org.xwalk.core.XWalkView"
+      #   DirectionInternal direnction => enumDirectionClass
+      #   String name => String.class
+      if is_internal_class:
+        return '"%s"' % java_data.GetFullWrapperName()
+      else:
+        # TODO(wang16): Here only detects enum declared in the same class as
+        # the method itself. Using enum across class is not supported.
+        enums = self._class_java_data.enums
+        if param_type in enums:
+          return enums[param_type].EnumClassName()
+        else:
+          return ConvertClassExpressionToClassType(param_type)
+    elif param_string_type == ParamStringType.BRIDGE_PASS_TO_SUPER:
+      # the way bridge passes the param to super
+      #   XWalkViewInternal view => view
+      if is_internal_class:
+        return java_data.UseAsInstanceInBridgeSuperCall(param_name)
+      else:
+        return param_name
+    elif param_string_type == ParamStringType.BRIDGE_PASS_TO_WRAPPER:
+      # the way bridge passes the param to wrapper
+      #   XWalkViewInternal view => view.getWrapper()
+      #   DirectionInternal direction => ConvertDirectionInternal(direction)
+      if is_internal_class:
+        return java_data.UseAsInstanceInBridgeCall(param_name)
+      else:
+        # TODO(wang16): Here only detects enum declared in the same class as
+        # the method itself. Using enum across class is not supported.
+        enums = self._class_java_data.enums
+        if param_type in enums:
+          return 'Convert%s(%s)' % (param_type, param_name)
+        else:
+          return param_name
+    elif param_string_type == ParamStringType.INTERNAL_PASS_TO_BRIDGE:
+      # the way bridge accepts param from internal
+      #   XWalkViewInternal view => (XWalkViewBridge) view
+      if is_internal_class:
+        return java_data.UseAsInstanceInBridgeOverrideCall(param_name)
+      else:
+        return param_name
+    elif param_string_type == ParamStringType.BRIDGE_OVERRIDE_CONDITION:
+      # the way bridge uses as the condition for whether call super or
+      # call wrapper in override call
+      #   XWalkViewInternal view => (view instanceof XWalkViewBridge)
+      if is_internal_class:
+        return'(%s instanceof %s)' % (
+            param_name,
+            java_data.UseAsTypeInBridgeAndBridgeSuperCall())
+      else:
+        return None
+    elif param_string_type == ParamStringType.WRAPPER_DECLARE:
+      # the way wrapper declare the param
+      #   XWalkViewInternal view => XWalkView view
+      #   DirectionInternal direction => Direction direction
+      if is_internal_class:
+        return '%s %s' % (java_data.UseAsTypeInWrapperCall(), param_name)
+      elif param_type in self._class_java_data.enums:
+        # TODO(wang16): Here only detects enum declared in the same class as
+        # the method itself. Using enum across class is not supported.
+        return '%s %s' % (param_type.replace('Internal', ''), param_name)
+      else:
+        return '%s %s' % (param_type, param_name)
+    elif param_string_type == ParamStringType.WRAPPER_DECLARE_FOR_BRIDGE:
+      # the way wrapper declares its params for bridge, will turn the param
+      # type to class<?> value for reflection to use.
+      #   XWalkViewInternal view => "org.xwalk.core.internal.XWalkViewBridge"
+      #   DirectionInternal direction => enumDirectionClass
+      #   String name => String.class
+
+      # TODO(wang16): Currently there is no internal classes for static method.
+      # Need to support it in future.
+      if is_internal_class:
+        return '"%s"' % java_data.GetFullBridgeName()
+      else:
+        # TODO(wang16): Here only detects enum declared in the same class as
+        # the method itself. Using enum across class is not supported.
+        enums = self._class_java_data.enums
+        if param_type in enums:
+          return enums[param_type].EnumClassName()
+        else:
+          return ConvertClassExpressionToClassType(param_type)
+    elif param_string_type == ParamStringType.WRAPPER_PASS_TO_BRIDGE:
+      # the way wrapper passes param to bridge
+      #   XWalkViewInternal view => view.getBridge()
+      #   DirectionInternal direction => ConvertDirection(direction)
+      if is_internal_class:
+        return java_data.UseAsInstanceInWrapperCall(param_name)
+      elif param_type in self._class_java_data.enums:
+        # TODO(wang16): Here only detects enum declared in the same class as
+        # the method itself. Using enum across class is not supported.
+        return 'Convert%s(%s)' % (param_type.replace('Internal', ''),
+                                  param_name)
+      else:
+        return param_name
+    else:
+      pass
+
+  def GenerateMethodDeclareName(self):
+    name = self.method_name
+    for param_name in self.params:
+      # Remove modifier and generic type.
+      name += ConvertClassExpressionToClassType(
+          self.params[param_name]).replace('.class', '')
+    if self._is_constructor:
+      return '%sConstructor' % name
+    else:
+      return '%sMethod' % name
+
+  def GenerateBridgeConstructor(self):
+    template = Template(
+        '    public ${NAME}(${PARAMS}, Object wrapper) {\n' +
+        '        super(${PARAMS_PASSING});\n' +
+        '        this.wrapper = wrapper;\n' +
+        '        try {\n' +
+        '            reflectionInit();\n' +
+        '        } catch (Exception e) {\n' +
+        '            ReflectionHelper.handleException(e);\n'+
+        '        }\n' +
+        '    }\n\n')
+    value = {'NAME': self._class_java_data.bridge_name,
+             'PARAMS': self._bridge_params_declare,
+             'PARAMS_PASSING': self._bridge_params_pass_to_super}
+    return template.substitute(value)
+
+  def GenerateBridgeStaticMethod(self):
+    no_return_value = self._method_return == 'void'
+    template = Template(
+        '    public static ${RETURN_TYPE} ${NAME}($PARAMS) {\n' +
+        '        ${RETURN}${CLASS_NAME}.${NAME}(${PARAMS_PASSING});\n' +
+        '    }\n\n')
+    value = {'RETURN_TYPE': self.method_return,
+             'NAME': self.method_name,
+             'PARAMS': self._bridge_params_declare,
+             'RETURN': '' if no_return_value else 'return ',
+             'CLASS_NAME': self._class_name,
+             'PARAMS_PASSING': self._bridge_params_pass_to_super}
+    return template.substitute(value)
+
+  def GenerateBridgeOverrideMethod(self):
+    no_return_value = self._method_return == 'void'
+    if not self._bridge_override_condition:
+      return '    @Override\n'
+    template = Template(
+        '    @Override\n' +
+        '    public ${RETURN_TYPE} ${NAME}(${PARAMS}) {\n' +
+        '        if (${IF_CONDITION}) {\n' +
+        '            ${RETURN}${NAME}(${BRIDGE_PARAMS_PASSING});\n' +
+        '        } else {\n' +
+        '            ${RETURN}super.${NAME}(${PARAMS_PASSING});\n' +
+        '        }\n' +
+        '    }\n\n')
+    value = {'NAME': self.method_name,
+             'RETURN_TYPE': self.method_return,
+             'PARAMS': self._internal_params_declare,
+             'RETURN': '' if no_return_value else 'return ',
+             'IF_CONDITION': self._bridge_override_condition,
+             'PARAMS_PASSING': self._bridge_params_pass_to_super,
+             'BRIDGE_PARAMS_PASSING': self._internal_params_pass_to_bridge}
+    return template.substitute(value)
+
+  def GenerateBridgeWrapperMethod(self):
+    no_return_value = self._method_return == 'void'
+    return_is_internal = self.IsInternalClass(self._method_return)
+    if return_is_internal:
+      return_type_java_data = self.LoadJavaClass(self._method_return)
+
+    template = Template(
+        '    public ${RETURN_TYPE} ${NAME}(${PARAMS}) {\n' +
+        '        ${RETURN}ReflectionHelper.invokeMethod(\n' +
+        '            ${METHOD_DECLARE_NAME}, wrapper${PARAMS_PASSING});\n' +
+        '    }\n\n')
+    if no_return_value:
+      return_statement = ''
+    elif return_is_internal:
+      return_statement = 'return (%s)' % return_type_java_data.bridge_name
+    else:
+      return_statement = 'return (%s)' % (
+          ConvertPrimitiveTypeToObject(self.method_return))
+    value = {'RETURN_TYPE': self.method_return,
+             'NAME': self.method_name,
+             'METHOD_DECLARE_NAME': self._method_declare_name,
+             'PARAMS': self._bridge_params_declare,
+             'RETURN': return_statement,
+             'PARAMS_PASSING': self._bridge_params_pass_to_wrapper}
+    return template.substitute(value)
+
+  def GenerateBridgeSuperMethod(self):
+    no_return_value = self._method_return == 'void'
+    return_is_internal = self.IsInternalClass(self._method_return)
+    if return_is_internal:
+      return_type_java_data = self.LoadJavaClass(self._method_return)
+
+    if self._is_abstract:
+      return ''
+
+    if self._class_java_data.HasCreateInternallyAnnotation():
+      if no_return_value:
+        template = Template(
+            '    public void ${NAME}Super(${PARAMS}) {\n' +
+            '        if (internal == null) {\n' +
+            '            super.${NAME}(${PARAM_PASSING});\n' +
+            '        } else {\n' +
+            '            internal.${NAME}(${PARAM_PASSING});\n' +
+            '        }\n' +
+            '    }\n\n')
+      else:
+        template = Template(
+            '    public ${RETURN_TYPE} ${NAME}Super(${PARAMS}) {\n' +
+            '        ${INTERNAL_RETURN_TYPE} ret;\n' +
+            '        if (internal == null) {\n' +
+            '            ret = super.${NAME}(${PARAM_PASSING});\n' +
+            '        } else {\n' +
+            '            ret = internal.${NAME}(${PARAM_PASSING});\n' +
+            '        }\n' +
+            '        ${IF_NULL_RETURN_NULL}\n' +
+            '        return ${RETURN_VALUE};\n' +
+            '    }\n\n')
+    else:
+      if no_return_value:
+        template = Template(
+            '    public void ${NAME}Super(${PARAMS}) {\n' +
+            '        super.${NAME}(${PARAM_PASSING});\n' +
+            '    }\n\n')
+      else:
+        template = Template(
+            '    public ${RETURN_TYPE} ${NAME}Super(${PARAMS}) {\n' +
+            '        ${INTERNAL_RETURN_TYPE} ret;\n' +
+            '        ret = super.${NAME}(${PARAM_PASSING});\n' +
+            '        ${IF_NULL_RETURN_NULL}\n' +
+            '        return ${RETURN_VALUE};\n' +
+            '    }\n\n')
+
+    if return_is_internal:
+      return_value = return_type_java_data.UseAsReturnInBridgeSuperCall('ret')
+      method_return = return_type_java_data.bridge_name
+    else:
+      return_value = 'ret'
+      method_return = self._method_return
+
+    if ConvertPrimitiveTypeToObject(method_return) != method_return:
+      # it's returning prmitive type, so it can't be null.
+      if_null_return_null = ''
+    else:
+      if_null_return_null = 'if (ret == null) return null;'
+    value = {
+        'RETURN_TYPE': method_return,
+        'INTERNAL_RETURN_TYPE': self.method_return,
+        'NAME': self.method_name,
+        'PARAM_PASSING': self._bridge_params_pass_to_super,
+        'PARAMS': self._bridge_params_declare,
+        'IF_NULL_RETURN_NULL': if_null_return_null,
+        'RETURN_VALUE': return_value
+    }
+
+    return template.substitute(value)
+
+  def GenerateWrapperConstructor(self):
+    # TODO(wang16): Currently, only support pre/post wrapper lines for
+    # Constructors.
+    template = Template(
+        '${DOC}\n' +
+        '    public ${CLASS_NAME}(${PARAMS}) {\n' +
+        '${PRE_WRAP_LINES}\n' +
+        '        bridge = ReflectionHelper.createInstance(' +
+        '\"${CONSTRUCTOR_DECLARE_NAME}\"${PARAMS_PASSING}, this);\n' +
+        '        try {\n' +
+        '            reflectionInit();\n' +
+        '        } catch(Exception e) {\n' +
+        '            ReflectionHelper.handleException(e);\n' +
+        '        }\n' +
+        '${POST_WRAP_LINES}\n' +
+        '    }\n\n')
+    value = {'CLASS_NAME': self._class_java_data.wrapper_name,
+             'DOC': self.GenerateDoc(self.method_doc),
+             'PARAMS': self._wrapper_params_declare,
+             'PARAMS_PASSING': self._wrapper_params_pass_to_bridge,
+             'CONSTRUCTOR_DECLARE_NAME': self._method_declare_name,
+             'PRE_WRAP_LINES': self._method_annotations.get(
+                 self.ANNOTATION_PRE_WRAPLINE, ''),
+             'POST_WRAP_LINES': self._method_annotations.get(
+                 self.ANNOTATION_POST_WRAPLINE, '')}
+    return template.substitute(value)
+
+  def GenerateWrapperStaticMethod(self):
+    no_return_value = self._method_return == 'void'
+    template = Template(
+        '    public static ${RETURN_TYPE} ${NAME}(${PARAMS}) {\n' +
+        '       Class<?> clazz = ReflectionHelper.loadClass(' +
+        '\"${FULL_BRIDGE_NAME}\");\n' +
+        '       Method method = ReflectionHelper.loadMethod(clazz, ' +
+        '\"${NAME}\"${PARAMS_DECLARE_FOR_BRIDGE});\n' +
+        '       ${RETURN}ReflectionHelper.invokeMethod(method, null' +
+        '${PARAMS_PASSING});\n' +
+        '    }\n\n')
+    if no_return_value:
+      return_state = ''
+    else:
+      return_state = 'return (%s)' % ConvertPrimitiveTypeToObject(
+          self.method_return)
+    value = {'RETURN_TYPE': self.method_return,
+             'NAME': self.method_name,
+             'FULL_BRIDGE_NAME': self._class_java_data.GetFullBridgeName(),
+             'PARAMS_DECLARE_FOR_BRIDGE':
+                 self._wrapper_params_declare_for_bridge,
+             'PARAMS_PASSING': self._wrapper_params_pass_to_bridge,
+             'PARAMS': self._wrapper_params_declare,
+             'RETURN': return_state}
+    return template.substitute(value)
+
+  def GenerateWrapperBridgeMethod(self):
+    no_return_value = self._method_return == 'void'
+    return_is_internal = self.IsInternalClass(self._method_return)
+    if return_is_internal:
+      return_type_java_data = self.LoadJavaClass(self._method_return)
+
+    if self.is_abstract:
+      template = Template(
+          '${DOC}\n' +
+          '    public abstract ${RETURN_TYPE} ${NAME}(${PARAMS});\n\n')
+    elif return_is_internal:
+      template = Template(
+          '${DOC}\n' +
+          '    public ${RETURN_TYPE} ${NAME}(${PARAMS}) {\n' +
+          '        return (${RETURN_TYPE})ReflectionHelper.' +
+          'getBridgeOrWrapper(\n' +
+          '            ReflectionHelper.invokeMethod(' +
+          '${METHOD_DECLARE_NAME}, bridge${PARAMS_PASSING}));\n' +
+          '    }\n\n')
+    else:
+      template = Template(
+          '${DOC}\n' +
+          '    public ${RETURN_TYPE} ${NAME}(${PARAMS}) {\n' +
+          '        ${RETURN}ReflectionHelper.invokeMethod(' +
+          '${METHOD_DECLARE_NAME}, bridge${PARAMS_PASSING});\n' +
+          '    }\n\n')
+    if return_is_internal:
+      return_type = return_type_java_data.wrapper_name
+    else:
+      return_type = self.method_return
+    if no_return_value:
+      return_state = ''
+    else:
+      return_state = 'return (%s)' % ConvertPrimitiveTypeToObject(return_type)
+    value = {'RETURN_TYPE': return_type,
+             'RETURN': return_state,
+             'DOC': self.GenerateDoc(self.method_doc),
+             'NAME': self.method_name,
+             'PARAMS': self._wrapper_params_declare,
+             'METHOD_DECLARE_NAME': self._method_declare_name,
+             'PARAMS_PASSING': self._wrapper_params_pass_to_bridge}
+    return template.substitute(value)
+
+  def GenerateWrapperInterface(self):
+    return_is_internal = self.IsInternalClass(self._method_return)
+    if return_is_internal:
+      return_type_java_data = self.LoadJavaClass(self._method_return)
+
+    template = Template(
+        '${DOC}\n' +
+        '    public ${RETURN_TYPE} ${NAME}(${PARAMS});\n\n')
+    if return_is_internal:
+      return_type = return_type_java_data.wrapper_name
+    else:
+      return_type = self.method_return
+    value = {'RETURN_TYPE': return_type,
+             'DOC': self.GenerateDoc(self.method_doc),
+             'NAME': self.method_name,
+             'PARAMS': self._wrapper_params_declare}
+    return template.substitute(value)
+
+  def GenerateMethodsStringForBridge(self):
+    self.PrepareStrings()
+    if self._is_constructor:
+      return self.GenerateBridgeConstructor()
+    elif self._is_static:
+      return self.GenerateBridgeStaticMethod()
+    else:
+      return '%s%s%s%s' % (
+          '    private Method %s;\n' % self._method_declare_name,
+          self.GenerateBridgeOverrideMethod(),
+          self.GenerateBridgeWrapperMethod(),
+          self.GenerateBridgeSuperMethod())
+
+  def GenerateMethodsStringForWrapper(self):
+    self.PrepareStrings()
+    if self._is_constructor:
+      return self.GenerateWrapperConstructor()
+    elif self._is_static:
+      return self.GenerateWrapperStaticMethod()
+    elif self._is_abstract:
+      return self.GenerateWrapperBridgeMethod()
+    else:
+      return '%s%s' % (
+          '    private Method %s;\n' % self._method_declare_name,
+          self.GenerateWrapperBridgeMethod())
+
+  def GenerateMethodsStringForInterface(self):
+    self.PrepareStrings()
+    return self.GenerateWrapperInterface()
diff --git a/src/xwalk/tools/reflection_generator/reflection_generator.py b/src/xwalk/tools/reflection_generator/reflection_generator.py
new file mode 100755 (executable)
index 0000000..b7c403e
--- /dev/null
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import os
+import shutil
+import sys
+
+from bridge_generator import BridgeGenerator
+from interface_generator import InterfaceGenerator
+from java_class import JavaClassLoader
+from wrapper_generator import WrapperGenerator
+
+# Classes list that have to generate bridge and wrap code.
+CLASSES_TO_BE_PROCESS = [
+  'XWalkExtensionInternal',
+  'XWalkViewInternal',
+  'XWalkUIClientInternal',
+  'XWalkResourceClientInternal',
+  'XWalkPreferencesInternal',
+  'XWalkNavigationItemInternal',
+  'XWalkNavigationHistoryInternal',
+  'XWalkJavascriptResultHandlerInternal',
+  'XWalkJavascriptResultInternal',
+]
+
+
+def PerformSerialize(output_path, generator):
+  # Serialize the code.
+  file_name = os.path.join(output_path, generator.GetGeneratedClassFileName())
+  if not os.path.isdir(os.path.dirname(file_name)):
+    os.makedirs(os.path.dirname(file_name))
+  file_handle = open(file_name, 'w')
+  file_handle.write(generator.GetGeneratedCode())
+  file_handle.close()
+  print '%s has been generated!' % (file_name)
+
+
+def GenerateBindingForJavaClass(
+    java_data, bridge_output, wrap_output, class_loader):
+  if java_data.class_type == 'interface':
+    interface_generator = InterfaceGenerator(java_data, class_loader)
+    interface_generator.RunTask()
+    PerformSerialize(wrap_output, interface_generator)
+  else:
+    # Generate Bridge code.
+    bridge_generator = BridgeGenerator(java_data, class_loader)
+    bridge_generator.RunTask()
+    # Serialize.
+    PerformSerialize(bridge_output, bridge_generator)
+    # Generate Wrapper code.
+    wrapper_generator = WrapperGenerator(java_data, class_loader)
+    wrapper_generator.RunTask()
+    PerformSerialize(wrap_output, wrapper_generator)
+
+
+def GenerateBindingForJavaDirectory(input_dir, bridge_output, wrap_output):
+  java_class_loader = JavaClassLoader(input_dir, CLASSES_TO_BE_PROCESS)
+  for input_file in os.listdir(input_dir):
+    input_class_name = input_file.replace('.java', '')
+    if java_class_loader.IsInternalClass(input_class_name):
+      # Load all java classes in first.
+      java_data = java_class_loader.LoadJavaClass(input_class_name)
+      print 'Generate bridge and wrapper code for %s' % input_class_name
+      GenerateBindingForJavaClass(
+          java_data, bridge_output, wrap_output, java_class_loader)
+
+
+def CopyReflectionHelperJava(helper_class, wrap_output):
+  if helper_class is None:
+    return
+  f = open(helper_class, 'r')
+  output = os.path.join(wrap_output, os.path.basename(helper_class))
+  if not os.path.isdir(os.path.dirname(output)):
+    os.makedirs(os.path.dirname(output))
+  fo = open(output, 'w')
+  for line in f.read().split('\n'):
+    if line.startswith('package '):
+      fo.write('package org.xwalk.core;\n')
+    else:
+      fo.write(line + '\n')
+  fo.close()
+  f.close()
+
+
+def Touch(path):
+  if not os.path.isdir(os.path.dirname(path)):
+    os.makedirs(os.path.dirname(path))
+  with open(path, 'a'):
+    os.utime(path, None)
+
+
+def main(argv):
+  usage = """Usage: %prog [OPTIONS]
+This script can generate bridge and wrap source files for given directory. 
+\'input_dir\' is provided as directory containing source files.
+  """
+  option_parser = optparse.OptionParser(usage=usage)
+  option_parser.add_option('--input_dir',
+                           help= ('Input source file directory which contains'
+                                  'input files'))
+  option_parser.add_option('--bridge_output',
+                           help=('Output directory where the bridge code'
+                                 'is placed.'))
+  option_parser.add_option('--wrap_output',
+                           help=('Output directory where the wrap code'
+                                'is placed.'))
+  option_parser.add_option('--helper_class',
+                           help=('the path of ReflectionHelper java source, '
+                                'will copy it to output folder'))
+  option_parser.add_option('--stamp', help='the file to touch on success.')
+  options, _ = option_parser.parse_args(argv)
+  if not options.input_dir:
+    print('Error: Must specify input.')
+    return 1
+  if os.path.isdir(options.bridge_output):
+    shutil.rmtree(options.bridge_output)
+  if os.path.isdir(options.wrap_output):
+    shutil.rmtree(options.wrap_output)
+
+  if options.input_dir:
+    GenerateBindingForJavaDirectory(options.input_dir,
+        options.bridge_output, options.wrap_output)
+    CopyReflectionHelperJava(options.helper_class,
+        options.wrap_output)
+
+  if options.stamp:
+    Touch(options.stamp)
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/src/xwalk/tools/reflection_generator/wrapper_generator.py b/src/xwalk/tools/reflection_generator/wrapper_generator.py
new file mode 100644 (file)
index 0000000..2e06ade
--- /dev/null
@@ -0,0 +1,236 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 Intel Corporation. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from string import Template
+
+from code_generator import CodeGenerator
+from java_class import InternalJavaFileData
+
+class WrapperGenerator(CodeGenerator):
+  """ Generator class thar generates wrapper layer code."""
+  def __init__(self, java_data, class_loader):
+    super(WrapperGenerator, self).__init__(java_data, class_loader)
+
+  def RunTask(self):
+    self._generated_class_name = self._java_data.wrapper_name
+    self._generated_code = self.GenerateWrapperClass()
+
+  def GenerateDoc(self, doc):
+    return self._class_loader.GenerateDoc(doc)
+
+  def GenerateWrapperClass(self):
+    wrapper_template = Template("""\
+${PACKAGE_SECTION}
+
+${IMPORT_SECTION}
+
+${DOC_SECTION}
+public ${MODIFIER}class ${CLASS_NAME} ${CLASS_EXTENDS} ${CLASS_IMPLEMENTS}{
+
+${FIELD_SECTION}
+
+${ENUM_SECTION}
+
+    private final static String BRIDGE_CLASS = "${BRIDGE_CLASS_FULL_NAME}";
+    private Object bridge;
+
+    public Object getBridge() {
+        return bridge;
+    }
+${CREATE_INTERNALLY_CONSTRUCORS}
+${METHODS_SECTION}
+
+${REFLECTION_SECTION}
+
+${STATIC_INITIALIZER}
+}
+""")
+    package_string = self.GeneratePackageString()
+    imports = self.GenerateImportRules()
+    modifier = self.GenerateModifier()
+    class_name = self._java_data.wrapper_name
+    class_extends = self.GenerateClassExtends()
+    class_implements = self.GenerateClassImplements()
+    fields = self.GenerateClassFields()
+    enums = self.GenerateClassEnums()
+    bridge_full_class_name = self._java_data.GetFullBridgeName()
+    create_internally_constructor = self.GenerateCreateInternallyConstructor()
+    methods = self.GenerateMethods()
+    reflections = self.GenerateReflectionInitString()
+    static_initializer = self.GenerateStaticInitializerString()
+    if self._java_data.class_annotations.has_key(
+        InternalJavaFileData.ANNOTATION_NO_INSTANCE):
+      create_internally_constructor = ''
+      static_initializer = ''
+      reflections = ''
+    value = {'PACKAGE_SECTION': package_string,
+             'IMPORT_SECTION': imports,
+             'DOC_SECTION': self.GenerateDoc(self._java_data.class_doc),
+             'MODIFIER': modifier,
+             'CLASS_NAME': class_name,
+             'CLASS_EXTENDS': class_extends,
+             'CLASS_IMPLEMENTS': class_implements,
+             'FIELD_SECTION': fields,
+             'ENUM_SECTION': enums,
+             'BRIDGE_CLASS_FULL_NAME': bridge_full_class_name,
+             'CREATE_INTERNALLY_CONSTRUCORS': create_internally_constructor,
+             'METHODS_SECTION': methods,
+             'REFLECTION_SECTION': reflections,
+             'STATIC_INITIALIZER': static_initializer}
+    return wrapper_template.substitute(value)
+
+  def HasCreateInternallyAnnotation(self):
+    return self._java_data.class_annotations.get(
+        InternalJavaFileData.ANNOTATION_CREATE_INTERNALLY, False)
+
+  def GeneratePackageString(self):
+    # Remove the 'internal' folder from internal package.
+    package_name = self._java_data.package_name.replace('.internal', '')
+    return 'package %s;' % (package_name)
+
+  def GenerateModifier(self):
+    for method in self._java_data.methods:
+      if method.is_abstract:
+        return 'abstract '
+    return ''
+
+  def GenerateClassExtends(self):
+    annotations = self._java_data.class_annotations
+    if annotations.has_key(InternalJavaFileData.ANNOTATION_EXTEND_CLASS):
+      to_extend = annotations[InternalJavaFileData.ANNOTATION_EXTEND_CLASS]
+      return ' extends %s ' % (to_extend.replace('.class', ''))
+    return ''
+
+  def GenerateClassImplements(self):
+    annotations = self._java_data.class_annotations
+    if annotations.has_key(InternalJavaFileData.ANNOTATION_IMPL):
+      to_implement = annotations[InternalJavaFileData.ANNOTATION_IMPL]
+      impl_interface = to_implement.replace('.class', '')
+      if self.IsInternalClass(impl_interface):
+        impl_interface = self.LoadJavaClass(impl_interface).wrapper_name
+      return ' implements %s ' % (impl_interface)
+    return ''
+
+  def GenerateClassFields(self):
+    fields_string = ''
+    field_template = Template("""\
+${DOC}
+    public final static ${TYPE} ${NAME} = ${VALUE};
+""")
+    for field in self._java_data.fields:
+      value = {'TYPE': field.field_type,
+               'NAME': field.field_name,
+               'VALUE': field.field_value,
+               'DOC': self.GenerateDoc(field.field_doc)}
+      fields_string += field_template.substitute(value)
+    return fields_string
+
+  def GenerateClassEnums(self):
+    enums_string = ''
+    enum_template = Template("""\
+${DOC}
+    public enum ${NAME} {${CONTENT}
+    }
+    private Class<?> ${ENUM_CLASS_NAME};
+    private Method ${ENUM_VALUE_OF_METHOD};
+    private Object Convert${NAME}(${NAME} type) {
+        return ReflectionHelper.invokeMethod(${ENUM_VALUE_OF_METHOD}, \
+null, type.toString());
+    }
+""")
+    for enum in self._java_data.enums.values():
+      value = {'NAME': enum.enum_name.replace('Internal', ''),
+               'CONTENT': enum.enum_declaration,
+               'DOC': self.GenerateDoc(enum.enum_doc),
+               'ENUM_CLASS_NAME': enum.EnumClassName(),
+               'ENUM_VALUE_OF_METHOD': enum.EnumMethodValueOfName()}
+      enums_string += enum_template.substitute(value)
+    return enums_string
+
+  def GenerateCreateInternallyConstructor(self):
+    if not self.HasCreateInternallyAnnotation():
+      return ''
+    constructor_template = Template("""\
+    public ${CLASS_NAME}(Object bridge) {
+        this.bridge = bridge;
+        try {
+            reflectionInit();
+        } catch (Exception e) {
+            ReflectionHelper.handleException(e);
+        }
+    }
+""")
+    class_name = self._java_data.wrapper_name
+    return constructor_template.substitute({'CLASS_NAME': class_name})
+
+  def GenerateMethods(self):
+    methods_string = ''
+    # Generate method definitions.
+    for method in self._java_data.methods:
+      methods_string += method.GenerateMethodsStringForWrapper()
+    return methods_string
+
+  def GenerateReflectionInitString(self):
+    ref_methods_string = ''
+
+    ref_enum_template = Template("""\
+        ${ENUM} = clazz.getClassLoader().loadClass("${ENUM_CLASS}");
+        ${METHOD} = ${ENUM}.getMethod("valueOf", String.class);
+""")
+    for enum in self._java_data.enums.values():
+      value = { 'ENUM': enum.EnumClassName(),
+                'ENUM_CLASS': self._java_data.GetFullBridgeName(enum.enum_name),
+                'METHOD': enum.EnumMethodValueOfName()}
+      ref_methods_string += ref_enum_template.substitute(value)
+
+    ref_method_template = Template("""\
+        ${METHOD_DECLARE_NAME} = ReflectionHelper.loadMethod(\
+clazz, \"${METHOD}Super\"${PARAMS});
+""")
+    for method in self._java_data.methods:
+      if method.is_constructor or method.is_static or method.is_abstract:
+        continue
+      value = { 'METHOD_DECLARE_NAME': method.GetMethodDeclareName(),
+                'METHOD': method.method_name,
+                'PARAMS': method.GetWrapperParamsStringDeclareForBridge()}
+      ref_methods_string += ref_method_template.substitute(value)
+
+    ref_init_template = Template("""\
+    private void reflectionInit() throws NoSuchMethodException,
+            ClassNotFoundException {
+        Class<?> clazz = bridge.getClass();
+${REF_METHODS}
+    }
+""")
+    value = {'REF_METHODS': ref_methods_string}
+    ref_init_string = ref_init_template.substitute(value)
+    return ref_init_string
+
+  def FormatStaticInitializer(self, method):
+    static_initializer_template = Template("""\
+        ReflectionHelper.registerConstructor(\"${CONSTRUCTOR_NAME}\", \
+\"${FULL_CLASS_NAME}\"${PARAM_LIST}, Object.class);
+""")
+    value = {"CONSTRUCTOR_NAME": method.GetMethodDeclareName(),
+             "FULL_CLASS_NAME": self._java_data.GetFullBridgeName(),
+             "PARAM_LIST": method.GetWrapperParamsStringDeclareForBridge()}
+    return static_initializer_template.substitute(value)
+
+  def GenerateStaticInitializerString(self):
+    if self._java_data.class_annotations.has_key(
+        InternalJavaFileData.ANNOTATION_CREATE_INTERNALLY):
+      return ''
+    static_initializer_template = Template("""\
+    static {
+${STATIC_INITIALIZER_LIST}
+    }
+""")
+    static_initializer_list = ''
+    for method in self._java_data.methods:
+      if method.is_constructor:
+        static_initializer_list += self.FormatStaticInitializer(method)
+    value = {'STATIC_INITIALIZER_LIST': static_initializer_list}
+    return static_initializer_template.substitute(value)
index 8029ea7..ad39b50 100644 (file)
                     '../components/nacl.gyp:nacl_common',
                     '../components/nacl.gyp:nacl_renderer',
                     '../components/nacl.gyp:nacl_helper',
+                    '../components/nacl.gyp:nacl_linux',
                     '../native_client/src/trusted/service_runtime/linux/nacl_bootstrap.gyp:nacl_helper_bootstrap',
                   ],
                 }],
index 8e08c96..cc6092e 100644 (file)
@@ -1,4 +1,7 @@
 {
+  'variables': {
+    'reflection_java_dir': '<(PRODUCT_DIR)/gen/xwalk_core_reflection_layer',
+  },
   'targets': [
     {
       'target_name': 'libxwalkcore',
         ],
     },
     {
+      'target_name': 'xwalk_core_reflection_layer_java_gen',
+      'type': 'none',
+      'variables': {
+        'timestamp': '<(reflection_java_dir)/gen.timestamp',
+      },
+      'all_dependent_settings': {
+        'variables': {
+          'reflection_layer_gen_timestamp': '<(timestamp)',
+          'reflection_gen_dir': '<(reflection_java_dir)',
+        },
+      },
+      'actions': [
+        {
+          'action_name': 'generate_reflection',
+          'message': 'Creating reflection layer',
+          'inputs': [
+            'tools/reflection_generator/bridge_generator.py',
+            'tools/reflection_generator/code_generator.py',
+            'tools/reflection_generator/interface_generator.py',
+            'tools/reflection_generator/java_class_component.py',
+            'tools/reflection_generator/java_class.py',
+            'tools/reflection_generator/java_method.py',
+            'tools/reflection_generator/reflection_generator.py',
+            'tools/reflection_generator/wrapper_generator.py',
+            '<(PRODUCT_DIR)/gen/xwalk_core_internal_java/xwalk_core_internal_java.jar',
+          ],
+          'outputs': [
+            '<(timestamp)',
+          ],
+          'action': [
+            'python', 'tools/reflection_generator/reflection_generator.py',
+            '--input_dir', 'runtime/android/core_internal/src/org/xwalk/core/internal',
+            '--bridge_output', '<(reflection_java_dir)/bridge',
+            '--wrap_output', '<(reflection_java_dir)/wrapper',
+            '--helper_class', 'runtime/android/core_internal/src/org/xwalk/core/internal/ReflectionHelper.java',
+            '--stamp', '<(timestamp)',
+          ],
+        },
+      ],
+    },
+    {
+      #TODO(wang16): split it into internal and core.
       'target_name': 'xwalk_core_java',
       'type': 'none',
       'dependencies': [
         'xwalk_core_internal_java',
+        'xwalk_core_reflection_layer_java_gen',
       ],
       'variables': {
         'java_in_dir': 'runtime/android/core',
+        'additional_input_paths': [ '>(reflection_layer_gen_timestamp)' ],
+        'generated_src_dirs': [
+          '<(reflection_java_dir)/bridge',
+          '<(reflection_java_dir)/wrapper',
+        ],
       },
-      'includes': ['../build/java.gypi'],
+      'includes': ['../build/java.gypi']
     },
     {
       'target_name': 'xwalk_runtime_java',
index 1d71f59..d71a9e7 100644 (file)
           '<(PRODUCT_DIR)/xwalk_internal_xwview_test/assets/echoSync.html',
           '<(PRODUCT_DIR)/xwalk_internal_xwview_test/assets/framesEcho.html',
           '<(PRODUCT_DIR)/xwalk_xwview_test/assets/index.html',
+          '<(PRODUCT_DIR)/xwalk_xwview_test/assets/scale_changed.html',
           '<(PRODUCT_DIR)/xwalk_xwview_test/assets/window.close.html',
         ],
         'asset_location': '<(PRODUCT_DIR)/xwalk_xwview_test/assets',
             'test/android/data/echoSync.html',
             'test/android/data/framesEcho.html',
             'test/android/data/index.html',
+            'test/android/data/scale_changed.html',
             'test/android/data/window.close.html',
           ],
         },
index 7519627..dfb49ae 100644 (file)
     {
       'target_name': 'xwalk_core_library_documentation',
       'type': 'none',
+      'dependencies': [
+        'xwalk_core_reflection_layer_java_gen'
+      ],
       'variables': {
         'api_files': [
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkExtension.java',
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkJavascriptResult.java',
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationHistory.java',
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkNavigationItem.java',
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkPreferences.java',
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkResourceClient.java',
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkUIClient.java',
-          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/XWalkView.java',
+          '<(DEPTH)/xwalk/runtime/android/core/src/org/xwalk/core/JavascriptInterface.java',
+          '>(reflection_gen_dir)/wrapper/XWalkExtension.java',
+          '>(reflection_gen_dir)/wrapper/XWalkJavascriptResult.java',
+          '>(reflection_gen_dir)/wrapper/XWalkNavigationHistory.java',
+          '>(reflection_gen_dir)/wrapper/XWalkNavigationItem.java',
+          '>(reflection_gen_dir)/wrapper/XWalkPreferences.java',
+          '>(reflection_gen_dir)/wrapper/XWalkResourceClient.java',
+          '>(reflection_gen_dir)/wrapper/XWalkUIClient.java',
+          '>(reflection_gen_dir)/wrapper/XWalkView.java',
         ],
         'docs': '<(PRODUCT_DIR)/xwalk_core_library_docs',
       },
           'action_name': 'javadoc_xwalk_core_library',
           'message': 'Creating documentation for XWalk Core Library',
           'inputs': [
-            '<@(api_files)',
+            '>(reflection_layer_gen_timestamp)',
           ],
           'outputs': [
             '<(docs)/index.html',
           ],
           'action': [
             'javadoc',
+            '-quiet',
             '-XDignore.symbol.file',
             '-d', '<(docs)',
+            '-classpath', '<(android_sdk)/android.jar',
             '<@(api_files)',
           ],
         },